From 608e0b8b14ffd48652003ccdfdf74768ac1f5abf Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Tue, 14 Nov 2023 08:57:46 +0100 Subject: [PATCH 1/3] Add only core.client changes for 'MsgIBCSoftwareUpgrade' --- src/IBC_GO_COMMIT | 2 +- src/prost/ibc.core.client.v1.rs | 399 ++++++++++++++++++++++++++++---- 2 files changed, 355 insertions(+), 46 deletions(-) diff --git a/src/IBC_GO_COMMIT b/src/IBC_GO_COMMIT index 900b2b9d..47f08cce 100644 --- a/src/IBC_GO_COMMIT +++ b/src/IBC_GO_COMMIT @@ -1 +1 @@ -c75650a1a037a9fecba5a9005df380f707520ff7 +2551dea41cd3c512845007ca895c8402afa9b79f diff --git a/src/prost/ibc.core.client.v1.rs b/src/prost/ibc.core.client.v1.rs index 6dff7eb4..05dd3b4b 100644 --- a/src/prost/ibc.core.client.v1.rs +++ b/src/prost/ibc.core.client.v1.rs @@ -41,10 +41,51 @@ pub struct ClientConsensusStates { #[prost(message, repeated, tag = "2")] pub consensus_states: ::prost::alloc::vec::Vec, } -/// ClientUpdateProposal is a governance proposal. If it passes, the substitute +/// Height is a monotonically increasing data type +/// that can be compared against another Height for the purposes of updating and +/// freezing clients +/// +/// Normally the RevisionHeight is incremented at each height while keeping +/// RevisionNumber the same. However some consensus algorithms may choose to +/// reset the height in certain conditions e.g. hard forks, state-machine +/// breaking changes In these cases, the RevisionNumber is incremented so that +/// height continues to be monitonically increasing even as the RevisionHeight +/// gets reset +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[derive(Eq, PartialOrd, Ord)] +#[cfg_attr( + all(feature = "json-schema", feature = "serde"), + derive(::schemars::JsonSchema) +)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Height { + /// the revision that the client is currently on + #[prost(uint64, tag = "1")] + #[cfg_attr(feature = "serde", serde(default))] + pub revision_number: u64, + /// the height within the given revision + #[prost(uint64, tag = "2")] + #[cfg_attr(feature = "serde", serde(default))] + pub revision_height: u64, +} +/// Params defines the set of IBC light client parameters. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Params { + /// allowed_clients defines the list of allowed client state types which can be created + /// and interacted with. If a client type is removed from the allowed clients list, usage + /// of this client will be disabled until it is added again to the list. + #[prost(string, repeated, tag = "1")] + pub allowed_clients: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +/// ClientUpdateProposal is a legacy governance proposal. If it passes, the substitute /// client's latest consensus state is copied over to the subject client. The proposal /// handler may fail if the subject and the substitute do not match in client and /// chain parameters (with exception to latest height, frozen height, and chain-id). +/// +/// Deprecated: Please use MsgRecoverClient in favour of this message type. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -65,6 +106,8 @@ pub struct ClientUpdateProposal { } /// UpgradeProposal is a gov Content type for initiating an IBC breaking /// upgrade. +/// +/// Deprecated: Please use MsgIBCSoftwareUpgrade in favour of this message type. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -88,45 +131,6 @@ pub struct UpgradeProposal { super::super::super::super::google::protobuf::Any, >, } -/// Height is a monotonically increasing data type -/// that can be compared against another Height for the purposes of updating and -/// freezing clients -/// -/// Normally the RevisionHeight is incremented at each height while keeping -/// RevisionNumber the same. However some consensus algorithms may choose to -/// reset the height in certain conditions e.g. hard forks, state-machine -/// breaking changes In these cases, the RevisionNumber is incremented so that -/// height continues to be monitonically increasing even as the RevisionHeight -/// gets reset -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[derive(Eq, PartialOrd, Ord)] -#[cfg_attr( - all(feature = "json-schema", feature = "serde"), - derive(::schemars::JsonSchema) -)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Height { - /// the revision that the client is currently on - #[prost(uint64, tag = "1")] - #[cfg_attr(feature = "serde", serde(default))] - pub revision_number: u64, - /// the height within the given revision - #[prost(uint64, tag = "2")] - #[cfg_attr(feature = "serde", serde(default))] - pub revision_height: u64, -} -/// Params defines the set of IBC light client parameters. -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Params { - /// allowed_clients defines the list of allowed client state types which can be created - /// and interacted with. If a client type is removed from the allowed clients list, usage - /// of this client will be disabled until it is added again to the list. - #[prost(string, repeated, tag = "1")] - pub allowed_clients: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} /// GenesisState defines the ibc client submodule's genesis state. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] @@ -143,7 +147,9 @@ pub struct GenesisState { pub clients_metadata: ::prost::alloc::vec::Vec, #[prost(message, optional, tag = "4")] pub params: ::core::option::Option, - /// create localhost on initialization + /// Deprecated: create_localhost has been deprecated. + /// The localhost client is automatically created at genesis. + #[deprecated] #[prost(bool, tag = "5")] pub create_localhost: bool, /// the sequence for the next generated client identifier @@ -259,23 +265,20 @@ pub struct MsgUpgradeClient { pub struct MsgUpgradeClientResponse {} /// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for /// light client misbehaviour. -/// Warning: DEPRECATED +/// This message has been deprecated. Use MsgUpdateClient instead. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSubmitMisbehaviour { /// client unique identifier - #[deprecated] #[prost(string, tag = "1")] pub client_id: ::prost::alloc::string::String, /// misbehaviour used for freezing the light client - #[deprecated] #[prost(message, optional, tag = "2")] pub misbehaviour: ::core::option::Option< super::super::super::super::google::protobuf::Any, >, /// signer address - #[deprecated] #[prost(string, tag = "3")] pub signer: ::prost::alloc::string::String, } @@ -285,6 +288,76 @@ pub struct MsgSubmitMisbehaviour { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgSubmitMisbehaviourResponse {} +/// MsgRecoverClient defines the message used to recover a frozen or expired client. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgRecoverClient { + /// the client identifier for the client to be updated if the proposal passes + #[prost(string, tag = "1")] + pub subject_client_id: ::prost::alloc::string::String, + /// the substitute client identifier for the client which will replace the subject + /// client + #[prost(string, tag = "2")] + pub substitute_client_id: ::prost::alloc::string::String, + /// signer address + #[prost(string, tag = "3")] + pub signer: ::prost::alloc::string::String, +} +/// MsgRecoverClientResponse defines the Msg/RecoverClient response type. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgRecoverClientResponse {} +/// MsgIBCSoftwareUpgrade defines the message used to schedule an upgrade of an IBC client using a v1 governance proposal +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgIbcSoftwareUpgrade { + #[prost(message, optional, tag = "1")] + pub plan: ::core::option::Option< + super::super::super::super::cosmos::upgrade::v1beta1::Plan, + >, + /// An UpgradedClientState must be provided to perform an IBC breaking upgrade. + /// This will make the chain commit to the correct upgraded (self) client state + /// before the upgrade occurs, so that connecting chains can verify that the + /// new upgraded client is valid by verifying a proof on the previous version + /// of the chain. This will allow IBC connections to persist smoothly across + /// planned chain upgrades. Correspondingly, the UpgradedClientState field has been + /// deprecated in the Cosmos SDK to allow for this logic to exist solely in + /// the 02-client module. + #[prost(message, optional, tag = "2")] + pub upgraded_client_state: ::core::option::Option< + super::super::super::super::google::protobuf::Any, + >, + /// signer address + #[prost(string, tag = "3")] + pub signer: ::prost::alloc::string::String, +} +/// MsgIBCSoftwareUpgradeResponse defines the Msg/IBCSoftwareUpgrade response type. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgIbcSoftwareUpgradeResponse {} +/// MsgUpdateParams defines the sdk.Msg type to update the client parameters. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParams { + /// signer address + #[prost(string, tag = "1")] + pub signer: ::prost::alloc::string::String, + /// params defines the client parameters to update. + /// + /// NOTE: All parameters must be supplied. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, +} +/// MsgUpdateParamsResponse defines the MsgUpdateParams response type. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} /// Generated client implementations. #[cfg(feature = "client")] pub mod msg_client { @@ -476,6 +549,84 @@ pub mod msg_client { .insert(GrpcMethod::new("ibc.core.client.v1.Msg", "SubmitMisbehaviour")); self.inner.unary(req, path, codec).await } + /// RecoverClient defines a rpc handler method for MsgRecoverClient. + pub async fn recover_client( + &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( + "/ibc.core.client.v1.Msg/RecoverClient", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("ibc.core.client.v1.Msg", "RecoverClient")); + self.inner.unary(req, path, codec).await + } + /// IBCSoftwareUpgrade defines a rpc handler method for MsgIBCSoftwareUpgrade. + pub async fn ibc_software_upgrade( + &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( + "/ibc.core.client.v1.Msg/IBCSoftwareUpgrade", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("ibc.core.client.v1.Msg", "IBCSoftwareUpgrade")); + self.inner.unary(req, path, codec).await + } + /// UpdateClientParams defines a rpc handler method for MsgUpdateParams. + pub async fn update_client_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( + "/ibc.core.client.v1.Msg/UpdateClientParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("ibc.core.client.v1.Msg", "UpdateClientParams")); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -518,6 +669,30 @@ pub mod msg_server { tonic::Response, tonic::Status, >; + /// RecoverClient defines a rpc handler method for MsgRecoverClient. + async fn recover_client( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// IBCSoftwareUpgrade defines a rpc handler method for MsgIBCSoftwareUpgrade. + async fn ibc_software_upgrade( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// UpdateClientParams defines a rpc handler method for MsgUpdateParams. + async fn update_client_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// Msg defines the ibc/client Msg service. #[derive(Debug)] @@ -777,6 +952,140 @@ pub mod msg_server { }; Box::pin(fut) } + "/ibc.core.client.v1.Msg/RecoverClient" => { + #[allow(non_camel_case_types)] + struct RecoverClientSvc(pub Arc); + impl tonic::server::UnaryService + for RecoverClientSvc { + type Response = super::MsgRecoverClientResponse; + 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 { + ::recover_client(&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 inner = inner.0; + let method = RecoverClientSvc(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) + } + "/ibc.core.client.v1.Msg/IBCSoftwareUpgrade" => { + #[allow(non_camel_case_types)] + struct IBCSoftwareUpgradeSvc(pub Arc); + impl< + T: Msg, + > tonic::server::UnaryService + for IBCSoftwareUpgradeSvc { + type Response = super::MsgIbcSoftwareUpgradeResponse; + 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 { + ::ibc_software_upgrade(&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 inner = inner.0; + let method = IBCSoftwareUpgradeSvc(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) + } + "/ibc.core.client.v1.Msg/UpdateClientParams" => { + #[allow(non_camel_case_types)] + struct UpdateClientParamsSvc(pub Arc); + impl tonic::server::UnaryService + for UpdateClientParamsSvc { + 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_client_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 inner = inner.0; + let method = UpdateClientParamsSvc(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( From ed4eb279196fc848281417f46d0353fbb0ca06de Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Tue, 14 Nov 2023 10:09:57 +0100 Subject: [PATCH 2/3] Add cosmos.gov.v1 module --- src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 8d07ed9d..4287448b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -180,6 +180,9 @@ pub mod cosmos { } } pub mod gov { + pub mod v1 { + include_proto!("cosmos.gov.v1.rs"); + } pub mod v1beta1 { include_proto!("cosmos.gov.v1beta1.rs"); } From 3ef7d188988844d924906a5fb2a693b42267ffb9 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Tue, 14 Nov 2023 11:57:07 +0100 Subject: [PATCH 3/3] Add all updated protos for ibc-go 'v8.0.0' --- src/prost/google.protobuf.rs | 886 +++--------------- src/prost/ibc.applications.fee.v1.rs | 15 + ...tions.interchain_accounts.controller.v1.rs | 122 ++- ...pplications.interchain_accounts.host.v1.rs | 321 +++++++ src/prost/ibc.applications.transfer.v1.rs | 234 +++-- src/prost/ibc.core.channel.v1.rs | 125 +++ src/prost/ibc.core.connection.v1.rs | 104 ++ src/prost/proto_descriptor.bin | Bin 717826 -> 702918 bytes 8 files changed, 991 insertions(+), 816 deletions(-) diff --git a/src/prost/google.protobuf.rs b/src/prost/google.protobuf.rs index 715d820f..3878889e 100644 --- a/src/prost/google.protobuf.rs +++ b/src/prost/google.protobuf.rs @@ -1,3 +1,129 @@ +/// `Any` contains an arbitrary serialized protocol buffer message along with a +/// URL that describes the type of the serialized message. +/// +/// Protobuf library provides support to pack/unpack Any values in the form +/// of utility functions or additional generated methods of the Any type. +/// +/// Example 1: Pack and unpack a message in C++. +/// +/// Foo foo = ...; +/// Any any; +/// any.PackFrom(foo); +/// ... +/// if (any.UnpackTo(&foo)) { +/// ... +/// } +/// +/// Example 2: Pack and unpack a message in Java. +/// +/// Foo foo = ...; +/// Any any = Any.pack(foo); +/// ... +/// if (any.is(Foo.class)) { +/// foo = any.unpack(Foo.class); +/// } +/// +/// Example 3: Pack and unpack a message in Python. +/// +/// foo = Foo(...) +/// any = Any() +/// any.Pack(foo) +/// ... +/// if any.Is(Foo.DESCRIPTOR): +/// any.Unpack(foo) +/// ... +/// +/// Example 4: Pack and unpack a message in Go +/// +/// foo := &pb.Foo{...} +/// any, err := anypb.New(foo) +/// if err != nil { +/// ... +/// } +/// ... +/// foo := &pb.Foo{} +/// if err := any.UnmarshalTo(foo); err != nil { +/// ... +/// } +/// +/// The pack methods provided by protobuf library will by default use +/// 'type.googleapis.com/full.type.name' as the type URL and the unpack +/// methods only use the fully qualified type name after the last '/' +/// in the type URL, for example "foo.bar.com/x/y.z" will yield type +/// name "y.z". +/// +/// +/// JSON +/// +/// The JSON representation of an `Any` value uses the regular +/// representation of the deserialized, embedded message, with an +/// additional field `@type` which contains the type URL. Example: +/// +/// package google.profile; +/// message Person { +/// string first_name = 1; +/// string last_name = 2; +/// } +/// +/// { +/// "@type": "type.googleapis.com/google.profile.Person", +/// "firstName": , +/// "lastName": +/// } +/// +/// If the embedded message type is well-known and has a custom JSON +/// representation, that representation will be embedded adding a field +/// `value` which holds the custom JSON in addition to the `@type` +/// field. Example (for message [google.protobuf.Duration][]): +/// +/// { +/// "@type": "type.googleapis.com/google.protobuf.Duration", +/// "value": "1.212s" +/// } +/// +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[derive(Eq)] +#[cfg_attr( + all(feature = "json-schema", feature = "serde"), + derive(::schemars::JsonSchema) +)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Any { + /// A URL/resource name that uniquely identifies the type of the serialized + /// protocol buffer message. This string must contain at least + /// one "/" character. The last segment of the URL's path must represent + /// the fully qualified name of the type (as in + /// `path/google.protobuf.Duration`). The name should be in a canonical form + /// (e.g., leading "." is not accepted). + /// + /// In practice, teams usually precompile into the binary all types that they + /// expect it to use in the context of Any. However, for URLs which use the + /// scheme `http`, `https`, or no scheme, one can optionally set up a type + /// server that maps type URLs to message definitions as follows: + /// + /// * If no scheme is provided, `https` is assumed. + /// * An HTTP GET on the URL must yield a [google.protobuf.Type][] + /// value in binary format, or produce an error. + /// * Applications are allowed to cache lookup results based on the + /// URL, or have them precompiled into a binary to avoid any + /// lookup. Therefore, binary compatibility needs to be preserved + /// on changes to types. (Use versioned type names to manage + /// breaking changes.) + /// + /// Note: this functionality is not currently available in the official + /// protobuf release, and it is not used for type URLs beginning with + /// type.googleapis.com. + /// + /// Schemes other than `http`, `https` (or the empty scheme) might be + /// used with implementation specific semantics. + /// + #[prost(string, tag = "1")] + pub type_url: ::prost::alloc::string::String, + /// Must be a valid serialized protocol buffer of the above specified type. + #[prost(bytes = "vec", tag = "2")] + pub value: ::prost::alloc::vec::Vec, +} /// The protocol compiler can output a FileDescriptorSet containing the .proto /// files it parses. #[allow(clippy::derive_partial_eq_without_eq)] @@ -44,14 +170,9 @@ pub struct FileDescriptorProto { #[prost(message, optional, tag = "9")] pub source_code_info: ::core::option::Option, /// The syntax of the proto file. - /// The supported values are "proto2", "proto3", and "editions". - /// - /// If `edition` is present, this value must be "editions". + /// The supported values are "proto2" and "proto3". #[prost(string, optional, tag = "12")] pub syntax: ::core::option::Option<::prost::alloc::string::String>, - /// The edition of the proto file, which is an opaque string. - #[prost(string, optional, tag = "13")] - pub edition: ::core::option::Option<::prost::alloc::string::String>, } /// Describes a message type. #[allow(clippy::derive_partial_eq_without_eq)] @@ -114,90 +235,6 @@ pub struct ExtensionRangeOptions { /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, - /// For external users: DO NOT USE. We are in the process of open sourcing - /// extension declaration and executing internal cleanups before it can be - /// used externally. - #[prost(message, repeated, tag = "2")] - pub declaration: ::prost::alloc::vec::Vec, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "50")] - pub features: ::core::option::Option, - /// The verification state of the range. - /// TODO(b/278783756): flip the default to DECLARATION once all empty ranges - /// are marked as UNVERIFIED. - #[prost( - enumeration = "extension_range_options::VerificationState", - optional, - tag = "3", - default = "Unverified" - )] - pub verification: ::core::option::Option, -} -/// Nested message and enum types in `ExtensionRangeOptions`. -pub mod extension_range_options { - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct Declaration { - /// The extension number declared within the extension range. - #[prost(int32, optional, tag = "1")] - pub number: ::core::option::Option, - /// The fully-qualified name of the extension field. There must be a leading - /// dot in front of the full name. - #[prost(string, optional, tag = "2")] - pub full_name: ::core::option::Option<::prost::alloc::string::String>, - /// The fully-qualified type name of the extension field. Unlike - /// Metadata.type, Declaration.type must have a leading dot for messages - /// and enums. - #[prost(string, optional, tag = "3")] - pub r#type: ::core::option::Option<::prost::alloc::string::String>, - /// If true, indicates that the number is reserved in the extension range, - /// and any extension field with the number will fail to compile. Set this - /// when a declared extension field is deleted. - #[prost(bool, optional, tag = "5")] - pub reserved: ::core::option::Option, - /// If true, indicates that the extension must be defined as repeated. - /// Otherwise the extension must be defined as optional. - #[prost(bool, optional, tag = "6")] - pub repeated: ::core::option::Option, - } - /// The verification state of the extension range. - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum VerificationState { - /// All the extensions of the range must be declared. - Declaration = 0, - Unverified = 1, - } - impl VerificationState { - /// 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 { - VerificationState::Declaration => "DECLARATION", - VerificationState::Unverified => "UNVERIFIED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "DECLARATION" => Some(Self::Declaration), - "UNVERIFIED" => Some(Self::Unverified), - _ => None, - } - } - } } /// Describes a field within a message. #[allow(clippy::derive_partial_eq_without_eq)] @@ -610,9 +647,6 @@ pub struct FileOptions { /// determining the ruby package. #[prost(string, optional, tag = "45")] pub ruby_package: ::core::option::Option<::prost::alloc::string::String>, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "50")] - pub features: ::core::option::Option, /// The parser stores options it doesn't recognize here. /// See the documentation for the "Options" section above. #[prost(message, repeated, tag = "999")] @@ -700,10 +734,6 @@ pub struct MessageOptions { /// this is a formalization for deprecating messages. #[prost(bool, optional, tag = "3", default = "false")] pub deprecated: ::core::option::Option, - /// NOTE: Do not set the option in .proto files. Always use the maps syntax - /// instead. The option should only be implicitly set by the proto compiler - /// parser. - /// /// Whether the message is an automatically generated map entry type for the /// maps field. /// @@ -721,24 +751,12 @@ pub struct MessageOptions { /// use a native map in the target language to hold the keys and values. /// The reflection APIs in such implementations still need to work as /// if the field is a repeated message field. + /// + /// NOTE: Do not set the option in .proto files. Always use the maps syntax + /// instead. The option should only be implicitly set by the proto compiler + /// parser. #[prost(bool, optional, tag = "7")] pub map_entry: ::core::option::Option, - /// Enable the legacy handling of JSON field name conflicts. This lowercases - /// and strips underscored from the fields before comparison in proto3 only. - /// The new behavior takes `json_name` into account and applies to proto2 as - /// well. - /// - /// This should only be used as a temporary measure against broken builds due - /// to the change in behavior for JSON field name conflicts. - /// - /// TODO(b/261750190) This is legacy behavior we plan to remove once downstream - /// teams have had time to migrate. - #[deprecated] - #[prost(bool, optional, tag = "11")] - pub deprecated_legacy_json_field_conflicts: ::core::option::Option, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "12")] - pub features: ::core::option::Option, /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, @@ -748,10 +766,8 @@ pub struct MessageOptions { pub struct FieldOptions { /// The ctype option instructs the C++ code generator to use a different /// representation of the field than it normally would. See the specific - /// options below. This option is only implemented to support use of - /// \[ctype=CORD\] and \[ctype=STRING\] (the default) on non-repeated fields of - /// type "bytes" in the open source release -- sorry, we'll try to include - /// other types in a future version! + /// options below. This option is not yet implemented in the open source + /// release -- sorry, we'll try to include it in a future version! #[prost( enumeration = "field_options::CType", optional, @@ -801,6 +817,7 @@ pub struct FieldOptions { /// call from multiple threads concurrently, while non-const methods continue /// to require exclusive access. /// + /// /// Note that implementations may choose not to check required fields within /// a lazy sub-message. That is, calling IsInitialized() on the outer message /// may return true even if the inner message has missing required fields. @@ -812,8 +829,11 @@ pub struct FieldOptions { /// check its required fields, regardless of whether or not the message has /// been parsed. /// - /// As of May 2022, lazy verifies the contents of the byte stream during - /// parsing. An invalid byte stream will cause the overall parsing to fail. + /// As of 2021, lazy does no correctness checks on the byte stream during + /// parsing. This may lead to crashes if and when an invalid byte stream is + /// finally parsed upon access. + /// + /// TODO(b/211906113): Enable validation on lazy fields. #[prost(bool, optional, tag = "5", default = "false")] pub lazy: ::core::option::Option, /// unverified_lazy does no correctness checks on the byte stream. This should @@ -830,39 +850,12 @@ pub struct FieldOptions { /// For Google-internal migration only. Do not use. #[prost(bool, optional, tag = "10", default = "false")] pub weak: ::core::option::Option, - /// Indicate that the field value should not be printed out when using debug - /// formats, e.g. when the field contains sensitive credentials. - #[prost(bool, optional, tag = "16", default = "false")] - pub debug_redact: ::core::option::Option, - #[prost(enumeration = "field_options::OptionRetention", optional, tag = "17")] - pub retention: ::core::option::Option, - #[prost( - enumeration = "field_options::OptionTargetType", - repeated, - packed = "false", - tag = "19" - )] - pub targets: ::prost::alloc::vec::Vec, - #[prost(message, repeated, tag = "20")] - pub edition_defaults: ::prost::alloc::vec::Vec, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "21")] - pub features: ::core::option::Option, /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, } /// Nested message and enum types in `FieldOptions`. pub mod field_options { - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct EditionDefault { - #[prost(string, optional, tag = "1")] - pub edition: ::core::option::Option<::prost::alloc::string::String>, - /// Textproto value. - #[prost(string, optional, tag = "2")] - pub value: ::core::option::Option<::prost::alloc::string::String>, - } #[derive( Clone, Copy, @@ -878,12 +871,6 @@ pub mod field_options { pub enum CType { /// Default mode. String = 0, - /// The option \[ctype=CORD\] may be applied to a non-repeated field of type - /// "bytes". It indicates that in C++, the data should be stored in a Cord - /// instead of a string. For very large strings, this may reduce memory - /// fragmentation. It may also allow better performance when parsing from a - /// Cord, or when parsing with aliasing enabled, as the parsed Cord may then - /// alias the original buffer. Cord = 1, StringPiece = 2, } @@ -951,121 +938,10 @@ pub mod field_options { } } } - /// If set to RETENTION_SOURCE, the option will be omitted from the binary. - /// Note: as of January 2023, support for this is in progress and does not yet - /// have an effect (b/264593489). - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum OptionRetention { - RetentionUnknown = 0, - RetentionRuntime = 1, - RetentionSource = 2, - } - impl OptionRetention { - /// 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 { - OptionRetention::RetentionUnknown => "RETENTION_UNKNOWN", - OptionRetention::RetentionRuntime => "RETENTION_RUNTIME", - OptionRetention::RetentionSource => "RETENTION_SOURCE", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "RETENTION_UNKNOWN" => Some(Self::RetentionUnknown), - "RETENTION_RUNTIME" => Some(Self::RetentionRuntime), - "RETENTION_SOURCE" => Some(Self::RetentionSource), - _ => None, - } - } - } - /// This indicates the types of entities that the field may apply to when used - /// as an option. If it is unset, then the field may be freely used as an - /// option on any kind of entity. Note: as of January 2023, support for this is - /// in progress and does not yet have an effect (b/264593489). - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum OptionTargetType { - TargetTypeUnknown = 0, - TargetTypeFile = 1, - TargetTypeExtensionRange = 2, - TargetTypeMessage = 3, - TargetTypeField = 4, - TargetTypeOneof = 5, - TargetTypeEnum = 6, - TargetTypeEnumEntry = 7, - TargetTypeService = 8, - TargetTypeMethod = 9, - } - impl OptionTargetType { - /// 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 { - OptionTargetType::TargetTypeUnknown => "TARGET_TYPE_UNKNOWN", - OptionTargetType::TargetTypeFile => "TARGET_TYPE_FILE", - OptionTargetType::TargetTypeExtensionRange => { - "TARGET_TYPE_EXTENSION_RANGE" - } - OptionTargetType::TargetTypeMessage => "TARGET_TYPE_MESSAGE", - OptionTargetType::TargetTypeField => "TARGET_TYPE_FIELD", - OptionTargetType::TargetTypeOneof => "TARGET_TYPE_ONEOF", - OptionTargetType::TargetTypeEnum => "TARGET_TYPE_ENUM", - OptionTargetType::TargetTypeEnumEntry => "TARGET_TYPE_ENUM_ENTRY", - OptionTargetType::TargetTypeService => "TARGET_TYPE_SERVICE", - OptionTargetType::TargetTypeMethod => "TARGET_TYPE_METHOD", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "TARGET_TYPE_UNKNOWN" => Some(Self::TargetTypeUnknown), - "TARGET_TYPE_FILE" => Some(Self::TargetTypeFile), - "TARGET_TYPE_EXTENSION_RANGE" => Some(Self::TargetTypeExtensionRange), - "TARGET_TYPE_MESSAGE" => Some(Self::TargetTypeMessage), - "TARGET_TYPE_FIELD" => Some(Self::TargetTypeField), - "TARGET_TYPE_ONEOF" => Some(Self::TargetTypeOneof), - "TARGET_TYPE_ENUM" => Some(Self::TargetTypeEnum), - "TARGET_TYPE_ENUM_ENTRY" => Some(Self::TargetTypeEnumEntry), - "TARGET_TYPE_SERVICE" => Some(Self::TargetTypeService), - "TARGET_TYPE_METHOD" => Some(Self::TargetTypeMethod), - _ => None, - } - } - } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct OneofOptions { - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "1")] - pub features: ::core::option::Option, /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, @@ -1083,18 +959,6 @@ pub struct EnumOptions { /// is a formalization for deprecating enums. #[prost(bool, optional, tag = "3", default = "false")] pub deprecated: ::core::option::Option, - /// Enable the legacy handling of JSON field name conflicts. This lowercases - /// and strips underscored from the fields before comparison in proto3 only. - /// The new behavior takes `json_name` into account and applies to proto2 as - /// well. - /// TODO(b/261750190) Remove this legacy behavior once downstream teams have - /// had time to migrate. - #[deprecated] - #[prost(bool, optional, tag = "6")] - pub deprecated_legacy_json_field_conflicts: ::core::option::Option, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "7")] - pub features: ::core::option::Option, /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, @@ -1108,14 +972,6 @@ pub struct EnumValueOptions { /// this is a formalization for deprecating enum values. #[prost(bool, optional, tag = "1", default = "false")] pub deprecated: ::core::option::Option, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "2")] - pub features: ::core::option::Option, - /// Indicate that fields annotated with this enum value should not be printed - /// out when using debug formats, e.g. when the field contains sensitive - /// credentials. - #[prost(bool, optional, tag = "3", default = "false")] - pub debug_redact: ::core::option::Option, /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, @@ -1123,9 +979,6 @@ pub struct EnumValueOptions { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ServiceOptions { - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "34")] - pub features: ::core::option::Option, /// Is this service deprecated? /// Depending on the target platform, this can emit Deprecated annotations /// for the service, or it will be completely ignored; in the very least, @@ -1152,9 +1005,6 @@ pub struct MethodOptions { default = "IdempotencyUnknown" )] pub idempotency_level: ::core::option::Option, - /// Any features defined in the specific edition. - #[prost(message, optional, tag = "35")] - pub features: ::core::option::Option, /// The parser stores options it doesn't recognize here. See above. #[prost(message, repeated, tag = "999")] pub uninterpreted_option: ::prost::alloc::vec::Vec, @@ -1248,275 +1098,8 @@ pub mod uninterpreted_option { pub is_extension: bool, } } -/// TODO(b/274655146) Enums in C++ gencode (and potentially other languages) are -/// not well scoped. This means that each of the feature enums below can clash -/// with each other. The short names we've chosen maximize call-site -/// readability, but leave us very open to this scenario. A future feature will -/// be designed and implemented to handle this, hopefully before we ever hit a -/// conflict here. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct FeatureSet { - #[prost(enumeration = "feature_set::FieldPresence", optional, tag = "1")] - pub field_presence: ::core::option::Option, - #[prost(enumeration = "feature_set::EnumType", optional, tag = "2")] - pub enum_type: ::core::option::Option, - #[prost(enumeration = "feature_set::RepeatedFieldEncoding", optional, tag = "3")] - pub repeated_field_encoding: ::core::option::Option, - #[prost(enumeration = "feature_set::StringFieldValidation", optional, tag = "4")] - pub string_field_validation: ::core::option::Option, - #[prost(enumeration = "feature_set::MessageEncoding", optional, tag = "5")] - pub message_encoding: ::core::option::Option, - #[prost(enumeration = "feature_set::JsonFormat", optional, tag = "6")] - pub json_format: ::core::option::Option, - #[prost(message, optional, boxed, tag = "999")] - pub raw_features: ::core::option::Option<::prost::alloc::boxed::Box>, -} -/// Nested message and enum types in `FeatureSet`. -pub mod feature_set { - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum FieldPresence { - Unknown = 0, - Explicit = 1, - Implicit = 2, - LegacyRequired = 3, - } - impl FieldPresence { - /// 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 { - FieldPresence::Unknown => "FIELD_PRESENCE_UNKNOWN", - FieldPresence::Explicit => "EXPLICIT", - FieldPresence::Implicit => "IMPLICIT", - FieldPresence::LegacyRequired => "LEGACY_REQUIRED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "FIELD_PRESENCE_UNKNOWN" => Some(Self::Unknown), - "EXPLICIT" => Some(Self::Explicit), - "IMPLICIT" => Some(Self::Implicit), - "LEGACY_REQUIRED" => Some(Self::LegacyRequired), - _ => None, - } - } - } - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum EnumType { - Unknown = 0, - Open = 1, - Closed = 2, - } - impl EnumType { - /// 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 { - EnumType::Unknown => "ENUM_TYPE_UNKNOWN", - EnumType::Open => "OPEN", - EnumType::Closed => "CLOSED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "ENUM_TYPE_UNKNOWN" => Some(Self::Unknown), - "OPEN" => Some(Self::Open), - "CLOSED" => Some(Self::Closed), - _ => None, - } - } - } - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum RepeatedFieldEncoding { - Unknown = 0, - Packed = 1, - Expanded = 2, - } - impl RepeatedFieldEncoding { - /// 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 { - RepeatedFieldEncoding::Unknown => "REPEATED_FIELD_ENCODING_UNKNOWN", - RepeatedFieldEncoding::Packed => "PACKED", - RepeatedFieldEncoding::Expanded => "EXPANDED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "REPEATED_FIELD_ENCODING_UNKNOWN" => Some(Self::Unknown), - "PACKED" => Some(Self::Packed), - "EXPANDED" => Some(Self::Expanded), - _ => None, - } - } - } - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum StringFieldValidation { - Unknown = 0, - Mandatory = 1, - Hint = 2, - None = 3, - } - impl StringFieldValidation { - /// 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 { - StringFieldValidation::Unknown => "STRING_FIELD_VALIDATION_UNKNOWN", - StringFieldValidation::Mandatory => "MANDATORY", - StringFieldValidation::Hint => "HINT", - StringFieldValidation::None => "NONE", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "STRING_FIELD_VALIDATION_UNKNOWN" => Some(Self::Unknown), - "MANDATORY" => Some(Self::Mandatory), - "HINT" => Some(Self::Hint), - "NONE" => Some(Self::None), - _ => None, - } - } - } - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum MessageEncoding { - Unknown = 0, - LengthPrefixed = 1, - Delimited = 2, - } - impl MessageEncoding { - /// 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 { - MessageEncoding::Unknown => "MESSAGE_ENCODING_UNKNOWN", - MessageEncoding::LengthPrefixed => "LENGTH_PREFIXED", - MessageEncoding::Delimited => "DELIMITED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "MESSAGE_ENCODING_UNKNOWN" => Some(Self::Unknown), - "LENGTH_PREFIXED" => Some(Self::LengthPrefixed), - "DELIMITED" => Some(Self::Delimited), - _ => None, - } - } - } - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum JsonFormat { - Unknown = 0, - Allow = 1, - LegacyBestEffort = 2, - } - impl JsonFormat { - /// 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 { - JsonFormat::Unknown => "JSON_FORMAT_UNKNOWN", - JsonFormat::Allow => "ALLOW", - JsonFormat::LegacyBestEffort => "LEGACY_BEST_EFFORT", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "JSON_FORMAT_UNKNOWN" => Some(Self::Unknown), - "ALLOW" => Some(Self::Allow), - "LEGACY_BEST_EFFORT" => Some(Self::LegacyBestEffort), - _ => None, - } - } - } -} -/// Encapsulates information about the original source file from which a -/// FileDescriptorProto was generated. +/// Encapsulates information about the original source file from which a +/// FileDescriptorProto was generated. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SourceCodeInfo { @@ -1688,191 +1271,12 @@ pub mod generated_code_info { #[prost(int32, optional, tag = "3")] pub begin: ::core::option::Option, /// Identifies the ending offset in bytes in the generated code that - /// relates to the identified object. The end offset should be one past + /// relates to the identified offset. The end offset should be one past /// the last relevant byte (so the length of the text = end - begin). #[prost(int32, optional, tag = "4")] pub end: ::core::option::Option, - #[prost(enumeration = "annotation::Semantic", optional, tag = "5")] - pub semantic: ::core::option::Option, - } - /// Nested message and enum types in `Annotation`. - pub mod annotation { - /// Represents the identified object's effect on the element in the original - /// .proto file. - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum Semantic { - /// There is no effect or the effect is indescribable. - None = 0, - /// The element is set or otherwise mutated. - Set = 1, - /// An alias to the element is returned. - Alias = 2, - } - impl Semantic { - /// 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 { - Semantic::None => "NONE", - Semantic::Set => "SET", - Semantic::Alias => "ALIAS", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "NONE" => Some(Self::None), - "SET" => Some(Self::Set), - "ALIAS" => Some(Self::Alias), - _ => None, - } - } - } } } -/// `Any` contains an arbitrary serialized protocol buffer message along with a -/// URL that describes the type of the serialized message. -/// -/// Protobuf library provides support to pack/unpack Any values in the form -/// of utility functions or additional generated methods of the Any type. -/// -/// Example 1: Pack and unpack a message in C++. -/// -/// Foo foo = ...; -/// Any any; -/// any.PackFrom(foo); -/// ... -/// if (any.UnpackTo(&foo)) { -/// ... -/// } -/// -/// Example 2: Pack and unpack a message in Java. -/// -/// Foo foo = ...; -/// Any any = Any.pack(foo); -/// ... -/// if (any.is(Foo.class)) { -/// foo = any.unpack(Foo.class); -/// } -/// // or ... -/// if (any.isSameTypeAs(Foo.getDefaultInstance())) { -/// foo = any.unpack(Foo.getDefaultInstance()); -/// } -/// -/// Example 3: Pack and unpack a message in Python. -/// -/// foo = Foo(...) -/// any = Any() -/// any.Pack(foo) -/// ... -/// if any.Is(Foo.DESCRIPTOR): -/// any.Unpack(foo) -/// ... -/// -/// Example 4: Pack and unpack a message in Go -/// -/// foo := &pb.Foo{...} -/// any, err := anypb.New(foo) -/// if err != nil { -/// ... -/// } -/// ... -/// foo := &pb.Foo{} -/// if err := any.UnmarshalTo(foo); err != nil { -/// ... -/// } -/// -/// The pack methods provided by protobuf library will by default use -/// 'type.googleapis.com/full.type.name' as the type URL and the unpack -/// methods only use the fully qualified type name after the last '/' -/// in the type URL, for example "foo.bar.com/x/y.z" will yield type -/// name "y.z". -/// -/// JSON -/// ==== -/// The JSON representation of an `Any` value uses the regular -/// representation of the deserialized, embedded message, with an -/// additional field `@type` which contains the type URL. Example: -/// -/// package google.profile; -/// message Person { -/// string first_name = 1; -/// string last_name = 2; -/// } -/// -/// { -/// "@type": "type.googleapis.com/google.profile.Person", -/// "firstName": , -/// "lastName": -/// } -/// -/// If the embedded message type is well-known and has a custom JSON -/// representation, that representation will be embedded adding a field -/// `value` which holds the custom JSON in addition to the `@type` -/// field. Example (for message [google.protobuf.Duration][]): -/// -/// { -/// "@type": "type.googleapis.com/google.protobuf.Duration", -/// "value": "1.212s" -/// } -/// -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[derive(Eq)] -#[cfg_attr( - all(feature = "json-schema", feature = "serde"), - derive(::schemars::JsonSchema) -)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Any { - /// A URL/resource name that uniquely identifies the type of the serialized - /// protocol buffer message. This string must contain at least - /// one "/" character. The last segment of the URL's path must represent - /// the fully qualified name of the type (as in - /// `path/google.protobuf.Duration`). The name should be in a canonical form - /// (e.g., leading "." is not accepted). - /// - /// In practice, teams usually precompile into the binary all types that they - /// expect it to use in the context of Any. However, for URLs which use the - /// scheme `http`, `https`, or no scheme, one can optionally set up a type - /// server that maps type URLs to message definitions as follows: - /// - /// * If no scheme is provided, `https` is assumed. - /// * An HTTP GET on the URL must yield a [google.protobuf.Type][] - /// value in binary format, or produce an error. - /// * Applications are allowed to cache lookup results based on the - /// URL, or have them precompiled into a binary to avoid any - /// lookup. Therefore, binary compatibility needs to be preserved - /// on changes to types. (Use versioned type names to manage - /// breaking changes.) - /// - /// Note: this functionality is not currently available in the official - /// protobuf release, and it is not used for type URLs beginning with - /// type.googleapis.com. As of May 2023, there are no widely used type server - /// implementations and no plans to implement one. - /// - /// Schemes other than `http`, `https` (or the empty scheme) might be - /// used with implementation specific semantics. - /// - #[prost(string, tag = "1")] - pub type_url: ::prost::alloc::string::String, - /// Must be a valid serialized protocol buffer of the above specified type. - #[prost(bytes = "vec", tag = "2")] - pub value: ::prost::alloc::vec::Vec, -} /// A Timestamp represents a point in time independent of any time zone or local /// calendar, encoded as a count of seconds and fractions of seconds at /// nanosecond resolution. The count is relative to an epoch at UTC midnight on @@ -1923,6 +1327,7 @@ pub struct Any { /// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) /// .setNanos((int) ((millis % 1000) * 1000000)).build(); /// +/// /// Example 5: Compute Timestamp from Java `Instant.now()`. /// /// Instant now = Instant.now(); @@ -1931,6 +1336,7 @@ pub struct Any { /// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) /// .setNanos(now.getNano()).build(); /// +/// /// Example 6: Compute Timestamp from current time in Python. /// /// timestamp = Timestamp() @@ -1960,9 +1366,10 @@ pub struct Any { /// [`strftime`]() with /// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use /// the Joda Time's [`ISODateTimeFormat.dateTime()`]( -/// ) +/// /// ) to obtain a formatter capable of generating timestamps in this format. /// +/// #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -2038,6 +1445,7 @@ pub struct Timestamp { /// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 /// microsecond should be expressed in JSON format as "3.000001s". /// +/// #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[derive(Eq)] #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/src/prost/ibc.applications.fee.v1.rs b/src/prost/ibc.applications.fee.v1.rs index 019791ae..0a0885f6 100644 --- a/src/prost/ibc.applications.fee.v1.rs +++ b/src/prost/ibc.applications.fee.v1.rs @@ -817,6 +817,11 @@ pub struct QueryIncentivizedPacketsResponse { /// list of identified fees for incentivized packets #[prost(message, repeated, tag = "1")] pub incentivized_packets: ::prost::alloc::vec::Vec, + /// pagination defines the pagination in the response. + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option< + super::super::super::super::cosmos::base::query::v1beta1::PageResponse, + >, } /// QueryIncentivizedPacketRequest defines the request type for the IncentivizedPacket rpc #[allow(clippy::derive_partial_eq_without_eq)] @@ -864,6 +869,11 @@ pub struct QueryIncentivizedPacketsForChannelResponse { /// Map of all incentivized_packets #[prost(message, repeated, tag = "1")] pub incentivized_packets: ::prost::alloc::vec::Vec, + /// pagination defines the pagination in the response. + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option< + super::super::super::super::cosmos::base::query::v1beta1::PageResponse, + >, } /// QueryTotalRecvFeesRequest defines the request type for the TotalRecvFees rpc #[allow(clippy::derive_partial_eq_without_eq)] @@ -983,6 +993,11 @@ pub struct QueryFeeEnabledChannelsResponse { /// list of fee enabled channels #[prost(message, repeated, tag = "1")] pub fee_enabled_channels: ::prost::alloc::vec::Vec, + /// pagination defines the pagination in the response. + #[prost(message, optional, tag = "2")] + pub pagination: ::core::option::Option< + super::super::super::super::cosmos::base::query::v1beta1::PageResponse, + >, } /// QueryFeeEnabledChannelRequest defines the request type for the FeeEnabledChannel rpc #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/src/prost/ibc.applications.interchain_accounts.controller.v1.rs b/src/prost/ibc.applications.interchain_accounts.controller.v1.rs index bf17588d..a351adda 100644 --- a/src/prost/ibc.applications.interchain_accounts.controller.v1.rs +++ b/src/prost/ibc.applications.interchain_accounts.controller.v1.rs @@ -1,3 +1,13 @@ +/// Params defines the set of on-chain interchain accounts parameters. +/// The following parameters may be used to disable the controller submodule. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Params { + /// controller_enabled enables or disables the controller submodule. + #[prost(bool, tag = "1")] + pub controller_enabled: bool, +} /// MsgRegisterInterchainAccount defines the payload for Msg/RegisterAccount #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] @@ -46,6 +56,25 @@ pub struct MsgSendTxResponse { #[prost(uint64, tag = "1")] pub sequence: u64, } +/// MsgUpdateParams defines the payload for Msg/UpdateParams +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParams { + /// signer address + #[prost(string, tag = "1")] + pub signer: ::prost::alloc::string::String, + /// params defines the 27-interchain-accounts/controller parameters to update. + /// + /// NOTE: All parameters must be supplied. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, +} +/// MsgUpdateParamsResponse defines the response for Msg/UpdateParams +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} /// Generated client implementations. #[cfg(feature = "client")] pub mod msg_client { @@ -195,6 +224,37 @@ pub mod msg_client { ); self.inner.unary(req, path, codec).await } + /// UpdateParams defines a rpc handler for MsgUpdateParams. + 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( + "/ibc.applications.interchain_accounts.controller.v1.Msg/UpdateParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "ibc.applications.interchain_accounts.controller.v1.Msg", + "UpdateParams", + ), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -221,6 +281,14 @@ pub mod msg_server { tonic::Response, tonic::Status, >; + /// UpdateParams defines a rpc handler for MsgUpdateParams. + async fn update_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// Msg defines the 27-interchain-accounts/controller Msg service. #[derive(Debug)] @@ -393,6 +461,50 @@ pub mod msg_server { }; Box::pin(fut) } + "/ibc.applications.interchain_accounts.controller.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 inner = inner.0; + 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( @@ -434,16 +546,6 @@ pub mod msg_server { const NAME: &'static str = "ibc.applications.interchain_accounts.controller.v1.Msg"; } } -/// Params defines the set of on-chain interchain accounts parameters. -/// The following parameters may be used to disable the controller submodule. -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Params { - /// controller_enabled enables or disables the controller submodule. - #[prost(bool, tag = "1")] - pub controller_enabled: bool, -} /// QueryInterchainAccountRequest is the request type for the Query/InterchainAccount RPC method. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/src/prost/ibc.applications.interchain_accounts.host.v1.rs b/src/prost/ibc.applications.interchain_accounts.host.v1.rs index 3a16bdb6..00c7acb0 100644 --- a/src/prost/ibc.applications.interchain_accounts.host.v1.rs +++ b/src/prost/ibc.applications.interchain_accounts.host.v1.rs @@ -11,6 +11,327 @@ pub struct Params { #[prost(string, repeated, tag = "2")] pub allow_messages: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } +/// MsgUpdateParams defines the payload for Msg/UpdateParams +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParams { + /// signer address + #[prost(string, tag = "1")] + pub signer: ::prost::alloc::string::String, + /// params defines the 27-interchain-accounts/host parameters to update. + /// + /// NOTE: All parameters must be supplied. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, +} +/// MsgUpdateParamsResponse defines the response for Msg/UpdateParams +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} +/// 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 27-interchain-accounts/host 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 + } + /// UpdateParams defines a rpc handler for MsgUpdateParams. + 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( + "/ibc.applications.interchain_accounts.host.v1.Msg/UpdateParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "ibc.applications.interchain_accounts.host.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 { + /// UpdateParams defines a rpc handler for MsgUpdateParams. + async fn update_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /// Msg defines the 27-interchain-accounts/host Msg service. + #[derive(Debug)] + pub struct MsgServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl MsgServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + 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 { + let inner = self.inner.clone(); + match req.uri().path() { + "/ibc.applications.interchain_accounts.host.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 inner = inner.0; + 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", "12") + .header("content-type", "application/grpc") + .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 Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for MsgServer { + const NAME: &'static str = "ibc.applications.interchain_accounts.host.v1.Msg"; + } +} /// QueryParamsRequest is the request type for the Query/Params RPC method. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] #[allow(clippy::derive_partial_eq_without_eq)] diff --git a/src/prost/ibc.applications.transfer.v1.rs b/src/prost/ibc.applications.transfer.v1.rs index 42a9cbb7..ba523ebd 100644 --- a/src/prost/ibc.applications.transfer.v1.rs +++ b/src/prost/ibc.applications.transfer.v1.rs @@ -1,3 +1,34 @@ +/// DenomTrace contains the base denomination for ICS20 fungible tokens and the +/// source tracing information path. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DenomTrace { + /// path defines the chain of port/channel identifiers used for tracing the + /// source of the fungible token. + #[prost(string, tag = "1")] + pub path: ::prost::alloc::string::String, + /// base denomination of the relayed fungible token. + #[prost(string, tag = "2")] + pub base_denom: ::prost::alloc::string::String, +} +/// Params defines the set of IBC transfer parameters. +/// NOTE: To prevent a single token from being transferred, set the +/// TransfersEnabled parameter to true and then set the bank module's SendEnabled +/// parameter for the denomination to false. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Params { + /// send_enabled enables or disables all cross-chain token transfers from this + /// chain. + #[prost(bool, tag = "1")] + pub send_enabled: bool, + /// receive_enabled enables or disables all cross-chain token transfers to this + /// chain. + #[prost(bool, tag = "2")] + pub receive_enabled: bool, +} /// MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between /// ICS20 enabled chains. See ICS Spec here: /// @@ -46,6 +77,26 @@ pub struct MsgTransferResponse { #[prost(uint64, tag = "1")] pub sequence: u64, } +/// MsgUpdateParams is the Msg/UpdateParams request type. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParams { + /// signer address + #[prost(string, tag = "1")] + pub signer: ::prost::alloc::string::String, + /// params defines the transfer parameters to update. + /// + /// NOTE: All parameters must be supplied. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, +} +/// MsgUpdateParamsResponse defines the response structure for executing a +/// MsgUpdateParams message. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} /// Generated client implementations. #[cfg(feature = "client")] pub mod msg_client { @@ -159,6 +210,34 @@ pub mod msg_client { .insert(GrpcMethod::new("ibc.applications.transfer.v1.Msg", "Transfer")); self.inner.unary(req, path, codec).await } + /// UpdateParams defines a rpc handler for MsgUpdateParams. + 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( + "/ibc.applications.transfer.v1.Msg/UpdateParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("ibc.applications.transfer.v1.Msg", "UpdateParams"), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -177,6 +256,14 @@ pub mod msg_server { tonic::Response, tonic::Status, >; + /// UpdateParams defines a rpc handler for MsgUpdateParams. + async fn update_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// Msg defines the ibc/transfer Msg service. #[derive(Debug)] @@ -302,6 +389,50 @@ pub mod msg_server { }; Box::pin(fut) } + "/ibc.applications.transfer.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 inner = inner.0; + 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( @@ -343,37 +474,6 @@ pub mod msg_server { const NAME: &'static str = "ibc.applications.transfer.v1.Msg"; } } -/// DenomTrace contains the base denomination for ICS20 fungible tokens and the -/// source tracing information path. -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct DenomTrace { - /// path defines the chain of port/channel identifiers used for tracing the - /// source of the fungible token. - #[prost(string, tag = "1")] - pub path: ::prost::alloc::string::String, - /// base denomination of the relayed fungible token. - #[prost(string, tag = "2")] - pub base_denom: ::prost::alloc::string::String, -} -/// Params defines the set of IBC transfer parameters. -/// NOTE: To prevent a single token from being transferred, set the -/// TransfersEnabled parameter to true and then set the bank module's SendEnabled -/// parameter for the denomination to false. -#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Params { - /// send_enabled enables or disables all cross-chain token transfers from this - /// chain. - #[prost(bool, tag = "1")] - pub send_enabled: bool, - /// receive_enabled enables or disables all cross-chain token transfers to this - /// chain. - #[prost(bool, tag = "2")] - pub receive_enabled: bool, -} /// QueryDenomTraceRequest is the request type for the Query/DenomTrace RPC /// method #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -581,12 +681,12 @@ pub mod query_client { self.inner = self.inner.max_encoding_message_size(limit); self } - /// DenomTrace queries a denomination trace information. - pub async fn denom_trace( + /// DenomTraces queries all denomination traces. + pub async fn denom_traces( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -600,21 +700,21 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/ibc.applications.transfer.v1.Query/DenomTrace", + "/ibc.applications.transfer.v1.Query/DenomTraces", ); let mut req = request.into_request(); req.extensions_mut() .insert( - GrpcMethod::new("ibc.applications.transfer.v1.Query", "DenomTrace"), + GrpcMethod::new("ibc.applications.transfer.v1.Query", "DenomTraces"), ); self.inner.unary(req, path, codec).await } - /// DenomTraces queries all denomination traces. - pub async fn denom_traces( + /// DenomTrace queries a denomination trace information. + pub async fn denom_trace( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -628,12 +728,12 @@ pub mod query_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/ibc.applications.transfer.v1.Query/DenomTraces", + "/ibc.applications.transfer.v1.Query/DenomTrace", ); let mut req = request.into_request(); req.extensions_mut() .insert( - GrpcMethod::new("ibc.applications.transfer.v1.Query", "DenomTraces"), + GrpcMethod::new("ibc.applications.transfer.v1.Query", "DenomTrace"), ); self.inner.unary(req, path, codec).await } @@ -763,14 +863,6 @@ pub mod query_server { /// Generated trait containing gRPC methods that should be implemented for use with QueryServer. #[async_trait] pub trait Query: Send + Sync + 'static { - /// DenomTrace queries a denomination trace information. - async fn denom_trace( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; /// DenomTraces queries all denomination traces. async fn denom_traces( &self, @@ -779,6 +871,14 @@ pub mod query_server { tonic::Response, tonic::Status, >; + /// DenomTrace queries a denomination trace information. + async fn denom_trace( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Params queries all parameters of the ibc-transfer module. async fn params( &self, @@ -892,25 +992,25 @@ pub mod query_server { fn call(&mut self, req: http::Request) -> Self::Future { let inner = self.inner.clone(); match req.uri().path() { - "/ibc.applications.transfer.v1.Query/DenomTrace" => { + "/ibc.applications.transfer.v1.Query/DenomTraces" => { #[allow(non_camel_case_types)] - struct DenomTraceSvc(pub Arc); + struct DenomTracesSvc(pub Arc); impl< T: Query, - > tonic::server::UnaryService - for DenomTraceSvc { - type Response = super::QueryDenomTraceResponse; + > tonic::server::UnaryService + for DenomTracesSvc { + type Response = super::QueryDenomTracesResponse; 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 { - ::denom_trace(&inner, request).await + ::denom_traces(&inner, request).await }; Box::pin(fut) } @@ -922,7 +1022,7 @@ pub mod query_server { let inner = self.inner.clone(); let fut = async move { let inner = inner.0; - let method = DenomTraceSvc(inner); + let method = DenomTracesSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -938,25 +1038,25 @@ pub mod query_server { }; Box::pin(fut) } - "/ibc.applications.transfer.v1.Query/DenomTraces" => { + "/ibc.applications.transfer.v1.Query/DenomTrace" => { #[allow(non_camel_case_types)] - struct DenomTracesSvc(pub Arc); + struct DenomTraceSvc(pub Arc); impl< T: Query, - > tonic::server::UnaryService - for DenomTracesSvc { - type Response = super::QueryDenomTracesResponse; + > tonic::server::UnaryService + for DenomTraceSvc { + type Response = super::QueryDenomTraceResponse; 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 { - ::denom_traces(&inner, request).await + ::denom_trace(&inner, request).await }; Box::pin(fut) } @@ -968,7 +1068,7 @@ pub mod query_server { let inner = self.inner.clone(); let fut = async move { let inner = inner.0; - let method = DenomTracesSvc(inner); + let method = DenomTraceSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( diff --git a/src/prost/ibc.core.channel.v1.rs b/src/prost/ibc.core.channel.v1.rs index d741e62c..2dd7954d 100644 --- a/src/prost/ibc.core.channel.v1.rs +++ b/src/prost/ibc.core.channel.v1.rs @@ -169,6 +169,20 @@ pub mod acknowledgement { Error(::prost::alloc::string::String), } } +/// Timeout defines an execution deadline structure for 04-channel handlers. +/// This includes packet lifecycle handlers as well as the upgrade handshake handlers. +/// A valid Timeout contains either one or both of a timestamp and block height (sequence). +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Timeout { + /// block height after which the packet or upgrade times out + #[prost(message, optional, tag = "1")] + pub height: ::core::option::Option, + /// block timestamp (in nanoseconds) after which the packet or upgrade times out + #[prost(uint64, tag = "2")] + pub timestamp: u64, +} /// State defines if a channel is in one of the following states: /// CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -1992,6 +2006,35 @@ pub struct QueryNextSequenceReceiveResponse { #[prost(message, optional, tag = "3")] pub proof_height: ::core::option::Option, } +/// QueryNextSequenceSendRequest is the request type for the +/// Query/QueryNextSequenceSend RPC method +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryNextSequenceSendRequest { + /// port unique identifier + #[prost(string, tag = "1")] + pub port_id: ::prost::alloc::string::String, + /// channel unique identifier + #[prost(string, tag = "2")] + pub channel_id: ::prost::alloc::string::String, +} +/// QueryNextSequenceSendResponse is the request type for the +/// Query/QueryNextSequenceSend RPC method +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryNextSequenceSendResponse { + /// next sequence send number + #[prost(uint64, tag = "1")] + pub next_sequence_send: u64, + /// merkle proof of existence + #[prost(bytes = "vec", tag = "2")] + pub proof: ::prost::alloc::vec::Vec, + /// height at which the proof was retrieved + #[prost(message, optional, tag = "3")] + pub proof_height: ::core::option::Option, +} /// Generated client implementations. #[cfg(feature = "client")] pub mod query_client { @@ -2446,6 +2489,34 @@ pub mod query_client { ); self.inner.unary(req, path, codec).await } + /// NextSequenceSend returns the next send sequence for a given channel. + pub async fn next_sequence_send( + &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( + "/ibc.core.channel.v1.Query/NextSequenceSend", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("ibc.core.channel.v1.Query", "NextSequenceSend"), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -2568,6 +2639,14 @@ pub mod query_server { tonic::Response, tonic::Status, >; + /// NextSequenceSend returns the next send sequence for a given channel. + async fn next_sequence_send( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// Query provides defines the gRPC querier service #[derive(Debug)] @@ -3262,6 +3341,52 @@ pub mod query_server { }; Box::pin(fut) } + "/ibc.core.channel.v1.Query/NextSequenceSend" => { + #[allow(non_camel_case_types)] + struct NextSequenceSendSvc(pub Arc); + impl< + T: Query, + > tonic::server::UnaryService + for NextSequenceSendSvc { + type Response = super::QueryNextSequenceSendResponse; + 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 { + ::next_sequence_send(&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 inner = inner.0; + let method = NextSequenceSendSvc(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( diff --git a/src/prost/ibc.core.connection.v1.rs b/src/prost/ibc.core.connection.v1.rs index a9b00b4b..12cc3618 100644 --- a/src/prost/ibc.core.connection.v1.rs +++ b/src/prost/ibc.core.connection.v1.rs @@ -313,6 +313,25 @@ pub struct MsgConnectionOpenConfirm { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MsgConnectionOpenConfirmResponse {} +/// MsgUpdateParams defines the sdk.Msg type to update the connection parameters. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParams { + /// signer address + #[prost(string, tag = "1")] + pub signer: ::prost::alloc::string::String, + /// params defines the connection parameters to update. + /// + /// NOTE: All parameters must be supplied. + #[prost(message, optional, tag = "2")] + pub params: ::core::option::Option, +} +/// MsgUpdateParamsResponse defines the MsgUpdateParams response type. +#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MsgUpdateParamsResponse {} /// Generated client implementations. #[cfg(feature = "client")] pub mod msg_client { @@ -516,6 +535,38 @@ pub mod msg_client { ); self.inner.unary(req, path, codec).await } + /// UpdateConnectionParams defines a rpc handler method for + /// MsgUpdateParams. + pub async fn update_connection_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( + "/ibc.core.connection.v1.Msg/UpdateConnectionParams", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "ibc.core.connection.v1.Msg", + "UpdateConnectionParams", + ), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -559,6 +610,15 @@ pub mod msg_server { tonic::Response, tonic::Status, >; + /// UpdateConnectionParams defines a rpc handler method for + /// MsgUpdateParams. + async fn update_connection_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// Msg defines the ibc/connection Msg service. #[derive(Debug)] @@ -820,6 +880,50 @@ pub mod msg_server { }; Box::pin(fut) } + "/ibc.core.connection.v1.Msg/UpdateConnectionParams" => { + #[allow(non_camel_case_types)] + struct UpdateConnectionParamsSvc(pub Arc); + impl tonic::server::UnaryService + for UpdateConnectionParamsSvc { + 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_connection_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 inner = inner.0; + let method = UpdateConnectionParamsSvc(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( diff --git a/src/prost/proto_descriptor.bin b/src/prost/proto_descriptor.bin index d8d01bf06aa64b6244759d5af6ddb358c2c3b058..bb1bdf04b84fa0804aba2499b430697819814b7f 100644 GIT binary patch delta 67457 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 bL_Td5X86kAL0IzS@2tVmGV0&9jwJm*azjFQ delta 87989 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

    Jrpi+qO!9!|ck?|5Z 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

    )A5jeKdGP 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 BtzZBE