From fc652a2882cc35c0efa2659b13cb7b36285ec492 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 5 Sep 2024 18:01:22 +0200 Subject: [PATCH 1/5] Update Interchain Security protos to include Permissionless ICS changes --- src/INTERCHAIN_SECURITY_COMMIT | 2 +- src/lib.rs | 7 + src/prost/cosmos.evidence.v1beta1.rs | 29 + src/prost/cosmos.evidence.v1beta1.serde.rs | 149 + .../interchain_security.ccv.consumer.v1.rs | 626 +- .../interchain_security.ccv.provider.v1.rs | 5075 +++++++++++++---- src/prost/interchain_security.ccv.v1.rs | 386 +- src/prost/proto_descriptor.bin | Bin 764958 -> 820413 bytes 8 files changed, 4769 insertions(+), 1505 deletions(-) create mode 100644 src/prost/cosmos.evidence.v1beta1.rs create mode 100644 src/prost/cosmos.evidence.v1beta1.serde.rs diff --git a/src/INTERCHAIN_SECURITY_COMMIT b/src/INTERCHAIN_SECURITY_COMMIT index 53a649c6..121c6e0d 100644 --- a/src/INTERCHAIN_SECURITY_COMMIT +++ b/src/INTERCHAIN_SECURITY_COMMIT @@ -1 +1 @@ -ea545b490b53b8e6f422492b4fb2820ab0bc140b +7994f3050a2821a3234f571a889b87c8d27a294c diff --git a/src/lib.rs b/src/lib.rs index d55f3dbd..bb1a1bdc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -251,6 +251,13 @@ pub mod cosmos { } } } + pub mod evidence { + pub mod v1beta1 { + include_proto!("cosmos.evidence.v1beta1.rs"); + #[cfg(feature = "serde")] + include_proto!("cosmos.evidence.v1beta1.serde.rs"); + } + } pub mod ics23 { pub use ics23 as v1; } diff --git a/src/prost/cosmos.evidence.v1beta1.rs b/src/prost/cosmos.evidence.v1beta1.rs new file mode 100644 index 00000000..2cf9ce03 --- /dev/null +++ b/src/prost/cosmos.evidence.v1beta1.rs @@ -0,0 +1,29 @@ +// This file is @generated by prost-build. +/// Equivocation implements the Evidence interface and defines evidence of double +/// signing misbehavior. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Equivocation { + /// height is the equivocation height. + #[prost(int64, tag = "1")] + pub height: i64, + /// time is the equivocation time. + #[prost(message, optional, tag = "2")] + pub time: ::core::option::Option<::tendermint_proto::google::protobuf::Timestamp>, + /// power is the equivocation validator power. + #[prost(int64, tag = "3")] + pub power: i64, + /// consensus_address is the equivocation validator consensus address. + #[prost(string, tag = "4")] + pub consensus_address: ::prost::alloc::string::String, +} +impl ::prost::Name for Equivocation { + const NAME: &'static str = "Equivocation"; + const PACKAGE: &'static str = "cosmos.evidence.v1beta1"; + fn full_name() -> ::prost::alloc::string::String { + "cosmos.evidence.v1beta1.Equivocation".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/cosmos.evidence.v1beta1.Equivocation".into() + } +} diff --git a/src/prost/cosmos.evidence.v1beta1.serde.rs b/src/prost/cosmos.evidence.v1beta1.serde.rs new file mode 100644 index 00000000..0ce36c0f --- /dev/null +++ b/src/prost/cosmos.evidence.v1beta1.serde.rs @@ -0,0 +1,149 @@ +impl serde::Serialize for Equivocation { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> core::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if true { + len += 1; + } + if true { + len += 1; + } + if true { + len += 1; + } + if true { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("cosmos.evidence.v1beta1.Equivocation", len)?; + if true { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("height", ::alloc::string::ToString::to_string(&self.height).as_str())?; + } + if let Some(v) = self.time.as_ref() { + struct_ser.serialize_field("time", v)?; + } + if true { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("power", ::alloc::string::ToString::to_string(&self.power).as_str())?; + } + if true { + struct_ser.serialize_field("consensusAddress", &self.consensus_address)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for Equivocation { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> core::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "height", + "time", + "power", + "consensus_address", + "consensusAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Height, + Time, + Power, + ConsensusAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> core::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> core::result::Result + where + E: serde::de::Error, + { + match value { + "height" => Ok(GeneratedField::Height), + "time" => Ok(GeneratedField::Time), + "power" => Ok(GeneratedField::Power), + "consensusAddress" | "consensus_address" => Ok(GeneratedField::ConsensusAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = Equivocation; + + fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + formatter.write_str("struct cosmos.evidence.v1beta1.Equivocation") + } + + fn visit_map(self, mut map_: V) -> core::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut height__ = None; + let mut time__ = None; + let mut power__ = None; + let mut consensus_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Height => { + if height__.is_some() { + return Err(serde::de::Error::duplicate_field("height")); + } + height__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Time => { + if time__.is_some() { + return Err(serde::de::Error::duplicate_field("time")); + } + time__ = map_.next_value()?; + } + GeneratedField::Power => { + if power__.is_some() { + return Err(serde::de::Error::duplicate_field("power")); + } + power__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::ConsensusAddress => { + if consensus_address__.is_some() { + return Err(serde::de::Error::duplicate_field("consensusAddress")); + } + consensus_address__ = Some(map_.next_value()?); + } + } + } + Ok(Equivocation { + height: height__.unwrap_or_default(), + time: time__, + power: power__.unwrap_or_default(), + consensus_address: consensus_address__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("cosmos.evidence.v1beta1.Equivocation", FIELDS, GeneratedVisitor) + } +} diff --git a/src/prost/interchain_security.ccv.consumer.v1.rs b/src/prost/interchain_security.ccv.consumer.v1.rs index 9e5254b3..4c7780e3 100644 --- a/src/prost/interchain_security.ccv.consumer.v1.rs +++ b/src/prost/interchain_security.ccv.consumer.v1.rs @@ -1,8 +1,331 @@ // This file is @generated by prost-build. -/// CrossChainValidator defines the type used to store validator information internal -/// to the consumer CCV module. Note one cross chain validator entry is persisted for -/// each consumer validator, where incoming VSC packets update this data, which is eventually -/// forwarded to comet for consumer chain consensus. +/// MsgUpdateParams is the Msg/UpdateParams request type +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParams { + /// signer is the address of the governance account. + #[prost(string, tag = "1")] + pub authority: ::prost::alloc::string::String, + /// params defines the x/provider parameters to update. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, +} +impl ::prost::Name for MsgUpdateParams { + const NAME: &'static str = "MsgUpdateParams"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.MsgUpdateParams".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.MsgUpdateParams".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} +impl ::prost::Name for MsgUpdateParamsResponse { + const NAME: &'static str = "MsgUpdateParamsResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.MsgUpdateParamsResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.MsgUpdateParamsResponse".into() + } +} +/// Generated client implementations. +#[cfg(feature = "client")] +pub mod msg_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /// Msg defines the Msg service. + #[derive(Debug, Clone)] + pub struct MsgClient { + inner: tonic::client::Grpc, + } + impl MsgClient { + /// 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 MsgClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + 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, + ) -> MsgClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + MsgClient::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 + } + pub async fn update_params( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.consumer.v1.Msg/UpdateParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.consumer.v1.Msg", + "UpdateParams", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +#[cfg(feature = "server")] +pub mod msg_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with MsgServer. + #[async_trait] + pub trait Msg: Send + Sync + 'static { + async fn update_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /// Msg defines the Msg service. + #[derive(Debug)] + pub struct MsgServer { + inner: Arc, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + impl MsgServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(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.max_decoding_message_size = Some(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.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for MsgServer + where + T: Msg, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + match req.uri().path() { + "/interchain_security.ccv.consumer.v1.Msg/UpdateParams" => { + #[allow(non_camel_case_types)] + struct UpdateParamsSvc(pub Arc); + impl tonic::server::UnaryService + for UpdateParamsSvc { + type Response = super::MsgUpdateParamsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_params(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = UpdateParamsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for MsgServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl tonic::server::NamedService for MsgServer { + const NAME: &'static str = "interchain_security.ccv.consumer.v1.Msg"; + } +} +/// CrossChainValidator defines the type used to store validator information +/// internal to the consumer CCV module. Note one cross chain validator entry is +/// persisted for each consumer validator, where incoming VSC packets update this +/// data, which is eventually forwarded to comet for consumer chain consensus. /// /// Note this type is only used internally to the consumer CCV module. #[allow(clippy::derive_partial_eq_without_eq)] @@ -15,6 +338,11 @@ pub struct CrossChainValidator { /// pubkey is the consensus public key of the validator, as a Protobuf Any. #[prost(message, optional, tag = "3")] pub pubkey: ::core::option::Option<::tendermint_proto::google::protobuf::Any>, + /// !!! DEPRECATED !!! opted_out is deprecated because after the introduction of Partial Set Security (PSS) + /// we removed the soft opt-out feature. + #[deprecated] + #[prost(bool, tag = "4")] + pub opted_out: bool, } impl ::prost::Name for CrossChainValidator { const NAME: &'static str = "CrossChainValidator"; @@ -69,7 +397,7 @@ pub struct NextFeeDistributionEstimate { /// total accruead fees at the time of querying #[prost(string, tag = "5")] pub total: ::prost::alloc::string::String, - /// amount distibuted to provider chain + /// amount distributed to provider chain #[prost(string, tag = "6")] pub to_provider: ::prost::alloc::string::String, /// amount distributed (kept) by consumer chain @@ -182,6 +510,39 @@ impl ::prost::Name for QueryProviderInfoResponse { } } #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct QueryThrottleStateRequest {} +impl ::prost::Name for QueryThrottleStateRequest { + const NAME: &'static str = "QueryThrottleStateRequest"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.QueryThrottleStateRequest".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.QueryThrottleStateRequest".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryThrottleStateResponse { + #[prost(message, optional, tag = "1")] + pub slash_record: ::core::option::Option, + #[prost(message, repeated, tag = "2")] + pub packet_data_queue: ::prost::alloc::vec::Vec< + super::super::v1::ConsumerPacketData, + >, +} +impl ::prost::Name for QueryThrottleStateResponse { + const NAME: &'static str = "QueryThrottleStateResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.QueryThrottleStateResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.QueryThrottleStateResponse".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ChainInfo { #[prost(string, tag = "1")] @@ -384,6 +745,37 @@ pub mod query_client { ); self.inner.unary(req, path, codec).await } + /// QueryThrottleState returns on-chain state relevant to throttled consumer packets + pub async fn query_throttle_state( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.consumer.v1.Query/QueryThrottleState", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.consumer.v1.Query", + "QueryThrottleState", + ), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -418,6 +810,14 @@ pub mod query_server { tonic::Response, tonic::Status, >; + /// QueryThrottleState returns on-chain state relevant to throttled consumer packets + async fn query_throttle_state( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } #[derive(Debug)] pub struct QueryServer { @@ -632,6 +1032,51 @@ pub mod query_server { }; Box::pin(fut) } + "/interchain_security.ccv.consumer.v1.Query/QueryThrottleState" => { + #[allow(non_camel_case_types)] + struct QueryThrottleStateSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService + for QueryThrottleStateSvc { + type Response = super::QueryThrottleStateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_throttle_state(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryThrottleStateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { Ok( @@ -666,3 +1111,174 @@ pub mod query_server { const NAME: &'static str = "interchain_security.ccv.consumer.v1.Query"; } } +/// GenesisState defines the CCV consumer genesis state +/// +/// Note: this type is only used on consumer side and references shared types with +/// provider +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GenesisState { + /// ConsumerParams is a shared type with provider module + #[prost(message, optional, tag = "1")] + pub params: ::core::option::Option, + /// Client ID of the provider. Empty for a new chain, filled in on restart. + #[prost(string, tag = "2")] + pub provider_client_id: ::prost::alloc::string::String, + /// Channel ID of the provider. Empty for a new chain, filled in on restart. + #[prost(string, tag = "3")] + pub provider_channel_id: ::prost::alloc::string::String, + /// true for new chain, false for chain restart. + #[prost(bool, tag = "4")] + pub new_chain: bool, + /// !!! DEPRECATED !!! ProviderClientState is deprecated. Use provider.client_state instead + #[deprecated] + #[prost(message, optional, tag = "5")] + pub provider_client_state: ::core::option::Option< + super::super::super::super::ibc::lightclients::tendermint::v1::ClientState, + >, + /// !!! DEPRECATED !!! ProviderConsensusState is deprecated. Use provider.consensus_state instead + #[deprecated] + #[prost(message, optional, tag = "6")] + pub provider_consensus_state: ::core::option::Option< + super::super::super::super::ibc::lightclients::tendermint::v1::ConsensusState, + >, + /// MaturingPackets nil on new chain, filled in on restart. + #[prost(message, repeated, tag = "7")] + pub maturing_packets: ::prost::alloc::vec::Vec, + /// !!! DEPRECATED !!!! InitialValset is deprecated. Use provider.initial_val_set instead + #[deprecated] + #[prost(message, repeated, tag = "8")] + pub initial_val_set: ::prost::alloc::vec::Vec< + ::tendermint_proto::abci::ValidatorUpdate, + >, + /// HeightToValsetUpdateId nil on new chain, filled in on restart. + #[prost(message, repeated, tag = "9")] + pub height_to_valset_update_id: ::prost::alloc::vec::Vec, + /// OutstandingDowntimes nil on new chain, filled in on restart. + #[prost(message, repeated, tag = "10")] + pub outstanding_downtime_slashing: ::prost::alloc::vec::Vec, + /// PendingConsumerPackets nil on new chain, filled in on restart. + #[prost(message, optional, tag = "11")] + pub pending_consumer_packets: ::core::option::Option, + /// LastTransmissionBlockHeight nil on new chain, filled in on restart. + #[prost(message, optional, tag = "12")] + pub last_transmission_block_height: ::core::option::Option< + LastTransmissionBlockHeight, + >, + /// flag indicating whether the consumer CCV module starts in pre-CCV state + #[prost(bool, tag = "13")] + pub pre_ccv: bool, + #[prost(message, optional, tag = "14")] + pub provider: ::core::option::Option, +} +impl ::prost::Name for GenesisState { + const NAME: &'static str = "GenesisState"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.GenesisState".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.GenesisState".into() + } +} +/// HeightValsetUpdateID represents a mapping internal to the consumer CCV module +/// which links a block height to each recv valset update id. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct HeightToValsetUpdateId { + #[prost(uint64, tag = "1")] + pub height: u64, + #[prost(uint64, tag = "2")] + pub valset_update_id: u64, +} +impl ::prost::Name for HeightToValsetUpdateId { + const NAME: &'static str = "HeightToValsetUpdateID"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.HeightToValsetUpdateID".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.HeightToValsetUpdateID".into() + } +} +/// OutstandingDowntime defines the type used internally to the consumer CCV +/// module and is used in order to not send multiple slashing requests for +/// the same downtime infraction. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct OutstandingDowntime { + #[prost(string, tag = "1")] + pub validator_consensus_address: ::prost::alloc::string::String, +} +impl ::prost::Name for OutstandingDowntime { + const NAME: &'static str = "OutstandingDowntime"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.OutstandingDowntime".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.OutstandingDowntime".into() + } +} +/// LastTransmissionBlockHeight is the last time validator holding +/// pools were transmitted to the provider chain. This type is used internally +/// to the consumer CCV module. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct LastTransmissionBlockHeight { + #[prost(int64, tag = "1")] + pub height: i64, +} +impl ::prost::Name for LastTransmissionBlockHeight { + const NAME: &'static str = "LastTransmissionBlockHeight"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.LastTransmissionBlockHeight".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.LastTransmissionBlockHeight".into() + } +} +/// MaturingVSCPacket represents a vsc packet that is maturing internal to the +/// consumer CCV module, where the consumer has not yet relayed a VSCMatured +/// packet back to the provider. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MaturingVscPacket { + #[prost(uint64, tag = "1")] + pub vsc_id: u64, + #[prost(message, optional, tag = "2")] + pub maturity_time: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, +} +impl ::prost::Name for MaturingVscPacket { + const NAME: &'static str = "MaturingVSCPacket"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.MaturingVSCPacket".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.MaturingVSCPacket".into() + } +} +/// ConsumerPacketDataList is a list of consumer packet data packets. +/// +/// Note this type is used internally to the consumer CCV module +/// for exporting / importing state in InitGenesis and ExportGenesis. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerPacketDataList { + #[prost(message, repeated, tag = "1")] + pub list: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ConsumerPacketDataList { + const NAME: &'static str = "ConsumerPacketDataList"; + const PACKAGE: &'static str = "interchain_security.ccv.consumer.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.consumer.v1.ConsumerPacketDataList".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.consumer.v1.ConsumerPacketDataList".into() + } +} diff --git a/src/prost/interchain_security.ccv.provider.v1.rs b/src/prost/interchain_security.ccv.provider.v1.rs index 5bfab6ae..6f96adc3 100644 --- a/src/prost/interchain_security.ccv.provider.v1.rs +++ b/src/prost/interchain_security.ccv.provider.v1.rs @@ -1,1528 +1,3565 @@ // This file is @generated by prost-build. +/// WARNING: This message is deprecated in favor of `MsgCreateConsumer`. +/// ConsumerAdditionProposal is a governance proposal on the provider chain to +/// spawn a new consumer chain. If it passes, then all validators on the provider +/// chain are expected to validate the consumer chain at spawn time or get +/// slashed. It is recommended that spawn time occurs after the proposal end +/// time. +/// Use MsgConsumerAddition to submit this proposal type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgAssignConsumerKey { - /// The chain id of the consumer chain to assign a consensus public key to +pub struct ConsumerAdditionProposal { + /// the title of the proposal #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - /// The validator address on the provider + pub title: ::prost::alloc::string::String, + /// the description of the proposal #[prost(string, tag = "2")] - pub provider_addr: ::prost::alloc::string::String, - /// The consensus public key to use on the consumer. - /// in json string format corresponding to proto-any, ex: - /// `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}` + pub description: ::prost::alloc::string::String, + /// the proposed chain-id of the new consumer chain, must be different from all + /// other consumer chain ids of the executing provider chain. #[prost(string, tag = "3")] - pub consumer_key: ::prost::alloc::string::String, + pub chain_id: ::prost::alloc::string::String, + /// the proposed initial height of new consumer chain. + /// For a completely new chain, this will be {0,1}. However, it may be + /// different if this is a chain that is converting to a consumer chain. + #[prost(message, optional, tag = "4")] + pub initial_height: ::core::option::Option< + super::super::super::super::ibc::core::client::v1::Height, + >, + /// The hash of the consumer chain genesis state without the consumer CCV + /// module genesis params. It is used for off-chain confirmation of + /// genesis.json validity by validators and other parties. + #[prost(bytes = "vec", tag = "5")] + pub genesis_hash: ::prost::alloc::vec::Vec, + /// The hash of the consumer chain binary that should be run by validators on + /// chain initialization. It is used for off-chain confirmation of binary + /// validity by validators and other parties. + #[prost(bytes = "vec", tag = "6")] + pub binary_hash: ::prost::alloc::vec::Vec, + /// spawn time is the time on the provider chain at which the consumer chain + /// genesis is finalized and all validators will be responsible for starting + /// their consumer chain validator node. + #[prost(message, optional, tag = "7")] + pub spawn_time: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, + /// Unbonding period for the consumer, + /// which should be smaller than that of the provider in general. + #[prost(message, optional, tag = "8")] + pub unbonding_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// Sent CCV related IBC packets will timeout after this duration + #[prost(message, optional, tag = "9")] + pub ccv_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// Sent transfer related IBC packets will timeout after this duration + #[prost(message, optional, tag = "10")] + pub transfer_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// The fraction of tokens allocated to the consumer redistribution address + /// during distribution events. The fraction is a string representing a + /// decimal number. For example "0.75" would represent 75%. + #[prost(string, tag = "11")] + pub consumer_redistribution_fraction: ::prost::alloc::string::String, + /// BlocksPerDistributionTransmission is the number of blocks between + /// ibc-token-transfers from the consumer chain to the provider chain. On + /// sending transmission event, `consumer_redistribution_fraction` of the + /// accumulated tokens are sent to the consumer redistribution address. + #[prost(int64, tag = "12")] + pub blocks_per_distribution_transmission: i64, + /// The number of historical info entries to persist in store. + /// This param is a part of the cosmos sdk staking module. In the case of + /// a ccv enabled consumer chain, the ccv module acts as the staking module. + #[prost(int64, tag = "13")] + pub historical_entries: i64, + /// The ID of a token transfer channel used for the Reward Distribution + /// sub-protocol. If DistributionTransmissionChannel == "", a new transfer + /// channel is created on top of the same connection as the CCV channel. + /// Note that transfer_channel_id is the ID of the channel end on the consumer + /// chain. it is most relevant for chains performing a sovereign to consumer + /// changeover in order to maintain the existing ibc transfer channel + #[prost(string, tag = "14")] + pub distribution_transmission_channel: ::prost::alloc::string::String, + /// Corresponds to the percentage of validators that have to validate the chain under the Top N case. + /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power + /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\]. + /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain. + #[prost(uint32, tag = "15")] + pub top_n: u32, + /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if + /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the + /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only + /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need + /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis. + #[prost(uint32, tag = "16")] + pub validators_power_cap: u32, + /// Corresponds to the maximum number of validators that can validate a consumer chain. + /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op. + #[prost(uint32, tag = "17")] + pub validator_set_cap: u32, + /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate + /// the consumer chain. + #[prost(string, repeated, tag = "18")] + pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain. + #[prost(string, repeated, tag = "19")] + pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain. + #[prost(uint64, tag = "20")] + pub min_stake: u64, + /// Corresponds to whether inactive validators are allowed to validate the consumer chain. + #[prost(bool, tag = "21")] + pub allow_inactive_vals: bool, } -impl ::prost::Name for MsgAssignConsumerKey { - const NAME: &'static str = "MsgAssignConsumerKey"; +impl ::prost::Name for ConsumerAdditionProposal { + const NAME: &'static str = "ConsumerAdditionProposal"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgAssignConsumerKey".into() + "interchain_security.ccv.provider.v1.ConsumerAdditionProposal".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgAssignConsumerKey".into() + "/interchain_security.ccv.provider.v1.ConsumerAdditionProposal".into() } } +/// WARNING: This message is deprecated in favor of `MsgRemoveConsumer`. +/// ConsumerRemovalProposal is a governance proposal on the provider chain to +/// remove (and stop) a consumer chain. If it passes, all the consumer chain's +/// state is removed from the provider chain. The outstanding unbonding operation +/// funds are released. +/// Use MsgConsumerRemoval to submit this proposal type. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct MsgAssignConsumerKeyResponse {} -impl ::prost::Name for MsgAssignConsumerKeyResponse { - const NAME: &'static str = "MsgAssignConsumerKeyResponse"; +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerRemovalProposal { + /// the title of the proposal + #[prost(string, tag = "1")] + pub title: ::prost::alloc::string::String, + /// the description of the proposal + #[prost(string, tag = "2")] + pub description: ::prost::alloc::string::String, + /// the chain-id of the consumer chain to be stopped + #[prost(string, tag = "3")] + pub chain_id: ::prost::alloc::string::String, + /// the time on the provider chain at which all validators are responsible to + /// stop their consumer chain validator node + #[prost(message, optional, tag = "4")] + pub stop_time: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, +} +impl ::prost::Name for ConsumerRemovalProposal { + const NAME: &'static str = "ConsumerRemovalProposal"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse".into() + "interchain_security.ccv.provider.v1.ConsumerRemovalProposal".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse".into() + "/interchain_security.ccv.provider.v1.ConsumerRemovalProposal".into() } } -/// MsgSubmitConsumerMisbehaviour defines a message that reports a light client attack, -/// also known as a misbehaviour, observed on a consumer chain +/// WARNING: This message is deprecated in favor of `MsgUpdateConsumer`. +/// ConsumerModificationProposal is a governance proposal on the provider chain to modify parameters of a running +/// consumer chain. If it passes, the consumer chain's state is updated to take into account the newest params. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgSubmitConsumerMisbehaviour { +pub struct ConsumerModificationProposal { + /// the title of the proposal #[prost(string, tag = "1")] - pub submitter: ::prost::alloc::string::String, - /// The Misbehaviour of the consumer chain wrapping - /// two conflicting IBC headers - #[prost(message, optional, tag = "2")] - pub misbehaviour: ::core::option::Option< - super::super::super::super::ibc::lightclients::tendermint::v1::Misbehaviour, - >, + pub title: ::prost::alloc::string::String, + /// the description of the proposal + #[prost(string, tag = "2")] + pub description: ::prost::alloc::string::String, + /// the chain-id of the consumer chain to be modified + #[prost(string, tag = "3")] + pub chain_id: ::prost::alloc::string::String, + /// Corresponds to the percentage of validators that have to validate the chain under the Top N case. + /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power + /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\]. + /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain. + #[prost(uint32, tag = "4")] + pub top_n: u32, + /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if + /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the + /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only + /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need + /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis. + #[prost(uint32, tag = "5")] + pub validators_power_cap: u32, + /// Corresponds to the maximum number of validators that can validate a consumer chain. + /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op. + #[prost(uint32, tag = "6")] + pub validator_set_cap: u32, + /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate + /// the consumer chain. + #[prost(string, repeated, tag = "7")] + pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain. + #[prost(string, repeated, tag = "8")] + pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain. + #[prost(uint64, tag = "9")] + pub min_stake: u64, + /// Corresponds to whether inactive validators are allowed to validate the consumer chain. + #[prost(bool, tag = "10")] + pub allow_inactive_vals: bool, } -impl ::prost::Name for MsgSubmitConsumerMisbehaviour { - const NAME: &'static str = "MsgSubmitConsumerMisbehaviour"; +impl ::prost::Name for ConsumerModificationProposal { + const NAME: &'static str = "ConsumerModificationProposal"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviour".into() + "interchain_security.ccv.provider.v1.ConsumerModificationProposal".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviour".into() + "/interchain_security.ccv.provider.v1.ConsumerModificationProposal".into() } } +/// EquivocationProposal is a governance proposal on the provider chain to +/// punish a validator for equivocation on a consumer chain. +/// +/// This type is only used internally to the consumer CCV module. +/// WARNING: This message is deprecated now that equivocations can be submitted +/// and verified automatically on the provider. (see SubmitConsumerDoubleVoting in proto/interchain-security/ccv/provider/v1/tx.proto). #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct MsgSubmitConsumerMisbehaviourResponse {} -impl ::prost::Name for MsgSubmitConsumerMisbehaviourResponse { - const NAME: &'static str = "MsgSubmitConsumerMisbehaviourResponse"; +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EquivocationProposal { + /// the title of the proposal + #[prost(string, tag = "1")] + pub title: ::prost::alloc::string::String, + /// the description of the proposal + #[prost(string, tag = "2")] + pub description: ::prost::alloc::string::String, + /// the list of equivocations that will be processed + #[prost(message, repeated, tag = "3")] + pub equivocations: ::prost::alloc::vec::Vec< + super::super::super::super::cosmos::evidence::v1beta1::Equivocation, + >, +} +impl ::prost::Name for EquivocationProposal { + const NAME: &'static str = "EquivocationProposal"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviourResponse" - .into() + "interchain_security.ccv.provider.v1.EquivocationProposal".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviourResponse" - .into() + "/interchain_security.ccv.provider.v1.EquivocationProposal".into() } } -/// MsgSubmitConsumerDoubleVoting defines a message that reports -/// a double signing infraction observed on a consumer chain +/// ChangeRewardDenomsProposal is a governance proposal on the provider chain to +/// mutate the set of denoms accepted by the provider as rewards. +/// Use MsgChangeRewardDenoms to submit this proposal type. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MsgSubmitConsumerDoubleVoting { +pub struct ChangeRewardDenomsProposal { + /// the title of the proposal #[prost(string, tag = "1")] - pub submitter: ::prost::alloc::string::String, - /// The equivocation of the consumer chain wrapping - /// an evidence of a validator that signed two conflicting votes - #[prost(message, optional, tag = "2")] - pub duplicate_vote_evidence: ::core::option::Option< - ::tendermint_proto::types::DuplicateVoteEvidence, - >, - /// The light client header of the infraction block - #[prost(message, optional, tag = "3")] - pub infraction_block_header: ::core::option::Option< - super::super::super::super::ibc::lightclients::tendermint::v1::Header, - >, + pub title: ::prost::alloc::string::String, + /// the description of the proposal + #[prost(string, tag = "2")] + pub description: ::prost::alloc::string::String, + /// the list of consumer reward denoms to add + #[prost(string, repeated, tag = "3")] + pub denoms_to_add: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// the list of consumer reward denoms to remove + #[prost(string, repeated, tag = "4")] + pub denoms_to_remove: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -impl ::prost::Name for MsgSubmitConsumerDoubleVoting { - const NAME: &'static str = "MsgSubmitConsumerDoubleVoting"; +impl ::prost::Name for ChangeRewardDenomsProposal { + const NAME: &'static str = "ChangeRewardDenomsProposal"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVoting".into() + "interchain_security.ccv.provider.v1.ChangeRewardDenomsProposal".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVoting".into() + "/interchain_security.ccv.provider.v1.ChangeRewardDenomsProposal".into() } } +/// A persisted queue entry indicating that a slash packet data instance needs to +/// be handled. This type belongs in the "global" queue, to coordinate slash +/// packet handling times between consumers. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct MsgSubmitConsumerDoubleVotingResponse {} -impl ::prost::Name for MsgSubmitConsumerDoubleVotingResponse { - const NAME: &'static str = "MsgSubmitConsumerDoubleVotingResponse"; +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GlobalSlashEntry { + /// Block time that slash packet was received by provider chain. + /// This field is used for store key iteration ordering. + #[prost(message, optional, tag = "1")] + pub recv_time: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, + /// The consumer that sent a slash packet. + #[prost(string, tag = "2")] + pub consumer_chain_id: ::prost::alloc::string::String, + /// The IBC sequence number of the recv packet. + /// This field is used in the store key to ensure uniqueness. + #[prost(uint64, tag = "3")] + pub ibc_seq_num: u64, + /// The provider's consensus address of the validator being slashed. + /// This field is used to obtain validator power in HandleThrottleQueues. + /// + /// This field is not used in the store key, but is persisted in value bytes, + /// see QueueGlobalSlashEntry. + #[prost(bytes = "vec", tag = "4")] + pub provider_val_cons_addr: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for GlobalSlashEntry { + const NAME: &'static str = "GlobalSlashEntry"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVotingResponse" - .into() + "interchain_security.ccv.provider.v1.GlobalSlashEntry".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVotingResponse" - .into() + "/interchain_security.ccv.provider.v1.GlobalSlashEntry".into() } } -/// Generated client implementations. -#[cfg(feature = "client")] -pub mod msg_client { - #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] - use tonic::codegen::*; - use tonic::codegen::http::Uri; - /// Msg defines the Msg service. - #[derive(Debug, Clone)] - pub struct MsgClient { - inner: tonic::client::Grpc, - } - impl MsgClient { - /// 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)) - } +/// Params defines the parameters for CCV Provider module +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Params { + #[prost(message, optional, tag = "1")] + pub template_client: ::core::option::Option< + super::super::super::super::ibc::lightclients::tendermint::v1::ClientState, + >, + /// TrustingPeriodFraction is used to compute the consumer and provider IBC + /// client's TrustingPeriod from the chain defined UnbondingPeriod + #[prost(string, tag = "2")] + pub trusting_period_fraction: ::prost::alloc::string::String, + /// Sent IBC packets will timeout after this duration + #[prost(message, optional, tag = "3")] + pub ccv_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// The period for which the slash meter is replenished + #[prost(message, optional, tag = "6")] + pub slash_meter_replenish_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// The fraction of total voting power that is replenished to the slash meter + /// every replenish period. This param also serves as a maximum fraction of + /// total voting power that the slash meter can hold. + #[prost(string, tag = "7")] + pub slash_meter_replenish_fraction: ::prost::alloc::string::String, + /// The fee required to be paid to add a reward denom + #[prost(message, optional, tag = "9")] + pub consumer_reward_denom_registration_fee: ::core::option::Option< + super::super::super::super::cosmos::base::v1beta1::Coin, + >, + /// The number of blocks that comprise an epoch. + #[prost(int64, tag = "10")] + pub blocks_per_epoch: i64, + /// The number of epochs a validator has to validate a consumer chain in order to start receiving rewards from that chain. + #[prost(int64, tag = "11")] + pub number_of_epochs_to_start_receiving_rewards: i64, + /// The maximal number of validators that will be passed + /// to the consensus engine on the provider. + #[prost(int64, tag = "12")] + pub max_provider_consensus_validators: i64, +} +impl ::prost::Name for Params { + const NAME: &'static str = "Params"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.Params".into() } - impl MsgClient - where - T: tonic::client::GrpcService, - T::Error: Into, - T::ResponseBody: Body + Send + 'static, - ::Error: Into + 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, - ) -> MsgClient> - where - F: tonic::service::Interceptor, - T::ResponseBody: Default, - T: tonic::codegen::Service< - http::Request, - Response = http::Response< - >::ResponseBody, - >, - >, - , - >>::Error: Into + Send + Sync, - { - MsgClient::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 - } - pub async fn assign_consumer_key( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Msg/AssignConsumerKey", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "interchain_security.ccv.provider.v1.Msg", - "AssignConsumerKey", - ), - ); - self.inner.unary(req, path, codec).await - } - pub async fn submit_consumer_misbehaviour( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerMisbehaviour", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "interchain_security.ccv.provider.v1.Msg", - "SubmitConsumerMisbehaviour", - ), - ); - self.inner.unary(req, path, codec).await - } - pub async fn submit_consumer_double_voting( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerDoubleVoting", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "interchain_security.ccv.provider.v1.Msg", - "SubmitConsumerDoubleVoting", - ), - ); - self.inner.unary(req, path, codec).await - } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.Params".into() } } -/// Generated server implementations. -#[cfg(feature = "server")] -pub mod msg_server { - #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] - use tonic::codegen::*; - /// Generated trait containing gRPC methods that should be implemented for use with MsgServer. - #[async_trait] - pub trait Msg: Send + Sync + 'static { - async fn assign_consumer_key( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn submit_consumer_misbehaviour( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn submit_consumer_double_voting( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; +/// SlashAcks contains cons addresses of consumer chain validators +/// successfully slashed on the provider chain. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SlashAcks { + #[prost(string, repeated, tag = "1")] + pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +impl ::prost::Name for SlashAcks { + const NAME: &'static str = "SlashAcks"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.SlashAcks".into() } - /// Msg defines the Msg service. - #[derive(Debug)] - pub struct MsgServer { - inner: Arc, - accept_compression_encodings: EnabledCompressionEncodings, - send_compression_encodings: EnabledCompressionEncodings, - max_decoding_message_size: Option, - max_encoding_message_size: Option, + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.SlashAcks".into() } - impl MsgServer { - pub fn new(inner: T) -> Self { - Self::from_arc(Arc::new(inner)) - } - pub fn from_arc(inner: Arc) -> Self { - Self { - inner, - accept_compression_encodings: Default::default(), - send_compression_encodings: Default::default(), - max_decoding_message_size: None, - max_encoding_message_size: None, - } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> InterceptedService - where - F: tonic::service::Interceptor, - { - InterceptedService::new(Self::new(inner), interceptor) - } - /// Enable decompressing requests with the given encoding. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.accept_compression_encodings.enable(encoding); - self - } - /// Compress responses with the given encoding, if the client supports it. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.send_compression_encodings.enable(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.max_decoding_message_size = Some(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.max_encoding_message_size = Some(limit); - self - } - } - impl tonic::codegen::Service> for MsgServer - where - T: Msg, - B: Body + Send + 'static, - B::Error: Into + Send + 'static, - { - type Response = http::Response; - type Error = std::convert::Infallible; - type Future = BoxFuture; - fn poll_ready( - &mut self, - _cx: &mut Context<'_>, - ) -> Poll> { - Poll::Ready(Ok(())) - } - fn call(&mut self, req: http::Request) -> Self::Future { - match req.uri().path() { - "/interchain_security.ccv.provider.v1.Msg/AssignConsumerKey" => { - #[allow(non_camel_case_types)] - struct AssignConsumerKeySvc(pub Arc); - impl tonic::server::UnaryService - for AssignConsumerKeySvc { - type Response = super::MsgAssignConsumerKeyResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::assign_consumer_key(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = AssignConsumerKeySvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerMisbehaviour" => { - #[allow(non_camel_case_types)] - struct SubmitConsumerMisbehaviourSvc(pub Arc); - impl< - T: Msg, - > tonic::server::UnaryService - for SubmitConsumerMisbehaviourSvc { - type Response = super::MsgSubmitConsumerMisbehaviourResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::submit_consumer_misbehaviour(&inner, request) - .await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = SubmitConsumerMisbehaviourSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerDoubleVoting" => { - #[allow(non_camel_case_types)] - struct SubmitConsumerDoubleVotingSvc(pub Arc); - impl< - T: Msg, - > tonic::server::UnaryService - for SubmitConsumerDoubleVotingSvc { - type Response = super::MsgSubmitConsumerDoubleVotingResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::submit_consumer_double_voting(&inner, request) - .await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = SubmitConsumerDoubleVotingSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - _ => { - Box::pin(async move { - Ok( - http::Response::builder() - .status(200) - .header("grpc-status", tonic::Code::Unimplemented as i32) - .header( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ) - .body(empty_body()) - .unwrap(), - ) - }) - } - } - } - } - impl Clone for MsgServer { - fn clone(&self) -> Self { - let inner = self.inner.clone(); - Self { - inner, - accept_compression_encodings: self.accept_compression_encodings, - send_compression_encodings: self.send_compression_encodings, - max_decoding_message_size: self.max_decoding_message_size, - max_encoding_message_size: self.max_encoding_message_size, - } - } +} +/// ConsumerAdditionProposals holds pending governance proposals on the provider +/// chain to spawn a new chain. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerAdditionProposals { + /// proposals waiting for spawn_time to pass + #[prost(message, repeated, tag = "1")] + pub pending: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ConsumerAdditionProposals { + const NAME: &'static str = "ConsumerAdditionProposals"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ConsumerAdditionProposals".into() } - impl tonic::server::NamedService for MsgServer { - const NAME: &'static str = "interchain_security.ccv.provider.v1.Msg"; + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ConsumerAdditionProposals".into() } } -/// ConsumerAdditionProposal is a governance proposal on the provider chain to -/// spawn a new consumer chain. If it passes, then all validators on the provider -/// chain are expected to validate the consumer chain at spawn time or get -/// slashed. It is recommended that spawn time occurs after the proposal end -/// time. +/// ConsumerRemovalProposals holds pending governance proposals on the provider +/// chain to remove (and stop) a consumer chain. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerAdditionProposal { - /// the title of the proposal +pub struct ConsumerRemovalProposals { + /// proposals waiting for stop_time to pass + #[prost(message, repeated, tag = "1")] + pub pending: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ConsumerRemovalProposals { + const NAME: &'static str = "ConsumerRemovalProposals"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ConsumerRemovalProposals".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ConsumerRemovalProposals".into() + } +} +/// AddressList contains a list of consensus addresses +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AddressList { + #[prost(bytes = "vec", repeated, tag = "1")] + pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, +} +impl ::prost::Name for AddressList { + const NAME: &'static str = "AddressList"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.AddressList".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.AddressList".into() + } +} +/// WARNING: This message is deprecated and is not used. +/// ChannelToChain is used to map a CCV channel ID to the consumer chainID +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ChannelToChain { #[prost(string, tag = "1")] - pub title: ::prost::alloc::string::String, - /// the description of the proposal + pub channel_id: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub chain_id: ::prost::alloc::string::String, +} +impl ::prost::Name for ChannelToChain { + const NAME: &'static str = "ChannelToChain"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ChannelToChain".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ChannelToChain".into() + } +} +/// ValidatorSetChangePackets is a pb list of ccv.ValidatorSetChangePacketData. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ValidatorSetChangePackets { + #[prost(message, repeated, tag = "1")] + pub list: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ValidatorSetChangePackets { + const NAME: &'static str = "ValidatorSetChangePackets"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ValidatorSetChangePackets".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ValidatorSetChangePackets".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct KeyAssignmentReplacement { + #[prost(bytes = "vec", tag = "1")] + pub provider_addr: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "2")] + pub prev_c_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, + #[prost(int64, tag = "3")] + pub power: i64, +} +impl ::prost::Name for KeyAssignmentReplacement { + const NAME: &'static str = "KeyAssignmentReplacement"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.KeyAssignmentReplacement".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.KeyAssignmentReplacement".into() + } +} +/// Used to serialize the ValidatorConsumerPubKey index from key assignment +/// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey +/// tmprotocrypto.PublicKey +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ValidatorConsumerPubKey { + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub provider_addr: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "3")] + pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, +} +impl ::prost::Name for ValidatorConsumerPubKey { + const NAME: &'static str = "ValidatorConsumerPubKey"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ValidatorConsumerPubKey".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ValidatorConsumerPubKey".into() + } +} +/// Used to serialize the ValidatorConsumerAddr index from key assignment +/// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr +/// consAddr +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ValidatorByConsumerAddr { + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub consumer_addr: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "3")] + pub provider_addr: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for ValidatorByConsumerAddr { + const NAME: &'static str = "ValidatorByConsumerAddr"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ValidatorByConsumerAddr".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ValidatorByConsumerAddr".into() + } +} +/// Used to serialize the ConsumerAddrsToPruneV2 index from key assignment +/// ConsumerAddrsToPruneV2: (chainID, pruneTs time.Time) -> consumerAddrs AddressList +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerAddrsToPruneV2 { + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + #[prost(message, optional, tag = "2")] + pub prune_ts: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, + #[prost(message, optional, tag = "3")] + pub consumer_addrs: ::core::option::Option, +} +impl ::prost::Name for ConsumerAddrsToPruneV2 { + const NAME: &'static str = "ConsumerAddrsToPruneV2"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ConsumerAddrsToPruneV2".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ConsumerAddrsToPruneV2".into() + } +} +/// ConsensusValidator is used to express a validator that +/// should be validating on a chain. +/// It contains relevant info for +/// a validator that is expected to validate on +/// either the provider or a consumer chain. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsensusValidator { + /// validator's consensus address on the provider chain + #[prost(bytes = "vec", tag = "1")] + pub provider_cons_addr: ::prost::alloc::vec::Vec, + /// voting power the validator has during this epoch + #[prost(int64, tag = "2")] + pub power: i64, + /// public key the validator uses on the consumer chain during this epoch + #[prost(message, optional, tag = "3")] + pub public_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, + /// height the validator had when it FIRST became a consumer validator + /// If a validator becomes a consumer validator at height `H` and is continuously a consumer validator for all the upcoming + /// epochs, then the height of the validator SHOULD remain `H`. This height only resets to a different height if a validator + /// stops being a consumer validator during an epoch and later becomes again a consumer validator. + #[prost(int64, tag = "4")] + pub join_height: i64, +} +impl ::prost::Name for ConsensusValidator { + const NAME: &'static str = "ConsensusValidator"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ConsensusValidator".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ConsensusValidator".into() + } +} +/// ConsumerRewardsAllocation stores the rewards allocated by a consumer chain +/// to the consumer rewards pool. It is used to allocate the tokens to the consumer +/// opted-in validators and the community pool during BeginBlock. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerRewardsAllocation { + #[prost(message, repeated, tag = "1")] + pub rewards: ::prost::alloc::vec::Vec< + super::super::super::super::cosmos::base::v1beta1::DecCoin, + >, +} +impl ::prost::Name for ConsumerRewardsAllocation { + const NAME: &'static str = "ConsumerRewardsAllocation"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ConsumerRewardsAllocation".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ConsumerRewardsAllocation".into() + } +} +/// ConsumerMetadata contains general information about the registered chain +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerMetadata { + /// the name of the chain + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// the description of the chain #[prost(string, tag = "2")] pub description: ::prost::alloc::string::String, - /// the proposed chain-id of the new consumer chain, must be different from all - /// other consumer chain ids of the executing provider chain. + /// the metadata (e.g., GitHub repository URL) of the chain #[prost(string, tag = "3")] - pub chain_id: ::prost::alloc::string::String, + pub metadata: ::prost::alloc::string::String, +} +impl ::prost::Name for ConsumerMetadata { + const NAME: &'static str = "ConsumerMetadata"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.ConsumerMetadata".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.ConsumerMetadata".into() + } +} +/// ConsumerInitializationParameters are the parameters needed to launch a chain +/// +/// ---------- ---------- ---------- +/// Following fields are used when the consumer chain launches and are not needed by the provider afterwards. +/// ---------- ---------- ---------- +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerInitializationParameters { /// the proposed initial height of new consumer chain. /// For a completely new chain, this will be {0,1}. However, it may be /// different if this is a chain that is converting to a consumer chain. - #[prost(message, optional, tag = "4")] + #[prost(message, optional, tag = "1")] pub initial_height: ::core::option::Option< super::super::super::super::ibc::core::client::v1::Height, >, /// The hash of the consumer chain genesis state without the consumer CCV /// module genesis params. It is used for off-chain confirmation of /// genesis.json validity by validators and other parties. - #[prost(bytes = "vec", tag = "5")] + #[prost(bytes = "vec", tag = "2")] pub genesis_hash: ::prost::alloc::vec::Vec, /// The hash of the consumer chain binary that should be run by validators on /// chain initialization. It is used for off-chain confirmation of binary /// validity by validators and other parties. - #[prost(bytes = "vec", tag = "6")] + #[prost(bytes = "vec", tag = "3")] pub binary_hash: ::prost::alloc::vec::Vec, /// spawn time is the time on the provider chain at which the consumer chain /// genesis is finalized and all validators will be responsible for starting /// their consumer chain validator node. - #[prost(message, optional, tag = "7")] + #[prost(message, optional, tag = "4")] pub spawn_time: ::core::option::Option< ::tendermint_proto::google::protobuf::Timestamp, >, /// Unbonding period for the consumer, /// which should be smaller than that of the provider in general. - #[prost(message, optional, tag = "8")] + #[prost(message, optional, tag = "5")] pub unbonding_period: ::core::option::Option< ::tendermint_proto::google::protobuf::Duration, >, /// Sent CCV related IBC packets will timeout after this duration - #[prost(message, optional, tag = "9")] + #[prost(message, optional, tag = "6")] pub ccv_timeout_period: ::core::option::Option< ::tendermint_proto::google::protobuf::Duration, >, /// Sent transfer related IBC packets will timeout after this duration - #[prost(message, optional, tag = "10")] + #[prost(message, optional, tag = "7")] pub transfer_timeout_period: ::core::option::Option< ::tendermint_proto::google::protobuf::Duration, >, /// The fraction of tokens allocated to the consumer redistribution address /// during distribution events. The fraction is a string representing a /// decimal number. For example "0.75" would represent 75%. - #[prost(string, tag = "11")] + #[prost(string, tag = "8")] pub consumer_redistribution_fraction: ::prost::alloc::string::String, /// BlocksPerDistributionTransmission is the number of blocks between /// ibc-token-transfers from the consumer chain to the provider chain. On /// sending transmission event, `consumer_redistribution_fraction` of the /// accumulated tokens are sent to the consumer redistribution address. - #[prost(int64, tag = "12")] + #[prost(int64, tag = "9")] pub blocks_per_distribution_transmission: i64, /// The number of historical info entries to persist in store. /// This param is a part of the cosmos sdk staking module. In the case of /// a ccv enabled consumer chain, the ccv module acts as the staking module. - #[prost(int64, tag = "13")] + #[prost(int64, tag = "10")] pub historical_entries: i64, /// The ID of a token transfer channel used for the Reward Distribution /// sub-protocol. If DistributionTransmissionChannel == "", a new transfer /// channel is created on top of the same connection as the CCV channel. /// Note that transfer_channel_id is the ID of the channel end on the consumer /// chain. it is most relevant for chains performing a sovereign to consumer - /// changeover in order to maintan the existing ibc transfer channel - #[prost(string, tag = "14")] + /// changeover in order to maintain the existing ibc transfer channel + #[prost(string, tag = "11")] pub distribution_transmission_channel: ::prost::alloc::string::String, } -impl ::prost::Name for ConsumerAdditionProposal { - const NAME: &'static str = "ConsumerAdditionProposal"; +impl ::prost::Name for ConsumerInitializationParameters { + const NAME: &'static str = "ConsumerInitializationParameters"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ConsumerAdditionProposal".into() + "interchain_security.ccv.provider.v1.ConsumerInitializationParameters".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ConsumerAdditionProposal".into() + "/interchain_security.ccv.provider.v1.ConsumerInitializationParameters".into() } } -/// ConsumerRemovalProposal is a governance proposal on the provider chain to -/// remove (and stop) a consumer chain. If it passes, all the consumer chain's -/// state is removed from the provider chain. The outstanding unbonding operation -/// funds are released. +/// PowerShapingParameters contains parameters that shape the validator set that we send to the consumer chain #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerRemovalProposal { - /// the title of the proposal - #[prost(string, tag = "1")] - pub title: ::prost::alloc::string::String, - /// the description of the proposal - #[prost(string, tag = "2")] - pub description: ::prost::alloc::string::String, - /// the chain-id of the consumer chain to be stopped - #[prost(string, tag = "3")] - pub chain_id: ::prost::alloc::string::String, - /// the time on the provider chain at which all validators are responsible to - /// stop their consumer chain validator node - #[prost(message, optional, tag = "4")] - pub stop_time: ::core::option::Option< - ::tendermint_proto::google::protobuf::Timestamp, - >, +pub struct PowerShapingParameters { + /// Corresponds to the percentage of validators that have to validate the chain under the Top N case. + /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power + /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\]. + /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain. + #[prost(uint32, tag = "1")] + pub top_n: u32, + /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if + /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the + /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only + /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need + /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis. + #[prost(uint32, tag = "2")] + pub validators_power_cap: u32, + /// Corresponds to the maximum number of validators that can validate a consumer chain. + /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op. + #[prost(uint32, tag = "3")] + pub validator_set_cap: u32, + /// corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate the consumer chain + #[prost(string, repeated, tag = "4")] + pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain + #[prost(string, repeated, tag = "5")] + pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain. + #[prost(uint64, tag = "6")] + pub min_stake: u64, + /// Corresponds to whether inactive validators are allowed to validate the consumer chain. + #[prost(bool, tag = "7")] + pub allow_inactive_vals: bool, } -impl ::prost::Name for ConsumerRemovalProposal { - const NAME: &'static str = "ConsumerRemovalProposal"; +impl ::prost::Name for PowerShapingParameters { + const NAME: &'static str = "PowerShapingParameters"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ConsumerRemovalProposal".into() + "interchain_security.ccv.provider.v1.PowerShapingParameters".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ConsumerRemovalProposal".into() + "/interchain_security.ccv.provider.v1.PowerShapingParameters".into() } } -/// ChangeRewardDenomsProposal is a governance proposal on the provider chain to -/// mutate the set of denoms accepted by the provider as rewards. +/// ConsumerIds contains consumer ids of chains +/// Used so we can easily (de)serialize slices of strings #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ChangeRewardDenomsProposal { - /// the title of the proposal - #[prost(string, tag = "1")] - pub title: ::prost::alloc::string::String, - /// the description of the proposal - #[prost(string, tag = "2")] - pub description: ::prost::alloc::string::String, - /// the list of consumer reward denoms to add - #[prost(string, repeated, tag = "3")] - pub denoms_to_add: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - /// the list of consumer reward denoms to remove - #[prost(string, repeated, tag = "4")] - pub denoms_to_remove: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +pub struct ConsumerIds { + #[prost(string, repeated, tag = "1")] + pub ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -impl ::prost::Name for ChangeRewardDenomsProposal { - const NAME: &'static str = "ChangeRewardDenomsProposal"; +impl ::prost::Name for ConsumerIds { + const NAME: &'static str = "ConsumerIds"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ChangeRewardDenomsProposal".into() + "interchain_security.ccv.provider.v1.ConsumerIds".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ChangeRewardDenomsProposal".into() + "/interchain_security.ccv.provider.v1.ConsumerIds".into() + } +} +/// ConsumerPhase indicates the phases of a consumer chain according to ADR 019 +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum ConsumerPhase { + /// UNSPECIFIED defines an empty phase. + Unspecified = 0, + /// REGISTERED defines the phase in which a consumer chain has been assigned a unique consumer id. + /// A chain in this phase cannot yet launch. + Registered = 1, + /// INITIALIZED defines the phase in which a consumer chain has set all the needed parameters to launch but + /// has not yet launched (e.g., because the `spawnTime` of the consumer chain has not yet been reached). + Initialized = 2, + /// LAUNCHED defines the phase in which a consumer chain is running and consuming a subset of the validator + /// set of the provider. + Launched = 3, + /// STOPPED defines the phase in which a previously-launched chain has stopped. + Stopped = 4, + /// DELETED defines the phase in which the state of a stopped chain has been deleted. + Deleted = 5, +} +impl ConsumerPhase { + /// 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 { + ConsumerPhase::Unspecified => "CONSUMER_PHASE_UNSPECIFIED", + ConsumerPhase::Registered => "CONSUMER_PHASE_REGISTERED", + ConsumerPhase::Initialized => "CONSUMER_PHASE_INITIALIZED", + ConsumerPhase::Launched => "CONSUMER_PHASE_LAUNCHED", + ConsumerPhase::Stopped => "CONSUMER_PHASE_STOPPED", + ConsumerPhase::Deleted => "CONSUMER_PHASE_DELETED", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CONSUMER_PHASE_UNSPECIFIED" => Some(Self::Unspecified), + "CONSUMER_PHASE_REGISTERED" => Some(Self::Registered), + "CONSUMER_PHASE_INITIALIZED" => Some(Self::Initialized), + "CONSUMER_PHASE_LAUNCHED" => Some(Self::Launched), + "CONSUMER_PHASE_STOPPED" => Some(Self::Stopped), + "CONSUMER_PHASE_DELETED" => Some(Self::Deleted), + _ => None, + } } } -/// A persisted queue entry indicating that a slash packet data instance needs to -/// be handled. This type belongs in the "global" queue, to coordinate slash -/// packet handling times between consumers. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct GlobalSlashEntry { - /// Block time that slash packet was received by provider chain. - /// This field is used for store key iteration ordering. - #[prost(message, optional, tag = "1")] - pub recv_time: ::core::option::Option< - ::tendermint_proto::google::protobuf::Timestamp, - >, - /// The consumer that sent a slash packet. +pub struct MsgAssignConsumerKey { + /// \[DEPRECATED\] use `consumer_id` instead + #[deprecated] + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + /// The validator address on the provider #[prost(string, tag = "2")] - pub consumer_chain_id: ::prost::alloc::string::String, - /// The IBC sequence number of the recv packet. - /// This field is used in the store key to ensure uniqueness. - #[prost(uint64, tag = "3")] - pub ibc_seq_num: u64, - /// The provider's consensus address of the validator being slashed. - /// This field is used to obtain validator power in HandleThrottleQueues. - /// - /// This field is not used in the store key, but is persisted in value bytes, - /// see QueueGlobalSlashEntry. - #[prost(bytes = "vec", tag = "4")] - pub provider_val_cons_addr: ::prost::alloc::vec::Vec, + pub provider_addr: ::prost::alloc::string::String, + /// The consensus public key to use on the consumer. + /// in json string format corresponding to proto-any, ex: + /// `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}` + #[prost(string, tag = "3")] + pub consumer_key: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub submitter: ::prost::alloc::string::String, + /// the consumer id of the consumer chain to assign a consensus public key to + #[prost(string, tag = "5")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for GlobalSlashEntry { - const NAME: &'static str = "GlobalSlashEntry"; +impl ::prost::Name for MsgAssignConsumerKey { + const NAME: &'static str = "MsgAssignConsumerKey"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.GlobalSlashEntry".into() + "interchain_security.ccv.provider.v1.MsgAssignConsumerKey".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.GlobalSlashEntry".into() + "/interchain_security.ccv.provider.v1.MsgAssignConsumerKey".into() } } -/// Params defines the parameters for CCV Provider module +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgAssignConsumerKeyResponse {} +impl ::prost::Name for MsgAssignConsumerKeyResponse { + const NAME: &'static str = "MsgAssignConsumerKeyResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse".into() + } +} +/// MsgSubmitConsumerMisbehaviour defines a message that reports a light client attack, +/// also known as a misbehaviour, observed on a consumer chain #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct Params { - #[prost(message, optional, tag = "1")] - pub template_client: ::core::option::Option< - super::super::super::super::ibc::lightclients::tendermint::v1::ClientState, - >, - /// TrustingPeriodFraction is used to compute the consumer and provider IBC - /// client's TrustingPeriod from the chain defined UnbondingPeriod - #[prost(string, tag = "2")] - pub trusting_period_fraction: ::prost::alloc::string::String, - /// Sent IBC packets will timeout after this duration - #[prost(message, optional, tag = "3")] - pub ccv_timeout_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// The channel initialization (IBC channel opening handshake) will timeout - /// after this duration - #[prost(message, optional, tag = "4")] - pub init_timeout_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// The VSC packets sent by the provider will timeout after this duration. - /// Note that unlike ccv_timeout_period which is an IBC param, - /// the vsc_timeout_period is a provider-side param that enables the provider - /// to timeout VSC packets even when a consumer chain is not live. - #[prost(message, optional, tag = "5")] - pub vsc_timeout_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// The period for which the slash meter is replenished - #[prost(message, optional, tag = "6")] - pub slash_meter_replenish_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// The fraction of total voting power that is replenished to the slash meter - /// every replenish period. This param also serves as a maximum fraction of - /// total voting power that the slash meter can hold. - #[prost(string, tag = "7")] - pub slash_meter_replenish_fraction: ::prost::alloc::string::String, - /// The maximum amount of throttled slash or vsc matured packets - /// that can be queued for a single consumer before the provider chain halts. - #[prost(int64, tag = "8")] - pub max_throttled_packets: i64, - /// The fee required to be paid to add a reward denom - #[prost(message, optional, tag = "9")] - pub consumer_reward_denom_registration_fee: ::core::option::Option< - super::super::super::super::cosmos::base::v1beta1::Coin, +pub struct MsgSubmitConsumerMisbehaviour { + #[prost(string, tag = "1")] + pub submitter: ::prost::alloc::string::String, + /// The Misbehaviour of the consumer chain wrapping + /// two conflicting IBC headers + #[prost(message, optional, tag = "2")] + pub misbehaviour: ::core::option::Option< + super::super::super::super::ibc::lightclients::tendermint::v1::Misbehaviour, >, + /// the consumer id of the consumer chain where the misbehaviour occurred + #[prost(string, tag = "3")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for Params { - const NAME: &'static str = "Params"; +impl ::prost::Name for MsgSubmitConsumerMisbehaviour { + const NAME: &'static str = "MsgSubmitConsumerMisbehaviour"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.Params".into() + "interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviour".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.Params".into() + "/interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviour".into() } } -/// SlashAcks contains cons addresses of consumer chain validators -/// successfully slashed on the provider chain. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct SlashAcks { - #[prost(string, repeated, tag = "1")] - pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -impl ::prost::Name for SlashAcks { - const NAME: &'static str = "SlashAcks"; +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgSubmitConsumerMisbehaviourResponse {} +impl ::prost::Name for MsgSubmitConsumerMisbehaviourResponse { + const NAME: &'static str = "MsgSubmitConsumerMisbehaviourResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.SlashAcks".into() + "interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviourResponse" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.SlashAcks".into() + "/interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviourResponse" + .into() } } -/// ConsumerAdditionProposals holds pending governance proposals on the provider -/// chain to spawn a new chain. +/// MsgSubmitConsumerDoubleVoting defines a message that reports +/// a double signing infraction observed on a consumer chain #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerAdditionProposals { - /// proposals waiting for spawn_time to pass - #[prost(message, repeated, tag = "1")] - pub pending: ::prost::alloc::vec::Vec, +pub struct MsgSubmitConsumerDoubleVoting { + #[prost(string, tag = "1")] + pub submitter: ::prost::alloc::string::String, + /// The equivocation of the consumer chain wrapping + /// an evidence of a validator that signed two conflicting votes + #[prost(message, optional, tag = "2")] + pub duplicate_vote_evidence: ::core::option::Option< + ::tendermint_proto::types::DuplicateVoteEvidence, + >, + /// The light client header of the infraction block + #[prost(message, optional, tag = "3")] + pub infraction_block_header: ::core::option::Option< + super::super::super::super::ibc::lightclients::tendermint::v1::Header, + >, + /// the consumer id of the consumer chain where the double-voting took place + #[prost(string, tag = "4")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for ConsumerAdditionProposals { - const NAME: &'static str = "ConsumerAdditionProposals"; +impl ::prost::Name for MsgSubmitConsumerDoubleVoting { + const NAME: &'static str = "MsgSubmitConsumerDoubleVoting"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ConsumerAdditionProposals".into() + "interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVoting".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ConsumerAdditionProposals".into() + "/interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVoting".into() } } -/// ConsumerRemovalProposals holds pending governance proposals on the provider -/// chain to remove (and stop) a consumer chain. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgSubmitConsumerDoubleVotingResponse {} +impl ::prost::Name for MsgSubmitConsumerDoubleVotingResponse { + const NAME: &'static str = "MsgSubmitConsumerDoubleVotingResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVotingResponse" + .into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVotingResponse" + .into() + } +} +/// MsgUpdateParams is the Msg/UpdateParams request type #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerRemovalProposals { - /// proposals waiting for stop_time to pass - #[prost(message, repeated, tag = "1")] - pub pending: ::prost::alloc::vec::Vec, +pub struct MsgUpdateParams { + /// authority is the address of the governance account. + #[prost(string, tag = "1")] + pub authority: ::prost::alloc::string::String, + /// params defines the x/provider parameters to update. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, } -impl ::prost::Name for ConsumerRemovalProposals { - const NAME: &'static str = "ConsumerRemovalProposals"; +impl ::prost::Name for MsgUpdateParams { + const NAME: &'static str = "MsgUpdateParams"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ConsumerRemovalProposals".into() + "interchain_security.ccv.provider.v1.MsgUpdateParams".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ConsumerRemovalProposals".into() + "/interchain_security.ccv.provider.v1.MsgUpdateParams".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} +impl ::prost::Name for MsgUpdateParamsResponse { + const NAME: &'static str = "MsgUpdateParamsResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgUpdateParamsResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgUpdateParamsResponse".into() + } +} +/// \[DEPRECATED\] Use `MsgCreateConsumer` instead +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgConsumerAddition { + /// the proposed chain-id of the new consumer chain, must be different from all + /// other consumer chain ids of the executing provider chain. + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + /// the proposed initial height of new consumer chain. + /// For a completely new chain, this will be {0,1}. However, it may be + /// different if this is a chain that is converting to a consumer chain. + #[prost(message, optional, tag = "2")] + pub initial_height: ::core::option::Option< + super::super::super::super::ibc::core::client::v1::Height, + >, + /// The hash of the consumer chain genesis state without the consumer CCV + /// module genesis params. It is used for off-chain confirmation of + /// genesis.json validity by validators and other parties. + #[prost(bytes = "vec", tag = "3")] + pub genesis_hash: ::prost::alloc::vec::Vec, + /// The hash of the consumer chain binary that should be run by validators on + /// chain initialization. It is used for off-chain confirmation of binary + /// validity by validators and other parties. + #[prost(bytes = "vec", tag = "4")] + pub binary_hash: ::prost::alloc::vec::Vec, + /// spawn time is the time on the provider chain at which the consumer chain + /// genesis is finalized and all validators will be responsible for starting + /// their consumer chain validator node. + #[prost(message, optional, tag = "5")] + pub spawn_time: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, + /// Unbonding period for the consumer, + /// which should be smaller than that of the provider in general. + #[prost(message, optional, tag = "6")] + pub unbonding_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// Sent CCV related IBC packets will timeout after this duration + #[prost(message, optional, tag = "7")] + pub ccv_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// Sent transfer related IBC packets will timeout after this duration + #[prost(message, optional, tag = "8")] + pub transfer_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// The fraction of tokens allocated to the consumer redistribution address + /// during distribution events. The fraction is a string representing a + /// decimal number. For example "0.75" would represent 75%. + #[prost(string, tag = "9")] + pub consumer_redistribution_fraction: ::prost::alloc::string::String, + /// BlocksPerDistributionTransmission is the number of blocks between + /// ibc-token-transfers from the consumer chain to the provider chain. On + /// sending transmission event, `consumer_redistribution_fraction` of the + /// accumulated tokens are sent to the consumer redistribution address. + #[prost(int64, tag = "10")] + pub blocks_per_distribution_transmission: i64, + /// The number of historical info entries to persist in store. + /// This param is a part of the cosmos sdk staking module. In the case of + /// a ccv enabled consumer chain, the ccv module acts as the staking module. + #[prost(int64, tag = "11")] + pub historical_entries: i64, + /// The ID of a token transfer channel used for the Reward Distribution + /// sub-protocol. If DistributionTransmissionChannel == "", a new transfer + /// channel is created on top of the same connection as the CCV channel. + /// Note that transfer_channel_id is the ID of the channel end on the consumer + /// chain. it is most relevant for chains performing a sovereign to consumer + /// changeover in order to maintain the existing ibc transfer channel + #[prost(string, tag = "12")] + pub distribution_transmission_channel: ::prost::alloc::string::String, + /// Corresponds to the percentage of validators that have to validate the chain under the Top N case. + /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power + /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\]. + /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain. + #[prost(uint32, tag = "13")] + pub top_n: u32, + /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if + /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the + /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only + /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need + /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis. + #[prost(uint32, tag = "14")] + pub validators_power_cap: u32, + /// Corresponds to the maximum number of validators that can validate a consumer chain. + /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op. + #[prost(uint32, tag = "15")] + pub validator_set_cap: u32, + /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate + /// the consumer chain. + #[prost(string, repeated, tag = "16")] + pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain. + #[prost(string, repeated, tag = "17")] + pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// signer address + #[prost(string, tag = "18")] + pub authority: ::prost::alloc::string::String, + /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain. + #[prost(uint64, tag = "19")] + pub min_stake: u64, + /// Corresponds to whether inactive validators are allowed to validate the consumer chain. + #[prost(bool, tag = "20")] + pub allow_inactive_vals: bool, +} +impl ::prost::Name for MsgConsumerAddition { + const NAME: &'static str = "MsgConsumerAddition"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgConsumerAddition".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgConsumerAddition".into() + } +} +/// MsgConsumerAdditionResponse defines response type for MsgConsumerAddition messages +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgConsumerAdditionResponse {} +impl ::prost::Name for MsgConsumerAdditionResponse { + const NAME: &'static str = "MsgConsumerAdditionResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgConsumerAdditionResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgConsumerAdditionResponse".into() + } +} +/// \[DEPRECATED\] Use `MsgRemoveConsumer` instead +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgConsumerRemoval { + /// the chain-id of the consumer chain to be stopped + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + /// the time on the provider chain at which all validators are responsible to + /// stop their consumer chain validator node + #[prost(message, optional, tag = "2")] + pub stop_time: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, + /// signer address + #[prost(string, tag = "3")] + pub authority: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgConsumerRemoval { + const NAME: &'static str = "MsgConsumerRemoval"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgConsumerRemoval".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgConsumerRemoval".into() + } +} +/// MsgConsumerRemovalResponse defines response type for MsgConsumerRemoval messages +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgConsumerRemovalResponse {} +impl ::prost::Name for MsgConsumerRemovalResponse { + const NAME: &'static str = "MsgConsumerRemovalResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgConsumerRemovalResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgConsumerRemovalResponse".into() + } +} +/// MsgRemoveConsumer defines the message used to remove (and stop) a consumer chain. +/// If it passes, all the consumer chain's state is eventually removed from the provider chain. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgRemoveConsumer { + /// the consumer id of the consumer chain to be stopped + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, + /// the address of the owner of the consumer chain to be stopped + #[prost(string, tag = "2")] + pub owner: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgRemoveConsumer { + const NAME: &'static str = "MsgRemoveConsumer"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgRemoveConsumer".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgRemoveConsumer".into() + } +} +/// MsgRemoveConsumerResponse defines response type for MsgRemoveConsumer messages +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgRemoveConsumerResponse {} +impl ::prost::Name for MsgRemoveConsumerResponse { + const NAME: &'static str = "MsgRemoveConsumerResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgRemoveConsumerResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgRemoveConsumerResponse".into() + } +} +/// ChangeRewardDenomsProposal is a governance proposal on the provider chain to +/// mutate the set of denoms accepted by the provider as rewards. +/// +/// Note: this replaces ChangeRewardDenomsProposal which is deprecated and will be removed soon +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgChangeRewardDenoms { + /// the list of consumer reward denoms to add + #[prost(string, repeated, tag = "1")] + pub denoms_to_add: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// the list of consumer reward denoms to remove + #[prost(string, repeated, tag = "2")] + pub denoms_to_remove: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// authority is the address of the governance account + #[prost(string, tag = "3")] + pub authority: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgChangeRewardDenoms { + const NAME: &'static str = "MsgChangeRewardDenoms"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgChangeRewardDenoms".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgChangeRewardDenoms".into() + } +} +/// MsgChangeRewardDenomsResponse defines response type for MsgChangeRewardDenoms messages +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgChangeRewardDenomsResponse {} +impl ::prost::Name for MsgChangeRewardDenomsResponse { + const NAME: &'static str = "MsgChangeRewardDenomsResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgChangeRewardDenomsResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgChangeRewardDenomsResponse".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgOptIn { + /// \[DEPRECATED\] use `consumer_id` instead + #[deprecated] + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + /// the validator address on the provider + #[prost(string, tag = "2")] + pub provider_addr: ::prost::alloc::string::String, + /// (optional) The consensus public key to use on the consumer in json string format corresponding to proto-any, + /// for example `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}`. + /// This field is optional and can remain empty (i.e., `consumer_key = ""`). A validator can always change the + /// consumer public key at a later stage by issuing a `MsgAssignConsumerKey` message. + #[prost(string, tag = "3")] + pub consumer_key: ::prost::alloc::string::String, + /// submitter address + #[prost(string, tag = "4")] + pub submitter: ::prost::alloc::string::String, + /// the consumer id of the consumer chain to opt in to + #[prost(string, tag = "5")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgOptIn { + const NAME: &'static str = "MsgOptIn"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgOptIn".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgOptIn".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgOptInResponse {} +impl ::prost::Name for MsgOptInResponse { + const NAME: &'static str = "MsgOptInResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgOptInResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgOptInResponse".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgOptOut { + /// \[DEPRECATED\] use `consumer_id` instead + #[deprecated] + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + /// the validator address on the provider + #[prost(string, tag = "2")] + pub provider_addr: ::prost::alloc::string::String, + /// submitter address + #[prost(string, tag = "3")] + pub submitter: ::prost::alloc::string::String, + /// the consumer id of the consumer chain to opt out from + #[prost(string, tag = "4")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgOptOut { + const NAME: &'static str = "MsgOptOut"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgOptOut".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgOptOut".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgOptOutResponse {} +impl ::prost::Name for MsgOptOutResponse { + const NAME: &'static str = "MsgOptOutResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgOptOutResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgOptOutResponse".into() + } +} +/// MsgSetConsumerCommissionRate allows validators to set +/// a per-consumer chain commission rate +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgSetConsumerCommissionRate { + /// The validator address on the provider + #[prost(string, tag = "1")] + pub provider_addr: ::prost::alloc::string::String, + /// \[DEPRECATED\] use `consumer_id` instead + #[deprecated] + #[prost(string, tag = "2")] + pub chain_id: ::prost::alloc::string::String, + /// The rate to charge delegators on the consumer chain, as a fraction + /// TODO: migrate rate from sdk.Dec to math.LegacyDec + #[prost(string, tag = "3")] + pub rate: ::prost::alloc::string::String, + /// submitter address + #[prost(string, tag = "4")] + pub submitter: ::prost::alloc::string::String, + /// the consumer id of the consumer chain to set the commission rate + #[prost(string, tag = "5")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgSetConsumerCommissionRate { + const NAME: &'static str = "MsgSetConsumerCommissionRate"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRate".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRate".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgSetConsumerCommissionRateResponse {} +impl ::prost::Name for MsgSetConsumerCommissionRateResponse { + const NAME: &'static str = "MsgSetConsumerCommissionRateResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRateResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRateResponse" + .into() + } +} +/// \[DEPRECATED\] Use `MsgUpdateConsumer` instead +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgConsumerModification { + /// the title of the proposal + #[prost(string, tag = "1")] + pub title: ::prost::alloc::string::String, + /// the description of the proposal + #[prost(string, tag = "2")] + pub description: ::prost::alloc::string::String, + /// the chain-id of the consumer chain to be modified + #[prost(string, tag = "3")] + pub chain_id: ::prost::alloc::string::String, + /// Corresponds to the percentage of validators that have to validate the chain under the Top N case. + /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power + /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\]. + /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain. + #[prost(uint32, tag = "4")] + pub top_n: u32, + /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if + /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the + /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only + /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need + /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis. + #[prost(uint32, tag = "5")] + pub validators_power_cap: u32, + /// Corresponds to the maximum number of validators that can validate a consumer chain. + /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op. + #[prost(uint32, tag = "6")] + pub validator_set_cap: u32, + /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate + /// the consumer chain. + #[prost(string, repeated, tag = "7")] + pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain. + #[prost(string, repeated, tag = "8")] + pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// signer address + #[prost(string, tag = "9")] + pub authority: ::prost::alloc::string::String, + /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain. + #[prost(uint64, tag = "10")] + pub min_stake: u64, + /// Corresponds to whether inactive validators are allowed to validate the consumer chain. + #[prost(bool, tag = "11")] + pub allow_inactive_vals: bool, +} +impl ::prost::Name for MsgConsumerModification { + const NAME: &'static str = "MsgConsumerModification"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgConsumerModification".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgConsumerModification".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgConsumerModificationResponse {} +impl ::prost::Name for MsgConsumerModificationResponse { + const NAME: &'static str = "MsgConsumerModificationResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgConsumerModificationResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgConsumerModificationResponse".into() + } +} +/// MsgCreateConsumer defines the message that creates a consumer chain +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgCreateConsumer { + /// Submitter address. If the message is successfully handled, the ownership of + /// the consumer chain will given to this address. + #[prost(string, tag = "1")] + pub submitter: ::prost::alloc::string::String, + /// the chain id of the new consumer chain + #[prost(string, tag = "2")] + pub chain_id: ::prost::alloc::string::String, + #[prost(message, optional, tag = "3")] + pub metadata: ::core::option::Option, + #[prost(message, optional, tag = "4")] + pub initialization_parameters: ::core::option::Option< + ConsumerInitializationParameters, + >, + #[prost(message, optional, tag = "5")] + pub power_shaping_parameters: ::core::option::Option, +} +impl ::prost::Name for MsgCreateConsumer { + const NAME: &'static str = "MsgCreateConsumer"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgCreateConsumer".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgCreateConsumer".into() + } +} +/// MsgCreateConsumerResponse defines response type for MsgCreateConsumer +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgCreateConsumerResponse { + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for MsgCreateConsumerResponse { + const NAME: &'static str = "MsgCreateConsumerResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgCreateConsumerResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgCreateConsumerResponse".into() + } +} +/// MsgUpdateConsumer defines the message used to modify a consumer chain. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateConsumer { + /// the address of the owner of the consumer chain to be updated + #[prost(string, tag = "1")] + pub owner: ::prost::alloc::string::String, + /// the consumer id of the consumer chain to be updated + #[prost(string, tag = "2")] + pub consumer_id: ::prost::alloc::string::String, + /// the new owner of the consumer when updated + #[prost(string, tag = "3")] + pub new_owner_address: ::prost::alloc::string::String, + /// the metadata of the consumer when updated + #[prost(message, optional, tag = "4")] + pub metadata: ::core::option::Option, + /// initialization parameters can only be updated before a chain has launched + #[prost(message, optional, tag = "5")] + pub initialization_parameters: ::core::option::Option< + ConsumerInitializationParameters, + >, + /// the power-shaping parameters of the consumer when updated + #[prost(message, optional, tag = "6")] + pub power_shaping_parameters: ::core::option::Option, +} +impl ::prost::Name for MsgUpdateConsumer { + const NAME: &'static str = "MsgUpdateConsumer"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgUpdateConsumer".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgUpdateConsumer".into() + } +} +/// MsgUpdateConsumerResponse defines response type for MsgUpdateConsumer messages +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct MsgUpdateConsumerResponse {} +impl ::prost::Name for MsgUpdateConsumerResponse { + const NAME: &'static str = "MsgUpdateConsumerResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.MsgUpdateConsumerResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.MsgUpdateConsumerResponse".into() + } +} +/// Generated client implementations. +#[cfg(feature = "client")] +pub mod msg_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /// Msg defines the Msg service. + #[derive(Debug, Clone)] + pub struct MsgClient { + inner: tonic::client::Grpc, + } + impl MsgClient { + /// 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 MsgClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + 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, + ) -> MsgClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + MsgClient::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 + } + pub async fn assign_consumer_key( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/AssignConsumerKey", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "AssignConsumerKey", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn submit_consumer_misbehaviour( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerMisbehaviour", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "SubmitConsumerMisbehaviour", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn submit_consumer_double_voting( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerDoubleVoting", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "SubmitConsumerDoubleVoting", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn consumer_addition( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/ConsumerAddition", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "ConsumerAddition", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn consumer_removal( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/ConsumerRemoval", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "ConsumerRemoval", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn create_consumer( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/CreateConsumer", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "CreateConsumer", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn update_consumer( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/UpdateConsumer", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "UpdateConsumer", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn remove_consumer( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/RemoveConsumer", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "RemoveConsumer", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn update_params( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/UpdateParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "UpdateParams", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn opt_in( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/OptIn", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("interchain_security.ccv.provider.v1.Msg", "OptIn"), + ); + self.inner.unary(req, path, codec).await + } + pub async fn opt_out( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/OptOut", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("interchain_security.ccv.provider.v1.Msg", "OptOut"), + ); + self.inner.unary(req, path, codec).await + } + pub async fn set_consumer_commission_rate( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/SetConsumerCommissionRate", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "SetConsumerCommissionRate", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn consumer_modification( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/ConsumerModification", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "ConsumerModification", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn change_reward_denoms( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Msg/ChangeRewardDenoms", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Msg", + "ChangeRewardDenoms", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +#[cfg(feature = "server")] +pub mod msg_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with MsgServer. + #[async_trait] + pub trait Msg: Send + Sync + 'static { + async fn assign_consumer_key( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn submit_consumer_misbehaviour( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn submit_consumer_double_voting( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn consumer_addition( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn consumer_removal( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn create_consumer( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn update_consumer( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn remove_consumer( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn update_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn opt_in( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn opt_out( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn set_consumer_commission_rate( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn consumer_modification( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn change_reward_denoms( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /// Msg defines the Msg service. + #[derive(Debug)] + pub struct MsgServer { + inner: Arc, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + impl MsgServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(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.max_decoding_message_size = Some(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.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for MsgServer + where + T: Msg, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + match req.uri().path() { + "/interchain_security.ccv.provider.v1.Msg/AssignConsumerKey" => { + #[allow(non_camel_case_types)] + struct AssignConsumerKeySvc(pub Arc); + impl tonic::server::UnaryService + for AssignConsumerKeySvc { + type Response = super::MsgAssignConsumerKeyResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::assign_consumer_key(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = AssignConsumerKeySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerMisbehaviour" => { + #[allow(non_camel_case_types)] + struct SubmitConsumerMisbehaviourSvc(pub Arc); + impl< + T: Msg, + > tonic::server::UnaryService + for SubmitConsumerMisbehaviourSvc { + type Response = super::MsgSubmitConsumerMisbehaviourResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::submit_consumer_misbehaviour(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = SubmitConsumerMisbehaviourSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerDoubleVoting" => { + #[allow(non_camel_case_types)] + struct SubmitConsumerDoubleVotingSvc(pub Arc); + impl< + T: Msg, + > tonic::server::UnaryService + for SubmitConsumerDoubleVotingSvc { + type Response = super::MsgSubmitConsumerDoubleVotingResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::submit_consumer_double_voting(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = SubmitConsumerDoubleVotingSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/ConsumerAddition" => { + #[allow(non_camel_case_types)] + struct ConsumerAdditionSvc(pub Arc); + impl tonic::server::UnaryService + for ConsumerAdditionSvc { + type Response = super::MsgConsumerAdditionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::consumer_addition(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ConsumerAdditionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/ConsumerRemoval" => { + #[allow(non_camel_case_types)] + struct ConsumerRemovalSvc(pub Arc); + impl tonic::server::UnaryService + for ConsumerRemovalSvc { + type Response = super::MsgConsumerRemovalResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::consumer_removal(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ConsumerRemovalSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/CreateConsumer" => { + #[allow(non_camel_case_types)] + struct CreateConsumerSvc(pub Arc); + impl tonic::server::UnaryService + for CreateConsumerSvc { + type Response = super::MsgCreateConsumerResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::create_consumer(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = CreateConsumerSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/UpdateConsumer" => { + #[allow(non_camel_case_types)] + struct UpdateConsumerSvc(pub Arc); + impl tonic::server::UnaryService + for UpdateConsumerSvc { + type Response = super::MsgUpdateConsumerResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_consumer(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = UpdateConsumerSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/RemoveConsumer" => { + #[allow(non_camel_case_types)] + struct RemoveConsumerSvc(pub Arc); + impl tonic::server::UnaryService + for RemoveConsumerSvc { + type Response = super::MsgRemoveConsumerResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::remove_consumer(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = RemoveConsumerSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/UpdateParams" => { + #[allow(non_camel_case_types)] + struct UpdateParamsSvc(pub Arc); + impl tonic::server::UnaryService + for UpdateParamsSvc { + type Response = super::MsgUpdateParamsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::update_params(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = UpdateParamsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/OptIn" => { + #[allow(non_camel_case_types)] + struct OptInSvc(pub Arc); + impl tonic::server::UnaryService + for OptInSvc { + type Response = super::MsgOptInResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::opt_in(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = OptInSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/OptOut" => { + #[allow(non_camel_case_types)] + struct OptOutSvc(pub Arc); + impl tonic::server::UnaryService + for OptOutSvc { + type Response = super::MsgOptOutResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::opt_out(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = OptOutSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/SetConsumerCommissionRate" => { + #[allow(non_camel_case_types)] + struct SetConsumerCommissionRateSvc(pub Arc); + impl< + T: Msg, + > tonic::server::UnaryService + for SetConsumerCommissionRateSvc { + type Response = super::MsgSetConsumerCommissionRateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::set_consumer_commission_rate(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = SetConsumerCommissionRateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/ConsumerModification" => { + #[allow(non_camel_case_types)] + struct ConsumerModificationSvc(pub Arc); + impl< + T: Msg, + > tonic::server::UnaryService + for ConsumerModificationSvc { + type Response = super::MsgConsumerModificationResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::consumer_modification(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ConsumerModificationSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Msg/ChangeRewardDenoms" => { + #[allow(non_camel_case_types)] + struct ChangeRewardDenomsSvc(pub Arc); + impl< + T: Msg, + > tonic::server::UnaryService + for ChangeRewardDenomsSvc { + type Response = super::MsgChangeRewardDenomsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::change_reward_denoms(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = ChangeRewardDenomsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } } -} -/// AddressList contains a list of consensus addresses -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct AddressList { - #[prost(bytes = "vec", repeated, tag = "1")] - pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, -} -impl ::prost::Name for AddressList { - const NAME: &'static str = "AddressList"; - const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.AddressList".into() + impl Clone for MsgServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.AddressList".into() + impl tonic::server::NamedService for MsgServer { + const NAME: &'static str = "interchain_security.ccv.provider.v1.Msg"; } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ChannelToChain { +pub struct QueryConsumerGenesisRequest { #[prost(string, tag = "1")] - pub channel_id: ::prost::alloc::string::String, - #[prost(string, tag = "2")] - pub chain_id: ::prost::alloc::string::String, -} -impl ::prost::Name for ChannelToChain { - const NAME: &'static str = "ChannelToChain"; - const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ChannelToChain".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ChannelToChain".into() - } -} -/// VscUnbondingOps contains the IDs of unbonding operations that are waiting for -/// at least one VSCMaturedPacket with vscID from a consumer chain -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct VscUnbondingOps { - #[prost(uint64, tag = "1")] - pub vsc_id: u64, - #[prost(uint64, repeated, tag = "2")] - pub unbonding_op_ids: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for VscUnbondingOps { - const NAME: &'static str = "VscUnbondingOps"; - const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.VscUnbondingOps".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.VscUnbondingOps".into() - } -} -/// UnbondingOp contains the ids of consumer chains that need to unbond before -/// the unbonding operation with the given ID can unbond -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UnbondingOp { - #[prost(uint64, tag = "1")] - pub id: u64, - /// consumer chains that are still unbonding - #[prost(string, repeated, tag = "2")] - pub unbonding_consumer_chains: ::prost::alloc::vec::Vec< - ::prost::alloc::string::String, - >, + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for UnbondingOp { - const NAME: &'static str = "UnbondingOp"; +impl ::prost::Name for QueryConsumerGenesisRequest { + const NAME: &'static str = "QueryConsumerGenesisRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.UnbondingOp".into() + "interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.UnbondingOp".into() + "/interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct InitTimeoutTimestamp { - #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] - pub timestamp: u64, -} -impl ::prost::Name for InitTimeoutTimestamp { - const NAME: &'static str = "InitTimeoutTimestamp"; - const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.InitTimeoutTimestamp".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.InitTimeoutTimestamp".into() - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct VscSendTimestamp { - #[prost(uint64, tag = "1")] - pub vsc_id: u64, - #[prost(message, optional, tag = "2")] - pub timestamp: ::core::option::Option< - ::tendermint_proto::google::protobuf::Timestamp, - >, +pub struct QueryConsumerGenesisResponse { + #[prost(message, optional, tag = "1")] + pub genesis_state: ::core::option::Option, } -impl ::prost::Name for VscSendTimestamp { - const NAME: &'static str = "VscSendTimestamp"; +impl ::prost::Name for QueryConsumerGenesisResponse { + const NAME: &'static str = "QueryConsumerGenesisResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.VscSendTimestamp".into() + "interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.VscSendTimestamp".into() + "/interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse".into() } } -/// ValidatorSetChangePackets is a pb list of ccv.ValidatorSetChangePacketData. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ValidatorSetChangePackets { - #[prost(message, repeated, tag = "1")] - pub list: ::prost::alloc::vec::Vec, +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct QueryConsumerChainsRequest { + /// The phase of the consumer chains returned (optional) + /// Registered=1|Initialized=2|Launched=3|Stopped=4|Deleted=5 + #[prost(enumeration = "ConsumerPhase", tag = "1")] + pub phase: i32, + /// The limit of consumer chains returned (optional) + /// default is 100 + #[prost(int32, tag = "2")] + pub limit: i32, } -impl ::prost::Name for ValidatorSetChangePackets { - const NAME: &'static str = "ValidatorSetChangePackets"; +impl ::prost::Name for QueryConsumerChainsRequest { + const NAME: &'static str = "QueryConsumerChainsRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ValidatorSetChangePackets".into() + "interchain_security.ccv.provider.v1.QueryConsumerChainsRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ValidatorSetChangePackets".into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainsRequest".into() } } -/// MaturedUnbondingOps defines a list of ids corresponding to ids of matured -/// unbonding operations. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct MaturedUnbondingOps { - #[prost(uint64, repeated, tag = "1")] - pub ids: ::prost::alloc::vec::Vec, +pub struct QueryConsumerChainsResponse { + #[prost(message, repeated, tag = "1")] + pub chains: ::prost::alloc::vec::Vec, } -impl ::prost::Name for MaturedUnbondingOps { - const NAME: &'static str = "MaturedUnbondingOps"; +impl ::prost::Name for QueryConsumerChainsResponse { + const NAME: &'static str = "QueryConsumerChainsResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MaturedUnbondingOps".into() + "interchain_security.ccv.provider.v1.QueryConsumerChainsResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MaturedUnbondingOps".into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainsResponse".into() } } -/// ExportedVscSendTimestamps is VscSendTimestamp with chainID info for exporting to genesis #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ExportedVscSendTimestamp { +pub struct Chain { #[prost(string, tag = "1")] pub chain_id: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "2")] - pub vsc_send_timestamps: ::prost::alloc::vec::Vec, + #[prost(string, tag = "2")] + pub client_id: ::prost::alloc::string::String, + #[prost(uint32, tag = "3")] + pub top_n: u32, + /// If the chain is a Top-N chain, this is the minimum power required to be in the top N. + /// Otherwise, this is -1. + #[prost(int64, tag = "4")] + pub min_power_in_top_n: i64, + /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. + #[prost(uint32, tag = "5")] + pub validators_power_cap: u32, + /// Corresponds to the maximum number of validators that can validate a consumer chain. + /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op. + #[prost(uint32, tag = "6")] + pub validator_set_cap: u32, + /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate + /// the consumer chain. + #[prost(string, repeated, tag = "7")] + pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain. + #[prost(string, repeated, tag = "8")] + pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// The phase the consumer chain + #[prost(string, tag = "9")] + pub phase: ::prost::alloc::string::String, + /// The metadata of the consumer chain + #[prost(message, optional, tag = "10")] + pub metadata: ::core::option::Option, + /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain. + #[prost(uint64, tag = "11")] + pub min_stake: u64, + /// Corresponds to whether inactive validators are allowed to validate the consumer chain. + #[prost(bool, tag = "12")] + pub allow_inactive_vals: bool, + #[prost(string, tag = "13")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for ExportedVscSendTimestamp { - const NAME: &'static str = "ExportedVscSendTimestamp"; +impl ::prost::Name for Chain { + const NAME: &'static str = "Chain"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ExportedVscSendTimestamp".into() + "interchain_security.ccv.provider.v1.Chain".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ExportedVscSendTimestamp".into() + "/interchain_security.ccv.provider.v1.Chain".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct KeyAssignmentReplacement { - #[prost(bytes = "vec", tag = "1")] - pub provider_addr: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "2")] - pub prev_c_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, - #[prost(int64, tag = "3")] - pub power: i64, +pub struct QueryValidatorConsumerAddrRequest { + /// The consensus address of the validator on the provider chain + #[prost(string, tag = "1")] + pub provider_address: ::prost::alloc::string::String, + /// The id of the consumer chain + #[prost(string, tag = "2")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for KeyAssignmentReplacement { - const NAME: &'static str = "KeyAssignmentReplacement"; +impl ::prost::Name for QueryValidatorConsumerAddrRequest { + const NAME: &'static str = "QueryValidatorConsumerAddrRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.KeyAssignmentReplacement".into() + "interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.KeyAssignmentReplacement".into() + "/interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrRequest".into() } } -/// Used to serialize the ValidatorConsumerPubKey index from key assignment -/// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey -/// tmprotocrypto.PublicKey #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ValidatorConsumerPubKey { +pub struct QueryValidatorConsumerAddrResponse { + /// The address of the validator on the consumer chain #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - #[prost(bytes = "vec", tag = "2")] - pub provider_addr: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "3")] - pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, + pub consumer_address: ::prost::alloc::string::String, } -impl ::prost::Name for ValidatorConsumerPubKey { - const NAME: &'static str = "ValidatorConsumerPubKey"; +impl ::prost::Name for QueryValidatorConsumerAddrResponse { + const NAME: &'static str = "QueryValidatorConsumerAddrResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ValidatorConsumerPubKey".into() + "interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ValidatorConsumerPubKey".into() + "/interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrResponse".into() } } -/// Used to serialize the ValidatorConsumerAddr index from key assignment -/// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr -/// consAddr #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ValidatorByConsumerAddr { +pub struct QueryValidatorProviderAddrRequest { + /// The consensus address of the validator on the consumer chain #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - #[prost(bytes = "vec", tag = "2")] - pub consumer_addr: ::prost::alloc::vec::Vec, - #[prost(bytes = "vec", tag = "3")] - pub provider_addr: ::prost::alloc::vec::Vec, + pub consumer_address: ::prost::alloc::string::String, + /// The id of the consumer chain + #[prost(string, tag = "2")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for ValidatorByConsumerAddr { - const NAME: &'static str = "ValidatorByConsumerAddr"; +impl ::prost::Name for QueryValidatorProviderAddrRequest { + const NAME: &'static str = "QueryValidatorProviderAddrRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ValidatorByConsumerAddr".into() + "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ValidatorByConsumerAddr".into() + "/interchain_security.ccv.provider.v1.QueryValidatorProviderAddrRequest".into() } } -/// Used to serialize the ConsumerAddrsToPrune index from key assignment -/// ConsumerAddrsToPrune: (chainID, vscID uint64) -> consumerAddrs AddressList #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerAddrsToPrune { +pub struct QueryValidatorProviderAddrResponse { + /// The address of the validator on the provider chain #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] - pub vsc_id: u64, - #[prost(message, optional, tag = "3")] - pub consumer_addrs: ::core::option::Option, + pub provider_address: ::prost::alloc::string::String, } -impl ::prost::Name for ConsumerAddrsToPrune { - const NAME: &'static str = "ConsumerAddrsToPrune"; +impl ::prost::Name for QueryValidatorProviderAddrResponse { + const NAME: &'static str = "QueryValidatorProviderAddrResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ConsumerAddrsToPrune".into() + "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ConsumerAddrsToPrune".into() + "/interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse".into() } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryConsumerGenesisRequest { - #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, -} -impl ::prost::Name for QueryConsumerGenesisRequest { - const NAME: &'static str = "QueryConsumerGenesisRequest"; +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct QueryThrottleStateRequest {} +impl ::prost::Name for QueryThrottleStateRequest { + const NAME: &'static str = "QueryThrottleStateRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest".into() + "interchain_security.ccv.provider.v1.QueryThrottleStateRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest".into() + "/interchain_security.ccv.provider.v1.QueryThrottleStateRequest".into() } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryConsumerGenesisResponse { - #[prost(message, optional, tag = "1")] - pub genesis_state: ::core::option::Option, +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct QueryThrottleStateResponse { + /// current slash_meter state + #[prost(int64, tag = "1")] + pub slash_meter: i64, + /// allowance of voting power units (int) that the slash meter is given per + /// replenish period this also serves as the max value for the meter. + #[prost(int64, tag = "2")] + pub slash_meter_allowance: i64, + /// next time the slash meter could potentially be replenished, iff it's not + /// full + #[prost(message, optional, tag = "3")] + pub next_replenish_candidate: ::core::option::Option< + ::tendermint_proto::google::protobuf::Timestamp, + >, } -impl ::prost::Name for QueryConsumerGenesisResponse { - const NAME: &'static str = "QueryConsumerGenesisResponse"; +impl ::prost::Name for QueryThrottleStateResponse { + const NAME: &'static str = "QueryThrottleStateResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse".into() + "interchain_security.ccv.provider.v1.QueryThrottleStateResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse".into() + "/interchain_security.ccv.provider.v1.QueryThrottleStateResponse".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct QueryConsumerChainsRequest {} -impl ::prost::Name for QueryConsumerChainsRequest { - const NAME: &'static str = "QueryConsumerChainsRequest"; +pub struct QueryRegisteredConsumerRewardDenomsRequest {} +impl ::prost::Name for QueryRegisteredConsumerRewardDenomsRequest { + const NAME: &'static str = "QueryRegisteredConsumerRewardDenomsRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerChainsRequest".into() + "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerChainsRequest".into() + "/interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest" + .into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryConsumerChainsResponse { - #[prost(message, repeated, tag = "1")] - pub chains: ::prost::alloc::vec::Vec, +pub struct QueryRegisteredConsumerRewardDenomsResponse { + #[prost(string, repeated, tag = "1")] + pub denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -impl ::prost::Name for QueryConsumerChainsResponse { - const NAME: &'static str = "QueryConsumerChainsResponse"; +impl ::prost::Name for QueryRegisteredConsumerRewardDenomsResponse { + const NAME: &'static str = "QueryRegisteredConsumerRewardDenomsResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerChainsResponse".into() + "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerChainsResponse".into() + "/interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse" + .into() } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct QueryConsumerChainStartProposalsRequest {} -impl ::prost::Name for QueryConsumerChainStartProposalsRequest { - const NAME: &'static str = "QueryConsumerChainStartProposalsRequest"; +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryAllPairsValConsAddrByConsumerRequest { + /// The id of the consumer chain + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for QueryAllPairsValConsAddrByConsumerRequest { + const NAME: &'static str = "QueryAllPairsValConsAddrByConsumerRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerChainStartProposalsRequest" + "interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerRequest" .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerChainStartProposalsRequest" + "/interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerRequest" .into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryConsumerChainStartProposalsResponse { - #[prost(message, optional, tag = "1")] - pub proposals: ::core::option::Option, +pub struct QueryAllPairsValConsAddrByConsumerResponse { + #[prost(message, repeated, tag = "1")] + pub pair_val_con_addr: ::prost::alloc::vec::Vec, } -impl ::prost::Name for QueryConsumerChainStartProposalsResponse { - const NAME: &'static str = "QueryConsumerChainStartProposalsResponse"; +impl ::prost::Name for QueryAllPairsValConsAddrByConsumerResponse { + const NAME: &'static str = "QueryAllPairsValConsAddrByConsumerResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerChainStartProposalsResponse" + "interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerResponse" .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerChainStartProposalsResponse" + "/interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerResponse" .into() } } #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PairValConAddrProviderAndConsumer { + /// The consensus address of the validator on the provider chain + #[prost(string, tag = "1")] + pub provider_address: ::prost::alloc::string::String, + /// The consensus address of the validator on the consumer chain + #[prost(string, tag = "2")] + pub consumer_address: ::prost::alloc::string::String, + #[prost(message, optional, tag = "3")] + pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, +} +impl ::prost::Name for PairValConAddrProviderAndConsumer { + const NAME: &'static str = "PairValConAddrProviderAndConsumer"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.PairValConAddrProviderAndConsumer".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.PairValConAddrProviderAndConsumer".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct QueryConsumerChainStopProposalsRequest {} -impl ::prost::Name for QueryConsumerChainStopProposalsRequest { - const NAME: &'static str = "QueryConsumerChainStopProposalsRequest"; +pub struct QueryParamsRequest {} +impl ::prost::Name for QueryParamsRequest { + const NAME: &'static str = "QueryParamsRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerChainStopProposalsRequest" - .into() + "interchain_security.ccv.provider.v1.QueryParamsRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerChainStopProposalsRequest" - .into() + "/interchain_security.ccv.provider.v1.QueryParamsRequest".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryConsumerChainStopProposalsResponse { +pub struct QueryParamsResponse { #[prost(message, optional, tag = "1")] - pub proposals: ::core::option::Option, + pub params: ::core::option::Option, +} +impl ::prost::Name for QueryParamsResponse { + const NAME: &'static str = "QueryParamsResponse"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.QueryParamsResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.QueryParamsResponse".into() + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryConsumerChainOptedInValidatorsRequest { + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for QueryConsumerChainStopProposalsResponse { - const NAME: &'static str = "QueryConsumerChainStopProposalsResponse"; +impl ::prost::Name for QueryConsumerChainOptedInValidatorsRequest { + const NAME: &'static str = "QueryConsumerChainOptedInValidatorsRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryConsumerChainStopProposalsResponse" + "interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsRequest" .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryConsumerChainStopProposalsResponse" + "/interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsRequest" .into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct Chain { - #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - #[prost(string, tag = "2")] - pub client_id: ::prost::alloc::string::String, +pub struct QueryConsumerChainOptedInValidatorsResponse { + /// The consensus addresses of the validators on the provider chain + #[prost(string, repeated, tag = "1")] + pub validators_provider_addresses: ::prost::alloc::vec::Vec< + ::prost::alloc::string::String, + >, } -impl ::prost::Name for Chain { - const NAME: &'static str = "Chain"; +impl ::prost::Name for QueryConsumerChainOptedInValidatorsResponse { + const NAME: &'static str = "QueryConsumerChainOptedInValidatorsResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.Chain".into() + "interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsResponse" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.Chain".into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsResponse" + .into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryValidatorConsumerAddrRequest { - /// The id of the consumer chain +pub struct QueryConsumerValidatorsRequest { #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - /// The consensus address of the validator on the provider chain - #[prost(string, tag = "2")] - pub provider_address: ::prost::alloc::string::String, + pub consumer_id: ::prost::alloc::string::String, } -impl ::prost::Name for QueryValidatorConsumerAddrRequest { - const NAME: &'static str = "QueryValidatorConsumerAddrRequest"; +impl ::prost::Name for QueryConsumerValidatorsRequest { + const NAME: &'static str = "QueryConsumerValidatorsRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrRequest".into() + "interchain_security.ccv.provider.v1.QueryConsumerValidatorsRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrRequest".into() + "/interchain_security.ccv.provider.v1.QueryConsumerValidatorsRequest".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryValidatorConsumerAddrResponse { - /// The address of the validator on the consumer chain +pub struct QueryConsumerValidatorsValidator { + /// The consensus address of the validator on the provider chain #[prost(string, tag = "1")] - pub consumer_address: ::prost::alloc::string::String, + pub provider_address: ::prost::alloc::string::String, + /// The consumer public key of the validator used on the consumer chain + #[prost(message, optional, tag = "2")] + pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>, + /// \[DEPRECATED\] use `consumer_power` instead + #[deprecated] + #[prost(int64, tag = "3")] + pub power: i64, + /// \[DEPRECATED\] use `consumer_commission_rate` instead + #[deprecated] + #[prost(string, tag = "4")] + pub rate: ::prost::alloc::string::String, + /// The power of the validator used on the consumer chain + #[prost(int64, tag = "5")] + pub consumer_power: i64, + /// The rate to charge delegators on the consumer chain, as a fraction + #[prost(string, tag = "6")] + pub consumer_commission_rate: ::prost::alloc::string::String, + /// The rate to charge delegators on the provider chain, as a fraction + #[prost(string, tag = "7")] + pub provider_commission_rate: ::prost::alloc::string::String, + /// description defines the description terms for the validator + #[prost(message, optional, tag = "8")] + pub description: ::core::option::Option< + super::super::super::super::cosmos::staking::v1beta1::Description, + >, + /// provider_operator_address defines the address of the validator's operator + #[prost(string, tag = "9")] + pub provider_operator_address: ::prost::alloc::string::String, + /// jailed defined whether the validator has been jailed from bonded status or not. + #[prost(bool, tag = "10")] + pub jailed: bool, + /// status is the validator status (bonded/unbonding/unbonded). + #[prost( + enumeration = "super::super::super::super::cosmos::staking::v1beta1::BondStatus", + tag = "11" + )] + pub status: i32, + /// provider_tokens defines the delegated tokens (incl. self-delegation). + #[prost(string, tag = "12")] + pub provider_tokens: ::prost::alloc::string::String, + /// The power of the validator used on the provider chain + #[prost(int64, tag = "13")] + pub provider_power: i64, + /// validates_current_epoch defines whether the validator has to validate for the current epoch or not + #[prost(bool, tag = "14")] + pub validates_current_epoch: bool, } -impl ::prost::Name for QueryValidatorConsumerAddrResponse { - const NAME: &'static str = "QueryValidatorConsumerAddrResponse"; +impl ::prost::Name for QueryConsumerValidatorsValidator { + const NAME: &'static str = "QueryConsumerValidatorsValidator"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrResponse".into() + "interchain_security.ccv.provider.v1.QueryConsumerValidatorsValidator".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrResponse".into() + "/interchain_security.ccv.provider.v1.QueryConsumerValidatorsValidator".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryValidatorProviderAddrRequest { - /// The id of the provider chain - #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - /// The consensus address of the validator on the consumer chain - #[prost(string, tag = "2")] - pub consumer_address: ::prost::alloc::string::String, +pub struct QueryConsumerValidatorsResponse { + #[prost(message, repeated, tag = "1")] + pub validators: ::prost::alloc::vec::Vec, } -impl ::prost::Name for QueryValidatorProviderAddrRequest { - const NAME: &'static str = "QueryValidatorProviderAddrRequest"; +impl ::prost::Name for QueryConsumerValidatorsResponse { + const NAME: &'static str = "QueryConsumerValidatorsResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrRequest".into() + "interchain_security.ccv.provider.v1.QueryConsumerValidatorsResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryValidatorProviderAddrRequest".into() + "/interchain_security.ccv.provider.v1.QueryConsumerValidatorsResponse".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryValidatorProviderAddrResponse { - /// The address of the validator on the provider chain +pub struct QueryConsumerChainsValidatorHasToValidateRequest { + /// The consensus address of the validator on the provider chain #[prost(string, tag = "1")] pub provider_address: ::prost::alloc::string::String, } -impl ::prost::Name for QueryValidatorProviderAddrResponse { - const NAME: &'static str = "QueryValidatorProviderAddrResponse"; +impl ::prost::Name for QueryConsumerChainsValidatorHasToValidateRequest { + const NAME: &'static str = "QueryConsumerChainsValidatorHasToValidateRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse".into() + "interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateRequest" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse".into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateRequest" + .into() } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct QueryThrottleStateRequest {} -impl ::prost::Name for QueryThrottleStateRequest { - const NAME: &'static str = "QueryThrottleStateRequest"; +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryConsumerChainsValidatorHasToValidateResponse { + #[prost(string, repeated, tag = "1")] + pub consumer_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +impl ::prost::Name for QueryConsumerChainsValidatorHasToValidateResponse { + const NAME: &'static str = "QueryConsumerChainsValidatorHasToValidateResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryThrottleStateRequest".into() + "interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateResponse" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryThrottleStateRequest".into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateResponse" + .into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryThrottleStateResponse { - /// current slash_meter state - #[prost(int64, tag = "1")] - pub slash_meter: i64, - /// allowance of voting power units (int) that the slash meter is given per - /// replenish period this also serves as the max value for the meter. - #[prost(int64, tag = "2")] - pub slash_meter_allowance: i64, - /// next time the slash meter could potentially be replenished, iff it's not - /// full - #[prost(message, optional, tag = "3")] - pub next_replenish_candidate: ::core::option::Option< - ::tendermint_proto::google::protobuf::Timestamp, - >, - /// data relevant to currently throttled slash packets - #[prost(message, repeated, tag = "4")] - pub packets: ::prost::alloc::vec::Vec, +pub struct QueryValidatorConsumerCommissionRateRequest { + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, + /// The consensus address of the validator on the provider chain + #[prost(string, tag = "2")] + pub provider_address: ::prost::alloc::string::String, } -impl ::prost::Name for QueryThrottleStateResponse { - const NAME: &'static str = "QueryThrottleStateResponse"; +impl ::prost::Name for QueryValidatorConsumerCommissionRateRequest { + const NAME: &'static str = "QueryValidatorConsumerCommissionRateRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryThrottleStateResponse".into() + "interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateRequest" + .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryThrottleStateResponse".into() + "/interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateRequest" + .into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryThrottledConsumerPacketDataRequest { +pub struct QueryValidatorConsumerCommissionRateResponse { + /// The rate to charge delegators on the consumer chain, as a fraction #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, + pub rate: ::prost::alloc::string::String, } -impl ::prost::Name for QueryThrottledConsumerPacketDataRequest { - const NAME: &'static str = "QueryThrottledConsumerPacketDataRequest"; +impl ::prost::Name for QueryValidatorConsumerCommissionRateResponse { + const NAME: &'static str = "QueryValidatorConsumerCommissionRateResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryThrottledConsumerPacketDataRequest" + "interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateResponse" .into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryThrottledConsumerPacketDataRequest" + "/interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateResponse" .into() } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryThrottledConsumerPacketDataResponse { - #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, - #[prost(uint64, tag = "2")] - pub size: u64, - #[prost(message, repeated, tag = "3")] - pub packet_data_instances: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for QueryThrottledConsumerPacketDataResponse { - const NAME: &'static str = "QueryThrottledConsumerPacketDataResponse"; +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct QueryBlocksUntilNextEpochRequest {} +impl ::prost::Name for QueryBlocksUntilNextEpochRequest { + const NAME: &'static str = "QueryBlocksUntilNextEpochRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryThrottledConsumerPacketDataResponse" - .into() + "interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryThrottledConsumerPacketDataResponse" - .into() + "/interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochRequest".into() } } -/// A query wrapper type for the global entry and data relevant to a throttled -/// slash packet. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ThrottledSlashPacket { - #[prost(message, optional, tag = "1")] - pub global_entry: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub data: ::core::option::Option, +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct QueryBlocksUntilNextEpochResponse { + /// The number of blocks until the next epoch starts + #[prost(uint64, tag = "1")] + pub blocks_until_next_epoch: u64, } -impl ::prost::Name for ThrottledSlashPacket { - const NAME: &'static str = "ThrottledSlashPacket"; +impl ::prost::Name for QueryBlocksUntilNextEpochResponse { + const NAME: &'static str = "QueryBlocksUntilNextEpochResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ThrottledSlashPacket".into() + "interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ThrottledSlashPacket".into() + "/interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochResponse".into() } } -/// ThrottledPacketDataWrapper contains either SlashPacketData or -/// VSCMaturedPacketData #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ThrottledPacketDataWrapper { - #[prost(oneof = "throttled_packet_data_wrapper::Data", tags = "1, 2")] - pub data: ::core::option::Option, +pub struct QueryConsumerIdFromClientIdRequest { + /// the client id (on the provider) that is tracking the consumer chain + /// the client id can be found from the consumer chain by querying (i.e., `query ccvconsumer provider-info`) + #[prost(string, tag = "1")] + pub client_id: ::prost::alloc::string::String, } -/// Nested message and enum types in `ThrottledPacketDataWrapper`. -pub mod throttled_packet_data_wrapper { - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Data { - #[prost(message, tag = "1")] - SlashPacket(super::super::super::v1::SlashPacketData), - #[prost(message, tag = "2")] - VscMaturedPacket(super::super::super::v1::VscMaturedPacketData), +impl ::prost::Name for QueryConsumerIdFromClientIdRequest { + const NAME: &'static str = "QueryConsumerIdFromClientIdRequest"; + const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdRequest".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdRequest".into() } } -impl ::prost::Name for ThrottledPacketDataWrapper { - const NAME: &'static str = "ThrottledPacketDataWrapper"; +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryConsumerIdFromClientIdResponse { + /// the consumer id of the chain associated with this client id + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for QueryConsumerIdFromClientIdResponse { + const NAME: &'static str = "QueryConsumerIdFromClientIdResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.ThrottledPacketDataWrapper".into() + "interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.ThrottledPacketDataWrapper".into() + "/interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdResponse".into() } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct QueryRegisteredConsumerRewardDenomsRequest {} -impl ::prost::Name for QueryRegisteredConsumerRewardDenomsRequest { - const NAME: &'static str = "QueryRegisteredConsumerRewardDenomsRequest"; +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryConsumerChainRequest { + #[prost(string, tag = "1")] + pub consumer_id: ::prost::alloc::string::String, +} +impl ::prost::Name for QueryConsumerChainRequest { + const NAME: &'static str = "QueryConsumerChainRequest"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest" - .into() + "interchain_security.ccv.provider.v1.QueryConsumerChainRequest".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest" - .into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainRequest".into() } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryRegisteredConsumerRewardDenomsResponse { - #[prost(string, repeated, tag = "1")] - pub denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +pub struct QueryConsumerChainResponse { + #[prost(string, tag = "1")] + pub chain_id: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub owner_address: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub phase: ::prost::alloc::string::String, + #[prost(message, optional, tag = "4")] + pub metadata: ::core::option::Option, + #[prost(message, optional, tag = "5")] + pub init_params: ::core::option::Option, + #[prost(message, optional, tag = "6")] + pub power_shaping_params: ::core::option::Option, } -impl ::prost::Name for QueryRegisteredConsumerRewardDenomsResponse { - const NAME: &'static str = "QueryRegisteredConsumerRewardDenomsResponse"; +impl ::prost::Name for QueryConsumerChainResponse { + const NAME: &'static str = "QueryConsumerChainResponse"; const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse" - .into() + "interchain_security.ccv.provider.v1.QueryConsumerChainResponse".into() } fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse" - .into() + "/interchain_security.ccv.provider.v1.QueryConsumerChainResponse".into() } } /// Generated client implementations. @@ -1603,21 +3640,217 @@ pub mod query_client { 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 + /// 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 + } + /// ConsumerGenesis queries the genesis state needed to start a consumer chain + /// whose proposal has been accepted + pub async fn query_consumer_genesis( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Query/QueryConsumerGenesis", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Query", + "QueryConsumerGenesis", + ), + ); + self.inner.unary(req, path, codec).await + } + /// ConsumerChains queries active consumer chains supported by the provider + /// chain + pub async fn query_consumer_chains( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChains", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Query", + "QueryConsumerChains", + ), + ); + self.inner.unary(req, path, codec).await + } + /// QueryValidatorConsumerAddr queries the address + /// assigned by a validator for a consumer chain. + pub async fn query_validator_consumer_addr( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerAddr", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Query", + "QueryValidatorConsumerAddr", + ), + ); + self.inner.unary(req, path, codec).await + } + /// QueryProviderAddr returns the provider chain validator + /// given a consumer chain validator address + pub async fn query_validator_provider_addr( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Query/QueryValidatorProviderAddr", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Query", + "QueryValidatorProviderAddr", + ), + ); + self.inner.unary(req, path, codec).await + } + /// QueryThrottleState returns the main on-chain state relevant to currently + /// throttled slash packets + pub async fn query_throttle_state( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Query/QueryThrottleState", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Query", + "QueryThrottleState", + ), + ); + self.inner.unary(req, path, codec).await + } + /// QueryRegisteredConsumerRewardDenoms returns a list of consumer reward + /// denoms that are registered + pub async fn query_registered_consumer_reward_denoms( + &mut self, + request: impl tonic::IntoRequest< + super::QueryRegisteredConsumerRewardDenomsRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "interchain_security.ccv.provider.v1.Query", + "QueryRegisteredConsumerRewardDenoms", + ), + ); + self.inner.unary(req, path, codec).await } - /// ConsumerGenesis queries the genesis state needed to start a consumer chain - /// whose proposal has been accepted - pub async fn query_consumer_genesis( + /// QueryAllPairsValConsAddrByConsumer returns a list of pair valconsensus address + /// between provider and consumer chain + pub async fn query_all_pairs_val_cons_addr_by_consumer( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest< + super::QueryAllPairsValConsAddrByConsumerRequest, + >, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1631,25 +3864,24 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryConsumerGenesis", + "/interchain_security.ccv.provider.v1.Query/QueryAllPairsValConsAddrByConsumer", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryConsumerGenesis", + "QueryAllPairsValConsAddrByConsumer", ), ); self.inner.unary(req, path, codec).await } - /// ConsumerChains queries active consumer chains supported by the provider - /// chain - pub async fn query_consumer_chains( + /// QueryParams returns all current values of provider parameters + pub async fn query_params( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1663,26 +3895,27 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryConsumerChains", + "/interchain_security.ccv.provider.v1.Query/QueryParams", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryConsumerChains", + "QueryParams", ), ); self.inner.unary(req, path, codec).await } - /// QueryConsumerChainStarts queries consumer chain start proposals. - pub async fn query_consumer_chain_starts( + /// QueryConsumerChainOptedInValidators returns a list of validators consensus addresses + /// that opted-in to the given consumer chain + pub async fn query_consumer_chain_opted_in_validators( &mut self, request: impl tonic::IntoRequest< - super::QueryConsumerChainStartProposalsRequest, + super::QueryConsumerChainOptedInValidatorsRequest, >, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1696,26 +3929,27 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainStarts", + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainOptedInValidators", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryConsumerChainStarts", + "QueryConsumerChainOptedInValidators", ), ); self.inner.unary(req, path, codec).await } - /// QueryConsumerChainStops queries consumer chain stop proposals. - pub async fn query_consumer_chain_stops( + /// QueryConsumerChainsValidatorHasToValidate returns a list of consumer chains + /// that a given validator must validate + pub async fn query_consumer_chains_validator_has_to_validate( &mut self, request: impl tonic::IntoRequest< - super::QueryConsumerChainStopProposalsRequest, + super::QueryConsumerChainsValidatorHasToValidateRequest, >, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1729,25 +3963,27 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainStops", + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainsValidatorHasToValidate", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryConsumerChainStops", + "QueryConsumerChainsValidatorHasToValidate", ), ); self.inner.unary(req, path, codec).await } - /// QueryValidatorConsumerAddr queries the address - /// assigned by a validator for a consumer chain. - pub async fn query_validator_consumer_addr( + /// QueryValidatorConsumerCommissionRate returns the commission rate a given + /// validator charges on a given consumer chain + pub async fn query_validator_consumer_commission_rate( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest< + super::QueryValidatorConsumerCommissionRateRequest, + >, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1761,25 +3997,26 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerAddr", + "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerCommissionRate", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryValidatorConsumerAddr", + "QueryValidatorConsumerCommissionRate", ), ); self.inner.unary(req, path, codec).await } - /// QueryProviderAddr returns the provider chain validator - /// given a consumer chain validator address - pub async fn query_validator_provider_addr( + /// QueryConsumerValidators returns the latest set consumer-validator set for a given consumer ID + /// Note that this does not necessarily mean that the consumer chain is using this validator set at this exact moment + /// because a VSCPacket could be delayed to be delivered on the consumer chain. + pub async fn query_consumer_validators( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1793,25 +4030,25 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryValidatorProviderAddr", + "/interchain_security.ccv.provider.v1.Query/QueryConsumerValidators", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryValidatorProviderAddr", + "QueryConsumerValidators", ), ); self.inner.unary(req, path, codec).await } - /// QueryThrottleState returns the main on-chain state relevant to currently - /// throttled slash packets - pub async fn query_throttle_state( + /// QueryBlocksUntilNextEpoch returns the number of blocks until the next epoch + /// starts and validator updates are sent to the consumer chains + pub async fn query_blocks_until_next_epoch( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1825,27 +4062,25 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryThrottleState", + "/interchain_security.ccv.provider.v1.Query/QueryBlocksUntilNextEpoch", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryThrottleState", + "QueryBlocksUntilNextEpoch", ), ); self.inner.unary(req, path, codec).await } - /// QueryThrottledConsumerPacketData returns a list of pending packet data - /// instances (slash packet and vsc matured) for a single consumer chain - pub async fn query_throttled_consumer_packet_data( + /// QueryConsumerIdFromClientId returns the consumer id of the chain + /// associated with the provided client id + pub async fn query_consumer_id_from_client_id( &mut self, - request: impl tonic::IntoRequest< - super::QueryThrottledConsumerPacketDataRequest, - >, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1859,27 +4094,25 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryThrottledConsumerPacketData", + "/interchain_security.ccv.provider.v1.Query/QueryConsumerIdFromClientId", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryThrottledConsumerPacketData", + "QueryConsumerIdFromClientId", ), ); self.inner.unary(req, path, codec).await } - /// QueryRegisteredConsumerRewardDenoms returns a list of consumer reward - /// denoms that are registered - pub async fn query_registered_consumer_reward_denoms( + /// QueryConsumerChain returns the consumer chain + /// associated with the provided consumer id + pub async fn query_consumer_chain( &mut self, - request: impl tonic::IntoRequest< - super::QueryRegisteredConsumerRewardDenomsRequest, - >, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -1893,14 +4126,14 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms", + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChain", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "interchain_security.ccv.provider.v1.Query", - "QueryRegisteredConsumerRewardDenoms", + "QueryConsumerChain", ), ); self.inner.unary(req, path, codec).await @@ -1933,22 +4166,6 @@ pub mod query_server { tonic::Response, tonic::Status, >; - /// QueryConsumerChainStarts queries consumer chain start proposals. - async fn query_consumer_chain_starts( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// QueryConsumerChainStops queries consumer chain stop proposals. - async fn query_consumer_chain_stops( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; /// QueryValidatorConsumerAddr queries the address /// assigned by a validator for a consumer chain. async fn query_validator_consumer_addr( @@ -1976,15 +4193,6 @@ pub mod query_server { tonic::Response, tonic::Status, >; - /// QueryThrottledConsumerPacketData returns a list of pending packet data - /// instances (slash packet and vsc matured) for a single consumer chain - async fn query_throttled_consumer_packet_data( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; /// QueryRegisteredConsumerRewardDenoms returns a list of consumer reward /// denoms that are registered async fn query_registered_consumer_reward_denoms( @@ -1994,6 +4202,89 @@ pub mod query_server { tonic::Response, tonic::Status, >; + /// QueryAllPairsValConsAddrByConsumer returns a list of pair valconsensus address + /// between provider and consumer chain + async fn query_all_pairs_val_cons_addr_by_consumer( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryParams returns all current values of provider parameters + async fn query_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryConsumerChainOptedInValidators returns a list of validators consensus addresses + /// that opted-in to the given consumer chain + async fn query_consumer_chain_opted_in_validators( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryConsumerChainsValidatorHasToValidate returns a list of consumer chains + /// that a given validator must validate + async fn query_consumer_chains_validator_has_to_validate( + &self, + request: tonic::Request< + super::QueryConsumerChainsValidatorHasToValidateRequest, + >, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryValidatorConsumerCommissionRate returns the commission rate a given + /// validator charges on a given consumer chain + async fn query_validator_consumer_commission_rate( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryConsumerValidators returns the latest set consumer-validator set for a given consumer ID + /// Note that this does not necessarily mean that the consumer chain is using this validator set at this exact moment + /// because a VSCPacket could be delayed to be delivered on the consumer chain. + async fn query_consumer_validators( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryBlocksUntilNextEpoch returns the number of blocks until the next epoch + /// starts and validator updates are sent to the consumer chains + async fn query_blocks_until_next_epoch( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryConsumerIdFromClientId returns the consumer id of the chain + /// associated with the provided client id + async fn query_consumer_id_from_client_id( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// QueryConsumerChain returns the consumer chain + /// associated with the provided consumer id + async fn query_consumer_chain( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } #[derive(Debug)] pub struct QueryServer { @@ -2073,23 +4364,166 @@ pub mod query_server { match req.uri().path() { "/interchain_security.ccv.provider.v1.Query/QueryConsumerGenesis" => { #[allow(non_camel_case_types)] - struct QueryConsumerGenesisSvc(pub Arc); + struct QueryConsumerGenesisSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService + for QueryConsumerGenesisSvc { + type Response = super::QueryConsumerGenesisResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_consumer_genesis(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryConsumerGenesisSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChains" => { + #[allow(non_camel_case_types)] + struct QueryConsumerChainsSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService + for QueryConsumerChainsSvc { + type Response = super::QueryConsumerChainsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_consumer_chains(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryConsumerChainsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerAddr" => { + #[allow(non_camel_case_types)] + struct QueryValidatorConsumerAddrSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService< + super::QueryValidatorConsumerAddrRequest, + > for QueryValidatorConsumerAddrSvc { + type Response = super::QueryValidatorConsumerAddrResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::QueryValidatorConsumerAddrRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_validator_consumer_addr(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryValidatorConsumerAddrSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Query/QueryValidatorProviderAddr" => { + #[allow(non_camel_case_types)] + struct QueryValidatorProviderAddrSvc(pub Arc); impl< T: Query, - > tonic::server::UnaryService - for QueryConsumerGenesisSvc { - type Response = super::QueryConsumerGenesisResponse; + > tonic::server::UnaryService< + super::QueryValidatorProviderAddrRequest, + > for QueryValidatorProviderAddrSvc { + type Response = super::QueryValidatorProviderAddrResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request< + super::QueryValidatorProviderAddrRequest, + >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_consumer_genesis(&inner, request).await + ::query_validator_provider_addr(&inner, request) + .await }; Box::pin(fut) } @@ -2100,7 +4534,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryConsumerGenesisSvc(inner); + let method = QueryValidatorProviderAddrSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2116,25 +4550,25 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryConsumerChains" => { + "/interchain_security.ccv.provider.v1.Query/QueryThrottleState" => { #[allow(non_camel_case_types)] - struct QueryConsumerChainsSvc(pub Arc); + struct QueryThrottleStateSvc(pub Arc); impl< T: Query, - > tonic::server::UnaryService - for QueryConsumerChainsSvc { - type Response = super::QueryConsumerChainsResponse; + > tonic::server::UnaryService + for QueryThrottleStateSvc { + type Response = super::QueryThrottleStateResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_consumer_chains(&inner, request).await + ::query_throttle_state(&inner, request).await }; Box::pin(fut) } @@ -2145,7 +4579,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryConsumerChainsSvc(inner); + let method = QueryThrottleStateSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2161,15 +4595,15 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainStarts" => { + "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms" => { #[allow(non_camel_case_types)] - struct QueryConsumerChainStartsSvc(pub Arc); + struct QueryRegisteredConsumerRewardDenomsSvc(pub Arc); impl< T: Query, > tonic::server::UnaryService< - super::QueryConsumerChainStartProposalsRequest, - > for QueryConsumerChainStartsSvc { - type Response = super::QueryConsumerChainStartProposalsResponse; + super::QueryRegisteredConsumerRewardDenomsRequest, + > for QueryRegisteredConsumerRewardDenomsSvc { + type Response = super::QueryRegisteredConsumerRewardDenomsResponse; type Future = BoxFuture< tonic::Response, tonic::Status, @@ -2177,12 +4611,15 @@ pub mod query_server { fn call( &mut self, request: tonic::Request< - super::QueryConsumerChainStartProposalsRequest, + super::QueryRegisteredConsumerRewardDenomsRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_consumer_chain_starts(&inner, request) + ::query_registered_consumer_reward_denoms( + &inner, + request, + ) .await }; Box::pin(fut) @@ -2194,7 +4631,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryConsumerChainStartsSvc(inner); + let method = QueryRegisteredConsumerRewardDenomsSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2210,15 +4647,15 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainStops" => { + "/interchain_security.ccv.provider.v1.Query/QueryAllPairsValConsAddrByConsumer" => { #[allow(non_camel_case_types)] - struct QueryConsumerChainStopsSvc(pub Arc); + struct QueryAllPairsValConsAddrByConsumerSvc(pub Arc); impl< T: Query, > tonic::server::UnaryService< - super::QueryConsumerChainStopProposalsRequest, - > for QueryConsumerChainStopsSvc { - type Response = super::QueryConsumerChainStopProposalsResponse; + super::QueryAllPairsValConsAddrByConsumerRequest, + > for QueryAllPairsValConsAddrByConsumerSvc { + type Response = super::QueryAllPairsValConsAddrByConsumerResponse; type Future = BoxFuture< tonic::Response, tonic::Status, @@ -2226,12 +4663,15 @@ pub mod query_server { fn call( &mut self, request: tonic::Request< - super::QueryConsumerChainStopProposalsRequest, + super::QueryAllPairsValConsAddrByConsumerRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_consumer_chain_stops(&inner, request) + ::query_all_pairs_val_cons_addr_by_consumer( + &inner, + request, + ) .await }; Box::pin(fut) @@ -2243,7 +4683,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryConsumerChainStopsSvc(inner); + let method = QueryAllPairsValConsAddrByConsumerSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2259,15 +4699,58 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerAddr" => { + "/interchain_security.ccv.provider.v1.Query/QueryParams" => { #[allow(non_camel_case_types)] - struct QueryValidatorConsumerAddrSvc(pub Arc); + struct QueryParamsSvc(pub Arc); + impl tonic::server::UnaryService + for QueryParamsSvc { + type Response = super::QueryParamsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_params(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryParamsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainOptedInValidators" => { + #[allow(non_camel_case_types)] + struct QueryConsumerChainOptedInValidatorsSvc(pub Arc); impl< T: Query, > tonic::server::UnaryService< - super::QueryValidatorConsumerAddrRequest, - > for QueryValidatorConsumerAddrSvc { - type Response = super::QueryValidatorConsumerAddrResponse; + super::QueryConsumerChainOptedInValidatorsRequest, + > for QueryConsumerChainOptedInValidatorsSvc { + type Response = super::QueryConsumerChainOptedInValidatorsResponse; type Future = BoxFuture< tonic::Response, tonic::Status, @@ -2275,12 +4758,15 @@ pub mod query_server { fn call( &mut self, request: tonic::Request< - super::QueryValidatorConsumerAddrRequest, + super::QueryConsumerChainOptedInValidatorsRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_validator_consumer_addr(&inner, request) + ::query_consumer_chain_opted_in_validators( + &inner, + request, + ) .await }; Box::pin(fut) @@ -2292,7 +4778,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryValidatorConsumerAddrSvc(inner); + let method = QueryConsumerChainOptedInValidatorsSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2308,15 +4794,17 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryValidatorProviderAddr" => { + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainsValidatorHasToValidate" => { #[allow(non_camel_case_types)] - struct QueryValidatorProviderAddrSvc(pub Arc); + struct QueryConsumerChainsValidatorHasToValidateSvc( + pub Arc, + ); impl< T: Query, > tonic::server::UnaryService< - super::QueryValidatorProviderAddrRequest, - > for QueryValidatorProviderAddrSvc { - type Response = super::QueryValidatorProviderAddrResponse; + super::QueryConsumerChainsValidatorHasToValidateRequest, + > for QueryConsumerChainsValidatorHasToValidateSvc { + type Response = super::QueryConsumerChainsValidatorHasToValidateResponse; type Future = BoxFuture< tonic::Response, tonic::Status, @@ -2324,12 +4812,15 @@ pub mod query_server { fn call( &mut self, request: tonic::Request< - super::QueryValidatorProviderAddrRequest, + super::QueryConsumerChainsValidatorHasToValidateRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_validator_provider_addr(&inner, request) + ::query_consumer_chains_validator_has_to_validate( + &inner, + request, + ) .await }; Box::pin(fut) @@ -2341,7 +4832,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryValidatorProviderAddrSvc(inner); + let method = QueryConsumerChainsValidatorHasToValidateSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2357,25 +4848,32 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryThrottleState" => { + "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerCommissionRate" => { #[allow(non_camel_case_types)] - struct QueryThrottleStateSvc(pub Arc); + struct QueryValidatorConsumerCommissionRateSvc(pub Arc); impl< T: Query, - > tonic::server::UnaryService - for QueryThrottleStateSvc { - type Response = super::QueryThrottleStateResponse; + > tonic::server::UnaryService< + super::QueryValidatorConsumerCommissionRateRequest, + > for QueryValidatorConsumerCommissionRateSvc { + type Response = super::QueryValidatorConsumerCommissionRateResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request< + super::QueryValidatorConsumerCommissionRateRequest, + >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_throttle_state(&inner, request).await + ::query_validator_consumer_commission_rate( + &inner, + request, + ) + .await }; Box::pin(fut) } @@ -2386,7 +4884,55 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryThrottleStateSvc(inner); + let method = QueryValidatorConsumerCommissionRateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Query/QueryConsumerValidators" => { + #[allow(non_camel_case_types)] + struct QueryConsumerValidatorsSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService + for QueryConsumerValidatorsSvc { + type Response = super::QueryConsumerValidatorsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::QueryConsumerValidatorsRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_consumer_validators(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryConsumerValidatorsSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2402,15 +4948,15 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryThrottledConsumerPacketData" => { + "/interchain_security.ccv.provider.v1.Query/QueryBlocksUntilNextEpoch" => { #[allow(non_camel_case_types)] - struct QueryThrottledConsumerPacketDataSvc(pub Arc); + struct QueryBlocksUntilNextEpochSvc(pub Arc); impl< T: Query, > tonic::server::UnaryService< - super::QueryThrottledConsumerPacketDataRequest, - > for QueryThrottledConsumerPacketDataSvc { - type Response = super::QueryThrottledConsumerPacketDataResponse; + super::QueryBlocksUntilNextEpochRequest, + > for QueryBlocksUntilNextEpochSvc { + type Response = super::QueryBlocksUntilNextEpochResponse; type Future = BoxFuture< tonic::Response, tonic::Status, @@ -2418,15 +4964,12 @@ pub mod query_server { fn call( &mut self, request: tonic::Request< - super::QueryThrottledConsumerPacketDataRequest, + super::QueryBlocksUntilNextEpochRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_throttled_consumer_packet_data( - &inner, - request, - ) + ::query_blocks_until_next_epoch(&inner, request) .await }; Box::pin(fut) @@ -2438,7 +4981,7 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryThrottledConsumerPacketDataSvc(inner); + let method = QueryBlocksUntilNextEpochSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2454,15 +4997,15 @@ pub mod query_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms" => { + "/interchain_security.ccv.provider.v1.Query/QueryConsumerIdFromClientId" => { #[allow(non_camel_case_types)] - struct QueryRegisteredConsumerRewardDenomsSvc(pub Arc); + struct QueryConsumerIdFromClientIdSvc(pub Arc); impl< T: Query, > tonic::server::UnaryService< - super::QueryRegisteredConsumerRewardDenomsRequest, - > for QueryRegisteredConsumerRewardDenomsSvc { - type Response = super::QueryRegisteredConsumerRewardDenomsResponse; + super::QueryConsumerIdFromClientIdRequest, + > for QueryConsumerIdFromClientIdSvc { + type Response = super::QueryConsumerIdFromClientIdResponse; type Future = BoxFuture< tonic::Response, tonic::Status, @@ -2470,12 +5013,12 @@ pub mod query_server { fn call( &mut self, request: tonic::Request< - super::QueryRegisteredConsumerRewardDenomsRequest, + super::QueryConsumerIdFromClientIdRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::query_registered_consumer_reward_denoms( + ::query_consumer_id_from_client_id( &inner, request, ) @@ -2490,7 +5033,52 @@ pub mod query_server { let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { - let method = QueryRegisteredConsumerRewardDenomsSvc(inner); + let method = QueryConsumerIdFromClientIdSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/interchain_security.ccv.provider.v1.Query/QueryConsumerChain" => { + #[allow(non_camel_case_types)] + struct QueryConsumerChainSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService + for QueryConsumerChainSvc { + type Response = super::QueryConsumerChainResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::query_consumer_chain(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = QueryConsumerChainSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -2551,20 +5139,8 @@ pub struct GenesisState { #[prost(message, repeated, tag = "2")] pub consumer_states: ::prost::alloc::vec::Vec, /// empty for a new chain - #[prost(message, repeated, tag = "3")] - pub unbonding_ops: ::prost::alloc::vec::Vec, - /// empty for a new chain - #[prost(message, optional, tag = "4")] - pub mature_unbonding_ops: ::core::option::Option, - /// empty for a new chain #[prost(message, repeated, tag = "5")] pub valset_update_id_to_height: ::prost::alloc::vec::Vec, - /// empty for a new chain - #[prost(message, repeated, tag = "6")] - pub consumer_addition_proposals: ::prost::alloc::vec::Vec, - /// empty for a new chain - #[prost(message, repeated, tag = "7")] - pub consumer_removal_proposals: ::prost::alloc::vec::Vec, #[prost(message, optional, tag = "8")] pub params: ::core::option::Option, /// empty for a new chain @@ -2574,12 +5150,8 @@ pub struct GenesisState { #[prost(message, repeated, tag = "10")] pub validators_by_consumer_addr: ::prost::alloc::vec::Vec, /// empty for a new chain - #[prost(message, repeated, tag = "11")] - pub consumer_addrs_to_prune: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "12")] - pub init_timeout_timestamps: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "13")] - pub exported_vsc_send_timestamps: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "14")] + pub consumer_addrs_to_prune_v2: ::prost::alloc::vec::Vec, } impl ::prost::Name for GenesisState { const NAME: &'static str = "GenesisState"; @@ -2620,10 +5192,9 @@ pub struct ConsumerState { >, #[prost(string, repeated, tag = "7")] pub slash_downtime_ack: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - /// UnbondingOpsIndex defines the unbonding operations waiting on this consumer - /// chain - #[prost(message, repeated, tag = "8")] - pub unbonding_ops_index: ::prost::alloc::vec::Vec, + /// the phase of the consumer chain + #[prost(enumeration = "ConsumerPhase", tag = "9")] + pub phase: i32, } impl ::prost::Name for ConsumerState { const NAME: &'static str = "ConsumerState"; @@ -2636,7 +5207,7 @@ impl ::prost::Name for ConsumerState { } } /// ValsetUpdateIdToHeight defines the genesis information for the mapping -/// of each valset udpate id to a block height +/// of each valset update id to a block height #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ValsetUpdateIdToHeight { diff --git a/src/prost/interchain_security.ccv.v1.rs b/src/prost/interchain_security.ccv.v1.rs index 575d0449..4c0122a9 100644 --- a/src/prost/interchain_security.ccv.v1.rs +++ b/src/prost/interchain_security.ccv.v1.rs @@ -1,4 +1,142 @@ // This file is @generated by prost-build. +/// ConsumerParams defines the parameters for CCV consumer module. +/// +/// Note this type is referenced in both the consumer and provider CCV modules, +/// and persisted on the provider, see MakeConsumerGenesis and +/// SetConsumerGenesis. +/// +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerParams { + /// TODO: Remove enabled flag and find a better way to setup integration tests + /// See: + #[prost(bool, tag = "1")] + pub enabled: bool, + /// ///////////////////// + /// Distribution Params + /// Number of blocks between ibc-token-transfers from the consumer chain to + /// the provider chain. Note that at this transmission event a fraction of + /// the accumulated tokens are divided and sent consumer redistribution + /// address. + #[prost(int64, tag = "2")] + pub blocks_per_distribution_transmission: i64, + /// Channel, and provider-chain receiving address to send distribution token + /// transfers over. These parameters is auto-set during the consumer <-> + /// provider handshake procedure. + #[prost(string, tag = "3")] + pub distribution_transmission_channel: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub provider_fee_pool_addr_str: ::prost::alloc::string::String, + /// Sent CCV related IBC packets will timeout after this duration + #[prost(message, optional, tag = "5")] + pub ccv_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// Sent transfer related IBC packets will timeout after this duration + #[prost(message, optional, tag = "6")] + pub transfer_timeout_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// The fraction of tokens allocated to the consumer redistribution address + /// during distribution events. The fraction is a string representing a + /// decimal number. For example "0.75" would represent 75%. + #[prost(string, tag = "7")] + pub consumer_redistribution_fraction: ::prost::alloc::string::String, + /// The number of historical info entries to persist in store. + /// This param is a part of the cosmos sdk staking module. In the case of + /// a ccv enabled consumer chain, the ccv module acts as the staking module. + #[prost(int64, tag = "8")] + pub historical_entries: i64, + /// Unbonding period for the consumer, + /// which should be smaller than that of the provider in general. + #[prost(message, optional, tag = "9")] + pub unbonding_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, + /// !!! DEPRECATED !!! soft_opt_out_threshold is deprecated. see docs/docs/adrs/adr-015-partial-set-security.md + #[deprecated] + #[prost(string, tag = "10")] + pub soft_opt_out_threshold: ::prost::alloc::string::String, + /// Reward denoms. These are the denominations which are allowed to be sent to + /// the provider as rewards. + #[prost(string, repeated, tag = "11")] + pub reward_denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Provider-originated reward denoms. These are denoms coming from the + /// provider which are allowed to be used as rewards. e.g. "uatom" + #[prost(string, repeated, tag = "12")] + pub provider_reward_denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// The period after which a consumer can retry sending a throttled packet. + #[prost(message, optional, tag = "13")] + pub retry_delay_period: ::core::option::Option< + ::tendermint_proto::google::protobuf::Duration, + >, +} +impl ::prost::Name for ConsumerParams { + const NAME: &'static str = "ConsumerParams"; + const PACKAGE: &'static str = "interchain_security.ccv.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.v1.ConsumerParams".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.v1.ConsumerParams".into() + } +} +/// ConsumerGenesisState defines shared genesis information between provider and +/// consumer +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConsumerGenesisState { + #[prost(message, optional, tag = "1")] + pub params: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub provider: ::core::option::Option, + /// true for new chain, false for chain restart. + /// + /// TODO:Check if this is really needed + #[prost(bool, tag = "3")] + pub new_chain: bool, +} +impl ::prost::Name for ConsumerGenesisState { + const NAME: &'static str = "ConsumerGenesisState"; + const PACKAGE: &'static str = "interchain_security.ccv.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.v1.ConsumerGenesisState".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.v1.ConsumerGenesisState".into() + } +} +/// ProviderInfo defines all information a consumer needs from a provider +/// Shared data type between provider and consumer +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ProviderInfo { + /// ProviderClientState filled in on new chain, nil on restart. + #[prost(message, optional, tag = "1")] + pub client_state: ::core::option::Option< + super::super::super::ibc::lightclients::tendermint::v1::ClientState, + >, + /// ProviderConsensusState filled in on new chain, nil on restart. + #[prost(message, optional, tag = "2")] + pub consensus_state: ::core::option::Option< + super::super::super::ibc::lightclients::tendermint::v1::ConsensusState, + >, + /// InitialValset filled in on new chain and on restart. + #[prost(message, repeated, tag = "3")] + pub initial_val_set: ::prost::alloc::vec::Vec< + ::tendermint_proto::abci::ValidatorUpdate, + >, +} +impl ::prost::Name for ProviderInfo { + const NAME: &'static str = "ProviderInfo"; + const PACKAGE: &'static str = "interchain_security.ccv.v1"; + fn full_name() -> ::prost::alloc::string::String { + "interchain_security.ccv.v1.ProviderInfo".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/interchain_security.ccv.v1.ProviderInfo".into() + } +} /// This packet is sent from provider chain to consumer chain if the validator /// set for consumer chain changes (due to new bonding/unbonding messages or /// slashing events) A VSCMatured packet from consumer chain will be sent @@ -218,7 +356,7 @@ impl ConsumerPacketDataType { } } } -/// InfractionType indicates the infraction type a validator commited. +/// InfractionType indicates the infraction type a validator committed. /// Note ccv.InfractionType to maintain compatibility between ICS versions /// using different versions of the cosmos-sdk and ibc-go modules. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] @@ -253,249 +391,3 @@ impl InfractionType { } } } -/// ConsumerParams defines the parameters for CCV consumer module. -/// -/// Note this type is referenced in both the consumer and provider CCV modules, -/// and persisted on the provider, see MakeConsumerGenesis and SetConsumerGenesis. -/// -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerParams { - /// TODO: Remove enabled flag and find a better way to setup integration tests - /// See: - #[prost(bool, tag = "1")] - pub enabled: bool, - /// ///////////////////// - /// Distribution Params - /// Number of blocks between ibc-token-transfers from the consumer chain to - /// the provider chain. Note that at this transmission event a fraction of - /// the accumulated tokens are divided and sent consumer redistribution - /// address. - #[prost(int64, tag = "2")] - pub blocks_per_distribution_transmission: i64, - /// Channel, and provider-chain receiving address to send distribution token - /// transfers over. These parameters is auto-set during the consumer <-> - /// provider handshake procedure. - #[prost(string, tag = "3")] - pub distribution_transmission_channel: ::prost::alloc::string::String, - #[prost(string, tag = "4")] - pub provider_fee_pool_addr_str: ::prost::alloc::string::String, - /// Sent CCV related IBC packets will timeout after this duration - #[prost(message, optional, tag = "5")] - pub ccv_timeout_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// Sent transfer related IBC packets will timeout after this duration - #[prost(message, optional, tag = "6")] - pub transfer_timeout_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// The fraction of tokens allocated to the consumer redistribution address - /// during distribution events. The fraction is a string representing a - /// decimal number. For example "0.75" would represent 75%. - #[prost(string, tag = "7")] - pub consumer_redistribution_fraction: ::prost::alloc::string::String, - /// The number of historical info entries to persist in store. - /// This param is a part of the cosmos sdk staking module. In the case of - /// a ccv enabled consumer chain, the ccv module acts as the staking module. - #[prost(int64, tag = "8")] - pub historical_entries: i64, - /// Unbonding period for the consumer, - /// which should be smaller than that of the provider in general. - #[prost(message, optional, tag = "9")] - pub unbonding_period: ::core::option::Option< - ::tendermint_proto::google::protobuf::Duration, - >, - /// The threshold for the percentage of validators at the bottom of the set who - /// can opt out of running the consumer chain without being punished. For - /// example, a value of 0.05 means that the validators in the bottom 5% of the - /// set can opt out - #[prost(string, tag = "10")] - pub soft_opt_out_threshold: ::prost::alloc::string::String, - /// Reward denoms. These are the denominations which are allowed to be sent to - /// the provider as rewards. - #[prost(string, repeated, tag = "11")] - pub reward_denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - /// Provider-originated reward denoms. These are denoms coming from the - /// provider which are allowed to be used as rewards. e.g. "uatom" - #[prost(string, repeated, tag = "12")] - pub provider_reward_denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -impl ::prost::Name for ConsumerParams { - const NAME: &'static str = "ConsumerParams"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.ConsumerParams".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.ConsumerParams".into() - } -} -/// ConsumerGenesisState defines the CCV consumer chain genesis state. -/// -/// Note this type is referenced in both the consumer and provider CCV modules, -/// and persisted on the provider, see MakeConsumerGenesis and SetConsumerGenesis. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerGenesisState { - #[prost(message, optional, tag = "1")] - pub params: ::core::option::Option, - /// empty for a new chain, filled in on restart. - #[prost(string, tag = "2")] - pub provider_client_id: ::prost::alloc::string::String, - /// empty for a new chain, filled in on restart. - #[prost(string, tag = "3")] - pub provider_channel_id: ::prost::alloc::string::String, - /// true for new chain, false for chain restart. - #[prost(bool, tag = "4")] - pub new_chain: bool, - /// ProviderClientState filled in on new chain, nil on restart. - #[prost(message, optional, tag = "5")] - pub provider_client_state: ::core::option::Option< - super::super::super::ibc::lightclients::tendermint::v1::ClientState, - >, - /// ProviderConsensusState filled in on new chain, nil on restart. - #[prost(message, optional, tag = "6")] - pub provider_consensus_state: ::core::option::Option< - super::super::super::ibc::lightclients::tendermint::v1::ConsensusState, - >, - /// MaturingPackets nil on new chain, filled in on restart. - #[prost(message, repeated, tag = "7")] - pub maturing_packets: ::prost::alloc::vec::Vec, - /// InitialValset filled in on new chain and on restart. - #[prost(message, repeated, tag = "8")] - pub initial_val_set: ::prost::alloc::vec::Vec< - ::tendermint_proto::abci::ValidatorUpdate, - >, - /// HeightToValsetUpdateId nil on new chain, filled in on restart. - #[prost(message, repeated, tag = "9")] - pub height_to_valset_update_id: ::prost::alloc::vec::Vec, - /// OutstandingDowntimes nil on new chain, filled in on restart. - #[prost(message, repeated, tag = "10")] - pub outstanding_downtime_slashing: ::prost::alloc::vec::Vec, - /// PendingConsumerPackets nil on new chain, filled in on restart. - #[prost(message, optional, tag = "11")] - pub pending_consumer_packets: ::core::option::Option, - /// LastTransmissionBlockHeight nil on new chain, filled in on restart. - #[prost(message, optional, tag = "12")] - pub last_transmission_block_height: ::core::option::Option< - LastTransmissionBlockHeight, - >, - /// flag indicating whether the consumer CCV module starts in - #[prost(bool, tag = "13")] - pub pre_ccv: bool, -} -impl ::prost::Name for ConsumerGenesisState { - const NAME: &'static str = "ConsumerGenesisState"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.ConsumerGenesisState".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.ConsumerGenesisState".into() - } -} -/// HeightValsetUpdateID represents a mapping internal to the consumer CCV module -/// AND used in shared consumer genesis state, which links a block height to each recv valset update id. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct HeightToValsetUpdateId { - #[prost(uint64, tag = "1")] - pub height: u64, - #[prost(uint64, tag = "2")] - pub valset_update_id: u64, -} -impl ::prost::Name for HeightToValsetUpdateId { - const NAME: &'static str = "HeightToValsetUpdateID"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.HeightToValsetUpdateID".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.HeightToValsetUpdateID".into() - } -} -/// OutstandingDowntime defines the type used internally to the consumer CCV module, -/// AND used in shared consumer genesis state, in order to not send multiple slashing -/// requests for the same downtime infraction. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct OutstandingDowntime { - #[prost(string, tag = "1")] - pub validator_consensus_address: ::prost::alloc::string::String, -} -impl ::prost::Name for OutstandingDowntime { - const NAME: &'static str = "OutstandingDowntime"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.OutstandingDowntime".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.OutstandingDowntime".into() - } -} -/// LastTransmissionBlockHeight is the last time validator holding -/// pools were transmitted to the provider chain. This type is used internally -/// to the consumer CCV module AND used in shared consumer genesis state. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct LastTransmissionBlockHeight { - #[prost(int64, tag = "1")] - pub height: i64, -} -impl ::prost::Name for LastTransmissionBlockHeight { - const NAME: &'static str = "LastTransmissionBlockHeight"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.LastTransmissionBlockHeight".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.LastTransmissionBlockHeight".into() - } -} -/// MaturingVSCPacket represents a vsc packet that is maturing internal to the -/// consumer CCV module, where the consumer has not yet relayed a VSCMatured packet -/// back to the provider. This type is used internally to the consumer CCV module -/// AND used in shared consumer genesis state. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct MaturingVscPacket { - #[prost(uint64, tag = "1")] - pub vsc_id: u64, - #[prost(message, optional, tag = "2")] - pub maturity_time: ::core::option::Option< - ::tendermint_proto::google::protobuf::Timestamp, - >, -} -impl ::prost::Name for MaturingVscPacket { - const NAME: &'static str = "MaturingVSCPacket"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.MaturingVSCPacket".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.MaturingVSCPacket".into() - } -} -/// ConsumerPacketDataList is a list of consumer packet data packets. -/// -/// Note this type is is used internally to the consumer CCV module -/// for exporting / importing state in InitGenesis and ExportGenesis, -/// AND included in the consumer genesis type (reffed by provider and consumer modules), -/// hence this is a shared type. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConsumerPacketDataList { - #[prost(message, repeated, tag = "1")] - pub list: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for ConsumerPacketDataList { - const NAME: &'static str = "ConsumerPacketDataList"; - const PACKAGE: &'static str = "interchain_security.ccv.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.v1.ConsumerPacketDataList".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.v1.ConsumerPacketDataList".into() - } -} diff --git a/src/prost/proto_descriptor.bin b/src/prost/proto_descriptor.bin index 3603045be599b26f37414bcc96cd97687a53ba22..c9582823db431ffbdcdb5888b1432b91abdb71b0 100644 GIT binary patch delta 74037 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

x_0X$EtvXZa)UcV7j%rGoU$XKIqx*fyBa z6$G?xcrHr&4f2Est=U#IOe{zk=~7>X7&Yk-OYy+$a1hA}`%m*djNld3*ibU|6Wmot z_Y-wn>?)(hwnDTdt>QGNOkj1;!g57RN7IrLE}<13uSF4!k78C|G#tM{Djj%FJS#PS zsWv0=s?_`?HY4Fx>_Ey86EE#mj0Er%G4!O@EkIE~c@+bM9(jhLyov$B=kN?ec@+~V zT97U>fgcg`q*pOO;6IB3A_%Wyhrn|T;Z-c6#32FI z&q-H@)B;pq#mE)q;Z-ccVmsJyYy_mcz@RwS_XuEv%Z%@Fs})YMC;}Nm8R-%O5Pi7JP;RvV(TB?n?N;kBIK^INP{i%-(y10HsE>eE z(y108>R)9jr&@rhf0cpo+rp_9U&h8uUywjM)gl4a5uQm`Cr{X`4dqmeTvWfB!XgQ$ zT8D-3A!%bDr`nm4gZOYEX1@@tMQ-M-2Wzit>6c^ z2Zku_r5L^ZzEwvLLN?fUtAX&`BF>?MuM%nXW6o-O}> z2J4pVLpCG~GNacAdeQ$U9p?}N1p)h$5v`DM4jq;QKWYjE_irBO5FN#^&{I7udeVQl zj&q1y4C`)MK`)Y;QEu4!ivbs~Um0-0`ycqV{?FnZIxH7wA9O@`Ct-I)Aa#JsvlSo) z@fRKE5FiHe7XyL2>1g4wys(8pW&fSX-9IeO;S8wTQgrZ18*0)6(cAmdy`@+8_vtu? z=pK4|ACbJL=xu)3`kTRO+_~G$0{7#G7+z$fI+8TU=xO)gbVx#n<)ixF3=dUA&z^u2A5S(rub>orQHRY&~H7knrFG)Tg_ozt+LI&Y~G~8tv##htcT=(wz>Y z(+^OmDUPDU3gDRhzZyp|=CJ}{$_cl0okdIN$3r@fB0%)xA)@^PoHwAXJZkv*Mds7- zS{$r1E}^t}Ui;X&#+$4lwV#4I`igRnB?aeE!=aFI6cxsP-0;2d{YRS4*ESi3GJ4oc z%Fg4Y><9o)pq?m)vL+bK)uG0Ef>P*ZKBC3Imo_89HxfXKr!`9e0^QR(urolA;%P6! zH^?0*XYb{sRPtXLYpJ1Q4xlrBIx*YoxnwHE?jHH=4+ma=+EU z$@N4~9-81b!`C-bo5@>2?O0P+*3!Fn;UgDqceCDP&ddxht14ZXOuFMX8W=v_AVSi- zX87I#mv1qsxz0>=&ws=0L7|8GxO44L|8nISNwFVJ#UsY0aFnH&_02fUH$*AIl)JMy zRCu&>wI(g+HNzoGqiJP91YS4TKr!SjEde5hqCOx-4c@vNuyu^u*Va*a43P~*AQLDf zX$%nf-_jxW0D{JE(TQ?~z=zDY4K^h*Uf_$#i*D`HD(}L{5!Zb*5Xu!tmMjt60d+Kf zl9;!(mWEv5f16@F%Fd9)yloUrmIH!(knsU2g_HPCKv(E+?;E~8kvaPkbzc^`=9?^k z^gh(@!Z_O0-!~91=%2(m1iksx@ck2v`+&k_t}cqsO0>tvV6^1f8y5y3M9tXvK93YC zXKiFO#C3!vcS1#=Xks#vXp!8az4cSWAq&1~<$zl|^?c3I+!84iqf$iE`C@-DDv^Wj z1X*%B0SKaep|=x&XypqXqY@x!`h`&;V^kt|P8bp9M2yO#iO5I*GDM`)$ixfwG%{k) zZXKgihThptF)GRWgJ?Qo>nqI9$jG$SDYdWFNuwrf1&T}FqcTu`rROg|^z$n{e*uE` zU+MWvpy2&iG=Cew8t5V48oo+AuAs@7ao=iD_)^!%;RP;xlZC~KoRO`9o2rOdYE33} z;adYn(kx&`7@fU_??Pq>F45k+*KqPA0G6H3U=+o(04q<}NF_}C%tPiG6qre7(p3oH zl(3V^+%uV4o%1xeMGA%16tQ+zFm+jyVcR;uT?w&IM&&_8NmLn?XN7+H5AYE5Vgo18bm8+Gu)ui+DqYk=mrHTxI(#}Ubi9w4?cl_C`XYEX0$TVN>6oTO#@uxHJExw zyvB!Ta}iHdeWl7h=`|k1;}_iHV0wwD0pwb*>q*~wJW|0TNzWtV&8>)uQQ24>M-+wh zJrl)+85ganSTLX(pN!HETIJ`DVol3p%ke5k2nsD``U^*R+pWUNq^Le#z2f;6T=(z{ zmOj@+U%P^L;8N++zW}1RkJtDDy}~FB1Y-v&F?h`}BKmm@S4WbRG!4$9m`>$_P=Ho3 z%rJx#^&Fq{CvfDv$`fWh6w(OEjJFDw7KM<^c&nJ&7f~3zS;f@8NT8TktC+Ir=Fz*a z)eO8Gx$h>?Jq4Q6!<6=fZku9DqPT9G41lY3zzg6)+p8(y1zkNtk-doF>xnd3NN2r> z;&jlAL)4XvneR$9<47~SnBodjxiBWxT0P^!ffU_6$^@NziJo#{aWP>DSZBI=#)b8a z6Dc&~!n7M+`U7X&@tAU`h%uw495X<4_)KO+R^uAQjI08ksnsH%b{(452 zl<65Kc1q-+6=dmFXvVGAGY+{xvtG|QfM{jCo^b?<8MmHh9LZ6bCfsF0j=oQfPy`L4 zjPp|=IDpaOWm=8^qQ%R!905d&muWd7P{`3`Bu5nZG)%>>AUQhp`{W35YlS`|MF|zq zK5FOzlNev2MG3hApAsdU53XXq?m|RJgTIPF1v(j`R2a6eX1==+N#>`tF?^r15CvkQ zC?v`BI*_D@CNNP@94NQ$a z3+3h@V4Zobmej()NU=MJ1f6@G7S%#6sv?EfWkeXEP=oF-w)4S4IFJBZ-Jod&5FNQe z3kN{Z>IN+w0Kuvov~Un8gyRMh4w?yt#ORw2aweqIMLjK6sEBT$reqmFfk*{r1c+|j zq-O#^bmJyH69^R9m8#MBF;9qF{?t%ND-uE^8sfh zilAR8qx(fOVzZu*h1129*sNzHN`tC27Ef-7KiQonC}ft$M3na z>+Ib~=i5n2zz7#TB)yL!G713m>#ur}6zfSMQYgSY9*e?+z`A}&Nxm>ex*UgmVfp}5 z@ebq*(+8OPkWw*m{vnqBkP;F=1uyO+Kv6&ibOHz_KSWfRD0+ZJ_7Mu`wBHXY6$>## zzU~P%_K4m$kPBRo&}Mtmi3&=fC*{ z13D^us)t3_^UpICI0LyD*7FoTR9r9=Q`CeP8I1G)Z!Z|o4@_WmMDB(FF^CtLx?li^ zLA*#GxR;!x>-`rQ9?H`NLor38646!vZ+}QhUofCW^cGF(-cqcqZRy^UW570qK~%jZ z#{dzrm5i*#q{t)Osx-0+^%6;_k2K9Py3~I~D;~&2{a3W!0Z<@NCrSc^-th|Q9Tc3S z7!@hB>Op;gbO>1wyMBR`&e{k10IBLUc@m%<-DxtkZ%=ocJPEclb;D3hjs&lhnEkH@ z=KyN-1Gwc413>iSb*6%I07O4tXSiXYBXJ4LsmwP}=r<)Ohrp!$`8;HlhV6HlZ#NXD zslvd8$OY-oSn4YWp~mUh?(%Ek^`c-BYH{cDi#)HCqKS9ts6_fyDWvpWtxuI|eM+Pt zoV;a~l0x+%X{i4dmA-{!_E1J%L^G9NC)Le24ouS5m+4bQiCVAqX0q4549KqgcyFP z)n5XI7=B1%NT-}qQnx-K?W|JJ&9%1kJonnK5u{Z&N4g$L=;lb*`$X$!sE+17A^i+a z-M|K2ZzogXtpQ=#0w`@R08w=(E0D_rKvdmH%LACS?>%j)FJyu~O#p82^52MI_VIkPXn2e=YD*Uqm${73rQFRyVCO>Ba z5LI`vkt0VTmNK)th3&7I?;FV6w0&i+t3f?|-PK7nrJQv`Ghb80S?W?ZlB0j(+#&i4 z2vi0rsSFTh|EbRv0MVs?l163Fcder%_fLY+Ke#4BUL@>loQIExu z9riX7^9b;Nr)53@ncs_(t~iuMw9JbXy3vSGSI;yLc%z}OH@x}froQ1e`87b*St`E= zD+LPJFjSzELj{PgoT)>t0mM+xq)=-l6#yX>XPWA=gFqp_XPSkRM9l68$<$d0{?YaJ zrm+ECa_=5{5ubEUL{3;dUX+t|pW%wI z)?FGRU4$y@mZ+;Mb!@DN5dW1Fk4O%b#DAsPONQ}8t{mt}GdfFroGU`oe;!518RSM& z!J?E$>HRfLa|4An5ovCmXR3(@Oac`q-f?1#m>UWoI-@ggIhVWH zZ?eFseWzUKYm+h%d#&k|dl6Vp#~VJk{E$%Z%@_0w6&micEGOG-USj3DUp{PgcT+#( zjypJ)_plJPzs!BDf2g<*ViqOayS}gO@>th>sekBn;}`A;m7(rVcsln}7$f)R>v@H{ zU_hv_d=9{Ptw@cB3%S3kvAMCmlpg8&YX#t*S{aH5cbVKjnfNE;O)ME0>Yhr6^)OLf zhxHi9!-$Tqe3$S8u_)?hiKo$KZ4Poo9L<`R`H9w9;i0_HyGzLUtgDFgl3n{RLV%>& z>R@-NtB%;? ze4u;AVWEL;!_d&QRK*NFK=gHDQ`4MSV_On^o{X1F6LI%FX*vCp5#tX=tZN!7@Dz36 z!Jw1w2jNr7cz!Edt%JnXVOdlWD554FY9C22>ihqwu}$`fIy6T)>P&2D@OqX*_0vTv zz5wxQAnBz2)CwOdm{2sS?6X&Ul`M}nH;t*#@hhi?9L>CNphTU8oEhX8Uh`LGvB@My}u;cm~_v~IUv{l-*WHU z@4N3VA2_A*hJS~RXgCvl2ATS2(r#$8(-QR|43z{DsPiTmT3MWFeUZ}=h}XNhNVwQZ zGPu;1%6p^TooK%Db{f9e31ylua{uk2j9B4cf+O9OndYhGV)&rY^B+saJl^zjBWBPZ zwDOCpum3W&A>Gt6t^T!+J1{ubKRU#(*O@_7>DCp>yYmqepf#Sb(oc=(o}3pg%`%nt zj<8eJkx_5W@NT_w&dKjr<|=y= zH-s`~&=#IlSHQ%{k{d&5waKP1&Nd1?kxAQkXl1$X@wBsC(a06|24=^SOtDQ|iiXyF z(L+nyJBHSLRYTk4WauR@IM&N1aC^slIi^P@dCCfQr+LXOWFWV9eAT{@{@n%em5@Jq zUYF7~+*wGWKZxmYfLy~IslFm>t~BED!l zQ!9S9{AHP2<}bL!so=_D(<{>iA=(|U4c-;MaBc9?-~t5&dhg+wBV(Hphi15A@Cr48 zn$&`A`h-Uw1SUBvlP00j$xv}1dnc%t-o2*m+Xq%dORi;j z2=l0YK;C*v6vtLOh3Cm*SmEjX#n~qWT+U3XhbPMy4@fR?1=y(Xv7N}-<>kLtx&lqpPQ~dn2ey*P%hstU9 zAbXrtJ|L!g_8DXD)i{e;aBgQYVJil(jeDIeuXh_V zbX0}vD<`d#tHNjGw`<*RhT6aK+V8$DTEZ*n!cib&wQfl6XmAtK$EvSnzW1u?EBPXD zRrp=YiO}4S$m<&2Mw!y+Cdn5Y-9^XoD_20B#3>{euTXAV;J#ZLzDei_bzUAX+`)Uy z-1BDAGb7T;d2`R3SFWvf8?rU;fMEi2Ikn}|-S3tw?q}tGw^IF@dpsdkcKspX$Rqo~ zCPx>#p&EAQG!~|Iojuvk;*P?KINB@|BWI~z4`RCn@BR%n)^FA-9+F}Z}@vPYt?w&SlN^o@>WWHMM z`j|t8dC((rRrv1(Y~E=iDFeBYysLa+=(9e`z z9KI+{Sx3K@mHC#b)8SkszGpcZQ-<8@j*63hKfZUrwP`B0Nv&%eUn*skWWT^?Q< zA6wq5lBSL*yZD*&IWB$L7c!>pd4Oo4@u1z1%wEqyG5K|9 z^fxV*x7Iqd!;2}x623xaxL7Q=BmGfzSd}ezSI5YQz~Vruu7(`?ED6*Y2$eP`FVg)B z#YO*8|FRC<4GD%?{`OTo_y7guimhTzLS#bSCeM3ZL0mXKQ8S9Db&~=b;LswCIy$da z=xM!qI*_1_Uk;b$@|J&wUU6BU>%<5jsBaChQwM@T{VG4Z-XI9nuTF%&O`aX}8r$Y? zH#084)ay^{nRZC_*NY7aFwy4KsrVHpl4(TXLw)fe0>Q+`NV07<`AGs`_K*PlP_j`LAdJYP(6J5QlLP7OB;;x!W=15*QmDOIk#5~Bt*vKiY4ysjL*3$NzBh2 z6&%md*r%w9Hz>Mi0!`HIQ?4{XEctQj4OHvC4uRMmezRxb71!=dT&jr;f!Lja{;j&_ zL#F5X+t)ztOjL)L-rZtvLgaG!zm~We@a{JG_%+>4s&8q zlq{{sJ9iDK>h*H{L~sVA-W*Yu#XyzbG+`I=6zE|R z*Fn4m>om-ptCDNOw_2T4KGPF5{pRZsw*W>~H(BB^TCi2MK(;M$6N6?%IG_!l zm8MaqZxEAcBjc)@EF7?k)FjY$lZ6vjgP`rNEgZ2>;stF91s$ zfJmudw|w6K(?k!+V47m^90JQtdevsO={6YCQT+trcm}9mKmmf7+l<{DKw!U(?B=Li z7*a~h_f1_by~;{*!a;GfEihxs%|{8>3m9ke?G}985t0P`8IKk;r~lzUC|R^v7R$ zH9d8c=^M=@EaABAjuY+n0g9FWV2iH-cPz2s+u0Oa@g_US-IM}MfJ2W?{ z7gP{{rh|y|-rFUAei;0mkGizAf1AY?9%$qQy`KC|gdQ%%4w~DiU z4pI@Xq;F!F!|~SEz^@i{9%{r8qDtjT1R(I=V}VQ7slb1a1ubx>i|}*qeU@(}PYil< zzR%1HoBHuSYwmI`1_({MtMj@(Fe&WPZhT#X)5AY5D(N2ZO)}cKUdl2CmuM(Jd`zMAF`PZBs#O@#yrc|^8 z=3$)xMlT;48;sXcS*y*i*h3c)poW)SbOF?!V%SF)K}kf&ik_(6^f`^~BgT^iQqfb0 zq&r7>lJHX}KS~`pRne2qmBS}Pb7JTM9KwV~Bc)?^>N23dA(e){eftoxsc+{n+f{(~ zjJCtFg%?UybmQPSLWo}y-Qm%0-ln0!NQ%M-rd|Lk&XICIAqP zIA+XW0iqGdj3WtvXv8r~>v@t_L;rCang8EzPnC==tX{aSV&*O1wNze1RaU=oq zK<#nr@(S*8oDEN6?MCwA8$2JbFeRrg&d*w($YBPMv_7AVFK5#Fe3F)P9oL3i0KA5* zj1+NgCU`XkUP{*rb$$`TAS07f&H;!DpSHAe4nS1+G z3YW1Osh=46XZ|8b6}8~Ha1{KP)JTB_eF{9L7f5~cnfQiC>YL9PM-_fz+n@b^>Zl^V zoX8y&>Q-u`zyvy;HI6C(f{tg&QH9!=;f)IZMU;ZCpM4<#G)*8U0Y5a%2vSk>hgJp& zWoRb~{FCK7p--6vYi-#7Pgby$54Hr%?;pWQ5*rIAD2q0Ri5;TE=PhmSoS|byIfI5aT17^n#%aAn1C*3Mm!}An1C*LO3g(8S~)0TU8c4*=x6TJ;SeFuiElF?e_Tspb2b?g3ix zKed8oY~T)mhj6MPcdy1<;EnnB$QuWhfggAeXd zTA#0)-kpICJZXA&hU#60sdp*yHPgE@RPVlKC8E2jduI?`r>T1{*pA;I=d>XQAds9k zhGKGIB=<|p z_lE9O+Dd+DdKGRH!~WN)SC?Lb->CC-Lp?y`eBDqF5Ouyz)DzQ1dgSo;z+K7O-4?5u zvKy7(TE2hP$XMZ;_*yaxW49+~WMZ3J+@L(3oH0Cr@_2H_I6PDyPtI6yct|%#lmsbn z%3W=)Y{GAl3BMJJdjLpjOA35a6!1cz49wKOO5`(elOK)7?V5z#pw(J?|Lo3*=o(s0IMSxdKovAAo4>yXIU0h@$UW&<>&2 z0z_-ywGjJ_u;2pvf#v&1BcTi82Uf6_muMmlwEN+-*`!YgBmxN%)iMHzq92-F3Lubt zXl4`ch##{f4sIpg^gdRt)P6EPv4pw;Dc=|XRZ9S(??16z6{MSeV>APiG*h4_>fE3LR>YRYGp*eu^}aaUYK{eVws0KTaP07QY$%+v*l zsy{Oe4Vq2SqZetzRQVHIF19^bSBZ3jm_-YeZg|N{ulGe~o~HQkrM*nsu%4 zDc>dJ72{d~=9#)}7Owfi_gA{x$g=-B0Y9sRZx(gi^+MEhjevj;plS<120In_El9JpEdZbhxDX(J}<@|y)#O(&W&o2or5L_=f+b3Mdm zPZP(QE3?N$kI8-i+ew#qt#$)DP#)_H6{y(>5Of_jb~*ro?63%{(E$j$4vRWkv25A? zb>aJlZY^1!e_aI0cfYm|zYVRGKPYx{=PUQG$_o58(=3F6m%{gtx;Po>N)epLQ;%b` z9})6jTHKaPsq0mc@FQlN03tg)9H`y|2)d4#IR_BKbVTTbnn0e}M+6S)ji8QWh{KUV zHB4FPs&1|(@~7Vo1i;-0HQmDzVM@FAi9IhzIAT2@(w{7Pw@SMRAPtk z5VMQe+X2OU4%{Wgy|7tmJRc>~UUVnZga{3&m#j=tky;@tMDtz76kUaAzRQ@R1H>tN zmk8f0Y)zF-RNW;~i+RaV2DU@L+t{Jg7d}1iAv<*P)4*|_?-L?BV$Y9mlCNCuWK9~A z?P{VT6Uag?(^qt3y-x&{_yMWFdLMWOc2!Hkm;-Qp@DL37TY1DuuZX0*N|vq-`9I%| zUw1fNCsB>*3A#?+FG4JO1l4q%yk8U*vr#@k^u+yQ?nBxppFVKQABeYHd-{ElT23x? zDL``oJ`@Tc`3nf8H5{Ana6l7ES4Phlg9^qBUkrv&x-xz@PAEM80_ogGJVFDC(1+uM zYHz^bBSP0QpMN0?`^v$PYH<(W+RZm8^HGd0Lo5arA`5v%u@ z2q`-VR0<*<6L1)%RuS0>J|;?bXd<+&;A3K5uhYv-1&?5QN_zGHK#2y|OMe2|Pi1Nn; z{Q8nN_%vMT0&sfp4Aya5yc?8`q-y-&m>l?CsD`fs$PU_&-!z{1FE~k1j1p2&_md(! zS5HzGWB;Vcdj`vuPBf$|)0d}=;|Th~)AnhB7cY~C7wiw>3l?|1XYp8?1J5dI!P?kF zt5F`L}%sEMR-=6RL%I-_`g!mE;*Bjh?2Sj-R-m-w8Rp$vl3*mdf2Vh#z`*=59! zgztaogNi&r{0K&oF+S+vt^t=$A(Xrn5KdEo3JX9C^z*`HEd`jJ(y8^ls8FVG0MYK} z#X<_^K!%rr9}C}4G!`u%3Qqr6Jw{7I(OY8cqoiY6Yko z2M~Er8cr!4FseOCJjFULi_}w!ap1nmVrKPJyf~fRr%c}<6{Sy^z5$57Ic55WK<=AU zrf*>V_jBQULsLz5d_Nb#2Hv}29v2S4I{S5R>(2VG95Sc|%|$(`xd4IW7v{JH2zq~E zj$43OzcBiKUGLrWfmiD<&E8F4c(wjYVDBcT8TMDd7QPB6M!Y21OZ}R-E*g`ZaNxJX z_dDIX93=f#;IcukI&)}D&InN)spA>=7d=Pn*GM%xPy-r z7|zk#n4#~mYh*{MYBMNBn?b5-Ge9)tEn_YW5KVrI%!R4RdEvmn3Ev-elk<@C-$bz7 znM>zw9yR$7SQ3$DMQ{AAQFHh5A1)TTG1Cl%9;JXD#T0sgsPqqJ=>P=!KNxO2KOA^Z z_&(6+^O5sCq0MFU3H$qIK>|Xp09CC3k@tPBmH0)#sP=tRZ8RMCQ20L8)kcx^Ljkz~ zt@9{V`w`5a`4j|%Y5}Th0V3~5#?~1iYW>LAI!B2y{u5Y4U6e#20Ar>sE%HAZ=Tpdx zvVS6GP@x5b{xJ@8U6y!mfTk$b{IT(&5@nYAWAdS*ilU-Vgf_8`Qb0Nal`t7#3}rtt zHr9YSx3;kch`r?#V`EJqugg!2iFK5;!eE80E~bD`IY7m=07TvYAqv&29YECmAEK7T zD%6u`!=G^o@zXMaC<|B}`T$Y(&myZ*x0o2!KZ}}L&q(qgOPpG1{T{lc_pWzO+XasV zR$u5|YC`?)6!pqrZ4vMBcd~m?bkmg4tℑA2m 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 Date: Wed, 18 Sep 2024 12:54:16 +0200 Subject: [PATCH 2/5] Re-export well-known-types from tendermint-proto --- src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index bb1a1bdc..0415c819 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,6 +44,9 @@ pub const NFT_TRANSFER_COMMIT: &str = include_str!("NFT_TRANSFER_COMMIT"); #[cfg(feature = "proto-descriptor")] pub const FILE_DESCRIPTOR_SET: &[u8] = include_bytes!("prost/proto_descriptor.bin"); +/// Re-exports well-known types from tendermint-proto +pub use tendermint_proto::google; + pub mod cosmos { pub mod app { pub mod v1alpha1 { From 9673ddf70674b7b9d97f2072ef6485b2776d940a Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 24 Sep 2024 16:40:34 +0200 Subject: [PATCH 3/5] Update ICS protos --- src/INTERCHAIN_SECURITY_COMMIT | 2 +- .../interchain_security.ccv.provider.v1.rs | 304 ++---------------- src/prost/proto_descriptor.bin | Bin 820413 -> 819906 bytes 3 files changed, 21 insertions(+), 285 deletions(-) diff --git a/src/INTERCHAIN_SECURITY_COMMIT b/src/INTERCHAIN_SECURITY_COMMIT index 121c6e0d..e24485e4 100644 --- a/src/INTERCHAIN_SECURITY_COMMIT +++ b/src/INTERCHAIN_SECURITY_COMMIT @@ -1 +1 @@ -7994f3050a2821a3234f571a889b87c8d27a294c +1e60637f9d8f3505208282416abfbb87fabc4795 diff --git a/src/prost/interchain_security.ccv.provider.v1.rs b/src/prost/interchain_security.ccv.provider.v1.rs index 6f96adc3..8a2d0d22 100644 --- a/src/prost/interchain_security.ccv.provider.v1.rs +++ b/src/prost/interchain_security.ccv.provider.v1.rs @@ -853,7 +853,7 @@ pub struct MsgAssignConsumerKey { #[prost(string, tag = "3")] pub consumer_key: ::prost::alloc::string::String, #[prost(string, tag = "4")] - pub submitter: ::prost::alloc::string::String, + pub signer: ::prost::alloc::string::String, /// the consumer id of the consumer chain to assign a consensus public key to #[prost(string, tag = "5")] pub consumer_id: ::prost::alloc::string::String, @@ -1120,20 +1120,6 @@ impl ::prost::Name for MsgConsumerAddition { "/interchain_security.ccv.provider.v1.MsgConsumerAddition".into() } } -/// MsgConsumerAdditionResponse defines response type for MsgConsumerAddition messages -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct MsgConsumerAdditionResponse {} -impl ::prost::Name for MsgConsumerAdditionResponse { - const NAME: &'static str = "MsgConsumerAdditionResponse"; - const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgConsumerAdditionResponse".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgConsumerAdditionResponse".into() - } -} /// \[DEPRECATED\] Use `MsgRemoveConsumer` instead #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -1161,20 +1147,6 @@ impl ::prost::Name for MsgConsumerRemoval { "/interchain_security.ccv.provider.v1.MsgConsumerRemoval".into() } } -/// MsgConsumerRemovalResponse defines response type for MsgConsumerRemoval messages -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] -pub struct MsgConsumerRemovalResponse {} -impl ::prost::Name for MsgConsumerRemovalResponse { - const NAME: &'static str = "MsgConsumerRemovalResponse"; - const PACKAGE: &'static str = "interchain_security.ccv.provider.v1"; - fn full_name() -> ::prost::alloc::string::String { - "interchain_security.ccv.provider.v1.MsgConsumerRemovalResponse".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/interchain_security.ccv.provider.v1.MsgConsumerRemovalResponse".into() - } -} /// MsgRemoveConsumer defines the message used to remove (and stop) a consumer chain. /// If it passes, all the consumer chain's state is eventually removed from the provider chain. #[allow(clippy::derive_partial_eq_without_eq)] @@ -1270,7 +1242,7 @@ pub struct MsgOptIn { pub consumer_key: ::prost::alloc::string::String, /// submitter address #[prost(string, tag = "4")] - pub submitter: ::prost::alloc::string::String, + pub signer: ::prost::alloc::string::String, /// the consumer id of the consumer chain to opt in to #[prost(string, tag = "5")] pub consumer_id: ::prost::alloc::string::String, @@ -1310,7 +1282,7 @@ pub struct MsgOptOut { pub provider_addr: ::prost::alloc::string::String, /// submitter address #[prost(string, tag = "3")] - pub submitter: ::prost::alloc::string::String, + pub signer: ::prost::alloc::string::String, /// the consumer id of the consumer chain to opt out from #[prost(string, tag = "4")] pub consumer_id: ::prost::alloc::string::String, @@ -1356,7 +1328,7 @@ pub struct MsgSetConsumerCommissionRate { pub rate: ::prost::alloc::string::String, /// submitter address #[prost(string, tag = "4")] - pub submitter: ::prost::alloc::string::String, + pub signer: ::prost::alloc::string::String, /// the consumer id of the consumer chain to set the commission rate #[prost(string, tag = "5")] pub consumer_id: ::prost::alloc::string::String, @@ -1728,66 +1700,6 @@ pub mod msg_client { ); self.inner.unary(req, path, codec).await } - pub async fn consumer_addition( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Msg/ConsumerAddition", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "interchain_security.ccv.provider.v1.Msg", - "ConsumerAddition", - ), - ); - self.inner.unary(req, path, codec).await - } - pub async fn consumer_removal( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Msg/ConsumerRemoval", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "interchain_security.ccv.provider.v1.Msg", - "ConsumerRemoval", - ), - ); - self.inner.unary(req, path, codec).await - } pub async fn create_consumer( &mut self, request: impl tonic::IntoRequest, @@ -1992,36 +1904,6 @@ pub mod msg_client { ); self.inner.unary(req, path, codec).await } - pub async fn consumer_modification( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/interchain_security.ccv.provider.v1.Msg/ConsumerModification", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "interchain_security.ccv.provider.v1.Msg", - "ConsumerModification", - ), - ); - self.inner.unary(req, path, codec).await - } pub async fn change_reward_denoms( &mut self, request: impl tonic::IntoRequest, @@ -2083,20 +1965,6 @@ pub mod msg_server { tonic::Response, tonic::Status, >; - async fn consumer_addition( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn consumer_removal( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; async fn create_consumer( &self, request: tonic::Request, @@ -2146,13 +2014,6 @@ pub mod msg_server { tonic::Response, tonic::Status, >; - async fn consumer_modification( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; async fn change_reward_denoms( &self, request: tonic::Request, @@ -2373,92 +2234,6 @@ pub mod msg_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Msg/ConsumerAddition" => { - #[allow(non_camel_case_types)] - struct ConsumerAdditionSvc(pub Arc); - impl tonic::server::UnaryService - for ConsumerAdditionSvc { - type Response = super::MsgConsumerAdditionResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::consumer_addition(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = ConsumerAdditionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/interchain_security.ccv.provider.v1.Msg/ConsumerRemoval" => { - #[allow(non_camel_case_types)] - struct ConsumerRemovalSvc(pub Arc); - impl tonic::server::UnaryService - for ConsumerRemovalSvc { - type Response = super::MsgConsumerRemovalResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::consumer_removal(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = ConsumerRemovalSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } "/interchain_security.ccv.provider.v1.Msg/CreateConsumer" => { #[allow(non_camel_case_types)] struct CreateConsumerSvc(pub Arc); @@ -2763,51 +2538,6 @@ pub mod msg_server { }; Box::pin(fut) } - "/interchain_security.ccv.provider.v1.Msg/ConsumerModification" => { - #[allow(non_camel_case_types)] - struct ConsumerModificationSvc(pub Arc); - impl< - T: Msg, - > tonic::server::UnaryService - for ConsumerModificationSvc { - type Response = super::MsgConsumerModificationResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::consumer_modification(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = ConsumerModificationSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } "/interchain_security.ccv.provider.v1.Msg/ChangeRewardDenoms" => { #[allow(non_camel_case_types)] struct ChangeRewardDenomsSvc(pub Arc); @@ -2920,16 +2650,16 @@ impl ::prost::Name for QueryConsumerGenesisResponse { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryConsumerChainsRequest { /// The phase of the consumer chains returned (optional) /// Registered=1|Initialized=2|Launched=3|Stopped=4|Deleted=5 #[prost(enumeration = "ConsumerPhase", tag = "1")] pub phase: i32, - /// The limit of consumer chains returned (optional) - /// default is 100 - #[prost(int32, tag = "2")] - pub limit: i32, + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option< + super::super::super::super::cosmos::base::query::v1beta1::PageRequest, + >, } impl ::prost::Name for QueryConsumerChainsRequest { const NAME: &'static str = "QueryConsumerChainsRequest"; @@ -2946,6 +2676,10 @@ impl ::prost::Name for QueryConsumerChainsRequest { pub struct QueryConsumerChainsResponse { #[prost(message, repeated, tag = "1")] pub chains: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option< + super::super::super::super::cosmos::base::query::v1beta1::PageResponse, + >, } impl ::prost::Name for QueryConsumerChainsResponse { const NAME: &'static str = "QueryConsumerChainsResponse"; @@ -3540,16 +3274,18 @@ impl ::prost::Name for QueryConsumerChainRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct QueryConsumerChainResponse { #[prost(string, tag = "1")] - pub chain_id: ::prost::alloc::string::String, + pub consumer_id: ::prost::alloc::string::String, #[prost(string, tag = "2")] - pub owner_address: ::prost::alloc::string::String, + pub chain_id: ::prost::alloc::string::String, #[prost(string, tag = "3")] + pub owner_address: ::prost::alloc::string::String, + #[prost(string, tag = "4")] pub phase: ::prost::alloc::string::String, - #[prost(message, optional, tag = "4")] - pub metadata: ::core::option::Option, #[prost(message, optional, tag = "5")] - pub init_params: ::core::option::Option, + pub metadata: ::core::option::Option, #[prost(message, optional, tag = "6")] + pub init_params: ::core::option::Option, + #[prost(message, optional, tag = "7")] pub power_shaping_params: ::core::option::Option, } impl ::prost::Name for QueryConsumerChainResponse { diff --git a/src/prost/proto_descriptor.bin b/src/prost/proto_descriptor.bin index c9582823db431ffbdcdb5888b1432b91abdb71b0..1b363f9e82b807952116026e6d7cba886042eae2 100644 GIT binary patch delta 24147 zcma)kd3;qx()R5>Cnq#!L=+bUgaJ2J7iMGv0xlqn zfVP6Nh^Qbapb`cV6;T)#8AK!^DsCVG3MeSDeNXjr@4Vmp&F}a9q2%fAs_L$;u3oCn zedqC}o2NFNIE78&Q=BR8l!PhXl*B3FDM@eoEf=vCl~*kCYh~l#0hPX6jX!#+^7dW+ zyNsQyjPCZYbwz`0_SoWr&@=c?*4pnExO49IOh)`8uE?LKl z%0irhs(y@$QB_i=p<TcrgcL9Arf?G7hq$q;x~ZK~|KRIP0z zxu~i5NRIm1_ex!KrzuY~#4Z>&4ck$;plpg!KFOx46S76{0_W$XpABi6ho70no*^KVraBB+@7LH3!LFR zDn})Ww_56PrD0sdW5j779-d^!l?LMB7}t}UI6ZLg;Yw%0Zti}Eh+8&T=t zbeFI`Asw9V3hc^H2dBI8qyFDjFM`0i2fb(_#AwYZ0Hb?ii~=yaC&nlMqk96|r2vfX zL6`1Vj4}deB+r&>x`?|Kqmm4ej*N{a1EeF90@J??kdDl%?hjR@nSnD}&Wwm#6=7*6 z2uE|zG|dFz=tL_s6NIB7bE@NWc$$R2g&wa=zU)tBo&Odt@X22@`0Ky(tNj!|5r6;d zvjli)!nW=qZ+ULJTeS?D#!a$b<>m;DyH&17%}0*dBvm9t2C1ij+WrbeVrPU@T!S0^x( zGRKY(5M7;P)d>jVIaZyVhCffMvl##==fx>Wo%5_ZQ47j>q|OdXEY$fllch^Vo93Lh zNgy*3fS`QZY84QaPm@+(q$RK50#>tn|fgMGQ)y35R6`CSo#Kn(aS8qz<)^f028=e z7W^b0?8JE@_$-g}Nd%weaX#4p0I~8lADZmt)S(9yA6V9_OupVlj49_l49ZvIL&25? zh=s2yv8MrMRr7}_N^DZA25#p^cMp4?RoOWr_`tYTR6FVUKZ@mI3YyOo8> z0?xUTh4Yj#IvC4(Ym5%{Pa!f!hm3JU+!%q;#SONLfRMMrPA(vbH&|nI$Z9s4wG9Bu zjd4mc#*Nk(Q47kAc5OQx#<)o?PZb^8ZnBC+AtrAV6Qyc!fZ(u+HTjE$;IN6c??9U? zciq6-!a}=c!!+?}$rf6vwC-FC^+N`amI@E&Y7eIiXtXYkcAFZl?3ph7l5MuTsDZF; zcA$U|w#^RIrJigz0|mf9x5p`Ipxf<0Q47lLG|(%RL=1GNJd`e4x7le2s_lEHwID!n z*vWzdHBdls*vV?w@!Kd4Kp)Gmo)TBcS%L7{ejH~*3-RMP8(N4Tv!J$NLksa^R=1x2 z3F#{#@IGas@8#Y=?8*3)g|q!Bv|tjT5^q1_RkAWeOuij|>GgneaNBP^CLp-&w;mG^ zc3ovXCP6woqQrPiDp4M@iacfuB?$Zu$oZM#irxpT@)9^H?|@y+fM9Zf77v*>Afy~% z1-+CPCU~5r9ALG2s*N>)%;-xQ%@Plmd>Q9S>ip792-<+;OPY|0bjC^`_+8~kS%S0j z?-))>S`;boI~KN*NqOI~TDAQy(47}}M_6b!XE`mS@|(j>hWz&;KSS24E^4G4Vc`@s za$FDV^(WcAy6D#UCnh3_t(Qbv{7;AuE7;jkoRDu<7hM~lh*OY8{u6>i!LEklq%6)B z-A9~^Q_y(-6M{lP+Iu`Q`O}Pd(EZ^dEHS{w7J~FND{f;UMtz#KYwtfpw&4-uGxDo! zF~7+ft6mgRDNCwlXlTmLu)?~2Cq;sd@ps1mkgwDb9f#mA?WsIvMF9MSm>{AC5vM4o54Ee&Uy z$n&gKYYQRhLR^r(zo8^1$We!Qlt9pDS_|<0lQ?fIPo46sNs%kwZ33tdKOP;lP@7cW z@TZMz5-)0Gw1HJOh4ZQM&s@>5H~zAnq)luJ&$Y8co7fcIxr3UOhAR1g(v! z9GxVW;E|tvOis%aZA%`*?qsNN({mr=SlC*nxatAs*7P6Iqkw0eF3;wP$BL)NX=v}7 z&co$~hW3W(yu}s%y-EzaF-yK$Q;cdfD^5b2)+`>@M<2J<&86v&t-yXK3B z2F&AOI$^^HlL5}-nN5`lAZQaX&qBDcdAw#F3&DIIFVt3o#$Y~=!%D`3c{uQ%;h_aG zuRuJQ`V0@(@~;5@F!7%+mllXtZRc~d*P{?Bn$Lyi3kbgRd0`_Z1`vGbbKFuNC)b!1 zc#C-G1(_QakEJf+;i%sdjFX7*61g@iu57i$GDaa7FX2KvSwJve!s`?%#(-eFgyXTG zJ^1>8yG+)tB{~jV#?|%Rb$w#Gj91eN2ZA;LwbucJHkR>%Ld6Xb%$M=HB^HADGG5ly ze}Z}~0&h7Fy#}ZB5B)ZCtd>`J0u?l|aYUV1$+@-^p`-$8iw1<$ zl{_g!Nd*MyN{$BynoT%O95^_yW-4hb1hk~AzN$8-b2J9+DvopH&FF9>@Ye9qo9J+_ zs9b%}uOUy>7Hull&`hR)cLd$?)^h#^*NX`l+ChOnzX3w^Yq{vCWCKFhT09n52w7`+ zkDeC7c;B#V2#xg`dV|(b19T=i@HX(!CeGx_I-+jH2AXvmU^40EZM#r`FhD@P#sDGn zZ63~2LI5H2ZJu4jkfL%U=h}FaIYV~=^${0P)#f)aq@ z=YUo$Y5g4@PPVn6eTS!|`)`vWqy*jvJhT;hT`4Q-i){INp;%b)0mq$>c&E^aw%92H z0&74$Wq@G4g_{`z1nVs{W119|A6jLksDlrn?iHY_HOc@4>4#PsolV^!?uZhN(}5LCyu{oISjO4PA!Kd;@^^cAD8 z;#}|cX=)k)wIu>VToq5z-W(9(s(3-v|At1N9(ad%=r|1X6Bg|xYc~|1ryk;XjiQr6 zIw|2>=@*GE#ot8jg@xmk;VAURBH5w|E319+@*R3q^UD?JvMLkEjv)-79vjZ z`r6^679viO!%x+;*a1)R@-y5~lZATi)J}7^&`h`hbe^=^ zSdpOeqMThSO5_6vlY(6RkdvY2;3CJ7yPIl-Ik+s3m5Qs%FUJ|vWL~yro}uR8GMV{I zdS1y4yva^zgTr!q%WJ>!Ystr&h#%7?JK+ZYE;`O+QfH^jiDhDUpXrXVeiVY|bO$f@ zq-;QRcDe(vVjzrvx`VfSI#QxmYj3)P$NSxyDadEZg-yktl39*f;hAbl&2sQ+uep$Y z&2lg{6-CG-?=V+BUoJi_n;WO0!OeAyt)LBP<~sJ#K9ity_;C5!1hHA()?9c)0QC|^ zC1|CCCwncA>`Xd%vo{cfkWQn&nn9QYtaOU6ij}A}EuEf2)w6vjy}-a!uhRvw*vmpbMifX0xw)G_w}K*(F_l#ey?%*l7D)BM_4iMj_Y zb^4B0Z~2+DuPk%;gL2SB(eq9~jjcF36fbk|p09^ThvH>U^A;9D+%l)-1BSV$hquhR zvR|x3iCgCMzfa!=GU;V+xx-87Hn2mzhoT5WMwxctfRMS|!4tohsUC!!#>M_JtslsI ztuntA^iuj-++yfh{hEVUeoaKj>ermoCjLQfnYdi8b?BXcf3r-U1bJ)Yr1U1V)-gU4 zwIE&V;7#al@@APF$IyRPR+0 zJ1Q3s6xHO^w&J$*cN}bB>P0Y%mfvPazX&!5LWee6-hkk}*)b2ofZ)B^u`hyIv^KUm zm6trxnuC`1;%#wS^5)wd^Du~7&~9_=!(bMzwjGYV{YUY38vu~*h?5fI9gcY!L@h{n zIM_R8lM1s4?s9lEXA+AJkxQnFyX5@NqM#GXv^Pcz@Z05>2SPyb+vS)CLO{g;4}=sP z$f8xX+u;Q{_h@e2<-I?N+VZ_WM7TX3r>M@d#oG&Dj4iFW-Hv%L1Rt>7P2HsT!Ymrn z9{E}qF}}&3_{eC{>~YLPA=-dsk7FJRvuFkEMNj1Hh!|J~2o}Kl#Sjp*dmZy)2ngD} zByJQYx*E1?d8DftGoXr`6&+5h(bQHs)wI(D!dL+H4FwR)tDFM;jt&UsRZcx^>VRNg zMW&APK4J^r7f$Gee50Ef(D)1JmhL49)a0PU%W$0W0M>kOak=j%P}tc0T3*>*G%xtt z;p$jHg_!lP9ULp3#Y_T2=(lo4cd?-0TjMsV5RJZdFg;)CMu0!aZdZvz1wX_&k^THY zoMz}o5dNd=+C$9B|Iy(!Xf1$~gGN6(c{MQ#k_H9*B!BH8Zq5J6(RU^)M4O+S+&q7f zY6Gntm-qG*L-LQu+a#dPakLriA&|Bv|Z;UlYyRQb>`we$TvBF(Ej+*|Z^+=F4fM6J0) zWK{ONPPA|{(y|$~P8xLIxZxwmj2Jh*_C~qp2C*{ze^pdY>n{c|c0wM%Q9SzJ`Vjo@ zKFDuw64lubdG01LG)7kIYR`5(`C3u<|03HtKxE_oitd*!6nWCUSuBo`|9_3Vo?oa* zulYnIvDKArZxM@`gK<@UeXAJa@@`9v*iJ<(darhHRG~3Cs8H6wk3*^47b=FBQmc@L&~zQv(mnh(;1%K%NTZ6G8$) zjVu*oCqymFdcfL=3=zYe7#WtnlM^F@4LLb6GWY=}Cq{-aU#=mmKxzQ!a$|I`D1#4nW>cL_Ea%y_Qq6*N} zjM%YaH^bgiYUmIU&*#ldON!9vdl8F3mY-bBB9P_RYHG-m0;hoAW2z|PUf|JXl{A|K zvVv$Ei$Hc=LASdM9pdRxexs?QKzh{6wg`058Y)WzTqvv_z48VGHn|IzQW$EX7Ee`^sES~7I7jkNP9t8F(?DMO12+83 zNKw68BW(OSMorus;VNwq2pg%Jv`Tw{sv1=zM+vStds1cf27WWe6?Db&@LF0hyO=6CaUeTfS_I`u zskV+<1~yB@LBGl~JDYwv;q9LhX;vrPK&V?-6|9BaGg=Jj*doS{R!56ijt{Me7C2@n zVG2=kWvIRmQ`6sg#92tUE;!h>p{wLQW5mMNZNqg{102wtcDzJM=7}etc!`4CR6uh} zmF>;6b3N^Va!;>>yaiL;CL-E~Y>Z#lzfdLbu9q#)&Bv*BDjcJ=VF_sKT|XpaN0_RbFRQ z;c8V7v{il03UKubAV>ELj6r8N%<9b&ZYS#486M|6PVFwQXEJ*T}Dk@M3 zeR!V_ock!D@0mvTnQp5meCIynT-6J{b03_mx`cnfUysbhcJVv+T`=0 z4jmb9^7();;_)V*kB}Pic$?1`CI>npme1#wp#T##0gnTkHA$XeGWt*l))Va0Kp4oK zBv(Czr-4Z}(1=2uUMDg0Gyq7A7@h`H7GM~j(VNQnBXZ>gvHcGGrC$Y54zj7tyb1t< zY$`La0)V(wK4QbM1l1eBBQ_jMCF))85emnSrRl&hylIS2XOzzO*O7D!L>UYmh5GUg z2$|EEc^d$P%xTQL4FE#sbQ?+|s3c6cp)@K{m*?peO6#L!B9JHCJ|(ctg)R)Idp{Nm9wdhT-$Q*^ECa2Tl}y z@4#PH5Z%*fGxIipW)L)+nYRHz2zoLuNarr1#6$|IffDp&EK(TeAbEA@eC_-v+`Q*Zld65&-jt0ki?lLdqFY?*m~j@CL#t4{#l84g`72;{8SLA)t9C zKrLvOF+3BfXMiw|AgshF8E^qJ<3;`zGayoZbZxTPU!;wF83JI-6Vp2wv-Kwh$nAtz*a(q}?mb(^O84N)@~h ztkS>=IX0FRau)&30|08lYQ0Su0tBn|)UABQDxETH_*HV!*T^%--^#t~kgym}$q930 zEK*924iy1{d;>$ipw?eHY;Xh1?yerNP^-2Fl+@^^9vH$rK-@__IYW#ujwS1$5Im8r zV|fPPxsiBMCQ_JZP_hm(kp{y)khzE~9P_#W2*OP^9|;hIn`kU;urVO6`T+}lY<7kl zW{H};$b3H_Q>0{_Bs`^Uv3W^JwEPsZRmkHhQKLvQI|L>2P-NA_X17vqV4Ic*x}r;4 z?X2sN>{gr0rbDt@V;O=;aM&J_cXm*Q;6FwH!sP*LHw%akZns%4fauhAoAm++}+6dPL7O5e-Ebar=KWb(V8GG3%8eXB!NLID^R ziblRq4ICAEjT80dqSeBa&oYr*t^?7i(_Peo=>0aM1`u7`PZ>2=D?SkVxokOCbidA5 zuX&%x2}zxw+vSg15PnWsRWvq0jO}xl(Mk6Zkd87a$?WLgf}z1NeJS_M6$7%!3w_BD zC;pR$j6m{t3=d1~=ZP~-$-y9Rr=}Wm1VjGbnoYzGS(Q*W7Q(=RdxWyFns>zCSfoen zA_au#BX*Gjg6|QVlLd&LAF(-E5t_22DkrNO{sy0;aX$2(c{I+4G;q`=WuY|mQ(<<0RDlob^b`Ps&oOHyfZ%h?S_vRDdCXb~L8ZxKWF>b%V{o%4 zS*StIjq=?zT>l&?x>b;8J;`uWh@b&t$fsFoGG|JSVaGD0t>8}ho13cKdDe9u2 zG1*uODt}|R8|X^9ENg5lkvG&xO>c^w4OM~%coUgMiqL;vr;~3c)6h|BRO!*{DE04l zP3tK2@3f{(V~qZHhRe0;1&+k%#qSKaYr3-|Fdg8*jbD{hUrxFnAI{_~5?MFsU^a@a z1e&LF47Y5}lIH0g!!_GLNI1uE&!$xfT6NDx2`<{N(knY6*nxYARUUjsyu?}nVe&4; znNt@oG2E~zbC%ixW8x>;|G^ z6FDy0x?_%>_=y}hZL+WwoG0CfITm>{y~wXyAc6{%qJJp1GU#ymFgJPFsD+G&DSSuI zC)g#Y@(>;39hWviq#@CpiwbT(%0qLF&CsUyC?)++yEK>uGLy8;q-mQ`SXFjF?c;qA7oGAJKw2%HMg^EzDRRpM78T$YPi8a1CI7d|gK^upiZ zJSWbXtY?m$S=3TfJF_@xJjFvgN0<&3PjT!VcVT7`%zl=KR>{T-#jv~SXz(nh&Cu)w zm^x%x>4^>W#42nn7ub0X^t>u;E1$FT8rXSNCA3Ndn%710(n3*oJ^scZ7TG}nq6>?- z(LEprvB>Hk5b9ZEbx)Aqz)%9+lf?w2+$Cf&O$Xp_a7H$lRy-ipS-SxQ;Sy^%fZ)8u z+6_Tf4ZC@i4v+yR)q9ciSGbq+fIP$_on_y};))8CLkKFY5bD5-HiV8^aCwnJ=sK#8 z*#(#26`r8hFzWUEF5_;)SjjOO(o5WJ6)REajF-7vTNzkDOp)N#B_~5Rg&XNlW&muv zKxVMQ8WIS8P`&+pQrUHR>Yn+y*WGgqf zC)9#=E4RT^6{+9ORWKD|=`)M%aZ$|xL zoT4!p?WQi#K|7P2aGrG2hG04NAq}_sP+(iow0`HwgD3k;-&~ z&g}cRiO-@Ig!?#dP_*}EA)LxXMQS}{pDIU9ChjS0vLFjPqAv*{i&OKx`1PBcs;zmORm4*(H zhRD%YBP0J#PFN+HR^V@p^1C=^S~=g@1%O(N@;h1pI^>L%^8+_2ZPiqc8K9mgK#=~x zGxQA&5Trkl{m{||M5lh>QJv97kQ`$LicA7qHEMq(&fLL$4^Zdtq7uxH@H#pH9#Az# z0=(`Q%<(AaI$NZgdj18}X|sSJJ<4n76m~$69_7uNBkzo7xYYyi1P}d!+_!GgUSt2- zY0Oah&00|=PrW8G`&0+z3Ca;8Db;D``x)L<4G0K|1Jrf}h_*jlmjehXKau~}ZLL6+(48%tWS-@+>UGiWCIE;$YefQr(^>0r z03q@$c^pzWAQXOr2fH5E?%?^!>;j*Wb z@L>m5bd@5+$fwGIYekoq+3JOLs!0)muE@(yMYP!To?cj|I16lMDglzv%MCFqQ(Q5EV zBFJ~5tU=Osk&zGFJ9JEkJMI`WbnMt5(@z*Re9+jT*{)nzDY99DeDx!7GxKDdLE>uJ zcdIC5iE>ScNWs%XMMNTpsJh&+Rb;Yn^&(M5wu>G~gCE}e{ak)aFhC7ePTCHp&wV0lyNc|q?V4=P z|J`of4pF^U>EDNpym#z<_Y55~aKs%G{sRrt1Da4d9nD0o|B@x}{$TyP2*{eORR_O| z@cUIi>K^5FD!6+4#@eRnHpLS*kcXGg_EqAxK6xIc zpc5Bl!8mz2HX@H@<Yjv~;OzWm9lLZ&LVAgZ%4>e4=YnZCCQHm*yx-oAemwzrs^=TYqN=XxqV@$Eu zoZ=W$Tr}Jgx70FqEK^m6-y(oqv}ne!ki!p%(S4i6vH&QhqFD{~^**%$)8?rvIf)QR zTDUD+o1VIssVdV=-BZ6B0qK+jGRU!AS3w51l-C_R>4Qi-XcDS`cz9T&Kn+DVbBJOmp zKuQ<6EBQ(z!iR{vy?gBdd@}%5^cq(Z@H9D&k9Tqw@u%Mv*_FS4EdthOoTq-x0Ne$* zkIT17EcA;F_ob?YI;sQr``rialnTRL6)n*Hj|2%5_#}DbH)28m39-zW2$)X5K}WAi z`Ynflq&C4D3N7u38zfYOC$jE-hFaSZqZU*6H`Qr;^MZil}M(|$wrDT9ihbFEfLYYCuPQW zVtB<2hPA2PPYRgNU|5_6g858_)ro5`n5TgGEQSEwRfc(rWo}C8$q6Zi^H}I<_*gpX z(m7=w3)g{0bZQO-+Vn9B4iszoDOO<)9KdLdz?;6EDsKyj0|&81NZ=V3T431H(c~El z^U((v^y3HKvy9JY^{L;4v5HZkw`@SPewHpJl3SBT*gc&P_CpFTb?GhoA%)E)Z^dco)cKZ;i=qws@>c986kOV-*3(ZY%xe>iVWJS6 zVlhlWus{q`U&;W%V!i$G1oi6|8zg=_;U8@f%G7p(LU7n%10#Uou)#(_0l{Gdb)vBv zE0)bh`T0+xBp#)7Rqz~9$`mt^bb;SU8f~gbu&Hd4&5ns?y%C?(M|zjjwR{sZmq$R5 zY@)C&El)s**~DshP_JqP)vMYjR;Qi1^SiW@yhp*(vE}$1{eLg6M7p=XX9F^*1?Tr{ z$ke5v`eqd}m79(WuVS-}n4$)Bn{C7t5OkX@}5>}?1qLBHB6d^NO+ z@A&ZyBqyB^y?Y}{syl*0u*XjxXkQD6jv#2NzwHBrR=2bKo=U3()r0JI7QISMF23WZ z-$a=Ct7y<0e`ARFWdzHa7TiudMAU-wPV1(TJ+hmHJ~2Zi3*61ZMJmpLJSaTo$h%I8 zBKgkGBBx@HWr-Rz++#Zn2$p-Ov!peohTvBbzA!AwB=OS-T5E|oS?#k*OVmnJn3P79 zpIN0PYNaVmO4HvhSCQ75$r-iS)D%%^=(y9&+s;jc9BdAnYWmT6*sym=n zhrgk^*iR_{Qk_*DAjWyXst#|=U$W34GfsL4LpW8djCr%JbSzqb8U z`Bs3?8a+#4rG3jnIwC*|>{|-Wk~$HL{+@+?HezUnd{5gMJ<6(Z^I@5GN;E1tY(1Wi zEFZSnP&%@Fn6jbhBt#Knys5|$r^NG35Mk9`5`|PsAzxa=I;ebP(}7n*vLMWDBo~`BKxEREO3NW zo2vyzOB$h6x^}4OG(xGrDIHWeF0EO_Qp-_i0?-Ji>aOb$G@$m7It2Zz^^iIQ{VNO9 z`H5oJ=<%-%pB#`BoaN54&^e=NishbV;WD+p@L4kbPy$|H^5xuLMZ*gGt(TYne)$h; zBl`R0Kdg=5+;*OYE*h2;13s_EWFoZ}7}v)d#9y%$0qTAOV#m0^g#LC(2Wu~|Vs&Ci z1hR}eet~tM`=k1{_c9AjHBmzfC|;%&N9#s?;ESJD=qJDWU3BTMzwiato!4LZ;-?n0 z*U?}2PU6Pv0AdCw@%-zR*CD8u&Lkea&M=3l$%c6uIf={){UI<4tpu{H$#Ds^geJ!& zP&jCET!IPmO(qF6x%l{(e#OCj@eBm50P4901n(*Ki)TQ3rJO>aJd-scf9O#j(n$;^ zl1i@x>Kod}d1$&(7e(nF=g6)kdFl(=X`Jih5)kA8>aplAX{XtckN%Q&nvE#}Vk{NY z=w}%ya7K63Vo6W)&@+ZR1(TlUVfre=goLE+vknLWYF+7okhFcy&@bcKZ9b=d2m&@86!YW&{Y;KgZ4XNKhH-a~#`a zU&Rv=7Rm?y5dDf5TJyn&a8zo|M}HT$kgSLDTJWtKT@}v#AzJrcY(H2=AxIY652FDw zsKpd_B)18OZY<_OT@{5VsH!sxRZN+_mh+Z!j*uhXan-jDMem7Jx%QmMszA9`oc=^^ zsSR!FPvn-`&?X?Zouxc@2_Gy|sGkZTWGT=40E`sp3>o!u*l z^Wmp=t{*-$I%?ztvg@CsRTGry{QzIkVVtkf?_TJE(d+9g6dtDRPx_$FTfzA%x%yAh zcPRd{U8f@wLZbS^cKuD=3XY$#p{Oh%y1s(fTV2 zlBgp2NBo!(?VCrg_?ZVH6*mB8Xry~ zZ_1h%M6ce6jq30Iv((}GOn6u*6}1AIYArnT*r~gq_s}rvvs`w?S`ibpRMB!2Kob4KXGVSF9%%| zgNhM}wI3(a>0v!j)L)lpspI*2BvYE9;q<*h{&G?DYJwQ7{wbF%PN#|uys*f~rE~WN zj*L`F^UuP$+uO+bd-Co};)V+RWff0bGy<@CFGVv@ZKNN^(X%a}_>DaOJ@aKf>UG@U z9UFtE5;gyuINqhmWm1VU)pz5jio^S6&hxCP%Fch{i%?|;HSt+!8J*@)Z_SoY2Akt% zOQ-qGyhg4+MhyfhTU+Fc%VJ!`mbkiTpWnh0b+98#Wy5aawdesvg#@?q(7%kEqL|=T ziWZXhL#z&Ge9l`dodIF{2GrX(AU2L|TIuJbZ<6hANP?>!}@)-W9Q*<=-)+~T9CO|c&3JOy}*?a810SMYXJg{LRa`1aNe%_0u z)KI_DQDvl1aOG3llt^&wd4fe0UkPJI-CPm2Y9%dazZ)iuy>I2 zuaT6}S$WJcgT@V&@BAs+SD+4^K&9?JASe%7?+u7f9JJmW5R2j<556|uhzisa_|keK zDp5<|D_R0{jLF4afQK5ZLvb#ce@h!BsW=Z8gF+rUV!E7%I{aiuLzT>%M>@ujbJWdg zijUMLeIpvk-<(LsRVdOOMFX@y%#-xB9S|Ko%l;l!s0j&Nb2UD96=i6I~!` z66@pg8aMJ@_v4lw3eo7e4RZs6-Ej(YQ%~~)?-w3AZP?|bMgRzIr|j9GAn<;}&w?0k1!(!3jr$f5w=>qXfG{_JddPrid&Y7F1lKc` zYc#0v{-B@m(C?s8H2s6)o<$ZLCAJiQRcjpxY-4d(K(sw)*#d&Cio0r3RQ_pymnN!A z7Et#HP}S;Zv1+ZGVS#(qTv5VZIe5xqqNg7iFX(ON9f1#X_v zqALFd(2AuuF~ocIqYr9T;|jd`Xj&}$i`=9RL{(fCP`~~Fg7%^f=mLWFqD>tD#45YU zP3izaWy}|C=0KFjaLJypf#4FVT;+=zgIwBFp-%HL5;w z0o2}dCY0FwzC(*OVf delta 24519 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 XMy=GbDAeHjvef>81!-MV*LC_|*w2Hz From cc26cd11e61afa7b66e1ff33da694ebbcf02d682 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Tue, 22 Oct 2024 17:06:19 +0200 Subject: [PATCH 4/5] Add changelog entry --- .../breaking-changes/245-interchain-security-proto-v6.1.0.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/breaking-changes/245-interchain-security-proto-v6.1.0.md diff --git a/.changelog/unreleased/breaking-changes/245-interchain-security-proto-v6.1.0.md b/.changelog/unreleased/breaking-changes/245-interchain-security-proto-v6.1.0.md new file mode 100644 index 00000000..cd6fd89d --- /dev/null +++ b/.changelog/unreleased/breaking-changes/245-interchain-security-proto-v6.1.0.md @@ -0,0 +1,2 @@ +- Update `interchain-security` to v6.1.0 + ([\#245](https://github.com/cosmos/ibc-proto-rs/issues/245)) \ No newline at end of file From e6f82810cad827aa15c6c1d76b6647224d397b24 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 23 Oct 2024 11:27:12 +0200 Subject: [PATCH 5/5] Fix tonic to v0.12.3 and remove unnecessary Cargo.lock --- Cargo.toml | 2 +- tools/proto-compiler/Cargo.lock | 1318 ----------------------- tools/proto-compiler/Cargo.toml | 4 +- tools/proto-compiler/src/cmd/compile.rs | 2 +- 4 files changed, 4 insertions(+), 1322 deletions(-) delete mode 100644 tools/proto-compiler/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml index 63830faa..57f22182 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ all-features = true [dependencies] prost = { version = "0.13", default-features = false, features = ["prost-derive"] } bytes = { version = "1.2", default-features = false } -tonic = { version = "0.12", default-features = false, optional = true } +tonic = { version = "0.12.3", default-features = false, optional = true } serde = { version = "1.0", default-features = false, optional = true } schemars = { version = "0.8", optional = true } subtle-encoding = { version = "0.5", default-features = false } diff --git a/tools/proto-compiler/Cargo.lock b/tools/proto-compiler/Cargo.lock deleted file mode 100644 index 7fdf24ea..00000000 --- a/tools/proto-compiler/Cargo.lock +++ /dev/null @@ -1,1318 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "anyhow" -version = "1.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" - -[[package]] -name = "argh" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e7e4aa7e40747e023c0761dafcb42333a9517575bbf1241747f68dd3177a62" -dependencies = [ - "argh_derive", - "argh_shared", -] - -[[package]] -name = "argh_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f2bd7ff6ed6414f4e5521bd509bae46454bbd513801767ced3f21a751ab4bc" -dependencies = [ - "argh_shared", - "heck 0.3.3", - "proc-macro2", - "quote", - "syn 1.0.99", -] - -[[package]] -name = "argh_shared" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47253b98986dafc7a3e1cf3259194f1f47ac61abb57a57f46ec09e48d004ecda" - -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "async-trait" -version = "0.1.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "axum" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f8ccfd9221ee7d1f3d4b33e1f8319b3a81ed8f61f2ea40b37b859794b4491" -dependencies = [ - "async-trait", - "axum-core", - "bitflags 1.3.2", - "bytes", - "futures-util", - "http", - "http-body", - "hyper", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2f958c80c248b34b9a877a643811be8dbca03ca5ba827f2b63baf3a81e5fc4e" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" - -[[package]] -name = "bytes" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "either" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "fastrand" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" -dependencies = [ - "instant", -] - -[[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 = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" - -[[package]] -name = "futures-sink" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" - -[[package]] -name = "futures-task" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" - -[[package]] -name = "futures-util" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "getrandom" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "git2" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd" -dependencies = [ - "bitflags 2.4.2", - "libc", - "libgit2-sys", - "log", - "openssl-probe", - "openssl-sys", - "url", -] - -[[package]] -name = "h2" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.1.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - -[[package]] -name = "ibc-proto-compiler" -version = "0.2.0" -dependencies = [ - "argh", - "git2", - "informalsystems-pbjson-build", - "prost-build", - "similar", - "tonic", - "tonic-build", - "walkdir", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", -] - -[[package]] -name = "informalsystems-pbjson-build" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd45cde4e45f1f214ae854eeee74ebfe67871c6dc6cc0b5f7cb87b513f0d318" -dependencies = [ - "heck 0.4.0", - "itertools 0.12.0", - "prost", - "prost-types", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "itertools" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" - -[[package]] -name = "jobserver" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" -dependencies = [ - "libc", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.141" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" - -[[package]] -name = "libgit2-sys" -version = "0.16.1+1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c" -dependencies = [ - "cc", - "libc", - "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -] - -[[package]] -name = "libssh2-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "matchit" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mio" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.36.1", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" -dependencies = [ - "autocfg", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "petgraph" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" -dependencies = [ - "fixedbitset", - "indexmap 1.9.1", -] - -[[package]] -name = "pin-project" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.99", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" - -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] -name = "prettyplease" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" -dependencies = [ - "proc-macro2", - "syn 2.0.48", -] - -[[package]] -name = "proc-macro2" -version = "1.0.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" -dependencies = [ - "bytes", - "heck 0.4.0", - "itertools 0.10.3", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.48", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" -dependencies = [ - "anyhow", - "itertools 0.10.3", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "prost-types" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" -dependencies = [ - "prost", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[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", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "rustversion" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "serde" -version = "1.0.143" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" - -[[package]] -name = "similar" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" - -[[package]] -name = "slab" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" -dependencies = [ - "autocfg", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "syn" -version = "1.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" - -[[package]] -name = "tempfile" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" -dependencies = [ - "cfg-if", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.42.0", -] - -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tonic" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64", - "bytes", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-build" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.1", - "pin-project", - "pin-project-lite", - "rand", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" -dependencies = [ - "cfg-if", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.99", -] - -[[package]] -name = "tracing-core" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "unicode-bidi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" - -[[package]] -name = "unicode-ident" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" - -[[package]] -name = "unicode-normalization" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" - -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "which" -version = "4.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" -dependencies = [ - "either", - "lazy_static", - "libc", -] - -[[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-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" - -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" - -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" diff --git a/tools/proto-compiler/Cargo.toml b/tools/proto-compiler/Cargo.toml index b4525e26..0f6b5e59 100644 --- a/tools/proto-compiler/Cargo.toml +++ b/tools/proto-compiler/Cargo.toml @@ -11,8 +11,8 @@ git2 = "0.19" prost-build = "0.13" walkdir = "2.3" argh = "0.1" -tonic = "0.12" -tonic-build = "0.12" +tonic = "0.12.3" +tonic-build = "0.12.3" similar = "2.2" informalsystems-pbjson-build = "0.7.0" regex = "1" diff --git a/tools/proto-compiler/src/cmd/compile.rs b/tools/proto-compiler/src/cmd/compile.rs index 966084d1..77347353 100644 --- a/tools/proto-compiler/src/cmd/compile.rs +++ b/tools/proto-compiler/src/cmd/compile.rs @@ -169,7 +169,7 @@ impl CompileCmd { .type_attribute(".ibc.core.connection.v1.Counterparty", attrs_jsonschema) .type_attribute(".ibc.core.connection.v1.Version", attrs_jsonschema) .type_attribute(".ibc.lightclients.wasm.v1.ClientMessage", attrs_jsonschema) - .compile_with_config(config, &protos, &proto_includes_paths)?; + .compile_protos_with_config(config, &protos, &proto_includes_paths)?; println!("[info ] Protos compiled successfully");