From e216c9a034e730bbf69464af0712c19b01f79f45 Mon Sep 17 00:00:00 2001 From: satyakwok Date: Wed, 13 May 2026 18:29:32 +0200 Subject: [PATCH 1/3] chore(grpc): depend on sentrix-proto crate, drop vendored proto MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the vendored proto/sentrix.proto + the pre-generated src/grpc/pb.rs (~560 lines) with a dependency on the standalone `sentrix-proto` crate that the chain repo (sentrix-labs/sentrix) publishes to crates.io. This is the Cosmos `ibc-proto` pattern: one repo owns the .proto, every consumer pulls the same generated types from crates.io. Eliminates the schema drift that had already started (sdk-rs proto was 8897B, the chain server's was 8979B as of 2026-05-13). The `sentrix_chain::grpc::pb` module stays as a thin re-export of `sentrix_proto`, so existing consumers that path-into pb don't churn: pub mod pb { pub use sentrix_proto::*; } Drops `tonic-prost` and `prost` from this crate's deps — they're now transitive through `sentrix-proto`. `tonic` stays for the transport layer. Tested locally with a path-dep against the chain repo's sentrix-proto crate: `cargo build/test/clippy --features grpc` all clean. NOTE: CI will fail on this PR until `cargo publish -p sentrix-proto` runs from the chain repo. The version bump on this crate (`0.1.0-alpha.0` → `0.2.0-alpha.0`) ships in a follow-up commit so the publish + this PR's merge land together. --- Cargo.toml | 9 +- proto/sentrix.proto | 256 -------------------- src/grpc/mod.rs | 10 +- src/grpc/pb.rs | 559 -------------------------------------------- 4 files changed, 13 insertions(+), 821 deletions(-) delete mode 100644 proto/sentrix.proto delete mode 100644 src/grpc/pb.rs diff --git a/Cargo.toml b/Cargo.toml index 9de4f8f..1a994bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ wallet = ["dep:secp256k1", "dep:sha2", "dep:tiny-keccak", "dep:hex", "dep:serde" # evm and grpc are scaffolded behind features but not implemented yet — # alpha.0 ships the network spec + native client foundation. evm = ["dep:alloy", "dep:url", "network"] -grpc = ["dep:tonic", "dep:tonic-prost", "dep:prost", "dep:tokio", "dep:futures", "dep:hex", "dep:thiserror", "network"] +grpc = ["dep:tonic", "dep:sentrix-proto", "dep:tokio", "dep:futures", "dep:hex", "dep:thiserror", "network"] bft = ["dep:tokio", "dep:tokio-tungstenite", "dep:futures", "dep:serde", "dep:serde_json", "dep:thiserror", "network"] [dependencies] @@ -44,10 +44,11 @@ hex = { version = "0.4", optional = true } alloy = { version = "2.0", optional = true, features = ["providers", "rpc-types-eth", "transport-http", "reqwest-rustls-tls"] } url = { version = "2", optional = true } -# gRPC (tonic) +# gRPC (tonic) — proto types come from the published `sentrix-proto` +# crate which the chain repo also consumes server-side, so the schema +# stays single-source-of-truth. tonic = { version = "0.14", optional = true, features = ["tls-ring", "tls-native-roots"] } -tonic-prost = { version = "0.14", optional = true } -prost = { version = "0.14", optional = true } +sentrix-proto = { version = "0.1", optional = true } futures = { version = "0.3", optional = true } tokio-tungstenite = { version = "0.29", optional = true, features = ["rustls-tls-native-roots"] } diff --git a/proto/sentrix.proto b/proto/sentrix.proto deleted file mode 100644 index 65c907d..0000000 --- a/proto/sentrix.proto +++ /dev/null @@ -1,256 +0,0 @@ -syntax = "proto3"; - -// Sentrix gRPC service v0.1 — package sentrix.v1. -// -// Parallel transport to JSON-RPC at port 8545. Same backend, same state, -// different wire format. Methods here mirror the most common JSON-RPC paths -// plus add a server-streaming variant for events that JSON-RPC + WebSocket -// can express but at a higher per-subscriber cost. -// -// Versioning: "sentrix.v1" is a hard contract. Breaking changes go to -// "sentrix.v2" with v1 retained for ≥ 2 minor releases overlap. -// -// Status: v0.1 skeleton. Handlers in crates/sentrix-grpc/src/lib.rs return -// tonic::Status::unimplemented until main.rs integration lands. - -package sentrix.v1; - -// 20-byte EVM-compatible address. Mirror of sentrix-primitives::Address. -// Wire = bytes (NOT hex string) for binary efficiency. -message Address { - bytes value = 1; // exactly 20 bytes -} - -// 32-byte hash — block hash, tx hash, state root. -message Hash { - bytes value = 1; // exactly 32 bytes -} - -// Native amount — sentri (10^-8 SRX). u64 wire to match Sentrix internal. -message Amount { - uint64 sentri = 1; -} - -// Block height — u64 starting at 0 (genesis). -message BlockHeight { - uint64 value = 1; -} - -// Mirror of sentrix-primitives::Transaction. Identical wire format to chain -// MDBX serialisation (modulo prost-encoding). Field numbers match the -// canonical struct order; do NOT renumber on changes. -message Transaction { - Hash txid = 1; - Address from_address = 2; - Address to_address = 3; - Amount amount = 4; - Amount fee = 5; - uint64 nonce = 6; - uint64 timestamp = 7; - bytes signature = 8; // 64-byte ed25519 OR 65-byte secp256k1 - bytes payload = 9; // contract calldata (EVM) or staking-op blob - uint32 chain_id = 10; - uint32 tx_type = 11; // 0 = transfer, 1 = contract, 2 = staking-op -} - -message Block { - uint64 index = 1; - Hash hash = 2; - Hash parent_hash = 3; - Hash state_root = 4; - uint64 timestamp = 5; - Address proposer = 6; - uint32 round = 7; - repeated Transaction transactions = 8; - // BFT justification carried from validator-side; included for audit. - // Empty for blocks at h<100_000 (pre state-root-fork). - bytes justification = 9; -} - -message Account { - Address address = 1; - Amount balance = 2; - uint64 nonce = 3; - // For contract accounts: 32-byte storage root + non-empty code_hash. - Hash storage_root = 4; - Hash code_hash = 5; -} - -// Server-streaming event types. -message ChainEvent { - oneof event { - BlockFinalized block_finalized = 1; - PendingTx pending_tx = 2; - ValidatorSetChange validator_set_change = 3; - LogEmitted log = 4; - // Synthetic Lagged sentinel — emitted when the per-subscriber broadcast - // channel drops oldest events (slow consumer). Mirrors tokio broadcast - // RecvError::Lagged semantics. Consumer should resync state from RPC. - StreamLagged lagged = 5; - } - uint64 sequence = 100; // monotonic across all events on this stream - uint64 timestamp = 101; // server-wall-clock unix seconds -} - -message BlockFinalized { Block block = 1; } -message PendingTx { Transaction tx = 1; } - -message ValidatorSetChange { - uint32 epoch = 1; - repeated Address active = 2; - repeated Address jailed = 3; -} - -message LogEmitted { - Address contract = 1; - repeated Hash topics = 2; // 0..4 topics per EVM convention - bytes data = 3; - Hash tx_hash = 4; - uint64 block_height = 5; - uint32 log_index = 6; -} - -message StreamLagged { - uint64 skipped_count = 1; // events dropped since last delivery -} - -// ──────────────────────────────────────────────────────────── -// Service definition -// ──────────────────────────────────────────────────────────── -service Sentrix { - // Submit a signed transaction to the local mempool. Same semantics as - // JSON-RPC eth_sendRawTransaction for EVM txs, with native fields exposed - // for staking-ops and other native variants. - rpc BroadcastTx(BroadcastTxRequest) returns (BroadcastTxResponse); - - // Fetch a block by height OR by hash. Returns NOT_FOUND if outside the - // local chain window (currently 1000 blocks; older blocks need indexer). - rpc GetBlock(GetBlockRequest) returns (Block); - - // Fetch account balance + nonce. Mirrors eth_getBalance + - // eth_getTransactionCount in a single round-trip. Includes mempool-pending - // nonce so wallets build correct next-tx without an extra call (matches - // the pending-aware nonce behaviour from chain v2.1.57). - rpc GetBalance(GetBalanceRequest) returns (Account); - - // v0.4 read-only state queries — drop the REST `/sentrix_status_extended` - // bridge from the explorer's stats hot path. All three are pure reads - // off `state.read()` snapshots; same lock contention profile as - // GetBlock/GetBalance. - // - // Active validator set + per-validator stake/active/jailed flags. - rpc GetValidatorSet(GetValidatorSetRequest) returns (ValidatorSet); - // Native-token supply snapshot (minted, burned, circulating). - rpc GetSupply(GetSupplyRequest) returns (Supply); - // Pending-tx count + a capped header window for UI display. - rpc GetMempool(GetMempoolRequest) returns (Mempool); - - // Server-streaming chain events. Subscribe once, receive every event type - // until cancel or server restart. Replaces N separate eth_subscribe calls. - // Backpressure: server bounded channel per stream (capacity 4096 — same as - // event_tx in chain). On slow client, server drops OLDEST events and emits - // a StreamLagged sentinel. Client should resync state from RPC. - rpc StreamEvents(StreamEventsRequest) returns (stream ChainEvent); -} - -message BroadcastTxRequest { Transaction tx = 1; } - -message BroadcastTxResponse { - Hash txid = 1; - uint64 mempool_position = 2; // 0-indexed; FIFO ordering UX -} - -message GetBlockRequest { - oneof selector { - BlockHeight height = 1; - Hash hash = 2; - bool latest = 3; // selector == "latest" shorthand - bool finalized = 4; // selector == "finalized" (BFT-finalized head) - } -} - -message GetBalanceRequest { - Address address = 1; - // Snapshot height — read state as-of this block. Default = latest. - // Returns FAILED_PRECONDITION if outside chain window. - optional BlockHeight at_height = 2; -} - -message StreamEventsRequest { - // Filter set — empty = subscribe to all event types. Backend filters - // server-side so the wire only carries matched events. - repeated EventFilter filters = 1; - // Resume from a sequence number (0 = current head). Backend keeps last - // 4096 events in a ring buffer — beyond that, sequence is not resumable - // and the server returns FAILED_PRECONDITION. - uint64 from_sequence = 2; -} - -enum EventFilter { - EVENT_FILTER_UNSPECIFIED = 0; - EVENT_FILTER_BLOCK_FINALIZED = 1; - EVENT_FILTER_PENDING_TX = 2; - EVENT_FILTER_VALIDATOR_SET = 3; - EVENT_FILTER_LOG = 4; -} - -// ──────────────────────────────────────────────────────────── -// v0.4 read-only state-query messages -// ──────────────────────────────────────────────────────────── - -message GetValidatorSetRequest { - // Reserved for at_height historical reads — gated on MDBX snapshot - // isolation (Refactor 5). v0.4 returns the latest finalized set. - optional BlockHeight at_height = 1; -} - -message ValidatorSet { - uint32 epoch = 1; - uint32 active_count = 2; - uint32 total_count = 3; - // Total stake across the active set, in sentri (10^-8 SRX). - uint64 total_active_stake_sentri = 4; - repeated ValidatorEntry validators = 5; -} - -message ValidatorEntry { - Address address = 1; - uint64 stake_sentri = 2; - bool active = 3; - bool jailed = 4; -} - -message GetSupplyRequest { - optional BlockHeight at_height = 1; -} - -message Supply { - // sentri = 10^-8 SRX. Cap is fork-gated (210M pre-fork, 315M post- - // tokenomics-v2 at h=640800); leave conversion to display layer. - uint64 minted_sentri = 1; - uint64 burned_sentri = 2; - uint64 circulating_sentri = 3; // = minted − burned -} - -message GetMempoolRequest { - // Cap returned tx headers; default 100, max 500. Larger windows need - // pagination (deferred). 0 = use server default (100). - uint32 limit = 1; -} - -message Mempool { - // Authoritative pending-tx count. `entries` is capped by `limit`; - // size always reflects the full mempool depth. - uint32 size = 1; - repeated MempoolEntry entries = 2; -} - -message MempoolEntry { - Hash txid = 1; - Address from_address = 2; - Address to_address = 3; - Amount amount = 4; - Amount fee = 5; - uint64 nonce = 6; - uint32 tx_type = 7; -} diff --git a/src/grpc/mod.rs b/src/grpc/mod.rs index 5ab99f0..9cc9fe7 100644 --- a/src/grpc/mod.rs +++ b/src/grpc/mod.rs @@ -22,9 +22,15 @@ //! - `get_mempool(limit: u32)` //! - `subscribe_events(filters: Vec)` — server-stream -#[allow(clippy::all)] +/// Re-export of the upstream [`sentrix_proto`] crate so existing +/// `sentrix_chain::grpc::pb::*` paths keep compiling without churn. +/// The proto schema is the source-of-truth in `sentrix-labs/sentrix` +/// and ships to crates.io as the standalone `sentrix-proto` crate; +/// this module is a stable alias. #[allow(missing_docs)] -pub mod pb; +pub mod pb { + pub use sentrix_proto::*; +} use crate::network::{get_spec, Network}; use pb::sentrix_client::SentrixClient as InnerClient; diff --git a/src/grpc/pb.rs b/src/grpc/pb.rs deleted file mode 100644 index b6de728..0000000 --- a/src/grpc/pb.rs +++ /dev/null @@ -1,559 +0,0 @@ -// This file is @generated by prost-build. -/// 20-byte EVM-compatible address. Mirror of sentrix-primitives::Address. -/// Wire = bytes (NOT hex string) for binary efficiency. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Address { - /// exactly 20 bytes - #[prost(bytes = "vec", tag = "1")] - pub value: ::prost::alloc::vec::Vec, -} -/// 32-byte hash — block hash, tx hash, state root. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Hash { - /// exactly 32 bytes - #[prost(bytes = "vec", tag = "1")] - pub value: ::prost::alloc::vec::Vec, -} -/// Native amount — sentri (10^-8 SRX). u64 wire to match Sentrix internal. -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Amount { - #[prost(uint64, tag = "1")] - pub sentri: u64, -} -/// Block height — u64 starting at 0 (genesis). -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct BlockHeight { - #[prost(uint64, tag = "1")] - pub value: u64, -} -/// Mirror of sentrix-primitives::Transaction. Identical wire format to chain -/// MDBX serialisation (modulo prost-encoding). Field numbers match the -/// canonical struct order; do NOT renumber on changes. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Transaction { - #[prost(message, optional, tag = "1")] - pub txid: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub from_address: ::core::option::Option
, - #[prost(message, optional, tag = "3")] - pub to_address: ::core::option::Option
, - #[prost(message, optional, tag = "4")] - pub amount: ::core::option::Option, - #[prost(message, optional, tag = "5")] - pub fee: ::core::option::Option, - #[prost(uint64, tag = "6")] - pub nonce: u64, - #[prost(uint64, tag = "7")] - pub timestamp: u64, - /// 64-byte ed25519 OR 65-byte secp256k1 - #[prost(bytes = "vec", tag = "8")] - pub signature: ::prost::alloc::vec::Vec, - /// contract calldata (EVM) or staking-op blob - #[prost(bytes = "vec", tag = "9")] - pub payload: ::prost::alloc::vec::Vec, - #[prost(uint32, tag = "10")] - pub chain_id: u32, - /// 0 = transfer, 1 = contract, 2 = staking-op - #[prost(uint32, tag = "11")] - pub tx_type: u32, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Block { - #[prost(uint64, tag = "1")] - pub index: u64, - #[prost(message, optional, tag = "2")] - pub hash: ::core::option::Option, - #[prost(message, optional, tag = "3")] - pub parent_hash: ::core::option::Option, - #[prost(message, optional, tag = "4")] - pub state_root: ::core::option::Option, - #[prost(uint64, tag = "5")] - pub timestamp: u64, - #[prost(message, optional, tag = "6")] - pub proposer: ::core::option::Option
, - #[prost(uint32, tag = "7")] - pub round: u32, - #[prost(message, repeated, tag = "8")] - pub transactions: ::prost::alloc::vec::Vec, - /// BFT justification carried from validator-side; included for audit. - /// Empty for blocks at h\<100_000 (pre state-root-fork). - #[prost(bytes = "vec", tag = "9")] - pub justification: ::prost::alloc::vec::Vec, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Account { - #[prost(message, optional, tag = "1")] - pub address: ::core::option::Option
, - #[prost(message, optional, tag = "2")] - pub balance: ::core::option::Option, - #[prost(uint64, tag = "3")] - pub nonce: u64, - /// For contract accounts: 32-byte storage root + non-empty code_hash. - #[prost(message, optional, tag = "4")] - pub storage_root: ::core::option::Option, - #[prost(message, optional, tag = "5")] - pub code_hash: ::core::option::Option, -} -/// Server-streaming event types. -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ChainEvent { - /// monotonic across all events on this stream - #[prost(uint64, tag = "100")] - pub sequence: u64, - /// server-wall-clock unix seconds - #[prost(uint64, tag = "101")] - pub timestamp: u64, - #[prost(oneof = "chain_event::Event", tags = "1, 2, 3, 4, 5")] - pub event: ::core::option::Option, -} -/// Nested message and enum types in `ChainEvent`. -pub mod chain_event { - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Event { - #[prost(message, tag = "1")] - BlockFinalized(super::BlockFinalized), - #[prost(message, tag = "2")] - PendingTx(super::PendingTx), - #[prost(message, tag = "3")] - ValidatorSetChange(super::ValidatorSetChange), - #[prost(message, tag = "4")] - Log(super::LogEmitted), - /// Synthetic Lagged sentinel — emitted when the per-subscriber broadcast - /// channel drops oldest events (slow consumer). Mirrors tokio broadcast - /// RecvError::Lagged semantics. Consumer should resync state from RPC. - #[prost(message, tag = "5")] - Lagged(super::StreamLagged), - } -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct BlockFinalized { - #[prost(message, optional, tag = "1")] - pub block: ::core::option::Option, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct PendingTx { - #[prost(message, optional, tag = "1")] - pub tx: ::core::option::Option, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ValidatorSetChange { - #[prost(uint32, tag = "1")] - pub epoch: u32, - #[prost(message, repeated, tag = "2")] - pub active: ::prost::alloc::vec::Vec
, - #[prost(message, repeated, tag = "3")] - pub jailed: ::prost::alloc::vec::Vec
, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct LogEmitted { - #[prost(message, optional, tag = "1")] - pub contract: ::core::option::Option
, - /// 0..4 topics per EVM convention - #[prost(message, repeated, tag = "2")] - pub topics: ::prost::alloc::vec::Vec, - #[prost(bytes = "vec", tag = "3")] - pub data: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "4")] - pub tx_hash: ::core::option::Option, - #[prost(uint64, tag = "5")] - pub block_height: u64, - #[prost(uint32, tag = "6")] - pub log_index: u32, -} -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct StreamLagged { - /// events dropped since last delivery - #[prost(uint64, tag = "1")] - pub skipped_count: u64, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct BroadcastTxRequest { - #[prost(message, optional, tag = "1")] - pub tx: ::core::option::Option, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct BroadcastTxResponse { - #[prost(message, optional, tag = "1")] - pub txid: ::core::option::Option, - /// 0-indexed; FIFO ordering UX - #[prost(uint64, tag = "2")] - pub mempool_position: u64, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetBlockRequest { - #[prost(oneof = "get_block_request::Selector", tags = "1, 2, 3, 4")] - pub selector: ::core::option::Option, -} -/// Nested message and enum types in `GetBlockRequest`. -pub mod get_block_request { - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] - pub enum Selector { - #[prost(message, tag = "1")] - Height(super::BlockHeight), - #[prost(message, tag = "2")] - Hash(super::Hash), - /// selector == "latest" shorthand - #[prost(bool, tag = "3")] - Latest(bool), - /// selector == "finalized" (BFT-finalized head) - #[prost(bool, tag = "4")] - Finalized(bool), - } -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetBalanceRequest { - #[prost(message, optional, tag = "1")] - pub address: ::core::option::Option
, - /// Snapshot height — read state as-of this block. Default = latest. - /// Returns FAILED_PRECONDITION if outside chain window. - #[prost(message, optional, tag = "2")] - pub at_height: ::core::option::Option, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct StreamEventsRequest { - /// Filter set — empty = subscribe to all event types. Backend filters - /// server-side so the wire only carries matched events. - #[prost(enumeration = "EventFilter", repeated, tag = "1")] - pub filters: ::prost::alloc::vec::Vec, - /// Resume from a sequence number (0 = current head). Backend keeps last - /// 4096 events in a ring buffer — beyond that, sequence is not resumable - /// and the server returns FAILED_PRECONDITION. - #[prost(uint64, tag = "2")] - pub from_sequence: u64, -} -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetValidatorSetRequest { - /// Reserved for at_height historical reads — gated on MDBX snapshot - /// isolation (Refactor 5). v0.4 returns the latest finalized set. - #[prost(message, optional, tag = "1")] - pub at_height: ::core::option::Option, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ValidatorSet { - #[prost(uint32, tag = "1")] - pub epoch: u32, - #[prost(uint32, tag = "2")] - pub active_count: u32, - #[prost(uint32, tag = "3")] - pub total_count: u32, - /// Total stake across the active set, in sentri (10^-8 SRX). - #[prost(uint64, tag = "4")] - pub total_active_stake_sentri: u64, - #[prost(message, repeated, tag = "5")] - pub validators: ::prost::alloc::vec::Vec, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ValidatorEntry { - #[prost(message, optional, tag = "1")] - pub address: ::core::option::Option
, - #[prost(uint64, tag = "2")] - pub stake_sentri: u64, - #[prost(bool, tag = "3")] - pub active: bool, - #[prost(bool, tag = "4")] - pub jailed: bool, -} -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetSupplyRequest { - #[prost(message, optional, tag = "1")] - pub at_height: ::core::option::Option, -} -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Supply { - /// sentri = 10^-8 SRX. Cap is fork-gated (210M pre-fork, 315M post- - /// tokenomics-v2 at h=640800); leave conversion to display layer. - #[prost(uint64, tag = "1")] - pub minted_sentri: u64, - #[prost(uint64, tag = "2")] - pub burned_sentri: u64, - /// = minted − burned - #[prost(uint64, tag = "3")] - pub circulating_sentri: u64, -} -#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GetMempoolRequest { - /// Cap returned tx headers; default 100, max 500. Larger windows need - /// pagination (deferred). 0 = use server default (100). - #[prost(uint32, tag = "1")] - pub limit: u32, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Mempool { - /// Authoritative pending-tx count. `entries` is capped by `limit`; - /// size always reflects the full mempool depth. - #[prost(uint32, tag = "1")] - pub size: u32, - #[prost(message, repeated, tag = "2")] - pub entries: ::prost::alloc::vec::Vec, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct MempoolEntry { - #[prost(message, optional, tag = "1")] - pub txid: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub from_address: ::core::option::Option
, - #[prost(message, optional, tag = "3")] - pub to_address: ::core::option::Option
, - #[prost(message, optional, tag = "4")] - pub amount: ::core::option::Option, - #[prost(message, optional, tag = "5")] - pub fee: ::core::option::Option, - #[prost(uint64, tag = "6")] - pub nonce: u64, - #[prost(uint32, tag = "7")] - pub tx_type: u32, -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum EventFilter { - Unspecified = 0, - BlockFinalized = 1, - PendingTx = 2, - ValidatorSet = 3, - Log = 4, -} -impl EventFilter { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Unspecified => "EVENT_FILTER_UNSPECIFIED", - Self::BlockFinalized => "EVENT_FILTER_BLOCK_FINALIZED", - Self::PendingTx => "EVENT_FILTER_PENDING_TX", - Self::ValidatorSet => "EVENT_FILTER_VALIDATOR_SET", - Self::Log => "EVENT_FILTER_LOG", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "EVENT_FILTER_UNSPECIFIED" => Some(Self::Unspecified), - "EVENT_FILTER_BLOCK_FINALIZED" => Some(Self::BlockFinalized), - "EVENT_FILTER_PENDING_TX" => Some(Self::PendingTx), - "EVENT_FILTER_VALIDATOR_SET" => Some(Self::ValidatorSet), - "EVENT_FILTER_LOG" => Some(Self::Log), - _ => None, - } - } -} -/// Generated client implementations. -pub mod sentrix_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value - )] - use tonic::codegen::http::Uri; - use tonic::codegen::*; - /// ──────────────────────────────────────────────────────────── - /// Service definition - /// ──────────────────────────────────────────────────────────── - #[derive(Debug, Clone)] - pub struct SentrixClient { - inner: tonic::client::Grpc, - } - impl SentrixClient { - /// Attempt to create a new client by connecting to a given endpoint. - pub async fn connect(dst: D) -> Result - where - D: TryInto, - D::Error: Into, - { - let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; - Ok(Self::new(conn)) - } - } - impl SentrixClient - where - T: tonic::client::GrpcService, - T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, - { - pub fn new(inner: T) -> Self { - let inner = tonic::client::Grpc::new(inner); - Self { inner } - } - pub fn with_origin(inner: T, origin: Uri) -> Self { - let inner = tonic::client::Grpc::with_origin(inner, origin); - Self { inner } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> SentrixClient> - where - F: tonic::service::Interceptor, - T::ResponseBody: Default, - T: tonic::codegen::Service< - http::Request, - Response = http::Response< - >::ResponseBody, - >, - >, - >>::Error: - Into + std::marker::Send + std::marker::Sync, - { - SentrixClient::new(InterceptedService::new(inner, interceptor)) - } - /// Compress requests with the given encoding. - /// - /// This requires the server to support it otherwise it might respond with an - /// error. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.send_compressed(encoding); - self - } - /// Enable decompressing responses. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.accept_compressed(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_decoding_message_size(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_encoding_message_size(limit); - self - } - /// Submit a signed transaction to the local mempool. Same semantics as - /// JSON-RPC eth_sendRawTransaction for EVM txs, with native fields exposed - /// for staking-ops and other native variants. - pub async fn broadcast_tx( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> - { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/BroadcastTx"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "BroadcastTx")); - self.inner.unary(req, path, codec).await - } - /// Fetch a block by height OR by hash. Returns NOT_FOUND if outside the - /// local chain window (currently 1000 blocks; older blocks need indexer). - pub async fn get_block( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/GetBlock"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "GetBlock")); - self.inner.unary(req, path, codec).await - } - /// Fetch account balance + nonce. Mirrors eth_getBalance + - /// eth_getTransactionCount in a single round-trip. Includes mempool-pending - /// nonce so wallets build correct next-tx without an extra call (matches - /// the pending-aware nonce behaviour from chain v2.1.57). - pub async fn get_balance( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/GetBalance"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "GetBalance")); - self.inner.unary(req, path, codec).await - } - /// v0.4 read-only state queries — drop the REST `/sentrix_status_extended` - /// bridge from the explorer's stats hot path. All three are pure reads - /// off `state.read()` snapshots; same lock contention profile as - /// GetBlock/GetBalance. - /// - /// Active validator set + per-validator stake/active/jailed flags. - pub async fn get_validator_set( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/GetValidatorSet"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "GetValidatorSet")); - self.inner.unary(req, path, codec).await - } - /// Native-token supply snapshot (minted, burned, circulating). - pub async fn get_supply( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/GetSupply"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "GetSupply")); - self.inner.unary(req, path, codec).await - } - /// Pending-tx count + a capped header window for UI display. - pub async fn get_mempool( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/GetMempool"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "GetMempool")); - self.inner.unary(req, path, codec).await - } - /// Server-streaming chain events. Subscribe once, receive every event type - /// until cancel or server restart. Replaces N separate eth_subscribe calls. - /// Backpressure: server bounded channel per stream (capacity 4096 — same as - /// event_tx in chain). On slow client, server drops OLDEST events and emits - /// a StreamLagged sentinel. Client should resync state from RPC. - pub async fn stream_events( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response>, - tonic::Status, - > { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static("/sentrix.v1.Sentrix/StreamEvents"); - let mut req = request.into_request(); - req.extensions_mut() - .insert(GrpcMethod::new("sentrix.v1.Sentrix", "StreamEvents")); - self.inner.server_streaming(req, path, codec).await - } - } -} From 91bfd994d11269bc3eb0580800b9c5cc08a4d10c Mon Sep 17 00:00:00 2001 From: satyakwok Date: Wed, 13 May 2026 18:47:46 +0200 Subject: [PATCH 2/3] chore: refresh Cargo.lock for sentrix-proto 0.1.0 from crates.io --- Cargo.lock | 203 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 190 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13ae6bb..29771fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -66,7 +75,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -102,7 +111,7 @@ dependencies = [ "futures", "futures-util", "serde_json", - "thiserror 2.0.18", + "thiserror", "tracing", ] @@ -145,7 +154,7 @@ dependencies = [ "alloy-rlp", "crc", "serde", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -170,7 +179,7 @@ dependencies = [ "alloy-rlp", "borsh", "serde", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -184,7 +193,7 @@ dependencies = [ "borsh", "once_cell", "serde", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -302,7 +311,7 @@ dependencies = [ "cfg-if", "const-hex", "derive_more", - "foldhash", + "foldhash 0.2.0", "hashbrown 0.16.1", "indexmap 2.14.0", "itoa", @@ -447,7 +456,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -489,7 +498,7 @@ dependencies = [ "async-trait", "k256", "rand 0.8.6", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -616,7 +625,7 @@ dependencies = [ "nybbles", "serde", "smallvec", - "thiserror 2.0.18", + "thiserror", "tracing", ] @@ -1648,12 +1657,24 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foldhash" version = "0.2.0" @@ -1861,6 +1882,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -1869,7 +1899,7 @@ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.2.0", "serde", "serde_core", ] @@ -2262,7 +2292,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.18", + "thiserror", "walkdir", "windows-link", ] @@ -2463,6 +2493,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + [[package]] name = "num-bigint" version = "0.4.6" @@ -2628,6 +2664,17 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.14.0", +] + [[package]] name = "pin-project" version = "1.1.12" @@ -2694,6 +2741,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + [[package]] name = "primitive-types" version = "0.12.2" @@ -2774,6 +2831,27 @@ dependencies = [ "prost-derive", ] +[[package]] +name = "prost-build" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +dependencies = [ + "heck", + "itertools 0.13.0", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", + "regex", + "syn 2.0.117", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.14.3" @@ -2787,6 +2865,35 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "prost-types" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +dependencies = [ + "prost", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" +dependencies = [ + "bitflags", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" +dependencies = [ + "pulldown-cmark", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -2979,6 +3086,29 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + [[package]] name = "regex-syntax" version = "0.8.10" @@ -3430,9 +3560,9 @@ dependencies = [ "alloy", "futures", "hex", - "prost", "reqwest 0.12.28", "secp256k1 0.31.1", + "sentrix-proto", "serde", "serde_json", "sha2 0.11.0", @@ -3441,10 +3571,23 @@ dependencies = [ "tokio", "tokio-tungstenite", "tonic", - "tonic-prost", "url", ] +[[package]] +name = "sentrix-proto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c608dbefa2b41ad2ffffbcc3f69388fdb1e95257411b93dfb57c888a17566d40" +dependencies = [ + "prost", + "prost-build", + "tonic", + "tonic-build", + "tonic-prost", + "tonic-prost-build", +] + [[package]] name = "serde" version = "1.0.228" @@ -4012,6 +4155,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "tonic-prost" version = "0.14.6" @@ -4023,6 +4178,22 @@ dependencies = [ "tonic", ] +[[package]] +name = "tonic-prost-build" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.117", + "tempfile", + "tonic-build", +] + [[package]] name = "tower" version = "0.5.3" @@ -4157,6 +4328,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-ident" version = "1.0.24" From 2b96aae6a0ae190bd54d9042ad8e7182e01d7baa Mon Sep 17 00:00:00 2001 From: satyakwok Date: Wed, 13 May 2026 19:01:15 +0200 Subject: [PATCH 3/3] ci: install protoc for sentrix-proto build.rs + bump to 0.1.1 sentrix-proto's build.rs invokes protoc to generate tonic types at consumer build time. The previous CI run failed with "Could not find `protoc`" because ubuntu-22.04 doesn't ship it by default. Add `apt-get install protobuf-compiler` step and refresh Cargo.lock to 0.1.1 (which adds the wasm-friendly `transport` feature gate, not needed by sdk-rs but already published upstream). --- .github/workflows/ci.yml | 4 ++++ Cargo.lock | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7691f53..56ac87a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,10 @@ jobs: with: components: clippy, rustfmt - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + - name: Install protoc + # Required by sentrix-proto's build.rs (generates tonic types from + # the schema at consumer build time). Pulled in via the `grpc` feature. + run: sudo apt-get update -qq && sudo apt-get install -y -qq protobuf-compiler - name: rustfmt run: cargo fmt --all -- --check - name: build (default features) diff --git a/Cargo.lock b/Cargo.lock index 29771fe..84080e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1598,7 +1598,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -2838,7 +2838,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ "heck", - "itertools 0.13.0", + "itertools 0.10.5", "log", "multimap", "petgraph", @@ -2859,7 +2859,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.117", @@ -3298,7 +3298,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3357,7 +3357,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3576,9 +3576,9 @@ dependencies = [ [[package]] name = "sentrix-proto" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c608dbefa2b41ad2ffffbcc3f69388fdb1e95257411b93dfb57c888a17566d40" +checksum = "e4a96198c479e3dad9d7a2718c3d12d86a228cd07a2bade9091ef64206c273c9" dependencies = [ "prost", "prost-build", @@ -3792,7 +3792,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3920,7 +3920,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -4545,7 +4545,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]]