From ce42f246992a083a81101c554b43fc464b38c858 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Tue, 1 Aug 2023 21:07:14 -0500 Subject: [PATCH] Memento --- .dockerignore | 2 + .github/actions/lint/action.yaml | 58 + .github/workflows/master.yaml | 18 + .github/workflows/pr.yaml | 16 + .gitignore | 6 +- .idea/.gitignore | 8 - .idea/modules.xml | 8 - .idea/replayer.iml | 11 - .idea/vcs.xml | 6 - Cargo.lock | 5560 ++++++++++++++++++++++++++---- Cargo.toml | 68 +- README.md | 144 + backfill.yaml | 321 ++ backfill/Cargo.toml | 36 + backfill/src/backfill.rs | 282 ++ backfill/src/config.rs | 42 + backfill/src/main.rs | 99 + backfill/src/metrics.rs | 59 + db/Cargo.toml | 18 + db/src/account.rs | 115 + db/src/lib.rs | 3 + db/src/progress.rs | 56 + db/src/result.rs | 10 + gcs/Cargo.toml | 22 + gcs/src/bucket.rs | 239 ++ gcs/src/lib.rs | 2 + gcs/src/result.rs | 7 + net/Cargo.toml | 19 + net/src/http.rs | 69 + net/src/lib.rs | 2 + net/src/slack.rs | 39 + protos/Cargo.toml | 14 + protos/build.rs | 8 + protos/protos/geyser.proto | 75 + protos/src/lib.rs | 3 + rust-toolchain.toml | 3 + rustfmt.toml | 7 + s | 15 + src/main.rs | 189 - tomlfmt.toml | 10 + workers/Cargo.toml | 32 + workers/src/bin/cli.rs | 266 ++ workers/src/geyser.rs | 204 ++ workers/src/helpers.rs | 17 + workers/src/lib.rs | 3 + workers/src/main.rs | 92 + workers/src/replay_request.rs | 548 +++ 47 files changed, 7960 insertions(+), 871 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/actions/lint/action.yaml create mode 100644 .github/workflows/master.yaml create mode 100644 .github/workflows/pr.yaml delete mode 100644 .idea/.gitignore delete mode 100644 .idea/modules.xml delete mode 100644 .idea/replayer.iml delete mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 backfill.yaml create mode 100644 backfill/Cargo.toml create mode 100644 backfill/src/backfill.rs create mode 100644 backfill/src/config.rs create mode 100644 backfill/src/main.rs create mode 100644 backfill/src/metrics.rs create mode 100644 db/Cargo.toml create mode 100644 db/src/account.rs create mode 100644 db/src/lib.rs create mode 100644 db/src/progress.rs create mode 100644 db/src/result.rs create mode 100644 gcs/Cargo.toml create mode 100644 gcs/src/bucket.rs create mode 100644 gcs/src/lib.rs create mode 100644 gcs/src/result.rs create mode 100644 net/Cargo.toml create mode 100644 net/src/http.rs create mode 100644 net/src/lib.rs create mode 100644 net/src/slack.rs create mode 100644 protos/Cargo.toml create mode 100644 protos/build.rs create mode 100644 protos/protos/geyser.proto create mode 100644 protos/src/lib.rs create mode 100644 rust-toolchain.toml create mode 100644 rustfmt.toml create mode 100755 s delete mode 100644 src/main.rs create mode 100644 tomlfmt.toml create mode 100644 workers/Cargo.toml create mode 100644 workers/src/bin/cli.rs create mode 100644 workers/src/geyser.rs create mode 100644 workers/src/helpers.rs create mode 100644 workers/src/lib.rs create mode 100644 workers/src/main.rs create mode 100644 workers/src/replay_request.rs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d740626 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/target +/test-ledger diff --git a/.github/actions/lint/action.yaml b/.github/actions/lint/action.yaml new file mode 100644 index 0000000..b1dfe21 --- /dev/null +++ b/.github/actions/lint/action.yaml @@ -0,0 +1,58 @@ +name: Lint +description: 'Run linters on the repository' + +runs: + using: composite + steps: + - uses: dsherret/rust-toolchain-file@v1 + + - name: setup rustc + run: | + rustup update stable + shell: bash + + - name: Install Protobuf + run: | + export PROTOC_VERSION=21.12 && \ + export PROTOC_ZIP=protoc-$PROTOC_VERSION-linux-x86_64.zip && \ + curl -Ss -OL https://github.com/google/protobuf/releases/download/v$PROTOC_VERSION/$PROTOC_ZIP \ + && sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc \ + && sudo unzip -o $PROTOC_ZIP -d /usr/local include/* \ + && rm -f $PROTOC_ZIP + shell: bash + + - name: Install latest nightly + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2023-10-05-x86_64-unknown-linux-gnu + components: rustfmt, clippy + + - name: Setup rust lint cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/ + target/ + key: ${{ runner.os }}-cargo-lint-${{ hashFiles('**/Cargo.lock') }} + + - name: Setup Rust tools + run: | + cargo +nightly-2023-10-05 install cargo-sort + cargo +nightly-2023-10-05 install cargo-udeps + shell: bash + + - name: cargo sort + run: cargo +nightly-2023-10-05 sort --workspace --check + shell: bash + + - name: cargo fmt + run: cargo +nightly-2023-10-05 fmt --all --check + shell: bash + + - name: clippy + run: cargo +nightly-2023-10-05 clippy --all-features --all-targets --tests -- -D warnings + shell: bash + + - name: cargo udeps + run: cargo +nightly-2023-10-05 udeps --all-features --all-targets --tests + shell: bash diff --git a/.github/workflows/master.yaml b/.github/workflows/master.yaml new file mode 100644 index 0000000..f48b4ff --- /dev/null +++ b/.github/workflows/master.yaml @@ -0,0 +1,18 @@ +name: Merge to master +on: + push: + branches: + - master + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + lint_build: + runs-on: ubuntu-20.04-32c-128g + timeout-minutes: 45 + steps: + - uses: actions/checkout@v3 + - name: lint + uses: ./.github/actions/lint diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 0000000..28d8bc1 --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,16 @@ +name: Pull Request +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + lint_test_build: + runs-on: ubuntu-20.04-32c-128g + timeout-minutes: 45 + steps: + - uses: actions/checkout@v3 + - name: lint + uses: ./.github/actions/lint diff --git a/.gitignore b/.gitignore index ea8c4bf..a622b98 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -/target +**/target +/.idea +/test-ledger +/ledger +.env diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a382748..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/replayer.iml b/.idea/replayer.iml deleted file mode 100644 index c254557..0000000 --- a/.idea/replayer.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index de74979..5f96ea4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,11 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -18,1038 +28,4934 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] -name = "aho-corasick" -version = "1.0.2" +name = "aead" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" dependencies = [ - "memchr", + "generic-array", ] [[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" +name = "aes" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "libc", + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", ] [[package]] -name = "async-trait" -version = "0.1.72" +name = "aes-gcm-siv" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" dependencies = [ - "proc-macro2", - "quote", - "syn", + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "ahash" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "version_check", +] [[package]] -name = "backtrace" -version = "0.3.68" +name = "ahash" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ - "addr2line", - "cc", "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", + "getrandom 0.2.10", + "once_cell", + "version_check", ] [[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.1" +name = "aho-corasick" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +dependencies = [ + "memchr", +] [[package]] -name = "base64" -version = "0.21.2" +name = "aliasable" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] -name = "bitflags" -version = "1.3.2" +name = "alloc-no-stdlib" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] -name = "bitflags" -version = "2.3.3" +name = "alloc-stdlib" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] [[package]] -name = "bumpalo" -version = "3.13.0" +name = "android-tzdata" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] -name = "bytes" -version = "1.4.0" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] [[package]] -name = "cc" -version = "1.0.79" +name = "anstream" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "anstyle" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" [[package]] -name = "chrono" -version = "0.4.26" +name = "anstyle-parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "time", - "wasm-bindgen", - "winapi", + "utf8parse", ] [[package]] -name = "cloud-storage" -version = "0.11.1" +name = "anstyle-query" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7602ac4363f68ac757d6b87dd5d850549a14d37489902ae639c06ecec06ad275" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "async-trait", - "base64 0.13.1", - "bytes", - "chrono", - "dotenv", - "futures-util", - "hex", - "jsonwebtoken", - "lazy_static", - "openssl", - "percent-encoding", - "reqwest", - "serde", - "serde_json", - "tokio", + "windows-sys", ] [[package]] -name = "core-foundation" -version = "0.9.3" +name = "anstyle-wincon" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" dependencies = [ - "core-foundation-sys", - "libc", + "anstyle", + "windows-sys", ] [[package]] -name = "core-foundation-sys" -version = "0.8.4" +name = "anyhow" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] -name = "dotenv" -version = "0.15.0" +name = "arc-swap" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" [[package]] -name = "encoding_rs" -version = "0.8.32" +name = "ark-bn254" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" dependencies = [ - "cfg-if", + "ark-ec", + "ark-ff", + "ark-std", ] [[package]] -name = "errno" -version = "0.3.1" +name = "ark-ec" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "ark-ff" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "cc", - "libc", + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.4", + "num-traits", + "paste", + "rustc_version", + "zeroize", ] [[package]] -name = "fastrand" -version = "2.0.0" +name = "ark-ff-asm" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote 1.0.33", + "syn 1.0.109", +] [[package]] -name = "fnv" -version = "1.0.7" +name = "ark-ff-macros" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] [[package]] -name = "foreign-types" -version = "0.3.2" +name = "ark-poly" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "foreign-types-shared", + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "ark-serialize" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.4", +] [[package]] -name = "form_urlencoded" -version = "1.2.0" +name = "ark-serialize-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "percent-encoding", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", ] [[package]] -name = "futures-channel" -version = "0.3.28" +name = "ark-std" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ - "futures-core", + "num-traits", + "rand 0.8.5", ] [[package]] -name = "futures-core" -version = "0.3.28" +name = "array-bytes" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "9ad284aeb45c13f2fb4f084de4a420ebf447423bdf9386c0540ce33cb3ef4b8c" [[package]] -name = "futures-io" -version = "0.3.28" +name = "arrayref" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] -name = "futures-macro" -version = "0.3.28" +name = "arrayvec" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] -name = "futures-sink" -version = "0.3.28" +name = "ascii" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] -name = "futures-task" -version = "0.3.28" +name = "assert_matches" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] -name = "futures-util" -version = "0.3.28" +name = "async-compression" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "d495b6dc0184693324491a5ac05f559acc97bf937ab31d7a1c33dd0016be6d2b" dependencies = [ + "brotli", + "flate2", "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", "memchr", "pin-project-lite", - "pin-utils", - "slab", + "tokio", ] [[package]] -name = "gimli" -version = "0.27.3" +name = "async-stream" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] [[package]] -name = "h2" -version = "0.3.20" +name = "async-stream-impl" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "async-trait" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] [[package]] -name = "hermit-abi" -version = "0.3.2" +name = "atty" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] [[package]] -name = "hex" -version = "0.4.3" +name = "autocfg" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "http" -version = "0.2.9" +name = "autotools" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "aef8da1805e028a172334c3b680f93e71126f2327622faef2ec3d893c0a4ad77" dependencies = [ - "bytes", - "fnv", - "itoa", + "cc", ] [[package]] -name = "http-body" -version = "0.4.5" +name = "axum" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", "bytes", + "futures-util", "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom 0.2.10", + "instant", + "pin-project-lite", + "rand 0.8.5", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.65.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +dependencies = [ + "bitflags 1.3.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "prettyplease 0.2.12", + "proc-macro2 1.0.70", + "quote 1.0.33", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.29", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.70", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.70", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "chrono-tz" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2554a3155fec064362507487171dcc4edc3df60cb10f3a1fb10ed8094822b120" +dependencies = [ + "chrono", + "parse-zoneinfo", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +dependencies = [ + "anstream", + "anstyle", + "bitflags 1.3.2", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +dependencies = [ + "heck", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "clap_lex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + +[[package]] +name = "clickhouse-rs" +version = "1.0.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41edeaeac73a2f3c39357e5dd42a08c2d41fbc5b85c35a76879dc10d87128010" +dependencies = [ + "byteorder", + "chrono", + "chrono-tz", + "clickhouse-rs-cityhash-sys", + "combine 4.6.6", + "crossbeam", + "futures-core", + "futures-sink", + "futures-util", + "hostname", + "lazy_static", + "log", + "lz4", + "pin-project", + "thiserror", + "tokio", + "url", + "uuid", +] + +[[package]] +name = "clickhouse-rs-cityhash-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4baf9d4700a28d6cb600e17ed6ae2b43298a5245f1f76b4eab63027ebfd592b9" +dependencies = [ + "cc", +] + +[[package]] +name = "cloud-storage" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7602ac4363f68ac757d6b87dd5d850549a14d37489902ae639c06ecec06ad275" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bytes", + "chrono", + "dotenv", + "futures-util", + "hex", + "jsonwebtoken", + "lazy_static", + "openssl", + "percent-encoding", + "reqwest", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.70", + "quote 1.0.33", + "strsim", + "syn 2.0.29", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "dashmap" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +dependencies = [ + "cfg-if", + "num_cpus", + "rayon", +] + +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "dir-diff" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2860407d7d7e2e004bb2128510ad9e8d669e76fa005ccf567977b5d71b8b4a0b" +dependencies = [ + "walkdir", +] + +[[package]] +name = "dlopen" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" +dependencies = [ + "dlopen_derive", + "lazy_static", + "libc", + "winapi", +] + +[[package]] +name = "dlopen_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" +dependencies = [ + "libc", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.7", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fast-math" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" +dependencies = [ + "ieee754", +] + +[[package]] +name = "fastrand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "filetime" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "windows-sys", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "goauth" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8af59a261bcf42f45d1b261232847b9b850ba0a1419d6100698246fb66e9240" +dependencies = [ + "arc-swap", + "futures", + "log", + "reqwest", + "serde", + "serde_derive", + "serde_json", + "simpl", + "smpl_jwt", + "time", + "tokio", +] + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "h2" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 1.9.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "headers" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +dependencies = [ + "base64 0.13.1", + "bitflags 1.3.2", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-proxy" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +dependencies = [ + "bytes", + "futures", + "headers", + "http", + "hyper", + "hyper-tls", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls 0.21.7", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ieee754" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "index_list" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9d968042a4902e08810946fc7cd5851eb75e80301342305af755ca06cb82ce" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi 0.3.2", + "rustix", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jito-gcs" +version = "0.0.1" +dependencies = [ + "cloud-storage", + "futures-util", + "jito-net", + "regex", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jito-net" +version = "0.0.1" +dependencies = [ + "futures-util", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jito-protos" +version = "0.1.0" +dependencies = [ + "bytes", + "prost", + "prost-types", + "tonic", + "tonic-build", +] + +[[package]] +name = "jito-replayer-backfill" +version = "0.0.1" +dependencies = [ + "chrono", + "clap", + "clickhouse-rs", + "cloud-storage", + "crossbeam-channel", + "futures", + "futures-util", + "jito-gcs", + "jito-net", + "jito-protos", + "jito-replayer-db", + "jito-workers", + "reqwest", + "serde", + "serde_yaml", + "solana-account-decoder", + "solana-ledger", + "solana-runtime", + "solana-sdk", + "solana-storage-bigtable", + "spl-token", + "thiserror", + "tokio", + "tokio-retry", + "tokio-stream", + "tonic", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "jito-replayer-db" +version = "0.0.1" +dependencies = [ + "clickhouse-rs", + "futures-util", + "serde", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jito-workers" +version = "0.0.1" +dependencies = [ + "chrono", + "clap", + "cloud-storage", + "crossbeam-channel", + "futures-util", + "jito-gcs", + "jito-net", + "jito-protos", + "reqwest", + "serde", + "solana-ledger", + "solana-runtime", + "solana-sdk", + "solana-storage-bigtable", + "thiserror", + "tokio", + "tokio-stream", + "tonic", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afabcc15e437a6484fc4f12d0fd63068fe457bf93f1c148d3d9649c60b103f32" +dependencies = [ + "base64 0.12.3", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + +[[package]] +name = "librocksdb-sys" +version = "0.11.0+8.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" +dependencies = [ + "bindgen", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", + "lz4-sys", +] + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +dependencies = [ + "serde", +] + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" + +[[package]] +name = "memchr" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f478948fd84d9f8e86967bf432640e46adfb5a4bd4f14ef7e864ab38220534ae" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.2", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +dependencies = [ + "num_enum_derive 0.7.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "object" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "111.27.0+1.1.1v" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ouroboros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +dependencies = [ + "aliasable", + "ouroboros_macro", +] + +[[package]] +name = "ouroboros_macro" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.8", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" +dependencies = [ + "base64 0.13.1", + "once_cell", + "regex", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.0.0", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2 1.0.70", + "syn 1.0.109", +] + +[[package]] +name = "prettyplease" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" +dependencies = [ + "proc-macro2 1.0.70", + "syn 2.0.29", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease 0.1.25", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "protobuf-src" +version = "1.1.0+21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" +dependencies = [ + "autotools", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2 1.0.70", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.10", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "reed-solomon-erasure" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7263373d500d4d4f505d43a2a662d475a894aa94503a1ee28e9188b5f3960d4f" +dependencies = [ + "cc", + "libc", + "libm", + "lru", + "parking_lot 0.11.2", + "smallvec", + "spin 0.9.8", +] + +[[package]] +name = "regex" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.3.7", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "reqwest" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +dependencies = [ + "async-compression", + "base64 0.21.5", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.7", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.24.1", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rocksdb" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6248e1caa625eb708e266e06159f135e8c26f2bb7ceb72dc4b2766d0340964" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustls" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "serde" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "serde_yaml" +version = "0.9.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" +dependencies = [ + "indexmap 2.0.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "simpl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a30f10c911c0355f80f1c2faa8096efc4a58cdf8590b954d5b395efa071c711" + +[[package]] +name = "simple_asn1" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b" +dependencies = [ + "chrono", + "num-bigint 0.2.6", + "num-traits", +] + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] -name = "httpdate" -version = "1.0.2" +name = "smpl_jwt" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "95b6ff8c21c74ce7744643a7cddbb02579a44f1f77e4316bff1ddb741aca8ac9" +dependencies = [ + "base64 0.13.1", + "log", + "openssl", + "serde", + "serde_derive", + "serde_json", + "simpl", + "time", +] [[package]] -name = "hyper" -version = "0.14.27" +name = "socket2" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", + "libc", + "winapi", ] [[package]] -name = "hyper-tls" -version = "0.5.0" +name = "socket2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", + "libc", + "windows-sys", ] [[package]] -name = "iana-time-zone" -version = "0.1.57" +name = "solana-account-decoder" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "5c68b2beaa5b5b4aa9d182568c020c111b9e29e52c7f74cc9eb77cc27f003fa9" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", + "Inflector", + "base64 0.21.5", + "bincode", + "bs58", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-address-lookup-table-program", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022", + "spl-token-metadata-interface", + "thiserror", + "zstd", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "solana-address-lookup-table-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "c0eee296b5ca0955429bd2df3272cb7ba0bb5c5886a4a5fdfe5cde97b5698c21" dependencies = [ - "cc", + "bincode", + "bytemuck", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", ] [[package]] -name = "idna" -version = "0.4.0" +name = "solana-bpf-loader-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "cd8ee73b25781e1675697a99b5f6a967d813a5deb4c873b16c7c7c2a00141d56" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "bincode", + "byteorder", + "libsecp256k1", + "log", + "rand 0.7.3", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", + "solana_rbpf", + "thiserror", ] [[package]] -name = "indexmap" -version = "1.9.3" +name = "solana-bucket-map" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "356493e35efc4d0933df4a3a2bb605fe4854e0aee3fcefcae1549b112935a37e" dependencies = [ - "autocfg", - "hashbrown", + "bv", + "log", + "memmap2", + "modular-bitfield", + "num_enum 0.6.1", + "rand 0.7.3", + "solana-measure", + "solana-sdk", + "tempfile", ] [[package]] -name = "ipnet" -version = "2.8.0" +name = "solana-compute-budget-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "fd57960beb24b9e04d9dedb58670b7e46e999a42001203b7dd15b099761bfce2" +dependencies = [ + "solana-program-runtime", + "solana-sdk", +] [[package]] -name = "itoa" -version = "1.0.9" +name = "solana-config-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "8e4f62294a49dae0338e47503f55bce1d9469ca6555b2bed5547d39dc519c869" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] [[package]] -name = "js-sys" -version = "0.3.64" +name = "solana-entry" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "925fee65f8357759574f4bd34b5a58e389ef1cddbc52a20dfa43715c4d1ba22d" dependencies = [ - "wasm-bindgen", + "bincode", + "crossbeam-channel", + "dlopen", + "dlopen_derive", + "lazy_static", + "log", + "rand 0.7.3", + "rayon", + "serde", + "solana-measure", + "solana-merkle-tree", + "solana-metrics", + "solana-perf", + "solana-rayon-threadlimit", + "solana-sdk", ] [[package]] -name = "jsonwebtoken" -version = "7.2.0" +name = "solana-frozen-abi" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcc15e437a6484fc4f12d0fd63068fe457bf93f1c148d3d9649c60b103f32" +checksum = "7e77bfd59ad4e64c0f06fbcbe16d58f3a40bdbcc050fb78fc7134a55a5c290b9" dependencies = [ - "base64 0.12.3", - "pem", - "ring", + "ahash 0.8.3", + "blake3", + "block-buffer 0.10.4", + "bs58", + "bv", + "byteorder", + "cc", + "either", + "generic-array", + "getrandom 0.1.16", + "im", + "lazy_static", + "log", + "memmap2", + "once_cell", + "rand_core 0.6.4", + "rustc_version", "serde", + "serde_bytes", + "serde_derive", "serde_json", - "simple_asn1", + "sha2 0.10.7", + "solana-frozen-abi-macro", + "subtle", + "thiserror", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "solana-frozen-abi-macro" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "992b866b9f0510fd3c290afe6a37109ae8d15b74fa24e3fb6d164be2971ee94f" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "rustc_version", + "syn 2.0.29", +] [[package]] -name = "libc" -version = "0.2.147" +name = "solana-ledger" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "6112dabcfe9b1ee69f0b608fa16bee1a3b11b485e4185c300924c6a35e405e61" +dependencies = [ + "assert_matches", + "bincode", + "bitflags 1.3.2", + "byteorder", + "chrono", + "chrono-humanize", + "crossbeam-channel", + "dashmap", + "fs_extra", + "futures", + "itertools", + "lazy_static", + "libc", + "log", + "lru", + "num_cpus", + "num_enum 0.6.1", + "prost", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rayon", + "reed-solomon-erasure", + "rocksdb", + "rustc_version", + "scopeguard", + "serde", + "serde_bytes", + "sha2 0.10.7", + "solana-account-decoder", + "solana-bpf-loader-program", + "solana-entry", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-runtime", + "solana-sdk", + "solana-stake-program", + "solana-storage-bigtable", + "solana-storage-proto", + "solana-transaction-status", + "solana-vote-program", + "spl-token", + "spl-token-2022", + "static_assertions", + "tempfile", + "thiserror", + "tokio", + "tokio-stream", + "trees", +] [[package]] -name = "linux-raw-sys" -version = "0.4.3" +name = "solana-loader-v4-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "919cbffb43e70a96b7c2b647b53a855abd80e8e73ce6939faf8564450993a291" +dependencies = [ + "log", + "rand 0.7.3", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana_rbpf", +] [[package]] -name = "log" -version = "0.4.19" +name = "solana-logger" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "0278658cd4fb5405932452bf20f7df496ce8b9e9cf66a7d1c621bbe3b01fe297" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] [[package]] -name = "memchr" -version = "2.5.0" +name = "solana-measure" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "4d1650f3e76bedbaa149c73f145dbd605e7020cf77b3f9e24c8918fca4220bc4" +dependencies = [ + "log", + "solana-sdk", +] [[package]] -name = "mime" -version = "0.3.17" +name = "solana-merkle-tree" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "a81b5e6a0d6570ffdf196287085c76e494fb457ec2b3ac162df9032eb850e14a" +dependencies = [ + "fast-math", + "matches", + "solana-program", +] [[package]] -name = "miniz_oxide" -version = "0.7.1" +name = "solana-metrics" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "7e80d0e32083dde7f76ad8f30c2b71c0efcfce84fa7f6593adf91f4a5cfeb067" dependencies = [ - "adler", + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", ] [[package]] -name = "mio" -version = "0.8.8" +name = "solana-perf" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "32ccdeb24c7e53733e7a929b5e2d717c3f428cb131861946de6065ffccd67228" dependencies = [ + "ahash 0.8.3", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen", + "dlopen_derive", + "fnv", + "lazy_static", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "log", + "nix", + "rand 0.7.3", + "rayon", + "serde", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", ] [[package]] -name = "native-tls" -version = "0.2.11" +name = "solana-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "aa5ac2110c5b927d6114b2d4f32af7f749fde0e6fd8f34777407ce89d66630be" dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "array-bytes", + "base64 0.21.5", + "bincode", + "bitflags 1.3.2", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "bs58", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.10", + "itertools", + "js-sys", "lazy_static", "libc", + "libsecp256k1", "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "memoffset 0.9.0", + "num-bigint 0.4.4", + "num-derive 0.3.3", + "num-traits", + "parking_lot 0.12.1", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.7", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "solana-program-runtime" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "02d1f727139019e6a5872ae3149971f2f7928a4841d27284a8787ab23dddcb10" dependencies = [ - "overload", - "winapi", + "base64 0.21.5", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "log", + "num-derive 0.3.3", + "num-traits", + "percentage", + "rand 0.7.3", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", ] [[package]] -name = "num-bigint" -version = "0.2.6" +name = "solana-rayon-threadlimit" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +checksum = "9b576ba60c11f0284bccee36ec472078e7213866a81c3fd34796223a1617ee21" dependencies = [ - "autocfg", - "num-integer", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-runtime" +version = "1.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ebad8b26d4c55a78b523b7b7dbcd584e514fd6135e33ffd6faa8bef8c0b8b9" +dependencies = [ + "arrayref", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "dir-diff", + "flate2", + "fnv", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lru", + "lz4", + "memmap2", + "modular-bitfield", + "num-derive 0.3.3", "num-traits", + "num_cpus", + "num_enum 0.6.1", + "once_cell", + "ouroboros", + "percentage", + "rand 0.7.3", + "rayon", + "regex", + "rustc_version", + "serde", + "serde_derive", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-compute-budget-program", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", + "solana-zk-token-proof-program", + "solana-zk-token-sdk", + "static_assertions", + "strum", + "strum_macros", + "symlink", + "tar", + "tempfile", + "thiserror", + "zstd", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "solana-sdk" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "dbe17a1ce6082979e7beffb7cadd7051e29d873594622a11a7d0a4c2dd4b7934" dependencies = [ - "autocfg", + "assert_matches", + "base64 0.21.5", + "bincode", + "bitflags 1.3.2", + "borsh 0.10.3", + "bs58", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num-derive 0.3.3", "num-traits", + "num_enum 0.6.1", + "pbkdf2 0.11.0", + "qstring", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.7", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-logger", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", ] [[package]] -name = "num-traits" -version = "0.2.16" +name = "solana-sdk-macro" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "9fe4363d2503a75325ec94aa18b063574edb3454d38840e01c5af477b3b0689d" dependencies = [ - "autocfg", + "bs58", + "proc-macro2 1.0.70", + "quote 1.0.33", + "rustversion", + "syn 2.0.29", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "solana-stake-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "1b44889e978fb266905fefe6b837db87ed6857791efb0a6c3262bcb5d6d86c4d" dependencies = [ - "hermit-abi", - "libc", + "bincode", + "log", + "rustc_version", + "solana-config-program", + "solana-program-runtime", + "solana-sdk", + "solana-vote-program", ] [[package]] -name = "object" -version = "0.31.1" +name = "solana-storage-bigtable" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "a430ad60b59c2b7a7e39103f72d2ed759cf556b512941fdfff7cd9a32b5f8a09" dependencies = [ - "memchr", + "backoff", + "bincode", + "bytes", + "bzip2", + "enum-iterator", + "flate2", + "futures", + "goauth", + "http", + "hyper", + "hyper-proxy", + "log", + "openssl", + "prost", + "prost-types", + "serde", + "serde_derive", + "smpl_jwt", + "solana-metrics", + "solana-sdk", + "solana-storage-proto", + "solana-transaction-status", + "thiserror", + "tokio", + "tonic", + "zstd", ] [[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "openssl" -version = "0.10.55" +name = "solana-storage-proto" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "5ffc46192c4048fe9f97786f03b8c58e0a5d5a203ae356ad8f9c54e24c0d5aa2" dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "bincode", + "bs58", + "prost", + "protobuf-src", + "serde", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "tonic-build", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "solana-system-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "a52b5fd24edb11d894d1ee66d12e5f0c8085cea8f48cd3534296f69d45c695ea" dependencies = [ - "proc-macro2", - "quote", - "syn", + "bincode", + "log", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", ] [[package]] -name = "openssl-probe" -version = "0.1.5" +name = "solana-transaction-status" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "50e2edc23c671221e431712dbf03ca20eee57dc5527935eb745824d7257e314c" +dependencies = [ + "Inflector", + "base64 0.21.5", + "bincode", + "borsh 0.10.3", + "bs58", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-address-lookup-table-program", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", + "thiserror", +] [[package]] -name = "openssl-sys" -version = "0.9.90" +name = "solana-vote-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "1f485487153d8528769da669e2b174d8fd29c1b5e057dede11b9bea751b63668" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "bincode", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", ] [[package]] -name = "overload" -version = "0.1.1" +name = "solana-zk-token-proof-program" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "0f11c1d063ef42b90d224537c9f228cdcee3656b75a307c6bb85ee6099bbbe2f" +dependencies = [ + "bytemuck", + "getrandom 0.1.16", + "num-derive 0.3.3", + "num-traits", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", +] [[package]] -name = "pem" -version = "0.8.3" +name = "solana-zk-token-sdk" +version = "1.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" +checksum = "e0c83eec033c30c95938905374292fb8a3559dd3dfb36d715624e5f8f41b078e" dependencies = [ - "base64 0.13.1", - "once_cell", - "regex", + "aes-gcm-siv", + "base64 0.21.5", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive 0.3.3", + "num-traits", + "rand 0.7.3", + "serde", + "serde_json", + "sha3 0.9.1", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", ] [[package]] -name = "percent-encoding" -version = "2.3.0" +name = "solana_rbpf" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "17d4ba1e58947346e360fabde0697029d36ba83c42f669199b16a8931313cf29" +dependencies = [ + "byteorder", + "combine 3.8.1", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] [[package]] -name = "pin-project-lite" -version = "0.2.10" +name = "spin" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "spin" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] -name = "pkg-config" -version = "0.3.27" +name = "spl-associated-token-account" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.1", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022", + "thiserror", +] [[package]] -name = "proc-macro2" -version = "1.0.66" +name = "spl-discriminator" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ - "unicode-ident", + "bytemuck", + "solana-program", + "spl-discriminator-derive", ] [[package]] -name = "quote" -version = "1.0.32" +name = "spl-discriminator-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" dependencies = [ - "proc-macro2", + "quote 1.0.33", + "spl-discriminator-syn", + "syn 2.0.29", ] [[package]] -name = "redox_syscall" -version = "0.3.5" +name = "spl-discriminator-syn" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2" dependencies = [ - "bitflags 1.3.2", + "proc-macro2 1.0.70", + "quote 1.0.33", + "sha2 0.10.7", + "syn 2.0.29", + "thiserror", ] [[package]] -name = "regex" -version = "1.9.1" +name = "spl-memo" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", + "solana-program", ] [[package]] -name = "regex-automata" -version = "0.3.4" +name = "spl-pod" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", ] [[package]] -name = "regex-syntax" -version = "0.7.4" +name = "spl-program-error" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "replayer" -version = "0.1.0" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ - "cloud-storage", - "regex", - "reqwest", - "serde", - "serde_json", + "num-derive 0.4.1", + "num-traits", + "solana-program", + "spl-program-error-derive", "thiserror", - "tokio", - "tracing", - "tracing-log", - "tracing-subscriber", ] [[package]] -name = "reqwest" -version = "0.11.18" +name = "spl-program-error-derive" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c" dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", + "proc-macro2 1.0.70", + "quote 1.0.33", + "sha2 0.10.7", + "syn 2.0.29", ] [[package]] -name = "ring" -version = "0.16.20" +name = "spl-tlv-account-resolution" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustix" -version = "0.38.4" +name = "spl-token" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", ] [[package]] -name = "ryu" -version = "1.0.15" +name = "spl-token-2022" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.1", + "num-traits", + "num_enum 0.7.1", + "solana-program", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] [[package]] -name = "schannel" -version = "0.1.22" +name = "spl-token-metadata-interface" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ - "windows-sys", + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] -name = "security-framework" -version = "2.9.2" +name = "spl-transfer-hook-interface" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", ] [[package]] -name = "security-framework-sys" -version = "2.9.1" +name = "spl-type-length-value" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" dependencies = [ - "core-foundation-sys", - "libc", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] -name = "serde" -version = "1.0.178" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60363bdd39a7be0266a520dab25fdc9241d2f987b08a01e01f0ec6d06a981348" -dependencies = [ - "serde_derive", -] +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "serde_derive" -version = "1.0.178" +name = "strsim" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28482318d6641454cb273da158647922d1be6b5a2fcc6165cd89ebdd7ed576b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "serde_json" -version = "1.0.104" +name = "strum" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "itoa", - "ryu", - "serde", + "strum_macros", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "strum_macros" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", + "heck", + "proc-macro2 1.0.70", + "quote 1.0.33", + "rustversion", + "syn 1.0.109", ] [[package]] -name = "sharded-slab" -version = "0.1.4" +name = "subtle" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] -name = "simple_asn1" -version = "0.4.1" +name = "symlink" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b" -dependencies = [ - "chrono", - "num-bigint", - "num-traits", -] +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" [[package]] -name = "slab" -version = "0.4.8" +name = "syn" +version = "0.15.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ - "autocfg", + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid", ] [[package]] -name = "smallvec" -version = "1.11.0" +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "unicode-ident", +] [[package]] -name = "socket2" -version = "0.4.9" +name = "syn" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ - "libc", - "winapi", + "proc-macro2 1.0.70", + "quote 1.0.33", + "unicode-ident", ] [[package]] -name = "spin" -version = "0.5.2" +name = "sync_wrapper" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "syn" -version = "2.0.27" +name = "tar" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "filetime", + "libc", + "xattr", ] [[package]] name = "tempfile" -version = "3.7.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "redox_syscall 0.3.5", "rustix", "windows-sys", ] +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", ] [[package]] @@ -1064,13 +4970,38 @@ dependencies = [ [[package]] name = "time" -version = "0.1.45" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "deranged", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", ] [[package]] @@ -1090,31 +5021,42 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", "mio", "num_cpus", + "parking_lot 0.12.1", "pin-project-lite", - "socket2", + "signal-hook-registry", + "socket2 0.5.3", "tokio-macros", "windows-sys", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", ] [[package]] @@ -1127,6 +5069,49 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-retry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" +dependencies = [ + "pin-project", + "rand 0.8.5", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.9", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.7", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.8" @@ -1141,6 +5126,105 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tonic" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.13.1", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "prost-derive", + "rustls-pemfile", + "tokio", + "tokio-rustls 0.23.4", + "tokio-stream", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + +[[package]] +name = "tonic-build" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" +dependencies = [ + "prettyplease 0.1.25", + "proc-macro2 1.0.70", + "prost-build", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -1165,9 +5249,9 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", ] [[package]] @@ -1180,6 +5264,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.1.3" @@ -1197,20 +5291,36 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] +[[package]] +name = "trees" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de5f738ceab88e2491a94ddc33c3feeadfa95fedc60363ef110845df12f3878" + [[package]] name = "try-lock" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -1232,23 +5342,76 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" + [[package]] name = "untrusted" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + [[package]] name = "valuable" version = "0.1.0" @@ -1261,6 +5424,28 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1272,9 +5457,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" @@ -1301,9 +5486,9 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -1325,7 +5510,7 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ - "quote", + "quote 1.0.33", "wasm-bindgen-macro-support", ] @@ -1335,9 +5520,9 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1350,9 +5535,9 @@ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-streams" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" dependencies = [ "futures-util", "js-sys", @@ -1371,6 +5556,33 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1387,6 +5599,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1413,9 +5634,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1428,51 +5649,120 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys", +] + +[[package]] +name = "xattr" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +dependencies = [ + "libc", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2 1.0.70", + "quote 1.0.33", + "syn 2.0.29", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 1125ec1..8f84430 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,18 +1,60 @@ -[package] -name = "replayer" -version = "0.1.0" -edition = "2021" +[workspace] +members = [ + "backfill", + "db", + "gcs", + "net", + "workers", +] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[workspace.package] +version = "0.0.1" +authors = ["Jito Labs "] +repository = "https://github.com/jito-labs/memento" +homepage = "jito.wtf" +license = "Apache-2.0" +edition = "2021" +publish = false -[dependencies] +[workspace.dependencies] +bytes = "1.2" +chrono = { version = "0.4.23", features = ["serde"] } +clap = { version = "=4.2.7", features = ["derive", "env"] } +clickhouse-rs = "1.0.0-alpha.1" cloud-storage = "0.11.1" -tokio = { version = "1.29.1", features = ["rt-multi-thread", "rt", "time"] } +crossbeam-channel = "0.5.8" +futures = "0.3.28" +futures-util = "0.3.25" +histogram = "0.7.4" +jito-gcs = { path = "gcs" } +jito-net = { path = "net" } +jito-protos = { path = "protos" } +jito-replayer-backfill = { path = "backfill" } +jito-replayer-db = { path = "db" } +jito-workers = { path = "workers" } +prost = "0.11.9" +prost-types = "0.11.9" +regex = "1.9.1" +reqwest = { version = "0.11.20", features = ["stream"] } +serde = "1.0.152" +serde_derive = "1.0.171" +serde_json = "1.0.102" +serde_yaml = "0.9.25" +solana-account-decoder = { version = "1.16.20" } +solana-geyser-plugin-interface = { version = "1.16.20" } +solana-ledger = { version = "1.16.20" } +solana-rpc-client = { version = "1.16.20" } +solana-rpc-client-api = { version = "1.16.20" } +solana-runtime = { version = "1.16.20" } +solana-sdk = { version = "1.16.20" } +solana-storage-bigtable = { version = "1.16.20" } +spl-token = "4.0.0" thiserror = "1.0.44" -tracing = "0.1.37" +tokio = { version = "1.29.1", features = ["rt-multi-thread", "rt", "time"] } +tokio-retry = "0.3.0" +tokio-stream = { version = "0.1.14", features = ["net"] } +tonic = "0.8.3" # note: 0.8 used because it allows larger max message size, which is breaking the stream +tonic-build = "0.8.4" # note: 0.8 used because it allows larger max message size, which is breaking the stream +tracing = { version = "0.1.37" } tracing-log = "0.1.3" -tracing-subscriber = "0.3.17" -reqwest = "0.11.18" -serde = "1.0.178" -serde_json = "1.0.104" -regex = "1.9.1" +tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } diff --git a/README.md b/README.md new file mode 100644 index 0000000..812f216 --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +# Memento + +Memento is a tool used to load and save accounts from old Solana snapshots in Google Cloud Storage. + +## Why should I use Memento? +- No fighting solana versioning between your geyser plugin and the validator. +- No fighting the rust compiler between your geyser plugin and the validator. +- Easy programmatic access to bulk snapshot ingestion. + +# Developing + +### Build +```bash +$ cargo b --release +``` + +### Run + +**Worker** +```bash +$ ./target/release/jito-workers --help +``` + +**Backfill** + +The following is a backfill client that backfills to clickhouse. +```bash +$ ./target/release/jito-replayer-backfill --help +``` + +# How does it work +- There's a server and client. +- When starting up the server, it will load in all snapshots available across all GCP buckets you provide on the CLI. +- The clients can connect to the server over GRPC to start backfills and request information on the snapshots available. + +# System Setup +Note: During the development a machine with the following specs was used: +- CPU: AMD Epyc 7313P +- Cores/Threads: 16c / 32t +- RAM: 128 GB +- Drive 0: NVME0N1: 15.36 TB +- Drive 1: NVME1N1: 15.36 TB +- Drive 2: NVME2N1: 15.36 TB + +Drive 1 and 2 were mounted as an NVME in RAID0 (directions below). + +You can get away with NVMEs if you're dumping to an external database. Also, you should tune the number of workers based on your system memory. + +## Steps + +Kernel modifications for validator. (Some might be unnecessary.) + +```bash +$ sudo bash -c "cat >/etc/sysctl.d/21-solana-validator.conf </etc/security/limits.d/90-solana-nofiles.conf <>>, + progress_table: ProgressTable, + accounts_table: AccountsTable, + slack_client: SlackClient, + accounts: HashSet, + service_addr: String, + thread_id: usize, +) -> Result<(), BackfillError> { + let mut replay_client = ReplayServiceClient::connect(service_addr).await?; + + loop { + let slot = slot_receiver.lock().await.recv().await; + if slot.is_none() { + slack_client + .post_slack_message(&format!("backfill finished thread_id: {}", thread_id)) + .await; + return Ok(()); + } + let slot = slot.unwrap(); + + match start_slot_replay( + &mut replay_client, + slot, + &slack_client, + &accounts_table, + &accounts, + thread_id, + ) + .await + { + Ok(_) => { + if let Err(e) = progress_table.insert_completed_slot(slot).await { + slack_client + .post_slack_message(&format!( + "backfill error marking completed thread_id: {} slot: {} error: {:?}", + thread_id, slot, e + )) + .await; + } + } + Err(e) => { + slack_client + .post_slack_message(&format!( + "backfill error thread_id: {} slot: {} error: {:?}", + thread_id, slot, e + )) + .await; + } + } + } +} + +#[instrument(skip(replay_client, slack_client, accounts_table, programs))] +async fn start_slot_replay( + replay_client: &mut ReplayServiceClient, + snapshot_slot: u64, + slack_client: &SlackClient, + accounts_table: &AccountsTable, + programs: &HashSet, + thread_id: usize, +) -> Result<(), BackfillError> { + const BATCH_SIZE: usize = 1_000_000; + + let replay_response = try_start_replay(replay_client, snapshot_slot).await; + + // give the geyser service time to startup + sleep(Duration::from_secs(1)).await; + + let mut geyser_client = + GeyserServiceClient::connect(format!("http://{}", replay_response.addr)).await?; + let mut stream = geyser_client.subscribe_accounts(()).await?.into_inner(); + + slack_client + .post_slack_message(&format!( + "backfill starting thread_id: {} slot: {}", + thread_id, snapshot_slot + )) + .await; + + let start = Instant::now(); + let mut metrics = BackfillMetrics::new(thread_id, snapshot_slot, slack_client.clone()); + let mut buffered_batch = Vec::with_capacity(BATCH_SIZE); + + loop { + match stream.message().await { + Ok(Some(message)) => { + metrics.increment_num_messages_received(1); + + match message.msg { + None => {} + Some(Msg::Snap(SnapshotAccount { + slot, + pubkey, + lamports, + owner, + is_executable, + rent_epoch, + data, + seq, + is_startup: _, + tx_signature: _, + })) => { + let owner_pubkey = Pubkey::try_from(owner.as_slice()).unwrap(); + let is_poi = programs.contains(&owner_pubkey); + if is_poi { + metrics.increment_num_messages_buffered(1); + + // note: we save the snapshot_slot here as a separate field because during snapshot loading + // it will send the slot the account was last modified, not the slot of the snapshot you're loading from. + buffered_batch.push(AccountModel { + slot: slot as i64, + snapshot_slot: snapshot_slot as i64, + pubkey: Pubkey::try_from(pubkey.as_slice()).unwrap().to_string(), + lamports: lamports as i64, + owner: Pubkey::try_from(owner.as_slice()).unwrap().to_string(), + is_executable, + rent_epoch: rent_epoch as i64, + data, + seq: seq as i64, + }); + + if buffered_batch.len() == buffered_batch.capacity() { + let retry_strategy = + ExponentialBackoff::from_millis(1_000).map(jitter).take(5); + Retry::spawn(retry_strategy, || { + accounts_table.insert_accounts(&buffered_batch) + }) + .await?; + buffered_batch.clear(); + metrics.maybe_report().await; + } + } + } + Some(Msg::Replay(ReplayAccount {})) => { + // the worker only supports snapshot loading, so it sends an empty replay account to signal when its done + break; + } + } + } + Ok(None) => { + return Err(BackfillError::BackfillStopped(format!( + "backfill stream closed unexpectedly thread_id: {} slot: {}", + thread_id, snapshot_slot + ))); + } + Err(e) => { + return Err(BackfillError::BackfillStopped(format!( + "backfill stream closed unexpectedly thread_id: {} slot: {} error: {:?}", + thread_id, snapshot_slot, e + ))); + } + } + } + + accounts_table.insert_accounts(&buffered_batch).await?; + buffered_batch.clear(); + metrics.maybe_report().await; + + slack_client + .post_slack_message(&format!( + "backfill completed thread_id: {} slot: {} elapsed: {:?}", + thread_id, + snapshot_slot, + start.elapsed() + )) + .await; + + Ok(()) +} + +/// There are a max number of workspaces (jobs) that the worker can run. +/// This will continually retry to start a job until it suceeeds. +#[instrument(skip(replay_client))] +async fn try_start_replay( + replay_client: &mut ReplayServiceClient, + slot: u64, +) -> ReplayResponse { + let mut backoff_secs = 1; + loop { + match replay_client.start_replay(ReplayRequest { slot }).await { + Ok(response) => return response.into_inner(), + Err(e) => { + if e.code() != Code::ResourceExhausted { + warn!("error waiting to start replay: {:?}", e); + } + sleep(Duration::from_secs(backoff_secs)).await; + backoff_secs = backoff_secs.mul(2).clamp(0, 120); + } + } + } +} + +#[instrument(skip_all)] +pub async fn find_slots_to_backfill( + replay_client: &mut ReplayServiceClient, + backfill_config: &BackfillConfig, + progress_table: &ProgressTable, +) -> Vec { + let already_completed_slots: Vec<_> = progress_table.get_completed_slots().await.unwrap(); + let snapshot_slots_available: Vec<_> = get_snapshots(replay_client) + .await + .unwrap() + .into_iter() + .map(|snap| snap.slot) + .collect(); + backfill_config + .slots + .iter() + .filter(|slot| snapshot_slots_available.contains(slot)) + .filter(|slot| !already_completed_slots.contains(slot)) + .copied() + .collect() +} diff --git a/backfill/src/config.rs b/backfill/src/config.rs new file mode 100644 index 0000000..5ea6c1a --- /dev/null +++ b/backfill/src/config.rs @@ -0,0 +1,42 @@ +use serde::{Deserialize, Deserializer}; +use solana_sdk::pubkey::Pubkey; +use std::{path::PathBuf, str::FromStr, string::FromUtf8Error}; +use thiserror::Error; +use tokio::{fs, io}; + +#[derive(Error, Debug)] +pub enum ConfigError { + #[error("Io: {0}")] + Io(#[from] io::Error), + + #[error("SerdeYaml: {0}")] + SerdeYaml(#[from] serde_yaml::Error), + + #[error("Utf8: {0}")] + Utf8(#[from] FromUtf8Error), +} + +#[derive(Debug, Deserialize)] +pub struct BackfillConfig { + pub max_workers: usize, + #[serde(deserialize_with = "BackfillConfig::deserialize_pubkey")] + pub programs: Vec, + pub slots: Vec, +} + +impl BackfillConfig { + fn deserialize_pubkey<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let keys: Vec = Vec::deserialize(deserializer)?; + keys.into_iter() + .map(|pubkey| Pubkey::from_str(&pubkey).map_err(serde::de::Error::custom)) + .collect() + } + + pub async fn read_backfill_config(path: &PathBuf) -> Result { + let contents = String::from_utf8(fs::read(path).await?)?; + Ok(serde_yaml::from_str(&contents)?) + } +} diff --git a/backfill/src/main.rs b/backfill/src/main.rs new file mode 100644 index 0000000..640f9b8 --- /dev/null +++ b/backfill/src/main.rs @@ -0,0 +1,99 @@ +mod backfill; +mod config; +mod metrics; + +use crate::{ + backfill::{find_slots_to_backfill, stream_geyser_to_postgres}, + config::BackfillConfig, +}; +use clap::Parser; +use futures_util::future::join_all; +use jito_net::slack::SlackClient; +use jito_protos::geyser::replay_service_client::ReplayServiceClient; +use jito_replayer_db::{account::AccountsTable, progress::ProgressTable}; +use solana_sdk::pubkey::Pubkey; +use std::{collections::HashSet, path::PathBuf, sync::Arc, time::Duration}; +use tokio::sync::{mpsc::unbounded_channel, Mutex}; +use tracing::{info, instrument}; + +#[derive(Parser, Debug)] +struct Args { + /// Geyser address to connect to + #[arg(long, env, default_value_t = String::from("http://0.0.0.0:7892"))] + service_addr: String, + + /// Path to backfill configuration + #[arg(long, env)] + config_file_path: PathBuf, + + /// Clickhouse URL + #[arg(long, env)] + clickhouse_url: String, + + /// Slack webhook URL to post updates to channel on + #[arg(long, env)] + slack_url: Option, +} + +#[tokio::main] +#[instrument] +async fn main() { + tracing_subscriber::fmt::init(); + + let args: Args = Args::parse(); + info!("starting with args: {:?}", args); + + let backfill_config = BackfillConfig::read_backfill_config(&args.config_file_path) + .await + .expect("read config"); + + let pool = clickhouse_rs::Pool::new(args.clickhouse_url); + let slack_client = SlackClient::new(args.slack_url, Duration::from_secs(1)); + + let accounts: HashSet = backfill_config.programs.iter().copied().collect(); + + let mut replay_client = ReplayServiceClient::connect(args.service_addr.clone()) + .await + .unwrap(); + + let progress_table = ProgressTable::new(pool.clone()); + let accounts_table = AccountsTable::new(pool.clone()); + + progress_table.migrate().await.unwrap(); + accounts_table.migrate().await.unwrap(); + + let mut backfill_slots = + find_slots_to_backfill(&mut replay_client, &backfill_config, &progress_table).await; + backfill_slots.sort_by_key(|slot| *slot); + + let (slot_sender, slot_receiver) = unbounded_channel(); + let slot_receiver = Arc::new(Mutex::new(slot_receiver)); + + // start with most recent and work backwards + for s in backfill_slots.into_iter().rev() { + slot_sender.send(s).unwrap(); + } + drop(slot_sender); + + let futs = (0..backfill_config.max_workers).map(|i| { + let slot_receiver = slot_receiver.clone(); + let progress_table = progress_table.clone(); + let accounts_table = accounts_table.clone(); + + let slack_client = slack_client.clone(); + let service_addr = args.service_addr.clone(); + let accounts = accounts.clone(); + + tokio::spawn(stream_geyser_to_postgres( + slot_receiver, + progress_table, + accounts_table, + slack_client, + accounts, + service_addr, + i, + )) + }); + let results = join_all(futs).await; + info!("backfill results: {:?}", results); +} diff --git a/backfill/src/metrics.rs b/backfill/src/metrics.rs new file mode 100644 index 0000000..e56adb3 --- /dev/null +++ b/backfill/src/metrics.rs @@ -0,0 +1,59 @@ +use jito_net::slack::SlackClient; +use std::time::Instant; +use tracing::instrument; + +pub struct BackfillMetrics { + thread_id: usize, + slot: u64, + slack_client: SlackClient, + + created: Instant, + last_update: Instant, + num_messages_received: u64, + num_messages_buffered: u64, +} + +impl BackfillMetrics { + const REPORT_PERIOD_S: u64 = 10 * 60; + + pub fn new(thread_id: usize, slot: u64, slack_client: SlackClient) -> BackfillMetrics { + BackfillMetrics { + thread_id, + slot, + slack_client, + created: Instant::now(), + last_update: Instant::now(), + num_messages_received: 0, + num_messages_buffered: 0, + } + } + + pub fn increment_num_messages_received(&mut self, count: u64) { + self.num_messages_received += count; + } + + pub fn increment_num_messages_buffered(&mut self, count: u64) { + self.num_messages_buffered += count; + } + + #[instrument(skip_all)] + pub async fn report(&self) { + let message = format!( + "backfill metrics thread_id: {} slot: {}, elapsed: {:?}s num_messages_received: {} num_messages_buffered: {}", + self.thread_id, + self.slot, + self.created.elapsed().as_secs(), + self.num_messages_received, + self.num_messages_buffered + ); + self.slack_client.post_slack_message(&message).await; + } + + #[instrument(skip_all)] + pub async fn maybe_report(&mut self) { + if self.last_update.elapsed().as_secs() > Self::REPORT_PERIOD_S { + self.report().await; + self.last_update = Instant::now(); + } + } +} diff --git a/db/Cargo.toml b/db/Cargo.toml new file mode 100644 index 0000000..26b8fb4 --- /dev/null +++ b/db/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "jito-replayer-db" +readme = "../README.md" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +publish = { workspace = true } + +[dependencies] +clickhouse-rs = { workspace = true } +futures-util = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/db/src/account.rs b/db/src/account.rs new file mode 100644 index 0000000..b914d5f --- /dev/null +++ b/db/src/account.rs @@ -0,0 +1,115 @@ +use clickhouse_rs::{errors::Result, row, Block, Pool}; +use futures_util::StreamExt; +use tracing::instrument; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct AccountModel { + pub slot: i64, + pub snapshot_slot: i64, + pub pubkey: String, + pub lamports: i64, + pub owner: String, + pub is_executable: bool, + pub rent_epoch: i64, + pub data: Vec, + pub seq: i64, +} + +#[derive(Clone)] +pub struct AccountsTable { + pool: Pool, +} + +impl AccountsTable { + pub fn new(pool: Pool) -> AccountsTable { + AccountsTable { pool } + } + + #[instrument(skip(self), err)] + pub async fn migrate(&self) -> Result<()> { + let mut client = self.pool.get_handle().await?; + // TODO (LB): https://stackoverflow.com/questions/53442559/how-to-avoid-duplicates-in-clickhouse-table + // This table keeps duplicates, which is fine for now, but we should fix this eventually + client + .execute( + "CREATE TABLE IF NOT EXISTS accounts + ( + slot Int64, -- slot the account was last modified + snapshot_slot Int64, -- snapshot slot the account was loaded from + pubkey String, + lamports Int64, + owner String, + is_executable UInt8, + rent_epoch Int64, + data String, + seq Int64 + ) ENGINE = MergeTree() + ORDER BY (snapshot_slot, pubkey) + PRIMARY KEY (snapshot_slot, pubkey); + ", + ) + .await?; + client.execute("ALTER TABLE accounts ADD INDEX IF NOT EXISTS account_pubkey_index pubkey TYPE set(0);").await?; + client + .execute( + "ALTER TABLE accounts ADD INDEX IF NOT EXISTS account_slot_index slot TYPE set(0);", + ) + .await?; + client.execute("ALTER TABLE accounts ADD INDEX IF NOT EXISTS account_owner_index owner TYPE set(0);").await?; + Ok(()) + } + + /// Clickhouse reccomends bulk inserting data for performance reasons + /// https://clickhouse.com/docs/en/optimize/bulk-inserts + #[instrument(skip_all, err)] + pub async fn insert_accounts(&self, accounts: &[AccountModel]) -> Result<()> { + let mut client = self.pool.get_handle().await?; + + let mut block = Block::new(); + for account in accounts { + block.push(row! {slot: account.slot, snapshot_slot: account.snapshot_slot, pubkey: account.pubkey.to_string(), lamports: account.lamports, owner: account.owner.to_string(), is_executable: account.is_executable as u8, rent_epoch: account.rent_epoch, data: account.data.clone(), seq: account.seq})?; + } + + client.insert("accounts", block).await?; + Ok(()) + } + + /// Note: don't call this with token program, you will probably OOM + #[instrument(skip(self), err)] + pub async fn read_accounts(&self, owner: &String) -> Result> { + let mut client = self.pool.get_handle().await?; + + let mut stream = client + .query(format!("SELECT * FROM accounts where owner = '{}'", owner)) + .stream(); + + let mut accounts = vec![]; + while let Some(row) = stream.next().await { + let row = row?; + accounts.push(AccountModel { + slot: row.get("slot")?, + snapshot_slot: row.get("snapshot_slot")?, + pubkey: row.get("pubkey")?, + lamports: row.get("lamports")?, + owner: row.get("owner")?, + is_executable: row.get::("is_executable")? != 0, + rent_epoch: row.get("rent_epoch")?, + data: row.get("data")?, + seq: row.get("seq")?, + }); + } + Ok(accounts) + } + + #[instrument(skip(self), err)] + pub async fn delete_slot(&self, slot: i64) -> Result<()> { + let mut client = self.pool.get_handle().await?; + + client + .execute(format!( + "DELETE FROM accounts where snapshot_slot = {}", + slot + )) + .await + } +} diff --git a/db/src/lib.rs b/db/src/lib.rs new file mode 100644 index 0000000..cdb211e --- /dev/null +++ b/db/src/lib.rs @@ -0,0 +1,3 @@ +pub mod account; +pub mod progress; +pub mod result; diff --git a/db/src/progress.rs b/db/src/progress.rs new file mode 100644 index 0000000..cbaca3d --- /dev/null +++ b/db/src/progress.rs @@ -0,0 +1,56 @@ +use clickhouse_rs::{errors::Result, row, Block, Pool}; +use futures_util::StreamExt; +use tracing::instrument; + +/// The progress table keeps track of completed snapshots +#[derive(Clone)] +pub struct ProgressTable { + pool: Pool, +} + +impl ProgressTable { + pub fn new(pool: Pool) -> Self { + Self { pool } + } + + #[instrument(skip(self))] + pub async fn migrate(&self) -> Result<()> { + let mut client = self.pool.get_handle().await?; + client + .execute( + "CREATE TABLE IF NOT EXISTS progress + ( + slot Int64 + ) ENGINE = MergeTree() + ORDER BY slot + PRIMARY KEY slot; + ", + ) + .await?; + Ok(()) + } + + #[instrument(skip(self), err)] + pub async fn insert_completed_slot(&self, slot: u64) -> Result<()> { + let mut client = self.pool.get_handle().await?; + + let mut block = Block::new(); + block.push(row! {slot: slot as i64})?; + client.insert("progress", block).await?; + Ok(()) + } + + #[instrument(skip_all, ret, err)] + pub async fn get_completed_slots(&self) -> Result> { + let mut client = self.pool.get_handle().await?; + let mut stream = client.query("SELECT * FROM progress").stream(); + + let mut slots = vec![]; + while let Some(row) = stream.next().await { + let row = row?; + let slot: i64 = row.get("slot")?; + slots.push(slot as u64); + } + Ok(slots) + } +} diff --git a/db/src/result.rs b/db/src/result.rs new file mode 100644 index 0000000..814ffbf --- /dev/null +++ b/db/src/result.rs @@ -0,0 +1,10 @@ +use std::result; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum DatabaseError { + #[error("ClickhouseError: {0}")] + ClickhouseError(#[from] clickhouse_rs::errors::Error), +} + +pub type Result = result::Result; diff --git a/gcs/Cargo.toml b/gcs/Cargo.toml new file mode 100644 index 0000000..15e2464 --- /dev/null +++ b/gcs/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "jito-gcs" +readme = "../README.md" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +publish = { workspace = true } + +[dependencies] +cloud-storage = { workspace = true } +futures-util = { workspace = true } +jito-net = { workspace = true } +regex = { workspace = true } +reqwest = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/gcs/src/bucket.rs b/gcs/src/bucket.rs new file mode 100644 index 0000000..d716fda --- /dev/null +++ b/gcs/src/bucket.rs @@ -0,0 +1,239 @@ +use cloud_storage::Object; +use futures_util::future::join_all; +use jito_net::http::download_file; +use regex::{Captures, Regex}; +use reqwest::Url; +use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, str::FromStr}; +use tokio::spawn; +use tracing::{debug, info, instrument}; + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ObjectResponse { + pub kind: String, + pub next_page_token: Option, + pub items: Option>, +} + +#[derive(Clone, Debug, Default)] +pub struct Snapshot { + pub name: String, + pub filename: String, + pub url: String, + pub size: u64, + pub slot: u64, + pub hash: String, +} + +#[derive(Clone, Debug, Default)] +pub struct Bounds { + pub name: String, + pub url: String, + pub size: u64, + pub start_slot: u64, + pub end_slot: u64, +} + +#[derive(Clone, Debug, Default)] +pub struct LedgerSnapshot { + pub name: String, + pub epoch: u64, + pub url: String, + pub size: u64, + pub bounds: Bounds, + pub version: String, +} + +#[instrument(err)] +pub async fn list_objects( + bucket_name: &str, + next_page_token: &str, + glob: Option<&str>, +) -> Result { + let base_url = format!( + "https://storage.googleapis.com/storage/v1/b/{}/o/", + bucket_name, + ); + + let mut url = Url::parse(&base_url).expect("Failed to parse base URL"); + + let mut query_pairs = Vec::new(); + + if !next_page_token.is_empty() { + query_pairs.push(("pageToken", next_page_token)); + } + + if let Some(glob) = glob { + query_pairs.push(("matchGlob", glob)); + } + + if !query_pairs.is_empty() { + url.query_pairs_mut().extend_pairs(query_pairs.into_iter()); + } + + debug!("requesting: {:?}", url); + + let response = reqwest::get(url.as_str()).await?; + response.json().await +} + +#[instrument] +pub async fn get_all_objects( + bucket_name: &str, + glob: Option<&str>, +) -> Result, reqwest::Error> { + let mut next_page_token = "".to_string(); + let mut all_objects = vec![]; + + loop { + let objects = list_objects(bucket_name, &next_page_token, glob).await?; + + let done = objects.next_page_token.is_none(); + next_page_token = objects.next_page_token.clone().unwrap_or_default(); + + let num_items = objects.items.as_ref().unwrap_or(&vec![]).len(); + info!("read items: {} done: {}", num_items, done); + all_objects.push(objects); + + if done { + break; + } + } + Ok(all_objects) +} + +#[instrument] +pub fn search_objects_by_filename<'a>( + objects: &'a [Object], + re: &'a Regex, +) -> Vec<(&'a Object, regex::Captures<'a>)> { + objects + .iter() + .filter_map(|object| re.captures(&object.name).map(|caps| (object, caps))) + .collect() +} + +pub fn get_snapshots(objects: &[Object]) -> Vec { + let snapshot_regex = Regex::new(r"snapshot-(\d+)-(\w+)\.tar\.(zst|bz2)").unwrap(); + search_objects_by_filename(objects, &snapshot_regex) + .into_iter() + .map(|(s, captures)| { + let slot = captures.get(1).unwrap().as_str().parse().unwrap(); + let hash = captures.get(2).unwrap().as_str().to_string(); + let filename = s.name.split('/').last().unwrap().to_string(); + // let file_type = captures.get(3).unwrap().as_str(); + + Snapshot { + name: s.name.clone(), + filename, + url: s.media_link.clone(), + size: s.size, + slot, + hash, + } + }) + .collect() +} + +async fn get_epoch_bounds(bounds_files: &[(&Object, Captures<'_>)]) -> Vec<(u64, Bounds)> { + let bounds_text_regex = Regex::new(r"Ledger has data for \d+ slots (\d+) to (\d+)").unwrap(); + + let bounds_tasks = bounds_files.iter().map(|(s, captures)| { + let bounds_text_regex = bounds_text_regex.clone(); + let epoch: u64 = captures.get(1).unwrap().as_str().parse().unwrap(); + + let url = s.media_link.clone(); + let name = s.name.to_string(); + let size = s.size; + + spawn(async move { + let downloaded_contents = download_file(Url::from_str(&url).unwrap()).await.ok()?; + let downloaded_string = String::from_utf8(downloaded_contents).ok()?; + + let bounds_txt_captures = bounds_text_regex.captures(&downloaded_string)?; + let start_slot: u64 = bounds_txt_captures.get(1)?.as_str().parse().ok()?; + let end_slot: u64 = bounds_txt_captures.get(2)?.as_str().parse().ok()?; + + Some(( + epoch, + Bounds { + name, + url, + size, + start_slot, + end_slot, + }, + )) + }) + }); + + join_all(bounds_tasks) + .await + .into_iter() + .filter_map(|r| r.ok()?) + .collect() +} + +async fn get_epochs_versions(versions_file: &[(&Object, Captures<'_>)]) -> Vec<(u64, String)> { + let bounds_tasks = versions_file.iter().map(|(s, captures)| { + let epoch: u64 = captures.get(1).unwrap().as_str().parse().unwrap(); + let url = s.media_link.clone(); + spawn(async move { + let downloaded_contents = download_file(Url::from_str(&url).unwrap()).await.ok()?; + let downloaded_string = String::from_utf8(downloaded_contents).ok()?; + Some((epoch, downloaded_string)) + }) + }); + + join_all(bounds_tasks) + .await + .into_iter() + .filter_map(|r| r.ok()?) + .collect() +} + +pub async fn get_ledger_snapshots(objects: &[Object]) -> Vec { + let rocksdb_file_regex = Regex::new(r"(\d+)/rocksdb\.tar\.bz2").unwrap(); + let bounds_file_regex = Regex::new(r"(\d+)/bounds\.txt").unwrap(); + let version_file_regex = Regex::new(r"(\d+)/version\.txt").unwrap(); + + // need rocksdb for everything + let mut snapshots: HashMap = + search_objects_by_filename(objects, &rocksdb_file_regex) + .into_iter() + .map(|(s, captures)| { + let epoch: u64 = captures.get(1).unwrap().as_str().parse().unwrap(); + ( + epoch, + LedgerSnapshot { + name: s.name.clone(), + epoch, + url: s.media_link.clone(), + size: s.size, + bounds: Bounds::default(), + version: String::default(), + }, + ) + }) + .collect(); + + // grab the bounds.txt files, download the contents, and attempt to parse them + let epochs_bounds = + get_epoch_bounds(&search_objects_by_filename(objects, &bounds_file_regex)).await; + for (epoch, bounds) in epochs_bounds { + if let Some(ledger) = snapshots.get_mut(&epoch) { + ledger.bounds = bounds; + } + } + + let epochs_version = + get_epochs_versions(&search_objects_by_filename(objects, &version_file_regex)).await; + for (epoch, version) in epochs_version { + if let Some(ledger) = snapshots.get_mut(&epoch) { + ledger.version = version; + } + } + + snapshots.drain().map(|(_, s)| s).collect() +} diff --git a/gcs/src/lib.rs b/gcs/src/lib.rs new file mode 100644 index 0000000..a080db2 --- /dev/null +++ b/gcs/src/lib.rs @@ -0,0 +1,2 @@ +pub mod bucket; +pub mod result; diff --git a/gcs/src/result.rs b/gcs/src/result.rs new file mode 100644 index 0000000..afc957d --- /dev/null +++ b/gcs/src/result.rs @@ -0,0 +1,7 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum GcsError { + #[error("message")] + GcloudError(#[from] reqwest::Error), +} diff --git a/net/Cargo.toml b/net/Cargo.toml new file mode 100644 index 0000000..2ed505d --- /dev/null +++ b/net/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "jito-net" +readme = "../README.md" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } +publish = { workspace = true } + +[dependencies] +futures-util = { workspace = true } +reqwest = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/net/src/http.rs b/net/src/http.rs new file mode 100644 index 0000000..ffb88f7 --- /dev/null +++ b/net/src/http.rs @@ -0,0 +1,69 @@ +use futures_util::StreamExt; +use reqwest::Url; +use std::sync::{ + atomic::{AtomicBool, Ordering}, + Arc, +}; +use thiserror::Error; +use tokio::{ + fs::{remove_file, File}, + io, + io::AsyncWriteExt, +}; +use tracing::{info, instrument, warn}; + +#[derive(Debug, Error)] +pub enum Error { + #[error("reqwest: {0}")] + ReqwestError(#[from] reqwest::Error), + #[error("IO: {0}")] + IOError(#[from] io::Error), + #[error("Exited")] + Exited, +} + +/// Download and save large files to disk +pub async fn download_and_save_file( + url: Url, + path: &str, + exit: Arc, +) -> Result<(), Error> { + info!("GET {}, saving to {}", url, path); + + let response = reqwest::get(url).await?; + + let content_length = response.content_length().unwrap(); + info!("content_length: {:?}", content_length); + + let mut out = File::create(&path).await?; + + let mut stream = response.bytes_stream(); + while let Some(Ok(item)) = stream.next().await { + if exit.load(Ordering::Relaxed) { + if let Err(e) = remove_file(path).await { + warn!("error removing file: {:?}", e); + } + return Err(Error::Exited); + } + out.write_all(&item).await?; + } + + info!("flushing file..."); + let _ = out.flush().await; + info!("Saved file to {}", path); + + Ok(()) +} + +/// Download smaller files +#[instrument] +pub async fn download_file(url: Url) -> Result, Error> { + let response = reqwest::get(url).await?; + let mut stream = response.bytes_stream(); + + let mut bytes = vec![]; + while let Some(Ok(item)) = stream.next().await { + bytes.extend(item); + } + Ok(bytes) +} diff --git a/net/src/lib.rs b/net/src/lib.rs new file mode 100644 index 0000000..7b27314 --- /dev/null +++ b/net/src/lib.rs @@ -0,0 +1,2 @@ +pub mod http; +pub mod slack; diff --git a/net/src/slack.rs b/net/src/slack.rs new file mode 100644 index 0000000..90d10b2 --- /dev/null +++ b/net/src/slack.rs @@ -0,0 +1,39 @@ +use reqwest::Client; +use serde_json::json; +use std::time::Duration; +use tracing::instrument; + +#[derive(Clone, Debug)] +pub struct SlackClient { + url: Option, + timeout: Duration, +} + +impl SlackClient { + pub fn new(url: Option, timeout: Duration) -> SlackClient { + SlackClient { url, timeout } + } + + #[instrument(skip(self))] + pub async fn post_slack_message(&self, message: &str) -> bool { + if let Some(url) = &self.url { + let client = Client::new(); + let payload = json!({ "text": message }); + + let response = client + .post(url) + .header("Content-Type", "application/json") + .json(&payload) + .timeout(self.timeout) + .send() + .await; + if response.is_err() { + false + } else { + response.unwrap().status().is_success() + } + } else { + true + } + } +} diff --git a/protos/Cargo.toml b/protos/Cargo.toml new file mode 100644 index 0000000..cc5c023 --- /dev/null +++ b/protos/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "jito-protos" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +bytes = { workspace = true } +prost = { workspace = true } +prost-types = { workspace = true } +tonic = { workspace = true } + +[build-dependencies] +tonic-build = { workspace = true } diff --git a/protos/build.rs b/protos/build.rs new file mode 100644 index 0000000..a80be6d --- /dev/null +++ b/protos/build.rs @@ -0,0 +1,8 @@ +use tonic_build::configure; + +fn main() { + configure() + .emit_rerun_if_changed(true) + .compile(&["protos/geyser.proto"], &["protos"]) + .unwrap(); +} diff --git a/protos/protos/geyser.proto b/protos/protos/geyser.proto new file mode 100644 index 0000000..e34be5a --- /dev/null +++ b/protos/protos/geyser.proto @@ -0,0 +1,75 @@ +syntax = "proto3"; + +package geyser; + +import "google/protobuf/empty.proto"; + +message SnapshotAccount { + uint64 slot = 1; + bytes pubkey = 2; + uint64 lamports = 3; + bytes owner = 4; + bool is_executable = 5; + uint64 rent_epoch = 6; + bytes data = 7; + uint64 seq = 8; + bool is_startup = 9; + optional bytes tx_signature = 10; +} + +message ReplayAccount {} + +message Account { + oneof msg { + SnapshotAccount snap = 1; + ReplayAccount replay = 2; + } +} + +message GetReplayStateRequest {} + +message ReplayContext { + uint64 workspace_id = 1; + string addr = 2; + uint64 slot = 3; +} + +message GetReplayStateResponse { + repeated ReplayContext states = 1; +} + +message ReplayRequest { + uint64 slot = 1; +} + +message ReplayResponse { + // address of the GeyserService one can connect to + string addr = 1; + uint64 workspace_id = 2; +} + +message Snapshot { + string name = 1; + string filename = 2; + string url = 3; + uint64 size = 4; + uint64 slot = 5; + string hash = 6; +} + +service GeyserService { + // Subscribe to geyser account updates from loading the snapshot + rpc SubscribeAccounts (google.protobuf.Empty) returns (stream Account) {} +} + +// Service to request replay on +service ReplayService { + /// Request to stream a snapshot, returns the address where you can connect to geyser + rpc StartReplay (ReplayRequest) returns (ReplayResponse) {} + + /// Returns the snapshots that can be loaded from + rpc GetSnapshots(google.protobuf.Empty) returns (stream Snapshot) {} + + /// Returns state on the workspaces running + rpc GetReplayState(GetReplayStateRequest) returns (GetReplayStateResponse) {} +} diff --git a/protos/src/lib.rs b/protos/src/lib.rs new file mode 100644 index 0000000..4a43097 --- /dev/null +++ b/protos/src/lib.rs @@ -0,0 +1,3 @@ +pub mod geyser { + tonic::include_proto!("geyser"); +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..83c58cf --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.69.0" # must match solana v1.16 rust-toolchain.toml +component = ["cargo-sort", "clippy"] diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..483bb24 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,7 @@ +edition = "2021" # required by rust-analyzer +format_code_in_doc_comments = true +error_on_unformatted = false +reorder_imports = true +group_imports = "One" +imports_granularity = "Crate" +imports_indent = "Block" diff --git a/s b/s new file mode 100755 index 0000000..308133d --- /dev/null +++ b/s @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" + +if [ -f .env ]; then + export $(cat .env | grep -v '#' | awk '/=/ {print $1}') +else + echo "Missing .env file" + exit 0 +fi + +echo "Syncing to host: $HOST" + +# sync to build server, ignoring local builds and local/remote dev ledger +rsync -avh --delete --exclude target --exclude docker-output "$SCRIPT_DIR" "$HOST":~/ diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 7ed5eb0..0000000 --- a/src/main.rs +++ /dev/null @@ -1,189 +0,0 @@ -use cloud_storage::Object; -use regex::Regex; -use serde::{Deserialize, Serialize}; -use std::collections::{HashMap, HashSet}; -use std::path::PathBuf; -use std::str::FromStr; -use thiserror::Error; -use tracing::{debug, info, instrument, warn}; - -#[derive(Debug, Error)] -enum ErrorFoo { - #[error("message")] - GcloudError(#[from] reqwest::Error), -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -struct ObjectResponse { - kind: String, - next_page_token: Option, - items: Vec, -} - -#[derive(Debug, Default)] -pub struct Snapshot { - name: String, - url: String, - size: u64, - slot: u64, - hash: String, -} - -#[derive(Debug, Default)] -pub struct Bounds { - name: String, - url: String, - size: u64, - start_slot: u64, - stop_slot: u64, -} - -#[derive(Debug, Default)] -pub struct LedgerSnapshot { - name: String, - epoch: u64, - url: String, - size: u64, - bounds: Bounds, -} - -#[instrument] -async fn list_objects( - bucket_name: &str, - next_page_token: &str, -) -> Result { - let mut url = format!( - "https://storage.googleapis.com/storage/v1/b/{}/o", - bucket_name, - ); - if !next_page_token.is_empty() { - url.extend(format!("/?pageToken={}", next_page_token).chars()); - } - info!("url={:?}", url); - let response = reqwest::get(url).await?; - response.json().await -} - -#[instrument] -async fn get_all_objects(bucket_name: &str) -> Result, reqwest::Error> { - let mut next_page_token = "".to_string(); - let mut all_objects = vec![]; - - loop { - let objects = list_objects(bucket_name, &next_page_token).await?; - - let done = true; //objects.next_page_token.is_none(); - next_page_token = objects.next_page_token.clone().unwrap_or_default(); - info!( - "done: {}, items: {} next_page_token: {}", - done, - objects.items.len(), - next_page_token - ); - all_objects.push(objects); - - if done { - break; - } - } - Ok(all_objects) -} - -fn search_objects_by_filename<'a>( - objects: &'a [Object], - re: &'a Regex, -) -> Vec<(&'a Object, regex::Captures<'a>)> { - objects - .iter() - .filter_map(|object| { - let filename = &object.name; - - match re.captures(filename) { - Some(caps) => Some((object, caps)), - None => None, - } - }) - .collect() -} - -fn get_snapshots(objects: &[Object]) -> Vec { - let snapshot_regex = Regex::new(r"snapshot-(\d+)-(\w+)\.tar\.(zst|bz2)").unwrap(); - search_objects_by_filename(&objects, &snapshot_regex) - .into_iter() - .map(|(s, captures)| { - let slot = captures.get(1).unwrap().as_str().parse().unwrap(); - let hash = captures.get(2).unwrap().as_str().to_string(); - let file_type = captures.get(3).unwrap().as_str(); - - Snapshot { - name: s.name.clone(), - url: s.media_link.clone(), - size: s.size, - slot, - hash, - } - }) - .collect() -} - -fn get_ledger_snapshots(objects: &[Object]) -> Vec { - let rocksdb_regex = Regex::new(r"(\d+)/rocksdb\.tar\.bz2").unwrap(); - let bounds_regex = Regex::new(r"(\d+)/bounds\.txt").unwrap(); - - // need rocksdb for everything - let mut snapshots: HashMap = - search_objects_by_filename(&objects, &rocksdb_regex) - .into_iter() - .map(|(s, captures)| { - let epoch: u64 = captures.get(1).unwrap().as_str().parse().unwrap(); - ( - epoch, - LedgerSnapshot { - name: s.name.clone(), - epoch, - url: s.media_link.clone(), - size: s.size, - bounds: Bounds::default(), - }, - ) - }) - .collect(); - - search_objects_by_filename(&objects, &bounds_regex) - .into_iter() - .for_each(|(s, captures)| { - let epoch: u64 = captures.get(1).unwrap().as_str().parse().unwrap(); - if let Some(snapshot) = snapshots.get_mut(&epoch) { - snapshot.bounds = Bounds { - name: s.name.to_string(), - url: s.media_link.to_string(), - size: s.size, - start_slot: 0, - stop_slot: 0, - }; - } - }); - - snapshots.drain().map(|(_, s)| s).collect() -} - -#[tokio::main] -async fn main() -> Result<(), ErrorFoo> { - tracing_subscriber::fmt::init(); - - let objects: Vec<_> = get_all_objects("mainnet-beta-ledger-us-ny5") - .await? - .into_iter() - .flat_map(|o| o.items) - .collect(); - - let snapshots = get_snapshots(&objects); - let ledger_snapshots = get_ledger_snapshots(&objects); - - for l in ledger_snapshots { - println!("{:?}", l); - } - - Ok(()) -} diff --git a/tomlfmt.toml b/tomlfmt.toml new file mode 100644 index 0000000..f35a254 --- /dev/null +++ b/tomlfmt.toml @@ -0,0 +1,10 @@ +always_trailing_comma = false +multiline_trailing_comma = true +space_around_eq = true +compact_arrays = false +compact_inline_tables = false +trailing_newline = true +key_value_newlines = true +allowed_blank_lines = 1 +crlf = false +table_order = [] diff --git a/workers/Cargo.toml b/workers/Cargo.toml new file mode 100644 index 0000000..a039bf4 --- /dev/null +++ b/workers/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "jito-workers" +readme = "../README.md" +version = "0.0.1" +edition = "2021" +publish = false + +[dependencies] +chrono = { workspace = true } +clap = { workspace = true } +cloud-storage = { workspace = true } +crossbeam-channel = { workspace = true } +futures-util = { workspace = true } +jito-gcs = { workspace = true } +jito-net = { workspace = true } +jito-protos = { workspace = true } +reqwest = { workspace = true, features = ["stream"] } +serde = { workspace = true } +solana-ledger = { workspace = true } +solana-runtime = { workspace = true } +solana-sdk = { workspace = true } +solana-storage-bigtable = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true, features = ["rt-multi-thread", "rt", "time"] } +tokio-stream = { workspace = true } +tonic = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } + +[[bin]] +name = "jito-worker-cli" +path = "src/bin/cli.rs" diff --git a/workers/src/bin/cli.rs b/workers/src/bin/cli.rs new file mode 100644 index 0000000..130a159 --- /dev/null +++ b/workers/src/bin/cli.rs @@ -0,0 +1,266 @@ +use chrono::{Days, NaiveDateTime, NaiveTime}; +use clap::{Parser, Subcommand}; +use futures_util::future::join_all; +use jito_protos::geyser::{ + geyser_service_client::GeyserServiceClient, replay_service_client::ReplayServiceClient, + Account, GetReplayStateRequest, ReplayRequest, +}; +use jito_workers::helpers::get_snapshots; +use solana_storage_bigtable::LedgerStorage; +use std::time::Duration; +use tonic::{transport::Channel, Streaming}; +use tracing::{error, info, instrument}; + +#[derive(Clone, Debug, Subcommand)] +enum Mode { + /// Start loading and streaming a snapshot + StartSnapshotStream { slot: u64 }, + + /// Gets all snapshots + GetSnapshots, + + /// Returns the state of the replayer module + GetState, + + /// Prints out information surrounding the snapshot times using an RPC server + GetSnapshotTimes { + /// minimum slot to return context on + min_slot: Option, + }, + /// Finds snapshots given a duration between snapshot + FindDailySnapshots { + /// minimum slot to return context on + min_slot: Option, + /// UTC time in military time (5pm -> 17) + military_time_hour: u32, + }, +} + +#[derive(Parser, Debug)] +struct Args { + /// Geyser address to connect to + #[arg(long, env, default_value_t = String::from("http://0.0.0.0:7892"))] + service_addr: String, + + /// Mode to use + #[command(subcommand)] + subcommand: Mode, +} + +#[tokio::main] +#[instrument] +async fn main() { + tracing_subscriber::fmt::init(); + + let args: Args = Args::parse(); + info!("starting with args: {:?}", args); + + let mut replay_client = ReplayServiceClient::connect(args.service_addr) + .await + .expect("connects to replay client"); + + match args.subcommand { + Mode::StartSnapshotStream { slot } => { + command_start_or_subscribe(&mut replay_client, slot).await; + } + Mode::GetSnapshots => { + command_get_snapshots(&mut replay_client).await; + } + Mode::GetState => { + command_get_state(&mut replay_client).await; + } + Mode::GetSnapshotTimes { min_slot } => { + command_get_snapshot_times(&mut replay_client, min_slot).await; + } + Mode::FindDailySnapshots { + min_slot, + military_time_hour, + } => { + command_find_daily_snapshots(&mut replay_client, min_slot, military_time_hour).await; + } + } +} + +/// Expects GOOGLE_APPLICATION_CREDENTIALS env var to be set so it can read from bigtable +#[instrument] +async fn command_find_daily_snapshots( + replay_client: &mut ReplayServiceClient, + min_slot: Option, + military_time_hour: u32, +) { + let snapshots = get_snapshots(replay_client).await.unwrap(); + + let min_slot = min_slot.unwrap_or_default(); + let slots: Vec<_> = snapshots + .iter() + .map(|snap| snap.slot) + .filter(|slot| *slot >= min_slot) + .collect(); + info!( + "fetching information on {} snapshots, this might take awhile...", + slots.len() + ); + + let mut slots_times = find_block_times(&slots).await; + slots_times.sort_by_key(|(_, block_time)| *block_time); + + let first_date_time = NaiveDateTime::new( + slots_times.first().unwrap().1.date(), + NaiveTime::from_hms_opt(military_time_hour, 0, 0).unwrap(), + ); + let last_date_time = NaiveDateTime::new( + slots_times.last().unwrap().1.date(), + NaiveTime::from_hms_opt(military_time_hour, 0, 0).unwrap(), + ); + let date_range: Vec<_> = (0..) + .map(|days| first_date_time.checked_add_days(Days::new(days)).unwrap()) + .take_while(|&date| date <= last_date_time) + .collect(); + + for date in &date_range { + let mut closest_block_time = None; + let mut closest_duration = None; + let mut closest_slot = None; + + for (slot, block_time) in &slots_times { + let duration = date.signed_duration_since(*block_time).num_seconds().abs(); + + // If the current block_time is closer than the previous closest one (or if there isn't a closest one yet) + if closest_duration.is_none() || duration < closest_duration.unwrap() { + closest_block_time = Some(block_time); + closest_duration = Some(duration); + closest_slot = Some(slot); + } + } + + let closest_block_time = closest_block_time.unwrap(); + let closest_duration = closest_duration.unwrap(); + + // At this point, for the given date, closest_block_time is the block_time closest to that date. + // You can now work with these values as needed. + println!( + "slot: {:?} date: {}, closest block time: {:?}, time diff: {:.2} minutes", + closest_slot, + date, + closest_block_time, + closest_duration as f32 / 60.0 + ); + } +} + +#[instrument(skip_all)] +async fn command_get_snapshots(replay_client: &mut ReplayServiceClient) { + let snapshots = get_snapshots(replay_client).await.unwrap(); + for snapshot in snapshots { + info!("slot: {}, file: {}", snapshot.slot, snapshot.filename); + } +} + +#[instrument(skip_all)] +async fn command_get_state(replay_client: &mut ReplayServiceClient) { + let states = replay_client + .get_replay_state(GetReplayStateRequest {}) + .await + .unwrap() + .into_inner(); + for context in states.states { + info!("replay_context: {:?}", context); + } +} + +#[instrument(skip_all)] +async fn print_geyser_stream(mut stream: Streaming) { + info!("streaming accounts..."); + let mut count = 0; + loop { + match stream.message().await { + Ok(Some(_account)) => { + info!("num accounts: {:?}", count); + count += 1; + } + Ok(None) => { + info!("received none, exiting"); + return; + } + Err(e) => { + error!("error receiving message: {:?}", e); + } + } + } +} + +#[instrument(skip(replay_client))] +async fn command_start_or_subscribe(replay_client: &mut ReplayServiceClient, slot: u64) { + match replay_client.start_replay(ReplayRequest { slot }).await { + Ok(response) => { + let addr = format!("http://{}", response.into_inner().addr); + info!("subscribing to geyser client at {:?}", addr); + let mut geyser_client = GeyserServiceClient::connect(addr).await.unwrap(); + let subscribe_response = geyser_client + .subscribe_accounts(()) + .await + .unwrap() + .into_inner(); + + print_geyser_stream(subscribe_response).await; + } + Err(status) => { + error!("error starting replay: {:?}", status); + } + } +} + +/// Expects GOOGLE_APPLICATION_CREDENTIALS env var to be set so it can read from bigtable +#[instrument(skip(replay_client))] +async fn command_get_snapshot_times( + replay_client: &mut ReplayServiceClient, + min_slot: Option, +) { + let snapshots = get_snapshots(replay_client).await.unwrap(); + + let min_slot = min_slot.unwrap_or_default(); + let slots: Vec<_> = snapshots + .iter() + .map(|snap| snap.slot) + .filter(|slot| *slot >= min_slot) + .collect(); + info!( + "fetching information on {} snapshots, this might take awhile...", + slots.len() + ); + let slots_times = find_block_times(&slots).await; + for (slot, block_time) in slots_times { + info!("slot: {:?}, time: {:?}", slot, block_time); + } +} + +#[instrument] +async fn find_block_times(slots: &[u64]) -> Vec<(u64, NaiveDateTime)> { + let futs = slots.chunks(100).map(|chunk| { + let chunk = chunk.to_vec(); + tokio::spawn(async move { + let ledger_tool = LedgerStorage::new(true, Some(Duration::from_secs(120)), None) + .await + .expect("connects to bigtable"); + let slots_blocks = ledger_tool + .get_confirmed_blocks_with_data(&chunk) + .await + .unwrap(); + slots_blocks + .into_iter() + .map(|(s, b)| { + let datetime = + NaiveDateTime::from_timestamp_opt(b.block_time.unwrap_or_default(), 0) + .unwrap(); + (s, datetime) + }) + .collect::>() + }) + }); + join_all(futs) + .await + .into_iter() + .filter_map(|r| r.ok()) + .flatten() + .collect() +} diff --git a/workers/src/geyser.rs b/workers/src/geyser.rs new file mode 100644 index 0000000..88d5625 --- /dev/null +++ b/workers/src/geyser.rs @@ -0,0 +1,204 @@ +use jito_protos::geyser::{ + account::Msg, geyser_service_server::GeyserService, Account, ReplayAccount, SnapshotAccount, +}; +use solana_ledger::{ + bank_forks_utils, + blockstore::Blockstore, + blockstore_options::{AccessType, BlockstoreOptions, LedgerColumnOptions, ShredStorageType}, + blockstore_processor::ProcessOptions, +}; +use solana_runtime::{ + account_storage::meta::StoredAccountMeta, + accounts_update_notifier_interface::AccountsUpdateNotifierInterface, + hardened_unpack::unpack_genesis_archive, + snapshot_config::SnapshotConfig, + snapshot_utils::{ArchiveFormat, SnapshotVersion}, +}; +use solana_sdk::{ + account::{AccountSharedData, ReadableAccount}, + clock::Slot, + genesis_config::{GenesisConfig, DEFAULT_GENESIS_ARCHIVE}, + pubkey::Pubkey, + transaction::SanitizedTransaction, +}; +use std::{ + path::PathBuf, + sync::{atomic::AtomicBool, Arc, RwLock}, +}; +use tokio::sync::{ + mpsc::{channel, Sender}, + Mutex, +}; +use tokio_stream::wrappers::ReceiverStream; +use tonic::{Request, Response, Status}; +use tracing::{error, info, instrument, warn}; + +#[derive(Debug, Default)] +struct Inner { + account_subscriptions: Vec>>, +} + +#[derive(Clone, Debug)] +pub struct GeyserGrpcPlugin { + inner: Arc>, + workdir: PathBuf, + slot: u64, +} + +impl GeyserGrpcPlugin { + pub fn new(workdir: PathBuf, slot: u64) -> Self { + Self { + inner: Arc::new(Mutex::new(Inner::default())), + workdir, + slot, + } + } + + pub fn workdir(&self) -> PathBuf { + self.workdir.clone() + } + + pub fn slot(&self) -> Slot { + self.slot + } +} + +#[tonic::async_trait] +impl GeyserService for GeyserGrpcPlugin { + type SubscribeAccountsStream = ReceiverStream>; + + #[instrument] + async fn subscribe_accounts( + &self, + _request: Request<()>, + ) -> Result, Status> { + let mut inner = self.inner.lock().await; + let (sender, receiver) = channel(100); + inner.account_subscriptions.push(sender); + Ok(Response::new(ReceiverStream::new(receiver))) + } +} + +impl AccountsUpdateNotifierInterface for GeyserGrpcPlugin { + fn notify_account_update( + &self, + _slot: Slot, + _account: &AccountSharedData, + _txn: &Option<&SanitizedTransaction>, + _pubkey: &Pubkey, + _write_version: u64, + ) { + let mut inner = self.inner.blocking_lock(); + // TODO (LB): implement this when live + let account = Account { + msg: Some(Msg::Replay(ReplayAccount {})), + }; + inner + .account_subscriptions + .retain(|sub| sub.blocking_send(Ok(account.clone())).is_ok()); + } + + /// Note: the slot notified here may not be equal to the snapshot slot + /// See AccountsDb::notify_account_restore_from_snapshot + fn notify_account_restore_from_snapshot(&self, slot: Slot, account: &StoredAccountMeta) { + let account_proto = Account { + msg: Some(Msg::Snap(SnapshotAccount { + slot, + pubkey: account.pubkey().to_bytes().to_vec(), + lamports: account.lamports(), + owner: account.owner().to_bytes().to_vec(), + is_executable: account.executable(), + rent_epoch: account.rent_epoch(), + data: account.data().to_vec(), + seq: account.write_version(), + is_startup: true, + tx_signature: None, + })), + }; + let mut inner = self.inner.blocking_lock(); + inner + .account_subscriptions + .retain(|sub| sub.blocking_send(Ok(account_proto.clone())).is_ok()); + } + + fn notify_end_of_restore_from_snapshot(&self) { + let mut inner = self.inner.blocking_lock(); + let account = Account { + msg: Some(Msg::Replay(ReplayAccount {})), + }; + + // Right now we'll send an empty replay account since replay isn't live + inner + .account_subscriptions + .retain(|sub| sub.blocking_send(Ok(account.clone())).is_ok()); + } +} + +pub fn start_snapshot_loading(plugin: GeyserGrpcPlugin, exit: Arc) { + let workdir = plugin.workdir(); + + info!("workdir: {:?}", workdir); + info!("loading genesis config..."); + let genesis_config = GenesisConfig::load(&workdir).unwrap_or_else(|load_err| { + let genesis_package = workdir.join(DEFAULT_GENESIS_ARCHIVE); + unpack_genesis_archive(&genesis_package, &workdir, 10 * 1024 * 1024).unwrap_or_else( + |unpack_err| { + warn!( + "Failed to open ledger genesis_config at {:?}: {}, {}", + workdir, load_err, unpack_err, + ); + }, + ); + + // loading must succeed at this moment + GenesisConfig::load(&workdir).unwrap() + }); + + info!("opening blockstore in workdir: {:?}", workdir); + let blockstore = Blockstore::open_with_options( + &workdir, + BlockstoreOptions { + access_type: AccessType::Primary, + recovery_mode: None, + enforce_ulimit_nofile: true, + column_options: LedgerColumnOptions { + shred_storage_type: ShredStorageType::RocksLevel, + ..LedgerColumnOptions::default() + }, + }, + ); + if let Err(e) = blockstore { + error!("error loading blockstore: {:?}", e); + return; + } + let blockstore = Arc::new(blockstore.unwrap()); + + let accounts_update_notifier = Arc::new(RwLock::new(plugin)); + + let account_paths = vec![blockstore.ledger_path().join("accounts.ledger-tool")]; + let bank_snapshots_dir = blockstore.ledger_path().join("snapshot.ledger-tool"); + + let (_bank_forks, _leader_schedule_cache, _starting_snapshot_hashes, ..) = + bank_forks_utils::load_bank_forks( + &genesis_config, + blockstore.as_ref(), + account_paths, + None, + Some(&SnapshotConfig { + full_snapshot_archives_dir: blockstore.ledger_path().clone(), + incremental_snapshot_archives_dir: blockstore.ledger_path().clone(), + bank_snapshots_dir, + archive_format: ArchiveFormat::TarZstd, + snapshot_version: SnapshotVersion::default(), + ..SnapshotConfig::default() + }), + &ProcessOptions { + accounts_db_skip_shrink: true, + ..ProcessOptions::default() + }, + None, + None, + Some(accounts_update_notifier), + &exit, + ); +} diff --git a/workers/src/helpers.rs b/workers/src/helpers.rs new file mode 100644 index 0000000..89ad5e0 --- /dev/null +++ b/workers/src/helpers.rs @@ -0,0 +1,17 @@ +use jito_protos::geyser::{replay_service_client::ReplayServiceClient, Snapshot}; +use tonic::{transport::Channel, Status}; +use tracing::instrument; + +#[instrument] +pub async fn get_snapshots( + replay_client: &mut ReplayServiceClient, +) -> Result, Status> { + let mut stream = replay_client.get_snapshots(()).await?.into_inner(); + let mut snapshots = Vec::new(); + + while let Some(snapshot) = stream.message().await? { + snapshots.push(snapshot); + } + snapshots.sort_by_key(|s| s.slot); + Ok(snapshots) +} diff --git a/workers/src/lib.rs b/workers/src/lib.rs new file mode 100644 index 0000000..8332a33 --- /dev/null +++ b/workers/src/lib.rs @@ -0,0 +1,3 @@ +pub mod geyser; +pub mod helpers; +pub mod replay_request; diff --git a/workers/src/main.rs b/workers/src/main.rs new file mode 100644 index 0000000..33e48a3 --- /dev/null +++ b/workers/src/main.rs @@ -0,0 +1,92 @@ +use clap::Parser; +use cloud_storage::Object; +use futures_util::future::join_all; +use jito_gcs::bucket::{get_all_objects, get_snapshots}; +use jito_net::slack::SlackClient; +use jito_protos::geyser::replay_service_server::ReplayServiceServer; +use jito_workers::replay_request::ReplayServiceImpl; +use std::{net::SocketAddr, path::PathBuf, str::FromStr, time::Duration}; +use tonic::transport::Server; +use tracing::{error, info}; + +#[derive(Parser, Debug)] +struct Args { + /// Geyser address to bind to + #[arg(long, env, default_value_t = SocketAddr::from_str("0.0.0.0:7892").unwrap())] + geyser_addr: SocketAddr, + + /// Ledger path, should be very big. Main workdir. + /// The snapshots are downloaded here. + #[clap(long, env, default_value = "/tmp/ledger")] + ledger_path: PathBuf, + + /// buckets to query which contain snapshots in the typical snapshot file naming scheme. + /// Solana Labs has buckets you can ask for the link to + #[clap(long, env, required = true)] + buckets: Vec, + + /// RPC url used to fetch genesis files from + #[clap(long, env, default_value = "http://mainnet.rpc.jito.wtf")] + rpc: String, + + /// Starting port for geyser servers to spawn. + /// The server will start here and work its way up trying to find new port to bind to + #[clap(long, env, default_value = "9009")] + starting_geyser_port: u16, + + /// Maximum number of concurrent replays happening. + /// A good rule of thumb is ~30GB of RAM per snapshot being loaded, however this may change over time. + #[clap(long, env, default_value = "4")] + max_workspaces: usize, + + /// Slack URL to post updates on + #[clap(long, env)] + slack_url: Option, +} + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + let args: Args = Args::parse(); + info!("starting with args: {:?}", args); + + let slack_client = SlackClient::new(args.slack_url, Duration::from_secs(1)); + + info!("reading from buckets: {:?}", args.buckets); + let get_object_tasks = args + .buckets + .iter() + .map(|bucket| get_all_objects(bucket, Some("**/snapshot-*"))); + let objects: Vec = join_all(get_object_tasks) + .await + .into_iter() + .filter_map(|o| match o { + Ok(objects) => Some(objects), + Err(e) => { + error!("error getting objects: {:?}", e); + None + } + }) + .flatten() + .filter_map(|o| o.items) + .flatten() + .collect(); + + let mut snapshots = get_snapshots(&objects); + snapshots.sort_by_key(|s| s.slot); + + let addr = args.geyser_addr; + Server::builder() + .add_service(ReplayServiceServer::new(ReplayServiceImpl::new( + args.ledger_path, + snapshots, + args.rpc, + args.starting_geyser_port, + args.max_workspaces, + slack_client, + ))) + .serve(addr) + .await + .expect("serves ok"); +} diff --git a/workers/src/replay_request.rs b/workers/src/replay_request.rs new file mode 100644 index 0000000..fe0235c --- /dev/null +++ b/workers/src/replay_request.rs @@ -0,0 +1,548 @@ +use crate::geyser::{start_snapshot_loading, GeyserGrpcPlugin}; +use jito_gcs::bucket::Snapshot; +use jito_net::{http::download_and_save_file, slack::SlackClient}; +use jito_protos::{ + geyser, + geyser::{ + geyser_service_server::GeyserServiceServer, replay_service_server::ReplayService, + GetReplayStateRequest, GetReplayStateResponse, ReplayContext, ReplayRequest, + ReplayResponse, + }, +}; +use reqwest::Url; +use std::{ + collections::HashMap, + net::{IpAddr, Ipv4Addr, SocketAddr}, + path::PathBuf, + str::FromStr, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + thread, +}; +use tokio::{ + fs::{create_dir_all, read_dir, remove_dir_all}, + net::TcpListener, + spawn, + sync::{ + mpsc::{channel, Receiver, Sender}, + oneshot, Mutex, + }, + task::{spawn_blocking, JoinHandle}, +}; +use tokio_stream::wrappers::{ReceiverStream, TcpListenerStream}; +use tonic::{ + codegen::http, + transport::{Error, Server}, + Request, Response, Status, +}; +use tracing::{debug, error, info, instrument, warn}; + +#[derive(Debug, Clone)] +pub enum ReplayError { + Download(String), +} + +/// Keeps track of state and currently running workspaces +#[derive(Debug)] +struct ReplayState { + workspaces: HashMap, + max_workspaces: usize, + count: u64, +} + +impl ReplayState { + pub fn new(max_workspaces: usize) -> Self { + Self { + workspaces: HashMap::with_capacity(max_workspaces), + max_workspaces, + count: 0, + } + } +} + +#[derive(Debug)] +struct Workspace { + slot: u64, + shutdown_tx: oneshot::Sender<()>, + download_and_replay_handle: JoinHandle>, + addr: SocketAddr, +} + +#[derive(Clone, Debug)] +pub struct ReplayServiceImpl { + inner: Arc>, + snapshots: Vec, + event_sender: Sender, +} + +#[derive(Debug)] +pub enum Event { + ReplayStart { + request: ReplayRequest, + response_sender: Sender>, + }, + Stopped { + workspace_id: u64, + error: Option, + }, +} + +#[derive(Debug)] +#[allow(unused)] +struct ReplayBackgroundThreadContext { + handle: JoinHandle>, + snapshot_load_thread: Option>, +} + +impl ReplayServiceImpl { + pub fn new( + workdir: PathBuf, + snapshots: Vec, + rpc: String, + starting_geyser_port: u16, + max_workspaces: usize, + slack_client: SlackClient, + ) -> Self { + let inner = Arc::new(Mutex::new(ReplayState::new(max_workspaces))); + + let (event_sender, receiver) = channel(10); + spawn(Self::start_request_handler( + event_sender.clone(), + receiver, + inner.clone(), + workdir, + snapshots.clone(), + rpc, + starting_geyser_port, + slack_client, + )); + + Self { + inner, + snapshots, + event_sender, + } + } + + #[allow(clippy::too_many_arguments)] + async fn start_request_handler( + event_sender: Sender, + mut receiver: Receiver, + inner_state: Arc>, + workdir: PathBuf, + snapshots: Vec, + rpc: String, + starting_geyser_port: u16, + slack_client: SlackClient, + ) { + while let Some(event) = receiver.recv().await { + info!("received event: {:?}", event); + match event { + Event::ReplayStart { + request, + response_sender, + } => { + let result = Self::handle_replay_start( + &request, + &event_sender, + &inner_state, + &workdir, + &snapshots, + &rpc, + &starting_geyser_port, + &slack_client, + ) + .await; + if response_sender.send(result).await.is_err() { + warn!("error sending back result"); + } + } + Event::Stopped { + workspace_id, + error, + } => { + info!( + "stopped for workspace_id: {} error: {:?}", + workspace_id, error + ); + let mut state = inner_state.lock().await; + if let Some(Workspace { + slot, + shutdown_tx, + download_and_replay_handle, + addr: _, + }) = state.workspaces.remove(&workspace_id) + { + slack_client + .post_slack_message(&format!( + "backfill done slot: {} error: {:?}", + slot, error + )) + .await; + + info!("shutting down workspace: {} slot: {}", workspace_id, slot); + if shutdown_tx.send(()).is_err() { + warn!("error sending shutdown signal"); + } + + info!("trying to join download_and_replay_handle..."); + let response = download_and_replay_handle.await; + info!("joined download_and_replay_handle, result: {:?}", response); + match response { + Ok(Ok(ReplayBackgroundThreadContext { + handle, + snapshot_load_thread, + })) => { + info!("joining background thread"); + let join_res = handle.await; + info!("join_res: {:?}", join_res); + if let Some(snapshot_load_thread) = snapshot_load_thread { + info!("joining snapshot thread, this might take awhile..."); + let snapshot_join = + spawn_blocking(move || snapshot_load_thread.join()).await; + info!("snapshot_join: {:?}", snapshot_join); + } + } + Ok(Err(e)) => { + error!("http error: {:?}", e); + } + Err(e) => { + error!("join error: {:?}", e); + } + } + } + } + } + } + } + + #[allow(clippy::too_many_arguments)] + #[instrument(skip(event_sender, snapshots))] + async fn handle_replay_start( + request: &ReplayRequest, + event_sender: &Sender, + inner_state: &Arc>, + workdir: &PathBuf, + snapshots: &[Snapshot], + rpc: &String, + starting_geyser_port: &u16, + slack_client: &SlackClient, + ) -> Result { + let mut inner = inner_state.lock().await; + if inner.workspaces.len() >= inner.max_workspaces { + return Err(Status::resource_exhausted("workspaces already in use")); + } + + let snapshot = snapshots + .iter() + .find(|s| s.slot == request.slot) + .ok_or_else(|| Status::invalid_argument("snapshot doesnt exist"))?; + + if inner.workspaces.values().any(|w| w.slot == snapshot.slot) { + return Err(Status::resource_exhausted("already replaying snapshot")); + } + + // Prepare filesystem + + debug!("creating work directory"); + create_dir_all(&workdir).await.map_err(|e| { + warn!("error creating workdir: {:?}", e); + Status::internal("cant create workdir") + })?; + + debug!("removing old downloads"); + Self::remove_old_downloads(&inner, &snapshot.slot, workdir).await?; + + debug!("creating snapshot directory"); + let mut snapshot_folder = workdir.clone(); + snapshot_folder.push(format!("{}/", request.slot)); + create_dir_all(&snapshot_folder).await.map_err(|e| { + warn!("error creating snapshot workdir: {:?}", e); + Status::internal("cant create snapshot workdir") + })?; + + // Download genesis from an RPC server and start to configure the larger download + + let exit = Arc::new(AtomicBool::new(false)); + + info!("downloading genesis"); + let url = Url::from_str(&format!("{}/genesis.tar.bz2", rpc)).unwrap(); + download_and_save_file( + url, + &format!("{}/genesis.tar.bz2", snapshot_folder.to_str().unwrap()), + exit.clone(), + ) + .await + .map_err(|e| { + warn!("error downloading genesis: {:?}", e); + Status::internal("error downloading genesis file") + })?; + + info!("finding geyser port to bind to"); + let mut port = *starting_geyser_port; + let (addr, listener) = loop { + let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), port); + if let Ok(listener) = TcpListener::bind(addr).await { + break (addr, listener); + } else { + port += 1; + } + }; + info!("got socket at: {:?}", addr); + + // spawn off the more involved and time sensitive tasks + let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>(); + + slack_client + .post_slack_message(&format!( + "backfill downloading snapshot slot: {}", + request.slot + )) + .await; + + inner.count += 1; + let download_and_replay_handle = Self::spawn_download_and_replay_task( + snapshot_folder, + snapshot, + shutdown_rx, + listener, + &exit, + event_sender, + inner.count, + slack_client, + ); + let count = inner.count; + inner.workspaces.insert( + count, + Workspace { + slot: snapshot.slot, + shutdown_tx, + download_and_replay_handle, + addr, + }, + ); + + Ok(ReplayResponse { + addr: addr.to_string(), + workspace_id: inner.count, + }) + } + + #[allow(clippy::too_many_arguments)] + #[instrument] + fn spawn_download_and_replay_task( + snapshot_folder: PathBuf, + snapshot: &Snapshot, + shutdown_rx: oneshot::Receiver<()>, + listener: TcpListener, + exit: &Arc, + event_sender: &Sender, + workspace_id: u64, + slack_client: &SlackClient, + ) -> JoinHandle> { + let geyser_plugin = GeyserGrpcPlugin::new(snapshot_folder.clone(), snapshot.slot); + let exit = exit.clone(); + let snapshot = snapshot.clone(); + let event_sender = event_sender.clone(); + let slack_client = slack_client.clone(); + + spawn(async move { + let server_handle = { + let exit = exit.clone(); + let event_sender = event_sender.clone(); + spawn( + Server::builder() + .add_service(GeyserServiceServer::new(geyser_plugin.clone())) + .serve_with_incoming_shutdown( + TcpListenerStream::new(listener), + async move { + info!("waiting for shutdown"); + let _ = shutdown_rx.await; + exit.store(true, Ordering::Relaxed); + let _ = event_sender + .send(Event::Stopped { + workspace_id, + error: None, + }) + .await; + warn!("shutting down server"); + }, + ), + ) + }; + + let snapshot_filepath = snapshot_folder.join(snapshot.filename); + + // TODO (LB): check here to see if already downloaded + info!("downloading snapshot to {:?}", snapshot_filepath); + if let Err(e) = download_and_save_file( + Url::from_str(&snapshot.url).unwrap(), + snapshot_filepath.as_os_str().to_str().unwrap(), + exit.clone(), + ) + .await + { + error!("sending done event to main thread. download error: {:?}", e); + let _ = event_sender + .send(Event::Stopped { + workspace_id, + error: Some(ReplayError::Download(e.to_string())), + }) + .await; + // TODO (LB): return an error here with server_handle to shut it down? + return Ok(ReplayBackgroundThreadContext { + handle: server_handle, + snapshot_load_thread: None, + }); + } + + let snapshot_load_thread = { + let exit = exit.clone(); + let event_sender = event_sender.clone(); + let slot = snapshot.slot; + + slack_client + .post_slack_message(&format!("backfill geyser stream starting slot: {}", slot)) + .await; + + thread::spawn(move || { + info!("starting snapshot loader"); + start_snapshot_loading(geyser_plugin, exit); + + info!("done loading snapshot, sending stopped event to main thread"); + let _ = event_sender.blocking_send(Event::Stopped { + workspace_id, + error: None, + }); + }) + }; + + Ok(ReplayBackgroundThreadContext { + handle: server_handle, + snapshot_load_thread: Some(snapshot_load_thread), + }) + }) + } + + #[instrument(skip(state))] + async fn remove_old_downloads( + state: &ReplayState, + slot: &u64, + workdir: &PathBuf, + ) -> Result<(), Status> { + // find the slots being actively downloaded right now + let active_downloading_slots: Vec = + state.workspaces.values().map(|w| w.slot).collect(); + info!("actively downloading slots: {:?}", active_downloading_slots); + + // delete all the numerical directories not being actively downloaded + let mut entries = read_dir(workdir).await.map_err(|e| { + warn!("error reading workdir: {:?}", e); + Status::internal("cant read work directory") + })?; + while let Some(entry) = entries.next_entry().await.map_err(|e| { + warn!("error getting next_entry in workdir: {:?}", e); + Status::internal("error iterating over entries") + })? { + let metadata = entry.metadata().await.map_err(|e| { + warn!("error reading metadata: {:?}", e); + Status::internal("error reading metadata") + })?; + if metadata.is_dir() { + let dir_name = entry.file_name(); + let dir_name_str = dir_name.to_str().unwrap(); + if let Ok(directory_slot) = dir_name_str.parse::() { + if !active_downloading_slots.contains(&directory_slot) + && directory_slot != *slot + { + warn!("deleting directory: {:?}", entry.path()); + remove_dir_all(&entry.path()).await.map_err(|e| { + error!("error deleting directory: {:?}", e); + Status::internal("error deleting directory") + })?; + } + } + } + } + Ok(()) + } +} + +#[tonic::async_trait] +impl ReplayService for ReplayServiceImpl { + #[instrument] + async fn start_replay( + &self, + request: Request, + ) -> Result, Status> { + let (response_sender, mut response_receiver) = channel(1); + + self.event_sender + .send(Event::ReplayStart { + response_sender, + request: request.into_inner(), + }) + .await + .map_err(|_| Status::internal("error sending replay request"))?; + if let Some(response) = response_receiver.recv().await { + let res = response?; + Ok(Response::new(res)) + } else { + Err(Status::internal("error receiving response")) + } + } + + type GetSnapshotsStream = ReceiverStream>; + + /// Request the snapshots available + #[instrument] + async fn get_snapshots( + &self, + _request: Request<()>, + ) -> Result, Status> { + let (sender, receiver) = channel(100); + let snapshots = self.snapshots.clone(); + spawn(async move { + for s in snapshots { + if let Err(e) = sender + .send(Ok(geyser::Snapshot { + name: s.name, + filename: s.filename, + url: s.url, + size: s.size, + slot: s.slot, + hash: s.hash, + })) + .await + { + warn!("error sending snapshot: {:?}", e); + return Err(e); + } + } + Ok(()) + }); + Ok(Response::new(ReceiverStream::new(receiver))) + } + + #[instrument] + async fn get_replay_state( + &self, + _request: Request, + ) -> Result, Status> { + let inner = self.inner.lock().await; + let states = inner + .workspaces + .iter() + .map( + |(workspace_id, Workspace { slot, addr, .. })| ReplayContext { + workspace_id: *workspace_id, + addr: addr.to_string(), + slot: *slot, + }, + ) + .collect(); + Ok(Response::new(GetReplayStateResponse { states })) + } +}