diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d6f8eed2..e006f7b6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,11 +7,10 @@ concurrency: on: push: branches: - - 'master' + - 'v1.16' tags: - 'v*' - - 'geyser-v*' - - 'kafka-v*' + - 'tools-v*' workflow_dispatch: env: @@ -78,13 +77,18 @@ jobs: run: | mv target/release/client target/release/client-22 mv target/release/config-check target/release/config-check-22 + mv target/release/grpc-google-pubsub target/release/grpc-google-pubsub-22 mv target/release/grpc-kafka target/release/grpc-kafka-22 mv ${{ env.GEYSER_PLUGIN_NAME }}-release-x86_64-unknown-linux-gnu.tar.bz2 ${{ env.GEYSER_PLUGIN_NAME }}-release22-x86_64-unknown-linux-gnu.tar.bz2 mv ${{ env.GEYSER_PLUGIN_NAME }}-release-x86_64-unknown-linux-gnu.yml ${{ env.GEYSER_PLUGIN_NAME }}-release22-x86_64-unknown-linux-gnu.yml - name: Deleteing directories to avoid upload conflict run: | - rm -rf target/release/client.d target/release/config-check.d + rm -rf \ + target/release/client.d \ + target/release/config-check.d \ + target/release/grpc-google-pubsub.d \ + target/release/grpc-kafka.d - name: Release if: startsWith(github.ref, 'refs/tags/') @@ -100,4 +104,5 @@ jobs: yellowstone-grpc-proto/proto/*.proto target/release/client* target/release/config-check* + target/release/grpc-google-pubsub* target/release/grpc-kafka* diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 26feffb6..a1cc8020 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ on: pull_request: push: branches: - - 'master' + - 'v1.16' workflow_dispatch: env: @@ -65,6 +65,11 @@ jobs: - name: cargo fmt run: cargo fmt --all -- --check + - name: cargo deny check advisories + uses: EmbarkStudios/cargo-deny-action@v1 + with: + command: check advisories + - name: cargo clippy run: cargo clippy --workspace --all-targets --tests #-- --deny=warnings @@ -74,10 +79,10 @@ jobs: run: cargo check -p yellowstone-grpc-client-simple --all-targets --tests - name: check features in `geyser` run: cargo check -p yellowstone-grpc-geyser --all-targets --tests - - name: check features in `kafka` - run: cargo check -p yellowstone-grpc-kafka --all-targets --tests - name: check features in `proto` run: cargo check -p yellowstone-grpc-proto --all-targets --tests + - name: check features in `tools` + run: cargo check -p yellowstone-grpc-tools --all-targets --tests - name: Build run: ./ci/cargo-build-test.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 36ddc770..2d9b3b86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,72 @@ The minor version will be incremented upon a breaking change and the patch versi ### Breaking +## 2023-11-24 + +- yellowstone-grpc-geyser-1.11.1+solana.1.16.19 + +### Fixes + +- geyser: reconstruct blocks with zero entries ([#245](https://github.com/rpcpool/yellowstone-grpc/pull/245)) + +### Features + +- use workspace for dependencies ([#240](https://github.com/rpcpool/yellowstone-grpc/pull/240)) + +## 2023-11-15 + +- yellowstone-grpc-client-1.12.0+solana.1.16.19 +- yellowstone-grpc-geyser-1.11.0+solana.1.16.19 +- yellowstone-grpc-proto-1.11.0+solana.1.16.19 +- yellowstone-grpc-tools-1.0.0-rc.6+solana.1.16.19 + +### Features + +- solana: update to 1.16.19 ([#238](https://github.com/rpcpool/yellowstone-grpc/pull/238)). + +## 2023-11-01 + +- @triton-one/yellowstone-grpc:0.3.0 +- yellowstone-grpc-client-1.12.0+solana.1.16.17 +- yellowstone-grpc-geyser-1.11.0+solana.1.16.17 +- yellowstone-grpc-proto-1.11.0+solana.1.16.17 +- yellowstone-grpc-tools-1.0.0-rc.6+solana.1.16.17 + +### Fixes + +- geyser: trigger end of startup when parent slot 0 seen in `update_slot_status` notification because `notify_end_of_startup` is not triggered when cluster started from genesis ([#207](https://github.com/rpcpool/yellowstone-grpc/pull/207)) +- tools: correctly handle SIGINT in kafka ([#219](https://github.com/rpcpool/yellowstone-grpc/pull/219)) + +### Features + +- proto: add optional field `filter_by_commitment` to Slots filter ([#223](https://github.com/rpcpool/yellowstone-grpc/pull/223)) +- geyser: use Ordering::Relaxed instead of SeqCst ([#221](https://github.com/rpcpool/yellowstone-grpc/pull/221)) +- proto: add optional field `ping` to `SubscribeRequest` ([#227](https://github.com/rpcpool/yellowstone-grpc/pull/227)) +- geyser: remove startup_status (allow reload plugin) ([#230](https://github.com/rpcpool/yellowstone-grpc/pull/230)) + +## 2023-10-19 + +- yellowstone-grpc-tools-1.0.0-rc.5+solana.1.16.17 + +### Features + +- tools: add Google Pub/Sub ([#211](https://github.com/rpcpool/yellowstone-grpc/pull/211)). + +### Breaking + +- kafka: rename to tools ([#203](https://github.com/rpcpool/yellowstone-grpc/pull/203)). + +## 2023-10-14 + +- yellowstone-grpc-client-1.11.1+solana.1.16.17 +- yellowstone-grpc-geyser-1.10.0+solana.1.16.17 +- yellowstone-grpc-kafka-1.0.0-rc.3+solana.1.16.17 +- yellowstone-grpc-proto-1.10.0+solana.1.16.17 + +### Features + +- solana: update to 1.16.17 ([#205](https://github.com/rpcpool/yellowstone-grpc/pull/205)). + ## 2023-10-12 - yellowstone-grpc-geyser-1.10.0+solana.1.16.16 diff --git a/Cargo.lock b/Cargo.lock index a085b579..938863b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,32 +65,33 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", - "getrandom 0.2.10", + "getrandom 0.2.11", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -127,51 +128,50 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "1.0.2" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -327,11 +327,22 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-compression" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb42b2197bf15ccb092b62c74515dbd8b86d0effd934795f6687c93b6e679a2c" +checksum = "bc2d0cfb2a7388d34f590e76686704c494ed7aaceed62ee1ba35cbf363abc2a5" dependencies = [ "brotli", "flate2", @@ -360,18 +371,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -452,7 +463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom 0.2.10", + "getrandom 0.2.11", "instant", "pin-project-lite", "rand 0.8.5", @@ -482,9 +493,15 @@ checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "base64" -version = "0.21.4" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bincode" @@ -503,9 +520,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitmaps" @@ -658,9 +675,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -705,14 +722,14 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -760,7 +777,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -774,45 +791,43 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.24" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb690e81c7840c0d7aade59f242ea3b41b9bc27bcd5997890e7702ae4b32e487" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.24" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed2e96bc16d8d740f6f48d663eddf4b8a0983e79210fd55479b7bcd0a69860e" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", "clap_lex", - "once_cell", "strsim", ] [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -833,6 +848,15 @@ dependencies = [ "unreachable", ] +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -855,13 +879,14 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37be52ef5e3b394db27a2341010685ad5103c72ac15ce2e9420a7e8f93f342c" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" dependencies = [ "cfg-if", "cpufeatures", "hex", + "proptest", "serde", ] @@ -873,9 +898,9 @@ checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -883,15 +908,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1018,7 +1043,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -1029,14 +1054,17 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] [[package]] name = "derivation-path" @@ -1160,7 +1188,7 @@ checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -1178,9 +1206,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" dependencies = [ "humantime", "is-terminal", @@ -1197,24 +1225,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.4" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "event-listener" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" @@ -1236,9 +1259,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -1250,20 +1273,35 @@ 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" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1276,9 +1314,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1286,15 +1324,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1303,38 +1341,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1384,9 +1422,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "js-sys", @@ -1397,30 +1435,28 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "git-version" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" +checksum = "13ad01ffa8221f7fe8b936d6ffb2a3e7ad428885a04fad51866a5f33eafda57c" dependencies = [ "git-version-macro", - "proc-macro-hack", ] [[package]] name = "git-version-macro" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" +checksum = "84488ccbdb24ad6f56dc1863b4a8154a7856cd3c6c7610401634fab3cb588dae" dependencies = [ - "proc-macro-hack", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] @@ -1434,11 +1470,99 @@ dependencies = [ "scroll", ] +[[package]] +name = "google-cloud-auth" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1087f1fbd2dd3f58c17c7574ddd99cd61cbbbc2c4dc81114b8687209b196cb" +dependencies = [ + "async-trait", + "base64 0.21.5", + "google-cloud-metadata", + "google-cloud-token", + "home", + "jsonwebtoken", + "reqwest", + "serde", + "serde_json", + "thiserror", + "time", + "tokio", + "tracing", + "urlencoding", +] + +[[package]] +name = "google-cloud-gax" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7324ffbab9043aecca2d0e9b9be04944d31565e15c06297fb8ff151b01a7705d" +dependencies = [ + "google-cloud-token", + "http", + "thiserror", + "tokio", + "tokio-retry", + "tonic 0.9.2", + "tower", + "tracing", +] + +[[package]] +name = "google-cloud-googleapis" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04799536fa663ab9ab6cc4898085a143d180082cc5848e0425b154fcfddf2efd" +dependencies = [ + "prost 0.11.9", + "prost-types 0.11.9", + "tonic 0.9.2", +] + +[[package]] +name = "google-cloud-metadata" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc279bfb50487d7bcd900e8688406475fc750fe474a835b2ab9ade9eb1fc90e2" +dependencies = [ + "reqwest", + "thiserror", + "tokio", +] + +[[package]] +name = "google-cloud-pubsub" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a501b632b606f8fdb36661d461cdd798db214117d1d433baa11f51dda4983870" +dependencies = [ + "async-channel", + "async-stream", + "google-cloud-auth", + "google-cloud-gax", + "google-cloud-googleapis", + "google-cloud-token", + "prost-types 0.11.9", + "thiserror", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "google-cloud-token" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c12ba8b21d128a2ce8585955246977fbce4415f680ebf9199b6f9d6d725f" +dependencies = [ + "async-trait", +] + [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1446,7 +1570,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1468,7 +1592,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", ] [[package]] @@ -1483,14 +1607,14 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", ] [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -1555,14 +1679,14 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1615,7 +1739,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1624,9 +1748,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", @@ -1648,18 +1772,31 @@ dependencies = [ "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" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1679,9 +1816,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1715,12 +1852,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.3", ] [[package]] @@ -1734,9 +1871,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" @@ -1746,7 +1883,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi 0.3.3", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1775,18 +1912,18 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1802,6 +1939,20 @@ dependencies = [ "serde", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.5", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "keccak" version = "0.1.4" @@ -1819,9 +1970,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.148" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libsecp256k1" @@ -1885,15 +2042,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.8" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1979,13 +2136,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1994,6 +2151,24 @@ 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 = "nu-ansi-term" version = "0.46.0" @@ -2063,13 +2238,13 @@ dependencies = [ [[package]] name = "num-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -2107,11 +2282,12 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2144,11 +2320,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" dependencies = [ - "num_enum_derive 0.7.0", + "num_enum_derive 0.7.1", ] [[package]] @@ -2172,19 +2348,19 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "num_enum_derive" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -2207,9 +2383,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2217,20 +2393,56 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" +dependencies = [ + "bitflags 2.4.1", + "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", + "quote", + "syn 2.0.39", +] + [[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 = "300.1.6+3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -2242,7 +2454,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2263,15 +2475,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2298,11 +2510,20 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "percentage" @@ -2315,9 +2536,9 @@ dependencies = [ [[package]] name = "pest" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ "memchr", "thiserror", @@ -2326,9 +2547,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35513f630d46400a977c4cb58f78e1bfbe01434316e60c37d27b9ad6139c66d8" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" dependencies = [ "pest", "pest_generator", @@ -2336,22 +2557,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9fc1b9e7057baba189b5c626e2d6f40681ae5b6eb064dc7c7834101ec8123a" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "pest_meta" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df74e9e7ec4053ceb980e7c0c8bd3594e977fde1af91daba9c928e8e8c6708d" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", @@ -2365,7 +2586,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.0.2", + "indexmap 2.1.0", ] [[package]] @@ -2385,7 +2606,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -2424,6 +2645,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2437,7 +2664,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -2456,20 +2683,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" +name = "proc-macro-crate" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -2489,21 +2720,47 @@ dependencies = [ "thiserror", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bitflags 2.4.1", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.2", + "unarray", +] + [[package]] name = "prost" -version = "0.12.1" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.12.3", ] [[package]] name = "prost-build" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdf592881d821b83d471f8af290226c8d51402259e9bb5be7f9f8bdebbb11ac" +checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", "heck", @@ -2513,34 +2770,56 @@ dependencies = [ "once_cell", "petgraph", "prettyplease", - "prost", - "prost-types", + "prost 0.12.3", + "prost-types 0.12.3", "regex", - "syn 2.0.37", + "syn 2.0.39", "tempfile", "which", ] [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "prost-types" -version = "0.12.1" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "prost", + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", ] [[package]] @@ -2635,7 +2914,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.11", ] [[package]] @@ -2647,6 +2926,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -2678,9 +2966,9 @@ dependencies = [ [[package]] name = "rdkafka" -version = "0.33.2" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da18026aad1c24033da3da726200de7e911e75c2e2cc2f77ffb9b4502720faae" +checksum = "053adfa02fab06e86c01d586cc68aa47ee0ff4489a59469081dc12cbcde578bf" dependencies = [ "futures-channel", "futures-util", @@ -2696,9 +2984,9 @@ dependencies = [ [[package]] name = "rdkafka-sys" -version = "4.6.0+2.2.0" +version = "4.7.0+2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad63c279fca41a27c231c450a2d2ad18288032e9cbb159ad16c9d96eba35aaaf" +checksum = "55e0d2f9ba6253f6ec72385e453294f8618e9e15c2c6aba2a5c01ccf9622d615" dependencies = [ "libc", "libz-sys", @@ -2710,23 +2998,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.9.6" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.9", - "regex-syntax 0.7.5", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -2740,13 +3028,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.9" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.2", ] [[package]] @@ -2757,9 +3045,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" @@ -2768,7 +3056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "async-compression", - "base64 0.21.4", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -2778,10 +3066,12 @@ dependencies = [ "http-body", "hyper", "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -2792,6 +3082,7 @@ dependencies = [ "serde_urlencoded", "system-configuration", "tokio", + "tokio-native-tls", "tokio-rustls", "tokio-util", "tower-service", @@ -2799,7 +3090,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.3", "winreg", ] @@ -2812,12 +3103,26 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom 0.2.11", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2841,26 +3146,26 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.15" +version = "0.38.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" +checksum = "bfeae074e687625746172d639330f1de242a178bf3189b51e35a7a21573513ac" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring", - "rustls-webpki", + "ring 0.17.7", + "rustls-webpki 0.101.7", "sct", ] @@ -2878,21 +3183,31 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "5f6a5fc258f1c1276dfe3016516945546e2d5383911efc0fc4f1cdc5df3a4ae3" dependencies = [ - "base64 0.21.4", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] @@ -2925,7 +3240,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2951,17 +3266,17 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] @@ -2989,18 +3304,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.188" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -3016,20 +3331,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -3038,9 +3353,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -3076,16 +3391,16 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "serde_yaml" -version = "0.9.25" +version = "0.9.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" +checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -3140,9 +3455,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b21f559e07218024e7e9f90f96f601825397de0e25420135f7f952453fed0b" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -3172,6 +3487,18 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "sized-chunks" version = "0.6.5" @@ -3193,15 +3520,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -3209,21 +3536,20 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "solana-account-decoder" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "Inflector", - "base64 0.21.4", + "base64 0.21.5", "bincode", "bs58", "bv", @@ -3243,8 +3569,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "bincode", "bytemuck", @@ -3263,8 +3588,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "bincode", "chrono", @@ -3276,10 +3600,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", "blake3", "block-buffer 0.10.4", "bs58", @@ -3308,19 +3631,17 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "solana-geyser-plugin-interface" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "log", "solana-sdk", @@ -3330,8 +3651,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "env_logger 0.9.3", "lazy_static", @@ -3340,8 +3660,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "log", "solana-sdk", @@ -3349,8 +3668,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "crossbeam-channel", "gethostname", @@ -3362,15 +3680,14 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "ark-bn254", "ark-ec", "ark-ff", "ark-serialize", "array-bytes", - "base64 0.21.4", + "base64 0.21.5", "bincode", "bitflags 1.3.2", "blake3", @@ -3383,7 +3700,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.10", + "getrandom 0.2.11", "itertools 0.10.5", "js-sys", "lazy_static", @@ -3416,10 +3733,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bincode", "eager", "enum-iterator", @@ -3443,11 +3759,10 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "assert_matches", - "base64 0.21.4", + "base64 0.21.5", "bincode", "bitflags 1.3.2", "borsh 0.10.3", @@ -3495,23 +3810,21 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "bs58", "proc-macro2", "quote", "rustversion", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "solana-transaction-status" -version = "1.16.16" -source = "git+https://github.com/rpcpool/solana-public.git?tag=v1.16.16-geyser-block-v3#922d06aab6b6d4e866ddb1cef31362b249bf2576" +version = "1.16.20" dependencies = [ "Inflector", - "base64 0.21.4", + "base64 0.21.5", "bincode", "borsh 0.10.3", "bs58", @@ -3532,12 +3845,10 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.16.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1fe77918563768a65fd5d6cd2fa06cf0aeb11e529a1ef8c230b0fe018600e3" +version = "1.16.20" dependencies = [ "aes-gcm-siv", - "base64 0.21.4", + "base64 0.21.5", "bincode", "bytemuck", "byteorder", @@ -3584,6 +3895,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spl-associated-token-account" version = "2.2.0" @@ -3592,7 +3909,7 @@ checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" dependencies = [ "assert_matches", "borsh 0.10.3", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "solana-program", "spl-token", @@ -3619,7 +3936,7 @@ checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -3631,7 +3948,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.37", + "syn 2.0.39", "thiserror", ] @@ -3663,7 +3980,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "solana-program", "spl-program-error-derive", @@ -3679,7 +3996,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -3719,9 +4036,9 @@ checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" dependencies = [ "arrayref", "bytemuck", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", - "num_enum 0.7.0", + "num_enum 0.7.1", "solana-program", "solana-zk-token-sdk", "spl-memo", @@ -3801,9 +4118,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -3839,44 +4156,44 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -3891,14 +4208,15 @@ dependencies = [ [[package]] name = "time" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", "libc", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -3955,20 +4273,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", "libc", "mio", "num_cpus", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3983,13 +4302,34 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "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]] @@ -4015,9 +4355,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -4045,7 +4385,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -4063,13 +4403,57 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", "winnow", ] +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tonic" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.5", + "bytes", + "flate2", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.11.9", + "rustls-pemfile", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", + "webpki-roots 0.23.1", +] + [[package]] name = "tonic" version = "0.10.2" @@ -4079,7 +4463,7 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.21.4", + "base64 0.21.5", "bytes", "flate2", "h2", @@ -4089,7 +4473,7 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost", + "prost 0.12.3", "rustls", "rustls-native-certs", "rustls-pemfile", @@ -4112,7 +4496,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -4122,10 +4506,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f80db390246dfb46553481f6024f0082ba00178ea495dbb99e70ba9a4fafb5e1" dependencies = [ "async-stream", - "prost", + "prost 0.12.3", "tokio", "tokio-stream", - "tonic", + "tonic 0.10.2", ] [[package]] @@ -4162,11 +4546,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4174,20 +4558,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -4195,20 +4579,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -4224,9 +4608,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -4240,11 +4624,17 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" @@ -4292,6 +4682,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "uriparse" version = "0.6.4" @@ -4304,15 +4700,21 @@ dependencies = [ [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8parse" version = "0.2.1" @@ -4333,9 +4735,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "8.2.5" +version = "8.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e7dc29b3c54a2ea67ef4f953d5ec0c4085035c0ae2d325be1c0d2144bd9f16" +checksum = "1290fd64cc4e7d3c9b07d7f333ce0ce0007253e32870e632624835cc80b83939" dependencies = [ "anyhow", "rustc_version", @@ -4378,9 +4780,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4388,24 +4790,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -4415,9 +4817,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4425,28 +4827,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -4454,9 +4856,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +dependencies = [ + "rustls-webpki 0.100.3", +] + +[[package]] +name = "webpki-roots" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "which" @@ -4502,12 +4913,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -4516,7 +4927,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -4525,13 +4945,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -4540,47 +4975,89 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" -version = "0.5.15" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ "memchr", ] @@ -4592,26 +5069,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "yellowstone-grpc-client" -version = "1.11.1+solana.1.16.16" +version = "1.12.0+solana.1.16.19" dependencies = [ "bytes", "futures", "http", "thiserror", "tokio", - "tonic", + "tonic 0.10.2", "tonic-health", "yellowstone-grpc-proto", ] [[package]] name = "yellowstone-grpc-client-simple" -version = "1.10.0+solana.1.16.16" +version = "1.11.0+solana.1.16.19" dependencies = [ "anyhow", "backoff", @@ -4619,7 +5096,7 @@ dependencies = [ "bs58", "chrono", "clap", - "env_logger 0.10.0", + "env_logger 0.10.1", "futures", "hex", "log", @@ -4634,10 +5111,10 @@ dependencies = [ [[package]] name = "yellowstone-grpc-geyser" -version = "1.10.0+solana.1.16.16" +version = "1.11.1+solana.1.16.19" dependencies = [ "anyhow", - "base64 0.21.4", + "base64 0.21.5", "bincode", "bs58", "cargo-lock", @@ -4658,15 +5135,30 @@ dependencies = [ "spl-token-2022", "tokio", "tokio-stream", - "tonic", + "tonic 0.10.2", "tonic-health", "vergen", "yellowstone-grpc-proto", ] [[package]] -name = "yellowstone-grpc-kafka" -version = "1.0.0-rc.3+solana.1.16.16" +name = "yellowstone-grpc-proto" +version = "1.11.0+solana.1.16.19" +dependencies = [ + "anyhow", + "bincode", + "prost 0.12.3", + "protobuf-src", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "tonic 0.10.2", + "tonic-build", +] + +[[package]] +name = "yellowstone-grpc-tools" +version = "1.0.0-rc.7+solana.1.16.19" dependencies = [ "anyhow", "async-trait", @@ -4676,6 +5168,8 @@ dependencies = [ "const-hex", "futures", "git-version", + "google-cloud-googleapis", + "google-cloud-pubsub", "hyper", "json5", "lazy_static", @@ -4687,7 +5181,7 @@ dependencies = [ "sha2 0.10.8", "tokio", "tokio-stream", - "tonic", + "tonic 0.10.2", "tonic-health", "tracing", "tracing-subscriber", @@ -4697,18 +5191,23 @@ dependencies = [ ] [[package]] -name = "yellowstone-grpc-proto" -version = "1.10.0+solana.1.16.16" +name = "zerocopy" +version = "0.7.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d075cf85bbb114e933343e087b92f2146bac0d55b534cbb8188becf0039948e" dependencies = [ - "anyhow", - "bincode", - "prost", - "protobuf-src", - "solana-account-decoder", - "solana-sdk", - "solana-transaction-status", - "tonic", - "tonic-build", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86cd5ca076997b97ef09d3ad65efe811fa68c9e874cb636ccb211223a813b0c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", ] [[package]] @@ -4728,7 +5227,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.39", ] [[package]] @@ -4752,11 +5251,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 763e0216..e5ed814d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,21 +1,82 @@ [workspace] +resolver = "2" members = [ - "examples/rust", # 1.10.0+solana.1.16.16 - "yellowstone-grpc-client", # 1.11.1+solana.1.16.16 - "yellowstone-grpc-geyser", # 1.10.0+solana.1.16.16 - "yellowstone-grpc-kafka", # 1.0.0-rc.3+solana.1.16.16 - "yellowstone-grpc-proto", # 1.10.0+solana.1.16.16 + "examples/rust", # 1.11.0+solana.1.16.19 + "yellowstone-grpc-client", # 1.12.0+solana.1.16.19 + "yellowstone-grpc-geyser", # 1.11.1+solana.1.16.19 + "yellowstone-grpc-proto", # 1.11.0+solana.1.16.19 + "yellowstone-grpc-tools", # 1.0.0-rc.7+solana.1.16.19 ] +[workspace.package] +authors = ["Triton One"] +edition = "2021" +homepage = "https://triton.one" +repository = "https://github.com/rpcpool/yellowstone-grpc" +license = "Apache-2.0" +keywords = ["solana"] + +[workspace.dependencies] +anyhow = "1.0.62" +async-trait = "0.1.73" +atty = "0.2.14" +backoff = "0.4.0" +base64 = "0.21.0" +bincode = "1.3.3" +bs58 = "0.4.0" +bytes = "1.3.0" +cargo-lock = "9.0.0" +chrono = "0.4.26" +clap = "4.3.0" +const-hex = "1.6.2" +crossbeam-channel = "0.5.8" +env_logger = "0.10.0" +futures = "0.3.24" +git-version = "0.3.5" +google-cloud-googleapis = "0.11.0" +google-cloud-pubsub = "0.21.0" +hex = "0.4.3" +http = "0.2.8" +hyper = "0.14.27" +json5 = "0.4.1" +lazy_static = "1.4.0" +log = "0.4.17" +maplit = "1.0.2" +prometheus = "0.13.2" +prost = "0.12.1" +protobuf-src = "1.1.0" +rdkafka = "0.34.0" +serde = "1.0.145" +serde_json = "1.0.86" +serde_yaml = "0.9.25" +sha2 = "0.10.7" + +solana-account-decoder = { path = "../solana/account-decoder" } #"=1.18.0" +solana-geyser-plugin-interface = { path = "../solana/geyser-plugin-interface" } +solana-logger = { path = "../solana/logger" } +solana-sdk = { path = "../solana/sdk" } +solana-transaction-status = { path = "../solana/transaction-status" } + +spl-token-2022 = "0.9.0" +thiserror = "1.0" +tokio = "1.21.2" +tokio-stream = "0.1.11" +tonic = "0.10.2" +tonic-build = "0.10.2" +tonic-health = "0.10.2" +tracing = "0.1.37" +tracing-subscriber = "0.3.17" +vergen = "8.2.1" +yellowstone-grpc-client = { path = "yellowstone-grpc-client", version = "=1.12.0+solana.1.16.19" } +yellowstone-grpc-proto = { path = "yellowstone-grpc-proto", version = "=1.11.0+solana.1.16.19" } + [profile.release] debug = true lto = true codegen-units = 1 [patch.crates-io] -solana-account-decoder = { git = "https://github.com/rpcpool/solana-public.git", tag = "v1.16.16-geyser-block-v3" } -solana-geyser-plugin-interface = { git = "https://github.com/rpcpool/solana-public.git", tag = "v1.16.16-geyser-block-v3" } -solana-logger = { git = "https://github.com/rpcpool/solana-public.git", tag = "v1.16.16-geyser-block-v3" } -solana-program = { git = "https://github.com/rpcpool/solana-public.git", tag = "v1.16.16-geyser-block-v3" } -solana-sdk = { git = "https://github.com/rpcpool/solana-public.git", tag = "v1.16.16-geyser-block-v3" } -solana-transaction-status = { git = "https://github.com/rpcpool/solana-public.git", tag = "v1.16.16-geyser-block-v3" } +solana-program = { path = "../solana/sdk/program" } +solana-zk-token-sdk = { path = "../solana/zk-token-sdk" } +solana-sdk = { path = "../solana/sdk" } + diff --git a/README.md b/README.md index 453c0839..f5051ebd 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ It provides the ability to get slots, blocks, transactions, and account update n For additional documentation, please see: https://docs.triton.one/rpc-pool/grpc-subscriptions +#### Known bugs + +Block reconstruction inside gRPC plugin based on information provided by BlockMeta, unfortunately number of entries for blocks generated on validators always equal to zero. These blocks always will have zero entries. See issue on GitHub: https://github.com/solana-labs/solana/issues/33823 + ### Validator Current plugin version (`+solana.1.16.x`) use validator with backported `ReplicaBlockInfoV3` to Geyser interface — https://github.com/solana-labs/solana/pull/33359. As result it's not compatible with original validator from Solana Labs and would not work. You need to compile validator from the source code and can find patched releases in `Triton One` Solana fork: https://github.com/rpcpool/solana-public/tree/v1.16.16-geyser-block-v3. @@ -104,7 +108,54 @@ It's possible to add limits for filters in config. If `filters` field is omitted - [Rust](examples/rust) - [TypeScript](examples/typescript) -### Kafka producer / consumer +### gRPC Tools + +#### Google Pub/Sub + +```bash +$ cargo run --bin grpc-google-pubsub -- --help +Yellowstone gRPC Google Pub/Sub Tool + +Usage: grpc-google-pubsub [OPTIONS] --config + +Commands: + grpc2pubsub Receive data from gRPC and send them to the Pub/Sub + pubsub2stdout Dev: subscribe to message from Pub/Sub and print them to Stdout + pubsubTopicCreate Dev: create Pub/Sub topic + pubsubTopicDelete Dev: delete Pub/Sub topic + help Print this message or the help of the given subcommand(s) + +Options: + -c, --config Path to config file + --prometheus Prometheus listen address + -h, --help Print help + -V, --version Print version +``` + +##### Development + +```bash +# export creds +export GOOGLE_APPLICATION_CREDENTIALS=/path/to/google/project/creds.json +# send messages from gRPC to Google Pub/Sub +cargo run --bin grpc-google-pubsub -- --config yellowstone-grpc-tools/config-google-pubsub.json grpc2pubsub +``` + +with emulator: + +```bash +# retrive `USER_CONFIG_DIR` +$ gcloud info --format='get(config.paths.global_config_dir)' +# run emulator, data dir by default: `/emulators/pubsub` +$ gcloud beta emulators pubsub start +... +# send serialized gRPC messages to Google Pub/Sub with PUBSUB_EMULATOR_HOST +$ PUBSUB_EMULATOR_HOST=localhost:8085 cargo run --bin grpc-google-pubsub -- --config yellowstone-grpc-tools/config-google-pubsub.json grpc2pubsub +# print type of messages from Google Pub/Sub with PUBSUB_EMULATOR_HOST +$ PUBSUB_EMULATOR_HOST=localhost:8085 cargo run --bin grpc-google-pubsub -- --config yellowstone-grpc-tools/config-google-pubsub.json --prometheus 1 pubsub2stdout +``` + +#### Kafka In addition to gRPC Geyser Plugin we provide Kafka tool. This tool can works in 3 modes: @@ -114,7 +165,7 @@ In addition to gRPC Geyser Plugin we provide Kafka tool. This tool can works in ```bash $ cargo run --bin grpc-kafka -- --help -Yellowstone gRPC Kafka Producer/Dedup/Consumer +Yellowstone gRPC Kafka Tool Usage: grpc-kafka [OPTIONS] --config @@ -131,15 +182,15 @@ Options: -V, --version Print version ``` -#### Development +##### Development ```bash # run kafka locally -docker-compose -f ./yellowstone-grpc-kafka/docker-kafka.yml up +docker-compose -f ./yellowstone-grpc-tools/docker-kafka.yml up # create topic kafka_2.13-3.5.0/bin/kafka-topics.sh --bootstrap-server localhost:29092 --create --topic grpc1 # send messages from gRPC to Kafka -cargo run --bin grpc-kafka -- --config yellowstone-grpc-kafka/config.json --prometheus 127.0.0.1:8873 grpc2kafka +cargo run --bin grpc-kafka -- --config yellowstone-grpc-tools/config-kafka.json grpc2kafka # read messages from Kafka kafka_2.13-3.5.0/bin/kafka-console-consumer.sh --bootstrap-server localhost:29092 --topic grpc1 ``` diff --git a/deny.toml b/deny.toml new file mode 100644 index 00000000..69b80da2 --- /dev/null +++ b/deny.toml @@ -0,0 +1,32 @@ +all-features = true + +[advisories] +ignore = [ + # borsh 0.9.3 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0033 + # Affected versions of borsh cause undefined behavior when zero-sized-types (ZST) + # are parsed and the Copy/Clone traits are not implemented/derived. + # For instance if 1000 instances of a ZST are deserialized, and the ZST is not copy + # (this can be achieved through a singleton), then accessing/writing to deserialized + # data will cause a segmentation fault. + # borsh 0.10.3 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0033 + # Affected versions of borsh cause undefined behavior when zero-sized-types (ZST) + # are parsed and the Copy/Clone traits are not implemented/derived. + # For instance if 1000 instances of a ZST are deserialized, and the ZST is not copy + # (this can be achieved through a singleton), then accessing/writing to deserialized + # data will cause a segmentation fault. + "RUSTSEC-2023-0033", + + # ed25519-dalek 1.0.1 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2022-0093 + # Versions of `ed25519-dalek` prior to v2.0 model private and public keys as + # separate types which can be assembled into a `Keypair`, and also provide APIs + # for serializing and deserializing 64-byte private/public keypairs. + "RUSTSEC-2022-0093", + + # atty 0.2.14 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2021-0145 + # On windows, `atty` dereferences a potentially unaligned pointer. + "RUSTSEC-2021-0145", +] diff --git a/examples/golang/proto/geyser.pb.go b/examples/golang/proto/geyser.pb.go index 5bc94856..fc6a7489 100644 --- a/examples/golang/proto/geyser.pb.go +++ b/examples/golang/proto/geyser.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.19.6 // source: geyser.proto @@ -82,6 +82,7 @@ type SubscribeRequest struct { Entry map[string]*SubscribeRequestFilterEntry `protobuf:"bytes,8,rep,name=entry,proto3" json:"entry,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Commitment *CommitmentLevel `protobuf:"varint,6,opt,name=commitment,proto3,enum=geyser.CommitmentLevel,oneof" json:"commitment,omitempty"` AccountsDataSlice []*SubscribeRequestAccountsDataSlice `protobuf:"bytes,7,rep,name=accounts_data_slice,json=accountsDataSlice,proto3" json:"accounts_data_slice,omitempty"` + Ping *SubscribeRequestPing `protobuf:"bytes,9,opt,name=ping,proto3,oneof" json:"ping,omitempty"` } func (x *SubscribeRequest) Reset() { @@ -172,6 +173,13 @@ func (x *SubscribeRequest) GetAccountsDataSlice() []*SubscribeRequestAccountsDat return nil } +func (x *SubscribeRequest) GetPing() *SubscribeRequestPing { + if x != nil { + return x.Ping + } + return nil +} + type SubscribeRequestFilterAccounts struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -442,6 +450,8 @@ type SubscribeRequestFilterSlots struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + FilterByCommitment *bool `protobuf:"varint,1,opt,name=filter_by_commitment,json=filterByCommitment,proto3,oneof" json:"filter_by_commitment,omitempty"` } func (x *SubscribeRequestFilterSlots) Reset() { @@ -476,6 +486,13 @@ func (*SubscribeRequestFilterSlots) Descriptor() ([]byte, []int) { return file_geyser_proto_rawDescGZIP(), []int{4} } +func (x *SubscribeRequestFilterSlots) GetFilterByCommitment() bool { + if x != nil && x.FilterByCommitment != nil { + return *x.FilterByCommitment + } + return false +} + type SubscribeRequestFilterTransactions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -765,6 +782,53 @@ func (x *SubscribeRequestAccountsDataSlice) GetLength() uint64 { return 0 } +type SubscribeRequestPing struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *SubscribeRequestPing) Reset() { + *x = SubscribeRequestPing{} + if protoimpl.UnsafeEnabled { + mi := &file_geyser_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeRequestPing) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeRequestPing) ProtoMessage() {} + +func (x *SubscribeRequestPing) ProtoReflect() protoreflect.Message { + mi := &file_geyser_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeRequestPing.ProtoReflect.Descriptor instead. +func (*SubscribeRequestPing) Descriptor() ([]byte, []int) { + return file_geyser_proto_rawDescGZIP(), []int{10} +} + +func (x *SubscribeRequestPing) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + type SubscribeUpdate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -778,6 +842,7 @@ type SubscribeUpdate struct { // *SubscribeUpdate_Transaction // *SubscribeUpdate_Block // *SubscribeUpdate_Ping + // *SubscribeUpdate_Pong // *SubscribeUpdate_BlockMeta // *SubscribeUpdate_Entry UpdateOneof isSubscribeUpdate_UpdateOneof `protobuf_oneof:"update_oneof"` @@ -786,7 +851,7 @@ type SubscribeUpdate struct { func (x *SubscribeUpdate) Reset() { *x = SubscribeUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[10] + mi := &file_geyser_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -799,7 +864,7 @@ func (x *SubscribeUpdate) String() string { func (*SubscribeUpdate) ProtoMessage() {} func (x *SubscribeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[10] + mi := &file_geyser_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -812,7 +877,7 @@ func (x *SubscribeUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdate.ProtoReflect.Descriptor instead. func (*SubscribeUpdate) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{10} + return file_geyser_proto_rawDescGZIP(), []int{11} } func (x *SubscribeUpdate) GetFilters() []string { @@ -864,6 +929,13 @@ func (x *SubscribeUpdate) GetPing() *SubscribeUpdatePing { return nil } +func (x *SubscribeUpdate) GetPong() *SubscribeUpdatePong { + if x, ok := x.GetUpdateOneof().(*SubscribeUpdate_Pong); ok { + return x.Pong + } + return nil +} + func (x *SubscribeUpdate) GetBlockMeta() *SubscribeUpdateBlockMeta { if x, ok := x.GetUpdateOneof().(*SubscribeUpdate_BlockMeta); ok { return x.BlockMeta @@ -902,6 +974,10 @@ type SubscribeUpdate_Ping struct { Ping *SubscribeUpdatePing `protobuf:"bytes,6,opt,name=ping,proto3,oneof"` } +type SubscribeUpdate_Pong struct { + Pong *SubscribeUpdatePong `protobuf:"bytes,9,opt,name=pong,proto3,oneof"` +} + type SubscribeUpdate_BlockMeta struct { BlockMeta *SubscribeUpdateBlockMeta `protobuf:"bytes,7,opt,name=block_meta,json=blockMeta,proto3,oneof"` } @@ -920,6 +996,8 @@ func (*SubscribeUpdate_Block) isSubscribeUpdate_UpdateOneof() {} func (*SubscribeUpdate_Ping) isSubscribeUpdate_UpdateOneof() {} +func (*SubscribeUpdate_Pong) isSubscribeUpdate_UpdateOneof() {} + func (*SubscribeUpdate_BlockMeta) isSubscribeUpdate_UpdateOneof() {} func (*SubscribeUpdate_Entry) isSubscribeUpdate_UpdateOneof() {} @@ -937,7 +1015,7 @@ type SubscribeUpdateAccount struct { func (x *SubscribeUpdateAccount) Reset() { *x = SubscribeUpdateAccount{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[11] + mi := &file_geyser_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -950,7 +1028,7 @@ func (x *SubscribeUpdateAccount) String() string { func (*SubscribeUpdateAccount) ProtoMessage() {} func (x *SubscribeUpdateAccount) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[11] + mi := &file_geyser_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -963,7 +1041,7 @@ func (x *SubscribeUpdateAccount) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateAccount.ProtoReflect.Descriptor instead. func (*SubscribeUpdateAccount) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{11} + return file_geyser_proto_rawDescGZIP(), []int{12} } func (x *SubscribeUpdateAccount) GetAccount() *SubscribeUpdateAccountInfo { @@ -1005,7 +1083,7 @@ type SubscribeUpdateAccountInfo struct { func (x *SubscribeUpdateAccountInfo) Reset() { *x = SubscribeUpdateAccountInfo{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[12] + mi := &file_geyser_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1018,7 +1096,7 @@ func (x *SubscribeUpdateAccountInfo) String() string { func (*SubscribeUpdateAccountInfo) ProtoMessage() {} func (x *SubscribeUpdateAccountInfo) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[12] + mi := &file_geyser_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1031,7 +1109,7 @@ func (x *SubscribeUpdateAccountInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateAccountInfo.ProtoReflect.Descriptor instead. func (*SubscribeUpdateAccountInfo) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{12} + return file_geyser_proto_rawDescGZIP(), []int{13} } func (x *SubscribeUpdateAccountInfo) GetPubkey() []byte { @@ -1103,7 +1181,7 @@ type SubscribeUpdateSlot struct { func (x *SubscribeUpdateSlot) Reset() { *x = SubscribeUpdateSlot{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[13] + mi := &file_geyser_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1116,7 +1194,7 @@ func (x *SubscribeUpdateSlot) String() string { func (*SubscribeUpdateSlot) ProtoMessage() {} func (x *SubscribeUpdateSlot) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[13] + mi := &file_geyser_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1129,7 +1207,7 @@ func (x *SubscribeUpdateSlot) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateSlot.ProtoReflect.Descriptor instead. func (*SubscribeUpdateSlot) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{13} + return file_geyser_proto_rawDescGZIP(), []int{14} } func (x *SubscribeUpdateSlot) GetSlot() uint64 { @@ -1165,7 +1243,7 @@ type SubscribeUpdateTransaction struct { func (x *SubscribeUpdateTransaction) Reset() { *x = SubscribeUpdateTransaction{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[14] + mi := &file_geyser_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1256,7 @@ func (x *SubscribeUpdateTransaction) String() string { func (*SubscribeUpdateTransaction) ProtoMessage() {} func (x *SubscribeUpdateTransaction) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[14] + mi := &file_geyser_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1269,7 @@ func (x *SubscribeUpdateTransaction) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateTransaction.ProtoReflect.Descriptor instead. func (*SubscribeUpdateTransaction) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{14} + return file_geyser_proto_rawDescGZIP(), []int{15} } func (x *SubscribeUpdateTransaction) GetTransaction() *SubscribeUpdateTransactionInfo { @@ -1223,7 +1301,7 @@ type SubscribeUpdateTransactionInfo struct { func (x *SubscribeUpdateTransactionInfo) Reset() { *x = SubscribeUpdateTransactionInfo{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[15] + mi := &file_geyser_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1236,7 +1314,7 @@ func (x *SubscribeUpdateTransactionInfo) String() string { func (*SubscribeUpdateTransactionInfo) ProtoMessage() {} func (x *SubscribeUpdateTransactionInfo) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[15] + mi := &file_geyser_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1249,7 +1327,7 @@ func (x *SubscribeUpdateTransactionInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateTransactionInfo.ProtoReflect.Descriptor instead. func (*SubscribeUpdateTransactionInfo) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{15} + return file_geyser_proto_rawDescGZIP(), []int{16} } func (x *SubscribeUpdateTransactionInfo) GetSignature() []byte { @@ -1310,7 +1388,7 @@ type SubscribeUpdateBlock struct { func (x *SubscribeUpdateBlock) Reset() { *x = SubscribeUpdateBlock{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[16] + mi := &file_geyser_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1323,7 +1401,7 @@ func (x *SubscribeUpdateBlock) String() string { func (*SubscribeUpdateBlock) ProtoMessage() {} func (x *SubscribeUpdateBlock) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[16] + mi := &file_geyser_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1336,7 +1414,7 @@ func (x *SubscribeUpdateBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateBlock.ProtoReflect.Descriptor instead. func (*SubscribeUpdateBlock) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{16} + return file_geyser_proto_rawDescGZIP(), []int{17} } func (x *SubscribeUpdateBlock) GetSlot() uint64 { @@ -1448,7 +1526,7 @@ type SubscribeUpdateBlockMeta struct { func (x *SubscribeUpdateBlockMeta) Reset() { *x = SubscribeUpdateBlockMeta{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[17] + mi := &file_geyser_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1461,7 +1539,7 @@ func (x *SubscribeUpdateBlockMeta) String() string { func (*SubscribeUpdateBlockMeta) ProtoMessage() {} func (x *SubscribeUpdateBlockMeta) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[17] + mi := &file_geyser_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1474,7 +1552,7 @@ func (x *SubscribeUpdateBlockMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateBlockMeta.ProtoReflect.Descriptor instead. func (*SubscribeUpdateBlockMeta) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{17} + return file_geyser_proto_rawDescGZIP(), []int{18} } func (x *SubscribeUpdateBlockMeta) GetSlot() uint64 { @@ -1548,7 +1626,7 @@ type SubscribeUpdateEntry struct { func (x *SubscribeUpdateEntry) Reset() { *x = SubscribeUpdateEntry{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[18] + mi := &file_geyser_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1561,7 +1639,7 @@ func (x *SubscribeUpdateEntry) String() string { func (*SubscribeUpdateEntry) ProtoMessage() {} func (x *SubscribeUpdateEntry) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[18] + mi := &file_geyser_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1574,7 +1652,7 @@ func (x *SubscribeUpdateEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdateEntry.ProtoReflect.Descriptor instead. func (*SubscribeUpdateEntry) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{18} + return file_geyser_proto_rawDescGZIP(), []int{19} } func (x *SubscribeUpdateEntry) GetSlot() uint64 { @@ -1621,7 +1699,7 @@ type SubscribeUpdatePing struct { func (x *SubscribeUpdatePing) Reset() { *x = SubscribeUpdatePing{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[19] + mi := &file_geyser_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1634,7 +1712,7 @@ func (x *SubscribeUpdatePing) String() string { func (*SubscribeUpdatePing) ProtoMessage() {} func (x *SubscribeUpdatePing) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[19] + mi := &file_geyser_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1647,7 +1725,54 @@ func (x *SubscribeUpdatePing) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeUpdatePing.ProtoReflect.Descriptor instead. func (*SubscribeUpdatePing) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{19} + return file_geyser_proto_rawDescGZIP(), []int{20} +} + +type SubscribeUpdatePong struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *SubscribeUpdatePong) Reset() { + *x = SubscribeUpdatePong{} + if protoimpl.UnsafeEnabled { + mi := &file_geyser_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeUpdatePong) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeUpdatePong) ProtoMessage() {} + +func (x *SubscribeUpdatePong) ProtoReflect() protoreflect.Message { + mi := &file_geyser_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeUpdatePong.ProtoReflect.Descriptor instead. +func (*SubscribeUpdatePong) Descriptor() ([]byte, []int) { + return file_geyser_proto_rawDescGZIP(), []int{21} +} + +func (x *SubscribeUpdatePong) GetId() int32 { + if x != nil { + return x.Id + } + return 0 } type PingRequest struct { @@ -1661,7 +1786,7 @@ type PingRequest struct { func (x *PingRequest) Reset() { *x = PingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[20] + mi := &file_geyser_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1674,7 +1799,7 @@ func (x *PingRequest) String() string { func (*PingRequest) ProtoMessage() {} func (x *PingRequest) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[20] + mi := &file_geyser_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1687,7 +1812,7 @@ func (x *PingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingRequest.ProtoReflect.Descriptor instead. func (*PingRequest) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{20} + return file_geyser_proto_rawDescGZIP(), []int{22} } func (x *PingRequest) GetCount() int32 { @@ -1708,7 +1833,7 @@ type PongResponse struct { func (x *PongResponse) Reset() { *x = PongResponse{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[21] + mi := &file_geyser_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1721,7 +1846,7 @@ func (x *PongResponse) String() string { func (*PongResponse) ProtoMessage() {} func (x *PongResponse) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[21] + mi := &file_geyser_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1734,7 +1859,7 @@ func (x *PongResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PongResponse.ProtoReflect.Descriptor instead. func (*PongResponse) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{21} + return file_geyser_proto_rawDescGZIP(), []int{23} } func (x *PongResponse) GetCount() int32 { @@ -1755,7 +1880,7 @@ type GetLatestBlockhashRequest struct { func (x *GetLatestBlockhashRequest) Reset() { *x = GetLatestBlockhashRequest{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[22] + mi := &file_geyser_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1768,7 +1893,7 @@ func (x *GetLatestBlockhashRequest) String() string { func (*GetLatestBlockhashRequest) ProtoMessage() {} func (x *GetLatestBlockhashRequest) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[22] + mi := &file_geyser_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1781,7 +1906,7 @@ func (x *GetLatestBlockhashRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestBlockhashRequest.ProtoReflect.Descriptor instead. func (*GetLatestBlockhashRequest) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{22} + return file_geyser_proto_rawDescGZIP(), []int{24} } func (x *GetLatestBlockhashRequest) GetCommitment() CommitmentLevel { @@ -1804,7 +1929,7 @@ type GetLatestBlockhashResponse struct { func (x *GetLatestBlockhashResponse) Reset() { *x = GetLatestBlockhashResponse{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[23] + mi := &file_geyser_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1817,7 +1942,7 @@ func (x *GetLatestBlockhashResponse) String() string { func (*GetLatestBlockhashResponse) ProtoMessage() {} func (x *GetLatestBlockhashResponse) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[23] + mi := &file_geyser_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1830,7 +1955,7 @@ func (x *GetLatestBlockhashResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestBlockhashResponse.ProtoReflect.Descriptor instead. func (*GetLatestBlockhashResponse) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{23} + return file_geyser_proto_rawDescGZIP(), []int{25} } func (x *GetLatestBlockhashResponse) GetSlot() uint64 { @@ -1865,7 +1990,7 @@ type GetBlockHeightRequest struct { func (x *GetBlockHeightRequest) Reset() { *x = GetBlockHeightRequest{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[24] + mi := &file_geyser_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1878,7 +2003,7 @@ func (x *GetBlockHeightRequest) String() string { func (*GetBlockHeightRequest) ProtoMessage() {} func (x *GetBlockHeightRequest) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[24] + mi := &file_geyser_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1891,7 +2016,7 @@ func (x *GetBlockHeightRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockHeightRequest.ProtoReflect.Descriptor instead. func (*GetBlockHeightRequest) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{24} + return file_geyser_proto_rawDescGZIP(), []int{26} } func (x *GetBlockHeightRequest) GetCommitment() CommitmentLevel { @@ -1912,7 +2037,7 @@ type GetBlockHeightResponse struct { func (x *GetBlockHeightResponse) Reset() { *x = GetBlockHeightResponse{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[25] + mi := &file_geyser_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1925,7 +2050,7 @@ func (x *GetBlockHeightResponse) String() string { func (*GetBlockHeightResponse) ProtoMessage() {} func (x *GetBlockHeightResponse) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[25] + mi := &file_geyser_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1938,7 +2063,7 @@ func (x *GetBlockHeightResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockHeightResponse.ProtoReflect.Descriptor instead. func (*GetBlockHeightResponse) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{25} + return file_geyser_proto_rawDescGZIP(), []int{27} } func (x *GetBlockHeightResponse) GetBlockHeight() uint64 { @@ -1959,7 +2084,7 @@ type GetSlotRequest struct { func (x *GetSlotRequest) Reset() { *x = GetSlotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[26] + mi := &file_geyser_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1972,7 +2097,7 @@ func (x *GetSlotRequest) String() string { func (*GetSlotRequest) ProtoMessage() {} func (x *GetSlotRequest) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[26] + mi := &file_geyser_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1985,7 +2110,7 @@ func (x *GetSlotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSlotRequest.ProtoReflect.Descriptor instead. func (*GetSlotRequest) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{26} + return file_geyser_proto_rawDescGZIP(), []int{28} } func (x *GetSlotRequest) GetCommitment() CommitmentLevel { @@ -2006,7 +2131,7 @@ type GetSlotResponse struct { func (x *GetSlotResponse) Reset() { *x = GetSlotResponse{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[27] + mi := &file_geyser_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2019,7 +2144,7 @@ func (x *GetSlotResponse) String() string { func (*GetSlotResponse) ProtoMessage() {} func (x *GetSlotResponse) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[27] + mi := &file_geyser_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2032,7 +2157,7 @@ func (x *GetSlotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSlotResponse.ProtoReflect.Descriptor instead. func (*GetSlotResponse) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{27} + return file_geyser_proto_rawDescGZIP(), []int{29} } func (x *GetSlotResponse) GetSlot() uint64 { @@ -2051,7 +2176,7 @@ type GetVersionRequest struct { func (x *GetVersionRequest) Reset() { *x = GetVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[28] + mi := &file_geyser_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2064,7 +2189,7 @@ func (x *GetVersionRequest) String() string { func (*GetVersionRequest) ProtoMessage() {} func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[28] + mi := &file_geyser_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2077,7 +2202,7 @@ func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionRequest.ProtoReflect.Descriptor instead. func (*GetVersionRequest) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{28} + return file_geyser_proto_rawDescGZIP(), []int{30} } type GetVersionResponse struct { @@ -2091,7 +2216,7 @@ type GetVersionResponse struct { func (x *GetVersionResponse) Reset() { *x = GetVersionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[29] + mi := &file_geyser_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2104,7 +2229,7 @@ func (x *GetVersionResponse) String() string { func (*GetVersionResponse) ProtoMessage() {} func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[29] + mi := &file_geyser_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2117,7 +2242,7 @@ func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionResponse.ProtoReflect.Descriptor instead. func (*GetVersionResponse) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{29} + return file_geyser_proto_rawDescGZIP(), []int{31} } func (x *GetVersionResponse) GetVersion() string { @@ -2139,7 +2264,7 @@ type IsBlockhashValidRequest struct { func (x *IsBlockhashValidRequest) Reset() { *x = IsBlockhashValidRequest{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[30] + mi := &file_geyser_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2152,7 +2277,7 @@ func (x *IsBlockhashValidRequest) String() string { func (*IsBlockhashValidRequest) ProtoMessage() {} func (x *IsBlockhashValidRequest) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[30] + mi := &file_geyser_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2165,7 +2290,7 @@ func (x *IsBlockhashValidRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IsBlockhashValidRequest.ProtoReflect.Descriptor instead. func (*IsBlockhashValidRequest) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{30} + return file_geyser_proto_rawDescGZIP(), []int{32} } func (x *IsBlockhashValidRequest) GetBlockhash() string { @@ -2194,7 +2319,7 @@ type IsBlockhashValidResponse struct { func (x *IsBlockhashValidResponse) Reset() { *x = IsBlockhashValidResponse{} if protoimpl.UnsafeEnabled { - mi := &file_geyser_proto_msgTypes[31] + mi := &file_geyser_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2207,7 +2332,7 @@ func (x *IsBlockhashValidResponse) String() string { func (*IsBlockhashValidResponse) ProtoMessage() {} func (x *IsBlockhashValidResponse) ProtoReflect() protoreflect.Message { - mi := &file_geyser_proto_msgTypes[31] + mi := &file_geyser_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2220,7 +2345,7 @@ func (x *IsBlockhashValidResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IsBlockhashValidResponse.ProtoReflect.Descriptor instead. func (*IsBlockhashValidResponse) Descriptor() ([]byte, []int) { - return file_geyser_proto_rawDescGZIP(), []int{31} + return file_geyser_proto_rawDescGZIP(), []int{33} } func (x *IsBlockhashValidResponse) GetSlot() uint64 { @@ -2242,7 +2367,7 @@ var File_geyser_proto protoreflect.FileDescriptor var file_geyser_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x1a, 0x14, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2d, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, 0x09, 0x0a, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe7, 0x09, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, @@ -2278,46 +2403,50 @@ var file_geyser_proto_rawDesc = []byte{ 0x29, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x52, 0x11, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x1a, 0x63, 0x0a, - 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x0a, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x6b, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5f, - 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x75, 0x6e, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, + 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x65, + 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x01, 0x52, 0x04, 0x70, 0x69, 0x6e, + 0x67, 0x88, 0x01, 0x01, 0x1a, 0x63, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x0a, 0x53, 0x6c, 0x6f, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, + 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6b, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x40, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5f, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x67, 0x0a, 0x0f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x65, 0x79, + 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x5d, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x67, 0x0a, 0x0f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, + 0x05, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x98, 0x01, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, @@ -2349,9 +2478,14 @@ var file_geyser_proto_rawDesc = []byte{ 0x73, 0x12, 0x18, 0x0a, 0x06, 0x62, 0x61, 0x73, 0x65, 0x35, 0x38, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x62, 0x61, 0x73, 0x65, 0x35, 0x38, 0x12, 0x18, 0x0a, 0x06, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x62, - 0x61, 0x73, 0x65, 0x36, 0x34, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1d, 0x0a, + 0x61, 0x73, 0x65, 0x36, 0x34, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6d, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0x9c, 0x02, 0x0a, + 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x14, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x12, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, + 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x9c, 0x02, 0x0a, 0x22, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, @@ -2397,277 +2531,285 @@ var file_geyser_proto_rawDesc = []byte{ 0x53, 0x6c, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0xd4, 0x03, 0x0a, 0x0f, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x31, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x05, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x65, 0x79, 0x73, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x26, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x87, 0x04, + 0x0a, 0x0f, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, + 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6c, + 0x6f, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x00, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x31, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x0a, 0x04, 0x70, + 0x6f, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x31, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0e, 0x0a, 0x0c, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x89, 0x01, 0x0a, - 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, - 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, - 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0x9a, 0x02, 0x0a, 0x1a, 0x53, 0x75, 0x62, + 0x74, 0x65, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x41, + 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x00, + 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0e, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x89, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, - 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x74, 0x78, 0x6e, - 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x0c, 0x74, 0x78, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x48, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x1a, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x76, 0x6f, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x56, 0x6f, 0x74, 0x65, - 0x12, 0x4c, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, + 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x75, 0x70, 0x22, 0x9a, 0x02, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x61, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x23, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0c, 0x74, + 0x78, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x22, 0x82, 0x01, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, + 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, + 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, + 0x74, 0x22, 0x85, 0x02, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, + 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, + 0x65, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xcd, 0x05, 0x0a, 0x14, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, - 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, - 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xcd, - 0x05, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x07, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x6f, 0x6c, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x07, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, - 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb4, - 0x03, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, - 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x55, 0x6e, 0x69, 0x78, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x6f, 0x6c, 0x61, + 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x6f, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x6c, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3c, + 0x0a, 0x1a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0c, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x36, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb4, 0x03, 0x0a, 0x18, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x6f, 0x6c, 0x61, + 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, - 0x4b, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x75, - 0x6d, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x1a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6e, 0x67, - 0x22, 0x23, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x50, 0x6f, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x68, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x55, + 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x48, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6e, 0x67, 0x22, 0x25, 0x0a, 0x13, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x23, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x50, 0x6f, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x68, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, + 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x35, 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x64, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0x5d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, + 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x35, 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x64, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, 0x79, - 0x73, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x5d, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x48, - 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, 0x0a, 0x17, - 0x49, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, - 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x18, 0x49, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, - 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2a, 0x3e, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x0d, 0x0a, 0x09, 0x50, - 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x49, 0x4e, - 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x02, 0x32, 0x93, 0x04, 0x0a, 0x06, 0x47, 0x65, 0x79, - 0x73, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x12, 0x18, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x65, 0x79, - 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x04, 0x50, 0x69, 0x6e, - 0x67, 0x12, 0x13, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, - 0x50, 0x6f, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x68, 0x61, 0x73, 0x68, 0x12, 0x21, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, - 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, - 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x1d, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x3c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x65, - 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x10, 0x49, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x12, 0x1f, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x34, - 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x70, 0x63, - 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2d, 0x67, 0x65, 0x79, 0x73, - 0x65, 0x72, 0x2d, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, + 0x0a, 0x17, 0x49, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x65, + 0x79, 0x73, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x18, 0x49, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, + 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2a, 0x3e, 0x0a, 0x0f, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x0d, 0x0a, + 0x09, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x46, + 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x02, 0x32, 0x93, 0x04, 0x0a, 0x06, 0x47, + 0x65, 0x79, 0x73, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x18, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, + 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x04, 0x50, + 0x69, 0x6e, 0x67, 0x12, 0x13, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, + 0x72, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x12, 0x21, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, + 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, + 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x65, 0x79, 0x73, + 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x68, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x51, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x16, 0x2e, + 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x57, 0x0a, 0x10, 0x49, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x12, 0x1f, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x49, 0x73, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x49, + 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, + 0x70, 0x63, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2d, 0x67, 0x65, + 0x79, 0x73, 0x65, 0x72, 0x2d, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2683,7 +2825,7 @@ func file_geyser_proto_rawDescGZIP() []byte { } var file_geyser_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_geyser_proto_msgTypes = make([]protoimpl.MessageInfo, 38) +var file_geyser_proto_msgTypes = make([]protoimpl.MessageInfo, 40) var file_geyser_proto_goTypes = []interface{}{ (CommitmentLevel)(0), // 0: geyser.CommitmentLevel (*SubscribeRequest)(nil), // 1: geyser.SubscribeRequest @@ -2696,101 +2838,105 @@ var file_geyser_proto_goTypes = []interface{}{ (*SubscribeRequestFilterBlocksMeta)(nil), // 8: geyser.SubscribeRequestFilterBlocksMeta (*SubscribeRequestFilterEntry)(nil), // 9: geyser.SubscribeRequestFilterEntry (*SubscribeRequestAccountsDataSlice)(nil), // 10: geyser.SubscribeRequestAccountsDataSlice - (*SubscribeUpdate)(nil), // 11: geyser.SubscribeUpdate - (*SubscribeUpdateAccount)(nil), // 12: geyser.SubscribeUpdateAccount - (*SubscribeUpdateAccountInfo)(nil), // 13: geyser.SubscribeUpdateAccountInfo - (*SubscribeUpdateSlot)(nil), // 14: geyser.SubscribeUpdateSlot - (*SubscribeUpdateTransaction)(nil), // 15: geyser.SubscribeUpdateTransaction - (*SubscribeUpdateTransactionInfo)(nil), // 16: geyser.SubscribeUpdateTransactionInfo - (*SubscribeUpdateBlock)(nil), // 17: geyser.SubscribeUpdateBlock - (*SubscribeUpdateBlockMeta)(nil), // 18: geyser.SubscribeUpdateBlockMeta - (*SubscribeUpdateEntry)(nil), // 19: geyser.SubscribeUpdateEntry - (*SubscribeUpdatePing)(nil), // 20: geyser.SubscribeUpdatePing - (*PingRequest)(nil), // 21: geyser.PingRequest - (*PongResponse)(nil), // 22: geyser.PongResponse - (*GetLatestBlockhashRequest)(nil), // 23: geyser.GetLatestBlockhashRequest - (*GetLatestBlockhashResponse)(nil), // 24: geyser.GetLatestBlockhashResponse - (*GetBlockHeightRequest)(nil), // 25: geyser.GetBlockHeightRequest - (*GetBlockHeightResponse)(nil), // 26: geyser.GetBlockHeightResponse - (*GetSlotRequest)(nil), // 27: geyser.GetSlotRequest - (*GetSlotResponse)(nil), // 28: geyser.GetSlotResponse - (*GetVersionRequest)(nil), // 29: geyser.GetVersionRequest - (*GetVersionResponse)(nil), // 30: geyser.GetVersionResponse - (*IsBlockhashValidRequest)(nil), // 31: geyser.IsBlockhashValidRequest - (*IsBlockhashValidResponse)(nil), // 32: geyser.IsBlockhashValidResponse - nil, // 33: geyser.SubscribeRequest.AccountsEntry - nil, // 34: geyser.SubscribeRequest.SlotsEntry - nil, // 35: geyser.SubscribeRequest.TransactionsEntry - nil, // 36: geyser.SubscribeRequest.BlocksEntry - nil, // 37: geyser.SubscribeRequest.BlocksMetaEntry - nil, // 38: geyser.SubscribeRequest.EntryEntry - (*Transaction)(nil), // 39: solana.storage.ConfirmedBlock.Transaction - (*TransactionStatusMeta)(nil), // 40: solana.storage.ConfirmedBlock.TransactionStatusMeta - (*Rewards)(nil), // 41: solana.storage.ConfirmedBlock.Rewards - (*UnixTimestamp)(nil), // 42: solana.storage.ConfirmedBlock.UnixTimestamp - (*BlockHeight)(nil), // 43: solana.storage.ConfirmedBlock.BlockHeight + (*SubscribeRequestPing)(nil), // 11: geyser.SubscribeRequestPing + (*SubscribeUpdate)(nil), // 12: geyser.SubscribeUpdate + (*SubscribeUpdateAccount)(nil), // 13: geyser.SubscribeUpdateAccount + (*SubscribeUpdateAccountInfo)(nil), // 14: geyser.SubscribeUpdateAccountInfo + (*SubscribeUpdateSlot)(nil), // 15: geyser.SubscribeUpdateSlot + (*SubscribeUpdateTransaction)(nil), // 16: geyser.SubscribeUpdateTransaction + (*SubscribeUpdateTransactionInfo)(nil), // 17: geyser.SubscribeUpdateTransactionInfo + (*SubscribeUpdateBlock)(nil), // 18: geyser.SubscribeUpdateBlock + (*SubscribeUpdateBlockMeta)(nil), // 19: geyser.SubscribeUpdateBlockMeta + (*SubscribeUpdateEntry)(nil), // 20: geyser.SubscribeUpdateEntry + (*SubscribeUpdatePing)(nil), // 21: geyser.SubscribeUpdatePing + (*SubscribeUpdatePong)(nil), // 22: geyser.SubscribeUpdatePong + (*PingRequest)(nil), // 23: geyser.PingRequest + (*PongResponse)(nil), // 24: geyser.PongResponse + (*GetLatestBlockhashRequest)(nil), // 25: geyser.GetLatestBlockhashRequest + (*GetLatestBlockhashResponse)(nil), // 26: geyser.GetLatestBlockhashResponse + (*GetBlockHeightRequest)(nil), // 27: geyser.GetBlockHeightRequest + (*GetBlockHeightResponse)(nil), // 28: geyser.GetBlockHeightResponse + (*GetSlotRequest)(nil), // 29: geyser.GetSlotRequest + (*GetSlotResponse)(nil), // 30: geyser.GetSlotResponse + (*GetVersionRequest)(nil), // 31: geyser.GetVersionRequest + (*GetVersionResponse)(nil), // 32: geyser.GetVersionResponse + (*IsBlockhashValidRequest)(nil), // 33: geyser.IsBlockhashValidRequest + (*IsBlockhashValidResponse)(nil), // 34: geyser.IsBlockhashValidResponse + nil, // 35: geyser.SubscribeRequest.AccountsEntry + nil, // 36: geyser.SubscribeRequest.SlotsEntry + nil, // 37: geyser.SubscribeRequest.TransactionsEntry + nil, // 38: geyser.SubscribeRequest.BlocksEntry + nil, // 39: geyser.SubscribeRequest.BlocksMetaEntry + nil, // 40: geyser.SubscribeRequest.EntryEntry + (*Transaction)(nil), // 41: solana.storage.ConfirmedBlock.Transaction + (*TransactionStatusMeta)(nil), // 42: solana.storage.ConfirmedBlock.TransactionStatusMeta + (*Rewards)(nil), // 43: solana.storage.ConfirmedBlock.Rewards + (*UnixTimestamp)(nil), // 44: solana.storage.ConfirmedBlock.UnixTimestamp + (*BlockHeight)(nil), // 45: solana.storage.ConfirmedBlock.BlockHeight } var file_geyser_proto_depIdxs = []int32{ - 33, // 0: geyser.SubscribeRequest.accounts:type_name -> geyser.SubscribeRequest.AccountsEntry - 34, // 1: geyser.SubscribeRequest.slots:type_name -> geyser.SubscribeRequest.SlotsEntry - 35, // 2: geyser.SubscribeRequest.transactions:type_name -> geyser.SubscribeRequest.TransactionsEntry - 36, // 3: geyser.SubscribeRequest.blocks:type_name -> geyser.SubscribeRequest.BlocksEntry - 37, // 4: geyser.SubscribeRequest.blocks_meta:type_name -> geyser.SubscribeRequest.BlocksMetaEntry - 38, // 5: geyser.SubscribeRequest.entry:type_name -> geyser.SubscribeRequest.EntryEntry + 35, // 0: geyser.SubscribeRequest.accounts:type_name -> geyser.SubscribeRequest.AccountsEntry + 36, // 1: geyser.SubscribeRequest.slots:type_name -> geyser.SubscribeRequest.SlotsEntry + 37, // 2: geyser.SubscribeRequest.transactions:type_name -> geyser.SubscribeRequest.TransactionsEntry + 38, // 3: geyser.SubscribeRequest.blocks:type_name -> geyser.SubscribeRequest.BlocksEntry + 39, // 4: geyser.SubscribeRequest.blocks_meta:type_name -> geyser.SubscribeRequest.BlocksMetaEntry + 40, // 5: geyser.SubscribeRequest.entry:type_name -> geyser.SubscribeRequest.EntryEntry 0, // 6: geyser.SubscribeRequest.commitment:type_name -> geyser.CommitmentLevel 10, // 7: geyser.SubscribeRequest.accounts_data_slice:type_name -> geyser.SubscribeRequestAccountsDataSlice - 3, // 8: geyser.SubscribeRequestFilterAccounts.filters:type_name -> geyser.SubscribeRequestFilterAccountsFilter - 4, // 9: geyser.SubscribeRequestFilterAccountsFilter.memcmp:type_name -> geyser.SubscribeRequestFilterAccountsFilterMemcmp - 12, // 10: geyser.SubscribeUpdate.account:type_name -> geyser.SubscribeUpdateAccount - 14, // 11: geyser.SubscribeUpdate.slot:type_name -> geyser.SubscribeUpdateSlot - 15, // 12: geyser.SubscribeUpdate.transaction:type_name -> geyser.SubscribeUpdateTransaction - 17, // 13: geyser.SubscribeUpdate.block:type_name -> geyser.SubscribeUpdateBlock - 20, // 14: geyser.SubscribeUpdate.ping:type_name -> geyser.SubscribeUpdatePing - 18, // 15: geyser.SubscribeUpdate.block_meta:type_name -> geyser.SubscribeUpdateBlockMeta - 19, // 16: geyser.SubscribeUpdate.entry:type_name -> geyser.SubscribeUpdateEntry - 13, // 17: geyser.SubscribeUpdateAccount.account:type_name -> geyser.SubscribeUpdateAccountInfo - 0, // 18: geyser.SubscribeUpdateSlot.status:type_name -> geyser.CommitmentLevel - 16, // 19: geyser.SubscribeUpdateTransaction.transaction:type_name -> geyser.SubscribeUpdateTransactionInfo - 39, // 20: geyser.SubscribeUpdateTransactionInfo.transaction:type_name -> solana.storage.ConfirmedBlock.Transaction - 40, // 21: geyser.SubscribeUpdateTransactionInfo.meta:type_name -> solana.storage.ConfirmedBlock.TransactionStatusMeta - 41, // 22: geyser.SubscribeUpdateBlock.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards - 42, // 23: geyser.SubscribeUpdateBlock.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp - 43, // 24: geyser.SubscribeUpdateBlock.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight - 16, // 25: geyser.SubscribeUpdateBlock.transactions:type_name -> geyser.SubscribeUpdateTransactionInfo - 13, // 26: geyser.SubscribeUpdateBlock.accounts:type_name -> geyser.SubscribeUpdateAccountInfo - 19, // 27: geyser.SubscribeUpdateBlock.entries:type_name -> geyser.SubscribeUpdateEntry - 41, // 28: geyser.SubscribeUpdateBlockMeta.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards - 42, // 29: geyser.SubscribeUpdateBlockMeta.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp - 43, // 30: geyser.SubscribeUpdateBlockMeta.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight - 0, // 31: geyser.GetLatestBlockhashRequest.commitment:type_name -> geyser.CommitmentLevel - 0, // 32: geyser.GetBlockHeightRequest.commitment:type_name -> geyser.CommitmentLevel - 0, // 33: geyser.GetSlotRequest.commitment:type_name -> geyser.CommitmentLevel - 0, // 34: geyser.IsBlockhashValidRequest.commitment:type_name -> geyser.CommitmentLevel - 2, // 35: geyser.SubscribeRequest.AccountsEntry.value:type_name -> geyser.SubscribeRequestFilterAccounts - 5, // 36: geyser.SubscribeRequest.SlotsEntry.value:type_name -> geyser.SubscribeRequestFilterSlots - 6, // 37: geyser.SubscribeRequest.TransactionsEntry.value:type_name -> geyser.SubscribeRequestFilterTransactions - 7, // 38: geyser.SubscribeRequest.BlocksEntry.value:type_name -> geyser.SubscribeRequestFilterBlocks - 8, // 39: geyser.SubscribeRequest.BlocksMetaEntry.value:type_name -> geyser.SubscribeRequestFilterBlocksMeta - 9, // 40: geyser.SubscribeRequest.EntryEntry.value:type_name -> geyser.SubscribeRequestFilterEntry - 1, // 41: geyser.Geyser.Subscribe:input_type -> geyser.SubscribeRequest - 21, // 42: geyser.Geyser.Ping:input_type -> geyser.PingRequest - 23, // 43: geyser.Geyser.GetLatestBlockhash:input_type -> geyser.GetLatestBlockhashRequest - 25, // 44: geyser.Geyser.GetBlockHeight:input_type -> geyser.GetBlockHeightRequest - 27, // 45: geyser.Geyser.GetSlot:input_type -> geyser.GetSlotRequest - 31, // 46: geyser.Geyser.IsBlockhashValid:input_type -> geyser.IsBlockhashValidRequest - 29, // 47: geyser.Geyser.GetVersion:input_type -> geyser.GetVersionRequest - 11, // 48: geyser.Geyser.Subscribe:output_type -> geyser.SubscribeUpdate - 22, // 49: geyser.Geyser.Ping:output_type -> geyser.PongResponse - 24, // 50: geyser.Geyser.GetLatestBlockhash:output_type -> geyser.GetLatestBlockhashResponse - 26, // 51: geyser.Geyser.GetBlockHeight:output_type -> geyser.GetBlockHeightResponse - 28, // 52: geyser.Geyser.GetSlot:output_type -> geyser.GetSlotResponse - 32, // 53: geyser.Geyser.IsBlockhashValid:output_type -> geyser.IsBlockhashValidResponse - 30, // 54: geyser.Geyser.GetVersion:output_type -> geyser.GetVersionResponse - 48, // [48:55] is the sub-list for method output_type - 41, // [41:48] is the sub-list for method input_type - 41, // [41:41] is the sub-list for extension type_name - 41, // [41:41] is the sub-list for extension extendee - 0, // [0:41] is the sub-list for field type_name + 11, // 8: geyser.SubscribeRequest.ping:type_name -> geyser.SubscribeRequestPing + 3, // 9: geyser.SubscribeRequestFilterAccounts.filters:type_name -> geyser.SubscribeRequestFilterAccountsFilter + 4, // 10: geyser.SubscribeRequestFilterAccountsFilter.memcmp:type_name -> geyser.SubscribeRequestFilterAccountsFilterMemcmp + 13, // 11: geyser.SubscribeUpdate.account:type_name -> geyser.SubscribeUpdateAccount + 15, // 12: geyser.SubscribeUpdate.slot:type_name -> geyser.SubscribeUpdateSlot + 16, // 13: geyser.SubscribeUpdate.transaction:type_name -> geyser.SubscribeUpdateTransaction + 18, // 14: geyser.SubscribeUpdate.block:type_name -> geyser.SubscribeUpdateBlock + 21, // 15: geyser.SubscribeUpdate.ping:type_name -> geyser.SubscribeUpdatePing + 22, // 16: geyser.SubscribeUpdate.pong:type_name -> geyser.SubscribeUpdatePong + 19, // 17: geyser.SubscribeUpdate.block_meta:type_name -> geyser.SubscribeUpdateBlockMeta + 20, // 18: geyser.SubscribeUpdate.entry:type_name -> geyser.SubscribeUpdateEntry + 14, // 19: geyser.SubscribeUpdateAccount.account:type_name -> geyser.SubscribeUpdateAccountInfo + 0, // 20: geyser.SubscribeUpdateSlot.status:type_name -> geyser.CommitmentLevel + 17, // 21: geyser.SubscribeUpdateTransaction.transaction:type_name -> geyser.SubscribeUpdateTransactionInfo + 41, // 22: geyser.SubscribeUpdateTransactionInfo.transaction:type_name -> solana.storage.ConfirmedBlock.Transaction + 42, // 23: geyser.SubscribeUpdateTransactionInfo.meta:type_name -> solana.storage.ConfirmedBlock.TransactionStatusMeta + 43, // 24: geyser.SubscribeUpdateBlock.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards + 44, // 25: geyser.SubscribeUpdateBlock.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp + 45, // 26: geyser.SubscribeUpdateBlock.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight + 17, // 27: geyser.SubscribeUpdateBlock.transactions:type_name -> geyser.SubscribeUpdateTransactionInfo + 14, // 28: geyser.SubscribeUpdateBlock.accounts:type_name -> geyser.SubscribeUpdateAccountInfo + 20, // 29: geyser.SubscribeUpdateBlock.entries:type_name -> geyser.SubscribeUpdateEntry + 43, // 30: geyser.SubscribeUpdateBlockMeta.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards + 44, // 31: geyser.SubscribeUpdateBlockMeta.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp + 45, // 32: geyser.SubscribeUpdateBlockMeta.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight + 0, // 33: geyser.GetLatestBlockhashRequest.commitment:type_name -> geyser.CommitmentLevel + 0, // 34: geyser.GetBlockHeightRequest.commitment:type_name -> geyser.CommitmentLevel + 0, // 35: geyser.GetSlotRequest.commitment:type_name -> geyser.CommitmentLevel + 0, // 36: geyser.IsBlockhashValidRequest.commitment:type_name -> geyser.CommitmentLevel + 2, // 37: geyser.SubscribeRequest.AccountsEntry.value:type_name -> geyser.SubscribeRequestFilterAccounts + 5, // 38: geyser.SubscribeRequest.SlotsEntry.value:type_name -> geyser.SubscribeRequestFilterSlots + 6, // 39: geyser.SubscribeRequest.TransactionsEntry.value:type_name -> geyser.SubscribeRequestFilterTransactions + 7, // 40: geyser.SubscribeRequest.BlocksEntry.value:type_name -> geyser.SubscribeRequestFilterBlocks + 8, // 41: geyser.SubscribeRequest.BlocksMetaEntry.value:type_name -> geyser.SubscribeRequestFilterBlocksMeta + 9, // 42: geyser.SubscribeRequest.EntryEntry.value:type_name -> geyser.SubscribeRequestFilterEntry + 1, // 43: geyser.Geyser.Subscribe:input_type -> geyser.SubscribeRequest + 23, // 44: geyser.Geyser.Ping:input_type -> geyser.PingRequest + 25, // 45: geyser.Geyser.GetLatestBlockhash:input_type -> geyser.GetLatestBlockhashRequest + 27, // 46: geyser.Geyser.GetBlockHeight:input_type -> geyser.GetBlockHeightRequest + 29, // 47: geyser.Geyser.GetSlot:input_type -> geyser.GetSlotRequest + 33, // 48: geyser.Geyser.IsBlockhashValid:input_type -> geyser.IsBlockhashValidRequest + 31, // 49: geyser.Geyser.GetVersion:input_type -> geyser.GetVersionRequest + 12, // 50: geyser.Geyser.Subscribe:output_type -> geyser.SubscribeUpdate + 24, // 51: geyser.Geyser.Ping:output_type -> geyser.PongResponse + 26, // 52: geyser.Geyser.GetLatestBlockhash:output_type -> geyser.GetLatestBlockhashResponse + 28, // 53: geyser.Geyser.GetBlockHeight:output_type -> geyser.GetBlockHeightResponse + 30, // 54: geyser.Geyser.GetSlot:output_type -> geyser.GetSlotResponse + 34, // 55: geyser.Geyser.IsBlockhashValid:output_type -> geyser.IsBlockhashValidResponse + 32, // 56: geyser.Geyser.GetVersion:output_type -> geyser.GetVersionResponse + 50, // [50:57] is the sub-list for method output_type + 43, // [43:50] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_geyser_proto_init() } @@ -2921,7 +3067,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdate); i { + switch v := v.(*SubscribeRequestPing); i { case 0: return &v.state case 1: @@ -2933,7 +3079,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateAccount); i { + switch v := v.(*SubscribeUpdate); i { case 0: return &v.state case 1: @@ -2945,7 +3091,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateAccountInfo); i { + switch v := v.(*SubscribeUpdateAccount); i { case 0: return &v.state case 1: @@ -2957,7 +3103,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateSlot); i { + switch v := v.(*SubscribeUpdateAccountInfo); i { case 0: return &v.state case 1: @@ -2969,7 +3115,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateTransaction); i { + switch v := v.(*SubscribeUpdateSlot); i { case 0: return &v.state case 1: @@ -2981,7 +3127,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateTransactionInfo); i { + switch v := v.(*SubscribeUpdateTransaction); i { case 0: return &v.state case 1: @@ -2993,7 +3139,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateBlock); i { + switch v := v.(*SubscribeUpdateTransactionInfo); i { case 0: return &v.state case 1: @@ -3005,7 +3151,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateBlockMeta); i { + switch v := v.(*SubscribeUpdateBlock); i { case 0: return &v.state case 1: @@ -3017,7 +3163,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdateEntry); i { + switch v := v.(*SubscribeUpdateBlockMeta); i { case 0: return &v.state case 1: @@ -3029,7 +3175,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeUpdatePing); i { + switch v := v.(*SubscribeUpdateEntry); i { case 0: return &v.state case 1: @@ -3041,7 +3187,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PingRequest); i { + switch v := v.(*SubscribeUpdatePing); i { case 0: return &v.state case 1: @@ -3053,7 +3199,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PongResponse); i { + switch v := v.(*SubscribeUpdatePong); i { case 0: return &v.state case 1: @@ -3065,7 +3211,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestBlockhashRequest); i { + switch v := v.(*PingRequest); i { case 0: return &v.state case 1: @@ -3077,7 +3223,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestBlockhashResponse); i { + switch v := v.(*PongResponse); i { case 0: return &v.state case 1: @@ -3089,7 +3235,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBlockHeightRequest); i { + switch v := v.(*GetLatestBlockhashRequest); i { case 0: return &v.state case 1: @@ -3101,7 +3247,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBlockHeightResponse); i { + switch v := v.(*GetLatestBlockhashResponse); i { case 0: return &v.state case 1: @@ -3113,7 +3259,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSlotRequest); i { + switch v := v.(*GetBlockHeightRequest); i { case 0: return &v.state case 1: @@ -3125,7 +3271,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSlotResponse); i { + switch v := v.(*GetBlockHeightResponse); i { case 0: return &v.state case 1: @@ -3137,7 +3283,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVersionRequest); i { + switch v := v.(*GetSlotRequest); i { case 0: return &v.state case 1: @@ -3149,7 +3295,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVersionResponse); i { + switch v := v.(*GetSlotResponse); i { case 0: return &v.state case 1: @@ -3161,7 +3307,7 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IsBlockhashValidRequest); i { + switch v := v.(*GetVersionRequest); i { case 0: return &v.state case 1: @@ -3173,6 +3319,30 @@ func file_geyser_proto_init() { } } file_geyser_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetVersionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_geyser_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IsBlockhashValidRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_geyser_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IsBlockhashValidResponse); i { case 0: return &v.state @@ -3196,30 +3366,32 @@ func file_geyser_proto_init() { (*SubscribeRequestFilterAccountsFilterMemcmp_Base58)(nil), (*SubscribeRequestFilterAccountsFilterMemcmp_Base64)(nil), } + file_geyser_proto_msgTypes[4].OneofWrappers = []interface{}{} file_geyser_proto_msgTypes[5].OneofWrappers = []interface{}{} file_geyser_proto_msgTypes[6].OneofWrappers = []interface{}{} - file_geyser_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_geyser_proto_msgTypes[11].OneofWrappers = []interface{}{ (*SubscribeUpdate_Account)(nil), (*SubscribeUpdate_Slot)(nil), (*SubscribeUpdate_Transaction)(nil), (*SubscribeUpdate_Block)(nil), (*SubscribeUpdate_Ping)(nil), + (*SubscribeUpdate_Pong)(nil), (*SubscribeUpdate_BlockMeta)(nil), (*SubscribeUpdate_Entry)(nil), } - file_geyser_proto_msgTypes[12].OneofWrappers = []interface{}{} file_geyser_proto_msgTypes[13].OneofWrappers = []interface{}{} - file_geyser_proto_msgTypes[22].OneofWrappers = []interface{}{} + file_geyser_proto_msgTypes[14].OneofWrappers = []interface{}{} file_geyser_proto_msgTypes[24].OneofWrappers = []interface{}{} file_geyser_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_geyser_proto_msgTypes[30].OneofWrappers = []interface{}{} + file_geyser_proto_msgTypes[28].OneofWrappers = []interface{}{} + file_geyser_proto_msgTypes[32].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_geyser_proto_rawDesc, NumEnums: 1, - NumMessages: 38, + NumMessages: 40, NumExtensions: 0, NumServices: 1, }, diff --git a/examples/golang/proto/solana-storage.pb.go b/examples/golang/proto/solana-storage.pb.go index fcbdb1cc..a6f02fff 100644 --- a/examples/golang/proto/solana-storage.pb.go +++ b/examples/golang/proto/solana-storage.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.19.6 // source: solana-storage.proto diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index af3f6f56..94b7b80d 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -1,28 +1,32 @@ [package] name = "yellowstone-grpc-client-simple" -version = "1.10.0+solana.1.16.16" -authors = ["Triton One"] -edition = "2021" +version = "1.11.0+solana.1.16.19" +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } +keywords = { workspace = true } publish = false [[bin]] name = "client" [dependencies] -anyhow = "1.0.62" -backoff = { version = "0.4.0", features = ["tokio"] } -bincode = "1.3.3" -bs58 = "0.4.0" -chrono = "0.4.26" -clap = { version = "4.3.0", features = ["cargo", "derive"] } -env_logger = "0.10.0" -futures = "0.3.24" -hex = "0.4.3" -log = { version = "0.4.14", features = ["std"] } -maplit = "1.0.2" -serde_json = "1.0.86" -solana-sdk = "=1.16.16" -solana-transaction-status = "=1.16.16" -tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "time"] } -yellowstone-grpc-client = { path = "../../yellowstone-grpc-client" } -yellowstone-grpc-proto = { path = "../../yellowstone-grpc-proto" } +anyhow = { workspace = true } +backoff = { workspace = true, features = ["tokio"] } +bincode = { workspace = true } +bs58 = { workspace = true } +chrono = { workspace = true } +clap = { workspace = true, features = ["derive"] } +env_logger = { workspace = true } +futures = { workspace = true } +hex = { workspace = true } +log = { workspace = true } +maplit = { workspace = true } +serde_json = { workspace = true } +solana-sdk = { workspace = true } +solana-transaction-status = { workspace = true } +tokio = { workspace = true } +yellowstone-grpc-client = { workspace = true } +yellowstone-grpc-proto = { workspace = true } diff --git a/examples/rust/src/bin/client.rs b/examples/rust/src/bin/client.rs index afb631e3..24764942 100644 --- a/examples/rust/src/bin/client.rs +++ b/examples/rust/src/bin/client.rs @@ -21,7 +21,8 @@ use { SubscribeRequestFilterAccountsFilter, SubscribeRequestFilterAccountsFilterMemcmp, SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, - SubscribeRequestFilterTransactions, SubscribeUpdateAccount, SubscribeUpdateTransaction, + SubscribeRequestFilterTransactions, SubscribeRequestPing, SubscribeUpdateAccount, + SubscribeUpdatePreviousAccountInfo, SubscribeUpdateTransaction, }, tonic::service::Interceptor, }, @@ -129,6 +130,10 @@ struct ActionSubscribe { #[clap(long)] slots: bool, + /// Filter slots by commitment + #[clap(long)] + slots_filter_by_commitment: bool, + /// Subscribe on transactions updates #[clap(long)] transactions: bool, @@ -184,6 +189,10 @@ struct ActionSubscribe { #[clap(long)] blocks_meta: bool, + /// Send ping in subscribe request + #[clap(long)] + ping: Option, + // Resubscribe (only to slots) after #[clap(long)] resub: Option, @@ -241,7 +250,12 @@ impl Action { let mut slots: SlotsFilterMap = HashMap::new(); if args.slots { - slots.insert("client".to_owned(), SubscribeRequestFilterSlots {}); + slots.insert( + "client".to_owned(), + SubscribeRequestFilterSlots { + filter_by_commitment: Some(args.slots_filter_by_commitment), + }, + ); } let mut transactions: TransactionsFilterMap = HashMap::new(); @@ -296,6 +310,8 @@ impl Action { } } + let ping = args.ping.map(|id| SubscribeRequestPing { id }); + Some(( SubscribeRequest { slots, @@ -306,6 +322,7 @@ impl Action { blocks_meta, commitment: commitment.map(|x| x as i32), accounts_data_slice, + ping, }, args.resub.unwrap_or(0), )) @@ -328,6 +345,7 @@ pub struct AccountPretty { data: String, write_version: u64, txn_signature: String, + previous_account_state: Option, } impl From for AccountPretty { @@ -336,6 +354,7 @@ impl From for AccountPretty { is_startup, slot, account, + previous_account_state, }: SubscribeUpdateAccount, ) -> Self { let account = account.expect("should be defined"); @@ -350,6 +369,29 @@ impl From for AccountPretty { data: hex::encode(account.data), write_version: account.write_version, txn_signature: bs58::encode(account.txn_signature.unwrap_or_default()).into_string(), + previous_account_state: previous_account_state.map(|acc| acc.into()), + } + } +} + +#[derive(Debug)] +#[allow(dead_code)] +pub struct PreviousStateAccountPretty { + lamports: u64, + owner: Pubkey, + executable: bool, + rent_epoch: u64, + data: String, +} + +impl From for PreviousStateAccountPretty { + fn from(account: SubscribeUpdatePreviousAccountInfo) -> Self { + Self { + lamports: account.lamports, + owner: Pubkey::try_from(account.owner).expect("valid pubkey"), + executable: account.executable, + rent_epoch: account.rent_epoch, + data: hex::encode(account.data), } } } @@ -550,7 +592,7 @@ async fn geyser_subscribe( counter += 1; if counter == resub { let mut new_slots: SlotsFilterMap = HashMap::new(); - new_slots.insert("client".to_owned(), SubscribeRequestFilterSlots {}); + new_slots.insert("client".to_owned(), SubscribeRequestFilterSlots::default()); subscribe_tx .send(SubscribeRequest { @@ -562,6 +604,7 @@ async fn geyser_subscribe( blocks_meta: HashMap::default(), commitment: None, accounts_data_slice: Vec::default(), + ping: None, }) .await .map_err(GeyserGrpcClientError::SubscribeSendError)?; diff --git a/examples/rust/src/bin/tx-blocktime.rs b/examples/rust/src/bin/tx-blocktime.rs index 6dac868e..f9051706 100644 --- a/examples/rust/src/bin/tx-blocktime.rs +++ b/examples/rust/src/bin/tx-blocktime.rs @@ -104,6 +104,7 @@ async fn main() -> anyhow::Result<()> { blocks_meta: hashmap! { "".to_owned() => SubscribeRequestFilterBlocksMeta {} }, commitment: Some(commitment as i32), accounts_data_slice: vec![], + ping: None, }) .await?; diff --git a/examples/typescript/src/client.ts b/examples/typescript/src/client.ts index 34f628f0..7ee1f6cd 100644 --- a/examples/typescript/src/client.ts +++ b/examples/typescript/src/client.ts @@ -92,6 +92,7 @@ async function subscribeCommand(client, args) { blocks: {}, blocksMeta: {}, accountsDataSlice: [], + ping: undefined, }; if (args.accounts) { const filters: SubscribeRequestFilterAccountsFilter[] = []; @@ -128,7 +129,9 @@ async function subscribeCommand(client, args) { } if (args.slots) { - request.slots.client = {}; + request.slots.client = { + filterByCommitment: args.slotsFilterByCommitment, + }; } if (args.transactions) { @@ -176,6 +179,10 @@ async function subscribeCommand(client, args) { } } + if (args.ping) { + request.ping = { id: args.ping }; + } + // Send subscribe request await new Promise((resolve, reject) => { stream.write(request, (err) => { @@ -272,6 +279,11 @@ function parseCommandLineArgs() { describe: "subscribe on slots updates", type: "boolean", }, + "slots-filter-by-commitment": { + default: false, + describe: "filter slot messages by commitment", + type: "boolean", + }, transactions: { default: false, describe: "subscribe on transactions updates", @@ -339,6 +351,11 @@ function parseCommandLineArgs() { description: "subscribe on block meta updates (without transactions)", type: "boolean", }, + ping: { + default: undefined, + description: "send ping request in subscribe", + type: "number" + } }); }) .demandCommand(1) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index e4eaafd7..e2b78409 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.69.0" +channel = "1.70.0" components = ["clippy", "rustfmt"] targets = [] profile = "minimal" diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index b5348a87..20b339ee 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,6 +1,6 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "0.2.1", + "version": "0.3.0", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", diff --git a/yellowstone-grpc-client/Cargo.toml b/yellowstone-grpc-client/Cargo.toml index 6b0daed8..f7f4deb9 100644 --- a/yellowstone-grpc-client/Cargo.toml +++ b/yellowstone-grpc-client/Cargo.toml @@ -1,22 +1,23 @@ [package] name = "yellowstone-grpc-client" -version = "1.11.1+solana.1.16.16" -authors = ["Triton One"] -edition = "2021" +version = "1.12.0+solana.1.16.19" +authors = { workspace = true } +edition = { workspace = true } description = "Yellowstone gRPC Geyser Simple Client" -homepage = "https://triton.one" -repository = "https://github.com/rpcpool/yellowstone-grpc" -license = "Apache-2.0" -keywords = ["solana"] +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } +keywords = { workspace = true } +publish = true [dependencies] -bytes = "1.3.0" -futures = "0.3.24" -http = "0.2.8" -thiserror = "1.0" -tonic = { version = "0.10.2", features = ["gzip", "tls", "tls-roots"] } -tonic-health = "0.10.2" -yellowstone-grpc-proto = { path = "../yellowstone-grpc-proto", version = "1.10.0+solana.1.16.16" } +bytes = { workspace = true } +futures = { workspace = true } +http = { workspace = true } +thiserror ={ workspace = true } +tonic = { workspace = true, features = ["tls", "tls-roots"] } +tonic-health = { workspace = true } +yellowstone-grpc-proto = { workspace = true } [dev-dependencies] -tokio = { version = "1.32.0", features = ["macros"] } +tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } diff --git a/yellowstone-grpc-client/src/lib.rs b/yellowstone-grpc-client/src/lib.rs index c2e6d19e..99e71f1c 100644 --- a/yellowstone-grpc-client/src/lib.rs +++ b/yellowstone-grpc-client/src/lib.rs @@ -23,7 +23,7 @@ use { SubscribeRequest, SubscribeRequestAccountsDataSlice, SubscribeRequestFilterAccounts, SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, - SubscribeRequestFilterTransactions, SubscribeUpdate, + SubscribeRequestFilterTransactions, SubscribeRequestPing, SubscribeUpdate, }, }; @@ -190,6 +190,7 @@ impl GeyserGrpcClient { blocks_meta: HashMap, commitment: Option, accounts_data_slice: Vec, + ping: Option, ) -> GeyserGrpcClientResult>> { self.subscribe_once2(SubscribeRequest { slots, @@ -200,6 +201,7 @@ impl GeyserGrpcClient { blocks_meta, commitment: commitment.map(|value| value as i32), accounts_data_slice, + ping, }) .await } diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index 015216eb..a9f95b19 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -1,9 +1,13 @@ [package] name = "yellowstone-grpc-geyser" -version = "1.10.0+solana.1.16.16" -authors = ["Triton One"] -edition = "2021" +version = "1.11.1+solana.1.16.19" +authors = { workspace = true } +edition = { workspace = true } description = "Yellowstone gRPC Geyser Plugin" +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } +keywords = { workspace = true } publish = false [lib] @@ -13,32 +17,32 @@ crate-type = ["cdylib", "rlib"] name = "config-check" [dependencies] -anyhow = "1.0.62" -base64 = "0.21.0" -bincode = "1.3.3" -bs58 = "0.4.0" -clap = { version = "4.3.24", features = ["cargo", "derive"] } -crossbeam-channel = "0.5.8" -futures = "0.3.24" -hyper = { version = "0.14.20", features = ["server"] } -lazy_static = "1.4.0" -log = "0.4.17" -prometheus = "0.13.2" -serde = { version = "1.0.145", features = ["derive"] } -serde_json = "1.0.86" -solana-geyser-plugin-interface = "=1.16.16" -solana-logger = "=1.16.16" -solana-sdk = "=1.16.16" -solana-transaction-status = "=1.16.16" -spl-token-2022 = "0.9.0" -tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "time", "fs"] } -tokio-stream = "0.1.11" -tonic = { version = "0.10.2", features = ["gzip", "tls", "tls-roots"] } -tonic-health = "0.10.2" -yellowstone-grpc-proto = { path = "../yellowstone-grpc-proto" } +anyhow = { workspace = true } +base64 = { workspace = true } +bincode = { workspace = true } +bs58 = { workspace = true } +clap = { workspace = true, features = ["derive"] } +crossbeam-channel = { workspace = true } +futures = { workspace = true } +hyper = { workspace = true } +lazy_static = { workspace = true } +log = { workspace = true } +prometheus = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +solana-geyser-plugin-interface = { workspace = true } +solana-logger = { workspace = true } +solana-sdk = { workspace = true } +solana-transaction-status = { workspace = true } +spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } +tokio = { workspace = true, features = ["rt-multi-thread", "macros", "fs"] } +tokio-stream = { workspace = true } +tonic = { workspace = true, features = ["gzip", "tls", "tls-roots"] } +tonic-health = { workspace = true } +yellowstone-grpc-proto = { workspace = true } [build-dependencies] -anyhow = "1.0.62" -cargo-lock = "9.0.0" -git-version = "0.3.5" -vergen = { version = "8.2.1", features = ["build", "rustc"] } +anyhow = { workspace = true } +cargo-lock = { workspace = true } +git-version = { workspace = true } +vergen = { workspace = true, features = ["build", "rustc"] } diff --git a/yellowstone-grpc-geyser/src/filters.rs b/yellowstone-grpc-geyser/src/filters.rs index e344eabf..fd689479 100644 --- a/yellowstone-grpc-geyser/src/filters.rs +++ b/yellowstone-grpc-geyser/src/filters.rs @@ -21,11 +21,11 @@ use { yellowstone_grpc_proto::prelude::{ subscribe_request_filter_accounts_filter::Filter as AccountsFilterDataOneof, subscribe_request_filter_accounts_filter_memcmp::Data as AccountsFilterMemcmpOneof, - CommitmentLevel, SubscribeRequest, SubscribeRequestAccountsDataSlice, - SubscribeRequestFilterAccounts, SubscribeRequestFilterAccountsFilter, - SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, - SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, - SubscribeRequestFilterTransactions, SubscribeUpdate, + subscribe_update::UpdateOneof, CommitmentLevel, SubscribeRequest, + SubscribeRequestAccountsDataSlice, SubscribeRequestFilterAccounts, + SubscribeRequestFilterAccountsFilter, SubscribeRequestFilterBlocks, + SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, + SubscribeRequestFilterTransactions, SubscribeUpdate, SubscribeUpdatePong, }, }; @@ -39,6 +39,7 @@ pub struct Filter { blocks_meta: FilterBlocksMeta, commitment: CommitmentLevel, accounts_data_slice: Vec, + ping: Option, } impl Filter { @@ -52,6 +53,7 @@ impl Filter { blocks_meta: FilterBlocksMeta::new(&config.blocks_meta, &limit.blocks_meta)?, commitment: Self::decode_commitment(config.commitment)?, accounts_data_slice: FilterAccountsDataSlice::create(&config.accounts_data_slice)?, + ping: config.ping.as_ref().map(|msg| msg.id), }) } @@ -82,10 +84,14 @@ impl Filter { self.commitment } - pub fn get_filters<'a>(&self, message: &'a Message) -> Vec<(Vec, MessageRef<'a>)> { + pub fn get_filters<'a>( + &self, + message: &'a Message, + commitment: Option, + ) -> Vec<(Vec, MessageRef<'a>)> { match message { Message::Account(message) => self.accounts.get_filters(message), - Message::Slot(message) => self.slots.get_filters(message), + Message::Slot(message) => self.slots.get_filters(message, commitment), Message::Transaction(message) => self.transactions.get_filters(message), Message::Entry(message) => self.entry.get_filters(message), Message::Block(message) => self.blocks.get_filters(message), @@ -93,8 +99,12 @@ impl Filter { } } - pub fn get_update(&self, message: &Message) -> Vec { - self.get_filters(message) + pub fn get_update( + &self, + message: &Message, + commitment: Option, + ) -> Vec { + self.get_filters(message, commitment) .into_iter() .filter_map(|(filters, message)| { if filters.is_empty() { @@ -108,6 +118,13 @@ impl Filter { }) .collect() } + + pub fn get_pong_msg(&self) -> Option { + self.ping.map(|id| SubscribeUpdate { + filters: vec![], + update_oneof: Some(UpdateOneof::Pong(SubscribeUpdatePong { id })), + }) + } } #[derive(Debug, Default, Clone)] @@ -178,6 +195,11 @@ impl FilterAccounts { let mut filter = FilterAccountsMatch::new(self); filter.match_account(&message.account.pubkey); filter.match_owner(&message.account.owner); + if let Some(ref previous_account) = message.previous_account_state { + if message.account.owner != previous_account.owner { + filter.match_owner(&previous_account.owner); + } + } filter.match_data(&message.account.data); vec![(filter.get_filters(), MessageRef::Account(message))] } @@ -336,9 +358,22 @@ impl<'a> FilterAccountsMatch<'a> { } } +#[derive(Debug, Default, Clone, Copy)] +struct FilterSlotsInner { + filter_by_commitment: bool, +} + +impl FilterSlotsInner { + fn new(filter: &SubscribeRequestFilterSlots) -> Self { + Self { + filter_by_commitment: filter.filter_by_commitment.unwrap_or_default(), + } + } +} + #[derive(Debug, Default, Clone)] struct FilterSlots { - filters: Vec, + filters: HashMap, } impl FilterSlots { @@ -351,14 +386,29 @@ impl FilterSlots { Ok(Self { filters: configs .iter() - // .filter_map(|(name, _filter)| Some(name.clone())) - .map(|(name, _filter)| name.clone()) + .map(|(name, filter)| (name.clone(), FilterSlotsInner::new(filter))) .collect(), }) } - fn get_filters<'a>(&self, message: &'a MessageSlot) -> Vec<(Vec, MessageRef<'a>)> { - vec![(self.filters.clone(), MessageRef::Slot(message))] + fn get_filters<'a>( + &self, + message: &'a MessageSlot, + commitment: Option, + ) -> Vec<(Vec, MessageRef<'a>)> { + vec![( + self.filters + .iter() + .filter_map(|(name, inner)| { + if !inner.filter_by_commitment || commitment == Some(message.status) { + Some(name.clone()) + } else { + None + } + }) + .collect(), + MessageRef::Slot(message), + )] } } @@ -720,6 +770,20 @@ impl FilterAccountsDataSlice { Ok(slices) } + pub fn filter_data(accounts_data_slice: &[FilterAccountsDataSlice], data: &[u8]) -> Vec { + if accounts_data_slice.is_empty() { + data.to_vec() + } else { + let mut new_data = + Vec::with_capacity(accounts_data_slice.iter().map(|ds| ds.length).sum()); + for data_slice in accounts_data_slice { + if data.len() >= data_slice.end { + new_data.extend_from_slice(&data[data_slice.start..data_slice.end]); + } + } + new_data + } + } } #[cfg(test)] @@ -800,6 +864,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let limit = ConfigGrpcFilters::default(); let filter = Filter::new(&config, &limit); @@ -828,6 +893,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let mut limit = ConfigGrpcFilters::default(); limit.accounts.any = false; @@ -861,6 +927,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let mut limit = ConfigGrpcFilters::default(); limit.transactions.any = false; @@ -893,6 +960,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let mut limit = ConfigGrpcFilters::default(); limit.transactions.any = false; @@ -931,6 +999,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let limit = ConfigGrpcFilters::default(); let filter = Filter::new(&config, &limit).unwrap(); @@ -938,7 +1007,7 @@ mod tests { let message_transaction = create_message_transaction(&keypair_b, vec![account_key_b, account_key_a]); let message = Message::Transaction(message_transaction); - for (filters, _message) in filter.get_filters(&message) { + for (filters, _message) in filter.get_filters(&message, None) { assert!(!filters.is_empty()); } } @@ -973,6 +1042,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let limit = ConfigGrpcFilters::default(); let filter = Filter::new(&config, &limit).unwrap(); @@ -980,7 +1050,7 @@ mod tests { let message_transaction = create_message_transaction(&keypair_b, vec![account_key_b, account_key_a]); let message = Message::Transaction(message_transaction); - for (filters, _message) in filter.get_filters(&message) { + for (filters, _message) in filter.get_filters(&message, None) { assert!(!filters.is_empty()); } } @@ -1015,6 +1085,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let limit = ConfigGrpcFilters::default(); let filter = Filter::new(&config, &limit).unwrap(); @@ -1022,7 +1093,7 @@ mod tests { let message_transaction = create_message_transaction(&keypair_b, vec![account_key_b, account_key_a]); let message = Message::Transaction(message_transaction); - for (filters, _message) in filter.get_filters(&message) { + for (filters, _message) in filter.get_filters(&message, None) { assert!(filters.is_empty()); } } @@ -1063,6 +1134,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let limit = ConfigGrpcFilters::default(); let filter = Filter::new(&config, &limit).unwrap(); @@ -1072,7 +1144,7 @@ mod tests { vec![account_key_x, account_key_y, account_key_z], ); let message = Message::Transaction(message_transaction); - for (filters, _message) in filter.get_filters(&message) { + for (filters, _message) in filter.get_filters(&message, None) { assert!(!filters.is_empty()); } } @@ -1113,6 +1185,7 @@ mod tests { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }; let limit = ConfigGrpcFilters::default(); let filter = Filter::new(&config, &limit).unwrap(); @@ -1120,7 +1193,7 @@ mod tests { let message_transaction = create_message_transaction(&keypair_x, vec![account_key_x, account_key_z]); let message = Message::Transaction(message_transaction); - for (filters, _message) in filter.get_filters(&message) { + for (filters, _message) in filter.get_filters(&message, None) { assert!(filters.is_empty()); } } diff --git a/yellowstone-grpc-geyser/src/grpc.rs b/yellowstone-grpc-geyser/src/grpc.rs index a7e36d26..61f77bc1 100644 --- a/yellowstone-grpc-geyser/src/grpc.rs +++ b/yellowstone-grpc-geyser/src/grpc.rs @@ -7,8 +7,8 @@ use { }, log::{error, info}, solana_geyser_plugin_interface::geyser_plugin_interface::{ - ReplicaAccountInfoV3, ReplicaBlockInfoV3, ReplicaEntryInfo, ReplicaTransactionInfoV2, - SlotStatus, + ReplicaAccountInfoV3, ReplicaAccountInfoV4, ReplicaBlockInfoV2, ReplicaEntryInfo, + ReplicaTransactionInfoV2, SlotStatus, }, solana_sdk::{ clock::{UnixTimestamp, MAX_RECENT_BLOCKHASHES}, @@ -50,11 +50,37 @@ use { IsBlockhashValidResponse, PingRequest, PongResponse, SubscribeRequest, SubscribeUpdate, SubscribeUpdateAccount, SubscribeUpdateAccountInfo, SubscribeUpdateBlock, SubscribeUpdateBlockMeta, SubscribeUpdateEntry, SubscribeUpdatePing, - SubscribeUpdateSlot, SubscribeUpdateTransaction, SubscribeUpdateTransactionInfo, + SubscribeUpdatePreviousAccountInfo, SubscribeUpdateSlot, SubscribeUpdateTransaction, + SubscribeUpdateTransactionInfo, }, }, }; +#[derive(Debug, Clone)] +pub struct MessagePreviousAccountInfo { + pub lamports: u64, + pub owner: Pubkey, + pub executable: bool, + pub rent_epoch: u64, + pub data: Vec, +} + +impl MessagePreviousAccountInfo { + fn to_proto( + &self, + accounts_data_slice: &[FilterAccountsDataSlice], + ) -> SubscribeUpdatePreviousAccountInfo { + let data = FilterAccountsDataSlice::filter_data(accounts_data_slice, &self.data); + SubscribeUpdatePreviousAccountInfo { + lamports: self.lamports, + owner: self.owner.as_ref().into(), + executable: self.executable, + rent_epoch: self.rent_epoch, + data, + } + } +} + #[derive(Debug, Clone)] pub struct MessageAccountInfo { pub pubkey: Pubkey, @@ -101,6 +127,7 @@ pub struct MessageAccount { pub account: MessageAccountInfo, pub slot: u64, pub is_startup: bool, + pub previous_account_state: Option, } impl<'a> From<(&'a ReplicaAccountInfoV3<'a>, u64, bool)> for MessageAccount { @@ -118,6 +145,34 @@ impl<'a> From<(&'a ReplicaAccountInfoV3<'a>, u64, bool)> for MessageAccount { }, slot, is_startup, + previous_account_state: None, + } + } +} +impl<'a> From<(&'a ReplicaAccountInfoV4<'a>, u64, bool)> for MessageAccount { + fn from((account, slot, is_startup): (&'a ReplicaAccountInfoV4<'a>, u64, bool)) -> Self { + Self { + account: MessageAccountInfo { + pubkey: Pubkey::try_from(account.pubkey).expect("valid Pubkey"), + lamports: account.lamports, + owner: Pubkey::try_from(account.owner).expect("valid Pubkey"), + executable: account.executable, + rent_epoch: account.rent_epoch, + data: account.data.into(), + write_version: account.write_version, + txn_signature: account.txn.map(|txn| *txn.signature()), + }, + previous_account_state: account.previous_account_state.as_ref().map( + |previous_account| MessagePreviousAccountInfo { + lamports: previous_account.lamports, + owner: Pubkey::try_from(previous_account.owner).expect("valid Pubkey"), + executable: previous_account.executable, + rent_epoch: previous_account.rent_epoch, + data: previous_account.data.into(), + }, + ), + slot, + is_startup, } } } @@ -279,11 +334,10 @@ pub struct MessageBlockMeta { pub block_time: Option, pub block_height: Option, pub executed_transaction_count: u64, - pub entries_count: u64, } -impl<'a> From<&'a ReplicaBlockInfoV3<'a>> for MessageBlockMeta { - fn from(blockinfo: &'a ReplicaBlockInfoV3<'a>) -> Self { +impl<'a> From<&'a ReplicaBlockInfoV2<'a>> for MessageBlockMeta { + fn from(blockinfo: &'a ReplicaBlockInfoV2<'a>) -> Self { Self { parent_slot: blockinfo.parent_slot, slot: blockinfo.slot, @@ -293,7 +347,6 @@ impl<'a> From<&'a ReplicaBlockInfoV3<'a>> for MessageBlockMeta { block_time: blockinfo.block_time, block_height: blockinfo.block_height, executed_transaction_count: blockinfo.executed_transaction_count, - entries_count: blockinfo.entry_count, } } } @@ -407,6 +460,10 @@ impl<'a> MessageRef<'a> { account: Some(message.account.to_proto(accounts_data_slice)), slot: message.slot, is_startup: message.is_startup, + previous_account_state: message + .previous_account_state + .as_ref() + .map(|acc| acc.to_proto(accounts_data_slice)), }), Self::Transaction(message) => UpdateOneof::Transaction(SubscribeUpdateTransaction { transaction: Some(message.transaction.to_proto()), @@ -636,6 +693,7 @@ struct SlotMessages { accounts_dedup: HashMap, // (write_version, message_index) entries: Vec, sealed: bool, + entries_count: usize, confirmed_at: Option, finalized_at: Option, } @@ -644,11 +702,14 @@ impl SlotMessages { pub fn try_seal(&mut self) -> Option { if !self.sealed { if let Some(block_meta) = &self.block_meta { - if self.transactions.len() == block_meta.executed_transaction_count as usize - && self.entries.len() == block_meta.entries_count as usize - { + let executed_transaction_count = block_meta.executed_transaction_count as usize; + + // Additional check `entries_count == 0` due to bug of zero entries on block produced by validator + // See GitHub issue: https://github.com/solana-labs/solana/issues/33823 + if self.transactions.len() == executed_transaction_count { let transactions = std::mem::take(&mut self.transactions); - let entries = std::mem::take(&mut self.entries); + let mut entries = std::mem::take(&mut self.entries); + entries.clear(); let mut accounts = Vec::with_capacity(self.messages.len()); for item in self.messages.iter().flatten() { @@ -828,12 +889,6 @@ impl GrpcService { reasons.push("InvalidTxnCount"); error!("failed to reconstruct #{slot} -- tx count: {block_txn_count} vs {msg_txn_count}"); } - let block_entries_count = block_meta.entries_count as usize; - let msg_entries_count = slot_messages.entries.len(); - if block_entries_count != msg_entries_count { - reasons.push("InvalidEntriesCount"); - error!("failed to reconstruct #{slot} -- entries count: {block_entries_count} vs {msg_entries_count}"); - } } else { reasons.push("NoBlockMeta"); } @@ -865,7 +920,7 @@ impl GrpcService { slot_messages.messages.push(Some(message.clone())); // If we already build Block message, new message will be a problem - if slot_messages.sealed { + if slot_messages.sealed && !(matches!(message, Message::Entry(_)) && slot_messages.entries_count == 0) { prom::update_invalid_blocks(format!("unexpected message {}", message.kind())); match block_fail_action { ConfigBlockFailAction::Log => { @@ -1049,18 +1104,29 @@ impl GrpcService { info!("client #{id}: going to receive snapshot data"); // we start with default filter, for snapshot we need wait actual filter first - match client_rx.recv().await { - Some(Some(filter_new)) => { - filter = filter_new; - info!("client #{id}: filter updated"); - } - Some(None) => { - is_alive = false; - } - None => { - is_alive = false; - } - }; + while is_alive { + match client_rx.recv().await { + Some(Some(filter_new)) => { + if let Some(msg) = filter_new.get_pong_msg() { + if stream_tx.send(Ok(msg)).await.is_err() { + error!("client #{id}: stream closed"); + is_alive = false; + break; + } + continue; + } + + filter = filter_new; + info!("client #{id}: filter updated"); + } + Some(None) => { + is_alive = false; + } + None => { + is_alive = false; + } + }; + } while is_alive { let message = match snapshot_rx.try_recv() { @@ -1082,7 +1148,7 @@ impl GrpcService { } }; - for message in filter.get_update(&message) { + for message in filter.get_update(&message, None) { if stream_tx.send(Ok(message)).await.is_err() { error!("client #{id}: stream closed"); is_alive = false; @@ -1098,6 +1164,14 @@ impl GrpcService { message = client_rx.recv() => { match message { Some(Some(filter_new)) => { + if let Some(msg) = filter_new.get_pong_msg() { + if stream_tx.send(Ok(msg)).await.is_err() { + error!("client #{id}: stream closed"); + break 'outer; + } + continue; + } + filter = filter_new; info!("client #{id}: filter updated"); } @@ -1126,7 +1200,7 @@ impl GrpcService { if commitment == filter.get_commitment_level() { for message in messages.iter() { - for message in filter.get_update(message) { + for message in filter.get_update(message, Some(commitment)) { match stream_tx.try_send(Ok(message)) { Ok(()) => {} Err(mpsc::error::TrySendError::Full(_)) => { @@ -1163,7 +1237,7 @@ impl Geyser for GrpcService { &self, mut request: Request>, ) -> TonicResult> { - let id = self.subscribe_id.fetch_add(1, Ordering::SeqCst); + let id = self.subscribe_id.fetch_add(1, Ordering::Relaxed); let filter = Filter::new( &SubscribeRequest { accounts: HashMap::new(), @@ -1174,6 +1248,7 @@ impl Geyser for GrpcService { entry: HashMap::new(), commitment: None, accounts_data_slice: Vec::new(), + ping: None, }, &self.config.filters, ) diff --git a/yellowstone-grpc-geyser/src/plugin.rs b/yellowstone-grpc-geyser/src/plugin.rs index d01c3e10..e8ad76af 100644 --- a/yellowstone-grpc-geyser/src/plugin.rs +++ b/yellowstone-grpc-geyser/src/plugin.rs @@ -9,26 +9,16 @@ use { ReplicaEntryInfoVersions, ReplicaTransactionInfoVersions, Result as PluginResult, SlotStatus, }, - std::{ - sync::{ - atomic::{AtomicU8, Ordering}, - Arc, - }, - time::Duration, - }, + std::{sync::Arc, time::Duration}, tokio::{ runtime::Runtime, sync::{mpsc, Notify}, }, }; -const STARTUP_END_OF_RECEIVED: u8 = 1 << 0; -const STARTUP_PROCESSED_RECEIVED: u8 = 1 << 1; - #[derive(Debug)] pub struct PluginInner { runtime: Runtime, - startup_status: AtomicU8, snapshot_channel: Option>>, grpc_channel: mpsc::UnboundedSender, grpc_shutdown: Arc, @@ -53,15 +43,8 @@ impl Plugin { where F: FnOnce(&PluginInner) -> PluginResult<()>, { - // Full block reconstruction will fail before first processed slot received let inner = self.inner.as_ref().expect("initialized"); - if inner.startup_status.load(Ordering::SeqCst) - == STARTUP_END_OF_RECEIVED | STARTUP_PROCESSED_RECEIVED - { - f(inner) - } else { - Ok(()) - } + f(inner) } } @@ -97,7 +80,6 @@ impl GeyserPlugin for Plugin { self.inner = Some(PluginInner { runtime, - startup_status: AtomicU8::new(0), snapshot_channel, grpc_channel, grpc_shutdown, @@ -122,49 +104,44 @@ impl GeyserPlugin for Plugin { slot: u64, is_startup: bool, ) -> PluginResult<()> { - let account = match account { - ReplicaAccountInfoVersions::V0_0_1(_info) => { - unreachable!("ReplicaAccountInfoVersions::V0_0_1 is not supported") - } - ReplicaAccountInfoVersions::V0_0_2(_info) => { - unreachable!("ReplicaAccountInfoVersions::V0_0_2 is not supported") - } - ReplicaAccountInfoVersions::V0_0_3(info) => info, - }; - let message = Message::Account((account, slot, is_startup).into()); + self.with_inner(|inner| { + let account = match account { + ReplicaAccountInfoVersions::V0_0_1(_info) => { + unreachable!("ReplicaAccountInfoVersions::V0_0_1 is not supported") + } + ReplicaAccountInfoVersions::V0_0_2(_info) => { + unreachable!("ReplicaAccountInfoVersions::V0_0_2 is not supported") + } + ReplicaAccountInfoVersions::V0_0_3(info) => (info, slot, is_startup).into(), + ReplicaAccountInfoVersions::V0_0_4(info) => (info, slot, is_startup).into(), + }; - if is_startup { - let inner = self.inner.as_ref().expect("initialized"); - if let Some(channel) = &inner.snapshot_channel { - match channel.send(Some(message)) { - Ok(()) => MESSAGE_QUEUE_SIZE.inc(), - Err(_) => panic!("failed to send message to startup queue: channel closed"), + let message = Message::Account(account); + if is_startup { + if let Some(channel) = &inner.snapshot_channel { + match channel.send(Some(message)) { + Ok(()) => MESSAGE_QUEUE_SIZE.inc(), + Err(_) => panic!("failed to send message to startup queue: channel closed"), + } } + } else { + inner.send_message(message); } + Ok(()) - } else { - self.with_inner(|inner| { - inner.send_message(message); - Ok(()) - }) - } + }) } fn notify_end_of_startup(&self) -> PluginResult<()> { - let inner = self.inner.as_ref().expect("initialized"); - - if let Some(channel) = &inner.snapshot_channel { - match channel.send(None) { - Ok(()) => MESSAGE_QUEUE_SIZE.inc(), - Err(_) => panic!("failed to send message to startup queue: channel closed"), + self.with_inner(|inner| { + if let Some(channel) = &inner.snapshot_channel { + match channel.send(None) { + Ok(()) => MESSAGE_QUEUE_SIZE.inc(), + Err(_) => panic!("failed to send message to startup queue: channel closed"), + } } - } - - inner - .startup_status - .fetch_or(STARTUP_END_OF_RECEIVED, Ordering::SeqCst); - - Ok(()) + Ok(()) + }) } fn update_slot_status( @@ -173,20 +150,10 @@ impl GeyserPlugin for Plugin { parent: Option, status: SlotStatus, ) -> PluginResult<()> { - let inner = self.inner.as_ref().expect("initialized"); - if inner.startup_status.load(Ordering::SeqCst) == STARTUP_END_OF_RECEIVED - && status == SlotStatus::Processed - { - inner - .startup_status - .fetch_or(STARTUP_PROCESSED_RECEIVED, Ordering::SeqCst); - } - self.with_inner(|inner| { let message = Message::Slot((slot, parent, status).into()); inner.send_message(message); prom::update_slot_status(status, slot); - Ok(()) }) } @@ -231,10 +198,7 @@ impl GeyserPlugin for Plugin { ReplicaBlockInfoVersions::V0_0_1(_info) => { unreachable!("ReplicaBlockInfoVersions::V0_0_1 is not supported") } - ReplicaBlockInfoVersions::V0_0_2(_info) => { - unreachable!("ReplicaBlockInfoVersions::V0_0_2 is not supported") - } - ReplicaBlockInfoVersions::V0_0_3(info) => info, + ReplicaBlockInfoVersions::V0_0_2(info) => info, }; let message = Message::BlockMeta(blockinfo.into()); @@ -255,6 +219,10 @@ impl GeyserPlugin for Plugin { fn entry_notifications_enabled(&self) -> bool { true } + + // fn enable_pre_trasaction_execution_accounts_data(&self) -> bool { + // true + // } } #[no_mangle] diff --git a/yellowstone-grpc-kafka/Cargo.toml b/yellowstone-grpc-kafka/Cargo.toml deleted file mode 100644 index b91d2f16..00000000 --- a/yellowstone-grpc-kafka/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "yellowstone-grpc-kafka" -version = "1.0.0-rc.3+solana.1.16.16" -authors = ["Triton One"] -edition = "2021" -description = "Yellowstone gRPC Kafka Producer/Dedup/Consumer" -publish = false - -[dependencies] -anyhow = "1.0.62" -async-trait = "0.1.73" -atty = "0.2.14" -clap = { version = "4.3.0", features = ["cargo", "derive"] } -const-hex = "1.6.2" -futures = "0.3.24" -hyper = { version = "0.14.27", features = ["server"] } -json5 = "0.4.1" -lazy_static = "1.4.0" -prometheus = "0.13.2" -rdkafka = { version = "0.33.2", features = ["ssl", "sasl"] } -serde = { version = "1.0.145", features = ["derive"] } -serde_json = "1.0.86" -serde_yaml = "0.9.25" -sha2 = "0.10.7" -tokio = { version = "1.21.2", features = ["rt-multi-thread", "macros", "time", "fs", "signal"] } -tokio-stream = "0.1.11" -tonic = { version = "0.10.2", features = ["gzip", "tls", "tls-roots"] } -tonic-health = "0.10.2" -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -yellowstone-grpc-client = { path = "../yellowstone-grpc-client" } -yellowstone-grpc-proto = { path = "../yellowstone-grpc-proto" } - -[build-dependencies] -anyhow = "1.0.62" -cargo-lock = "9.0.0" -git-version = "0.3.5" -vergen = { version = "8.2.1", features = ["build", "rustc"] } diff --git a/yellowstone-grpc-kafka/src/config.rs b/yellowstone-grpc-kafka/src/config.rs deleted file mode 100644 index f4d2b87d..00000000 --- a/yellowstone-grpc-kafka/src/config.rs +++ /dev/null @@ -1,346 +0,0 @@ -use { - crate::dedup::{KafkaDedup, KafkaDedupMemory}, - anyhow::Context, - serde::{ - de::{self, Deserializer}, - Deserialize, Serialize, - }, - std::{ - collections::{HashMap, HashSet}, - net::SocketAddr, - path::Path, - }, - tokio::fs, - yellowstone_grpc_proto::prelude::{ - subscribe_request_filter_accounts_filter::Filter as AccountsFilterDataOneof, - subscribe_request_filter_accounts_filter_memcmp::Data as AccountsFilterMemcmpOneof, - CommitmentLevel, SubscribeRequest, SubscribeRequestAccountsDataSlice, - SubscribeRequestFilterAccounts, SubscribeRequestFilterAccountsFilter, - SubscribeRequestFilterAccountsFilterMemcmp, SubscribeRequestFilterBlocks, - SubscribeRequestFilterTransactions, - }, -}; - -pub trait GrpcRequestToProto { - fn to_proto(self) -> T; -} - -#[derive(Debug, Default, Deserialize)] -#[serde(default)] -pub struct Config { - pub prometheus: Option, - pub kafka: HashMap, - pub dedup: Option, - pub grpc2kafka: Option, - pub kafka2grpc: Option, -} - -impl Config { - pub async fn load(path: impl AsRef + Copy) -> anyhow::Result { - let text = fs::read_to_string(path) - .await - .context("failed to read config from file")?; - - match path.as_ref().extension().and_then(|e| e.to_str()) { - Some("yaml") | Some("yml") => { - serde_yaml::from_str(&text).context("failed to parse config from file") - } - Some("json") => serde_yaml::from_str(&text).context("failed to parse config from file"), - value => anyhow::bail!("unknown config extension: {value:?}"), - } - } -} - -#[derive(Debug, Deserialize)] -pub struct ConfigDedup { - #[serde(default)] - pub kafka: HashMap, - pub kafka_input: String, - pub kafka_output: String, - #[serde( - default = "ConfigGrpc2Kafka::default_kafka_queue_size", - deserialize_with = "ConfigGrpc2Kafka::deserialize_usize_str" - )] - pub kafka_queue_size: usize, - pub backend: ConfigDedupBackend, -} - -#[derive(Debug, Deserialize)] -#[serde(tag = "type", rename_all = "lowercase")] -pub enum ConfigDedupBackend { - Memory, -} - -impl ConfigDedupBackend { - pub async fn create(&self) -> anyhow::Result> { - Ok(match self { - Self::Memory => Box::::default(), - }) - } -} - -#[derive(Debug, Deserialize)] -pub struct ConfigGrpc2Kafka { - pub endpoint: String, - pub x_token: Option, - pub request: ConfigGrpc2KafkaRequest, - #[serde(default)] - pub kafka: HashMap, - pub kafka_topic: String, - #[serde( - default = "ConfigGrpc2Kafka::default_kafka_queue_size", - deserialize_with = "ConfigGrpc2Kafka::deserialize_usize_str" - )] - pub kafka_queue_size: usize, -} - -impl ConfigGrpc2Kafka { - const fn default_kafka_queue_size() -> usize { - 10_000 - } - - fn deserialize_usize_str<'de, D>(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - #[serde(untagged)] - enum Value { - Integer(usize), - String(String), - } - - match Value::deserialize(deserializer)? { - Value::Integer(value) => Ok(value), - Value::String(value) => value - .replace('_', "") - .parse::() - .map_err(de::Error::custom), - } - } -} - -#[derive(Debug, Default, Deserialize, Serialize)] -#[serde(default)] -pub struct ConfigGrpc2KafkaRequest { - pub slots: HashSet, - pub accounts: HashMap, - pub transactions: HashMap, - pub entries: HashSet, - pub blocks: HashMap, - pub blocks_meta: HashSet, - pub commitment: Option, - pub accounts_data_slice: Vec, -} - -impl ConfigGrpc2KafkaRequest { - fn map_to_proto(map: HashMap>) -> HashMap { - map.into_iter().map(|(k, v)| (k, v.to_proto())).collect() - } - - fn set_to_proto(set: HashSet) -> HashMap { - set.into_iter().map(|v| (v, T::default())).collect() - } - - fn vec_to_proto(vec: Vec>) -> Vec { - vec.into_iter().map(|v| v.to_proto()).collect() - } -} - -impl GrpcRequestToProto for ConfigGrpc2KafkaRequest { - fn to_proto(self) -> SubscribeRequest { - SubscribeRequest { - slots: ConfigGrpc2KafkaRequest::set_to_proto(self.slots), - accounts: ConfigGrpc2KafkaRequest::map_to_proto(self.accounts), - transactions: ConfigGrpc2KafkaRequest::map_to_proto(self.transactions), - entry: ConfigGrpc2KafkaRequest::set_to_proto(self.entries), - blocks: ConfigGrpc2KafkaRequest::map_to_proto(self.blocks), - blocks_meta: ConfigGrpc2KafkaRequest::set_to_proto(self.blocks_meta), - commitment: self.commitment.map(|v| v.to_proto() as i32), - accounts_data_slice: ConfigGrpc2KafkaRequest::vec_to_proto(self.accounts_data_slice), - } - } -} - -#[derive(Debug, Default, Deserialize, Serialize)] -#[serde(default)] -pub struct ConfigGrpc2KafkaRequestAccounts { - account: Vec, - owner: Vec, - filters: Vec, -} - -impl GrpcRequestToProto for ConfigGrpc2KafkaRequestAccounts { - fn to_proto(self) -> SubscribeRequestFilterAccounts { - SubscribeRequestFilterAccounts { - account: self.account, - owner: self.owner, - filters: self.filters.into_iter().map(|f| f.to_proto()).collect(), - } - } -} - -#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)] -pub enum ConfigGrpc2KafkaRequestAccountsFilter { - Memcmp { offset: u64, base58: String }, - DataSize(u64), - TokenAccountState, -} - -impl GrpcRequestToProto - for ConfigGrpc2KafkaRequestAccountsFilter -{ - fn to_proto(self) -> SubscribeRequestFilterAccountsFilter { - SubscribeRequestFilterAccountsFilter { - filter: Some(match self { - ConfigGrpc2KafkaRequestAccountsFilter::Memcmp { offset, base58 } => { - AccountsFilterDataOneof::Memcmp(SubscribeRequestFilterAccountsFilterMemcmp { - offset, - data: Some(AccountsFilterMemcmpOneof::Base58(base58)), - }) - } - ConfigGrpc2KafkaRequestAccountsFilter::DataSize(size) => { - AccountsFilterDataOneof::Datasize(size) - } - ConfigGrpc2KafkaRequestAccountsFilter::TokenAccountState => { - AccountsFilterDataOneof::TokenAccountState(true) - } - }), - } - } -} - -#[derive(Debug, Default, Deserialize, Serialize)] -#[serde(default)] -pub struct ConfigGrpc2KafkaRequestTransactions { - pub vote: Option, - pub failed: Option, - pub signature: Option, - pub account_include: Vec, - pub account_exclude: Vec, - pub account_required: Vec, -} - -impl GrpcRequestToProto - for ConfigGrpc2KafkaRequestTransactions -{ - fn to_proto(self) -> SubscribeRequestFilterTransactions { - SubscribeRequestFilterTransactions { - vote: self.vote, - failed: self.failed, - signature: self.signature, - account_include: self.account_include, - account_exclude: self.account_exclude, - account_required: self.account_required, - } - } -} - -#[derive(Debug, Default, Deserialize, Serialize)] -#[serde(default)] -pub struct ConfigGrpc2KafkaRequestBlocks { - pub account_include: Vec, - pub include_transactions: Option, - pub include_accounts: Option, - pub include_entries: Option, -} - -impl GrpcRequestToProto for ConfigGrpc2KafkaRequestBlocks { - fn to_proto(self) -> SubscribeRequestFilterBlocks { - SubscribeRequestFilterBlocks { - account_include: self.account_include, - include_transactions: self.include_transactions, - include_accounts: self.include_accounts, - include_entries: self.include_entries, - } - } -} - -#[derive(Debug, Deserialize, Serialize)] -#[serde(rename_all = "lowercase")] -pub enum ConfigGrpc2KafkaRequestCommitment { - Processed, - Confirmed, - Finalized, -} - -impl GrpcRequestToProto for ConfigGrpc2KafkaRequestCommitment { - fn to_proto(self) -> CommitmentLevel { - match self { - Self::Processed => CommitmentLevel::Processed, - Self::Confirmed => CommitmentLevel::Confirmed, - Self::Finalized => CommitmentLevel::Finalized, - } - } -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct ConfigGrpc2KafkaRequestAccountsDataSlice { - pub offset: u64, - pub length: u64, -} - -impl GrpcRequestToProto - for ConfigGrpc2KafkaRequestAccountsDataSlice -{ - fn to_proto(self) -> SubscribeRequestAccountsDataSlice { - SubscribeRequestAccountsDataSlice { - offset: self.offset, - length: self.length, - } - } -} - -#[derive(Debug, Deserialize)] -pub struct ConfigKafka2Grpc { - #[serde(default)] - pub kafka: HashMap, - pub kafka_topic: String, - pub listen: SocketAddr, - #[serde(default = "ConfigKafka2Grpc::channel_capacity_default")] - pub channel_capacity: usize, -} - -impl ConfigKafka2Grpc { - const fn channel_capacity_default() -> usize { - 250_000 - } -} - -#[cfg(test)] -mod tests { - use super::ConfigGrpc2KafkaRequestAccountsFilter; - - #[test] - fn grpc_config_accounts_filter_memcmp() { - let filter = ConfigGrpc2KafkaRequestAccountsFilter::Memcmp { - offset: 42, - base58: "123".to_owned(), - }; - let text = serde_json::to_string(&filter).unwrap(); - assert_eq!( - serde_json::from_str::(&text).unwrap(), - filter - ); - } - - #[test] - fn grpc_config_accounts_filter_datasize() { - let filter = ConfigGrpc2KafkaRequestAccountsFilter::DataSize(42); - let text = serde_json::to_string(&filter).unwrap(); - assert_eq!( - serde_json::from_str::(&text).unwrap(), - filter - ); - } - - #[test] - fn grpc_config_accounts_filter_token() { - let filter = ConfigGrpc2KafkaRequestAccountsFilter::TokenAccountState; - let text = serde_json::to_string(&filter).unwrap(); - assert_eq!( - serde_json::from_str::(&text).unwrap(), - filter - ); - } -} diff --git a/yellowstone-grpc-kafka/src/lib.rs b/yellowstone-grpc-kafka/src/lib.rs deleted file mode 100644 index fd288ea1..00000000 --- a/yellowstone-grpc-kafka/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -#![deny(clippy::clone_on_ref_ptr)] -#![deny(clippy::missing_const_for_fn)] -#![deny(clippy::trivially_copy_pass_by_ref)] - -pub mod config; -pub mod dedup; -pub mod grpc; -pub mod prom; -pub mod version; diff --git a/yellowstone-grpc-kafka/src/prom.rs b/yellowstone-grpc-kafka/src/prom.rs deleted file mode 100644 index f066036e..00000000 --- a/yellowstone-grpc-kafka/src/prom.rs +++ /dev/null @@ -1,242 +0,0 @@ -use { - crate::version::VERSION as VERSION_INFO, - hyper::{ - server::conn::AddrStream, - service::{make_service_fn, service_fn}, - Body, Request, Response, Server, StatusCode, - }, - prometheus::{GaugeVec, IntCounter, IntCounterVec, Opts, Registry, TextEncoder}, - std::{net::SocketAddr, sync::Once}, - tracing::{error, info}, -}; - -lazy_static::lazy_static! { - static ref REGISTRY: Registry = Registry::new(); - - static ref VERSION: IntCounterVec = IntCounterVec::new( - Opts::new("version", "Plugin version info"), - &["buildts", "git", "package", "proto", "rustc", "solana", "version"] - ).unwrap(); - - static ref KAFKA_STATS: GaugeVec = GaugeVec::new( - Opts::new("kafka_stats", "librdkafka metrics"), - &["broker", "metric"] - ).unwrap(); - - static ref KAFKA_DEDUP_TOTAL: IntCounter = IntCounter::new( - "kafka_dedup_total", "Total number of deduplicated messages" - ).unwrap(); - - static ref KAFKA_RECV_TOTAL: IntCounter = IntCounter::new( - "kafka_recv_total", "Total number of received messages" - ).unwrap(); - - static ref KAFKA_SENT_TOTAL: IntCounterVec = IntCounterVec::new( - Opts::new("kafka_sent_total", "Total number of uploaded messages by type"), - &["kind"] - ).unwrap(); -} - -pub fn run_server(address: SocketAddr) -> anyhow::Result<()> { - static REGISTER: Once = Once::new(); - REGISTER.call_once(|| { - macro_rules! register { - ($collector:ident) => { - REGISTRY - .register(Box::new($collector.clone())) - .expect("collector can't be registered"); - }; - } - register!(VERSION); - register!(KAFKA_STATS); - register!(KAFKA_DEDUP_TOTAL); - register!(KAFKA_RECV_TOTAL); - register!(KAFKA_SENT_TOTAL); - - VERSION - .with_label_values(&[ - VERSION_INFO.buildts, - VERSION_INFO.git, - VERSION_INFO.package, - VERSION_INFO.proto, - VERSION_INFO.rustc, - VERSION_INFO.solana, - VERSION_INFO.version, - ]) - .inc(); - }); - - let make_service = make_service_fn(move |_: &AddrStream| async move { - Ok::<_, hyper::Error>(service_fn(move |req: Request| async move { - let response = match req.uri().path() { - "/metrics" => metrics_handler(), - _ => not_found_handler(), - }; - Ok::<_, hyper::Error>(response) - })) - }); - let server = Server::try_bind(&address)?.serve(make_service); - info!("prometheus server started: {address:?}"); - tokio::spawn(async move { - if let Err(error) = server.await { - error!("prometheus server failed: {error:?}"); - } - }); - - Ok(()) -} - -fn metrics_handler() -> Response { - let metrics = TextEncoder::new() - .encode_to_string(®ISTRY.gather()) - .unwrap_or_else(|error| { - error!("could not encode custom metrics: {}", error); - String::new() - }); - Response::builder().body(Body::from(metrics)).unwrap() -} - -fn not_found_handler() -> Response { - Response::builder() - .status(StatusCode::NOT_FOUND) - .body(Body::empty()) - .unwrap() -} - -pub mod kafka { - use { - super::{KAFKA_DEDUP_TOTAL, KAFKA_RECV_TOTAL, KAFKA_SENT_TOTAL, KAFKA_STATS}, - rdkafka::{ - client::ClientContext, - config::{ClientConfig, FromClientConfigAndContext}, - consumer::{ConsumerContext, StreamConsumer}, - error::KafkaResult, - producer::FutureProducer, - statistics::Statistics, - }, - yellowstone_grpc_proto::prelude::subscribe_update::UpdateOneof, - }; - - #[derive(Debug, Default, Clone, Copy)] - pub struct StatsContext; - - impl ClientContext for StatsContext { - fn stats(&self, statistics: Statistics) { - for (name, broker) in statistics.brokers { - macro_rules! set_value { - ($name:expr, $value:expr) => { - KAFKA_STATS - .with_label_values(&[&name, $name]) - .set($value as f64); - }; - } - - set_value!("outbuf_cnt", broker.outbuf_cnt); - set_value!("outbuf_msg_cnt", broker.outbuf_msg_cnt); - set_value!("waitresp_cnt", broker.waitresp_cnt); - set_value!("waitresp_msg_cnt", broker.waitresp_msg_cnt); - set_value!("tx", broker.tx); - set_value!("txerrs", broker.txerrs); - set_value!("txretries", broker.txretries); - set_value!("req_timeouts", broker.req_timeouts); - - if let Some(window) = broker.int_latency { - set_value!("int_latency.min", window.min); - set_value!("int_latency.max", window.max); - set_value!("int_latency.avg", window.avg); - set_value!("int_latency.sum", window.sum); - set_value!("int_latency.cnt", window.cnt); - set_value!("int_latency.stddev", window.stddev); - set_value!("int_latency.hdrsize", window.hdrsize); - set_value!("int_latency.p50", window.p50); - set_value!("int_latency.p75", window.p75); - set_value!("int_latency.p90", window.p90); - set_value!("int_latency.p95", window.p95); - set_value!("int_latency.p99", window.p99); - set_value!("int_latency.p99_99", window.p99_99); - set_value!("int_latency.outofrange", window.outofrange); - } - - if let Some(window) = broker.outbuf_latency { - set_value!("outbuf_latency.min", window.min); - set_value!("outbuf_latency.max", window.max); - set_value!("outbuf_latency.avg", window.avg); - set_value!("outbuf_latency.sum", window.sum); - set_value!("outbuf_latency.cnt", window.cnt); - set_value!("outbuf_latency.stddev", window.stddev); - set_value!("outbuf_latency.hdrsize", window.hdrsize); - set_value!("outbuf_latency.p50", window.p50); - set_value!("outbuf_latency.p75", window.p75); - set_value!("outbuf_latency.p90", window.p90); - set_value!("outbuf_latency.p95", window.p95); - set_value!("outbuf_latency.p99", window.p99); - set_value!("outbuf_latency.p99_99", window.p99_99); - set_value!("outbuf_latency.outofrange", window.outofrange); - } - } - } - } - - impl ConsumerContext for StatsContext {} - - impl StatsContext { - pub fn create_future_producer(config: &ClientConfig) -> KafkaResult> { - FutureProducer::from_config_and_context(config, Self) - } - - pub fn create_stream_consumer(config: &ClientConfig) -> KafkaResult> { - StreamConsumer::from_config_and_context(config, Self) - } - } - - #[derive(Debug, Clone, Copy)] - pub enum GprcMessageKind { - Account, - Slot, - Transaction, - Block, - BlockMeta, - Entry, - Unknown, - } - - impl From<&UpdateOneof> for GprcMessageKind { - fn from(msg: &UpdateOneof) -> Self { - match msg { - UpdateOneof::Account(_) => Self::Account, - UpdateOneof::Slot(_) => Self::Slot, - UpdateOneof::Transaction(_) => Self::Transaction, - UpdateOneof::Block(_) => Self::Block, - UpdateOneof::Ping(_) => unreachable!(), - UpdateOneof::BlockMeta(_) => Self::BlockMeta, - UpdateOneof::Entry(_) => Self::Entry, - } - } - } - - impl GprcMessageKind { - const fn as_str(self) -> &'static str { - match self { - GprcMessageKind::Account => "account", - GprcMessageKind::Slot => "slot", - GprcMessageKind::Transaction => "transaction", - GprcMessageKind::Block => "block", - GprcMessageKind::BlockMeta => "blockmeta", - GprcMessageKind::Entry => "entry", - GprcMessageKind::Unknown => "unknown", - } - } - } - - pub fn sent_inc(kind: GprcMessageKind) { - KAFKA_SENT_TOTAL.with_label_values(&[kind.as_str()]).inc() - } - - pub fn recv_inc() { - KAFKA_RECV_TOTAL.inc(); - } - - pub fn dedup_inc() { - KAFKA_DEDUP_TOTAL.inc(); - } -} diff --git a/yellowstone-grpc-proto/Cargo.toml b/yellowstone-grpc-proto/Cargo.toml index b96ae49c..bf19c1ab 100644 --- a/yellowstone-grpc-proto/Cargo.toml +++ b/yellowstone-grpc-proto/Cargo.toml @@ -1,23 +1,24 @@ [package] name = "yellowstone-grpc-proto" -version = "1.10.0+solana.1.16.16" -authors = ["Triton One"] -edition = "2021" +version = "1.11.0+solana.1.16.19" +authors = { workspace = true } +edition = { workspace = true } description = "Yellowstone gRPC Geyser Protobuf Definitions" -homepage = "https://triton.one" -repository = "https://github.com/rpcpool/yellowstone-grpc" -license = "Apache-2.0" -keywords = ["solana"] +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } +keywords = { workspace = true } +publish = true [dependencies] -bincode = "1.3.3" -prost = "0.12.1" -solana-account-decoder = "=1.16.16" -solana-sdk = "=1.16.16" -solana-transaction-status = "=1.16.16" -tonic = "0.10.2" +bincode = { workspace = true } +prost = { workspace = true } +solana-account-decoder = { workspace = true } +solana-sdk = { workspace = true } +solana-transaction-status = { workspace = true } +tonic = { workspace = true } [build-dependencies] -anyhow = "1.0.62" -protobuf-src = "1.1.0" -tonic-build = "0.10.2" +anyhow = { workspace = true } +protobuf-src = { workspace = true } +tonic-build = { workspace = true } diff --git a/yellowstone-grpc-proto/proto/geyser.proto b/yellowstone-grpc-proto/proto/geyser.proto index 293831b2..77781745 100644 --- a/yellowstone-grpc-proto/proto/geyser.proto +++ b/yellowstone-grpc-proto/proto/geyser.proto @@ -31,6 +31,7 @@ message SubscribeRequest { map entry = 8; optional CommitmentLevel commitment = 6; repeated SubscribeRequestAccountsDataSlice accounts_data_slice = 7; + optional SubscribeRequestPing ping = 9; } message SubscribeRequestFilterAccounts { @@ -56,7 +57,9 @@ message SubscribeRequestFilterAccountsFilterMemcmp { } } -message SubscribeRequestFilterSlots {} +message SubscribeRequestFilterSlots { + optional bool filter_by_commitment = 1; +} message SubscribeRequestFilterTransactions { optional bool vote = 1; @@ -83,6 +86,10 @@ message SubscribeRequestAccountsDataSlice { uint64 length = 2; } +message SubscribeRequestPing { + int32 id = 1; +} + message SubscribeUpdate { repeated string filters = 1; oneof update_oneof { @@ -91,6 +98,7 @@ message SubscribeUpdate { SubscribeUpdateTransaction transaction = 4; SubscribeUpdateBlock block = 5; SubscribeUpdatePing ping = 6; + SubscribeUpdatePong pong = 9; SubscribeUpdateBlockMeta block_meta = 7; SubscribeUpdateEntry entry = 8; } @@ -100,6 +108,7 @@ message SubscribeUpdateAccount { SubscribeUpdateAccountInfo account = 1; uint64 slot = 2; bool is_startup = 3; + optional SubscribeUpdatePreviousAccountInfo previous_account_state = 4; } message SubscribeUpdateAccountInfo { @@ -113,6 +122,14 @@ message SubscribeUpdateAccountInfo { optional bytes txn_signature = 8; } +message SubscribeUpdatePreviousAccountInfo { + uint64 lamports = 1; + bytes owner = 2; + bool executable = 3; + uint64 rent_epoch = 4; + bytes data = 5; +} + message SubscribeUpdateSlot { uint64 slot = 1; optional uint64 parent = 2; @@ -169,6 +186,10 @@ message SubscribeUpdateEntry { message SubscribeUpdatePing {} +message SubscribeUpdatePong { + int32 id = 1; +} + // non-streaming methods message PingRequest { diff --git a/yellowstone-grpc-tools/Cargo.toml b/yellowstone-grpc-tools/Cargo.toml new file mode 100644 index 00000000..7f6853b7 --- /dev/null +++ b/yellowstone-grpc-tools/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "yellowstone-grpc-tools" +version = "1.0.0-rc.7+solana.1.16.19" +authors = { workspace = true } +edition = { workspace = true } +description = "Yellowstone gRPC Tools" +homepage = { workspace = true } +repository = { workspace = true } +license = { workspace = true } +keywords = { workspace = true } +publish = false + +[[bin]] +name = "grpc-google-pubsub" +required-features = ["google-pubsub"] + +[[bin]] +name = "grpc-kafka" +required-features = ["kafka"] + +[dependencies] +anyhow = { workspace = true } +async-trait = { workspace = true } +atty = { workspace = true } +clap = { workspace = true, features = ["derive"] } +const-hex = { workspace = true, optional = true } +futures = { workspace = true } +google-cloud-googleapis = { workspace = true, optional = true } +google-cloud-pubsub = { workspace = true, optional = true } +hyper = { workspace = true } +json5 = { workspace = true } +lazy_static = { workspace = true } +prometheus = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +serde_yaml = { workspace = true } +sha2 = { workspace = true, optional = true } +tokio = { workspace = true, features = ["signal"] } +tokio-stream = { workspace = true } +tonic = { workspace = true, features = ["gzip"] } +tonic-health = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } +yellowstone-grpc-client = { workspace = true } +yellowstone-grpc-proto = { workspace = true } + +[target.'cfg(not(all(target_os = "macos", target_arch = "aarch64")))'.dependencies] +rdkafka = { workspace = true, features = ["sasl", "ssl"], optional = true } + +[target.'cfg(all(target_os = "macos", target_arch = "aarch64"))'.dependencies] +rdkafka = { workspace = true, features = ["sasl", "ssl-vendored"], optional = true } + +[build-dependencies] +anyhow = { workspace = true } +cargo-lock = { workspace = true } +git-version = { workspace = true } +vergen = { workspace = true, features = ["build", "rustc"] } + +[features] +default = ["google-pubsub", "kafka"] +google-pubsub = ["google-cloud-googleapis", "google-cloud-pubsub"] +kafka = ["const-hex", "rdkafka", "sha2"] diff --git a/yellowstone-grpc-kafka/build.rs b/yellowstone-grpc-tools/build.rs similarity index 100% rename from yellowstone-grpc-kafka/build.rs rename to yellowstone-grpc-tools/build.rs diff --git a/yellowstone-grpc-tools/config-google-pubsub.json b/yellowstone-grpc-tools/config-google-pubsub.json new file mode 100644 index 00000000..8ffc9b25 --- /dev/null +++ b/yellowstone-grpc-tools/config-google-pubsub.json @@ -0,0 +1,25 @@ +{ + "prometheus": "127.0.0.1:8873", + "grpc2pubsub": { + "endpoint": "http://127.0.0.1:10000", + "x_token": null, + "request": { + "slots": ["client"], + "blocks": { + "client": { + "account_include": [], + "include_transactions": false, + "include_accounts": false, + "include_entries": false + } + } + }, + "topic": "grpc", + "create_if_not_exists": true, + "workers": 3, + "flush_interval_ms": 100, + "bundle_size": 3, + "bulk_max_size": 10, + "bulk_max_wait_ms": 100 + } +} diff --git a/yellowstone-grpc-kafka/config.json b/yellowstone-grpc-tools/config-kafka.json similarity index 100% rename from yellowstone-grpc-kafka/config.json rename to yellowstone-grpc-tools/config-kafka.json diff --git a/yellowstone-grpc-kafka/docker-kafka.yml b/yellowstone-grpc-tools/docker-kafka.yml similarity index 100% rename from yellowstone-grpc-kafka/docker-kafka.yml rename to yellowstone-grpc-tools/docker-kafka.yml diff --git a/yellowstone-grpc-tools/src/bin/grpc-google-pubsub.rs b/yellowstone-grpc-tools/src/bin/grpc-google-pubsub.rs new file mode 100644 index 00000000..d052800e --- /dev/null +++ b/yellowstone-grpc-tools/src/bin/grpc-google-pubsub.rs @@ -0,0 +1,283 @@ +use { + clap::{Parser, Subcommand}, + futures::{future::BoxFuture, stream::StreamExt}, + google_cloud_googleapis::pubsub::v1::PubsubMessage, + google_cloud_pubsub::{client::Client, subscription::SubscriptionConfig}, + std::{net::SocketAddr, time::Duration}, + tokio::{task::JoinSet, time::sleep}, + tracing::{info, warn}, + tracing_subscriber::{ + filter::{EnvFilter, LevelFilter}, + layer::SubscriberExt, + util::SubscriberInitExt, + }, + yellowstone_grpc_client::GeyserGrpcClient, + yellowstone_grpc_proto::{ + prelude::{subscribe_update::UpdateOneof, SubscribeUpdate}, + prost::Message as _, + }, + yellowstone_grpc_tools::{ + config::{load as config_load, GrpcRequestToProto}, + create_shutdown, + google_pubsub::{ + config::{Config, ConfigGrpc2PubSub}, + prom, + }, + prom::{run_server as prometheus_run_server, GprcMessageKind}, + }, +}; + +#[derive(Debug, Clone, Parser)] +#[clap(author, version, about = "Yellowstone gRPC Google Pub/Sub Tool")] +struct Args { + /// Path to config file + #[clap(short, long)] + config: String, + + /// Prometheus listen address + #[clap(long)] + prometheus: Option, + + #[command(subcommand)] + action: ArgsAction, +} + +#[derive(Debug, Clone, Subcommand)] +enum ArgsAction { + /// Receive data from gRPC and send them to the Pub/Sub + #[command(name = "grpc2pubsub")] + Grpc2PubSub, + /// Dev: subscribe to message from Pub/Sub and print them to Stdout + #[command(name = "pubsub2stdout")] + PubSub2Stdout { + #[clap(long)] + topic: String, + #[clap(long)] + subscription: String, + }, + /// Dev: create Pub/Sub topic + #[command(name = "pubsubTopicCreate")] + PubSubTopicCreate { topic: String }, + /// Dev: delete Pub/Sub topic + #[command(name = "pubsubTopicDelete")] + PubSubTopicDelete { topic: String }, +} + +impl ArgsAction { + async fn run(self, config: Config) -> anyhow::Result<()> { + let shutdown = create_shutdown()?; + let client = config.create_client().await?; + + match self { + ArgsAction::Grpc2PubSub => { + let config = config.grpc2pubsub.ok_or_else(|| { + anyhow::anyhow!("`grpc2pubsub` section in config should be defined") + })?; + Self::grpc2pubsub(client, config, shutdown).await + } + ArgsAction::PubSub2Stdout { + topic, + subscription, + } => Self::pubsub2stdout(client, topic, subscription, shutdown).await, + ArgsAction::PubSubTopicCreate { topic } => { + let topic = client.topic(&topic); + if !topic.exists(None).await? { + topic.create(None, None).await?; + } + Ok(()) + } + ArgsAction::PubSubTopicDelete { topic } => { + client.topic(&topic).delete(None).await.map_err(Into::into) + } + } + } + + async fn grpc2pubsub( + client: Client, + config: ConfigGrpc2PubSub, + mut shutdown: BoxFuture<'static, ()>, + ) -> anyhow::Result<()> { + // Connect to Pub/Sub and create topic if not exists + let topic = client.topic(&config.topic); + if !topic.exists(None).await? { + anyhow::ensure!( + config.create_if_not_exists, + "topic {} doesn't exists", + config.topic + ); + topic.create(None, None).await?; + } + let publisher = topic.new_publisher(Some(config.get_publisher_config())); + + // Create gRPC client & subscribe + let mut client = GeyserGrpcClient::connect_with_timeout( + config.endpoint, + config.x_token, + None, + Some(Duration::from_secs(10)), + Some(Duration::from_secs(5)), + false, + ) + .await?; + let mut geyser = client.subscribe_once2(config.request.to_proto()).await?; + + // Receive-send loop + let mut send_tasks = JoinSet::new(); + let mut msg_slot = 0; + let mut msg_id = 0; + 'outer: loop { + let sleep = sleep(Duration::from_millis(config.bulk_max_wait_ms as u64)); + tokio::pin!(sleep); + let mut messages = vec![]; + let mut prom_kind = vec![]; + while messages.len() < config.bulk_max_size { + let message = tokio::select! { + _ = &mut shutdown => break 'outer, + _ = &mut sleep => break, + maybe_result = send_tasks.join_next() => match maybe_result { + Some(result) => { + result??; + continue; + } + None => tokio::select! { + _ = &mut shutdown => break 'outer, + _ = &mut sleep => break, + message = geyser.next() => message, + } + }, + message = geyser.next() => message, + } + .transpose()?; + let message = match message { + Some(message) => message, + None => break 'outer, + }; + + let payload = message.encode_to_vec(); + let message = match &message.update_oneof { + Some(value) => value, + None => unreachable!("Expect valid message"), + }; + let slot = match message { + UpdateOneof::Account(msg) => msg.slot, + UpdateOneof::Slot(msg) => msg.slot, + UpdateOneof::Transaction(msg) => msg.slot, + UpdateOneof::Block(msg) => msg.slot, + UpdateOneof::Ping(_) => continue, + UpdateOneof::Pong(_) => continue, + UpdateOneof::BlockMeta(msg) => msg.slot, + UpdateOneof::Entry(msg) => msg.slot, + }; + if msg_slot != slot { + msg_slot = slot; + msg_id = 0; + } + msg_id += 1; + + messages.push(PubsubMessage { + data: payload, + ordering_key: format!("{msg_slot}-{msg_id}"), + ..Default::default() + }); + prom_kind.push(GprcMessageKind::from(message)); + } + if messages.is_empty() { + continue; + } + + for (awaiter, prom_kind) in publisher + .publish_bulk(messages) + .await + .into_iter() + .zip(prom_kind.into_iter()) + { + send_tasks.spawn(async move { + awaiter.get().await?; + prom::sent_inc(prom_kind); + Ok::<(), anyhow::Error>(()) + }); + } + } + warn!("shutdown received..."); + while let Some(result) = send_tasks.join_next().await { + result??; + } + Ok(()) + } + + async fn pubsub2stdout( + client: Client, + topic: String, + subscription: String, + mut shutdown: BoxFuture<'static, ()>, + ) -> anyhow::Result<()> { + let topic = client.topic(&topic); + if !topic.exists(None).await? { + topic.create(None, None).await?; + } + let subscription = client.subscription(&subscription); + if !subscription.exists(None).await? { + let fqtn = topic.fully_qualified_name(); + let config = SubscriptionConfig::default(); + subscription.create(fqtn, config, None).await?; + } + + let mut stream = subscription.subscribe(None).await?; + loop { + let msg = tokio::select! { + _ = &mut shutdown => break, + msg = stream.next() => match msg { + Some(msg) => msg, + None => break, + } + }; + + msg.ack().await?; + match SubscribeUpdate::decode(msg.message.data.as_ref()) { + Ok(msg) => match msg.update_oneof { + Some(UpdateOneof::Account(msg)) => info!("#{}, account", msg.slot), + Some(UpdateOneof::Slot(msg)) => info!("#{}, slot", msg.slot), + Some(UpdateOneof::Transaction(msg)) => { + info!("#{}, transaction", msg.slot) + } + Some(UpdateOneof::Block(msg)) => info!("#{}, block", msg.slot), + Some(UpdateOneof::Ping(_)) => {} + Some(UpdateOneof::Pong(_)) => {} + Some(UpdateOneof::BlockMeta(msg)) => info!("#{}, blockmeta", msg.slot), + Some(UpdateOneof::Entry(msg)) => info!("#{}, entry", msg.slot), + None => {} + }, + Err(error) => { + warn!("failed to decode message: {error}"); + } + } + } + + Ok(()) + } +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + // Setup tracing + let is_atty = atty::is(atty::Stream::Stdout) && atty::is(atty::Stream::Stderr); + let io_layer = tracing_subscriber::fmt::layer().with_ansi(is_atty); + let level_layer = EnvFilter::builder() + .with_default_directive(LevelFilter::INFO.into()) + .from_env_lossy(); + tracing_subscriber::registry() + .with(io_layer) + .with(level_layer) + .try_init()?; + + // Parse args + let args = Args::parse(); + let config = config_load::(&args.config).await?; + + // Run prometheus server + if let Some(address) = args.prometheus.or(config.prometheus) { + prometheus_run_server(address)?; + } + + args.action.run(config).await +} diff --git a/yellowstone-grpc-kafka/src/bin/grpc-kafka.rs b/yellowstone-grpc-tools/src/bin/grpc-kafka.rs similarity index 73% rename from yellowstone-grpc-kafka/src/bin/grpc-kafka.rs rename to yellowstone-grpc-tools/src/bin/grpc-kafka.rs index 726e65d0..ed2830fc 100644 --- a/yellowstone-grpc-kafka/src/bin/grpc-kafka.rs +++ b/yellowstone-grpc-tools/src/bin/grpc-kafka.rs @@ -1,17 +1,11 @@ use { anyhow::Context, clap::{Parser, Subcommand}, - futures::{ - future::{BoxFuture, FutureExt}, - stream::StreamExt, - }, + futures::{future::BoxFuture, stream::StreamExt}, rdkafka::{config::ClientConfig, consumer::Consumer, message::Message, producer::FutureRecord}, sha2::{Digest, Sha256}, std::{net::SocketAddr, sync::Arc, time::Duration}, - tokio::{ - signal::unix::{signal, SignalKind}, - task::JoinSet, - }, + tokio::task::JoinSet, tracing::{debug, trace, warn}, tracing_subscriber::{ filter::{EnvFilter, LevelFilter}, @@ -19,26 +13,31 @@ use { util::SubscriberInitExt, }, yellowstone_grpc_client::GeyserGrpcClient, - yellowstone_grpc_kafka::{ - config::{Config, ConfigDedup, ConfigGrpc2Kafka, ConfigKafka2Grpc, GrpcRequestToProto}, - dedup::KafkaDedup, - grpc::GrpcService, - prom, - }, yellowstone_grpc_proto::{ prelude::{subscribe_update::UpdateOneof, SubscribeUpdate}, prost::Message as _, }, + yellowstone_grpc_tools::{ + config::{load as config_load, GrpcRequestToProto}, + create_shutdown, + kafka::{ + config::{Config, ConfigDedup, ConfigGrpc2Kafka, ConfigKafka2Grpc}, + dedup::KafkaDedup, + grpc::GrpcService, + prom, + }, + prom::{run_server as prometheus_run_server, GprcMessageKind}, + }, }; #[derive(Debug, Clone, Parser)] -#[clap(author, version, about)] +#[clap(author, version, about = "Yellowstone gRPC Kafka Tool")] struct Args { /// Path to config file #[clap(short, long)] config: String, - /// [DEPRECATED: use config] Prometheus listen address + /// Prometheus listen address #[clap(long)] prometheus: Option, @@ -59,12 +58,8 @@ enum ArgsAction { } impl ArgsAction { - async fn run( - self, - config: Config, - kafka_config: ClientConfig, - shutdown: BoxFuture<'static, ()>, - ) -> anyhow::Result<()> { + async fn run(self, config: Config, kafka_config: ClientConfig) -> anyhow::Result<()> { + let shutdown = create_shutdown()?; match self { ArgsAction::Dedup => { let config = config.dedup.ok_or_else(|| { @@ -97,14 +92,18 @@ impl ArgsAction { } // input - let consumer = prom::kafka::StatsContext::create_stream_consumer(&kafka_config) + let (consumer, kafka_error_rx1) = prom::StatsContext::create_stream_consumer(&kafka_config) .context("failed to create kafka consumer")?; consumer.subscribe(&[&config.kafka_input])?; // output - let kafka = prom::kafka::StatsContext::create_future_producer(&kafka_config) + let (kafka, kafka_error_rx2) = prom::StatsContext::create_future_producer(&kafka_config) .context("failed to create kafka producer")?; + let mut kafka_error = false; + let kafka_error_rx = futures::future::join(kafka_error_rx1, kafka_error_rx2); + tokio::pin!(kafka_error_rx); + // dedup let dedup = config.backend.create().await?; @@ -114,6 +113,10 @@ impl ArgsAction { loop { let message = tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break; + } maybe_result = send_tasks.join_next() => match maybe_result { Some(result) => { result??; @@ -121,12 +124,16 @@ impl ArgsAction { } None => tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break; + } message = consumer.recv() => message, } }, message = consumer.recv() => message, }?; - prom::kafka::recv_inc(); + prom::recv_inc(); trace!( "received message with key: {:?}", message.key().and_then(|k| std::str::from_utf8(k).ok()) @@ -167,19 +174,23 @@ impl ArgsAction { debug!("kafka send message with key: {key}, result: {result:?}"); result?.map_err(|(error, _message)| error)?; - prom::kafka::sent_inc(prom::kafka::GprcMessageKind::Unknown); + prom::sent_inc(GprcMessageKind::Unknown); Ok::<(), anyhow::Error>(()) } Err(error) => Err(error.0.into()), } } else { - prom::kafka::dedup_inc(); + prom::dedup_inc(); Ok(()) } }); if send_tasks.len() >= config.kafka_queue_size { tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break; + } result = send_tasks.join_next() => { if let Some(result) = result { result??; @@ -188,9 +199,17 @@ impl ArgsAction { } } } - warn!("shutdown received..."); - while let Some(result) = send_tasks.join_next().await { - result??; + if !kafka_error { + warn!("shutdown received..."); + loop { + tokio::select! { + _ = &mut kafka_error_rx => break, + result = send_tasks.join_next() => match result { + Some(result) => result??, + None => break + } + } + } } Ok(()) } @@ -205,8 +224,10 @@ impl ArgsAction { } // Connect to kafka - let kafka = prom::kafka::StatsContext::create_future_producer(&kafka_config) + let (kafka, kafka_error_rx) = prom::StatsContext::create_future_producer(&kafka_config) .context("failed to create kafka producer")?; + let mut kafka_error = false; + tokio::pin!(kafka_error_rx); // Create gRPC client & subscribe let mut client = GeyserGrpcClient::connect_with_timeout( @@ -225,13 +246,21 @@ impl ArgsAction { loop { let message = tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break; + } maybe_result = send_tasks.join_next() => match maybe_result { Some(result) => { - let _ = result??; + result??; continue; } None => tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break; + } message = geyser.next() => message, } }, @@ -252,12 +281,13 @@ impl ArgsAction { UpdateOneof::Transaction(msg) => msg.slot, UpdateOneof::Block(msg) => msg.slot, UpdateOneof::Ping(_) => continue, + UpdateOneof::Pong(_) => continue, UpdateOneof::BlockMeta(msg) => msg.slot, UpdateOneof::Entry(msg) => msg.slot, }; let hash = Sha256::digest(&payload); let key = format!("{slot}_{}", const_hex::encode(hash)); - let prom_kind = prom::kafka::GprcMessageKind::from(message); + let prom_kind = GprcMessageKind::from(message); let record = FutureRecord::to(&config.kafka_topic) .key(&key) @@ -269,13 +299,17 @@ impl ArgsAction { let result = future.await; debug!("kafka send message with key: {key}, result: {result:?}"); - let result = result?.map_err(|(error, _message)| error)?; - prom::kafka::sent_inc(prom_kind); - Ok::<(i32, i64), anyhow::Error>(result) + let _ = result?.map_err(|(error, _message)| error)?; + prom::sent_inc(prom_kind); + Ok::<(), anyhow::Error>(()) }); if send_tasks.len() >= config.kafka_queue_size { tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break; + } result = send_tasks.join_next() => { if let Some(result) = result { result??; @@ -290,9 +324,17 @@ impl ArgsAction { None => break, } } - warn!("shutdown received..."); - while let Some(result) = send_tasks.join_next().await { - let _ = result??; + if !kafka_error { + warn!("shutdown received..."); + loop { + tokio::select! { + _ = &mut kafka_error_rx => break, + result = send_tasks.join_next() => match result { + Some(result) => result??, + None => break + } + } + } } Ok(()) } @@ -308,16 +350,22 @@ impl ArgsAction { let (grpc_tx, grpc_shutdown) = GrpcService::run(config.listen, config.channel_capacity)?; - let consumer = prom::kafka::StatsContext::create_stream_consumer(&kafka_config) + let (consumer, kafka_error_rx) = prom::StatsContext::create_stream_consumer(&kafka_config) .context("failed to create kafka consumer")?; + let mut kafka_error = false; + tokio::pin!(kafka_error_rx); consumer.subscribe(&[&config.kafka_topic])?; loop { let message = tokio::select! { _ = &mut shutdown => break, + _ = &mut kafka_error_rx => { + kafka_error = true; + break + }, message = consumer.recv() => message?, }; - prom::kafka::recv_inc(); + prom::recv_inc(); debug!( "received message with key: {:?}", message.key().and_then(|k| std::str::from_utf8(k).ok()) @@ -335,7 +383,9 @@ impl ArgsAction { } } - warn!("shutdown received..."); + if !kafka_error { + warn!("shutdown received..."); + } Ok(grpc_shutdown.await??) } } @@ -355,11 +405,11 @@ async fn main() -> anyhow::Result<()> { // Parse args let args = Args::parse(); - let config = Config::load(&args.config).await?; + let config = config_load::(&args.config).await?; // Run prometheus server - if let Some(address) = config.prometheus.or(args.prometheus) { - prom::run_server(address)?; + if let Some(address) = args.prometheus.or(config.prometheus) { + prometheus_run_server(address)?; } // Create kafka config @@ -368,16 +418,5 @@ async fn main() -> anyhow::Result<()> { kafka_config.set(key, value); } - // Create shutdown signal - let mut sigint = signal(SignalKind::interrupt())?; - let mut sigterm = signal(SignalKind::terminate())?; - let shutdown = async move { - tokio::select! { - _ = sigint.recv() => {}, - _ = sigterm.recv() => {} - }; - } - .boxed(); - - args.action.run(config, kafka_config, shutdown).await + args.action.run(config, kafka_config).await } diff --git a/yellowstone-grpc-tools/src/config.rs b/yellowstone-grpc-tools/src/config.rs new file mode 100644 index 00000000..13c58d99 --- /dev/null +++ b/yellowstone-grpc-tools/src/config.rs @@ -0,0 +1,276 @@ +use { + anyhow::Context, + serde::{de, Deserialize, Serialize}, + std::{ + collections::{HashMap, HashSet}, + path::Path, + }, + tokio::fs, + yellowstone_grpc_proto::prelude::{ + subscribe_request_filter_accounts_filter::Filter as AccountsFilterDataOneof, + subscribe_request_filter_accounts_filter_memcmp::Data as AccountsFilterMemcmpOneof, + CommitmentLevel, SubscribeRequest, SubscribeRequestAccountsDataSlice, + SubscribeRequestFilterAccounts, SubscribeRequestFilterAccountsFilter, + SubscribeRequestFilterAccountsFilterMemcmp, SubscribeRequestFilterBlocks, + SubscribeRequestFilterSlots, SubscribeRequestFilterTransactions, + }, +}; + +pub async fn load(path: impl AsRef + Copy) -> anyhow::Result +where + T: de::DeserializeOwned, +{ + let text = fs::read_to_string(path) + .await + .context("failed to read config from file")?; + + match path.as_ref().extension().and_then(|e| e.to_str()) { + Some("yaml") | Some("yml") => { + serde_yaml::from_str(&text).context("failed to parse config from file") + } + Some("json") => json5::from_str(&text).context("failed to parse config from file"), + value => anyhow::bail!("unknown config extension: {value:?}"), + } +} + +pub trait GrpcRequestToProto { + fn to_proto(self) -> T; +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +#[serde(default)] +pub struct ConfigGrpcRequest { + pub slots: HashMap, + pub accounts: HashMap, + pub transactions: HashMap, + pub entries: HashSet, + pub blocks: HashMap, + pub blocks_meta: HashSet, + pub commitment: Option, + pub accounts_data_slice: Vec, +} + +impl ConfigGrpcRequest { + fn map_to_proto(map: HashMap>) -> HashMap { + map.into_iter().map(|(k, v)| (k, v.to_proto())).collect() + } + + fn set_to_proto(set: HashSet) -> HashMap { + set.into_iter().map(|v| (v, T::default())).collect() + } + + fn vec_to_proto(vec: Vec>) -> Vec { + vec.into_iter().map(|v| v.to_proto()).collect() + } +} + +impl GrpcRequestToProto for ConfigGrpcRequest { + fn to_proto(self) -> SubscribeRequest { + SubscribeRequest { + slots: ConfigGrpcRequest::map_to_proto(self.slots), + accounts: ConfigGrpcRequest::map_to_proto(self.accounts), + transactions: ConfigGrpcRequest::map_to_proto(self.transactions), + entry: ConfigGrpcRequest::set_to_proto(self.entries), + blocks: ConfigGrpcRequest::map_to_proto(self.blocks), + blocks_meta: ConfigGrpcRequest::set_to_proto(self.blocks_meta), + commitment: self.commitment.map(|v| v.to_proto() as i32), + accounts_data_slice: ConfigGrpcRequest::vec_to_proto(self.accounts_data_slice), + ping: None, + } + } +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +#[serde(default)] +pub struct ConfigGrpcRequestSlots { + filter_by_commitment: Option, +} + +impl GrpcRequestToProto for ConfigGrpcRequestSlots { + fn to_proto(self) -> SubscribeRequestFilterSlots { + SubscribeRequestFilterSlots { + filter_by_commitment: self.filter_by_commitment, + } + } +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +#[serde(default)] +pub struct ConfigGrpcRequestAccounts { + account: Vec, + owner: Vec, + filters: Vec, +} + +impl GrpcRequestToProto for ConfigGrpcRequestAccounts { + fn to_proto(self) -> SubscribeRequestFilterAccounts { + SubscribeRequestFilterAccounts { + account: self.account, + owner: self.owner, + filters: self.filters.into_iter().map(|f| f.to_proto()).collect(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub enum ConfigGrpcRequestAccountsFilter { + Memcmp { offset: u64, base58: String }, + DataSize(u64), + TokenAccountState, +} + +impl GrpcRequestToProto for ConfigGrpcRequestAccountsFilter { + fn to_proto(self) -> SubscribeRequestFilterAccountsFilter { + SubscribeRequestFilterAccountsFilter { + filter: Some(match self { + ConfigGrpcRequestAccountsFilter::Memcmp { offset, base58 } => { + AccountsFilterDataOneof::Memcmp(SubscribeRequestFilterAccountsFilterMemcmp { + offset, + data: Some(AccountsFilterMemcmpOneof::Base58(base58)), + }) + } + ConfigGrpcRequestAccountsFilter::DataSize(size) => { + AccountsFilterDataOneof::Datasize(size) + } + ConfigGrpcRequestAccountsFilter::TokenAccountState => { + AccountsFilterDataOneof::TokenAccountState(true) + } + }), + } + } +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +#[serde(default)] +pub struct ConfigGrpcRequestTransactions { + pub vote: Option, + pub failed: Option, + pub signature: Option, + pub account_include: Vec, + pub account_exclude: Vec, + pub account_required: Vec, +} + +impl GrpcRequestToProto for ConfigGrpcRequestTransactions { + fn to_proto(self) -> SubscribeRequestFilterTransactions { + SubscribeRequestFilterTransactions { + vote: self.vote, + failed: self.failed, + signature: self.signature, + account_include: self.account_include, + account_exclude: self.account_exclude, + account_required: self.account_required, + } + } +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +#[serde(default)] +pub struct ConfigGrpcRequestBlocks { + pub account_include: Vec, + pub include_transactions: Option, + pub include_accounts: Option, + pub include_entries: Option, +} + +impl GrpcRequestToProto for ConfigGrpcRequestBlocks { + fn to_proto(self) -> SubscribeRequestFilterBlocks { + SubscribeRequestFilterBlocks { + account_include: self.account_include, + include_transactions: self.include_transactions, + include_accounts: self.include_accounts, + include_entries: self.include_entries, + } + } +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum ConfigGrpcRequestCommitment { + Processed, + Confirmed, + Finalized, +} + +impl GrpcRequestToProto for ConfigGrpcRequestCommitment { + fn to_proto(self) -> CommitmentLevel { + match self { + Self::Processed => CommitmentLevel::Processed, + Self::Confirmed => CommitmentLevel::Confirmed, + Self::Finalized => CommitmentLevel::Finalized, + } + } +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize)] +pub struct ConfigGrpcRequestAccountsDataSlice { + pub offset: u64, + pub length: u64, +} + +impl GrpcRequestToProto for ConfigGrpcRequestAccountsDataSlice { + fn to_proto(self) -> SubscribeRequestAccountsDataSlice { + SubscribeRequestAccountsDataSlice { + offset: self.offset, + length: self.length, + } + } +} + +pub fn deserialize_usize_str<'de, D>(deserializer: D) -> Result +where + D: de::Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum Value { + Integer(usize), + String(String), + } + + match Value::deserialize(deserializer)? { + Value::Integer(value) => Ok(value), + Value::String(value) => value + .replace('_', "") + .parse::() + .map_err(de::Error::custom), + } +} + +#[cfg(test)] +mod tests { + use super::ConfigGrpcRequestAccountsFilter; + + #[test] + fn grpc_config_accounts_filter_memcmp() { + let filter = ConfigGrpcRequestAccountsFilter::Memcmp { + offset: 42, + base58: "123".to_owned(), + }; + let text = serde_json::to_string(&filter).unwrap(); + assert_eq!( + serde_json::from_str::(&text).unwrap(), + filter + ); + } + + #[test] + fn grpc_config_accounts_filter_datasize() { + let filter = ConfigGrpcRequestAccountsFilter::DataSize(42); + let text = serde_json::to_string(&filter).unwrap(); + assert_eq!( + serde_json::from_str::(&text).unwrap(), + filter + ); + } + + #[test] + fn grpc_config_accounts_filter_token() { + let filter = ConfigGrpcRequestAccountsFilter::TokenAccountState; + let text = serde_json::to_string(&filter).unwrap(); + assert_eq!( + serde_json::from_str::(&text).unwrap(), + filter + ); + } +} diff --git a/yellowstone-grpc-tools/src/google_pubsub/config.rs b/yellowstone-grpc-tools/src/google_pubsub/config.rs new file mode 100644 index 00000000..5b85a2b8 --- /dev/null +++ b/yellowstone-grpc-tools/src/google_pubsub/config.rs @@ -0,0 +1,104 @@ +use { + crate::config::{deserialize_usize_str, ConfigGrpcRequest}, + google_cloud_pubsub::{ + client::{google_cloud_auth::credentials::CredentialsFile, Client, ClientConfig}, + publisher::PublisherConfig, + }, + serde::Deserialize, + std::{net::SocketAddr, time::Duration}, +}; + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct Config { + pub prometheus: Option, + pub auth: Option, + pub grpc2pubsub: Option, +} + +impl Config { + pub async fn create_client(&self) -> anyhow::Result { + let mut config = ClientConfig::default(); + if let Some(creds) = match self.auth.clone() { + Some(filepath) => CredentialsFile::new_from_file(filepath).await.map(Some), + None => { + if std::env::var("GOOGLE_APPLICATION_CREDENTIALS_JSON").is_ok() + || std::env::var("GOOGLE_APPLICATION_CREDENTIALS").is_ok() + { + CredentialsFile::new().await.map(Some) + } else { + Ok(None) + } + } + }? { + config = config.with_credentials(creds).await?; + } + Client::new(config).await.map_err(Into::into) + } +} + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct ConfigGrpc2PubSub { + pub endpoint: String, + pub x_token: Option, + pub request: ConfigGrpcRequest, + + pub topic: String, + // Create `topic` with default config if not exists + pub create_if_not_exists: bool, + + // Publisher config + #[serde(default = "ConfigGrpc2PubSub::default_workers")] + pub workers: usize, + #[serde( + default = "ConfigGrpc2PubSub::default_flush_interval_ms", + deserialize_with = "deserialize_usize_str" + )] + pub flush_interval_ms: usize, + #[serde(default = "ConfigGrpc2PubSub::default_bundle_size")] + pub bundle_size: usize, + + // Publisher bulk config + #[serde( + default = "ConfigGrpc2PubSub::default_bulk_max_size", + deserialize_with = "deserialize_usize_str" + )] + pub bulk_max_size: usize, + #[serde( + default = "ConfigGrpc2PubSub::default_bulk_max_wait_ms", + deserialize_with = "deserialize_usize_str" + )] + pub bulk_max_wait_ms: usize, +} + +impl ConfigGrpc2PubSub { + fn default_workers() -> usize { + PublisherConfig::default().workers + } + + fn default_flush_interval_ms() -> usize { + PublisherConfig::default().flush_interval.as_millis() as usize + } + + fn default_bundle_size() -> usize { + PublisherConfig::default().bundle_size + } + + const fn default_bulk_max_size() -> usize { + 10 + } + + const fn default_bulk_max_wait_ms() -> usize { + 100 + } + + pub const fn get_publisher_config(&self) -> PublisherConfig { + PublisherConfig { + workers: self.workers, + flush_interval: Duration::from_millis(self.flush_interval_ms as u64), + bundle_size: self.bundle_size, + retry_setting: None, + } + } +} diff --git a/yellowstone-grpc-tools/src/google_pubsub/mod.rs b/yellowstone-grpc-tools/src/google_pubsub/mod.rs new file mode 100644 index 00000000..b43365b5 --- /dev/null +++ b/yellowstone-grpc-tools/src/google_pubsub/mod.rs @@ -0,0 +1,2 @@ +pub mod config; +pub mod prom; diff --git a/yellowstone-grpc-tools/src/google_pubsub/prom.rs b/yellowstone-grpc-tools/src/google_pubsub/prom.rs new file mode 100644 index 00000000..00eba5ad --- /dev/null +++ b/yellowstone-grpc-tools/src/google_pubsub/prom.rs @@ -0,0 +1,17 @@ +use { + crate::prom::GprcMessageKind, + prometheus::{IntCounterVec, Opts}, +}; + +lazy_static::lazy_static! { + pub(crate) static ref GOOGLE_PUBSUB_SENT_TOTAL: IntCounterVec = IntCounterVec::new( + Opts::new("google_pubsub_sent_total", "Total number of uploaded messages by type"), + &["kind"] + ).unwrap(); +} + +pub fn sent_inc(kind: GprcMessageKind) { + GOOGLE_PUBSUB_SENT_TOTAL + .with_label_values(&[kind.as_str()]) + .inc() +} diff --git a/yellowstone-grpc-tools/src/kafka/config.rs b/yellowstone-grpc-tools/src/kafka/config.rs new file mode 100644 index 00000000..6cda8aba --- /dev/null +++ b/yellowstone-grpc-tools/src/kafka/config.rs @@ -0,0 +1,81 @@ +use { + super::dedup::{KafkaDedup, KafkaDedupMemory}, + crate::config::{deserialize_usize_str, ConfigGrpcRequest}, + serde::Deserialize, + std::{collections::HashMap, net::SocketAddr}, +}; + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct Config { + pub prometheus: Option, + pub kafka: HashMap, + pub dedup: Option, + pub grpc2kafka: Option, + pub kafka2grpc: Option, +} + +#[derive(Debug, Deserialize)] +pub struct ConfigDedup { + #[serde(default)] + pub kafka: HashMap, + pub kafka_input: String, + pub kafka_output: String, + #[serde( + default = "ConfigGrpc2Kafka::default_kafka_queue_size", + deserialize_with = "deserialize_usize_str" + )] + pub kafka_queue_size: usize, + pub backend: ConfigDedupBackend, +} + +#[derive(Debug, Deserialize)] +#[serde(tag = "type", rename_all = "lowercase")] +pub enum ConfigDedupBackend { + Memory, +} + +impl ConfigDedupBackend { + pub async fn create(&self) -> anyhow::Result> { + Ok(match self { + Self::Memory => Box::::default(), + }) + } +} + +#[derive(Debug, Deserialize)] +pub struct ConfigGrpc2Kafka { + pub endpoint: String, + pub x_token: Option, + pub request: ConfigGrpcRequest, + #[serde(default)] + pub kafka: HashMap, + pub kafka_topic: String, + #[serde( + default = "ConfigGrpc2Kafka::default_kafka_queue_size", + deserialize_with = "deserialize_usize_str" + )] + pub kafka_queue_size: usize, +} + +impl ConfigGrpc2Kafka { + const fn default_kafka_queue_size() -> usize { + 10_000 + } +} + +#[derive(Debug, Deserialize)] +pub struct ConfigKafka2Grpc { + #[serde(default)] + pub kafka: HashMap, + pub kafka_topic: String, + pub listen: SocketAddr, + #[serde(default = "ConfigKafka2Grpc::channel_capacity_default")] + pub channel_capacity: usize, +} + +impl ConfigKafka2Grpc { + const fn channel_capacity_default() -> usize { + 250_000 + } +} diff --git a/yellowstone-grpc-kafka/src/dedup.rs b/yellowstone-grpc-tools/src/kafka/dedup.rs similarity index 100% rename from yellowstone-grpc-kafka/src/dedup.rs rename to yellowstone-grpc-tools/src/kafka/dedup.rs diff --git a/yellowstone-grpc-kafka/src/grpc.rs b/yellowstone-grpc-tools/src/kafka/grpc.rs similarity index 99% rename from yellowstone-grpc-kafka/src/grpc.rs rename to yellowstone-grpc-tools/src/kafka/grpc.rs index c8772e50..bb9997ca 100644 --- a/yellowstone-grpc-kafka/src/grpc.rs +++ b/yellowstone-grpc-tools/src/kafka/grpc.rs @@ -103,7 +103,7 @@ impl Geyser for GrpcService { &self, mut request: Request>, ) -> TonicResult> { - let id = self.subscribe_id.fetch_add(1, Ordering::SeqCst); + let id = self.subscribe_id.fetch_add(1, Ordering::Relaxed); let (stream_tx, stream_rx) = mpsc::channel(self.channel_capacity); let notify_client = Arc::new(Notify::new()); let notify_exit1 = Arc::new(Notify::new()); diff --git a/yellowstone-grpc-tools/src/kafka/mod.rs b/yellowstone-grpc-tools/src/kafka/mod.rs new file mode 100644 index 00000000..f6d97398 --- /dev/null +++ b/yellowstone-grpc-tools/src/kafka/mod.rs @@ -0,0 +1,4 @@ +pub mod config; +pub mod dedup; +pub mod grpc; +pub mod prom; diff --git a/yellowstone-grpc-tools/src/kafka/prom.rs b/yellowstone-grpc-tools/src/kafka/prom.rs new file mode 100644 index 00000000..7fa87624 --- /dev/null +++ b/yellowstone-grpc-tools/src/kafka/prom.rs @@ -0,0 +1,166 @@ +use { + crate::prom::GprcMessageKind, + prometheus::{GaugeVec, IntCounter, IntCounterVec, Opts}, + rdkafka::{ + client::{ClientContext, DefaultClientContext}, + config::{ClientConfig, FromClientConfigAndContext, RDKafkaLogLevel}, + consumer::{ConsumerContext, StreamConsumer}, + error::{KafkaError, KafkaResult}, + producer::FutureProducer, + statistics::Statistics, + }, + std::sync::Mutex, + tokio::sync::oneshot, +}; + +lazy_static::lazy_static! { + pub(crate) static ref KAFKA_STATS: GaugeVec = GaugeVec::new( + Opts::new("kafka_stats", "librdkafka metrics"), + &["broker", "metric"] + ).unwrap(); + + pub(crate) static ref KAFKA_DEDUP_TOTAL: IntCounter = IntCounter::new( + "kafka_dedup_total", "Total number of deduplicated messages" + ).unwrap(); + + pub(crate) static ref KAFKA_RECV_TOTAL: IntCounter = IntCounter::new( + "kafka_recv_total", "Total number of received messages" + ).unwrap(); + + pub(crate) static ref KAFKA_SENT_TOTAL: IntCounterVec = IntCounterVec::new( + Opts::new("kafka_sent_total", "Total number of uploaded messages by type"), + &["kind"] + ).unwrap(); +} + +#[derive(Debug)] +pub struct StatsContext { + default: DefaultClientContext, + error_tx: Mutex>>, +} + +impl StatsContext { + fn new() -> (Self, oneshot::Receiver<()>) { + let (error_tx, error_rx) = oneshot::channel(); + ( + Self { + default: DefaultClientContext, + error_tx: Mutex::new(Some(error_tx)), + }, + error_rx, + ) + } + + fn send_error(&self) { + if let Some(error_tx) = self.error_tx.lock().expect("alive mutex").take() { + let _ = error_tx.send(()); + } + } +} + +impl ClientContext for StatsContext { + fn stats(&self, statistics: Statistics) { + for (name, broker) in statistics.brokers { + macro_rules! set_value { + ($name:expr, $value:expr) => { + KAFKA_STATS + .with_label_values(&[&name, $name]) + .set($value as f64); + }; + } + + set_value!("outbuf_cnt", broker.outbuf_cnt); + set_value!("outbuf_msg_cnt", broker.outbuf_msg_cnt); + set_value!("waitresp_cnt", broker.waitresp_cnt); + set_value!("waitresp_msg_cnt", broker.waitresp_msg_cnt); + set_value!("tx", broker.tx); + set_value!("txerrs", broker.txerrs); + set_value!("txretries", broker.txretries); + set_value!("req_timeouts", broker.req_timeouts); + + if let Some(window) = broker.int_latency { + set_value!("int_latency.min", window.min); + set_value!("int_latency.max", window.max); + set_value!("int_latency.avg", window.avg); + set_value!("int_latency.sum", window.sum); + set_value!("int_latency.cnt", window.cnt); + set_value!("int_latency.stddev", window.stddev); + set_value!("int_latency.hdrsize", window.hdrsize); + set_value!("int_latency.p50", window.p50); + set_value!("int_latency.p75", window.p75); + set_value!("int_latency.p90", window.p90); + set_value!("int_latency.p95", window.p95); + set_value!("int_latency.p99", window.p99); + set_value!("int_latency.p99_99", window.p99_99); + set_value!("int_latency.outofrange", window.outofrange); + } + + if let Some(window) = broker.outbuf_latency { + set_value!("outbuf_latency.min", window.min); + set_value!("outbuf_latency.max", window.max); + set_value!("outbuf_latency.avg", window.avg); + set_value!("outbuf_latency.sum", window.sum); + set_value!("outbuf_latency.cnt", window.cnt); + set_value!("outbuf_latency.stddev", window.stddev); + set_value!("outbuf_latency.hdrsize", window.hdrsize); + set_value!("outbuf_latency.p50", window.p50); + set_value!("outbuf_latency.p75", window.p75); + set_value!("outbuf_latency.p90", window.p90); + set_value!("outbuf_latency.p95", window.p95); + set_value!("outbuf_latency.p99", window.p99); + set_value!("outbuf_latency.p99_99", window.p99_99); + set_value!("outbuf_latency.outofrange", window.outofrange); + } + } + } + + fn log(&self, level: RDKafkaLogLevel, fac: &str, log_message: &str) { + self.default.log(level, fac, log_message); + if matches!( + level, + RDKafkaLogLevel::Emerg + | RDKafkaLogLevel::Alert + | RDKafkaLogLevel::Critical + | RDKafkaLogLevel::Error + ) { + self.send_error() + } + } + + fn error(&self, error: KafkaError, reason: &str) { + self.default.error(error, reason); + self.send_error() + } +} + +impl ConsumerContext for StatsContext {} + +impl StatsContext { + pub fn create_future_producer( + config: &ClientConfig, + ) -> KafkaResult<(FutureProducer, oneshot::Receiver<()>)> { + let (context, error_rx) = Self::new(); + FutureProducer::from_config_and_context(config, context) + .map(|producer| (producer, error_rx)) + } + + pub fn create_stream_consumer( + config: &ClientConfig, + ) -> KafkaResult<(StreamConsumer, oneshot::Receiver<()>)> { + let (context, error_rx) = Self::new(); + StreamConsumer::from_config_and_context(config, context) + .map(|consumer| (consumer, error_rx)) + } +} + +pub fn dedup_inc() { + KAFKA_DEDUP_TOTAL.inc(); +} + +pub fn recv_inc() { + KAFKA_RECV_TOTAL.inc(); +} + +pub fn sent_inc(kind: GprcMessageKind) { + KAFKA_SENT_TOTAL.with_label_values(&[kind.as_str()]).inc() +} diff --git a/yellowstone-grpc-tools/src/lib.rs b/yellowstone-grpc-tools/src/lib.rs new file mode 100644 index 00000000..ff84b78c --- /dev/null +++ b/yellowstone-grpc-tools/src/lib.rs @@ -0,0 +1,28 @@ +#![deny(clippy::clone_on_ref_ptr)] +#![deny(clippy::missing_const_for_fn)] +#![deny(clippy::trivially_copy_pass_by_ref)] + +pub mod config; +#[cfg(feature = "google-pubsub")] +pub mod google_pubsub; +#[cfg(feature = "kafka")] +pub mod kafka; +pub mod prom; +pub mod version; + +use { + futures::future::{BoxFuture, FutureExt}, + tokio::signal::unix::{signal, SignalKind}, +}; + +pub fn create_shutdown() -> anyhow::Result> { + let mut sigint = signal(SignalKind::interrupt())?; + let mut sigterm = signal(SignalKind::terminate())?; + Ok(async move { + tokio::select! { + _ = sigint.recv() => {}, + _ = sigterm.recv() => {} + }; + } + .boxed()) +} diff --git a/yellowstone-grpc-tools/src/prom.rs b/yellowstone-grpc-tools/src/prom.rs new file mode 100644 index 00000000..911595ff --- /dev/null +++ b/yellowstone-grpc-tools/src/prom.rs @@ -0,0 +1,138 @@ +#[cfg(feature = "google-pubsub")] +use crate::google_pubsub::prom::GOOGLE_PUBSUB_SENT_TOTAL; +#[cfg(feature = "kafka")] +use crate::kafka::prom::{KAFKA_DEDUP_TOTAL, KAFKA_RECV_TOTAL, KAFKA_SENT_TOTAL, KAFKA_STATS}; +use { + crate::version::VERSION as VERSION_INFO, + hyper::{ + server::conn::AddrStream, + service::{make_service_fn, service_fn}, + Body, Request, Response, Server, StatusCode, + }, + prometheus::{IntCounterVec, Opts, Registry, TextEncoder}, + std::{net::SocketAddr, sync::Once}, + tracing::{error, info}, + yellowstone_grpc_proto::prelude::subscribe_update::UpdateOneof, +}; + +lazy_static::lazy_static! { + static ref REGISTRY: Registry = Registry::new(); + + static ref VERSION: IntCounterVec = IntCounterVec::new( + Opts::new("version", "Plugin version info"), + &["buildts", "git", "package", "proto", "rustc", "solana", "version"] + ).unwrap(); +} + +pub fn run_server(address: SocketAddr) -> anyhow::Result<()> { + static REGISTER: Once = Once::new(); + REGISTER.call_once(|| { + macro_rules! register { + ($collector:ident) => { + REGISTRY + .register(Box::new($collector.clone())) + .expect("collector can't be registered"); + }; + } + register!(VERSION); + #[cfg(feature = "google-pubsub")] + { + register!(GOOGLE_PUBSUB_SENT_TOTAL); + } + #[cfg(feature = "kafka")] + { + register!(KAFKA_STATS); + register!(KAFKA_DEDUP_TOTAL); + register!(KAFKA_RECV_TOTAL); + register!(KAFKA_SENT_TOTAL); + } + + VERSION + .with_label_values(&[ + VERSION_INFO.buildts, + VERSION_INFO.git, + VERSION_INFO.package, + VERSION_INFO.proto, + VERSION_INFO.rustc, + VERSION_INFO.solana, + VERSION_INFO.version, + ]) + .inc(); + }); + + let make_service = make_service_fn(move |_: &AddrStream| async move { + Ok::<_, hyper::Error>(service_fn(move |req: Request| async move { + let response = match req.uri().path() { + "/metrics" => metrics_handler(), + _ => not_found_handler(), + }; + Ok::<_, hyper::Error>(response) + })) + }); + let server = Server::try_bind(&address)?.serve(make_service); + info!("prometheus server started: {address:?}"); + tokio::spawn(async move { + if let Err(error) = server.await { + error!("prometheus server failed: {error:?}"); + } + }); + + Ok(()) +} + +fn metrics_handler() -> Response { + let metrics = TextEncoder::new() + .encode_to_string(®ISTRY.gather()) + .unwrap_or_else(|error| { + error!("could not encode custom metrics: {}", error); + String::new() + }); + Response::builder().body(Body::from(metrics)).unwrap() +} + +fn not_found_handler() -> Response { + Response::builder() + .status(StatusCode::NOT_FOUND) + .body(Body::empty()) + .unwrap() +} + +#[derive(Debug, Clone, Copy)] +pub enum GprcMessageKind { + Account, + Slot, + Transaction, + Block, + BlockMeta, + Entry, + Unknown, +} + +impl From<&UpdateOneof> for GprcMessageKind { + fn from(msg: &UpdateOneof) -> Self { + match msg { + UpdateOneof::Account(_) => Self::Account, + UpdateOneof::Slot(_) => Self::Slot, + UpdateOneof::Transaction(_) => Self::Transaction, + UpdateOneof::Block(_) => Self::Block, + UpdateOneof::Ping(_) => unreachable!(), + UpdateOneof::Pong(_) => unreachable!(), + UpdateOneof::BlockMeta(_) => Self::BlockMeta, + UpdateOneof::Entry(_) => Self::Entry, + } + } +} + +impl GprcMessageKind { + pub const fn as_str(self) -> &'static str { + match self { + GprcMessageKind::Account => "account", + GprcMessageKind::Slot => "slot", + GprcMessageKind::Transaction => "transaction", + GprcMessageKind::Block => "block", + GprcMessageKind::BlockMeta => "blockmeta", + GprcMessageKind::Entry => "entry", + GprcMessageKind::Unknown => "unknown", + } + } +} diff --git a/yellowstone-grpc-kafka/src/version.rs b/yellowstone-grpc-tools/src/version.rs similarity index 100% rename from yellowstone-grpc-kafka/src/version.rs rename to yellowstone-grpc-tools/src/version.rs