ibc_proto/prost/
interchain_security.ccv.provider.v1.rs

1// This file is @generated by prost-build.
2/// WARNING: This message is deprecated in favor of `MsgCreateConsumer`.
3/// ConsumerAdditionProposal is a governance proposal on the provider chain to
4/// spawn a new consumer chain. If it passes, then all validators on the provider
5/// chain are expected to validate the consumer chain at spawn time or get
6/// slashed. It is recommended that spawn time occurs after the proposal end
7/// time.
8/// Use MsgConsumerAddition to submit this proposal type.
9#[allow(clippy::derive_partial_eq_without_eq)]
10#[derive(Clone, PartialEq, ::prost::Message)]
11pub struct ConsumerAdditionProposal {
12    /// the title of the proposal
13    #[prost(string, tag = "1")]
14    pub title: ::prost::alloc::string::String,
15    /// the description of the proposal
16    #[prost(string, tag = "2")]
17    pub description: ::prost::alloc::string::String,
18    /// the proposed chain-id of the new consumer chain, must be different from all
19    /// other consumer chain ids of the executing provider chain.
20    #[prost(string, tag = "3")]
21    pub chain_id: ::prost::alloc::string::String,
22    /// the proposed initial height of new consumer chain.
23    /// For a completely new chain, this will be {0,1}. However, it may be
24    /// different if this is a chain that is converting to a consumer chain.
25    #[prost(message, optional, tag = "4")]
26    pub initial_height: ::core::option::Option<
27        super::super::super::super::ibc::core::client::v1::Height,
28    >,
29    /// The hash of the consumer chain genesis state without the consumer CCV
30    /// module genesis params. It is used for off-chain confirmation of
31    /// genesis.json validity by validators and other parties.
32    #[prost(bytes = "vec", tag = "5")]
33    pub genesis_hash: ::prost::alloc::vec::Vec<u8>,
34    /// The hash of the consumer chain binary that should be run by validators on
35    /// chain initialization. It is used for off-chain confirmation of binary
36    /// validity by validators and other parties.
37    #[prost(bytes = "vec", tag = "6")]
38    pub binary_hash: ::prost::alloc::vec::Vec<u8>,
39    /// spawn time is the time on the provider chain at which the consumer chain
40    /// genesis is finalized and all validators will be responsible for starting
41    /// their consumer chain validator node.
42    #[prost(message, optional, tag = "7")]
43    pub spawn_time: ::core::option::Option<
44        ::tendermint_proto::google::protobuf::Timestamp,
45    >,
46    /// Unbonding period for the consumer,
47    /// which should be smaller than that of the provider in general.
48    #[prost(message, optional, tag = "8")]
49    pub unbonding_period: ::core::option::Option<
50        ::tendermint_proto::google::protobuf::Duration,
51    >,
52    /// Sent CCV related IBC packets will timeout after this duration
53    #[prost(message, optional, tag = "9")]
54    pub ccv_timeout_period: ::core::option::Option<
55        ::tendermint_proto::google::protobuf::Duration,
56    >,
57    /// Sent transfer related IBC packets will timeout after this duration
58    #[prost(message, optional, tag = "10")]
59    pub transfer_timeout_period: ::core::option::Option<
60        ::tendermint_proto::google::protobuf::Duration,
61    >,
62    /// The fraction of tokens allocated to the consumer redistribution address
63    /// during distribution events. The fraction is a string representing a
64    /// decimal number. For example "0.75" would represent 75%.
65    #[prost(string, tag = "11")]
66    pub consumer_redistribution_fraction: ::prost::alloc::string::String,
67    /// BlocksPerDistributionTransmission is the number of blocks between
68    /// ibc-token-transfers from the consumer chain to the provider chain. On
69    /// sending transmission event, `consumer_redistribution_fraction` of the
70    /// accumulated tokens are sent to the consumer redistribution address.
71    #[prost(int64, tag = "12")]
72    pub blocks_per_distribution_transmission: i64,
73    /// The number of historical info entries to persist in store.
74    /// This param is a part of the cosmos sdk staking module. In the case of
75    /// a ccv enabled consumer chain, the ccv module acts as the staking module.
76    #[prost(int64, tag = "13")]
77    pub historical_entries: i64,
78    /// The ID of a token transfer channel used for the Reward Distribution
79    /// sub-protocol. If DistributionTransmissionChannel == "", a new transfer
80    /// channel is created on top of the same connection as the CCV channel.
81    /// Note that transfer_channel_id is the ID of the channel end on the consumer
82    /// chain. it is most relevant for chains performing a sovereign to consumer
83    /// changeover in order to maintain the existing ibc transfer channel
84    #[prost(string, tag = "14")]
85    pub distribution_transmission_channel: ::prost::alloc::string::String,
86    /// Corresponds to the percentage of validators that have to validate the chain under the Top N case.
87    /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power
88    /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\].
89    /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain.
90    #[prost(uint32, tag = "15")]
91    pub top_n: u32,
92    /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if
93    /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the
94    /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only
95    /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need
96    /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis.
97    #[prost(uint32, tag = "16")]
98    pub validators_power_cap: u32,
99    /// Corresponds to the maximum number of validators that can validate a consumer chain.
100    /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op.
101    #[prost(uint32, tag = "17")]
102    pub validator_set_cap: u32,
103    /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate
104    /// the consumer chain.
105    #[prost(string, repeated, tag = "18")]
106    pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
107    /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain.
108    #[prost(string, repeated, tag = "19")]
109    pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
110    /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain.
111    #[prost(uint64, tag = "20")]
112    pub min_stake: u64,
113    /// Corresponds to whether inactive validators are allowed to validate the consumer chain.
114    #[prost(bool, tag = "21")]
115    pub allow_inactive_vals: bool,
116}
117impl ::prost::Name for ConsumerAdditionProposal {
118    const NAME: &'static str = "ConsumerAdditionProposal";
119    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
120    fn full_name() -> ::prost::alloc::string::String {
121        "interchain_security.ccv.provider.v1.ConsumerAdditionProposal".into()
122    }
123    fn type_url() -> ::prost::alloc::string::String {
124        "/interchain_security.ccv.provider.v1.ConsumerAdditionProposal".into()
125    }
126}
127/// WARNING: This message is deprecated in favor of `MsgRemoveConsumer`.
128/// ConsumerRemovalProposal is a governance proposal on the provider chain to
129/// remove (and stop) a consumer chain. If it passes, all the consumer chain's
130/// state is removed from the provider chain. The outstanding unbonding operation
131/// funds are released.
132/// Use MsgConsumerRemoval to submit this proposal type.
133#[allow(clippy::derive_partial_eq_without_eq)]
134#[derive(Clone, PartialEq, ::prost::Message)]
135pub struct ConsumerRemovalProposal {
136    /// the title of the proposal
137    #[prost(string, tag = "1")]
138    pub title: ::prost::alloc::string::String,
139    /// the description of the proposal
140    #[prost(string, tag = "2")]
141    pub description: ::prost::alloc::string::String,
142    /// the chain-id of the consumer chain to be stopped
143    #[prost(string, tag = "3")]
144    pub chain_id: ::prost::alloc::string::String,
145    /// the time on the provider chain at which all validators are responsible to
146    /// stop their consumer chain validator node
147    #[prost(message, optional, tag = "4")]
148    pub stop_time: ::core::option::Option<
149        ::tendermint_proto::google::protobuf::Timestamp,
150    >,
151}
152impl ::prost::Name for ConsumerRemovalProposal {
153    const NAME: &'static str = "ConsumerRemovalProposal";
154    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
155    fn full_name() -> ::prost::alloc::string::String {
156        "interchain_security.ccv.provider.v1.ConsumerRemovalProposal".into()
157    }
158    fn type_url() -> ::prost::alloc::string::String {
159        "/interchain_security.ccv.provider.v1.ConsumerRemovalProposal".into()
160    }
161}
162/// WARNING: This message is deprecated in favor of `MsgUpdateConsumer`.
163/// ConsumerModificationProposal is a governance proposal on the provider chain to modify parameters of a running
164/// consumer chain. If it passes, the consumer chain's state is updated to take into account the newest params.
165#[allow(clippy::derive_partial_eq_without_eq)]
166#[derive(Clone, PartialEq, ::prost::Message)]
167pub struct ConsumerModificationProposal {
168    /// the title of the proposal
169    #[prost(string, tag = "1")]
170    pub title: ::prost::alloc::string::String,
171    /// the description of the proposal
172    #[prost(string, tag = "2")]
173    pub description: ::prost::alloc::string::String,
174    /// the chain-id of the consumer chain to be modified
175    #[prost(string, tag = "3")]
176    pub chain_id: ::prost::alloc::string::String,
177    /// Corresponds to the percentage of validators that have to validate the chain under the Top N case.
178    /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power
179    /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\].
180    /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain.
181    #[prost(uint32, tag = "4")]
182    pub top_n: u32,
183    /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if
184    /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the
185    /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only
186    /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need
187    /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis.
188    #[prost(uint32, tag = "5")]
189    pub validators_power_cap: u32,
190    /// Corresponds to the maximum number of validators that can validate a consumer chain.
191    /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op.
192    #[prost(uint32, tag = "6")]
193    pub validator_set_cap: u32,
194    /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate
195    /// the consumer chain.
196    #[prost(string, repeated, tag = "7")]
197    pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
198    /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain.
199    #[prost(string, repeated, tag = "8")]
200    pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
201    /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain.
202    #[prost(uint64, tag = "9")]
203    pub min_stake: u64,
204    /// Corresponds to whether inactive validators are allowed to validate the consumer chain.
205    #[prost(bool, tag = "10")]
206    pub allow_inactive_vals: bool,
207}
208impl ::prost::Name for ConsumerModificationProposal {
209    const NAME: &'static str = "ConsumerModificationProposal";
210    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
211    fn full_name() -> ::prost::alloc::string::String {
212        "interchain_security.ccv.provider.v1.ConsumerModificationProposal".into()
213    }
214    fn type_url() -> ::prost::alloc::string::String {
215        "/interchain_security.ccv.provider.v1.ConsumerModificationProposal".into()
216    }
217}
218/// EquivocationProposal is a governance proposal on the provider chain to
219/// punish a validator for equivocation on a consumer chain.
220///
221/// This type is only used internally to the consumer CCV module.
222/// WARNING: This message is deprecated now that equivocations can be submitted
223/// and verified automatically on the provider. (see SubmitConsumerDoubleVoting in proto/interchain-security/ccv/provider/v1/tx.proto).
224#[allow(clippy::derive_partial_eq_without_eq)]
225#[derive(Clone, PartialEq, ::prost::Message)]
226pub struct EquivocationProposal {
227    /// the title of the proposal
228    #[prost(string, tag = "1")]
229    pub title: ::prost::alloc::string::String,
230    /// the description of the proposal
231    #[prost(string, tag = "2")]
232    pub description: ::prost::alloc::string::String,
233    /// the list of equivocations that will be processed
234    #[prost(message, repeated, tag = "3")]
235    pub equivocations: ::prost::alloc::vec::Vec<
236        super::super::super::super::cosmos::evidence::v1beta1::Equivocation,
237    >,
238}
239impl ::prost::Name for EquivocationProposal {
240    const NAME: &'static str = "EquivocationProposal";
241    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
242    fn full_name() -> ::prost::alloc::string::String {
243        "interchain_security.ccv.provider.v1.EquivocationProposal".into()
244    }
245    fn type_url() -> ::prost::alloc::string::String {
246        "/interchain_security.ccv.provider.v1.EquivocationProposal".into()
247    }
248}
249/// ChangeRewardDenomsProposal is a governance proposal on the provider chain to
250/// mutate the set of denoms accepted by the provider as rewards.
251/// Use MsgChangeRewardDenoms to submit this proposal type.
252#[allow(clippy::derive_partial_eq_without_eq)]
253#[derive(Clone, PartialEq, ::prost::Message)]
254pub struct ChangeRewardDenomsProposal {
255    /// the title of the proposal
256    #[prost(string, tag = "1")]
257    pub title: ::prost::alloc::string::String,
258    /// the description of the proposal
259    #[prost(string, tag = "2")]
260    pub description: ::prost::alloc::string::String,
261    /// the list of consumer reward denoms to add
262    #[prost(string, repeated, tag = "3")]
263    pub denoms_to_add: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
264    /// the list of consumer reward denoms to remove
265    #[prost(string, repeated, tag = "4")]
266    pub denoms_to_remove: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
267}
268impl ::prost::Name for ChangeRewardDenomsProposal {
269    const NAME: &'static str = "ChangeRewardDenomsProposal";
270    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
271    fn full_name() -> ::prost::alloc::string::String {
272        "interchain_security.ccv.provider.v1.ChangeRewardDenomsProposal".into()
273    }
274    fn type_url() -> ::prost::alloc::string::String {
275        "/interchain_security.ccv.provider.v1.ChangeRewardDenomsProposal".into()
276    }
277}
278/// A persisted queue entry indicating that a slash packet data instance needs to
279/// be handled. This type belongs in the "global" queue, to coordinate slash
280/// packet handling times between consumers.
281#[allow(clippy::derive_partial_eq_without_eq)]
282#[derive(Clone, PartialEq, ::prost::Message)]
283pub struct GlobalSlashEntry {
284    /// Block time that slash packet was received by provider chain.
285    /// This field is used for store key iteration ordering.
286    #[prost(message, optional, tag = "1")]
287    pub recv_time: ::core::option::Option<
288        ::tendermint_proto::google::protobuf::Timestamp,
289    >,
290    /// The consumer that sent a slash packet.
291    #[prost(string, tag = "2")]
292    pub consumer_chain_id: ::prost::alloc::string::String,
293    /// The IBC sequence number of the recv packet.
294    /// This field is used in the store key to ensure uniqueness.
295    #[prost(uint64, tag = "3")]
296    pub ibc_seq_num: u64,
297    /// The provider's consensus address of the validator being slashed.
298    /// This field is used to obtain validator power in HandleThrottleQueues.
299    ///
300    /// This field is not used in the store key, but is persisted in value bytes,
301    /// see QueueGlobalSlashEntry.
302    #[prost(bytes = "vec", tag = "4")]
303    pub provider_val_cons_addr: ::prost::alloc::vec::Vec<u8>,
304}
305impl ::prost::Name for GlobalSlashEntry {
306    const NAME: &'static str = "GlobalSlashEntry";
307    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
308    fn full_name() -> ::prost::alloc::string::String {
309        "interchain_security.ccv.provider.v1.GlobalSlashEntry".into()
310    }
311    fn type_url() -> ::prost::alloc::string::String {
312        "/interchain_security.ccv.provider.v1.GlobalSlashEntry".into()
313    }
314}
315/// Params defines the parameters for CCV Provider module
316#[allow(clippy::derive_partial_eq_without_eq)]
317#[derive(Clone, PartialEq, ::prost::Message)]
318pub struct Params {
319    #[prost(message, optional, tag = "1")]
320    pub template_client: ::core::option::Option<
321        super::super::super::super::ibc::lightclients::tendermint::v1::ClientState,
322    >,
323    /// TrustingPeriodFraction is used to compute the consumer and provider IBC
324    /// client's TrustingPeriod from the chain defined UnbondingPeriod
325    #[prost(string, tag = "2")]
326    pub trusting_period_fraction: ::prost::alloc::string::String,
327    /// Sent IBC packets will timeout after this duration
328    #[prost(message, optional, tag = "3")]
329    pub ccv_timeout_period: ::core::option::Option<
330        ::tendermint_proto::google::protobuf::Duration,
331    >,
332    /// The period for which the slash meter is replenished
333    #[prost(message, optional, tag = "6")]
334    pub slash_meter_replenish_period: ::core::option::Option<
335        ::tendermint_proto::google::protobuf::Duration,
336    >,
337    /// The fraction of total voting power that is replenished to the slash meter
338    /// every replenish period. This param also serves as a maximum fraction of
339    /// total voting power that the slash meter can hold.
340    #[prost(string, tag = "7")]
341    pub slash_meter_replenish_fraction: ::prost::alloc::string::String,
342    /// The fee required to be paid to add a reward denom
343    #[prost(message, optional, tag = "9")]
344    pub consumer_reward_denom_registration_fee: ::core::option::Option<
345        super::super::super::super::cosmos::base::v1beta1::Coin,
346    >,
347    /// The number of blocks that comprise an epoch.
348    #[prost(int64, tag = "10")]
349    pub blocks_per_epoch: i64,
350    /// The number of epochs a validator has to validate a consumer chain in order to start receiving rewards from that chain.
351    #[prost(int64, tag = "11")]
352    pub number_of_epochs_to_start_receiving_rewards: i64,
353    /// The maximal number of validators that will be passed
354    /// to the consensus engine on the provider.
355    #[prost(int64, tag = "12")]
356    pub max_provider_consensus_validators: i64,
357}
358impl ::prost::Name for Params {
359    const NAME: &'static str = "Params";
360    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
361    fn full_name() -> ::prost::alloc::string::String {
362        "interchain_security.ccv.provider.v1.Params".into()
363    }
364    fn type_url() -> ::prost::alloc::string::String {
365        "/interchain_security.ccv.provider.v1.Params".into()
366    }
367}
368/// SlashAcks contains cons addresses of consumer chain validators
369/// successfully slashed on the provider chain.
370#[allow(clippy::derive_partial_eq_without_eq)]
371#[derive(Clone, PartialEq, ::prost::Message)]
372pub struct SlashAcks {
373    #[prost(string, repeated, tag = "1")]
374    pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
375}
376impl ::prost::Name for SlashAcks {
377    const NAME: &'static str = "SlashAcks";
378    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
379    fn full_name() -> ::prost::alloc::string::String {
380        "interchain_security.ccv.provider.v1.SlashAcks".into()
381    }
382    fn type_url() -> ::prost::alloc::string::String {
383        "/interchain_security.ccv.provider.v1.SlashAcks".into()
384    }
385}
386/// ConsumerAdditionProposals holds pending governance proposals on the provider
387/// chain to spawn a new chain.
388#[allow(clippy::derive_partial_eq_without_eq)]
389#[derive(Clone, PartialEq, ::prost::Message)]
390pub struct ConsumerAdditionProposals {
391    /// proposals waiting for spawn_time to pass
392    #[prost(message, repeated, tag = "1")]
393    pub pending: ::prost::alloc::vec::Vec<ConsumerAdditionProposal>,
394}
395impl ::prost::Name for ConsumerAdditionProposals {
396    const NAME: &'static str = "ConsumerAdditionProposals";
397    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
398    fn full_name() -> ::prost::alloc::string::String {
399        "interchain_security.ccv.provider.v1.ConsumerAdditionProposals".into()
400    }
401    fn type_url() -> ::prost::alloc::string::String {
402        "/interchain_security.ccv.provider.v1.ConsumerAdditionProposals".into()
403    }
404}
405/// ConsumerRemovalProposals holds pending governance proposals on the provider
406/// chain to remove (and stop) a consumer chain.
407#[allow(clippy::derive_partial_eq_without_eq)]
408#[derive(Clone, PartialEq, ::prost::Message)]
409pub struct ConsumerRemovalProposals {
410    /// proposals waiting for stop_time to pass
411    #[prost(message, repeated, tag = "1")]
412    pub pending: ::prost::alloc::vec::Vec<ConsumerRemovalProposal>,
413}
414impl ::prost::Name for ConsumerRemovalProposals {
415    const NAME: &'static str = "ConsumerRemovalProposals";
416    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
417    fn full_name() -> ::prost::alloc::string::String {
418        "interchain_security.ccv.provider.v1.ConsumerRemovalProposals".into()
419    }
420    fn type_url() -> ::prost::alloc::string::String {
421        "/interchain_security.ccv.provider.v1.ConsumerRemovalProposals".into()
422    }
423}
424/// AddressList contains a list of consensus addresses
425#[allow(clippy::derive_partial_eq_without_eq)]
426#[derive(Clone, PartialEq, ::prost::Message)]
427pub struct AddressList {
428    #[prost(bytes = "vec", repeated, tag = "1")]
429    pub addresses: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec<u8>>,
430}
431impl ::prost::Name for AddressList {
432    const NAME: &'static str = "AddressList";
433    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
434    fn full_name() -> ::prost::alloc::string::String {
435        "interchain_security.ccv.provider.v1.AddressList".into()
436    }
437    fn type_url() -> ::prost::alloc::string::String {
438        "/interchain_security.ccv.provider.v1.AddressList".into()
439    }
440}
441/// WARNING: This message is deprecated and is not used.
442/// ChannelToChain is used to map a CCV channel ID to the consumer chainID
443#[allow(clippy::derive_partial_eq_without_eq)]
444#[derive(Clone, PartialEq, ::prost::Message)]
445pub struct ChannelToChain {
446    #[prost(string, tag = "1")]
447    pub channel_id: ::prost::alloc::string::String,
448    #[prost(string, tag = "2")]
449    pub chain_id: ::prost::alloc::string::String,
450}
451impl ::prost::Name for ChannelToChain {
452    const NAME: &'static str = "ChannelToChain";
453    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
454    fn full_name() -> ::prost::alloc::string::String {
455        "interchain_security.ccv.provider.v1.ChannelToChain".into()
456    }
457    fn type_url() -> ::prost::alloc::string::String {
458        "/interchain_security.ccv.provider.v1.ChannelToChain".into()
459    }
460}
461/// ValidatorSetChangePackets is a pb list of ccv.ValidatorSetChangePacketData.
462#[allow(clippy::derive_partial_eq_without_eq)]
463#[derive(Clone, PartialEq, ::prost::Message)]
464pub struct ValidatorSetChangePackets {
465    #[prost(message, repeated, tag = "1")]
466    pub list: ::prost::alloc::vec::Vec<super::super::v1::ValidatorSetChangePacketData>,
467}
468impl ::prost::Name for ValidatorSetChangePackets {
469    const NAME: &'static str = "ValidatorSetChangePackets";
470    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
471    fn full_name() -> ::prost::alloc::string::String {
472        "interchain_security.ccv.provider.v1.ValidatorSetChangePackets".into()
473    }
474    fn type_url() -> ::prost::alloc::string::String {
475        "/interchain_security.ccv.provider.v1.ValidatorSetChangePackets".into()
476    }
477}
478#[allow(clippy::derive_partial_eq_without_eq)]
479#[derive(Clone, PartialEq, ::prost::Message)]
480pub struct KeyAssignmentReplacement {
481    #[prost(bytes = "vec", tag = "1")]
482    pub provider_addr: ::prost::alloc::vec::Vec<u8>,
483    #[prost(message, optional, tag = "2")]
484    pub prev_c_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>,
485    #[prost(int64, tag = "3")]
486    pub power: i64,
487}
488impl ::prost::Name for KeyAssignmentReplacement {
489    const NAME: &'static str = "KeyAssignmentReplacement";
490    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
491    fn full_name() -> ::prost::alloc::string::String {
492        "interchain_security.ccv.provider.v1.KeyAssignmentReplacement".into()
493    }
494    fn type_url() -> ::prost::alloc::string::String {
495        "/interchain_security.ccv.provider.v1.KeyAssignmentReplacement".into()
496    }
497}
498/// Used to serialize the ValidatorConsumerPubKey index from key assignment
499/// ValidatorConsumerPubKey: (chainID, providerAddr consAddr) -> consumerKey
500/// tmprotocrypto.PublicKey
501#[allow(clippy::derive_partial_eq_without_eq)]
502#[derive(Clone, PartialEq, ::prost::Message)]
503pub struct ValidatorConsumerPubKey {
504    #[prost(string, tag = "1")]
505    pub chain_id: ::prost::alloc::string::String,
506    #[prost(bytes = "vec", tag = "2")]
507    pub provider_addr: ::prost::alloc::vec::Vec<u8>,
508    #[prost(message, optional, tag = "3")]
509    pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>,
510}
511impl ::prost::Name for ValidatorConsumerPubKey {
512    const NAME: &'static str = "ValidatorConsumerPubKey";
513    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
514    fn full_name() -> ::prost::alloc::string::String {
515        "interchain_security.ccv.provider.v1.ValidatorConsumerPubKey".into()
516    }
517    fn type_url() -> ::prost::alloc::string::String {
518        "/interchain_security.ccv.provider.v1.ValidatorConsumerPubKey".into()
519    }
520}
521/// Used to serialize the ValidatorConsumerAddr index from key assignment
522/// ValidatorByConsumerAddr: (chainID, consumerAddr consAddr) -> providerAddr
523/// consAddr
524#[allow(clippy::derive_partial_eq_without_eq)]
525#[derive(Clone, PartialEq, ::prost::Message)]
526pub struct ValidatorByConsumerAddr {
527    #[prost(string, tag = "1")]
528    pub chain_id: ::prost::alloc::string::String,
529    #[prost(bytes = "vec", tag = "2")]
530    pub consumer_addr: ::prost::alloc::vec::Vec<u8>,
531    #[prost(bytes = "vec", tag = "3")]
532    pub provider_addr: ::prost::alloc::vec::Vec<u8>,
533}
534impl ::prost::Name for ValidatorByConsumerAddr {
535    const NAME: &'static str = "ValidatorByConsumerAddr";
536    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
537    fn full_name() -> ::prost::alloc::string::String {
538        "interchain_security.ccv.provider.v1.ValidatorByConsumerAddr".into()
539    }
540    fn type_url() -> ::prost::alloc::string::String {
541        "/interchain_security.ccv.provider.v1.ValidatorByConsumerAddr".into()
542    }
543}
544/// Used to serialize the ConsumerAddrsToPruneV2 index from key assignment
545/// ConsumerAddrsToPruneV2: (chainID, pruneTs time.Time) -> consumerAddrs AddressList
546#[allow(clippy::derive_partial_eq_without_eq)]
547#[derive(Clone, PartialEq, ::prost::Message)]
548pub struct ConsumerAddrsToPruneV2 {
549    #[prost(string, tag = "1")]
550    pub chain_id: ::prost::alloc::string::String,
551    #[prost(message, optional, tag = "2")]
552    pub prune_ts: ::core::option::Option<
553        ::tendermint_proto::google::protobuf::Timestamp,
554    >,
555    #[prost(message, optional, tag = "3")]
556    pub consumer_addrs: ::core::option::Option<AddressList>,
557}
558impl ::prost::Name for ConsumerAddrsToPruneV2 {
559    const NAME: &'static str = "ConsumerAddrsToPruneV2";
560    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
561    fn full_name() -> ::prost::alloc::string::String {
562        "interchain_security.ccv.provider.v1.ConsumerAddrsToPruneV2".into()
563    }
564    fn type_url() -> ::prost::alloc::string::String {
565        "/interchain_security.ccv.provider.v1.ConsumerAddrsToPruneV2".into()
566    }
567}
568/// ConsensusValidator is used to express a validator that
569/// should be validating on a chain.
570/// It contains relevant info for
571/// a validator that is expected to validate on
572/// either the provider or a consumer chain.
573#[allow(clippy::derive_partial_eq_without_eq)]
574#[derive(Clone, PartialEq, ::prost::Message)]
575pub struct ConsensusValidator {
576    /// validator's consensus address on the provider chain
577    #[prost(bytes = "vec", tag = "1")]
578    pub provider_cons_addr: ::prost::alloc::vec::Vec<u8>,
579    /// voting power the validator has during this epoch
580    #[prost(int64, tag = "2")]
581    pub power: i64,
582    /// public key the validator uses on the consumer chain during this epoch
583    #[prost(message, optional, tag = "3")]
584    pub public_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>,
585    /// height the validator had when it FIRST became a consumer validator
586    /// If a validator becomes a consumer validator at height `H` and is continuously a consumer validator for all the upcoming
587    /// epochs, then the height of the validator SHOULD remain `H`. This height only resets to a different height if a validator
588    /// stops being a consumer validator during an epoch and later becomes again a consumer validator.
589    #[prost(int64, tag = "4")]
590    pub join_height: i64,
591}
592impl ::prost::Name for ConsensusValidator {
593    const NAME: &'static str = "ConsensusValidator";
594    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
595    fn full_name() -> ::prost::alloc::string::String {
596        "interchain_security.ccv.provider.v1.ConsensusValidator".into()
597    }
598    fn type_url() -> ::prost::alloc::string::String {
599        "/interchain_security.ccv.provider.v1.ConsensusValidator".into()
600    }
601}
602/// ConsumerRewardsAllocation stores the rewards allocated by a consumer chain
603/// to the consumer rewards pool. It is used to allocate the tokens to the consumer
604/// opted-in validators and the community pool during BeginBlock.
605#[allow(clippy::derive_partial_eq_without_eq)]
606#[derive(Clone, PartialEq, ::prost::Message)]
607pub struct ConsumerRewardsAllocation {
608    #[prost(message, repeated, tag = "1")]
609    pub rewards: ::prost::alloc::vec::Vec<
610        super::super::super::super::cosmos::base::v1beta1::DecCoin,
611    >,
612}
613impl ::prost::Name for ConsumerRewardsAllocation {
614    const NAME: &'static str = "ConsumerRewardsAllocation";
615    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
616    fn full_name() -> ::prost::alloc::string::String {
617        "interchain_security.ccv.provider.v1.ConsumerRewardsAllocation".into()
618    }
619    fn type_url() -> ::prost::alloc::string::String {
620        "/interchain_security.ccv.provider.v1.ConsumerRewardsAllocation".into()
621    }
622}
623/// ConsumerMetadata contains general information about the registered chain
624#[allow(clippy::derive_partial_eq_without_eq)]
625#[derive(Clone, PartialEq, ::prost::Message)]
626pub struct ConsumerMetadata {
627    /// the name of the chain
628    #[prost(string, tag = "1")]
629    pub name: ::prost::alloc::string::String,
630    /// the description of the chain
631    #[prost(string, tag = "2")]
632    pub description: ::prost::alloc::string::String,
633    /// the metadata (e.g., GitHub repository URL) of the chain
634    #[prost(string, tag = "3")]
635    pub metadata: ::prost::alloc::string::String,
636}
637impl ::prost::Name for ConsumerMetadata {
638    const NAME: &'static str = "ConsumerMetadata";
639    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
640    fn full_name() -> ::prost::alloc::string::String {
641        "interchain_security.ccv.provider.v1.ConsumerMetadata".into()
642    }
643    fn type_url() -> ::prost::alloc::string::String {
644        "/interchain_security.ccv.provider.v1.ConsumerMetadata".into()
645    }
646}
647/// ConsumerInitializationParameters are the parameters needed to launch a chain
648///
649/// ---------- ---------- ----------
650/// Following fields are used when the consumer chain launches and are not needed by the provider afterwards.
651/// ---------- ---------- ----------
652#[allow(clippy::derive_partial_eq_without_eq)]
653#[derive(Clone, PartialEq, ::prost::Message)]
654pub struct ConsumerInitializationParameters {
655    /// the proposed initial height of new consumer chain.
656    /// For a completely new chain, this will be {0,1}. However, it may be
657    /// different if this is a chain that is converting to a consumer chain.
658    #[prost(message, optional, tag = "1")]
659    pub initial_height: ::core::option::Option<
660        super::super::super::super::ibc::core::client::v1::Height,
661    >,
662    /// The hash of the consumer chain genesis state without the consumer CCV
663    /// module genesis params. It is used for off-chain confirmation of
664    /// genesis.json validity by validators and other parties.
665    #[prost(bytes = "vec", tag = "2")]
666    pub genesis_hash: ::prost::alloc::vec::Vec<u8>,
667    /// The hash of the consumer chain binary that should be run by validators on
668    /// chain initialization. It is used for off-chain confirmation of binary
669    /// validity by validators and other parties.
670    #[prost(bytes = "vec", tag = "3")]
671    pub binary_hash: ::prost::alloc::vec::Vec<u8>,
672    /// spawn time is the time on the provider chain at which the consumer chain
673    /// genesis is finalized and all validators will be responsible for starting
674    /// their consumer chain validator node.
675    #[prost(message, optional, tag = "4")]
676    pub spawn_time: ::core::option::Option<
677        ::tendermint_proto::google::protobuf::Timestamp,
678    >,
679    /// Unbonding period for the consumer,
680    /// which should be smaller than that of the provider in general.
681    #[prost(message, optional, tag = "5")]
682    pub unbonding_period: ::core::option::Option<
683        ::tendermint_proto::google::protobuf::Duration,
684    >,
685    /// Sent CCV related IBC packets will timeout after this duration
686    #[prost(message, optional, tag = "6")]
687    pub ccv_timeout_period: ::core::option::Option<
688        ::tendermint_proto::google::protobuf::Duration,
689    >,
690    /// Sent transfer related IBC packets will timeout after this duration
691    #[prost(message, optional, tag = "7")]
692    pub transfer_timeout_period: ::core::option::Option<
693        ::tendermint_proto::google::protobuf::Duration,
694    >,
695    /// The fraction of tokens allocated to the consumer redistribution address
696    /// during distribution events. The fraction is a string representing a
697    /// decimal number. For example "0.75" would represent 75%.
698    #[prost(string, tag = "8")]
699    pub consumer_redistribution_fraction: ::prost::alloc::string::String,
700    /// BlocksPerDistributionTransmission is the number of blocks between
701    /// ibc-token-transfers from the consumer chain to the provider chain. On
702    /// sending transmission event, `consumer_redistribution_fraction` of the
703    /// accumulated tokens are sent to the consumer redistribution address.
704    #[prost(int64, tag = "9")]
705    pub blocks_per_distribution_transmission: i64,
706    /// The number of historical info entries to persist in store.
707    /// This param is a part of the cosmos sdk staking module. In the case of
708    /// a ccv enabled consumer chain, the ccv module acts as the staking module.
709    #[prost(int64, tag = "10")]
710    pub historical_entries: i64,
711    /// The ID of a token transfer channel used for the Reward Distribution
712    /// sub-protocol. If DistributionTransmissionChannel == "", a new transfer
713    /// channel is created on top of the same connection as the CCV channel.
714    /// Note that transfer_channel_id is the ID of the channel end on the consumer
715    /// chain. it is most relevant for chains performing a sovereign to consumer
716    /// changeover in order to maintain the existing ibc transfer channel
717    #[prost(string, tag = "11")]
718    pub distribution_transmission_channel: ::prost::alloc::string::String,
719}
720impl ::prost::Name for ConsumerInitializationParameters {
721    const NAME: &'static str = "ConsumerInitializationParameters";
722    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
723    fn full_name() -> ::prost::alloc::string::String {
724        "interchain_security.ccv.provider.v1.ConsumerInitializationParameters".into()
725    }
726    fn type_url() -> ::prost::alloc::string::String {
727        "/interchain_security.ccv.provider.v1.ConsumerInitializationParameters".into()
728    }
729}
730/// PowerShapingParameters contains parameters that shape the validator set that we send to the consumer chain
731#[allow(clippy::derive_partial_eq_without_eq)]
732#[derive(Clone, PartialEq, ::prost::Message)]
733pub struct PowerShapingParameters {
734    /// Corresponds to the percentage of validators that have to validate the chain under the Top N case.
735    /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power
736    /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\].
737    /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain.
738    #[prost(uint32, tag = "1")]
739    pub top_n: u32,
740    /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if
741    /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the
742    /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only
743    /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need
744    /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis.
745    #[prost(uint32, tag = "2")]
746    pub validators_power_cap: u32,
747    /// Corresponds to the maximum number of validators that can validate a consumer chain.
748    /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op.
749    #[prost(uint32, tag = "3")]
750    pub validator_set_cap: u32,
751    /// corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate the consumer chain
752    #[prost(string, repeated, tag = "4")]
753    pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
754    /// corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain
755    #[prost(string, repeated, tag = "5")]
756    pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
757    /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain.
758    #[prost(uint64, tag = "6")]
759    pub min_stake: u64,
760    /// Corresponds to whether inactive validators are allowed to validate the consumer chain.
761    #[prost(bool, tag = "7")]
762    pub allow_inactive_vals: bool,
763}
764impl ::prost::Name for PowerShapingParameters {
765    const NAME: &'static str = "PowerShapingParameters";
766    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
767    fn full_name() -> ::prost::alloc::string::String {
768        "interchain_security.ccv.provider.v1.PowerShapingParameters".into()
769    }
770    fn type_url() -> ::prost::alloc::string::String {
771        "/interchain_security.ccv.provider.v1.PowerShapingParameters".into()
772    }
773}
774/// ConsumerIds contains consumer ids of chains
775/// Used so we can easily (de)serialize slices of strings
776#[allow(clippy::derive_partial_eq_without_eq)]
777#[derive(Clone, PartialEq, ::prost::Message)]
778pub struct ConsumerIds {
779    #[prost(string, repeated, tag = "1")]
780    pub ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
781}
782impl ::prost::Name for ConsumerIds {
783    const NAME: &'static str = "ConsumerIds";
784    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
785    fn full_name() -> ::prost::alloc::string::String {
786        "interchain_security.ccv.provider.v1.ConsumerIds".into()
787    }
788    fn type_url() -> ::prost::alloc::string::String {
789        "/interchain_security.ccv.provider.v1.ConsumerIds".into()
790    }
791}
792/// ConsumerPhase indicates the phases of a consumer chain according to ADR 019
793#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
794#[repr(i32)]
795pub enum ConsumerPhase {
796    /// UNSPECIFIED defines an empty phase.
797    Unspecified = 0,
798    /// REGISTERED defines the phase in which a consumer chain has been assigned a unique consumer id.
799    /// A chain in this phase cannot yet launch.
800    Registered = 1,
801    /// INITIALIZED defines the phase in which a consumer chain has set all the needed parameters to launch but
802    /// has not yet launched (e.g., because the `spawnTime` of the consumer chain has not yet been reached).
803    Initialized = 2,
804    /// LAUNCHED defines the phase in which a consumer chain is running and consuming a subset of the validator
805    /// set of the provider.
806    Launched = 3,
807    /// STOPPED defines the phase in which a previously-launched chain has stopped.
808    Stopped = 4,
809    /// DELETED defines the phase in which the state of a stopped chain has been deleted.
810    Deleted = 5,
811}
812impl ConsumerPhase {
813    /// String value of the enum field names used in the ProtoBuf definition.
814    ///
815    /// The values are not transformed in any way and thus are considered stable
816    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
817    pub fn as_str_name(&self) -> &'static str {
818        match self {
819            ConsumerPhase::Unspecified => "CONSUMER_PHASE_UNSPECIFIED",
820            ConsumerPhase::Registered => "CONSUMER_PHASE_REGISTERED",
821            ConsumerPhase::Initialized => "CONSUMER_PHASE_INITIALIZED",
822            ConsumerPhase::Launched => "CONSUMER_PHASE_LAUNCHED",
823            ConsumerPhase::Stopped => "CONSUMER_PHASE_STOPPED",
824            ConsumerPhase::Deleted => "CONSUMER_PHASE_DELETED",
825        }
826    }
827    /// Creates an enum from field names used in the ProtoBuf definition.
828    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
829        match value {
830            "CONSUMER_PHASE_UNSPECIFIED" => Some(Self::Unspecified),
831            "CONSUMER_PHASE_REGISTERED" => Some(Self::Registered),
832            "CONSUMER_PHASE_INITIALIZED" => Some(Self::Initialized),
833            "CONSUMER_PHASE_LAUNCHED" => Some(Self::Launched),
834            "CONSUMER_PHASE_STOPPED" => Some(Self::Stopped),
835            "CONSUMER_PHASE_DELETED" => Some(Self::Deleted),
836            _ => None,
837        }
838    }
839}
840#[allow(clippy::derive_partial_eq_without_eq)]
841#[derive(Clone, PartialEq, ::prost::Message)]
842pub struct MsgAssignConsumerKey {
843    /// \[DEPRECATED\] use `consumer_id` instead
844    #[deprecated]
845    #[prost(string, tag = "1")]
846    pub chain_id: ::prost::alloc::string::String,
847    /// The validator address on the provider
848    #[prost(string, tag = "2")]
849    pub provider_addr: ::prost::alloc::string::String,
850    /// The consensus public key to use on the consumer.
851    /// in json string format corresponding to proto-any, ex:
852    /// `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}`
853    #[prost(string, tag = "3")]
854    pub consumer_key: ::prost::alloc::string::String,
855    #[prost(string, tag = "4")]
856    pub signer: ::prost::alloc::string::String,
857    /// the consumer id of the consumer chain to assign a consensus public key to
858    #[prost(string, tag = "5")]
859    pub consumer_id: ::prost::alloc::string::String,
860}
861impl ::prost::Name for MsgAssignConsumerKey {
862    const NAME: &'static str = "MsgAssignConsumerKey";
863    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
864    fn full_name() -> ::prost::alloc::string::String {
865        "interchain_security.ccv.provider.v1.MsgAssignConsumerKey".into()
866    }
867    fn type_url() -> ::prost::alloc::string::String {
868        "/interchain_security.ccv.provider.v1.MsgAssignConsumerKey".into()
869    }
870}
871#[allow(clippy::derive_partial_eq_without_eq)]
872#[derive(Clone, Copy, PartialEq, ::prost::Message)]
873pub struct MsgAssignConsumerKeyResponse {}
874impl ::prost::Name for MsgAssignConsumerKeyResponse {
875    const NAME: &'static str = "MsgAssignConsumerKeyResponse";
876    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
877    fn full_name() -> ::prost::alloc::string::String {
878        "interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse".into()
879    }
880    fn type_url() -> ::prost::alloc::string::String {
881        "/interchain_security.ccv.provider.v1.MsgAssignConsumerKeyResponse".into()
882    }
883}
884/// MsgSubmitConsumerMisbehaviour defines a message that reports a light client attack,
885/// also known as a misbehaviour, observed on a consumer chain
886#[allow(clippy::derive_partial_eq_without_eq)]
887#[derive(Clone, PartialEq, ::prost::Message)]
888pub struct MsgSubmitConsumerMisbehaviour {
889    #[prost(string, tag = "1")]
890    pub submitter: ::prost::alloc::string::String,
891    /// The Misbehaviour of the consumer chain wrapping
892    /// two conflicting IBC headers
893    #[prost(message, optional, tag = "2")]
894    pub misbehaviour: ::core::option::Option<
895        super::super::super::super::ibc::lightclients::tendermint::v1::Misbehaviour,
896    >,
897    /// the consumer id of the consumer chain where the misbehaviour occurred
898    #[prost(string, tag = "3")]
899    pub consumer_id: ::prost::alloc::string::String,
900}
901impl ::prost::Name for MsgSubmitConsumerMisbehaviour {
902    const NAME: &'static str = "MsgSubmitConsumerMisbehaviour";
903    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
904    fn full_name() -> ::prost::alloc::string::String {
905        "interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviour".into()
906    }
907    fn type_url() -> ::prost::alloc::string::String {
908        "/interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviour".into()
909    }
910}
911#[allow(clippy::derive_partial_eq_without_eq)]
912#[derive(Clone, Copy, PartialEq, ::prost::Message)]
913pub struct MsgSubmitConsumerMisbehaviourResponse {}
914impl ::prost::Name for MsgSubmitConsumerMisbehaviourResponse {
915    const NAME: &'static str = "MsgSubmitConsumerMisbehaviourResponse";
916    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
917    fn full_name() -> ::prost::alloc::string::String {
918        "interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviourResponse"
919            .into()
920    }
921    fn type_url() -> ::prost::alloc::string::String {
922        "/interchain_security.ccv.provider.v1.MsgSubmitConsumerMisbehaviourResponse"
923            .into()
924    }
925}
926/// MsgSubmitConsumerDoubleVoting defines a message that reports
927/// a double signing infraction observed on a consumer chain
928#[allow(clippy::derive_partial_eq_without_eq)]
929#[derive(Clone, PartialEq, ::prost::Message)]
930pub struct MsgSubmitConsumerDoubleVoting {
931    #[prost(string, tag = "1")]
932    pub submitter: ::prost::alloc::string::String,
933    /// The equivocation of the consumer chain wrapping
934    /// an evidence of a validator that signed two conflicting votes
935    #[prost(message, optional, tag = "2")]
936    pub duplicate_vote_evidence: ::core::option::Option<
937        ::tendermint_proto::types::DuplicateVoteEvidence,
938    >,
939    /// The light client header of the infraction block
940    #[prost(message, optional, tag = "3")]
941    pub infraction_block_header: ::core::option::Option<
942        super::super::super::super::ibc::lightclients::tendermint::v1::Header,
943    >,
944    /// the consumer id of the consumer chain where the double-voting took place
945    #[prost(string, tag = "4")]
946    pub consumer_id: ::prost::alloc::string::String,
947}
948impl ::prost::Name for MsgSubmitConsumerDoubleVoting {
949    const NAME: &'static str = "MsgSubmitConsumerDoubleVoting";
950    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
951    fn full_name() -> ::prost::alloc::string::String {
952        "interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVoting".into()
953    }
954    fn type_url() -> ::prost::alloc::string::String {
955        "/interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVoting".into()
956    }
957}
958#[allow(clippy::derive_partial_eq_without_eq)]
959#[derive(Clone, Copy, PartialEq, ::prost::Message)]
960pub struct MsgSubmitConsumerDoubleVotingResponse {}
961impl ::prost::Name for MsgSubmitConsumerDoubleVotingResponse {
962    const NAME: &'static str = "MsgSubmitConsumerDoubleVotingResponse";
963    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
964    fn full_name() -> ::prost::alloc::string::String {
965        "interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVotingResponse"
966            .into()
967    }
968    fn type_url() -> ::prost::alloc::string::String {
969        "/interchain_security.ccv.provider.v1.MsgSubmitConsumerDoubleVotingResponse"
970            .into()
971    }
972}
973/// MsgUpdateParams is the Msg/UpdateParams request type
974#[allow(clippy::derive_partial_eq_without_eq)]
975#[derive(Clone, PartialEq, ::prost::Message)]
976pub struct MsgUpdateParams {
977    /// authority is the address of the governance account.
978    #[prost(string, tag = "1")]
979    pub authority: ::prost::alloc::string::String,
980    /// params defines the x/provider parameters to update.
981    #[prost(message, optional, tag = "2")]
982    pub params: ::core::option::Option<Params>,
983}
984impl ::prost::Name for MsgUpdateParams {
985    const NAME: &'static str = "MsgUpdateParams";
986    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
987    fn full_name() -> ::prost::alloc::string::String {
988        "interchain_security.ccv.provider.v1.MsgUpdateParams".into()
989    }
990    fn type_url() -> ::prost::alloc::string::String {
991        "/interchain_security.ccv.provider.v1.MsgUpdateParams".into()
992    }
993}
994#[allow(clippy::derive_partial_eq_without_eq)]
995#[derive(Clone, Copy, PartialEq, ::prost::Message)]
996pub struct MsgUpdateParamsResponse {}
997impl ::prost::Name for MsgUpdateParamsResponse {
998    const NAME: &'static str = "MsgUpdateParamsResponse";
999    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1000    fn full_name() -> ::prost::alloc::string::String {
1001        "interchain_security.ccv.provider.v1.MsgUpdateParamsResponse".into()
1002    }
1003    fn type_url() -> ::prost::alloc::string::String {
1004        "/interchain_security.ccv.provider.v1.MsgUpdateParamsResponse".into()
1005    }
1006}
1007/// \[DEPRECATED\] Use `MsgCreateConsumer` instead
1008#[allow(clippy::derive_partial_eq_without_eq)]
1009#[derive(Clone, PartialEq, ::prost::Message)]
1010pub struct MsgConsumerAddition {
1011    /// the proposed chain-id of the new consumer chain, must be different from all
1012    /// other consumer chain ids of the executing provider chain.
1013    #[prost(string, tag = "1")]
1014    pub chain_id: ::prost::alloc::string::String,
1015    /// the proposed initial height of new consumer chain.
1016    /// For a completely new chain, this will be {0,1}. However, it may be
1017    /// different if this is a chain that is converting to a consumer chain.
1018    #[prost(message, optional, tag = "2")]
1019    pub initial_height: ::core::option::Option<
1020        super::super::super::super::ibc::core::client::v1::Height,
1021    >,
1022    /// The hash of the consumer chain genesis state without the consumer CCV
1023    /// module genesis params. It is used for off-chain confirmation of
1024    /// genesis.json validity by validators and other parties.
1025    #[prost(bytes = "vec", tag = "3")]
1026    pub genesis_hash: ::prost::alloc::vec::Vec<u8>,
1027    /// The hash of the consumer chain binary that should be run by validators on
1028    /// chain initialization. It is used for off-chain confirmation of binary
1029    /// validity by validators and other parties.
1030    #[prost(bytes = "vec", tag = "4")]
1031    pub binary_hash: ::prost::alloc::vec::Vec<u8>,
1032    /// spawn time is the time on the provider chain at which the consumer chain
1033    /// genesis is finalized and all validators will be responsible for starting
1034    /// their consumer chain validator node.
1035    #[prost(message, optional, tag = "5")]
1036    pub spawn_time: ::core::option::Option<
1037        ::tendermint_proto::google::protobuf::Timestamp,
1038    >,
1039    /// Unbonding period for the consumer,
1040    /// which should be smaller than that of the provider in general.
1041    #[prost(message, optional, tag = "6")]
1042    pub unbonding_period: ::core::option::Option<
1043        ::tendermint_proto::google::protobuf::Duration,
1044    >,
1045    /// Sent CCV related IBC packets will timeout after this duration
1046    #[prost(message, optional, tag = "7")]
1047    pub ccv_timeout_period: ::core::option::Option<
1048        ::tendermint_proto::google::protobuf::Duration,
1049    >,
1050    /// Sent transfer related IBC packets will timeout after this duration
1051    #[prost(message, optional, tag = "8")]
1052    pub transfer_timeout_period: ::core::option::Option<
1053        ::tendermint_proto::google::protobuf::Duration,
1054    >,
1055    /// The fraction of tokens allocated to the consumer redistribution address
1056    /// during distribution events. The fraction is a string representing a
1057    /// decimal number. For example "0.75" would represent 75%.
1058    #[prost(string, tag = "9")]
1059    pub consumer_redistribution_fraction: ::prost::alloc::string::String,
1060    /// BlocksPerDistributionTransmission is the number of blocks between
1061    /// ibc-token-transfers from the consumer chain to the provider chain. On
1062    /// sending transmission event, `consumer_redistribution_fraction` of the
1063    /// accumulated tokens are sent to the consumer redistribution address.
1064    #[prost(int64, tag = "10")]
1065    pub blocks_per_distribution_transmission: i64,
1066    /// The number of historical info entries to persist in store.
1067    /// This param is a part of the cosmos sdk staking module. In the case of
1068    /// a ccv enabled consumer chain, the ccv module acts as the staking module.
1069    #[prost(int64, tag = "11")]
1070    pub historical_entries: i64,
1071    /// The ID of a token transfer channel used for the Reward Distribution
1072    /// sub-protocol. If DistributionTransmissionChannel == "", a new transfer
1073    /// channel is created on top of the same connection as the CCV channel.
1074    /// Note that transfer_channel_id is the ID of the channel end on the consumer
1075    /// chain. it is most relevant for chains performing a sovereign to consumer
1076    /// changeover in order to maintain the existing ibc transfer channel
1077    #[prost(string, tag = "12")]
1078    pub distribution_transmission_channel: ::prost::alloc::string::String,
1079    /// Corresponds to the percentage of validators that have to validate the chain under the Top N case.
1080    /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power
1081    /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\].
1082    /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain.
1083    #[prost(uint32, tag = "13")]
1084    pub top_n: u32,
1085    /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if
1086    /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the
1087    /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only
1088    /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need
1089    /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis.
1090    #[prost(uint32, tag = "14")]
1091    pub validators_power_cap: u32,
1092    /// Corresponds to the maximum number of validators that can validate a consumer chain.
1093    /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op.
1094    #[prost(uint32, tag = "15")]
1095    pub validator_set_cap: u32,
1096    /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate
1097    /// the consumer chain.
1098    #[prost(string, repeated, tag = "16")]
1099    pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1100    /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain.
1101    #[prost(string, repeated, tag = "17")]
1102    pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1103    /// signer address
1104    #[prost(string, tag = "18")]
1105    pub authority: ::prost::alloc::string::String,
1106    /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain.
1107    #[prost(uint64, tag = "19")]
1108    pub min_stake: u64,
1109    /// Corresponds to whether inactive validators are allowed to validate the consumer chain.
1110    #[prost(bool, tag = "20")]
1111    pub allow_inactive_vals: bool,
1112}
1113impl ::prost::Name for MsgConsumerAddition {
1114    const NAME: &'static str = "MsgConsumerAddition";
1115    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1116    fn full_name() -> ::prost::alloc::string::String {
1117        "interchain_security.ccv.provider.v1.MsgConsumerAddition".into()
1118    }
1119    fn type_url() -> ::prost::alloc::string::String {
1120        "/interchain_security.ccv.provider.v1.MsgConsumerAddition".into()
1121    }
1122}
1123/// \[DEPRECATED\] Use `MsgRemoveConsumer` instead
1124#[allow(clippy::derive_partial_eq_without_eq)]
1125#[derive(Clone, PartialEq, ::prost::Message)]
1126pub struct MsgConsumerRemoval {
1127    /// the chain-id of the consumer chain to be stopped
1128    #[prost(string, tag = "1")]
1129    pub chain_id: ::prost::alloc::string::String,
1130    /// the time on the provider chain at which all validators are responsible to
1131    /// stop their consumer chain validator node
1132    #[prost(message, optional, tag = "2")]
1133    pub stop_time: ::core::option::Option<
1134        ::tendermint_proto::google::protobuf::Timestamp,
1135    >,
1136    /// signer address
1137    #[prost(string, tag = "3")]
1138    pub authority: ::prost::alloc::string::String,
1139}
1140impl ::prost::Name for MsgConsumerRemoval {
1141    const NAME: &'static str = "MsgConsumerRemoval";
1142    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1143    fn full_name() -> ::prost::alloc::string::String {
1144        "interchain_security.ccv.provider.v1.MsgConsumerRemoval".into()
1145    }
1146    fn type_url() -> ::prost::alloc::string::String {
1147        "/interchain_security.ccv.provider.v1.MsgConsumerRemoval".into()
1148    }
1149}
1150/// MsgRemoveConsumer defines the message used to remove (and stop) a consumer chain.
1151/// If it passes, all the consumer chain's state is eventually removed from the provider chain.
1152#[allow(clippy::derive_partial_eq_without_eq)]
1153#[derive(Clone, PartialEq, ::prost::Message)]
1154pub struct MsgRemoveConsumer {
1155    /// the consumer id of the consumer chain to be stopped
1156    #[prost(string, tag = "1")]
1157    pub consumer_id: ::prost::alloc::string::String,
1158    /// the address of the owner of the consumer chain to be stopped
1159    #[prost(string, tag = "2")]
1160    pub owner: ::prost::alloc::string::String,
1161}
1162impl ::prost::Name for MsgRemoveConsumer {
1163    const NAME: &'static str = "MsgRemoveConsumer";
1164    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1165    fn full_name() -> ::prost::alloc::string::String {
1166        "interchain_security.ccv.provider.v1.MsgRemoveConsumer".into()
1167    }
1168    fn type_url() -> ::prost::alloc::string::String {
1169        "/interchain_security.ccv.provider.v1.MsgRemoveConsumer".into()
1170    }
1171}
1172/// MsgRemoveConsumerResponse defines response type for MsgRemoveConsumer messages
1173#[allow(clippy::derive_partial_eq_without_eq)]
1174#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1175pub struct MsgRemoveConsumerResponse {}
1176impl ::prost::Name for MsgRemoveConsumerResponse {
1177    const NAME: &'static str = "MsgRemoveConsumerResponse";
1178    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1179    fn full_name() -> ::prost::alloc::string::String {
1180        "interchain_security.ccv.provider.v1.MsgRemoveConsumerResponse".into()
1181    }
1182    fn type_url() -> ::prost::alloc::string::String {
1183        "/interchain_security.ccv.provider.v1.MsgRemoveConsumerResponse".into()
1184    }
1185}
1186/// ChangeRewardDenomsProposal is a governance proposal on the provider chain to
1187/// mutate the set of denoms accepted by the provider as rewards.
1188///
1189/// Note: this replaces ChangeRewardDenomsProposal which is deprecated and will be removed soon
1190#[allow(clippy::derive_partial_eq_without_eq)]
1191#[derive(Clone, PartialEq, ::prost::Message)]
1192pub struct MsgChangeRewardDenoms {
1193    /// the list of consumer reward denoms to add
1194    #[prost(string, repeated, tag = "1")]
1195    pub denoms_to_add: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1196    /// the list of consumer reward denoms to remove
1197    #[prost(string, repeated, tag = "2")]
1198    pub denoms_to_remove: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1199    /// authority is the address of the governance account
1200    #[prost(string, tag = "3")]
1201    pub authority: ::prost::alloc::string::String,
1202}
1203impl ::prost::Name for MsgChangeRewardDenoms {
1204    const NAME: &'static str = "MsgChangeRewardDenoms";
1205    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1206    fn full_name() -> ::prost::alloc::string::String {
1207        "interchain_security.ccv.provider.v1.MsgChangeRewardDenoms".into()
1208    }
1209    fn type_url() -> ::prost::alloc::string::String {
1210        "/interchain_security.ccv.provider.v1.MsgChangeRewardDenoms".into()
1211    }
1212}
1213/// MsgChangeRewardDenomsResponse defines response type for MsgChangeRewardDenoms messages
1214#[allow(clippy::derive_partial_eq_without_eq)]
1215#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1216pub struct MsgChangeRewardDenomsResponse {}
1217impl ::prost::Name for MsgChangeRewardDenomsResponse {
1218    const NAME: &'static str = "MsgChangeRewardDenomsResponse";
1219    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1220    fn full_name() -> ::prost::alloc::string::String {
1221        "interchain_security.ccv.provider.v1.MsgChangeRewardDenomsResponse".into()
1222    }
1223    fn type_url() -> ::prost::alloc::string::String {
1224        "/interchain_security.ccv.provider.v1.MsgChangeRewardDenomsResponse".into()
1225    }
1226}
1227#[allow(clippy::derive_partial_eq_without_eq)]
1228#[derive(Clone, PartialEq, ::prost::Message)]
1229pub struct MsgOptIn {
1230    /// \[DEPRECATED\] use `consumer_id` instead
1231    #[deprecated]
1232    #[prost(string, tag = "1")]
1233    pub chain_id: ::prost::alloc::string::String,
1234    /// the validator address on the provider
1235    #[prost(string, tag = "2")]
1236    pub provider_addr: ::prost::alloc::string::String,
1237    /// (optional) The consensus public key to use on the consumer in json string format corresponding to proto-any,
1238    /// for example `{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Ui5Gf1+mtWUdH8u3xlmzdKID+F3PK0sfXZ73GZ6q6is="}`.
1239    /// This field is optional and can remain empty (i.e., `consumer_key = ""`). A validator can always change the
1240    /// consumer public key at a later stage by issuing a `MsgAssignConsumerKey` message.
1241    #[prost(string, tag = "3")]
1242    pub consumer_key: ::prost::alloc::string::String,
1243    /// submitter address
1244    #[prost(string, tag = "4")]
1245    pub signer: ::prost::alloc::string::String,
1246    /// the consumer id of the consumer chain to opt in to
1247    #[prost(string, tag = "5")]
1248    pub consumer_id: ::prost::alloc::string::String,
1249}
1250impl ::prost::Name for MsgOptIn {
1251    const NAME: &'static str = "MsgOptIn";
1252    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1253    fn full_name() -> ::prost::alloc::string::String {
1254        "interchain_security.ccv.provider.v1.MsgOptIn".into()
1255    }
1256    fn type_url() -> ::prost::alloc::string::String {
1257        "/interchain_security.ccv.provider.v1.MsgOptIn".into()
1258    }
1259}
1260#[allow(clippy::derive_partial_eq_without_eq)]
1261#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1262pub struct MsgOptInResponse {}
1263impl ::prost::Name for MsgOptInResponse {
1264    const NAME: &'static str = "MsgOptInResponse";
1265    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1266    fn full_name() -> ::prost::alloc::string::String {
1267        "interchain_security.ccv.provider.v1.MsgOptInResponse".into()
1268    }
1269    fn type_url() -> ::prost::alloc::string::String {
1270        "/interchain_security.ccv.provider.v1.MsgOptInResponse".into()
1271    }
1272}
1273#[allow(clippy::derive_partial_eq_without_eq)]
1274#[derive(Clone, PartialEq, ::prost::Message)]
1275pub struct MsgOptOut {
1276    /// \[DEPRECATED\] use `consumer_id` instead
1277    #[deprecated]
1278    #[prost(string, tag = "1")]
1279    pub chain_id: ::prost::alloc::string::String,
1280    /// the validator address on the provider
1281    #[prost(string, tag = "2")]
1282    pub provider_addr: ::prost::alloc::string::String,
1283    /// submitter address
1284    #[prost(string, tag = "3")]
1285    pub signer: ::prost::alloc::string::String,
1286    /// the consumer id of the consumer chain to opt out from
1287    #[prost(string, tag = "4")]
1288    pub consumer_id: ::prost::alloc::string::String,
1289}
1290impl ::prost::Name for MsgOptOut {
1291    const NAME: &'static str = "MsgOptOut";
1292    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1293    fn full_name() -> ::prost::alloc::string::String {
1294        "interchain_security.ccv.provider.v1.MsgOptOut".into()
1295    }
1296    fn type_url() -> ::prost::alloc::string::String {
1297        "/interchain_security.ccv.provider.v1.MsgOptOut".into()
1298    }
1299}
1300#[allow(clippy::derive_partial_eq_without_eq)]
1301#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1302pub struct MsgOptOutResponse {}
1303impl ::prost::Name for MsgOptOutResponse {
1304    const NAME: &'static str = "MsgOptOutResponse";
1305    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1306    fn full_name() -> ::prost::alloc::string::String {
1307        "interchain_security.ccv.provider.v1.MsgOptOutResponse".into()
1308    }
1309    fn type_url() -> ::prost::alloc::string::String {
1310        "/interchain_security.ccv.provider.v1.MsgOptOutResponse".into()
1311    }
1312}
1313/// MsgSetConsumerCommissionRate allows validators to set
1314/// a per-consumer chain commission rate
1315#[allow(clippy::derive_partial_eq_without_eq)]
1316#[derive(Clone, PartialEq, ::prost::Message)]
1317pub struct MsgSetConsumerCommissionRate {
1318    /// The validator address on the provider
1319    #[prost(string, tag = "1")]
1320    pub provider_addr: ::prost::alloc::string::String,
1321    /// \[DEPRECATED\] use `consumer_id` instead
1322    #[deprecated]
1323    #[prost(string, tag = "2")]
1324    pub chain_id: ::prost::alloc::string::String,
1325    /// The rate to charge delegators on the consumer chain, as a fraction
1326    /// TODO: migrate rate from sdk.Dec to math.LegacyDec
1327    #[prost(string, tag = "3")]
1328    pub rate: ::prost::alloc::string::String,
1329    /// submitter address
1330    #[prost(string, tag = "4")]
1331    pub signer: ::prost::alloc::string::String,
1332    /// the consumer id of the consumer chain to set the commission rate
1333    #[prost(string, tag = "5")]
1334    pub consumer_id: ::prost::alloc::string::String,
1335}
1336impl ::prost::Name for MsgSetConsumerCommissionRate {
1337    const NAME: &'static str = "MsgSetConsumerCommissionRate";
1338    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1339    fn full_name() -> ::prost::alloc::string::String {
1340        "interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRate".into()
1341    }
1342    fn type_url() -> ::prost::alloc::string::String {
1343        "/interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRate".into()
1344    }
1345}
1346#[allow(clippy::derive_partial_eq_without_eq)]
1347#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1348pub struct MsgSetConsumerCommissionRateResponse {}
1349impl ::prost::Name for MsgSetConsumerCommissionRateResponse {
1350    const NAME: &'static str = "MsgSetConsumerCommissionRateResponse";
1351    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1352    fn full_name() -> ::prost::alloc::string::String {
1353        "interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRateResponse".into()
1354    }
1355    fn type_url() -> ::prost::alloc::string::String {
1356        "/interchain_security.ccv.provider.v1.MsgSetConsumerCommissionRateResponse"
1357            .into()
1358    }
1359}
1360/// \[DEPRECATED\] Use `MsgUpdateConsumer` instead
1361#[allow(clippy::derive_partial_eq_without_eq)]
1362#[derive(Clone, PartialEq, ::prost::Message)]
1363pub struct MsgConsumerModification {
1364    /// the title of the proposal
1365    #[prost(string, tag = "1")]
1366    pub title: ::prost::alloc::string::String,
1367    /// the description of the proposal
1368    #[prost(string, tag = "2")]
1369    pub description: ::prost::alloc::string::String,
1370    /// the chain-id of the consumer chain to be modified
1371    #[prost(string, tag = "3")]
1372    pub chain_id: ::prost::alloc::string::String,
1373    /// Corresponds to the percentage of validators that have to validate the chain under the Top N case.
1374    /// For example, 53 corresponds to a Top 53% chain, meaning that the top 53% provider validators by voting power
1375    /// have to validate the proposed consumer chain. top_N can either be 0 or any value in \[50, 100\].
1376    /// A chain can join with top_N == 0 as an Opt In chain, or with top_N ∈ \[50, 100\] as a Top N chain.
1377    #[prost(uint32, tag = "4")]
1378    pub top_n: u32,
1379    /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain. For instance, if
1380    /// `validators_power_cap` is set to 32, it means that no validator can have more than 32% of the voting power on the
1381    /// consumer chain. Note that this might not be feasible. For example, think of a consumer chain with only
1382    /// 5 validators and with `validators_power_cap` set to 10%. In such a scenario, at least one validator would need
1383    /// to have more than 20% of the total voting power. Therefore, `validators_power_cap` operates on a best-effort basis.
1384    #[prost(uint32, tag = "5")]
1385    pub validators_power_cap: u32,
1386    /// Corresponds to the maximum number of validators that can validate a consumer chain.
1387    /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op.
1388    #[prost(uint32, tag = "6")]
1389    pub validator_set_cap: u32,
1390    /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate
1391    /// the consumer chain.
1392    #[prost(string, repeated, tag = "7")]
1393    pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1394    /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain.
1395    #[prost(string, repeated, tag = "8")]
1396    pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1397    /// signer address
1398    #[prost(string, tag = "9")]
1399    pub authority: ::prost::alloc::string::String,
1400    /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain.
1401    #[prost(uint64, tag = "10")]
1402    pub min_stake: u64,
1403    /// Corresponds to whether inactive validators are allowed to validate the consumer chain.
1404    #[prost(bool, tag = "11")]
1405    pub allow_inactive_vals: bool,
1406}
1407impl ::prost::Name for MsgConsumerModification {
1408    const NAME: &'static str = "MsgConsumerModification";
1409    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1410    fn full_name() -> ::prost::alloc::string::String {
1411        "interchain_security.ccv.provider.v1.MsgConsumerModification".into()
1412    }
1413    fn type_url() -> ::prost::alloc::string::String {
1414        "/interchain_security.ccv.provider.v1.MsgConsumerModification".into()
1415    }
1416}
1417#[allow(clippy::derive_partial_eq_without_eq)]
1418#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1419pub struct MsgConsumerModificationResponse {}
1420impl ::prost::Name for MsgConsumerModificationResponse {
1421    const NAME: &'static str = "MsgConsumerModificationResponse";
1422    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1423    fn full_name() -> ::prost::alloc::string::String {
1424        "interchain_security.ccv.provider.v1.MsgConsumerModificationResponse".into()
1425    }
1426    fn type_url() -> ::prost::alloc::string::String {
1427        "/interchain_security.ccv.provider.v1.MsgConsumerModificationResponse".into()
1428    }
1429}
1430/// MsgCreateConsumer defines the message that creates a consumer chain
1431#[allow(clippy::derive_partial_eq_without_eq)]
1432#[derive(Clone, PartialEq, ::prost::Message)]
1433pub struct MsgCreateConsumer {
1434    /// Submitter address. If the message is successfully handled, the ownership of
1435    /// the consumer chain will given to this address.
1436    #[prost(string, tag = "1")]
1437    pub submitter: ::prost::alloc::string::String,
1438    /// the chain id of the new consumer chain
1439    #[prost(string, tag = "2")]
1440    pub chain_id: ::prost::alloc::string::String,
1441    #[prost(message, optional, tag = "3")]
1442    pub metadata: ::core::option::Option<ConsumerMetadata>,
1443    #[prost(message, optional, tag = "4")]
1444    pub initialization_parameters: ::core::option::Option<
1445        ConsumerInitializationParameters,
1446    >,
1447    #[prost(message, optional, tag = "5")]
1448    pub power_shaping_parameters: ::core::option::Option<PowerShapingParameters>,
1449}
1450impl ::prost::Name for MsgCreateConsumer {
1451    const NAME: &'static str = "MsgCreateConsumer";
1452    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1453    fn full_name() -> ::prost::alloc::string::String {
1454        "interchain_security.ccv.provider.v1.MsgCreateConsumer".into()
1455    }
1456    fn type_url() -> ::prost::alloc::string::String {
1457        "/interchain_security.ccv.provider.v1.MsgCreateConsumer".into()
1458    }
1459}
1460/// MsgCreateConsumerResponse defines response type for MsgCreateConsumer
1461#[allow(clippy::derive_partial_eq_without_eq)]
1462#[derive(Clone, PartialEq, ::prost::Message)]
1463pub struct MsgCreateConsumerResponse {
1464    #[prost(string, tag = "1")]
1465    pub consumer_id: ::prost::alloc::string::String,
1466}
1467impl ::prost::Name for MsgCreateConsumerResponse {
1468    const NAME: &'static str = "MsgCreateConsumerResponse";
1469    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1470    fn full_name() -> ::prost::alloc::string::String {
1471        "interchain_security.ccv.provider.v1.MsgCreateConsumerResponse".into()
1472    }
1473    fn type_url() -> ::prost::alloc::string::String {
1474        "/interchain_security.ccv.provider.v1.MsgCreateConsumerResponse".into()
1475    }
1476}
1477/// MsgUpdateConsumer defines the message used to modify a consumer chain.
1478#[allow(clippy::derive_partial_eq_without_eq)]
1479#[derive(Clone, PartialEq, ::prost::Message)]
1480pub struct MsgUpdateConsumer {
1481    /// the address of the owner of the consumer chain to be updated
1482    #[prost(string, tag = "1")]
1483    pub owner: ::prost::alloc::string::String,
1484    /// the consumer id of the consumer chain to be updated
1485    #[prost(string, tag = "2")]
1486    pub consumer_id: ::prost::alloc::string::String,
1487    /// the new owner of the consumer when updated
1488    #[prost(string, tag = "3")]
1489    pub new_owner_address: ::prost::alloc::string::String,
1490    /// the metadata of the consumer when updated
1491    #[prost(message, optional, tag = "4")]
1492    pub metadata: ::core::option::Option<ConsumerMetadata>,
1493    /// initialization parameters can only be updated before a chain has launched
1494    #[prost(message, optional, tag = "5")]
1495    pub initialization_parameters: ::core::option::Option<
1496        ConsumerInitializationParameters,
1497    >,
1498    /// the power-shaping parameters of the consumer when updated
1499    #[prost(message, optional, tag = "6")]
1500    pub power_shaping_parameters: ::core::option::Option<PowerShapingParameters>,
1501}
1502impl ::prost::Name for MsgUpdateConsumer {
1503    const NAME: &'static str = "MsgUpdateConsumer";
1504    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1505    fn full_name() -> ::prost::alloc::string::String {
1506        "interchain_security.ccv.provider.v1.MsgUpdateConsumer".into()
1507    }
1508    fn type_url() -> ::prost::alloc::string::String {
1509        "/interchain_security.ccv.provider.v1.MsgUpdateConsumer".into()
1510    }
1511}
1512/// MsgUpdateConsumerResponse defines response type for MsgUpdateConsumer messages
1513#[allow(clippy::derive_partial_eq_without_eq)]
1514#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1515pub struct MsgUpdateConsumerResponse {}
1516impl ::prost::Name for MsgUpdateConsumerResponse {
1517    const NAME: &'static str = "MsgUpdateConsumerResponse";
1518    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
1519    fn full_name() -> ::prost::alloc::string::String {
1520        "interchain_security.ccv.provider.v1.MsgUpdateConsumerResponse".into()
1521    }
1522    fn type_url() -> ::prost::alloc::string::String {
1523        "/interchain_security.ccv.provider.v1.MsgUpdateConsumerResponse".into()
1524    }
1525}
1526/// Generated client implementations.
1527#[cfg(feature = "client")]
1528pub mod msg_client {
1529    #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
1530    use tonic::codegen::*;
1531    use tonic::codegen::http::Uri;
1532    /// Msg defines the Msg service.
1533    #[derive(Debug, Clone)]
1534    pub struct MsgClient<T> {
1535        inner: tonic::client::Grpc<T>,
1536    }
1537    #[cfg(feature = "transport")]
1538    impl MsgClient<tonic::transport::Channel> {
1539        /// Attempt to create a new client by connecting to a given endpoint.
1540        pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
1541        where
1542            D: TryInto<tonic::transport::Endpoint>,
1543            D::Error: Into<StdError>,
1544        {
1545            let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
1546            Ok(Self::new(conn))
1547        }
1548    }
1549    impl<T> MsgClient<T>
1550    where
1551        T: tonic::client::GrpcService<tonic::body::BoxBody>,
1552        T::Error: Into<StdError>,
1553        T::ResponseBody: Body<Data = Bytes> + Send + 'static,
1554        <T::ResponseBody as Body>::Error: Into<StdError> + Send,
1555    {
1556        pub fn new(inner: T) -> Self {
1557            let inner = tonic::client::Grpc::new(inner);
1558            Self { inner }
1559        }
1560        pub fn with_origin(inner: T, origin: Uri) -> Self {
1561            let inner = tonic::client::Grpc::with_origin(inner, origin);
1562            Self { inner }
1563        }
1564        pub fn with_interceptor<F>(
1565            inner: T,
1566            interceptor: F,
1567        ) -> MsgClient<InterceptedService<T, F>>
1568        where
1569            F: tonic::service::Interceptor,
1570            T::ResponseBody: Default,
1571            T: tonic::codegen::Service<
1572                http::Request<tonic::body::BoxBody>,
1573                Response = http::Response<
1574                    <T as tonic::client::GrpcService<tonic::body::BoxBody>>::ResponseBody,
1575                >,
1576            >,
1577            <T as tonic::codegen::Service<
1578                http::Request<tonic::body::BoxBody>,
1579            >>::Error: Into<StdError> + Send + Sync,
1580        {
1581            MsgClient::new(InterceptedService::new(inner, interceptor))
1582        }
1583        /// Compress requests with the given encoding.
1584        ///
1585        /// This requires the server to support it otherwise it might respond with an
1586        /// error.
1587        #[must_use]
1588        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
1589            self.inner = self.inner.send_compressed(encoding);
1590            self
1591        }
1592        /// Enable decompressing responses.
1593        #[must_use]
1594        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
1595            self.inner = self.inner.accept_compressed(encoding);
1596            self
1597        }
1598        /// Limits the maximum size of a decoded message.
1599        ///
1600        /// Default: `4MB`
1601        #[must_use]
1602        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
1603            self.inner = self.inner.max_decoding_message_size(limit);
1604            self
1605        }
1606        /// Limits the maximum size of an encoded message.
1607        ///
1608        /// Default: `usize::MAX`
1609        #[must_use]
1610        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
1611            self.inner = self.inner.max_encoding_message_size(limit);
1612            self
1613        }
1614        pub async fn assign_consumer_key(
1615            &mut self,
1616            request: impl tonic::IntoRequest<super::MsgAssignConsumerKey>,
1617        ) -> std::result::Result<
1618            tonic::Response<super::MsgAssignConsumerKeyResponse>,
1619            tonic::Status,
1620        > {
1621            self.inner
1622                .ready()
1623                .await
1624                .map_err(|e| {
1625                    tonic::Status::new(
1626                        tonic::Code::Unknown,
1627                        format!("Service was not ready: {}", e.into()),
1628                    )
1629                })?;
1630            let codec = tonic::codec::ProstCodec::default();
1631            let path = http::uri::PathAndQuery::from_static(
1632                "/interchain_security.ccv.provider.v1.Msg/AssignConsumerKey",
1633            );
1634            let mut req = request.into_request();
1635            req.extensions_mut()
1636                .insert(
1637                    GrpcMethod::new(
1638                        "interchain_security.ccv.provider.v1.Msg",
1639                        "AssignConsumerKey",
1640                    ),
1641                );
1642            self.inner.unary(req, path, codec).await
1643        }
1644        pub async fn submit_consumer_misbehaviour(
1645            &mut self,
1646            request: impl tonic::IntoRequest<super::MsgSubmitConsumerMisbehaviour>,
1647        ) -> std::result::Result<
1648            tonic::Response<super::MsgSubmitConsumerMisbehaviourResponse>,
1649            tonic::Status,
1650        > {
1651            self.inner
1652                .ready()
1653                .await
1654                .map_err(|e| {
1655                    tonic::Status::new(
1656                        tonic::Code::Unknown,
1657                        format!("Service was not ready: {}", e.into()),
1658                    )
1659                })?;
1660            let codec = tonic::codec::ProstCodec::default();
1661            let path = http::uri::PathAndQuery::from_static(
1662                "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerMisbehaviour",
1663            );
1664            let mut req = request.into_request();
1665            req.extensions_mut()
1666                .insert(
1667                    GrpcMethod::new(
1668                        "interchain_security.ccv.provider.v1.Msg",
1669                        "SubmitConsumerMisbehaviour",
1670                    ),
1671                );
1672            self.inner.unary(req, path, codec).await
1673        }
1674        pub async fn submit_consumer_double_voting(
1675            &mut self,
1676            request: impl tonic::IntoRequest<super::MsgSubmitConsumerDoubleVoting>,
1677        ) -> std::result::Result<
1678            tonic::Response<super::MsgSubmitConsumerDoubleVotingResponse>,
1679            tonic::Status,
1680        > {
1681            self.inner
1682                .ready()
1683                .await
1684                .map_err(|e| {
1685                    tonic::Status::new(
1686                        tonic::Code::Unknown,
1687                        format!("Service was not ready: {}", e.into()),
1688                    )
1689                })?;
1690            let codec = tonic::codec::ProstCodec::default();
1691            let path = http::uri::PathAndQuery::from_static(
1692                "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerDoubleVoting",
1693            );
1694            let mut req = request.into_request();
1695            req.extensions_mut()
1696                .insert(
1697                    GrpcMethod::new(
1698                        "interchain_security.ccv.provider.v1.Msg",
1699                        "SubmitConsumerDoubleVoting",
1700                    ),
1701                );
1702            self.inner.unary(req, path, codec).await
1703        }
1704        pub async fn create_consumer(
1705            &mut self,
1706            request: impl tonic::IntoRequest<super::MsgCreateConsumer>,
1707        ) -> std::result::Result<
1708            tonic::Response<super::MsgCreateConsumerResponse>,
1709            tonic::Status,
1710        > {
1711            self.inner
1712                .ready()
1713                .await
1714                .map_err(|e| {
1715                    tonic::Status::new(
1716                        tonic::Code::Unknown,
1717                        format!("Service was not ready: {}", e.into()),
1718                    )
1719                })?;
1720            let codec = tonic::codec::ProstCodec::default();
1721            let path = http::uri::PathAndQuery::from_static(
1722                "/interchain_security.ccv.provider.v1.Msg/CreateConsumer",
1723            );
1724            let mut req = request.into_request();
1725            req.extensions_mut()
1726                .insert(
1727                    GrpcMethod::new(
1728                        "interchain_security.ccv.provider.v1.Msg",
1729                        "CreateConsumer",
1730                    ),
1731                );
1732            self.inner.unary(req, path, codec).await
1733        }
1734        pub async fn update_consumer(
1735            &mut self,
1736            request: impl tonic::IntoRequest<super::MsgUpdateConsumer>,
1737        ) -> std::result::Result<
1738            tonic::Response<super::MsgUpdateConsumerResponse>,
1739            tonic::Status,
1740        > {
1741            self.inner
1742                .ready()
1743                .await
1744                .map_err(|e| {
1745                    tonic::Status::new(
1746                        tonic::Code::Unknown,
1747                        format!("Service was not ready: {}", e.into()),
1748                    )
1749                })?;
1750            let codec = tonic::codec::ProstCodec::default();
1751            let path = http::uri::PathAndQuery::from_static(
1752                "/interchain_security.ccv.provider.v1.Msg/UpdateConsumer",
1753            );
1754            let mut req = request.into_request();
1755            req.extensions_mut()
1756                .insert(
1757                    GrpcMethod::new(
1758                        "interchain_security.ccv.provider.v1.Msg",
1759                        "UpdateConsumer",
1760                    ),
1761                );
1762            self.inner.unary(req, path, codec).await
1763        }
1764        pub async fn remove_consumer(
1765            &mut self,
1766            request: impl tonic::IntoRequest<super::MsgRemoveConsumer>,
1767        ) -> std::result::Result<
1768            tonic::Response<super::MsgRemoveConsumerResponse>,
1769            tonic::Status,
1770        > {
1771            self.inner
1772                .ready()
1773                .await
1774                .map_err(|e| {
1775                    tonic::Status::new(
1776                        tonic::Code::Unknown,
1777                        format!("Service was not ready: {}", e.into()),
1778                    )
1779                })?;
1780            let codec = tonic::codec::ProstCodec::default();
1781            let path = http::uri::PathAndQuery::from_static(
1782                "/interchain_security.ccv.provider.v1.Msg/RemoveConsumer",
1783            );
1784            let mut req = request.into_request();
1785            req.extensions_mut()
1786                .insert(
1787                    GrpcMethod::new(
1788                        "interchain_security.ccv.provider.v1.Msg",
1789                        "RemoveConsumer",
1790                    ),
1791                );
1792            self.inner.unary(req, path, codec).await
1793        }
1794        pub async fn update_params(
1795            &mut self,
1796            request: impl tonic::IntoRequest<super::MsgUpdateParams>,
1797        ) -> std::result::Result<
1798            tonic::Response<super::MsgUpdateParamsResponse>,
1799            tonic::Status,
1800        > {
1801            self.inner
1802                .ready()
1803                .await
1804                .map_err(|e| {
1805                    tonic::Status::new(
1806                        tonic::Code::Unknown,
1807                        format!("Service was not ready: {}", e.into()),
1808                    )
1809                })?;
1810            let codec = tonic::codec::ProstCodec::default();
1811            let path = http::uri::PathAndQuery::from_static(
1812                "/interchain_security.ccv.provider.v1.Msg/UpdateParams",
1813            );
1814            let mut req = request.into_request();
1815            req.extensions_mut()
1816                .insert(
1817                    GrpcMethod::new(
1818                        "interchain_security.ccv.provider.v1.Msg",
1819                        "UpdateParams",
1820                    ),
1821                );
1822            self.inner.unary(req, path, codec).await
1823        }
1824        pub async fn opt_in(
1825            &mut self,
1826            request: impl tonic::IntoRequest<super::MsgOptIn>,
1827        ) -> std::result::Result<
1828            tonic::Response<super::MsgOptInResponse>,
1829            tonic::Status,
1830        > {
1831            self.inner
1832                .ready()
1833                .await
1834                .map_err(|e| {
1835                    tonic::Status::new(
1836                        tonic::Code::Unknown,
1837                        format!("Service was not ready: {}", e.into()),
1838                    )
1839                })?;
1840            let codec = tonic::codec::ProstCodec::default();
1841            let path = http::uri::PathAndQuery::from_static(
1842                "/interchain_security.ccv.provider.v1.Msg/OptIn",
1843            );
1844            let mut req = request.into_request();
1845            req.extensions_mut()
1846                .insert(
1847                    GrpcMethod::new("interchain_security.ccv.provider.v1.Msg", "OptIn"),
1848                );
1849            self.inner.unary(req, path, codec).await
1850        }
1851        pub async fn opt_out(
1852            &mut self,
1853            request: impl tonic::IntoRequest<super::MsgOptOut>,
1854        ) -> std::result::Result<
1855            tonic::Response<super::MsgOptOutResponse>,
1856            tonic::Status,
1857        > {
1858            self.inner
1859                .ready()
1860                .await
1861                .map_err(|e| {
1862                    tonic::Status::new(
1863                        tonic::Code::Unknown,
1864                        format!("Service was not ready: {}", e.into()),
1865                    )
1866                })?;
1867            let codec = tonic::codec::ProstCodec::default();
1868            let path = http::uri::PathAndQuery::from_static(
1869                "/interchain_security.ccv.provider.v1.Msg/OptOut",
1870            );
1871            let mut req = request.into_request();
1872            req.extensions_mut()
1873                .insert(
1874                    GrpcMethod::new("interchain_security.ccv.provider.v1.Msg", "OptOut"),
1875                );
1876            self.inner.unary(req, path, codec).await
1877        }
1878        pub async fn set_consumer_commission_rate(
1879            &mut self,
1880            request: impl tonic::IntoRequest<super::MsgSetConsumerCommissionRate>,
1881        ) -> std::result::Result<
1882            tonic::Response<super::MsgSetConsumerCommissionRateResponse>,
1883            tonic::Status,
1884        > {
1885            self.inner
1886                .ready()
1887                .await
1888                .map_err(|e| {
1889                    tonic::Status::new(
1890                        tonic::Code::Unknown,
1891                        format!("Service was not ready: {}", e.into()),
1892                    )
1893                })?;
1894            let codec = tonic::codec::ProstCodec::default();
1895            let path = http::uri::PathAndQuery::from_static(
1896                "/interchain_security.ccv.provider.v1.Msg/SetConsumerCommissionRate",
1897            );
1898            let mut req = request.into_request();
1899            req.extensions_mut()
1900                .insert(
1901                    GrpcMethod::new(
1902                        "interchain_security.ccv.provider.v1.Msg",
1903                        "SetConsumerCommissionRate",
1904                    ),
1905                );
1906            self.inner.unary(req, path, codec).await
1907        }
1908        pub async fn change_reward_denoms(
1909            &mut self,
1910            request: impl tonic::IntoRequest<super::MsgChangeRewardDenoms>,
1911        ) -> std::result::Result<
1912            tonic::Response<super::MsgChangeRewardDenomsResponse>,
1913            tonic::Status,
1914        > {
1915            self.inner
1916                .ready()
1917                .await
1918                .map_err(|e| {
1919                    tonic::Status::new(
1920                        tonic::Code::Unknown,
1921                        format!("Service was not ready: {}", e.into()),
1922                    )
1923                })?;
1924            let codec = tonic::codec::ProstCodec::default();
1925            let path = http::uri::PathAndQuery::from_static(
1926                "/interchain_security.ccv.provider.v1.Msg/ChangeRewardDenoms",
1927            );
1928            let mut req = request.into_request();
1929            req.extensions_mut()
1930                .insert(
1931                    GrpcMethod::new(
1932                        "interchain_security.ccv.provider.v1.Msg",
1933                        "ChangeRewardDenoms",
1934                    ),
1935                );
1936            self.inner.unary(req, path, codec).await
1937        }
1938    }
1939}
1940/// Generated server implementations.
1941#[cfg(feature = "server")]
1942pub mod msg_server {
1943    #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
1944    use tonic::codegen::*;
1945    /// Generated trait containing gRPC methods that should be implemented for use with MsgServer.
1946    #[async_trait]
1947    pub trait Msg: Send + Sync + 'static {
1948        async fn assign_consumer_key(
1949            &self,
1950            request: tonic::Request<super::MsgAssignConsumerKey>,
1951        ) -> std::result::Result<
1952            tonic::Response<super::MsgAssignConsumerKeyResponse>,
1953            tonic::Status,
1954        >;
1955        async fn submit_consumer_misbehaviour(
1956            &self,
1957            request: tonic::Request<super::MsgSubmitConsumerMisbehaviour>,
1958        ) -> std::result::Result<
1959            tonic::Response<super::MsgSubmitConsumerMisbehaviourResponse>,
1960            tonic::Status,
1961        >;
1962        async fn submit_consumer_double_voting(
1963            &self,
1964            request: tonic::Request<super::MsgSubmitConsumerDoubleVoting>,
1965        ) -> std::result::Result<
1966            tonic::Response<super::MsgSubmitConsumerDoubleVotingResponse>,
1967            tonic::Status,
1968        >;
1969        async fn create_consumer(
1970            &self,
1971            request: tonic::Request<super::MsgCreateConsumer>,
1972        ) -> std::result::Result<
1973            tonic::Response<super::MsgCreateConsumerResponse>,
1974            tonic::Status,
1975        >;
1976        async fn update_consumer(
1977            &self,
1978            request: tonic::Request<super::MsgUpdateConsumer>,
1979        ) -> std::result::Result<
1980            tonic::Response<super::MsgUpdateConsumerResponse>,
1981            tonic::Status,
1982        >;
1983        async fn remove_consumer(
1984            &self,
1985            request: tonic::Request<super::MsgRemoveConsumer>,
1986        ) -> std::result::Result<
1987            tonic::Response<super::MsgRemoveConsumerResponse>,
1988            tonic::Status,
1989        >;
1990        async fn update_params(
1991            &self,
1992            request: tonic::Request<super::MsgUpdateParams>,
1993        ) -> std::result::Result<
1994            tonic::Response<super::MsgUpdateParamsResponse>,
1995            tonic::Status,
1996        >;
1997        async fn opt_in(
1998            &self,
1999            request: tonic::Request<super::MsgOptIn>,
2000        ) -> std::result::Result<
2001            tonic::Response<super::MsgOptInResponse>,
2002            tonic::Status,
2003        >;
2004        async fn opt_out(
2005            &self,
2006            request: tonic::Request<super::MsgOptOut>,
2007        ) -> std::result::Result<
2008            tonic::Response<super::MsgOptOutResponse>,
2009            tonic::Status,
2010        >;
2011        async fn set_consumer_commission_rate(
2012            &self,
2013            request: tonic::Request<super::MsgSetConsumerCommissionRate>,
2014        ) -> std::result::Result<
2015            tonic::Response<super::MsgSetConsumerCommissionRateResponse>,
2016            tonic::Status,
2017        >;
2018        async fn change_reward_denoms(
2019            &self,
2020            request: tonic::Request<super::MsgChangeRewardDenoms>,
2021        ) -> std::result::Result<
2022            tonic::Response<super::MsgChangeRewardDenomsResponse>,
2023            tonic::Status,
2024        >;
2025    }
2026    /// Msg defines the Msg service.
2027    #[derive(Debug)]
2028    pub struct MsgServer<T: Msg> {
2029        inner: Arc<T>,
2030        accept_compression_encodings: EnabledCompressionEncodings,
2031        send_compression_encodings: EnabledCompressionEncodings,
2032        max_decoding_message_size: Option<usize>,
2033        max_encoding_message_size: Option<usize>,
2034    }
2035    impl<T: Msg> MsgServer<T> {
2036        pub fn new(inner: T) -> Self {
2037            Self::from_arc(Arc::new(inner))
2038        }
2039        pub fn from_arc(inner: Arc<T>) -> Self {
2040            Self {
2041                inner,
2042                accept_compression_encodings: Default::default(),
2043                send_compression_encodings: Default::default(),
2044                max_decoding_message_size: None,
2045                max_encoding_message_size: None,
2046            }
2047        }
2048        pub fn with_interceptor<F>(
2049            inner: T,
2050            interceptor: F,
2051        ) -> InterceptedService<Self, F>
2052        where
2053            F: tonic::service::Interceptor,
2054        {
2055            InterceptedService::new(Self::new(inner), interceptor)
2056        }
2057        /// Enable decompressing requests with the given encoding.
2058        #[must_use]
2059        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
2060            self.accept_compression_encodings.enable(encoding);
2061            self
2062        }
2063        /// Compress responses with the given encoding, if the client supports it.
2064        #[must_use]
2065        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
2066            self.send_compression_encodings.enable(encoding);
2067            self
2068        }
2069        /// Limits the maximum size of a decoded message.
2070        ///
2071        /// Default: `4MB`
2072        #[must_use]
2073        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
2074            self.max_decoding_message_size = Some(limit);
2075            self
2076        }
2077        /// Limits the maximum size of an encoded message.
2078        ///
2079        /// Default: `usize::MAX`
2080        #[must_use]
2081        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
2082            self.max_encoding_message_size = Some(limit);
2083            self
2084        }
2085    }
2086    impl<T, B> tonic::codegen::Service<http::Request<B>> for MsgServer<T>
2087    where
2088        T: Msg,
2089        B: Body + Send + 'static,
2090        B::Error: Into<StdError> + Send + 'static,
2091    {
2092        type Response = http::Response<tonic::body::BoxBody>;
2093        type Error = std::convert::Infallible;
2094        type Future = BoxFuture<Self::Response, Self::Error>;
2095        fn poll_ready(
2096            &mut self,
2097            _cx: &mut Context<'_>,
2098        ) -> Poll<std::result::Result<(), Self::Error>> {
2099            Poll::Ready(Ok(()))
2100        }
2101        fn call(&mut self, req: http::Request<B>) -> Self::Future {
2102            match req.uri().path() {
2103                "/interchain_security.ccv.provider.v1.Msg/AssignConsumerKey" => {
2104                    #[allow(non_camel_case_types)]
2105                    struct AssignConsumerKeySvc<T: Msg>(pub Arc<T>);
2106                    impl<T: Msg> tonic::server::UnaryService<super::MsgAssignConsumerKey>
2107                    for AssignConsumerKeySvc<T> {
2108                        type Response = super::MsgAssignConsumerKeyResponse;
2109                        type Future = BoxFuture<
2110                            tonic::Response<Self::Response>,
2111                            tonic::Status,
2112                        >;
2113                        fn call(
2114                            &mut self,
2115                            request: tonic::Request<super::MsgAssignConsumerKey>,
2116                        ) -> Self::Future {
2117                            let inner = Arc::clone(&self.0);
2118                            let fut = async move {
2119                                <T as Msg>::assign_consumer_key(&inner, request).await
2120                            };
2121                            Box::pin(fut)
2122                        }
2123                    }
2124                    let accept_compression_encodings = self.accept_compression_encodings;
2125                    let send_compression_encodings = self.send_compression_encodings;
2126                    let max_decoding_message_size = self.max_decoding_message_size;
2127                    let max_encoding_message_size = self.max_encoding_message_size;
2128                    let inner = self.inner.clone();
2129                    let fut = async move {
2130                        let method = AssignConsumerKeySvc(inner);
2131                        let codec = tonic::codec::ProstCodec::default();
2132                        let mut grpc = tonic::server::Grpc::new(codec)
2133                            .apply_compression_config(
2134                                accept_compression_encodings,
2135                                send_compression_encodings,
2136                            )
2137                            .apply_max_message_size_config(
2138                                max_decoding_message_size,
2139                                max_encoding_message_size,
2140                            );
2141                        let res = grpc.unary(method, req).await;
2142                        Ok(res)
2143                    };
2144                    Box::pin(fut)
2145                }
2146                "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerMisbehaviour" => {
2147                    #[allow(non_camel_case_types)]
2148                    struct SubmitConsumerMisbehaviourSvc<T: Msg>(pub Arc<T>);
2149                    impl<
2150                        T: Msg,
2151                    > tonic::server::UnaryService<super::MsgSubmitConsumerMisbehaviour>
2152                    for SubmitConsumerMisbehaviourSvc<T> {
2153                        type Response = super::MsgSubmitConsumerMisbehaviourResponse;
2154                        type Future = BoxFuture<
2155                            tonic::Response<Self::Response>,
2156                            tonic::Status,
2157                        >;
2158                        fn call(
2159                            &mut self,
2160                            request: tonic::Request<super::MsgSubmitConsumerMisbehaviour>,
2161                        ) -> Self::Future {
2162                            let inner = Arc::clone(&self.0);
2163                            let fut = async move {
2164                                <T as Msg>::submit_consumer_misbehaviour(&inner, request)
2165                                    .await
2166                            };
2167                            Box::pin(fut)
2168                        }
2169                    }
2170                    let accept_compression_encodings = self.accept_compression_encodings;
2171                    let send_compression_encodings = self.send_compression_encodings;
2172                    let max_decoding_message_size = self.max_decoding_message_size;
2173                    let max_encoding_message_size = self.max_encoding_message_size;
2174                    let inner = self.inner.clone();
2175                    let fut = async move {
2176                        let method = SubmitConsumerMisbehaviourSvc(inner);
2177                        let codec = tonic::codec::ProstCodec::default();
2178                        let mut grpc = tonic::server::Grpc::new(codec)
2179                            .apply_compression_config(
2180                                accept_compression_encodings,
2181                                send_compression_encodings,
2182                            )
2183                            .apply_max_message_size_config(
2184                                max_decoding_message_size,
2185                                max_encoding_message_size,
2186                            );
2187                        let res = grpc.unary(method, req).await;
2188                        Ok(res)
2189                    };
2190                    Box::pin(fut)
2191                }
2192                "/interchain_security.ccv.provider.v1.Msg/SubmitConsumerDoubleVoting" => {
2193                    #[allow(non_camel_case_types)]
2194                    struct SubmitConsumerDoubleVotingSvc<T: Msg>(pub Arc<T>);
2195                    impl<
2196                        T: Msg,
2197                    > tonic::server::UnaryService<super::MsgSubmitConsumerDoubleVoting>
2198                    for SubmitConsumerDoubleVotingSvc<T> {
2199                        type Response = super::MsgSubmitConsumerDoubleVotingResponse;
2200                        type Future = BoxFuture<
2201                            tonic::Response<Self::Response>,
2202                            tonic::Status,
2203                        >;
2204                        fn call(
2205                            &mut self,
2206                            request: tonic::Request<super::MsgSubmitConsumerDoubleVoting>,
2207                        ) -> Self::Future {
2208                            let inner = Arc::clone(&self.0);
2209                            let fut = async move {
2210                                <T as Msg>::submit_consumer_double_voting(&inner, request)
2211                                    .await
2212                            };
2213                            Box::pin(fut)
2214                        }
2215                    }
2216                    let accept_compression_encodings = self.accept_compression_encodings;
2217                    let send_compression_encodings = self.send_compression_encodings;
2218                    let max_decoding_message_size = self.max_decoding_message_size;
2219                    let max_encoding_message_size = self.max_encoding_message_size;
2220                    let inner = self.inner.clone();
2221                    let fut = async move {
2222                        let method = SubmitConsumerDoubleVotingSvc(inner);
2223                        let codec = tonic::codec::ProstCodec::default();
2224                        let mut grpc = tonic::server::Grpc::new(codec)
2225                            .apply_compression_config(
2226                                accept_compression_encodings,
2227                                send_compression_encodings,
2228                            )
2229                            .apply_max_message_size_config(
2230                                max_decoding_message_size,
2231                                max_encoding_message_size,
2232                            );
2233                        let res = grpc.unary(method, req).await;
2234                        Ok(res)
2235                    };
2236                    Box::pin(fut)
2237                }
2238                "/interchain_security.ccv.provider.v1.Msg/CreateConsumer" => {
2239                    #[allow(non_camel_case_types)]
2240                    struct CreateConsumerSvc<T: Msg>(pub Arc<T>);
2241                    impl<T: Msg> tonic::server::UnaryService<super::MsgCreateConsumer>
2242                    for CreateConsumerSvc<T> {
2243                        type Response = super::MsgCreateConsumerResponse;
2244                        type Future = BoxFuture<
2245                            tonic::Response<Self::Response>,
2246                            tonic::Status,
2247                        >;
2248                        fn call(
2249                            &mut self,
2250                            request: tonic::Request<super::MsgCreateConsumer>,
2251                        ) -> Self::Future {
2252                            let inner = Arc::clone(&self.0);
2253                            let fut = async move {
2254                                <T as Msg>::create_consumer(&inner, request).await
2255                            };
2256                            Box::pin(fut)
2257                        }
2258                    }
2259                    let accept_compression_encodings = self.accept_compression_encodings;
2260                    let send_compression_encodings = self.send_compression_encodings;
2261                    let max_decoding_message_size = self.max_decoding_message_size;
2262                    let max_encoding_message_size = self.max_encoding_message_size;
2263                    let inner = self.inner.clone();
2264                    let fut = async move {
2265                        let method = CreateConsumerSvc(inner);
2266                        let codec = tonic::codec::ProstCodec::default();
2267                        let mut grpc = tonic::server::Grpc::new(codec)
2268                            .apply_compression_config(
2269                                accept_compression_encodings,
2270                                send_compression_encodings,
2271                            )
2272                            .apply_max_message_size_config(
2273                                max_decoding_message_size,
2274                                max_encoding_message_size,
2275                            );
2276                        let res = grpc.unary(method, req).await;
2277                        Ok(res)
2278                    };
2279                    Box::pin(fut)
2280                }
2281                "/interchain_security.ccv.provider.v1.Msg/UpdateConsumer" => {
2282                    #[allow(non_camel_case_types)]
2283                    struct UpdateConsumerSvc<T: Msg>(pub Arc<T>);
2284                    impl<T: Msg> tonic::server::UnaryService<super::MsgUpdateConsumer>
2285                    for UpdateConsumerSvc<T> {
2286                        type Response = super::MsgUpdateConsumerResponse;
2287                        type Future = BoxFuture<
2288                            tonic::Response<Self::Response>,
2289                            tonic::Status,
2290                        >;
2291                        fn call(
2292                            &mut self,
2293                            request: tonic::Request<super::MsgUpdateConsumer>,
2294                        ) -> Self::Future {
2295                            let inner = Arc::clone(&self.0);
2296                            let fut = async move {
2297                                <T as Msg>::update_consumer(&inner, request).await
2298                            };
2299                            Box::pin(fut)
2300                        }
2301                    }
2302                    let accept_compression_encodings = self.accept_compression_encodings;
2303                    let send_compression_encodings = self.send_compression_encodings;
2304                    let max_decoding_message_size = self.max_decoding_message_size;
2305                    let max_encoding_message_size = self.max_encoding_message_size;
2306                    let inner = self.inner.clone();
2307                    let fut = async move {
2308                        let method = UpdateConsumerSvc(inner);
2309                        let codec = tonic::codec::ProstCodec::default();
2310                        let mut grpc = tonic::server::Grpc::new(codec)
2311                            .apply_compression_config(
2312                                accept_compression_encodings,
2313                                send_compression_encodings,
2314                            )
2315                            .apply_max_message_size_config(
2316                                max_decoding_message_size,
2317                                max_encoding_message_size,
2318                            );
2319                        let res = grpc.unary(method, req).await;
2320                        Ok(res)
2321                    };
2322                    Box::pin(fut)
2323                }
2324                "/interchain_security.ccv.provider.v1.Msg/RemoveConsumer" => {
2325                    #[allow(non_camel_case_types)]
2326                    struct RemoveConsumerSvc<T: Msg>(pub Arc<T>);
2327                    impl<T: Msg> tonic::server::UnaryService<super::MsgRemoveConsumer>
2328                    for RemoveConsumerSvc<T> {
2329                        type Response = super::MsgRemoveConsumerResponse;
2330                        type Future = BoxFuture<
2331                            tonic::Response<Self::Response>,
2332                            tonic::Status,
2333                        >;
2334                        fn call(
2335                            &mut self,
2336                            request: tonic::Request<super::MsgRemoveConsumer>,
2337                        ) -> Self::Future {
2338                            let inner = Arc::clone(&self.0);
2339                            let fut = async move {
2340                                <T as Msg>::remove_consumer(&inner, request).await
2341                            };
2342                            Box::pin(fut)
2343                        }
2344                    }
2345                    let accept_compression_encodings = self.accept_compression_encodings;
2346                    let send_compression_encodings = self.send_compression_encodings;
2347                    let max_decoding_message_size = self.max_decoding_message_size;
2348                    let max_encoding_message_size = self.max_encoding_message_size;
2349                    let inner = self.inner.clone();
2350                    let fut = async move {
2351                        let method = RemoveConsumerSvc(inner);
2352                        let codec = tonic::codec::ProstCodec::default();
2353                        let mut grpc = tonic::server::Grpc::new(codec)
2354                            .apply_compression_config(
2355                                accept_compression_encodings,
2356                                send_compression_encodings,
2357                            )
2358                            .apply_max_message_size_config(
2359                                max_decoding_message_size,
2360                                max_encoding_message_size,
2361                            );
2362                        let res = grpc.unary(method, req).await;
2363                        Ok(res)
2364                    };
2365                    Box::pin(fut)
2366                }
2367                "/interchain_security.ccv.provider.v1.Msg/UpdateParams" => {
2368                    #[allow(non_camel_case_types)]
2369                    struct UpdateParamsSvc<T: Msg>(pub Arc<T>);
2370                    impl<T: Msg> tonic::server::UnaryService<super::MsgUpdateParams>
2371                    for UpdateParamsSvc<T> {
2372                        type Response = super::MsgUpdateParamsResponse;
2373                        type Future = BoxFuture<
2374                            tonic::Response<Self::Response>,
2375                            tonic::Status,
2376                        >;
2377                        fn call(
2378                            &mut self,
2379                            request: tonic::Request<super::MsgUpdateParams>,
2380                        ) -> Self::Future {
2381                            let inner = Arc::clone(&self.0);
2382                            let fut = async move {
2383                                <T as Msg>::update_params(&inner, request).await
2384                            };
2385                            Box::pin(fut)
2386                        }
2387                    }
2388                    let accept_compression_encodings = self.accept_compression_encodings;
2389                    let send_compression_encodings = self.send_compression_encodings;
2390                    let max_decoding_message_size = self.max_decoding_message_size;
2391                    let max_encoding_message_size = self.max_encoding_message_size;
2392                    let inner = self.inner.clone();
2393                    let fut = async move {
2394                        let method = UpdateParamsSvc(inner);
2395                        let codec = tonic::codec::ProstCodec::default();
2396                        let mut grpc = tonic::server::Grpc::new(codec)
2397                            .apply_compression_config(
2398                                accept_compression_encodings,
2399                                send_compression_encodings,
2400                            )
2401                            .apply_max_message_size_config(
2402                                max_decoding_message_size,
2403                                max_encoding_message_size,
2404                            );
2405                        let res = grpc.unary(method, req).await;
2406                        Ok(res)
2407                    };
2408                    Box::pin(fut)
2409                }
2410                "/interchain_security.ccv.provider.v1.Msg/OptIn" => {
2411                    #[allow(non_camel_case_types)]
2412                    struct OptInSvc<T: Msg>(pub Arc<T>);
2413                    impl<T: Msg> tonic::server::UnaryService<super::MsgOptIn>
2414                    for OptInSvc<T> {
2415                        type Response = super::MsgOptInResponse;
2416                        type Future = BoxFuture<
2417                            tonic::Response<Self::Response>,
2418                            tonic::Status,
2419                        >;
2420                        fn call(
2421                            &mut self,
2422                            request: tonic::Request<super::MsgOptIn>,
2423                        ) -> Self::Future {
2424                            let inner = Arc::clone(&self.0);
2425                            let fut = async move {
2426                                <T as Msg>::opt_in(&inner, request).await
2427                            };
2428                            Box::pin(fut)
2429                        }
2430                    }
2431                    let accept_compression_encodings = self.accept_compression_encodings;
2432                    let send_compression_encodings = self.send_compression_encodings;
2433                    let max_decoding_message_size = self.max_decoding_message_size;
2434                    let max_encoding_message_size = self.max_encoding_message_size;
2435                    let inner = self.inner.clone();
2436                    let fut = async move {
2437                        let method = OptInSvc(inner);
2438                        let codec = tonic::codec::ProstCodec::default();
2439                        let mut grpc = tonic::server::Grpc::new(codec)
2440                            .apply_compression_config(
2441                                accept_compression_encodings,
2442                                send_compression_encodings,
2443                            )
2444                            .apply_max_message_size_config(
2445                                max_decoding_message_size,
2446                                max_encoding_message_size,
2447                            );
2448                        let res = grpc.unary(method, req).await;
2449                        Ok(res)
2450                    };
2451                    Box::pin(fut)
2452                }
2453                "/interchain_security.ccv.provider.v1.Msg/OptOut" => {
2454                    #[allow(non_camel_case_types)]
2455                    struct OptOutSvc<T: Msg>(pub Arc<T>);
2456                    impl<T: Msg> tonic::server::UnaryService<super::MsgOptOut>
2457                    for OptOutSvc<T> {
2458                        type Response = super::MsgOptOutResponse;
2459                        type Future = BoxFuture<
2460                            tonic::Response<Self::Response>,
2461                            tonic::Status,
2462                        >;
2463                        fn call(
2464                            &mut self,
2465                            request: tonic::Request<super::MsgOptOut>,
2466                        ) -> Self::Future {
2467                            let inner = Arc::clone(&self.0);
2468                            let fut = async move {
2469                                <T as Msg>::opt_out(&inner, request).await
2470                            };
2471                            Box::pin(fut)
2472                        }
2473                    }
2474                    let accept_compression_encodings = self.accept_compression_encodings;
2475                    let send_compression_encodings = self.send_compression_encodings;
2476                    let max_decoding_message_size = self.max_decoding_message_size;
2477                    let max_encoding_message_size = self.max_encoding_message_size;
2478                    let inner = self.inner.clone();
2479                    let fut = async move {
2480                        let method = OptOutSvc(inner);
2481                        let codec = tonic::codec::ProstCodec::default();
2482                        let mut grpc = tonic::server::Grpc::new(codec)
2483                            .apply_compression_config(
2484                                accept_compression_encodings,
2485                                send_compression_encodings,
2486                            )
2487                            .apply_max_message_size_config(
2488                                max_decoding_message_size,
2489                                max_encoding_message_size,
2490                            );
2491                        let res = grpc.unary(method, req).await;
2492                        Ok(res)
2493                    };
2494                    Box::pin(fut)
2495                }
2496                "/interchain_security.ccv.provider.v1.Msg/SetConsumerCommissionRate" => {
2497                    #[allow(non_camel_case_types)]
2498                    struct SetConsumerCommissionRateSvc<T: Msg>(pub Arc<T>);
2499                    impl<
2500                        T: Msg,
2501                    > tonic::server::UnaryService<super::MsgSetConsumerCommissionRate>
2502                    for SetConsumerCommissionRateSvc<T> {
2503                        type Response = super::MsgSetConsumerCommissionRateResponse;
2504                        type Future = BoxFuture<
2505                            tonic::Response<Self::Response>,
2506                            tonic::Status,
2507                        >;
2508                        fn call(
2509                            &mut self,
2510                            request: tonic::Request<super::MsgSetConsumerCommissionRate>,
2511                        ) -> Self::Future {
2512                            let inner = Arc::clone(&self.0);
2513                            let fut = async move {
2514                                <T as Msg>::set_consumer_commission_rate(&inner, request)
2515                                    .await
2516                            };
2517                            Box::pin(fut)
2518                        }
2519                    }
2520                    let accept_compression_encodings = self.accept_compression_encodings;
2521                    let send_compression_encodings = self.send_compression_encodings;
2522                    let max_decoding_message_size = self.max_decoding_message_size;
2523                    let max_encoding_message_size = self.max_encoding_message_size;
2524                    let inner = self.inner.clone();
2525                    let fut = async move {
2526                        let method = SetConsumerCommissionRateSvc(inner);
2527                        let codec = tonic::codec::ProstCodec::default();
2528                        let mut grpc = tonic::server::Grpc::new(codec)
2529                            .apply_compression_config(
2530                                accept_compression_encodings,
2531                                send_compression_encodings,
2532                            )
2533                            .apply_max_message_size_config(
2534                                max_decoding_message_size,
2535                                max_encoding_message_size,
2536                            );
2537                        let res = grpc.unary(method, req).await;
2538                        Ok(res)
2539                    };
2540                    Box::pin(fut)
2541                }
2542                "/interchain_security.ccv.provider.v1.Msg/ChangeRewardDenoms" => {
2543                    #[allow(non_camel_case_types)]
2544                    struct ChangeRewardDenomsSvc<T: Msg>(pub Arc<T>);
2545                    impl<
2546                        T: Msg,
2547                    > tonic::server::UnaryService<super::MsgChangeRewardDenoms>
2548                    for ChangeRewardDenomsSvc<T> {
2549                        type Response = super::MsgChangeRewardDenomsResponse;
2550                        type Future = BoxFuture<
2551                            tonic::Response<Self::Response>,
2552                            tonic::Status,
2553                        >;
2554                        fn call(
2555                            &mut self,
2556                            request: tonic::Request<super::MsgChangeRewardDenoms>,
2557                        ) -> Self::Future {
2558                            let inner = Arc::clone(&self.0);
2559                            let fut = async move {
2560                                <T as Msg>::change_reward_denoms(&inner, request).await
2561                            };
2562                            Box::pin(fut)
2563                        }
2564                    }
2565                    let accept_compression_encodings = self.accept_compression_encodings;
2566                    let send_compression_encodings = self.send_compression_encodings;
2567                    let max_decoding_message_size = self.max_decoding_message_size;
2568                    let max_encoding_message_size = self.max_encoding_message_size;
2569                    let inner = self.inner.clone();
2570                    let fut = async move {
2571                        let method = ChangeRewardDenomsSvc(inner);
2572                        let codec = tonic::codec::ProstCodec::default();
2573                        let mut grpc = tonic::server::Grpc::new(codec)
2574                            .apply_compression_config(
2575                                accept_compression_encodings,
2576                                send_compression_encodings,
2577                            )
2578                            .apply_max_message_size_config(
2579                                max_decoding_message_size,
2580                                max_encoding_message_size,
2581                            );
2582                        let res = grpc.unary(method, req).await;
2583                        Ok(res)
2584                    };
2585                    Box::pin(fut)
2586                }
2587                _ => {
2588                    Box::pin(async move {
2589                        Ok(
2590                            http::Response::builder()
2591                                .status(200)
2592                                .header("grpc-status", tonic::Code::Unimplemented as i32)
2593                                .header(
2594                                    http::header::CONTENT_TYPE,
2595                                    tonic::metadata::GRPC_CONTENT_TYPE,
2596                                )
2597                                .body(empty_body())
2598                                .unwrap(),
2599                        )
2600                    })
2601                }
2602            }
2603        }
2604    }
2605    impl<T: Msg> Clone for MsgServer<T> {
2606        fn clone(&self) -> Self {
2607            let inner = self.inner.clone();
2608            Self {
2609                inner,
2610                accept_compression_encodings: self.accept_compression_encodings,
2611                send_compression_encodings: self.send_compression_encodings,
2612                max_decoding_message_size: self.max_decoding_message_size,
2613                max_encoding_message_size: self.max_encoding_message_size,
2614            }
2615        }
2616    }
2617    impl<T: Msg> tonic::server::NamedService for MsgServer<T> {
2618        const NAME: &'static str = "interchain_security.ccv.provider.v1.Msg";
2619    }
2620}
2621#[allow(clippy::derive_partial_eq_without_eq)]
2622#[derive(Clone, PartialEq, ::prost::Message)]
2623pub struct QueryConsumerGenesisRequest {
2624    #[prost(string, tag = "1")]
2625    pub consumer_id: ::prost::alloc::string::String,
2626}
2627impl ::prost::Name for QueryConsumerGenesisRequest {
2628    const NAME: &'static str = "QueryConsumerGenesisRequest";
2629    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2630    fn full_name() -> ::prost::alloc::string::String {
2631        "interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest".into()
2632    }
2633    fn type_url() -> ::prost::alloc::string::String {
2634        "/interchain_security.ccv.provider.v1.QueryConsumerGenesisRequest".into()
2635    }
2636}
2637#[allow(clippy::derive_partial_eq_without_eq)]
2638#[derive(Clone, PartialEq, ::prost::Message)]
2639pub struct QueryConsumerGenesisResponse {
2640    #[prost(message, optional, tag = "1")]
2641    pub genesis_state: ::core::option::Option<super::super::v1::ConsumerGenesisState>,
2642}
2643impl ::prost::Name for QueryConsumerGenesisResponse {
2644    const NAME: &'static str = "QueryConsumerGenesisResponse";
2645    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2646    fn full_name() -> ::prost::alloc::string::String {
2647        "interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse".into()
2648    }
2649    fn type_url() -> ::prost::alloc::string::String {
2650        "/interchain_security.ccv.provider.v1.QueryConsumerGenesisResponse".into()
2651    }
2652}
2653#[allow(clippy::derive_partial_eq_without_eq)]
2654#[derive(Clone, PartialEq, ::prost::Message)]
2655pub struct QueryConsumerChainsRequest {
2656    /// The phase of the consumer chains returned (optional)
2657    /// Registered=1|Initialized=2|Launched=3|Stopped=4|Deleted=5
2658    #[prost(enumeration = "ConsumerPhase", tag = "1")]
2659    pub phase: i32,
2660    #[prost(message, optional, tag = "2")]
2661    pub pagination: ::core::option::Option<
2662        super::super::super::super::cosmos::base::query::v1beta1::PageRequest,
2663    >,
2664}
2665impl ::prost::Name for QueryConsumerChainsRequest {
2666    const NAME: &'static str = "QueryConsumerChainsRequest";
2667    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2668    fn full_name() -> ::prost::alloc::string::String {
2669        "interchain_security.ccv.provider.v1.QueryConsumerChainsRequest".into()
2670    }
2671    fn type_url() -> ::prost::alloc::string::String {
2672        "/interchain_security.ccv.provider.v1.QueryConsumerChainsRequest".into()
2673    }
2674}
2675#[allow(clippy::derive_partial_eq_without_eq)]
2676#[derive(Clone, PartialEq, ::prost::Message)]
2677pub struct QueryConsumerChainsResponse {
2678    #[prost(message, repeated, tag = "1")]
2679    pub chains: ::prost::alloc::vec::Vec<Chain>,
2680    #[prost(message, optional, tag = "2")]
2681    pub pagination: ::core::option::Option<
2682        super::super::super::super::cosmos::base::query::v1beta1::PageResponse,
2683    >,
2684}
2685impl ::prost::Name for QueryConsumerChainsResponse {
2686    const NAME: &'static str = "QueryConsumerChainsResponse";
2687    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2688    fn full_name() -> ::prost::alloc::string::String {
2689        "interchain_security.ccv.provider.v1.QueryConsumerChainsResponse".into()
2690    }
2691    fn type_url() -> ::prost::alloc::string::String {
2692        "/interchain_security.ccv.provider.v1.QueryConsumerChainsResponse".into()
2693    }
2694}
2695#[allow(clippy::derive_partial_eq_without_eq)]
2696#[derive(Clone, PartialEq, ::prost::Message)]
2697pub struct Chain {
2698    #[prost(string, tag = "1")]
2699    pub chain_id: ::prost::alloc::string::String,
2700    #[prost(string, tag = "2")]
2701    pub client_id: ::prost::alloc::string::String,
2702    #[prost(uint32, tag = "3")]
2703    pub top_n: u32,
2704    /// If the chain is a Top-N chain, this is the minimum power required to be in the top N.
2705    /// Otherwise, this is -1.
2706    #[prost(int64, tag = "4")]
2707    pub min_power_in_top_n: i64,
2708    /// Corresponds to the maximum power (percentage-wise) a validator can have on the consumer chain.
2709    #[prost(uint32, tag = "5")]
2710    pub validators_power_cap: u32,
2711    /// Corresponds to the maximum number of validators that can validate a consumer chain.
2712    /// Only applicable to Opt In chains. Setting `validator_set_cap` on a Top N chain is a no-op.
2713    #[prost(uint32, tag = "6")]
2714    pub validator_set_cap: u32,
2715    /// Corresponds to a list of provider consensus addresses of validators that are the ONLY ones that can validate
2716    /// the consumer chain.
2717    #[prost(string, repeated, tag = "7")]
2718    pub allowlist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
2719    /// Corresponds to a list of provider consensus addresses of validators that CANNOT validate the consumer chain.
2720    #[prost(string, repeated, tag = "8")]
2721    pub denylist: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
2722    /// The phase the consumer chain
2723    #[prost(string, tag = "9")]
2724    pub phase: ::prost::alloc::string::String,
2725    /// The metadata of the consumer chain
2726    #[prost(message, optional, tag = "10")]
2727    pub metadata: ::core::option::Option<ConsumerMetadata>,
2728    /// Corresponds to the minimal amount of (provider chain) stake required to validate on the consumer chain.
2729    #[prost(uint64, tag = "11")]
2730    pub min_stake: u64,
2731    /// Corresponds to whether inactive validators are allowed to validate the consumer chain.
2732    #[prost(bool, tag = "12")]
2733    pub allow_inactive_vals: bool,
2734    #[prost(string, tag = "13")]
2735    pub consumer_id: ::prost::alloc::string::String,
2736}
2737impl ::prost::Name for Chain {
2738    const NAME: &'static str = "Chain";
2739    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2740    fn full_name() -> ::prost::alloc::string::String {
2741        "interchain_security.ccv.provider.v1.Chain".into()
2742    }
2743    fn type_url() -> ::prost::alloc::string::String {
2744        "/interchain_security.ccv.provider.v1.Chain".into()
2745    }
2746}
2747#[allow(clippy::derive_partial_eq_without_eq)]
2748#[derive(Clone, PartialEq, ::prost::Message)]
2749pub struct QueryValidatorConsumerAddrRequest {
2750    /// The consensus address of the validator on the provider chain
2751    #[prost(string, tag = "1")]
2752    pub provider_address: ::prost::alloc::string::String,
2753    /// The id of the consumer chain
2754    #[prost(string, tag = "2")]
2755    pub consumer_id: ::prost::alloc::string::String,
2756}
2757impl ::prost::Name for QueryValidatorConsumerAddrRequest {
2758    const NAME: &'static str = "QueryValidatorConsumerAddrRequest";
2759    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2760    fn full_name() -> ::prost::alloc::string::String {
2761        "interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrRequest".into()
2762    }
2763    fn type_url() -> ::prost::alloc::string::String {
2764        "/interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrRequest".into()
2765    }
2766}
2767#[allow(clippy::derive_partial_eq_without_eq)]
2768#[derive(Clone, PartialEq, ::prost::Message)]
2769pub struct QueryValidatorConsumerAddrResponse {
2770    /// The address of the validator on the consumer chain
2771    #[prost(string, tag = "1")]
2772    pub consumer_address: ::prost::alloc::string::String,
2773}
2774impl ::prost::Name for QueryValidatorConsumerAddrResponse {
2775    const NAME: &'static str = "QueryValidatorConsumerAddrResponse";
2776    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2777    fn full_name() -> ::prost::alloc::string::String {
2778        "interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrResponse".into()
2779    }
2780    fn type_url() -> ::prost::alloc::string::String {
2781        "/interchain_security.ccv.provider.v1.QueryValidatorConsumerAddrResponse".into()
2782    }
2783}
2784#[allow(clippy::derive_partial_eq_without_eq)]
2785#[derive(Clone, PartialEq, ::prost::Message)]
2786pub struct QueryValidatorProviderAddrRequest {
2787    /// The consensus address of the validator on the consumer chain
2788    #[prost(string, tag = "1")]
2789    pub consumer_address: ::prost::alloc::string::String,
2790    /// The id of the consumer chain
2791    #[prost(string, tag = "2")]
2792    pub consumer_id: ::prost::alloc::string::String,
2793}
2794impl ::prost::Name for QueryValidatorProviderAddrRequest {
2795    const NAME: &'static str = "QueryValidatorProviderAddrRequest";
2796    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2797    fn full_name() -> ::prost::alloc::string::String {
2798        "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrRequest".into()
2799    }
2800    fn type_url() -> ::prost::alloc::string::String {
2801        "/interchain_security.ccv.provider.v1.QueryValidatorProviderAddrRequest".into()
2802    }
2803}
2804#[allow(clippy::derive_partial_eq_without_eq)]
2805#[derive(Clone, PartialEq, ::prost::Message)]
2806pub struct QueryValidatorProviderAddrResponse {
2807    /// The address of the validator on the provider chain
2808    #[prost(string, tag = "1")]
2809    pub provider_address: ::prost::alloc::string::String,
2810}
2811impl ::prost::Name for QueryValidatorProviderAddrResponse {
2812    const NAME: &'static str = "QueryValidatorProviderAddrResponse";
2813    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2814    fn full_name() -> ::prost::alloc::string::String {
2815        "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse".into()
2816    }
2817    fn type_url() -> ::prost::alloc::string::String {
2818        "/interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse".into()
2819    }
2820}
2821#[allow(clippy::derive_partial_eq_without_eq)]
2822#[derive(Clone, Copy, PartialEq, ::prost::Message)]
2823pub struct QueryThrottleStateRequest {}
2824impl ::prost::Name for QueryThrottleStateRequest {
2825    const NAME: &'static str = "QueryThrottleStateRequest";
2826    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2827    fn full_name() -> ::prost::alloc::string::String {
2828        "interchain_security.ccv.provider.v1.QueryThrottleStateRequest".into()
2829    }
2830    fn type_url() -> ::prost::alloc::string::String {
2831        "/interchain_security.ccv.provider.v1.QueryThrottleStateRequest".into()
2832    }
2833}
2834#[allow(clippy::derive_partial_eq_without_eq)]
2835#[derive(Clone, Copy, PartialEq, ::prost::Message)]
2836pub struct QueryThrottleStateResponse {
2837    /// current slash_meter state
2838    #[prost(int64, tag = "1")]
2839    pub slash_meter: i64,
2840    /// allowance of voting power units (int) that the slash meter is given per
2841    /// replenish period this also serves as the max value for the meter.
2842    #[prost(int64, tag = "2")]
2843    pub slash_meter_allowance: i64,
2844    /// next time the slash meter could potentially be replenished, iff it's not
2845    /// full
2846    #[prost(message, optional, tag = "3")]
2847    pub next_replenish_candidate: ::core::option::Option<
2848        ::tendermint_proto::google::protobuf::Timestamp,
2849    >,
2850}
2851impl ::prost::Name for QueryThrottleStateResponse {
2852    const NAME: &'static str = "QueryThrottleStateResponse";
2853    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2854    fn full_name() -> ::prost::alloc::string::String {
2855        "interchain_security.ccv.provider.v1.QueryThrottleStateResponse".into()
2856    }
2857    fn type_url() -> ::prost::alloc::string::String {
2858        "/interchain_security.ccv.provider.v1.QueryThrottleStateResponse".into()
2859    }
2860}
2861#[allow(clippy::derive_partial_eq_without_eq)]
2862#[derive(Clone, Copy, PartialEq, ::prost::Message)]
2863pub struct QueryRegisteredConsumerRewardDenomsRequest {}
2864impl ::prost::Name for QueryRegisteredConsumerRewardDenomsRequest {
2865    const NAME: &'static str = "QueryRegisteredConsumerRewardDenomsRequest";
2866    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2867    fn full_name() -> ::prost::alloc::string::String {
2868        "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest"
2869            .into()
2870    }
2871    fn type_url() -> ::prost::alloc::string::String {
2872        "/interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest"
2873            .into()
2874    }
2875}
2876#[allow(clippy::derive_partial_eq_without_eq)]
2877#[derive(Clone, PartialEq, ::prost::Message)]
2878pub struct QueryRegisteredConsumerRewardDenomsResponse {
2879    #[prost(string, repeated, tag = "1")]
2880    pub denoms: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
2881}
2882impl ::prost::Name for QueryRegisteredConsumerRewardDenomsResponse {
2883    const NAME: &'static str = "QueryRegisteredConsumerRewardDenomsResponse";
2884    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2885    fn full_name() -> ::prost::alloc::string::String {
2886        "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse"
2887            .into()
2888    }
2889    fn type_url() -> ::prost::alloc::string::String {
2890        "/interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse"
2891            .into()
2892    }
2893}
2894#[allow(clippy::derive_partial_eq_without_eq)]
2895#[derive(Clone, PartialEq, ::prost::Message)]
2896pub struct QueryAllPairsValConsAddrByConsumerRequest {
2897    /// The id of the consumer chain
2898    #[prost(string, tag = "1")]
2899    pub consumer_id: ::prost::alloc::string::String,
2900}
2901impl ::prost::Name for QueryAllPairsValConsAddrByConsumerRequest {
2902    const NAME: &'static str = "QueryAllPairsValConsAddrByConsumerRequest";
2903    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2904    fn full_name() -> ::prost::alloc::string::String {
2905        "interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerRequest"
2906            .into()
2907    }
2908    fn type_url() -> ::prost::alloc::string::String {
2909        "/interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerRequest"
2910            .into()
2911    }
2912}
2913#[allow(clippy::derive_partial_eq_without_eq)]
2914#[derive(Clone, PartialEq, ::prost::Message)]
2915pub struct QueryAllPairsValConsAddrByConsumerResponse {
2916    #[prost(message, repeated, tag = "1")]
2917    pub pair_val_con_addr: ::prost::alloc::vec::Vec<PairValConAddrProviderAndConsumer>,
2918}
2919impl ::prost::Name for QueryAllPairsValConsAddrByConsumerResponse {
2920    const NAME: &'static str = "QueryAllPairsValConsAddrByConsumerResponse";
2921    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2922    fn full_name() -> ::prost::alloc::string::String {
2923        "interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerResponse"
2924            .into()
2925    }
2926    fn type_url() -> ::prost::alloc::string::String {
2927        "/interchain_security.ccv.provider.v1.QueryAllPairsValConsAddrByConsumerResponse"
2928            .into()
2929    }
2930}
2931#[allow(clippy::derive_partial_eq_without_eq)]
2932#[derive(Clone, PartialEq, ::prost::Message)]
2933pub struct PairValConAddrProviderAndConsumer {
2934    /// The consensus address of the validator on the provider chain
2935    #[prost(string, tag = "1")]
2936    pub provider_address: ::prost::alloc::string::String,
2937    /// The consensus address of the validator on the consumer chain
2938    #[prost(string, tag = "2")]
2939    pub consumer_address: ::prost::alloc::string::String,
2940    #[prost(message, optional, tag = "3")]
2941    pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>,
2942}
2943impl ::prost::Name for PairValConAddrProviderAndConsumer {
2944    const NAME: &'static str = "PairValConAddrProviderAndConsumer";
2945    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2946    fn full_name() -> ::prost::alloc::string::String {
2947        "interchain_security.ccv.provider.v1.PairValConAddrProviderAndConsumer".into()
2948    }
2949    fn type_url() -> ::prost::alloc::string::String {
2950        "/interchain_security.ccv.provider.v1.PairValConAddrProviderAndConsumer".into()
2951    }
2952}
2953#[allow(clippy::derive_partial_eq_without_eq)]
2954#[derive(Clone, Copy, PartialEq, ::prost::Message)]
2955pub struct QueryParamsRequest {}
2956impl ::prost::Name for QueryParamsRequest {
2957    const NAME: &'static str = "QueryParamsRequest";
2958    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2959    fn full_name() -> ::prost::alloc::string::String {
2960        "interchain_security.ccv.provider.v1.QueryParamsRequest".into()
2961    }
2962    fn type_url() -> ::prost::alloc::string::String {
2963        "/interchain_security.ccv.provider.v1.QueryParamsRequest".into()
2964    }
2965}
2966#[allow(clippy::derive_partial_eq_without_eq)]
2967#[derive(Clone, PartialEq, ::prost::Message)]
2968pub struct QueryParamsResponse {
2969    #[prost(message, optional, tag = "1")]
2970    pub params: ::core::option::Option<Params>,
2971}
2972impl ::prost::Name for QueryParamsResponse {
2973    const NAME: &'static str = "QueryParamsResponse";
2974    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2975    fn full_name() -> ::prost::alloc::string::String {
2976        "interchain_security.ccv.provider.v1.QueryParamsResponse".into()
2977    }
2978    fn type_url() -> ::prost::alloc::string::String {
2979        "/interchain_security.ccv.provider.v1.QueryParamsResponse".into()
2980    }
2981}
2982#[allow(clippy::derive_partial_eq_without_eq)]
2983#[derive(Clone, PartialEq, ::prost::Message)]
2984pub struct QueryConsumerChainOptedInValidatorsRequest {
2985    #[prost(string, tag = "1")]
2986    pub consumer_id: ::prost::alloc::string::String,
2987}
2988impl ::prost::Name for QueryConsumerChainOptedInValidatorsRequest {
2989    const NAME: &'static str = "QueryConsumerChainOptedInValidatorsRequest";
2990    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
2991    fn full_name() -> ::prost::alloc::string::String {
2992        "interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsRequest"
2993            .into()
2994    }
2995    fn type_url() -> ::prost::alloc::string::String {
2996        "/interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsRequest"
2997            .into()
2998    }
2999}
3000#[allow(clippy::derive_partial_eq_without_eq)]
3001#[derive(Clone, PartialEq, ::prost::Message)]
3002pub struct QueryConsumerChainOptedInValidatorsResponse {
3003    /// The consensus addresses of the validators on the provider chain
3004    #[prost(string, repeated, tag = "1")]
3005    pub validators_provider_addresses: ::prost::alloc::vec::Vec<
3006        ::prost::alloc::string::String,
3007    >,
3008}
3009impl ::prost::Name for QueryConsumerChainOptedInValidatorsResponse {
3010    const NAME: &'static str = "QueryConsumerChainOptedInValidatorsResponse";
3011    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3012    fn full_name() -> ::prost::alloc::string::String {
3013        "interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsResponse"
3014            .into()
3015    }
3016    fn type_url() -> ::prost::alloc::string::String {
3017        "/interchain_security.ccv.provider.v1.QueryConsumerChainOptedInValidatorsResponse"
3018            .into()
3019    }
3020}
3021#[allow(clippy::derive_partial_eq_without_eq)]
3022#[derive(Clone, PartialEq, ::prost::Message)]
3023pub struct QueryConsumerValidatorsRequest {
3024    #[prost(string, tag = "1")]
3025    pub consumer_id: ::prost::alloc::string::String,
3026}
3027impl ::prost::Name for QueryConsumerValidatorsRequest {
3028    const NAME: &'static str = "QueryConsumerValidatorsRequest";
3029    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3030    fn full_name() -> ::prost::alloc::string::String {
3031        "interchain_security.ccv.provider.v1.QueryConsumerValidatorsRequest".into()
3032    }
3033    fn type_url() -> ::prost::alloc::string::String {
3034        "/interchain_security.ccv.provider.v1.QueryConsumerValidatorsRequest".into()
3035    }
3036}
3037#[allow(clippy::derive_partial_eq_without_eq)]
3038#[derive(Clone, PartialEq, ::prost::Message)]
3039pub struct QueryConsumerValidatorsValidator {
3040    /// The consensus address of the validator on the provider chain
3041    #[prost(string, tag = "1")]
3042    pub provider_address: ::prost::alloc::string::String,
3043    /// The consumer public key of the validator used on the consumer chain
3044    #[prost(message, optional, tag = "2")]
3045    pub consumer_key: ::core::option::Option<::tendermint_proto::crypto::PublicKey>,
3046    /// \[DEPRECATED\] use `consumer_power` instead
3047    #[deprecated]
3048    #[prost(int64, tag = "3")]
3049    pub power: i64,
3050    /// \[DEPRECATED\] use `consumer_commission_rate` instead
3051    #[deprecated]
3052    #[prost(string, tag = "4")]
3053    pub rate: ::prost::alloc::string::String,
3054    /// The power of the validator used on the consumer chain
3055    #[prost(int64, tag = "5")]
3056    pub consumer_power: i64,
3057    /// The rate to charge delegators on the consumer chain, as a fraction
3058    #[prost(string, tag = "6")]
3059    pub consumer_commission_rate: ::prost::alloc::string::String,
3060    /// The rate to charge delegators on the provider chain, as a fraction
3061    #[prost(string, tag = "7")]
3062    pub provider_commission_rate: ::prost::alloc::string::String,
3063    /// description defines the description terms for the validator
3064    #[prost(message, optional, tag = "8")]
3065    pub description: ::core::option::Option<
3066        super::super::super::super::cosmos::staking::v1beta1::Description,
3067    >,
3068    /// provider_operator_address defines the address of the validator's operator
3069    #[prost(string, tag = "9")]
3070    pub provider_operator_address: ::prost::alloc::string::String,
3071    /// jailed defined whether the validator has been jailed from bonded status or not.
3072    #[prost(bool, tag = "10")]
3073    pub jailed: bool,
3074    /// status is the validator status (bonded/unbonding/unbonded).
3075    #[prost(
3076        enumeration = "super::super::super::super::cosmos::staking::v1beta1::BondStatus",
3077        tag = "11"
3078    )]
3079    pub status: i32,
3080    /// provider_tokens defines the delegated tokens (incl. self-delegation).
3081    #[prost(string, tag = "12")]
3082    pub provider_tokens: ::prost::alloc::string::String,
3083    /// The power of the validator used on the provider chain
3084    #[prost(int64, tag = "13")]
3085    pub provider_power: i64,
3086    /// validates_current_epoch defines whether the validator has to validate for the current epoch or not
3087    #[prost(bool, tag = "14")]
3088    pub validates_current_epoch: bool,
3089}
3090impl ::prost::Name for QueryConsumerValidatorsValidator {
3091    const NAME: &'static str = "QueryConsumerValidatorsValidator";
3092    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3093    fn full_name() -> ::prost::alloc::string::String {
3094        "interchain_security.ccv.provider.v1.QueryConsumerValidatorsValidator".into()
3095    }
3096    fn type_url() -> ::prost::alloc::string::String {
3097        "/interchain_security.ccv.provider.v1.QueryConsumerValidatorsValidator".into()
3098    }
3099}
3100#[allow(clippy::derive_partial_eq_without_eq)]
3101#[derive(Clone, PartialEq, ::prost::Message)]
3102pub struct QueryConsumerValidatorsResponse {
3103    #[prost(message, repeated, tag = "1")]
3104    pub validators: ::prost::alloc::vec::Vec<QueryConsumerValidatorsValidator>,
3105}
3106impl ::prost::Name for QueryConsumerValidatorsResponse {
3107    const NAME: &'static str = "QueryConsumerValidatorsResponse";
3108    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3109    fn full_name() -> ::prost::alloc::string::String {
3110        "interchain_security.ccv.provider.v1.QueryConsumerValidatorsResponse".into()
3111    }
3112    fn type_url() -> ::prost::alloc::string::String {
3113        "/interchain_security.ccv.provider.v1.QueryConsumerValidatorsResponse".into()
3114    }
3115}
3116#[allow(clippy::derive_partial_eq_without_eq)]
3117#[derive(Clone, PartialEq, ::prost::Message)]
3118pub struct QueryConsumerChainsValidatorHasToValidateRequest {
3119    /// The consensus address of the validator on the provider chain
3120    #[prost(string, tag = "1")]
3121    pub provider_address: ::prost::alloc::string::String,
3122}
3123impl ::prost::Name for QueryConsumerChainsValidatorHasToValidateRequest {
3124    const NAME: &'static str = "QueryConsumerChainsValidatorHasToValidateRequest";
3125    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3126    fn full_name() -> ::prost::alloc::string::String {
3127        "interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateRequest"
3128            .into()
3129    }
3130    fn type_url() -> ::prost::alloc::string::String {
3131        "/interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateRequest"
3132            .into()
3133    }
3134}
3135#[allow(clippy::derive_partial_eq_without_eq)]
3136#[derive(Clone, PartialEq, ::prost::Message)]
3137pub struct QueryConsumerChainsValidatorHasToValidateResponse {
3138    #[prost(string, repeated, tag = "1")]
3139    pub consumer_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
3140}
3141impl ::prost::Name for QueryConsumerChainsValidatorHasToValidateResponse {
3142    const NAME: &'static str = "QueryConsumerChainsValidatorHasToValidateResponse";
3143    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3144    fn full_name() -> ::prost::alloc::string::String {
3145        "interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateResponse"
3146            .into()
3147    }
3148    fn type_url() -> ::prost::alloc::string::String {
3149        "/interchain_security.ccv.provider.v1.QueryConsumerChainsValidatorHasToValidateResponse"
3150            .into()
3151    }
3152}
3153#[allow(clippy::derive_partial_eq_without_eq)]
3154#[derive(Clone, PartialEq, ::prost::Message)]
3155pub struct QueryValidatorConsumerCommissionRateRequest {
3156    #[prost(string, tag = "1")]
3157    pub consumer_id: ::prost::alloc::string::String,
3158    /// The consensus address of the validator on the provider chain
3159    #[prost(string, tag = "2")]
3160    pub provider_address: ::prost::alloc::string::String,
3161}
3162impl ::prost::Name for QueryValidatorConsumerCommissionRateRequest {
3163    const NAME: &'static str = "QueryValidatorConsumerCommissionRateRequest";
3164    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3165    fn full_name() -> ::prost::alloc::string::String {
3166        "interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateRequest"
3167            .into()
3168    }
3169    fn type_url() -> ::prost::alloc::string::String {
3170        "/interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateRequest"
3171            .into()
3172    }
3173}
3174#[allow(clippy::derive_partial_eq_without_eq)]
3175#[derive(Clone, PartialEq, ::prost::Message)]
3176pub struct QueryValidatorConsumerCommissionRateResponse {
3177    /// The rate to charge delegators on the consumer chain, as a fraction
3178    #[prost(string, tag = "1")]
3179    pub rate: ::prost::alloc::string::String,
3180}
3181impl ::prost::Name for QueryValidatorConsumerCommissionRateResponse {
3182    const NAME: &'static str = "QueryValidatorConsumerCommissionRateResponse";
3183    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3184    fn full_name() -> ::prost::alloc::string::String {
3185        "interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateResponse"
3186            .into()
3187    }
3188    fn type_url() -> ::prost::alloc::string::String {
3189        "/interchain_security.ccv.provider.v1.QueryValidatorConsumerCommissionRateResponse"
3190            .into()
3191    }
3192}
3193#[allow(clippy::derive_partial_eq_without_eq)]
3194#[derive(Clone, Copy, PartialEq, ::prost::Message)]
3195pub struct QueryBlocksUntilNextEpochRequest {}
3196impl ::prost::Name for QueryBlocksUntilNextEpochRequest {
3197    const NAME: &'static str = "QueryBlocksUntilNextEpochRequest";
3198    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3199    fn full_name() -> ::prost::alloc::string::String {
3200        "interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochRequest".into()
3201    }
3202    fn type_url() -> ::prost::alloc::string::String {
3203        "/interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochRequest".into()
3204    }
3205}
3206#[allow(clippy::derive_partial_eq_without_eq)]
3207#[derive(Clone, Copy, PartialEq, ::prost::Message)]
3208pub struct QueryBlocksUntilNextEpochResponse {
3209    /// The number of blocks until the next epoch starts
3210    #[prost(uint64, tag = "1")]
3211    pub blocks_until_next_epoch: u64,
3212}
3213impl ::prost::Name for QueryBlocksUntilNextEpochResponse {
3214    const NAME: &'static str = "QueryBlocksUntilNextEpochResponse";
3215    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3216    fn full_name() -> ::prost::alloc::string::String {
3217        "interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochResponse".into()
3218    }
3219    fn type_url() -> ::prost::alloc::string::String {
3220        "/interchain_security.ccv.provider.v1.QueryBlocksUntilNextEpochResponse".into()
3221    }
3222}
3223#[allow(clippy::derive_partial_eq_without_eq)]
3224#[derive(Clone, PartialEq, ::prost::Message)]
3225pub struct QueryConsumerIdFromClientIdRequest {
3226    /// the client id (on the provider) that is tracking the consumer chain
3227    /// the client id can be found from the consumer chain by querying (i.e., `query ccvconsumer provider-info`)
3228    #[prost(string, tag = "1")]
3229    pub client_id: ::prost::alloc::string::String,
3230}
3231impl ::prost::Name for QueryConsumerIdFromClientIdRequest {
3232    const NAME: &'static str = "QueryConsumerIdFromClientIdRequest";
3233    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3234    fn full_name() -> ::prost::alloc::string::String {
3235        "interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdRequest".into()
3236    }
3237    fn type_url() -> ::prost::alloc::string::String {
3238        "/interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdRequest".into()
3239    }
3240}
3241#[allow(clippy::derive_partial_eq_without_eq)]
3242#[derive(Clone, PartialEq, ::prost::Message)]
3243pub struct QueryConsumerIdFromClientIdResponse {
3244    /// the consumer id of the chain associated with this client id
3245    #[prost(string, tag = "1")]
3246    pub consumer_id: ::prost::alloc::string::String,
3247}
3248impl ::prost::Name for QueryConsumerIdFromClientIdResponse {
3249    const NAME: &'static str = "QueryConsumerIdFromClientIdResponse";
3250    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3251    fn full_name() -> ::prost::alloc::string::String {
3252        "interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdResponse".into()
3253    }
3254    fn type_url() -> ::prost::alloc::string::String {
3255        "/interchain_security.ccv.provider.v1.QueryConsumerIdFromClientIdResponse".into()
3256    }
3257}
3258#[allow(clippy::derive_partial_eq_without_eq)]
3259#[derive(Clone, PartialEq, ::prost::Message)]
3260pub struct QueryConsumerChainRequest {
3261    #[prost(string, tag = "1")]
3262    pub consumer_id: ::prost::alloc::string::String,
3263}
3264impl ::prost::Name for QueryConsumerChainRequest {
3265    const NAME: &'static str = "QueryConsumerChainRequest";
3266    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3267    fn full_name() -> ::prost::alloc::string::String {
3268        "interchain_security.ccv.provider.v1.QueryConsumerChainRequest".into()
3269    }
3270    fn type_url() -> ::prost::alloc::string::String {
3271        "/interchain_security.ccv.provider.v1.QueryConsumerChainRequest".into()
3272    }
3273}
3274#[allow(clippy::derive_partial_eq_without_eq)]
3275#[derive(Clone, PartialEq, ::prost::Message)]
3276pub struct QueryConsumerChainResponse {
3277    #[prost(string, tag = "1")]
3278    pub consumer_id: ::prost::alloc::string::String,
3279    #[prost(string, tag = "2")]
3280    pub chain_id: ::prost::alloc::string::String,
3281    #[prost(string, tag = "3")]
3282    pub owner_address: ::prost::alloc::string::String,
3283    #[prost(string, tag = "4")]
3284    pub phase: ::prost::alloc::string::String,
3285    #[prost(message, optional, tag = "5")]
3286    pub metadata: ::core::option::Option<ConsumerMetadata>,
3287    #[prost(message, optional, tag = "6")]
3288    pub init_params: ::core::option::Option<ConsumerInitializationParameters>,
3289    #[prost(message, optional, tag = "7")]
3290    pub power_shaping_params: ::core::option::Option<PowerShapingParameters>,
3291}
3292impl ::prost::Name for QueryConsumerChainResponse {
3293    const NAME: &'static str = "QueryConsumerChainResponse";
3294    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
3295    fn full_name() -> ::prost::alloc::string::String {
3296        "interchain_security.ccv.provider.v1.QueryConsumerChainResponse".into()
3297    }
3298    fn type_url() -> ::prost::alloc::string::String {
3299        "/interchain_security.ccv.provider.v1.QueryConsumerChainResponse".into()
3300    }
3301}
3302/// Generated client implementations.
3303#[cfg(feature = "client")]
3304pub mod query_client {
3305    #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
3306    use tonic::codegen::*;
3307    use tonic::codegen::http::Uri;
3308    #[derive(Debug, Clone)]
3309    pub struct QueryClient<T> {
3310        inner: tonic::client::Grpc<T>,
3311    }
3312    #[cfg(feature = "transport")]
3313    impl QueryClient<tonic::transport::Channel> {
3314        /// Attempt to create a new client by connecting to a given endpoint.
3315        pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
3316        where
3317            D: TryInto<tonic::transport::Endpoint>,
3318            D::Error: Into<StdError>,
3319        {
3320            let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
3321            Ok(Self::new(conn))
3322        }
3323    }
3324    impl<T> QueryClient<T>
3325    where
3326        T: tonic::client::GrpcService<tonic::body::BoxBody>,
3327        T::Error: Into<StdError>,
3328        T::ResponseBody: Body<Data = Bytes> + Send + 'static,
3329        <T::ResponseBody as Body>::Error: Into<StdError> + Send,
3330    {
3331        pub fn new(inner: T) -> Self {
3332            let inner = tonic::client::Grpc::new(inner);
3333            Self { inner }
3334        }
3335        pub fn with_origin(inner: T, origin: Uri) -> Self {
3336            let inner = tonic::client::Grpc::with_origin(inner, origin);
3337            Self { inner }
3338        }
3339        pub fn with_interceptor<F>(
3340            inner: T,
3341            interceptor: F,
3342        ) -> QueryClient<InterceptedService<T, F>>
3343        where
3344            F: tonic::service::Interceptor,
3345            T::ResponseBody: Default,
3346            T: tonic::codegen::Service<
3347                http::Request<tonic::body::BoxBody>,
3348                Response = http::Response<
3349                    <T as tonic::client::GrpcService<tonic::body::BoxBody>>::ResponseBody,
3350                >,
3351            >,
3352            <T as tonic::codegen::Service<
3353                http::Request<tonic::body::BoxBody>,
3354            >>::Error: Into<StdError> + Send + Sync,
3355        {
3356            QueryClient::new(InterceptedService::new(inner, interceptor))
3357        }
3358        /// Compress requests with the given encoding.
3359        ///
3360        /// This requires the server to support it otherwise it might respond with an
3361        /// error.
3362        #[must_use]
3363        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
3364            self.inner = self.inner.send_compressed(encoding);
3365            self
3366        }
3367        /// Enable decompressing responses.
3368        #[must_use]
3369        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
3370            self.inner = self.inner.accept_compressed(encoding);
3371            self
3372        }
3373        /// Limits the maximum size of a decoded message.
3374        ///
3375        /// Default: `4MB`
3376        #[must_use]
3377        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
3378            self.inner = self.inner.max_decoding_message_size(limit);
3379            self
3380        }
3381        /// Limits the maximum size of an encoded message.
3382        ///
3383        /// Default: `usize::MAX`
3384        #[must_use]
3385        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
3386            self.inner = self.inner.max_encoding_message_size(limit);
3387            self
3388        }
3389        /// ConsumerGenesis queries the genesis state needed to start a consumer chain
3390        /// whose proposal has been accepted
3391        pub async fn query_consumer_genesis(
3392            &mut self,
3393            request: impl tonic::IntoRequest<super::QueryConsumerGenesisRequest>,
3394        ) -> std::result::Result<
3395            tonic::Response<super::QueryConsumerGenesisResponse>,
3396            tonic::Status,
3397        > {
3398            self.inner
3399                .ready()
3400                .await
3401                .map_err(|e| {
3402                    tonic::Status::new(
3403                        tonic::Code::Unknown,
3404                        format!("Service was not ready: {}", e.into()),
3405                    )
3406                })?;
3407            let codec = tonic::codec::ProstCodec::default();
3408            let path = http::uri::PathAndQuery::from_static(
3409                "/interchain_security.ccv.provider.v1.Query/QueryConsumerGenesis",
3410            );
3411            let mut req = request.into_request();
3412            req.extensions_mut()
3413                .insert(
3414                    GrpcMethod::new(
3415                        "interchain_security.ccv.provider.v1.Query",
3416                        "QueryConsumerGenesis",
3417                    ),
3418                );
3419            self.inner.unary(req, path, codec).await
3420        }
3421        /// ConsumerChains queries active consumer chains supported by the provider
3422        /// chain
3423        pub async fn query_consumer_chains(
3424            &mut self,
3425            request: impl tonic::IntoRequest<super::QueryConsumerChainsRequest>,
3426        ) -> std::result::Result<
3427            tonic::Response<super::QueryConsumerChainsResponse>,
3428            tonic::Status,
3429        > {
3430            self.inner
3431                .ready()
3432                .await
3433                .map_err(|e| {
3434                    tonic::Status::new(
3435                        tonic::Code::Unknown,
3436                        format!("Service was not ready: {}", e.into()),
3437                    )
3438                })?;
3439            let codec = tonic::codec::ProstCodec::default();
3440            let path = http::uri::PathAndQuery::from_static(
3441                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChains",
3442            );
3443            let mut req = request.into_request();
3444            req.extensions_mut()
3445                .insert(
3446                    GrpcMethod::new(
3447                        "interchain_security.ccv.provider.v1.Query",
3448                        "QueryConsumerChains",
3449                    ),
3450                );
3451            self.inner.unary(req, path, codec).await
3452        }
3453        /// QueryValidatorConsumerAddr queries the address
3454        /// assigned by a validator for a consumer chain.
3455        pub async fn query_validator_consumer_addr(
3456            &mut self,
3457            request: impl tonic::IntoRequest<super::QueryValidatorConsumerAddrRequest>,
3458        ) -> std::result::Result<
3459            tonic::Response<super::QueryValidatorConsumerAddrResponse>,
3460            tonic::Status,
3461        > {
3462            self.inner
3463                .ready()
3464                .await
3465                .map_err(|e| {
3466                    tonic::Status::new(
3467                        tonic::Code::Unknown,
3468                        format!("Service was not ready: {}", e.into()),
3469                    )
3470                })?;
3471            let codec = tonic::codec::ProstCodec::default();
3472            let path = http::uri::PathAndQuery::from_static(
3473                "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerAddr",
3474            );
3475            let mut req = request.into_request();
3476            req.extensions_mut()
3477                .insert(
3478                    GrpcMethod::new(
3479                        "interchain_security.ccv.provider.v1.Query",
3480                        "QueryValidatorConsumerAddr",
3481                    ),
3482                );
3483            self.inner.unary(req, path, codec).await
3484        }
3485        /// QueryProviderAddr returns the provider chain validator
3486        /// given a consumer chain validator address
3487        pub async fn query_validator_provider_addr(
3488            &mut self,
3489            request: impl tonic::IntoRequest<super::QueryValidatorProviderAddrRequest>,
3490        ) -> std::result::Result<
3491            tonic::Response<super::QueryValidatorProviderAddrResponse>,
3492            tonic::Status,
3493        > {
3494            self.inner
3495                .ready()
3496                .await
3497                .map_err(|e| {
3498                    tonic::Status::new(
3499                        tonic::Code::Unknown,
3500                        format!("Service was not ready: {}", e.into()),
3501                    )
3502                })?;
3503            let codec = tonic::codec::ProstCodec::default();
3504            let path = http::uri::PathAndQuery::from_static(
3505                "/interchain_security.ccv.provider.v1.Query/QueryValidatorProviderAddr",
3506            );
3507            let mut req = request.into_request();
3508            req.extensions_mut()
3509                .insert(
3510                    GrpcMethod::new(
3511                        "interchain_security.ccv.provider.v1.Query",
3512                        "QueryValidatorProviderAddr",
3513                    ),
3514                );
3515            self.inner.unary(req, path, codec).await
3516        }
3517        /// QueryThrottleState returns the main on-chain state relevant to currently
3518        /// throttled slash packets
3519        pub async fn query_throttle_state(
3520            &mut self,
3521            request: impl tonic::IntoRequest<super::QueryThrottleStateRequest>,
3522        ) -> std::result::Result<
3523            tonic::Response<super::QueryThrottleStateResponse>,
3524            tonic::Status,
3525        > {
3526            self.inner
3527                .ready()
3528                .await
3529                .map_err(|e| {
3530                    tonic::Status::new(
3531                        tonic::Code::Unknown,
3532                        format!("Service was not ready: {}", e.into()),
3533                    )
3534                })?;
3535            let codec = tonic::codec::ProstCodec::default();
3536            let path = http::uri::PathAndQuery::from_static(
3537                "/interchain_security.ccv.provider.v1.Query/QueryThrottleState",
3538            );
3539            let mut req = request.into_request();
3540            req.extensions_mut()
3541                .insert(
3542                    GrpcMethod::new(
3543                        "interchain_security.ccv.provider.v1.Query",
3544                        "QueryThrottleState",
3545                    ),
3546                );
3547            self.inner.unary(req, path, codec).await
3548        }
3549        /// QueryRegisteredConsumerRewardDenoms returns a list of consumer reward
3550        /// denoms that are registered
3551        pub async fn query_registered_consumer_reward_denoms(
3552            &mut self,
3553            request: impl tonic::IntoRequest<
3554                super::QueryRegisteredConsumerRewardDenomsRequest,
3555            >,
3556        ) -> std::result::Result<
3557            tonic::Response<super::QueryRegisteredConsumerRewardDenomsResponse>,
3558            tonic::Status,
3559        > {
3560            self.inner
3561                .ready()
3562                .await
3563                .map_err(|e| {
3564                    tonic::Status::new(
3565                        tonic::Code::Unknown,
3566                        format!("Service was not ready: {}", e.into()),
3567                    )
3568                })?;
3569            let codec = tonic::codec::ProstCodec::default();
3570            let path = http::uri::PathAndQuery::from_static(
3571                "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms",
3572            );
3573            let mut req = request.into_request();
3574            req.extensions_mut()
3575                .insert(
3576                    GrpcMethod::new(
3577                        "interchain_security.ccv.provider.v1.Query",
3578                        "QueryRegisteredConsumerRewardDenoms",
3579                    ),
3580                );
3581            self.inner.unary(req, path, codec).await
3582        }
3583        /// QueryAllPairsValConsAddrByConsumer returns a list of pair valconsensus address
3584        /// between provider and consumer chain
3585        pub async fn query_all_pairs_val_cons_addr_by_consumer(
3586            &mut self,
3587            request: impl tonic::IntoRequest<
3588                super::QueryAllPairsValConsAddrByConsumerRequest,
3589            >,
3590        ) -> std::result::Result<
3591            tonic::Response<super::QueryAllPairsValConsAddrByConsumerResponse>,
3592            tonic::Status,
3593        > {
3594            self.inner
3595                .ready()
3596                .await
3597                .map_err(|e| {
3598                    tonic::Status::new(
3599                        tonic::Code::Unknown,
3600                        format!("Service was not ready: {}", e.into()),
3601                    )
3602                })?;
3603            let codec = tonic::codec::ProstCodec::default();
3604            let path = http::uri::PathAndQuery::from_static(
3605                "/interchain_security.ccv.provider.v1.Query/QueryAllPairsValConsAddrByConsumer",
3606            );
3607            let mut req = request.into_request();
3608            req.extensions_mut()
3609                .insert(
3610                    GrpcMethod::new(
3611                        "interchain_security.ccv.provider.v1.Query",
3612                        "QueryAllPairsValConsAddrByConsumer",
3613                    ),
3614                );
3615            self.inner.unary(req, path, codec).await
3616        }
3617        /// QueryParams returns all current values of provider parameters
3618        pub async fn query_params(
3619            &mut self,
3620            request: impl tonic::IntoRequest<super::QueryParamsRequest>,
3621        ) -> std::result::Result<
3622            tonic::Response<super::QueryParamsResponse>,
3623            tonic::Status,
3624        > {
3625            self.inner
3626                .ready()
3627                .await
3628                .map_err(|e| {
3629                    tonic::Status::new(
3630                        tonic::Code::Unknown,
3631                        format!("Service was not ready: {}", e.into()),
3632                    )
3633                })?;
3634            let codec = tonic::codec::ProstCodec::default();
3635            let path = http::uri::PathAndQuery::from_static(
3636                "/interchain_security.ccv.provider.v1.Query/QueryParams",
3637            );
3638            let mut req = request.into_request();
3639            req.extensions_mut()
3640                .insert(
3641                    GrpcMethod::new(
3642                        "interchain_security.ccv.provider.v1.Query",
3643                        "QueryParams",
3644                    ),
3645                );
3646            self.inner.unary(req, path, codec).await
3647        }
3648        /// QueryConsumerChainOptedInValidators returns a list of validators consensus addresses
3649        /// that opted-in to the given consumer chain
3650        pub async fn query_consumer_chain_opted_in_validators(
3651            &mut self,
3652            request: impl tonic::IntoRequest<
3653                super::QueryConsumerChainOptedInValidatorsRequest,
3654            >,
3655        ) -> std::result::Result<
3656            tonic::Response<super::QueryConsumerChainOptedInValidatorsResponse>,
3657            tonic::Status,
3658        > {
3659            self.inner
3660                .ready()
3661                .await
3662                .map_err(|e| {
3663                    tonic::Status::new(
3664                        tonic::Code::Unknown,
3665                        format!("Service was not ready: {}", e.into()),
3666                    )
3667                })?;
3668            let codec = tonic::codec::ProstCodec::default();
3669            let path = http::uri::PathAndQuery::from_static(
3670                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainOptedInValidators",
3671            );
3672            let mut req = request.into_request();
3673            req.extensions_mut()
3674                .insert(
3675                    GrpcMethod::new(
3676                        "interchain_security.ccv.provider.v1.Query",
3677                        "QueryConsumerChainOptedInValidators",
3678                    ),
3679                );
3680            self.inner.unary(req, path, codec).await
3681        }
3682        /// QueryConsumerChainsValidatorHasToValidate returns a list of consumer chains
3683        /// that a given validator must validate
3684        pub async fn query_consumer_chains_validator_has_to_validate(
3685            &mut self,
3686            request: impl tonic::IntoRequest<
3687                super::QueryConsumerChainsValidatorHasToValidateRequest,
3688            >,
3689        ) -> std::result::Result<
3690            tonic::Response<super::QueryConsumerChainsValidatorHasToValidateResponse>,
3691            tonic::Status,
3692        > {
3693            self.inner
3694                .ready()
3695                .await
3696                .map_err(|e| {
3697                    tonic::Status::new(
3698                        tonic::Code::Unknown,
3699                        format!("Service was not ready: {}", e.into()),
3700                    )
3701                })?;
3702            let codec = tonic::codec::ProstCodec::default();
3703            let path = http::uri::PathAndQuery::from_static(
3704                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainsValidatorHasToValidate",
3705            );
3706            let mut req = request.into_request();
3707            req.extensions_mut()
3708                .insert(
3709                    GrpcMethod::new(
3710                        "interchain_security.ccv.provider.v1.Query",
3711                        "QueryConsumerChainsValidatorHasToValidate",
3712                    ),
3713                );
3714            self.inner.unary(req, path, codec).await
3715        }
3716        /// QueryValidatorConsumerCommissionRate returns the commission rate a given
3717        /// validator charges on a given consumer chain
3718        pub async fn query_validator_consumer_commission_rate(
3719            &mut self,
3720            request: impl tonic::IntoRequest<
3721                super::QueryValidatorConsumerCommissionRateRequest,
3722            >,
3723        ) -> std::result::Result<
3724            tonic::Response<super::QueryValidatorConsumerCommissionRateResponse>,
3725            tonic::Status,
3726        > {
3727            self.inner
3728                .ready()
3729                .await
3730                .map_err(|e| {
3731                    tonic::Status::new(
3732                        tonic::Code::Unknown,
3733                        format!("Service was not ready: {}", e.into()),
3734                    )
3735                })?;
3736            let codec = tonic::codec::ProstCodec::default();
3737            let path = http::uri::PathAndQuery::from_static(
3738                "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerCommissionRate",
3739            );
3740            let mut req = request.into_request();
3741            req.extensions_mut()
3742                .insert(
3743                    GrpcMethod::new(
3744                        "interchain_security.ccv.provider.v1.Query",
3745                        "QueryValidatorConsumerCommissionRate",
3746                    ),
3747                );
3748            self.inner.unary(req, path, codec).await
3749        }
3750        /// QueryConsumerValidators returns the latest set consumer-validator set for a given consumer ID
3751        /// Note that this does not necessarily mean that the consumer chain is using this validator set at this exact moment
3752        /// because a VSCPacket could be delayed to be delivered on the consumer chain.
3753        pub async fn query_consumer_validators(
3754            &mut self,
3755            request: impl tonic::IntoRequest<super::QueryConsumerValidatorsRequest>,
3756        ) -> std::result::Result<
3757            tonic::Response<super::QueryConsumerValidatorsResponse>,
3758            tonic::Status,
3759        > {
3760            self.inner
3761                .ready()
3762                .await
3763                .map_err(|e| {
3764                    tonic::Status::new(
3765                        tonic::Code::Unknown,
3766                        format!("Service was not ready: {}", e.into()),
3767                    )
3768                })?;
3769            let codec = tonic::codec::ProstCodec::default();
3770            let path = http::uri::PathAndQuery::from_static(
3771                "/interchain_security.ccv.provider.v1.Query/QueryConsumerValidators",
3772            );
3773            let mut req = request.into_request();
3774            req.extensions_mut()
3775                .insert(
3776                    GrpcMethod::new(
3777                        "interchain_security.ccv.provider.v1.Query",
3778                        "QueryConsumerValidators",
3779                    ),
3780                );
3781            self.inner.unary(req, path, codec).await
3782        }
3783        /// QueryBlocksUntilNextEpoch returns the number of blocks until the next epoch
3784        /// starts and validator updates are sent to the consumer chains
3785        pub async fn query_blocks_until_next_epoch(
3786            &mut self,
3787            request: impl tonic::IntoRequest<super::QueryBlocksUntilNextEpochRequest>,
3788        ) -> std::result::Result<
3789            tonic::Response<super::QueryBlocksUntilNextEpochResponse>,
3790            tonic::Status,
3791        > {
3792            self.inner
3793                .ready()
3794                .await
3795                .map_err(|e| {
3796                    tonic::Status::new(
3797                        tonic::Code::Unknown,
3798                        format!("Service was not ready: {}", e.into()),
3799                    )
3800                })?;
3801            let codec = tonic::codec::ProstCodec::default();
3802            let path = http::uri::PathAndQuery::from_static(
3803                "/interchain_security.ccv.provider.v1.Query/QueryBlocksUntilNextEpoch",
3804            );
3805            let mut req = request.into_request();
3806            req.extensions_mut()
3807                .insert(
3808                    GrpcMethod::new(
3809                        "interchain_security.ccv.provider.v1.Query",
3810                        "QueryBlocksUntilNextEpoch",
3811                    ),
3812                );
3813            self.inner.unary(req, path, codec).await
3814        }
3815        /// QueryConsumerIdFromClientId returns the consumer id of the chain
3816        /// associated with the provided client id
3817        pub async fn query_consumer_id_from_client_id(
3818            &mut self,
3819            request: impl tonic::IntoRequest<super::QueryConsumerIdFromClientIdRequest>,
3820        ) -> std::result::Result<
3821            tonic::Response<super::QueryConsumerIdFromClientIdResponse>,
3822            tonic::Status,
3823        > {
3824            self.inner
3825                .ready()
3826                .await
3827                .map_err(|e| {
3828                    tonic::Status::new(
3829                        tonic::Code::Unknown,
3830                        format!("Service was not ready: {}", e.into()),
3831                    )
3832                })?;
3833            let codec = tonic::codec::ProstCodec::default();
3834            let path = http::uri::PathAndQuery::from_static(
3835                "/interchain_security.ccv.provider.v1.Query/QueryConsumerIdFromClientId",
3836            );
3837            let mut req = request.into_request();
3838            req.extensions_mut()
3839                .insert(
3840                    GrpcMethod::new(
3841                        "interchain_security.ccv.provider.v1.Query",
3842                        "QueryConsumerIdFromClientId",
3843                    ),
3844                );
3845            self.inner.unary(req, path, codec).await
3846        }
3847        /// QueryConsumerChain returns the consumer chain
3848        /// associated with the provided consumer id
3849        pub async fn query_consumer_chain(
3850            &mut self,
3851            request: impl tonic::IntoRequest<super::QueryConsumerChainRequest>,
3852        ) -> std::result::Result<
3853            tonic::Response<super::QueryConsumerChainResponse>,
3854            tonic::Status,
3855        > {
3856            self.inner
3857                .ready()
3858                .await
3859                .map_err(|e| {
3860                    tonic::Status::new(
3861                        tonic::Code::Unknown,
3862                        format!("Service was not ready: {}", e.into()),
3863                    )
3864                })?;
3865            let codec = tonic::codec::ProstCodec::default();
3866            let path = http::uri::PathAndQuery::from_static(
3867                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChain",
3868            );
3869            let mut req = request.into_request();
3870            req.extensions_mut()
3871                .insert(
3872                    GrpcMethod::new(
3873                        "interchain_security.ccv.provider.v1.Query",
3874                        "QueryConsumerChain",
3875                    ),
3876                );
3877            self.inner.unary(req, path, codec).await
3878        }
3879    }
3880}
3881/// Generated server implementations.
3882#[cfg(feature = "server")]
3883pub mod query_server {
3884    #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
3885    use tonic::codegen::*;
3886    /// Generated trait containing gRPC methods that should be implemented for use with QueryServer.
3887    #[async_trait]
3888    pub trait Query: Send + Sync + 'static {
3889        /// ConsumerGenesis queries the genesis state needed to start a consumer chain
3890        /// whose proposal has been accepted
3891        async fn query_consumer_genesis(
3892            &self,
3893            request: tonic::Request<super::QueryConsumerGenesisRequest>,
3894        ) -> std::result::Result<
3895            tonic::Response<super::QueryConsumerGenesisResponse>,
3896            tonic::Status,
3897        >;
3898        /// ConsumerChains queries active consumer chains supported by the provider
3899        /// chain
3900        async fn query_consumer_chains(
3901            &self,
3902            request: tonic::Request<super::QueryConsumerChainsRequest>,
3903        ) -> std::result::Result<
3904            tonic::Response<super::QueryConsumerChainsResponse>,
3905            tonic::Status,
3906        >;
3907        /// QueryValidatorConsumerAddr queries the address
3908        /// assigned by a validator for a consumer chain.
3909        async fn query_validator_consumer_addr(
3910            &self,
3911            request: tonic::Request<super::QueryValidatorConsumerAddrRequest>,
3912        ) -> std::result::Result<
3913            tonic::Response<super::QueryValidatorConsumerAddrResponse>,
3914            tonic::Status,
3915        >;
3916        /// QueryProviderAddr returns the provider chain validator
3917        /// given a consumer chain validator address
3918        async fn query_validator_provider_addr(
3919            &self,
3920            request: tonic::Request<super::QueryValidatorProviderAddrRequest>,
3921        ) -> std::result::Result<
3922            tonic::Response<super::QueryValidatorProviderAddrResponse>,
3923            tonic::Status,
3924        >;
3925        /// QueryThrottleState returns the main on-chain state relevant to currently
3926        /// throttled slash packets
3927        async fn query_throttle_state(
3928            &self,
3929            request: tonic::Request<super::QueryThrottleStateRequest>,
3930        ) -> std::result::Result<
3931            tonic::Response<super::QueryThrottleStateResponse>,
3932            tonic::Status,
3933        >;
3934        /// QueryRegisteredConsumerRewardDenoms returns a list of consumer reward
3935        /// denoms that are registered
3936        async fn query_registered_consumer_reward_denoms(
3937            &self,
3938            request: tonic::Request<super::QueryRegisteredConsumerRewardDenomsRequest>,
3939        ) -> std::result::Result<
3940            tonic::Response<super::QueryRegisteredConsumerRewardDenomsResponse>,
3941            tonic::Status,
3942        >;
3943        /// QueryAllPairsValConsAddrByConsumer returns a list of pair valconsensus address
3944        /// between provider and consumer chain
3945        async fn query_all_pairs_val_cons_addr_by_consumer(
3946            &self,
3947            request: tonic::Request<super::QueryAllPairsValConsAddrByConsumerRequest>,
3948        ) -> std::result::Result<
3949            tonic::Response<super::QueryAllPairsValConsAddrByConsumerResponse>,
3950            tonic::Status,
3951        >;
3952        /// QueryParams returns all current values of provider parameters
3953        async fn query_params(
3954            &self,
3955            request: tonic::Request<super::QueryParamsRequest>,
3956        ) -> std::result::Result<
3957            tonic::Response<super::QueryParamsResponse>,
3958            tonic::Status,
3959        >;
3960        /// QueryConsumerChainOptedInValidators returns a list of validators consensus addresses
3961        /// that opted-in to the given consumer chain
3962        async fn query_consumer_chain_opted_in_validators(
3963            &self,
3964            request: tonic::Request<super::QueryConsumerChainOptedInValidatorsRequest>,
3965        ) -> std::result::Result<
3966            tonic::Response<super::QueryConsumerChainOptedInValidatorsResponse>,
3967            tonic::Status,
3968        >;
3969        /// QueryConsumerChainsValidatorHasToValidate returns a list of consumer chains
3970        /// that a given validator must validate
3971        async fn query_consumer_chains_validator_has_to_validate(
3972            &self,
3973            request: tonic::Request<
3974                super::QueryConsumerChainsValidatorHasToValidateRequest,
3975            >,
3976        ) -> std::result::Result<
3977            tonic::Response<super::QueryConsumerChainsValidatorHasToValidateResponse>,
3978            tonic::Status,
3979        >;
3980        /// QueryValidatorConsumerCommissionRate returns the commission rate a given
3981        /// validator charges on a given consumer chain
3982        async fn query_validator_consumer_commission_rate(
3983            &self,
3984            request: tonic::Request<super::QueryValidatorConsumerCommissionRateRequest>,
3985        ) -> std::result::Result<
3986            tonic::Response<super::QueryValidatorConsumerCommissionRateResponse>,
3987            tonic::Status,
3988        >;
3989        /// QueryConsumerValidators returns the latest set consumer-validator set for a given consumer ID
3990        /// Note that this does not necessarily mean that the consumer chain is using this validator set at this exact moment
3991        /// because a VSCPacket could be delayed to be delivered on the consumer chain.
3992        async fn query_consumer_validators(
3993            &self,
3994            request: tonic::Request<super::QueryConsumerValidatorsRequest>,
3995        ) -> std::result::Result<
3996            tonic::Response<super::QueryConsumerValidatorsResponse>,
3997            tonic::Status,
3998        >;
3999        /// QueryBlocksUntilNextEpoch returns the number of blocks until the next epoch
4000        /// starts and validator updates are sent to the consumer chains
4001        async fn query_blocks_until_next_epoch(
4002            &self,
4003            request: tonic::Request<super::QueryBlocksUntilNextEpochRequest>,
4004        ) -> std::result::Result<
4005            tonic::Response<super::QueryBlocksUntilNextEpochResponse>,
4006            tonic::Status,
4007        >;
4008        /// QueryConsumerIdFromClientId returns the consumer id of the chain
4009        /// associated with the provided client id
4010        async fn query_consumer_id_from_client_id(
4011            &self,
4012            request: tonic::Request<super::QueryConsumerIdFromClientIdRequest>,
4013        ) -> std::result::Result<
4014            tonic::Response<super::QueryConsumerIdFromClientIdResponse>,
4015            tonic::Status,
4016        >;
4017        /// QueryConsumerChain returns the consumer chain
4018        /// associated with the provided consumer id
4019        async fn query_consumer_chain(
4020            &self,
4021            request: tonic::Request<super::QueryConsumerChainRequest>,
4022        ) -> std::result::Result<
4023            tonic::Response<super::QueryConsumerChainResponse>,
4024            tonic::Status,
4025        >;
4026    }
4027    #[derive(Debug)]
4028    pub struct QueryServer<T: Query> {
4029        inner: Arc<T>,
4030        accept_compression_encodings: EnabledCompressionEncodings,
4031        send_compression_encodings: EnabledCompressionEncodings,
4032        max_decoding_message_size: Option<usize>,
4033        max_encoding_message_size: Option<usize>,
4034    }
4035    impl<T: Query> QueryServer<T> {
4036        pub fn new(inner: T) -> Self {
4037            Self::from_arc(Arc::new(inner))
4038        }
4039        pub fn from_arc(inner: Arc<T>) -> Self {
4040            Self {
4041                inner,
4042                accept_compression_encodings: Default::default(),
4043                send_compression_encodings: Default::default(),
4044                max_decoding_message_size: None,
4045                max_encoding_message_size: None,
4046            }
4047        }
4048        pub fn with_interceptor<F>(
4049            inner: T,
4050            interceptor: F,
4051        ) -> InterceptedService<Self, F>
4052        where
4053            F: tonic::service::Interceptor,
4054        {
4055            InterceptedService::new(Self::new(inner), interceptor)
4056        }
4057        /// Enable decompressing requests with the given encoding.
4058        #[must_use]
4059        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
4060            self.accept_compression_encodings.enable(encoding);
4061            self
4062        }
4063        /// Compress responses with the given encoding, if the client supports it.
4064        #[must_use]
4065        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
4066            self.send_compression_encodings.enable(encoding);
4067            self
4068        }
4069        /// Limits the maximum size of a decoded message.
4070        ///
4071        /// Default: `4MB`
4072        #[must_use]
4073        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
4074            self.max_decoding_message_size = Some(limit);
4075            self
4076        }
4077        /// Limits the maximum size of an encoded message.
4078        ///
4079        /// Default: `usize::MAX`
4080        #[must_use]
4081        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
4082            self.max_encoding_message_size = Some(limit);
4083            self
4084        }
4085    }
4086    impl<T, B> tonic::codegen::Service<http::Request<B>> for QueryServer<T>
4087    where
4088        T: Query,
4089        B: Body + Send + 'static,
4090        B::Error: Into<StdError> + Send + 'static,
4091    {
4092        type Response = http::Response<tonic::body::BoxBody>;
4093        type Error = std::convert::Infallible;
4094        type Future = BoxFuture<Self::Response, Self::Error>;
4095        fn poll_ready(
4096            &mut self,
4097            _cx: &mut Context<'_>,
4098        ) -> Poll<std::result::Result<(), Self::Error>> {
4099            Poll::Ready(Ok(()))
4100        }
4101        fn call(&mut self, req: http::Request<B>) -> Self::Future {
4102            match req.uri().path() {
4103                "/interchain_security.ccv.provider.v1.Query/QueryConsumerGenesis" => {
4104                    #[allow(non_camel_case_types)]
4105                    struct QueryConsumerGenesisSvc<T: Query>(pub Arc<T>);
4106                    impl<
4107                        T: Query,
4108                    > tonic::server::UnaryService<super::QueryConsumerGenesisRequest>
4109                    for QueryConsumerGenesisSvc<T> {
4110                        type Response = super::QueryConsumerGenesisResponse;
4111                        type Future = BoxFuture<
4112                            tonic::Response<Self::Response>,
4113                            tonic::Status,
4114                        >;
4115                        fn call(
4116                            &mut self,
4117                            request: tonic::Request<super::QueryConsumerGenesisRequest>,
4118                        ) -> Self::Future {
4119                            let inner = Arc::clone(&self.0);
4120                            let fut = async move {
4121                                <T as Query>::query_consumer_genesis(&inner, request).await
4122                            };
4123                            Box::pin(fut)
4124                        }
4125                    }
4126                    let accept_compression_encodings = self.accept_compression_encodings;
4127                    let send_compression_encodings = self.send_compression_encodings;
4128                    let max_decoding_message_size = self.max_decoding_message_size;
4129                    let max_encoding_message_size = self.max_encoding_message_size;
4130                    let inner = self.inner.clone();
4131                    let fut = async move {
4132                        let method = QueryConsumerGenesisSvc(inner);
4133                        let codec = tonic::codec::ProstCodec::default();
4134                        let mut grpc = tonic::server::Grpc::new(codec)
4135                            .apply_compression_config(
4136                                accept_compression_encodings,
4137                                send_compression_encodings,
4138                            )
4139                            .apply_max_message_size_config(
4140                                max_decoding_message_size,
4141                                max_encoding_message_size,
4142                            );
4143                        let res = grpc.unary(method, req).await;
4144                        Ok(res)
4145                    };
4146                    Box::pin(fut)
4147                }
4148                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChains" => {
4149                    #[allow(non_camel_case_types)]
4150                    struct QueryConsumerChainsSvc<T: Query>(pub Arc<T>);
4151                    impl<
4152                        T: Query,
4153                    > tonic::server::UnaryService<super::QueryConsumerChainsRequest>
4154                    for QueryConsumerChainsSvc<T> {
4155                        type Response = super::QueryConsumerChainsResponse;
4156                        type Future = BoxFuture<
4157                            tonic::Response<Self::Response>,
4158                            tonic::Status,
4159                        >;
4160                        fn call(
4161                            &mut self,
4162                            request: tonic::Request<super::QueryConsumerChainsRequest>,
4163                        ) -> Self::Future {
4164                            let inner = Arc::clone(&self.0);
4165                            let fut = async move {
4166                                <T as Query>::query_consumer_chains(&inner, request).await
4167                            };
4168                            Box::pin(fut)
4169                        }
4170                    }
4171                    let accept_compression_encodings = self.accept_compression_encodings;
4172                    let send_compression_encodings = self.send_compression_encodings;
4173                    let max_decoding_message_size = self.max_decoding_message_size;
4174                    let max_encoding_message_size = self.max_encoding_message_size;
4175                    let inner = self.inner.clone();
4176                    let fut = async move {
4177                        let method = QueryConsumerChainsSvc(inner);
4178                        let codec = tonic::codec::ProstCodec::default();
4179                        let mut grpc = tonic::server::Grpc::new(codec)
4180                            .apply_compression_config(
4181                                accept_compression_encodings,
4182                                send_compression_encodings,
4183                            )
4184                            .apply_max_message_size_config(
4185                                max_decoding_message_size,
4186                                max_encoding_message_size,
4187                            );
4188                        let res = grpc.unary(method, req).await;
4189                        Ok(res)
4190                    };
4191                    Box::pin(fut)
4192                }
4193                "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerAddr" => {
4194                    #[allow(non_camel_case_types)]
4195                    struct QueryValidatorConsumerAddrSvc<T: Query>(pub Arc<T>);
4196                    impl<
4197                        T: Query,
4198                    > tonic::server::UnaryService<
4199                        super::QueryValidatorConsumerAddrRequest,
4200                    > for QueryValidatorConsumerAddrSvc<T> {
4201                        type Response = super::QueryValidatorConsumerAddrResponse;
4202                        type Future = BoxFuture<
4203                            tonic::Response<Self::Response>,
4204                            tonic::Status,
4205                        >;
4206                        fn call(
4207                            &mut self,
4208                            request: tonic::Request<
4209                                super::QueryValidatorConsumerAddrRequest,
4210                            >,
4211                        ) -> Self::Future {
4212                            let inner = Arc::clone(&self.0);
4213                            let fut = async move {
4214                                <T as Query>::query_validator_consumer_addr(&inner, request)
4215                                    .await
4216                            };
4217                            Box::pin(fut)
4218                        }
4219                    }
4220                    let accept_compression_encodings = self.accept_compression_encodings;
4221                    let send_compression_encodings = self.send_compression_encodings;
4222                    let max_decoding_message_size = self.max_decoding_message_size;
4223                    let max_encoding_message_size = self.max_encoding_message_size;
4224                    let inner = self.inner.clone();
4225                    let fut = async move {
4226                        let method = QueryValidatorConsumerAddrSvc(inner);
4227                        let codec = tonic::codec::ProstCodec::default();
4228                        let mut grpc = tonic::server::Grpc::new(codec)
4229                            .apply_compression_config(
4230                                accept_compression_encodings,
4231                                send_compression_encodings,
4232                            )
4233                            .apply_max_message_size_config(
4234                                max_decoding_message_size,
4235                                max_encoding_message_size,
4236                            );
4237                        let res = grpc.unary(method, req).await;
4238                        Ok(res)
4239                    };
4240                    Box::pin(fut)
4241                }
4242                "/interchain_security.ccv.provider.v1.Query/QueryValidatorProviderAddr" => {
4243                    #[allow(non_camel_case_types)]
4244                    struct QueryValidatorProviderAddrSvc<T: Query>(pub Arc<T>);
4245                    impl<
4246                        T: Query,
4247                    > tonic::server::UnaryService<
4248                        super::QueryValidatorProviderAddrRequest,
4249                    > for QueryValidatorProviderAddrSvc<T> {
4250                        type Response = super::QueryValidatorProviderAddrResponse;
4251                        type Future = BoxFuture<
4252                            tonic::Response<Self::Response>,
4253                            tonic::Status,
4254                        >;
4255                        fn call(
4256                            &mut self,
4257                            request: tonic::Request<
4258                                super::QueryValidatorProviderAddrRequest,
4259                            >,
4260                        ) -> Self::Future {
4261                            let inner = Arc::clone(&self.0);
4262                            let fut = async move {
4263                                <T as Query>::query_validator_provider_addr(&inner, request)
4264                                    .await
4265                            };
4266                            Box::pin(fut)
4267                        }
4268                    }
4269                    let accept_compression_encodings = self.accept_compression_encodings;
4270                    let send_compression_encodings = self.send_compression_encodings;
4271                    let max_decoding_message_size = self.max_decoding_message_size;
4272                    let max_encoding_message_size = self.max_encoding_message_size;
4273                    let inner = self.inner.clone();
4274                    let fut = async move {
4275                        let method = QueryValidatorProviderAddrSvc(inner);
4276                        let codec = tonic::codec::ProstCodec::default();
4277                        let mut grpc = tonic::server::Grpc::new(codec)
4278                            .apply_compression_config(
4279                                accept_compression_encodings,
4280                                send_compression_encodings,
4281                            )
4282                            .apply_max_message_size_config(
4283                                max_decoding_message_size,
4284                                max_encoding_message_size,
4285                            );
4286                        let res = grpc.unary(method, req).await;
4287                        Ok(res)
4288                    };
4289                    Box::pin(fut)
4290                }
4291                "/interchain_security.ccv.provider.v1.Query/QueryThrottleState" => {
4292                    #[allow(non_camel_case_types)]
4293                    struct QueryThrottleStateSvc<T: Query>(pub Arc<T>);
4294                    impl<
4295                        T: Query,
4296                    > tonic::server::UnaryService<super::QueryThrottleStateRequest>
4297                    for QueryThrottleStateSvc<T> {
4298                        type Response = super::QueryThrottleStateResponse;
4299                        type Future = BoxFuture<
4300                            tonic::Response<Self::Response>,
4301                            tonic::Status,
4302                        >;
4303                        fn call(
4304                            &mut self,
4305                            request: tonic::Request<super::QueryThrottleStateRequest>,
4306                        ) -> Self::Future {
4307                            let inner = Arc::clone(&self.0);
4308                            let fut = async move {
4309                                <T as Query>::query_throttle_state(&inner, request).await
4310                            };
4311                            Box::pin(fut)
4312                        }
4313                    }
4314                    let accept_compression_encodings = self.accept_compression_encodings;
4315                    let send_compression_encodings = self.send_compression_encodings;
4316                    let max_decoding_message_size = self.max_decoding_message_size;
4317                    let max_encoding_message_size = self.max_encoding_message_size;
4318                    let inner = self.inner.clone();
4319                    let fut = async move {
4320                        let method = QueryThrottleStateSvc(inner);
4321                        let codec = tonic::codec::ProstCodec::default();
4322                        let mut grpc = tonic::server::Grpc::new(codec)
4323                            .apply_compression_config(
4324                                accept_compression_encodings,
4325                                send_compression_encodings,
4326                            )
4327                            .apply_max_message_size_config(
4328                                max_decoding_message_size,
4329                                max_encoding_message_size,
4330                            );
4331                        let res = grpc.unary(method, req).await;
4332                        Ok(res)
4333                    };
4334                    Box::pin(fut)
4335                }
4336                "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms" => {
4337                    #[allow(non_camel_case_types)]
4338                    struct QueryRegisteredConsumerRewardDenomsSvc<T: Query>(pub Arc<T>);
4339                    impl<
4340                        T: Query,
4341                    > tonic::server::UnaryService<
4342                        super::QueryRegisteredConsumerRewardDenomsRequest,
4343                    > for QueryRegisteredConsumerRewardDenomsSvc<T> {
4344                        type Response = super::QueryRegisteredConsumerRewardDenomsResponse;
4345                        type Future = BoxFuture<
4346                            tonic::Response<Self::Response>,
4347                            tonic::Status,
4348                        >;
4349                        fn call(
4350                            &mut self,
4351                            request: tonic::Request<
4352                                super::QueryRegisteredConsumerRewardDenomsRequest,
4353                            >,
4354                        ) -> Self::Future {
4355                            let inner = Arc::clone(&self.0);
4356                            let fut = async move {
4357                                <T as Query>::query_registered_consumer_reward_denoms(
4358                                        &inner,
4359                                        request,
4360                                    )
4361                                    .await
4362                            };
4363                            Box::pin(fut)
4364                        }
4365                    }
4366                    let accept_compression_encodings = self.accept_compression_encodings;
4367                    let send_compression_encodings = self.send_compression_encodings;
4368                    let max_decoding_message_size = self.max_decoding_message_size;
4369                    let max_encoding_message_size = self.max_encoding_message_size;
4370                    let inner = self.inner.clone();
4371                    let fut = async move {
4372                        let method = QueryRegisteredConsumerRewardDenomsSvc(inner);
4373                        let codec = tonic::codec::ProstCodec::default();
4374                        let mut grpc = tonic::server::Grpc::new(codec)
4375                            .apply_compression_config(
4376                                accept_compression_encodings,
4377                                send_compression_encodings,
4378                            )
4379                            .apply_max_message_size_config(
4380                                max_decoding_message_size,
4381                                max_encoding_message_size,
4382                            );
4383                        let res = grpc.unary(method, req).await;
4384                        Ok(res)
4385                    };
4386                    Box::pin(fut)
4387                }
4388                "/interchain_security.ccv.provider.v1.Query/QueryAllPairsValConsAddrByConsumer" => {
4389                    #[allow(non_camel_case_types)]
4390                    struct QueryAllPairsValConsAddrByConsumerSvc<T: Query>(pub Arc<T>);
4391                    impl<
4392                        T: Query,
4393                    > tonic::server::UnaryService<
4394                        super::QueryAllPairsValConsAddrByConsumerRequest,
4395                    > for QueryAllPairsValConsAddrByConsumerSvc<T> {
4396                        type Response = super::QueryAllPairsValConsAddrByConsumerResponse;
4397                        type Future = BoxFuture<
4398                            tonic::Response<Self::Response>,
4399                            tonic::Status,
4400                        >;
4401                        fn call(
4402                            &mut self,
4403                            request: tonic::Request<
4404                                super::QueryAllPairsValConsAddrByConsumerRequest,
4405                            >,
4406                        ) -> Self::Future {
4407                            let inner = Arc::clone(&self.0);
4408                            let fut = async move {
4409                                <T as Query>::query_all_pairs_val_cons_addr_by_consumer(
4410                                        &inner,
4411                                        request,
4412                                    )
4413                                    .await
4414                            };
4415                            Box::pin(fut)
4416                        }
4417                    }
4418                    let accept_compression_encodings = self.accept_compression_encodings;
4419                    let send_compression_encodings = self.send_compression_encodings;
4420                    let max_decoding_message_size = self.max_decoding_message_size;
4421                    let max_encoding_message_size = self.max_encoding_message_size;
4422                    let inner = self.inner.clone();
4423                    let fut = async move {
4424                        let method = QueryAllPairsValConsAddrByConsumerSvc(inner);
4425                        let codec = tonic::codec::ProstCodec::default();
4426                        let mut grpc = tonic::server::Grpc::new(codec)
4427                            .apply_compression_config(
4428                                accept_compression_encodings,
4429                                send_compression_encodings,
4430                            )
4431                            .apply_max_message_size_config(
4432                                max_decoding_message_size,
4433                                max_encoding_message_size,
4434                            );
4435                        let res = grpc.unary(method, req).await;
4436                        Ok(res)
4437                    };
4438                    Box::pin(fut)
4439                }
4440                "/interchain_security.ccv.provider.v1.Query/QueryParams" => {
4441                    #[allow(non_camel_case_types)]
4442                    struct QueryParamsSvc<T: Query>(pub Arc<T>);
4443                    impl<T: Query> tonic::server::UnaryService<super::QueryParamsRequest>
4444                    for QueryParamsSvc<T> {
4445                        type Response = super::QueryParamsResponse;
4446                        type Future = BoxFuture<
4447                            tonic::Response<Self::Response>,
4448                            tonic::Status,
4449                        >;
4450                        fn call(
4451                            &mut self,
4452                            request: tonic::Request<super::QueryParamsRequest>,
4453                        ) -> Self::Future {
4454                            let inner = Arc::clone(&self.0);
4455                            let fut = async move {
4456                                <T as Query>::query_params(&inner, request).await
4457                            };
4458                            Box::pin(fut)
4459                        }
4460                    }
4461                    let accept_compression_encodings = self.accept_compression_encodings;
4462                    let send_compression_encodings = self.send_compression_encodings;
4463                    let max_decoding_message_size = self.max_decoding_message_size;
4464                    let max_encoding_message_size = self.max_encoding_message_size;
4465                    let inner = self.inner.clone();
4466                    let fut = async move {
4467                        let method = QueryParamsSvc(inner);
4468                        let codec = tonic::codec::ProstCodec::default();
4469                        let mut grpc = tonic::server::Grpc::new(codec)
4470                            .apply_compression_config(
4471                                accept_compression_encodings,
4472                                send_compression_encodings,
4473                            )
4474                            .apply_max_message_size_config(
4475                                max_decoding_message_size,
4476                                max_encoding_message_size,
4477                            );
4478                        let res = grpc.unary(method, req).await;
4479                        Ok(res)
4480                    };
4481                    Box::pin(fut)
4482                }
4483                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainOptedInValidators" => {
4484                    #[allow(non_camel_case_types)]
4485                    struct QueryConsumerChainOptedInValidatorsSvc<T: Query>(pub Arc<T>);
4486                    impl<
4487                        T: Query,
4488                    > tonic::server::UnaryService<
4489                        super::QueryConsumerChainOptedInValidatorsRequest,
4490                    > for QueryConsumerChainOptedInValidatorsSvc<T> {
4491                        type Response = super::QueryConsumerChainOptedInValidatorsResponse;
4492                        type Future = BoxFuture<
4493                            tonic::Response<Self::Response>,
4494                            tonic::Status,
4495                        >;
4496                        fn call(
4497                            &mut self,
4498                            request: tonic::Request<
4499                                super::QueryConsumerChainOptedInValidatorsRequest,
4500                            >,
4501                        ) -> Self::Future {
4502                            let inner = Arc::clone(&self.0);
4503                            let fut = async move {
4504                                <T as Query>::query_consumer_chain_opted_in_validators(
4505                                        &inner,
4506                                        request,
4507                                    )
4508                                    .await
4509                            };
4510                            Box::pin(fut)
4511                        }
4512                    }
4513                    let accept_compression_encodings = self.accept_compression_encodings;
4514                    let send_compression_encodings = self.send_compression_encodings;
4515                    let max_decoding_message_size = self.max_decoding_message_size;
4516                    let max_encoding_message_size = self.max_encoding_message_size;
4517                    let inner = self.inner.clone();
4518                    let fut = async move {
4519                        let method = QueryConsumerChainOptedInValidatorsSvc(inner);
4520                        let codec = tonic::codec::ProstCodec::default();
4521                        let mut grpc = tonic::server::Grpc::new(codec)
4522                            .apply_compression_config(
4523                                accept_compression_encodings,
4524                                send_compression_encodings,
4525                            )
4526                            .apply_max_message_size_config(
4527                                max_decoding_message_size,
4528                                max_encoding_message_size,
4529                            );
4530                        let res = grpc.unary(method, req).await;
4531                        Ok(res)
4532                    };
4533                    Box::pin(fut)
4534                }
4535                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChainsValidatorHasToValidate" => {
4536                    #[allow(non_camel_case_types)]
4537                    struct QueryConsumerChainsValidatorHasToValidateSvc<T: Query>(
4538                        pub Arc<T>,
4539                    );
4540                    impl<
4541                        T: Query,
4542                    > tonic::server::UnaryService<
4543                        super::QueryConsumerChainsValidatorHasToValidateRequest,
4544                    > for QueryConsumerChainsValidatorHasToValidateSvc<T> {
4545                        type Response = super::QueryConsumerChainsValidatorHasToValidateResponse;
4546                        type Future = BoxFuture<
4547                            tonic::Response<Self::Response>,
4548                            tonic::Status,
4549                        >;
4550                        fn call(
4551                            &mut self,
4552                            request: tonic::Request<
4553                                super::QueryConsumerChainsValidatorHasToValidateRequest,
4554                            >,
4555                        ) -> Self::Future {
4556                            let inner = Arc::clone(&self.0);
4557                            let fut = async move {
4558                                <T as Query>::query_consumer_chains_validator_has_to_validate(
4559                                        &inner,
4560                                        request,
4561                                    )
4562                                    .await
4563                            };
4564                            Box::pin(fut)
4565                        }
4566                    }
4567                    let accept_compression_encodings = self.accept_compression_encodings;
4568                    let send_compression_encodings = self.send_compression_encodings;
4569                    let max_decoding_message_size = self.max_decoding_message_size;
4570                    let max_encoding_message_size = self.max_encoding_message_size;
4571                    let inner = self.inner.clone();
4572                    let fut = async move {
4573                        let method = QueryConsumerChainsValidatorHasToValidateSvc(inner);
4574                        let codec = tonic::codec::ProstCodec::default();
4575                        let mut grpc = tonic::server::Grpc::new(codec)
4576                            .apply_compression_config(
4577                                accept_compression_encodings,
4578                                send_compression_encodings,
4579                            )
4580                            .apply_max_message_size_config(
4581                                max_decoding_message_size,
4582                                max_encoding_message_size,
4583                            );
4584                        let res = grpc.unary(method, req).await;
4585                        Ok(res)
4586                    };
4587                    Box::pin(fut)
4588                }
4589                "/interchain_security.ccv.provider.v1.Query/QueryValidatorConsumerCommissionRate" => {
4590                    #[allow(non_camel_case_types)]
4591                    struct QueryValidatorConsumerCommissionRateSvc<T: Query>(pub Arc<T>);
4592                    impl<
4593                        T: Query,
4594                    > tonic::server::UnaryService<
4595                        super::QueryValidatorConsumerCommissionRateRequest,
4596                    > for QueryValidatorConsumerCommissionRateSvc<T> {
4597                        type Response = super::QueryValidatorConsumerCommissionRateResponse;
4598                        type Future = BoxFuture<
4599                            tonic::Response<Self::Response>,
4600                            tonic::Status,
4601                        >;
4602                        fn call(
4603                            &mut self,
4604                            request: tonic::Request<
4605                                super::QueryValidatorConsumerCommissionRateRequest,
4606                            >,
4607                        ) -> Self::Future {
4608                            let inner = Arc::clone(&self.0);
4609                            let fut = async move {
4610                                <T as Query>::query_validator_consumer_commission_rate(
4611                                        &inner,
4612                                        request,
4613                                    )
4614                                    .await
4615                            };
4616                            Box::pin(fut)
4617                        }
4618                    }
4619                    let accept_compression_encodings = self.accept_compression_encodings;
4620                    let send_compression_encodings = self.send_compression_encodings;
4621                    let max_decoding_message_size = self.max_decoding_message_size;
4622                    let max_encoding_message_size = self.max_encoding_message_size;
4623                    let inner = self.inner.clone();
4624                    let fut = async move {
4625                        let method = QueryValidatorConsumerCommissionRateSvc(inner);
4626                        let codec = tonic::codec::ProstCodec::default();
4627                        let mut grpc = tonic::server::Grpc::new(codec)
4628                            .apply_compression_config(
4629                                accept_compression_encodings,
4630                                send_compression_encodings,
4631                            )
4632                            .apply_max_message_size_config(
4633                                max_decoding_message_size,
4634                                max_encoding_message_size,
4635                            );
4636                        let res = grpc.unary(method, req).await;
4637                        Ok(res)
4638                    };
4639                    Box::pin(fut)
4640                }
4641                "/interchain_security.ccv.provider.v1.Query/QueryConsumerValidators" => {
4642                    #[allow(non_camel_case_types)]
4643                    struct QueryConsumerValidatorsSvc<T: Query>(pub Arc<T>);
4644                    impl<
4645                        T: Query,
4646                    > tonic::server::UnaryService<super::QueryConsumerValidatorsRequest>
4647                    for QueryConsumerValidatorsSvc<T> {
4648                        type Response = super::QueryConsumerValidatorsResponse;
4649                        type Future = BoxFuture<
4650                            tonic::Response<Self::Response>,
4651                            tonic::Status,
4652                        >;
4653                        fn call(
4654                            &mut self,
4655                            request: tonic::Request<
4656                                super::QueryConsumerValidatorsRequest,
4657                            >,
4658                        ) -> Self::Future {
4659                            let inner = Arc::clone(&self.0);
4660                            let fut = async move {
4661                                <T as Query>::query_consumer_validators(&inner, request)
4662                                    .await
4663                            };
4664                            Box::pin(fut)
4665                        }
4666                    }
4667                    let accept_compression_encodings = self.accept_compression_encodings;
4668                    let send_compression_encodings = self.send_compression_encodings;
4669                    let max_decoding_message_size = self.max_decoding_message_size;
4670                    let max_encoding_message_size = self.max_encoding_message_size;
4671                    let inner = self.inner.clone();
4672                    let fut = async move {
4673                        let method = QueryConsumerValidatorsSvc(inner);
4674                        let codec = tonic::codec::ProstCodec::default();
4675                        let mut grpc = tonic::server::Grpc::new(codec)
4676                            .apply_compression_config(
4677                                accept_compression_encodings,
4678                                send_compression_encodings,
4679                            )
4680                            .apply_max_message_size_config(
4681                                max_decoding_message_size,
4682                                max_encoding_message_size,
4683                            );
4684                        let res = grpc.unary(method, req).await;
4685                        Ok(res)
4686                    };
4687                    Box::pin(fut)
4688                }
4689                "/interchain_security.ccv.provider.v1.Query/QueryBlocksUntilNextEpoch" => {
4690                    #[allow(non_camel_case_types)]
4691                    struct QueryBlocksUntilNextEpochSvc<T: Query>(pub Arc<T>);
4692                    impl<
4693                        T: Query,
4694                    > tonic::server::UnaryService<
4695                        super::QueryBlocksUntilNextEpochRequest,
4696                    > for QueryBlocksUntilNextEpochSvc<T> {
4697                        type Response = super::QueryBlocksUntilNextEpochResponse;
4698                        type Future = BoxFuture<
4699                            tonic::Response<Self::Response>,
4700                            tonic::Status,
4701                        >;
4702                        fn call(
4703                            &mut self,
4704                            request: tonic::Request<
4705                                super::QueryBlocksUntilNextEpochRequest,
4706                            >,
4707                        ) -> Self::Future {
4708                            let inner = Arc::clone(&self.0);
4709                            let fut = async move {
4710                                <T as Query>::query_blocks_until_next_epoch(&inner, request)
4711                                    .await
4712                            };
4713                            Box::pin(fut)
4714                        }
4715                    }
4716                    let accept_compression_encodings = self.accept_compression_encodings;
4717                    let send_compression_encodings = self.send_compression_encodings;
4718                    let max_decoding_message_size = self.max_decoding_message_size;
4719                    let max_encoding_message_size = self.max_encoding_message_size;
4720                    let inner = self.inner.clone();
4721                    let fut = async move {
4722                        let method = QueryBlocksUntilNextEpochSvc(inner);
4723                        let codec = tonic::codec::ProstCodec::default();
4724                        let mut grpc = tonic::server::Grpc::new(codec)
4725                            .apply_compression_config(
4726                                accept_compression_encodings,
4727                                send_compression_encodings,
4728                            )
4729                            .apply_max_message_size_config(
4730                                max_decoding_message_size,
4731                                max_encoding_message_size,
4732                            );
4733                        let res = grpc.unary(method, req).await;
4734                        Ok(res)
4735                    };
4736                    Box::pin(fut)
4737                }
4738                "/interchain_security.ccv.provider.v1.Query/QueryConsumerIdFromClientId" => {
4739                    #[allow(non_camel_case_types)]
4740                    struct QueryConsumerIdFromClientIdSvc<T: Query>(pub Arc<T>);
4741                    impl<
4742                        T: Query,
4743                    > tonic::server::UnaryService<
4744                        super::QueryConsumerIdFromClientIdRequest,
4745                    > for QueryConsumerIdFromClientIdSvc<T> {
4746                        type Response = super::QueryConsumerIdFromClientIdResponse;
4747                        type Future = BoxFuture<
4748                            tonic::Response<Self::Response>,
4749                            tonic::Status,
4750                        >;
4751                        fn call(
4752                            &mut self,
4753                            request: tonic::Request<
4754                                super::QueryConsumerIdFromClientIdRequest,
4755                            >,
4756                        ) -> Self::Future {
4757                            let inner = Arc::clone(&self.0);
4758                            let fut = async move {
4759                                <T as Query>::query_consumer_id_from_client_id(
4760                                        &inner,
4761                                        request,
4762                                    )
4763                                    .await
4764                            };
4765                            Box::pin(fut)
4766                        }
4767                    }
4768                    let accept_compression_encodings = self.accept_compression_encodings;
4769                    let send_compression_encodings = self.send_compression_encodings;
4770                    let max_decoding_message_size = self.max_decoding_message_size;
4771                    let max_encoding_message_size = self.max_encoding_message_size;
4772                    let inner = self.inner.clone();
4773                    let fut = async move {
4774                        let method = QueryConsumerIdFromClientIdSvc(inner);
4775                        let codec = tonic::codec::ProstCodec::default();
4776                        let mut grpc = tonic::server::Grpc::new(codec)
4777                            .apply_compression_config(
4778                                accept_compression_encodings,
4779                                send_compression_encodings,
4780                            )
4781                            .apply_max_message_size_config(
4782                                max_decoding_message_size,
4783                                max_encoding_message_size,
4784                            );
4785                        let res = grpc.unary(method, req).await;
4786                        Ok(res)
4787                    };
4788                    Box::pin(fut)
4789                }
4790                "/interchain_security.ccv.provider.v1.Query/QueryConsumerChain" => {
4791                    #[allow(non_camel_case_types)]
4792                    struct QueryConsumerChainSvc<T: Query>(pub Arc<T>);
4793                    impl<
4794                        T: Query,
4795                    > tonic::server::UnaryService<super::QueryConsumerChainRequest>
4796                    for QueryConsumerChainSvc<T> {
4797                        type Response = super::QueryConsumerChainResponse;
4798                        type Future = BoxFuture<
4799                            tonic::Response<Self::Response>,
4800                            tonic::Status,
4801                        >;
4802                        fn call(
4803                            &mut self,
4804                            request: tonic::Request<super::QueryConsumerChainRequest>,
4805                        ) -> Self::Future {
4806                            let inner = Arc::clone(&self.0);
4807                            let fut = async move {
4808                                <T as Query>::query_consumer_chain(&inner, request).await
4809                            };
4810                            Box::pin(fut)
4811                        }
4812                    }
4813                    let accept_compression_encodings = self.accept_compression_encodings;
4814                    let send_compression_encodings = self.send_compression_encodings;
4815                    let max_decoding_message_size = self.max_decoding_message_size;
4816                    let max_encoding_message_size = self.max_encoding_message_size;
4817                    let inner = self.inner.clone();
4818                    let fut = async move {
4819                        let method = QueryConsumerChainSvc(inner);
4820                        let codec = tonic::codec::ProstCodec::default();
4821                        let mut grpc = tonic::server::Grpc::new(codec)
4822                            .apply_compression_config(
4823                                accept_compression_encodings,
4824                                send_compression_encodings,
4825                            )
4826                            .apply_max_message_size_config(
4827                                max_decoding_message_size,
4828                                max_encoding_message_size,
4829                            );
4830                        let res = grpc.unary(method, req).await;
4831                        Ok(res)
4832                    };
4833                    Box::pin(fut)
4834                }
4835                _ => {
4836                    Box::pin(async move {
4837                        Ok(
4838                            http::Response::builder()
4839                                .status(200)
4840                                .header("grpc-status", tonic::Code::Unimplemented as i32)
4841                                .header(
4842                                    http::header::CONTENT_TYPE,
4843                                    tonic::metadata::GRPC_CONTENT_TYPE,
4844                                )
4845                                .body(empty_body())
4846                                .unwrap(),
4847                        )
4848                    })
4849                }
4850            }
4851        }
4852    }
4853    impl<T: Query> Clone for QueryServer<T> {
4854        fn clone(&self) -> Self {
4855            let inner = self.inner.clone();
4856            Self {
4857                inner,
4858                accept_compression_encodings: self.accept_compression_encodings,
4859                send_compression_encodings: self.send_compression_encodings,
4860                max_decoding_message_size: self.max_decoding_message_size,
4861                max_encoding_message_size: self.max_encoding_message_size,
4862            }
4863        }
4864    }
4865    impl<T: Query> tonic::server::NamedService for QueryServer<T> {
4866        const NAME: &'static str = "interchain_security.ccv.provider.v1.Query";
4867    }
4868}
4869/// GenesisState defines the CCV provider chain genesis state
4870#[allow(clippy::derive_partial_eq_without_eq)]
4871#[derive(Clone, PartialEq, ::prost::Message)]
4872pub struct GenesisState {
4873    /// strictly positive and set to 1 (DefaultValsetUpdateID) for a new chain
4874    #[prost(uint64, tag = "1")]
4875    pub valset_update_id: u64,
4876    /// empty for a new chain
4877    #[prost(message, repeated, tag = "2")]
4878    pub consumer_states: ::prost::alloc::vec::Vec<ConsumerState>,
4879    /// empty for a new chain
4880    #[prost(message, repeated, tag = "5")]
4881    pub valset_update_id_to_height: ::prost::alloc::vec::Vec<ValsetUpdateIdToHeight>,
4882    #[prost(message, optional, tag = "8")]
4883    pub params: ::core::option::Option<Params>,
4884    /// empty for a new chain
4885    #[prost(message, repeated, tag = "9")]
4886    pub validator_consumer_pubkeys: ::prost::alloc::vec::Vec<ValidatorConsumerPubKey>,
4887    /// empty for a new chain
4888    #[prost(message, repeated, tag = "10")]
4889    pub validators_by_consumer_addr: ::prost::alloc::vec::Vec<ValidatorByConsumerAddr>,
4890    /// empty for a new chain
4891    #[prost(message, repeated, tag = "14")]
4892    pub consumer_addrs_to_prune_v2: ::prost::alloc::vec::Vec<ConsumerAddrsToPruneV2>,
4893}
4894impl ::prost::Name for GenesisState {
4895    const NAME: &'static str = "GenesisState";
4896    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
4897    fn full_name() -> ::prost::alloc::string::String {
4898        "interchain_security.ccv.provider.v1.GenesisState".into()
4899    }
4900    fn type_url() -> ::prost::alloc::string::String {
4901        "/interchain_security.ccv.provider.v1.GenesisState".into()
4902    }
4903}
4904/// The provider CCV module's knowledge of consumer state.
4905///
4906/// Note this type is only used internally to the provider CCV module.
4907#[allow(clippy::derive_partial_eq_without_eq)]
4908#[derive(Clone, PartialEq, ::prost::Message)]
4909pub struct ConsumerState {
4910    /// ChainID defines the chain ID for the consumer chain
4911    #[prost(string, tag = "1")]
4912    pub chain_id: ::prost::alloc::string::String,
4913    /// ChannelID defines the IBC channel ID for the consumer chain
4914    #[prost(string, tag = "2")]
4915    pub channel_id: ::prost::alloc::string::String,
4916    /// ClientID defines the IBC client ID for the consumer chain
4917    #[prost(string, tag = "3")]
4918    pub client_id: ::prost::alloc::string::String,
4919    /// InitalHeight defines the initial block height for the consumer chain
4920    #[prost(uint64, tag = "4")]
4921    pub initial_height: u64,
4922    /// ConsumerGenesis defines the initial consumer chain genesis states
4923    #[prost(message, optional, tag = "5")]
4924    pub consumer_genesis: ::core::option::Option<super::super::v1::ConsumerGenesisState>,
4925    /// PendingValsetChanges defines the pending validator set changes for the
4926    /// consumer chain
4927    #[prost(message, repeated, tag = "6")]
4928    pub pending_valset_changes: ::prost::alloc::vec::Vec<
4929        super::super::v1::ValidatorSetChangePacketData,
4930    >,
4931    #[prost(string, repeated, tag = "7")]
4932    pub slash_downtime_ack: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
4933    /// the phase of the consumer chain
4934    #[prost(enumeration = "ConsumerPhase", tag = "9")]
4935    pub phase: i32,
4936}
4937impl ::prost::Name for ConsumerState {
4938    const NAME: &'static str = "ConsumerState";
4939    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
4940    fn full_name() -> ::prost::alloc::string::String {
4941        "interchain_security.ccv.provider.v1.ConsumerState".into()
4942    }
4943    fn type_url() -> ::prost::alloc::string::String {
4944        "/interchain_security.ccv.provider.v1.ConsumerState".into()
4945    }
4946}
4947/// ValsetUpdateIdToHeight defines the genesis information for the mapping
4948/// of each valset update id to a block height
4949#[allow(clippy::derive_partial_eq_without_eq)]
4950#[derive(Clone, Copy, PartialEq, ::prost::Message)]
4951pub struct ValsetUpdateIdToHeight {
4952    #[prost(uint64, tag = "1")]
4953    pub valset_update_id: u64,
4954    #[prost(uint64, tag = "2")]
4955    pub height: u64,
4956}
4957impl ::prost::Name for ValsetUpdateIdToHeight {
4958    const NAME: &'static str = "ValsetUpdateIdToHeight";
4959    const PACKAGE: &'static str = "interchain_security.ccv.provider.v1";
4960    fn full_name() -> ::prost::alloc::string::String {
4961        "interchain_security.ccv.provider.v1.ValsetUpdateIdToHeight".into()
4962    }
4963    fn type_url() -> ::prost::alloc::string::String {
4964        "/interchain_security.ccv.provider.v1.ValsetUpdateIdToHeight".into()
4965    }
4966}