├── .github └── workflows │ └── checks.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Makefile ├── README.md ├── images ├── create_ips.png ├── submission_tab.png ├── tabs.png └── transfer.png ├── rust-toolchain.toml ├── src ├── compression.rs ├── crust.rs ├── main.rs ├── primitives.rs └── util.rs └── tinkernet_metadata.scale /.github/workflows/checks.yml: -------------------------------------------------------------------------------- 1 | name: Checks 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | - uses: actions-rust-lang/setup-rust-toolchain@v1 18 | - name: Build 19 | run: cargo build --verbose 20 | 21 | test: 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/checkout@v2 25 | - uses: actions-rust-lang/setup-rust-toolchain@v1 26 | - name: Run tests 27 | run: cargo test --verbose 28 | 29 | clippy: 30 | runs-on: ubuntu-latest 31 | steps: 32 | - uses: actions/checkout@v2 33 | - uses: actions-rust-lang/setup-rust-toolchain@v1 34 | - name: Run clippy 35 | run: cargo clippy -- -D warnings 36 | 37 | fmt: 38 | runs-on: ubuntu-latest 39 | steps: 40 | - uses: actions/checkout@v2 41 | - uses: actions-rust-lang/setup-rust-toolchain@v1 42 | - name: Run cargofmt 43 | run: cargo fmt --all -- --check 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | dependencies = [ 11 | "lazy_static", 12 | "regex", 13 | ] 14 | 15 | [[package]] 16 | name = "addr2line" 17 | version = "0.17.0" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" 20 | dependencies = [ 21 | "gimli", 22 | ] 23 | 24 | [[package]] 25 | name = "adler" 26 | version = "1.0.2" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 29 | 30 | [[package]] 31 | name = "aes" 32 | version = "0.7.5" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" 35 | dependencies = [ 36 | "cfg-if", 37 | "cipher", 38 | "cpufeatures", 39 | "opaque-debug 0.3.0", 40 | ] 41 | 42 | [[package]] 43 | name = "ahash" 44 | version = "0.7.6" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 47 | dependencies = [ 48 | "getrandom 0.2.7", 49 | "once_cell", 50 | "version_check", 51 | ] 52 | 53 | [[package]] 54 | name = "aho-corasick" 55 | version = "0.7.19" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" 58 | dependencies = [ 59 | "memchr", 60 | ] 61 | 62 | [[package]] 63 | name = "alloc-no-stdlib" 64 | version = "2.0.4" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 67 | 68 | [[package]] 69 | name = "alloc-stdlib" 70 | version = "0.2.2" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 73 | dependencies = [ 74 | "alloc-no-stdlib", 75 | ] 76 | 77 | [[package]] 78 | name = "android_system_properties" 79 | version = "0.1.5" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 82 | dependencies = [ 83 | "libc", 84 | ] 85 | 86 | [[package]] 87 | name = "ansi_term" 88 | version = "0.12.1" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 91 | dependencies = [ 92 | "winapi", 93 | ] 94 | 95 | [[package]] 96 | name = "anyhow" 97 | version = "1.0.63" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "a26fa4d7e3f2eebadf743988fc8aec9fa9a9e82611acafd77c1462ed6262440a" 100 | 101 | [[package]] 102 | name = "arrayref" 103 | version = "0.3.6" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 106 | 107 | [[package]] 108 | name = "arrayvec" 109 | version = "0.4.12" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" 112 | dependencies = [ 113 | "nodrop", 114 | ] 115 | 116 | [[package]] 117 | name = "arrayvec" 118 | version = "0.5.2" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 121 | 122 | [[package]] 123 | name = "arrayvec" 124 | version = "0.7.2" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 127 | 128 | [[package]] 129 | name = "async-lock" 130 | version = "2.5.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" 133 | dependencies = [ 134 | "event-listener", 135 | ] 136 | 137 | [[package]] 138 | name = "async-trait" 139 | version = "0.1.57" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" 142 | dependencies = [ 143 | "proc-macro2", 144 | "quote", 145 | "syn", 146 | ] 147 | 148 | [[package]] 149 | name = "autocfg" 150 | version = "1.1.0" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 153 | 154 | [[package]] 155 | name = "backtrace" 156 | version = "0.3.66" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" 159 | dependencies = [ 160 | "addr2line", 161 | "cc", 162 | "cfg-if", 163 | "libc", 164 | "miniz_oxide", 165 | "object", 166 | "rustc-demangle", 167 | ] 168 | 169 | [[package]] 170 | name = "base-x" 171 | version = "0.2.11" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 174 | 175 | [[package]] 176 | name = "base58" 177 | version = "0.2.0" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" 180 | 181 | [[package]] 182 | name = "base64" 183 | version = "0.13.0" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 186 | 187 | [[package]] 188 | name = "beef" 189 | version = "0.5.2" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" 192 | dependencies = [ 193 | "serde", 194 | ] 195 | 196 | [[package]] 197 | name = "bitflags" 198 | version = "1.3.2" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 201 | 202 | [[package]] 203 | name = "bitvec" 204 | version = "1.0.1" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 207 | dependencies = [ 208 | "funty", 209 | "radium", 210 | "tap", 211 | "wyz", 212 | ] 213 | 214 | [[package]] 215 | name = "blake2-rfc" 216 | version = "0.2.18" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" 219 | dependencies = [ 220 | "arrayvec 0.4.12", 221 | "constant_time_eq", 222 | ] 223 | 224 | [[package]] 225 | name = "blake2b_simd" 226 | version = "1.0.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" 229 | dependencies = [ 230 | "arrayref", 231 | "arrayvec 0.7.2", 232 | "constant_time_eq", 233 | ] 234 | 235 | [[package]] 236 | name = "blake2s_simd" 237 | version = "1.0.0" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" 240 | dependencies = [ 241 | "arrayref", 242 | "arrayvec 0.7.2", 243 | "constant_time_eq", 244 | ] 245 | 246 | [[package]] 247 | name = "blake3" 248 | version = "1.3.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" 251 | dependencies = [ 252 | "arrayref", 253 | "arrayvec 0.7.2", 254 | "cc", 255 | "cfg-if", 256 | "constant_time_eq", 257 | ] 258 | 259 | [[package]] 260 | name = "block-buffer" 261 | version = "0.7.3" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 264 | dependencies = [ 265 | "block-padding 0.1.5", 266 | "byte-tools", 267 | "byteorder", 268 | "generic-array 0.12.4", 269 | ] 270 | 271 | [[package]] 272 | name = "block-buffer" 273 | version = "0.9.0" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 276 | dependencies = [ 277 | "block-padding 0.2.1", 278 | "generic-array 0.14.6", 279 | ] 280 | 281 | [[package]] 282 | name = "block-buffer" 283 | version = "0.10.2" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" 286 | dependencies = [ 287 | "generic-array 0.14.6", 288 | ] 289 | 290 | [[package]] 291 | name = "block-modes" 292 | version = "0.8.1" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" 295 | dependencies = [ 296 | "block-padding 0.2.1", 297 | "cipher", 298 | ] 299 | 300 | [[package]] 301 | name = "block-padding" 302 | version = "0.1.5" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 305 | dependencies = [ 306 | "byte-tools", 307 | ] 308 | 309 | [[package]] 310 | name = "block-padding" 311 | version = "0.2.1" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" 314 | 315 | [[package]] 316 | name = "brotli" 317 | version = "3.3.4" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 320 | dependencies = [ 321 | "alloc-no-stdlib", 322 | "alloc-stdlib", 323 | "brotli-decompressor", 324 | ] 325 | 326 | [[package]] 327 | name = "brotli-decompressor" 328 | version = "2.3.2" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" 331 | dependencies = [ 332 | "alloc-no-stdlib", 333 | "alloc-stdlib", 334 | ] 335 | 336 | [[package]] 337 | name = "bs58" 338 | version = "0.4.0" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" 341 | 342 | [[package]] 343 | name = "bumpalo" 344 | version = "3.11.0" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 347 | 348 | [[package]] 349 | name = "byte-slice-cast" 350 | version = "1.2.1" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" 353 | 354 | [[package]] 355 | name = "byte-tools" 356 | version = "0.3.1" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 359 | 360 | [[package]] 361 | name = "byteorder" 362 | version = "1.4.3" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 365 | 366 | [[package]] 367 | name = "bytes" 368 | version = "1.2.1" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 371 | 372 | [[package]] 373 | name = "cc" 374 | version = "1.0.73" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 377 | dependencies = [ 378 | "jobserver", 379 | ] 380 | 381 | [[package]] 382 | name = "cfg-if" 383 | version = "1.0.0" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 386 | 387 | [[package]] 388 | name = "chrono" 389 | version = "0.4.22" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" 392 | dependencies = [ 393 | "iana-time-zone", 394 | "num-integer", 395 | "num-traits", 396 | "winapi", 397 | ] 398 | 399 | [[package]] 400 | name = "cid" 401 | version = "0.8.6" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" 404 | dependencies = [ 405 | "core2", 406 | "multibase", 407 | "multihash 0.16.3", 408 | "serde", 409 | "unsigned-varint 0.7.1", 410 | ] 411 | 412 | [[package]] 413 | name = "cipher" 414 | version = "0.3.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" 417 | dependencies = [ 418 | "generic-array 0.14.6", 419 | ] 420 | 421 | [[package]] 422 | name = "common-multipart-rfc7578" 423 | version = "0.6.0" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "5baee326bc603965b0f26583e1ecd7c111c41b49bd92a344897476a352798869" 426 | dependencies = [ 427 | "bytes", 428 | "futures-core", 429 | "futures-util", 430 | "http", 431 | "mime", 432 | "mime_guess", 433 | "rand 0.8.5", 434 | "thiserror", 435 | ] 436 | 437 | [[package]] 438 | name = "constant_time_eq" 439 | version = "0.1.5" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 442 | 443 | [[package]] 444 | name = "core-foundation" 445 | version = "0.9.3" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 448 | dependencies = [ 449 | "core-foundation-sys", 450 | "libc", 451 | ] 452 | 453 | [[package]] 454 | name = "core-foundation-sys" 455 | version = "0.8.3" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 458 | 459 | [[package]] 460 | name = "core2" 461 | version = "0.4.0" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 464 | dependencies = [ 465 | "memchr", 466 | ] 467 | 468 | [[package]] 469 | name = "cpufeatures" 470 | version = "0.2.4" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "dc948ebb96241bb40ab73effeb80d9f93afaad49359d159a5e61be51619fe813" 473 | dependencies = [ 474 | "libc", 475 | ] 476 | 477 | [[package]] 478 | name = "crc-any" 479 | version = "2.4.3" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" 482 | dependencies = [ 483 | "debug-helper", 484 | ] 485 | 486 | [[package]] 487 | name = "crunchy" 488 | version = "0.2.2" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 491 | 492 | [[package]] 493 | name = "crypto-common" 494 | version = "0.1.6" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 497 | dependencies = [ 498 | "generic-array 0.14.6", 499 | "typenum", 500 | ] 501 | 502 | [[package]] 503 | name = "crypto-mac" 504 | version = "0.8.0" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" 507 | dependencies = [ 508 | "generic-array 0.14.6", 509 | "subtle", 510 | ] 511 | 512 | [[package]] 513 | name = "crypto-mac" 514 | version = "0.11.1" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" 517 | dependencies = [ 518 | "generic-array 0.14.6", 519 | "subtle", 520 | ] 521 | 522 | [[package]] 523 | name = "curve25519-dalek" 524 | version = "2.1.3" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" 527 | dependencies = [ 528 | "byteorder", 529 | "digest 0.8.1", 530 | "rand_core 0.5.1", 531 | "subtle", 532 | "zeroize", 533 | ] 534 | 535 | [[package]] 536 | name = "curve25519-dalek" 537 | version = "3.2.0" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" 540 | dependencies = [ 541 | "byteorder", 542 | "digest 0.9.0", 543 | "rand_core 0.5.1", 544 | "subtle", 545 | "zeroize", 546 | ] 547 | 548 | [[package]] 549 | name = "darling" 550 | version = "0.14.1" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02" 553 | dependencies = [ 554 | "darling_core", 555 | "darling_macro", 556 | ] 557 | 558 | [[package]] 559 | name = "darling_core" 560 | version = "0.14.1" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f" 563 | dependencies = [ 564 | "fnv", 565 | "ident_case", 566 | "proc-macro2", 567 | "quote", 568 | "strsim", 569 | "syn", 570 | ] 571 | 572 | [[package]] 573 | name = "darling_macro" 574 | version = "0.14.1" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5" 577 | dependencies = [ 578 | "darling_core", 579 | "quote", 580 | "syn", 581 | ] 582 | 583 | [[package]] 584 | name = "data-encoding" 585 | version = "2.3.2" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" 588 | 589 | [[package]] 590 | name = "data-encoding-macro" 591 | version = "0.1.12" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" 594 | dependencies = [ 595 | "data-encoding", 596 | "data-encoding-macro-internal", 597 | ] 598 | 599 | [[package]] 600 | name = "data-encoding-macro-internal" 601 | version = "0.1.10" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" 604 | dependencies = [ 605 | "data-encoding", 606 | "syn", 607 | ] 608 | 609 | [[package]] 610 | name = "debug-helper" 611 | version = "0.3.13" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" 614 | 615 | [[package]] 616 | name = "derivative" 617 | version = "2.2.0" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 620 | dependencies = [ 621 | "proc-macro2", 622 | "quote", 623 | "syn", 624 | ] 625 | 626 | [[package]] 627 | name = "derive_more" 628 | version = "0.99.17" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 631 | dependencies = [ 632 | "proc-macro2", 633 | "quote", 634 | "syn", 635 | ] 636 | 637 | [[package]] 638 | name = "des" 639 | version = "0.7.0" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "ac41dd49fb554432020d52c875fc290e110113f864c6b1b525cd62c7e7747a5d" 642 | dependencies = [ 643 | "byteorder", 644 | "cipher", 645 | "opaque-debug 0.3.0", 646 | ] 647 | 648 | [[package]] 649 | name = "digest" 650 | version = "0.8.1" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 653 | dependencies = [ 654 | "generic-array 0.12.4", 655 | ] 656 | 657 | [[package]] 658 | name = "digest" 659 | version = "0.9.0" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 662 | dependencies = [ 663 | "generic-array 0.14.6", 664 | ] 665 | 666 | [[package]] 667 | name = "digest" 668 | version = "0.10.3" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" 671 | dependencies = [ 672 | "block-buffer 0.10.2", 673 | "crypto-common", 674 | ] 675 | 676 | [[package]] 677 | name = "dirs" 678 | version = "4.0.0" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 681 | dependencies = [ 682 | "dirs-sys", 683 | ] 684 | 685 | [[package]] 686 | name = "dirs-sys" 687 | version = "0.3.7" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 690 | dependencies = [ 691 | "libc", 692 | "redox_users", 693 | "winapi", 694 | ] 695 | 696 | [[package]] 697 | name = "downcast-rs" 698 | version = "1.2.0" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" 701 | 702 | [[package]] 703 | name = "dyn-clonable" 704 | version = "0.9.0" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" 707 | dependencies = [ 708 | "dyn-clonable-impl", 709 | "dyn-clone", 710 | ] 711 | 712 | [[package]] 713 | name = "dyn-clonable-impl" 714 | version = "0.9.0" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" 717 | dependencies = [ 718 | "proc-macro2", 719 | "quote", 720 | "syn", 721 | ] 722 | 723 | [[package]] 724 | name = "dyn-clone" 725 | version = "1.0.9" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2" 728 | 729 | [[package]] 730 | name = "ed25519" 731 | version = "1.5.2" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" 734 | dependencies = [ 735 | "signature", 736 | ] 737 | 738 | [[package]] 739 | name = "ed25519-dalek" 740 | version = "1.0.1" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" 743 | dependencies = [ 744 | "curve25519-dalek 3.2.0", 745 | "ed25519", 746 | "rand 0.7.3", 747 | "serde", 748 | "sha2 0.9.9", 749 | "zeroize", 750 | ] 751 | 752 | [[package]] 753 | name = "either" 754 | version = "1.8.0" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 757 | 758 | [[package]] 759 | name = "encoding_rs" 760 | version = "0.8.31" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 763 | dependencies = [ 764 | "cfg-if", 765 | ] 766 | 767 | [[package]] 768 | name = "environmental" 769 | version = "1.1.3" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "68b91989ae21441195d7d9b9993a2f9295c7e1a8c96255d8b729accddc124797" 772 | 773 | [[package]] 774 | name = "event-listener" 775 | version = "2.5.3" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 778 | 779 | [[package]] 780 | name = "fake-simd" 781 | version = "0.1.2" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 784 | 785 | [[package]] 786 | name = "fastrand" 787 | version = "1.8.0" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 790 | dependencies = [ 791 | "instant", 792 | ] 793 | 794 | [[package]] 795 | name = "fixed-hash" 796 | version = "0.7.0" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" 799 | dependencies = [ 800 | "byteorder", 801 | "rand 0.8.5", 802 | "rustc-hex", 803 | "static_assertions", 804 | ] 805 | 806 | [[package]] 807 | name = "fnv" 808 | version = "1.0.7" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 811 | 812 | [[package]] 813 | name = "foreign-types" 814 | version = "0.3.2" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 817 | dependencies = [ 818 | "foreign-types-shared", 819 | ] 820 | 821 | [[package]] 822 | name = "foreign-types-shared" 823 | version = "0.1.1" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 826 | 827 | [[package]] 828 | name = "form_urlencoded" 829 | version = "1.0.1" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 832 | dependencies = [ 833 | "matches", 834 | "percent-encoding", 835 | ] 836 | 837 | [[package]] 838 | name = "frame-metadata" 839 | version = "15.0.0" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" 842 | dependencies = [ 843 | "cfg-if", 844 | "parity-scale-codec", 845 | "scale-info", 846 | "serde", 847 | ] 848 | 849 | [[package]] 850 | name = "funty" 851 | version = "2.0.0" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 854 | 855 | [[package]] 856 | name = "futures" 857 | version = "0.3.24" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" 860 | dependencies = [ 861 | "futures-channel", 862 | "futures-core", 863 | "futures-executor", 864 | "futures-io", 865 | "futures-sink", 866 | "futures-task", 867 | "futures-util", 868 | ] 869 | 870 | [[package]] 871 | name = "futures-channel" 872 | version = "0.3.24" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" 875 | dependencies = [ 876 | "futures-core", 877 | "futures-sink", 878 | ] 879 | 880 | [[package]] 881 | name = "futures-core" 882 | version = "0.3.24" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" 885 | 886 | [[package]] 887 | name = "futures-executor" 888 | version = "0.3.24" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" 891 | dependencies = [ 892 | "futures-core", 893 | "futures-task", 894 | "futures-util", 895 | "num_cpus", 896 | ] 897 | 898 | [[package]] 899 | name = "futures-io" 900 | version = "0.3.24" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" 903 | 904 | [[package]] 905 | name = "futures-macro" 906 | version = "0.3.24" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" 909 | dependencies = [ 910 | "proc-macro2", 911 | "quote", 912 | "syn", 913 | ] 914 | 915 | [[package]] 916 | name = "futures-sink" 917 | version = "0.3.24" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" 920 | 921 | [[package]] 922 | name = "futures-task" 923 | version = "0.3.24" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" 926 | 927 | [[package]] 928 | name = "futures-timer" 929 | version = "3.0.2" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" 932 | 933 | [[package]] 934 | name = "futures-util" 935 | version = "0.3.24" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" 938 | dependencies = [ 939 | "futures-channel", 940 | "futures-core", 941 | "futures-io", 942 | "futures-macro", 943 | "futures-sink", 944 | "futures-task", 945 | "memchr", 946 | "pin-project-lite", 947 | "pin-utils", 948 | "slab", 949 | ] 950 | 951 | [[package]] 952 | name = "generic-array" 953 | version = "0.12.4" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 956 | dependencies = [ 957 | "typenum", 958 | ] 959 | 960 | [[package]] 961 | name = "generic-array" 962 | version = "0.14.6" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 965 | dependencies = [ 966 | "typenum", 967 | "version_check", 968 | ] 969 | 970 | [[package]] 971 | name = "getrandom" 972 | version = "0.1.16" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 975 | dependencies = [ 976 | "cfg-if", 977 | "js-sys", 978 | "libc", 979 | "wasi 0.9.0+wasi-snapshot-preview1", 980 | "wasm-bindgen", 981 | ] 982 | 983 | [[package]] 984 | name = "getrandom" 985 | version = "0.2.7" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 988 | dependencies = [ 989 | "cfg-if", 990 | "libc", 991 | "wasi 0.11.0+wasi-snapshot-preview1", 992 | ] 993 | 994 | [[package]] 995 | name = "gimli" 996 | version = "0.26.2" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" 999 | 1000 | [[package]] 1001 | name = "git-remote-inv4" 1002 | version = "0.1.0" 1003 | dependencies = [ 1004 | "base64", 1005 | "brotli", 1006 | "cid", 1007 | "dirs", 1008 | "futures", 1009 | "git2", 1010 | "hex", 1011 | "ipfs-api", 1012 | "log", 1013 | "magic-crypt", 1014 | "parity-scale-codec", 1015 | "reqwest", 1016 | "rpassword", 1017 | "serde", 1018 | "serde_json", 1019 | "subxt", 1020 | "temp-dir", 1021 | "tokio", 1022 | "toml", 1023 | "twox-hash", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "git2" 1028 | version = "0.15.0" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1" 1031 | dependencies = [ 1032 | "bitflags", 1033 | "libc", 1034 | "libgit2-sys", 1035 | "log", 1036 | "url", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "h2" 1041 | version = "0.3.14" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" 1044 | dependencies = [ 1045 | "bytes", 1046 | "fnv", 1047 | "futures-core", 1048 | "futures-sink", 1049 | "futures-util", 1050 | "http", 1051 | "indexmap", 1052 | "slab", 1053 | "tokio", 1054 | "tokio-util 0.7.3", 1055 | "tracing", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "hash-db" 1060 | version = "0.15.2" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" 1063 | 1064 | [[package]] 1065 | name = "hash256-std-hasher" 1066 | version = "0.15.2" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" 1069 | dependencies = [ 1070 | "crunchy", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "hashbrown" 1075 | version = "0.12.3" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1078 | dependencies = [ 1079 | "ahash", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "heck" 1084 | version = "0.4.0" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1087 | 1088 | [[package]] 1089 | name = "hermit-abi" 1090 | version = "0.1.19" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1093 | dependencies = [ 1094 | "libc", 1095 | ] 1096 | 1097 | [[package]] 1098 | name = "hex" 1099 | version = "0.4.3" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1102 | 1103 | [[package]] 1104 | name = "hmac" 1105 | version = "0.8.1" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" 1108 | dependencies = [ 1109 | "crypto-mac 0.8.0", 1110 | "digest 0.9.0", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "hmac" 1115 | version = "0.11.0" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" 1118 | dependencies = [ 1119 | "crypto-mac 0.11.1", 1120 | "digest 0.9.0", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "hmac-drbg" 1125 | version = "0.3.0" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" 1128 | dependencies = [ 1129 | "digest 0.9.0", 1130 | "generic-array 0.14.6", 1131 | "hmac 0.8.1", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "http" 1136 | version = "0.2.8" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1139 | dependencies = [ 1140 | "bytes", 1141 | "fnv", 1142 | "itoa 1.0.3", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "http-body" 1147 | version = "0.4.5" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1150 | dependencies = [ 1151 | "bytes", 1152 | "http", 1153 | "pin-project-lite", 1154 | ] 1155 | 1156 | [[package]] 1157 | name = "httparse" 1158 | version = "1.8.0" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1161 | 1162 | [[package]] 1163 | name = "httpdate" 1164 | version = "1.0.2" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1167 | 1168 | [[package]] 1169 | name = "hyper" 1170 | version = "0.14.20" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 1173 | dependencies = [ 1174 | "bytes", 1175 | "futures-channel", 1176 | "futures-core", 1177 | "futures-util", 1178 | "h2", 1179 | "http", 1180 | "http-body", 1181 | "httparse", 1182 | "httpdate", 1183 | "itoa 1.0.3", 1184 | "pin-project-lite", 1185 | "socket2", 1186 | "tokio", 1187 | "tower-service", 1188 | "tracing", 1189 | "want", 1190 | ] 1191 | 1192 | [[package]] 1193 | name = "hyper-multipart-rfc7578" 1194 | version = "0.8.0" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "f0eb2cf73e96e9925f4bed948e763aa2901c2f1a3a5f713ee41917433ced6671" 1197 | dependencies = [ 1198 | "bytes", 1199 | "common-multipart-rfc7578", 1200 | "futures-core", 1201 | "http", 1202 | "hyper", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "hyper-tls" 1207 | version = "0.5.0" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1210 | dependencies = [ 1211 | "bytes", 1212 | "hyper", 1213 | "native-tls", 1214 | "tokio", 1215 | "tokio-native-tls", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "iana-time-zone" 1220 | version = "0.1.47" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "4c495f162af0bf17656d0014a0eded5f3cd2f365fdd204548c2869db89359dc7" 1223 | dependencies = [ 1224 | "android_system_properties", 1225 | "core-foundation-sys", 1226 | "js-sys", 1227 | "once_cell", 1228 | "wasm-bindgen", 1229 | "winapi", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "ident_case" 1234 | version = "1.0.1" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1237 | 1238 | [[package]] 1239 | name = "idna" 1240 | version = "0.2.3" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 1243 | dependencies = [ 1244 | "matches", 1245 | "unicode-bidi", 1246 | "unicode-normalization", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "impl-codec" 1251 | version = "0.6.0" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" 1254 | dependencies = [ 1255 | "parity-scale-codec", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "impl-serde" 1260 | version = "0.3.2" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" 1263 | dependencies = [ 1264 | "serde", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "impl-trait-for-tuples" 1269 | version = "0.2.2" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" 1272 | dependencies = [ 1273 | "proc-macro2", 1274 | "quote", 1275 | "syn", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "indexmap" 1280 | version = "1.9.1" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 1283 | dependencies = [ 1284 | "autocfg", 1285 | "hashbrown", 1286 | ] 1287 | 1288 | [[package]] 1289 | name = "instant" 1290 | version = "0.1.12" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1293 | dependencies = [ 1294 | "cfg-if", 1295 | ] 1296 | 1297 | [[package]] 1298 | name = "integer-sqrt" 1299 | version = "0.1.5" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" 1302 | dependencies = [ 1303 | "num-traits", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "ipfs-api" 1308 | version = "0.16.0" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "1d4854b5cde0a7e935ee4246c5b6c67fbf4961e303963537f10e184a4830bd17" 1311 | dependencies = [ 1312 | "ipfs-api-backend-hyper", 1313 | ] 1314 | 1315 | [[package]] 1316 | name = "ipfs-api-backend-hyper" 1317 | version = "0.5.0" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "114341e043a87eff0e43ec192f0a495988323dc14c468448e62b20aaf96bd1e6" 1320 | dependencies = [ 1321 | "async-trait", 1322 | "bytes", 1323 | "futures", 1324 | "http", 1325 | "hyper", 1326 | "hyper-multipart-rfc7578", 1327 | "ipfs-api-prelude", 1328 | "thiserror", 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "ipfs-api-prelude" 1333 | version = "0.5.0" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "fbaf47fa129710ae041d5844a15b1365bdad8551673aee237449ba9dec6bcadc" 1336 | dependencies = [ 1337 | "async-trait", 1338 | "bytes", 1339 | "cfg-if", 1340 | "common-multipart-rfc7578", 1341 | "dirs", 1342 | "futures", 1343 | "http", 1344 | "multibase", 1345 | "parity-multiaddr", 1346 | "serde", 1347 | "serde_json", 1348 | "serde_urlencoded", 1349 | "thiserror", 1350 | "tokio", 1351 | "tokio-util 0.6.10", 1352 | "tracing", 1353 | "typed-builder", 1354 | "walkdir", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "ipnet" 1359 | version = "2.5.0" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 1362 | 1363 | [[package]] 1364 | name = "itoa" 1365 | version = "0.4.8" 1366 | source = "registry+https://github.com/rust-lang/crates.io-index" 1367 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1368 | 1369 | [[package]] 1370 | name = "itoa" 1371 | version = "1.0.3" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 1374 | 1375 | [[package]] 1376 | name = "jobserver" 1377 | version = "0.1.24" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" 1380 | dependencies = [ 1381 | "libc", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "js-sys" 1386 | version = "0.3.59" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" 1389 | dependencies = [ 1390 | "wasm-bindgen", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "jsonrpsee" 1395 | version = "0.15.1" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "8bd0d559d5e679b1ab2f869b486a11182923863b1b3ee8b421763cdd707b783a" 1398 | dependencies = [ 1399 | "jsonrpsee-client-transport", 1400 | "jsonrpsee-core", 1401 | "jsonrpsee-types", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "jsonrpsee-client-transport" 1406 | version = "0.15.1" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "8752740ecd374bcbf8b69f3e80b0327942df76f793f8d4e60d3355650c31fb74" 1409 | dependencies = [ 1410 | "futures-util", 1411 | "http", 1412 | "jsonrpsee-core", 1413 | "jsonrpsee-types", 1414 | "pin-project", 1415 | "rustls-native-certs", 1416 | "soketto", 1417 | "thiserror", 1418 | "tokio", 1419 | "tokio-rustls", 1420 | "tokio-util 0.7.3", 1421 | "tracing", 1422 | "webpki-roots", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "jsonrpsee-core" 1427 | version = "0.15.1" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "f3dc3e9cf2ba50b7b1d7d76a667619f82846caa39e8e8daa8a4962d74acaddca" 1430 | dependencies = [ 1431 | "anyhow", 1432 | "async-lock", 1433 | "async-trait", 1434 | "beef", 1435 | "futures-channel", 1436 | "futures-timer", 1437 | "futures-util", 1438 | "jsonrpsee-types", 1439 | "rustc-hash", 1440 | "serde", 1441 | "serde_json", 1442 | "thiserror", 1443 | "tokio", 1444 | "tracing", 1445 | "tracing-futures", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "jsonrpsee-types" 1450 | version = "0.15.1" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "e290bba767401b646812f608c099b922d8142603c9e73a50fb192d3ac86f4a0d" 1453 | dependencies = [ 1454 | "anyhow", 1455 | "beef", 1456 | "serde", 1457 | "serde_json", 1458 | "thiserror", 1459 | "tracing", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "keccak" 1464 | version = "0.1.2" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" 1467 | 1468 | [[package]] 1469 | name = "lazy_static" 1470 | version = "1.4.0" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1473 | 1474 | [[package]] 1475 | name = "libc" 1476 | version = "0.2.132" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" 1479 | 1480 | [[package]] 1481 | name = "libgit2-sys" 1482 | version = "0.14.0+1.5.0" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "47a00859c70c8a4f7218e6d1cc32875c4b55f6799445b842b0d8ed5e4c3d959b" 1485 | dependencies = [ 1486 | "cc", 1487 | "libc", 1488 | "libz-sys", 1489 | "pkg-config", 1490 | ] 1491 | 1492 | [[package]] 1493 | name = "libsecp256k1" 1494 | version = "0.7.1" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" 1497 | dependencies = [ 1498 | "arrayref", 1499 | "base64", 1500 | "digest 0.9.0", 1501 | "hmac-drbg", 1502 | "libsecp256k1-core", 1503 | "libsecp256k1-gen-ecmult", 1504 | "libsecp256k1-gen-genmult", 1505 | "rand 0.8.5", 1506 | "serde", 1507 | "sha2 0.9.9", 1508 | "typenum", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "libsecp256k1-core" 1513 | version = "0.3.0" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" 1516 | dependencies = [ 1517 | "crunchy", 1518 | "digest 0.9.0", 1519 | "subtle", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "libsecp256k1-gen-ecmult" 1524 | version = "0.3.0" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" 1527 | dependencies = [ 1528 | "libsecp256k1-core", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "libsecp256k1-gen-genmult" 1533 | version = "0.3.0" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" 1536 | dependencies = [ 1537 | "libsecp256k1-core", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "libz-sys" 1542 | version = "1.1.8" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" 1545 | dependencies = [ 1546 | "cc", 1547 | "libc", 1548 | "pkg-config", 1549 | "vcpkg", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "lock_api" 1554 | version = "0.4.8" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" 1557 | dependencies = [ 1558 | "autocfg", 1559 | "scopeguard", 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "log" 1564 | version = "0.4.17" 1565 | source = "registry+https://github.com/rust-lang/crates.io-index" 1566 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1567 | dependencies = [ 1568 | "cfg-if", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "magic-crypt" 1573 | version = "3.1.10" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "6c913782c21b53ad246863641fffbaf73a9eb32ff0d939b10d361b7294e2ea9c" 1576 | dependencies = [ 1577 | "aes", 1578 | "base64", 1579 | "block-modes", 1580 | "crc-any", 1581 | "des", 1582 | "digest 0.9.0", 1583 | "md-5", 1584 | "sha2 0.9.9", 1585 | "tiger", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "matchers" 1590 | version = "0.0.1" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" 1593 | dependencies = [ 1594 | "regex-automata", 1595 | ] 1596 | 1597 | [[package]] 1598 | name = "matches" 1599 | version = "0.1.9" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1602 | 1603 | [[package]] 1604 | name = "md-5" 1605 | version = "0.9.1" 1606 | source = "registry+https://github.com/rust-lang/crates.io-index" 1607 | checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" 1608 | dependencies = [ 1609 | "block-buffer 0.9.0", 1610 | "digest 0.9.0", 1611 | "opaque-debug 0.3.0", 1612 | ] 1613 | 1614 | [[package]] 1615 | name = "memchr" 1616 | version = "2.5.0" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1619 | 1620 | [[package]] 1621 | name = "memory-db" 1622 | version = "0.29.0" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" 1625 | dependencies = [ 1626 | "hash-db", 1627 | "hashbrown", 1628 | "parity-util-mem", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "memory_units" 1633 | version = "0.3.0" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" 1636 | 1637 | [[package]] 1638 | name = "merlin" 1639 | version = "2.0.1" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" 1642 | dependencies = [ 1643 | "byteorder", 1644 | "keccak", 1645 | "rand_core 0.5.1", 1646 | "zeroize", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "mime" 1651 | version = "0.3.16" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1654 | 1655 | [[package]] 1656 | name = "mime_guess" 1657 | version = "2.0.4" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 1660 | dependencies = [ 1661 | "mime", 1662 | "unicase", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "miniz_oxide" 1667 | version = "0.5.3" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" 1670 | dependencies = [ 1671 | "adler", 1672 | ] 1673 | 1674 | [[package]] 1675 | name = "mio" 1676 | version = "0.8.4" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1679 | dependencies = [ 1680 | "libc", 1681 | "log", 1682 | "wasi 0.11.0+wasi-snapshot-preview1", 1683 | "windows-sys", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "multibase" 1688 | version = "0.9.1" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" 1691 | dependencies = [ 1692 | "base-x", 1693 | "data-encoding", 1694 | "data-encoding-macro", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "multihash" 1699 | version = "0.13.2" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "4dac63698b887d2d929306ea48b63760431ff8a24fac40ddb22f9c7f49fb7cab" 1702 | dependencies = [ 1703 | "generic-array 0.14.6", 1704 | "multihash-derive 0.7.2", 1705 | "unsigned-varint 0.5.1", 1706 | ] 1707 | 1708 | [[package]] 1709 | name = "multihash" 1710 | version = "0.16.3" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" 1713 | dependencies = [ 1714 | "blake2b_simd", 1715 | "blake2s_simd", 1716 | "blake3", 1717 | "core2", 1718 | "digest 0.10.3", 1719 | "multihash-derive 0.8.0", 1720 | "sha2 0.10.5", 1721 | "sha3", 1722 | "unsigned-varint 0.7.1", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "multihash-derive" 1727 | version = "0.7.2" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" 1730 | dependencies = [ 1731 | "proc-macro-crate", 1732 | "proc-macro-error", 1733 | "proc-macro2", 1734 | "quote", 1735 | "syn", 1736 | "synstructure", 1737 | ] 1738 | 1739 | [[package]] 1740 | name = "multihash-derive" 1741 | version = "0.8.0" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" 1744 | dependencies = [ 1745 | "proc-macro-crate", 1746 | "proc-macro-error", 1747 | "proc-macro2", 1748 | "quote", 1749 | "syn", 1750 | "synstructure", 1751 | ] 1752 | 1753 | [[package]] 1754 | name = "native-tls" 1755 | version = "0.2.10" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" 1758 | dependencies = [ 1759 | "lazy_static", 1760 | "libc", 1761 | "log", 1762 | "openssl", 1763 | "openssl-probe", 1764 | "openssl-sys", 1765 | "schannel", 1766 | "security-framework", 1767 | "security-framework-sys", 1768 | "tempfile", 1769 | ] 1770 | 1771 | [[package]] 1772 | name = "nodrop" 1773 | version = "0.1.14" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1776 | 1777 | [[package]] 1778 | name = "num-bigint" 1779 | version = "0.2.6" 1780 | source = "registry+https://github.com/rust-lang/crates.io-index" 1781 | checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" 1782 | dependencies = [ 1783 | "autocfg", 1784 | "num-integer", 1785 | "num-traits", 1786 | ] 1787 | 1788 | [[package]] 1789 | name = "num-format" 1790 | version = "0.4.0" 1791 | source = "registry+https://github.com/rust-lang/crates.io-index" 1792 | checksum = "bafe4179722c2894288ee77a9f044f02811c86af699344c498b0840c698a2465" 1793 | dependencies = [ 1794 | "arrayvec 0.4.12", 1795 | "itoa 0.4.8", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "num-integer" 1800 | version = "0.1.45" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1803 | dependencies = [ 1804 | "autocfg", 1805 | "num-traits", 1806 | ] 1807 | 1808 | [[package]] 1809 | name = "num-rational" 1810 | version = "0.2.4" 1811 | source = "registry+https://github.com/rust-lang/crates.io-index" 1812 | checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" 1813 | dependencies = [ 1814 | "autocfg", 1815 | "num-bigint", 1816 | "num-integer", 1817 | "num-traits", 1818 | ] 1819 | 1820 | [[package]] 1821 | name = "num-traits" 1822 | version = "0.2.15" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1825 | dependencies = [ 1826 | "autocfg", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "num_cpus" 1831 | version = "1.13.1" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1834 | dependencies = [ 1835 | "hermit-abi", 1836 | "libc", 1837 | ] 1838 | 1839 | [[package]] 1840 | name = "object" 1841 | version = "0.29.0" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" 1844 | dependencies = [ 1845 | "memchr", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "once_cell" 1850 | version = "1.14.0" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" 1853 | 1854 | [[package]] 1855 | name = "opaque-debug" 1856 | version = "0.2.3" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1859 | 1860 | [[package]] 1861 | name = "opaque-debug" 1862 | version = "0.3.0" 1863 | source = "registry+https://github.com/rust-lang/crates.io-index" 1864 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1865 | 1866 | [[package]] 1867 | name = "openssl" 1868 | version = "0.10.42" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" 1871 | dependencies = [ 1872 | "bitflags", 1873 | "cfg-if", 1874 | "foreign-types", 1875 | "libc", 1876 | "once_cell", 1877 | "openssl-macros", 1878 | "openssl-sys", 1879 | ] 1880 | 1881 | [[package]] 1882 | name = "openssl-macros" 1883 | version = "0.1.0" 1884 | source = "registry+https://github.com/rust-lang/crates.io-index" 1885 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 1886 | dependencies = [ 1887 | "proc-macro2", 1888 | "quote", 1889 | "syn", 1890 | ] 1891 | 1892 | [[package]] 1893 | name = "openssl-probe" 1894 | version = "0.1.5" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1897 | 1898 | [[package]] 1899 | name = "openssl-sys" 1900 | version = "0.9.76" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "5230151e44c0f05157effb743e8d517472843121cf9243e8b81393edb5acd9ce" 1903 | dependencies = [ 1904 | "autocfg", 1905 | "cc", 1906 | "libc", 1907 | "pkg-config", 1908 | "vcpkg", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "parity-multiaddr" 1913 | version = "0.11.2" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "58341485071825827b7f03cf7efd1cb21e6a709bea778fb50227fd45d2f361b4" 1916 | dependencies = [ 1917 | "arrayref", 1918 | "bs58", 1919 | "byteorder", 1920 | "data-encoding", 1921 | "multihash 0.13.2", 1922 | "percent-encoding", 1923 | "serde", 1924 | "static_assertions", 1925 | "unsigned-varint 0.7.1", 1926 | "url", 1927 | ] 1928 | 1929 | [[package]] 1930 | name = "parity-scale-codec" 1931 | version = "3.2.1" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "366e44391a8af4cfd6002ef6ba072bae071a96aafca98d7d448a34c5dca38b6a" 1934 | dependencies = [ 1935 | "arrayvec 0.7.2", 1936 | "bitvec", 1937 | "byte-slice-cast", 1938 | "impl-trait-for-tuples", 1939 | "parity-scale-codec-derive", 1940 | "serde", 1941 | ] 1942 | 1943 | [[package]] 1944 | name = "parity-scale-codec-derive" 1945 | version = "3.1.3" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" 1948 | dependencies = [ 1949 | "proc-macro-crate", 1950 | "proc-macro2", 1951 | "quote", 1952 | "syn", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "parity-util-mem" 1957 | version = "0.11.0" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" 1960 | dependencies = [ 1961 | "cfg-if", 1962 | "hashbrown", 1963 | "impl-trait-for-tuples", 1964 | "parity-util-mem-derive", 1965 | "parking_lot", 1966 | "primitive-types", 1967 | "winapi", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "parity-util-mem-derive" 1972 | version = "0.1.0" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" 1975 | dependencies = [ 1976 | "proc-macro2", 1977 | "syn", 1978 | "synstructure", 1979 | ] 1980 | 1981 | [[package]] 1982 | name = "parity-wasm" 1983 | version = "0.42.2" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" 1986 | 1987 | [[package]] 1988 | name = "parking_lot" 1989 | version = "0.12.1" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1992 | dependencies = [ 1993 | "lock_api", 1994 | "parking_lot_core", 1995 | ] 1996 | 1997 | [[package]] 1998 | name = "parking_lot_core" 1999 | version = "0.9.3" 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" 2001 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 2002 | dependencies = [ 2003 | "cfg-if", 2004 | "libc", 2005 | "redox_syscall", 2006 | "smallvec", 2007 | "windows-sys", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "paste" 2012 | version = "1.0.9" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" 2015 | 2016 | [[package]] 2017 | name = "pbkdf2" 2018 | version = "0.4.0" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" 2021 | dependencies = [ 2022 | "crypto-mac 0.8.0", 2023 | ] 2024 | 2025 | [[package]] 2026 | name = "pbkdf2" 2027 | version = "0.8.0" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" 2030 | dependencies = [ 2031 | "crypto-mac 0.11.1", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "percent-encoding" 2036 | version = "2.1.0" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 2039 | 2040 | [[package]] 2041 | name = "pin-project" 2042 | version = "1.0.12" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 2045 | dependencies = [ 2046 | "pin-project-internal", 2047 | ] 2048 | 2049 | [[package]] 2050 | name = "pin-project-internal" 2051 | version = "1.0.12" 2052 | source = "registry+https://github.com/rust-lang/crates.io-index" 2053 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 2054 | dependencies = [ 2055 | "proc-macro2", 2056 | "quote", 2057 | "syn", 2058 | ] 2059 | 2060 | [[package]] 2061 | name = "pin-project-lite" 2062 | version = "0.2.9" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 2065 | 2066 | [[package]] 2067 | name = "pin-utils" 2068 | version = "0.1.0" 2069 | source = "registry+https://github.com/rust-lang/crates.io-index" 2070 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2071 | 2072 | [[package]] 2073 | name = "pkg-config" 2074 | version = "0.3.25" 2075 | source = "registry+https://github.com/rust-lang/crates.io-index" 2076 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 2077 | 2078 | [[package]] 2079 | name = "ppv-lite86" 2080 | version = "0.2.16" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 2083 | 2084 | [[package]] 2085 | name = "primitive-types" 2086 | version = "0.11.1" 2087 | source = "registry+https://github.com/rust-lang/crates.io-index" 2088 | checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" 2089 | dependencies = [ 2090 | "fixed-hash", 2091 | "impl-codec", 2092 | "impl-serde", 2093 | "scale-info", 2094 | "uint", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "proc-macro-crate" 2099 | version = "1.2.1" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" 2102 | dependencies = [ 2103 | "once_cell", 2104 | "thiserror", 2105 | "toml", 2106 | ] 2107 | 2108 | [[package]] 2109 | name = "proc-macro-error" 2110 | version = "1.0.4" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2113 | dependencies = [ 2114 | "proc-macro-error-attr", 2115 | "proc-macro2", 2116 | "quote", 2117 | "syn", 2118 | "version_check", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "proc-macro-error-attr" 2123 | version = "1.0.4" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2126 | dependencies = [ 2127 | "proc-macro2", 2128 | "quote", 2129 | "version_check", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "proc-macro2" 2134 | version = "1.0.43" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 2137 | dependencies = [ 2138 | "unicode-ident", 2139 | ] 2140 | 2141 | [[package]] 2142 | name = "quote" 2143 | version = "1.0.21" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 2146 | dependencies = [ 2147 | "proc-macro2", 2148 | ] 2149 | 2150 | [[package]] 2151 | name = "radium" 2152 | version = "0.7.0" 2153 | source = "registry+https://github.com/rust-lang/crates.io-index" 2154 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 2155 | 2156 | [[package]] 2157 | name = "rand" 2158 | version = "0.7.3" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2161 | dependencies = [ 2162 | "getrandom 0.1.16", 2163 | "libc", 2164 | "rand_chacha 0.2.2", 2165 | "rand_core 0.5.1", 2166 | "rand_hc", 2167 | "rand_pcg", 2168 | ] 2169 | 2170 | [[package]] 2171 | name = "rand" 2172 | version = "0.8.5" 2173 | source = "registry+https://github.com/rust-lang/crates.io-index" 2174 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2175 | dependencies = [ 2176 | "libc", 2177 | "rand_chacha 0.3.1", 2178 | "rand_core 0.6.3", 2179 | ] 2180 | 2181 | [[package]] 2182 | name = "rand_chacha" 2183 | version = "0.2.2" 2184 | source = "registry+https://github.com/rust-lang/crates.io-index" 2185 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2186 | dependencies = [ 2187 | "ppv-lite86", 2188 | "rand_core 0.5.1", 2189 | ] 2190 | 2191 | [[package]] 2192 | name = "rand_chacha" 2193 | version = "0.3.1" 2194 | source = "registry+https://github.com/rust-lang/crates.io-index" 2195 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2196 | dependencies = [ 2197 | "ppv-lite86", 2198 | "rand_core 0.6.3", 2199 | ] 2200 | 2201 | [[package]] 2202 | name = "rand_core" 2203 | version = "0.5.1" 2204 | source = "registry+https://github.com/rust-lang/crates.io-index" 2205 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2206 | dependencies = [ 2207 | "getrandom 0.1.16", 2208 | ] 2209 | 2210 | [[package]] 2211 | name = "rand_core" 2212 | version = "0.6.3" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 2215 | dependencies = [ 2216 | "getrandom 0.2.7", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "rand_hc" 2221 | version = "0.2.0" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2224 | dependencies = [ 2225 | "rand_core 0.5.1", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "rand_pcg" 2230 | version = "0.2.1" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 2233 | dependencies = [ 2234 | "rand_core 0.5.1", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "redox_syscall" 2239 | version = "0.2.16" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 2242 | dependencies = [ 2243 | "bitflags", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "redox_users" 2248 | version = "0.4.3" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 2251 | dependencies = [ 2252 | "getrandom 0.2.7", 2253 | "redox_syscall", 2254 | "thiserror", 2255 | ] 2256 | 2257 | [[package]] 2258 | name = "ref-cast" 2259 | version = "1.0.9" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "ed13bcd201494ab44900a96490291651d200730904221832b9547d24a87d332b" 2262 | dependencies = [ 2263 | "ref-cast-impl", 2264 | ] 2265 | 2266 | [[package]] 2267 | name = "ref-cast-impl" 2268 | version = "1.0.9" 2269 | source = "registry+https://github.com/rust-lang/crates.io-index" 2270 | checksum = "5234cd6063258a5e32903b53b1b6ac043a0541c8adc1f610f67b0326c7a578fa" 2271 | dependencies = [ 2272 | "proc-macro2", 2273 | "quote", 2274 | "syn", 2275 | ] 2276 | 2277 | [[package]] 2278 | name = "regex" 2279 | version = "1.6.0" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 2282 | dependencies = [ 2283 | "aho-corasick", 2284 | "memchr", 2285 | "regex-syntax", 2286 | ] 2287 | 2288 | [[package]] 2289 | name = "regex-automata" 2290 | version = "0.1.10" 2291 | source = "registry+https://github.com/rust-lang/crates.io-index" 2292 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2293 | dependencies = [ 2294 | "regex-syntax", 2295 | ] 2296 | 2297 | [[package]] 2298 | name = "regex-syntax" 2299 | version = "0.6.27" 2300 | source = "registry+https://github.com/rust-lang/crates.io-index" 2301 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 2302 | 2303 | [[package]] 2304 | name = "remove_dir_all" 2305 | version = "0.5.3" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 2308 | dependencies = [ 2309 | "winapi", 2310 | ] 2311 | 2312 | [[package]] 2313 | name = "reqwest" 2314 | version = "0.11.12" 2315 | source = "registry+https://github.com/rust-lang/crates.io-index" 2316 | checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" 2317 | dependencies = [ 2318 | "base64", 2319 | "bytes", 2320 | "encoding_rs", 2321 | "futures-core", 2322 | "futures-util", 2323 | "h2", 2324 | "http", 2325 | "http-body", 2326 | "hyper", 2327 | "hyper-tls", 2328 | "ipnet", 2329 | "js-sys", 2330 | "log", 2331 | "mime", 2332 | "mime_guess", 2333 | "native-tls", 2334 | "once_cell", 2335 | "percent-encoding", 2336 | "pin-project-lite", 2337 | "serde", 2338 | "serde_json", 2339 | "serde_urlencoded", 2340 | "tokio", 2341 | "tokio-native-tls", 2342 | "tower-service", 2343 | "url", 2344 | "wasm-bindgen", 2345 | "wasm-bindgen-futures", 2346 | "web-sys", 2347 | "winreg", 2348 | ] 2349 | 2350 | [[package]] 2351 | name = "ring" 2352 | version = "0.16.20" 2353 | source = "registry+https://github.com/rust-lang/crates.io-index" 2354 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 2355 | dependencies = [ 2356 | "cc", 2357 | "libc", 2358 | "once_cell", 2359 | "spin", 2360 | "untrusted", 2361 | "web-sys", 2362 | "winapi", 2363 | ] 2364 | 2365 | [[package]] 2366 | name = "rpassword" 2367 | version = "7.0.0" 2368 | source = "registry+https://github.com/rust-lang/crates.io-index" 2369 | checksum = "26b763cb66df1c928432cc35053f8bd4cec3335d8559fc16010017d16b3c1680" 2370 | dependencies = [ 2371 | "libc", 2372 | "winapi", 2373 | ] 2374 | 2375 | [[package]] 2376 | name = "rustc-demangle" 2377 | version = "0.1.21" 2378 | source = "registry+https://github.com/rust-lang/crates.io-index" 2379 | checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" 2380 | 2381 | [[package]] 2382 | name = "rustc-hash" 2383 | version = "1.1.0" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 2386 | 2387 | [[package]] 2388 | name = "rustc-hex" 2389 | version = "2.1.0" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" 2392 | 2393 | [[package]] 2394 | name = "rustls" 2395 | version = "0.20.6" 2396 | source = "registry+https://github.com/rust-lang/crates.io-index" 2397 | checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" 2398 | dependencies = [ 2399 | "log", 2400 | "ring", 2401 | "sct", 2402 | "webpki", 2403 | ] 2404 | 2405 | [[package]] 2406 | name = "rustls-native-certs" 2407 | version = "0.6.2" 2408 | source = "registry+https://github.com/rust-lang/crates.io-index" 2409 | checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" 2410 | dependencies = [ 2411 | "openssl-probe", 2412 | "rustls-pemfile", 2413 | "schannel", 2414 | "security-framework", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "rustls-pemfile" 2419 | version = "1.0.1" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" 2422 | dependencies = [ 2423 | "base64", 2424 | ] 2425 | 2426 | [[package]] 2427 | name = "ryu" 2428 | version = "1.0.11" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 2431 | 2432 | [[package]] 2433 | name = "same-file" 2434 | version = "1.0.6" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2437 | dependencies = [ 2438 | "winapi-util", 2439 | ] 2440 | 2441 | [[package]] 2442 | name = "scale-bits" 2443 | version = "0.3.0" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "8dd7aca73785181cc41f0bbe017263e682b585ca660540ba569133901d013ecf" 2446 | dependencies = [ 2447 | "parity-scale-codec", 2448 | "scale-info", 2449 | "serde", 2450 | ] 2451 | 2452 | [[package]] 2453 | name = "scale-decode" 2454 | version = "0.4.0" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "d823d4be477fc33321f93d08fb6c2698273d044f01362dc27573a750deb7c233" 2457 | dependencies = [ 2458 | "parity-scale-codec", 2459 | "scale-bits", 2460 | "scale-info", 2461 | "thiserror", 2462 | ] 2463 | 2464 | [[package]] 2465 | name = "scale-info" 2466 | version = "2.2.0" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "333af15b02563b8182cd863f925bd31ef8fa86a0e095d30c091956057d436153" 2469 | dependencies = [ 2470 | "bitvec", 2471 | "cfg-if", 2472 | "derive_more", 2473 | "parity-scale-codec", 2474 | "scale-info-derive", 2475 | "serde", 2476 | ] 2477 | 2478 | [[package]] 2479 | name = "scale-info-derive" 2480 | version = "2.2.0" 2481 | source = "registry+https://github.com/rust-lang/crates.io-index" 2482 | checksum = "53f56acbd0743d29ffa08f911ab5397def774ad01bab3786804cf6ee057fb5e1" 2483 | dependencies = [ 2484 | "proc-macro-crate", 2485 | "proc-macro2", 2486 | "quote", 2487 | "syn", 2488 | ] 2489 | 2490 | [[package]] 2491 | name = "scale-value" 2492 | version = "0.6.0" 2493 | source = "registry+https://github.com/rust-lang/crates.io-index" 2494 | checksum = "16a5e7810815bd295da73e4216d1dfbced3c7c7c7054d70fa5f6e4c58123fff4" 2495 | dependencies = [ 2496 | "either", 2497 | "frame-metadata", 2498 | "parity-scale-codec", 2499 | "scale-bits", 2500 | "scale-decode", 2501 | "scale-info", 2502 | "serde", 2503 | "thiserror", 2504 | "yap", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "schannel" 2509 | version = "0.1.20" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 2512 | dependencies = [ 2513 | "lazy_static", 2514 | "windows-sys", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "schnorrkel" 2519 | version = "0.9.1" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" 2522 | dependencies = [ 2523 | "arrayref", 2524 | "arrayvec 0.5.2", 2525 | "curve25519-dalek 2.1.3", 2526 | "getrandom 0.1.16", 2527 | "merlin", 2528 | "rand 0.7.3", 2529 | "rand_core 0.5.1", 2530 | "sha2 0.8.2", 2531 | "subtle", 2532 | "zeroize", 2533 | ] 2534 | 2535 | [[package]] 2536 | name = "scopeguard" 2537 | version = "1.1.0" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2540 | 2541 | [[package]] 2542 | name = "sct" 2543 | version = "0.7.0" 2544 | source = "registry+https://github.com/rust-lang/crates.io-index" 2545 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 2546 | dependencies = [ 2547 | "ring", 2548 | "untrusted", 2549 | ] 2550 | 2551 | [[package]] 2552 | name = "secp256k1" 2553 | version = "0.21.3" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "9c42e6f1735c5f00f51e43e28d6634141f2bcad10931b2609ddd74a86d751260" 2556 | dependencies = [ 2557 | "secp256k1-sys", 2558 | ] 2559 | 2560 | [[package]] 2561 | name = "secp256k1-sys" 2562 | version = "0.4.2" 2563 | source = "registry+https://github.com/rust-lang/crates.io-index" 2564 | checksum = "957da2573cde917463ece3570eab4a0b3f19de6f1646cde62e6fd3868f566036" 2565 | dependencies = [ 2566 | "cc", 2567 | ] 2568 | 2569 | [[package]] 2570 | name = "secrecy" 2571 | version = "0.8.0" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" 2574 | dependencies = [ 2575 | "zeroize", 2576 | ] 2577 | 2578 | [[package]] 2579 | name = "security-framework" 2580 | version = "2.7.0" 2581 | source = "registry+https://github.com/rust-lang/crates.io-index" 2582 | checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" 2583 | dependencies = [ 2584 | "bitflags", 2585 | "core-foundation", 2586 | "core-foundation-sys", 2587 | "libc", 2588 | "security-framework-sys", 2589 | ] 2590 | 2591 | [[package]] 2592 | name = "security-framework-sys" 2593 | version = "2.6.1" 2594 | source = "registry+https://github.com/rust-lang/crates.io-index" 2595 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 2596 | dependencies = [ 2597 | "core-foundation-sys", 2598 | "libc", 2599 | ] 2600 | 2601 | [[package]] 2602 | name = "serde" 2603 | version = "1.0.144" 2604 | source = "registry+https://github.com/rust-lang/crates.io-index" 2605 | checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" 2606 | dependencies = [ 2607 | "serde_derive", 2608 | ] 2609 | 2610 | [[package]] 2611 | name = "serde_derive" 2612 | version = "1.0.144" 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" 2614 | checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" 2615 | dependencies = [ 2616 | "proc-macro2", 2617 | "quote", 2618 | "syn", 2619 | ] 2620 | 2621 | [[package]] 2622 | name = "serde_json" 2623 | version = "1.0.85" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" 2626 | dependencies = [ 2627 | "itoa 1.0.3", 2628 | "ryu", 2629 | "serde", 2630 | ] 2631 | 2632 | [[package]] 2633 | name = "serde_urlencoded" 2634 | version = "0.7.1" 2635 | source = "registry+https://github.com/rust-lang/crates.io-index" 2636 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2637 | dependencies = [ 2638 | "form_urlencoded", 2639 | "itoa 1.0.3", 2640 | "ryu", 2641 | "serde", 2642 | ] 2643 | 2644 | [[package]] 2645 | name = "sha-1" 2646 | version = "0.9.8" 2647 | source = "registry+https://github.com/rust-lang/crates.io-index" 2648 | checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" 2649 | dependencies = [ 2650 | "block-buffer 0.9.0", 2651 | "cfg-if", 2652 | "cpufeatures", 2653 | "digest 0.9.0", 2654 | "opaque-debug 0.3.0", 2655 | ] 2656 | 2657 | [[package]] 2658 | name = "sha2" 2659 | version = "0.8.2" 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" 2661 | checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" 2662 | dependencies = [ 2663 | "block-buffer 0.7.3", 2664 | "digest 0.8.1", 2665 | "fake-simd", 2666 | "opaque-debug 0.2.3", 2667 | ] 2668 | 2669 | [[package]] 2670 | name = "sha2" 2671 | version = "0.9.9" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 2674 | dependencies = [ 2675 | "block-buffer 0.9.0", 2676 | "cfg-if", 2677 | "cpufeatures", 2678 | "digest 0.9.0", 2679 | "opaque-debug 0.3.0", 2680 | ] 2681 | 2682 | [[package]] 2683 | name = "sha2" 2684 | version = "0.10.5" 2685 | source = "registry+https://github.com/rust-lang/crates.io-index" 2686 | checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" 2687 | dependencies = [ 2688 | "cfg-if", 2689 | "cpufeatures", 2690 | "digest 0.10.3", 2691 | ] 2692 | 2693 | [[package]] 2694 | name = "sha3" 2695 | version = "0.10.4" 2696 | source = "registry+https://github.com/rust-lang/crates.io-index" 2697 | checksum = "eaedf34ed289ea47c2b741bb72e5357a209512d67bcd4bda44359e5bf0470f56" 2698 | dependencies = [ 2699 | "digest 0.10.3", 2700 | "keccak", 2701 | ] 2702 | 2703 | [[package]] 2704 | name = "sharded-slab" 2705 | version = "0.1.4" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2708 | dependencies = [ 2709 | "lazy_static", 2710 | ] 2711 | 2712 | [[package]] 2713 | name = "signal-hook-registry" 2714 | version = "1.4.0" 2715 | source = "registry+https://github.com/rust-lang/crates.io-index" 2716 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 2717 | dependencies = [ 2718 | "libc", 2719 | ] 2720 | 2721 | [[package]] 2722 | name = "signature" 2723 | version = "1.6.0" 2724 | source = "registry+https://github.com/rust-lang/crates.io-index" 2725 | checksum = "f0ea32af43239f0d353a7dd75a22d94c329c8cdaafdcb4c1c1335aa10c298a4a" 2726 | 2727 | [[package]] 2728 | name = "slab" 2729 | version = "0.4.7" 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" 2731 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 2732 | dependencies = [ 2733 | "autocfg", 2734 | ] 2735 | 2736 | [[package]] 2737 | name = "smallvec" 2738 | version = "1.9.0" 2739 | source = "registry+https://github.com/rust-lang/crates.io-index" 2740 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 2741 | 2742 | [[package]] 2743 | name = "socket2" 2744 | version = "0.4.7" 2745 | source = "registry+https://github.com/rust-lang/crates.io-index" 2746 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 2747 | dependencies = [ 2748 | "libc", 2749 | "winapi", 2750 | ] 2751 | 2752 | [[package]] 2753 | name = "soketto" 2754 | version = "0.7.1" 2755 | source = "registry+https://github.com/rust-lang/crates.io-index" 2756 | checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" 2757 | dependencies = [ 2758 | "base64", 2759 | "bytes", 2760 | "futures", 2761 | "httparse", 2762 | "log", 2763 | "rand 0.8.5", 2764 | "sha-1", 2765 | ] 2766 | 2767 | [[package]] 2768 | name = "sp-application-crypto" 2769 | version = "6.0.0" 2770 | source = "registry+https://github.com/rust-lang/crates.io-index" 2771 | checksum = "acb4490364cb3b097a6755343e552495b0013778152300714be4647d107e9a2e" 2772 | dependencies = [ 2773 | "parity-scale-codec", 2774 | "scale-info", 2775 | "serde", 2776 | "sp-core", 2777 | "sp-io", 2778 | "sp-std", 2779 | ] 2780 | 2781 | [[package]] 2782 | name = "sp-arithmetic" 2783 | version = "5.0.0" 2784 | source = "registry+https://github.com/rust-lang/crates.io-index" 2785 | checksum = "31ef21f82cc10f75ed046b65e2f8048080ee76e59f1b8aed55c7150daebfd35b" 2786 | dependencies = [ 2787 | "integer-sqrt", 2788 | "num-traits", 2789 | "parity-scale-codec", 2790 | "scale-info", 2791 | "serde", 2792 | "sp-debug-derive", 2793 | "sp-std", 2794 | "static_assertions", 2795 | ] 2796 | 2797 | [[package]] 2798 | name = "sp-core" 2799 | version = "6.0.0" 2800 | source = "registry+https://github.com/rust-lang/crates.io-index" 2801 | checksum = "77963e2aa8fadb589118c3aede2e78b6c4bcf1c01d588fbf33e915b390825fbd" 2802 | dependencies = [ 2803 | "base58", 2804 | "bitflags", 2805 | "blake2-rfc", 2806 | "byteorder", 2807 | "dyn-clonable", 2808 | "ed25519-dalek", 2809 | "futures", 2810 | "hash-db", 2811 | "hash256-std-hasher", 2812 | "hex", 2813 | "impl-serde", 2814 | "lazy_static", 2815 | "libsecp256k1", 2816 | "log", 2817 | "merlin", 2818 | "num-traits", 2819 | "parity-scale-codec", 2820 | "parity-util-mem", 2821 | "parking_lot", 2822 | "primitive-types", 2823 | "rand 0.7.3", 2824 | "regex", 2825 | "scale-info", 2826 | "schnorrkel", 2827 | "secp256k1", 2828 | "secrecy", 2829 | "serde", 2830 | "sp-core-hashing", 2831 | "sp-debug-derive", 2832 | "sp-externalities", 2833 | "sp-runtime-interface", 2834 | "sp-std", 2835 | "sp-storage", 2836 | "ss58-registry", 2837 | "substrate-bip39", 2838 | "thiserror", 2839 | "tiny-bip39", 2840 | "wasmi", 2841 | "zeroize", 2842 | ] 2843 | 2844 | [[package]] 2845 | name = "sp-core-hashing" 2846 | version = "4.0.0" 2847 | source = "registry+https://github.com/rust-lang/crates.io-index" 2848 | checksum = "ec864a6a67249f0c8dd3d5acab43623a61677e85ff4f2f9b04b802d2fe780e83" 2849 | dependencies = [ 2850 | "blake2-rfc", 2851 | "byteorder", 2852 | "sha2 0.9.9", 2853 | "sp-std", 2854 | "tiny-keccak", 2855 | "twox-hash", 2856 | ] 2857 | 2858 | [[package]] 2859 | name = "sp-debug-derive" 2860 | version = "4.0.0" 2861 | source = "registry+https://github.com/rust-lang/crates.io-index" 2862 | checksum = "d676664972e22a0796176e81e7bec41df461d1edf52090955cdab55f2c956ff2" 2863 | dependencies = [ 2864 | "proc-macro2", 2865 | "quote", 2866 | "syn", 2867 | ] 2868 | 2869 | [[package]] 2870 | name = "sp-externalities" 2871 | version = "0.12.0" 2872 | source = "registry+https://github.com/rust-lang/crates.io-index" 2873 | checksum = "0fcfd91f92a2a59224230a77c4a5d6f51709620c0aab4e51f108ccece6adc56f" 2874 | dependencies = [ 2875 | "environmental", 2876 | "parity-scale-codec", 2877 | "sp-std", 2878 | "sp-storage", 2879 | ] 2880 | 2881 | [[package]] 2882 | name = "sp-io" 2883 | version = "6.0.0" 2884 | source = "registry+https://github.com/rust-lang/crates.io-index" 2885 | checksum = "935fd3c71bad6811a7984cabb74d323b8ca3107024024c3eabb610e0182ba8d3" 2886 | dependencies = [ 2887 | "futures", 2888 | "hash-db", 2889 | "libsecp256k1", 2890 | "log", 2891 | "parity-scale-codec", 2892 | "parking_lot", 2893 | "secp256k1", 2894 | "sp-core", 2895 | "sp-externalities", 2896 | "sp-keystore", 2897 | "sp-runtime-interface", 2898 | "sp-state-machine", 2899 | "sp-std", 2900 | "sp-tracing", 2901 | "sp-trie", 2902 | "sp-wasm-interface", 2903 | "tracing", 2904 | "tracing-core", 2905 | ] 2906 | 2907 | [[package]] 2908 | name = "sp-keystore" 2909 | version = "0.12.0" 2910 | source = "registry+https://github.com/rust-lang/crates.io-index" 2911 | checksum = "3261eddca8c8926e3e1de136a7980cb3afc3455247d9d6f3119d9b292f73aaee" 2912 | dependencies = [ 2913 | "async-trait", 2914 | "futures", 2915 | "merlin", 2916 | "parity-scale-codec", 2917 | "parking_lot", 2918 | "schnorrkel", 2919 | "sp-core", 2920 | "sp-externalities", 2921 | "thiserror", 2922 | ] 2923 | 2924 | [[package]] 2925 | name = "sp-panic-handler" 2926 | version = "4.0.0" 2927 | source = "registry+https://github.com/rust-lang/crates.io-index" 2928 | checksum = "2101f3c555fceafcfcfb0e61c55ea9ed80dc60bd77d54d9f25b369edb029e9a4" 2929 | dependencies = [ 2930 | "backtrace", 2931 | "lazy_static", 2932 | "regex", 2933 | ] 2934 | 2935 | [[package]] 2936 | name = "sp-runtime" 2937 | version = "6.0.0" 2938 | source = "registry+https://github.com/rust-lang/crates.io-index" 2939 | checksum = "bb7d8a8d5ab5d349c6cf9300af1721b7b6446ba63401dbb11c10a1d65197aa5f" 2940 | dependencies = [ 2941 | "either", 2942 | "hash256-std-hasher", 2943 | "impl-trait-for-tuples", 2944 | "log", 2945 | "parity-scale-codec", 2946 | "parity-util-mem", 2947 | "paste", 2948 | "rand 0.7.3", 2949 | "scale-info", 2950 | "serde", 2951 | "sp-application-crypto", 2952 | "sp-arithmetic", 2953 | "sp-core", 2954 | "sp-io", 2955 | "sp-std", 2956 | ] 2957 | 2958 | [[package]] 2959 | name = "sp-runtime-interface" 2960 | version = "6.0.0" 2961 | source = "registry+https://github.com/rust-lang/crates.io-index" 2962 | checksum = "158bf0305c75a50fc0e334b889568f519a126e32b87900c3f4251202dece7b4b" 2963 | dependencies = [ 2964 | "impl-trait-for-tuples", 2965 | "parity-scale-codec", 2966 | "primitive-types", 2967 | "sp-externalities", 2968 | "sp-runtime-interface-proc-macro", 2969 | "sp-std", 2970 | "sp-storage", 2971 | "sp-tracing", 2972 | "sp-wasm-interface", 2973 | "static_assertions", 2974 | ] 2975 | 2976 | [[package]] 2977 | name = "sp-runtime-interface-proc-macro" 2978 | version = "5.0.0" 2979 | source = "registry+https://github.com/rust-lang/crates.io-index" 2980 | checksum = "22ecb916b9664ed9f90abef0ff5a3e61454c1efea5861b2997e03f39b59b955f" 2981 | dependencies = [ 2982 | "Inflector", 2983 | "proc-macro-crate", 2984 | "proc-macro2", 2985 | "quote", 2986 | "syn", 2987 | ] 2988 | 2989 | [[package]] 2990 | name = "sp-state-machine" 2991 | version = "0.12.0" 2992 | source = "registry+https://github.com/rust-lang/crates.io-index" 2993 | checksum = "ecee3b33eb78c99997676a571656bcc35db6886abecfddd13e76a73b5871c6c1" 2994 | dependencies = [ 2995 | "hash-db", 2996 | "log", 2997 | "num-traits", 2998 | "parity-scale-codec", 2999 | "parking_lot", 3000 | "rand 0.7.3", 3001 | "smallvec", 3002 | "sp-core", 3003 | "sp-externalities", 3004 | "sp-panic-handler", 3005 | "sp-std", 3006 | "sp-trie", 3007 | "thiserror", 3008 | "tracing", 3009 | "trie-db", 3010 | "trie-root", 3011 | ] 3012 | 3013 | [[package]] 3014 | name = "sp-std" 3015 | version = "4.0.0" 3016 | source = "registry+https://github.com/rust-lang/crates.io-index" 3017 | checksum = "14804d6069ee7a388240b665f17908d98386ffb0b5d39f89a4099fc7a2a4c03f" 3018 | 3019 | [[package]] 3020 | name = "sp-storage" 3021 | version = "6.0.0" 3022 | source = "registry+https://github.com/rust-lang/crates.io-index" 3023 | checksum = "5dab53af846068e3e0716d3ccc70ea0db44035c79b2ed5821aaa6635039efa37" 3024 | dependencies = [ 3025 | "impl-serde", 3026 | "parity-scale-codec", 3027 | "ref-cast", 3028 | "serde", 3029 | "sp-debug-derive", 3030 | "sp-std", 3031 | ] 3032 | 3033 | [[package]] 3034 | name = "sp-tracing" 3035 | version = "5.0.0" 3036 | source = "registry+https://github.com/rust-lang/crates.io-index" 3037 | checksum = "69a67e555d171c4238bd223393cda747dd20ec7d4f5fe5c042c056cb7fde9eda" 3038 | dependencies = [ 3039 | "parity-scale-codec", 3040 | "sp-std", 3041 | "tracing", 3042 | "tracing-core", 3043 | "tracing-subscriber", 3044 | ] 3045 | 3046 | [[package]] 3047 | name = "sp-trie" 3048 | version = "6.0.0" 3049 | source = "registry+https://github.com/rust-lang/crates.io-index" 3050 | checksum = "d6fc34f4f291886914733e083b62708d829f3e6b8d7a7ca7fa8a55a3d7640b0b" 3051 | dependencies = [ 3052 | "hash-db", 3053 | "memory-db", 3054 | "parity-scale-codec", 3055 | "scale-info", 3056 | "sp-core", 3057 | "sp-std", 3058 | "trie-db", 3059 | "trie-root", 3060 | ] 3061 | 3062 | [[package]] 3063 | name = "sp-wasm-interface" 3064 | version = "6.0.0" 3065 | source = "registry+https://github.com/rust-lang/crates.io-index" 3066 | checksum = "10d88debe690c2b24eaa9536a150334fcef2ae184c21a0e5b3e80135407a7d52" 3067 | dependencies = [ 3068 | "impl-trait-for-tuples", 3069 | "log", 3070 | "parity-scale-codec", 3071 | "sp-std", 3072 | "wasmi", 3073 | ] 3074 | 3075 | [[package]] 3076 | name = "spin" 3077 | version = "0.5.2" 3078 | source = "registry+https://github.com/rust-lang/crates.io-index" 3079 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 3080 | 3081 | [[package]] 3082 | name = "ss58-registry" 3083 | version = "1.28.0" 3084 | source = "registry+https://github.com/rust-lang/crates.io-index" 3085 | checksum = "1c8a1e645fa0bd3e81a90e592a677f7ada3182ac338c4a71cd9ec0ba911f6abb" 3086 | dependencies = [ 3087 | "Inflector", 3088 | "num-format", 3089 | "proc-macro2", 3090 | "quote", 3091 | "serde", 3092 | "serde_json", 3093 | "unicode-xid", 3094 | ] 3095 | 3096 | [[package]] 3097 | name = "static_assertions" 3098 | version = "1.1.0" 3099 | source = "registry+https://github.com/rust-lang/crates.io-index" 3100 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3101 | 3102 | [[package]] 3103 | name = "strsim" 3104 | version = "0.10.0" 3105 | source = "registry+https://github.com/rust-lang/crates.io-index" 3106 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 3107 | 3108 | [[package]] 3109 | name = "substrate-bip39" 3110 | version = "0.4.4" 3111 | source = "registry+https://github.com/rust-lang/crates.io-index" 3112 | checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" 3113 | dependencies = [ 3114 | "hmac 0.11.0", 3115 | "pbkdf2 0.8.0", 3116 | "schnorrkel", 3117 | "sha2 0.9.9", 3118 | "zeroize", 3119 | ] 3120 | 3121 | [[package]] 3122 | name = "subtle" 3123 | version = "2.4.1" 3124 | source = "registry+https://github.com/rust-lang/crates.io-index" 3125 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 3126 | 3127 | [[package]] 3128 | name = "subxt" 3129 | version = "0.24.0" 3130 | source = "git+https://github.com/paritytech/subxt?rev=51179a8b72472d0b43c91cda75a1ddc3fddb9555#51179a8b72472d0b43c91cda75a1ddc3fddb9555" 3131 | dependencies = [ 3132 | "bitvec", 3133 | "derivative", 3134 | "frame-metadata", 3135 | "futures", 3136 | "hex", 3137 | "jsonrpsee", 3138 | "parity-scale-codec", 3139 | "parking_lot", 3140 | "scale-decode", 3141 | "scale-info", 3142 | "scale-value", 3143 | "serde", 3144 | "serde_json", 3145 | "sp-core", 3146 | "sp-runtime", 3147 | "subxt-macro", 3148 | "subxt-metadata", 3149 | "thiserror", 3150 | "tracing", 3151 | ] 3152 | 3153 | [[package]] 3154 | name = "subxt-codegen" 3155 | version = "0.24.0" 3156 | source = "git+https://github.com/paritytech/subxt?rev=51179a8b72472d0b43c91cda75a1ddc3fddb9555#51179a8b72472d0b43c91cda75a1ddc3fddb9555" 3157 | dependencies = [ 3158 | "darling", 3159 | "frame-metadata", 3160 | "heck", 3161 | "parity-scale-codec", 3162 | "proc-macro-error", 3163 | "proc-macro2", 3164 | "quote", 3165 | "scale-info", 3166 | "subxt-metadata", 3167 | "syn", 3168 | ] 3169 | 3170 | [[package]] 3171 | name = "subxt-macro" 3172 | version = "0.24.0" 3173 | source = "git+https://github.com/paritytech/subxt?rev=51179a8b72472d0b43c91cda75a1ddc3fddb9555#51179a8b72472d0b43c91cda75a1ddc3fddb9555" 3174 | dependencies = [ 3175 | "darling", 3176 | "proc-macro-error", 3177 | "subxt-codegen", 3178 | "syn", 3179 | ] 3180 | 3181 | [[package]] 3182 | name = "subxt-metadata" 3183 | version = "0.24.0" 3184 | source = "git+https://github.com/paritytech/subxt?rev=51179a8b72472d0b43c91cda75a1ddc3fddb9555#51179a8b72472d0b43c91cda75a1ddc3fddb9555" 3185 | dependencies = [ 3186 | "frame-metadata", 3187 | "parity-scale-codec", 3188 | "scale-info", 3189 | "sp-core", 3190 | ] 3191 | 3192 | [[package]] 3193 | name = "syn" 3194 | version = "1.0.99" 3195 | source = "registry+https://github.com/rust-lang/crates.io-index" 3196 | checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 3197 | dependencies = [ 3198 | "proc-macro2", 3199 | "quote", 3200 | "unicode-ident", 3201 | ] 3202 | 3203 | [[package]] 3204 | name = "synstructure" 3205 | version = "0.12.6" 3206 | source = "registry+https://github.com/rust-lang/crates.io-index" 3207 | checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" 3208 | dependencies = [ 3209 | "proc-macro2", 3210 | "quote", 3211 | "syn", 3212 | "unicode-xid", 3213 | ] 3214 | 3215 | [[package]] 3216 | name = "tap" 3217 | version = "1.0.1" 3218 | source = "registry+https://github.com/rust-lang/crates.io-index" 3219 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 3220 | 3221 | [[package]] 3222 | name = "temp-dir" 3223 | version = "0.1.11" 3224 | source = "registry+https://github.com/rust-lang/crates.io-index" 3225 | checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab" 3226 | 3227 | [[package]] 3228 | name = "tempfile" 3229 | version = "3.3.0" 3230 | source = "registry+https://github.com/rust-lang/crates.io-index" 3231 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 3232 | dependencies = [ 3233 | "cfg-if", 3234 | "fastrand", 3235 | "libc", 3236 | "redox_syscall", 3237 | "remove_dir_all", 3238 | "winapi", 3239 | ] 3240 | 3241 | [[package]] 3242 | name = "thiserror" 3243 | version = "1.0.33" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "3d0a539a918745651435ac7db7a18761589a94cd7e94cd56999f828bf73c8a57" 3246 | dependencies = [ 3247 | "thiserror-impl", 3248 | ] 3249 | 3250 | [[package]] 3251 | name = "thiserror-impl" 3252 | version = "1.0.33" 3253 | source = "registry+https://github.com/rust-lang/crates.io-index" 3254 | checksum = "c251e90f708e16c49a16f4917dc2131e75222b72edfa9cb7f7c58ae56aae0c09" 3255 | dependencies = [ 3256 | "proc-macro2", 3257 | "quote", 3258 | "syn", 3259 | ] 3260 | 3261 | [[package]] 3262 | name = "thread_local" 3263 | version = "1.1.4" 3264 | source = "registry+https://github.com/rust-lang/crates.io-index" 3265 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 3266 | dependencies = [ 3267 | "once_cell", 3268 | ] 3269 | 3270 | [[package]] 3271 | name = "tiger" 3272 | version = "0.1.0" 3273 | source = "registry+https://github.com/rust-lang/crates.io-index" 3274 | checksum = "443e531cbcf9de83258cfef70bcd56c91188de5819ebd4b19c85f589e0617005" 3275 | dependencies = [ 3276 | "block-buffer 0.9.0", 3277 | "byteorder", 3278 | "digest 0.9.0", 3279 | ] 3280 | 3281 | [[package]] 3282 | name = "tiny-bip39" 3283 | version = "0.8.2" 3284 | source = "registry+https://github.com/rust-lang/crates.io-index" 3285 | checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" 3286 | dependencies = [ 3287 | "anyhow", 3288 | "hmac 0.8.1", 3289 | "once_cell", 3290 | "pbkdf2 0.4.0", 3291 | "rand 0.7.3", 3292 | "rustc-hash", 3293 | "sha2 0.9.9", 3294 | "thiserror", 3295 | "unicode-normalization", 3296 | "wasm-bindgen", 3297 | "zeroize", 3298 | ] 3299 | 3300 | [[package]] 3301 | name = "tiny-keccak" 3302 | version = "2.0.2" 3303 | source = "registry+https://github.com/rust-lang/crates.io-index" 3304 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 3305 | dependencies = [ 3306 | "crunchy", 3307 | ] 3308 | 3309 | [[package]] 3310 | name = "tinyvec" 3311 | version = "1.6.0" 3312 | source = "registry+https://github.com/rust-lang/crates.io-index" 3313 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3314 | dependencies = [ 3315 | "tinyvec_macros", 3316 | ] 3317 | 3318 | [[package]] 3319 | name = "tinyvec_macros" 3320 | version = "0.1.0" 3321 | source = "registry+https://github.com/rust-lang/crates.io-index" 3322 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 3323 | 3324 | [[package]] 3325 | name = "tokio" 3326 | version = "1.21.0" 3327 | source = "registry+https://github.com/rust-lang/crates.io-index" 3328 | checksum = "89797afd69d206ccd11fb0ea560a44bbb87731d020670e79416d442919257d42" 3329 | dependencies = [ 3330 | "autocfg", 3331 | "bytes", 3332 | "libc", 3333 | "memchr", 3334 | "mio", 3335 | "num_cpus", 3336 | "once_cell", 3337 | "pin-project-lite", 3338 | "signal-hook-registry", 3339 | "socket2", 3340 | "tokio-macros", 3341 | "winapi", 3342 | ] 3343 | 3344 | [[package]] 3345 | name = "tokio-macros" 3346 | version = "1.8.0" 3347 | source = "registry+https://github.com/rust-lang/crates.io-index" 3348 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 3349 | dependencies = [ 3350 | "proc-macro2", 3351 | "quote", 3352 | "syn", 3353 | ] 3354 | 3355 | [[package]] 3356 | name = "tokio-native-tls" 3357 | version = "0.3.0" 3358 | source = "registry+https://github.com/rust-lang/crates.io-index" 3359 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 3360 | dependencies = [ 3361 | "native-tls", 3362 | "tokio", 3363 | ] 3364 | 3365 | [[package]] 3366 | name = "tokio-rustls" 3367 | version = "0.23.4" 3368 | source = "registry+https://github.com/rust-lang/crates.io-index" 3369 | checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" 3370 | dependencies = [ 3371 | "rustls", 3372 | "tokio", 3373 | "webpki", 3374 | ] 3375 | 3376 | [[package]] 3377 | name = "tokio-util" 3378 | version = "0.6.10" 3379 | source = "registry+https://github.com/rust-lang/crates.io-index" 3380 | checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" 3381 | dependencies = [ 3382 | "bytes", 3383 | "futures-core", 3384 | "futures-sink", 3385 | "log", 3386 | "pin-project-lite", 3387 | "tokio", 3388 | ] 3389 | 3390 | [[package]] 3391 | name = "tokio-util" 3392 | version = "0.7.3" 3393 | source = "registry+https://github.com/rust-lang/crates.io-index" 3394 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 3395 | dependencies = [ 3396 | "bytes", 3397 | "futures-core", 3398 | "futures-io", 3399 | "futures-sink", 3400 | "pin-project-lite", 3401 | "tokio", 3402 | "tracing", 3403 | ] 3404 | 3405 | [[package]] 3406 | name = "toml" 3407 | version = "0.5.9" 3408 | source = "registry+https://github.com/rust-lang/crates.io-index" 3409 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 3410 | dependencies = [ 3411 | "serde", 3412 | ] 3413 | 3414 | [[package]] 3415 | name = "tower-service" 3416 | version = "0.3.2" 3417 | source = "registry+https://github.com/rust-lang/crates.io-index" 3418 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3419 | 3420 | [[package]] 3421 | name = "tracing" 3422 | version = "0.1.36" 3423 | source = "registry+https://github.com/rust-lang/crates.io-index" 3424 | checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" 3425 | dependencies = [ 3426 | "cfg-if", 3427 | "pin-project-lite", 3428 | "tracing-attributes", 3429 | "tracing-core", 3430 | ] 3431 | 3432 | [[package]] 3433 | name = "tracing-attributes" 3434 | version = "0.1.22" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" 3437 | dependencies = [ 3438 | "proc-macro2", 3439 | "quote", 3440 | "syn", 3441 | ] 3442 | 3443 | [[package]] 3444 | name = "tracing-core" 3445 | version = "0.1.29" 3446 | source = "registry+https://github.com/rust-lang/crates.io-index" 3447 | checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" 3448 | dependencies = [ 3449 | "once_cell", 3450 | "valuable", 3451 | ] 3452 | 3453 | [[package]] 3454 | name = "tracing-futures" 3455 | version = "0.2.5" 3456 | source = "registry+https://github.com/rust-lang/crates.io-index" 3457 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 3458 | dependencies = [ 3459 | "pin-project", 3460 | "tracing", 3461 | ] 3462 | 3463 | [[package]] 3464 | name = "tracing-log" 3465 | version = "0.1.3" 3466 | source = "registry+https://github.com/rust-lang/crates.io-index" 3467 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 3468 | dependencies = [ 3469 | "lazy_static", 3470 | "log", 3471 | "tracing-core", 3472 | ] 3473 | 3474 | [[package]] 3475 | name = "tracing-serde" 3476 | version = "0.1.3" 3477 | source = "registry+https://github.com/rust-lang/crates.io-index" 3478 | checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" 3479 | dependencies = [ 3480 | "serde", 3481 | "tracing-core", 3482 | ] 3483 | 3484 | [[package]] 3485 | name = "tracing-subscriber" 3486 | version = "0.2.25" 3487 | source = "registry+https://github.com/rust-lang/crates.io-index" 3488 | checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" 3489 | dependencies = [ 3490 | "ansi_term", 3491 | "chrono", 3492 | "lazy_static", 3493 | "matchers", 3494 | "regex", 3495 | "serde", 3496 | "serde_json", 3497 | "sharded-slab", 3498 | "smallvec", 3499 | "thread_local", 3500 | "tracing", 3501 | "tracing-core", 3502 | "tracing-log", 3503 | "tracing-serde", 3504 | ] 3505 | 3506 | [[package]] 3507 | name = "trie-db" 3508 | version = "0.23.1" 3509 | source = "registry+https://github.com/rust-lang/crates.io-index" 3510 | checksum = "d32d034c0d3db64b43c31de38e945f15b40cd4ca6d2dcfc26d4798ce8de4ab83" 3511 | dependencies = [ 3512 | "hash-db", 3513 | "hashbrown", 3514 | "log", 3515 | "rustc-hex", 3516 | "smallvec", 3517 | ] 3518 | 3519 | [[package]] 3520 | name = "trie-root" 3521 | version = "0.17.0" 3522 | source = "registry+https://github.com/rust-lang/crates.io-index" 3523 | checksum = "9a36c5ca3911ed3c9a5416ee6c679042064b93fc637ded67e25f92e68d783891" 3524 | dependencies = [ 3525 | "hash-db", 3526 | ] 3527 | 3528 | [[package]] 3529 | name = "try-lock" 3530 | version = "0.2.3" 3531 | source = "registry+https://github.com/rust-lang/crates.io-index" 3532 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 3533 | 3534 | [[package]] 3535 | name = "twox-hash" 3536 | version = "1.6.3" 3537 | source = "registry+https://github.com/rust-lang/crates.io-index" 3538 | checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" 3539 | dependencies = [ 3540 | "cfg-if", 3541 | "rand 0.8.5", 3542 | "static_assertions", 3543 | ] 3544 | 3545 | [[package]] 3546 | name = "typed-builder" 3547 | version = "0.10.0" 3548 | source = "registry+https://github.com/rust-lang/crates.io-index" 3549 | checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" 3550 | dependencies = [ 3551 | "proc-macro2", 3552 | "quote", 3553 | "syn", 3554 | ] 3555 | 3556 | [[package]] 3557 | name = "typenum" 3558 | version = "1.15.0" 3559 | source = "registry+https://github.com/rust-lang/crates.io-index" 3560 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 3561 | 3562 | [[package]] 3563 | name = "uint" 3564 | version = "0.9.3" 3565 | source = "registry+https://github.com/rust-lang/crates.io-index" 3566 | checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" 3567 | dependencies = [ 3568 | "byteorder", 3569 | "crunchy", 3570 | "hex", 3571 | "static_assertions", 3572 | ] 3573 | 3574 | [[package]] 3575 | name = "unicase" 3576 | version = "2.6.0" 3577 | source = "registry+https://github.com/rust-lang/crates.io-index" 3578 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 3579 | dependencies = [ 3580 | "version_check", 3581 | ] 3582 | 3583 | [[package]] 3584 | name = "unicode-bidi" 3585 | version = "0.3.8" 3586 | source = "registry+https://github.com/rust-lang/crates.io-index" 3587 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 3588 | 3589 | [[package]] 3590 | name = "unicode-ident" 3591 | version = "1.0.3" 3592 | source = "registry+https://github.com/rust-lang/crates.io-index" 3593 | checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 3594 | 3595 | [[package]] 3596 | name = "unicode-normalization" 3597 | version = "0.1.21" 3598 | source = "registry+https://github.com/rust-lang/crates.io-index" 3599 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 3600 | dependencies = [ 3601 | "tinyvec", 3602 | ] 3603 | 3604 | [[package]] 3605 | name = "unicode-xid" 3606 | version = "0.2.3" 3607 | source = "registry+https://github.com/rust-lang/crates.io-index" 3608 | checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" 3609 | 3610 | [[package]] 3611 | name = "unsigned-varint" 3612 | version = "0.5.1" 3613 | source = "registry+https://github.com/rust-lang/crates.io-index" 3614 | checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" 3615 | 3616 | [[package]] 3617 | name = "unsigned-varint" 3618 | version = "0.7.1" 3619 | source = "registry+https://github.com/rust-lang/crates.io-index" 3620 | checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" 3621 | 3622 | [[package]] 3623 | name = "untrusted" 3624 | version = "0.7.1" 3625 | source = "registry+https://github.com/rust-lang/crates.io-index" 3626 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 3627 | 3628 | [[package]] 3629 | name = "url" 3630 | version = "2.2.2" 3631 | source = "registry+https://github.com/rust-lang/crates.io-index" 3632 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 3633 | dependencies = [ 3634 | "form_urlencoded", 3635 | "idna", 3636 | "matches", 3637 | "percent-encoding", 3638 | ] 3639 | 3640 | [[package]] 3641 | name = "valuable" 3642 | version = "0.1.0" 3643 | source = "registry+https://github.com/rust-lang/crates.io-index" 3644 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3645 | 3646 | [[package]] 3647 | name = "vcpkg" 3648 | version = "0.2.15" 3649 | source = "registry+https://github.com/rust-lang/crates.io-index" 3650 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3651 | 3652 | [[package]] 3653 | name = "version_check" 3654 | version = "0.9.4" 3655 | source = "registry+https://github.com/rust-lang/crates.io-index" 3656 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3657 | 3658 | [[package]] 3659 | name = "walkdir" 3660 | version = "2.3.2" 3661 | source = "registry+https://github.com/rust-lang/crates.io-index" 3662 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 3663 | dependencies = [ 3664 | "same-file", 3665 | "winapi", 3666 | "winapi-util", 3667 | ] 3668 | 3669 | [[package]] 3670 | name = "want" 3671 | version = "0.3.0" 3672 | source = "registry+https://github.com/rust-lang/crates.io-index" 3673 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 3674 | dependencies = [ 3675 | "log", 3676 | "try-lock", 3677 | ] 3678 | 3679 | [[package]] 3680 | name = "wasi" 3681 | version = "0.9.0+wasi-snapshot-preview1" 3682 | source = "registry+https://github.com/rust-lang/crates.io-index" 3683 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 3684 | 3685 | [[package]] 3686 | name = "wasi" 3687 | version = "0.11.0+wasi-snapshot-preview1" 3688 | source = "registry+https://github.com/rust-lang/crates.io-index" 3689 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3690 | 3691 | [[package]] 3692 | name = "wasm-bindgen" 3693 | version = "0.2.82" 3694 | source = "registry+https://github.com/rust-lang/crates.io-index" 3695 | checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" 3696 | dependencies = [ 3697 | "cfg-if", 3698 | "wasm-bindgen-macro", 3699 | ] 3700 | 3701 | [[package]] 3702 | name = "wasm-bindgen-backend" 3703 | version = "0.2.82" 3704 | source = "registry+https://github.com/rust-lang/crates.io-index" 3705 | checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" 3706 | dependencies = [ 3707 | "bumpalo", 3708 | "log", 3709 | "once_cell", 3710 | "proc-macro2", 3711 | "quote", 3712 | "syn", 3713 | "wasm-bindgen-shared", 3714 | ] 3715 | 3716 | [[package]] 3717 | name = "wasm-bindgen-futures" 3718 | version = "0.4.32" 3719 | source = "registry+https://github.com/rust-lang/crates.io-index" 3720 | checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" 3721 | dependencies = [ 3722 | "cfg-if", 3723 | "js-sys", 3724 | "wasm-bindgen", 3725 | "web-sys", 3726 | ] 3727 | 3728 | [[package]] 3729 | name = "wasm-bindgen-macro" 3730 | version = "0.2.82" 3731 | source = "registry+https://github.com/rust-lang/crates.io-index" 3732 | checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" 3733 | dependencies = [ 3734 | "quote", 3735 | "wasm-bindgen-macro-support", 3736 | ] 3737 | 3738 | [[package]] 3739 | name = "wasm-bindgen-macro-support" 3740 | version = "0.2.82" 3741 | source = "registry+https://github.com/rust-lang/crates.io-index" 3742 | checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" 3743 | dependencies = [ 3744 | "proc-macro2", 3745 | "quote", 3746 | "syn", 3747 | "wasm-bindgen-backend", 3748 | "wasm-bindgen-shared", 3749 | ] 3750 | 3751 | [[package]] 3752 | name = "wasm-bindgen-shared" 3753 | version = "0.2.82" 3754 | source = "registry+https://github.com/rust-lang/crates.io-index" 3755 | checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" 3756 | 3757 | [[package]] 3758 | name = "wasmi" 3759 | version = "0.9.1" 3760 | source = "registry+https://github.com/rust-lang/crates.io-index" 3761 | checksum = "ca00c5147c319a8ec91ec1a0edbec31e566ce2c9cc93b3f9bb86a9efd0eb795d" 3762 | dependencies = [ 3763 | "downcast-rs", 3764 | "libc", 3765 | "memory_units", 3766 | "num-rational", 3767 | "num-traits", 3768 | "parity-wasm", 3769 | "wasmi-validation", 3770 | ] 3771 | 3772 | [[package]] 3773 | name = "wasmi-validation" 3774 | version = "0.4.1" 3775 | source = "registry+https://github.com/rust-lang/crates.io-index" 3776 | checksum = "165343ecd6c018fc09ebcae280752702c9a2ef3e6f8d02f1cfcbdb53ef6d7937" 3777 | dependencies = [ 3778 | "parity-wasm", 3779 | ] 3780 | 3781 | [[package]] 3782 | name = "web-sys" 3783 | version = "0.3.59" 3784 | source = "registry+https://github.com/rust-lang/crates.io-index" 3785 | checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" 3786 | dependencies = [ 3787 | "js-sys", 3788 | "wasm-bindgen", 3789 | ] 3790 | 3791 | [[package]] 3792 | name = "webpki" 3793 | version = "0.22.0" 3794 | source = "registry+https://github.com/rust-lang/crates.io-index" 3795 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 3796 | dependencies = [ 3797 | "ring", 3798 | "untrusted", 3799 | ] 3800 | 3801 | [[package]] 3802 | name = "webpki-roots" 3803 | version = "0.22.4" 3804 | source = "registry+https://github.com/rust-lang/crates.io-index" 3805 | checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" 3806 | dependencies = [ 3807 | "webpki", 3808 | ] 3809 | 3810 | [[package]] 3811 | name = "winapi" 3812 | version = "0.3.9" 3813 | source = "registry+https://github.com/rust-lang/crates.io-index" 3814 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3815 | dependencies = [ 3816 | "winapi-i686-pc-windows-gnu", 3817 | "winapi-x86_64-pc-windows-gnu", 3818 | ] 3819 | 3820 | [[package]] 3821 | name = "winapi-i686-pc-windows-gnu" 3822 | version = "0.4.0" 3823 | source = "registry+https://github.com/rust-lang/crates.io-index" 3824 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3825 | 3826 | [[package]] 3827 | name = "winapi-util" 3828 | version = "0.1.5" 3829 | source = "registry+https://github.com/rust-lang/crates.io-index" 3830 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3831 | dependencies = [ 3832 | "winapi", 3833 | ] 3834 | 3835 | [[package]] 3836 | name = "winapi-x86_64-pc-windows-gnu" 3837 | version = "0.4.0" 3838 | source = "registry+https://github.com/rust-lang/crates.io-index" 3839 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3840 | 3841 | [[package]] 3842 | name = "windows-sys" 3843 | version = "0.36.1" 3844 | source = "registry+https://github.com/rust-lang/crates.io-index" 3845 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 3846 | dependencies = [ 3847 | "windows_aarch64_msvc", 3848 | "windows_i686_gnu", 3849 | "windows_i686_msvc", 3850 | "windows_x86_64_gnu", 3851 | "windows_x86_64_msvc", 3852 | ] 3853 | 3854 | [[package]] 3855 | name = "windows_aarch64_msvc" 3856 | version = "0.36.1" 3857 | source = "registry+https://github.com/rust-lang/crates.io-index" 3858 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 3859 | 3860 | [[package]] 3861 | name = "windows_i686_gnu" 3862 | version = "0.36.1" 3863 | source = "registry+https://github.com/rust-lang/crates.io-index" 3864 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 3865 | 3866 | [[package]] 3867 | name = "windows_i686_msvc" 3868 | version = "0.36.1" 3869 | source = "registry+https://github.com/rust-lang/crates.io-index" 3870 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 3871 | 3872 | [[package]] 3873 | name = "windows_x86_64_gnu" 3874 | version = "0.36.1" 3875 | source = "registry+https://github.com/rust-lang/crates.io-index" 3876 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 3877 | 3878 | [[package]] 3879 | name = "windows_x86_64_msvc" 3880 | version = "0.36.1" 3881 | source = "registry+https://github.com/rust-lang/crates.io-index" 3882 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 3883 | 3884 | [[package]] 3885 | name = "winreg" 3886 | version = "0.10.1" 3887 | source = "registry+https://github.com/rust-lang/crates.io-index" 3888 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 3889 | dependencies = [ 3890 | "winapi", 3891 | ] 3892 | 3893 | [[package]] 3894 | name = "wyz" 3895 | version = "0.5.0" 3896 | source = "registry+https://github.com/rust-lang/crates.io-index" 3897 | checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" 3898 | dependencies = [ 3899 | "tap", 3900 | ] 3901 | 3902 | [[package]] 3903 | name = "yap" 3904 | version = "0.7.2" 3905 | source = "registry+https://github.com/rust-lang/crates.io-index" 3906 | checksum = "5fc77f52dc9e9b10d55d3f4462c3b7fc393c4f17975d641542833ab2d3bc26ef" 3907 | 3908 | [[package]] 3909 | name = "zeroize" 3910 | version = "1.5.7" 3911 | source = "registry+https://github.com/rust-lang/crates.io-index" 3912 | checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" 3913 | dependencies = [ 3914 | "zeroize_derive", 3915 | ] 3916 | 3917 | [[package]] 3918 | name = "zeroize_derive" 3919 | version = "1.3.2" 3920 | source = "registry+https://github.com/rust-lang/crates.io-index" 3921 | checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" 3922 | dependencies = [ 3923 | "proc-macro2", 3924 | "quote", 3925 | "syn", 3926 | "synstructure", 3927 | ] 3928 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "git-remote-inv4" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | #sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } 8 | #sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.29" } 9 | ipfs-api = "0.16.0" 10 | cid = "0.8.6" 11 | hex = "0.4.3" 12 | futures = "0.3.24" 13 | temp-dir = "0.1.11" 14 | git2 = { version = "0.15.0", default-features = false } 15 | log = "0.4.17" 16 | dirs = "4.0.0" 17 | serde = "1.0.144" 18 | toml = "0.5.9" 19 | twox-hash = "1.6.3" 20 | magic-crypt = "3.1.10" 21 | rpassword = "7.0.0" 22 | reqwest = { version = "0.11.12", features = ["multipart", "json"], optional = true } 23 | base64 = { version = "0.13.0", optional = true } 24 | serde_json = { version = "1.0.85", optional = true } 25 | brotli = "3.3.4" 26 | 27 | [dependencies.tokio] 28 | version = "1.20.1" 29 | features = ["macros", "rt-multi-thread", "process", "io-std"] 30 | 31 | [dependencies.subxt] 32 | git = "https://github.com/paritytech/subxt" 33 | rev = "51179a8b72472d0b43c91cda75a1ddc3fddb9555" 34 | 35 | [dependencies.codec] 36 | package = "parity-scale-codec" 37 | version = "3.2.1" 38 | default-features = false 39 | features = ["derive", "full", "bit-vec"] 40 | 41 | 42 | [features] 43 | default = [] 44 | crust = ["reqwest", "base64", "serde_json"] 45 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | install: 2 | cargo install --path . 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # INV4-Git 2 | A Git helper that integrates the [INV4](https://github.com/InvArch/InvArch-Frames/tree/main/INV4) protocol with the Git protocol for blockchain-based git hosting & version-contol 3 | 4 | ## Installing 5 | Make sure you already have `cargo` and `rust` installed. Then: 6 | ```sh 7 | cargo install --git https://github.com/InvArch/INV4-Git --features crust 8 | ``` 9 | The binary will be installed at `~/.cargo/bin/` as `git-remote-inv4` 10 | 11 | ## Testing 12 | Testing requires running an IPFS node, running a local InvArch node and creating an IP Set on it. 13 | 14 | ### Running the local IPFS node: 15 | Install the ipfs cli binary from a package manager, or follow the instructions on the [IPFS documentation](http://docs.ipfs.tech.ipns.localhost:8080/install/command-line/#linux) to get the binary installed in your system. 16 | 17 | After you installed the IPFS cli tool, open a terminal and run the following commands: 18 | ```sh 19 | ipfs init 20 | ipfs daemon 21 | ``` 22 | Now set that terminal aside, it will run the IPFS node until you manually kill it or close the terminal. 23 | 24 | 25 | ### Running the local InvArch node: 26 | On a new terminal, run the following: 27 | ```sh 28 | git clone https://github.com/InvArch/InvArch-Node 29 | cd InvArch-Node 30 | make build 31 | make run-solo-alice 32 | ``` 33 | 34 | Now that you have built the node binary and that terminal is running a collator, open a second terminal on the same location, and run another collator with the following command: 35 | ```sh 36 | make run-solo-bob 37 | ``` 38 | 39 | A development node will start running and should be accessible from `ws://127.0.0.1:9944` (or directly in polkadot.js at https://polkadot.js.org/?rpc=ws://127.0.0.1:9944) 40 | You can now set these terminals aside too. 41 | 42 | ### Sending tokens to your account 43 | You're gonna need an account for which you have the seed phrase on hand, you can create a new account for this. 44 | To send tokens to that account, follow these steps: 45 | 1. Go to this page in polkadot.js: https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/accounts 46 | 2. On the tabs, hover over the accounts tab and click transfer, as shown in the image: ![](images/tabs.png) 47 | 3. Select Alice as the sender account in the first field. 48 | 4. Paste your account in the second field and an arbitrary amount in the third field, 100 in the case of the example: ![](images/transfer.png) 49 | 5. Click the make transfer button and confirm the transaction. 50 | 51 | ### Creating the IP Set 52 | 1. Open the pre-made extrinsic in polkadot.js using the following URL: https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/extrinsics/decode/0x470038676974207265706f7369746f72790000010132010000 53 | 2. Go to the submission tab: ![](images/submission_tab.png) 54 | 3. Submit the transaction using the account that you sent tokens to. 55 | 56 | An IP Set should have been created with the ID `0` 57 | 58 | ### Using the tool 59 | Using a terminal, navigate to a directory where you'll create a new git repository and run the following commands (considering you're on Linux): 60 | ```sh 61 | mkdir test-repo 62 | cd test-repo 63 | touch test-file 64 | echo test > test-file 65 | git init 66 | git remote add origin inv4://0 67 | git add * 68 | git commit -m "First commit!" 69 | ``` 70 | 71 | This next command will send your files to the chain, it will ask for your seed phrase, just paste it in the terminal and press Enter: 72 | ```sh 73 | git push origin master 74 | ``` 75 | 76 | Now you have created a new local git repository, added some files, linked to the IPS you created on-chain and pushed your local commit to the chain! 77 | 78 | To demonstrate that it really is on-chain, go to a new directory and clone the git repo from the chain using the following command: 79 | ```sh 80 | git clone inv4://0 cloned 81 | ``` 82 | 83 | Now you can navigate inside this cloned repo and verify that it's the same as the one you pushed! 84 | -------------------------------------------------------------------------------- /images/create_ips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbstractedCo/INV4-Git/2728a610f3c6125315af3367fcb7a72dd98e2ed0/images/create_ips.png -------------------------------------------------------------------------------- /images/submission_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbstractedCo/INV4-Git/2728a610f3c6125315af3367fcb7a72dd98e2ed0/images/submission_tab.png -------------------------------------------------------------------------------- /images/tabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbstractedCo/INV4-Git/2728a610f3c6125315af3367fcb7a72dd98e2ed0/images/tabs.png -------------------------------------------------------------------------------- /images/transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbstractedCo/INV4-Git/2728a610f3c6125315af3367fcb7a72dd98e2ed0/images/transfer.png -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly-2022-09-01" 3 | components = ["clippy", "rustfmt"] 4 | -------------------------------------------------------------------------------- /src/compression.rs: -------------------------------------------------------------------------------- 1 | use std::io::prelude::*; 2 | 3 | pub fn compress_data(data: Vec) -> Vec { 4 | eprintln!("Compressing data..."); 5 | let mut compressor = brotli::CompressorReader::new(data.as_slice(), 4096, 11u32, 22u32); 6 | 7 | let mut v = vec![]; 8 | compressor.read_to_end(&mut v).unwrap(); 9 | 10 | v 11 | } 12 | 13 | pub fn decompress_data(data: Vec) -> Vec { 14 | let mut decompressor = brotli::Decompressor::new(data.as_slice(), 4096); 15 | 16 | let mut v = vec![]; 17 | decompressor.read_to_end(&mut v).unwrap(); 18 | 19 | v 20 | } 21 | -------------------------------------------------------------------------------- /src/crust.rs: -------------------------------------------------------------------------------- 1 | use crate::compression; 2 | use crate::primitives::BoxResult; 3 | use serde::{Deserialize, Serialize}; 4 | use subxt::ext::sp_core::sr25519::Pair as Sr25519Pair; 5 | use subxt::ext::sp_core::Pair; 6 | use subxt::{tx::PairSigner, PolkadotConfig}; 7 | 8 | #[derive(Debug, Serialize, Deserialize)] 9 | pub struct ResponseAdd { 10 | #[serde(alias = "Hash")] 11 | hash: String, 12 | } 13 | 14 | #[derive(Debug, Serialize, Deserialize)] 15 | pub struct RequestPin { 16 | cid: String, 17 | name: String, 18 | } 19 | 20 | #[derive(Debug, Serialize, Deserialize)] 21 | pub struct ResponsePin { 22 | status: String, 23 | } 24 | 25 | pub async fn send_to_crust( 26 | signer: &PairSigner, 27 | data: Vec, 28 | ) -> BoxResult { 29 | let signature = hex::encode( 30 | signer 31 | .signer() 32 | .sign(signer.account_id().to_string().as_bytes()) 33 | .0, 34 | ); 35 | let base64 = base64::encode(format!( 36 | "sub-{}:0x{}", 37 | signer.account_id().to_string(), 38 | signature 39 | )); 40 | 41 | let client = reqwest::Client::new(); 42 | 43 | let cid = client 44 | .post("https://gw.crustfiles.app/api/v0/add") 45 | .header("Authorization", format!("Basic {}", base64)) 46 | .multipart( 47 | reqwest::multipart::Form::new().part("file", reqwest::multipart::Part::bytes(data)), 48 | ) 49 | .send() 50 | .await? 51 | .json::() 52 | .await? 53 | .hash; 54 | 55 | if client 56 | .post("https://pin.crustcode.com/psa/pins") 57 | .header("Authorization", format!("Bearer {}", base64)) 58 | .header("Content-Type", "application/json") 59 | .body(serde_json::to_string(&RequestPin { 60 | name: cid.clone(), 61 | cid: cid.clone(), 62 | })?) 63 | .send() 64 | .await? 65 | .json::() 66 | .await? 67 | .status 68 | != "queued" 69 | { 70 | return Err("error".into()); 71 | } 72 | 73 | Ok(cid) 74 | } 75 | 76 | pub async fn get_from_crust(cid: String) -> BoxResult> { 77 | let client = reqwest::Client::new(); 78 | 79 | let data = client 80 | .get(format!("https://gw.crustfiles.app/ipfs/{}", cid)) 81 | .send() 82 | .await? 83 | .bytes() 84 | .await? 85 | .to_vec(); 86 | 87 | Ok(data) 88 | } 89 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::too_many_arguments)] 2 | 3 | use dirs::config_dir; 4 | use git2::{CredentialHelper, Repository}; 5 | use ipfs_api::IpfsClient; 6 | use log::debug; 7 | use primitives::{BoxResult, Config, RepoData}; 8 | use std::{ 9 | env::args, 10 | io::{self, BufRead, Read}, 11 | path::Path, 12 | process::Stdio, 13 | }; 14 | use subxt::{ext::sp_core::sr25519::Pair as Sr25519Pair, subxt}; 15 | use subxt::{ext::sp_core::Pair, tx::PairSigner}; 16 | use subxt::{OnlineClient, PolkadotConfig}; 17 | use tinkernet::runtime_types::{ 18 | pallet_inv4::pallet::AnyId, pallet_inv4::pallet::Call as INV4Call, 19 | pallet_utility::pallet::Call as UtilityCall, tinkernet_runtime::Call, 20 | }; 21 | use tokio::io::AsyncWriteExt; 22 | use tokio::process::Command; 23 | 24 | use magic_crypt::new_magic_crypt; 25 | use magic_crypt::MagicCryptTrait; 26 | 27 | mod compression; 28 | mod primitives; 29 | mod util; 30 | 31 | #[cfg(feature = "crust")] 32 | mod crust; 33 | 34 | #[subxt(runtime_metadata_path = "tinkernet_metadata.scale")] 35 | pub mod tinkernet {} 36 | 37 | pub async fn get_repo(ips_id: u32, api: OnlineClient) -> BoxResult { 38 | let mut ipfs_client = IpfsClient::default(); 39 | let ips_storage_address = tinkernet::storage().inv4().ip_storage(&ips_id); 40 | 41 | let data = api 42 | .storage() 43 | .fetch(&ips_storage_address, None) 44 | .await? 45 | .expect("Couldn't find this repository on-chain") 46 | .data 47 | .0; 48 | 49 | for file in data { 50 | if let AnyId::IpfId(id) = file { 51 | let ipf_storage_address = tinkernet::storage().ipf().ipf_storage(&id); 52 | 53 | let ipf_info = api 54 | .storage() 55 | .fetch(&ipf_storage_address, None) 56 | .await? 57 | .ok_or("Internal error: IPF listed from IPS does not exist")?; 58 | if String::from_utf8(ipf_info.metadata.0.clone())? == *"RepoData" { 59 | return RepoData::from_ipfs(ipf_info.data, &mut ipfs_client).await; 60 | } 61 | } 62 | } 63 | Ok(RepoData { 64 | refs: Default::default(), 65 | objects: Default::default(), 66 | }) 67 | } 68 | 69 | #[tokio::main] 70 | async fn main() -> BoxResult<()> { 71 | let raw_url = { 72 | let mut args = args(); 73 | args.next(); 74 | args.next(); 75 | 76 | args.next().ok_or("Missing url argument.")? 77 | }; 78 | git(raw_url).await 79 | } 80 | 81 | #[cfg(target_family = "unix")] 82 | fn read_input() -> std::io::Result { 83 | let mut string = String::new(); 84 | let tty = std::fs::File::open("/dev/tty")?; 85 | let mut reader = io::BufReader::new(tty); 86 | reader.read_line(&mut string)?; 87 | Ok(string.trim().to_string()) 88 | } 89 | 90 | #[cfg(target_family = "windows")] 91 | fn read_input() -> std::io::Result { 92 | let mut string = String::new(); 93 | let handle = unsafe { 94 | CreateFileA( 95 | b"CONIN$\x00".as_ptr() as *const i8, 96 | GENERIC_READ | GENERIC_WRITE, 97 | FILE_SHARE_READ | FILE_SHARE_WRITE, 98 | std::ptr::null_mut(), 99 | OPEN_EXISTING, 100 | 0, 101 | std::ptr::null_mut(), 102 | ) 103 | }; 104 | 105 | if handle == INVALID_HANDLE_VALUE { 106 | return Err(std::io::Error::last_os_error()); 107 | } 108 | 109 | let mut stream = BufReader::new(unsafe { std::fs::File::from_raw_handle(handle) }); 110 | 111 | let reader_return = reader.read_line(&mut string); 112 | 113 | // Newline for windows which otherwise prints on the same line. 114 | // println!(); 115 | 116 | if reader_return.is_err() { 117 | return Err(reader_return.unwrap_err()); 118 | } 119 | 120 | Ok(string) 121 | } 122 | 123 | async fn auth_flow() -> BoxResult { 124 | let mut cred_helper = CredentialHelper::new("https://inv4-tinkernet"); 125 | cred_helper.config(&git2::Config::open_default().unwrap()); 126 | let creds = cred_helper.execute(); 127 | 128 | Ok(if let Some((username, encrypted_seed)) = creds { 129 | let mut password = 130 | rpassword::prompt_password(format!("Enter password for {}: ", username))?; 131 | 132 | password = password.trim().to_string(); 133 | 134 | let mcrypt = new_magic_crypt!(password, 256); 135 | 136 | mcrypt.decrypt_base64_to_string(&encrypted_seed).unwrap() 137 | } else { 138 | let mut seed = rpassword::prompt_password("Enter your private key/seed phrase: ")?; 139 | 140 | let mut password = rpassword::prompt_password("Create a password: ")?; 141 | 142 | eprint!("Give this account a nickname: "); 143 | let name = read_input()?; 144 | 145 | let mut cmd = Command::new("git"); 146 | cmd.arg("credential"); 147 | cmd.arg("approve"); 148 | cmd.stdin(Stdio::piped()); 149 | cmd.stdout(Stdio::null()); 150 | cmd.stderr(Stdio::null()); 151 | 152 | let mut child = cmd.spawn().expect("failed to spawn command"); 153 | 154 | let mut stdin = child 155 | .stdin 156 | .take() 157 | .expect("child did not have a handle to stdin"); 158 | 159 | seed = seed.trim().to_string(); 160 | password = password.trim().to_string(); 161 | 162 | let mcrypt = new_magic_crypt!(password, 256); 163 | let encrypted_seed = mcrypt.encrypt_str_to_base64(&seed); 164 | 165 | stdin 166 | .write_all( 167 | format!( 168 | "protocol=https\nhost=inv4-tinkernet\nusername={}\npassword={}\n\n", 169 | &name, &encrypted_seed 170 | ) 171 | .as_bytes(), 172 | ) 173 | .await 174 | .expect("could not write to stdin"); 175 | 176 | drop(stdin); 177 | 178 | child.wait_with_output().await.unwrap(); 179 | 180 | seed 181 | }) 182 | } 183 | 184 | async fn git(raw_url: String) -> BoxResult<()> { 185 | let (ips_id, subasset_id) = { 186 | let mut url = Path::new(&raw_url).components(); 187 | url.next(); 188 | ( 189 | url.next() 190 | .ok_or("Missing IPS id. Expected: 'inv4://>ips_id<'")? 191 | .as_os_str() 192 | .to_str() 193 | .ok_or("Input was not UTF-8")? 194 | .parse::()?, 195 | if let Some(component) = url.next() { 196 | Some( 197 | component 198 | .as_os_str() 199 | .to_str() 200 | .ok_or("Input was not UTF-8")? 201 | .parse::()?, 202 | ) 203 | } else { 204 | None 205 | }, 206 | ) 207 | }; 208 | 209 | let mut config_file_path = 210 | config_dir().expect("Operating system's configs directory not found"); 211 | config_file_path.push("INV4-Git/config.toml"); 212 | 213 | std::fs::create_dir_all(config_file_path.parent().unwrap()).unwrap(); 214 | 215 | let config: Config = if config_file_path.exists() { 216 | let mut contents = String::new(); 217 | std::fs::File::options() 218 | .write(true) 219 | .read(true) 220 | .create(false) 221 | .open(config_file_path.clone())? 222 | .read_to_string(&mut contents)?; 223 | 224 | toml::from_str(&contents)? 225 | } else { 226 | Config { 227 | chain_endpoint: String::from("wss://tinker.invarch.network:443"), 228 | } 229 | }; 230 | 231 | let api = OnlineClient::::from_url(config.chain_endpoint).await?; 232 | 233 | let mut remote_repo = get_repo(ips_id, api.clone()).await?; 234 | debug!("RepoData: {:#?}", remote_repo); 235 | 236 | loop { 237 | let repo = Repository::open_from_env().unwrap(); 238 | 239 | let mut input = String::new(); 240 | io::stdin().read_line(&mut input)?; 241 | 242 | if input.is_empty() { 243 | return Ok(()); 244 | } 245 | 246 | debug!("{}", &input.clone()); 247 | 248 | let mut args = input.split_ascii_whitespace(); 249 | 250 | match (args.next(), args.next(), args.next()) { 251 | (Some("push"), Some(ref_arg), None) => { 252 | push( 253 | &api, 254 | &mut remote_repo, 255 | ips_id, 256 | subasset_id, 257 | repo, 258 | IpfsClient::default(), 259 | ref_arg, 260 | ) 261 | .await 262 | } 263 | (Some("fetch"), Some(sha), Some(name)) => { 264 | fetch( 265 | &remote_repo, 266 | &api, 267 | ips_id, 268 | repo, 269 | IpfsClient::default(), 270 | sha, 271 | name, 272 | ) 273 | .await 274 | } 275 | (Some("capabilities"), None, None) => capabilities(), 276 | (Some("list"), _, None) => list(&remote_repo), 277 | (None, None, None) => Ok(()), 278 | _ => { 279 | eprintln!("unknown command\n"); 280 | Ok(()) 281 | } 282 | }?; 283 | } 284 | } 285 | 286 | async fn push( 287 | api: &OnlineClient, 288 | remote_repo: &mut RepoData, 289 | ips_id: u32, 290 | subasset_id: Option, 291 | mut repo: Repository, 292 | mut ipfs: IpfsClient, 293 | ref_arg: &str, 294 | ) -> BoxResult<()> { 295 | let seed = auth_flow().await.unwrap(); 296 | 297 | let pair = Sr25519Pair::from_string(&seed, None).expect("Invalid credentials"); 298 | let signer = PairSigner::new(pair); 299 | 300 | // Separate source, destination and the force flag 301 | let mut refspec_iter = ref_arg.split(':'); 302 | 303 | let first_half = refspec_iter 304 | .next() 305 | .ok_or_else(|| eprintln!("Could not read source ref from refspec: {:?}", ref_arg)) 306 | .unwrap(); 307 | 308 | let force = first_half.starts_with('+'); 309 | 310 | let src = if force { 311 | eprintln!("THIS PUSH WILL BE FORCED"); 312 | &first_half[1..] 313 | } else { 314 | first_half 315 | }; 316 | 317 | let dst = refspec_iter 318 | .next() 319 | .ok_or_else(|| eprintln!("Could not read destination ref from refspec: {:?}", ref_arg)) 320 | .unwrap(); 321 | 322 | // Upload the object tree 323 | match remote_repo 324 | .push_ref_from_str(src, dst, force, &mut repo, &mut ipfs, api, &signer, ips_id) 325 | .await 326 | { 327 | Ok(pack_ipf_id) => { 328 | let (new_repo_data, old_repo_data) = remote_repo 329 | .mint_return_new_old_id(&mut ipfs, api, &signer, ips_id) 330 | .await?; 331 | 332 | let mut calls: Vec = vec![]; 333 | 334 | if let Some(old_id) = old_repo_data { 335 | eprintln!("Removing old Repo Data with IPF ID: {}", old_id); 336 | 337 | calls.push(Call::INV4(INV4Call::remove { 338 | ips_id, 339 | original_caller: Some(signer.account_id().clone()), 340 | assets: vec![(AnyId::IpfId(old_id), signer.account_id().clone())], 341 | new_metadata: None, 342 | })); 343 | } 344 | 345 | eprintln!( 346 | "Appending new objects and repo data to repository under IPS ID: {}", 347 | ips_id 348 | ); 349 | 350 | calls.push(Call::INV4(INV4Call::append { 351 | ips_id, 352 | original_caller: Some(signer.account_id().clone()), 353 | assets: vec![AnyId::IpfId(pack_ipf_id), AnyId::IpfId(new_repo_data)], //ipf_id_list.into_iter().map(AnyId::IpfId).collect(), 354 | new_metadata: None, 355 | })); 356 | 357 | let batch_call = Call::Utility(UtilityCall::batch_all { calls }); 358 | 359 | let multisig_batch_tx = tinkernet::tx().inv4().operate_multisig( 360 | true, 361 | (ips_id, subasset_id), 362 | Some(b"{\"protocol\":\"inv4-git\",\"type\":\"push\"}".to_vec()), 363 | batch_call, 364 | ); 365 | 366 | api.tx() 367 | .sign_and_submit_then_watch_default(&multisig_batch_tx, &signer) 368 | .await? 369 | .wait_for_in_block() 370 | .await?; 371 | 372 | eprintln!("New objects successfully appended to on-chain repository!"); 373 | 374 | println!("ok {}", dst); 375 | } 376 | Err(e) => { 377 | println!("error {} \"{}\"", dst, e); 378 | } 379 | } 380 | 381 | println!(); 382 | Ok(()) 383 | } 384 | 385 | async fn fetch( 386 | remote_repo: &RepoData, 387 | api: &OnlineClient, 388 | ips_id: u32, 389 | mut repo: Repository, 390 | mut ipfs: IpfsClient, 391 | sha: &str, 392 | name: &str, 393 | ) -> BoxResult<()> { 394 | remote_repo 395 | .fetch_to_ref_from_str(sha, name, &mut repo, &mut ipfs, api, ips_id) 396 | .await?; 397 | 398 | tokio::io::stdout().write_all(b"\n").await?; 399 | 400 | Ok(()) 401 | } 402 | 403 | fn capabilities() -> BoxResult<()> { 404 | println!("push"); 405 | println!("fetch\n"); 406 | Ok(()) 407 | } 408 | 409 | fn list(remote_repo: &RepoData) -> BoxResult<()> { 410 | for (name, git_hash) in &remote_repo.refs { 411 | let output = format!("{} {}", git_hash, name); 412 | println!("{}", output); 413 | } 414 | println!(); 415 | 416 | Ok(()) 417 | } 418 | -------------------------------------------------------------------------------- /src/primitives.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | compression::{compress_data, decompress_data}, 3 | error, 4 | tinkernet::{self, runtime_types::pallet_inv4::pallet::AnyId}, 5 | util::generate_cid, 6 | }; 7 | use cid::Cid; 8 | use codec::{Decode, Encode}; 9 | use futures::TryStreamExt; 10 | use git2::{Blob, Commit, Object, ObjectType, Odb, Oid, Repository, Tag, Tree}; 11 | use ipfs_api::{IpfsApi, IpfsClient}; 12 | use log::debug; 13 | use serde::{Deserialize, Serialize}; 14 | use std::{ 15 | collections::{BTreeMap, BTreeSet, HashSet}, 16 | error::Error, 17 | }; 18 | use subxt::{ 19 | ext::sp_core::{sr25519::Pair, H256}, 20 | tx::PairSigner, 21 | OnlineClient, PolkadotConfig, 22 | }; 23 | use twox_hash::xxh3; 24 | 25 | #[derive(Serialize, Deserialize, Clone, Debug)] 26 | pub struct Config { 27 | pub chain_endpoint: String, 28 | } 29 | 30 | /// A magic value used to signal that a hash is a submodule tip (to be obtained by git on its own). 31 | pub static SUBMODULE_TIP_MARKER: &str = "submodule-tip"; 32 | 33 | pub type BoxResult = Result>; 34 | 35 | #[derive(Clone, Debug, Encode, Decode)] 36 | pub struct MultiObject { 37 | pub hash: String, 38 | pub git_hashes: Vec, 39 | pub objects: BTreeMap, 40 | } 41 | 42 | impl MultiObject { 43 | pub fn add(&mut self, object: GitObject) { 44 | let hash = object.git_hash.clone(); 45 | self.objects.insert(hash.clone(), object); 46 | self.git_hashes.push(hash); 47 | } 48 | 49 | pub async fn chain_get( 50 | hash: String, 51 | ipfs: &mut IpfsClient, 52 | chain_api: &OnlineClient, 53 | ips_id: u32, 54 | ) -> Result> { 55 | let ips_info_address = tinkernet::storage().inv4().ip_storage(&ips_id); 56 | 57 | let ips_info = chain_api 58 | .storage() 59 | .fetch(&ips_info_address, None) 60 | .await? 61 | .ok_or(format!("IPS {ips_id} does not exist"))?; 62 | 63 | for file in ips_info.data.0 { 64 | if let AnyId::IpfId(id) = file { 65 | let ipf_info_address = tinkernet::storage().ipf().ipf_storage(&id); 66 | 67 | let ipf_info = chain_api 68 | .storage() 69 | .fetch(&ipf_info_address, None) 70 | .await? 71 | .ok_or("Internal error: IPF listed from IPS does not exist")?; 72 | 73 | if String::from_utf8(ipf_info.metadata.0.clone())? == *hash { 74 | #[cfg(not(feature = "crust"))] 75 | let data = ipfs 76 | .cat(&generate_cid(ipf_info.data.0.into())?.to_string()) 77 | .map_ok(|c| c.to_vec()) 78 | .try_concat() 79 | .await?; 80 | 81 | #[cfg(feature = "crust")] 82 | let data = crate::crust::get_from_crust( 83 | generate_cid(ipf_info.data.0.into())?.to_string(), 84 | ) 85 | .await?; 86 | 87 | return Ok(Self::decode(&mut decompress_data(data).as_slice())?); 88 | } 89 | } 90 | } 91 | error!("git_hash ipf not found") 92 | } 93 | } 94 | 95 | #[derive(Clone, Debug, Encode, Decode)] 96 | pub struct GitObject { 97 | /// The git hash of the underlying git object 98 | pub git_hash: String, 99 | /// A link to the raw form of the object 100 | pub data: Vec, 101 | /// Object-type-specific metadata 102 | pub metadata: GitObjectMetadata, 103 | } 104 | 105 | #[derive(Clone, Debug, Encode, Decode)] 106 | pub enum GitObjectMetadata { 107 | #[allow(missing_docs)] 108 | Commit { 109 | parent_git_hashes: BTreeSet, 110 | tree_git_hash: String, 111 | }, 112 | #[allow(missing_docs)] 113 | Tag { target_git_hash: String }, 114 | #[allow(missing_docs)] 115 | Tree { entry_git_hashes: BTreeSet }, 116 | #[allow(missing_docs)] 117 | Blob, 118 | } 119 | 120 | impl GitObject { 121 | pub fn from_git_blob(blob: &Blob, odb: &Odb) -> Result> { 122 | let odb_obj = odb.read(blob.id())?; 123 | 124 | Ok(Self { 125 | git_hash: blob.id().to_string(), 126 | data: odb_obj.data().to_vec(), 127 | metadata: GitObjectMetadata::Blob, 128 | }) 129 | } 130 | 131 | pub fn from_git_commit(commit: &Commit, odb: &Odb) -> Result> { 132 | let odb_obj = odb.read(commit.id())?; 133 | 134 | let parent_git_hashes: BTreeSet = commit 135 | .parent_ids() 136 | .map(|parent_id| format!("{}", parent_id)) 137 | .collect(); 138 | 139 | let tree_git_hash = format!("{}", commit.tree()?.id()); 140 | 141 | Ok(Self { 142 | git_hash: commit.id().to_string(), 143 | data: odb_obj.data().to_vec(), 144 | metadata: GitObjectMetadata::Commit { 145 | parent_git_hashes, 146 | tree_git_hash, 147 | }, 148 | }) 149 | } 150 | 151 | pub fn from_git_tag(tag: &Tag, odb: &Odb) -> Result> { 152 | let odb_obj = odb.read(tag.id())?; 153 | 154 | Ok(Self { 155 | git_hash: tag.id().to_string(), 156 | data: odb_obj.data().to_vec(), 157 | metadata: GitObjectMetadata::Tag { 158 | target_git_hash: format!("{}", tag.target_id()), 159 | }, 160 | }) 161 | } 162 | 163 | pub fn from_git_tree(tree: &Tree, odb: &Odb) -> Result> { 164 | let odb_obj = odb.read(tree.id())?; 165 | 166 | let entry_git_hashes: BTreeSet = 167 | tree.iter().map(|entry| format!("{}", entry.id())).collect(); 168 | 169 | Ok(Self { 170 | git_hash: tree.id().to_string(), 171 | data: odb_obj.data().to_vec(), 172 | metadata: GitObjectMetadata::Tree { entry_git_hashes }, 173 | }) 174 | } 175 | } 176 | 177 | #[derive(Encode, Decode, Debug, Clone)] 178 | pub struct RepoData { 179 | /// All refs this repository knows; a {name -> sha1} map 180 | pub refs: BTreeMap, 181 | /// All objects this repository contains; a {sha1 -> MultiObject hash} map 182 | pub objects: BTreeMap, 183 | } 184 | 185 | impl RepoData { 186 | pub async fn from_ipfs(ipfs_hash: H256, ipfs: &mut IpfsClient) -> Result> { 187 | let refs_cid = generate_cid(ipfs_hash)?.to_string(); 188 | 189 | #[cfg(feature = "crust")] 190 | let refs_content = crate::crust::get_from_crust(refs_cid.clone()).await?; 191 | 192 | #[cfg(not(feature = "crust"))] 193 | let refs_content = ipfs 194 | .cat(&refs_cid) 195 | .map_ok(|c| c.to_vec()) 196 | .try_concat() 197 | .await?; 198 | 199 | Ok(Self::decode(&mut decompress_data(refs_content).as_slice())?) 200 | } 201 | 202 | pub async fn push_ref_from_str( 203 | &mut self, 204 | ref_src: &str, 205 | ref_dst: &str, 206 | force: bool, 207 | repo: &mut Repository, 208 | ipfs: &mut IpfsClient, 209 | chain_api: &OnlineClient, 210 | signer: &PairSigner, 211 | ips_id: u32, 212 | ) -> Result> { 213 | // Deleting `ref_dst` was requested 214 | if ref_src.is_empty() { 215 | debug!("Removing ref {} from index", ref_dst); 216 | if self.refs.remove(ref_dst).is_none() { 217 | debug!( 218 | "Nothing to delete, ref {} not part of the index ref set", 219 | ref_dst 220 | ); 221 | debug!("Available refs:\n{:#?}", self.refs); 222 | } 223 | error!("ref_srd empty") 224 | } 225 | let reference = repo.find_reference(ref_src)?.resolve()?; 226 | 227 | // Differentiate between annotated tags and their commit representation 228 | let obj = reference 229 | .peel(ObjectType::Tag) 230 | .unwrap_or(reference.peel(ObjectType::Commit)?); 231 | 232 | debug!( 233 | "{:?} dereferenced to {:?} {}", 234 | reference.shorthand(), 235 | obj.kind(), 236 | obj.id() 237 | ); 238 | 239 | if force { 240 | eprintln!("This push will be forced"); 241 | } else { 242 | eprintln!("Checking for work ahead of us..."); 243 | 244 | if let Some(dst_git_hash) = self.refs.get(ref_dst) { 245 | let mut missing_objects = HashSet::new(); 246 | self.enumerate_for_fetch( 247 | dst_git_hash.parse()?, 248 | &mut missing_objects, 249 | repo, 250 | ipfs, 251 | chain_api, 252 | ips_id, 253 | ) 254 | .await?; 255 | 256 | if !missing_objects.is_empty() { 257 | eprintln!( 258 | "There's {} objects in {} not present locally. Please fetch first or force-push.", 259 | missing_objects.len(), 260 | ref_dst 261 | ); 262 | 263 | debug!("Missing objects:\n{:#?}", missing_objects); 264 | return Err("There's objects in the index not present in the local repo - a pull is needed".into()); 265 | } 266 | } 267 | } 268 | 269 | let mut objs_for_push = HashSet::new(); 270 | let mut submodules_for_push = HashSet::new(); 271 | 272 | self.enumerate_for_push( 273 | &obj.clone(), 274 | &mut objs_for_push, 275 | &mut submodules_for_push, 276 | repo, 277 | )?; 278 | 279 | let ipf_id = self 280 | .push_git_objects(&objs_for_push, repo, ipfs, chain_api, signer) 281 | .await?; 282 | 283 | for submod_oid in submodules_for_push { 284 | self.objects 285 | .insert(submod_oid.to_string(), SUBMODULE_TIP_MARKER.to_owned()); 286 | } 287 | 288 | self.refs 289 | .insert(ref_dst.to_owned(), format!("{}", obj.id())); 290 | Ok(ipf_id) 291 | } 292 | 293 | pub fn enumerate_for_push( 294 | &self, 295 | obj: &Object, 296 | push_todo: &mut HashSet, 297 | submodules: &mut HashSet, 298 | repo: &Repository, 299 | ) -> Result<(), Box> { 300 | // Object tree traversal state 301 | let mut stack = vec![obj.clone()]; 302 | 303 | let mut obj_cnt = 1; 304 | while let Some(obj) = stack.pop() { 305 | if self.objects.contains_key(&obj.id().to_string()) { 306 | debug!("Object {} already in RepoData", obj.id()); 307 | continue; 308 | } 309 | 310 | if push_todo.contains(&obj.id()) { 311 | debug!("Object {} already in state", obj.id()); 312 | continue; 313 | } 314 | 315 | let obj_type = obj.kind().ok_or_else(|| { 316 | let msg = format!("Cannot determine type of object {}", obj.id()); 317 | debug!("{}", msg); 318 | msg 319 | })?; 320 | 321 | push_todo.insert(obj.id()); 322 | 323 | match obj_type { 324 | ObjectType::Commit => { 325 | let commit = obj 326 | .as_commit() 327 | .ok_or_else(|| eprintln!("Could not view {:?} as a commit", obj)) 328 | .unwrap(); 329 | debug!("[{}] Counting commit {:?}", obj_cnt, commit); 330 | 331 | let tree_obj = obj.peel(ObjectType::Tree)?; 332 | debug!("Commit {}: Handling tree {}", commit.id(), tree_obj.id()); 333 | 334 | stack.push(tree_obj); 335 | 336 | for parent in commit.parents() { 337 | debug!( 338 | "Commit {}: Pushing parent commit {}", 339 | commit.id(), 340 | parent.id() 341 | ); 342 | stack.push(parent.into_object()); 343 | } 344 | } 345 | ObjectType::Tree => { 346 | let tree = obj 347 | .as_tree() 348 | .ok_or_else(|| eprintln!("Could not view {:?} as a tree", obj)) 349 | .unwrap(); 350 | debug!("[{}] Counting tree {:?}", obj_cnt, tree); 351 | 352 | for entry in tree.into_iter() { 353 | // Weed out submodules (Implicitly known as commit children of tree objects) 354 | if let Some(ObjectType::Commit) = entry.kind() { 355 | debug!("Skipping submodule at {}", entry.id()); 356 | 357 | submodules.insert(entry.id()); 358 | 359 | continue; 360 | } 361 | 362 | debug!( 363 | "Tree {}: Pushing tree entry {} ({:?})", 364 | tree.id(), 365 | entry.id(), 366 | entry.kind() 367 | ); 368 | 369 | stack.push(entry.to_object(repo)?); 370 | } 371 | } 372 | ObjectType::Blob => { 373 | let blob = obj 374 | .as_blob() 375 | .ok_or_else(|| eprintln!("Could not view {:?} as a blob", obj)) 376 | .unwrap(); 377 | debug!("[{}] Counting blob {:?}", obj_cnt, blob); 378 | } 379 | ObjectType::Tag => { 380 | let tag = obj 381 | .as_tag() 382 | .ok_or_else(|| eprintln!("Could not view {:?} as a tag", obj)) 383 | .unwrap(); 384 | debug!("[{}] Counting tag {:?}", obj_cnt, tag); 385 | 386 | stack.push(tag.target()?); 387 | } 388 | other => { 389 | return Err(format!("Don't know how to traverse a {}", other).into()); 390 | } 391 | } 392 | 393 | obj_cnt += 1; 394 | } 395 | Ok(()) 396 | } 397 | 398 | pub async fn fetch_to_ref_from_str( 399 | &self, 400 | git_hash: &str, 401 | ref_name: &str, 402 | repo: &mut Repository, 403 | ipfs: &mut IpfsClient, 404 | chain_api: &OnlineClient, 405 | ips_id: u32, 406 | ) -> Result<(), Box> { 407 | debug!("Fetching {} for {}", git_hash, ref_name); 408 | 409 | let git_hash_oid = Oid::from_str(git_hash)?; 410 | let mut oids_for_fetch = HashSet::new(); 411 | 412 | self.enumerate_for_fetch( 413 | git_hash_oid, 414 | &mut oids_for_fetch, 415 | repo, 416 | ipfs, 417 | chain_api, 418 | ips_id, 419 | ) 420 | .await?; 421 | 422 | self.fetch_git_objects(&oids_for_fetch, repo, ipfs, chain_api, ips_id) 423 | .await?; 424 | 425 | match repo.odb()?.read_header(git_hash_oid)?.1 { 426 | ObjectType::Commit if ref_name.starts_with("refs/tags") => { 427 | debug!("Not setting ref for lightweight tag {}", ref_name); 428 | } 429 | ObjectType::Commit => { 430 | repo.reference(ref_name, git_hash_oid, true, "inv4-git fetch")?; 431 | } 432 | // Somehow git is upset when we set tag refs for it 433 | ObjectType::Tag => { 434 | debug!("Not setting ref for tag {}", ref_name); 435 | } 436 | other_type => { 437 | let msg = format!("New tip turned out to be a {} after fetch", other_type); 438 | debug!("{}", msg); 439 | return Err(msg.into()); 440 | } 441 | } 442 | 443 | debug!("Fetched {} for {} OK.", git_hash, ref_name); 444 | Ok(()) 445 | } 446 | 447 | pub async fn enumerate_for_fetch( 448 | &self, 449 | oid: Oid, 450 | fetch_todo: &mut HashSet, 451 | repo: &Repository, 452 | ipfs: &mut IpfsClient, 453 | chain_api: &OnlineClient, 454 | ips_id: u32, 455 | ) -> Result<(), Box> { 456 | let mut stack = vec![oid]; 457 | let mut multi_objects: BTreeMap = BTreeMap::new(); 458 | 459 | while let Some(oid) = stack.pop() { 460 | if repo.odb()?.read_header(oid).is_ok() { 461 | debug!("Object {} already present locally!", oid); 462 | continue; 463 | } 464 | 465 | if fetch_todo.contains(&oid) { 466 | debug!("Object {} already present in state!", oid); 467 | continue; 468 | } 469 | 470 | let multi_object_hash = self 471 | .objects 472 | .get(&format!("{}", oid)) 473 | .ok_or_else(|| { 474 | let msg = format!("Could not find object {} in the index", oid); 475 | debug!("{}", msg); 476 | msg 477 | })? 478 | .clone(); 479 | 480 | if multi_object_hash == SUBMODULE_TIP_MARKER { 481 | debug!("Ommitting submodule {}", oid.to_string()); 482 | return Ok(()); 483 | } 484 | 485 | fetch_todo.insert(oid); 486 | 487 | let multi_object = if let Some(m) = multi_objects.get(&multi_object_hash) { 488 | m.clone() 489 | } else { 490 | let m = MultiObject::chain_get(multi_object_hash.clone(), ipfs, chain_api, ips_id) 491 | .await?; 492 | multi_objects.insert(multi_object_hash, m.clone()); 493 | m 494 | }; 495 | 496 | match multi_object 497 | .objects 498 | .get(&oid.to_string()) 499 | .expect("Oid not found in MultiObject") 500 | .clone() 501 | .metadata 502 | { 503 | GitObjectMetadata::Commit { 504 | parent_git_hashes, 505 | tree_git_hash, 506 | } => { 507 | stack.push(Oid::from_str(&tree_git_hash)?); 508 | 509 | for parent_git_hash in parent_git_hashes { 510 | stack.push(Oid::from_str(&parent_git_hash)?); 511 | } 512 | } 513 | GitObjectMetadata::Tag { target_git_hash } => { 514 | stack.push(Oid::from_str(&target_git_hash)?); 515 | } 516 | GitObjectMetadata::Tree { entry_git_hashes } => { 517 | for entry_git_hash in entry_git_hashes { 518 | stack.push(Oid::from_str(&entry_git_hash)?); 519 | } 520 | } 521 | GitObjectMetadata::Blob => {} 522 | } 523 | } 524 | 525 | Ok(()) 526 | } 527 | 528 | pub async fn push_git_objects( 529 | &mut self, 530 | oids: &HashSet, 531 | repo: &Repository, 532 | ipfs: &mut IpfsClient, 533 | chain_api: &OnlineClient, 534 | signer: &PairSigner, 535 | ) -> Result> { 536 | eprintln!("Minting 2 IPFs"); 537 | 538 | let mut multi_object = MultiObject { 539 | hash: String::new(), 540 | git_hashes: vec![], 541 | objects: BTreeMap::new(), 542 | }; 543 | 544 | for oid in oids { 545 | let obj = repo.find_object(*oid, None)?; 546 | debug!("Current object: {:?} at {}", obj.kind(), obj.id()); 547 | 548 | if self.objects.contains_key(&obj.id().to_string()) { 549 | debug!("push_objects: Object {} already in RepoData", obj.id()); 550 | continue; 551 | } 552 | 553 | let obj_type = obj.kind().ok_or_else(|| { 554 | let msg = format!("Cannot determine type of object {}", obj.id()); 555 | debug!("{}", msg); 556 | msg 557 | })?; 558 | 559 | match obj_type { 560 | ObjectType::Commit => { 561 | let commit = obj 562 | .as_commit() 563 | .ok_or_else(|| eprintln!("Could not view {:?} as a commit", obj)) 564 | .unwrap(); 565 | debug!("Pushing commit {:?}", commit); 566 | 567 | multi_object.add(GitObject::from_git_commit(commit, &repo.odb()?)?); 568 | } 569 | ObjectType::Tree => { 570 | let tree = obj 571 | .as_tree() 572 | .ok_or_else(|| eprintln!("Could not view {:?} as a tree", obj)) 573 | .unwrap(); 574 | debug!("Pushing tree {:?}", tree); 575 | 576 | multi_object.add(GitObject::from_git_tree(tree, &repo.odb()?)?); 577 | } 578 | ObjectType::Blob => { 579 | let blob = obj 580 | .as_blob() 581 | .ok_or_else(|| eprintln!("Could not view {:?} as a blob", obj)) 582 | .unwrap(); 583 | debug!("Pushing blob {:?}", blob); 584 | 585 | multi_object.add(GitObject::from_git_blob(blob, &repo.odb()?)?); 586 | } 587 | ObjectType::Tag => { 588 | let tag = obj 589 | .as_tag() 590 | .ok_or_else(|| eprintln!("Could not view {:?} as a tag", obj)) 591 | .unwrap(); 592 | debug!("Pushing tag {:?}", tag); 593 | 594 | multi_object.add(GitObject::from_git_tag(tag, &repo.odb()?)?); 595 | } 596 | other => { 597 | return Err(format!("Don't know how to traverse a {}", other).into()); 598 | } 599 | } 600 | } 601 | 602 | multi_object.hash = xxh3::hash64(multi_object.git_hashes.encode().as_slice()).to_string(); 603 | 604 | for oid in multi_object.git_hashes.clone() { 605 | self.objects.insert(oid, multi_object.hash.clone()); 606 | } 607 | 608 | debug!("Pushing MultiObject to IPFS"); 609 | 610 | let data = compress_data(multi_object.encode()); 611 | 612 | #[cfg(not(feature = "crust"))] 613 | let ipfs_hash = ipfs.add(std::io::Cursor::new(data)).await?.hash; 614 | 615 | #[cfg(feature = "crust")] 616 | let ipfs_hash = crate::crust::send_to_crust(signer, data).await?; 617 | 618 | debug!("Sending MultiObject to the chain"); 619 | 620 | let ipf_mint_tx = tinkernet::tx().ipf().mint( 621 | multi_object.hash.as_bytes().to_vec(), 622 | H256::from_slice(&Cid::try_from(ipfs_hash)?.to_bytes()[2..]), 623 | ); 624 | 625 | let events = chain_api 626 | .tx() 627 | .sign_and_submit_then_watch_default(&ipf_mint_tx, signer) 628 | .await? 629 | .wait_for_in_block() 630 | .await?; 631 | 632 | let ipf_id = events 633 | .fetch_events() 634 | .await? 635 | .find_first::()? 636 | .unwrap() 637 | .1; 638 | 639 | events.wait_for_success().await?; 640 | 641 | eprintln!("Minted Git Objects on-chain with IPF ID: {}", ipf_id); 642 | 643 | Ok(ipf_id) 644 | } 645 | 646 | /// Download git objects in `oids` from IPFS and instantiate them in `repo`. 647 | pub async fn fetch_git_objects( 648 | &self, 649 | oids: &HashSet, 650 | repo: &mut Repository, 651 | ipfs: &mut IpfsClient, 652 | chain_api: &OnlineClient, 653 | ips_id: u32, 654 | ) -> Result<(), Box> { 655 | let mut fetched_objects = BTreeMap::new(); 656 | 657 | let objects_deduped = { 658 | let mut o = self.objects.values().collect::>(); 659 | o.sort(); 660 | o.dedup(); 661 | o 662 | }; 663 | 664 | for object_hash in objects_deduped { 665 | let mut multi_object = 666 | MultiObject::chain_get(object_hash.clone(), ipfs, chain_api, ips_id).await?; 667 | 668 | fetched_objects.append(&mut multi_object.objects) 669 | } 670 | 671 | for (i, &oid) in oids.iter().enumerate() { 672 | debug!("[{}/{}] Fetching object {}", i + 1, oids.len(), oid); 673 | 674 | let git_object = fetched_objects 675 | .get(&format!("{}", oid)) 676 | .ok_or_else(|| { 677 | let msg = format!("Could not find object {} in the index", oid); 678 | debug!("{}", msg); 679 | msg 680 | })? 681 | .clone(); 682 | 683 | if repo.odb()?.read_header(oid).is_ok() { 684 | debug!("fetch objects: Object {} already present locally!", oid); 685 | continue; 686 | } 687 | 688 | let written_oid = repo.odb()?.write( 689 | match git_object.metadata { 690 | GitObjectMetadata::Blob => ObjectType::Blob, 691 | GitObjectMetadata::Commit { .. } => ObjectType::Commit, 692 | GitObjectMetadata::Tag { .. } => ObjectType::Tag, 693 | GitObjectMetadata::Tree { .. } => ObjectType::Tree, 694 | }, 695 | &git_object.data, 696 | )?; 697 | if written_oid != oid { 698 | let msg = format!( 699 | "Object tree inconsistency detected: fetched {}, but write result hashes to {}", 700 | oid, written_oid 701 | ); 702 | debug!("{}", msg); 703 | return Err(msg.into()); 704 | } 705 | debug!("Fetched object {}", written_oid); 706 | } 707 | Ok(()) 708 | } 709 | 710 | pub async fn mint_return_new_old_id( 711 | &self, 712 | ipfs: &mut IpfsClient, 713 | chain_api: &OnlineClient, 714 | signer: &PairSigner, 715 | ips_id: u32, 716 | ) -> Result<(u64, Option), Box> { 717 | let data = compress_data(self.encode()); 718 | 719 | #[cfg(not(feature = "crust"))] 720 | let ipfs_hash = ipfs.add(std::io::Cursor::new(data)).await?.hash; 721 | 722 | #[cfg(feature = "crust")] 723 | let ipfs_hash = crate::crust::send_to_crust(signer, data).await?; 724 | 725 | let ipf_mint_tx = tinkernet::tx().ipf().mint( 726 | b"RepoData".to_vec(), 727 | H256::from_slice(&Cid::try_from(ipfs_hash)?.to_bytes()[2..]), 728 | ); 729 | 730 | let events = chain_api 731 | .tx() 732 | .sign_and_submit_then_watch_default(&ipf_mint_tx, signer) 733 | .await? 734 | .wait_for_in_block() 735 | .await?; 736 | 737 | let new_ipf_id = events 738 | .fetch_events() 739 | .await? 740 | .find_first::()? 741 | .unwrap() 742 | .1; 743 | 744 | events.wait_for_success().await?; 745 | 746 | eprintln!("Minted Repo Data on-chain with IPF ID: {}", new_ipf_id); 747 | 748 | let ips_info_address = tinkernet::storage().inv4().ip_storage(&ips_id); 749 | 750 | let ips_info = chain_api 751 | .storage() 752 | .fetch(&ips_info_address, None) 753 | .await? 754 | .ok_or(format!("IPS {ips_id} does not exist"))?; 755 | 756 | for file in ips_info.data.0 { 757 | if let AnyId::IpfId(id) = file { 758 | let ipf_info_address = tinkernet::storage().ipf().ipf_storage(&id); 759 | 760 | let ipf_info = chain_api 761 | .storage() 762 | .fetch(&ipf_info_address, None) 763 | .await? 764 | .ok_or("Internal error: IPF listed from IPS does not exist")?; 765 | 766 | if String::from_utf8(ipf_info.metadata.0.clone())? == *"RepoData" { 767 | return Ok((new_ipf_id, Some(id))); 768 | } 769 | } 770 | } 771 | 772 | Ok((new_ipf_id, None)) 773 | } 774 | } 775 | -------------------------------------------------------------------------------- /src/util.rs: -------------------------------------------------------------------------------- 1 | use cid::{multihash::MultihashGeneric, CidGeneric}; 2 | use subxt::ext::sp_core::H256; 3 | 4 | use crate::primitives::BoxResult; 5 | 6 | #[macro_export] 7 | macro_rules! error { 8 | ($x:expr) => {{ 9 | return Err($x.into()); 10 | }}; 11 | } 12 | 13 | pub fn generate_cid(hash: H256) -> BoxResult> { 14 | Ok(CidGeneric::new_v0(MultihashGeneric::<32>::from_bytes( 15 | hex::decode(format!("{:?}", hash).replace("0x", "1220"))?.as_slice(), 16 | )?)?) 17 | } 18 | -------------------------------------------------------------------------------- /tinkernet_metadata.scale: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbstractedCo/INV4-Git/2728a610f3c6125315af3367fcb7a72dd98e2ed0/tinkernet_metadata.scale --------------------------------------------------------------------------------