diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 06:17:55 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 06:17:55 +0000 |
| commit | 001ca45e385c05b0eaa36d9879e051853aaff107 (patch) | |
| tree | 603fb85d2563db5b7c418e9fd143d479bd09676e /grasp-audit | |
| parent | d428baf30feec295870fadda2d335d1e7f89507b (diff) | |
created POC grasp-auditor
Diffstat (limited to 'grasp-audit')
| -rw-r--r-- | grasp-audit/Cargo.lock | 2747 | ||||
| -rw-r--r-- | grasp-audit/Cargo.toml | 41 | ||||
| -rw-r--r-- | grasp-audit/QUICK_START.md | 222 | ||||
| -rw-r--r-- | grasp-audit/README.md | 167 | ||||
| -rw-r--r-- | grasp-audit/examples/simple_audit.rs | 53 | ||||
| -rw-r--r-- | grasp-audit/shell.nix | 38 | ||||
| -rw-r--r-- | grasp-audit/src/audit.rs | 188 | ||||
| -rw-r--r-- | grasp-audit/src/bin/grasp-audit.rs | 95 | ||||
| -rw-r--r-- | grasp-audit/src/client.rs | 146 | ||||
| -rw-r--r-- | grasp-audit/src/isolation.rs | 57 | ||||
| -rw-r--r-- | grasp-audit/src/lib.rs | 43 | ||||
| -rw-r--r-- | grasp-audit/src/result.rs | 189 | ||||
| -rw-r--r-- | grasp-audit/src/specs/mod.rs | 5 | ||||
| -rw-r--r-- | grasp-audit/src/specs/nip01_smoke.rs | 303 |
14 files changed, 4294 insertions, 0 deletions
diff --git a/grasp-audit/Cargo.lock b/grasp-audit/Cargo.lock new file mode 100644 index 0000000..cffa543 --- /dev/null +++ b/grasp-audit/Cargo.lock | |||
| @@ -0,0 +1,2747 @@ | |||
| 1 | # This file is automatically @generated by Cargo. | ||
| 2 | # It is not intended for manual editing. | ||
| 3 | version = 3 | ||
| 4 | |||
| 5 | [[package]] | ||
| 6 | name = "aead" | ||
| 7 | version = "0.5.2" | ||
| 8 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 9 | checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" | ||
| 10 | dependencies = [ | ||
| 11 | "crypto-common", | ||
| 12 | "generic-array", | ||
| 13 | ] | ||
| 14 | |||
| 15 | [[package]] | ||
| 16 | name = "aes" | ||
| 17 | version = "0.8.4" | ||
| 18 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 19 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" | ||
| 20 | dependencies = [ | ||
| 21 | "cfg-if", | ||
| 22 | "cipher", | ||
| 23 | "cpufeatures", | ||
| 24 | ] | ||
| 25 | |||
| 26 | [[package]] | ||
| 27 | name = "aho-corasick" | ||
| 28 | version = "1.1.4" | ||
| 29 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 30 | checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" | ||
| 31 | dependencies = [ | ||
| 32 | "memchr", | ||
| 33 | ] | ||
| 34 | |||
| 35 | [[package]] | ||
| 36 | name = "allocator-api2" | ||
| 37 | version = "0.2.21" | ||
| 38 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 39 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" | ||
| 40 | |||
| 41 | [[package]] | ||
| 42 | name = "android_system_properties" | ||
| 43 | version = "0.1.5" | ||
| 44 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 45 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" | ||
| 46 | dependencies = [ | ||
| 47 | "libc", | ||
| 48 | ] | ||
| 49 | |||
| 50 | [[package]] | ||
| 51 | name = "anstream" | ||
| 52 | version = "0.6.21" | ||
| 53 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 54 | checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" | ||
| 55 | dependencies = [ | ||
| 56 | "anstyle", | ||
| 57 | "anstyle-parse", | ||
| 58 | "anstyle-query", | ||
| 59 | "anstyle-wincon", | ||
| 60 | "colorchoice", | ||
| 61 | "is_terminal_polyfill", | ||
| 62 | "utf8parse", | ||
| 63 | ] | ||
| 64 | |||
| 65 | [[package]] | ||
| 66 | name = "anstyle" | ||
| 67 | version = "1.0.13" | ||
| 68 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 69 | checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" | ||
| 70 | |||
| 71 | [[package]] | ||
| 72 | name = "anstyle-parse" | ||
| 73 | version = "0.2.7" | ||
| 74 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 75 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" | ||
| 76 | dependencies = [ | ||
| 77 | "utf8parse", | ||
| 78 | ] | ||
| 79 | |||
| 80 | [[package]] | ||
| 81 | name = "anstyle-query" | ||
| 82 | version = "1.1.4" | ||
| 83 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 84 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" | ||
| 85 | dependencies = [ | ||
| 86 | "windows-sys 0.60.2", | ||
| 87 | ] | ||
| 88 | |||
| 89 | [[package]] | ||
| 90 | name = "anstyle-wincon" | ||
| 91 | version = "3.0.10" | ||
| 92 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 93 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" | ||
| 94 | dependencies = [ | ||
| 95 | "anstyle", | ||
| 96 | "once_cell_polyfill", | ||
| 97 | "windows-sys 0.60.2", | ||
| 98 | ] | ||
| 99 | |||
| 100 | [[package]] | ||
| 101 | name = "anyhow" | ||
| 102 | version = "1.0.100" | ||
| 103 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 104 | checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" | ||
| 105 | |||
| 106 | [[package]] | ||
| 107 | name = "arrayvec" | ||
| 108 | version = "0.7.6" | ||
| 109 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 110 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" | ||
| 111 | |||
| 112 | [[package]] | ||
| 113 | name = "async-stream" | ||
| 114 | version = "0.3.6" | ||
| 115 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 116 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" | ||
| 117 | dependencies = [ | ||
| 118 | "async-stream-impl", | ||
| 119 | "futures-core", | ||
| 120 | "pin-project-lite", | ||
| 121 | ] | ||
| 122 | |||
| 123 | [[package]] | ||
| 124 | name = "async-stream-impl" | ||
| 125 | version = "0.3.6" | ||
| 126 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 127 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" | ||
| 128 | dependencies = [ | ||
| 129 | "proc-macro2", | ||
| 130 | "quote", | ||
| 131 | "syn", | ||
| 132 | ] | ||
| 133 | |||
| 134 | [[package]] | ||
| 135 | name = "async-trait" | ||
| 136 | version = "0.1.89" | ||
| 137 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 138 | checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" | ||
| 139 | dependencies = [ | ||
| 140 | "proc-macro2", | ||
| 141 | "quote", | ||
| 142 | "syn", | ||
| 143 | ] | ||
| 144 | |||
| 145 | [[package]] | ||
| 146 | name = "async-utility" | ||
| 147 | version = "0.2.0" | ||
| 148 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 149 | checksum = "a349201d80b4aa18d17a34a182bdd7f8ddf845e9e57d2ea130a12e10ef1e3a47" | ||
| 150 | dependencies = [ | ||
| 151 | "futures-util", | ||
| 152 | "gloo-timers", | ||
| 153 | "tokio", | ||
| 154 | "wasm-bindgen-futures", | ||
| 155 | ] | ||
| 156 | |||
| 157 | [[package]] | ||
| 158 | name = "async-wsocket" | ||
| 159 | version = "0.9.0" | ||
| 160 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 161 | checksum = "5c0984bead67f20366bc8dd46018dfbe189b67eeefb0e5b86b9eade18d7c3c3b" | ||
| 162 | dependencies = [ | ||
| 163 | "async-utility", | ||
| 164 | "futures", | ||
| 165 | "futures-util", | ||
| 166 | "js-sys", | ||
| 167 | "thiserror 1.0.69", | ||
| 168 | "tokio", | ||
| 169 | "tokio-rustls", | ||
| 170 | "tokio-socks", | ||
| 171 | "tokio-tungstenite", | ||
| 172 | "url", | ||
| 173 | "wasm-bindgen", | ||
| 174 | "web-sys", | ||
| 175 | ] | ||
| 176 | |||
| 177 | [[package]] | ||
| 178 | name = "atomic-destructor" | ||
| 179 | version = "0.2.0" | ||
| 180 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 181 | checksum = "7d919cb60ba95c87ba42777e9e246c4e8d658057299b437b7512531ce0a09a23" | ||
| 182 | dependencies = [ | ||
| 183 | "tracing", | ||
| 184 | ] | ||
| 185 | |||
| 186 | [[package]] | ||
| 187 | name = "atomic-waker" | ||
| 188 | version = "1.1.2" | ||
| 189 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 190 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" | ||
| 191 | |||
| 192 | [[package]] | ||
| 193 | name = "autocfg" | ||
| 194 | version = "1.5.0" | ||
| 195 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 196 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" | ||
| 197 | |||
| 198 | [[package]] | ||
| 199 | name = "base58ck" | ||
| 200 | version = "0.1.0" | ||
| 201 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 202 | checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" | ||
| 203 | dependencies = [ | ||
| 204 | "bitcoin-internals 0.3.0", | ||
| 205 | "bitcoin_hashes 0.14.0", | ||
| 206 | ] | ||
| 207 | |||
| 208 | [[package]] | ||
| 209 | name = "base64" | ||
| 210 | version = "0.22.1" | ||
| 211 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 212 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" | ||
| 213 | |||
| 214 | [[package]] | ||
| 215 | name = "base64ct" | ||
| 216 | version = "1.8.0" | ||
| 217 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 218 | checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" | ||
| 219 | |||
| 220 | [[package]] | ||
| 221 | name = "bech32" | ||
| 222 | version = "0.11.0" | ||
| 223 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 224 | checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" | ||
| 225 | |||
| 226 | [[package]] | ||
| 227 | name = "bip39" | ||
| 228 | version = "2.2.0" | ||
| 229 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 230 | checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" | ||
| 231 | dependencies = [ | ||
| 232 | "bitcoin_hashes 0.13.0", | ||
| 233 | "serde", | ||
| 234 | "unicode-normalization", | ||
| 235 | ] | ||
| 236 | |||
| 237 | [[package]] | ||
| 238 | name = "bitcoin" | ||
| 239 | version = "0.32.7" | ||
| 240 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 241 | checksum = "0fda569d741b895131a88ee5589a467e73e9c4718e958ac9308e4f7dc44b6945" | ||
| 242 | dependencies = [ | ||
| 243 | "base58ck", | ||
| 244 | "bech32", | ||
| 245 | "bitcoin-internals 0.3.0", | ||
| 246 | "bitcoin-io", | ||
| 247 | "bitcoin-units", | ||
| 248 | "bitcoin_hashes 0.14.0", | ||
| 249 | "hex-conservative 0.2.1", | ||
| 250 | "hex_lit", | ||
| 251 | "secp256k1", | ||
| 252 | "serde", | ||
| 253 | ] | ||
| 254 | |||
| 255 | [[package]] | ||
| 256 | name = "bitcoin-internals" | ||
| 257 | version = "0.2.0" | ||
| 258 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 259 | checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" | ||
| 260 | |||
| 261 | [[package]] | ||
| 262 | name = "bitcoin-internals" | ||
| 263 | version = "0.3.0" | ||
| 264 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 265 | checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" | ||
| 266 | dependencies = [ | ||
| 267 | "serde", | ||
| 268 | ] | ||
| 269 | |||
| 270 | [[package]] | ||
| 271 | name = "bitcoin-io" | ||
| 272 | version = "0.1.3" | ||
| 273 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 274 | checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" | ||
| 275 | |||
| 276 | [[package]] | ||
| 277 | name = "bitcoin-units" | ||
| 278 | version = "0.1.2" | ||
| 279 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 280 | checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" | ||
| 281 | dependencies = [ | ||
| 282 | "bitcoin-internals 0.3.0", | ||
| 283 | "serde", | ||
| 284 | ] | ||
| 285 | |||
| 286 | [[package]] | ||
| 287 | name = "bitcoin_hashes" | ||
| 288 | version = "0.13.0" | ||
| 289 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 290 | checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" | ||
| 291 | dependencies = [ | ||
| 292 | "bitcoin-internals 0.2.0", | ||
| 293 | "hex-conservative 0.1.2", | ||
| 294 | ] | ||
| 295 | |||
| 296 | [[package]] | ||
| 297 | name = "bitcoin_hashes" | ||
| 298 | version = "0.14.0" | ||
| 299 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 300 | checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" | ||
| 301 | dependencies = [ | ||
| 302 | "bitcoin-io", | ||
| 303 | "hex-conservative 0.2.1", | ||
| 304 | "serde", | ||
| 305 | ] | ||
| 306 | |||
| 307 | [[package]] | ||
| 308 | name = "bitflags" | ||
| 309 | version = "2.10.0" | ||
| 310 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 311 | checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" | ||
| 312 | |||
| 313 | [[package]] | ||
| 314 | name = "block-buffer" | ||
| 315 | version = "0.10.4" | ||
| 316 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 317 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" | ||
| 318 | dependencies = [ | ||
| 319 | "generic-array", | ||
| 320 | ] | ||
| 321 | |||
| 322 | [[package]] | ||
| 323 | name = "block-padding" | ||
| 324 | version = "0.3.3" | ||
| 325 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 326 | checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" | ||
| 327 | dependencies = [ | ||
| 328 | "generic-array", | ||
| 329 | ] | ||
| 330 | |||
| 331 | [[package]] | ||
| 332 | name = "bumpalo" | ||
| 333 | version = "3.19.0" | ||
| 334 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 335 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" | ||
| 336 | |||
| 337 | [[package]] | ||
| 338 | name = "byteorder" | ||
| 339 | version = "1.5.0" | ||
| 340 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 341 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" | ||
| 342 | |||
| 343 | [[package]] | ||
| 344 | name = "bytes" | ||
| 345 | version = "1.10.1" | ||
| 346 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 347 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" | ||
| 348 | |||
| 349 | [[package]] | ||
| 350 | name = "cbc" | ||
| 351 | version = "0.1.2" | ||
| 352 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 353 | checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" | ||
| 354 | dependencies = [ | ||
| 355 | "cipher", | ||
| 356 | ] | ||
| 357 | |||
| 358 | [[package]] | ||
| 359 | name = "cc" | ||
| 360 | version = "1.2.44" | ||
| 361 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 362 | checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" | ||
| 363 | dependencies = [ | ||
| 364 | "find-msvc-tools", | ||
| 365 | "shlex", | ||
| 366 | ] | ||
| 367 | |||
| 368 | [[package]] | ||
| 369 | name = "cfg-if" | ||
| 370 | version = "1.0.4" | ||
| 371 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 372 | checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" | ||
| 373 | |||
| 374 | [[package]] | ||
| 375 | name = "cfg_aliases" | ||
| 376 | version = "0.2.1" | ||
| 377 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 378 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" | ||
| 379 | |||
| 380 | [[package]] | ||
| 381 | name = "chacha20" | ||
| 382 | version = "0.9.1" | ||
| 383 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 384 | checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" | ||
| 385 | dependencies = [ | ||
| 386 | "cfg-if", | ||
| 387 | "cipher", | ||
| 388 | "cpufeatures", | ||
| 389 | ] | ||
| 390 | |||
| 391 | [[package]] | ||
| 392 | name = "chacha20poly1305" | ||
| 393 | version = "0.10.1" | ||
| 394 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 395 | checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" | ||
| 396 | dependencies = [ | ||
| 397 | "aead", | ||
| 398 | "chacha20", | ||
| 399 | "cipher", | ||
| 400 | "poly1305", | ||
| 401 | "zeroize", | ||
| 402 | ] | ||
| 403 | |||
| 404 | [[package]] | ||
| 405 | name = "chrono" | ||
| 406 | version = "0.4.42" | ||
| 407 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 408 | checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" | ||
| 409 | dependencies = [ | ||
| 410 | "iana-time-zone", | ||
| 411 | "js-sys", | ||
| 412 | "num-traits", | ||
| 413 | "wasm-bindgen", | ||
| 414 | "windows-link", | ||
| 415 | ] | ||
| 416 | |||
| 417 | [[package]] | ||
| 418 | name = "cipher" | ||
| 419 | version = "0.4.4" | ||
| 420 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 421 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" | ||
| 422 | dependencies = [ | ||
| 423 | "crypto-common", | ||
| 424 | "inout", | ||
| 425 | "zeroize", | ||
| 426 | ] | ||
| 427 | |||
| 428 | [[package]] | ||
| 429 | name = "clap" | ||
| 430 | version = "4.5.51" | ||
| 431 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 432 | checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" | ||
| 433 | dependencies = [ | ||
| 434 | "clap_builder", | ||
| 435 | "clap_derive", | ||
| 436 | ] | ||
| 437 | |||
| 438 | [[package]] | ||
| 439 | name = "clap_builder" | ||
| 440 | version = "4.5.51" | ||
| 441 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 442 | checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" | ||
| 443 | dependencies = [ | ||
| 444 | "anstream", | ||
| 445 | "anstyle", | ||
| 446 | "clap_lex", | ||
| 447 | "strsim", | ||
| 448 | ] | ||
| 449 | |||
| 450 | [[package]] | ||
| 451 | name = "clap_derive" | ||
| 452 | version = "4.5.49" | ||
| 453 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 454 | checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" | ||
| 455 | dependencies = [ | ||
| 456 | "heck", | ||
| 457 | "proc-macro2", | ||
| 458 | "quote", | ||
| 459 | "syn", | ||
| 460 | ] | ||
| 461 | |||
| 462 | [[package]] | ||
| 463 | name = "clap_lex" | ||
| 464 | version = "0.7.6" | ||
| 465 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 466 | checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" | ||
| 467 | |||
| 468 | [[package]] | ||
| 469 | name = "colorchoice" | ||
| 470 | version = "1.0.4" | ||
| 471 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 472 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" | ||
| 473 | |||
| 474 | [[package]] | ||
| 475 | name = "core-foundation-sys" | ||
| 476 | version = "0.8.7" | ||
| 477 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 478 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" | ||
| 479 | |||
| 480 | [[package]] | ||
| 481 | name = "cpufeatures" | ||
| 482 | version = "0.2.17" | ||
| 483 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 484 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" | ||
| 485 | dependencies = [ | ||
| 486 | "libc", | ||
| 487 | ] | ||
| 488 | |||
| 489 | [[package]] | ||
| 490 | name = "crypto-common" | ||
| 491 | version = "0.1.6" | ||
| 492 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 493 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" | ||
| 494 | dependencies = [ | ||
| 495 | "generic-array", | ||
| 496 | "rand_core 0.6.4", | ||
| 497 | "typenum", | ||
| 498 | ] | ||
| 499 | |||
| 500 | [[package]] | ||
| 501 | name = "data-encoding" | ||
| 502 | version = "2.9.0" | ||
| 503 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 504 | checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" | ||
| 505 | |||
| 506 | [[package]] | ||
| 507 | name = "digest" | ||
| 508 | version = "0.10.7" | ||
| 509 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 510 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" | ||
| 511 | dependencies = [ | ||
| 512 | "block-buffer", | ||
| 513 | "crypto-common", | ||
| 514 | "subtle", | ||
| 515 | ] | ||
| 516 | |||
| 517 | [[package]] | ||
| 518 | name = "displaydoc" | ||
| 519 | version = "0.2.5" | ||
| 520 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 521 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" | ||
| 522 | dependencies = [ | ||
| 523 | "proc-macro2", | ||
| 524 | "quote", | ||
| 525 | "syn", | ||
| 526 | ] | ||
| 527 | |||
| 528 | [[package]] | ||
| 529 | name = "either" | ||
| 530 | version = "1.15.0" | ||
| 531 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 532 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" | ||
| 533 | |||
| 534 | [[package]] | ||
| 535 | name = "equivalent" | ||
| 536 | version = "1.0.2" | ||
| 537 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 538 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" | ||
| 539 | |||
| 540 | [[package]] | ||
| 541 | name = "find-msvc-tools" | ||
| 542 | version = "0.1.4" | ||
| 543 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 544 | checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" | ||
| 545 | |||
| 546 | [[package]] | ||
| 547 | name = "fnv" | ||
| 548 | version = "1.0.7" | ||
| 549 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 550 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" | ||
| 551 | |||
| 552 | [[package]] | ||
| 553 | name = "foldhash" | ||
| 554 | version = "0.1.5" | ||
| 555 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 556 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" | ||
| 557 | |||
| 558 | [[package]] | ||
| 559 | name = "form_urlencoded" | ||
| 560 | version = "1.2.2" | ||
| 561 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 562 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" | ||
| 563 | dependencies = [ | ||
| 564 | "percent-encoding", | ||
| 565 | ] | ||
| 566 | |||
| 567 | [[package]] | ||
| 568 | name = "futures" | ||
| 569 | version = "0.3.31" | ||
| 570 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 571 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" | ||
| 572 | dependencies = [ | ||
| 573 | "futures-channel", | ||
| 574 | "futures-core", | ||
| 575 | "futures-executor", | ||
| 576 | "futures-io", | ||
| 577 | "futures-sink", | ||
| 578 | "futures-task", | ||
| 579 | "futures-util", | ||
| 580 | ] | ||
| 581 | |||
| 582 | [[package]] | ||
| 583 | name = "futures-channel" | ||
| 584 | version = "0.3.31" | ||
| 585 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 586 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" | ||
| 587 | dependencies = [ | ||
| 588 | "futures-core", | ||
| 589 | "futures-sink", | ||
| 590 | ] | ||
| 591 | |||
| 592 | [[package]] | ||
| 593 | name = "futures-core" | ||
| 594 | version = "0.3.31" | ||
| 595 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 596 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" | ||
| 597 | |||
| 598 | [[package]] | ||
| 599 | name = "futures-executor" | ||
| 600 | version = "0.3.31" | ||
| 601 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 602 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" | ||
| 603 | dependencies = [ | ||
| 604 | "futures-core", | ||
| 605 | "futures-task", | ||
| 606 | "futures-util", | ||
| 607 | ] | ||
| 608 | |||
| 609 | [[package]] | ||
| 610 | name = "futures-io" | ||
| 611 | version = "0.3.31" | ||
| 612 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 613 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" | ||
| 614 | |||
| 615 | [[package]] | ||
| 616 | name = "futures-macro" | ||
| 617 | version = "0.3.31" | ||
| 618 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 619 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" | ||
| 620 | dependencies = [ | ||
| 621 | "proc-macro2", | ||
| 622 | "quote", | ||
| 623 | "syn", | ||
| 624 | ] | ||
| 625 | |||
| 626 | [[package]] | ||
| 627 | name = "futures-sink" | ||
| 628 | version = "0.3.31" | ||
| 629 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 630 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" | ||
| 631 | |||
| 632 | [[package]] | ||
| 633 | name = "futures-task" | ||
| 634 | version = "0.3.31" | ||
| 635 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 636 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" | ||
| 637 | |||
| 638 | [[package]] | ||
| 639 | name = "futures-util" | ||
| 640 | version = "0.3.31" | ||
| 641 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 642 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" | ||
| 643 | dependencies = [ | ||
| 644 | "futures-channel", | ||
| 645 | "futures-core", | ||
| 646 | "futures-io", | ||
| 647 | "futures-macro", | ||
| 648 | "futures-sink", | ||
| 649 | "futures-task", | ||
| 650 | "memchr", | ||
| 651 | "pin-project-lite", | ||
| 652 | "pin-utils", | ||
| 653 | "slab", | ||
| 654 | ] | ||
| 655 | |||
| 656 | [[package]] | ||
| 657 | name = "generic-array" | ||
| 658 | version = "0.14.9" | ||
| 659 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 660 | checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" | ||
| 661 | dependencies = [ | ||
| 662 | "typenum", | ||
| 663 | "version_check", | ||
| 664 | ] | ||
| 665 | |||
| 666 | [[package]] | ||
| 667 | name = "getrandom" | ||
| 668 | version = "0.2.16" | ||
| 669 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 670 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" | ||
| 671 | dependencies = [ | ||
| 672 | "cfg-if", | ||
| 673 | "js-sys", | ||
| 674 | "libc", | ||
| 675 | "wasi", | ||
| 676 | "wasm-bindgen", | ||
| 677 | ] | ||
| 678 | |||
| 679 | [[package]] | ||
| 680 | name = "getrandom" | ||
| 681 | version = "0.3.4" | ||
| 682 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 683 | checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" | ||
| 684 | dependencies = [ | ||
| 685 | "cfg-if", | ||
| 686 | "js-sys", | ||
| 687 | "libc", | ||
| 688 | "r-efi", | ||
| 689 | "wasip2", | ||
| 690 | "wasm-bindgen", | ||
| 691 | ] | ||
| 692 | |||
| 693 | [[package]] | ||
| 694 | name = "gloo-timers" | ||
| 695 | version = "0.2.6" | ||
| 696 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 697 | checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" | ||
| 698 | dependencies = [ | ||
| 699 | "futures-channel", | ||
| 700 | "futures-core", | ||
| 701 | "js-sys", | ||
| 702 | "wasm-bindgen", | ||
| 703 | ] | ||
| 704 | |||
| 705 | [[package]] | ||
| 706 | name = "grasp-audit" | ||
| 707 | version = "0.1.0" | ||
| 708 | dependencies = [ | ||
| 709 | "anyhow", | ||
| 710 | "chrono", | ||
| 711 | "clap", | ||
| 712 | "futures", | ||
| 713 | "nostr-sdk", | ||
| 714 | "serde", | ||
| 715 | "serde_json", | ||
| 716 | "thiserror 1.0.69", | ||
| 717 | "tokio", | ||
| 718 | "tokio-test", | ||
| 719 | "tracing", | ||
| 720 | "tracing-subscriber", | ||
| 721 | "uuid", | ||
| 722 | ] | ||
| 723 | |||
| 724 | [[package]] | ||
| 725 | name = "hashbrown" | ||
| 726 | version = "0.15.5" | ||
| 727 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 728 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" | ||
| 729 | dependencies = [ | ||
| 730 | "allocator-api2", | ||
| 731 | "equivalent", | ||
| 732 | "foldhash", | ||
| 733 | ] | ||
| 734 | |||
| 735 | [[package]] | ||
| 736 | name = "hashbrown" | ||
| 737 | version = "0.16.0" | ||
| 738 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 739 | checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" | ||
| 740 | |||
| 741 | [[package]] | ||
| 742 | name = "heck" | ||
| 743 | version = "0.5.0" | ||
| 744 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 745 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" | ||
| 746 | |||
| 747 | [[package]] | ||
| 748 | name = "hex-conservative" | ||
| 749 | version = "0.1.2" | ||
| 750 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 751 | checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" | ||
| 752 | |||
| 753 | [[package]] | ||
| 754 | name = "hex-conservative" | ||
| 755 | version = "0.2.1" | ||
| 756 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 757 | checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" | ||
| 758 | dependencies = [ | ||
| 759 | "arrayvec", | ||
| 760 | ] | ||
| 761 | |||
| 762 | [[package]] | ||
| 763 | name = "hex_lit" | ||
| 764 | version = "0.1.1" | ||
| 765 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 766 | checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" | ||
| 767 | |||
| 768 | [[package]] | ||
| 769 | name = "hmac" | ||
| 770 | version = "0.12.1" | ||
| 771 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 772 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" | ||
| 773 | dependencies = [ | ||
| 774 | "digest", | ||
| 775 | ] | ||
| 776 | |||
| 777 | [[package]] | ||
| 778 | name = "http" | ||
| 779 | version = "1.3.1" | ||
| 780 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 781 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" | ||
| 782 | dependencies = [ | ||
| 783 | "bytes", | ||
| 784 | "fnv", | ||
| 785 | "itoa", | ||
| 786 | ] | ||
| 787 | |||
| 788 | [[package]] | ||
| 789 | name = "http-body" | ||
| 790 | version = "1.0.1" | ||
| 791 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 792 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" | ||
| 793 | dependencies = [ | ||
| 794 | "bytes", | ||
| 795 | "http", | ||
| 796 | ] | ||
| 797 | |||
| 798 | [[package]] | ||
| 799 | name = "http-body-util" | ||
| 800 | version = "0.1.3" | ||
| 801 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 802 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" | ||
| 803 | dependencies = [ | ||
| 804 | "bytes", | ||
| 805 | "futures-core", | ||
| 806 | "http", | ||
| 807 | "http-body", | ||
| 808 | "pin-project-lite", | ||
| 809 | ] | ||
| 810 | |||
| 811 | [[package]] | ||
| 812 | name = "httparse" | ||
| 813 | version = "1.10.1" | ||
| 814 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 815 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" | ||
| 816 | |||
| 817 | [[package]] | ||
| 818 | name = "hyper" | ||
| 819 | version = "1.7.0" | ||
| 820 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 821 | checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" | ||
| 822 | dependencies = [ | ||
| 823 | "atomic-waker", | ||
| 824 | "bytes", | ||
| 825 | "futures-channel", | ||
| 826 | "futures-core", | ||
| 827 | "http", | ||
| 828 | "http-body", | ||
| 829 | "httparse", | ||
| 830 | "itoa", | ||
| 831 | "pin-project-lite", | ||
| 832 | "pin-utils", | ||
| 833 | "smallvec", | ||
| 834 | "tokio", | ||
| 835 | "want", | ||
| 836 | ] | ||
| 837 | |||
| 838 | [[package]] | ||
| 839 | name = "hyper-rustls" | ||
| 840 | version = "0.27.7" | ||
| 841 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 842 | checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" | ||
| 843 | dependencies = [ | ||
| 844 | "http", | ||
| 845 | "hyper", | ||
| 846 | "hyper-util", | ||
| 847 | "rustls", | ||
| 848 | "rustls-pki-types", | ||
| 849 | "tokio", | ||
| 850 | "tokio-rustls", | ||
| 851 | "tower-service", | ||
| 852 | "webpki-roots 1.0.4", | ||
| 853 | ] | ||
| 854 | |||
| 855 | [[package]] | ||
| 856 | name = "hyper-util" | ||
| 857 | version = "0.1.17" | ||
| 858 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 859 | checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" | ||
| 860 | dependencies = [ | ||
| 861 | "base64", | ||
| 862 | "bytes", | ||
| 863 | "futures-channel", | ||
| 864 | "futures-core", | ||
| 865 | "futures-util", | ||
| 866 | "http", | ||
| 867 | "http-body", | ||
| 868 | "hyper", | ||
| 869 | "ipnet", | ||
| 870 | "libc", | ||
| 871 | "percent-encoding", | ||
| 872 | "pin-project-lite", | ||
| 873 | "socket2", | ||
| 874 | "tokio", | ||
| 875 | "tower-service", | ||
| 876 | "tracing", | ||
| 877 | ] | ||
| 878 | |||
| 879 | [[package]] | ||
| 880 | name = "iana-time-zone" | ||
| 881 | version = "0.1.64" | ||
| 882 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 883 | checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" | ||
| 884 | dependencies = [ | ||
| 885 | "android_system_properties", | ||
| 886 | "core-foundation-sys", | ||
| 887 | "iana-time-zone-haiku", | ||
| 888 | "js-sys", | ||
| 889 | "log", | ||
| 890 | "wasm-bindgen", | ||
| 891 | "windows-core", | ||
| 892 | ] | ||
| 893 | |||
| 894 | [[package]] | ||
| 895 | name = "iana-time-zone-haiku" | ||
| 896 | version = "0.1.2" | ||
| 897 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 898 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" | ||
| 899 | dependencies = [ | ||
| 900 | "cc", | ||
| 901 | ] | ||
| 902 | |||
| 903 | [[package]] | ||
| 904 | name = "icu_collections" | ||
| 905 | version = "2.1.1" | ||
| 906 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 907 | checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" | ||
| 908 | dependencies = [ | ||
| 909 | "displaydoc", | ||
| 910 | "potential_utf", | ||
| 911 | "yoke", | ||
| 912 | "zerofrom", | ||
| 913 | "zerovec", | ||
| 914 | ] | ||
| 915 | |||
| 916 | [[package]] | ||
| 917 | name = "icu_locale_core" | ||
| 918 | version = "2.1.1" | ||
| 919 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 920 | checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" | ||
| 921 | dependencies = [ | ||
| 922 | "displaydoc", | ||
| 923 | "litemap", | ||
| 924 | "tinystr", | ||
| 925 | "writeable", | ||
| 926 | "zerovec", | ||
| 927 | ] | ||
| 928 | |||
| 929 | [[package]] | ||
| 930 | name = "icu_normalizer" | ||
| 931 | version = "2.1.1" | ||
| 932 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 933 | checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" | ||
| 934 | dependencies = [ | ||
| 935 | "icu_collections", | ||
| 936 | "icu_normalizer_data", | ||
| 937 | "icu_properties", | ||
| 938 | "icu_provider", | ||
| 939 | "smallvec", | ||
| 940 | "zerovec", | ||
| 941 | ] | ||
| 942 | |||
| 943 | [[package]] | ||
| 944 | name = "icu_normalizer_data" | ||
| 945 | version = "2.1.1" | ||
| 946 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 947 | checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" | ||
| 948 | |||
| 949 | [[package]] | ||
| 950 | name = "icu_properties" | ||
| 951 | version = "2.1.1" | ||
| 952 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 953 | checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" | ||
| 954 | dependencies = [ | ||
| 955 | "icu_collections", | ||
| 956 | "icu_locale_core", | ||
| 957 | "icu_properties_data", | ||
| 958 | "icu_provider", | ||
| 959 | "zerotrie", | ||
| 960 | "zerovec", | ||
| 961 | ] | ||
| 962 | |||
| 963 | [[package]] | ||
| 964 | name = "icu_properties_data" | ||
| 965 | version = "2.1.1" | ||
| 966 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 967 | checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" | ||
| 968 | |||
| 969 | [[package]] | ||
| 970 | name = "icu_provider" | ||
| 971 | version = "2.1.1" | ||
| 972 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 973 | checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" | ||
| 974 | dependencies = [ | ||
| 975 | "displaydoc", | ||
| 976 | "icu_locale_core", | ||
| 977 | "writeable", | ||
| 978 | "yoke", | ||
| 979 | "zerofrom", | ||
| 980 | "zerotrie", | ||
| 981 | "zerovec", | ||
| 982 | ] | ||
| 983 | |||
| 984 | [[package]] | ||
| 985 | name = "idna" | ||
| 986 | version = "1.1.0" | ||
| 987 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 988 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" | ||
| 989 | dependencies = [ | ||
| 990 | "idna_adapter", | ||
| 991 | "smallvec", | ||
| 992 | "utf8_iter", | ||
| 993 | ] | ||
| 994 | |||
| 995 | [[package]] | ||
| 996 | name = "idna_adapter" | ||
| 997 | version = "1.2.1" | ||
| 998 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 999 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" | ||
| 1000 | dependencies = [ | ||
| 1001 | "icu_normalizer", | ||
| 1002 | "icu_properties", | ||
| 1003 | ] | ||
| 1004 | |||
| 1005 | [[package]] | ||
| 1006 | name = "indexmap" | ||
| 1007 | version = "2.12.0" | ||
| 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1009 | checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" | ||
| 1010 | dependencies = [ | ||
| 1011 | "equivalent", | ||
| 1012 | "hashbrown 0.16.0", | ||
| 1013 | ] | ||
| 1014 | |||
| 1015 | [[package]] | ||
| 1016 | name = "inout" | ||
| 1017 | version = "0.1.4" | ||
| 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1019 | checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" | ||
| 1020 | dependencies = [ | ||
| 1021 | "block-padding", | ||
| 1022 | "generic-array", | ||
| 1023 | ] | ||
| 1024 | |||
| 1025 | [[package]] | ||
| 1026 | name = "instant" | ||
| 1027 | version = "0.1.13" | ||
| 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1029 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" | ||
| 1030 | dependencies = [ | ||
| 1031 | "cfg-if", | ||
| 1032 | "js-sys", | ||
| 1033 | "wasm-bindgen", | ||
| 1034 | "web-sys", | ||
| 1035 | ] | ||
| 1036 | |||
| 1037 | [[package]] | ||
| 1038 | name = "ipnet" | ||
| 1039 | version = "2.11.0" | ||
| 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1041 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" | ||
| 1042 | |||
| 1043 | [[package]] | ||
| 1044 | name = "iri-string" | ||
| 1045 | version = "0.7.8" | ||
| 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1047 | checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" | ||
| 1048 | dependencies = [ | ||
| 1049 | "memchr", | ||
| 1050 | "serde", | ||
| 1051 | ] | ||
| 1052 | |||
| 1053 | [[package]] | ||
| 1054 | name = "is_terminal_polyfill" | ||
| 1055 | version = "1.70.2" | ||
| 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1057 | checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" | ||
| 1058 | |||
| 1059 | [[package]] | ||
| 1060 | name = "itoa" | ||
| 1061 | version = "1.0.15" | ||
| 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1063 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" | ||
| 1064 | |||
| 1065 | [[package]] | ||
| 1066 | name = "js-sys" | ||
| 1067 | version = "0.3.82" | ||
| 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1069 | checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" | ||
| 1070 | dependencies = [ | ||
| 1071 | "once_cell", | ||
| 1072 | "wasm-bindgen", | ||
| 1073 | ] | ||
| 1074 | |||
| 1075 | [[package]] | ||
| 1076 | name = "lazy_static" | ||
| 1077 | version = "1.5.0" | ||
| 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1079 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" | ||
| 1080 | |||
| 1081 | [[package]] | ||
| 1082 | name = "libc" | ||
| 1083 | version = "0.2.177" | ||
| 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1085 | checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" | ||
| 1086 | |||
| 1087 | [[package]] | ||
| 1088 | name = "litemap" | ||
| 1089 | version = "0.8.1" | ||
| 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1091 | checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" | ||
| 1092 | |||
| 1093 | [[package]] | ||
| 1094 | name = "lnurl-pay" | ||
| 1095 | version = "0.6.0" | ||
| 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1097 | checksum = "536e7c782167a2d48346ca0b2677fad19eaef20f19a4ab868e4d5b96ca879def" | ||
| 1098 | dependencies = [ | ||
| 1099 | "bech32", | ||
| 1100 | "reqwest", | ||
| 1101 | "serde", | ||
| 1102 | "serde_json", | ||
| 1103 | ] | ||
| 1104 | |||
| 1105 | [[package]] | ||
| 1106 | name = "lock_api" | ||
| 1107 | version = "0.4.14" | ||
| 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1109 | checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" | ||
| 1110 | dependencies = [ | ||
| 1111 | "scopeguard", | ||
| 1112 | ] | ||
| 1113 | |||
| 1114 | [[package]] | ||
| 1115 | name = "log" | ||
| 1116 | version = "0.4.28" | ||
| 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1118 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" | ||
| 1119 | |||
| 1120 | [[package]] | ||
| 1121 | name = "lru" | ||
| 1122 | version = "0.12.5" | ||
| 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1124 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" | ||
| 1125 | dependencies = [ | ||
| 1126 | "hashbrown 0.15.5", | ||
| 1127 | ] | ||
| 1128 | |||
| 1129 | [[package]] | ||
| 1130 | name = "lru-slab" | ||
| 1131 | version = "0.1.2" | ||
| 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1133 | checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" | ||
| 1134 | |||
| 1135 | [[package]] | ||
| 1136 | name = "matchers" | ||
| 1137 | version = "0.2.0" | ||
| 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1139 | checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" | ||
| 1140 | dependencies = [ | ||
| 1141 | "regex-automata", | ||
| 1142 | ] | ||
| 1143 | |||
| 1144 | [[package]] | ||
| 1145 | name = "memchr" | ||
| 1146 | version = "2.7.6" | ||
| 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1148 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" | ||
| 1149 | |||
| 1150 | [[package]] | ||
| 1151 | name = "mio" | ||
| 1152 | version = "1.1.0" | ||
| 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1154 | checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" | ||
| 1155 | dependencies = [ | ||
| 1156 | "libc", | ||
| 1157 | "wasi", | ||
| 1158 | "windows-sys 0.61.2", | ||
| 1159 | ] | ||
| 1160 | |||
| 1161 | [[package]] | ||
| 1162 | name = "negentropy" | ||
| 1163 | version = "0.3.1" | ||
| 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1165 | checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe" | ||
| 1166 | |||
| 1167 | [[package]] | ||
| 1168 | name = "negentropy" | ||
| 1169 | version = "0.4.3" | ||
| 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1171 | checksum = "43a88da9dd148bbcdce323dd6ac47d369b4769d4a3b78c6c52389b9269f77932" | ||
| 1172 | |||
| 1173 | [[package]] | ||
| 1174 | name = "nostr" | ||
| 1175 | version = "0.35.0" | ||
| 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1177 | checksum = "56db234b2e07901e372f34e9463f91590579cd8e6dbd34ed2ccc7e461e4ba639" | ||
| 1178 | dependencies = [ | ||
| 1179 | "aes", | ||
| 1180 | "base64", | ||
| 1181 | "bech32", | ||
| 1182 | "bip39", | ||
| 1183 | "bitcoin", | ||
| 1184 | "cbc", | ||
| 1185 | "chacha20", | ||
| 1186 | "chacha20poly1305", | ||
| 1187 | "getrandom 0.2.16", | ||
| 1188 | "instant", | ||
| 1189 | "js-sys", | ||
| 1190 | "negentropy 0.3.1", | ||
| 1191 | "negentropy 0.4.3", | ||
| 1192 | "once_cell", | ||
| 1193 | "reqwest", | ||
| 1194 | "scrypt", | ||
| 1195 | "serde", | ||
| 1196 | "serde_json", | ||
| 1197 | "unicode-normalization", | ||
| 1198 | "url", | ||
| 1199 | "wasm-bindgen", | ||
| 1200 | "wasm-bindgen-futures", | ||
| 1201 | "web-sys", | ||
| 1202 | ] | ||
| 1203 | |||
| 1204 | [[package]] | ||
| 1205 | name = "nostr-database" | ||
| 1206 | version = "0.35.0" | ||
| 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1208 | checksum = "50de8cc5e77e7dafa7e2e0d0d67187ef19e191dcd1a68efffd3e05152d91b3c3" | ||
| 1209 | dependencies = [ | ||
| 1210 | "async-trait", | ||
| 1211 | "lru", | ||
| 1212 | "nostr", | ||
| 1213 | "thiserror 1.0.69", | ||
| 1214 | "tokio", | ||
| 1215 | "tracing", | ||
| 1216 | ] | ||
| 1217 | |||
| 1218 | [[package]] | ||
| 1219 | name = "nostr-relay-pool" | ||
| 1220 | version = "0.35.0" | ||
| 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1222 | checksum = "800b9ca169902977366f8243ec645b1fa4a128ab621331796d4a26bd7bc22a88" | ||
| 1223 | dependencies = [ | ||
| 1224 | "async-utility", | ||
| 1225 | "async-wsocket", | ||
| 1226 | "atomic-destructor", | ||
| 1227 | "negentropy 0.3.1", | ||
| 1228 | "negentropy 0.4.3", | ||
| 1229 | "nostr", | ||
| 1230 | "nostr-database", | ||
| 1231 | "thiserror 1.0.69", | ||
| 1232 | "tokio", | ||
| 1233 | "tokio-stream", | ||
| 1234 | "tracing", | ||
| 1235 | ] | ||
| 1236 | |||
| 1237 | [[package]] | ||
| 1238 | name = "nostr-sdk" | ||
| 1239 | version = "0.35.0" | ||
| 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1241 | checksum = "d93036bf4c1e35145ca2cd6ee4cb7bb9c74f41cbca9cc4caff1e87b5e192f253" | ||
| 1242 | dependencies = [ | ||
| 1243 | "async-utility", | ||
| 1244 | "atomic-destructor", | ||
| 1245 | "lnurl-pay", | ||
| 1246 | "nostr", | ||
| 1247 | "nostr-database", | ||
| 1248 | "nostr-relay-pool", | ||
| 1249 | "nostr-signer", | ||
| 1250 | "nostr-zapper", | ||
| 1251 | "nwc", | ||
| 1252 | "thiserror 1.0.69", | ||
| 1253 | "tokio", | ||
| 1254 | "tracing", | ||
| 1255 | ] | ||
| 1256 | |||
| 1257 | [[package]] | ||
| 1258 | name = "nostr-signer" | ||
| 1259 | version = "0.35.0" | ||
| 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1261 | checksum = "c1e132975a677a1c97a7695ef1161291dc06517a588b6e17e3aa05d3fb4056a0" | ||
| 1262 | dependencies = [ | ||
| 1263 | "async-utility", | ||
| 1264 | "nostr", | ||
| 1265 | "nostr-relay-pool", | ||
| 1266 | "thiserror 1.0.69", | ||
| 1267 | "tokio", | ||
| 1268 | "tracing", | ||
| 1269 | ] | ||
| 1270 | |||
| 1271 | [[package]] | ||
| 1272 | name = "nostr-zapper" | ||
| 1273 | version = "0.35.0" | ||
| 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1275 | checksum = "b60e7a3ecc9881ca418e772a6fc4410920653a9f0bf9457b6ddd732d2a3f64f1" | ||
| 1276 | dependencies = [ | ||
| 1277 | "async-trait", | ||
| 1278 | "nostr", | ||
| 1279 | "thiserror 1.0.69", | ||
| 1280 | ] | ||
| 1281 | |||
| 1282 | [[package]] | ||
| 1283 | name = "nu-ansi-term" | ||
| 1284 | version = "0.50.3" | ||
| 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1286 | checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" | ||
| 1287 | dependencies = [ | ||
| 1288 | "windows-sys 0.61.2", | ||
| 1289 | ] | ||
| 1290 | |||
| 1291 | [[package]] | ||
| 1292 | name = "num-traits" | ||
| 1293 | version = "0.2.19" | ||
| 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1295 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" | ||
| 1296 | dependencies = [ | ||
| 1297 | "autocfg", | ||
| 1298 | ] | ||
| 1299 | |||
| 1300 | [[package]] | ||
| 1301 | name = "nwc" | ||
| 1302 | version = "0.35.0" | ||
| 1303 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1304 | checksum = "2e962f52732a6d91c1e76d4de3f1daa186e77a849e98e5abe53ca7fe9796d04e" | ||
| 1305 | dependencies = [ | ||
| 1306 | "async-utility", | ||
| 1307 | "nostr", | ||
| 1308 | "nostr-relay-pool", | ||
| 1309 | "nostr-zapper", | ||
| 1310 | "thiserror 1.0.69", | ||
| 1311 | "tracing", | ||
| 1312 | ] | ||
| 1313 | |||
| 1314 | [[package]] | ||
| 1315 | name = "once_cell" | ||
| 1316 | version = "1.21.3" | ||
| 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1318 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" | ||
| 1319 | |||
| 1320 | [[package]] | ||
| 1321 | name = "once_cell_polyfill" | ||
| 1322 | version = "1.70.2" | ||
| 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1324 | checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" | ||
| 1325 | |||
| 1326 | [[package]] | ||
| 1327 | name = "opaque-debug" | ||
| 1328 | version = "0.3.1" | ||
| 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1330 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" | ||
| 1331 | |||
| 1332 | [[package]] | ||
| 1333 | name = "parking_lot" | ||
| 1334 | version = "0.12.5" | ||
| 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1336 | checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" | ||
| 1337 | dependencies = [ | ||
| 1338 | "lock_api", | ||
| 1339 | "parking_lot_core", | ||
| 1340 | ] | ||
| 1341 | |||
| 1342 | [[package]] | ||
| 1343 | name = "parking_lot_core" | ||
| 1344 | version = "0.9.12" | ||
| 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1346 | checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" | ||
| 1347 | dependencies = [ | ||
| 1348 | "cfg-if", | ||
| 1349 | "libc", | ||
| 1350 | "redox_syscall", | ||
| 1351 | "smallvec", | ||
| 1352 | "windows-link", | ||
| 1353 | ] | ||
| 1354 | |||
| 1355 | [[package]] | ||
| 1356 | name = "password-hash" | ||
| 1357 | version = "0.5.0" | ||
| 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1359 | checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" | ||
| 1360 | dependencies = [ | ||
| 1361 | "base64ct", | ||
| 1362 | "rand_core 0.6.4", | ||
| 1363 | "subtle", | ||
| 1364 | ] | ||
| 1365 | |||
| 1366 | [[package]] | ||
| 1367 | name = "pbkdf2" | ||
| 1368 | version = "0.12.2" | ||
| 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1370 | checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" | ||
| 1371 | dependencies = [ | ||
| 1372 | "digest", | ||
| 1373 | "hmac", | ||
| 1374 | ] | ||
| 1375 | |||
| 1376 | [[package]] | ||
| 1377 | name = "percent-encoding" | ||
| 1378 | version = "2.3.2" | ||
| 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1380 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" | ||
| 1381 | |||
| 1382 | [[package]] | ||
| 1383 | name = "pin-project-lite" | ||
| 1384 | version = "0.2.16" | ||
| 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1386 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" | ||
| 1387 | |||
| 1388 | [[package]] | ||
| 1389 | name = "pin-utils" | ||
| 1390 | version = "0.1.0" | ||
| 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1392 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" | ||
| 1393 | |||
| 1394 | [[package]] | ||
| 1395 | name = "poly1305" | ||
| 1396 | version = "0.8.0" | ||
| 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1398 | checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" | ||
| 1399 | dependencies = [ | ||
| 1400 | "cpufeatures", | ||
| 1401 | "opaque-debug", | ||
| 1402 | "universal-hash", | ||
| 1403 | ] | ||
| 1404 | |||
| 1405 | [[package]] | ||
| 1406 | name = "potential_utf" | ||
| 1407 | version = "0.1.4" | ||
| 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1409 | checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" | ||
| 1410 | dependencies = [ | ||
| 1411 | "zerovec", | ||
| 1412 | ] | ||
| 1413 | |||
| 1414 | [[package]] | ||
| 1415 | name = "ppv-lite86" | ||
| 1416 | version = "0.2.21" | ||
| 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1418 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" | ||
| 1419 | dependencies = [ | ||
| 1420 | "zerocopy", | ||
| 1421 | ] | ||
| 1422 | |||
| 1423 | [[package]] | ||
| 1424 | name = "proc-macro2" | ||
| 1425 | version = "1.0.103" | ||
| 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1427 | checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" | ||
| 1428 | dependencies = [ | ||
| 1429 | "unicode-ident", | ||
| 1430 | ] | ||
| 1431 | |||
| 1432 | [[package]] | ||
| 1433 | name = "quinn" | ||
| 1434 | version = "0.11.9" | ||
| 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1436 | checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" | ||
| 1437 | dependencies = [ | ||
| 1438 | "bytes", | ||
| 1439 | "cfg_aliases", | ||
| 1440 | "pin-project-lite", | ||
| 1441 | "quinn-proto", | ||
| 1442 | "quinn-udp", | ||
| 1443 | "rustc-hash", | ||
| 1444 | "rustls", | ||
| 1445 | "socket2", | ||
| 1446 | "thiserror 2.0.17", | ||
| 1447 | "tokio", | ||
| 1448 | "tracing", | ||
| 1449 | "web-time", | ||
| 1450 | ] | ||
| 1451 | |||
| 1452 | [[package]] | ||
| 1453 | name = "quinn-proto" | ||
| 1454 | version = "0.11.13" | ||
| 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1456 | checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" | ||
| 1457 | dependencies = [ | ||
| 1458 | "bytes", | ||
| 1459 | "getrandom 0.3.4", | ||
| 1460 | "lru-slab", | ||
| 1461 | "rand 0.9.2", | ||
| 1462 | "ring", | ||
| 1463 | "rustc-hash", | ||
| 1464 | "rustls", | ||
| 1465 | "rustls-pki-types", | ||
| 1466 | "slab", | ||
| 1467 | "thiserror 2.0.17", | ||
| 1468 | "tinyvec", | ||
| 1469 | "tracing", | ||
| 1470 | "web-time", | ||
| 1471 | ] | ||
| 1472 | |||
| 1473 | [[package]] | ||
| 1474 | name = "quinn-udp" | ||
| 1475 | version = "0.5.14" | ||
| 1476 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1477 | checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" | ||
| 1478 | dependencies = [ | ||
| 1479 | "cfg_aliases", | ||
| 1480 | "libc", | ||
| 1481 | "once_cell", | ||
| 1482 | "socket2", | ||
| 1483 | "tracing", | ||
| 1484 | "windows-sys 0.60.2", | ||
| 1485 | ] | ||
| 1486 | |||
| 1487 | [[package]] | ||
| 1488 | name = "quote" | ||
| 1489 | version = "1.0.41" | ||
| 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1491 | checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" | ||
| 1492 | dependencies = [ | ||
| 1493 | "proc-macro2", | ||
| 1494 | ] | ||
| 1495 | |||
| 1496 | [[package]] | ||
| 1497 | name = "r-efi" | ||
| 1498 | version = "5.3.0" | ||
| 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1500 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" | ||
| 1501 | |||
| 1502 | [[package]] | ||
| 1503 | name = "rand" | ||
| 1504 | version = "0.8.5" | ||
| 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1506 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" | ||
| 1507 | dependencies = [ | ||
| 1508 | "libc", | ||
| 1509 | "rand_chacha 0.3.1", | ||
| 1510 | "rand_core 0.6.4", | ||
| 1511 | ] | ||
| 1512 | |||
| 1513 | [[package]] | ||
| 1514 | name = "rand" | ||
| 1515 | version = "0.9.2" | ||
| 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1517 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" | ||
| 1518 | dependencies = [ | ||
| 1519 | "rand_chacha 0.9.0", | ||
| 1520 | "rand_core 0.9.3", | ||
| 1521 | ] | ||
| 1522 | |||
| 1523 | [[package]] | ||
| 1524 | name = "rand_chacha" | ||
| 1525 | version = "0.3.1" | ||
| 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1527 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" | ||
| 1528 | dependencies = [ | ||
| 1529 | "ppv-lite86", | ||
| 1530 | "rand_core 0.6.4", | ||
| 1531 | ] | ||
| 1532 | |||
| 1533 | [[package]] | ||
| 1534 | name = "rand_chacha" | ||
| 1535 | version = "0.9.0" | ||
| 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1537 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" | ||
| 1538 | dependencies = [ | ||
| 1539 | "ppv-lite86", | ||
| 1540 | "rand_core 0.9.3", | ||
| 1541 | ] | ||
| 1542 | |||
| 1543 | [[package]] | ||
| 1544 | name = "rand_core" | ||
| 1545 | version = "0.6.4" | ||
| 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1547 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" | ||
| 1548 | dependencies = [ | ||
| 1549 | "getrandom 0.2.16", | ||
| 1550 | ] | ||
| 1551 | |||
| 1552 | [[package]] | ||
| 1553 | name = "rand_core" | ||
| 1554 | version = "0.9.3" | ||
| 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1556 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" | ||
| 1557 | dependencies = [ | ||
| 1558 | "getrandom 0.3.4", | ||
| 1559 | ] | ||
| 1560 | |||
| 1561 | [[package]] | ||
| 1562 | name = "redox_syscall" | ||
| 1563 | version = "0.5.18" | ||
| 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1565 | checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" | ||
| 1566 | dependencies = [ | ||
| 1567 | "bitflags", | ||
| 1568 | ] | ||
| 1569 | |||
| 1570 | [[package]] | ||
| 1571 | name = "regex-automata" | ||
| 1572 | version = "0.4.13" | ||
| 1573 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1574 | checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" | ||
| 1575 | dependencies = [ | ||
| 1576 | "aho-corasick", | ||
| 1577 | "memchr", | ||
| 1578 | "regex-syntax", | ||
| 1579 | ] | ||
| 1580 | |||
| 1581 | [[package]] | ||
| 1582 | name = "regex-syntax" | ||
| 1583 | version = "0.8.8" | ||
| 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1585 | checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" | ||
| 1586 | |||
| 1587 | [[package]] | ||
| 1588 | name = "reqwest" | ||
| 1589 | version = "0.12.24" | ||
| 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1591 | checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" | ||
| 1592 | dependencies = [ | ||
| 1593 | "base64", | ||
| 1594 | "bytes", | ||
| 1595 | "futures-core", | ||
| 1596 | "http", | ||
| 1597 | "http-body", | ||
| 1598 | "http-body-util", | ||
| 1599 | "hyper", | ||
| 1600 | "hyper-rustls", | ||
| 1601 | "hyper-util", | ||
| 1602 | "js-sys", | ||
| 1603 | "log", | ||
| 1604 | "percent-encoding", | ||
| 1605 | "pin-project-lite", | ||
| 1606 | "quinn", | ||
| 1607 | "rustls", | ||
| 1608 | "rustls-pki-types", | ||
| 1609 | "serde", | ||
| 1610 | "serde_json", | ||
| 1611 | "serde_urlencoded", | ||
| 1612 | "sync_wrapper", | ||
| 1613 | "tokio", | ||
| 1614 | "tokio-rustls", | ||
| 1615 | "tower", | ||
| 1616 | "tower-http", | ||
| 1617 | "tower-service", | ||
| 1618 | "url", | ||
| 1619 | "wasm-bindgen", | ||
| 1620 | "wasm-bindgen-futures", | ||
| 1621 | "web-sys", | ||
| 1622 | "webpki-roots 1.0.4", | ||
| 1623 | ] | ||
| 1624 | |||
| 1625 | [[package]] | ||
| 1626 | name = "ring" | ||
| 1627 | version = "0.17.14" | ||
| 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1629 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" | ||
| 1630 | dependencies = [ | ||
| 1631 | "cc", | ||
| 1632 | "cfg-if", | ||
| 1633 | "getrandom 0.2.16", | ||
| 1634 | "libc", | ||
| 1635 | "untrusted", | ||
| 1636 | "windows-sys 0.52.0", | ||
| 1637 | ] | ||
| 1638 | |||
| 1639 | [[package]] | ||
| 1640 | name = "rustc-hash" | ||
| 1641 | version = "2.1.1" | ||
| 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1643 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" | ||
| 1644 | |||
| 1645 | [[package]] | ||
| 1646 | name = "rustls" | ||
| 1647 | version = "0.23.34" | ||
| 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1649 | checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" | ||
| 1650 | dependencies = [ | ||
| 1651 | "once_cell", | ||
| 1652 | "ring", | ||
| 1653 | "rustls-pki-types", | ||
| 1654 | "rustls-webpki", | ||
| 1655 | "subtle", | ||
| 1656 | "zeroize", | ||
| 1657 | ] | ||
| 1658 | |||
| 1659 | [[package]] | ||
| 1660 | name = "rustls-pki-types" | ||
| 1661 | version = "1.13.0" | ||
| 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1663 | checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" | ||
| 1664 | dependencies = [ | ||
| 1665 | "web-time", | ||
| 1666 | "zeroize", | ||
| 1667 | ] | ||
| 1668 | |||
| 1669 | [[package]] | ||
| 1670 | name = "rustls-webpki" | ||
| 1671 | version = "0.103.8" | ||
| 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1673 | checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" | ||
| 1674 | dependencies = [ | ||
| 1675 | "ring", | ||
| 1676 | "rustls-pki-types", | ||
| 1677 | "untrusted", | ||
| 1678 | ] | ||
| 1679 | |||
| 1680 | [[package]] | ||
| 1681 | name = "rustversion" | ||
| 1682 | version = "1.0.22" | ||
| 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1684 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" | ||
| 1685 | |||
| 1686 | [[package]] | ||
| 1687 | name = "ryu" | ||
| 1688 | version = "1.0.20" | ||
| 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1690 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" | ||
| 1691 | |||
| 1692 | [[package]] | ||
| 1693 | name = "salsa20" | ||
| 1694 | version = "0.10.2" | ||
| 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1696 | checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" | ||
| 1697 | dependencies = [ | ||
| 1698 | "cipher", | ||
| 1699 | ] | ||
| 1700 | |||
| 1701 | [[package]] | ||
| 1702 | name = "scopeguard" | ||
| 1703 | version = "1.2.0" | ||
| 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1705 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" | ||
| 1706 | |||
| 1707 | [[package]] | ||
| 1708 | name = "scrypt" | ||
| 1709 | version = "0.11.0" | ||
| 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1711 | checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" | ||
| 1712 | dependencies = [ | ||
| 1713 | "password-hash", | ||
| 1714 | "pbkdf2", | ||
| 1715 | "salsa20", | ||
| 1716 | "sha2", | ||
| 1717 | ] | ||
| 1718 | |||
| 1719 | [[package]] | ||
| 1720 | name = "secp256k1" | ||
| 1721 | version = "0.29.1" | ||
| 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1723 | checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" | ||
| 1724 | dependencies = [ | ||
| 1725 | "bitcoin_hashes 0.14.0", | ||
| 1726 | "rand 0.8.5", | ||
| 1727 | "secp256k1-sys", | ||
| 1728 | "serde", | ||
| 1729 | ] | ||
| 1730 | |||
| 1731 | [[package]] | ||
| 1732 | name = "secp256k1-sys" | ||
| 1733 | version = "0.10.1" | ||
| 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1735 | checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" | ||
| 1736 | dependencies = [ | ||
| 1737 | "cc", | ||
| 1738 | ] | ||
| 1739 | |||
| 1740 | [[package]] | ||
| 1741 | name = "serde" | ||
| 1742 | version = "1.0.228" | ||
| 1743 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1744 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" | ||
| 1745 | dependencies = [ | ||
| 1746 | "serde_core", | ||
| 1747 | "serde_derive", | ||
| 1748 | ] | ||
| 1749 | |||
| 1750 | [[package]] | ||
| 1751 | name = "serde_core" | ||
| 1752 | version = "1.0.228" | ||
| 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1754 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" | ||
| 1755 | dependencies = [ | ||
| 1756 | "serde_derive", | ||
| 1757 | ] | ||
| 1758 | |||
| 1759 | [[package]] | ||
| 1760 | name = "serde_derive" | ||
| 1761 | version = "1.0.228" | ||
| 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1763 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" | ||
| 1764 | dependencies = [ | ||
| 1765 | "proc-macro2", | ||
| 1766 | "quote", | ||
| 1767 | "syn", | ||
| 1768 | ] | ||
| 1769 | |||
| 1770 | [[package]] | ||
| 1771 | name = "serde_json" | ||
| 1772 | version = "1.0.145" | ||
| 1773 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1774 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" | ||
| 1775 | dependencies = [ | ||
| 1776 | "indexmap", | ||
| 1777 | "itoa", | ||
| 1778 | "memchr", | ||
| 1779 | "ryu", | ||
| 1780 | "serde", | ||
| 1781 | "serde_core", | ||
| 1782 | ] | ||
| 1783 | |||
| 1784 | [[package]] | ||
| 1785 | name = "serde_urlencoded" | ||
| 1786 | version = "0.7.1" | ||
| 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1788 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" | ||
| 1789 | dependencies = [ | ||
| 1790 | "form_urlencoded", | ||
| 1791 | "itoa", | ||
| 1792 | "ryu", | ||
| 1793 | "serde", | ||
| 1794 | ] | ||
| 1795 | |||
| 1796 | [[package]] | ||
| 1797 | name = "sha1" | ||
| 1798 | version = "0.10.6" | ||
| 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1800 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" | ||
| 1801 | dependencies = [ | ||
| 1802 | "cfg-if", | ||
| 1803 | "cpufeatures", | ||
| 1804 | "digest", | ||
| 1805 | ] | ||
| 1806 | |||
| 1807 | [[package]] | ||
| 1808 | name = "sha2" | ||
| 1809 | version = "0.10.9" | ||
| 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1811 | checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" | ||
| 1812 | dependencies = [ | ||
| 1813 | "cfg-if", | ||
| 1814 | "cpufeatures", | ||
| 1815 | "digest", | ||
| 1816 | ] | ||
| 1817 | |||
| 1818 | [[package]] | ||
| 1819 | name = "sharded-slab" | ||
| 1820 | version = "0.1.7" | ||
| 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1822 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" | ||
| 1823 | dependencies = [ | ||
| 1824 | "lazy_static", | ||
| 1825 | ] | ||
| 1826 | |||
| 1827 | [[package]] | ||
| 1828 | name = "shlex" | ||
| 1829 | version = "1.3.0" | ||
| 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1831 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" | ||
| 1832 | |||
| 1833 | [[package]] | ||
| 1834 | name = "signal-hook-registry" | ||
| 1835 | version = "1.4.6" | ||
| 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1837 | checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" | ||
| 1838 | dependencies = [ | ||
| 1839 | "libc", | ||
| 1840 | ] | ||
| 1841 | |||
| 1842 | [[package]] | ||
| 1843 | name = "slab" | ||
| 1844 | version = "0.4.11" | ||
| 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1846 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" | ||
| 1847 | |||
| 1848 | [[package]] | ||
| 1849 | name = "smallvec" | ||
| 1850 | version = "1.15.1" | ||
| 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1852 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" | ||
| 1853 | |||
| 1854 | [[package]] | ||
| 1855 | name = "socket2" | ||
| 1856 | version = "0.6.1" | ||
| 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1858 | checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" | ||
| 1859 | dependencies = [ | ||
| 1860 | "libc", | ||
| 1861 | "windows-sys 0.60.2", | ||
| 1862 | ] | ||
| 1863 | |||
| 1864 | [[package]] | ||
| 1865 | name = "stable_deref_trait" | ||
| 1866 | version = "1.2.1" | ||
| 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1868 | checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" | ||
| 1869 | |||
| 1870 | [[package]] | ||
| 1871 | name = "strsim" | ||
| 1872 | version = "0.11.1" | ||
| 1873 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1874 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" | ||
| 1875 | |||
| 1876 | [[package]] | ||
| 1877 | name = "subtle" | ||
| 1878 | version = "2.6.1" | ||
| 1879 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1880 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" | ||
| 1881 | |||
| 1882 | [[package]] | ||
| 1883 | name = "syn" | ||
| 1884 | version = "2.0.108" | ||
| 1885 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1886 | checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" | ||
| 1887 | dependencies = [ | ||
| 1888 | "proc-macro2", | ||
| 1889 | "quote", | ||
| 1890 | "unicode-ident", | ||
| 1891 | ] | ||
| 1892 | |||
| 1893 | [[package]] | ||
| 1894 | name = "sync_wrapper" | ||
| 1895 | version = "1.0.2" | ||
| 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1897 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" | ||
| 1898 | dependencies = [ | ||
| 1899 | "futures-core", | ||
| 1900 | ] | ||
| 1901 | |||
| 1902 | [[package]] | ||
| 1903 | name = "synstructure" | ||
| 1904 | version = "0.13.2" | ||
| 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1906 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" | ||
| 1907 | dependencies = [ | ||
| 1908 | "proc-macro2", | ||
| 1909 | "quote", | ||
| 1910 | "syn", | ||
| 1911 | ] | ||
| 1912 | |||
| 1913 | [[package]] | ||
| 1914 | name = "thiserror" | ||
| 1915 | version = "1.0.69" | ||
| 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1917 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" | ||
| 1918 | dependencies = [ | ||
| 1919 | "thiserror-impl 1.0.69", | ||
| 1920 | ] | ||
| 1921 | |||
| 1922 | [[package]] | ||
| 1923 | name = "thiserror" | ||
| 1924 | version = "2.0.17" | ||
| 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1926 | checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" | ||
| 1927 | dependencies = [ | ||
| 1928 | "thiserror-impl 2.0.17", | ||
| 1929 | ] | ||
| 1930 | |||
| 1931 | [[package]] | ||
| 1932 | name = "thiserror-impl" | ||
| 1933 | version = "1.0.69" | ||
| 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1935 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" | ||
| 1936 | dependencies = [ | ||
| 1937 | "proc-macro2", | ||
| 1938 | "quote", | ||
| 1939 | "syn", | ||
| 1940 | ] | ||
| 1941 | |||
| 1942 | [[package]] | ||
| 1943 | name = "thiserror-impl" | ||
| 1944 | version = "2.0.17" | ||
| 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1946 | checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" | ||
| 1947 | dependencies = [ | ||
| 1948 | "proc-macro2", | ||
| 1949 | "quote", | ||
| 1950 | "syn", | ||
| 1951 | ] | ||
| 1952 | |||
| 1953 | [[package]] | ||
| 1954 | name = "thread_local" | ||
| 1955 | version = "1.1.9" | ||
| 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1957 | checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" | ||
| 1958 | dependencies = [ | ||
| 1959 | "cfg-if", | ||
| 1960 | ] | ||
| 1961 | |||
| 1962 | [[package]] | ||
| 1963 | name = "tinystr" | ||
| 1964 | version = "0.8.2" | ||
| 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1966 | checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" | ||
| 1967 | dependencies = [ | ||
| 1968 | "displaydoc", | ||
| 1969 | "zerovec", | ||
| 1970 | ] | ||
| 1971 | |||
| 1972 | [[package]] | ||
| 1973 | name = "tinyvec" | ||
| 1974 | version = "1.10.0" | ||
| 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1976 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" | ||
| 1977 | dependencies = [ | ||
| 1978 | "tinyvec_macros", | ||
| 1979 | ] | ||
| 1980 | |||
| 1981 | [[package]] | ||
| 1982 | name = "tinyvec_macros" | ||
| 1983 | version = "0.1.1" | ||
| 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1985 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" | ||
| 1986 | |||
| 1987 | [[package]] | ||
| 1988 | name = "tokio" | ||
| 1989 | version = "1.48.0" | ||
| 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1991 | checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" | ||
| 1992 | dependencies = [ | ||
| 1993 | "bytes", | ||
| 1994 | "libc", | ||
| 1995 | "mio", | ||
| 1996 | "parking_lot", | ||
| 1997 | "pin-project-lite", | ||
| 1998 | "signal-hook-registry", | ||
| 1999 | "socket2", | ||
| 2000 | "tokio-macros", | ||
| 2001 | "windows-sys 0.61.2", | ||
| 2002 | ] | ||
| 2003 | |||
| 2004 | [[package]] | ||
| 2005 | name = "tokio-macros" | ||
| 2006 | version = "2.6.0" | ||
| 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2008 | checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" | ||
| 2009 | dependencies = [ | ||
| 2010 | "proc-macro2", | ||
| 2011 | "quote", | ||
| 2012 | "syn", | ||
| 2013 | ] | ||
| 2014 | |||
| 2015 | [[package]] | ||
| 2016 | name = "tokio-rustls" | ||
| 2017 | version = "0.26.4" | ||
| 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2019 | checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" | ||
| 2020 | dependencies = [ | ||
| 2021 | "rustls", | ||
| 2022 | "tokio", | ||
| 2023 | ] | ||
| 2024 | |||
| 2025 | [[package]] | ||
| 2026 | name = "tokio-socks" | ||
| 2027 | version = "0.5.2" | ||
| 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2029 | checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" | ||
| 2030 | dependencies = [ | ||
| 2031 | "either", | ||
| 2032 | "futures-util", | ||
| 2033 | "thiserror 1.0.69", | ||
| 2034 | "tokio", | ||
| 2035 | ] | ||
| 2036 | |||
| 2037 | [[package]] | ||
| 2038 | name = "tokio-stream" | ||
| 2039 | version = "0.1.17" | ||
| 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2041 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" | ||
| 2042 | dependencies = [ | ||
| 2043 | "futures-core", | ||
| 2044 | "pin-project-lite", | ||
| 2045 | "tokio", | ||
| 2046 | ] | ||
| 2047 | |||
| 2048 | [[package]] | ||
| 2049 | name = "tokio-test" | ||
| 2050 | version = "0.4.4" | ||
| 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2052 | checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" | ||
| 2053 | dependencies = [ | ||
| 2054 | "async-stream", | ||
| 2055 | "bytes", | ||
| 2056 | "futures-core", | ||
| 2057 | "tokio", | ||
| 2058 | "tokio-stream", | ||
| 2059 | ] | ||
| 2060 | |||
| 2061 | [[package]] | ||
| 2062 | name = "tokio-tungstenite" | ||
| 2063 | version = "0.24.0" | ||
| 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2065 | checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" | ||
| 2066 | dependencies = [ | ||
| 2067 | "futures-util", | ||
| 2068 | "log", | ||
| 2069 | "rustls", | ||
| 2070 | "rustls-pki-types", | ||
| 2071 | "tokio", | ||
| 2072 | "tokio-rustls", | ||
| 2073 | "tungstenite", | ||
| 2074 | "webpki-roots 0.26.11", | ||
| 2075 | ] | ||
| 2076 | |||
| 2077 | [[package]] | ||
| 2078 | name = "tower" | ||
| 2079 | version = "0.5.2" | ||
| 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2081 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" | ||
| 2082 | dependencies = [ | ||
| 2083 | "futures-core", | ||
| 2084 | "futures-util", | ||
| 2085 | "pin-project-lite", | ||
| 2086 | "sync_wrapper", | ||
| 2087 | "tokio", | ||
| 2088 | "tower-layer", | ||
| 2089 | "tower-service", | ||
| 2090 | ] | ||
| 2091 | |||
| 2092 | [[package]] | ||
| 2093 | name = "tower-http" | ||
| 2094 | version = "0.6.6" | ||
| 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2096 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" | ||
| 2097 | dependencies = [ | ||
| 2098 | "bitflags", | ||
| 2099 | "bytes", | ||
| 2100 | "futures-util", | ||
| 2101 | "http", | ||
| 2102 | "http-body", | ||
| 2103 | "iri-string", | ||
| 2104 | "pin-project-lite", | ||
| 2105 | "tower", | ||
| 2106 | "tower-layer", | ||
| 2107 | "tower-service", | ||
| 2108 | ] | ||
| 2109 | |||
| 2110 | [[package]] | ||
| 2111 | name = "tower-layer" | ||
| 2112 | version = "0.3.3" | ||
| 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2114 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" | ||
| 2115 | |||
| 2116 | [[package]] | ||
| 2117 | name = "tower-service" | ||
| 2118 | version = "0.3.3" | ||
| 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2120 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" | ||
| 2121 | |||
| 2122 | [[package]] | ||
| 2123 | name = "tracing" | ||
| 2124 | version = "0.1.41" | ||
| 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2126 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" | ||
| 2127 | dependencies = [ | ||
| 2128 | "pin-project-lite", | ||
| 2129 | "tracing-attributes", | ||
| 2130 | "tracing-core", | ||
| 2131 | ] | ||
| 2132 | |||
| 2133 | [[package]] | ||
| 2134 | name = "tracing-attributes" | ||
| 2135 | version = "0.1.30" | ||
| 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2137 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" | ||
| 2138 | dependencies = [ | ||
| 2139 | "proc-macro2", | ||
| 2140 | "quote", | ||
| 2141 | "syn", | ||
| 2142 | ] | ||
| 2143 | |||
| 2144 | [[package]] | ||
| 2145 | name = "tracing-core" | ||
| 2146 | version = "0.1.34" | ||
| 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2148 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" | ||
| 2149 | dependencies = [ | ||
| 2150 | "once_cell", | ||
| 2151 | "valuable", | ||
| 2152 | ] | ||
| 2153 | |||
| 2154 | [[package]] | ||
| 2155 | name = "tracing-log" | ||
| 2156 | version = "0.2.0" | ||
| 2157 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2158 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" | ||
| 2159 | dependencies = [ | ||
| 2160 | "log", | ||
| 2161 | "once_cell", | ||
| 2162 | "tracing-core", | ||
| 2163 | ] | ||
| 2164 | |||
| 2165 | [[package]] | ||
| 2166 | name = "tracing-subscriber" | ||
| 2167 | version = "0.3.20" | ||
| 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2169 | checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" | ||
| 2170 | dependencies = [ | ||
| 2171 | "matchers", | ||
| 2172 | "nu-ansi-term", | ||
| 2173 | "once_cell", | ||
| 2174 | "regex-automata", | ||
| 2175 | "sharded-slab", | ||
| 2176 | "smallvec", | ||
| 2177 | "thread_local", | ||
| 2178 | "tracing", | ||
| 2179 | "tracing-core", | ||
| 2180 | "tracing-log", | ||
| 2181 | ] | ||
| 2182 | |||
| 2183 | [[package]] | ||
| 2184 | name = "try-lock" | ||
| 2185 | version = "0.2.5" | ||
| 2186 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2187 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" | ||
| 2188 | |||
| 2189 | [[package]] | ||
| 2190 | name = "tungstenite" | ||
| 2191 | version = "0.24.0" | ||
| 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2193 | checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" | ||
| 2194 | dependencies = [ | ||
| 2195 | "byteorder", | ||
| 2196 | "bytes", | ||
| 2197 | "data-encoding", | ||
| 2198 | "http", | ||
| 2199 | "httparse", | ||
| 2200 | "log", | ||
| 2201 | "rand 0.8.5", | ||
| 2202 | "rustls", | ||
| 2203 | "rustls-pki-types", | ||
| 2204 | "sha1", | ||
| 2205 | "thiserror 1.0.69", | ||
| 2206 | "utf-8", | ||
| 2207 | ] | ||
| 2208 | |||
| 2209 | [[package]] | ||
| 2210 | name = "typenum" | ||
| 2211 | version = "1.19.0" | ||
| 2212 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2213 | checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" | ||
| 2214 | |||
| 2215 | [[package]] | ||
| 2216 | name = "unicode-ident" | ||
| 2217 | version = "1.0.22" | ||
| 2218 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2219 | checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" | ||
| 2220 | |||
| 2221 | [[package]] | ||
| 2222 | name = "unicode-normalization" | ||
| 2223 | version = "0.1.25" | ||
| 2224 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2225 | checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" | ||
| 2226 | dependencies = [ | ||
| 2227 | "tinyvec", | ||
| 2228 | ] | ||
| 2229 | |||
| 2230 | [[package]] | ||
| 2231 | name = "universal-hash" | ||
| 2232 | version = "0.5.1" | ||
| 2233 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2234 | checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" | ||
| 2235 | dependencies = [ | ||
| 2236 | "crypto-common", | ||
| 2237 | "subtle", | ||
| 2238 | ] | ||
| 2239 | |||
| 2240 | [[package]] | ||
| 2241 | name = "untrusted" | ||
| 2242 | version = "0.9.0" | ||
| 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2244 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" | ||
| 2245 | |||
| 2246 | [[package]] | ||
| 2247 | name = "url" | ||
| 2248 | version = "2.5.7" | ||
| 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2250 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" | ||
| 2251 | dependencies = [ | ||
| 2252 | "form_urlencoded", | ||
| 2253 | "idna", | ||
| 2254 | "percent-encoding", | ||
| 2255 | "serde", | ||
| 2256 | ] | ||
| 2257 | |||
| 2258 | [[package]] | ||
| 2259 | name = "utf-8" | ||
| 2260 | version = "0.7.6" | ||
| 2261 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2262 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" | ||
| 2263 | |||
| 2264 | [[package]] | ||
| 2265 | name = "utf8_iter" | ||
| 2266 | version = "1.0.4" | ||
| 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2268 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" | ||
| 2269 | |||
| 2270 | [[package]] | ||
| 2271 | name = "utf8parse" | ||
| 2272 | version = "0.2.2" | ||
| 2273 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2274 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" | ||
| 2275 | |||
| 2276 | [[package]] | ||
| 2277 | name = "uuid" | ||
| 2278 | version = "1.18.1" | ||
| 2279 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2280 | checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" | ||
| 2281 | dependencies = [ | ||
| 2282 | "getrandom 0.3.4", | ||
| 2283 | "js-sys", | ||
| 2284 | "wasm-bindgen", | ||
| 2285 | ] | ||
| 2286 | |||
| 2287 | [[package]] | ||
| 2288 | name = "valuable" | ||
| 2289 | version = "0.1.1" | ||
| 2290 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2291 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" | ||
| 2292 | |||
| 2293 | [[package]] | ||
| 2294 | name = "version_check" | ||
| 2295 | version = "0.9.5" | ||
| 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2297 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" | ||
| 2298 | |||
| 2299 | [[package]] | ||
| 2300 | name = "want" | ||
| 2301 | version = "0.3.1" | ||
| 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2303 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" | ||
| 2304 | dependencies = [ | ||
| 2305 | "try-lock", | ||
| 2306 | ] | ||
| 2307 | |||
| 2308 | [[package]] | ||
| 2309 | name = "wasi" | ||
| 2310 | version = "0.11.1+wasi-snapshot-preview1" | ||
| 2311 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2312 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" | ||
| 2313 | |||
| 2314 | [[package]] | ||
| 2315 | name = "wasip2" | ||
| 2316 | version = "1.0.1+wasi-0.2.4" | ||
| 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2318 | checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" | ||
| 2319 | dependencies = [ | ||
| 2320 | "wit-bindgen", | ||
| 2321 | ] | ||
| 2322 | |||
| 2323 | [[package]] | ||
| 2324 | name = "wasm-bindgen" | ||
| 2325 | version = "0.2.105" | ||
| 2326 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2327 | checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" | ||
| 2328 | dependencies = [ | ||
| 2329 | "cfg-if", | ||
| 2330 | "once_cell", | ||
| 2331 | "rustversion", | ||
| 2332 | "wasm-bindgen-macro", | ||
| 2333 | "wasm-bindgen-shared", | ||
| 2334 | ] | ||
| 2335 | |||
| 2336 | [[package]] | ||
| 2337 | name = "wasm-bindgen-futures" | ||
| 2338 | version = "0.4.55" | ||
| 2339 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2340 | checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" | ||
| 2341 | dependencies = [ | ||
| 2342 | "cfg-if", | ||
| 2343 | "js-sys", | ||
| 2344 | "once_cell", | ||
| 2345 | "wasm-bindgen", | ||
| 2346 | "web-sys", | ||
| 2347 | ] | ||
| 2348 | |||
| 2349 | [[package]] | ||
| 2350 | name = "wasm-bindgen-macro" | ||
| 2351 | version = "0.2.105" | ||
| 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2353 | checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" | ||
| 2354 | dependencies = [ | ||
| 2355 | "quote", | ||
| 2356 | "wasm-bindgen-macro-support", | ||
| 2357 | ] | ||
| 2358 | |||
| 2359 | [[package]] | ||
| 2360 | name = "wasm-bindgen-macro-support" | ||
| 2361 | version = "0.2.105" | ||
| 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2363 | checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" | ||
| 2364 | dependencies = [ | ||
| 2365 | "bumpalo", | ||
| 2366 | "proc-macro2", | ||
| 2367 | "quote", | ||
| 2368 | "syn", | ||
| 2369 | "wasm-bindgen-shared", | ||
| 2370 | ] | ||
| 2371 | |||
| 2372 | [[package]] | ||
| 2373 | name = "wasm-bindgen-shared" | ||
| 2374 | version = "0.2.105" | ||
| 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2376 | checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" | ||
| 2377 | dependencies = [ | ||
| 2378 | "unicode-ident", | ||
| 2379 | ] | ||
| 2380 | |||
| 2381 | [[package]] | ||
| 2382 | name = "web-sys" | ||
| 2383 | version = "0.3.82" | ||
| 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2385 | checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" | ||
| 2386 | dependencies = [ | ||
| 2387 | "js-sys", | ||
| 2388 | "wasm-bindgen", | ||
| 2389 | ] | ||
| 2390 | |||
| 2391 | [[package]] | ||
| 2392 | name = "web-time" | ||
| 2393 | version = "1.1.0" | ||
| 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2395 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" | ||
| 2396 | dependencies = [ | ||
| 2397 | "js-sys", | ||
| 2398 | "wasm-bindgen", | ||
| 2399 | ] | ||
| 2400 | |||
| 2401 | [[package]] | ||
| 2402 | name = "webpki-roots" | ||
| 2403 | version = "0.26.11" | ||
| 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2405 | checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" | ||
| 2406 | dependencies = [ | ||
| 2407 | "webpki-roots 1.0.4", | ||
| 2408 | ] | ||
| 2409 | |||
| 2410 | [[package]] | ||
| 2411 | name = "webpki-roots" | ||
| 2412 | version = "1.0.4" | ||
| 2413 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2414 | checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" | ||
| 2415 | dependencies = [ | ||
| 2416 | "rustls-pki-types", | ||
| 2417 | ] | ||
| 2418 | |||
| 2419 | [[package]] | ||
| 2420 | name = "windows-core" | ||
| 2421 | version = "0.62.2" | ||
| 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2423 | checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" | ||
| 2424 | dependencies = [ | ||
| 2425 | "windows-implement", | ||
| 2426 | "windows-interface", | ||
| 2427 | "windows-link", | ||
| 2428 | "windows-result", | ||
| 2429 | "windows-strings", | ||
| 2430 | ] | ||
| 2431 | |||
| 2432 | [[package]] | ||
| 2433 | name = "windows-implement" | ||
| 2434 | version = "0.60.2" | ||
| 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2436 | checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" | ||
| 2437 | dependencies = [ | ||
| 2438 | "proc-macro2", | ||
| 2439 | "quote", | ||
| 2440 | "syn", | ||
| 2441 | ] | ||
| 2442 | |||
| 2443 | [[package]] | ||
| 2444 | name = "windows-interface" | ||
| 2445 | version = "0.59.3" | ||
| 2446 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2447 | checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" | ||
| 2448 | dependencies = [ | ||
| 2449 | "proc-macro2", | ||
| 2450 | "quote", | ||
| 2451 | "syn", | ||
| 2452 | ] | ||
| 2453 | |||
| 2454 | [[package]] | ||
| 2455 | name = "windows-link" | ||
| 2456 | version = "0.2.1" | ||
| 2457 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2458 | checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" | ||
| 2459 | |||
| 2460 | [[package]] | ||
| 2461 | name = "windows-result" | ||
| 2462 | version = "0.4.1" | ||
| 2463 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2464 | checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" | ||
| 2465 | dependencies = [ | ||
| 2466 | "windows-link", | ||
| 2467 | ] | ||
| 2468 | |||
| 2469 | [[package]] | ||
| 2470 | name = "windows-strings" | ||
| 2471 | version = "0.5.1" | ||
| 2472 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2473 | checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" | ||
| 2474 | dependencies = [ | ||
| 2475 | "windows-link", | ||
| 2476 | ] | ||
| 2477 | |||
| 2478 | [[package]] | ||
| 2479 | name = "windows-sys" | ||
| 2480 | version = "0.52.0" | ||
| 2481 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2482 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" | ||
| 2483 | dependencies = [ | ||
| 2484 | "windows-targets 0.52.6", | ||
| 2485 | ] | ||
| 2486 | |||
| 2487 | [[package]] | ||
| 2488 | name = "windows-sys" | ||
| 2489 | version = "0.60.2" | ||
| 2490 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2491 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" | ||
| 2492 | dependencies = [ | ||
| 2493 | "windows-targets 0.53.5", | ||
| 2494 | ] | ||
| 2495 | |||
| 2496 | [[package]] | ||
| 2497 | name = "windows-sys" | ||
| 2498 | version = "0.61.2" | ||
| 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2500 | checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" | ||
| 2501 | dependencies = [ | ||
| 2502 | "windows-link", | ||
| 2503 | ] | ||
| 2504 | |||
| 2505 | [[package]] | ||
| 2506 | name = "windows-targets" | ||
| 2507 | version = "0.52.6" | ||
| 2508 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2509 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" | ||
| 2510 | dependencies = [ | ||
| 2511 | "windows_aarch64_gnullvm 0.52.6", | ||
| 2512 | "windows_aarch64_msvc 0.52.6", | ||
| 2513 | "windows_i686_gnu 0.52.6", | ||
| 2514 | "windows_i686_gnullvm 0.52.6", | ||
| 2515 | "windows_i686_msvc 0.52.6", | ||
| 2516 | "windows_x86_64_gnu 0.52.6", | ||
| 2517 | "windows_x86_64_gnullvm 0.52.6", | ||
| 2518 | "windows_x86_64_msvc 0.52.6", | ||
| 2519 | ] | ||
| 2520 | |||
| 2521 | [[package]] | ||
| 2522 | name = "windows-targets" | ||
| 2523 | version = "0.53.5" | ||
| 2524 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2525 | checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" | ||
| 2526 | dependencies = [ | ||
| 2527 | "windows-link", | ||
| 2528 | "windows_aarch64_gnullvm 0.53.1", | ||
| 2529 | "windows_aarch64_msvc 0.53.1", | ||
| 2530 | "windows_i686_gnu 0.53.1", | ||
| 2531 | "windows_i686_gnullvm 0.53.1", | ||
| 2532 | "windows_i686_msvc 0.53.1", | ||
| 2533 | "windows_x86_64_gnu 0.53.1", | ||
| 2534 | "windows_x86_64_gnullvm 0.53.1", | ||
| 2535 | "windows_x86_64_msvc 0.53.1", | ||
| 2536 | ] | ||
| 2537 | |||
| 2538 | [[package]] | ||
| 2539 | name = "windows_aarch64_gnullvm" | ||
| 2540 | version = "0.52.6" | ||
| 2541 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2542 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" | ||
| 2543 | |||
| 2544 | [[package]] | ||
| 2545 | name = "windows_aarch64_gnullvm" | ||
| 2546 | version = "0.53.1" | ||
| 2547 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2548 | checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" | ||
| 2549 | |||
| 2550 | [[package]] | ||
| 2551 | name = "windows_aarch64_msvc" | ||
| 2552 | version = "0.52.6" | ||
| 2553 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2554 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" | ||
| 2555 | |||
| 2556 | [[package]] | ||
| 2557 | name = "windows_aarch64_msvc" | ||
| 2558 | version = "0.53.1" | ||
| 2559 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2560 | checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" | ||
| 2561 | |||
| 2562 | [[package]] | ||
| 2563 | name = "windows_i686_gnu" | ||
| 2564 | version = "0.52.6" | ||
| 2565 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2566 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" | ||
| 2567 | |||
| 2568 | [[package]] | ||
| 2569 | name = "windows_i686_gnu" | ||
| 2570 | version = "0.53.1" | ||
| 2571 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2572 | checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" | ||
| 2573 | |||
| 2574 | [[package]] | ||
| 2575 | name = "windows_i686_gnullvm" | ||
| 2576 | version = "0.52.6" | ||
| 2577 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2578 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" | ||
| 2579 | |||
| 2580 | [[package]] | ||
| 2581 | name = "windows_i686_gnullvm" | ||
| 2582 | version = "0.53.1" | ||
| 2583 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2584 | checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" | ||
| 2585 | |||
| 2586 | [[package]] | ||
| 2587 | name = "windows_i686_msvc" | ||
| 2588 | version = "0.52.6" | ||
| 2589 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2590 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" | ||
| 2591 | |||
| 2592 | [[package]] | ||
| 2593 | name = "windows_i686_msvc" | ||
| 2594 | version = "0.53.1" | ||
| 2595 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2596 | checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" | ||
| 2597 | |||
| 2598 | [[package]] | ||
| 2599 | name = "windows_x86_64_gnu" | ||
| 2600 | version = "0.52.6" | ||
| 2601 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2602 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" | ||
| 2603 | |||
| 2604 | [[package]] | ||
| 2605 | name = "windows_x86_64_gnu" | ||
| 2606 | version = "0.53.1" | ||
| 2607 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2608 | checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" | ||
| 2609 | |||
| 2610 | [[package]] | ||
| 2611 | name = "windows_x86_64_gnullvm" | ||
| 2612 | version = "0.52.6" | ||
| 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2614 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" | ||
| 2615 | |||
| 2616 | [[package]] | ||
| 2617 | name = "windows_x86_64_gnullvm" | ||
| 2618 | version = "0.53.1" | ||
| 2619 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2620 | checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" | ||
| 2621 | |||
| 2622 | [[package]] | ||
| 2623 | name = "windows_x86_64_msvc" | ||
| 2624 | version = "0.52.6" | ||
| 2625 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2626 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" | ||
| 2627 | |||
| 2628 | [[package]] | ||
| 2629 | name = "windows_x86_64_msvc" | ||
| 2630 | version = "0.53.1" | ||
| 2631 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2632 | checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" | ||
| 2633 | |||
| 2634 | [[package]] | ||
| 2635 | name = "wit-bindgen" | ||
| 2636 | version = "0.46.0" | ||
| 2637 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2638 | checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" | ||
| 2639 | |||
| 2640 | [[package]] | ||
| 2641 | name = "writeable" | ||
| 2642 | version = "0.6.2" | ||
| 2643 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2644 | checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" | ||
| 2645 | |||
| 2646 | [[package]] | ||
| 2647 | name = "yoke" | ||
| 2648 | version = "0.8.1" | ||
| 2649 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2650 | checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" | ||
| 2651 | dependencies = [ | ||
| 2652 | "stable_deref_trait", | ||
| 2653 | "yoke-derive", | ||
| 2654 | "zerofrom", | ||
| 2655 | ] | ||
| 2656 | |||
| 2657 | [[package]] | ||
| 2658 | name = "yoke-derive" | ||
| 2659 | version = "0.8.1" | ||
| 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2661 | checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" | ||
| 2662 | dependencies = [ | ||
| 2663 | "proc-macro2", | ||
| 2664 | "quote", | ||
| 2665 | "syn", | ||
| 2666 | "synstructure", | ||
| 2667 | ] | ||
| 2668 | |||
| 2669 | [[package]] | ||
| 2670 | name = "zerocopy" | ||
| 2671 | version = "0.8.27" | ||
| 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2673 | checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" | ||
| 2674 | dependencies = [ | ||
| 2675 | "zerocopy-derive", | ||
| 2676 | ] | ||
| 2677 | |||
| 2678 | [[package]] | ||
| 2679 | name = "zerocopy-derive" | ||
| 2680 | version = "0.8.27" | ||
| 2681 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2682 | checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" | ||
| 2683 | dependencies = [ | ||
| 2684 | "proc-macro2", | ||
| 2685 | "quote", | ||
| 2686 | "syn", | ||
| 2687 | ] | ||
| 2688 | |||
| 2689 | [[package]] | ||
| 2690 | name = "zerofrom" | ||
| 2691 | version = "0.1.6" | ||
| 2692 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2693 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" | ||
| 2694 | dependencies = [ | ||
| 2695 | "zerofrom-derive", | ||
| 2696 | ] | ||
| 2697 | |||
| 2698 | [[package]] | ||
| 2699 | name = "zerofrom-derive" | ||
| 2700 | version = "0.1.6" | ||
| 2701 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2702 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" | ||
| 2703 | dependencies = [ | ||
| 2704 | "proc-macro2", | ||
| 2705 | "quote", | ||
| 2706 | "syn", | ||
| 2707 | "synstructure", | ||
| 2708 | ] | ||
| 2709 | |||
| 2710 | [[package]] | ||
| 2711 | name = "zeroize" | ||
| 2712 | version = "1.8.2" | ||
| 2713 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2714 | checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" | ||
| 2715 | |||
| 2716 | [[package]] | ||
| 2717 | name = "zerotrie" | ||
| 2718 | version = "0.2.3" | ||
| 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2720 | checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" | ||
| 2721 | dependencies = [ | ||
| 2722 | "displaydoc", | ||
| 2723 | "yoke", | ||
| 2724 | "zerofrom", | ||
| 2725 | ] | ||
| 2726 | |||
| 2727 | [[package]] | ||
| 2728 | name = "zerovec" | ||
| 2729 | version = "0.11.5" | ||
| 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2731 | checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" | ||
| 2732 | dependencies = [ | ||
| 2733 | "yoke", | ||
| 2734 | "zerofrom", | ||
| 2735 | "zerovec-derive", | ||
| 2736 | ] | ||
| 2737 | |||
| 2738 | [[package]] | ||
| 2739 | name = "zerovec-derive" | ||
| 2740 | version = "0.11.2" | ||
| 2741 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2742 | checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" | ||
| 2743 | dependencies = [ | ||
| 2744 | "proc-macro2", | ||
| 2745 | "quote", | ||
| 2746 | "syn", | ||
| 2747 | ] | ||
diff --git a/grasp-audit/Cargo.toml b/grasp-audit/Cargo.toml new file mode 100644 index 0000000..25e02f6 --- /dev/null +++ b/grasp-audit/Cargo.toml | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | [package] | ||
| 2 | name = "grasp-audit" | ||
| 3 | version = "0.1.0" | ||
| 4 | edition = "2021" | ||
| 5 | rust-version = "1.75" | ||
| 6 | description = "Audit and compliance testing tool for GRASP protocol implementations" | ||
| 7 | license = "MIT" | ||
| 8 | |||
| 9 | [[bin]] | ||
| 10 | name = "grasp-audit" | ||
| 11 | path = "src/bin/grasp-audit.rs" | ||
| 12 | |||
| 13 | [dependencies] | ||
| 14 | # Nostr | ||
| 15 | nostr-sdk = "0.35" | ||
| 16 | |||
| 17 | # Async | ||
| 18 | tokio = { version = "1", features = ["full"] } | ||
| 19 | futures = "0.3" | ||
| 20 | |||
| 21 | # Serialization | ||
| 22 | serde = { version = "1", features = ["derive"] } | ||
| 23 | serde_json = "1" | ||
| 24 | |||
| 25 | # Error handling | ||
| 26 | anyhow = "1" | ||
| 27 | thiserror = "1" | ||
| 28 | |||
| 29 | # CLI | ||
| 30 | clap = { version = "4", features = ["derive"] } | ||
| 31 | |||
| 32 | # Utilities | ||
| 33 | uuid = { version = "1", features = ["v4"] } | ||
| 34 | chrono = "0.4" | ||
| 35 | |||
| 36 | # Logging | ||
| 37 | tracing = "0.1" | ||
| 38 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } | ||
| 39 | |||
| 40 | [dev-dependencies] | ||
| 41 | tokio-test = "0.4" | ||
diff --git a/grasp-audit/QUICK_START.md b/grasp-audit/QUICK_START.md new file mode 100644 index 0000000..47e848e --- /dev/null +++ b/grasp-audit/QUICK_START.md | |||
| @@ -0,0 +1,222 @@ | |||
| 1 | # GRASP Audit - Quick Start Guide | ||
| 2 | |||
| 3 | ## Prerequisites | ||
| 4 | |||
| 5 | - Rust 1.75 or later | ||
| 6 | - C compiler (gcc or clang) | ||
| 7 | - A Nostr relay for testing (optional for unit tests) | ||
| 8 | |||
| 9 | ## Setup on NixOS | ||
| 10 | |||
| 11 | ```bash | ||
| 12 | # Enter development shell | ||
| 13 | cd grasp-audit | ||
| 14 | nix-shell | ||
| 15 | |||
| 16 | # Build the project | ||
| 17 | cargo build | ||
| 18 | |||
| 19 | # Run unit tests (no relay needed) | ||
| 20 | cargo test --lib | ||
| 21 | ``` | ||
| 22 | |||
| 23 | ## Setup on Other Systems | ||
| 24 | |||
| 25 | ```bash | ||
| 26 | cd grasp-audit | ||
| 27 | |||
| 28 | # Install Rust (if needed) | ||
| 29 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh | ||
| 30 | |||
| 31 | # Build | ||
| 32 | cargo build | ||
| 33 | |||
| 34 | # Run unit tests | ||
| 35 | cargo test --lib | ||
| 36 | ``` | ||
| 37 | |||
| 38 | ## Running Smoke Tests (Requires Relay) | ||
| 39 | |||
| 40 | ### Option 1: Use a Public Relay | ||
| 41 | |||
| 42 | ```bash | ||
| 43 | # Run against a public relay | ||
| 44 | cargo run --example simple_audit | ||
| 45 | # Edit the example to use: wss://relay.damus.io or similar | ||
| 46 | ``` | ||
| 47 | |||
| 48 | ### Option 2: Run Local Relay | ||
| 49 | |||
| 50 | ```bash | ||
| 51 | # Terminal 1: Start a test relay | ||
| 52 | # Option A: Using nostr-relay-builder | ||
| 53 | git clone https://github.com/rust-nostr/nostr | ||
| 54 | cd nostr/crates/nostr-relay-builder | ||
| 55 | cargo run --example basic | ||
| 56 | |||
| 57 | # Option B: Using docker | ||
| 58 | docker run -p 7000:7000 scsibug/nostr-rs-relay | ||
| 59 | |||
| 60 | # Terminal 2: Run smoke tests | ||
| 61 | cd grasp-audit | ||
| 62 | cargo run --example simple_audit | ||
| 63 | ``` | ||
| 64 | |||
| 65 | ### Option 3: Use the CLI | ||
| 66 | |||
| 67 | ```bash | ||
| 68 | # Build the CLI | ||
| 69 | cargo build --release | ||
| 70 | |||
| 71 | # Run smoke tests | ||
| 72 | ./target/release/grasp-audit audit \ | ||
| 73 | --relay ws://localhost:7000 \ | ||
| 74 | --mode ci \ | ||
| 75 | --spec nip01-smoke | ||
| 76 | ``` | ||
| 77 | |||
| 78 | ## Running Tests | ||
| 79 | |||
| 80 | ```bash | ||
| 81 | # Unit tests only (no relay needed) | ||
| 82 | cargo test --lib | ||
| 83 | |||
| 84 | # Integration tests (needs relay at ws://localhost:7000) | ||
| 85 | cargo test --ignored | ||
| 86 | |||
| 87 | # All tests | ||
| 88 | cargo test --all | ||
| 89 | |||
| 90 | # With output | ||
| 91 | cargo test -- --nocapture | ||
| 92 | ``` | ||
| 93 | |||
| 94 | ## Using as a Library | ||
| 95 | |||
| 96 | Add to your `Cargo.toml`: | ||
| 97 | |||
| 98 | ```toml | ||
| 99 | [dependencies] | ||
| 100 | grasp-audit = { path = "../grasp-audit" } | ||
| 101 | ``` | ||
| 102 | |||
| 103 | Example code: | ||
| 104 | |||
| 105 | ```rust | ||
| 106 | use grasp_audit::*; | ||
| 107 | |||
| 108 | #[tokio::main] | ||
| 109 | async fn main() -> Result<()> { | ||
| 110 | // Create audit client | ||
| 111 | let config = AuditConfig::ci(); | ||
| 112 | let client = AuditClient::new("ws://localhost:7000", config).await?; | ||
| 113 | |||
| 114 | // Run smoke tests | ||
| 115 | let results = specs::Nip01SmokeTests::run_all(&client).await; | ||
| 116 | |||
| 117 | // Print results | ||
| 118 | results.print_report(); | ||
| 119 | |||
| 120 | // Check if passed | ||
| 121 | if !results.all_passed() { | ||
| 122 | eprintln!("Some tests failed!"); | ||
| 123 | std::process::exit(1); | ||
| 124 | } | ||
| 125 | |||
| 126 | Ok(()) | ||
| 127 | } | ||
| 128 | ``` | ||
| 129 | |||
| 130 | ## Troubleshooting | ||
| 131 | |||
| 132 | ### Build Errors | ||
| 133 | |||
| 134 | **Error:** `linker 'cc' not found` | ||
| 135 | |||
| 136 | **Solution (NixOS):** | ||
| 137 | ```bash | ||
| 138 | nix-shell # Use the provided shell.nix | ||
| 139 | ``` | ||
| 140 | |||
| 141 | **Solution (Other Linux):** | ||
| 142 | ```bash | ||
| 143 | sudo apt-get install build-essential # Debian/Ubuntu | ||
| 144 | sudo yum install gcc # RedHat/CentOS | ||
| 145 | ``` | ||
| 146 | |||
| 147 | **Solution (macOS):** | ||
| 148 | ```bash | ||
| 149 | xcode-select --install | ||
| 150 | ``` | ||
| 151 | |||
| 152 | ### Connection Errors | ||
| 153 | |||
| 154 | **Error:** `Failed to connect to relay` | ||
| 155 | |||
| 156 | **Solutions:** | ||
| 157 | 1. Make sure a relay is running at the specified URL | ||
| 158 | 2. Check firewall settings | ||
| 159 | 3. Try a different relay URL | ||
| 160 | 4. Use `ws://` for local, `wss://` for remote | ||
| 161 | |||
| 162 | ### Test Failures | ||
| 163 | |||
| 164 | **Error:** Tests fail with timeout | ||
| 165 | |||
| 166 | **Solutions:** | ||
| 167 | 1. Increase timeout in test code | ||
| 168 | 2. Check relay is responding (try with `websocat`) | ||
| 169 | 3. Check network connectivity | ||
| 170 | |||
| 171 | ## Examples | ||
| 172 | |||
| 173 | ### CI Mode (Isolated Testing) | ||
| 174 | |||
| 175 | ```bash | ||
| 176 | # Each run is isolated with unique ID | ||
| 177 | ./target/release/grasp-audit audit \ | ||
| 178 | --relay ws://localhost:7000 \ | ||
| 179 | --mode ci \ | ||
| 180 | --spec nip01-smoke | ||
| 181 | |||
| 182 | # Run ID: ci-a1b2c3d4-e5f6-7890-abcd-ef1234567890 | ||
| 183 | # Tests only see events from this run | ||
| 184 | ``` | ||
| 185 | |||
| 186 | ### Production Mode (Audit Live Service) | ||
| 187 | |||
| 188 | ```bash | ||
| 189 | # Read-only audit of production relay | ||
| 190 | ./target/release/grasp-audit audit \ | ||
| 191 | --relay wss://relay.example.com \ | ||
| 192 | --mode production \ | ||
| 193 | --spec nip01-smoke | ||
| 194 | |||
| 195 | # Run ID: prod-audit-1699027200 | ||
| 196 | # Tests see all events (including real ones) | ||
| 197 | # Minimal writes (read-only by default) | ||
| 198 | ``` | ||
| 199 | |||
| 200 | ## What's Next? | ||
| 201 | |||
| 202 | 1. ✅ Run unit tests | ||
| 203 | 2. ✅ Run smoke tests against a relay | ||
| 204 | 3. ✅ Check the report output | ||
| 205 | 4. 🚧 Implement GRASP-01 compliance tests | ||
| 206 | 5. 🚧 Set up CI/CD integration | ||
| 207 | 6. 🚧 Test against ngit-grasp relay | ||
| 208 | |||
| 209 | ## Resources | ||
| 210 | |||
| 211 | - **README.md** - Full documentation | ||
| 212 | - **SMOKE_TEST_REPORT.md** - Implementation details | ||
| 213 | - **examples/simple_audit.rs** - Example usage | ||
| 214 | - **GRASP_AUDIT_PLAN.md** - Original plan | ||
| 215 | |||
| 216 | ## Support | ||
| 217 | |||
| 218 | For issues or questions: | ||
| 219 | 1. Check the documentation in this directory | ||
| 220 | 2. Review the examples | ||
| 221 | 3. Check the test code for usage patterns | ||
| 222 | 4. Open an issue on the project repository | ||
diff --git a/grasp-audit/README.md b/grasp-audit/README.md new file mode 100644 index 0000000..558e201 --- /dev/null +++ b/grasp-audit/README.md | |||
| @@ -0,0 +1,167 @@ | |||
| 1 | # GRASP Audit | ||
| 2 | |||
| 3 | A reusable audit and compliance testing tool for GRASP protocol implementations. | ||
| 4 | |||
| 5 | ## Features | ||
| 6 | |||
| 7 | - ✅ **Isolated Testing**: Tests run in parallel with unique audit IDs | ||
| 8 | - ✅ **Production Audit**: Test live services with minimal impact | ||
| 9 | - ✅ **Clean Audit Events**: Special tags for easy cleanup (no deletion trails) | ||
| 10 | - ✅ **Spec-Mirrored Tests**: Test structure matches GRASP protocol exactly | ||
| 11 | - ✅ **Reusable**: Can test any GRASP implementation (Rust, Go, Python, etc.) | ||
| 12 | |||
| 13 | ## Quick Start | ||
| 14 | |||
| 15 | ### As a Library | ||
| 16 | |||
| 17 | ```rust | ||
| 18 | use grasp_audit::*; | ||
| 19 | |||
| 20 | #[tokio::main] | ||
| 21 | async fn main() -> Result<()> { | ||
| 22 | // Create audit client for CI testing | ||
| 23 | let config = AuditConfig::ci(); | ||
| 24 | let client = AuditClient::new("ws://localhost:7000", config).await?; | ||
| 25 | |||
| 26 | // Run NIP-01 smoke tests | ||
| 27 | let results = specs::Nip01SmokeTests::run_all(&client).await; | ||
| 28 | results.print_report(); | ||
| 29 | |||
| 30 | if !results.all_passed() { | ||
| 31 | std::process::exit(1); | ||
| 32 | } | ||
| 33 | |||
| 34 | Ok(()) | ||
| 35 | } | ||
| 36 | ``` | ||
| 37 | |||
| 38 | ### As a CLI Tool | ||
| 39 | |||
| 40 | ```bash | ||
| 41 | # Install | ||
| 42 | cargo install --path . | ||
| 43 | |||
| 44 | # Run smoke tests against local relay | ||
| 45 | grasp-audit audit --relay ws://localhost:7000 --mode ci --spec nip01-smoke | ||
| 46 | |||
| 47 | # Audit production server (read-only) | ||
| 48 | grasp-audit audit --relay wss://relay.example.com --mode production --spec all | ||
| 49 | ``` | ||
| 50 | |||
| 51 | ## Test Specifications | ||
| 52 | |||
| 53 | ### NIP-01 Smoke Tests (6 tests) | ||
| 54 | |||
| 55 | Basic Nostr relay functionality: | ||
| 56 | |||
| 57 | 1. `websocket_connection` - Can connect to / | ||
| 58 | 2. `send_receive_event` - Can send EVENT, get OK | ||
| 59 | 3. `create_subscription` - Can subscribe with REQ | ||
| 60 | 4. `close_subscription` - Can close subscriptions | ||
| 61 | 5. `reject_invalid_signature` - Rejects bad signatures | ||
| 62 | 6. `reject_invalid_event_id` - Rejects wrong IDs | ||
| 63 | |||
| 64 | **Why only smoke tests?** rust-nostr already has 1000+ tests for NIP-01 compliance. We focus on GRASP-specific behavior. | ||
| 65 | |||
| 66 | ### GRASP-01 Tests (Coming Soon) | ||
| 67 | |||
| 68 | - Repository announcement acceptance | ||
| 69 | - State event handling | ||
| 70 | - Policy enforcement | ||
| 71 | - And more... | ||
| 72 | |||
| 73 | ## Audit Event Strategy | ||
| 74 | |||
| 75 | All audit events include special tags: | ||
| 76 | |||
| 77 | ```json | ||
| 78 | { | ||
| 79 | "tags": [ | ||
| 80 | ["grasp-audit", "true"], | ||
| 81 | ["audit-run-id", "ci-a1b2c3d4-e5f6-7890-abcd-ef1234567890"], | ||
| 82 | ["audit-cleanup", "2025-11-03T12:00:00Z"] | ||
| 83 | ] | ||
| 84 | } | ||
| 85 | ``` | ||
| 86 | |||
| 87 | This allows: | ||
| 88 | - **Isolation**: Each test run has unique ID | ||
| 89 | - **Cleanup**: Events marked for cleanup after timestamp | ||
| 90 | - **No deletion trails**: Direct database cleanup (no NIP-09 deletion events) | ||
| 91 | |||
| 92 | ## Modes | ||
| 93 | |||
| 94 | ### CI Mode (Default) | ||
| 95 | |||
| 96 | - Tests are isolated by unique run ID | ||
| 97 | - Tests only see their own events | ||
| 98 | - Full read/write access | ||
| 99 | - Cleanup after 1 hour | ||
| 100 | |||
| 101 | ```rust | ||
| 102 | let config = AuditConfig::ci(); | ||
| 103 | ``` | ||
| 104 | |||
| 105 | ### Production Mode | ||
| 106 | |||
| 107 | - Tests see all events (including real ones) | ||
| 108 | - Read-only by default (minimal impact) | ||
| 109 | - Cleanup after 5 minutes | ||
| 110 | |||
| 111 | ```rust | ||
| 112 | let config = AuditConfig::production(); | ||
| 113 | ``` | ||
| 114 | |||
| 115 | ## Examples | ||
| 116 | |||
| 117 | See `examples/` directory: | ||
| 118 | |||
| 119 | ```bash | ||
| 120 | # Simple audit example | ||
| 121 | cargo run --example simple_audit | ||
| 122 | ``` | ||
| 123 | |||
| 124 | ## Testing | ||
| 125 | |||
| 126 | ```bash | ||
| 127 | # Run unit tests | ||
| 128 | cargo test | ||
| 129 | |||
| 130 | # Run integration tests (requires running relay) | ||
| 131 | cargo test --ignored | ||
| 132 | ``` | ||
| 133 | |||
| 134 | ## Architecture | ||
| 135 | |||
| 136 | ``` | ||
| 137 | grasp-audit/ | ||
| 138 | ├── src/ | ||
| 139 | │ ├── lib.rs # Public API | ||
| 140 | │ ├── audit.rs # Audit config and event tagging | ||
| 141 | │ ├── client.rs # Audit client | ||
| 142 | │ ├── result.rs # Test result types | ||
| 143 | │ ├── isolation.rs # Test isolation utilities | ||
| 144 | │ └── specs/ | ||
| 145 | │ ├── mod.rs | ||
| 146 | │ └── nip01_smoke.rs # NIP-01 smoke tests | ||
| 147 | ├── examples/ | ||
| 148 | │ └── simple_audit.rs # Example usage | ||
| 149 | └── bin/ | ||
| 150 | └── grasp-audit.rs # CLI tool | ||
| 151 | ``` | ||
| 152 | |||
| 153 | ## Development Status | ||
| 154 | |||
| 155 | - ✅ Audit framework | ||
| 156 | - ✅ NIP-01 smoke tests (6 tests) | ||
| 157 | - 🚧 GRASP-01 relay tests (planned) | ||
| 158 | - 🚧 GRASP-01 git tests (planned) | ||
| 159 | - 🚧 Cleanup utilities (planned) | ||
| 160 | |||
| 161 | ## Contributing | ||
| 162 | |||
| 163 | This tool is designed to be reusable by any GRASP implementation. Contributions welcome! | ||
| 164 | |||
| 165 | ## License | ||
| 166 | |||
| 167 | MIT | ||
diff --git a/grasp-audit/examples/simple_audit.rs b/grasp-audit/examples/simple_audit.rs new file mode 100644 index 0000000..411477c --- /dev/null +++ b/grasp-audit/examples/simple_audit.rs | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | //! Simple audit example | ||
| 2 | //! | ||
| 3 | //! Run with: cargo run --example simple_audit | ||
| 4 | |||
| 5 | use grasp_audit::*; | ||
| 6 | |||
| 7 | #[tokio::main] | ||
| 8 | async fn main() -> Result<()> { | ||
| 9 | // Create audit config for CI testing | ||
| 10 | let config = AuditConfig::ci(); | ||
| 11 | |||
| 12 | println!("GRASP Audit Example"); | ||
| 13 | println!("=================="); | ||
| 14 | println!("Audit Run ID: {}", config.run_id); | ||
| 15 | println!(); | ||
| 16 | |||
| 17 | // Connect to relay | ||
| 18 | println!("Connecting to relay at ws://localhost:7000..."); | ||
| 19 | let client = match AuditClient::new("ws://localhost:7000", config).await { | ||
| 20 | Ok(c) => c, | ||
| 21 | Err(e) => { | ||
| 22 | eprintln!("Failed to connect: {}", e); | ||
| 23 | eprintln!(); | ||
| 24 | eprintln!("Make sure a Nostr relay is running at ws://localhost:7000"); | ||
| 25 | eprintln!("You can use: https://github.com/rust-nostr/nostr/tree/master/crates/nostr-relay-builder"); | ||
| 26 | return Err(e); | ||
| 27 | } | ||
| 28 | }; | ||
| 29 | |||
| 30 | if !client.is_connected().await { | ||
| 31 | eprintln!("Not connected to relay"); | ||
| 32 | return Err(anyhow!("Connection failed")); | ||
| 33 | } | ||
| 34 | |||
| 35 | println!("✓ Connected"); | ||
| 36 | println!(); | ||
| 37 | |||
| 38 | // Run NIP-01 smoke tests | ||
| 39 | println!("Running NIP-01 smoke tests..."); | ||
| 40 | println!(); | ||
| 41 | |||
| 42 | let results = specs::Nip01SmokeTests::run_all(&client).await; | ||
| 43 | |||
| 44 | // Print results | ||
| 45 | results.print_report(); | ||
| 46 | |||
| 47 | // Exit with error if tests failed | ||
| 48 | if !results.all_passed() { | ||
| 49 | std::process::exit(1); | ||
| 50 | } | ||
| 51 | |||
| 52 | Ok(()) | ||
| 53 | } | ||
diff --git a/grasp-audit/shell.nix b/grasp-audit/shell.nix new file mode 100644 index 0000000..54bb3b8 --- /dev/null +++ b/grasp-audit/shell.nix | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | { pkgs ? import <nixpkgs> {} }: | ||
| 2 | |||
| 3 | pkgs.mkShell { | ||
| 4 | buildInputs = with pkgs; [ | ||
| 5 | # Rust toolchain | ||
| 6 | rustc | ||
| 7 | cargo | ||
| 8 | rustfmt | ||
| 9 | clippy | ||
| 10 | |||
| 11 | # Build dependencies | ||
| 12 | gcc | ||
| 13 | pkg-config | ||
| 14 | |||
| 15 | # Libraries | ||
| 16 | openssl | ||
| 17 | |||
| 18 | # Development tools | ||
| 19 | git | ||
| 20 | ]; | ||
| 21 | |||
| 22 | # Environment variables | ||
| 23 | RUST_BACKTRACE = "1"; | ||
| 24 | RUST_LOG = "info"; | ||
| 25 | |||
| 26 | shellHook = '' | ||
| 27 | echo "🦀 Rust development environment loaded" | ||
| 28 | echo "" | ||
| 29 | echo "Available commands:" | ||
| 30 | echo " cargo build - Build the project" | ||
| 31 | echo " cargo test - Run unit tests" | ||
| 32 | echo " cargo test --ignored - Run integration tests (needs relay)" | ||
| 33 | echo " cargo run --example simple_audit - Run example" | ||
| 34 | echo "" | ||
| 35 | echo "Rust version: $(rustc --version)" | ||
| 36 | echo "Cargo version: $(cargo --version)" | ||
| 37 | ''; | ||
| 38 | } | ||
diff --git a/grasp-audit/src/audit.rs b/grasp-audit/src/audit.rs new file mode 100644 index 0000000..0ca8737 --- /dev/null +++ b/grasp-audit/src/audit.rs | |||
| @@ -0,0 +1,188 @@ | |||
| 1 | //! Audit configuration and event tagging | ||
| 2 | |||
| 3 | use nostr_sdk::prelude::*; | ||
| 4 | use std::time::Duration; | ||
| 5 | |||
| 6 | /// Audit configuration | ||
| 7 | #[derive(Debug, Clone)] | ||
| 8 | pub struct AuditConfig { | ||
| 9 | /// Unique ID for this audit run | ||
| 10 | pub run_id: String, | ||
| 11 | |||
| 12 | /// Mode: CI (isolated) or Production (live) | ||
| 13 | pub mode: AuditMode, | ||
| 14 | |||
| 15 | /// Cleanup timestamp (events can be cleaned after this) | ||
| 16 | pub cleanup_after: Timestamp, | ||
| 17 | |||
| 18 | /// Whether to actually create events or just query | ||
| 19 | pub read_only: bool, | ||
| 20 | } | ||
| 21 | |||
| 22 | /// Audit mode | ||
| 23 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | ||
| 24 | pub enum AuditMode { | ||
| 25 | /// Isolated CI/CD tests - only see own events | ||
| 26 | CI, | ||
| 27 | |||
| 28 | /// Production audit - see all events, minimal writes | ||
| 29 | Production, | ||
| 30 | } | ||
| 31 | |||
| 32 | impl AuditConfig { | ||
| 33 | /// Create config for CI/CD testing | ||
| 34 | pub fn ci() -> Self { | ||
| 35 | let run_id = format!("ci-{}", uuid::Uuid::new_v4()); | ||
| 36 | Self { | ||
| 37 | run_id, | ||
| 38 | mode: AuditMode::CI, | ||
| 39 | cleanup_after: Timestamp::now() + 3600, // 1 hour from now | ||
| 40 | read_only: false, | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | /// Create config for production audit | ||
| 45 | pub fn production() -> Self { | ||
| 46 | let run_id = format!("prod-audit-{}", Timestamp::now().as_u64()); | ||
| 47 | Self { | ||
| 48 | run_id, | ||
| 49 | mode: AuditMode::Production, | ||
| 50 | cleanup_after: Timestamp::now() + 300, // 5 minutes from now | ||
| 51 | read_only: true, // Default to read-only for production | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | /// Create config with custom run ID | ||
| 56 | pub fn with_run_id(run_id: String, mode: AuditMode) -> Self { | ||
| 57 | Self { | ||
| 58 | run_id, | ||
| 59 | mode, | ||
| 60 | cleanup_after: Timestamp::now() + 3600, | ||
| 61 | read_only: mode == AuditMode::Production, | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | /// Get audit tags for an event | ||
| 66 | pub fn audit_tags(&self) -> Vec<Tag> { | ||
| 67 | vec![ | ||
| 68 | Tag::custom( | ||
| 69 | TagKind::Custom(std::borrow::Cow::Borrowed("grasp-audit")), | ||
| 70 | vec!["true"] | ||
| 71 | ), | ||
| 72 | Tag::custom( | ||
| 73 | TagKind::Custom(std::borrow::Cow::Borrowed("audit-run-id")), | ||
| 74 | vec![self.run_id.clone()] | ||
| 75 | ), | ||
| 76 | Tag::custom( | ||
| 77 | TagKind::Custom(std::borrow::Cow::Borrowed("audit-cleanup")), | ||
| 78 | vec![self.cleanup_after.to_string()] | ||
| 79 | ), | ||
| 80 | ] | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | /// Builder for audit events | ||
| 85 | pub struct AuditEventBuilder { | ||
| 86 | kind: Kind, | ||
| 87 | content: String, | ||
| 88 | tags: Vec<Tag>, | ||
| 89 | config: AuditConfig, | ||
| 90 | } | ||
| 91 | |||
| 92 | impl AuditEventBuilder { | ||
| 93 | /// Create a new audit event builder | ||
| 94 | pub fn new(kind: Kind, content: impl Into<String>, config: AuditConfig) -> Self { | ||
| 95 | Self { | ||
| 96 | kind, | ||
| 97 | content: content.into(), | ||
| 98 | tags: Vec::new(), | ||
| 99 | config, | ||
| 100 | } | ||
| 101 | } | ||
| 102 | |||
| 103 | /// Add a tag | ||
| 104 | pub fn tag(mut self, tag: Tag) -> Self { | ||
| 105 | self.tags.push(tag); | ||
| 106 | self | ||
| 107 | } | ||
| 108 | |||
| 109 | /// Add multiple tags | ||
| 110 | pub fn tags(mut self, tags: Vec<Tag>) -> Self { | ||
| 111 | self.tags.extend(tags); | ||
| 112 | self | ||
| 113 | } | ||
| 114 | |||
| 115 | /// Build the event with audit tags | ||
| 116 | pub async fn build(self, keys: &Keys) -> anyhow::Result<Event> { | ||
| 117 | let mut all_tags = self.tags; | ||
| 118 | all_tags.extend(self.config.audit_tags()); | ||
| 119 | |||
| 120 | let event = EventBuilder::new(self.kind, self.content, all_tags) | ||
| 121 | .to_event(keys) | ||
| 122 | .await?; | ||
| 123 | |||
| 124 | Ok(event) | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 128 | #[cfg(test)] | ||
| 129 | mod tests { | ||
| 130 | use super::*; | ||
| 131 | |||
| 132 | #[test] | ||
| 133 | fn test_ci_config() { | ||
| 134 | let config = AuditConfig::ci(); | ||
| 135 | assert_eq!(config.mode, AuditMode::CI); | ||
| 136 | assert!(!config.read_only); | ||
| 137 | assert!(config.run_id.starts_with("ci-")); | ||
| 138 | } | ||
| 139 | |||
| 140 | #[test] | ||
| 141 | fn test_production_config() { | ||
| 142 | let config = AuditConfig::production(); | ||
| 143 | assert_eq!(config.mode, AuditMode::Production); | ||
| 144 | assert!(config.read_only); | ||
| 145 | assert!(config.run_id.starts_with("prod-audit-")); | ||
| 146 | } | ||
| 147 | |||
| 148 | #[test] | ||
| 149 | fn test_audit_tags() { | ||
| 150 | let config = AuditConfig::ci(); | ||
| 151 | let tags = config.audit_tags(); | ||
| 152 | |||
| 153 | assert_eq!(tags.len(), 3); | ||
| 154 | |||
| 155 | // Check grasp-audit tag | ||
| 156 | assert!(tags.iter().any(|t| { | ||
| 157 | matches!(t.kind(), TagKind::Custom(k) if k == "grasp-audit") | ||
| 158 | })); | ||
| 159 | |||
| 160 | // Check audit-run-id tag | ||
| 161 | assert!(tags.iter().any(|t| { | ||
| 162 | matches!(t.kind(), TagKind::Custom(k) if k == "audit-run-id") | ||
| 163 | })); | ||
| 164 | |||
| 165 | // Check audit-cleanup tag | ||
| 166 | assert!(tags.iter().any(|t| { | ||
| 167 | matches!(t.kind(), TagKind::Custom(k) if k == "audit-cleanup") | ||
| 168 | })); | ||
| 169 | } | ||
| 170 | |||
| 171 | #[tokio::test] | ||
| 172 | async fn test_audit_event_builder() { | ||
| 173 | let config = AuditConfig::ci(); | ||
| 174 | let keys = Keys::generate(); | ||
| 175 | |||
| 176 | let event = AuditEventBuilder::new(Kind::TextNote, "test", config.clone()) | ||
| 177 | .tag(Tag::custom(TagKind::Custom("test".into()), vec!["value"])) | ||
| 178 | .build(&keys) | ||
| 179 | .await | ||
| 180 | .unwrap(); | ||
| 181 | |||
| 182 | // Should have our custom tag + 3 audit tags | ||
| 183 | assert!(event.tags.len() >= 4); | ||
| 184 | |||
| 185 | // Verify event is valid | ||
| 186 | assert!(event.verify().is_ok()); | ||
| 187 | } | ||
| 188 | } | ||
diff --git a/grasp-audit/src/bin/grasp-audit.rs b/grasp-audit/src/bin/grasp-audit.rs new file mode 100644 index 0000000..6c063db --- /dev/null +++ b/grasp-audit/src/bin/grasp-audit.rs | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | //! GRASP Audit CLI Tool | ||
| 2 | |||
| 3 | use clap::{Parser, Subcommand}; | ||
| 4 | use grasp_audit::*; | ||
| 5 | |||
| 6 | #[derive(Parser)] | ||
| 7 | #[command(name = "grasp-audit")] | ||
| 8 | #[command(about = "GRASP audit and compliance testing tool", long_about = None)] | ||
| 9 | struct Cli { | ||
| 10 | #[command(subcommand)] | ||
| 11 | command: Commands, | ||
| 12 | } | ||
| 13 | |||
| 14 | #[derive(Subcommand)] | ||
| 15 | enum Commands { | ||
| 16 | /// Run audit tests against a server | ||
| 17 | Audit { | ||
| 18 | /// Relay URL (e.g., ws://localhost:7000) | ||
| 19 | #[arg(short, long)] | ||
| 20 | relay: String, | ||
| 21 | |||
| 22 | /// Mode: ci or production | ||
| 23 | #[arg(short, long, default_value = "ci")] | ||
| 24 | mode: String, | ||
| 25 | |||
| 26 | /// Spec to test (nip01-smoke, all) | ||
| 27 | #[arg(short, long, default_value = "nip01-smoke")] | ||
| 28 | spec: String, | ||
| 29 | }, | ||
| 30 | } | ||
| 31 | |||
| 32 | #[tokio::main] | ||
| 33 | async fn main() -> Result<()> { | ||
| 34 | // Initialize logging | ||
| 35 | tracing_subscriber::fmt() | ||
| 36 | .with_env_filter( | ||
| 37 | tracing_subscriber::EnvFilter::from_default_env() | ||
| 38 | .add_directive(tracing::Level::INFO.into()) | ||
| 39 | ) | ||
| 40 | .init(); | ||
| 41 | |||
| 42 | let cli = Cli::parse(); | ||
| 43 | |||
| 44 | match cli.command { | ||
| 45 | Commands::Audit { relay, mode, spec } => { | ||
| 46 | let config = match mode.as_str() { | ||
| 47 | "ci" => AuditConfig::ci(), | ||
| 48 | "production" => AuditConfig::production(), | ||
| 49 | _ => return Err(anyhow!("Invalid mode: {}. Use 'ci' or 'production'", mode)), | ||
| 50 | }; | ||
| 51 | |||
| 52 | println!("🔍 GRASP Audit Tool"); | ||
| 53 | println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); | ||
| 54 | println!("Relay: {}", relay); | ||
| 55 | println!("Mode: {}", mode); | ||
| 56 | println!("Spec: {}", spec); | ||
| 57 | println!("Run ID: {}", config.run_id); | ||
| 58 | println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); | ||
| 59 | println!(); | ||
| 60 | |||
| 61 | println!("Connecting to relay..."); | ||
| 62 | let client = AuditClient::new(&relay, config).await | ||
| 63 | .map_err(|e| anyhow!("Failed to connect to relay: {}", e))?; | ||
| 64 | |||
| 65 | if !client.is_connected().await { | ||
| 66 | return Err(anyhow!("Could not establish connection to relay")); | ||
| 67 | } | ||
| 68 | |||
| 69 | println!("✓ Connected\n"); | ||
| 70 | |||
| 71 | let results = match spec.as_str() { | ||
| 72 | "nip01-smoke" => { | ||
| 73 | println!("Running NIP-01 smoke tests...\n"); | ||
| 74 | specs::Nip01SmokeTests::run_all(&client).await | ||
| 75 | } | ||
| 76 | "all" => { | ||
| 77 | println!("Running all tests...\n"); | ||
| 78 | specs::Nip01SmokeTests::run_all(&client).await | ||
| 79 | } | ||
| 80 | _ => return Err(anyhow!("Unknown spec: {}. Use 'nip01-smoke' or 'all'", spec)), | ||
| 81 | }; | ||
| 82 | |||
| 83 | results.print_report(); | ||
| 84 | |||
| 85 | if !results.all_passed() { | ||
| 86 | println!("❌ Some tests failed"); | ||
| 87 | std::process::exit(1); | ||
| 88 | } else { | ||
| 89 | println!("✅ All tests passed!"); | ||
| 90 | } | ||
| 91 | } | ||
| 92 | } | ||
| 93 | |||
| 94 | Ok(()) | ||
| 95 | } | ||
diff --git a/grasp-audit/src/client.rs b/grasp-audit/src/client.rs new file mode 100644 index 0000000..934aef2 --- /dev/null +++ b/grasp-audit/src/client.rs | |||
| @@ -0,0 +1,146 @@ | |||
| 1 | //! Audit client for testing GRASP implementations | ||
| 2 | |||
| 3 | use crate::audit::{AuditConfig, AuditEventBuilder, AuditMode}; | ||
| 4 | use anyhow::{anyhow, Result}; | ||
| 5 | use nostr_sdk::prelude::*; | ||
| 6 | use std::time::Duration; | ||
| 7 | |||
| 8 | /// Client for auditing GRASP implementations | ||
| 9 | pub struct AuditClient { | ||
| 10 | client: Client, | ||
| 11 | pub config: AuditConfig, | ||
| 12 | keys: Keys, | ||
| 13 | } | ||
| 14 | |||
| 15 | impl AuditClient { | ||
| 16 | /// Create a new audit client | ||
| 17 | pub async fn new(relay_url: &str, config: AuditConfig) -> Result<Self> { | ||
| 18 | let keys = Keys::generate(); | ||
| 19 | let client = Client::new(&keys); | ||
| 20 | |||
| 21 | client.add_relay(relay_url).await?; | ||
| 22 | client.connect().await; | ||
| 23 | |||
| 24 | // Wait a bit for connection to establish | ||
| 25 | tokio::time::sleep(Duration::from_millis(500)).await; | ||
| 26 | |||
| 27 | Ok(Self { | ||
| 28 | client, | ||
| 29 | config, | ||
| 30 | keys, | ||
| 31 | }) | ||
| 32 | } | ||
| 33 | |||
| 34 | /// Get the public key for this audit client | ||
| 35 | pub fn public_key(&self) -> PublicKey { | ||
| 36 | self.keys.public_key() | ||
| 37 | } | ||
| 38 | |||
| 39 | /// Check if connected to relay | ||
| 40 | pub async fn is_connected(&self) -> bool { | ||
| 41 | // Check if we have any connected relays | ||
| 42 | let relays = self.client.relays().await; | ||
| 43 | relays.values().any(|r| r.is_connected()) | ||
| 44 | } | ||
| 45 | |||
| 46 | /// Send an event (with audit tags automatically added) | ||
| 47 | pub async fn send_event(&self, event: Event) -> Result<EventId> { | ||
| 48 | if self.config.read_only { | ||
| 49 | return Err(anyhow!("Client is in read-only mode")); | ||
| 50 | } | ||
| 51 | |||
| 52 | let event_id = self.client.send_event(event).await?; | ||
| 53 | |||
| 54 | // Wait a bit for event to propagate | ||
| 55 | tokio::time::sleep(Duration::from_millis(100)).await; | ||
| 56 | |||
| 57 | Ok(event_id) | ||
| 58 | } | ||
| 59 | |||
| 60 | /// Create an event builder with audit tags | ||
| 61 | pub fn event_builder(&self, kind: Kind, content: impl Into<String>) -> AuditEventBuilder { | ||
| 62 | AuditEventBuilder::new(kind, content, self.config.clone()) | ||
| 63 | } | ||
| 64 | |||
| 65 | /// Query events, optionally filtered to this audit run | ||
| 66 | pub async fn query(&self, mut filter: Filter) -> Result<Vec<Event>> { | ||
| 67 | if self.config.mode == AuditMode::CI { | ||
| 68 | // In CI mode, only see our own audit events | ||
| 69 | filter = filter | ||
| 70 | .custom_tag( | ||
| 71 | SingleLetterTag::lowercase(Alphabet::G), | ||
| 72 | ["true"] // grasp-audit tag | ||
| 73 | ) | ||
| 74 | .custom_tag( | ||
| 75 | SingleLetterTag::lowercase(Alphabet::R), | ||
| 76 | [&self.config.run_id] // audit-run-id tag | ||
| 77 | ); | ||
| 78 | } | ||
| 79 | // In Production mode, see all events (no filter modification) | ||
| 80 | |||
| 81 | let events = self.client | ||
| 82 | .get_events_of(vec![filter], Some(Duration::from_secs(5))) | ||
| 83 | .await?; | ||
| 84 | |||
| 85 | Ok(events) | ||
| 86 | } | ||
| 87 | |||
| 88 | /// Subscribe to events with a callback | ||
| 89 | pub async fn subscribe( | ||
| 90 | &self, | ||
| 91 | filters: Vec<Filter>, | ||
| 92 | timeout: Option<Duration>, | ||
| 93 | ) -> Result<Vec<Event>> { | ||
| 94 | let events = self.client | ||
| 95 | .get_events_of(filters, timeout) | ||
| 96 | .await?; | ||
| 97 | |||
| 98 | Ok(events) | ||
| 99 | } | ||
| 100 | |||
| 101 | /// Get the underlying nostr client (for advanced usage) | ||
| 102 | pub fn client(&self) -> &Client { | ||
| 103 | &self.client | ||
| 104 | } | ||
| 105 | |||
| 106 | /// Get the keys (for signing custom events) | ||
| 107 | pub fn keys(&self) -> &Keys { | ||
| 108 | &self.keys | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | #[cfg(test)] | ||
| 113 | mod tests { | ||
| 114 | use super::*; | ||
| 115 | |||
| 116 | #[tokio::test] | ||
| 117 | async fn test_client_creation() { | ||
| 118 | let config = AuditConfig::ci(); | ||
| 119 | |||
| 120 | // This will fail if no relay is running, which is expected in tests | ||
| 121 | // In real usage, there should be a relay at the URL | ||
| 122 | let result = AuditClient::new("ws://localhost:7000", config).await; | ||
| 123 | |||
| 124 | // We can't test connection without a running relay | ||
| 125 | // But we can test that the client is created | ||
| 126 | if let Ok(client) = result { | ||
| 127 | assert_eq!(client.config.mode, AuditMode::CI); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | #[test] | ||
| 132 | fn test_event_builder() { | ||
| 133 | let config = AuditConfig::ci(); | ||
| 134 | let keys = Keys::generate(); | ||
| 135 | let client = AuditClient { | ||
| 136 | client: Client::new(&keys), | ||
| 137 | config: config.clone(), | ||
| 138 | keys: keys.clone(), | ||
| 139 | }; | ||
| 140 | |||
| 141 | let builder = client.event_builder(Kind::TextNote, "test content"); | ||
| 142 | |||
| 143 | // Builder should have the config | ||
| 144 | assert_eq!(builder.config.run_id, config.run_id); | ||
| 145 | } | ||
| 146 | } | ||
diff --git a/grasp-audit/src/isolation.rs b/grasp-audit/src/isolation.rs new file mode 100644 index 0000000..298781a --- /dev/null +++ b/grasp-audit/src/isolation.rs | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | //! Test isolation utilities | ||
| 2 | |||
| 3 | use std::sync::atomic::{AtomicU64, Ordering}; | ||
| 4 | |||
| 5 | static TEST_COUNTER: AtomicU64 = AtomicU64::new(0); | ||
| 6 | |||
| 7 | /// Generate a unique test ID | ||
| 8 | pub fn generate_test_id() -> String { | ||
| 9 | let counter = TEST_COUNTER.fetch_add(1, Ordering::SeqCst); | ||
| 10 | let timestamp = std::time::SystemTime::now() | ||
| 11 | .duration_since(std::time::UNIX_EPOCH) | ||
| 12 | .unwrap() | ||
| 13 | .as_secs(); | ||
| 14 | |||
| 15 | format!("test-{}-{}", timestamp, counter) | ||
| 16 | } | ||
| 17 | |||
| 18 | /// Generate a unique audit run ID for CI | ||
| 19 | pub fn generate_ci_run_id() -> String { | ||
| 20 | format!("ci-{}", uuid::Uuid::new_v4()) | ||
| 21 | } | ||
| 22 | |||
| 23 | /// Generate a unique audit run ID for production | ||
| 24 | pub fn generate_prod_run_id() -> String { | ||
| 25 | let timestamp = std::time::SystemTime::now() | ||
| 26 | .duration_since(std::time::UNIX_EPOCH) | ||
| 27 | .unwrap() | ||
| 28 | .as_secs(); | ||
| 29 | |||
| 30 | format!("prod-audit-{}", timestamp) | ||
| 31 | } | ||
| 32 | |||
| 33 | #[cfg(test)] | ||
| 34 | mod tests { | ||
| 35 | use super::*; | ||
| 36 | |||
| 37 | #[test] | ||
| 38 | fn test_generate_test_id() { | ||
| 39 | let id1 = generate_test_id(); | ||
| 40 | let id2 = generate_test_id(); | ||
| 41 | |||
| 42 | assert_ne!(id1, id2); | ||
| 43 | assert!(id1.starts_with("test-")); | ||
| 44 | } | ||
| 45 | |||
| 46 | #[test] | ||
| 47 | fn test_generate_ci_run_id() { | ||
| 48 | let id = generate_ci_run_id(); | ||
| 49 | assert!(id.starts_with("ci-")); | ||
| 50 | } | ||
| 51 | |||
| 52 | #[test] | ||
| 53 | fn test_generate_prod_run_id() { | ||
| 54 | let id = generate_prod_run_id(); | ||
| 55 | assert!(id.starts_with("prod-audit-")); | ||
| 56 | } | ||
| 57 | } | ||
diff --git a/grasp-audit/src/lib.rs b/grasp-audit/src/lib.rs new file mode 100644 index 0000000..3a6404f --- /dev/null +++ b/grasp-audit/src/lib.rs | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | //! GRASP Audit Tool | ||
| 2 | //! | ||
| 3 | //! A reusable compliance and audit testing tool for GRASP protocol implementations. | ||
| 4 | //! | ||
| 5 | //! # Features | ||
| 6 | //! | ||
| 7 | //! - **Isolated Testing**: Tests run in parallel with unique audit IDs | ||
| 8 | //! - **Production Audit**: Test live services with minimal impact | ||
| 9 | //! - **Clean Audit Events**: Special tags for easy cleanup without deletion trails | ||
| 10 | //! - **Spec-Mirrored Tests**: Test structure matches GRASP protocol exactly | ||
| 11 | //! | ||
| 12 | //! # Usage | ||
| 13 | //! | ||
| 14 | //! ```no_run | ||
| 15 | //! use grasp_audit::*; | ||
| 16 | //! | ||
| 17 | //! #[tokio::main] | ||
| 18 | //! async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
| 19 | //! // Create audit client for CI testing | ||
| 20 | //! let config = AuditConfig::ci(); | ||
| 21 | //! let client = AuditClient::new("ws://localhost:7000", config).await?; | ||
| 22 | //! | ||
| 23 | //! // Run smoke tests | ||
| 24 | //! let results = specs::nip01_smoke::Nip01SmokeTests::run_all(&client).await; | ||
| 25 | //! results.print_report(); | ||
| 26 | //! | ||
| 27 | //! Ok(()) | ||
| 28 | //! } | ||
| 29 | //! ``` | ||
| 30 | |||
| 31 | pub mod audit; | ||
| 32 | pub mod client; | ||
| 33 | pub mod isolation; | ||
| 34 | pub mod result; | ||
| 35 | pub mod specs; | ||
| 36 | |||
| 37 | pub use audit::{AuditConfig, AuditMode}; | ||
| 38 | pub use client::AuditClient; | ||
| 39 | pub use result::{AuditResult, TestResult}; | ||
| 40 | |||
| 41 | // Re-export commonly used types | ||
| 42 | pub use anyhow::{anyhow, Result}; | ||
| 43 | pub use nostr_sdk::prelude::*; | ||
diff --git a/grasp-audit/src/result.rs b/grasp-audit/src/result.rs new file mode 100644 index 0000000..f591304 --- /dev/null +++ b/grasp-audit/src/result.rs | |||
| @@ -0,0 +1,189 @@ | |||
| 1 | //! Test result types | ||
| 2 | |||
| 3 | use std::time::{Duration, Instant}; | ||
| 4 | |||
| 5 | /// Result of a single test | ||
| 6 | #[derive(Debug, Clone)] | ||
| 7 | pub struct TestResult { | ||
| 8 | pub name: String, | ||
| 9 | pub spec_ref: String, | ||
| 10 | pub requirement: String, | ||
| 11 | pub passed: bool, | ||
| 12 | pub error: Option<String>, | ||
| 13 | pub duration: Duration, | ||
| 14 | } | ||
| 15 | |||
| 16 | impl TestResult { | ||
| 17 | /// Create a new test result | ||
| 18 | pub fn new(name: &str, spec_ref: &str, requirement: &str) -> Self { | ||
| 19 | TestResult { | ||
| 20 | name: name.to_string(), | ||
| 21 | spec_ref: spec_ref.to_string(), | ||
| 22 | requirement: requirement.to_string(), | ||
| 23 | passed: false, | ||
| 24 | error: None, | ||
| 25 | duration: Duration::default(), | ||
| 26 | } | ||
| 27 | } | ||
| 28 | |||
| 29 | /// Run a test function and capture the result | ||
| 30 | pub async fn run<F, Fut>(mut self, test_fn: F) -> Self | ||
| 31 | where | ||
| 32 | F: FnOnce() -> Fut, | ||
| 33 | Fut: std::future::Future<Output = Result<(), String>>, | ||
| 34 | { | ||
| 35 | let start = Instant::now(); | ||
| 36 | |||
| 37 | match test_fn().await { | ||
| 38 | Ok(()) => { | ||
| 39 | self.passed = true; | ||
| 40 | } | ||
| 41 | Err(e) => { | ||
| 42 | self.passed = false; | ||
| 43 | self.error = Some(e); | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | self.duration = start.elapsed(); | ||
| 48 | self | ||
| 49 | } | ||
| 50 | |||
| 51 | /// Mark test as passed | ||
| 52 | pub fn pass(mut self) -> Self { | ||
| 53 | self.passed = true; | ||
| 54 | self | ||
| 55 | } | ||
| 56 | |||
| 57 | /// Mark test as failed with error | ||
| 58 | pub fn fail(mut self, error: impl Into<String>) -> Self { | ||
| 59 | self.passed = false; | ||
| 60 | self.error = Some(error.into()); | ||
| 61 | self | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | /// Collection of test results for a spec | ||
| 66 | #[derive(Debug, Clone)] | ||
| 67 | pub struct AuditResult { | ||
| 68 | pub spec: String, | ||
| 69 | pub results: Vec<TestResult>, | ||
| 70 | } | ||
| 71 | |||
| 72 | impl AuditResult { | ||
| 73 | /// Create a new audit result | ||
| 74 | pub fn new(spec: impl Into<String>) -> Self { | ||
| 75 | Self { | ||
| 76 | spec: spec.into(), | ||
| 77 | results: Vec::new(), | ||
| 78 | } | ||
| 79 | } | ||
| 80 | |||
| 81 | /// Add a test result | ||
| 82 | pub fn add(&mut self, result: TestResult) { | ||
| 83 | self.results.push(result); | ||
| 84 | } | ||
| 85 | |||
| 86 | /// Merge another audit result | ||
| 87 | pub fn merge(&mut self, other: AuditResult) { | ||
| 88 | self.results.extend(other.results); | ||
| 89 | } | ||
| 90 | |||
| 91 | /// Check if all tests passed | ||
| 92 | pub fn all_passed(&self) -> bool { | ||
| 93 | self.results.iter().all(|r| r.passed) | ||
| 94 | } | ||
| 95 | |||
| 96 | /// Get count of passed tests | ||
| 97 | pub fn passed_count(&self) -> usize { | ||
| 98 | self.results.iter().filter(|r| r.passed).count() | ||
| 99 | } | ||
| 100 | |||
| 101 | /// Get count of failed tests | ||
| 102 | pub fn failed_count(&self) -> usize { | ||
| 103 | self.results.iter().filter(|r| !r.passed).count() | ||
| 104 | } | ||
| 105 | |||
| 106 | /// Get total count of tests | ||
| 107 | pub fn total_count(&self) -> usize { | ||
| 108 | self.results.len() | ||
| 109 | } | ||
| 110 | |||
| 111 | /// Print a detailed report | ||
| 112 | pub fn print_report(&self) { | ||
| 113 | println!("\n{}", self.spec); | ||
| 114 | println!("{}", "═".repeat(60)); | ||
| 115 | println!(); | ||
| 116 | |||
| 117 | let passed = self.passed_count(); | ||
| 118 | let total = self.total_count(); | ||
| 119 | |||
| 120 | for result in &self.results { | ||
| 121 | let status = if result.passed { "✓" } else { "✗" }; | ||
| 122 | |||
| 123 | println!("{} {} ({})", status, result.name, result.spec_ref); | ||
| 124 | println!(" Requirement: {}", result.requirement); | ||
| 125 | |||
| 126 | if let Some(error) = &result.error { | ||
| 127 | println!(" Error: {}", error); | ||
| 128 | } | ||
| 129 | |||
| 130 | println!(" Duration: {:?}", result.duration); | ||
| 131 | println!(); | ||
| 132 | } | ||
| 133 | |||
| 134 | println!("Results: {}/{} passed ({:.1}%)", | ||
| 135 | passed, | ||
| 136 | total, | ||
| 137 | (passed as f64 / total as f64) * 100.0 | ||
| 138 | ); | ||
| 139 | println!(); | ||
| 140 | } | ||
| 141 | |||
| 142 | /// Get a summary string | ||
| 143 | pub fn summary(&self) -> String { | ||
| 144 | format!( | ||
| 145 | "{}: {}/{} passed", | ||
| 146 | self.spec, | ||
| 147 | self.passed_count(), | ||
| 148 | self.total_count() | ||
| 149 | ) | ||
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 | #[cfg(test)] | ||
| 154 | mod tests { | ||
| 155 | use super::*; | ||
| 156 | |||
| 157 | #[tokio::test] | ||
| 158 | async fn test_result_pass() { | ||
| 159 | let result = TestResult::new("test", "SPEC:1", "Must work") | ||
| 160 | .run(|| async { Ok(()) }) | ||
| 161 | .await; | ||
| 162 | |||
| 163 | assert!(result.passed); | ||
| 164 | assert!(result.error.is_none()); | ||
| 165 | } | ||
| 166 | |||
| 167 | #[tokio::test] | ||
| 168 | async fn test_result_fail() { | ||
| 169 | let result = TestResult::new("test", "SPEC:1", "Must work") | ||
| 170 | .run(|| async { Err("Failed".to_string()) }) | ||
| 171 | .await; | ||
| 172 | |||
| 173 | assert!(!result.passed); | ||
| 174 | assert_eq!(result.error, Some("Failed".to_string())); | ||
| 175 | } | ||
| 176 | |||
| 177 | #[test] | ||
| 178 | fn test_audit_result() { | ||
| 179 | let mut audit = AuditResult::new("Test Spec"); | ||
| 180 | |||
| 181 | audit.add(TestResult::new("test1", "SPEC:1", "Req1").pass()); | ||
| 182 | audit.add(TestResult::new("test2", "SPEC:2", "Req2").fail("Error")); | ||
| 183 | |||
| 184 | assert_eq!(audit.total_count(), 2); | ||
| 185 | assert_eq!(audit.passed_count(), 1); | ||
| 186 | assert_eq!(audit.failed_count(), 1); | ||
| 187 | assert!(!audit.all_passed()); | ||
| 188 | } | ||
| 189 | } | ||
diff --git a/grasp-audit/src/specs/mod.rs b/grasp-audit/src/specs/mod.rs new file mode 100644 index 0000000..451ea1f --- /dev/null +++ b/grasp-audit/src/specs/mod.rs | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | //! Test specifications | ||
| 2 | |||
| 3 | pub mod nip01_smoke; | ||
| 4 | |||
| 5 | pub use nip01_smoke::Nip01SmokeTests; | ||
diff --git a/grasp-audit/src/specs/nip01_smoke.rs b/grasp-audit/src/specs/nip01_smoke.rs new file mode 100644 index 0000000..fc3ec29 --- /dev/null +++ b/grasp-audit/src/specs/nip01_smoke.rs | |||
| @@ -0,0 +1,303 @@ | |||
| 1 | //! NIP-01 Smoke Tests | ||
| 2 | //! | ||
| 3 | //! These tests verify basic Nostr relay functionality. | ||
| 4 | //! We don't comprehensively test NIP-01 because rust-nostr already has 1000+ tests. | ||
| 5 | //! These are just smoke tests to ensure the relay is working at all. | ||
| 6 | |||
| 7 | use crate::{AuditClient, AuditResult, TestResult}; | ||
| 8 | use nostr_sdk::prelude::*; | ||
| 9 | |||
| 10 | pub struct Nip01SmokeTests; | ||
| 11 | |||
| 12 | impl Nip01SmokeTests { | ||
| 13 | /// Run all NIP-01 smoke tests | ||
| 14 | pub async fn run_all(client: &AuditClient) -> AuditResult { | ||
| 15 | let mut results = AuditResult::new("NIP-01 Smoke Tests"); | ||
| 16 | |||
| 17 | // Run tests in parallel | ||
| 18 | let tests = vec![ | ||
| 19 | Self::test_websocket_connection(client), | ||
| 20 | Self::test_send_receive_event(client), | ||
| 21 | Self::test_create_subscription(client), | ||
| 22 | Self::test_close_subscription(client), | ||
| 23 | Self::test_reject_invalid_signature(client), | ||
| 24 | Self::test_reject_invalid_event_id(client), | ||
| 25 | ]; | ||
| 26 | |||
| 27 | let test_results = futures::future::join_all(tests).await; | ||
| 28 | |||
| 29 | for result in test_results { | ||
| 30 | results.add(result); | ||
| 31 | } | ||
| 32 | |||
| 33 | results | ||
| 34 | } | ||
| 35 | |||
| 36 | /// Test 1: Can establish WebSocket connection | ||
| 37 | /// | ||
| 38 | /// Spec: NIP-01 basic requirement | ||
| 39 | /// Requirement: MUST serve a relay at / via WebSocket | ||
| 40 | async fn test_websocket_connection(client: &AuditClient) -> TestResult { | ||
| 41 | TestResult::new( | ||
| 42 | "websocket_connection", | ||
| 43 | "NIP-01:basic", | ||
| 44 | "Can establish WebSocket connection to /", | ||
| 45 | ) | ||
| 46 | .run(|| async { | ||
| 47 | if !client.is_connected().await { | ||
| 48 | return Err("Failed to connect to relay".to_string()); | ||
| 49 | } | ||
| 50 | |||
| 51 | Ok(()) | ||
| 52 | }) | ||
| 53 | .await | ||
| 54 | } | ||
| 55 | |||
| 56 | /// Test 2: Can send EVENT and receive OK response | ||
| 57 | /// | ||
| 58 | /// Spec: NIP-01 EVENT message | ||
| 59 | /// Requirement: Relay MUST accept valid EVENT messages | ||
| 60 | async fn test_send_receive_event(client: &AuditClient) -> TestResult { | ||
| 61 | TestResult::new( | ||
| 62 | "send_receive_event", | ||
| 63 | "NIP-01:event-message", | ||
| 64 | "Can send EVENT and receive OK response", | ||
| 65 | ) | ||
| 66 | .run(|| async { | ||
| 67 | // Create audit event | ||
| 68 | let event = client | ||
| 69 | .event_builder(Kind::TextNote, "NIP-01 smoke test event") | ||
| 70 | .build(client.keys()) | ||
| 71 | .await | ||
| 72 | .map_err(|e| format!("Failed to build event: {}", e))?; | ||
| 73 | |||
| 74 | // Send event | ||
| 75 | let event_id = client | ||
| 76 | .send_event(event.clone()) | ||
| 77 | .await | ||
| 78 | .map_err(|e| format!("Failed to send event: {}", e))?; | ||
| 79 | |||
| 80 | // Verify we got an event ID back | ||
| 81 | if event_id != event.id { | ||
| 82 | return Err(format!( | ||
| 83 | "Event ID mismatch: sent {}, got {}", | ||
| 84 | event.id, event_id | ||
| 85 | )); | ||
| 86 | } | ||
| 87 | |||
| 88 | // Try to query it back | ||
| 89 | let filter = Filter::new() | ||
| 90 | .kind(Kind::TextNote) | ||
| 91 | .id(event_id); | ||
| 92 | |||
| 93 | let events = client | ||
| 94 | .query(filter) | ||
| 95 | .await | ||
| 96 | .map_err(|e| format!("Failed to query event: {}", e))?; | ||
| 97 | |||
| 98 | if events.is_empty() { | ||
| 99 | return Err("Event not found after sending".to_string()); | ||
| 100 | } | ||
| 101 | |||
| 102 | if events[0].id != event_id { | ||
| 103 | return Err("Retrieved event has different ID".to_string()); | ||
| 104 | } | ||
| 105 | |||
| 106 | Ok(()) | ||
| 107 | }) | ||
| 108 | .await | ||
| 109 | } | ||
| 110 | |||
| 111 | /// Test 3: Can create subscription with REQ | ||
| 112 | /// | ||
| 113 | /// Spec: NIP-01 REQ message | ||
| 114 | /// Requirement: Relay MUST support REQ subscriptions | ||
| 115 | async fn test_create_subscription(client: &AuditClient) -> TestResult { | ||
| 116 | TestResult::new( | ||
| 117 | "create_subscription", | ||
| 118 | "NIP-01:req-message", | ||
| 119 | "Can create subscription with REQ and receive EOSE", | ||
| 120 | ) | ||
| 121 | .run(|| async { | ||
| 122 | // Create a test event first | ||
| 123 | let event = client | ||
| 124 | .event_builder(Kind::TextNote, "Subscription test event") | ||
| 125 | .build(client.keys()) | ||
| 126 | .await | ||
| 127 | .map_err(|e| format!("Failed to build event: {}", e))?; | ||
| 128 | |||
| 129 | client | ||
| 130 | .send_event(event.clone()) | ||
| 131 | .await | ||
| 132 | .map_err(|e| format!("Failed to send event: {}", e))?; | ||
| 133 | |||
| 134 | // Subscribe to events | ||
| 135 | let filter = Filter::new() | ||
| 136 | .kind(Kind::TextNote) | ||
| 137 | .author(client.public_key()); | ||
| 138 | |||
| 139 | let events = client | ||
| 140 | .subscribe(vec![filter], Some(std::time::Duration::from_secs(5))) | ||
| 141 | .await | ||
| 142 | .map_err(|e| format!("Failed to subscribe: {}", e))?; | ||
| 143 | |||
| 144 | // Should have at least our event | ||
| 145 | if events.is_empty() { | ||
| 146 | return Err("No events received from subscription".to_string()); | ||
| 147 | } | ||
| 148 | |||
| 149 | Ok(()) | ||
| 150 | }) | ||
| 151 | .await | ||
| 152 | } | ||
| 153 | |||
| 154 | /// Test 4: Can close subscription with CLOSE | ||
| 155 | /// | ||
| 156 | /// Spec: NIP-01 CLOSE message | ||
| 157 | /// Requirement: Relay MUST support CLOSE to end subscriptions | ||
| 158 | async fn test_close_subscription(client: &AuditClient) -> TestResult { | ||
| 159 | TestResult::new( | ||
| 160 | "close_subscription", | ||
| 161 | "NIP-01:close-message", | ||
| 162 | "Can close subscriptions", | ||
| 163 | ) | ||
| 164 | .run(|| async { | ||
| 165 | // For now, we just verify we can query events | ||
| 166 | // Full subscription management with CLOSE would require | ||
| 167 | // lower-level WebSocket access | ||
| 168 | |||
| 169 | let filter = Filter::new() | ||
| 170 | .kind(Kind::TextNote) | ||
| 171 | .limit(1); | ||
| 172 | |||
| 173 | let _events = client | ||
| 174 | .subscribe(vec![filter], Some(std::time::Duration::from_secs(2))) | ||
| 175 | .await | ||
| 176 | .map_err(|e| format!("Failed to subscribe: {}", e))?; | ||
| 177 | |||
| 178 | // If we got here, subscription worked | ||
| 179 | Ok(()) | ||
| 180 | }) | ||
| 181 | .await | ||
| 182 | } | ||
| 183 | |||
| 184 | /// Test 5: Rejects events with invalid signatures | ||
| 185 | /// | ||
| 186 | /// Spec: NIP-01 event validation | ||
| 187 | /// Requirement: Relay MUST reject events with invalid signatures | ||
| 188 | async fn test_reject_invalid_signature(client: &AuditClient) -> TestResult { | ||
| 189 | TestResult::new( | ||
| 190 | "reject_invalid_signature", | ||
| 191 | "NIP-01:validation", | ||
| 192 | "Rejects events with invalid signatures", | ||
| 193 | ) | ||
| 194 | .run(|| async { | ||
| 195 | // Create a valid event | ||
| 196 | let mut event = client | ||
| 197 | .event_builder(Kind::TextNote, "Invalid signature test") | ||
| 198 | .build(client.keys()) | ||
| 199 | .await | ||
| 200 | .map_err(|e| format!("Failed to build event: {}", e))?; | ||
| 201 | |||
| 202 | // Corrupt the signature by creating a new event with wrong sig | ||
| 203 | // We'll use a different key to sign, creating an invalid signature | ||
| 204 | let wrong_keys = Keys::generate(); | ||
| 205 | let wrong_event = EventBuilder::new( | ||
| 206 | event.kind, | ||
| 207 | event.content.clone(), | ||
| 208 | event.tags.clone(), | ||
| 209 | ) | ||
| 210 | .to_event(&wrong_keys) | ||
| 211 | .await | ||
| 212 | .map_err(|e| format!("Failed to build wrong event: {}", e))?; | ||
| 213 | |||
| 214 | // Create event with mismatched pubkey and signature | ||
| 215 | // This should be rejected by the relay | ||
| 216 | event = Event { | ||
| 217 | id: event.id, | ||
| 218 | pubkey: event.pubkey, | ||
| 219 | created_at: event.created_at, | ||
| 220 | kind: event.kind, | ||
| 221 | tags: event.tags, | ||
| 222 | content: event.content, | ||
| 223 | sig: wrong_event.sig, // Wrong signature! | ||
| 224 | }; | ||
| 225 | |||
| 226 | // Try to send the invalid event | ||
| 227 | let result = client.send_event(event).await; | ||
| 228 | |||
| 229 | // We expect this to fail | ||
| 230 | if result.is_ok() { | ||
| 231 | return Err("Relay accepted event with invalid signature".to_string()); | ||
| 232 | } | ||
| 233 | |||
| 234 | Ok(()) | ||
| 235 | }) | ||
| 236 | .await | ||
| 237 | } | ||
| 238 | |||
| 239 | /// Test 6: Rejects events with invalid event IDs | ||
| 240 | /// | ||
| 241 | /// Spec: NIP-01 event ID validation | ||
| 242 | /// Requirement: Relay MUST reject events where ID doesn't match hash | ||
| 243 | async fn test_reject_invalid_event_id(client: &AuditClient) -> TestResult { | ||
| 244 | TestResult::new( | ||
| 245 | "reject_invalid_event_id", | ||
| 246 | "NIP-01:validation", | ||
| 247 | "Rejects events with invalid event IDs", | ||
| 248 | ) | ||
| 249 | .run(|| async { | ||
| 250 | // Create a valid event | ||
| 251 | let mut event = client | ||
| 252 | .event_builder(Kind::TextNote, "Invalid ID test") | ||
| 253 | .build(client.keys()) | ||
| 254 | .await | ||
| 255 | .map_err(|e| format!("Failed to build event: {}", e))?; | ||
| 256 | |||
| 257 | // Corrupt the ID | ||
| 258 | event = Event { | ||
| 259 | id: EventId::all_zeros(), // Wrong ID! | ||
| 260 | pubkey: event.pubkey, | ||
| 261 | created_at: event.created_at, | ||
| 262 | kind: event.kind, | ||
| 263 | tags: event.tags, | ||
| 264 | content: event.content, | ||
| 265 | sig: event.sig, | ||
| 266 | }; | ||
| 267 | |||
| 268 | // Try to send the invalid event | ||
| 269 | let result = client.send_event(event).await; | ||
| 270 | |||
| 271 | // We expect this to fail | ||
| 272 | if result.is_ok() { | ||
| 273 | return Err("Relay accepted event with invalid ID".to_string()); | ||
| 274 | } | ||
| 275 | |||
| 276 | Ok(()) | ||
| 277 | }) | ||
| 278 | .await | ||
| 279 | } | ||
| 280 | } | ||
| 281 | |||
| 282 | #[cfg(test)] | ||
| 283 | mod tests { | ||
| 284 | use super::*; | ||
| 285 | use crate::AuditConfig; | ||
| 286 | |||
| 287 | // Note: These tests require a running relay | ||
| 288 | // They are integration tests, not unit tests | ||
| 289 | |||
| 290 | #[tokio::test] | ||
| 291 | #[ignore] // Ignore by default since it needs a running relay | ||
| 292 | async fn test_smoke_tests_against_relay() { | ||
| 293 | let config = AuditConfig::ci(); | ||
| 294 | let client = AuditClient::new("ws://localhost:7000", config) | ||
| 295 | .await | ||
| 296 | .expect("Failed to connect to relay"); | ||
| 297 | |||
| 298 | let results = Nip01SmokeTests::run_all(&client).await; | ||
| 299 | results.print_report(); | ||
| 300 | |||
| 301 | assert!(results.all_passed(), "Some smoke tests failed"); | ||
| 302 | } | ||
| 303 | } | ||