From 3fb1248189d507079abbf34b2905401efaf38b11 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 28 Nov 2024 13:34:54 -0500 Subject: [PATCH 01/20] geyser: raise default filter name length limit (#473) --- .editorconfig | 6 +----- CHANGELOG.md | 8 ++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- yellowstone-grpc-geyser/Cargo.toml | 2 +- yellowstone-grpc-geyser/src/config.rs | 4 ++-- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.editorconfig b/.editorconfig index 6dddb172..2701ae38 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,11 +9,7 @@ insert_final_newline = true [*.{diff,md}] trim_trailing_whitespace = false -[*.{js,json}] -indent_style = space -indent_size = 2 - -[*.proto] +[*.{js,json,proto}] indent_style = space indent_size = 2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ebb97b6..cc28e72f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,14 @@ The minor version will be incremented upon a breaking change and the patch versi ### Breaking +## 2024-11-28 + +- yellowstone-grpc-geyser-3.0.1 + +### Fixes + +- geyser: raise default filter name length limit ([#473](https://github.com/rpcpool/yellowstone-grpc/pull/473)) + ## 2024-11-20 - yellowstone-grpc-client-simple-3.0.0 diff --git a/Cargo.lock b/Cargo.lock index fc1a7f8e..a0cd5364 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5030,7 +5030,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-geyser" -version = "3.0.0" +version = "3.0.1" dependencies = [ "agave-geyser-plugin-interface", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 0e3a42a2..9113dfcd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = [ "examples/rust", # 3.0.0 "yellowstone-grpc-client", # 3.0.0 - "yellowstone-grpc-geyser", # 3.0.0 + "yellowstone-grpc-geyser", # 3.0.1 "yellowstone-grpc-proto", # 3.0.0 ] diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index e8c959a9..7e033bc2 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-geyser" -version = "3.0.0" +version = "3.0.1" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Plugin" diff --git a/yellowstone-grpc-geyser/src/config.rs b/yellowstone-grpc-geyser/src/config.rs index 1906ae50..239d1b59 100644 --- a/yellowstone-grpc-geyser/src/config.rs +++ b/yellowstone-grpc-geyser/src/config.rs @@ -143,11 +143,11 @@ impl ConfigGrpc { } const fn default_filter_name_size_limit() -> usize { - 32 + 128 } const fn default_filter_names_size_limit() -> usize { - 1_024 + 4_096 } const fn default_filter_names_cleanup_interval() -> Duration { From 45e900ff22f615587684675d5e5f976911c0f3dd Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 28 Nov 2024 14:32:43 -0500 Subject: [PATCH 02/20] add tonic feature to proto crate (#474) --- CHANGELOG.md | 2 ++ yellowstone-grpc-client/Cargo.toml | 2 +- yellowstone-grpc-proto/Cargo.toml | 10 ++++++---- yellowstone-grpc-proto/build.rs | 17 +++++++++++++++-- yellowstone-grpc-proto/src/lib.rs | 20 +++++++++++++++++--- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc28e72f..9f3c24dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ The minor version will be incremented upon a breaking change and the patch versi ### Features +- proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) + ### Breaking ## 2024-11-28 diff --git a/yellowstone-grpc-client/Cargo.toml b/yellowstone-grpc-client/Cargo.toml index 1f7ecae6..f18b919c 100644 --- a/yellowstone-grpc-client/Cargo.toml +++ b/yellowstone-grpc-client/Cargo.toml @@ -16,7 +16,7 @@ futures = { workspace = true } thiserror ={ workspace = true } tonic = { workspace = true, features = ["tls", "tls-roots"] } tonic-health = { workspace = true } -yellowstone-grpc-proto = { workspace = true } +yellowstone-grpc-proto = { workspace = true, features = ["tonic", "tonic-compression"] } [dev-dependencies] tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } diff --git a/yellowstone-grpc-proto/Cargo.toml b/yellowstone-grpc-proto/Cargo.toml index cff5e014..6f9eb360 100644 --- a/yellowstone-grpc-proto/Cargo.toml +++ b/yellowstone-grpc-proto/Cargo.toml @@ -31,7 +31,7 @@ solana-transaction-status = { workspace = true, optional = true } smallvec = { workspace = true, optional = true } spl-token-2022 = { workspace = true, optional = true } thiserror = { workspace = true, optional = true } -tonic = { workspace = true } +tonic = { workspace = true, optional = true } [dev-dependencies] criterion = { workspace = true } @@ -44,7 +44,7 @@ protobuf-src = { workspace = true } tonic-build = { workspace = true } [features] -default = ["convert", "tonic-compression"] +default = ["convert", "tonic", "tonic-compression"] convert = [ "dep:bincode", "dep:solana-account-decoder", @@ -60,10 +60,12 @@ plugin = [ "dep:serde", "dep:smallvec", "dep:spl-token-2022", - "dep:thiserror" + "dep:thiserror", + "dep:tonic" ] plugin-bench = ["plugin", "dep:prost_011", "dep:solana-storage-proto"] -tonic-compression = ["tonic/gzip", "tonic/zstd"] +tonic = ["dep:tonic"] +tonic-compression = ["tonic", "tonic/gzip", "tonic/zstd"] [lints] workspace = true diff --git a/yellowstone-grpc-proto/build.rs b/yellowstone-grpc-proto/build.rs index 9df65193..df89c383 100644 --- a/yellowstone-grpc-proto/build.rs +++ b/yellowstone-grpc-proto/build.rs @@ -1,10 +1,23 @@ -use tonic_build::manual::{Builder, Method, Service}; +use { + std::{env, fs, path::Path}, + tonic_build::manual::{Builder, Method, Service}, +}; fn main() -> anyhow::Result<()> { std::env::set_var("PROTOC", protobuf_src::protoc()); // build protos - tonic_build::compile_protos("proto/geyser.proto")?; + tonic_build::configure().compile_protos(&["proto/geyser.proto"], &["proto"])?; + + // build protos without tonic (wasm) + let out_dir = env::var("OUT_DIR").expect("OUT_DIR not found"); + let out_dir_path = Path::new(&out_dir).join("no-tonic"); + fs::create_dir_all(&out_dir_path).expect("failed to create out no-tonic directory"); + tonic_build::configure() + .build_client(false) + .build_server(false) + .out_dir(out_dir_path) + .compile_protos(&["proto/geyser.proto"], &["proto"])?; // build with accepting our custom struct let geyser_service = Service::builder() diff --git a/yellowstone-grpc-proto/src/lib.rs b/yellowstone-grpc-proto/src/lib.rs index f3bb8cea..80b56af5 100644 --- a/yellowstone-grpc-proto/src/lib.rs +++ b/yellowstone-grpc-proto/src/lib.rs @@ -4,7 +4,10 @@ pub mod geyser { #![allow(clippy::clone_on_ref_ptr)] #![allow(clippy::missing_const_for_fn)] - tonic::include_proto!("geyser"); + #[cfg(feature = "tonic")] + include!(concat!(env!("OUT_DIR"), "/geyser.rs")); + #[cfg(not(feature = "tonic"))] + include!(concat!(env!("OUT_DIR"), "/no-tonic/geyser.rs")); } pub mod solana { @@ -12,7 +15,16 @@ pub mod solana { pub mod storage { pub mod confirmed_block { - tonic::include_proto!("solana.storage.confirmed_block"); + #[cfg(feature = "tonic")] + include!(concat!( + env!("OUT_DIR"), + "/solana.storage.confirmed_block.rs" + )); + #[cfg(not(feature = "tonic"))] + include!(concat!( + env!("OUT_DIR"), + "/no-tonic/solana.storage.confirmed_block.rs" + )); } } } @@ -21,7 +33,9 @@ pub mod prelude { pub use super::{geyser::*, solana::storage::confirmed_block::*}; } -pub use {prost, tonic}; +pub use prost; +#[cfg(feature = "tonic")] +pub use tonic; #[cfg(feature = "plugin")] pub mod plugin; From 625874f2c434501d718944e2729518d6d37677db Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 28 Nov 2024 15:32:56 -0500 Subject: [PATCH 03/20] geyser: use default compression as gzip and zstd (#475) --- CHANGELOG.md | 1 + Cargo.lock | 10 +++++----- deny.toml | 17 ++++++++--------- yellowstone-grpc-geyser/config.json | 4 ++-- yellowstone-grpc-geyser/src/config.rs | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f3c24dc..317d7c72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The minor version will be incremented upon a breaking change and the patch versi ### Features - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) +- geyser: use default compression as gzip and zstd ([#475](https://github.com/rpcpool/yellowstone-grpc/pull/475)) ### Breaking diff --git a/Cargo.lock b/Cargo.lock index a0cd5364..074721b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3117,9 +3117,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.17" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "log", "once_cell", @@ -4270,7 +4270,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.17", + "rustls 0.23.19", "rustls-pki-types", "tokio", ] @@ -4561,9 +4561,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", diff --git a/deny.toml b/deny.toml index 1da0d6e4..0ec726b7 100644 --- a/deny.toml +++ b/deny.toml @@ -11,16 +11,15 @@ ignore = [ # Advisory: https://rustsec.org/advisories/RUSTSEC-2022-0093 "RUSTSEC-2022-0093", - # borsh 0.9.3 - # borsh 0.10.3 - # Advisory: https://rustsec.org/advisories/RUSTSEC-2023-0033 - "RUSTSEC-2023-0033", - - # proc-macro-error 1.0.4 - # Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0370 - "RUSTSEC-2024-0370", - # atty 0.2.14 # Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0375 "RUSTSEC-2024-0375", + + # instant 0.1.13 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0384 + "RUSTSEC-2024-0384", + + # derivative 2.2.0 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0388 + "RUSTSEC-2024-0388", ] diff --git a/yellowstone-grpc-geyser/config.json b/yellowstone-grpc-geyser/config.json index 69a8862e..5f347210 100644 --- a/yellowstone-grpc-geyser/config.json +++ b/yellowstone-grpc-geyser/config.json @@ -10,8 +10,8 @@ "key_path": "" }, "compression": { - "accept": ["gzip"], - "send": ["gzip"] + "accept": ["gzip", "zstd"], + "send": ["gzip", "zstd"] }, "max_decoding_message_size": "4_194_304", "snapshot_plugin_channel_capacity": null, diff --git a/yellowstone-grpc-geyser/src/config.rs b/yellowstone-grpc-geyser/src/config.rs index 239d1b59..d03b20fe 100644 --- a/yellowstone-grpc-geyser/src/config.rs +++ b/yellowstone-grpc-geyser/src/config.rs @@ -206,7 +206,7 @@ impl ConfigGrpcCompression { } fn default_compression() -> Vec { - vec![CompressionEncoding::Gzip] + vec![CompressionEncoding::Gzip, CompressionEncoding::Zstd] } } From c4ae964588081fac527a9847a54fe73d2af4ed3d Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sat, 30 Nov 2024 09:26:47 -0500 Subject: [PATCH 04/20] example: add connection options to Rust client (#478) --- CHANGELOG.md | 1 + examples/rust/src/bin/client.rs | 93 +++++++++++++++++++++++++++--- yellowstone-grpc-client/src/lib.rs | 52 ++++++----------- 3 files changed, 103 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 317d7c72..352bfc99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The minor version will be incremented upon a breaking change and the patch versi - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) - geyser: use default compression as gzip and zstd ([#475](https://github.com/rpcpool/yellowstone-grpc/pull/475)) +- example: add connection options to Rust client ([#478](https://github.com/rpcpool/yellowstone-grpc/pull/478)) ### Breaking diff --git a/examples/rust/src/bin/client.rs b/examples/rust/src/bin/client.rs index 9813e580..eacf0919 100644 --- a/examples/rust/src/bin/client.rs +++ b/examples/rust/src/bin/client.rs @@ -55,14 +55,58 @@ struct Args { #[clap(long)] x_token: Option, - /// Commitment level: processed, confirmed or finalized + /// Apply a timeout to connecting to the uri. #[clap(long)] - commitment: Option, + connect_timeout_ms: Option, + + /// Sets the tower service default internal buffer size, default is 1024 + #[clap(long)] + buffer_size: Option, + + /// Sets whether to use an adaptive flow control. Uses hyper’s default otherwise. + #[clap(long)] + http2_adaptive_window: Option, + + /// Set http2 KEEP_ALIVE_TIMEOUT. Uses hyper’s default otherwise. + #[clap(long)] + http2_keep_alive_interval_ms: Option, + + /// Sets the max connection-level flow control for HTTP2, default is 65,535 + #[clap(long)] + initial_connection_window_size: Option, + + ///Sets the SETTINGS_INITIAL_WINDOW_SIZE option for HTTP2 stream-level flow control, default is 65,535 + #[clap(long)] + initial_stream_window_size: Option, + + ///Set http2 KEEP_ALIVE_TIMEOUT. Uses hyper’s default otherwise. + #[clap(long)] + keep_alive_timeout_ms: Option, + + /// Set http2 KEEP_ALIVE_WHILE_IDLE. Uses hyper’s default otherwise. + #[clap(long)] + keep_alive_while_idle: Option, + + /// Set whether TCP keepalive messages are enabled on accepted connections. + #[clap(long)] + tcp_keepalive_ms: Option, + + /// Set the value of TCP_NODELAY option for accepted connections. Enabled by default. + #[clap(long)] + tcp_nodelay: Option, + + /// Apply a timeout to each request. + #[clap(long)] + timeout_ms: Option, /// Max message size before decoding, full blocks can be super large, default is 1GiB #[clap(long, default_value_t = 1024 * 1024 * 1024)] max_decoding_message_size: usize, + /// Commitment level: processed, confirmed or finalized + #[clap(long)] + commitment: Option, + #[command(subcommand)] action: Action, } @@ -73,15 +117,46 @@ impl Args { } async fn connect(&self) -> anyhow::Result> { - GeyserGrpcClient::build_from_shared(self.endpoint.clone())? + let mut builder = GeyserGrpcClient::build_from_shared(self.endpoint.clone())? .x_token(self.x_token.clone())? - .connect_timeout(Duration::from_secs(10)) - .timeout(Duration::from_secs(10)) .tls_config(ClientTlsConfig::new().with_native_roots())? - .max_decoding_message_size(self.max_decoding_message_size) - .connect() - .await - .map_err(Into::into) + .max_decoding_message_size(self.max_decoding_message_size); + + if let Some(duration) = self.connect_timeout_ms { + builder = builder.connect_timeout(Duration::from_millis(duration)); + } + if let Some(sz) = self.buffer_size { + builder = builder.buffer_size(sz); + } + if let Some(enabled) = self.http2_adaptive_window { + builder = builder.http2_adaptive_window(enabled); + } + if let Some(duration) = self.http2_keep_alive_interval_ms { + builder = builder.http2_keep_alive_interval(Duration::from_millis(duration)); + } + if let Some(sz) = self.initial_connection_window_size { + builder = builder.initial_connection_window_size(sz); + } + if let Some(sz) = self.initial_stream_window_size { + builder = builder.initial_stream_window_size(sz); + } + if let Some(duration) = self.keep_alive_timeout_ms { + builder = builder.keep_alive_timeout(Duration::from_millis(duration)); + } + if let Some(enabled) = self.keep_alive_while_idle { + builder = builder.keep_alive_while_idle(enabled); + } + if let Some(duration) = self.tcp_keepalive_ms { + builder = builder.tcp_keepalive(Some(Duration::from_millis(duration))); + } + if let Some(enabled) = self.tcp_nodelay { + builder = builder.tcp_nodelay(enabled); + } + if let Some(duration) = self.timeout_ms { + builder = builder.timeout(Duration::from_millis(duration)); + } + + builder.connect().await.map_err(Into::into) } } diff --git a/yellowstone-grpc-client/src/lib.rs b/yellowstone-grpc-client/src/lib.rs index ce880dde..f3066f57 100644 --- a/yellowstone-grpc-client/src/lib.rs +++ b/yellowstone-grpc-client/src/lib.rs @@ -201,12 +201,8 @@ impl GeyserGrpcClient { pub enum GeyserGrpcBuilderError { #[error("Failed to parse x-token: {0}")] MetadataValueError(#[from] InvalidMetadataValue), - #[error("Invalid X-Token length: {0}, expected 28")] - InvalidXTokenLength(usize), #[error("gRPC transport error: {0}")] TonicError(#[from] tonic::transport::Error), - #[error("tonic::transport::Channel should be created, use `connect` or `connect_lazy` first")] - EmptyChannel, } pub type GeyserGrpcBuilderResult = Result; @@ -290,16 +286,7 @@ impl GeyserGrpcBuilder { T: TryInto, { Ok(Self { - x_token: match x_token { - Some(x_token) => { - let x_token = x_token.try_into()?; - if x_token.is_empty() { - return Err(GeyserGrpcBuilderError::InvalidXTokenLength(x_token.len())); - } - Some(x_token) - } - None => None, - }, + x_token: x_token.map(|x_token| x_token.try_into()).transpose()?, ..self }) } @@ -320,20 +307,6 @@ impl GeyserGrpcBuilder { } } - pub fn timeout(self, dur: Duration) -> Self { - Self { - endpoint: self.endpoint.timeout(dur), - ..self - } - } - - pub fn tls_config(self, tls_config: ClientTlsConfig) -> GeyserGrpcBuilderResult { - Ok(Self { - endpoint: self.endpoint.tls_config(tls_config)?, - ..self - }) - } - pub fn buffer_size(self, sz: impl Into>) -> Self { Self { endpoint: self.endpoint.buffer_size(sz), @@ -397,6 +370,20 @@ impl GeyserGrpcBuilder { } } + pub fn timeout(self, dur: Duration) -> Self { + Self { + endpoint: self.endpoint.timeout(dur), + ..self + } + } + + pub fn tls_config(self, tls_config: ClientTlsConfig) -> GeyserGrpcBuilderResult { + Ok(Self { + endpoint: self.endpoint.tls_config(tls_config)?, + ..self + }) + } + // Geyser options pub fn send_compressed(self, encoding: CompressionEncoding) -> Self { Self { @@ -429,7 +416,7 @@ impl GeyserGrpcBuilder { #[cfg(test)] mod tests { - use super::{GeyserGrpcBuilderError, GeyserGrpcClient}; + use super::GeyserGrpcClient; #[tokio::test] async fn test_channel_https_success() { @@ -462,7 +449,7 @@ mod tests { } #[tokio::test] - async fn test_channel_invalid_token_some() { + async fn test_channel_empty_token_some() { let endpoint = "http://127.0.0.1:10000"; let x_token = ""; @@ -470,10 +457,7 @@ mod tests { assert!(res.is_ok()); let res = res.unwrap().x_token(Some(x_token)); - assert!(matches!( - res, - Err(GeyserGrpcBuilderError::InvalidXTokenLength(_)) - )); + assert!(res.is_ok()); } #[tokio::test] From 75df98520628c29429277563e5a91bbf232cd0bb Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sun, 1 Dec 2024 14:21:05 -0500 Subject: [PATCH 05/20] nodejs: add parse tx function (#471) Co-authored-by: Dmitry Rybalchenko <108054435+dm-rybalchenko@users.noreply.github.com> --- .editorconfig | 3 + .github/workflows/test.yml | 22 + .gitignore | 1 + CHANGELOG.md | 1 + Cargo.lock | 6 +- Cargo.toml | 3 + Makefile | 27 + examples/typescript/package-lock.json | 8 +- examples/typescript/src/client.ts | 17 + .../package-lock.json | 380 ++- yellowstone-grpc-client-nodejs/package.json | 9 +- .../solana-encoding-wasm/Cargo.lock | 2748 +++++++++++++++++ .../solana-encoding-wasm/Cargo.toml | 36 + .../solana-encoding-wasm/src/lib.rs | 51 + yellowstone-grpc-client-nodejs/src/index.ts | 39 +- yellowstone-grpc-client-nodejs/src/types.ts | 22 + 16 files changed, 3352 insertions(+), 21 deletions(-) create mode 100644 yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock create mode 100644 yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml create mode 100644 yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs create mode 100644 yellowstone-grpc-client-nodejs/src/types.ts diff --git a/.editorconfig b/.editorconfig index 2701ae38..0d68a802 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,3 +16,6 @@ indent_size = 2 [*.rs] indent_style = space indent_size = 4 + +[{Makefile,**.mk}] +indent_style = tab diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5fb118a5..b531e5b7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,6 +65,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: + targets: wasm32-unknown-unknown toolchain: ${{ env.RUST_STABLE }} - name: Install dependencies @@ -78,16 +79,37 @@ jobs: git checkout Cargo.lock cargo tree --frozen + - name: cargo tree wasm + run: | + cd yellowstone-grpc-client-nodejs/solana-encoding-wasm + cargo tree + git checkout Cargo.lock + cargo tree --frozen + - name: cargo fmt run: cargo +nightly fmt --all -- --check + - name: cargo fmt wasm + run: | + cd yellowstone-grpc-client-nodejs/solana-encoding-wasm + cargo +nightly fmt --all -- --check + - name: cargo deny check advisories uses: EmbarkStudios/cargo-deny-action@v1 with: command: check advisories + - name: cargo deny check advisories wasm + uses: EmbarkStudios/cargo-deny-action@v1 + with: + command: check advisories + manifest-path: ./yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml - name: cargo clippy run: cargo clippy --workspace --all-targets + - name: cargo clippy wasm + run: | + cd yellowstone-grpc-client-nodejs/solana-encoding-wasm + cargo clippy --target wasm32-unknown-unknown --all-targets - name: check features in `client` run: cargo check -p yellowstone-grpc-client --all-targets diff --git a/.gitignore b/.gitignore index ace60611..dccf1eb3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ examples/typescript/dist examples/typescript/node_modules yellowstone-grpc-client-nodejs/dist yellowstone-grpc-client-nodejs/node_modules +yellowstone-grpc-client-nodejs/src/encoding yellowstone-grpc-client-nodejs/src/grpc # Python diff --git a/CHANGELOG.md b/CHANGELOG.md index 352bfc99..0d626f02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The minor version will be incremented upon a breaking change and the patch versi - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) - geyser: use default compression as gzip and zstd ([#475](https://github.com/rpcpool/yellowstone-grpc/pull/475)) - example: add connection options to Rust client ([#478](https://github.com/rpcpool/yellowstone-grpc/pull/478)) +- nodejs: add parse tx function ([#471](https://github.com/rpcpool/yellowstone-grpc/pull/471)) ### Breaking diff --git a/Cargo.lock b/Cargo.lock index 074721b1..9ee36f6e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3117,9 +3117,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" dependencies = [ "log", "once_cell", @@ -4270,7 +4270,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.19", + "rustls 0.23.18", "rustls-pki-types", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 9113dfcd..43c7c821 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,9 @@ members = [ "yellowstone-grpc-geyser", # 3.0.1 "yellowstone-grpc-proto", # 3.0.0 ] +exclude = [ + "yellowstone-grpc-client-nodejs/solana-encoding-wasm", # 1.0.0 +] [workspace.package] authors = ["Triton One"] diff --git a/Makefile b/Makefile index d2a253a5..97a64d4a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,33 @@ +clean: clean-nodejs clean-rust + clean-nodejs: rm -rf examples/typescript/dist rm -rf examples/typescript/node_modules rm -rf yellowstone-grpc-client-nodejs/dist rm -rf yellowstone-grpc-client-nodejs/node_modules + rm -rf yellowstone-grpc-client-nodejs/src/encoding rm -rf yellowstone-grpc-client-nodejs/src/grpc + +clean-rust: + rm -rf target + rm -rf yellowstone-grpc-client-nodejs/solana-encoding-wasm/target + +solana-encoding-wasm-clippy: + cd yellowstone-grpc-client-nodejs/solana-encoding-wasm && \ + cargo clippy --target wasm32-unknown-unknown --all-targets + +solana-encoding-wasm-build: + # RUSTFLAGS to disable `mold` + cd yellowstone-grpc-client-nodejs/solana-encoding-wasm && \ + RUSTFLAGS="" cargo build \ + --target wasm32-unknown-unknown \ + --release + + cd yellowstone-grpc-client-nodejs/solana-encoding-wasm && \ + rm -rf ../src/encoding/ && \ + wasm-bindgen \ + --target nodejs \ + --out-dir ../src/encoding/ \ + target/wasm32-unknown-unknown/release/yellowstone_grpc_solana_encoding_wasm.wasm && \ + mkdir -p ../dist/encoding/ && \ + cp -ap ../src/encoding/ ../dist/ diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index 348a1605..d93c5fa5 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -19,15 +19,19 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.0.0", + "version": "1.2.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" }, "devDependencies": { + "@solana/rpc-api": "=2.0.0", "prettier": "^2.8.3", "ts-proto": "^1.139.0", - "typescript": "^4.9.5" + "typescript": "=5.2.2" + }, + "engines": { + "node": ">=20.18.0" } }, "node_modules/@triton-one/yellowstone-grpc": { diff --git a/examples/typescript/src/client.ts b/examples/typescript/src/client.ts index 9d3e22dd..7068e30c 100644 --- a/examples/typescript/src/client.ts +++ b/examples/typescript/src/client.ts @@ -4,6 +4,8 @@ import Client, { SubscribeRequest, SubscribeRequestFilterAccountsFilter, SubscribeRequestFilterAccountsFilterLamports, + SubscribeUpdateTransactionInfo, + txEncode, } from "@triton-one/yellowstone-grpc"; async function main() { @@ -83,6 +85,16 @@ async function subscribeCommand(client, args) { // Handle updates stream.on("data", (data) => { + if (data.transaction && args.transactionsParsed) { + const slot = data.transaction.slot; + const message = data.transaction.transaction; + const tx = txEncode.encode(message, txEncode.encoding.Json, 255, true); + console.log( + `TX filters: ${data.filters}, slot#${slot}, tx: ${JSON.stringify(tx)}` + ); + return; + } + console.log("data", data); }); @@ -374,6 +386,11 @@ function parseCommandLineArgs() { description: "filter required account in transactions", type: "array", }, + "transactions-parsed": { + default: false, + describe: "parse transaction to json", + type: "boolean", + }, "transactions-status": { default: false, describe: "subscribe on transactionsStatus updates", diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index 3b3f8a77..0d9cbc23 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,20 +1,24 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.0.0", + "version": "1.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.0.0", + "version": "1.2.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" }, "devDependencies": { + "@solana/rpc-api": "=2.0.0", "prettier": "^2.8.3", "ts-proto": "^1.139.0", - "typescript": "^4.9.5" + "typescript": "=5.2.2" + }, + "engines": { + "node": ">=20.18.0" } }, "node_modules/@grpc/grpc-js": { @@ -118,6 +122,336 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@solana/addresses": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.0.0.tgz", + "integrity": "sha512-8n3c/mUlH1/z+pM8e7OJ6uDSXw26Be0dgYiokiqblO66DGQ0d+7pqFUFZ5pEGjJ9PU2lDTSfY8rHf4cemOqwzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.0.0", + "@solana/codecs-core": "2.0.0", + "@solana/codecs-strings": "2.0.0", + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/assertions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.0.0.tgz", + "integrity": "sha512-NyPPqZRNGXs/GAjfgsw7YS6vCTXWt4ibXveS+ciy5sdmp/0v3pA6DlzYjleF9Sljrew0IiON15rjaXamhDxYfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0.tgz", + "integrity": "sha512-qCG+3hDU5Pm8V6joJjR4j4Zv9md1z0RaecniNDIkEglnxmOUODnmPLWbtOjnDylfItyuZeDihK8hkewdj8cUtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-data-structures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0.tgz", + "integrity": "sha512-N98Y4jsrC/XeOgqrfsGqcOFIaOoMsKdAxOmy5oqVaEN67YoGSLNC9ROnqamOAOrsZdicTWx9/YLKFmQi9DPh1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0", + "@solana/codecs-numbers": "2.0.0", + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0.tgz", + "integrity": "sha512-r66i7VzJO1MZkQWZIAI6jjJOFVpnq0+FIabo2Z2ZDtrArFus/SbSEv543yCLeD2tdR/G/p+1+P5On10qF50Y1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0", + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-strings": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0.tgz", + "integrity": "sha512-dNqeCypsvaHcjW86H0gYgAZGGkKVBeKVeh7WXlOZ9kno7PeQ2wNkpccyzDfuzaIsKv+HZUD3v/eo86GCvnKazQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.0.0", + "@solana/codecs-numbers": "2.0.0", + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" + } + }, + "node_modules/@solana/errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0.tgz", + "integrity": "sha512-IHlaPFSy4lvYco1oHJ3X8DbchWwAwJaL/4wZKnF1ugwZ0g0re8wbABrqNOe/jyZ84VU9Z14PYM8W9oDAebdJbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/functional": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.0.0.tgz", + "integrity": "sha512-Sj+sLiUTimnMEyGnSLGt0lbih2xPDUhxhonnrIkPwA+hjQ3ULGHAxeevHU06nqiVEgENQYUJ5rCtHs4xhUFAkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/instructions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.0.0.tgz", + "integrity": "sha512-MiTEiNF7Pzp+Y+x4yadl2VUcNHboaW5WP52psBuhHns3GpbbruRv5efMpM9OEQNe1OsN+Eg39vjEidX55+P+DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.0.0.tgz", + "integrity": "sha512-SSLSX8BXRvfLKBqsmBghmlhMKpwHeWd5CHi5zXgTS1BRrtiU6lcrTVC9ie6B+WaNNq7oe3e6K5bdbhu3fFZ+0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.0.0", + "@solana/codecs-core": "2.0.0", + "@solana/codecs-strings": "2.0.0", + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.0.0.tgz", + "integrity": "sha512-1FwitYxwADMF/6zKP2kNXg8ESxB6GhNBNW1c4f5dEmuXuBbeD/enLV3WMrpg8zJkIaaYarEFNbt7R7HyFzmURQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.0.0", + "@solana/codecs-core": "2.0.0", + "@solana/codecs-strings": "2.0.0", + "@solana/errors": "2.0.0", + "@solana/keys": "2.0.0", + "@solana/rpc-parsed-types": "2.0.0", + "@solana/rpc-spec": "2.0.0", + "@solana/rpc-transformers": "2.0.0", + "@solana/rpc-types": "2.0.0", + "@solana/transaction-messages": "2.0.0", + "@solana/transactions": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-parsed-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.0.0.tgz", + "integrity": "sha512-VCeY/oKVEtBnp8EDOc5LSSiOeIOLFIgLndcxqU0ij/cZaQ01DOoHbhluvhZtU80Z3dUeicec8TiMgkFzed+WhQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-spec": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.0.0.tgz", + "integrity": "sha512-1uIDzj7vocCUqfOifjv1zAuxQ53ugiup/42edVFoQLOnJresoEZLL6WjnsJq4oCTccEAvGhUBI1WWKeZTGNxFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/errors": "2.0.0", + "@solana/rpc-spec-types": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-spec-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.0.0.tgz", + "integrity": "sha512-G2lmhFhgtxMQd/D6B04BHGE7bm5dMZdIPQNOqVGhzNAVjrmyapD3JN2hKAbmaYPe97wLfZERw0Ux1u4Y6q7TqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-transformers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.0.0.tgz", + "integrity": "sha512-H6tN0qcqzUangowsLLQtYXKJsf1Roe3/qJ1Cy0gv9ojY9uEvNbJqpeEj+7blv0MUZfEe+rECAwBhxxRKPMhYGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/errors": "2.0.0", + "@solana/functional": "2.0.0", + "@solana/rpc-spec-types": "2.0.0", + "@solana/rpc-types": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.0.0.tgz", + "integrity": "sha512-o1ApB9PYR0A3XjVSOh//SOVWgjDcqMlR3UNmtqciuREIBmWqnvPirdOa5EJxD3iPhfA4gnNnhGzT+tMDeDW/Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.0.0", + "@solana/codecs-core": "2.0.0", + "@solana/codecs-numbers": "2.0.0", + "@solana/codecs-strings": "2.0.0", + "@solana/errors": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/transaction-messages": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.0.0.tgz", + "integrity": "sha512-Uc6Fw1EJLBrmgS1lH2ZfLAAKFvprWPQQzOVwZS78Pv8Whsk7tweYTK6S0Upv0nHr50rGpnORJfmdBrXE6OfNGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.0.0", + "@solana/codecs-core": "2.0.0", + "@solana/codecs-data-structures": "2.0.0", + "@solana/codecs-numbers": "2.0.0", + "@solana/errors": "2.0.0", + "@solana/functional": "2.0.0", + "@solana/instructions": "2.0.0", + "@solana/rpc-types": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/transactions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.0.0.tgz", + "integrity": "sha512-VfdTE+59WKvuBG//6iE9RPjAB+ZT2kLgY2CDHabaz6RkH6OjOkMez9fWPVa3Xtcus+YQWN1SnQoryjF/xSx04w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.0.0", + "@solana/codecs-core": "2.0.0", + "@solana/codecs-data-structures": "2.0.0", + "@solana/codecs-numbers": "2.0.0", + "@solana/codecs-strings": "2.0.0", + "@solana/errors": "2.0.0", + "@solana/functional": "2.0.0", + "@solana/instructions": "2.0.0", + "@solana/keys": "2.0.0", + "@solana/rpc-types": "2.0.0", + "@solana/transaction-messages": "2.0.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -171,6 +505,19 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -203,6 +550,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/dataloader": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", @@ -245,6 +602,14 @@ "node": ">=6" } }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -456,16 +821,17 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/wrap-ansi": { diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index 29d4aadb..8e4a9a12 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,6 +1,7 @@ { + "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.0.0", + "version": "1.2.0", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", @@ -29,9 +30,13 @@ "@grpc/grpc-js": "^1.8.0" }, "devDependencies": { + "@solana/rpc-api": "=2.0.0", "prettier": "^2.8.3", "ts-proto": "^1.139.0", - "typescript": "^4.9.5" + "typescript": "=5.2.2" + }, + "engines": { + "node": ">=20.18.0" }, "files": [ "dist" diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock new file mode 100644 index 00000000..121b34b3 --- /dev/null +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock @@ -0,0 +1,2748 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "autotools" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef941527c41b0fc0dd48511a8154cd5fc7e29200a0ff8b7203c5d777dbc795cf" +dependencies = [ + "cc", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "blake3" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" +dependencies = [ + "borsh-derive 0.10.4", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" +dependencies = [ + "borsh-derive 1.5.3", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" +dependencies = [ + "once_cell", + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "cc" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.89", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.89", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" +dependencies = [ + "bytes", + "heck", + "itertools 0.13.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.89", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +dependencies = [ + "anyhow", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "prost-types" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" +dependencies = [ + "prost", +] + +[[package]] +name = "protobuf-src" +version = "1.1.0+21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" +dependencies = [ + "autotools", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "serde_json" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "solana-account-decoder" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode", + "bs58", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-compute-budget" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "rustc_version", + "solana-sdk", +] + +[[package]] +name = "solana-config-program" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-curve25519" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "solana-program", + "thiserror", +] + +[[package]] +name = "solana-measure" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-program" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.22.1", + "bincode", + "bitflags", + "blake3", + "borsh 0.10.4", + "borsh 1.5.3", + "bs58", + "bv", + "bytemuck", + "bytemuck_derive", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memoffset", + "num-bigint 0.4.6", + "num-derive", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-sdk-macro", + "thiserror", + "wasm-bindgen", +] + +[[package]] +name = "solana-program-runtime" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "base64 0.22.1", + "bincode", + "eager", + "enum-iterator", + "itertools 0.12.1", + "libc", + "log", + "num-derive", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-compute-budget", + "solana-measure", + "solana-sdk", + "solana-type-overrides", + "solana-vote", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-sdk" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "bincode", + "bitflags", + "borsh 1.5.3", + "bs58", + "bytemuck", + "bytemuck_derive", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "getrandom 0.1.16", + "hmac 0.12.1", + "itertools 0.12.1", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num_enum", + "pbkdf2", + "qstring", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "siphasher", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.89", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-transaction-status" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode", + "borsh 1.5.3", + "bs58", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror", +] + +[[package]] +name = "solana-type-overrides" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "lazy_static", + "rand 0.8.5", +] + +[[package]] +name = "solana-vote" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "itertools 0.12.1", + "log", + "rustc_version", + "serde", + "serde_derive", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "2.0.16" +source = "git+https://github.com/rpcpool/solana-public.git?tag=v2.0.16-grpc#7900839b1ce466ba358676d08c845b6014c91bd9" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "byteorder", + "curve25519-dalek", + "itertools 0.12.1", + "lazy_static", + "merlin", + "num-derive", + "num-traits", + "rand 0.7.3", + "serde", + "serde_derive", + "serde_json", + "sha3 0.9.1", + "solana-curve25519", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", +] + +[[package]] +name = "solana_rbpf" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff08afd63f70a1ba712fb0017be41e93b017f7e874785b54bb5ec9aa8949781d" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + +[[package]] +name = "spl-associated-token-account" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" +dependencies = [ + "assert_matches", + "borsh 1.5.3", + "num-derive", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38ea8b6dedb7065887f12d62ed62c1743aa70749e8558f963609793f6fb12bc" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.89", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.89", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0dba2f2bb6419523405d21c301a32c9f9568354d4742552e7972af801f4bdb3" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" +dependencies = [ + "borsh 1.5.3", + "bytemuck", + "bytemuck_derive", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7b28bed65356558133751cc32b48a7a5ddfc59ac4e941314630bbed1ac10532" +dependencies = [ + "num-derive", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.89", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a75a5f0fcc58126693ed78a17042e9dc53f07e357d6be91789f7d62aff61a4" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-token" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a0f06ac7f23dc0984931b1fe309468f14ea58e32660439c1cef19456f5d0e3" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c10f3483e48679619c76598d4e4aebb955bc49b0a5cc63323afbf44135c9bf" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8752b85a5ecc1d9f3a43bce3dd9a6a053673aacf5deb513d1cbb88d3534ffd" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" +dependencies = [ + "borsh 1.5.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a110f33d941275d9f868b96daaa993f1e73b6806cc8836e43075b4d3ad8338a7" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdcd73ec187bc409464c60759232e309f83b52a18a9c5610bf281c9c6432918c" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tonic-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.89", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "yellowstone-grpc-proto" +version = "3.0.0" +dependencies = [ + "anyhow", + "bincode", + "prost", + "protobuf-src", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "tonic-build", +] + +[[package]] +name = "yellowstone-grpc-solana-encoding-wasm" +version = "2.0.0" +dependencies = [ + "serde_json", + "solana-transaction-status", + "wasm-bindgen", + "yellowstone-grpc-proto", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml new file mode 100644 index 00000000..ed2f5a23 --- /dev/null +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "yellowstone-grpc-solana-encoding-wasm" +version = "2.0.0" +authors = ["Triton One"] +edition = "2021" +homepage = "https://triton.one" +repository = "https://github.com/rpcpool/yellowstone-grpc" +license = "Apache-2.0" +keywords = ["solana"] +publish = false + +[lib] +crate-type = ["cdylib"] + +[dependencies] +serde_json = "1.0.86" +solana-transaction-status = "~2.0.16" +wasm-bindgen = "0.2.95" +yellowstone-grpc-proto = { path = "../../yellowstone-grpc-proto", version = "3.0.0", default-features = false, features = ["convert"] } + +[workspace.lints.clippy] +clone_on_ref_ptr = "deny" +missing_const_for_fn = "deny" +trivially_copy_pass_by_ref = "deny" + +[profile.release] +lto = true +codegen-units = 1 + +# we need to drop `solana-metrics` for wasm32 target +[patch.crates-io] +solana-account-decoder = { git = "https://github.com/rpcpool/solana-public.git", tag = "v2.0.16-grpc" } +solana-program = { git = "https://github.com/rpcpool/solana-public.git", tag = "v2.0.16-grpc" } +solana-sdk = { git = "https://github.com/rpcpool/solana-public.git", tag = "v2.0.16-grpc" } +solana-transaction-status = { git = "https://github.com/rpcpool/solana-public.git", tag = "v2.0.16-grpc" } +solana-zk-token-sdk = { git = "https://github.com/rpcpool/solana-public.git", tag = "v2.0.16-grpc" } diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs new file mode 100644 index 00000000..703fa9cd --- /dev/null +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs @@ -0,0 +1,51 @@ +use { + solana_transaction_status::{TransactionWithStatusMeta, UiTransactionEncoding}, + wasm_bindgen::prelude::*, + yellowstone_grpc_proto::{ + convert_from, prelude::SubscribeUpdateTransactionInfo, prost::Message, + }, +}; + +#[wasm_bindgen] +#[derive(Debug, Clone, Copy)] +pub enum WasmUiTransactionEncoding { + Binary = 0, + Base64 = 1, + Base58 = 2, + Json = 3, + JsonParsed = 4, +} + +impl From for UiTransactionEncoding { + fn from(encoding: WasmUiTransactionEncoding) -> Self { + match encoding { + WasmUiTransactionEncoding::Binary => UiTransactionEncoding::Binary, + WasmUiTransactionEncoding::Base64 => UiTransactionEncoding::Base64, + WasmUiTransactionEncoding::Base58 => UiTransactionEncoding::Base58, + WasmUiTransactionEncoding::Json => UiTransactionEncoding::Json, + WasmUiTransactionEncoding::JsonParsed => UiTransactionEncoding::JsonParsed, + } + } +} + +#[wasm_bindgen] +pub fn encode( + data: &[u8], + encoding: WasmUiTransactionEncoding, + max_supported_transaction_version: Option, + show_rewards: bool, +) -> Result { + let tx = SubscribeUpdateTransactionInfo::decode(data)?; + if let TransactionWithStatusMeta::Complete(tx) = + convert_from::create_tx_with_meta(tx).map_err(JsError::new)? + { + serde_json::to_string(&tx.encode( + encoding.into(), + max_supported_transaction_version, + show_rewards, + )?) + .map_err(Into::into) + } else { + Err(JsError::new("tx with missing metadata")) + } +} diff --git a/yellowstone-grpc-client-nodejs/src/index.ts b/yellowstone-grpc-client-nodejs/src/index.ts index 6b653b01..5a0421f7 100644 --- a/yellowstone-grpc-client-nodejs/src/index.ts +++ b/yellowstone-grpc-client-nodejs/src/index.ts @@ -2,6 +2,13 @@ * TypeScript/JavaScript client for gRPC Geyser. */ +import { + ChannelCredentials, + credentials, + ChannelOptions, + Metadata, +} from "@grpc/grpc-js"; + // Import generated gRPC client and types. import { CommitmentLevel, @@ -15,15 +22,9 @@ import { SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, SubscribeRequestFilterTransactions, + SubscribeUpdateTransactionInfo, } from "./grpc/geyser"; -import { - ChannelCredentials, - credentials, - ChannelOptions, - Metadata, -} from "@grpc/grpc-js"; - // Reexport automatically generated types export { CommitmentLevel, @@ -54,6 +55,30 @@ export { SubscribeUpdateTransactionInfo, } from "./grpc/geyser"; +// Import transaction encoding function created in Rust +import * as wasm from "./encoding/yellowstone_grpc_solana_encoding_wasm"; +// Import mapper to get return type based on WasmUiTransactionEncoding +import { MapTransactionEncodingToReturnType } from "./types"; +export const txEncode = { + encoding: wasm.WasmUiTransactionEncoding, + encode_raw: wasm.encode, + encode: ( + message: SubscribeUpdateTransactionInfo, + encoding: T, + max_supported_transaction_version: number | undefined, + show_rewards: boolean + ): MapTransactionEncodingToReturnType[T] => { + return JSON.parse( + wasm.encode( + SubscribeUpdateTransactionInfo.encode(message).finish(), + encoding, + max_supported_transaction_version, + show_rewards + ) + ); + }, +}; + export default class Client { _client: GeyserClient; _insecureXToken: string | undefined; diff --git a/yellowstone-grpc-client-nodejs/src/types.ts b/yellowstone-grpc-client-nodejs/src/types.ts new file mode 100644 index 00000000..520780f2 --- /dev/null +++ b/yellowstone-grpc-client-nodejs/src/types.ts @@ -0,0 +1,22 @@ +import { type GetTransactionApi } from "@solana/rpc-api"; +import { type Signature } from "@solana/keys/dist/types"; + +const fakeGetTransition: GetTransactionApi["getTransaction"] = ( + signature, + config +) => null; + +const signature = "" as Signature; + +const base58 = fakeGetTransition(signature, { encoding: "base58" }); +const base64 = fakeGetTransition(signature, { encoding: "base64" }); +const json = fakeGetTransition(signature, { encoding: "json" }); +const jsonParsed = fakeGetTransition(signature, { encoding: "jsonParsed" }); + +export type MapTransactionEncodingToReturnType = { + 0: typeof base58; // legacy (binary) + 1: typeof base64; + 2: typeof base58; + 3: typeof json; + 4: typeof jsonParsed; +}; From 0c62550a8ce0fd5a64bf8d5073b2b1cd27d556b9 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sun, 1 Dec 2024 17:57:16 -0500 Subject: [PATCH 06/20] geyser: add worker_threads and affinity (#481) --- CHANGELOG.md | 15 ++++-- Cargo.lock | 27 +++++++++- Cargo.toml | 5 +- examples/rust/Cargo.toml | 2 +- yellowstone-grpc-geyser/Cargo.toml | 3 +- yellowstone-grpc-geyser/config.json | 4 ++ yellowstone-grpc-geyser/src/config.rs | 72 ++++++++++++++++++++++++++- yellowstone-grpc-geyser/src/grpc.rs | 15 ++++-- yellowstone-grpc-geyser/src/plugin.rs | 12 ++++- 9 files changed, 141 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d626f02..5752b2e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,12 +15,21 @@ The minor version will be incremented upon a breaking change and the patch versi ### Features - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) -- geyser: use default compression as gzip and zstd ([#475](https://github.com/rpcpool/yellowstone-grpc/pull/475)) -- example: add connection options to Rust client ([#478](https://github.com/rpcpool/yellowstone-grpc/pull/478)) -- nodejs: add parse tx function ([#471](https://github.com/rpcpool/yellowstone-grpc/pull/471)) ### Breaking +## 2024-12-01 + +- yellowstone-grpc-client-simple-3.1.0 +- yellowstone-grpc-geyser-3.1.0 + +### Features + +- nodejs: add parse tx function ([#471](https://github.com/rpcpool/yellowstone-grpc/pull/471)) +- geyser: use default compression as gzip and zstd ([#475](https://github.com/rpcpool/yellowstone-grpc/pull/475)) +- example: add connection options to Rust client ([#478](https://github.com/rpcpool/yellowstone-grpc/pull/478)) +- geyser: add worker_threads and affinity ([#481](https://github.com/rpcpool/yellowstone-grpc/pull/481)) + ## 2024-11-28 - yellowstone-grpc-geyser-3.0.1 diff --git a/Cargo.lock b/Cargo.lock index 9ee36f6e..5d9b8664 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -63,6 +63,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "affinity" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763e484feceb7dd021b21c5c6f81aee06b1594a743455ec7efbf72e6355e447b" +dependencies = [ + "cfg-if", + "errno", + "libc", + "num_cpus", +] + [[package]] name = "agave-geyser-plugin-interface" version = "2.0.16" @@ -2449,6 +2461,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + [[package]] name = "num_enum" version = "0.7.3" @@ -5005,7 +5027,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-client-simple" -version = "3.0.0" +version = "3.1.0" dependencies = [ "anyhow", "backoff", @@ -5030,8 +5052,9 @@ dependencies = [ [[package]] name = "yellowstone-grpc-geyser" -version = "3.0.1" +version = "3.1.0" dependencies = [ + "affinity", "agave-geyser-plugin-interface", "anyhow", "base64 0.22.1", diff --git a/Cargo.toml b/Cargo.toml index 43c7c821..cff6d696 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [workspace] resolver = "2" members = [ - "examples/rust", # 3.0.0 + "examples/rust", # 3.1.0 "yellowstone-grpc-client", # 3.0.0 - "yellowstone-grpc-geyser", # 3.0.1 + "yellowstone-grpc-geyser", # 3.1.0 "yellowstone-grpc-proto", # 3.0.0 ] exclude = [ @@ -20,6 +20,7 @@ keywords = ["solana"] publish = false [workspace.dependencies] +affinity = "0.1.2" agave-geyser-plugin-interface = "~2.0.15" anyhow = "1.0.62" backoff = "0.4.0" diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index e896cec4..a5382839 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-client-simple" -version = "3.0.0" +version = "3.1.0" authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index 7e033bc2..852e03d9 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-geyser" -version = "3.0.1" +version = "3.1.0" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Plugin" @@ -17,6 +17,7 @@ crate-type = ["cdylib", "rlib"] name = "config-check" [dependencies] +affinity = { workspace = true } agave-geyser-plugin-interface = { workspace = true } anyhow = { workspace = true } base64 = { workspace = true } diff --git a/yellowstone-grpc-geyser/config.json b/yellowstone-grpc-geyser/config.json index 5f347210..180c913a 100644 --- a/yellowstone-grpc-geyser/config.json +++ b/yellowstone-grpc-geyser/config.json @@ -3,6 +3,10 @@ "log": { "level": "info" }, + "tokio": { + "worker_threads": 8, + "affinity": "0-1,12-13" + }, "grpc": { "address": "0.0.0.0:10000", "tls_config": { diff --git a/yellowstone-grpc-geyser/src/config.rs b/yellowstone-grpc-geyser/src/config.rs index d03b20fe..0d6b2ec0 100644 --- a/yellowstone-grpc-geyser/src/config.rs +++ b/yellowstone-grpc-geyser/src/config.rs @@ -3,7 +3,7 @@ use { GeyserPluginError, Result as PluginResult, }, serde::{de, Deserialize, Deserializer}, - std::{fs::read_to_string, net::SocketAddr, path::Path, time::Duration}, + std::{collections::HashSet, fs::read_to_string, net::SocketAddr, path::Path, time::Duration}, tokio::sync::Semaphore, tonic::codec::CompressionEncoding, yellowstone_grpc_proto::plugin::filter::limits::FilterLimits, @@ -15,6 +15,8 @@ pub struct Config { pub libpath: String, #[serde(default)] pub log: ConfigLog, + #[serde(default)] + pub tokio: ConfigTokio, pub grpc: ConfigGrpc, #[serde(default)] pub prometheus: Option, @@ -58,6 +60,74 @@ impl ConfigLog { } } +#[derive(Debug, Clone, Default, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct ConfigTokio { + /// Number of worker threads in Tokio runtime + pub worker_threads: Option, + /// Threads affinity + #[serde(deserialize_with = "ConfigTokio::deserialize_affinity")] + pub affinity: Option>, +} + +impl ConfigTokio { + fn deserialize_affinity<'de, D>(deserializer: D) -> Result>, D::Error> + where + D: Deserializer<'de>, + { + match Option::<&str>::deserialize(deserializer)? { + Some(taskset) => parse_taskset(taskset).map(Some).map_err(de::Error::custom), + None => Ok(None), + } + } +} + +fn parse_taskset(taskset: &str) -> Result, String> { + let mut set = HashSet::new(); + for taskset2 in taskset.split(',') { + match taskset2.split_once('-') { + Some((start, end)) => { + let start: usize = start + .parse() + .map_err(|_error| format!("failed to parse {start:?} from {taskset:?}"))?; + let end: usize = end + .parse() + .map_err(|_error| format!("failed to parse {end:?} from {taskset:?}"))?; + if start > end { + return Err(format!("invalid interval {taskset2:?} in {taskset:?}")); + } + for idx in start..=end { + set.insert(idx); + } + } + None => { + set.insert( + taskset2.parse().map_err(|_error| { + format!("failed to parse {taskset2:?} from {taskset:?}") + })?, + ); + } + } + } + + let mut vec = set.into_iter().collect::>(); + vec.sort(); + + if let Some(set_max_index) = vec.last().copied() { + let max_index = affinity::get_thread_affinity() + .map_err(|_err| "failed to get affinity".to_owned())? + .into_iter() + .max() + .unwrap_or(0); + + if set_max_index > max_index { + return Err(format!("core index must be in the range [0, {max_index}]")); + } + } + + Ok(vec) +} + #[derive(Debug, Clone, Deserialize)] #[serde(deny_unknown_fields)] pub struct ConfigGrpc { diff --git a/yellowstone-grpc-geyser/src/grpc.rs b/yellowstone-grpc-geyser/src/grpc.rs index 5360b02f..190a9e9b 100644 --- a/yellowstone-grpc-geyser/src/grpc.rs +++ b/yellowstone-grpc-geyser/src/grpc.rs @@ -1,6 +1,6 @@ use { crate::{ - config::ConfigGrpc, + config::{ConfigGrpc, ConfigTokio}, metrics::{self, DebugClientMessage}, version::GrpcVersionInfo, }, @@ -309,6 +309,7 @@ pub struct GrpcService { impl GrpcService { #[allow(clippy::type_complexity)] pub async fn create( + config_tokio: ConfigTokio, config: ConfigGrpc, debug_clients_tx: Option>, is_reload: bool, @@ -389,9 +390,17 @@ impl GrpcService { // Run geyser message loop let (messages_tx, messages_rx) = mpsc::unbounded_channel(); spawn_blocking(move || { - Builder::new_multi_thread() + let mut builder = Builder::new_multi_thread(); + if let Some(worker_threads) = config_tokio.worker_threads { + builder.worker_threads(worker_threads); + } + if let Some(tokio_cpus) = config_tokio.affinity.clone() { + builder.on_thread_start(move || { + affinity::set_thread_affinity(&tokio_cpus).expect("failed to set affinity") + }); + } + builder .thread_name_fn(crate::get_thread_name) - .worker_threads(4) .enable_all() .build() .expect("Failed to create a new runtime for geyser loop") diff --git a/yellowstone-grpc-geyser/src/plugin.rs b/yellowstone-grpc-geyser/src/plugin.rs index 0be6839d..d4bd285f 100644 --- a/yellowstone-grpc-geyser/src/plugin.rs +++ b/yellowstone-grpc-geyser/src/plugin.rs @@ -71,7 +71,16 @@ impl GeyserPlugin for Plugin { solana_logger::setup_with_default(&config.log.level); // Create inner - let runtime = Builder::new_multi_thread() + let mut builder = Builder::new_multi_thread(); + if let Some(worker_threads) = config.tokio.worker_threads { + builder.worker_threads(worker_threads); + } + if let Some(tokio_cpus) = config.tokio.affinity.clone() { + builder.on_thread_start(move || { + affinity::set_thread_affinity(&tokio_cpus).expect("failed to set affinity") + }); + } + let runtime = builder .thread_name_fn(crate::get_thread_name) .enable_all() .build() @@ -81,6 +90,7 @@ impl GeyserPlugin for Plugin { runtime.block_on(async move { let (debug_client_tx, debug_client_rx) = mpsc::unbounded_channel(); let (snapshot_channel, grpc_channel, grpc_shutdown) = GrpcService::create( + config.tokio, config.grpc, config.debug_clients_http.then_some(debug_client_tx), is_reload, From ee4f34015286b19a853b759f341025873a27f8bd Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Tue, 3 Dec 2024 13:04:34 -0500 Subject: [PATCH 07/20] nodejs: add parse err function (#483) Co-authored-by: Dmitry Rybalchenko <108054435+dm-rybalchenko@users.noreply.github.com> --- CHANGELOG.md | 1 + Cargo.toml | 2 +- Makefile | 1 + examples/typescript/package-lock.json | 2 +- examples/typescript/src/client.ts | 28 +++++++++++++++---- .../package-lock.json | 10 +++---- yellowstone-grpc-client-nodejs/package.json | 2 +- .../solana-encoding-wasm/Cargo.lock | 2 +- .../solana-encoding-wasm/Cargo.toml | 2 +- .../solana-encoding-wasm/src/lib.rs | 15 ++++++++-- yellowstone-grpc-client-nodejs/src/index.ts | 19 ++++++++++--- yellowstone-grpc-client-nodejs/src/types.ts | 5 +++- 12 files changed, 67 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5752b2e9..e629ce57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The minor version will be incremented upon a breaking change and the patch versi ### Features - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) +- nodejs: add parse err function ([#483](https://github.com/rpcpool/yellowstone-grpc/pull/483)) ### Breaking diff --git a/Cargo.toml b/Cargo.toml index cff6d696..6cc5cbc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ members = [ "yellowstone-grpc-proto", # 3.0.0 ] exclude = [ - "yellowstone-grpc-client-nodejs/solana-encoding-wasm", # 1.0.0 + "yellowstone-grpc-client-nodejs/solana-encoding-wasm", # 3.0.0 ] [workspace.package] diff --git a/Makefile b/Makefile index 97a64d4a..a41cc0f6 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ clean: clean-nodejs clean-rust + rm -rf test-ledger clean-nodejs: rm -rf examples/typescript/dist diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index d93c5fa5..107c085d 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -19,7 +19,7 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.2.0", + "version": "1.3.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/examples/typescript/src/client.ts b/examples/typescript/src/client.ts index 7068e30c..155c4ce8 100644 --- a/examples/typescript/src/client.ts +++ b/examples/typescript/src/client.ts @@ -1,4 +1,5 @@ import yargs from "yargs"; +import { inspect } from "node:util"; import Client, { CommitmentLevel, SubscribeRequest, @@ -6,6 +7,7 @@ import Client, { SubscribeRequestFilterAccountsFilterLamports, SubscribeUpdateTransactionInfo, txEncode, + txErrDecode, } from "@triton-one/yellowstone-grpc"; async function main() { @@ -85,13 +87,24 @@ async function subscribeCommand(client, args) { // Handle updates stream.on("data", (data) => { - if (data.transaction && args.transactionsParsed) { + if ( + data.transaction && + (args.transactionsParsed || args.transactionsDecodeErr) + ) { const slot = data.transaction.slot; const message = data.transaction.transaction; - const tx = txEncode.encode(message, txEncode.encoding.Json, 255, true); - console.log( - `TX filters: ${data.filters}, slot#${slot}, tx: ${JSON.stringify(tx)}` - ); + if (args.transactionsParsed) { + const tx = txEncode.encode(message, txEncode.encoding.Json, 255, true); + console.log( + `TX filters: ${data.filters}, slot#${slot}, tx: ${JSON.stringify(tx)}` + ); + } + if (message.meta.err && args.transactionsDecodeErr) { + const err = txErrDecode.decode(message.meta.err.err); + console.log( + `TX filters: ${data.filters}, slot#${slot}, err: ${inspect(err)}}` + ); + } return; } @@ -391,6 +404,11 @@ function parseCommandLineArgs() { describe: "parse transaction to json", type: "boolean", }, + "transactions-decode-err": { + default: false, + describe: "decode transactions errors", + type: "boolean", + }, "transactions-status": { default: false, describe: "subscribe on transactionsStatus updates", diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index 0d9cbc23..3d7eefc9 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.2.0", + "version": "1.3.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" @@ -22,9 +22,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", - "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.3.tgz", + "integrity": "sha512-iaxAZnANdCwMNpJlyhkI1W1jQZIDZKFNtU2OpQDdgd+pBcU3t7G+PT7svobkW4WSZTdis+CVV6y8KIwu83HDYQ==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.13", diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index 8e4a9a12..e4d9accb 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,7 +1,7 @@ { "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.2.0", + "version": "1.3.0", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock index 121b34b3..1009aca8 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock @@ -2669,7 +2669,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-solana-encoding-wasm" -version = "2.0.0" +version = "3.0.0" dependencies = [ "serde_json", "solana-transaction-status", diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml index ed2f5a23..feb99cd2 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-solana-encoding-wasm" -version = "2.0.0" +version = "3.0.0" authors = ["Triton One"] edition = "2021" homepage = "https://triton.one" diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs index 703fa9cd..df3edccb 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/src/lib.rs @@ -2,7 +2,9 @@ use { solana_transaction_status::{TransactionWithStatusMeta, UiTransactionEncoding}, wasm_bindgen::prelude::*, yellowstone_grpc_proto::{ - convert_from, prelude::SubscribeUpdateTransactionInfo, prost::Message, + convert_from, + prelude::{SubscribeUpdateTransactionInfo, TransactionError as TransactionErrorProto}, + prost::Message, }, }; @@ -29,7 +31,7 @@ impl From for UiTransactionEncoding { } #[wasm_bindgen] -pub fn encode( +pub fn encode_tx( data: &[u8], encoding: WasmUiTransactionEncoding, max_supported_transaction_version: Option, @@ -49,3 +51,12 @@ pub fn encode( Err(JsError::new("tx with missing metadata")) } } + +#[wasm_bindgen] +pub fn decode_tx_error(err: Vec) -> Result { + match convert_from::create_tx_error(Some(&TransactionErrorProto { err })) { + Ok(Some(err)) => serde_json::to_string(&err).map_err(Into::into), + Ok(None) => Err(JsError::new("unexpected")), + Err(error) => Err(JsError::new(error)), + } +} diff --git a/yellowstone-grpc-client-nodejs/src/index.ts b/yellowstone-grpc-client-nodejs/src/index.ts index 5a0421f7..27b385a7 100644 --- a/yellowstone-grpc-client-nodejs/src/index.ts +++ b/yellowstone-grpc-client-nodejs/src/index.ts @@ -57,11 +57,15 @@ export { // Import transaction encoding function created in Rust import * as wasm from "./encoding/yellowstone_grpc_solana_encoding_wasm"; -// Import mapper to get return type based on WasmUiTransactionEncoding -import { MapTransactionEncodingToReturnType } from "./types"; +import type { + TransactionErrorSolana, + // Import mapper to get return type based on WasmUiTransactionEncoding + MapTransactionEncodingToReturnType, +} from "./types"; + export const txEncode = { encoding: wasm.WasmUiTransactionEncoding, - encode_raw: wasm.encode, + encode_raw: wasm.encode_tx, encode: ( message: SubscribeUpdateTransactionInfo, encoding: T, @@ -69,7 +73,7 @@ export const txEncode = { show_rewards: boolean ): MapTransactionEncodingToReturnType[T] => { return JSON.parse( - wasm.encode( + wasm.encode_tx( SubscribeUpdateTransactionInfo.encode(message).finish(), encoding, max_supported_transaction_version, @@ -79,6 +83,13 @@ export const txEncode = { }, }; +export const txErrDecode = { + decode_raw: wasm.decode_tx_error, + decode: (buf: Uint8Array): TransactionErrorSolana => { + return JSON.parse(wasm.decode_tx_error(buf)); + }, +}; + export default class Client { _client: GeyserClient; _insecureXToken: string | undefined; diff --git a/yellowstone-grpc-client-nodejs/src/types.ts b/yellowstone-grpc-client-nodejs/src/types.ts index 520780f2..452d7d8b 100644 --- a/yellowstone-grpc-client-nodejs/src/types.ts +++ b/yellowstone-grpc-client-nodejs/src/types.ts @@ -1,5 +1,6 @@ import { type GetTransactionApi } from "@solana/rpc-api"; -import { type Signature } from "@solana/keys/dist/types"; +import { type Signature } from "@solana/keys"; +import { type TransactionError } from "@solana/rpc-types"; const fakeGetTransition: GetTransactionApi["getTransaction"] = ( signature, @@ -20,3 +21,5 @@ export type MapTransactionEncodingToReturnType = { 3: typeof json; 4: typeof jsonParsed; }; + +export type TransactionErrorSolana = TransactionError; From 4bfb76d1eb0d61a7dc1e000fff810aed16e700f4 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Wed, 11 Dec 2024 12:25:27 -0500 Subject: [PATCH 08/20] nodejs: fix connector for custom port (#488) --- CHANGELOG.md | 2 ++ examples/typescript/package-lock.json | 2 +- yellowstone-grpc-client-nodejs/package-lock.json | 4 ++-- yellowstone-grpc-client-nodejs/package.json | 2 +- yellowstone-grpc-client-nodejs/src/index.ts | 15 ++++++++++++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e629ce57..3048ea21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ The minor version will be incremented upon a breaking change and the patch versi ### Fixes +- nodejs: fix connector for custom port ([#488](https://github.com/rpcpool/yellowstone-grpc/pull/48*)) + ### Features - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index 107c085d..00fef9f3 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -19,7 +19,7 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.0", + "version": "1.3.1", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index 3d7eefc9..85a85d4c 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.0", + "version": "1.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.0", + "version": "1.3.1", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index e4d9accb..cddbb6dc 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,7 +1,7 @@ { "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.3.0", + "version": "1.3.1", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", diff --git a/yellowstone-grpc-client-nodejs/src/index.ts b/yellowstone-grpc-client-nodejs/src/index.ts index 27b385a7..10d3b61e 100644 --- a/yellowstone-grpc-client-nodejs/src/index.ts +++ b/yellowstone-grpc-client-nodejs/src/index.ts @@ -101,6 +101,15 @@ export default class Client { let creds: ChannelCredentials; const endpointURL = new URL(endpoint); + let port = endpointURL.port; + if (port == "") { + switch (endpointURL.protocol) { + case "https:": + port = "443"; + case "http:": + port = "80"; + } + } // Check if we need to use TLS. if (endpointURL.protocol === "https:") { @@ -121,7 +130,11 @@ export default class Client { } } - this._client = new GeyserClient(endpointURL.host, creds, channelOptions); + this._client = new GeyserClient( + `${endpointURL.host}:${port}`, + creds, + channelOptions + ); } private _getInsecureMetadata(): Metadata { From 5376d13057767279614067e8687c315ce082c07b Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 12 Dec 2024 15:26:40 -0500 Subject: [PATCH 09/20] proto: add field `created_at` to update message (#479) --- CHANGELOG.md | 3 +- Cargo.lock | 2 + Cargo.toml | 1 + examples/rust/src/bin/client.rs | 24 ++- .../solana-encoding-wasm/Cargo.lock | 1 + yellowstone-grpc-geyser/Cargo.toml | 1 + yellowstone-grpc-geyser/src/grpc.rs | 3 + yellowstone-grpc-proto/Cargo.toml | 1 + yellowstone-grpc-proto/benches/encode.rs | 7 +- yellowstone-grpc-proto/proto/geyser.proto | 2 + yellowstone-grpc-proto/src/lib.rs | 2 +- .../src/plugin/filter/filter.rs | 38 +++-- .../src/plugin/filter/message.rs | 89 +++++++---- yellowstone-grpc-proto/src/plugin/message.rs | 142 +++++++++++++----- 14 files changed, 228 insertions(+), 88 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3048ea21..311418d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,12 @@ The minor version will be incremented upon a breaking change and the patch versi ### Fixes -- nodejs: fix connector for custom port ([#488](https://github.com/rpcpool/yellowstone-grpc/pull/48*)) +- nodejs: fix connector for custom port ([#488](https://github.com/rpcpool/yellowstone-grpc/pull/488)) ### Features - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) +- proto: add field `created_at` to update message ([#479](https://github.com/rpcpool/yellowstone-grpc/pull/479)) - nodejs: add parse err function ([#483](https://github.com/rpcpool/yellowstone-grpc/pull/483)) ### Breaking diff --git a/Cargo.lock b/Cargo.lock index 5d9b8664..0dcd0f96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5074,6 +5074,7 @@ dependencies = [ "lazy_static", "log", "prometheus", + "prost-types 0.13.3", "serde", "serde_json", "solana-logger", @@ -5102,6 +5103,7 @@ dependencies = [ "criterion", "prost 0.11.9", "prost 0.13.3", + "prost-types 0.13.3", "protobuf-src", "serde", "smallvec", diff --git a/Cargo.toml b/Cargo.toml index 6cc5cbc2..17a4c958 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,6 +50,7 @@ log = "0.4.17" maplit = "1.0.2" prometheus = "0.13.2" prost = "0.13.1" +prost-types = "0.13.3" prost_011 = { package = "prost", version = "0.11.9" } protobuf-src = "1.1.0" serde = "1.0.145" diff --git a/examples/rust/src/bin/client.rs b/examples/rust/src/bin/client.rs index eacf0919..4be59859 100644 --- a/examples/rust/src/bin/client.rs +++ b/examples/rust/src/bin/client.rs @@ -740,6 +740,11 @@ async fn geyser_subscribe( } let filters = msg.filters; + let created_at: SystemTime = msg + .created_at + .ok_or(anyhow::anyhow!("no created_at in the message"))? + .try_into() + .context("failed to parse created_at")?; match msg.update_oneof { Some(UpdateOneof::Account(msg)) => { let account = msg @@ -748,13 +753,14 @@ async fn geyser_subscribe( let mut value = create_pretty_account(account)?; value["isStartup"] = json!(msg.is_startup); value["slot"] = json!(msg.slot); - print_update("account", &filters, value); + print_update("account", created_at, &filters, value); } Some(UpdateOneof::Slot(msg)) => { let status = CommitmentLevel::try_from(msg.status) .context("failed to decode commitment")?; print_update( "slot", + created_at, &filters, json!({ "slot": msg.slot, @@ -769,11 +775,12 @@ async fn geyser_subscribe( .ok_or(anyhow::anyhow!("no transaction in the message"))?; let mut value = create_pretty_transaction(tx)?; value["slot"] = json!(msg.slot); - print_update("transaction", &filters, value); + print_update("transaction", created_at, &filters, value); } Some(UpdateOneof::TransactionStatus(msg)) => { print_update( "transactionStatus", + created_at, &filters, json!({ "slot": msg.slot, @@ -787,11 +794,12 @@ async fn geyser_subscribe( ); } Some(UpdateOneof::Entry(msg)) => { - print_update("entry", &filters, create_pretty_entry(msg)?); + print_update("entry", created_at, &filters, create_pretty_entry(msg)?); } Some(UpdateOneof::BlockMeta(msg)) => { print_update( "blockmeta", + created_at, &filters, json!({ "slot": msg.slot, @@ -813,6 +821,7 @@ async fn geyser_subscribe( Some(UpdateOneof::Block(msg)) => { print_update( "block", + created_at, &filters, json!({ "slot": msg.slot, @@ -960,10 +969,15 @@ fn create_pretty_entry(msg: SubscribeUpdateEntry) -> anyhow::Result { })) } -fn print_update(kind: &str, filters: &[String], value: Value) { +fn print_update(kind: &str, created_at: SystemTime, filters: &[String], value: Value) { + let unix_since = created_at + .duration_since(UNIX_EPOCH) + .expect("valid system time"); info!( - "{kind} ({}): {}", + "{kind} ({}) at {}.{:0>6}: {}", filters.join(","), + unix_since.as_secs(), + unix_since.subsec_micros(), serde_json::to_string(&value).expect("json serialization failed") ); } diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock index 1009aca8..438a2ea6 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock @@ -2660,6 +2660,7 @@ dependencies = [ "anyhow", "bincode", "prost", + "prost-types", "protobuf-src", "solana-account-decoder", "solana-sdk", diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index 852e03d9..fbb73464 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -35,6 +35,7 @@ hyper-util = { workspace = true } lazy_static = { workspace = true } log = { workspace = true } prometheus = { workspace = true } +prost-types = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } solana-logger = { workspace = true } diff --git a/yellowstone-grpc-geyser/src/grpc.rs b/yellowstone-grpc-geyser/src/grpc.rs index 190a9e9b..04674dcd 100644 --- a/yellowstone-grpc-geyser/src/grpc.rs +++ b/yellowstone-grpc-geyser/src/grpc.rs @@ -6,6 +6,7 @@ use { }, anyhow::Context, log::{error, info}, + prost_types::Timestamp, solana_sdk::{ clock::{Slot, MAX_RECENT_BLOCKHASHES}, pubkey::Pubkey, @@ -16,6 +17,7 @@ use { atomic::{AtomicUsize, Ordering}, Arc, }, + time::SystemTime, }, tokio::{ fs, @@ -619,6 +621,7 @@ impl GrpcService { slot: parent, parent: entry.parent_slot, status, + created_at: Timestamp::from(SystemTime::now()) })); metrics::missed_status_message_inc(status); } diff --git a/yellowstone-grpc-proto/Cargo.toml b/yellowstone-grpc-proto/Cargo.toml index 6f9eb360..8fb295dc 100644 --- a/yellowstone-grpc-proto/Cargo.toml +++ b/yellowstone-grpc-proto/Cargo.toml @@ -22,6 +22,7 @@ bincode = { workspace = true, optional = true } bs58 = { workspace = true, optional = true } bytes = { workspace = true, optional = true } prost = { workspace = true } +prost-types = { workspace = true } prost_011 = { workspace = true, optional = true } serde = { workspace = true, optional = true } solana-account-decoder = { workspace = true, optional = true } diff --git a/yellowstone-grpc-proto/benches/encode.rs b/yellowstone-grpc-proto/benches/encode.rs index 7dd07a26..565564b0 100644 --- a/yellowstone-grpc-proto/benches/encode.rs +++ b/yellowstone-grpc-proto/benches/encode.rs @@ -1,7 +1,8 @@ use { criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}, prost::Message as _, - std::time::Duration, + prost_types::Timestamp, + std::time::{Duration, SystemTime}, yellowstone_grpc_proto::plugin::{ filter::message::{ tests::{ @@ -41,6 +42,7 @@ fn bench_account(c: &mut Criterion) { .map(|(msg, data_slice)| FilteredUpdate { filters: filters.clone(), message: FilteredUpdateOneof::account(&msg, data_slice), + created_at: Timestamp::from(SystemTime::now()), }) .collect::>(); bench!(&updates, "accounts"); @@ -52,7 +54,9 @@ fn bench_account(c: &mut Criterion) { message: FilteredUpdateOneof::transaction(&MessageTransaction { transaction, slot: 42, + created_at: Timestamp::from(SystemTime::now()), }), + created_at: Timestamp::from(SystemTime::now()), }) .collect::>(); bench!(&updates, "transactions"); @@ -62,6 +66,7 @@ fn bench_account(c: &mut Criterion) { .map(|block| FilteredUpdate { filters: filters.clone(), message: FilteredUpdateOneof::block(Box::new(block)), + created_at: Timestamp::from(SystemTime::now()), }) .collect::>(); bench!(&updates, "blocks"); diff --git a/yellowstone-grpc-proto/proto/geyser.proto b/yellowstone-grpc-proto/proto/geyser.proto index ae706f74..e7c47bd9 100644 --- a/yellowstone-grpc-proto/proto/geyser.proto +++ b/yellowstone-grpc-proto/proto/geyser.proto @@ -1,5 +1,6 @@ syntax = "proto3"; +import "google/protobuf/timestamp.proto"; import public "solana-storage.proto"; option go_package = "github.com/rpcpool/yellowstone-grpc/examples/golang/proto"; @@ -115,6 +116,7 @@ message SubscribeUpdate { SubscribeUpdateBlockMeta block_meta = 7; SubscribeUpdateEntry entry = 8; } + google.protobuf.Timestamp created_at = 11; } message SubscribeUpdateAccount { diff --git a/yellowstone-grpc-proto/src/lib.rs b/yellowstone-grpc-proto/src/lib.rs index 80b56af5..a20e989d 100644 --- a/yellowstone-grpc-proto/src/lib.rs +++ b/yellowstone-grpc-proto/src/lib.rs @@ -33,9 +33,9 @@ pub mod prelude { pub use super::{geyser::*, solana::storage::confirmed_block::*}; } -pub use prost; #[cfg(feature = "tonic")] pub use tonic; +pub use {prost, prost_types}; #[cfg(feature = "plugin")] pub mod plugin; diff --git a/yellowstone-grpc-proto/src/plugin/filter/filter.rs b/yellowstone-grpc-proto/src/plugin/filter/filter.rs index 3591bd9c..2bd57496 100644 --- a/yellowstone-grpc-proto/src/plugin/filter/filter.rs +++ b/yellowstone-grpc-proto/src/plugin/filter/filter.rs @@ -75,24 +75,24 @@ pub enum FilterError { pub type FilterResult = Result; macro_rules! filtered_updates_once_owned { - ($filters:ident, $message:expr) => {{ + ($filters:ident, $message:expr, $created_at:expr) => {{ let mut messages = FilteredUpdates::new(); if !$filters.is_empty() { - messages.push(FilteredUpdate::new($filters, $message)); + messages.push(FilteredUpdate::new($filters, $message, $created_at)); } messages }}; } macro_rules! filtered_updates_once_ref { - ($filters:ident, $message:expr) => {{ + ($filters:ident, $message:expr, $created_at:expr) => {{ let mut messages = FilteredUpdates::new(); if !$filters.is_empty() { let mut message_filters = FilteredUpdateFilters::new(); for filter in $filters { message_filters.push(filter.clone()); } - messages.push(FilteredUpdate::new(message_filters, $message)); + messages.push(FilteredUpdate::new(message_filters, $message, $created_at)); } messages }}; @@ -339,7 +339,8 @@ impl FilterAccounts { let filters = filter.get_filters(); filtered_updates_once_owned!( filters, - FilteredUpdateOneof::account(message, accounts_data_slice.clone()) + FilteredUpdateOneof::account(message, accounts_data_slice.clone()), + message.created_at ) } } @@ -631,7 +632,11 @@ impl FilterSlots { } }) .collect::(); - filtered_updates_once_owned!(filters, FilteredUpdateOneof::slot(*message)) + filtered_updates_once_owned!( + filters, + FilteredUpdateOneof::slot(*message), + message.created_at + ) } } @@ -785,7 +790,8 @@ impl FilterTransactions { FilterTransactionsType::TransactionStatus => { FilteredUpdateOneof::transaction_status(message) } - } + }, + message.created_at ) } } @@ -813,7 +819,11 @@ impl FilterEntries { fn get_updates(&self, message: &Arc) -> FilteredUpdates { let filters = self.filters.as_slice(); - filtered_updates_once_ref!(filters, FilteredUpdateOneof::entry(Arc::clone(message))) + filtered_updates_once_ref!( + filters, + FilteredUpdateOneof::entry(Arc::clone(message)), + message.created_at + ) } } @@ -941,6 +951,7 @@ impl FilterBlocks { accounts, entries, })), + message.created_at, )); } updates @@ -972,7 +983,8 @@ impl FilterBlocksMeta { let filters = self.filters.as_slice(); filtered_updates_once_ref!( filters, - FilteredUpdateOneof::block_meta(Arc::clone(message)) + FilteredUpdateOneof::block_meta(Arc::clone(message)), + message.created_at ) } } @@ -1088,6 +1100,7 @@ mod tests { message::{Message, MessageTransaction, MessageTransactionInfo}, }, }, + prost_types::Timestamp, solana_sdk::{ hash::Hash, message::{v0::LoadedAddresses, Message as SolMessage, MessageHeader}, @@ -1096,7 +1109,11 @@ mod tests { transaction::{SanitizedTransaction, Transaction}, }, solana_transaction_status::TransactionStatusMeta, - std::{collections::HashMap, sync::Arc, time::Duration}, + std::{ + collections::HashMap, + sync::Arc, + time::{Duration, SystemTime}, + }, }; fn create_filter_names() -> FilterNames { @@ -1150,6 +1167,7 @@ mod tests { account_keys, }), slot: 100, + created_at: Timestamp::from(SystemTime::now()), } } diff --git a/yellowstone-grpc-proto/src/plugin/filter/message.rs b/yellowstone-grpc-proto/src/plugin/filter/message.rs index 8f9710db..c3c4d9b2 100644 --- a/yellowstone-grpc-proto/src/plugin/filter/message.rs +++ b/yellowstone-grpc-proto/src/plugin/filter/message.rs @@ -24,9 +24,10 @@ use { }, DecodeError, }, + prost_types::Timestamp, smallvec::SmallVec, solana_sdk::signature::Signature, - std::{collections::HashSet, sync::Arc}, + std::{collections::HashSet, sync::Arc, time::SystemTime}, }; #[inline] @@ -63,6 +64,7 @@ pub type FilteredUpdates = SmallVec<[FilteredUpdate; 2]>; pub struct FilteredUpdate { pub filters: FilteredUpdateFilters, pub message: FilteredUpdateOneof, + pub created_at: Timestamp, } impl prost::Message for FilteredUpdate { @@ -72,12 +74,14 @@ impl prost::Message for FilteredUpdate { encode_varint(name.len() as u64, buf); buf.put_slice(name.as_bytes()); } - self.message.encode_raw(buf) + self.message.encode_raw(buf); + message::encode(11u32, &self.created_at, buf); } fn encoded_len(&self) -> usize { prost_repeated_encoded_len_map!(1u32, self.filters, |filter| filter.as_ref().len()) + self.message.encoded_len() + + message::encoded_len(11u32, &self.created_at) } fn merge_field( @@ -96,12 +100,24 @@ impl prost::Message for FilteredUpdate { } impl FilteredUpdate { - pub fn new(filters: FilteredUpdateFilters, message: FilteredUpdateOneof) -> Self { - Self { filters, message } + pub const fn new( + filters: FilteredUpdateFilters, + message: FilteredUpdateOneof, + created_at: Timestamp, + ) -> Self { + Self { + filters, + message, + created_at, + } } pub fn new_empty(message: FilteredUpdateOneof) -> Self { - Self::new(FilteredUpdateFilters::new(), message) + Self::new( + FilteredUpdateFilters::new(), + message, + Timestamp::from(SystemTime::now()), + ) } fn as_subscribe_update_account( @@ -206,7 +222,7 @@ impl FilteredUpdate { }), FilteredUpdateOneof::Ping => UpdateOneof::Ping(SubscribeUpdatePing {}), FilteredUpdateOneof::Pong(msg) => UpdateOneof::Pong(*msg), - FilteredUpdateOneof::BlockMeta(msg) => UpdateOneof::BlockMeta(msg.0.clone()), + FilteredUpdateOneof::BlockMeta(msg) => UpdateOneof::BlockMeta(msg.block_meta.clone()), FilteredUpdateOneof::Entry(msg) => { UpdateOneof::Entry(Self::as_subscribe_update_entry(&msg.0)) } @@ -219,13 +235,16 @@ impl FilteredUpdate { .map(|name| name.as_ref().to_string()) .collect(), update_oneof: Some(message), + created_at: Some(self.created_at), } } pub fn from_subscribe_update(update: SubscribeUpdate) -> Result { - let message = match update.update_oneof.ok_or("")? { + let created_at = update.created_at.ok_or("create_at should be defined")?; + + let message = match update.update_oneof.ok_or("update should be defined")? { UpdateOneof::Account(msg) => { - let account = MessageAccount::from_update_oneof(msg)?; + let account = MessageAccount::from_update_oneof(msg, created_at)?; FilteredUpdateOneof::Account(FilteredUpdateAccount { account: account.account, slot: account.slot, @@ -234,11 +253,11 @@ impl FilteredUpdate { }) } UpdateOneof::Slot(msg) => { - let slot = MessageSlot::from_update_oneof(&msg)?; + let slot = MessageSlot::from_update_oneof(&msg, created_at)?; FilteredUpdateOneof::Slot(FilteredUpdateSlot(slot)) } UpdateOneof::Transaction(msg) => { - let tx = MessageTransaction::from_update_oneof(msg)?; + let tx = MessageTransaction::from_update_oneof(msg, created_at)?; FilteredUpdateOneof::Transaction(FilteredUpdateTransaction { transaction: tx.transaction, slot: tx.slot, @@ -262,7 +281,7 @@ impl FilteredUpdate { }) } UpdateOneof::Block(msg) => { - let block = MessageBlock::from_update_oneof(msg)?; + let block = MessageBlock::from_update_oneof(msg, created_at)?; FilteredUpdateOneof::Block(Box::new(FilteredUpdateBlock { meta: block.meta, transactions: block.transactions, @@ -275,11 +294,11 @@ impl FilteredUpdate { UpdateOneof::Ping(_) => FilteredUpdateOneof::Ping, UpdateOneof::Pong(msg) => FilteredUpdateOneof::Pong(msg), UpdateOneof::BlockMeta(msg) => { - let block_meta = MessageBlockMeta(msg); + let block_meta = MessageBlockMeta::from_update_oneof(msg, created_at); FilteredUpdateOneof::BlockMeta(Arc::new(block_meta)) } UpdateOneof::Entry(msg) => { - let entry = MessageEntry::from_update_oneof(&msg)?; + let entry = MessageEntry::from_update_oneof(&msg, created_at)?; FilteredUpdateOneof::Entry(FilteredUpdateEntry(Arc::new(entry))) } }; @@ -287,6 +306,7 @@ impl FilteredUpdate { Ok(Self { filters: update.filters.into_iter().map(FilterName::new).collect(), message, + created_at, }) } } @@ -368,7 +388,7 @@ impl prost::Message for FilteredUpdateOneof { encode_varint(0, buf); } Self::Pong(msg) => message::encode(9u32, msg, buf), - Self::BlockMeta(msg) => message::encode(7u32, &msg.0, buf), + Self::BlockMeta(msg) => message::encode(7u32, &msg.block_meta, buf), Self::Entry(msg) => message::encode(8u32, msg, buf), } } @@ -382,7 +402,7 @@ impl prost::Message for FilteredUpdateOneof { Self::Block(msg) => message::encoded_len(5u32, msg), Self::Ping => key_len(6u32) + encoded_len_varint(0), Self::Pong(msg) => message::encoded_len(9u32, msg), - Self::BlockMeta(msg) => message::encoded_len(7u32, &msg.0), + Self::BlockMeta(msg) => message::encoded_len(7u32, &msg.block_meta), Self::Entry(msg) => message::encoded_len(8u32, msg), } } @@ -946,6 +966,7 @@ pub mod tests { }, prost::Message as _, prost_011::Message as _, + prost_types::Timestamp, solana_sdk::{ hash::Hash, message::SimpleAddressLoader, @@ -961,6 +982,7 @@ pub mod tests { ops::Range, str::FromStr, sync::Arc, + time::SystemTime, }, }; @@ -1031,6 +1053,7 @@ pub mod tests { account: Arc::clone(&account), slot, is_startup, + created_at: Timestamp::from(SystemTime::now()), }; vec.push((msg, data_slice)); } @@ -1049,6 +1072,7 @@ pub mod tests { hash: Hash::new_from_array([98; 32]), executed_transaction_count: 32, starting_transaction_index: 1000, + created_at: Timestamp::from(SystemTime::now()), }, MessageEntry { slot: 299888121, @@ -1057,6 +1081,7 @@ pub mod tests { hash: Hash::new_from_array([42; 32]), executed_transaction_count: 32, starting_transaction_index: 1000, + created_at: Timestamp::from(SystemTime::now()), }, ] .into_iter() @@ -1131,20 +1156,23 @@ pub mod tests { let entries = create_entries(); let slot = block.parent_slot + 1; - let block_meta1 = MessageBlockMeta(SubscribeUpdateBlockMeta { - parent_slot: block.parent_slot, - slot, - parent_blockhash: block.previous_blockhash, - blockhash: block.blockhash, - rewards: Some(convert_to::create_rewards_obj( - &block.rewards, - block.num_partitions, - )), - block_time: block.block_time.map(convert_to::create_timestamp), - block_height: block.block_height.map(convert_to::create_block_height), - executed_transaction_count: transactions.len() as u64, - entries_count: entries.len() as u64, - }); + let block_meta1 = MessageBlockMeta { + block_meta: SubscribeUpdateBlockMeta { + parent_slot: block.parent_slot, + slot, + parent_blockhash: block.previous_blockhash, + blockhash: block.blockhash, + rewards: Some(convert_to::create_rewards_obj( + &block.rewards, + block.num_partitions, + )), + block_time: block.block_time.map(convert_to::create_timestamp), + block_height: block.block_height.map(convert_to::create_block_height), + executed_transaction_count: transactions.len() as u64, + entries_count: entries.len() as u64, + }, + created_at: Timestamp::from(SystemTime::now()), + }; let mut block_meta2 = block_meta1.clone(); block_meta2.rewards = Some(convert_to::create_rewards_obj(&block.rewards, Some(42))); @@ -1183,6 +1211,7 @@ pub mod tests { let msg = FilteredUpdate { filters: create_message_filters(filters), message, + created_at: Timestamp::from(SystemTime::now()), }; let update = msg.as_subscribe_update(); assert_eq!(msg.encoded_len(), update.encoded_len()); @@ -1219,6 +1248,7 @@ pub mod tests { slot, parent, status, + created_at: Timestamp::from(SystemTime::now()), }), ) } @@ -1232,6 +1262,7 @@ pub mod tests { let msg = MessageTransaction { transaction, slot: 42, + created_at: Timestamp::from(SystemTime::now()), }; encode_decode_cmp(&["123"], FilteredUpdateOneof::transaction(&msg)); encode_decode_cmp(&["123"], FilteredUpdateOneof::transaction_status(&msg)); diff --git a/yellowstone-grpc-proto/src/plugin/message.rs b/yellowstone-grpc-proto/src/plugin/message.rs index ff1a7118..e0a330f1 100644 --- a/yellowstone-grpc-proto/src/plugin/message.rs +++ b/yellowstone-grpc-proto/src/plugin/message.rs @@ -13,6 +13,7 @@ use { ReplicaAccountInfoV3, ReplicaBlockInfoV4, ReplicaEntryInfoV2, ReplicaTransactionInfoV2, SlotStatus, }, + prost_types::Timestamp, solana_sdk::{ clock::Slot, hash::{Hash, HASH_BYTES}, @@ -23,6 +24,7 @@ use { collections::HashSet, ops::{Deref, DerefMut}, sync::Arc, + time::SystemTime, }, }; @@ -70,6 +72,7 @@ pub struct MessageSlot { pub slot: Slot, pub parent: Option, pub status: CommitmentLevel, + pub created_at: Timestamp, } impl MessageSlot { @@ -78,16 +81,21 @@ impl MessageSlot { slot, parent, status: status.into(), + created_at: Timestamp::from(SystemTime::now()), } } - pub fn from_update_oneof(msg: &SubscribeUpdateSlot) -> FromUpdateOneofResult { + pub fn from_update_oneof( + msg: &SubscribeUpdateSlot, + created_at: Timestamp, + ) -> FromUpdateOneofResult { Ok(Self { slot: msg.slot, parent: msg.parent, status: CommitmentLevelProto::try_from(msg.status) .map_err(|_| "failed to parse commitment level")? .into(), + created_at, }) } } @@ -142,6 +150,7 @@ pub struct MessageAccount { pub account: Arc, pub slot: Slot, pub is_startup: bool, + pub created_at: Timestamp, } impl MessageAccount { @@ -150,16 +159,21 @@ impl MessageAccount { account: Arc::new(MessageAccountInfo::from_geyser(info)), slot, is_startup, + created_at: Timestamp::from(SystemTime::now()), } } - pub fn from_update_oneof(msg: SubscribeUpdateAccount) -> FromUpdateOneofResult { + pub fn from_update_oneof( + msg: SubscribeUpdateAccount, + created_at: Timestamp, + ) -> FromUpdateOneofResult { Ok(Self { account: Arc::new(MessageAccountInfo::from_update_oneof( msg.account.ok_or("account message should be defined")?, )?), slot: msg.slot, is_startup: msg.is_startup, + created_at, }) } } @@ -244,6 +258,7 @@ impl MessageTransactionInfo { pub struct MessageTransaction { pub transaction: Arc, pub slot: u64, + pub created_at: Timestamp, } impl MessageTransaction { @@ -251,16 +266,21 @@ impl MessageTransaction { Self { transaction: Arc::new(MessageTransactionInfo::from_geyser(info)), slot, + created_at: Timestamp::from(SystemTime::now()), } } - pub fn from_update_oneof(msg: SubscribeUpdateTransaction) -> FromUpdateOneofResult { + pub fn from_update_oneof( + msg: SubscribeUpdateTransaction, + created_at: Timestamp, + ) -> FromUpdateOneofResult { Ok(Self { transaction: Arc::new(MessageTransactionInfo::from_update_oneof( msg.transaction .ok_or("transaction message should be defined")?, )?), slot: msg.slot, + created_at, }) } } @@ -273,6 +293,7 @@ pub struct MessageEntry { pub hash: Hash, pub executed_transaction_count: u64, pub starting_transaction_index: u64, + pub created_at: Timestamp, } impl MessageEntry { @@ -287,10 +308,14 @@ impl MessageEntry { .starting_transaction_index .try_into() .expect("failed convert usize to u64"), + created_at: Timestamp::from(SystemTime::now()), } } - pub fn from_update_oneof(msg: &SubscribeUpdateEntry) -> FromUpdateOneofResult { + pub fn from_update_oneof( + msg: &SubscribeUpdateEntry, + created_at: Timestamp, + ) -> FromUpdateOneofResult { Ok(Self { slot: msg.slot, index: msg.index as usize, @@ -301,43 +326,60 @@ impl MessageEntry { ), executed_transaction_count: msg.executed_transaction_count, starting_transaction_index: msg.starting_transaction_index, + created_at, }) } } #[derive(Debug, Clone, PartialEq)] -pub struct MessageBlockMeta(pub SubscribeUpdateBlockMeta); +pub struct MessageBlockMeta { + pub block_meta: SubscribeUpdateBlockMeta, + pub created_at: Timestamp, +} impl Deref for MessageBlockMeta { type Target = SubscribeUpdateBlockMeta; fn deref(&self) -> &Self::Target { - &self.0 + &self.block_meta } } impl DerefMut for MessageBlockMeta { fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 + &mut self.block_meta } } impl MessageBlockMeta { pub fn from_geyser(info: &ReplicaBlockInfoV4<'_>) -> Self { - Self(SubscribeUpdateBlockMeta { - parent_slot: info.parent_slot, - slot: info.slot, - parent_blockhash: info.parent_blockhash.to_string(), - blockhash: info.blockhash.to_string(), - rewards: Some(convert_to::create_rewards_obj( - &info.rewards.rewards, - info.rewards.num_partitions, - )), - block_time: info.block_time.map(convert_to::create_timestamp), - block_height: info.block_height.map(convert_to::create_block_height), - executed_transaction_count: info.executed_transaction_count, - entries_count: info.entry_count, - }) + Self { + block_meta: SubscribeUpdateBlockMeta { + parent_slot: info.parent_slot, + slot: info.slot, + parent_blockhash: info.parent_blockhash.to_string(), + blockhash: info.blockhash.to_string(), + rewards: Some(convert_to::create_rewards_obj( + &info.rewards.rewards, + info.rewards.num_partitions, + )), + block_time: info.block_time.map(convert_to::create_timestamp), + block_height: info.block_height.map(convert_to::create_block_height), + executed_transaction_count: info.executed_transaction_count, + entries_count: info.entry_count, + }, + created_at: Timestamp::from(SystemTime::now()), + } + } + + pub const fn from_update_oneof( + block_meta: SubscribeUpdateBlockMeta, + created_at: Timestamp, + ) -> Self { + Self { + block_meta, + created_at, + } } } @@ -348,6 +390,7 @@ pub struct MessageBlock { pub updated_account_count: u64, pub accounts: Vec>, pub entries: Vec>, + pub created_at: Timestamp, } impl MessageBlock { @@ -363,22 +406,29 @@ impl MessageBlock { updated_account_count: accounts.len() as u64, accounts, entries, + created_at: Timestamp::from(SystemTime::now()), } } - pub fn from_update_oneof(msg: SubscribeUpdateBlock) -> FromUpdateOneofResult { + pub fn from_update_oneof( + msg: SubscribeUpdateBlock, + created_at: Timestamp, + ) -> FromUpdateOneofResult { Ok(Self { - meta: Arc::new(MessageBlockMeta(SubscribeUpdateBlockMeta { - slot: msg.slot, - blockhash: msg.blockhash, - rewards: msg.rewards, - block_time: msg.block_time, - block_height: msg.block_height, - parent_slot: msg.parent_slot, - parent_blockhash: msg.parent_blockhash, - executed_transaction_count: msg.executed_transaction_count, - entries_count: msg.entries_count, - })), + meta: Arc::new(MessageBlockMeta { + block_meta: SubscribeUpdateBlockMeta { + slot: msg.slot, + blockhash: msg.blockhash, + rewards: msg.rewards, + block_time: msg.block_time, + block_height: msg.block_height, + parent_slot: msg.parent_slot, + parent_blockhash: msg.parent_blockhash, + executed_transaction_count: msg.executed_transaction_count, + entries_count: msg.entries_count, + }, + created_at, + }), transactions: msg .transactions .into_iter() @@ -393,8 +443,9 @@ impl MessageBlock { entries: msg .entries .iter() - .map(|entry| MessageEntry::from_update_oneof(entry).map(Arc::new)) + .map(|entry| MessageEntry::from_update_oneof(entry, created_at).map(Arc::new)) .collect::, _>>()?, + created_at, }) } } @@ -421,22 +472,31 @@ impl Message { } } - pub fn from_update_oneof(oneof: UpdateOneof) -> FromUpdateOneofResult { + pub fn from_update_oneof( + oneof: UpdateOneof, + created_at: Timestamp, + ) -> FromUpdateOneofResult { Ok(match oneof { - UpdateOneof::Account(msg) => Self::Account(MessageAccount::from_update_oneof(msg)?), - UpdateOneof::Slot(msg) => Self::Slot(MessageSlot::from_update_oneof(&msg)?), + UpdateOneof::Account(msg) => { + Self::Account(MessageAccount::from_update_oneof(msg, created_at)?) + } + UpdateOneof::Slot(msg) => Self::Slot(MessageSlot::from_update_oneof(&msg, created_at)?), UpdateOneof::Transaction(msg) => { - Self::Transaction(MessageTransaction::from_update_oneof(msg)?) + Self::Transaction(MessageTransaction::from_update_oneof(msg, created_at)?) } UpdateOneof::TransactionStatus(_) => { return Err("TransactionStatus message is not supported") } - UpdateOneof::Block(msg) => Self::Block(Arc::new(MessageBlock::from_update_oneof(msg)?)), + UpdateOneof::Block(msg) => { + Self::Block(Arc::new(MessageBlock::from_update_oneof(msg, created_at)?)) + } UpdateOneof::Ping(_) => return Err("Ping message is not supported"), UpdateOneof::Pong(_) => return Err("Pong message is not supported"), - UpdateOneof::BlockMeta(msg) => Self::BlockMeta(Arc::new(MessageBlockMeta(msg))), + UpdateOneof::BlockMeta(msg) => Self::BlockMeta(Arc::new( + MessageBlockMeta::from_update_oneof(msg, created_at), + )), UpdateOneof::Entry(msg) => { - Self::Entry(Arc::new(MessageEntry::from_update_oneof(&msg)?)) + Self::Entry(Arc::new(MessageEntry::from_update_oneof(&msg, created_at)?)) } }) } From 3f7fd2a8516da23d15a860cc8d85ae2f42f9017a Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Fri, 13 Dec 2024 10:29:07 -0500 Subject: [PATCH 10/20] nodejs: fix connector for host/hostname (#491) --- CHANGELOG.md | 1 + examples/typescript/package-lock.json | 2 +- yellowstone-grpc-client-nodejs/package-lock.json | 4 ++-- yellowstone-grpc-client-nodejs/package.json | 2 +- yellowstone-grpc-client-nodejs/src/index.ts | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 311418d0..4595f952 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The minor version will be incremented upon a breaking change and the patch versi ### Fixes - nodejs: fix connector for custom port ([#488](https://github.com/rpcpool/yellowstone-grpc/pull/488)) +- nodejs: fix connector for host/hostname ([#491](https://github.com/rpcpool/yellowstone-grpc/pull/491)) ### Features diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index 00fef9f3..6921c0ca 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -19,7 +19,7 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.1", + "version": "1.3.2", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index 85a85d4c..bb0a13b5 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.1", + "version": "1.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.1", + "version": "1.3.2", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index cddbb6dc..1149575e 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,7 +1,7 @@ { "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.3.1", + "version": "1.3.2", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", diff --git a/yellowstone-grpc-client-nodejs/src/index.ts b/yellowstone-grpc-client-nodejs/src/index.ts index 10d3b61e..97513da3 100644 --- a/yellowstone-grpc-client-nodejs/src/index.ts +++ b/yellowstone-grpc-client-nodejs/src/index.ts @@ -131,7 +131,7 @@ export default class Client { } this._client = new GeyserClient( - `${endpointURL.host}:${port}`, + `${endpointURL.hostname}:${port}`, creds, channelOptions ); From fe58ada36abf0469612b2fa1bf86d60d51ef92b6 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Fri, 13 Dec 2024 14:24:40 -0500 Subject: [PATCH 11/20] proto: add `from_slot` (#477) --- CHANGELOG.md | 16 +- Cargo.lock | 8 +- Cargo.toml | 12 +- examples/rust/Cargo.toml | 2 +- examples/rust/src/bin/client.rs | 6 + examples/rust/src/bin/tx-blocktime.rs | 1 + .../solana-encoding-wasm/Cargo.lock | 2 +- .../solana-encoding-wasm/Cargo.toml | 2 +- yellowstone-grpc-client/Cargo.toml | 2 +- yellowstone-grpc-geyser/Cargo.toml | 2 +- yellowstone-grpc-geyser/config.json | 5 +- yellowstone-grpc-geyser/src/config.rs | 7 + yellowstone-grpc-geyser/src/grpc.rs | 187 +++++++++++++++--- yellowstone-grpc-proto/Cargo.toml | 2 +- yellowstone-grpc-proto/proto/geyser.proto | 1 + .../src/plugin/filter/filter.rs | 9 + 16 files changed, 212 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4595f952..7f005815 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,17 +12,29 @@ The minor version will be incremented upon a breaking change and the patch versi ### Fixes +### Features + +### Breaking + +## 2024-12-13 + +- yellowstone-grpc-client-simple-3.2.0 +- yellowstone-grpc-client-3.1.0 +- yellowstone-grpc-geyser-3.2.0 +- yellowstone-grpc-proto-3.1.0 + +### Fixes + - nodejs: fix connector for custom port ([#488](https://github.com/rpcpool/yellowstone-grpc/pull/488)) - nodejs: fix connector for host/hostname ([#491](https://github.com/rpcpool/yellowstone-grpc/pull/491)) ### Features - proto: add tonic feature ([#474](https://github.com/rpcpool/yellowstone-grpc/pull/474)) +- proto: add `from_slot` ([#477](https://github.com/rpcpool/yellowstone-grpc/pull/477)) - proto: add field `created_at` to update message ([#479](https://github.com/rpcpool/yellowstone-grpc/pull/479)) - nodejs: add parse err function ([#483](https://github.com/rpcpool/yellowstone-grpc/pull/483)) -### Breaking - ## 2024-12-01 - yellowstone-grpc-client-simple-3.1.0 diff --git a/Cargo.lock b/Cargo.lock index 0dcd0f96..664564b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5014,7 +5014,7 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yellowstone-grpc-client" -version = "3.0.0" +version = "3.1.0" dependencies = [ "bytes", "futures", @@ -5027,7 +5027,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-client-simple" -version = "3.1.0" +version = "3.2.0" dependencies = [ "anyhow", "backoff", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-geyser" -version = "3.1.0" +version = "3.2.0" dependencies = [ "affinity", "agave-geyser-plugin-interface", @@ -5092,7 +5092,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-proto" -version = "3.0.0" +version = "3.1.0" dependencies = [ "agave-geyser-plugin-interface", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 17a4c958..57cac968 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,10 @@ [workspace] resolver = "2" members = [ - "examples/rust", # 3.1.0 - "yellowstone-grpc-client", # 3.0.0 - "yellowstone-grpc-geyser", # 3.1.0 - "yellowstone-grpc-proto", # 3.0.0 + "examples/rust", # 3.2.0 + "yellowstone-grpc-client", # 3.1.0 + "yellowstone-grpc-geyser", # 3.2.0 + "yellowstone-grpc-proto", # 3.1.0 ] exclude = [ "yellowstone-grpc-client-nodejs/solana-encoding-wasm", # 3.0.0 @@ -69,8 +69,8 @@ tonic = "0.12.1" tonic-build = "0.12.1" tonic-health = "0.12.1" vergen = "9.0.0" -yellowstone-grpc-client = { path = "yellowstone-grpc-client", version = "3.0.0" } -yellowstone-grpc-proto = { path = "yellowstone-grpc-proto", version = "3.0.0", default-features = false } +yellowstone-grpc-client = { path = "yellowstone-grpc-client", version = "3.1.0" } +yellowstone-grpc-proto = { path = "yellowstone-grpc-proto", version = "3.1.0", default-features = false } [workspace.lints.clippy] clone_on_ref_ptr = "deny" diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index a5382839..4767bd59 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-client-simple" -version = "3.1.0" +version = "3.2.0" authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/examples/rust/src/bin/client.rs b/examples/rust/src/bin/client.rs index 4be59859..9cfc7b3f 100644 --- a/examples/rust/src/bin/client.rs +++ b/examples/rust/src/bin/client.rs @@ -329,6 +329,10 @@ struct ActionSubscribe { #[clap(long)] blocks_meta: bool, + /// Re-send message from slot + #[clap(long)] + from_slot: Option, + /// Send ping in subscribe request #[clap(long)] ping: Option, @@ -522,6 +526,7 @@ impl Action { commitment: commitment.map(|x| x as i32), accounts_data_slice, ping, + from_slot: args.from_slot, }, args.resub.unwrap_or(0), args.stats, @@ -885,6 +890,7 @@ async fn geyser_subscribe( commitment: None, accounts_data_slice: Vec::default(), ping: None, + from_slot: 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 4162e36b..b61ca1c0 100644 --- a/examples/rust/src/bin/tx-blocktime.rs +++ b/examples/rust/src/bin/tx-blocktime.rs @@ -111,6 +111,7 @@ async fn main() -> anyhow::Result<()> { commitment: Some(commitment as i32), accounts_data_slice: vec![], ping: None, + from_slot: None, }) .await?; diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock index 438a2ea6..793908f5 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock @@ -2655,7 +2655,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-proto" -version = "3.0.0" +version = "3.1.0" dependencies = [ "anyhow", "bincode", diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml index feb99cd2..2ba46d6f 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml @@ -16,7 +16,7 @@ crate-type = ["cdylib"] serde_json = "1.0.86" solana-transaction-status = "~2.0.16" wasm-bindgen = "0.2.95" -yellowstone-grpc-proto = { path = "../../yellowstone-grpc-proto", version = "3.0.0", default-features = false, features = ["convert"] } +yellowstone-grpc-proto = { path = "../../yellowstone-grpc-proto", version = "3.1.0", default-features = false, features = ["convert"] } [workspace.lints.clippy] clone_on_ref_ptr = "deny" diff --git a/yellowstone-grpc-client/Cargo.toml b/yellowstone-grpc-client/Cargo.toml index f18b919c..cfcb30ce 100644 --- a/yellowstone-grpc-client/Cargo.toml +++ b/yellowstone-grpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-client" -version = "3.0.0" +version = "3.1.0" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Simple Client" diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index fbb73464..05cbf15c 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-geyser" -version = "3.1.0" +version = "3.2.0" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Plugin" diff --git a/yellowstone-grpc-geyser/config.json b/yellowstone-grpc-geyser/config.json index 180c913a..7c7373c2 100644 --- a/yellowstone-grpc-geyser/config.json +++ b/yellowstone-grpc-geyser/config.json @@ -24,8 +24,9 @@ "unary_concurrency_limit": 100, "unary_disabled": false, "x_token": null, - "filter_name_size_limit": 32, - "filter_names_size_limit": 1024, + "replay_stored_slots": 0, + "filter_name_size_limit": 128, + "filter_names_size_limit": 4096, "filter_names_cleanup_interval": "1s", "filter_limits": { "accounts": { diff --git a/yellowstone-grpc-geyser/src/config.rs b/yellowstone-grpc-geyser/src/config.rs index 0d6b2ec0..0c42f7e3 100644 --- a/yellowstone-grpc-geyser/src/config.rs +++ b/yellowstone-grpc-geyser/src/config.rs @@ -189,6 +189,9 @@ pub struct ConfigGrpc { with = "humantime_serde" )] pub filter_names_cleanup_interval: Duration, + /// Number of slots stored for re-broadcast (replay) + #[serde(default = "ConfigGrpc::default_replay_stored_slots")] + pub replay_stored_slots: u64, } impl ConfigGrpc { @@ -223,6 +226,10 @@ impl ConfigGrpc { const fn default_filter_names_cleanup_interval() -> Duration { Duration::from_secs(1) } + + const fn default_replay_stored_slots() -> u64 { + 0 + } } #[derive(Debug, Clone, Deserialize)] diff --git a/yellowstone-grpc-geyser/src/grpc.rs b/yellowstone-grpc-geyser/src/grpc.rs index 04674dcd..e8e8938d 100644 --- a/yellowstone-grpc-geyser/src/grpc.rs +++ b/yellowstone-grpc-geyser/src/grpc.rs @@ -22,7 +22,7 @@ use { tokio::{ fs, runtime::Builder, - sync::{broadcast, mpsc, Mutex, Notify, RwLock, Semaphore}, + sync::{broadcast, mpsc, oneshot, Mutex, Notify, RwLock, Semaphore}, task::spawn_blocking, time::{sleep, Duration, Instant}, }, @@ -235,9 +235,22 @@ impl BlockMetaStorage { } } +#[derive(Debug, Default)] +struct MessageId { + id: u64, +} + +impl MessageId { + fn next(&mut self) -> u64 { + self.id = self.id.checked_add(1).expect("message id overflow"); + self.id + } +} + #[derive(Debug, Default)] struct SlotMessages { - messages: Vec>, // Option is used for accounts with low write_version + messages: Vec>, // Option is used for accounts with low write_version + messages_slots: Vec<(u64, Message)>, block_meta: Option>, transactions: Vec>, accounts_dedup: HashMap, // (write_version, message_index) @@ -252,7 +265,7 @@ struct SlotMessages { } impl SlotMessages { - pub fn try_seal(&mut self) -> Option { + pub fn try_seal(&mut self, msgid_gen: &mut MessageId) -> Option<(u64, Message)> { if !self.sealed { if let Some(block_meta) = &self.block_meta { let executed_transaction_count = block_meta.executed_transaction_count as usize; @@ -271,17 +284,18 @@ impl SlotMessages { let mut accounts = Vec::with_capacity(self.messages.len()); for item in self.messages.iter().flatten() { - if let Message::Account(account) = item { + if let (_msgid, Message::Account(account)) = item { accounts.push(Arc::clone(&account.account)); } } - let message = Message::Block(Arc::new(MessageBlock::new( + let message_block = Message::Block(Arc::new(MessageBlock::new( Arc::clone(block_meta), transactions, accounts, entries, ))); + let message = (msgid_gen.next(), message_block); self.messages.push(Some(message.clone())); self.sealed = true; @@ -295,6 +309,15 @@ impl SlotMessages { } } +type BroadcastedMessage = (CommitmentLevel, Arc>); + +enum ReplayedResponse { + Messages(Vec<(u64, Message)>), + Lagged(Slot), +} + +type ReplayStoredSlotsRequest = (CommitmentLevel, Slot, oneshot::Sender); + #[derive(Debug)] pub struct GrpcService { config_snapshot_client_channel_capacity: usize, @@ -303,7 +326,8 @@ pub struct GrpcService { blocks_meta: Option, subscribe_id: AtomicUsize, snapshot_rx: Mutex>>>, - broadcast_tx: broadcast::Sender<(CommitmentLevel, Arc>)>, + broadcast_tx: broadcast::Sender, + replay_stored_slots_tx: mpsc::Sender, debug_clients_tx: Option>, filter_names: Arc>, } @@ -348,6 +372,13 @@ impl GrpcService { // Messages to clients combined by commitment let (broadcast_tx, _) = broadcast::channel(config.channel_capacity); + // attempt to prevent spam of geyser loop with capacity eq 1 + let (replay_stored_slots_tx, replay_stored_slots_rx) = + mpsc::channel(if config.replay_stored_slots == 0 { + 0 + } else { + 1 + }); // gRPC server builder with optional TLS let mut server_builder = Server::builder(); @@ -378,6 +409,7 @@ impl GrpcService { subscribe_id: AtomicUsize::new(0), snapshot_rx: Mutex::new(snapshot_rx), broadcast_tx: broadcast_tx.clone(), + replay_stored_slots_tx, debug_clients_tx, filter_names, }) @@ -406,7 +438,13 @@ impl GrpcService { .enable_all() .build() .expect("Failed to create a new runtime for geyser loop") - .block_on(Self::geyser_loop(messages_rx, blocks_meta_tx, broadcast_tx)); + .block_on(Self::geyser_loop( + messages_rx, + blocks_meta_tx, + broadcast_tx, + replay_stored_slots_rx, + config.replay_stored_slots, + )); }); // Run Server @@ -441,11 +479,14 @@ impl GrpcService { async fn geyser_loop( mut messages_rx: mpsc::UnboundedReceiver, blocks_meta_tx: Option>, - broadcast_tx: broadcast::Sender<(CommitmentLevel, Arc>)>, + broadcast_tx: broadcast::Sender, + mut replay_stored_slots_rx: mpsc::Receiver, + replay_stored_slots: u64, ) { const PROCESSED_MESSAGES_MAX: usize = 31; const PROCESSED_MESSAGES_SLEEP: Duration = Duration::from_millis(10); + let mut msgid_gen = MessageId::default(); let mut messages: BTreeMap = Default::default(); let mut processed_messages = Vec::with_capacity(PROCESSED_MESSAGES_MAX); let mut processed_first_slot = None; @@ -456,6 +497,7 @@ impl GrpcService { tokio::select! { Some(message) = messages_rx.recv() => { metrics::message_queue_size_dec(); + let msgid = msgid_gen.next(); // Update metrics if let Message::Slot(slot_message) = &message { @@ -477,8 +519,8 @@ impl GrpcService { processed_first_slot = Some(msg.slot); } Message::Slot(msg) if msg.status == CommitmentLevel::Finalized => { - // keep extra 10 slots - if let Some(msg_slot) = msg.slot.checked_sub(10) { + // keep extra 10 slots + slots for replay + if let Some(msg_slot) = msg.slot.checked_sub(10 + replay_stored_slots) { loop { match messages.keys().next().cloned() { Some(slot) if slot < msg_slot => { @@ -536,8 +578,10 @@ impl GrpcService { }, } } - if !matches!(&message, Message::Slot(_)) { - slot_messages.messages.push(Some(message.clone())); + if matches!(&message, Message::Slot(_)) { + slot_messages.messages_slots.push((msgid, message.clone())); + } else { + slot_messages.messages.push(Some((msgid, message.clone()))); // If we already build Block message, new message will be a problem if slot_messages.sealed && !(matches!(&message, Message::Entry(_)) && slot_messages.entries_count == 0) { @@ -559,11 +603,11 @@ impl GrpcService { metrics::update_invalid_blocks("unexpected message: BlockMeta (duplicate)"); } slot_messages.block_meta = Some(Arc::clone(msg)); - sealed_block_msg = slot_messages.try_seal(); + sealed_block_msg = slot_messages.try_seal(&mut msgid_gen); } Message::Transaction(msg) => { slot_messages.transactions.push(Arc::clone(&msg.transaction)); - sealed_block_msg = slot_messages.try_seal(); + sealed_block_msg = slot_messages.try_seal(&mut msgid_gen); } // Dedup accounts by max write_version Message::Account(msg) => { @@ -581,7 +625,7 @@ impl GrpcService { } Message::Entry(msg) => { slot_messages.entries.push(Arc::clone(msg)); - sealed_block_msg = slot_messages.try_seal(); + sealed_block_msg = slot_messages.try_seal(&mut msgid_gen); } _ => {} } @@ -596,7 +640,7 @@ impl GrpcService { } else { None }; - messages_vec.push(message); + messages_vec.push((msgid, message)); // sometimes we do not receive all statuses if let Some((slot, status)) = slot_status { @@ -617,19 +661,20 @@ impl GrpcService { } slots.push(parent); - messages_vec.push(Message::Slot(MessageSlot { + let message_slot = Message::Slot(MessageSlot { slot: parent, parent: entry.parent_slot, status, created_at: Timestamp::from(SystemTime::now()) - })); + }); + messages_vec.push((msgid_gen.next(), message_slot)); metrics::missed_status_message_inc(status); } } } for message in messages_vec.into_iter().rev() { - if let Message::Slot(slot) = &message { + if let Message::Slot(slot) = &message.1 { let (mut confirmed_messages, mut finalized_messages) = match slot.status { CommitmentLevel::Processed => { (Vec::with_capacity(1), Vec::with_capacity(1)) @@ -683,8 +728,8 @@ impl GrpcService { } else { let mut confirmed_messages = vec![]; let mut finalized_messages = vec![]; - if matches!(&message, Message::Block(_)) { - if let Some(slot_messages) = messages.get(&message.get_slot()) { + if matches!(&message.1, Message::Block(_)) { + if let Some(slot_messages) = messages.get(&message.1.get_slot()) { if let Some(confirmed_at) = slot_messages.confirmed_at { confirmed_messages.extend( slot_messages.messages.as_slice()[confirmed_at..].iter().filter_map(|x| x.clone()) @@ -730,6 +775,28 @@ impl GrpcService { } processed_sleep.as_mut().reset(Instant::now() + PROCESSED_MESSAGES_SLEEP); } + Some((commitment, replay_slot, tx)) = replay_stored_slots_rx.recv() => { + if let Some((slot, _)) = messages.first_key_value() { + if replay_slot < *slot { + let _ = tx.send(ReplayedResponse::Lagged(*slot)); + continue; + } + } + + let mut replayed_messages = Vec::with_capacity(32_768); + for (slot, messages) in messages.iter() { + if *slot >= replay_slot { + replayed_messages.extend_from_slice(&messages.messages_slots); + if commitment == CommitmentLevel::Processed + || (commitment == CommitmentLevel::Finalized && messages.finalized) + || (commitment == CommitmentLevel::Confirmed && messages.confirmed) + { + replayed_messages.extend(messages.messages.iter().filter_map(|v| v.clone())); + } + } + } + let _ = tx.send(ReplayedResponse::Messages(replayed_messages)); + } else => break, } } @@ -740,9 +807,10 @@ impl GrpcService { id: usize, endpoint: String, stream_tx: mpsc::Sender>, - mut client_rx: mpsc::UnboundedReceiver>, + mut client_rx: mpsc::UnboundedReceiver, Filter)>>, mut snapshot_rx: Option>>, - mut messages_rx: broadcast::Receiver<(CommitmentLevel, Arc>)>, + mut messages_rx: broadcast::Receiver, + replay_stored_slots_tx: mpsc::Sender, debug_client_tx: Option>, drop_client: impl FnOnce(), ) { @@ -789,7 +857,7 @@ impl GrpcService { } match message { - Some(Some(filter_new)) => { + Some(Some((from_slot, 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"); @@ -802,6 +870,60 @@ impl GrpcService { filter = filter_new; DebugClientMessage::maybe_send(&debug_client_tx, || DebugClientMessage::UpdateFilter { id, filter: Box::new(filter.clone()) }); info!("client #{id}: filter updated"); + + if let Some(from_slot) = from_slot { + if replay_stored_slots_tx.max_capacity() == 0 { + info!("client #{id}: from_slot is not supported"); + tokio::spawn(async move { + let _ = stream_tx.send(Err(Status::internal("from_slot is not supported"))).await; + }); + break 'outer; + } + + let (tx, rx) = oneshot::channel(); + let commitment = filter.get_commitment_level(); + if let Err(_error) = replay_stored_slots_tx.send((commitment, from_slot, tx)).await { + error!("client #{id}: failed to send from_slot request"); + tokio::spawn(async move { + let _ = stream_tx.send(Err(Status::internal("failed to send from_slot request"))).await; + }); + break 'outer; + } + + let mut messages = match rx.await { + Ok(ReplayedResponse::Messages(messages)) => messages, + Ok(ReplayedResponse::Lagged(slot)) => { + info!("client #{id}: broadcast from {from_slot} is not available"); + tokio::spawn(async move { + let message = format!( + "broadcast from {from_slot} is not available, last available: {slot}" + ); + let _ = stream_tx.send(Err(Status::internal(message))).await; + }); + break 'outer; + }, + Err(_error) => { + error!("client #{id}: failed to get replay response"); + tokio::spawn(async move { + let _ = stream_tx.send(Err(Status::internal("failed to get replay response"))).await; + }); + break 'outer; + } + }; + + messages.sort_by_key(|msg| msg.0); + for (_msgid, message) in messages.iter() { + for message in filter.get_updates(message, Some(commitment)) { + match stream_tx.send(Ok(message)).await { + Ok(()) => {} + Err(mpsc::error::SendError(_)) => { + error!("client #{id}: stream closed"); + break 'outer; + } + } + } + } + } } Some(None) => { break 'outer; @@ -820,21 +942,21 @@ impl GrpcService { Err(broadcast::error::RecvError::Lagged(_)) => { info!("client #{id}: lagged to receive geyser messages"); tokio::spawn(async move { - let _ = stream_tx.send(Err(Status::internal("lagged"))).await; + let _ = stream_tx.send(Err(Status::internal("lagged to receive geyser messages"))).await; }); break 'outer; } }; if commitment == filter.get_commitment_level() { - for message in messages.iter() { + for (_msgid, message) in messages.iter() { for message in filter.get_updates(message, Some(commitment)) { match stream_tx.try_send(Ok(message)) { Ok(()) => {} Err(mpsc::error::TrySendError::Full(_)) => { - error!("client #{id}: lagged to send update"); + error!("client #{id}: lagged to send an update"); tokio::spawn(async move { - let _ = stream_tx.send(Err(Status::internal("lagged"))).await; + let _ = stream_tx.send(Err(Status::internal("lagged to send an update"))).await; }); break 'outer; } @@ -849,7 +971,7 @@ impl GrpcService { if commitment == CommitmentLevel::Processed && debug_client_tx.is_some() { for message in messages.iter() { - if let Message::Slot(slot_message) = &message { + if let Message::Slot(slot_message) = &message.1 { DebugClientMessage::maybe_send(&debug_client_tx, || DebugClientMessage::UpdateSlot { id, slot: slot_message.slot }); } } @@ -870,7 +992,7 @@ impl GrpcService { id: usize, endpoint: &str, stream_tx: &mpsc::Sender>, - client_rx: &mut mpsc::UnboundedReceiver>, + client_rx: &mut mpsc::UnboundedReceiver, Filter)>>, snapshot_rx: crossbeam_channel::Receiver>, is_alive: &mut bool, filter: &mut Filter, @@ -880,7 +1002,7 @@ impl GrpcService { // we start with default filter, for snapshot we need wait actual filter first while *is_alive { match client_rx.recv().await { - Some(Some(filter_new)) => { + Some(Some((_from_slot, 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"); @@ -1008,7 +1130,7 @@ impl Geyser for GrpcService { filter_names.try_clean(); if let Err(error) = match Filter::new(&request, &config_filter_limits, &mut filter_names) { - Ok(filter) => match incoming_client_tx.send(Some(filter)) { + Ok(filter) => match incoming_client_tx.send(Some((request.from_slot ,filter))) { Ok(()) => Ok(()), Err(error) => Err(error.to_string()), }, @@ -1041,6 +1163,7 @@ impl Geyser for GrpcService { client_rx, snapshot_rx, self.broadcast_tx.subscribe(), + self.replay_stored_slots_tx.clone(), self.debug_clients_tx.clone(), move || { notify_exit1.notify_one(); diff --git a/yellowstone-grpc-proto/Cargo.toml b/yellowstone-grpc-proto/Cargo.toml index 8fb295dc..161477a8 100644 --- a/yellowstone-grpc-proto/Cargo.toml +++ b/yellowstone-grpc-proto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-proto" -version = "3.0.0" +version = "3.1.0" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Protobuf Definitions" diff --git a/yellowstone-grpc-proto/proto/geyser.proto b/yellowstone-grpc-proto/proto/geyser.proto index e7c47bd9..ec8791b1 100644 --- a/yellowstone-grpc-proto/proto/geyser.proto +++ b/yellowstone-grpc-proto/proto/geyser.proto @@ -34,6 +34,7 @@ message SubscribeRequest { optional CommitmentLevel commitment = 6; repeated SubscribeRequestAccountsDataSlice accounts_data_slice = 7; optional SubscribeRequestPing ping = 9; + optional uint64 from_slot = 11; } message SubscribeRequestFilterAccounts { diff --git a/yellowstone-grpc-proto/src/plugin/filter/filter.rs b/yellowstone-grpc-proto/src/plugin/filter/filter.rs index 2bd57496..c8edff22 100644 --- a/yellowstone-grpc-proto/src/plugin/filter/filter.rs +++ b/yellowstone-grpc-proto/src/plugin/filter/filter.rs @@ -1185,6 +1185,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let limit = FilterLimits::default(); let filter = Filter::new(&config, &limit, &mut create_filter_names()); @@ -1216,6 +1217,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let mut limit = FilterLimits::default(); limit.accounts.any = false; @@ -1251,6 +1253,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let mut limit = FilterLimits::default(); limit.transactions.any = false; @@ -1285,6 +1288,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let mut limit = FilterLimits::default(); limit.transactions.any = false; @@ -1325,6 +1329,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let limit = FilterLimits::default(); let filter = Filter::new(&config, &limit, &mut create_filter_names()).unwrap(); @@ -1389,6 +1394,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let limit = FilterLimits::default(); let filter = Filter::new(&config, &limit, &mut create_filter_names()).unwrap(); @@ -1453,6 +1459,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let limit = FilterLimits::default(); let filter = Filter::new(&config, &limit, &mut create_filter_names()).unwrap(); @@ -1503,6 +1510,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let limit = FilterLimits::default(); let filter = Filter::new(&config, &limit, &mut create_filter_names()).unwrap(); @@ -1575,6 +1583,7 @@ mod tests { commitment: None, accounts_data_slice: Vec::new(), ping: None, + from_slot: None, }; let limit = FilterLimits::default(); let filter = Filter::new(&config, &limit, &mut create_filter_names()).unwrap(); From ad5dd9450cc3d6a8d040dd0e17a7d327c986420f Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Fri, 13 Dec 2024 14:48:36 -0500 Subject: [PATCH 12/20] node,go: bump and update proto (#492) --- examples/golang/proto/geyser.pb.go | 1044 +++++++++-------- examples/typescript/package-lock.json | 6 +- examples/typescript/package.json | 2 +- .../package-lock.json | 4 +- yellowstone-grpc-client-nodejs/package.json | 2 +- 5 files changed, 543 insertions(+), 515 deletions(-) diff --git a/examples/golang/proto/geyser.pb.go b/examples/golang/proto/geyser.pb.go index b108d533..2e5b9946 100644 --- a/examples/golang/proto/geyser.pb.go +++ b/examples/golang/proto/geyser.pb.go @@ -9,6 +9,7 @@ package proto import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -84,6 +85,7 @@ type SubscribeRequest struct { 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"` + FromSlot *uint64 `protobuf:"varint,11,opt,name=from_slot,json=fromSlot,proto3,oneof" json:"from_slot,omitempty"` } func (x *SubscribeRequest) Reset() { @@ -186,6 +188,13 @@ func (x *SubscribeRequest) GetPing() *SubscribeRequestPing { return nil } +func (x *SubscribeRequest) GetFromSlot() uint64 { + if x != nil && x.FromSlot != nil { + return *x.FromSlot + } + return 0 +} + type SubscribeRequestFilterAccounts struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -967,6 +976,7 @@ type SubscribeUpdate struct { // *SubscribeUpdate_BlockMeta // *SubscribeUpdate_Entry UpdateOneof isSubscribeUpdate_UpdateOneof `protobuf_oneof:"update_oneof"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } func (x *SubscribeUpdate) Reset() { @@ -1076,6 +1086,13 @@ func (x *SubscribeUpdate) GetEntry() *SubscribeUpdateEntry { return nil } +func (x *SubscribeUpdate) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + type isSubscribeUpdate_UpdateOneof interface { isSubscribeUpdate_UpdateOneof() } @@ -2547,318 +2564,372 @@ 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, 0xbd, 0x0b, 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, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 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, 0x2e, 0x53, - 0x6c, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, - 0x12, 0x4e, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x03, 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, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x61, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x04, 0x20, - 0x03, 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, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x49, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x03, 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, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x05, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x08, 0x20, 0x03, 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, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 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, 0x12, 0x59, 0x0a, 0x13, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 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, - 0x12, 0x35, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x67, 0x65, 0x79, 0x73, 0x65, 0x72, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2d, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xed, 0x0b, + 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, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 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, 0x2e, + 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x6c, 0x6f, 0x74, + 0x73, 0x12, 0x4e, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x03, 0x20, 0x03, 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, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x61, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 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, 0x71, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x04, + 0x20, 0x03, 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, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x49, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x05, 0x20, 0x03, 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, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x39, 0x0a, + 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x08, 0x20, 0x03, 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, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 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, 0x12, 0x59, 0x0a, 0x13, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 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, 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, 0x12, 0x20, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x08, 0x66, + 0x72, 0x6f, 0x6d, 0x53, 0x6c, 0x6f, 0x74, 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, 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, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xee, 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, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2c, 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, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x6e, 0x6f, 0x6e, 0x65, 0x6d, - 0x70, 0x74, 0x79, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x65, 0x6d, - 0x70, 0x74, 0x79, 0x54, 0x78, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6e, 0x6f, 0x6e, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, - 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xa2, 0x02, - 0x0a, 0x24, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x17, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, + 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, 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, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x22, 0xee, 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, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 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, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x65, - 0x6d, 0x63, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x69, - 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x11, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 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, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x48, 0x00, 0x52, 0x08, - 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x2a, 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, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x63, 0x6d, - 0x70, 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, 0x05, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, - 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, 0x7d, 0x0a, - 0x2c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 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, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, + 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x6e, 0x6f, 0x6e, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x54, 0x78, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6e, 0x6f, 0x6e, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x5f, 0x74, 0x78, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xa2, + 0x02, 0x0a, 0x24, 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, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 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, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x10, 0x0a, - 0x02, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x02, 0x65, 0x71, 0x12, - 0x10, 0x0a, 0x02, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x02, 0x6e, - 0x65, 0x12, 0x10, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, - 0x02, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, - 0x00, 0x52, 0x02, 0x67, 0x74, 0x42, 0x05, 0x0a, 0x03, 0x63, 0x6d, 0x70, 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, 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, 0x08, - 0x48, 0x00, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x29, 0x0a, - 0x10, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x76, 0x6f, 0x74, - 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x9f, 0x02, 0x0a, 0x1c, 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, 0x12, 0x27, 0x0a, 0x0f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x20, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x06, 0x6d, + 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x11, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x08, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 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, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x48, 0x00, 0x52, + 0x08, 0x6c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x2a, 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, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x63, + 0x6d, 0x70, 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, 0x05, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x62, 0x79, 0x74, + 0x65, 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, 0x7d, + 0x0a, 0x2c, 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, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x10, + 0x0a, 0x02, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x02, 0x65, 0x71, + 0x12, 0x10, 0x0a, 0x02, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x02, + 0x6e, 0x65, 0x12, 0x10, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, + 0x52, 0x02, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x48, 0x00, 0x52, 0x02, 0x67, 0x74, 0x42, 0x05, 0x0a, 0x03, 0x63, 0x6d, 0x70, 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, 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, + 0x08, 0x48, 0x00, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x29, + 0x0a, 0x10, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x76, 0x6f, + 0x74, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x9f, 0x02, 0x0a, 0x1c, 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, - 0x22, 0x1d, 0x0a, 0x1b, 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, 0x22, - 0x53, 0x0a, 0x21, 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, 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, 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, 0xe2, 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, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x22, 0x0a, + 0x20, 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, 0x22, 0x1d, 0x0a, 0x1b, 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, + 0x22, 0x53, 0x0a, 0x21, 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, 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, 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, 0x9d, 0x05, + 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, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 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, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 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, + 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, 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, 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, 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, 0xc6, 0x01, 0x0a, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 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, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 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, 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, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x56, - 0x6f, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x41, 0x0a, 0x03, 0x65, 0x72, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2e, + 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, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x03, 0x65, 0x72, 0x72, 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, + 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, + 0xc6, 0x01, 0x0a, 0x20, 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, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x56, 0x6f, 0x74, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x41, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 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, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x03, 0x65, 0x72, 0x72, 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, 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, 0xd9, 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, @@ -2876,178 +2947,133 @@ var file_geyser_proto_rawDesc = []byte{ 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, + 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, 0x08, 0x20, 0x01, 0x28, 0x09, + 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, - 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x54, + 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, 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, 0xd9, 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, 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, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xef, 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, 0x12, 0x3c, 0x0a, 0x1a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x18, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 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, 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, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xef, 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, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 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, 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, + 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, 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, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x79, 0x65, 0x6c, - 0x6c, 0x6f, 0x77, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x2d, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 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, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x70, 0x63, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x73, + 0x74, 0x6f, 0x6e, 0x65, 0x2d, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3109,12 +3135,13 @@ var file_geyser_proto_goTypes = []any{ nil, // 41: geyser.SubscribeRequest.BlocksEntry nil, // 42: geyser.SubscribeRequest.BlocksMetaEntry nil, // 43: geyser.SubscribeRequest.EntryEntry - (*Transaction)(nil), // 44: solana.storage.ConfirmedBlock.Transaction - (*TransactionStatusMeta)(nil), // 45: solana.storage.ConfirmedBlock.TransactionStatusMeta - (*TransactionError)(nil), // 46: solana.storage.ConfirmedBlock.TransactionError - (*Rewards)(nil), // 47: solana.storage.ConfirmedBlock.Rewards - (*UnixTimestamp)(nil), // 48: solana.storage.ConfirmedBlock.UnixTimestamp - (*BlockHeight)(nil), // 49: solana.storage.ConfirmedBlock.BlockHeight + (*timestamppb.Timestamp)(nil), // 44: google.protobuf.Timestamp + (*Transaction)(nil), // 45: solana.storage.ConfirmedBlock.Transaction + (*TransactionStatusMeta)(nil), // 46: solana.storage.ConfirmedBlock.TransactionStatusMeta + (*TransactionError)(nil), // 47: solana.storage.ConfirmedBlock.TransactionError + (*Rewards)(nil), // 48: solana.storage.ConfirmedBlock.Rewards + (*UnixTimestamp)(nil), // 49: solana.storage.ConfirmedBlock.UnixTimestamp + (*BlockHeight)(nil), // 50: solana.storage.ConfirmedBlock.BlockHeight } var file_geyser_proto_depIdxs = []int32{ 37, // 0: geyser.SubscribeRequest.accounts:type_name -> geyser.SubscribeRequest.AccountsEntry @@ -3139,51 +3166,52 @@ var file_geyser_proto_depIdxs = []int32{ 24, // 19: geyser.SubscribeUpdate.pong:type_name -> geyser.SubscribeUpdatePong 21, // 20: geyser.SubscribeUpdate.block_meta:type_name -> geyser.SubscribeUpdateBlockMeta 22, // 21: geyser.SubscribeUpdate.entry:type_name -> geyser.SubscribeUpdateEntry - 15, // 22: geyser.SubscribeUpdateAccount.account:type_name -> geyser.SubscribeUpdateAccountInfo - 0, // 23: geyser.SubscribeUpdateSlot.status:type_name -> geyser.CommitmentLevel - 18, // 24: geyser.SubscribeUpdateTransaction.transaction:type_name -> geyser.SubscribeUpdateTransactionInfo - 44, // 25: geyser.SubscribeUpdateTransactionInfo.transaction:type_name -> solana.storage.ConfirmedBlock.Transaction - 45, // 26: geyser.SubscribeUpdateTransactionInfo.meta:type_name -> solana.storage.ConfirmedBlock.TransactionStatusMeta - 46, // 27: geyser.SubscribeUpdateTransactionStatus.err:type_name -> solana.storage.ConfirmedBlock.TransactionError - 47, // 28: geyser.SubscribeUpdateBlock.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards - 48, // 29: geyser.SubscribeUpdateBlock.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp - 49, // 30: geyser.SubscribeUpdateBlock.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight - 18, // 31: geyser.SubscribeUpdateBlock.transactions:type_name -> geyser.SubscribeUpdateTransactionInfo - 15, // 32: geyser.SubscribeUpdateBlock.accounts:type_name -> geyser.SubscribeUpdateAccountInfo - 22, // 33: geyser.SubscribeUpdateBlock.entries:type_name -> geyser.SubscribeUpdateEntry - 47, // 34: geyser.SubscribeUpdateBlockMeta.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards - 48, // 35: geyser.SubscribeUpdateBlockMeta.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp - 49, // 36: geyser.SubscribeUpdateBlockMeta.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight - 0, // 37: geyser.GetLatestBlockhashRequest.commitment:type_name -> geyser.CommitmentLevel - 0, // 38: geyser.GetBlockHeightRequest.commitment:type_name -> geyser.CommitmentLevel - 0, // 39: geyser.GetSlotRequest.commitment:type_name -> geyser.CommitmentLevel - 0, // 40: geyser.IsBlockhashValidRequest.commitment:type_name -> geyser.CommitmentLevel - 2, // 41: geyser.SubscribeRequest.AccountsEntry.value:type_name -> geyser.SubscribeRequestFilterAccounts - 6, // 42: geyser.SubscribeRequest.SlotsEntry.value:type_name -> geyser.SubscribeRequestFilterSlots - 7, // 43: geyser.SubscribeRequest.TransactionsEntry.value:type_name -> geyser.SubscribeRequestFilterTransactions - 7, // 44: geyser.SubscribeRequest.TransactionsStatusEntry.value:type_name -> geyser.SubscribeRequestFilterTransactions - 8, // 45: geyser.SubscribeRequest.BlocksEntry.value:type_name -> geyser.SubscribeRequestFilterBlocks - 9, // 46: geyser.SubscribeRequest.BlocksMetaEntry.value:type_name -> geyser.SubscribeRequestFilterBlocksMeta - 10, // 47: geyser.SubscribeRequest.EntryEntry.value:type_name -> geyser.SubscribeRequestFilterEntry - 1, // 48: geyser.Geyser.Subscribe:input_type -> geyser.SubscribeRequest - 25, // 49: geyser.Geyser.Ping:input_type -> geyser.PingRequest - 27, // 50: geyser.Geyser.GetLatestBlockhash:input_type -> geyser.GetLatestBlockhashRequest - 29, // 51: geyser.Geyser.GetBlockHeight:input_type -> geyser.GetBlockHeightRequest - 31, // 52: geyser.Geyser.GetSlot:input_type -> geyser.GetSlotRequest - 35, // 53: geyser.Geyser.IsBlockhashValid:input_type -> geyser.IsBlockhashValidRequest - 33, // 54: geyser.Geyser.GetVersion:input_type -> geyser.GetVersionRequest - 13, // 55: geyser.Geyser.Subscribe:output_type -> geyser.SubscribeUpdate - 26, // 56: geyser.Geyser.Ping:output_type -> geyser.PongResponse - 28, // 57: geyser.Geyser.GetLatestBlockhash:output_type -> geyser.GetLatestBlockhashResponse - 30, // 58: geyser.Geyser.GetBlockHeight:output_type -> geyser.GetBlockHeightResponse - 32, // 59: geyser.Geyser.GetSlot:output_type -> geyser.GetSlotResponse - 36, // 60: geyser.Geyser.IsBlockhashValid:output_type -> geyser.IsBlockhashValidResponse - 34, // 61: geyser.Geyser.GetVersion:output_type -> geyser.GetVersionResponse - 55, // [55:62] is the sub-list for method output_type - 48, // [48:55] is the sub-list for method input_type - 48, // [48:48] is the sub-list for extension type_name - 48, // [48:48] is the sub-list for extension extendee - 0, // [0:48] is the sub-list for field type_name + 44, // 22: geyser.SubscribeUpdate.created_at:type_name -> google.protobuf.Timestamp + 15, // 23: geyser.SubscribeUpdateAccount.account:type_name -> geyser.SubscribeUpdateAccountInfo + 0, // 24: geyser.SubscribeUpdateSlot.status:type_name -> geyser.CommitmentLevel + 18, // 25: geyser.SubscribeUpdateTransaction.transaction:type_name -> geyser.SubscribeUpdateTransactionInfo + 45, // 26: geyser.SubscribeUpdateTransactionInfo.transaction:type_name -> solana.storage.ConfirmedBlock.Transaction + 46, // 27: geyser.SubscribeUpdateTransactionInfo.meta:type_name -> solana.storage.ConfirmedBlock.TransactionStatusMeta + 47, // 28: geyser.SubscribeUpdateTransactionStatus.err:type_name -> solana.storage.ConfirmedBlock.TransactionError + 48, // 29: geyser.SubscribeUpdateBlock.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards + 49, // 30: geyser.SubscribeUpdateBlock.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp + 50, // 31: geyser.SubscribeUpdateBlock.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight + 18, // 32: geyser.SubscribeUpdateBlock.transactions:type_name -> geyser.SubscribeUpdateTransactionInfo + 15, // 33: geyser.SubscribeUpdateBlock.accounts:type_name -> geyser.SubscribeUpdateAccountInfo + 22, // 34: geyser.SubscribeUpdateBlock.entries:type_name -> geyser.SubscribeUpdateEntry + 48, // 35: geyser.SubscribeUpdateBlockMeta.rewards:type_name -> solana.storage.ConfirmedBlock.Rewards + 49, // 36: geyser.SubscribeUpdateBlockMeta.block_time:type_name -> solana.storage.ConfirmedBlock.UnixTimestamp + 50, // 37: geyser.SubscribeUpdateBlockMeta.block_height:type_name -> solana.storage.ConfirmedBlock.BlockHeight + 0, // 38: geyser.GetLatestBlockhashRequest.commitment:type_name -> geyser.CommitmentLevel + 0, // 39: geyser.GetBlockHeightRequest.commitment:type_name -> geyser.CommitmentLevel + 0, // 40: geyser.GetSlotRequest.commitment:type_name -> geyser.CommitmentLevel + 0, // 41: geyser.IsBlockhashValidRequest.commitment:type_name -> geyser.CommitmentLevel + 2, // 42: geyser.SubscribeRequest.AccountsEntry.value:type_name -> geyser.SubscribeRequestFilterAccounts + 6, // 43: geyser.SubscribeRequest.SlotsEntry.value:type_name -> geyser.SubscribeRequestFilterSlots + 7, // 44: geyser.SubscribeRequest.TransactionsEntry.value:type_name -> geyser.SubscribeRequestFilterTransactions + 7, // 45: geyser.SubscribeRequest.TransactionsStatusEntry.value:type_name -> geyser.SubscribeRequestFilterTransactions + 8, // 46: geyser.SubscribeRequest.BlocksEntry.value:type_name -> geyser.SubscribeRequestFilterBlocks + 9, // 47: geyser.SubscribeRequest.BlocksMetaEntry.value:type_name -> geyser.SubscribeRequestFilterBlocksMeta + 10, // 48: geyser.SubscribeRequest.EntryEntry.value:type_name -> geyser.SubscribeRequestFilterEntry + 1, // 49: geyser.Geyser.Subscribe:input_type -> geyser.SubscribeRequest + 25, // 50: geyser.Geyser.Ping:input_type -> geyser.PingRequest + 27, // 51: geyser.Geyser.GetLatestBlockhash:input_type -> geyser.GetLatestBlockhashRequest + 29, // 52: geyser.Geyser.GetBlockHeight:input_type -> geyser.GetBlockHeightRequest + 31, // 53: geyser.Geyser.GetSlot:input_type -> geyser.GetSlotRequest + 35, // 54: geyser.Geyser.IsBlockhashValid:input_type -> geyser.IsBlockhashValidRequest + 33, // 55: geyser.Geyser.GetVersion:input_type -> geyser.GetVersionRequest + 13, // 56: geyser.Geyser.Subscribe:output_type -> geyser.SubscribeUpdate + 26, // 57: geyser.Geyser.Ping:output_type -> geyser.PongResponse + 28, // 58: geyser.Geyser.GetLatestBlockhash:output_type -> geyser.GetLatestBlockhashResponse + 30, // 59: geyser.Geyser.GetBlockHeight:output_type -> geyser.GetBlockHeightResponse + 32, // 60: geyser.Geyser.GetSlot:output_type -> geyser.GetSlotResponse + 36, // 61: geyser.Geyser.IsBlockhashValid:output_type -> geyser.IsBlockhashValidResponse + 34, // 62: geyser.Geyser.GetVersion:output_type -> geyser.GetVersionResponse + 56, // [56:63] is the sub-list for method output_type + 49, // [49:56] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_geyser_proto_init() } diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index 6921c0ca..4847d911 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -1,12 +1,12 @@ { "name": "yellowstone-grpc-client-example-ts", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "yellowstone-grpc-client-example-ts", - "version": "1.0.0", + "version": "2.0.0", "license": "Apache-2.0", "dependencies": { "@triton-one/yellowstone-grpc": "file:../../yellowstone-grpc-client-nodejs", @@ -19,7 +19,7 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.2", + "version": "1.4.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/examples/typescript/package.json b/examples/typescript/package.json index 53252f82..61b4219b 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -1,6 +1,6 @@ { "name": "yellowstone-grpc-client-example-ts", - "version": "1.0.0", + "version": "2.0.0", "license": "Apache-2.0", "author": "Triton One", "main": "dist/client.js", diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index bb0a13b5..2a680d8a 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.2", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.3.2", + "version": "1.4.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index 1149575e..57697c62 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,7 +1,7 @@ { "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.3.2", + "version": "1.4.0", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", From 1b98d7cf818922ad1dc4dd85aca9a29fe1ffe2f8 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Fri, 13 Dec 2024 16:06:30 -0500 Subject: [PATCH 13/20] geyser: add gRPC server options to config (#493) --- CHANGELOG.md | 1 + deny.toml | 4 ++++ yellowstone-grpc-geyser/config.json | 5 +++++ yellowstone-grpc-geyser/src/config.rs | 10 ++++++++++ yellowstone-grpc-geyser/src/grpc.rs | 17 ++++++++++++++++- 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f005815..dee78913 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ The minor version will be incremented upon a breaking change and the patch versi - proto: add `from_slot` ([#477](https://github.com/rpcpool/yellowstone-grpc/pull/477)) - proto: add field `created_at` to update message ([#479](https://github.com/rpcpool/yellowstone-grpc/pull/479)) - nodejs: add parse err function ([#483](https://github.com/rpcpool/yellowstone-grpc/pull/483)) +- geyser: add gRPC server options to config ([#493](https://github.com/rpcpool/yellowstone-grpc/pull/493)) ## 2024-12-01 diff --git a/deny.toml b/deny.toml index 0ec726b7..bbee2ee6 100644 --- a/deny.toml +++ b/deny.toml @@ -22,4 +22,8 @@ ignore = [ # derivative 2.2.0 # Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0388 "RUSTSEC-2024-0388", + + # curve25519-dalek 3.2.1 + # Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0344 + "RUSTSEC-2024-0344", ] diff --git a/yellowstone-grpc-geyser/config.json b/yellowstone-grpc-geyser/config.json index 7c7373c2..71cfa6fc 100644 --- a/yellowstone-grpc-geyser/config.json +++ b/yellowstone-grpc-geyser/config.json @@ -17,6 +17,11 @@ "accept": ["gzip", "zstd"], "send": ["gzip", "zstd"] }, + "server_http2_adaptive_window": null, + "server_http2_keepalive_interval": null, + "server_http2_keepalive_timeout": null, + "server_initial_connection_window_size": null, + "server_initial_stream_window_size": null, "max_decoding_message_size": "4_194_304", "snapshot_plugin_channel_capacity": null, "snapshot_client_channel_capacity": "50_000_000", diff --git a/yellowstone-grpc-geyser/src/config.rs b/yellowstone-grpc-geyser/src/config.rs index 0c42f7e3..c2faf724 100644 --- a/yellowstone-grpc-geyser/src/config.rs +++ b/yellowstone-grpc-geyser/src/config.rs @@ -192,6 +192,16 @@ pub struct ConfigGrpc { /// Number of slots stored for re-broadcast (replay) #[serde(default = "ConfigGrpc::default_replay_stored_slots")] pub replay_stored_slots: u64, + #[serde(default)] + pub server_http2_adaptive_window: Option, + #[serde(with = "humantime_serde")] + pub server_http2_keepalive_interval: Option, + #[serde(with = "humantime_serde")] + pub server_http2_keepalive_timeout: Option, + #[serde(default)] + pub server_initial_connection_window_size: Option, + #[serde(default)] + pub server_initial_stream_window_size: Option, } impl ConfigGrpc { diff --git a/yellowstone-grpc-geyser/src/grpc.rs b/yellowstone-grpc-geyser/src/grpc.rs index e8e8938d..fde7d139 100644 --- a/yellowstone-grpc-geyser/src/grpc.rs +++ b/yellowstone-grpc-geyser/src/grpc.rs @@ -392,6 +392,22 @@ impl GrpcService { .tls_config(ServerTlsConfig::new().identity(Identity::from_pem(cert, key))) .context("failed to apply tls_config")?; } + if let Some(enabled) = config.server_http2_adaptive_window { + server_builder = server_builder.http2_adaptive_window(Some(enabled)); + } + if let Some(http2_keepalive_interval) = config.server_http2_keepalive_interval { + server_builder = + server_builder.http2_keepalive_interval(Some(http2_keepalive_interval)); + } + if let Some(http2_keepalive_timeout) = config.server_http2_keepalive_timeout { + server_builder = server_builder.http2_keepalive_timeout(Some(http2_keepalive_timeout)); + } + if let Some(sz) = config.server_initial_connection_window_size { + server_builder = server_builder.initial_connection_window_size(sz); + } + if let Some(sz) = config.server_initial_stream_window_size { + server_builder = server_builder.initial_stream_window_size(sz); + } let filter_names = Arc::new(Mutex::new(FilterNames::new( config.filter_name_size_limit, @@ -456,7 +472,6 @@ impl GrpcService { health_reporter.set_serving::>().await; server_builder - .http2_keepalive_interval(Some(Duration::from_secs(5))) .layer(interceptor(move |request: Request<()>| { if let Some(x_token) = &config.x_token { match request.metadata().get("x-token") { From 693a10fb72681bd6b6f252812ae8173016e37e4e Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sun, 15 Dec 2024 12:09:18 -0500 Subject: [PATCH 14/20] geyser: fix `replay_stored_slots` (#496) --- CHANGELOG.md | 8 ++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- yellowstone-grpc-geyser/Cargo.toml | 2 +- yellowstone-grpc-geyser/config.json | 2 +- yellowstone-grpc-geyser/src/config.rs | 4 ++-- yellowstone-grpc-geyser/src/grpc.rs | 24 +++++++++++++----------- 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dee78913..0483f285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,14 @@ The minor version will be incremented upon a breaking change and the patch versi ### Breaking +## 2024-12-15 + +- yellowstone-grpc-geyser-3.2.1 + +### Fixes + +- geyser: fix `replay_stored_slots` ([#496](https://github.com/rpcpool/yellowstone-grpc/pull/496)) + ## 2024-12-13 - yellowstone-grpc-client-simple-3.2.0 diff --git a/Cargo.lock b/Cargo.lock index 664564b4..b1b2f9b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-geyser" -version = "3.2.0" +version = "3.2.1" dependencies = [ "affinity", "agave-geyser-plugin-interface", diff --git a/Cargo.toml b/Cargo.toml index 57cac968..7db44c01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = [ "examples/rust", # 3.2.0 "yellowstone-grpc-client", # 3.1.0 - "yellowstone-grpc-geyser", # 3.2.0 + "yellowstone-grpc-geyser", # 3.2.1 "yellowstone-grpc-proto", # 3.1.0 ] exclude = [ diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index 05cbf15c..67927723 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-geyser" -version = "3.2.0" +version = "3.2.1" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Plugin" diff --git a/yellowstone-grpc-geyser/config.json b/yellowstone-grpc-geyser/config.json index 71cfa6fc..04a0569f 100644 --- a/yellowstone-grpc-geyser/config.json +++ b/yellowstone-grpc-geyser/config.json @@ -1,5 +1,5 @@ { - "libpath": "../target/debug/libyellowstone_grpc_geyser.so", + "libpath": "../target/release/libyellowstone_grpc_geyser.so", "log": { "level": "info" }, diff --git a/yellowstone-grpc-geyser/src/config.rs b/yellowstone-grpc-geyser/src/config.rs index c2faf724..0b5e9344 100644 --- a/yellowstone-grpc-geyser/src/config.rs +++ b/yellowstone-grpc-geyser/src/config.rs @@ -194,9 +194,9 @@ pub struct ConfigGrpc { pub replay_stored_slots: u64, #[serde(default)] pub server_http2_adaptive_window: Option, - #[serde(with = "humantime_serde")] + #[serde(default, with = "humantime_serde")] pub server_http2_keepalive_interval: Option, - #[serde(with = "humantime_serde")] + #[serde(default, with = "humantime_serde")] pub server_http2_keepalive_timeout: Option, #[serde(default)] pub server_initial_connection_window_size: Option, diff --git a/yellowstone-grpc-geyser/src/grpc.rs b/yellowstone-grpc-geyser/src/grpc.rs index fde7d139..914de4cd 100644 --- a/yellowstone-grpc-geyser/src/grpc.rs +++ b/yellowstone-grpc-geyser/src/grpc.rs @@ -327,7 +327,7 @@ pub struct GrpcService { subscribe_id: AtomicUsize, snapshot_rx: Mutex>>>, broadcast_tx: broadcast::Sender, - replay_stored_slots_tx: mpsc::Sender, + replay_stored_slots_tx: Option>, debug_clients_tx: Option>, filter_names: Arc>, } @@ -373,12 +373,12 @@ impl GrpcService { // Messages to clients combined by commitment let (broadcast_tx, _) = broadcast::channel(config.channel_capacity); // attempt to prevent spam of geyser loop with capacity eq 1 - let (replay_stored_slots_tx, replay_stored_slots_rx) = - mpsc::channel(if config.replay_stored_slots == 0 { - 0 - } else { - 1 - }); + let (replay_stored_slots_tx, replay_stored_slots_rx) = if config.replay_stored_slots == 0 { + (None, None) + } else { + let (tx, rx) = mpsc::channel(1); + (Some(tx), Some(rx)) + }; // gRPC server builder with optional TLS let mut server_builder = Server::builder(); @@ -495,7 +495,7 @@ impl GrpcService { mut messages_rx: mpsc::UnboundedReceiver, blocks_meta_tx: Option>, broadcast_tx: broadcast::Sender, - mut replay_stored_slots_rx: mpsc::Receiver, + replay_stored_slots_rx: Option>, replay_stored_slots: u64, ) { const PROCESSED_MESSAGES_MAX: usize = 31; @@ -507,6 +507,8 @@ impl GrpcService { let mut processed_first_slot = None; let processed_sleep = sleep(PROCESSED_MESSAGES_SLEEP); tokio::pin!(processed_sleep); + let (_tx, rx) = mpsc::channel(1); + let mut replay_stored_slots_rx = replay_stored_slots_rx.unwrap_or(rx); loop { tokio::select! { @@ -825,7 +827,7 @@ impl GrpcService { mut client_rx: mpsc::UnboundedReceiver, Filter)>>, mut snapshot_rx: Option>>, mut messages_rx: broadcast::Receiver, - replay_stored_slots_tx: mpsc::Sender, + replay_stored_slots_tx: Option>, debug_client_tx: Option>, drop_client: impl FnOnce(), ) { @@ -887,13 +889,13 @@ impl GrpcService { info!("client #{id}: filter updated"); if let Some(from_slot) = from_slot { - if replay_stored_slots_tx.max_capacity() == 0 { + let Some(replay_stored_slots_tx) = &replay_stored_slots_tx else { info!("client #{id}: from_slot is not supported"); tokio::spawn(async move { let _ = stream_tx.send(Err(Status::internal("from_slot is not supported"))).await; }); break 'outer; - } + }; let (tx, rx) = oneshot::channel(); let commitment = filter.get_commitment_level(); From d06e1d06bd77bd739568c9e6cff61ef46151ae28 Mon Sep 17 00:00:00 2001 From: Caio Date: Mon, 16 Dec 2024 18:09:28 -0300 Subject: [PATCH 15/20] client: add `ca_certificate` option (#497) Co-authored-by: Kirill Fomichev --- CHANGELOG.md | 2 ++ examples/rust/src/bin/client.rs | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0483f285..1f187129 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ The minor version will be incremented upon a breaking change and the patch versi ### Features +- client: add `ca_certificate` option ([#497](https://github.com/rpcpool/yellowstone-grpc/pull/497)) + ### Breaking ## 2024-12-15 diff --git a/examples/rust/src/bin/client.rs b/examples/rust/src/bin/client.rs index 9cfc7b3f..66cad670 100644 --- a/examples/rust/src/bin/client.rs +++ b/examples/rust/src/bin/client.rs @@ -12,11 +12,12 @@ use { collections::HashMap, env, fs::File, + path::PathBuf, sync::Arc, time::{Duration, Instant, SystemTime, UNIX_EPOCH}, }, tokio::{fs, sync::Mutex}, - tonic::transport::channel::ClientTlsConfig, + tonic::transport::{channel::ClientTlsConfig, Certificate}, yellowstone_grpc_client::{GeyserGrpcClient, GeyserGrpcClientError, Interceptor}, yellowstone_grpc_proto::{ convert_from, @@ -52,6 +53,10 @@ struct Args { /// Service endpoint endpoint: String, + /// Path of a certificate authority file + #[clap(long)] + ca_certificate: Option, + #[clap(long)] x_token: Option, @@ -117,9 +122,14 @@ impl Args { } async fn connect(&self) -> anyhow::Result> { + let mut tls_config = ClientTlsConfig::new().with_native_roots(); + if let Some(path) = &self.ca_certificate { + let bytes = fs::read(path).await?; + tls_config = tls_config.ca_certificate(Certificate::from_pem(bytes)); + } let mut builder = GeyserGrpcClient::build_from_shared(self.endpoint.clone())? .x_token(self.x_token.clone())? - .tls_config(ClientTlsConfig::new().with_native_roots())? + .tls_config(tls_config)? .max_decoding_message_size(self.max_decoding_message_size); if let Some(duration) = self.connect_timeout_ms { From b838efc303e73227e98fb50f11f81cea15f3ab49 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Mon, 16 Dec 2024 16:59:41 -0500 Subject: [PATCH 16/20] geyser: fix `lamports` filter (#498) --- CHANGELOG.md | 16 ++++++++++++++-- Cargo.lock | 6 +++--- Cargo.toml | 8 ++++---- examples/rust/Cargo.toml | 2 +- .../solana-encoding-wasm/Cargo.lock | 2 +- .../solana-encoding-wasm/Cargo.toml | 2 +- yellowstone-grpc-geyser/Cargo.toml | 2 +- yellowstone-grpc-proto/Cargo.toml | 2 +- .../src/plugin/filter/filter.rs | 4 ++-- 9 files changed, 28 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f187129..ae91721b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,10 +14,22 @@ The minor version will be incremented upon a breaking change and the patch versi ### Features -- client: add `ca_certificate` option ([#497](https://github.com/rpcpool/yellowstone-grpc/pull/497)) - ### Breaking +## 2024-12-16 + +- yellowstone-grpc-client-simple-3.3.0 +- yellowstone-grpc-geyser-3.2.2 +- yellowstone-grpc-proto-3.1.1 + +### Fixes + +- geyser: fix `lamports` filter ([#498](https://github.com/rpcpool/yellowstone-grpc/pull/498)) + +### Features + +- example: add `ca_certificate` option ([#497](https://github.com/rpcpool/yellowstone-grpc/pull/497)) + ## 2024-12-15 - yellowstone-grpc-geyser-3.2.1 diff --git a/Cargo.lock b/Cargo.lock index b1b2f9b7..32379caa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5027,7 +5027,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-client-simple" -version = "3.2.0" +version = "3.3.0" dependencies = [ "anyhow", "backoff", @@ -5052,7 +5052,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-geyser" -version = "3.2.1" +version = "3.2.2" dependencies = [ "affinity", "agave-geyser-plugin-interface", @@ -5092,7 +5092,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-proto" -version = "3.1.0" +version = "3.1.1" dependencies = [ "agave-geyser-plugin-interface", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 7db44c01..d0cd0ba3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,10 @@ [workspace] resolver = "2" members = [ - "examples/rust", # 3.2.0 + "examples/rust", # 3.3.0 "yellowstone-grpc-client", # 3.1.0 - "yellowstone-grpc-geyser", # 3.2.1 - "yellowstone-grpc-proto", # 3.1.0 + "yellowstone-grpc-geyser", # 3.2.2 + "yellowstone-grpc-proto", # 3.1.1 ] exclude = [ "yellowstone-grpc-client-nodejs/solana-encoding-wasm", # 3.0.0 @@ -70,7 +70,7 @@ tonic-build = "0.12.1" tonic-health = "0.12.1" vergen = "9.0.0" yellowstone-grpc-client = { path = "yellowstone-grpc-client", version = "3.1.0" } -yellowstone-grpc-proto = { path = "yellowstone-grpc-proto", version = "3.1.0", default-features = false } +yellowstone-grpc-proto = { path = "yellowstone-grpc-proto", version = "3.1.1", default-features = false } [workspace.lints.clippy] clone_on_ref_ptr = "deny" diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index 4767bd59..c62431d8 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-client-simple" -version = "3.2.0" +version = "3.3.0" authors = { workspace = true } edition = { workspace = true } homepage = { workspace = true } diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock index 793908f5..99b9aae7 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.lock @@ -2655,7 +2655,7 @@ dependencies = [ [[package]] name = "yellowstone-grpc-proto" -version = "3.1.0" +version = "3.1.1" dependencies = [ "anyhow", "bincode", diff --git a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml index 2ba46d6f..7b00c491 100644 --- a/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml +++ b/yellowstone-grpc-client-nodejs/solana-encoding-wasm/Cargo.toml @@ -16,7 +16,7 @@ crate-type = ["cdylib"] serde_json = "1.0.86" solana-transaction-status = "~2.0.16" wasm-bindgen = "0.2.95" -yellowstone-grpc-proto = { path = "../../yellowstone-grpc-proto", version = "3.1.0", default-features = false, features = ["convert"] } +yellowstone-grpc-proto = { path = "../../yellowstone-grpc-proto", version = "3.1.1", default-features = false, features = ["convert"] } [workspace.lints.clippy] clone_on_ref_ptr = "deny" diff --git a/yellowstone-grpc-geyser/Cargo.toml b/yellowstone-grpc-geyser/Cargo.toml index 67927723..bd47636b 100644 --- a/yellowstone-grpc-geyser/Cargo.toml +++ b/yellowstone-grpc-geyser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-geyser" -version = "3.2.1" +version = "3.2.2" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Plugin" diff --git a/yellowstone-grpc-proto/Cargo.toml b/yellowstone-grpc-proto/Cargo.toml index 161477a8..79335293 100644 --- a/yellowstone-grpc-proto/Cargo.toml +++ b/yellowstone-grpc-proto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-proto" -version = "3.1.0" +version = "3.1.1" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Protobuf Definitions" diff --git a/yellowstone-grpc-proto/src/plugin/filter/filter.rs b/yellowstone-grpc-proto/src/plugin/filter/filter.rs index c8edff22..7ff61847 100644 --- a/yellowstone-grpc-proto/src/plugin/filter/filter.rs +++ b/yellowstone-grpc-proto/src/plugin/filter/filter.rs @@ -484,8 +484,8 @@ impl FilterAccountsLamports { match self { Self::Eq(value) => value == lamports, Self::Ne(value) => value != lamports, - Self::Lt(value) => value < lamports, - Self::Gt(value) => value > lamports, + Self::Lt(value) => value > lamports, + Self::Gt(value) => value < lamports, } } } From cd9a27e4abefe0ef3e0950b2af68bc3391e4b99a Mon Sep 17 00:00:00 2001 From: JIscariot Date: Thu, 19 Dec 2024 19:34:39 +0300 Subject: [PATCH 17/20] nodejs: fix port for http (#502) Co-authored-by: Kirill Fomichev --- CHANGELOG.md | 2 ++ examples/typescript/package-lock.json | 6 +++--- examples/typescript/package.json | 2 +- yellowstone-grpc-client-nodejs/package-lock.json | 4 ++-- yellowstone-grpc-client-nodejs/package.json | 2 +- yellowstone-grpc-client-nodejs/src/index.ts | 2 ++ 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae91721b..8c9302e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ The minor version will be incremented upon a breaking change and the patch versi ### Fixes +- nodejs: fix port for https ([#502](https://github.com/rpcpool/yellowstone-grpc/pull/502)) + ### Features ### Breaking diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index 4847d911..27d20894 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -1,12 +1,12 @@ { "name": "yellowstone-grpc-client-example-ts", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "yellowstone-grpc-client-example-ts", - "version": "2.0.0", + "version": "2.0.1", "license": "Apache-2.0", "dependencies": { "@triton-one/yellowstone-grpc": "file:../../yellowstone-grpc-client-nodejs", @@ -19,7 +19,7 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.4.0", + "version": "1.4.1", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/examples/typescript/package.json b/examples/typescript/package.json index 61b4219b..128c4e94 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -1,6 +1,6 @@ { "name": "yellowstone-grpc-client-example-ts", - "version": "2.0.0", + "version": "2.0.1", "license": "Apache-2.0", "author": "Triton One", "main": "dist/client.js", diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index 2a680d8a..cd7ca5fe 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.4.0", + "version": "1.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.4.0", + "version": "1.4.1", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index 57697c62..7bf8d640 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,7 +1,7 @@ { "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.4.0", + "version": "1.4.1", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", diff --git a/yellowstone-grpc-client-nodejs/src/index.ts b/yellowstone-grpc-client-nodejs/src/index.ts index 97513da3..47e1b71c 100644 --- a/yellowstone-grpc-client-nodejs/src/index.ts +++ b/yellowstone-grpc-client-nodejs/src/index.ts @@ -106,8 +106,10 @@ export default class Client { switch (endpointURL.protocol) { case "https:": port = "443"; + break; case "http:": port = "80"; + break; } } From 81138fff4ac5a0abcfa76ccd0bf1e57da32d28de Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Fri, 27 Dec 2024 18:31:48 +0300 Subject: [PATCH 18/20] docs: fix typos (#504) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5985b8d7..07e42de8 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Please check [yellowstone-grpc-proto/proto/geyser.proto](yellowstone-grpc-proto/ - `commitment` — commitment level: `processed` / `confirmed` / `finalized` - `accounts_data_slice` — array of objects `{ offset: uint64, length: uint64 }`, allow to receive only required data from accounts - - `ping` — optional boolean field. Some cloud providers (like Cloudflare, Fly.io) close the stream if client doesn't send anything during some time. As workaroud you can send same filter every N seconds, but this would be not optimal since you need to keep this filter. Instead, you can send subscribe request with `ping` field set to `true` and ignore rest of the fields in the request. Since we sent `Ping` message every 15s from the server, you can send subscribe request with `ping` as reply and receive `Pong` message. + - `ping` — optional boolean field. Some cloud providers (like Cloudflare, Fly.io) close the stream if client doesn't send anything during some time. As workaround you can send same filter every N seconds, but this would be not optimal since you need to keep this filter. Instead, you can send subscribe request with `ping` field set to `true` and ignore rest of the fields in the request. Since we sent `Ping` message every 15s from the server, you can send subscribe request with `ping` as reply and receive `Pong` message. #### Slots @@ -42,11 +42,11 @@ Please check [yellowstone-grpc-proto/proto/geyser.proto](yellowstone-grpc-proto/ Accounts can be filtered by: - - `account` — acount Pubkey, match to any Pubkey from the array + - `account` — account Pubkey, match to any Pubkey from the array - `owner` — account owner Pubkey, match to any Pubkey from the array - `filters` — same as `getProgramAccounts` filters, array of `dataSize` or `Memcmp` (bytes, base58, base64 are supported) -If all fields are empty then all accounts are broadcasted. Otherwise fields works as logical `AND` and values in arrays as logical `OR` (except values in `filters` that works as logical `AND`). +If all fields are empty then all accounts are broadcasted. Otherwise fields work as logical `AND` and values in arrays as logical `OR` (except values in `filters` that works as logical `AND`). #### Transactions @@ -76,7 +76,7 @@ Same as `Blocks` but without `transactions`, `accounts` and entries. Currently w ### Limit filters -It's possible to add limits for filters in the config. If `filters` field is omitted then filters doesn't have any limits. +It's possible to add limits for filters in the config. If `filters` field is omitted then filters don't have any limits. ```json "grpc": { From d3c53595914e3b5521f0dde5a6a041335b41dd60 Mon Sep 17 00:00:00 2001 From: solpkr1 <124735842+solpkr1@users.noreply.github.com> Date: Tue, 7 Jan 2025 19:03:24 +0000 Subject: [PATCH 19/20] nodejs: support ESM environment (#509) Co-authored-by: Kirill Fomichev --- CHANGELOG.md | 14 +- examples/typescript/package-lock.json | 4 +- examples/typescript/tsconfig.json | 3 +- .../add-js-extensions.js | 98 +++++++++++++ .../package-lock.json | 130 +++++++++++++++++- yellowstone-grpc-client-nodejs/package.json | 21 ++- yellowstone-grpc-client-nodejs/src/index.ts | 2 +- .../tsconfig.cjs.json | 16 +++ .../tsconfig.esm.json | 15 ++ yellowstone-grpc-client-nodejs/tsconfig.json | 1 + 10 files changed, 288 insertions(+), 16 deletions(-) create mode 100644 yellowstone-grpc-client-nodejs/add-js-extensions.js create mode 100644 yellowstone-grpc-client-nodejs/tsconfig.cjs.json create mode 100644 yellowstone-grpc-client-nodejs/tsconfig.esm.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c9302e2..6c5ab4a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,22 @@ The minor version will be incremented upon a breaking change and the patch versi ### Fixes -- nodejs: fix port for https ([#502](https://github.com/rpcpool/yellowstone-grpc/pull/502)) - ### Features ### Breaking +## 2025-01-07 + +- @triton-one/yellowstone-grpc@2.0.0 + +### Fixes + +- nodejs: fix port for https ([#502](https://github.com/rpcpool/yellowstone-grpc/pull/502)) + +### Breaking + +- nodejs: support ESM environment ([#509](https://github.com/rpcpool/yellowstone-grpc/pull/509)) + ## 2024-12-16 - yellowstone-grpc-client-simple-3.3.0 diff --git a/examples/typescript/package-lock.json b/examples/typescript/package-lock.json index 27d20894..0bb08324 100644 --- a/examples/typescript/package-lock.json +++ b/examples/typescript/package-lock.json @@ -19,14 +19,16 @@ }, "../../yellowstone-grpc-client-nodejs": { "name": "@triton-one/yellowstone-grpc", - "version": "1.4.1", + "version": "2.0.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" }, "devDependencies": { + "@babel/parser": "^7.26.3", "@solana/rpc-api": "=2.0.0", "prettier": "^2.8.3", + "recast": "^0.23.9", "ts-proto": "^1.139.0", "typescript": "=5.2.2" }, diff --git a/examples/typescript/tsconfig.json b/examples/typescript/tsconfig.json index a5fc9aa3..b7252355 100644 --- a/examples/typescript/tsconfig.json +++ b/examples/typescript/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "outDir": "dist", "rootDir": "src", - "moduleResolution": "node" + "moduleResolution": "node", + "esModuleInterop": true } } diff --git a/yellowstone-grpc-client-nodejs/add-js-extensions.js b/yellowstone-grpc-client-nodejs/add-js-extensions.js new file mode 100644 index 00000000..9aa0b8c7 --- /dev/null +++ b/yellowstone-grpc-client-nodejs/add-js-extensions.js @@ -0,0 +1,98 @@ +const fs = require('fs'); +const path = require('path'); +const recast = require('recast'); + +//list of external packages that require '.js' extensions +const packagesRequiringJsExtension = [ + 'protobufjs/minimal', + //add other package paths as needed +]; + +function shouldAppendJsExtension(source) { + //check if the path has an extension already + if (path.extname(source)) { + return false; + } + + //check if the path is relative + if (source.startsWith('./') || source.startsWith('../')) { + return true; + } + + //check if the path is in the whitelist of external packages + return packagesRequiringJsExtension.some(pkg => source === pkg || source.startsWith(`${pkg}/`)); +} + + +function processFile(filePath) { + const code = fs.readFileSync(filePath, 'utf8'); + const ast = recast.parse(code, { + parser: require('recast/parsers/babel'), // Use Babel parser + }); + + let modified = false; + + recast.types.visit(ast, { + visitImportDeclaration(pathNode) { + const source = pathNode.node.source.value; + if (shouldAppendJsExtension(source)) { + pathNode.node.source.value = `${source}.js`; + modified = true; + } + this.traverse(pathNode); + }, + visitExportNamedDeclaration(pathNode) { + if (pathNode.node.source && pathNode.node.source.value) { + const source = pathNode.node.source.value; + if (shouldAppendJsExtension(source)) { + pathNode.node.source.value = `${source}.js`; + modified = true; + } + } + this.traverse(pathNode); + }, + visitExportAllDeclaration(pathNode) { + if (pathNode.node.source && pathNode.node.source.value) { + const source = pathNode.node.source.value; + if (shouldAppendJsExtension(source)) { + pathNode.node.source.value = `${source}.js`; + modified = true; + } + } + this.traverse(pathNode); + }, + }); + + if (modified) { + const output = recast.print(ast).code; + fs.writeFileSync(filePath, output, 'utf8'); + console.log(`Updated import/export paths in: ${filePath}`); + } +} + + +function traverseDir(dir) { + fs.readdirSync(dir).forEach((file) => { + const fullPath = path.join(dir, file); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + traverseDir(fullPath); + } else if (stat.isFile() && path.extname(fullPath) === '.js') { + processFile(fullPath); + } + }); +} + +function main() { + const esmDir = path.resolve(__dirname, './dist/esm'); + + if (!fs.existsSync(esmDir)) { + console.error(`Directory not found: ${esmDir}`); + process.exit(1); + } + + traverseDir(esmDir); +} + +main(); diff --git a/yellowstone-grpc-client-nodejs/package-lock.json b/yellowstone-grpc-client-nodejs/package-lock.json index cd7ca5fe..47e3df02 100644 --- a/yellowstone-grpc-client-nodejs/package-lock.json +++ b/yellowstone-grpc-client-nodejs/package-lock.json @@ -1,19 +1,21 @@ { "name": "@triton-one/yellowstone-grpc", - "version": "1.4.1", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@triton-one/yellowstone-grpc", - "version": "1.4.1", + "version": "2.0.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.8.0" }, "devDependencies": { + "@babel/parser": "^7.26.3", "@solana/rpc-api": "=2.0.0", "prettier": "^2.8.3", + "recast": "^0.23.9", "ts-proto": "^1.139.0", "typescript": "=5.2.2" }, @@ -21,6 +23,56 @@ "node": ">=20.18.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.3.tgz", @@ -493,6 +545,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/case-anything": { "version": "2.1.13", "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", @@ -594,14 +659,28 @@ "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", @@ -694,6 +773,23 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", "license": "Apache-2.0" }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -703,6 +799,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -729,6 +835,13 @@ "node": ">=8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, "node_modules/ts-poet": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz", @@ -820,6 +933,13 @@ "pbts": "bin/pbts" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", diff --git a/yellowstone-grpc-client-nodejs/package.json b/yellowstone-grpc-client-nodejs/package.json index 7bf8d640..1dfd2850 100644 --- a/yellowstone-grpc-client-nodejs/package.json +++ b/yellowstone-grpc-client-nodejs/package.json @@ -1,16 +1,17 @@ { "publish": false, "name": "@triton-one/yellowstone-grpc", - "version": "1.4.1", + "version": "2.0.0", "license": "Apache-2.0", "author": "Triton One", "description": "Yellowstone gRPC Geyser Node.js Client", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/cjs/index.js", + "types": "dist/types/index.d.ts", "scripts": { - "build": "npm run grpc-generate && tsc -p .", + "build": "npm run grpc-generate && tsc --project tsconfig.esm.json && tsc --project tsconfig.cjs.json && npm run cp-encoding-files && node add-js-extensions.js", + "cp-encoding-files": "mkdir -p dist/esm/encoding && cp -r src/encoding/* dist/cjs/encoding/ && mkdir -p dist/esm/encoding && cp -r src/encoding/* dist/esm/encoding/ && mkdir -p dist/types/encoding && cp -r src/encoding/* dist/types/encoding/", "fmt": "prettier -w .", - "grpc-generate": "mkdir -p src/grpc && protoc -I../yellowstone-grpc-proto/proto --plugin=node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=forceLong=string --ts_proto_opt=outputServices=grpc-js --experimental_allow_proto3_optional --ts_proto_out=src/grpc geyser.proto" + "grpc-generate": "mkdir -p src/grpc && protoc -I../yellowstone-grpc-proto/proto --plugin=node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=forceLong=string --ts_proto_opt=outputServices=grpc-js --experimental_allow_proto3_optional --ts_proto_out=src/grpc geyser.proto --ts_proto_opt=esModuleInterop=true" }, "repository": { "type": "git", @@ -30,8 +31,10 @@ "@grpc/grpc-js": "^1.8.0" }, "devDependencies": { + "@babel/parser": "^7.26.3", "@solana/rpc-api": "=2.0.0", "prettier": "^2.8.3", + "recast": "^0.23.9", "ts-proto": "^1.139.0", "typescript": "=5.2.2" }, @@ -40,5 +43,11 @@ }, "files": [ "dist" - ] + ], + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + } + } } diff --git a/yellowstone-grpc-client-nodejs/src/index.ts b/yellowstone-grpc-client-nodejs/src/index.ts index 47e1b71c..f225886f 100644 --- a/yellowstone-grpc-client-nodejs/src/index.ts +++ b/yellowstone-grpc-client-nodejs/src/index.ts @@ -177,7 +177,7 @@ export default class Client { commitment, accountsDataSlice, }, - (err) => { + (err: any) => { if (err === null || err === undefined) { resolve(); } else { diff --git a/yellowstone-grpc-client-nodejs/tsconfig.cjs.json b/yellowstone-grpc-client-nodejs/tsconfig.cjs.json new file mode 100644 index 00000000..13cd8ec4 --- /dev/null +++ b/yellowstone-grpc-client-nodejs/tsconfig.cjs.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "CommonJS", + "esModuleInterop": true, + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "allowJs": true, + "outDir": "dist/cjs", + "moduleResolution": "Node" + }, + "files": ["src/index.ts"], + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.test.js"] +} diff --git a/yellowstone-grpc-client-nodejs/tsconfig.esm.json b/yellowstone-grpc-client-nodejs/tsconfig.esm.json new file mode 100644 index 00000000..7094a982 --- /dev/null +++ b/yellowstone-grpc-client-nodejs/tsconfig.esm.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ES2022", + "moduleResolution": "Node", + "esModuleInterop": true, + "outDir": "dist/esm", + "declaration": true, + "declarationDir": "dist/types" + }, + "files": ["src/index.ts"], + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.test.js"] +} + diff --git a/yellowstone-grpc-client-nodejs/tsconfig.json b/yellowstone-grpc-client-nodejs/tsconfig.json index b51ff906..26ba6c44 100644 --- a/yellowstone-grpc-client-nodejs/tsconfig.json +++ b/yellowstone-grpc-client-nodejs/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "esModuleInterop": true, "outDir": "dist", "rootDir": "src", "declaration": true From f725cdd9cf59cda8a9699227e2a301ef710d390a Mon Sep 17 00:00:00 2001 From: pmantica11 <151664502+pmantica11@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:22:47 -0600 Subject: [PATCH 20/20] client: re-export `ClientTlsConfig` (#512) --- CHANGELOG.md | 16 ++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- yellowstone-grpc-client/Cargo.toml | 2 +- yellowstone-grpc-client/src/lib.rs | 4 ++-- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c5ab4a9..bd362127 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,22 @@ The minor version will be incremented upon a breaking change and the patch versi ### Breaking +## 2025-01-13 + +- yellowstone-grpc-client-3.1.1 + +### Fixes + +- client: re-export `ClientTlsConfig` ([#512](https://github.com/rpcpool/yellowstone-grpc/pull/512)) + +## 2025-01-13 + +- yellowstone-grpc-client-4.1.1 + +### Fixes + +- client: re-export `ClientTlsConfig` ([#512](https://github.com/rpcpool/yellowstone-grpc/pull/512)) + ## 2025-01-07 - @triton-one/yellowstone-grpc@2.0.0 diff --git a/Cargo.lock b/Cargo.lock index 32379caa..8332829b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5014,7 +5014,7 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yellowstone-grpc-client" -version = "3.1.0" +version = "3.1.1" dependencies = [ "bytes", "futures", diff --git a/Cargo.toml b/Cargo.toml index d0cd0ba3..0491aab9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ resolver = "2" members = [ "examples/rust", # 3.3.0 - "yellowstone-grpc-client", # 3.1.0 + "yellowstone-grpc-client", # 3.1.1 "yellowstone-grpc-geyser", # 3.2.2 "yellowstone-grpc-proto", # 3.1.1 ] diff --git a/yellowstone-grpc-client/Cargo.toml b/yellowstone-grpc-client/Cargo.toml index cfcb30ce..e45057bf 100644 --- a/yellowstone-grpc-client/Cargo.toml +++ b/yellowstone-grpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yellowstone-grpc-client" -version = "3.1.0" +version = "3.1.1" authors = { workspace = true } edition = { workspace = true } description = "Yellowstone gRPC Geyser Simple Client" diff --git a/yellowstone-grpc-client/src/lib.rs b/yellowstone-grpc-client/src/lib.rs index f3066f57..c821871a 100644 --- a/yellowstone-grpc-client/src/lib.rs +++ b/yellowstone-grpc-client/src/lib.rs @@ -1,4 +1,4 @@ -pub use tonic::service::Interceptor; +pub use tonic::{service::Interceptor, transport::ClientTlsConfig}; use { bytes::Bytes, futures::{ @@ -11,7 +11,7 @@ use { codec::{CompressionEncoding, Streaming}, metadata::{errors::InvalidMetadataValue, AsciiMetadataValue, MetadataValue}, service::interceptor::InterceptedService, - transport::channel::{Channel, ClientTlsConfig, Endpoint}, + transport::channel::{Channel, Endpoint}, Request, Response, Status, }, tonic_health::pb::{health_client::HealthClient, HealthCheckRequest, HealthCheckResponse},