├── .github ├── .assets │ ├── dom.webp │ ├── eskender.webp │ └── luc.webp ├── _workflows │ ├── README.md │ └── build.yaml └── ccip-tools.png ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── crates └── offchain-gateway │ ├── Cargo.toml │ └── src │ └── main.rs └── examples ├── full ├── .env.example ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── README.md ├── docker-compose.yaml └── src │ ├── ccip │ ├── lookup │ │ └── mod.rs │ └── mod.rs │ ├── database │ └── mod.rs │ ├── gateway │ ├── endpoint.rs │ ├── mod.rs │ ├── payload.rs │ ├── resolution.rs │ ├── response.rs │ └── signing.rs │ ├── http.rs │ ├── main.rs │ ├── multicoin │ ├── cointype │ │ ├── coins.rs │ │ ├── mod.rs │ │ └── slip44.rs │ ├── encoding │ │ ├── binance.rs │ │ ├── bitcoin.rs │ │ ├── cardano.rs │ │ ├── checksum_address.rs │ │ ├── hedera.rs │ │ ├── mod.rs │ │ ├── p2pkh.rs │ │ ├── p2sh.rs │ │ ├── polkadot.rs │ │ ├── ripple.rs │ │ ├── segwit.rs │ │ ├── solana.rs │ │ └── stellar.rs │ └── mod.rs │ ├── selfservice │ ├── endpoint.rs │ ├── mod.rs │ └── view.rs │ ├── state.rs │ └── utils │ ├── axum_json.rs │ ├── dns.rs │ ├── mod.rs │ └── sha256.rs └── minimal ├── Cargo.toml └── src └── main.rs /.github/.assets/dom.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ensdomains/offchain-gateway-rs/bcd49dbac14e6acf45e04ab33bc342cd9a8ba17b/.github/.assets/dom.webp -------------------------------------------------------------------------------- /.github/.assets/eskender.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ensdomains/offchain-gateway-rs/bcd49dbac14e6acf45e04ab33bc342cd9a8ba17b/.github/.assets/eskender.webp -------------------------------------------------------------------------------- /.github/.assets/luc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ensdomains/offchain-gateway-rs/bcd49dbac14e6acf45e04ab33bc342cd9a8ba17b/.github/.assets/luc.webp -------------------------------------------------------------------------------- /.github/_workflows/README.md: -------------------------------------------------------------------------------- 1 | temporarily disabled as we rework this repository 2 | this originally belonged to [examples/full](examples/full) 3 | -------------------------------------------------------------------------------- /.github/_workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build-container: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | file: [Dockerfile] 14 | steps: 15 | - uses: actions/checkout@v3 16 | with: 17 | fetch-depth: 0 18 | 19 | # selecting a toolchain either by action or manual `rustup` calls should happen 20 | # before the plugin, as the cache uses the current rustc version as its cache key 21 | - run: rustup toolchain install stable --profile minimal 22 | 23 | - uses: Swatinem/rust-cache@v2 24 | 25 | - run: | 26 | cargo build --release 27 | 28 | - name: Login to GitHub Container Registry 29 | uses: docker/login-action@v2 30 | with: 31 | registry: ghcr.io 32 | username: ${{ github.actor }} 33 | password: ${{ secrets.GITHUB_TOKEN }} 34 | logout: false 35 | 36 | - name: Set tag suffix 37 | id: suffix 38 | run: | 39 | if [[ "${{ matrix.file }}" == *.* ]]; then 40 | echo "::set-output name=suffix:::$(echo "${{ matrix.file }}" | cut -d'.' -f1)" 41 | else 42 | echo "::set-output name=suffix::" 43 | fi 44 | 45 | - name: Docker meta 46 | id: meta 47 | uses: docker/metadata-action@v4 48 | with: 49 | images: | 50 | ghcr.io/${{ github.repository }} 51 | flavor: | 52 | latest=auto 53 | tags: | 54 | type=raw,value=${{ github.sha }},suffix=${{ steps.suffix.outputs.suffix }} 55 | 56 | - name: Set up Docker Buildx 57 | uses: docker/setup-buildx-action@v2 58 | 59 | - name: Build, tag, and push image 60 | uses: docker/build-push-action@v3 61 | with: 62 | context: . 63 | file: ${{ matrix.file }} 64 | push: true 65 | tags: ${{ steps.meta.outputs.tags }} 66 | labels: ${{ steps.meta.outputs.labels }} 67 | cache-from: type=gha 68 | cache-to: type=gha,mode=max 69 | -------------------------------------------------------------------------------- /.github/ccip-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ensdomains/offchain-gateway-rs/bcd49dbac14e6acf45e04ab33bc342cd9a8ba17b/.github/ccip-tools.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | # See https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions 3 | resolver = "2" 4 | 5 | members = [ 6 | "crates/offchain-gateway", 7 | "examples/full", 8 | "examples/minimal" 9 | ] 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Offchain Gateway (Rust) 2 | 3 | > [!WARNING] 4 | > This repository is under construction 🚧. We are actively improving it hackathon-style. 5 | 6 | ## Offchain Gateway Example 7 | 8 | If you are looking for the original code that was in this repository please see [examples/full](examples/full). 9 | -------------------------------------------------------------------------------- /crates/offchain-gateway/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "offchain-gateway" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | -------------------------------------------------------------------------------- /crates/offchain-gateway/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | println!("Hello, world!"); 3 | } 4 | -------------------------------------------------------------------------------- /examples/full/.env.example: -------------------------------------------------------------------------------- 1 | PRIVATE_KEY=1234567890... 2 | PORT=3000 3 | POSTGRES_HOST= 4 | POSTGRES_USER= 5 | POSTGRES_PASSWORD= 6 | -------------------------------------------------------------------------------- /examples/full/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .env 3 | .idea/ 4 | -------------------------------------------------------------------------------- /examples/full/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.21.0" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 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.8.3" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" 35 | dependencies = [ 36 | "cfg-if", 37 | "cipher", 38 | "cpufeatures", 39 | ] 40 | 41 | [[package]] 42 | name = "aho-corasick" 43 | version = "1.1.2" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 46 | dependencies = [ 47 | "memchr", 48 | ] 49 | 50 | [[package]] 51 | name = "android-tzdata" 52 | version = "0.1.1" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 55 | 56 | [[package]] 57 | name = "android_system_properties" 58 | version = "0.1.5" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 61 | dependencies = [ 62 | "libc", 63 | ] 64 | 65 | [[package]] 66 | name = "arrayvec" 67 | version = "0.7.4" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 70 | 71 | [[package]] 72 | name = "ascii-canvas" 73 | version = "3.0.0" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" 76 | dependencies = [ 77 | "term", 78 | ] 79 | 80 | [[package]] 81 | name = "async-trait" 82 | version = "0.1.74" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" 85 | dependencies = [ 86 | "proc-macro2", 87 | "quote", 88 | "syn 2.0.39", 89 | ] 90 | 91 | [[package]] 92 | name = "async_io_stream" 93 | version = "0.3.3" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 96 | dependencies = [ 97 | "futures", 98 | "pharos", 99 | "rustc_version", 100 | ] 101 | 102 | [[package]] 103 | name = "auto_impl" 104 | version = "1.1.0" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" 107 | dependencies = [ 108 | "proc-macro-error", 109 | "proc-macro2", 110 | "quote", 111 | "syn 1.0.109", 112 | ] 113 | 114 | [[package]] 115 | name = "autocfg" 116 | version = "1.1.0" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 119 | 120 | [[package]] 121 | name = "axum" 122 | version = "0.7.4" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" 125 | dependencies = [ 126 | "async-trait", 127 | "axum-core", 128 | "bytes", 129 | "futures-util", 130 | "http 1.0.0", 131 | "http-body 1.0.0", 132 | "http-body-util", 133 | "hyper 1.1.0", 134 | "hyper-util", 135 | "itoa", 136 | "matchit", 137 | "memchr", 138 | "mime", 139 | "percent-encoding", 140 | "pin-project-lite", 141 | "rustversion", 142 | "serde", 143 | "serde_json", 144 | "serde_path_to_error", 145 | "serde_urlencoded", 146 | "sync_wrapper", 147 | "tokio", 148 | "tower", 149 | "tower-layer", 150 | "tower-service", 151 | "tracing", 152 | ] 153 | 154 | [[package]] 155 | name = "axum-core" 156 | version = "0.4.3" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" 159 | dependencies = [ 160 | "async-trait", 161 | "bytes", 162 | "futures-util", 163 | "http 1.0.0", 164 | "http-body 1.0.0", 165 | "http-body-util", 166 | "mime", 167 | "pin-project-lite", 168 | "rustversion", 169 | "sync_wrapper", 170 | "tower-layer", 171 | "tower-service", 172 | "tracing", 173 | ] 174 | 175 | [[package]] 176 | name = "backtrace" 177 | version = "0.3.69" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 180 | dependencies = [ 181 | "addr2line", 182 | "cc", 183 | "cfg-if", 184 | "libc", 185 | "miniz_oxide", 186 | "object", 187 | "rustc-demangle", 188 | ] 189 | 190 | [[package]] 191 | name = "base16ct" 192 | version = "0.2.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 195 | 196 | [[package]] 197 | name = "base32" 198 | version = "0.4.0" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" 201 | 202 | [[package]] 203 | name = "base64" 204 | version = "0.13.1" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 207 | 208 | [[package]] 209 | name = "base64" 210 | version = "0.21.5" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" 213 | 214 | [[package]] 215 | name = "base64ct" 216 | version = "1.6.0" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 219 | 220 | [[package]] 221 | name = "bech32" 222 | version = "0.9.1" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" 225 | 226 | [[package]] 227 | name = "bech32" 228 | version = "0.10.0-beta" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" 231 | 232 | [[package]] 233 | name = "bit-set" 234 | version = "0.5.3" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 237 | dependencies = [ 238 | "bit-vec", 239 | ] 240 | 241 | [[package]] 242 | name = "bit-vec" 243 | version = "0.6.3" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 246 | 247 | [[package]] 248 | name = "bitflags" 249 | version = "1.3.2" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 252 | 253 | [[package]] 254 | name = "bitflags" 255 | version = "2.4.1" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 258 | 259 | [[package]] 260 | name = "bitvec" 261 | version = "1.0.1" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 264 | dependencies = [ 265 | "funty", 266 | "radium", 267 | "tap", 268 | "wyz", 269 | ] 270 | 271 | [[package]] 272 | name = "blake2" 273 | version = "0.10.6" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" 276 | dependencies = [ 277 | "digest", 278 | ] 279 | 280 | [[package]] 281 | name = "block-buffer" 282 | version = "0.10.4" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 285 | dependencies = [ 286 | "generic-array", 287 | ] 288 | 289 | [[package]] 290 | name = "bs58" 291 | version = "0.5.0" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" 294 | dependencies = [ 295 | "sha2", 296 | "tinyvec", 297 | ] 298 | 299 | [[package]] 300 | name = "bumpalo" 301 | version = "3.14.0" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 304 | 305 | [[package]] 306 | name = "byte-slice-cast" 307 | version = "1.2.2" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" 310 | 311 | [[package]] 312 | name = "byteorder" 313 | version = "1.5.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 316 | 317 | [[package]] 318 | name = "bytes" 319 | version = "1.5.0" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 322 | dependencies = [ 323 | "serde", 324 | ] 325 | 326 | [[package]] 327 | name = "bzip2" 328 | version = "0.4.4" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" 331 | dependencies = [ 332 | "bzip2-sys", 333 | "libc", 334 | ] 335 | 336 | [[package]] 337 | name = "bzip2-sys" 338 | version = "0.1.11+1.0.8" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" 341 | dependencies = [ 342 | "cc", 343 | "libc", 344 | "pkg-config", 345 | ] 346 | 347 | [[package]] 348 | name = "camino" 349 | version = "1.1.6" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" 352 | dependencies = [ 353 | "serde", 354 | ] 355 | 356 | [[package]] 357 | name = "cargo-platform" 358 | version = "0.1.4" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" 361 | dependencies = [ 362 | "serde", 363 | ] 364 | 365 | [[package]] 366 | name = "cargo_metadata" 367 | version = "0.18.1" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" 370 | dependencies = [ 371 | "camino", 372 | "cargo-platform", 373 | "semver", 374 | "serde", 375 | "serde_json", 376 | "thiserror", 377 | ] 378 | 379 | [[package]] 380 | name = "cc" 381 | version = "1.0.83" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 384 | dependencies = [ 385 | "jobserver", 386 | "libc", 387 | ] 388 | 389 | [[package]] 390 | name = "cfg-if" 391 | version = "1.0.0" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 394 | 395 | [[package]] 396 | name = "chrono" 397 | version = "0.4.31" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" 400 | dependencies = [ 401 | "android-tzdata", 402 | "iana-time-zone", 403 | "js-sys", 404 | "num-traits", 405 | "wasm-bindgen", 406 | "windows-targets", 407 | ] 408 | 409 | [[package]] 410 | name = "ciborium" 411 | version = "0.2.1" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" 414 | dependencies = [ 415 | "ciborium-io", 416 | "ciborium-ll", 417 | "serde", 418 | ] 419 | 420 | [[package]] 421 | name = "ciborium-io" 422 | version = "0.2.1" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" 425 | 426 | [[package]] 427 | name = "ciborium-ll" 428 | version = "0.2.1" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" 431 | dependencies = [ 432 | "ciborium-io", 433 | "half", 434 | ] 435 | 436 | [[package]] 437 | name = "cipher" 438 | version = "0.4.4" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 441 | dependencies = [ 442 | "crypto-common", 443 | "inout", 444 | ] 445 | 446 | [[package]] 447 | name = "coins-bip32" 448 | version = "0.8.7" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" 451 | dependencies = [ 452 | "bs58", 453 | "coins-core", 454 | "digest", 455 | "hmac", 456 | "k256", 457 | "serde", 458 | "sha2", 459 | "thiserror", 460 | ] 461 | 462 | [[package]] 463 | name = "coins-bip39" 464 | version = "0.8.7" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" 467 | dependencies = [ 468 | "bitvec", 469 | "coins-bip32", 470 | "hmac", 471 | "once_cell", 472 | "pbkdf2 0.12.2", 473 | "rand", 474 | "sha2", 475 | "thiserror", 476 | ] 477 | 478 | [[package]] 479 | name = "coins-core" 480 | version = "0.8.7" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" 483 | dependencies = [ 484 | "base64 0.21.5", 485 | "bech32 0.9.1", 486 | "bs58", 487 | "digest", 488 | "generic-array", 489 | "hex", 490 | "ripemd", 491 | "serde", 492 | "serde_derive", 493 | "sha2", 494 | "sha3", 495 | "thiserror", 496 | ] 497 | 498 | [[package]] 499 | name = "const-hex" 500 | version = "1.10.0" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" 503 | dependencies = [ 504 | "cfg-if", 505 | "cpufeatures", 506 | "hex", 507 | "proptest", 508 | "serde", 509 | ] 510 | 511 | [[package]] 512 | name = "const-oid" 513 | version = "0.9.5" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" 516 | 517 | [[package]] 518 | name = "constant_time_eq" 519 | version = "0.1.5" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 522 | 523 | [[package]] 524 | name = "core-foundation" 525 | version = "0.9.3" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 528 | dependencies = [ 529 | "core-foundation-sys", 530 | "libc", 531 | ] 532 | 533 | [[package]] 534 | name = "core-foundation-sys" 535 | version = "0.8.4" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 538 | 539 | [[package]] 540 | name = "cpufeatures" 541 | version = "0.2.11" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" 544 | dependencies = [ 545 | "libc", 546 | ] 547 | 548 | [[package]] 549 | name = "crc16" 550 | version = "0.4.0" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" 553 | 554 | [[package]] 555 | name = "crc32fast" 556 | version = "1.3.2" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 559 | dependencies = [ 560 | "cfg-if", 561 | ] 562 | 563 | [[package]] 564 | name = "crossbeam-deque" 565 | version = "0.8.3" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" 568 | dependencies = [ 569 | "cfg-if", 570 | "crossbeam-epoch", 571 | "crossbeam-utils", 572 | ] 573 | 574 | [[package]] 575 | name = "crossbeam-epoch" 576 | version = "0.9.15" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" 579 | dependencies = [ 580 | "autocfg", 581 | "cfg-if", 582 | "crossbeam-utils", 583 | "memoffset", 584 | "scopeguard", 585 | ] 586 | 587 | [[package]] 588 | name = "crossbeam-utils" 589 | version = "0.8.16" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" 592 | dependencies = [ 593 | "cfg-if", 594 | ] 595 | 596 | [[package]] 597 | name = "crunchy" 598 | version = "0.2.2" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 601 | 602 | [[package]] 603 | name = "crypto-bigint" 604 | version = "0.5.4" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "28f85c3514d2a6e64160359b45a3918c3b4178bcbf4ae5d03ab2d02e521c479a" 607 | dependencies = [ 608 | "generic-array", 609 | "rand_core", 610 | "subtle", 611 | "zeroize", 612 | ] 613 | 614 | [[package]] 615 | name = "crypto-common" 616 | version = "0.1.6" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 619 | dependencies = [ 620 | "generic-array", 621 | "typenum", 622 | ] 623 | 624 | [[package]] 625 | name = "ctr" 626 | version = "0.9.2" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 629 | dependencies = [ 630 | "cipher", 631 | ] 632 | 633 | [[package]] 634 | name = "data-encoding" 635 | version = "2.4.0" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" 638 | 639 | [[package]] 640 | name = "der" 641 | version = "0.7.8" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" 644 | dependencies = [ 645 | "const-oid", 646 | "zeroize", 647 | ] 648 | 649 | [[package]] 650 | name = "deranged" 651 | version = "0.3.9" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" 654 | dependencies = [ 655 | "powerfmt", 656 | ] 657 | 658 | [[package]] 659 | name = "derive_more" 660 | version = "0.99.17" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 663 | dependencies = [ 664 | "proc-macro2", 665 | "quote", 666 | "syn 1.0.109", 667 | ] 668 | 669 | [[package]] 670 | name = "diff" 671 | version = "0.1.13" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 674 | 675 | [[package]] 676 | name = "digest" 677 | version = "0.10.7" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 680 | dependencies = [ 681 | "block-buffer", 682 | "const-oid", 683 | "crypto-common", 684 | "subtle", 685 | ] 686 | 687 | [[package]] 688 | name = "dirs" 689 | version = "5.0.1" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 692 | dependencies = [ 693 | "dirs-sys", 694 | ] 695 | 696 | [[package]] 697 | name = "dirs-next" 698 | version = "2.0.0" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 701 | dependencies = [ 702 | "cfg-if", 703 | "dirs-sys-next", 704 | ] 705 | 706 | [[package]] 707 | name = "dirs-sys" 708 | version = "0.4.1" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 711 | dependencies = [ 712 | "libc", 713 | "option-ext", 714 | "redox_users", 715 | "windows-sys", 716 | ] 717 | 718 | [[package]] 719 | name = "dirs-sys-next" 720 | version = "0.1.2" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 723 | dependencies = [ 724 | "libc", 725 | "redox_users", 726 | "winapi", 727 | ] 728 | 729 | [[package]] 730 | name = "dotenvy" 731 | version = "0.15.7" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 734 | 735 | [[package]] 736 | name = "dunce" 737 | version = "1.0.4" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" 740 | 741 | [[package]] 742 | name = "ecdsa" 743 | version = "0.16.9" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 746 | dependencies = [ 747 | "der", 748 | "digest", 749 | "elliptic-curve", 750 | "rfc6979", 751 | "signature", 752 | "spki", 753 | ] 754 | 755 | [[package]] 756 | name = "either" 757 | version = "1.9.0" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 760 | 761 | [[package]] 762 | name = "elliptic-curve" 763 | version = "0.13.7" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "e9775b22bc152ad86a0cf23f0f348b884b26add12bf741e7ffc4d4ab2ab4d205" 766 | dependencies = [ 767 | "base16ct", 768 | "crypto-bigint", 769 | "digest", 770 | "ff", 771 | "generic-array", 772 | "group", 773 | "pkcs8", 774 | "rand_core", 775 | "sec1", 776 | "subtle", 777 | "zeroize", 778 | ] 779 | 780 | [[package]] 781 | name = "ena" 782 | version = "0.14.2" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" 785 | dependencies = [ 786 | "log", 787 | ] 788 | 789 | [[package]] 790 | name = "encoding_rs" 791 | version = "0.8.33" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 794 | dependencies = [ 795 | "cfg-if", 796 | ] 797 | 798 | [[package]] 799 | name = "enr" 800 | version = "0.9.1" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" 803 | dependencies = [ 804 | "base64 0.21.5", 805 | "bytes", 806 | "hex", 807 | "k256", 808 | "log", 809 | "rand", 810 | "rlp", 811 | "serde", 812 | "sha3", 813 | "zeroize", 814 | ] 815 | 816 | [[package]] 817 | name = "equivalent" 818 | version = "1.0.1" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 821 | 822 | [[package]] 823 | name = "errno" 824 | version = "0.3.7" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" 827 | dependencies = [ 828 | "libc", 829 | "windows-sys", 830 | ] 831 | 832 | [[package]] 833 | name = "eth-keystore" 834 | version = "0.5.0" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" 837 | dependencies = [ 838 | "aes", 839 | "ctr", 840 | "digest", 841 | "hex", 842 | "hmac", 843 | "pbkdf2 0.11.0", 844 | "rand", 845 | "scrypt", 846 | "serde", 847 | "serde_json", 848 | "sha2", 849 | "sha3", 850 | "thiserror", 851 | "uuid", 852 | ] 853 | 854 | [[package]] 855 | name = "ethabi" 856 | version = "18.0.0" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" 859 | dependencies = [ 860 | "ethereum-types", 861 | "hex", 862 | "once_cell", 863 | "regex", 864 | "serde", 865 | "serde_json", 866 | "sha3", 867 | "thiserror", 868 | "uint", 869 | ] 870 | 871 | [[package]] 872 | name = "ethbloom" 873 | version = "0.13.0" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" 876 | dependencies = [ 877 | "crunchy", 878 | "fixed-hash", 879 | "impl-codec", 880 | "impl-rlp", 881 | "impl-serde", 882 | "scale-info", 883 | "tiny-keccak", 884 | ] 885 | 886 | [[package]] 887 | name = "ethereum-types" 888 | version = "0.14.1" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" 891 | dependencies = [ 892 | "ethbloom", 893 | "fixed-hash", 894 | "impl-codec", 895 | "impl-rlp", 896 | "impl-serde", 897 | "primitive-types", 898 | "scale-info", 899 | "uint", 900 | ] 901 | 902 | [[package]] 903 | name = "ethers" 904 | version = "2.0.10" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "1ad13497f6e0a24292fc7b408e30d22fe9dc262da1f40d7b542c3a44e7fc0476" 907 | dependencies = [ 908 | "ethers-addressbook", 909 | "ethers-contract", 910 | "ethers-core", 911 | "ethers-etherscan", 912 | "ethers-middleware", 913 | "ethers-providers", 914 | "ethers-signers", 915 | "ethers-solc", 916 | ] 917 | 918 | [[package]] 919 | name = "ethers-addressbook" 920 | version = "2.0.10" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "c6e9e8acd0ed348403cc73a670c24daba3226c40b98dc1a41903766b3ab6240a" 923 | dependencies = [ 924 | "ethers-core", 925 | "once_cell", 926 | "serde", 927 | "serde_json", 928 | ] 929 | 930 | [[package]] 931 | name = "ethers-contract" 932 | version = "2.0.11" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" 935 | dependencies = [ 936 | "const-hex", 937 | "ethers-contract-abigen", 938 | "ethers-contract-derive", 939 | "ethers-core", 940 | "ethers-providers", 941 | "futures-util", 942 | "once_cell", 943 | "pin-project", 944 | "serde", 945 | "serde_json", 946 | "thiserror", 947 | ] 948 | 949 | [[package]] 950 | name = "ethers-contract-abigen" 951 | version = "2.0.11" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" 954 | dependencies = [ 955 | "Inflector", 956 | "const-hex", 957 | "dunce", 958 | "ethers-core", 959 | "ethers-etherscan", 960 | "eyre", 961 | "prettyplease", 962 | "proc-macro2", 963 | "quote", 964 | "regex", 965 | "reqwest", 966 | "serde", 967 | "serde_json", 968 | "syn 2.0.39", 969 | "toml", 970 | "walkdir", 971 | ] 972 | 973 | [[package]] 974 | name = "ethers-contract-derive" 975 | version = "2.0.11" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" 978 | dependencies = [ 979 | "Inflector", 980 | "const-hex", 981 | "ethers-contract-abigen", 982 | "ethers-core", 983 | "proc-macro2", 984 | "quote", 985 | "serde_json", 986 | "syn 2.0.39", 987 | ] 988 | 989 | [[package]] 990 | name = "ethers-core" 991 | version = "2.0.11" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" 994 | dependencies = [ 995 | "arrayvec", 996 | "bytes", 997 | "cargo_metadata", 998 | "chrono", 999 | "const-hex", 1000 | "elliptic-curve", 1001 | "ethabi", 1002 | "generic-array", 1003 | "k256", 1004 | "num_enum", 1005 | "once_cell", 1006 | "open-fastrlp", 1007 | "rand", 1008 | "rlp", 1009 | "serde", 1010 | "serde_json", 1011 | "strum", 1012 | "syn 2.0.39", 1013 | "tempfile", 1014 | "thiserror", 1015 | "tiny-keccak", 1016 | "unicode-xid", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "ethers-etherscan" 1021 | version = "2.0.11" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" 1024 | dependencies = [ 1025 | "chrono", 1026 | "ethers-core", 1027 | "reqwest", 1028 | "semver", 1029 | "serde", 1030 | "serde_json", 1031 | "thiserror", 1032 | "tracing", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "ethers-middleware" 1037 | version = "2.0.10" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "473f1ccd0c793871bbc248729fa8df7e6d2981d6226e4343e3bbaa9281074d5d" 1040 | dependencies = [ 1041 | "async-trait", 1042 | "auto_impl", 1043 | "ethers-contract", 1044 | "ethers-core", 1045 | "ethers-etherscan", 1046 | "ethers-providers", 1047 | "ethers-signers", 1048 | "futures-channel", 1049 | "futures-locks", 1050 | "futures-util", 1051 | "instant", 1052 | "reqwest", 1053 | "serde", 1054 | "serde_json", 1055 | "thiserror", 1056 | "tokio", 1057 | "tracing", 1058 | "tracing-futures", 1059 | "url", 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "ethers-providers" 1064 | version = "2.0.11" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" 1067 | dependencies = [ 1068 | "async-trait", 1069 | "auto_impl", 1070 | "base64 0.21.5", 1071 | "bytes", 1072 | "const-hex", 1073 | "enr", 1074 | "ethers-core", 1075 | "futures-core", 1076 | "futures-timer", 1077 | "futures-util", 1078 | "hashers", 1079 | "http 0.2.11", 1080 | "instant", 1081 | "jsonwebtoken", 1082 | "once_cell", 1083 | "pin-project", 1084 | "reqwest", 1085 | "serde", 1086 | "serde_json", 1087 | "thiserror", 1088 | "tokio", 1089 | "tokio-tungstenite", 1090 | "tracing", 1091 | "tracing-futures", 1092 | "url", 1093 | "wasm-bindgen", 1094 | "wasm-bindgen-futures", 1095 | "web-sys", 1096 | "ws_stream_wasm", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "ethers-signers" 1101 | version = "2.0.10" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "5ea44bec930f12292866166f9ddbea6aa76304850e4d8dcd66dc492b43d00ff1" 1104 | dependencies = [ 1105 | "async-trait", 1106 | "coins-bip32", 1107 | "coins-bip39", 1108 | "const-hex", 1109 | "elliptic-curve", 1110 | "eth-keystore", 1111 | "ethers-core", 1112 | "rand", 1113 | "sha2", 1114 | "thiserror", 1115 | "tracing", 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "ethers-solc" 1120 | version = "2.0.10" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "de34e484e7ae3cab99fbfd013d6c5dc7f9013676a4e0e414d8b12e1213e8b3ba" 1123 | dependencies = [ 1124 | "cfg-if", 1125 | "const-hex", 1126 | "dirs", 1127 | "dunce", 1128 | "ethers-core", 1129 | "glob", 1130 | "home", 1131 | "md-5", 1132 | "num_cpus", 1133 | "once_cell", 1134 | "path-slash", 1135 | "rayon", 1136 | "regex", 1137 | "semver", 1138 | "serde", 1139 | "serde_json", 1140 | "solang-parser", 1141 | "svm-rs", 1142 | "thiserror", 1143 | "tiny-keccak", 1144 | "tokio", 1145 | "tracing", 1146 | "walkdir", 1147 | "yansi", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "eyre" 1152 | version = "0.6.8" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" 1155 | dependencies = [ 1156 | "indenter", 1157 | "once_cell", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "fallible-iterator" 1162 | version = "0.2.0" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 1165 | 1166 | [[package]] 1167 | name = "fastrand" 1168 | version = "2.0.1" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 1171 | 1172 | [[package]] 1173 | name = "ff" 1174 | version = "0.13.0" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" 1177 | dependencies = [ 1178 | "rand_core", 1179 | "subtle", 1180 | ] 1181 | 1182 | [[package]] 1183 | name = "finl_unicode" 1184 | version = "1.2.0" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 1187 | 1188 | [[package]] 1189 | name = "fixed-hash" 1190 | version = "0.8.0" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" 1193 | dependencies = [ 1194 | "byteorder", 1195 | "rand", 1196 | "rustc-hex", 1197 | "static_assertions", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "fixedbitset" 1202 | version = "0.4.2" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 1205 | 1206 | [[package]] 1207 | name = "flate2" 1208 | version = "1.0.28" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" 1211 | dependencies = [ 1212 | "crc32fast", 1213 | "miniz_oxide", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "fnv" 1218 | version = "1.0.7" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1221 | 1222 | [[package]] 1223 | name = "form_urlencoded" 1224 | version = "1.2.0" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" 1227 | dependencies = [ 1228 | "percent-encoding", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "fs2" 1233 | version = "0.4.3" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" 1236 | dependencies = [ 1237 | "libc", 1238 | "winapi", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "funty" 1243 | version = "2.0.0" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 1246 | 1247 | [[package]] 1248 | name = "futures" 1249 | version = "0.3.29" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" 1252 | dependencies = [ 1253 | "futures-channel", 1254 | "futures-core", 1255 | "futures-executor", 1256 | "futures-io", 1257 | "futures-sink", 1258 | "futures-task", 1259 | "futures-util", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "futures-channel" 1264 | version = "0.3.29" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" 1267 | dependencies = [ 1268 | "futures-core", 1269 | "futures-sink", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "futures-core" 1274 | version = "0.3.29" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" 1277 | 1278 | [[package]] 1279 | name = "futures-executor" 1280 | version = "0.3.29" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" 1283 | dependencies = [ 1284 | "futures-core", 1285 | "futures-task", 1286 | "futures-util", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "futures-io" 1291 | version = "0.3.29" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" 1294 | 1295 | [[package]] 1296 | name = "futures-locks" 1297 | version = "0.7.1" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" 1300 | dependencies = [ 1301 | "futures-channel", 1302 | "futures-task", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "futures-macro" 1307 | version = "0.3.29" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" 1310 | dependencies = [ 1311 | "proc-macro2", 1312 | "quote", 1313 | "syn 2.0.39", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "futures-sink" 1318 | version = "0.3.29" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" 1321 | 1322 | [[package]] 1323 | name = "futures-task" 1324 | version = "0.3.29" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" 1327 | 1328 | [[package]] 1329 | name = "futures-timer" 1330 | version = "3.0.2" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" 1333 | dependencies = [ 1334 | "gloo-timers", 1335 | "send_wrapper 0.4.0", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "futures-util" 1340 | version = "0.3.29" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" 1343 | dependencies = [ 1344 | "futures-channel", 1345 | "futures-core", 1346 | "futures-io", 1347 | "futures-macro", 1348 | "futures-sink", 1349 | "futures-task", 1350 | "memchr", 1351 | "pin-project-lite", 1352 | "pin-utils", 1353 | "slab", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "fxhash" 1358 | version = "0.2.1" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 1361 | dependencies = [ 1362 | "byteorder", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "generic-array" 1367 | version = "0.14.7" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1370 | dependencies = [ 1371 | "typenum", 1372 | "version_check", 1373 | "zeroize", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "getrandom" 1378 | version = "0.2.11" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 1381 | dependencies = [ 1382 | "cfg-if", 1383 | "libc", 1384 | "wasi", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "gimli" 1389 | version = "0.28.0" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" 1392 | 1393 | [[package]] 1394 | name = "glob" 1395 | version = "0.3.1" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 1398 | 1399 | [[package]] 1400 | name = "gloo-timers" 1401 | version = "0.2.6" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" 1404 | dependencies = [ 1405 | "futures-channel", 1406 | "futures-core", 1407 | "js-sys", 1408 | "wasm-bindgen", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "group" 1413 | version = "0.13.0" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1416 | dependencies = [ 1417 | "ff", 1418 | "rand_core", 1419 | "subtle", 1420 | ] 1421 | 1422 | [[package]] 1423 | name = "h2" 1424 | version = "0.3.22" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" 1427 | dependencies = [ 1428 | "bytes", 1429 | "fnv", 1430 | "futures-core", 1431 | "futures-sink", 1432 | "futures-util", 1433 | "http 0.2.11", 1434 | "indexmap", 1435 | "slab", 1436 | "tokio", 1437 | "tokio-util", 1438 | "tracing", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "h2" 1443 | version = "0.4.2" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" 1446 | dependencies = [ 1447 | "bytes", 1448 | "fnv", 1449 | "futures-core", 1450 | "futures-sink", 1451 | "futures-util", 1452 | "http 1.0.0", 1453 | "indexmap", 1454 | "slab", 1455 | "tokio", 1456 | "tokio-util", 1457 | "tracing", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "half" 1462 | version = "1.8.2" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" 1465 | 1466 | [[package]] 1467 | name = "hashbrown" 1468 | version = "0.14.2" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" 1471 | 1472 | [[package]] 1473 | name = "hashers" 1474 | version = "1.0.1" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" 1477 | dependencies = [ 1478 | "fxhash", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "heck" 1483 | version = "0.4.1" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1486 | 1487 | [[package]] 1488 | name = "hermit-abi" 1489 | version = "0.3.3" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" 1492 | 1493 | [[package]] 1494 | name = "hex" 1495 | version = "0.4.3" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1498 | 1499 | [[package]] 1500 | name = "hex-literal" 1501 | version = "0.4.1" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" 1504 | 1505 | [[package]] 1506 | name = "hmac" 1507 | version = "0.12.1" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1510 | dependencies = [ 1511 | "digest", 1512 | ] 1513 | 1514 | [[package]] 1515 | name = "home" 1516 | version = "0.5.5" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" 1519 | dependencies = [ 1520 | "windows-sys", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "http" 1525 | version = "0.2.11" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" 1528 | dependencies = [ 1529 | "bytes", 1530 | "fnv", 1531 | "itoa", 1532 | ] 1533 | 1534 | [[package]] 1535 | name = "http" 1536 | version = "1.0.0" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" 1539 | dependencies = [ 1540 | "bytes", 1541 | "fnv", 1542 | "itoa", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "http-body" 1547 | version = "0.4.5" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1550 | dependencies = [ 1551 | "bytes", 1552 | "http 0.2.11", 1553 | "pin-project-lite", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "http-body" 1558 | version = "1.0.0" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 1561 | dependencies = [ 1562 | "bytes", 1563 | "http 1.0.0", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "http-body-util" 1568 | version = "0.1.0" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" 1571 | dependencies = [ 1572 | "bytes", 1573 | "futures-util", 1574 | "http 1.0.0", 1575 | "http-body 1.0.0", 1576 | "pin-project-lite", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "httparse" 1581 | version = "1.8.0" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1584 | 1585 | [[package]] 1586 | name = "httpdate" 1587 | version = "1.0.3" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1590 | 1591 | [[package]] 1592 | name = "hyper" 1593 | version = "0.14.27" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" 1596 | dependencies = [ 1597 | "bytes", 1598 | "futures-channel", 1599 | "futures-core", 1600 | "futures-util", 1601 | "h2 0.3.22", 1602 | "http 0.2.11", 1603 | "http-body 0.4.5", 1604 | "httparse", 1605 | "httpdate", 1606 | "itoa", 1607 | "pin-project-lite", 1608 | "socket2 0.4.10", 1609 | "tokio", 1610 | "tower-service", 1611 | "tracing", 1612 | "want", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "hyper" 1617 | version = "1.1.0" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" 1620 | dependencies = [ 1621 | "bytes", 1622 | "futures-channel", 1623 | "futures-util", 1624 | "h2 0.4.2", 1625 | "http 1.0.0", 1626 | "http-body 1.0.0", 1627 | "httparse", 1628 | "httpdate", 1629 | "itoa", 1630 | "pin-project-lite", 1631 | "tokio", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "hyper-rustls" 1636 | version = "0.24.2" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1639 | dependencies = [ 1640 | "futures-util", 1641 | "http 0.2.11", 1642 | "hyper 0.14.27", 1643 | "rustls", 1644 | "tokio", 1645 | "tokio-rustls", 1646 | ] 1647 | 1648 | [[package]] 1649 | name = "hyper-util" 1650 | version = "0.1.3" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 1653 | dependencies = [ 1654 | "bytes", 1655 | "futures-util", 1656 | "http 1.0.0", 1657 | "http-body 1.0.0", 1658 | "hyper 1.1.0", 1659 | "pin-project-lite", 1660 | "socket2 0.5.5", 1661 | "tokio", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "iana-time-zone" 1666 | version = "0.1.58" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" 1669 | dependencies = [ 1670 | "android_system_properties", 1671 | "core-foundation-sys", 1672 | "iana-time-zone-haiku", 1673 | "js-sys", 1674 | "wasm-bindgen", 1675 | "windows-core", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "iana-time-zone-haiku" 1680 | version = "0.1.2" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1683 | dependencies = [ 1684 | "cc", 1685 | ] 1686 | 1687 | [[package]] 1688 | name = "idna" 1689 | version = "0.4.0" 1690 | source = "registry+https://github.com/rust-lang/crates.io-index" 1691 | checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" 1692 | dependencies = [ 1693 | "unicode-bidi", 1694 | "unicode-normalization", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "impl-codec" 1699 | version = "0.6.0" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" 1702 | dependencies = [ 1703 | "parity-scale-codec", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "impl-rlp" 1708 | version = "0.3.0" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" 1711 | dependencies = [ 1712 | "rlp", 1713 | ] 1714 | 1715 | [[package]] 1716 | name = "impl-serde" 1717 | version = "0.4.0" 1718 | source = "registry+https://github.com/rust-lang/crates.io-index" 1719 | checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" 1720 | dependencies = [ 1721 | "serde", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "impl-trait-for-tuples" 1726 | version = "0.2.2" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" 1729 | dependencies = [ 1730 | "proc-macro2", 1731 | "quote", 1732 | "syn 1.0.109", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "indenter" 1737 | version = "0.3.3" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 1740 | 1741 | [[package]] 1742 | name = "indexmap" 1743 | version = "2.1.0" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 1746 | dependencies = [ 1747 | "equivalent", 1748 | "hashbrown", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "inout" 1753 | version = "0.1.3" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 1756 | dependencies = [ 1757 | "generic-array", 1758 | ] 1759 | 1760 | [[package]] 1761 | name = "instant" 1762 | version = "0.1.12" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1765 | dependencies = [ 1766 | "cfg-if", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "ipnet" 1771 | version = "2.9.0" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 1774 | 1775 | [[package]] 1776 | name = "is-terminal" 1777 | version = "0.4.9" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" 1780 | dependencies = [ 1781 | "hermit-abi", 1782 | "rustix", 1783 | "windows-sys", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "itertools" 1788 | version = "0.10.5" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1791 | dependencies = [ 1792 | "either", 1793 | ] 1794 | 1795 | [[package]] 1796 | name = "itertools" 1797 | version = "0.11.0" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" 1800 | dependencies = [ 1801 | "either", 1802 | ] 1803 | 1804 | [[package]] 1805 | name = "itoa" 1806 | version = "1.0.9" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 1809 | 1810 | [[package]] 1811 | name = "jobserver" 1812 | version = "0.1.27" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" 1815 | dependencies = [ 1816 | "libc", 1817 | ] 1818 | 1819 | [[package]] 1820 | name = "js-sys" 1821 | version = "0.3.65" 1822 | source = "registry+https://github.com/rust-lang/crates.io-index" 1823 | checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" 1824 | dependencies = [ 1825 | "wasm-bindgen", 1826 | ] 1827 | 1828 | [[package]] 1829 | name = "jsonwebtoken" 1830 | version = "8.3.0" 1831 | source = "registry+https://github.com/rust-lang/crates.io-index" 1832 | checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" 1833 | dependencies = [ 1834 | "base64 0.21.5", 1835 | "pem", 1836 | "ring 0.16.20", 1837 | "serde", 1838 | "serde_json", 1839 | "simple_asn1", 1840 | ] 1841 | 1842 | [[package]] 1843 | name = "k256" 1844 | version = "0.13.2" 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" 1846 | checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" 1847 | dependencies = [ 1848 | "cfg-if", 1849 | "ecdsa", 1850 | "elliptic-curve", 1851 | "once_cell", 1852 | "sha2", 1853 | "signature", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "keccak" 1858 | version = "0.1.4" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" 1861 | dependencies = [ 1862 | "cpufeatures", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "lalrpop" 1867 | version = "0.20.0" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" 1870 | dependencies = [ 1871 | "ascii-canvas", 1872 | "bit-set", 1873 | "diff", 1874 | "ena", 1875 | "is-terminal", 1876 | "itertools 0.10.5", 1877 | "lalrpop-util", 1878 | "petgraph", 1879 | "regex", 1880 | "regex-syntax 0.7.5", 1881 | "string_cache", 1882 | "term", 1883 | "tiny-keccak", 1884 | "unicode-xid", 1885 | ] 1886 | 1887 | [[package]] 1888 | name = "lalrpop-util" 1889 | version = "0.20.0" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" 1892 | 1893 | [[package]] 1894 | name = "lazy_static" 1895 | version = "1.4.0" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1898 | 1899 | [[package]] 1900 | name = "libc" 1901 | version = "0.2.150" 1902 | source = "registry+https://github.com/rust-lang/crates.io-index" 1903 | checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" 1904 | 1905 | [[package]] 1906 | name = "libm" 1907 | version = "0.2.8" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 1910 | 1911 | [[package]] 1912 | name = "libredox" 1913 | version = "0.0.1" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" 1916 | dependencies = [ 1917 | "bitflags 2.4.1", 1918 | "libc", 1919 | "redox_syscall", 1920 | ] 1921 | 1922 | [[package]] 1923 | name = "linux-raw-sys" 1924 | version = "0.4.11" 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" 1926 | checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" 1927 | 1928 | [[package]] 1929 | name = "lock_api" 1930 | version = "0.4.11" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 1933 | dependencies = [ 1934 | "autocfg", 1935 | "scopeguard", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "log" 1940 | version = "0.4.20" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 1943 | 1944 | [[package]] 1945 | name = "matchers" 1946 | version = "0.1.0" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1949 | dependencies = [ 1950 | "regex-automata 0.1.10", 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "matchit" 1955 | version = "0.7.3" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1958 | 1959 | [[package]] 1960 | name = "md-5" 1961 | version = "0.10.6" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1964 | dependencies = [ 1965 | "cfg-if", 1966 | "digest", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "memchr" 1971 | version = "2.6.4" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 1974 | 1975 | [[package]] 1976 | name = "memoffset" 1977 | version = "0.9.0" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" 1980 | dependencies = [ 1981 | "autocfg", 1982 | ] 1983 | 1984 | [[package]] 1985 | name = "mime" 1986 | version = "0.3.17" 1987 | source = "registry+https://github.com/rust-lang/crates.io-index" 1988 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1989 | 1990 | [[package]] 1991 | name = "miniz_oxide" 1992 | version = "0.7.1" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1995 | dependencies = [ 1996 | "adler", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "mio" 2001 | version = "0.8.9" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" 2004 | dependencies = [ 2005 | "libc", 2006 | "wasi", 2007 | "windows-sys", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "new_debug_unreachable" 2012 | version = "1.0.4" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 2015 | 2016 | [[package]] 2017 | name = "nu-ansi-term" 2018 | version = "0.46.0" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 2021 | dependencies = [ 2022 | "overload", 2023 | "winapi", 2024 | ] 2025 | 2026 | [[package]] 2027 | name = "num-bigint" 2028 | version = "0.4.4" 2029 | source = "registry+https://github.com/rust-lang/crates.io-index" 2030 | checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" 2031 | dependencies = [ 2032 | "autocfg", 2033 | "num-integer", 2034 | "num-traits", 2035 | ] 2036 | 2037 | [[package]] 2038 | name = "num-integer" 2039 | version = "0.1.45" 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" 2041 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 2042 | dependencies = [ 2043 | "autocfg", 2044 | "num-traits", 2045 | ] 2046 | 2047 | [[package]] 2048 | name = "num-traits" 2049 | version = "0.2.17" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 2052 | dependencies = [ 2053 | "autocfg", 2054 | "libm", 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "num_cpus" 2059 | version = "1.16.0" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 2062 | dependencies = [ 2063 | "hermit-abi", 2064 | "libc", 2065 | ] 2066 | 2067 | [[package]] 2068 | name = "num_enum" 2069 | version = "0.7.1" 2070 | source = "registry+https://github.com/rust-lang/crates.io-index" 2071 | checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" 2072 | dependencies = [ 2073 | "num_enum_derive", 2074 | ] 2075 | 2076 | [[package]] 2077 | name = "num_enum_derive" 2078 | version = "0.7.1" 2079 | source = "registry+https://github.com/rust-lang/crates.io-index" 2080 | checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" 2081 | dependencies = [ 2082 | "proc-macro-crate 2.0.0", 2083 | "proc-macro2", 2084 | "quote", 2085 | "syn 2.0.39", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "object" 2090 | version = "0.32.1" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" 2093 | dependencies = [ 2094 | "memchr", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "offchain-gateway-rs" 2099 | version = "0.0.1" 2100 | dependencies = [ 2101 | "axum", 2102 | "base32", 2103 | "bech32 0.10.0-beta", 2104 | "blake2", 2105 | "bs58", 2106 | "bytes", 2107 | "chrono", 2108 | "ciborium", 2109 | "crc16", 2110 | "crc32fast", 2111 | "dotenvy", 2112 | "ethers", 2113 | "ethers-contract", 2114 | "ethers-contract-derive", 2115 | "ethers-core", 2116 | "hex", 2117 | "hex-literal", 2118 | "lazy_static", 2119 | "postgres", 2120 | "postgres-types", 2121 | "serde", 2122 | "serde_json", 2123 | "sha2", 2124 | "thiserror", 2125 | "tokio", 2126 | "tokio-postgres", 2127 | "tower-http", 2128 | "tracing", 2129 | "tracing-subscriber", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "once_cell" 2134 | version = "1.18.0" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 2137 | 2138 | [[package]] 2139 | name = "open-fastrlp" 2140 | version = "0.1.4" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" 2143 | dependencies = [ 2144 | "arrayvec", 2145 | "auto_impl", 2146 | "bytes", 2147 | "ethereum-types", 2148 | "open-fastrlp-derive", 2149 | ] 2150 | 2151 | [[package]] 2152 | name = "open-fastrlp-derive" 2153 | version = "0.1.1" 2154 | source = "registry+https://github.com/rust-lang/crates.io-index" 2155 | checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" 2156 | dependencies = [ 2157 | "bytes", 2158 | "proc-macro2", 2159 | "quote", 2160 | "syn 1.0.109", 2161 | ] 2162 | 2163 | [[package]] 2164 | name = "option-ext" 2165 | version = "0.2.0" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 2168 | 2169 | [[package]] 2170 | name = "overload" 2171 | version = "0.1.1" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2174 | 2175 | [[package]] 2176 | name = "parity-scale-codec" 2177 | version = "3.6.5" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" 2180 | dependencies = [ 2181 | "arrayvec", 2182 | "bitvec", 2183 | "byte-slice-cast", 2184 | "impl-trait-for-tuples", 2185 | "parity-scale-codec-derive", 2186 | "serde", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "parity-scale-codec-derive" 2191 | version = "3.6.5" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" 2194 | dependencies = [ 2195 | "proc-macro-crate 1.3.1", 2196 | "proc-macro2", 2197 | "quote", 2198 | "syn 1.0.109", 2199 | ] 2200 | 2201 | [[package]] 2202 | name = "parking_lot" 2203 | version = "0.12.1" 2204 | source = "registry+https://github.com/rust-lang/crates.io-index" 2205 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 2206 | dependencies = [ 2207 | "lock_api", 2208 | "parking_lot_core", 2209 | ] 2210 | 2211 | [[package]] 2212 | name = "parking_lot_core" 2213 | version = "0.9.9" 2214 | source = "registry+https://github.com/rust-lang/crates.io-index" 2215 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 2216 | dependencies = [ 2217 | "cfg-if", 2218 | "libc", 2219 | "redox_syscall", 2220 | "smallvec", 2221 | "windows-targets", 2222 | ] 2223 | 2224 | [[package]] 2225 | name = "password-hash" 2226 | version = "0.4.2" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 2229 | dependencies = [ 2230 | "base64ct", 2231 | "rand_core", 2232 | "subtle", 2233 | ] 2234 | 2235 | [[package]] 2236 | name = "path-slash" 2237 | version = "0.2.1" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" 2240 | 2241 | [[package]] 2242 | name = "pbkdf2" 2243 | version = "0.11.0" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 2246 | dependencies = [ 2247 | "digest", 2248 | "hmac", 2249 | "password-hash", 2250 | "sha2", 2251 | ] 2252 | 2253 | [[package]] 2254 | name = "pbkdf2" 2255 | version = "0.12.2" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" 2258 | dependencies = [ 2259 | "digest", 2260 | "hmac", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "pem" 2265 | version = "1.1.1" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" 2268 | dependencies = [ 2269 | "base64 0.13.1", 2270 | ] 2271 | 2272 | [[package]] 2273 | name = "percent-encoding" 2274 | version = "2.3.0" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 2277 | 2278 | [[package]] 2279 | name = "petgraph" 2280 | version = "0.6.4" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" 2283 | dependencies = [ 2284 | "fixedbitset", 2285 | "indexmap", 2286 | ] 2287 | 2288 | [[package]] 2289 | name = "pharos" 2290 | version = "0.5.3" 2291 | source = "registry+https://github.com/rust-lang/crates.io-index" 2292 | checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 2293 | dependencies = [ 2294 | "futures", 2295 | "rustc_version", 2296 | ] 2297 | 2298 | [[package]] 2299 | name = "phf" 2300 | version = "0.11.2" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 2303 | dependencies = [ 2304 | "phf_macros", 2305 | "phf_shared 0.11.2", 2306 | ] 2307 | 2308 | [[package]] 2309 | name = "phf_generator" 2310 | version = "0.11.2" 2311 | source = "registry+https://github.com/rust-lang/crates.io-index" 2312 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 2313 | dependencies = [ 2314 | "phf_shared 0.11.2", 2315 | "rand", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "phf_macros" 2320 | version = "0.11.2" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 2323 | dependencies = [ 2324 | "phf_generator", 2325 | "phf_shared 0.11.2", 2326 | "proc-macro2", 2327 | "quote", 2328 | "syn 2.0.39", 2329 | ] 2330 | 2331 | [[package]] 2332 | name = "phf_shared" 2333 | version = "0.10.0" 2334 | source = "registry+https://github.com/rust-lang/crates.io-index" 2335 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 2336 | dependencies = [ 2337 | "siphasher", 2338 | ] 2339 | 2340 | [[package]] 2341 | name = "phf_shared" 2342 | version = "0.11.2" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 2345 | dependencies = [ 2346 | "siphasher", 2347 | ] 2348 | 2349 | [[package]] 2350 | name = "pin-project" 2351 | version = "1.1.3" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" 2354 | dependencies = [ 2355 | "pin-project-internal", 2356 | ] 2357 | 2358 | [[package]] 2359 | name = "pin-project-internal" 2360 | version = "1.1.3" 2361 | source = "registry+https://github.com/rust-lang/crates.io-index" 2362 | checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" 2363 | dependencies = [ 2364 | "proc-macro2", 2365 | "quote", 2366 | "syn 2.0.39", 2367 | ] 2368 | 2369 | [[package]] 2370 | name = "pin-project-lite" 2371 | version = "0.2.13" 2372 | source = "registry+https://github.com/rust-lang/crates.io-index" 2373 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 2374 | 2375 | [[package]] 2376 | name = "pin-utils" 2377 | version = "0.1.0" 2378 | source = "registry+https://github.com/rust-lang/crates.io-index" 2379 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2380 | 2381 | [[package]] 2382 | name = "pkcs8" 2383 | version = "0.10.2" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 2386 | dependencies = [ 2387 | "der", 2388 | "spki", 2389 | ] 2390 | 2391 | [[package]] 2392 | name = "pkg-config" 2393 | version = "0.3.27" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" 2396 | 2397 | [[package]] 2398 | name = "postgres" 2399 | version = "0.19.7" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "7915b33ed60abc46040cbcaa25ffa1c7ec240668e0477c4f3070786f5916d451" 2402 | dependencies = [ 2403 | "bytes", 2404 | "fallible-iterator", 2405 | "futures-util", 2406 | "log", 2407 | "tokio", 2408 | "tokio-postgres", 2409 | ] 2410 | 2411 | [[package]] 2412 | name = "postgres-derive" 2413 | version = "0.4.5" 2414 | source = "registry+https://github.com/rust-lang/crates.io-index" 2415 | checksum = "83145eba741b050ef981a9a1838c843fa7665e154383325aa8b440ae703180a2" 2416 | dependencies = [ 2417 | "heck", 2418 | "proc-macro2", 2419 | "quote", 2420 | "syn 2.0.39", 2421 | ] 2422 | 2423 | [[package]] 2424 | name = "postgres-protocol" 2425 | version = "0.6.6" 2426 | source = "registry+https://github.com/rust-lang/crates.io-index" 2427 | checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" 2428 | dependencies = [ 2429 | "base64 0.21.5", 2430 | "byteorder", 2431 | "bytes", 2432 | "fallible-iterator", 2433 | "hmac", 2434 | "md-5", 2435 | "memchr", 2436 | "rand", 2437 | "sha2", 2438 | "stringprep", 2439 | ] 2440 | 2441 | [[package]] 2442 | name = "postgres-types" 2443 | version = "0.2.6" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" 2446 | dependencies = [ 2447 | "bytes", 2448 | "fallible-iterator", 2449 | "postgres-derive", 2450 | "postgres-protocol", 2451 | "serde", 2452 | "serde_json", 2453 | ] 2454 | 2455 | [[package]] 2456 | name = "powerfmt" 2457 | version = "0.2.0" 2458 | source = "registry+https://github.com/rust-lang/crates.io-index" 2459 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2460 | 2461 | [[package]] 2462 | name = "ppv-lite86" 2463 | version = "0.2.17" 2464 | source = "registry+https://github.com/rust-lang/crates.io-index" 2465 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2466 | 2467 | [[package]] 2468 | name = "precomputed-hash" 2469 | version = "0.1.1" 2470 | source = "registry+https://github.com/rust-lang/crates.io-index" 2471 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2472 | 2473 | [[package]] 2474 | name = "prettyplease" 2475 | version = "0.2.15" 2476 | source = "registry+https://github.com/rust-lang/crates.io-index" 2477 | checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" 2478 | dependencies = [ 2479 | "proc-macro2", 2480 | "syn 2.0.39", 2481 | ] 2482 | 2483 | [[package]] 2484 | name = "primitive-types" 2485 | version = "0.12.2" 2486 | source = "registry+https://github.com/rust-lang/crates.io-index" 2487 | checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" 2488 | dependencies = [ 2489 | "fixed-hash", 2490 | "impl-codec", 2491 | "impl-rlp", 2492 | "impl-serde", 2493 | "scale-info", 2494 | "uint", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "proc-macro-crate" 2499 | version = "1.3.1" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 2502 | dependencies = [ 2503 | "once_cell", 2504 | "toml_edit 0.19.15", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "proc-macro-crate" 2509 | version = "2.0.0" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 2512 | dependencies = [ 2513 | "toml_edit 0.20.7", 2514 | ] 2515 | 2516 | [[package]] 2517 | name = "proc-macro-error" 2518 | version = "1.0.4" 2519 | source = "registry+https://github.com/rust-lang/crates.io-index" 2520 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2521 | dependencies = [ 2522 | "proc-macro-error-attr", 2523 | "proc-macro2", 2524 | "quote", 2525 | "syn 1.0.109", 2526 | "version_check", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "proc-macro-error-attr" 2531 | version = "1.0.4" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2534 | dependencies = [ 2535 | "proc-macro2", 2536 | "quote", 2537 | "version_check", 2538 | ] 2539 | 2540 | [[package]] 2541 | name = "proc-macro2" 2542 | version = "1.0.69" 2543 | source = "registry+https://github.com/rust-lang/crates.io-index" 2544 | checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" 2545 | dependencies = [ 2546 | "unicode-ident", 2547 | ] 2548 | 2549 | [[package]] 2550 | name = "proptest" 2551 | version = "1.4.0" 2552 | source = "registry+https://github.com/rust-lang/crates.io-index" 2553 | checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" 2554 | dependencies = [ 2555 | "bitflags 2.4.1", 2556 | "lazy_static", 2557 | "num-traits", 2558 | "rand", 2559 | "rand_chacha", 2560 | "rand_xorshift", 2561 | "regex-syntax 0.8.2", 2562 | "unarray", 2563 | ] 2564 | 2565 | [[package]] 2566 | name = "quote" 2567 | version = "1.0.33" 2568 | source = "registry+https://github.com/rust-lang/crates.io-index" 2569 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 2570 | dependencies = [ 2571 | "proc-macro2", 2572 | ] 2573 | 2574 | [[package]] 2575 | name = "radium" 2576 | version = "0.7.0" 2577 | source = "registry+https://github.com/rust-lang/crates.io-index" 2578 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 2579 | 2580 | [[package]] 2581 | name = "rand" 2582 | version = "0.8.5" 2583 | source = "registry+https://github.com/rust-lang/crates.io-index" 2584 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2585 | dependencies = [ 2586 | "libc", 2587 | "rand_chacha", 2588 | "rand_core", 2589 | ] 2590 | 2591 | [[package]] 2592 | name = "rand_chacha" 2593 | version = "0.3.1" 2594 | source = "registry+https://github.com/rust-lang/crates.io-index" 2595 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2596 | dependencies = [ 2597 | "ppv-lite86", 2598 | "rand_core", 2599 | ] 2600 | 2601 | [[package]] 2602 | name = "rand_core" 2603 | version = "0.6.4" 2604 | source = "registry+https://github.com/rust-lang/crates.io-index" 2605 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2606 | dependencies = [ 2607 | "getrandom", 2608 | ] 2609 | 2610 | [[package]] 2611 | name = "rand_xorshift" 2612 | version = "0.3.0" 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" 2614 | checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" 2615 | dependencies = [ 2616 | "rand_core", 2617 | ] 2618 | 2619 | [[package]] 2620 | name = "rayon" 2621 | version = "1.8.0" 2622 | source = "registry+https://github.com/rust-lang/crates.io-index" 2623 | checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" 2624 | dependencies = [ 2625 | "either", 2626 | "rayon-core", 2627 | ] 2628 | 2629 | [[package]] 2630 | name = "rayon-core" 2631 | version = "1.12.0" 2632 | source = "registry+https://github.com/rust-lang/crates.io-index" 2633 | checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" 2634 | dependencies = [ 2635 | "crossbeam-deque", 2636 | "crossbeam-utils", 2637 | ] 2638 | 2639 | [[package]] 2640 | name = "redox_syscall" 2641 | version = "0.4.1" 2642 | source = "registry+https://github.com/rust-lang/crates.io-index" 2643 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 2644 | dependencies = [ 2645 | "bitflags 1.3.2", 2646 | ] 2647 | 2648 | [[package]] 2649 | name = "redox_users" 2650 | version = "0.4.4" 2651 | source = "registry+https://github.com/rust-lang/crates.io-index" 2652 | checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" 2653 | dependencies = [ 2654 | "getrandom", 2655 | "libredox", 2656 | "thiserror", 2657 | ] 2658 | 2659 | [[package]] 2660 | name = "regex" 2661 | version = "1.10.2" 2662 | source = "registry+https://github.com/rust-lang/crates.io-index" 2663 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 2664 | dependencies = [ 2665 | "aho-corasick", 2666 | "memchr", 2667 | "regex-automata 0.4.3", 2668 | "regex-syntax 0.8.2", 2669 | ] 2670 | 2671 | [[package]] 2672 | name = "regex-automata" 2673 | version = "0.1.10" 2674 | source = "registry+https://github.com/rust-lang/crates.io-index" 2675 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2676 | dependencies = [ 2677 | "regex-syntax 0.6.29", 2678 | ] 2679 | 2680 | [[package]] 2681 | name = "regex-automata" 2682 | version = "0.4.3" 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" 2684 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 2685 | dependencies = [ 2686 | "aho-corasick", 2687 | "memchr", 2688 | "regex-syntax 0.8.2", 2689 | ] 2690 | 2691 | [[package]] 2692 | name = "regex-syntax" 2693 | version = "0.6.29" 2694 | source = "registry+https://github.com/rust-lang/crates.io-index" 2695 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 2696 | 2697 | [[package]] 2698 | name = "regex-syntax" 2699 | version = "0.7.5" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" 2702 | 2703 | [[package]] 2704 | name = "regex-syntax" 2705 | version = "0.8.2" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 2708 | 2709 | [[package]] 2710 | name = "reqwest" 2711 | version = "0.11.22" 2712 | source = "registry+https://github.com/rust-lang/crates.io-index" 2713 | checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" 2714 | dependencies = [ 2715 | "base64 0.21.5", 2716 | "bytes", 2717 | "encoding_rs", 2718 | "futures-core", 2719 | "futures-util", 2720 | "h2 0.3.22", 2721 | "http 0.2.11", 2722 | "http-body 0.4.5", 2723 | "hyper 0.14.27", 2724 | "hyper-rustls", 2725 | "ipnet", 2726 | "js-sys", 2727 | "log", 2728 | "mime", 2729 | "once_cell", 2730 | "percent-encoding", 2731 | "pin-project-lite", 2732 | "rustls", 2733 | "rustls-pemfile", 2734 | "serde", 2735 | "serde_json", 2736 | "serde_urlencoded", 2737 | "system-configuration", 2738 | "tokio", 2739 | "tokio-rustls", 2740 | "tower-service", 2741 | "url", 2742 | "wasm-bindgen", 2743 | "wasm-bindgen-futures", 2744 | "web-sys", 2745 | "webpki-roots", 2746 | "winreg", 2747 | ] 2748 | 2749 | [[package]] 2750 | name = "rfc6979" 2751 | version = "0.4.0" 2752 | source = "registry+https://github.com/rust-lang/crates.io-index" 2753 | checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 2754 | dependencies = [ 2755 | "hmac", 2756 | "subtle", 2757 | ] 2758 | 2759 | [[package]] 2760 | name = "ring" 2761 | version = "0.16.20" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 2764 | dependencies = [ 2765 | "cc", 2766 | "libc", 2767 | "once_cell", 2768 | "spin 0.5.2", 2769 | "untrusted 0.7.1", 2770 | "web-sys", 2771 | "winapi", 2772 | ] 2773 | 2774 | [[package]] 2775 | name = "ring" 2776 | version = "0.17.5" 2777 | source = "registry+https://github.com/rust-lang/crates.io-index" 2778 | checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" 2779 | dependencies = [ 2780 | "cc", 2781 | "getrandom", 2782 | "libc", 2783 | "spin 0.9.8", 2784 | "untrusted 0.9.0", 2785 | "windows-sys", 2786 | ] 2787 | 2788 | [[package]] 2789 | name = "ripemd" 2790 | version = "0.1.3" 2791 | source = "registry+https://github.com/rust-lang/crates.io-index" 2792 | checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" 2793 | dependencies = [ 2794 | "digest", 2795 | ] 2796 | 2797 | [[package]] 2798 | name = "rlp" 2799 | version = "0.5.2" 2800 | source = "registry+https://github.com/rust-lang/crates.io-index" 2801 | checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" 2802 | dependencies = [ 2803 | "bytes", 2804 | "rlp-derive", 2805 | "rustc-hex", 2806 | ] 2807 | 2808 | [[package]] 2809 | name = "rlp-derive" 2810 | version = "0.1.0" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" 2813 | dependencies = [ 2814 | "proc-macro2", 2815 | "quote", 2816 | "syn 1.0.109", 2817 | ] 2818 | 2819 | [[package]] 2820 | name = "rustc-demangle" 2821 | version = "0.1.23" 2822 | source = "registry+https://github.com/rust-lang/crates.io-index" 2823 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 2824 | 2825 | [[package]] 2826 | name = "rustc-hex" 2827 | version = "2.1.0" 2828 | source = "registry+https://github.com/rust-lang/crates.io-index" 2829 | checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" 2830 | 2831 | [[package]] 2832 | name = "rustc_version" 2833 | version = "0.4.0" 2834 | source = "registry+https://github.com/rust-lang/crates.io-index" 2835 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2836 | dependencies = [ 2837 | "semver", 2838 | ] 2839 | 2840 | [[package]] 2841 | name = "rustix" 2842 | version = "0.38.24" 2843 | source = "registry+https://github.com/rust-lang/crates.io-index" 2844 | checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" 2845 | dependencies = [ 2846 | "bitflags 2.4.1", 2847 | "errno", 2848 | "libc", 2849 | "linux-raw-sys", 2850 | "windows-sys", 2851 | ] 2852 | 2853 | [[package]] 2854 | name = "rustls" 2855 | version = "0.21.9" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" 2858 | dependencies = [ 2859 | "log", 2860 | "ring 0.17.5", 2861 | "rustls-webpki", 2862 | "sct", 2863 | ] 2864 | 2865 | [[package]] 2866 | name = "rustls-pemfile" 2867 | version = "1.0.4" 2868 | source = "registry+https://github.com/rust-lang/crates.io-index" 2869 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2870 | dependencies = [ 2871 | "base64 0.21.5", 2872 | ] 2873 | 2874 | [[package]] 2875 | name = "rustls-webpki" 2876 | version = "0.101.7" 2877 | source = "registry+https://github.com/rust-lang/crates.io-index" 2878 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 2879 | dependencies = [ 2880 | "ring 0.17.5", 2881 | "untrusted 0.9.0", 2882 | ] 2883 | 2884 | [[package]] 2885 | name = "rustversion" 2886 | version = "1.0.14" 2887 | source = "registry+https://github.com/rust-lang/crates.io-index" 2888 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 2889 | 2890 | [[package]] 2891 | name = "ryu" 2892 | version = "1.0.15" 2893 | source = "registry+https://github.com/rust-lang/crates.io-index" 2894 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 2895 | 2896 | [[package]] 2897 | name = "salsa20" 2898 | version = "0.10.2" 2899 | source = "registry+https://github.com/rust-lang/crates.io-index" 2900 | checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" 2901 | dependencies = [ 2902 | "cipher", 2903 | ] 2904 | 2905 | [[package]] 2906 | name = "same-file" 2907 | version = "1.0.6" 2908 | source = "registry+https://github.com/rust-lang/crates.io-index" 2909 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2910 | dependencies = [ 2911 | "winapi-util", 2912 | ] 2913 | 2914 | [[package]] 2915 | name = "scale-info" 2916 | version = "2.10.0" 2917 | source = "registry+https://github.com/rust-lang/crates.io-index" 2918 | checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" 2919 | dependencies = [ 2920 | "cfg-if", 2921 | "derive_more", 2922 | "parity-scale-codec", 2923 | "scale-info-derive", 2924 | ] 2925 | 2926 | [[package]] 2927 | name = "scale-info-derive" 2928 | version = "2.10.0" 2929 | source = "registry+https://github.com/rust-lang/crates.io-index" 2930 | checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" 2931 | dependencies = [ 2932 | "proc-macro-crate 1.3.1", 2933 | "proc-macro2", 2934 | "quote", 2935 | "syn 1.0.109", 2936 | ] 2937 | 2938 | [[package]] 2939 | name = "scopeguard" 2940 | version = "1.2.0" 2941 | source = "registry+https://github.com/rust-lang/crates.io-index" 2942 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2943 | 2944 | [[package]] 2945 | name = "scrypt" 2946 | version = "0.10.0" 2947 | source = "registry+https://github.com/rust-lang/crates.io-index" 2948 | checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" 2949 | dependencies = [ 2950 | "hmac", 2951 | "pbkdf2 0.11.0", 2952 | "salsa20", 2953 | "sha2", 2954 | ] 2955 | 2956 | [[package]] 2957 | name = "sct" 2958 | version = "0.7.1" 2959 | source = "registry+https://github.com/rust-lang/crates.io-index" 2960 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 2961 | dependencies = [ 2962 | "ring 0.17.5", 2963 | "untrusted 0.9.0", 2964 | ] 2965 | 2966 | [[package]] 2967 | name = "sec1" 2968 | version = "0.7.3" 2969 | source = "registry+https://github.com/rust-lang/crates.io-index" 2970 | checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 2971 | dependencies = [ 2972 | "base16ct", 2973 | "der", 2974 | "generic-array", 2975 | "pkcs8", 2976 | "subtle", 2977 | "zeroize", 2978 | ] 2979 | 2980 | [[package]] 2981 | name = "semver" 2982 | version = "1.0.20" 2983 | source = "registry+https://github.com/rust-lang/crates.io-index" 2984 | checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" 2985 | dependencies = [ 2986 | "serde", 2987 | ] 2988 | 2989 | [[package]] 2990 | name = "send_wrapper" 2991 | version = "0.4.0" 2992 | source = "registry+https://github.com/rust-lang/crates.io-index" 2993 | checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" 2994 | 2995 | [[package]] 2996 | name = "send_wrapper" 2997 | version = "0.6.0" 2998 | source = "registry+https://github.com/rust-lang/crates.io-index" 2999 | checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 3000 | 3001 | [[package]] 3002 | name = "serde" 3003 | version = "1.0.193" 3004 | source = "registry+https://github.com/rust-lang/crates.io-index" 3005 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 3006 | dependencies = [ 3007 | "serde_derive", 3008 | ] 3009 | 3010 | [[package]] 3011 | name = "serde_derive" 3012 | version = "1.0.193" 3013 | source = "registry+https://github.com/rust-lang/crates.io-index" 3014 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 3015 | dependencies = [ 3016 | "proc-macro2", 3017 | "quote", 3018 | "syn 2.0.39", 3019 | ] 3020 | 3021 | [[package]] 3022 | name = "serde_json" 3023 | version = "1.0.108" 3024 | source = "registry+https://github.com/rust-lang/crates.io-index" 3025 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" 3026 | dependencies = [ 3027 | "itoa", 3028 | "ryu", 3029 | "serde", 3030 | ] 3031 | 3032 | [[package]] 3033 | name = "serde_path_to_error" 3034 | version = "0.1.14" 3035 | source = "registry+https://github.com/rust-lang/crates.io-index" 3036 | checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" 3037 | dependencies = [ 3038 | "itoa", 3039 | "serde", 3040 | ] 3041 | 3042 | [[package]] 3043 | name = "serde_spanned" 3044 | version = "0.6.4" 3045 | source = "registry+https://github.com/rust-lang/crates.io-index" 3046 | checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" 3047 | dependencies = [ 3048 | "serde", 3049 | ] 3050 | 3051 | [[package]] 3052 | name = "serde_urlencoded" 3053 | version = "0.7.1" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 3056 | dependencies = [ 3057 | "form_urlencoded", 3058 | "itoa", 3059 | "ryu", 3060 | "serde", 3061 | ] 3062 | 3063 | [[package]] 3064 | name = "sha1" 3065 | version = "0.10.6" 3066 | source = "registry+https://github.com/rust-lang/crates.io-index" 3067 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3068 | dependencies = [ 3069 | "cfg-if", 3070 | "cpufeatures", 3071 | "digest", 3072 | ] 3073 | 3074 | [[package]] 3075 | name = "sha2" 3076 | version = "0.10.8" 3077 | source = "registry+https://github.com/rust-lang/crates.io-index" 3078 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 3079 | dependencies = [ 3080 | "cfg-if", 3081 | "cpufeatures", 3082 | "digest", 3083 | ] 3084 | 3085 | [[package]] 3086 | name = "sha3" 3087 | version = "0.10.8" 3088 | source = "registry+https://github.com/rust-lang/crates.io-index" 3089 | checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 3090 | dependencies = [ 3091 | "digest", 3092 | "keccak", 3093 | ] 3094 | 3095 | [[package]] 3096 | name = "sharded-slab" 3097 | version = "0.1.7" 3098 | source = "registry+https://github.com/rust-lang/crates.io-index" 3099 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 3100 | dependencies = [ 3101 | "lazy_static", 3102 | ] 3103 | 3104 | [[package]] 3105 | name = "signal-hook-registry" 3106 | version = "1.4.1" 3107 | source = "registry+https://github.com/rust-lang/crates.io-index" 3108 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 3109 | dependencies = [ 3110 | "libc", 3111 | ] 3112 | 3113 | [[package]] 3114 | name = "signature" 3115 | version = "2.2.0" 3116 | source = "registry+https://github.com/rust-lang/crates.io-index" 3117 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 3118 | dependencies = [ 3119 | "digest", 3120 | "rand_core", 3121 | ] 3122 | 3123 | [[package]] 3124 | name = "simple_asn1" 3125 | version = "0.6.2" 3126 | source = "registry+https://github.com/rust-lang/crates.io-index" 3127 | checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" 3128 | dependencies = [ 3129 | "num-bigint", 3130 | "num-traits", 3131 | "thiserror", 3132 | "time", 3133 | ] 3134 | 3135 | [[package]] 3136 | name = "siphasher" 3137 | version = "0.3.11" 3138 | source = "registry+https://github.com/rust-lang/crates.io-index" 3139 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 3140 | 3141 | [[package]] 3142 | name = "slab" 3143 | version = "0.4.9" 3144 | source = "registry+https://github.com/rust-lang/crates.io-index" 3145 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 3146 | dependencies = [ 3147 | "autocfg", 3148 | ] 3149 | 3150 | [[package]] 3151 | name = "smallvec" 3152 | version = "1.11.2" 3153 | source = "registry+https://github.com/rust-lang/crates.io-index" 3154 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 3155 | 3156 | [[package]] 3157 | name = "socket2" 3158 | version = "0.4.10" 3159 | source = "registry+https://github.com/rust-lang/crates.io-index" 3160 | checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" 3161 | dependencies = [ 3162 | "libc", 3163 | "winapi", 3164 | ] 3165 | 3166 | [[package]] 3167 | name = "socket2" 3168 | version = "0.5.5" 3169 | source = "registry+https://github.com/rust-lang/crates.io-index" 3170 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 3171 | dependencies = [ 3172 | "libc", 3173 | "windows-sys", 3174 | ] 3175 | 3176 | [[package]] 3177 | name = "solang-parser" 3178 | version = "0.3.2" 3179 | source = "registry+https://github.com/rust-lang/crates.io-index" 3180 | checksum = "7cb9fa2fa2fa6837be8a2495486ff92e3ffe68a99b6eeba288e139efdd842457" 3181 | dependencies = [ 3182 | "itertools 0.11.0", 3183 | "lalrpop", 3184 | "lalrpop-util", 3185 | "phf", 3186 | "thiserror", 3187 | "unicode-xid", 3188 | ] 3189 | 3190 | [[package]] 3191 | name = "spin" 3192 | version = "0.5.2" 3193 | source = "registry+https://github.com/rust-lang/crates.io-index" 3194 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 3195 | 3196 | [[package]] 3197 | name = "spin" 3198 | version = "0.9.8" 3199 | source = "registry+https://github.com/rust-lang/crates.io-index" 3200 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3201 | 3202 | [[package]] 3203 | name = "spki" 3204 | version = "0.7.2" 3205 | source = "registry+https://github.com/rust-lang/crates.io-index" 3206 | checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" 3207 | dependencies = [ 3208 | "base64ct", 3209 | "der", 3210 | ] 3211 | 3212 | [[package]] 3213 | name = "static_assertions" 3214 | version = "1.1.0" 3215 | source = "registry+https://github.com/rust-lang/crates.io-index" 3216 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3217 | 3218 | [[package]] 3219 | name = "string_cache" 3220 | version = "0.8.7" 3221 | source = "registry+https://github.com/rust-lang/crates.io-index" 3222 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 3223 | dependencies = [ 3224 | "new_debug_unreachable", 3225 | "once_cell", 3226 | "parking_lot", 3227 | "phf_shared 0.10.0", 3228 | "precomputed-hash", 3229 | ] 3230 | 3231 | [[package]] 3232 | name = "stringprep" 3233 | version = "0.1.4" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" 3236 | dependencies = [ 3237 | "finl_unicode", 3238 | "unicode-bidi", 3239 | "unicode-normalization", 3240 | ] 3241 | 3242 | [[package]] 3243 | name = "strum" 3244 | version = "0.25.0" 3245 | source = "registry+https://github.com/rust-lang/crates.io-index" 3246 | checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" 3247 | dependencies = [ 3248 | "strum_macros", 3249 | ] 3250 | 3251 | [[package]] 3252 | name = "strum_macros" 3253 | version = "0.25.3" 3254 | source = "registry+https://github.com/rust-lang/crates.io-index" 3255 | checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" 3256 | dependencies = [ 3257 | "heck", 3258 | "proc-macro2", 3259 | "quote", 3260 | "rustversion", 3261 | "syn 2.0.39", 3262 | ] 3263 | 3264 | [[package]] 3265 | name = "subtle" 3266 | version = "2.5.0" 3267 | source = "registry+https://github.com/rust-lang/crates.io-index" 3268 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 3269 | 3270 | [[package]] 3271 | name = "svm-rs" 3272 | version = "0.3.3" 3273 | source = "registry+https://github.com/rust-lang/crates.io-index" 3274 | checksum = "20689c7d03b6461b502d0b95d6c24874c7d24dea2688af80486a130a06af3b07" 3275 | dependencies = [ 3276 | "dirs", 3277 | "fs2", 3278 | "hex", 3279 | "once_cell", 3280 | "reqwest", 3281 | "semver", 3282 | "serde", 3283 | "serde_json", 3284 | "sha2", 3285 | "thiserror", 3286 | "url", 3287 | "zip", 3288 | ] 3289 | 3290 | [[package]] 3291 | name = "syn" 3292 | version = "1.0.109" 3293 | source = "registry+https://github.com/rust-lang/crates.io-index" 3294 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 3295 | dependencies = [ 3296 | "proc-macro2", 3297 | "quote", 3298 | "unicode-ident", 3299 | ] 3300 | 3301 | [[package]] 3302 | name = "syn" 3303 | version = "2.0.39" 3304 | source = "registry+https://github.com/rust-lang/crates.io-index" 3305 | checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" 3306 | dependencies = [ 3307 | "proc-macro2", 3308 | "quote", 3309 | "unicode-ident", 3310 | ] 3311 | 3312 | [[package]] 3313 | name = "sync_wrapper" 3314 | version = "0.1.2" 3315 | source = "registry+https://github.com/rust-lang/crates.io-index" 3316 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 3317 | 3318 | [[package]] 3319 | name = "system-configuration" 3320 | version = "0.5.1" 3321 | source = "registry+https://github.com/rust-lang/crates.io-index" 3322 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 3323 | dependencies = [ 3324 | "bitflags 1.3.2", 3325 | "core-foundation", 3326 | "system-configuration-sys", 3327 | ] 3328 | 3329 | [[package]] 3330 | name = "system-configuration-sys" 3331 | version = "0.5.0" 3332 | source = "registry+https://github.com/rust-lang/crates.io-index" 3333 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 3334 | dependencies = [ 3335 | "core-foundation-sys", 3336 | "libc", 3337 | ] 3338 | 3339 | [[package]] 3340 | name = "tap" 3341 | version = "1.0.1" 3342 | source = "registry+https://github.com/rust-lang/crates.io-index" 3343 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 3344 | 3345 | [[package]] 3346 | name = "tempfile" 3347 | version = "3.8.1" 3348 | source = "registry+https://github.com/rust-lang/crates.io-index" 3349 | checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" 3350 | dependencies = [ 3351 | "cfg-if", 3352 | "fastrand", 3353 | "redox_syscall", 3354 | "rustix", 3355 | "windows-sys", 3356 | ] 3357 | 3358 | [[package]] 3359 | name = "term" 3360 | version = "0.7.0" 3361 | source = "registry+https://github.com/rust-lang/crates.io-index" 3362 | checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" 3363 | dependencies = [ 3364 | "dirs-next", 3365 | "rustversion", 3366 | "winapi", 3367 | ] 3368 | 3369 | [[package]] 3370 | name = "thiserror" 3371 | version = "1.0.50" 3372 | source = "registry+https://github.com/rust-lang/crates.io-index" 3373 | checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" 3374 | dependencies = [ 3375 | "thiserror-impl", 3376 | ] 3377 | 3378 | [[package]] 3379 | name = "thiserror-impl" 3380 | version = "1.0.50" 3381 | source = "registry+https://github.com/rust-lang/crates.io-index" 3382 | checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" 3383 | dependencies = [ 3384 | "proc-macro2", 3385 | "quote", 3386 | "syn 2.0.39", 3387 | ] 3388 | 3389 | [[package]] 3390 | name = "thread_local" 3391 | version = "1.1.7" 3392 | source = "registry+https://github.com/rust-lang/crates.io-index" 3393 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 3394 | dependencies = [ 3395 | "cfg-if", 3396 | "once_cell", 3397 | ] 3398 | 3399 | [[package]] 3400 | name = "time" 3401 | version = "0.3.30" 3402 | source = "registry+https://github.com/rust-lang/crates.io-index" 3403 | checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" 3404 | dependencies = [ 3405 | "deranged", 3406 | "itoa", 3407 | "powerfmt", 3408 | "serde", 3409 | "time-core", 3410 | "time-macros", 3411 | ] 3412 | 3413 | [[package]] 3414 | name = "time-core" 3415 | version = "0.1.2" 3416 | source = "registry+https://github.com/rust-lang/crates.io-index" 3417 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 3418 | 3419 | [[package]] 3420 | name = "time-macros" 3421 | version = "0.2.15" 3422 | source = "registry+https://github.com/rust-lang/crates.io-index" 3423 | checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" 3424 | dependencies = [ 3425 | "time-core", 3426 | ] 3427 | 3428 | [[package]] 3429 | name = "tiny-keccak" 3430 | version = "2.0.2" 3431 | source = "registry+https://github.com/rust-lang/crates.io-index" 3432 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 3433 | dependencies = [ 3434 | "crunchy", 3435 | ] 3436 | 3437 | [[package]] 3438 | name = "tinyvec" 3439 | version = "1.6.0" 3440 | source = "registry+https://github.com/rust-lang/crates.io-index" 3441 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3442 | dependencies = [ 3443 | "tinyvec_macros", 3444 | ] 3445 | 3446 | [[package]] 3447 | name = "tinyvec_macros" 3448 | version = "0.1.1" 3449 | source = "registry+https://github.com/rust-lang/crates.io-index" 3450 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3451 | 3452 | [[package]] 3453 | name = "tokio" 3454 | version = "1.34.0" 3455 | source = "registry+https://github.com/rust-lang/crates.io-index" 3456 | checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" 3457 | dependencies = [ 3458 | "backtrace", 3459 | "bytes", 3460 | "libc", 3461 | "mio", 3462 | "num_cpus", 3463 | "parking_lot", 3464 | "pin-project-lite", 3465 | "signal-hook-registry", 3466 | "socket2 0.5.5", 3467 | "tokio-macros", 3468 | "windows-sys", 3469 | ] 3470 | 3471 | [[package]] 3472 | name = "tokio-macros" 3473 | version = "2.2.0" 3474 | source = "registry+https://github.com/rust-lang/crates.io-index" 3475 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 3476 | dependencies = [ 3477 | "proc-macro2", 3478 | "quote", 3479 | "syn 2.0.39", 3480 | ] 3481 | 3482 | [[package]] 3483 | name = "tokio-postgres" 3484 | version = "0.7.10" 3485 | source = "registry+https://github.com/rust-lang/crates.io-index" 3486 | checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8" 3487 | dependencies = [ 3488 | "async-trait", 3489 | "byteorder", 3490 | "bytes", 3491 | "fallible-iterator", 3492 | "futures-channel", 3493 | "futures-util", 3494 | "log", 3495 | "parking_lot", 3496 | "percent-encoding", 3497 | "phf", 3498 | "pin-project-lite", 3499 | "postgres-protocol", 3500 | "postgres-types", 3501 | "rand", 3502 | "socket2 0.5.5", 3503 | "tokio", 3504 | "tokio-util", 3505 | "whoami", 3506 | ] 3507 | 3508 | [[package]] 3509 | name = "tokio-rustls" 3510 | version = "0.24.1" 3511 | source = "registry+https://github.com/rust-lang/crates.io-index" 3512 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 3513 | dependencies = [ 3514 | "rustls", 3515 | "tokio", 3516 | ] 3517 | 3518 | [[package]] 3519 | name = "tokio-tungstenite" 3520 | version = "0.20.1" 3521 | source = "registry+https://github.com/rust-lang/crates.io-index" 3522 | checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" 3523 | dependencies = [ 3524 | "futures-util", 3525 | "log", 3526 | "rustls", 3527 | "tokio", 3528 | "tokio-rustls", 3529 | "tungstenite", 3530 | "webpki-roots", 3531 | ] 3532 | 3533 | [[package]] 3534 | name = "tokio-util" 3535 | version = "0.7.10" 3536 | source = "registry+https://github.com/rust-lang/crates.io-index" 3537 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 3538 | dependencies = [ 3539 | "bytes", 3540 | "futures-core", 3541 | "futures-sink", 3542 | "pin-project-lite", 3543 | "tokio", 3544 | "tracing", 3545 | ] 3546 | 3547 | [[package]] 3548 | name = "toml" 3549 | version = "0.8.8" 3550 | source = "registry+https://github.com/rust-lang/crates.io-index" 3551 | checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" 3552 | dependencies = [ 3553 | "serde", 3554 | "serde_spanned", 3555 | "toml_datetime", 3556 | "toml_edit 0.21.0", 3557 | ] 3558 | 3559 | [[package]] 3560 | name = "toml_datetime" 3561 | version = "0.6.5" 3562 | source = "registry+https://github.com/rust-lang/crates.io-index" 3563 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 3564 | dependencies = [ 3565 | "serde", 3566 | ] 3567 | 3568 | [[package]] 3569 | name = "toml_edit" 3570 | version = "0.19.15" 3571 | source = "registry+https://github.com/rust-lang/crates.io-index" 3572 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 3573 | dependencies = [ 3574 | "indexmap", 3575 | "toml_datetime", 3576 | "winnow", 3577 | ] 3578 | 3579 | [[package]] 3580 | name = "toml_edit" 3581 | version = "0.20.7" 3582 | source = "registry+https://github.com/rust-lang/crates.io-index" 3583 | checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 3584 | dependencies = [ 3585 | "indexmap", 3586 | "toml_datetime", 3587 | "winnow", 3588 | ] 3589 | 3590 | [[package]] 3591 | name = "toml_edit" 3592 | version = "0.21.0" 3593 | source = "registry+https://github.com/rust-lang/crates.io-index" 3594 | checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" 3595 | dependencies = [ 3596 | "indexmap", 3597 | "serde", 3598 | "serde_spanned", 3599 | "toml_datetime", 3600 | "winnow", 3601 | ] 3602 | 3603 | [[package]] 3604 | name = "tower" 3605 | version = "0.4.13" 3606 | source = "registry+https://github.com/rust-lang/crates.io-index" 3607 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 3608 | dependencies = [ 3609 | "futures-core", 3610 | "futures-util", 3611 | "pin-project", 3612 | "pin-project-lite", 3613 | "tokio", 3614 | "tower-layer", 3615 | "tower-service", 3616 | "tracing", 3617 | ] 3618 | 3619 | [[package]] 3620 | name = "tower-http" 3621 | version = "0.5.1" 3622 | source = "registry+https://github.com/rust-lang/crates.io-index" 3623 | checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" 3624 | dependencies = [ 3625 | "bitflags 2.4.1", 3626 | "bytes", 3627 | "http 1.0.0", 3628 | "http-body 1.0.0", 3629 | "http-body-util", 3630 | "pin-project-lite", 3631 | "tower-layer", 3632 | "tower-service", 3633 | ] 3634 | 3635 | [[package]] 3636 | name = "tower-layer" 3637 | version = "0.3.2" 3638 | source = "registry+https://github.com/rust-lang/crates.io-index" 3639 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 3640 | 3641 | [[package]] 3642 | name = "tower-service" 3643 | version = "0.3.2" 3644 | source = "registry+https://github.com/rust-lang/crates.io-index" 3645 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3646 | 3647 | [[package]] 3648 | name = "tracing" 3649 | version = "0.1.40" 3650 | source = "registry+https://github.com/rust-lang/crates.io-index" 3651 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 3652 | dependencies = [ 3653 | "log", 3654 | "pin-project-lite", 3655 | "tracing-attributes", 3656 | "tracing-core", 3657 | ] 3658 | 3659 | [[package]] 3660 | name = "tracing-attributes" 3661 | version = "0.1.27" 3662 | source = "registry+https://github.com/rust-lang/crates.io-index" 3663 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 3664 | dependencies = [ 3665 | "proc-macro2", 3666 | "quote", 3667 | "syn 2.0.39", 3668 | ] 3669 | 3670 | [[package]] 3671 | name = "tracing-core" 3672 | version = "0.1.32" 3673 | source = "registry+https://github.com/rust-lang/crates.io-index" 3674 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 3675 | dependencies = [ 3676 | "once_cell", 3677 | "valuable", 3678 | ] 3679 | 3680 | [[package]] 3681 | name = "tracing-futures" 3682 | version = "0.2.5" 3683 | source = "registry+https://github.com/rust-lang/crates.io-index" 3684 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 3685 | dependencies = [ 3686 | "pin-project", 3687 | "tracing", 3688 | ] 3689 | 3690 | [[package]] 3691 | name = "tracing-log" 3692 | version = "0.2.0" 3693 | source = "registry+https://github.com/rust-lang/crates.io-index" 3694 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3695 | dependencies = [ 3696 | "log", 3697 | "once_cell", 3698 | "tracing-core", 3699 | ] 3700 | 3701 | [[package]] 3702 | name = "tracing-subscriber" 3703 | version = "0.3.18" 3704 | source = "registry+https://github.com/rust-lang/crates.io-index" 3705 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 3706 | dependencies = [ 3707 | "matchers", 3708 | "nu-ansi-term", 3709 | "once_cell", 3710 | "regex", 3711 | "sharded-slab", 3712 | "smallvec", 3713 | "thread_local", 3714 | "tracing", 3715 | "tracing-core", 3716 | "tracing-log", 3717 | ] 3718 | 3719 | [[package]] 3720 | name = "try-lock" 3721 | version = "0.2.4" 3722 | source = "registry+https://github.com/rust-lang/crates.io-index" 3723 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 3724 | 3725 | [[package]] 3726 | name = "tungstenite" 3727 | version = "0.20.1" 3728 | source = "registry+https://github.com/rust-lang/crates.io-index" 3729 | checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" 3730 | dependencies = [ 3731 | "byteorder", 3732 | "bytes", 3733 | "data-encoding", 3734 | "http 0.2.11", 3735 | "httparse", 3736 | "log", 3737 | "rand", 3738 | "rustls", 3739 | "sha1", 3740 | "thiserror", 3741 | "url", 3742 | "utf-8", 3743 | ] 3744 | 3745 | [[package]] 3746 | name = "typenum" 3747 | version = "1.17.0" 3748 | source = "registry+https://github.com/rust-lang/crates.io-index" 3749 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 3750 | 3751 | [[package]] 3752 | name = "uint" 3753 | version = "0.9.5" 3754 | source = "registry+https://github.com/rust-lang/crates.io-index" 3755 | checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" 3756 | dependencies = [ 3757 | "byteorder", 3758 | "crunchy", 3759 | "hex", 3760 | "static_assertions", 3761 | ] 3762 | 3763 | [[package]] 3764 | name = "unarray" 3765 | version = "0.1.4" 3766 | source = "registry+https://github.com/rust-lang/crates.io-index" 3767 | checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" 3768 | 3769 | [[package]] 3770 | name = "unicode-bidi" 3771 | version = "0.3.13" 3772 | source = "registry+https://github.com/rust-lang/crates.io-index" 3773 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 3774 | 3775 | [[package]] 3776 | name = "unicode-ident" 3777 | version = "1.0.12" 3778 | source = "registry+https://github.com/rust-lang/crates.io-index" 3779 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 3780 | 3781 | [[package]] 3782 | name = "unicode-normalization" 3783 | version = "0.1.22" 3784 | source = "registry+https://github.com/rust-lang/crates.io-index" 3785 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3786 | dependencies = [ 3787 | "tinyvec", 3788 | ] 3789 | 3790 | [[package]] 3791 | name = "unicode-xid" 3792 | version = "0.2.4" 3793 | source = "registry+https://github.com/rust-lang/crates.io-index" 3794 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 3795 | 3796 | [[package]] 3797 | name = "untrusted" 3798 | version = "0.7.1" 3799 | source = "registry+https://github.com/rust-lang/crates.io-index" 3800 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 3801 | 3802 | [[package]] 3803 | name = "untrusted" 3804 | version = "0.9.0" 3805 | source = "registry+https://github.com/rust-lang/crates.io-index" 3806 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 3807 | 3808 | [[package]] 3809 | name = "url" 3810 | version = "2.4.1" 3811 | source = "registry+https://github.com/rust-lang/crates.io-index" 3812 | checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" 3813 | dependencies = [ 3814 | "form_urlencoded", 3815 | "idna", 3816 | "percent-encoding", 3817 | ] 3818 | 3819 | [[package]] 3820 | name = "utf-8" 3821 | version = "0.7.6" 3822 | source = "registry+https://github.com/rust-lang/crates.io-index" 3823 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3824 | 3825 | [[package]] 3826 | name = "uuid" 3827 | version = "0.8.2" 3828 | source = "registry+https://github.com/rust-lang/crates.io-index" 3829 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 3830 | dependencies = [ 3831 | "getrandom", 3832 | "serde", 3833 | ] 3834 | 3835 | [[package]] 3836 | name = "valuable" 3837 | version = "0.1.0" 3838 | source = "registry+https://github.com/rust-lang/crates.io-index" 3839 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3840 | 3841 | [[package]] 3842 | name = "version_check" 3843 | version = "0.9.4" 3844 | source = "registry+https://github.com/rust-lang/crates.io-index" 3845 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3846 | 3847 | [[package]] 3848 | name = "walkdir" 3849 | version = "2.4.0" 3850 | source = "registry+https://github.com/rust-lang/crates.io-index" 3851 | checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" 3852 | dependencies = [ 3853 | "same-file", 3854 | "winapi-util", 3855 | ] 3856 | 3857 | [[package]] 3858 | name = "want" 3859 | version = "0.3.1" 3860 | source = "registry+https://github.com/rust-lang/crates.io-index" 3861 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3862 | dependencies = [ 3863 | "try-lock", 3864 | ] 3865 | 3866 | [[package]] 3867 | name = "wasi" 3868 | version = "0.11.0+wasi-snapshot-preview1" 3869 | source = "registry+https://github.com/rust-lang/crates.io-index" 3870 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3871 | 3872 | [[package]] 3873 | name = "wasm-bindgen" 3874 | version = "0.2.88" 3875 | source = "registry+https://github.com/rust-lang/crates.io-index" 3876 | checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" 3877 | dependencies = [ 3878 | "cfg-if", 3879 | "wasm-bindgen-macro", 3880 | ] 3881 | 3882 | [[package]] 3883 | name = "wasm-bindgen-backend" 3884 | version = "0.2.88" 3885 | source = "registry+https://github.com/rust-lang/crates.io-index" 3886 | checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" 3887 | dependencies = [ 3888 | "bumpalo", 3889 | "log", 3890 | "once_cell", 3891 | "proc-macro2", 3892 | "quote", 3893 | "syn 2.0.39", 3894 | "wasm-bindgen-shared", 3895 | ] 3896 | 3897 | [[package]] 3898 | name = "wasm-bindgen-futures" 3899 | version = "0.4.38" 3900 | source = "registry+https://github.com/rust-lang/crates.io-index" 3901 | checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" 3902 | dependencies = [ 3903 | "cfg-if", 3904 | "js-sys", 3905 | "wasm-bindgen", 3906 | "web-sys", 3907 | ] 3908 | 3909 | [[package]] 3910 | name = "wasm-bindgen-macro" 3911 | version = "0.2.88" 3912 | source = "registry+https://github.com/rust-lang/crates.io-index" 3913 | checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" 3914 | dependencies = [ 3915 | "quote", 3916 | "wasm-bindgen-macro-support", 3917 | ] 3918 | 3919 | [[package]] 3920 | name = "wasm-bindgen-macro-support" 3921 | version = "0.2.88" 3922 | source = "registry+https://github.com/rust-lang/crates.io-index" 3923 | checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" 3924 | dependencies = [ 3925 | "proc-macro2", 3926 | "quote", 3927 | "syn 2.0.39", 3928 | "wasm-bindgen-backend", 3929 | "wasm-bindgen-shared", 3930 | ] 3931 | 3932 | [[package]] 3933 | name = "wasm-bindgen-shared" 3934 | version = "0.2.88" 3935 | source = "registry+https://github.com/rust-lang/crates.io-index" 3936 | checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" 3937 | 3938 | [[package]] 3939 | name = "web-sys" 3940 | version = "0.3.65" 3941 | source = "registry+https://github.com/rust-lang/crates.io-index" 3942 | checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" 3943 | dependencies = [ 3944 | "js-sys", 3945 | "wasm-bindgen", 3946 | ] 3947 | 3948 | [[package]] 3949 | name = "webpki-roots" 3950 | version = "0.25.2" 3951 | source = "registry+https://github.com/rust-lang/crates.io-index" 3952 | checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" 3953 | 3954 | [[package]] 3955 | name = "whoami" 3956 | version = "1.4.1" 3957 | source = "registry+https://github.com/rust-lang/crates.io-index" 3958 | checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" 3959 | dependencies = [ 3960 | "wasm-bindgen", 3961 | "web-sys", 3962 | ] 3963 | 3964 | [[package]] 3965 | name = "winapi" 3966 | version = "0.3.9" 3967 | source = "registry+https://github.com/rust-lang/crates.io-index" 3968 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3969 | dependencies = [ 3970 | "winapi-i686-pc-windows-gnu", 3971 | "winapi-x86_64-pc-windows-gnu", 3972 | ] 3973 | 3974 | [[package]] 3975 | name = "winapi-i686-pc-windows-gnu" 3976 | version = "0.4.0" 3977 | source = "registry+https://github.com/rust-lang/crates.io-index" 3978 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3979 | 3980 | [[package]] 3981 | name = "winapi-util" 3982 | version = "0.1.6" 3983 | source = "registry+https://github.com/rust-lang/crates.io-index" 3984 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 3985 | dependencies = [ 3986 | "winapi", 3987 | ] 3988 | 3989 | [[package]] 3990 | name = "winapi-x86_64-pc-windows-gnu" 3991 | version = "0.4.0" 3992 | source = "registry+https://github.com/rust-lang/crates.io-index" 3993 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3994 | 3995 | [[package]] 3996 | name = "windows-core" 3997 | version = "0.51.1" 3998 | source = "registry+https://github.com/rust-lang/crates.io-index" 3999 | checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" 4000 | dependencies = [ 4001 | "windows-targets", 4002 | ] 4003 | 4004 | [[package]] 4005 | name = "windows-sys" 4006 | version = "0.48.0" 4007 | source = "registry+https://github.com/rust-lang/crates.io-index" 4008 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 4009 | dependencies = [ 4010 | "windows-targets", 4011 | ] 4012 | 4013 | [[package]] 4014 | name = "windows-targets" 4015 | version = "0.48.5" 4016 | source = "registry+https://github.com/rust-lang/crates.io-index" 4017 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 4018 | dependencies = [ 4019 | "windows_aarch64_gnullvm", 4020 | "windows_aarch64_msvc", 4021 | "windows_i686_gnu", 4022 | "windows_i686_msvc", 4023 | "windows_x86_64_gnu", 4024 | "windows_x86_64_gnullvm", 4025 | "windows_x86_64_msvc", 4026 | ] 4027 | 4028 | [[package]] 4029 | name = "windows_aarch64_gnullvm" 4030 | version = "0.48.5" 4031 | source = "registry+https://github.com/rust-lang/crates.io-index" 4032 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 4033 | 4034 | [[package]] 4035 | name = "windows_aarch64_msvc" 4036 | version = "0.48.5" 4037 | source = "registry+https://github.com/rust-lang/crates.io-index" 4038 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 4039 | 4040 | [[package]] 4041 | name = "windows_i686_gnu" 4042 | version = "0.48.5" 4043 | source = "registry+https://github.com/rust-lang/crates.io-index" 4044 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4045 | 4046 | [[package]] 4047 | name = "windows_i686_msvc" 4048 | version = "0.48.5" 4049 | source = "registry+https://github.com/rust-lang/crates.io-index" 4050 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4051 | 4052 | [[package]] 4053 | name = "windows_x86_64_gnu" 4054 | version = "0.48.5" 4055 | source = "registry+https://github.com/rust-lang/crates.io-index" 4056 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4057 | 4058 | [[package]] 4059 | name = "windows_x86_64_gnullvm" 4060 | version = "0.48.5" 4061 | source = "registry+https://github.com/rust-lang/crates.io-index" 4062 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4063 | 4064 | [[package]] 4065 | name = "windows_x86_64_msvc" 4066 | version = "0.48.5" 4067 | source = "registry+https://github.com/rust-lang/crates.io-index" 4068 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4069 | 4070 | [[package]] 4071 | name = "winnow" 4072 | version = "0.5.19" 4073 | source = "registry+https://github.com/rust-lang/crates.io-index" 4074 | checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" 4075 | dependencies = [ 4076 | "memchr", 4077 | ] 4078 | 4079 | [[package]] 4080 | name = "winreg" 4081 | version = "0.50.0" 4082 | source = "registry+https://github.com/rust-lang/crates.io-index" 4083 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 4084 | dependencies = [ 4085 | "cfg-if", 4086 | "windows-sys", 4087 | ] 4088 | 4089 | [[package]] 4090 | name = "ws_stream_wasm" 4091 | version = "0.7.4" 4092 | source = "registry+https://github.com/rust-lang/crates.io-index" 4093 | checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" 4094 | dependencies = [ 4095 | "async_io_stream", 4096 | "futures", 4097 | "js-sys", 4098 | "log", 4099 | "pharos", 4100 | "rustc_version", 4101 | "send_wrapper 0.6.0", 4102 | "thiserror", 4103 | "wasm-bindgen", 4104 | "wasm-bindgen-futures", 4105 | "web-sys", 4106 | ] 4107 | 4108 | [[package]] 4109 | name = "wyz" 4110 | version = "0.5.1" 4111 | source = "registry+https://github.com/rust-lang/crates.io-index" 4112 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 4113 | dependencies = [ 4114 | "tap", 4115 | ] 4116 | 4117 | [[package]] 4118 | name = "yansi" 4119 | version = "0.5.1" 4120 | source = "registry+https://github.com/rust-lang/crates.io-index" 4121 | checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" 4122 | 4123 | [[package]] 4124 | name = "zeroize" 4125 | version = "1.7.0" 4126 | source = "registry+https://github.com/rust-lang/crates.io-index" 4127 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 4128 | 4129 | [[package]] 4130 | name = "zip" 4131 | version = "0.6.6" 4132 | source = "registry+https://github.com/rust-lang/crates.io-index" 4133 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" 4134 | dependencies = [ 4135 | "aes", 4136 | "byteorder", 4137 | "bzip2", 4138 | "constant_time_eq", 4139 | "crc32fast", 4140 | "crossbeam-utils", 4141 | "flate2", 4142 | "hmac", 4143 | "pbkdf2 0.11.0", 4144 | "sha1", 4145 | "time", 4146 | "zstd", 4147 | ] 4148 | 4149 | [[package]] 4150 | name = "zstd" 4151 | version = "0.11.2+zstd.1.5.2" 4152 | source = "registry+https://github.com/rust-lang/crates.io-index" 4153 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 4154 | dependencies = [ 4155 | "zstd-safe", 4156 | ] 4157 | 4158 | [[package]] 4159 | name = "zstd-safe" 4160 | version = "5.0.2+zstd.1.5.2" 4161 | source = "registry+https://github.com/rust-lang/crates.io-index" 4162 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 4163 | dependencies = [ 4164 | "libc", 4165 | "zstd-sys", 4166 | ] 4167 | 4168 | [[package]] 4169 | name = "zstd-sys" 4170 | version = "2.0.9+zstd.1.5.5" 4171 | source = "registry+https://github.com/rust-lang/crates.io-index" 4172 | checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" 4173 | dependencies = [ 4174 | "cc", 4175 | "pkg-config", 4176 | ] 4177 | -------------------------------------------------------------------------------- /examples/full/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "offchain-gateway-example-full" 3 | version = "0.0.1" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | axum = "0.7.4" 8 | chrono = "0.4.31" 9 | dotenvy = "0.15.7" 10 | ethers = "2.0.10" 11 | ethers-contract = "2.0.11" 12 | ethers-contract-derive = "2" 13 | ethers-core = { version = "2.0.11", features = ["eip712"] } 14 | hex = "0.4.3" 15 | postgres = "0.19.7" 16 | postgres-types = { version = "0.2.6", features = ["derive", "with-serde_json-1"] } 17 | serde = "1.0.193" 18 | serde_json = "1.0.108" 19 | thiserror = "1.0.50" 20 | tokio = {version = "1", features = ["full"]} 21 | tokio-postgres = "0.7.10" 22 | tower-http = { version = "0.5.1", features = ["cors"] } 23 | tracing = "0.1.40" 24 | tracing-subscriber = { version = "0.3.18", features = ["env-filter"]} 25 | lazy_static = { version = "1.4.0", features = [] } 26 | bytes = "1.5.0" 27 | 28 | # Multicoin encoding 29 | bs58 = "0.5.0" 30 | base32 = "0.4.0" 31 | bech32 = "0.10.0-beta" 32 | blake2 = "0.10.6" 33 | sha2 = "0.10.8" 34 | crc16 = "0.4.0" 35 | ciborium = "0.2.1" 36 | crc32fast = "1.3.2" 37 | 38 | [dev-dependencies] 39 | hex-literal = "0.4.1" 40 | 41 | [features] 42 | postgres = [] 43 | selfservice = [] 44 | eoa-auth = [] 45 | admin-auth = [] 46 | default = ["postgres", "selfservice", "eoa-auth", "admin-auth"] 47 | -------------------------------------------------------------------------------- /examples/full/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bookworm-slim 2 | 3 | RUN apt-get update \ 4 | && apt-get install -y --no-install-recommends ca-certificates libssl-dev \ 5 | && apt-get clean \ 6 | && rm -rf /var/lib/apt/lists/* 7 | 8 | ENV TINI_VERSION v0.19.0 9 | 10 | ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini 11 | RUN chmod +x /tini 12 | 13 | COPY target/release/offchain-gateway-rs /bin/offchain-gateway-rs 14 | 15 | ENTRYPOINT ["/tini", "--"] 16 | CMD ["/bin/offchain-gateway-rs"] 17 | -------------------------------------------------------------------------------- /examples/full/README.md: -------------------------------------------------------------------------------- 1 | # Offchain Gateway (Rust) 2 | 3 | > [!WARNING] 4 | > This repository is under construction 🚧. We are actively improving it hackathon-style. 5 | 6 | This is a Rust implementation of the [CCIP gateway](https://alpha-docs.ens.domains/resolvers/ccip). It allows you to issue unlimited gasless subdomains for your name, as well as to create, manage, and moderate namespaces. 7 | 8 | > [!NOTE] 9 | > This gateway is built to be an **Opinionated ENS Subname Issuer**, if youre looking for something more generic, please checkout [ensdomains/offchain-resolver](https://github.com/ensdomains/offchain-resolver), and [ensdomains/offchain-resolver-example](https://github.com/ensdomains/offchain-resolver-example). 10 | 11 | ## Features 12 | 13 | - CCIP Spec Compliant Gateway Endpoint 14 | - `postgres` - Transparent Database backend. 15 | - `self-service` - Authentication-based updating records. 16 | - `eoa-self-service` - EOA-based Authentication. (TODO) 17 | - Modular authentication for EOA, Admin API, & more. 18 | - View endpoint for profile data. 19 | 20 | ## Setup 21 | 22 | ### Run the gateway 23 | The gateway is just a docker container / standalone binary. You can run it with docker-compose or just run the binary. 24 | 25 | ```yaml 26 | cargo run 27 | ``` 28 | 29 | ### Deploy a Resolver 30 | 31 | Using a CCIP Gateway requires a resolver contract to be acting on behalf of the name. Although you could write your own contract, we recommend you deploy a proxy contract through [ccip.tools](https://ccip.tools/). 32 | 33 | [![](.github/ccip-tools.png)](https://ccip.tools/) 34 | 35 | (Source for the contracts can be found at [ensdomains/ccip-tools](https://github.com/ensdomains/ccip-tools/tree/master/contracts)) 36 | 37 | When asked for the `Gateway URL` supply your gateway's url (for eg: `https://gateway.example.com/{sender}.json`), and for the `Signers` field supply the address of your gateway (for eg: `[0x225f137127d9067788314bc7fcc1f36746a3c3B5]`), you can find this in the logs of your gateway. 38 | 39 | > [!NOTE] 40 | > There are gas costs associated with deploying a resolver, at the time of writing this (30 gwei), it costs ~0.004 ETH (8 USD) to deploy a resolver (see [txs](https://etherscan.io/tx/0x0c90da0a122f38125a8ad1f48ef23cf5f7d399846bd5369b664ff288a31f797c)). 41 | 42 | ### Set your Resolver 43 | 44 | Finally you need to instruct the onchain registry to use your resolver. You can do this by visiting your name in the [ENS Manager App](https://ens.app/) and under the `More` tab, set the `Resolver` field to the address of your resolver. 45 | 46 | ## Fork this 🍴 47 | Don't like the implementation? Fork this repo and make it your own! 48 | 49 | You might also be interested in the [resolution logic](https://github.com/ensdomains/offchain-gateway-rs/blob/main/src/gateway/resolution.rs) and [database modularity](https://github.com/ensdomains/offchain-gateway-rs/blob/main/src/database/mod.rs). 50 | 51 | ## Integration 52 | 53 | This gateway implementation is designed to be modular, light, and easy to integrate. It comes with the abstract Datastore idea, (by default implemented with postgres), authentication, simple resolution logic, and a self-service API. 54 | 55 | This means that depending on your use case you can easily swap out the database, the resolution logic, and customize authentication. 56 | 57 | ### Issuing a name 58 | 59 | To issue a name from an trusted server, you can simply `POST` to `example.com/update` with a JSON body such as 60 | 61 | ```json 62 | { 63 | "name": "luc.willbreak.eth", 64 | "records": { 65 | "name": "Luc", 66 | "text": "hello world", 67 | "avatar": "https://avatars.githubusercontent.com/u/11744586?v=4", 68 | }, 69 | "addresses": { 70 | "60": "0x225f137127d9067788314bc7fcc1f36746a3c3B5" 71 | }, 72 | "auth": "yes" 73 | } 74 | ``` 75 | 76 | In a similar fashion users could self-service their names by using this api endpoint and custom authentication logic. 77 | 78 | ### Viewing a name 79 | 80 | In events were our app might not have access to ethereum specific tooling, we can use the `GET` endpoint `example.com/view/luc.willbreak.eth` to view the data of a name. This endpoint can be helpful for showing profile editing pages and more. 81 | -------------------------------------------------------------------------------- /examples/full/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | # Use postgres/example user/password credentials 2 | version: '3.1' 3 | 4 | services: 5 | db: 6 | image: postgres 7 | restart: always 8 | environment: 9 | POSTGRES_PASSWORD: example 10 | ports: 11 | - 5432:5432 12 | adminer: 13 | image: adminer 14 | restart: always 15 | ports: 16 | - 8080:8080 17 | -------------------------------------------------------------------------------- /examples/full/src/ccip/lookup/mod.rs: -------------------------------------------------------------------------------- 1 | use ethers::abi::ParamType; 2 | use thiserror::Error; 3 | 4 | #[derive(Debug, Clone, PartialEq, Eq)] 5 | pub enum ResolverFunctionCall { 6 | // addr(bytes32 node) returns (address) 7 | // 0x3b3b57de 8 | Addr(Vec), 9 | // name(bytes32 node) returns (string) 10 | // 0x691f3431 11 | Name(Vec), 12 | // abi(bytes32 node, uint256 contentTypes) returns (uint256, bytes) 13 | // 0x2203ab56 14 | Abi, 15 | // text(bytes32 node, string key) returns (string) 16 | // 0x59d1d43c 17 | Text(Vec, String), 18 | // contenthash(bytes32 node) returns (bytes) 19 | // 0xbc1c58d1 20 | ContentHash, 21 | // interfaceImplementer(bytes32 node, bytes4 interfaceID) returns (address) 22 | // 0xb8f2bbb4 23 | InterfaceImplementer, 24 | // addr(bytes32 node, uint256 coinType) returns (bytes) 25 | // 0xf1cb7e06 26 | AddrMultichain(Vec, u64), 27 | // pubkey(bytes32 node) returns (bytes32, bytes32) 28 | // 0xc8690233 29 | PubKey, 30 | } 31 | 32 | #[derive(Debug, Clone, PartialEq, Eq, Error)] 33 | pub enum ResolverFunctionCallDecodingError { 34 | #[error("Invalid selector {0}")] 35 | InvalidSelector(String), 36 | #[error("Invalid payload")] 37 | InvalidPayload, 38 | #[error("Invalid namehash")] 39 | InvalidNamehash, 40 | #[error("ABI decode error")] 41 | ABIDecodeError, 42 | } 43 | 44 | impl TryFrom<&[u8]> for ResolverFunctionCall { 45 | type Error = ResolverFunctionCallDecodingError; 46 | 47 | fn try_from(data: &[u8]) -> Result { 48 | let selector: &[u8; 4] = data[0..4].try_into().expect("Array length is correct"); 49 | let selector_hex = hex::encode(selector); 50 | 51 | let payload = &data[4..]; 52 | 53 | match selector_hex.as_str() { 54 | "3b3b57de" => { 55 | let result = ethers::abi::decode(&[ParamType::FixedBytes(32)], payload) 56 | .map_err(|_| ResolverFunctionCallDecodingError::ABIDecodeError)?; 57 | let namehash = result[0] 58 | .clone() 59 | .into_fixed_bytes() 60 | .ok_or(ResolverFunctionCallDecodingError::InvalidNamehash)?; 61 | 62 | Ok(ResolverFunctionCall::Addr(namehash)) 63 | } 64 | "691f3431" => { 65 | let result = ethers::abi::decode(&[ParamType::FixedBytes(32)], payload).unwrap(); 66 | let namehash = result[0].clone().into_fixed_bytes().unwrap(); 67 | 68 | Ok(ResolverFunctionCall::Name(namehash)) 69 | } 70 | "2203ab56" => Ok(ResolverFunctionCall::Abi), 71 | "59d1d43c" => { 72 | let result = 73 | ethers::abi::decode(&[ParamType::FixedBytes(32), ParamType::String], payload) 74 | .unwrap(); 75 | let namehash = result[0].clone().into_fixed_bytes().unwrap(); 76 | let record = result[1].clone().into_string().unwrap(); 77 | 78 | Ok(ResolverFunctionCall::Text(namehash, record)) 79 | } 80 | "bc1c58d1" => Ok(ResolverFunctionCall::ContentHash), 81 | "b8f2bbb4" => Ok(ResolverFunctionCall::InterfaceImplementer), 82 | "f1cb7e06" => { 83 | let result = 84 | ethers::abi::decode(&[ParamType::FixedBytes(32), ParamType::Uint(64)], payload) 85 | .unwrap(); 86 | let namehash = result.get(0).unwrap().clone().into_fixed_bytes().unwrap(); 87 | let coin_type: u64 = result.get(1).unwrap().clone().into_uint().unwrap().as_u64(); 88 | 89 | Ok(ResolverFunctionCall::AddrMultichain(namehash, coin_type)) 90 | } 91 | "c8690233" => Ok(ResolverFunctionCall::PubKey), 92 | _ => Err(ResolverFunctionCallDecodingError::InvalidSelector( 93 | selector_hex, 94 | )), 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /examples/full/src/ccip/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod lookup; 2 | -------------------------------------------------------------------------------- /examples/full/src/database/mod.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashMap, env}; 2 | 3 | use tokio_postgres::NoTls; 4 | use tracing::{error, info}; 5 | 6 | pub struct Database { 7 | pub client: tokio_postgres::Client, 8 | } 9 | 10 | /// Connects to database 11 | pub async fn bootstrap() -> Database { 12 | info!("Bootstrapping the database..."); 13 | let (client, connection) = tokio_postgres::connect( 14 | &format!( 15 | "host={} user={} password={}", 16 | env::var("POSTGRES_HOST").unwrap_or("localhost".to_string()), 17 | env::var("POSTGRES_USER").unwrap_or("postgres".to_string()), 18 | env::var("POSTGRES_PASSWORD").unwrap_or("example".to_string()), 19 | ), 20 | NoTls, 21 | ) 22 | .await 23 | .unwrap(); 24 | 25 | // The connection object performs the actual communication with the database, 26 | // so spawn it off to run on its own. 27 | tokio::spawn(async move { 28 | if let Err(e) = connection.await { 29 | error!("connection error: {}", e); 30 | } 31 | }); 32 | 33 | info!("Creating the database..."); 34 | // Now we can execute a simple statement that just returns its parameter. 35 | // let rows = client.query("SELECT $1::TEXT", &[&"hello world"]).await?; 36 | 37 | client 38 | .batch_execute("CREATE EXTENSION IF NOT EXISTS hstore;") 39 | .await 40 | .unwrap(); 41 | 42 | client.batch_execute("CREATE TABLE IF NOT EXISTS ens_data (node BYTEA PRIMARY KEY, records HSTORE, addresses HSTORE);").await.unwrap(); 43 | 44 | let total_rows = client 45 | .query("SELECT COUNT(*) FROM ens_data", &[]) 46 | .await 47 | .unwrap(); 48 | 49 | info!("Total rows: {}", total_rows[0].get::<_, i64>(0)); 50 | 51 | Database { client } 52 | } 53 | 54 | impl Database { 55 | pub async fn upsert( 56 | &self, 57 | node: &Vec, 58 | records: &HashMap>, 59 | addresses: &HashMap>, 60 | ) { 61 | self.client 62 | .execute( 63 | "INSERT INTO ens_data (node, records, addresses) VALUES ($1, $2, $3) ON CONFLICT (node) DO UPDATE SET records = $2, addresses = $3", 64 | &[node, records, addresses], 65 | ) 66 | .await 67 | .unwrap(); 68 | } 69 | 70 | pub async fn get_records( 71 | &self, 72 | node: &[u8], 73 | records: &[&str], 74 | ) -> HashMap> { 75 | // require that every record matches /a-zA-Z\./ 76 | // if records.iter().any(|x| !x.chars().all(|c| c.is_alphanumeric() || c == '.')) { 77 | // panic!("Invalid record name"); 78 | // } 79 | 80 | // converts ['avatar', 'header'] to "records->'avatar', records->'header'" 81 | let records_raw = records.iter().fold(String::new(), |acc, x| { 82 | if acc.is_empty() { 83 | format!("records->'{}'", x) 84 | } else { 85 | format!("{}, records->'{}'", acc, x) 86 | } 87 | }); 88 | 89 | let x = self 90 | .client 91 | .query_one( 92 | &format!("SELECT {} FROM ens_data WHERE node = $1", records_raw), 93 | &[&node], 94 | ) 95 | .await 96 | .unwrap(); 97 | 98 | records 99 | .iter() 100 | .enumerate() 101 | .fold(HashMap::new(), |mut map, (i, record)| { 102 | map.insert(record.to_string(), x.get::<_, Option>(i)); 103 | map 104 | }) 105 | } 106 | 107 | pub async fn get_addresses( 108 | &self, 109 | node: &[u8], 110 | addresses: &[&str], 111 | ) -> HashMap> { 112 | // require that every record matches /a-zA-Z\./ 113 | // if records.iter().any(|x| !x.chars().all(|c| c.is_alphanumeric() || c == '.')) { 114 | // panic!("Invalid record name"); 115 | // } 116 | 117 | // converts ['avatar', 'header'] to "records->'avatar', records->'header'" 118 | let addresses_raw = addresses.iter().fold(String::new(), |acc, x| { 119 | if acc.is_empty() { 120 | format!("addresses->'{}'", x) 121 | } else { 122 | format!("{}, addresses->'{}'", acc, x) 123 | } 124 | }); 125 | 126 | info!("node = {:?}", hex::encode(node)); 127 | 128 | let x = self 129 | .client 130 | .query_one( 131 | &format!("SELECT {} FROM ens_data WHERE node = $1", addresses_raw), 132 | &[&node], 133 | ) 134 | .await 135 | .unwrap(); 136 | 137 | addresses 138 | .iter() 139 | .enumerate() 140 | .fold(HashMap::new(), |mut map, (i, record)| { 141 | map.insert(record.to_string(), x.get::<_, Option>(i)); 142 | map 143 | }) 144 | } 145 | 146 | pub async fn get_all(&self, node: &[u8]) -> (HashMap>, HashMap>) { 147 | let x = self 148 | .client 149 | .query_one( 150 | "SELECT records, addresses FROM ens_data WHERE node = $1", 151 | &[&node], 152 | ) 153 | .await 154 | .unwrap(); 155 | 156 | let records = x.get::<_, HashMap>>(0); 157 | let addresses = x.get::<_, HashMap>>(1); 158 | 159 | (records, addresses) 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /examples/full/src/gateway/endpoint.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use axum::{ 4 | extract::State, 5 | response::{IntoResponse, Response}, 6 | }; 7 | use thiserror::Error; 8 | 9 | use crate::state::GlobalState; 10 | use crate::utils; 11 | 12 | use super::{payload::ResolveCCIPPostPayload, response::GatewayResponse}; 13 | 14 | pub async fn route( 15 | // Omitting sender from path awaiting viem patch 16 | // Path(sender): Path, 17 | State(state): State>, 18 | // custom less strict json implementation because viem makes the request wrong 19 | utils::axum_json::Json(request_payload): utils::axum_json::Json, 20 | ) -> impl IntoResponse { 21 | handle(request_payload, state) 22 | .await 23 | .map_err(|x| x.into_response()) 24 | } 25 | 26 | #[derive(Debug, Error)] 27 | pub enum CCIPEndpointError { 28 | #[error("Invalid prefix: {0}")] 29 | DecodeError(#[from] super::payload::ResolverDecodeError), 30 | #[error("Resolve error: {0}")] 31 | ResolveError(#[from] super::resolution::ResolveError), 32 | #[error("Sign error: {0}")] 33 | SignError(#[from] super::signing::SignError), 34 | } 35 | 36 | impl IntoResponse for CCIPEndpointError { 37 | fn into_response(self) -> Response { 38 | GatewayResponse::Error(self.to_string()).into_response() 39 | } 40 | } 41 | 42 | async fn handle( 43 | payload: ResolveCCIPPostPayload, 44 | state: Arc, 45 | ) -> Result { 46 | Ok(payload 47 | .decode()? 48 | .resolve(state.clone()) 49 | .await? 50 | .sign(state.clone())?) 51 | } 52 | -------------------------------------------------------------------------------- /examples/full/src/gateway/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod response; 2 | pub mod endpoint; 3 | pub mod payload; 4 | pub mod resolution; 5 | pub mod signing; 6 | -------------------------------------------------------------------------------- /examples/full/src/gateway/payload.rs: -------------------------------------------------------------------------------- 1 | use ethers::abi::ParamType; 2 | use serde::Deserialize; 3 | use thiserror::Error; 4 | use tracing::info; 5 | 6 | use crate::ccip::lookup::{ResolverFunctionCall, ResolverFunctionCallDecodingError}; 7 | 8 | use super::resolution::UnresolvedQuery; 9 | 10 | #[derive(Deserialize, Debug)] 11 | pub struct ResolveCCIPPostPayload { 12 | pub data: String, 13 | pub sender: String, 14 | } 15 | 16 | #[derive(Debug, Error)] 17 | pub enum ResolverDecodeError { 18 | #[error("Invalid prefix")] 19 | InvalidPrefix, 20 | #[error("Invalid hex")] 21 | InvalidHex(#[from] hex::FromHexError), 22 | #[error("Invalid utf8")] 23 | InvalidUtf8(#[from] std::string::FromUtf8Error), 24 | #[error("Invalid abi")] 25 | InvalidAbi(#[from] ethers::abi::Error), 26 | #[error("Invalid bytes")] 27 | InvalidBytes, 28 | #[error("Resolver Function Call")] 29 | ResolverFunctionCall(#[from] ResolverFunctionCallDecodingError), 30 | } 31 | 32 | impl ResolveCCIPPostPayload { 33 | /// This function handles the initial decoding of the payload 34 | /// It returns the name and the resolver function call that needs to be resolved 35 | /// TODO: Implement error handling 36 | pub fn decode(&self) -> Result { 37 | let data = self 38 | .data 39 | .strip_prefix("0x9061b923") 40 | .ok_or(ResolverDecodeError::InvalidPrefix)?; 41 | 42 | let data = hex::decode(data)?; 43 | 44 | let decoded = ethers::abi::decode(&[ParamType::Bytes, ParamType::Bytes], &data)?; 45 | 46 | let dns_encoded_name = decoded[0] 47 | .clone() 48 | .into_bytes() 49 | .ok_or(ResolverDecodeError::InvalidBytes)?; 50 | 51 | let name = String::from_utf8(dns_encoded_name)?; 52 | 53 | let name = crate::utils::dns::decode(&name); 54 | 55 | info!("Decoded name: {}", name); 56 | 57 | let rest_of_the_data = decoded[1] 58 | .clone() 59 | .into_bytes() 60 | .ok_or(ResolverDecodeError::InvalidBytes)?; 61 | 62 | let data = ResolverFunctionCall::try_from(rest_of_the_data.as_slice())?; 63 | 64 | Ok(UnresolvedQuery { 65 | name, 66 | data, 67 | calldata: self, 68 | }) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /examples/full/src/gateway/resolution.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use ethers::{abi::Token, providers::namehash, utils::keccak256}; 4 | use thiserror::Error; 5 | use tracing::{debug, info}; 6 | 7 | use crate::multicoin::cointype::coins::CoinType; 8 | use crate::multicoin::encoding::MulticoinEncoder; 9 | use crate::{ccip::lookup::ResolverFunctionCall, state::GlobalState}; 10 | 11 | use super::{payload::ResolveCCIPPostPayload, signing::UnsignedPayload}; 12 | 13 | pub struct UnresolvedQuery<'a> { 14 | pub name: String, 15 | pub data: ResolverFunctionCall, 16 | pub calldata: &'a ResolveCCIPPostPayload, 17 | } 18 | 19 | #[derive(Debug, Error)] 20 | pub enum ResolveError { 21 | #[error("Unknown error")] 22 | NotFound, 23 | #[error("Record not found: {0}")] 24 | NotFoundRecord(String), 25 | #[error("Unparsable")] 26 | Unparsable, 27 | #[error("Sender unparsable")] 28 | SenderUnparsable, 29 | #[error("Payload unparsable")] 30 | PayloadUnparsable, 31 | #[error("Hash mismatch")] 32 | HashMismatch, 33 | } 34 | 35 | impl UnresolvedQuery<'_> { 36 | pub async fn resolve(&self, state: Arc) -> Result { 37 | let payload: Vec = match &self.data { 38 | ResolverFunctionCall::Text(alt_hash, record) => { 39 | info!(name = self.name, record = record, "Resolution"); 40 | 41 | let hash = namehash(&self.name).to_fixed_bytes().to_vec(); 42 | 43 | if alt_hash != &hash { 44 | return Err(ResolveError::HashMismatch); 45 | } 46 | 47 | let hash = namehash(&self.name).to_fixed_bytes().to_vec(); 48 | 49 | let x = state.db.get_records(&hash, &[record]).await; 50 | 51 | let value = x 52 | .get(record) 53 | .to_owned() 54 | .ok_or(ResolveError::NotFoundRecord(record.clone()))? 55 | .clone() 56 | .ok_or(ResolveError::NotFoundRecord(record.clone()))?; 57 | 58 | vec![Token::String(value)] 59 | } 60 | ResolverFunctionCall::AddrMultichain(_bf, chain) => { 61 | info!( 62 | name = self.name, 63 | chain = chain, 64 | "Resolution Address Multichain" 65 | ); 66 | 67 | let hash = namehash(&self.name).to_fixed_bytes().to_vec(); 68 | 69 | let addresses = state.db.get_addresses(&hash, &[&chain.to_string()]).await; 70 | 71 | let value: &str = addresses 72 | .get(&chain.to_string()) 73 | .ok_or(ResolveError::NotFound)? 74 | .as_ref() 75 | .ok_or(ResolveError::NotFound)?; 76 | 77 | let bytes = CoinType::from(*chain as u32).encode(value).map_err(|err| { 78 | debug!("error while trying to encode {}: {}", chain, err); 79 | ResolveError::Unparsable 80 | })?; 81 | 82 | vec![Token::Bytes(bytes)] 83 | } 84 | ResolverFunctionCall::Addr(_bf) => { 85 | info!(name = self.name, "Resolution Address"); 86 | 87 | let chain = 60; 88 | let hash = namehash(&self.name).to_fixed_bytes().to_vec(); 89 | 90 | let x = state.db.get_addresses(&hash, &[&chain.to_string()]).await; 91 | 92 | let value = x 93 | .get(&chain.to_string()) 94 | .to_owned() 95 | .ok_or(ResolveError::NotFound)? 96 | .clone() 97 | .ok_or(ResolveError::NotFound)?; 98 | 99 | let address = value.parse().map_err(|_| ResolveError::Unparsable)?; 100 | 101 | vec![Token::Address(address)] 102 | } 103 | _ => { 104 | info!("Unimplemented Method"); 105 | 106 | Vec::new() 107 | } 108 | }; 109 | 110 | let ttl = 3600; 111 | let expires = chrono::Utc::now().timestamp() as u64 + ttl; 112 | let sender = self 113 | .calldata 114 | .sender 115 | .parse() 116 | .map_err(|_| ResolveError::SenderUnparsable)?; 117 | let request_payload = hex::decode(self.calldata.data.trim_start_matches("0x")) 118 | .map_err(|_| ResolveError::PayloadUnparsable)?; 119 | let data = ethers::abi::encode(&payload); 120 | let request_hash = keccak256(request_payload).to_vec(); 121 | let result_hash = keccak256(&data).to_vec(); 122 | 123 | Ok(UnsignedPayload { 124 | data, 125 | expires, 126 | request_hash, 127 | result_hash, 128 | sender, 129 | }) 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /examples/full/src/gateway/response.rs: -------------------------------------------------------------------------------- 1 | use axum::{http::StatusCode, response::IntoResponse, Json}; 2 | use serde::Serialize; 3 | 4 | #[derive(Serialize, Debug)] 5 | pub enum GatewayResponse { 6 | Data(String), 7 | Error(String), 8 | } 9 | 10 | impl IntoResponse for GatewayResponse { 11 | fn into_response(self) -> axum::response::Response { 12 | match self { 13 | GatewayResponse::Data(data) => { 14 | (StatusCode::OK, Json(ResolveCCIPPostResponse { data })).into_response() 15 | } 16 | GatewayResponse::Error(message) => ( 17 | StatusCode::BAD_REQUEST, 18 | Json(ResolveCCIPPostErrorResponse { message }), 19 | ) 20 | .into_response(), 21 | } 22 | } 23 | } 24 | 25 | #[derive(Serialize)] 26 | pub struct ResolveCCIPPostResponse { 27 | data: String, 28 | } 29 | 30 | #[derive(Serialize)] 31 | struct ResolveCCIPPostErrorResponse { 32 | message: String, 33 | } 34 | 35 | impl Default for ResolveCCIPPostResponse { 36 | fn default() -> Self { 37 | Self { 38 | data: "0x".to_string(), 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /examples/full/src/gateway/signing.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use ethers::{ 4 | abi::{AbiEncode, Token}, 5 | types::{H160, U256, U64}, 6 | utils::keccak256, 7 | }; 8 | use thiserror::Error; 9 | 10 | use super::response::GatewayResponse; 11 | use crate::state::GlobalState; 12 | 13 | pub struct UnsignedPayload { 14 | pub data: Vec, 15 | pub sender: H160, 16 | pub request_hash: Vec, 17 | pub result_hash: Vec, 18 | pub expires: u64, 19 | } 20 | 21 | #[derive(Debug, Error)] 22 | pub enum SignError { 23 | #[error("Unknown error {0}")] 24 | UnknownError(String), 25 | } 26 | 27 | impl UnsignedPayload { 28 | pub fn sign(self, state: Arc) -> Result { 29 | let encoded = ethers::abi::encode_packed(&[ 30 | Token::Uint(U256::from(0x1900)), 31 | Token::Address(self.sender), 32 | Token::FixedBytes(U64::from(self.expires).0[0].to_be_bytes().to_vec()), 33 | Token::FixedBytes(self.request_hash), 34 | Token::FixedBytes(self.result_hash), 35 | ]) 36 | .unwrap(); 37 | 38 | let message_hash = keccak256(encoded); 39 | 40 | let signature: ethers::types::Signature = 41 | state.wallet.sign_hash(message_hash.into()).unwrap(); 42 | 43 | let signature_r = signature.r.encode(); 44 | let signature_s = signature.s.encode(); 45 | let signature_v = vec![signature.v.try_into().unwrap()]; 46 | 47 | let signature = [signature_r, signature_s, signature_v].concat(); 48 | 49 | let pl = format!( 50 | "0x{}", 51 | hex::encode(ethers::abi::encode( 52 | vec![ 53 | Token::Bytes(self.data), 54 | Token::Uint(U256::from(self.expires)), 55 | Token::Bytes(signature), 56 | ] 57 | .as_slice() 58 | )) 59 | ); 60 | 61 | Ok(GatewayResponse::Data(pl)) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /examples/full/src/http.rs: -------------------------------------------------------------------------------- 1 | use std::{env, sync::Arc}; 2 | 3 | use axum::{ 4 | routing::{get, post}, 5 | Router, 6 | }; 7 | use tokio::net::TcpListener; 8 | use tower_http::cors::CorsLayer; 9 | use tracing::{debug, info}; 10 | 11 | use crate::state::GlobalState; 12 | 13 | /// Starts the HTTP Server 14 | pub async fn serve(state: GlobalState) { 15 | info!("Starting webserver"); 16 | 17 | let app = Router::new() 18 | .route("/", get(root)) 19 | .route("/gateway", post(crate::gateway::endpoint::route)); 20 | 21 | #[cfg(feature = "selfservice")] 22 | let app = app.route("/update", post(crate::selfservice::endpoint::route)); 23 | 24 | let app = app 25 | .route("/view/:name", get(crate::selfservice::view::route)) 26 | .with_state(Arc::new(state)) 27 | .layer(CorsLayer::very_permissive()); 28 | 29 | let listener = TcpListener::bind(format!( 30 | "0.0.0.0:{}", 31 | env::var("PORT") 32 | .unwrap_or("3000".to_string()) 33 | .parse::() 34 | .expect("port should fit in u16") 35 | )) 36 | .await 37 | .unwrap(); 38 | 39 | debug!("Listening on {}", listener.local_addr().unwrap()); 40 | 41 | axum::serve(listener, app).await.unwrap(); 42 | } 43 | 44 | /// Self Endpoint on the Gateway 45 | async fn root() -> &'static str { 46 | "CCIP Rust Gateway v0.0.1!" 47 | } 48 | -------------------------------------------------------------------------------- /examples/full/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{env, str::FromStr}; 2 | 3 | use dotenvy::dotenv; 4 | use ethers::signers::{LocalWallet, Signer}; 5 | use tracing::{info, Level}; 6 | use tracing_subscriber::{EnvFilter, FmtSubscriber}; 7 | 8 | pub mod ccip; 9 | pub mod database; 10 | pub mod gateway; 11 | mod http; 12 | pub mod multicoin; 13 | pub mod selfservice; 14 | pub mod state; 15 | pub mod utils; 16 | 17 | #[tokio::main] 18 | async fn main() { 19 | dotenv().ok(); 20 | 21 | let filter = EnvFilter::new(format!("offchain_gateway={}", Level::DEBUG)); 22 | 23 | let subscriber = FmtSubscriber::builder() 24 | // all spans/events with a level higher than TRACE (e.g, debug, info, warn, etc.) 25 | // will be written to stdout. 26 | .with_max_level(Level::DEBUG) 27 | .with_env_filter(filter) 28 | // completes the builder. 29 | .finish(); 30 | 31 | tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); 32 | 33 | let db = database::bootstrap().await; 34 | 35 | let wallet: LocalWallet = LocalWallet::from_str( 36 | env::var("PRIVATE_KEY") 37 | .expect("Could not find PRIVATE_KEY") 38 | .as_str(), 39 | ) 40 | .unwrap(); 41 | 42 | let address = format!("{:?}", wallet.address()); 43 | info!("Signing with address: {}", address); 44 | 45 | let state = state::GlobalState { db, wallet }; 46 | 47 | http::serve(state).await; 48 | 49 | info!("Shutting down"); 50 | } 51 | 52 | // let mut records = HashMap::new(); 53 | // records.insert( 54 | // "avatar".to_string(), 55 | // Some( 56 | // "https://metadata.ens.domains/goerli/avatar/luc.myeth.id?timestamp=1700508402907" 57 | // .to_string(), 58 | // ), 59 | // ); 60 | // let addresses = HashMap::new(); 61 | // // let h = hex::decode("0123456789ABCDEF0123456789ABCDEF").unwrap(); 62 | // let h = namehash("luc.myeth.id").to_fixed_bytes().to_vec(); 63 | // db.upsert(&h, &records, &addresses).await; 64 | // let r = db 65 | // .get_records(&h, &vec!["avatar", "display", "header"]) 66 | // .await; 67 | // println!("{:?}", r); 68 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/cointype/coins.rs: -------------------------------------------------------------------------------- 1 | use super::slip44::SLIP44; 2 | 3 | #[derive(Debug, Clone, PartialEq, Eq)] 4 | pub enum CoinType { 5 | Slip44(SLIP44), 6 | Evm, 7 | } 8 | 9 | impl From for CoinType { 10 | fn from(value: u32) -> CoinType { 11 | if value >= 0x8000_0000 { 12 | return CoinType::Evm; 13 | } 14 | 15 | SLIP44::from(value).into() 16 | } 17 | } 18 | 19 | #[cfg(test)] 20 | mod tests { 21 | use super::super::slip44::SLIP44; 22 | use super::*; 23 | 24 | #[test] 25 | fn test_coin_type() { 26 | assert_eq!(CoinType::from(0), SLIP44::Bitcoin.into()); 27 | } 28 | 29 | #[test] 30 | fn test_coin_type_evm() { 31 | assert_eq!(CoinType::from(2147483649), CoinType::Evm); 32 | } 33 | 34 | #[test] 35 | fn test_coin_type_evm_gnosis() { 36 | assert_eq!(CoinType::from(2147483748), CoinType::Evm); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/cointype/mod.rs: -------------------------------------------------------------------------------- 1 | use self::coins::CoinType; 2 | 3 | pub mod coins; 4 | pub mod slip44; 5 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/cointype/slip44.rs: -------------------------------------------------------------------------------- 1 | use ethers_core::types::U256; 2 | 3 | use super::CoinType; 4 | 5 | #[derive(Debug, Clone, PartialEq, Eq)] 6 | pub enum SLIP44 { 7 | Hedera, 8 | Ripple, 9 | Solana, 10 | Cardano, 11 | Stellar, 12 | Bitcoin, 13 | Binance, 14 | Litecoin, 15 | Dogecoin, 16 | Ethereum, 17 | Polkadot, 18 | Rootstock, 19 | EthereumClassic, 20 | Other(U256), 21 | } 22 | 23 | impl From for SLIP44 { 24 | fn from(val: u32) -> SLIP44 { 25 | match val { 26 | 0 => SLIP44::Bitcoin, 27 | 2 => SLIP44::Litecoin, 28 | 3 => SLIP44::Dogecoin, 29 | 60 => SLIP44::Ethereum, 30 | 61 => SLIP44::EthereumClassic, 31 | 144 => SLIP44::Ripple, 32 | 148 => SLIP44::Stellar, 33 | 3030 => SLIP44::Hedera, 34 | 1815 => SLIP44::Cardano, 35 | 137 => SLIP44::Rootstock, 36 | 714 => SLIP44::Binance, 37 | 501 => SLIP44::Solana, 38 | 354 => SLIP44::Polkadot, 39 | val => SLIP44::Other(val.into()), 40 | } 41 | } 42 | } 43 | 44 | impl From for CoinType { 45 | fn from(val: SLIP44) -> Self { 46 | CoinType::Slip44(val) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/binance.rs: -------------------------------------------------------------------------------- 1 | use bech32::primitives::hrp::Hrp; 2 | use lazy_static::lazy_static; 3 | 4 | use super::{MulticoinEncoder, MulticoinEncoderError}; 5 | 6 | lazy_static! { 7 | static ref BNB_HRP: Hrp = Hrp::parse_unchecked("bnb"); 8 | } 9 | 10 | pub struct BinanceEncoder {} 11 | 12 | impl MulticoinEncoder for BinanceEncoder { 13 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 14 | let (hrp, data) = bech32::decode(data).map_err(|_| { 15 | MulticoinEncoderError::InvalidStructure("failed to decode bech32".to_string()) 16 | })?; 17 | 18 | if hrp != *BNB_HRP { 19 | return Err(MulticoinEncoderError::InvalidStructure( 20 | "invalid binance hrp".to_string(), 21 | )); 22 | } 23 | 24 | Ok(data) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/bitcoin.rs: -------------------------------------------------------------------------------- 1 | // use lazy_static::lazy_static; 2 | 3 | use crate::multicoin::encoding::segwit::SegWitEncoder; 4 | 5 | use super::{p2pkh::P2PKHEncoder, p2sh::P2SHEncoder, MulticoinEncoder, MulticoinEncoderError}; 6 | 7 | pub struct BitcoinEncoder { 8 | segwit_encoder: Option, 9 | p2pkh_encoder: P2PKHEncoder, 10 | p2sh_encoder: P2SHEncoder, 11 | } 12 | 13 | impl BitcoinEncoder { 14 | pub fn new( 15 | segwit_hrp: Option<&str>, 16 | p2pkh_versions: &'static [u8], 17 | p2sh_versions: &'static [u8], 18 | ) -> Self { 19 | Self { 20 | segwit_encoder: segwit_hrp.map(|hrp| SegWitEncoder::new(hrp)), 21 | p2pkh_encoder: P2PKHEncoder { 22 | accepted_versions: p2pkh_versions, 23 | }, 24 | p2sh_encoder: P2SHEncoder { 25 | accepted_versions: p2sh_versions, 26 | }, 27 | } 28 | } 29 | } 30 | 31 | impl MulticoinEncoder for BitcoinEncoder { 32 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 33 | if let Some(segwit_encoder) = &self.segwit_encoder { 34 | if let Ok(address) = segwit_encoder.encode(data) { 35 | return Ok(address); 36 | } 37 | } 38 | 39 | self.p2pkh_encoder 40 | .encode(data) 41 | .or_else(|_| self.p2sh_encoder.encode(data)) 42 | .map_err(|_| MulticoinEncoderError::InvalidStructure(String::new())) 43 | } 44 | } 45 | 46 | #[cfg(test)] 47 | mod tests { 48 | use super::*; 49 | 50 | #[tokio::test] 51 | async fn test_btc_p2pkh() { 52 | let decoded = BitcoinEncoder::new(Some("bc"), &[0x00], &[0x05]) 53 | .encode("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa") 54 | .unwrap(); 55 | 56 | assert_eq!( 57 | decoded, 58 | &hex_literal::hex!("76a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1888ac") 59 | ); 60 | } 61 | 62 | #[tokio::test] 63 | async fn test_btc_p2sh() { 64 | let decoded = BitcoinEncoder::new(Some("bc"), &[0x00], &[0x05]) 65 | .encode("3Ai1JZ8pdJb2ksieUV8FsxSNVJCpoPi8W6") 66 | .unwrap(); 67 | 68 | assert_eq!( 69 | decoded, 70 | &hex_literal::hex!("a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1887") 71 | ); 72 | } 73 | 74 | #[tokio::test] 75 | async fn test_btc_segwit() { 76 | let decoded = BitcoinEncoder::new(Some("bc"), &[0x00], &[0x05]) 77 | .encode("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4") 78 | .unwrap(); 79 | 80 | assert_eq!( 81 | decoded, 82 | &hex_literal::hex!("0014751e76e8199196d454941c45d1b3a323f1433bd6") 83 | ); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/cardano.rs: -------------------------------------------------------------------------------- 1 | use bech32::primitives::hrp::Hrp; 2 | use bs58::Alphabet; 3 | use ciborium::value::Integer; 4 | use ciborium::Value; 5 | use lazy_static::lazy_static; 6 | 7 | use super::{MulticoinEncoder, MulticoinEncoderError}; 8 | 9 | lazy_static! { 10 | static ref ADA_HRP: Hrp = Hrp::parse_unchecked("addr"); 11 | } 12 | 13 | pub struct CardanoEncoder {} 14 | 15 | // None if invalid bryon address 16 | fn encode_cardano_bryon(data: &str) -> Result, MulticoinEncoderError> { 17 | if !data.starts_with("Ae2") && !data.starts_with("Ddz") { 18 | return Err(MulticoinEncoderError::InvalidStructure( 19 | "invalid bryon address prefix".to_string(), 20 | )); 21 | } 22 | 23 | let decoded = bs58::decode(data) 24 | .with_alphabet(Alphabet::BITCOIN) 25 | .into_vec() 26 | .map_err(|_| { 27 | MulticoinEncoderError::InvalidStructure("failed to decode bs58".to_string()) 28 | })?; 29 | 30 | let (Value::Tag(tag, data_raw), Value::Integer(checksum)) = 31 | ciborium::from_reader(decoded.as_slice()).map_err(|_| { 32 | MulticoinEncoderError::InvalidStructure("failed to cbor decode".to_string()) 33 | })? 34 | else { 35 | return Err(MulticoinEncoderError::InvalidStructure( 36 | "invalid cbor structure".to_string(), 37 | )); 38 | }; 39 | 40 | let Some(data) = data_raw.as_bytes() else { 41 | return Err(MulticoinEncoderError::InvalidStructure( 42 | "invalid cbor structure".to_string(), 43 | )); 44 | }; 45 | 46 | let checksum_check = crc32fast::hash(data); 47 | 48 | if tag != 24 || checksum != Integer::from(checksum_check) { 49 | return Err(MulticoinEncoderError::InvalidStructure( 50 | "invalid cbor structure".to_string(), 51 | )); 52 | }; 53 | 54 | Ok(data.clone()) 55 | } 56 | 57 | fn encode_cardano_shelley(data: &str) -> Result, MulticoinEncoderError> { 58 | let (hrp, data) = bech32::decode(data).map_err(|_| { 59 | MulticoinEncoderError::InvalidStructure("failed to bech32 encode".to_string()) 60 | })?; 61 | 62 | if hrp != *ADA_HRP { 63 | return Err(MulticoinEncoderError::InvalidStructure( 64 | "invalid bech32 address prefix".to_string(), 65 | )); 66 | } 67 | 68 | Ok(data) 69 | } 70 | 71 | impl MulticoinEncoder for CardanoEncoder { 72 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 73 | encode_cardano_bryon(data).or_else(|_| encode_cardano_shelley(data)) 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/checksum_address.rs: -------------------------------------------------------------------------------- 1 | use super::{MulticoinEncoder, MulticoinEncoderError}; 2 | 3 | pub struct EvmEncoder {} 4 | 5 | impl MulticoinEncoder for EvmEncoder { 6 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 7 | ethers::utils::hex::decode(data) 8 | .map_err(|err| MulticoinEncoderError::InvalidStructure(err.to_string())) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/hedera.rs: -------------------------------------------------------------------------------- 1 | use super::{MulticoinEncoder, MulticoinEncoderError}; 2 | 3 | pub struct HederaEncoder {} 4 | 5 | impl MulticoinEncoder for HederaEncoder { 6 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 7 | let parts: Vec<&str> = data.split('.').collect(); 8 | if parts.len() != 3 { 9 | return Err(MulticoinEncoderError::InvalidStructure( 10 | "invalid length".to_string(), 11 | )); 12 | } 13 | 14 | let (Ok(shard), Ok(realm), Ok(account)) = ( 15 | parts[0].parse::(), 16 | parts[1].parse::(), 17 | parts[2].parse::(), 18 | ) else { 19 | return Err(MulticoinEncoderError::InvalidStructure("".to_string())); 20 | }; 21 | 22 | let mut result = Vec::new(); 23 | result.extend_from_slice(&shard.to_be_bytes()); 24 | result.extend_from_slice(&realm.to_be_bytes()); 25 | result.extend_from_slice(&account.to_be_bytes()); 26 | 27 | Ok(result) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/mod.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | 3 | use crate::multicoin::encoding::binance::BinanceEncoder; 4 | use crate::multicoin::encoding::bitcoin::BitcoinEncoder; 5 | use crate::multicoin::encoding::cardano::CardanoEncoder; 6 | use crate::multicoin::encoding::hedera::HederaEncoder; 7 | use crate::multicoin::encoding::polkadot::PolkadotEncoder; 8 | use crate::multicoin::encoding::ripple::RippleEncoder; 9 | use crate::multicoin::encoding::solana::SolanaEncoder; 10 | use crate::multicoin::encoding::stellar::StellarEncoder; 11 | 12 | use super::cointype::{coins::CoinType, slip44::SLIP44}; 13 | 14 | use self::checksum_address::EvmEncoder; 15 | 16 | pub mod binance; 17 | pub mod bitcoin; 18 | pub mod cardano; 19 | pub mod checksum_address; 20 | pub mod hedera; 21 | pub mod p2pkh; 22 | pub mod p2sh; 23 | pub mod polkadot; 24 | pub mod ripple; 25 | pub mod segwit; 26 | pub mod solana; 27 | pub mod stellar; 28 | 29 | #[derive(Debug, Error)] 30 | pub enum MulticoinEncoderError { 31 | #[error("Invalid structure: {0}")] 32 | InvalidStructure(String), 33 | 34 | #[error("Not supported")] 35 | NotSupported, 36 | } 37 | 38 | pub trait MulticoinEncoder { 39 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError>; 40 | } 41 | 42 | impl MulticoinEncoder for CoinType { 43 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 44 | let encoder: Box = match self { 45 | Self::Slip44(slip44) => match slip44 { 46 | SLIP44::Ethereum | SLIP44::EthereumClassic | SLIP44::Rootstock => { 47 | Box::new(EvmEncoder {}) 48 | } 49 | SLIP44::Bitcoin => Box::new(BitcoinEncoder::new(Some("bc"), &[0x00], &[0x05])), 50 | SLIP44::Litecoin => { 51 | Box::new(BitcoinEncoder::new(Some("ltc"), &[0x30], &[0x32, 0x05])) 52 | } 53 | SLIP44::Dogecoin => Box::new(BitcoinEncoder::new(None, &[0x1e], &[0x16])), 54 | SLIP44::Solana => Box::new(SolanaEncoder {}), 55 | SLIP44::Hedera => Box::new(HederaEncoder {}), 56 | SLIP44::Stellar => Box::new(StellarEncoder {}), 57 | SLIP44::Ripple => Box::new(RippleEncoder {}), 58 | SLIP44::Cardano => Box::new(CardanoEncoder {}), 59 | SLIP44::Binance => Box::new(BinanceEncoder {}), 60 | SLIP44::Polkadot => Box::new(PolkadotEncoder {}), 61 | _ => return Err(MulticoinEncoderError::NotSupported), 62 | }, 63 | Self::Evm => Box::new(EvmEncoder {}), 64 | }; 65 | 66 | encoder.encode(data) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/p2pkh.rs: -------------------------------------------------------------------------------- 1 | use bs58::Alphabet; 2 | 3 | use crate::utils; 4 | 5 | use super::{MulticoinEncoder, MulticoinEncoderError}; 6 | 7 | pub struct P2PKHEncoder { 8 | pub(crate) accepted_versions: &'static [u8], 9 | } 10 | 11 | impl MulticoinEncoder for P2PKHEncoder { 12 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 13 | let decoded = bs58::decode(data) 14 | .with_alphabet(Alphabet::BITCOIN) 15 | .into_vec() 16 | .map_err(|_| { 17 | MulticoinEncoderError::InvalidStructure("failed to decode bs58".to_string()) 18 | })?; 19 | 20 | // version byte, at least one data byte, 4 bytes of checksum 21 | if decoded.len() < 6 { 22 | return Err(MulticoinEncoderError::InvalidStructure("".to_string())); 23 | } 24 | 25 | if !self 26 | .accepted_versions 27 | .iter() 28 | .any(|version| decoded[0] == *version) 29 | { 30 | return Err(MulticoinEncoderError::InvalidStructure( 31 | "invalid version".to_string(), 32 | )); 33 | } 34 | 35 | let checksum_begin = decoded.len() - 4; 36 | let checksum = &decoded[checksum_begin..]; 37 | let data = &decoded[..checksum_begin]; 38 | 39 | let checksum_check = &utils::sha256::hash(utils::sha256::hash(data))[..4]; 40 | 41 | if checksum != checksum_check { 42 | return Err(MulticoinEncoderError::InvalidStructure( 43 | "invalid checksum".to_string(), 44 | )); 45 | } 46 | 47 | let pub_key_hash = &data[1..]; 48 | 49 | Ok([ 50 | &[0x76, 0xa9, pub_key_hash.len() as u8] as &[u8], 51 | pub_key_hash, 52 | &[0x88, 0xac], 53 | ] 54 | .concat() 55 | .to_vec()) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/p2sh.rs: -------------------------------------------------------------------------------- 1 | use super::{MulticoinEncoder, MulticoinEncoderError}; 2 | use crate::utils; 3 | use bs58::Alphabet; 4 | 5 | pub struct P2SHEncoder { 6 | pub(crate) accepted_versions: &'static [u8], 7 | } 8 | 9 | impl MulticoinEncoder for P2SHEncoder { 10 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 11 | let decoded = bs58::decode(data) 12 | .with_alphabet(Alphabet::BITCOIN) 13 | .into_vec() 14 | .map_err(|_| { 15 | MulticoinEncoderError::InvalidStructure("failed to decode bs58".to_string()) 16 | })?; 17 | 18 | // version byte, at least one data byte, 4 bytes of checksum 19 | if decoded.len() < 6 { 20 | return Err(MulticoinEncoderError::InvalidStructure("".to_string())); 21 | } 22 | 23 | if !self 24 | .accepted_versions 25 | .iter() 26 | .any(|version| decoded[0] == *version) 27 | { 28 | return Err(MulticoinEncoderError::InvalidStructure( 29 | "invalid version".to_string(), 30 | )); 31 | } 32 | 33 | let checksum_begin = decoded.len() - 4; 34 | let checksum = &decoded[checksum_begin..]; 35 | let data = &decoded[..checksum_begin]; 36 | 37 | let checksum_check = &utils::sha256::hash(utils::sha256::hash(data))[..4]; 38 | 39 | if checksum != checksum_check { 40 | return Err(MulticoinEncoderError::InvalidStructure( 41 | "invalid checksum".to_string(), 42 | )); 43 | } 44 | 45 | let pub_key_hash = &data[1..]; 46 | 47 | Ok([ 48 | &[0xa9, pub_key_hash.len() as u8] as &[u8], 49 | pub_key_hash, 50 | &[0x87], 51 | ] 52 | .concat() 53 | .to_vec()) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/polkadot.rs: -------------------------------------------------------------------------------- 1 | use blake2::{Blake2b512, Digest}; 2 | use bs58::Alphabet; 3 | 4 | use super::{MulticoinEncoder, MulticoinEncoderError}; 5 | 6 | pub struct PolkadotEncoder {} 7 | 8 | static HASH_PREFIX: &[u8] = b"SS58PRE"; 9 | 10 | impl MulticoinEncoder for PolkadotEncoder { 11 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 12 | let decoded = bs58::decode(data) 13 | .with_alphabet(Alphabet::BITCOIN) 14 | .into_vec() 15 | .map_err(|_| { 16 | MulticoinEncoderError::InvalidStructure("failed to decode bs58".to_string()) 17 | })?; 18 | 19 | // null byte, at least 1 byte of data and 2 bytes of a hash 20 | if decoded.len() < 4 { 21 | return Err(MulticoinEncoderError::InvalidStructure("".to_string())); 22 | } 23 | 24 | let hash_begin = decoded.len() - 2; 25 | let hash = &decoded[hash_begin..]; 26 | let data = &decoded[1..hash_begin]; 27 | 28 | let mut hasher = Blake2b512::new(); 29 | hasher.update([HASH_PREFIX, &[0], data].concat()); 30 | 31 | let check_hash = hasher.finalize(); 32 | 33 | if hash != &check_hash.as_slice()[..2] { 34 | return Err(MulticoinEncoderError::InvalidStructure( 35 | "invalid checksum".to_string(), 36 | )); 37 | } 38 | 39 | Ok(data.to_vec()) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/ripple.rs: -------------------------------------------------------------------------------- 1 | use bs58::Alphabet; 2 | 3 | use crate::utils; 4 | 5 | use super::{MulticoinEncoder, MulticoinEncoderError}; 6 | 7 | pub struct RippleEncoder {} 8 | 9 | impl MulticoinEncoder for RippleEncoder { 10 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 11 | let decoded = bs58::decode(data) 12 | .with_alphabet(Alphabet::RIPPLE) 13 | .into_vec() 14 | .map_err(|_| { 15 | MulticoinEncoderError::InvalidStructure("failed to decode bs58".to_string()) 16 | })?; 17 | 18 | // at least 1 byte of data and 4 bytes of checksum 19 | if decoded.len() < 5 { 20 | return Err(MulticoinEncoderError::InvalidStructure("".to_string())); 21 | } 22 | 23 | let checksum_begin = decoded.len() - 4; 24 | let checksum = &decoded[checksum_begin..]; 25 | let data = &decoded[..checksum_begin]; 26 | 27 | let checksum_check = &utils::sha256::hash(utils::sha256::hash(data))[..4]; 28 | 29 | if checksum != checksum_check { 30 | return Err(MulticoinEncoderError::InvalidStructure( 31 | "invalid checksum".to_string(), 32 | )); 33 | } 34 | 35 | Ok(data.to_vec()) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/segwit.rs: -------------------------------------------------------------------------------- 1 | use bech32::Hrp; 2 | 3 | use crate::multicoin::encoding::{MulticoinEncoder, MulticoinEncoderError}; 4 | 5 | pub struct SegWitEncoder { 6 | pub human_readable_part: Hrp, 7 | } 8 | 9 | impl SegWitEncoder { 10 | pub fn new(human_readable_part: &str) -> SegWitEncoder { 11 | SegWitEncoder { 12 | human_readable_part: Hrp::parse_unchecked(human_readable_part), 13 | } 14 | } 15 | } 16 | 17 | impl MulticoinEncoder for SegWitEncoder { 18 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 19 | let (hrp, version, data) = bech32::segwit::decode(data).map_err(|_| { 20 | MulticoinEncoderError::InvalidStructure("failed to bech32 decode".to_string()) 21 | })?; 22 | 23 | if hrp != self.human_readable_part { 24 | return Err(MulticoinEncoderError::InvalidStructure( 25 | "invalid segwit prefix".to_string(), 26 | )); 27 | } 28 | 29 | let version_u8 = version.to_u8(); 30 | let version = match version_u8 { 31 | 0x00 => Ok(0x00), 32 | 0x01..=0x10 => Ok(version_u8 + 0x50), 33 | _ => Err(MulticoinEncoderError::InvalidStructure( 34 | "invalid segwit version".to_string(), 35 | )), 36 | }?; 37 | 38 | Ok([&[version, data.len() as u8] as &[u8], &data] 39 | .concat() 40 | .to_vec()) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/solana.rs: -------------------------------------------------------------------------------- 1 | use super::{MulticoinEncoder, MulticoinEncoderError}; 2 | 3 | pub struct SolanaEncoder {} 4 | 5 | impl MulticoinEncoder for SolanaEncoder { 6 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 7 | bs58::decode(data).into_vec().map_err(|_| { 8 | MulticoinEncoderError::InvalidStructure("failed to decode bs58".to_string()) 9 | }) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/encoding/stellar.rs: -------------------------------------------------------------------------------- 1 | use base32::Alphabet; 2 | use crc16::{State, XMODEM}; 3 | 4 | use super::{MulticoinEncoder, MulticoinEncoderError}; 5 | 6 | pub struct StellarEncoder {} 7 | 8 | impl MulticoinEncoder for StellarEncoder { 9 | fn encode(&self, data: &str) -> Result, MulticoinEncoderError> { 10 | let decoded = base32::decode(Alphabet::RFC4648 { padding: false }, data).ok_or( 11 | MulticoinEncoderError::InvalidStructure("failed to decode base32".to_string()), 12 | )?; 13 | 14 | // ed25519 version byte, at least 1 byte of data and 2 bytes of a hash 15 | if decoded.len() < 4 { 16 | return Err(MulticoinEncoderError::InvalidStructure("".to_string())); 17 | } 18 | 19 | let hash_begin = decoded.len() - 2; 20 | let checksum_bytes = &decoded[hash_begin..]; 21 | let checksum = u16::from_le_bytes([checksum_bytes[0], checksum_bytes[1]]); 22 | let data = &decoded[1..hash_begin]; 23 | 24 | let checksum_check = State::::calculate(&decoded[..hash_begin]); 25 | 26 | if checksum != checksum_check { 27 | return Err(MulticoinEncoderError::InvalidStructure( 28 | "invalid checksum".to_string(), 29 | )); 30 | } 31 | 32 | Ok(data.to_vec()) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /examples/full/src/multicoin/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod cointype; 2 | pub mod encoding; 3 | -------------------------------------------------------------------------------- /examples/full/src/selfservice/endpoint.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashMap, str::FromStr, sync::Arc}; 2 | 3 | use axum::{extract::State, http::StatusCode, response::IntoResponse, Json}; 4 | use ethers::providers::namehash; 5 | use ethers_core::types::H160; 6 | use serde::{Deserialize, Serialize}; 7 | use tracing::info; 8 | 9 | use crate::state::GlobalState; 10 | 11 | #[derive(Debug, Serialize, Deserialize)] 12 | pub struct UpdateNamePayload { 13 | payload: String, 14 | // Arbitrary auth payload 15 | auth: String, 16 | } 17 | 18 | #[derive(Debug, Serialize, Deserialize)] 19 | pub struct SignableUpdateNamePayload { 20 | name: String, 21 | records: HashMap, 22 | addresses: HashMap, 23 | time: u64, 24 | } 25 | 26 | fn convert_hashmap(a: HashMap) -> HashMap> { 27 | a.into_iter() 28 | .map(|(k, v)| (k, Some(v))) 29 | .collect::>>() 30 | } 31 | 32 | pub async fn route( 33 | State(state): State>, 34 | Json(payload): Json, 35 | ) -> impl IntoResponse { 36 | info!("Update name: {:?}", payload); 37 | 38 | let auth = payload.auth; 39 | let raw_payload = &payload.payload; 40 | let payload: SignableUpdateNamePayload = serde_json::from_str(raw_payload).unwrap(); 41 | 42 | let hash = namehash(&payload.name); 43 | let owner = state 44 | .db 45 | .get_addresses(&hash.to_fixed_bytes().to_vec(), &[&"60"]) 46 | .await 47 | .get("60") 48 | .unwrap() 49 | .clone() 50 | .unwrap(); 51 | 52 | let owner: H160 = owner.parse().unwrap(); 53 | 54 | #[cfg(feature = "eoa-auth")] 55 | if verify_eoa_payload(&auth, &raw_payload, &owner).is_err() { 56 | return (StatusCode::FORBIDDEN, "auth error"); 57 | } 58 | 59 | state 60 | .db 61 | .upsert( 62 | &hash.to_fixed_bytes().to_vec(), 63 | &convert_hashmap(payload.records), 64 | &convert_hashmap(payload.addresses), 65 | ) 66 | .await; 67 | (StatusCode::OK, "ok") 68 | } 69 | 70 | pub fn verify_eoa_payload(auth: &str, message: &str, owner: &H160) -> Result<(), ()> { 71 | let signature = ethers::types::Signature::from_str(&auth).unwrap(); 72 | 73 | let payload = signature.recover(message).unwrap(); 74 | 75 | info!("Recovered payload: {:?}", payload); 76 | info!("Owner: {:?}", owner); 77 | 78 | if payload.eq(owner) { 79 | Ok(()) 80 | } else { 81 | Err(()) 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /examples/full/src/selfservice/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod endpoint; 2 | pub mod view; 3 | -------------------------------------------------------------------------------- /examples/full/src/selfservice/view.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashMap, sync::Arc}; 2 | 3 | use axum::{ 4 | extract::{Path, State}, 5 | response::IntoResponse, 6 | Json, 7 | }; 8 | use ethers::providers::namehash; 9 | use serde::{Deserialize, Serialize}; 10 | 11 | use crate::state::GlobalState; 12 | 13 | #[derive(Debug, Serialize, Deserialize)] 14 | pub struct ViewPayload { 15 | name: String, 16 | records: HashMap>, 17 | addresses: HashMap>, 18 | } 19 | 20 | pub async fn route( 21 | Path(name): Path, 22 | State(state): State>, 23 | ) -> impl IntoResponse { 24 | let hash = namehash(&name); 25 | 26 | let (records, addresses) = state.db.get_all(hash.to_fixed_bytes().as_ref()).await; 27 | 28 | Json(ViewPayload { 29 | name, 30 | records, 31 | addresses, 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /examples/full/src/state.rs: -------------------------------------------------------------------------------- 1 | use ethers::signers::LocalWallet; 2 | 3 | use crate::database::Database; 4 | 5 | pub struct GlobalState { 6 | pub db: Database, 7 | pub wallet: LocalWallet, 8 | } 9 | -------------------------------------------------------------------------------- /examples/full/src/utils/axum_json.rs: -------------------------------------------------------------------------------- 1 | use axum::async_trait; 2 | use axum::extract::rejection::JsonRejection; 3 | use axum::extract::{FromRequest, Request}; 4 | use axum::response::{IntoResponse, Response}; 5 | use serde::de::DeserializeOwned; 6 | use serde::Serialize; 7 | 8 | pub struct Json(pub T); 9 | 10 | #[async_trait] 11 | impl FromRequest for Json 12 | where 13 | T: DeserializeOwned, 14 | S: Send + Sync, 15 | { 16 | type Rejection = JsonRejection; 17 | 18 | async fn from_request(req: Request, state: &S) -> Result { 19 | let bytes = bytes::Bytes::from_request(req, state).await?; 20 | Self::from_bytes(&bytes) 21 | } 22 | } 23 | 24 | impl Json 25 | where 26 | T: DeserializeOwned, 27 | { 28 | pub fn from_bytes(bytes: &[u8]) -> Result { 29 | axum::extract::Json::from_bytes(bytes).map(|it| Json(it.0)) 30 | } 31 | } 32 | 33 | impl IntoResponse for Json 34 | where 35 | T: Serialize, 36 | { 37 | fn into_response(self) -> Response { 38 | axum::extract::Json::into_response(axum::extract::Json(self.0)) 39 | } 40 | } 41 | 42 | impl From for Json { 43 | fn from(inner: T) -> Self { 44 | Self(inner) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /examples/full/src/utils/dns.rs: -------------------------------------------------------------------------------- 1 | pub fn decode(name: &str) -> String { 2 | let mut labels: Vec<&str> = Vec::new(); 3 | let mut idx = 0; 4 | loop { 5 | let len = name.as_bytes()[idx] as usize; 6 | if len == 0 { 7 | break; 8 | } 9 | labels.push(&name[idx + 1..idx + len + 1]); 10 | idx += len + 1; 11 | } 12 | 13 | labels.join(".") 14 | } 15 | -------------------------------------------------------------------------------- /examples/full/src/utils/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod axum_json; 2 | pub mod dns; 3 | pub mod sha256; 4 | -------------------------------------------------------------------------------- /examples/full/src/utils/sha256.rs: -------------------------------------------------------------------------------- 1 | use sha2::{Digest, Sha256}; 2 | 3 | pub fn hash>(data: T) -> Vec { 4 | let mut hasher = Sha256::new(); 5 | hasher.update(data); 6 | 7 | hasher.finalize().as_slice().into() 8 | } 9 | -------------------------------------------------------------------------------- /examples/minimal/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "offchain-gateway-example-minimal" 3 | version = "0.0.1" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | -------------------------------------------------------------------------------- /examples/minimal/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | println!("Hello, world!"); 3 | } 4 | --------------------------------------------------------------------------------