penumbra_sdk_proto/gen/
penumbra.view.v1.rs

1// This file is @generated by prost-build.
2/// There's only one transparent address per wallet, so this request has no parameters;
3/// the message exists to satisfy forward-compatibility properties.
4#[derive(Clone, Copy, PartialEq, ::prost::Message)]
5pub struct TransparentAddressRequest {}
6impl ::prost::Name for TransparentAddressRequest {
7    const NAME: &'static str = "TransparentAddressRequest";
8    const PACKAGE: &'static str = "penumbra.view.v1";
9    fn full_name() -> ::prost::alloc::string::String {
10        "penumbra.view.v1.TransparentAddressRequest".into()
11    }
12    fn type_url() -> ::prost::alloc::string::String {
13        "/penumbra.view.v1.TransparentAddressRequest".into()
14    }
15}
16#[derive(Clone, PartialEq, ::prost::Message)]
17pub struct TransparentAddressResponse {
18    /// The raw (binary) transparent address
19    #[prost(message, optional, tag = "1")]
20    pub address: ::core::option::Option<super::super::core::keys::v1::Address>,
21    /// The t-address encoding of the transparent address
22    #[prost(string, tag = "2")]
23    pub encoding: ::prost::alloc::string::String,
24}
25impl ::prost::Name for TransparentAddressResponse {
26    const NAME: &'static str = "TransparentAddressResponse";
27    const PACKAGE: &'static str = "penumbra.view.v1";
28    fn full_name() -> ::prost::alloc::string::String {
29        "penumbra.view.v1.TransparentAddressResponse".into()
30    }
31    fn type_url() -> ::prost::alloc::string::String {
32        "/penumbra.view.v1.TransparentAddressResponse".into()
33    }
34}
35/// Filters in an `AuctionsRequest` will be combined using `AND` logic -- that
36/// is, the more filters you add, the fewer responses you're likely to get.
37#[derive(Clone, PartialEq, ::prost::Message)]
38pub struct AuctionsRequest {
39    /// If present, filter balances to only include the account specified by the `AddressIndex`.
40    #[prost(message, optional, tag = "1")]
41    pub account_filter: ::core::option::Option<
42        super::super::core::keys::v1::AddressIndex,
43    >,
44    /// If present, include inactive auctions as well as active ones.
45    #[prost(bool, tag = "2")]
46    pub include_inactive: bool,
47    /// If set, query a fullnode for the current state of the auctions.
48    #[prost(bool, tag = "3")]
49    pub query_latest_state: bool,
50    /// If present, filter to only include auctions whose IDs are in this array.
51    #[prost(message, repeated, tag = "4")]
52    pub auction_ids_filter: ::prost::alloc::vec::Vec<
53        super::super::core::component::auction::v1::AuctionId,
54    >,
55}
56impl ::prost::Name for AuctionsRequest {
57    const NAME: &'static str = "AuctionsRequest";
58    const PACKAGE: &'static str = "penumbra.view.v1";
59    fn full_name() -> ::prost::alloc::string::String {
60        "penumbra.view.v1.AuctionsRequest".into()
61    }
62    fn type_url() -> ::prost::alloc::string::String {
63        "/penumbra.view.v1.AuctionsRequest".into()
64    }
65}
66#[derive(Clone, PartialEq, ::prost::Message)]
67pub struct AuctionsResponse {
68    #[prost(message, optional, tag = "1")]
69    pub id: ::core::option::Option<
70        super::super::core::component::auction::v1::AuctionId,
71    >,
72    /// The state of the returned auction.
73    ///
74    /// Only present when `query_latest_state` was provided.
75    #[prost(message, optional, tag = "2")]
76    pub auction: ::core::option::Option<::pbjson_types::Any>,
77    /// The state of any DEX positions relevant to the returned auction.
78    ///
79    /// Only present when `query_latest_state` was provided.
80    /// Could be empty, depending on the auction state.
81    #[prost(message, repeated, tag = "3")]
82    pub positions: ::prost::alloc::vec::Vec<
83        super::super::core::component::dex::v1::Position,
84    >,
85    /// The note recording the auction NFT.
86    #[prost(message, optional, tag = "4")]
87    pub note_record: ::core::option::Option<SpendableNoteRecord>,
88    /// The sequence number of the auction state *as known to the local view
89    /// service*. Note that the local view service may lag behind the fullnode. For
90    /// example, if the chain hits an auction's `end_height`, but the user hasn't
91    /// yet exchanged their sequence-0 (opened) auction NFT for a sequence-1
92    /// (closed) auction NFT, the local view service will have a sequnce number of
93    /// 0.
94    ///
95    /// Dutch auctions move from:
96    /// 0 (opened) => 1 (closed) => n (withdrawn)
97    #[prost(uint64, tag = "5")]
98    pub local_seq: u64,
99}
100impl ::prost::Name for AuctionsResponse {
101    const NAME: &'static str = "AuctionsResponse";
102    const PACKAGE: &'static str = "penumbra.view.v1";
103    fn full_name() -> ::prost::alloc::string::String {
104        "penumbra.view.v1.AuctionsResponse".into()
105    }
106    fn type_url() -> ::prost::alloc::string::String {
107        "/penumbra.view.v1.AuctionsResponse".into()
108    }
109}
110#[derive(Clone, PartialEq, ::prost::Message)]
111pub struct AuthorizeAndBuildRequest {
112    /// The transaction plan to authorize and build.
113    #[prost(message, optional, tag = "1")]
114    pub transaction_plan: ::core::option::Option<
115        super::super::core::transaction::v1::TransactionPlan,
116    >,
117}
118impl ::prost::Name for AuthorizeAndBuildRequest {
119    const NAME: &'static str = "AuthorizeAndBuildRequest";
120    const PACKAGE: &'static str = "penumbra.view.v1";
121    fn full_name() -> ::prost::alloc::string::String {
122        "penumbra.view.v1.AuthorizeAndBuildRequest".into()
123    }
124    fn type_url() -> ::prost::alloc::string::String {
125        "/penumbra.view.v1.AuthorizeAndBuildRequest".into()
126    }
127}
128#[derive(Clone, PartialEq, ::prost::Message)]
129pub struct AuthorizeAndBuildResponse {
130    #[prost(oneof = "authorize_and_build_response::Status", tags = "1, 2")]
131    pub status: ::core::option::Option<authorize_and_build_response::Status>,
132}
133/// Nested message and enum types in `AuthorizeAndBuildResponse`.
134pub mod authorize_and_build_response {
135    /// Signals that building is in progress.
136    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
137    pub struct BuildProgress {
138        /// An approximate progress of the build, from 0 to 1.
139        #[prost(float, tag = "1")]
140        pub progress: f32,
141    }
142    impl ::prost::Name for BuildProgress {
143        const NAME: &'static str = "BuildProgress";
144        const PACKAGE: &'static str = "penumbra.view.v1";
145        fn full_name() -> ::prost::alloc::string::String {
146            "penumbra.view.v1.AuthorizeAndBuildResponse.BuildProgress".into()
147        }
148        fn type_url() -> ::prost::alloc::string::String {
149            "/penumbra.view.v1.AuthorizeAndBuildResponse.BuildProgress".into()
150        }
151    }
152    /// Signals that the transaction is complete.
153    #[derive(Clone, PartialEq, ::prost::Message)]
154    pub struct Complete {
155        /// The finished transaction.
156        #[prost(message, optional, tag = "1")]
157        pub transaction: ::core::option::Option<
158            super::super::super::core::transaction::v1::Transaction,
159        >,
160    }
161    impl ::prost::Name for Complete {
162        const NAME: &'static str = "Complete";
163        const PACKAGE: &'static str = "penumbra.view.v1";
164        fn full_name() -> ::prost::alloc::string::String {
165            "penumbra.view.v1.AuthorizeAndBuildResponse.Complete".into()
166        }
167        fn type_url() -> ::prost::alloc::string::String {
168            "/penumbra.view.v1.AuthorizeAndBuildResponse.Complete".into()
169        }
170    }
171    #[derive(Clone, PartialEq, ::prost::Oneof)]
172    pub enum Status {
173        #[prost(message, tag = "1")]
174        BuildProgress(BuildProgress),
175        #[prost(message, tag = "2")]
176        Complete(Complete),
177    }
178}
179impl ::prost::Name for AuthorizeAndBuildResponse {
180    const NAME: &'static str = "AuthorizeAndBuildResponse";
181    const PACKAGE: &'static str = "penumbra.view.v1";
182    fn full_name() -> ::prost::alloc::string::String {
183        "penumbra.view.v1.AuthorizeAndBuildResponse".into()
184    }
185    fn type_url() -> ::prost::alloc::string::String {
186        "/penumbra.view.v1.AuthorizeAndBuildResponse".into()
187    }
188}
189#[derive(Clone, PartialEq, ::prost::Message)]
190pub struct BroadcastTransactionRequest {
191    /// The transaction to broadcast.
192    #[prost(message, optional, tag = "1")]
193    pub transaction: ::core::option::Option<
194        super::super::core::transaction::v1::Transaction,
195    >,
196    /// If true, wait for the view service to detect the transaction during sync.
197    #[prost(bool, tag = "2")]
198    pub await_detection: bool,
199}
200impl ::prost::Name for BroadcastTransactionRequest {
201    const NAME: &'static str = "BroadcastTransactionRequest";
202    const PACKAGE: &'static str = "penumbra.view.v1";
203    fn full_name() -> ::prost::alloc::string::String {
204        "penumbra.view.v1.BroadcastTransactionRequest".into()
205    }
206    fn type_url() -> ::prost::alloc::string::String {
207        "/penumbra.view.v1.BroadcastTransactionRequest".into()
208    }
209}
210#[derive(Clone, PartialEq, ::prost::Message)]
211pub struct BroadcastTransactionResponse {
212    #[prost(oneof = "broadcast_transaction_response::Status", tags = "1, 2")]
213    pub status: ::core::option::Option<broadcast_transaction_response::Status>,
214}
215/// Nested message and enum types in `BroadcastTransactionResponse`.
216pub mod broadcast_transaction_response {
217    /// Signals that the transaction was broadcast successfully (but has not been confirmed).
218    #[derive(Clone, PartialEq, ::prost::Message)]
219    pub struct BroadcastSuccess {
220        /// The hash of the transaction that was broadcast.
221        #[prost(message, optional, tag = "1")]
222        pub id: ::core::option::Option<
223            super::super::super::core::txhash::v1::TransactionId,
224        >,
225    }
226    impl ::prost::Name for BroadcastSuccess {
227        const NAME: &'static str = "BroadcastSuccess";
228        const PACKAGE: &'static str = "penumbra.view.v1";
229        fn full_name() -> ::prost::alloc::string::String {
230            "penumbra.view.v1.BroadcastTransactionResponse.BroadcastSuccess".into()
231        }
232        fn type_url() -> ::prost::alloc::string::String {
233            "/penumbra.view.v1.BroadcastTransactionResponse.BroadcastSuccess".into()
234        }
235    }
236    /// Signals that the transaction has been confirmed on-chain and detected by the view server.
237    ///
238    /// Will not be sent unless await_detection was true.
239    #[derive(Clone, PartialEq, ::prost::Message)]
240    pub struct Confirmed {
241        /// The hash of the transaction that was broadcast.
242        #[prost(message, optional, tag = "1")]
243        pub id: ::core::option::Option<
244            super::super::super::core::txhash::v1::TransactionId,
245        >,
246        /// The height in which the transaction was detected as included in the chain, if any.
247        #[prost(uint64, tag = "2")]
248        pub detection_height: u64,
249    }
250    impl ::prost::Name for Confirmed {
251        const NAME: &'static str = "Confirmed";
252        const PACKAGE: &'static str = "penumbra.view.v1";
253        fn full_name() -> ::prost::alloc::string::String {
254            "penumbra.view.v1.BroadcastTransactionResponse.Confirmed".into()
255        }
256        fn type_url() -> ::prost::alloc::string::String {
257            "/penumbra.view.v1.BroadcastTransactionResponse.Confirmed".into()
258        }
259    }
260    #[derive(Clone, PartialEq, ::prost::Oneof)]
261    pub enum Status {
262        #[prost(message, tag = "1")]
263        BroadcastSuccess(BroadcastSuccess),
264        #[prost(message, tag = "2")]
265        Confirmed(Confirmed),
266    }
267}
268impl ::prost::Name for BroadcastTransactionResponse {
269    const NAME: &'static str = "BroadcastTransactionResponse";
270    const PACKAGE: &'static str = "penumbra.view.v1";
271    fn full_name() -> ::prost::alloc::string::String {
272        "penumbra.view.v1.BroadcastTransactionResponse".into()
273    }
274    fn type_url() -> ::prost::alloc::string::String {
275        "/penumbra.view.v1.BroadcastTransactionResponse".into()
276    }
277}
278#[derive(Clone, PartialEq, ::prost::Message)]
279pub struct TransactionPlannerRequest {
280    /// The expiry height for the requested TransactionPlan
281    #[prost(uint64, tag = "1")]
282    pub expiry_height: u64,
283    /// The memo for the requested TransactionPlan.
284    /// The memo must be unspecified unless `outputs` is nonempty.
285    #[prost(message, optional, tag = "3")]
286    pub memo: ::core::option::Option<super::super::core::transaction::v1::MemoPlaintext>,
287    /// If present, only spends funds from the given account.
288    #[prost(message, optional, tag = "4")]
289    pub source: ::core::option::Option<super::super::core::keys::v1::AddressIndex>,
290    /// Request contents
291    #[prost(message, repeated, tag = "20")]
292    pub outputs: ::prost::alloc::vec::Vec<transaction_planner_request::Output>,
293    #[prost(message, repeated, tag = "21")]
294    pub spends: ::prost::alloc::vec::Vec<transaction_planner_request::Spend>,
295    #[prost(message, repeated, tag = "30")]
296    pub swaps: ::prost::alloc::vec::Vec<transaction_planner_request::Swap>,
297    #[prost(message, repeated, tag = "31")]
298    pub swap_claims: ::prost::alloc::vec::Vec<transaction_planner_request::SwapClaim>,
299    #[prost(message, repeated, tag = "40")]
300    pub delegations: ::prost::alloc::vec::Vec<transaction_planner_request::Delegate>,
301    #[prost(message, repeated, tag = "50")]
302    pub undelegations: ::prost::alloc::vec::Vec<transaction_planner_request::Undelegate>,
303    #[prost(message, repeated, tag = "51")]
304    pub undelegation_claims: ::prost::alloc::vec::Vec<
305        transaction_planner_request::UndelegateClaim,
306    >,
307    #[prost(message, repeated, tag = "60")]
308    pub ibc_relay_actions: ::prost::alloc::vec::Vec<
309        super::super::core::component::ibc::v1::IbcRelay,
310    >,
311    #[prost(message, repeated, tag = "61")]
312    pub ics20_withdrawals: ::prost::alloc::vec::Vec<
313        super::super::core::component::ibc::v1::Ics20Withdrawal,
314    >,
315    #[prost(message, repeated, tag = "70")]
316    pub position_opens: ::prost::alloc::vec::Vec<
317        transaction_planner_request::PositionOpen,
318    >,
319    #[prost(message, repeated, tag = "71")]
320    pub position_closes: ::prost::alloc::vec::Vec<
321        transaction_planner_request::PositionClose,
322    >,
323    #[prost(message, repeated, tag = "72")]
324    pub position_withdraws: ::prost::alloc::vec::Vec<
325        transaction_planner_request::PositionWithdraw,
326    >,
327    #[prost(message, repeated, tag = "73")]
328    pub dutch_auction_schedule_actions: ::prost::alloc::vec::Vec<
329        transaction_planner_request::ActionDutchAuctionSchedule,
330    >,
331    #[prost(message, repeated, tag = "74")]
332    pub dutch_auction_end_actions: ::prost::alloc::vec::Vec<
333        transaction_planner_request::ActionDutchAuctionEnd,
334    >,
335    #[prost(message, repeated, tag = "75")]
336    pub dutch_auction_withdraw_actions: ::prost::alloc::vec::Vec<
337        transaction_planner_request::ActionDutchAuctionWithdraw,
338    >,
339    #[prost(message, repeated, tag = "76")]
340    pub delegator_votes: ::prost::alloc::vec::Vec<
341        transaction_planner_request::DelegatorVote,
342    >,
343    /// The epoch index of the transaction being planned.
344    #[deprecated]
345    #[prost(uint64, tag = "200")]
346    pub epoch_index: u64,
347    /// The epoch of the transaction being planned.
348    #[prost(message, optional, tag = "201")]
349    pub epoch: ::core::option::Option<super::super::core::component::sct::v1::Epoch>,
350    /// Specifies either that the planner should compute fees automatically or that it should use a fixed fee amount.
351    #[prost(oneof = "transaction_planner_request::FeeMode", tags = "100, 101")]
352    pub fee_mode: ::core::option::Option<transaction_planner_request::FeeMode>,
353}
354/// Nested message and enum types in `TransactionPlannerRequest`.
355pub mod transaction_planner_request {
356    /// Request message subtypes
357    #[derive(Clone, PartialEq, ::prost::Message)]
358    pub struct Output {
359        /// The amount and denomination in which the Output is issued.
360        #[prost(message, optional, tag = "1")]
361        pub value: ::core::option::Option<super::super::super::core::asset::v1::Value>,
362        /// The address to which Output will be sent.
363        #[prost(message, optional, tag = "2")]
364        pub address: ::core::option::Option<
365            super::super::super::core::keys::v1::Address,
366        >,
367    }
368    impl ::prost::Name for Output {
369        const NAME: &'static str = "Output";
370        const PACKAGE: &'static str = "penumbra.view.v1";
371        fn full_name() -> ::prost::alloc::string::String {
372            "penumbra.view.v1.TransactionPlannerRequest.Output".into()
373        }
374        fn type_url() -> ::prost::alloc::string::String {
375            "/penumbra.view.v1.TransactionPlannerRequest.Output".into()
376        }
377    }
378    #[derive(Clone, PartialEq, ::prost::Message)]
379    pub struct Spend {
380        /// The input amount and denomination in which the Spend is issued.
381        #[prost(message, optional, tag = "1")]
382        pub value: ::core::option::Option<super::super::super::core::asset::v1::Value>,
383        /// The source address from which the Spend will be sent.
384        #[prost(message, optional, tag = "2")]
385        pub address: ::core::option::Option<
386            super::super::super::core::keys::v1::Address,
387        >,
388    }
389    impl ::prost::Name for Spend {
390        const NAME: &'static str = "Spend";
391        const PACKAGE: &'static str = "penumbra.view.v1";
392        fn full_name() -> ::prost::alloc::string::String {
393            "penumbra.view.v1.TransactionPlannerRequest.Spend".into()
394        }
395        fn type_url() -> ::prost::alloc::string::String {
396            "/penumbra.view.v1.TransactionPlannerRequest.Spend".into()
397        }
398    }
399    #[derive(Clone, PartialEq, ::prost::Message)]
400    pub struct Swap {
401        /// The input amount and denomination to be traded in the Swap.
402        #[prost(message, optional, tag = "1")]
403        pub value: ::core::option::Option<super::super::super::core::asset::v1::Value>,
404        /// The denomination to be received as a Output of the Swap.
405        #[prost(message, optional, tag = "2")]
406        pub target_asset: ::core::option::Option<
407            super::super::super::core::asset::v1::AssetId,
408        >,
409        /// The pre-paid fee to be paid for claiming the Swap outputs.
410        #[prost(message, optional, tag = "3")]
411        pub fee: ::core::option::Option<
412            super::super::super::core::component::fee::v1::Fee,
413        >,
414        /// The address to which swap claim output will be sent.
415        #[prost(message, optional, tag = "4")]
416        pub claim_address: ::core::option::Option<
417            super::super::super::core::keys::v1::Address,
418        >,
419    }
420    impl ::prost::Name for Swap {
421        const NAME: &'static str = "Swap";
422        const PACKAGE: &'static str = "penumbra.view.v1";
423        fn full_name() -> ::prost::alloc::string::String {
424            "penumbra.view.v1.TransactionPlannerRequest.Swap".into()
425        }
426        fn type_url() -> ::prost::alloc::string::String {
427            "/penumbra.view.v1.TransactionPlannerRequest.Swap".into()
428        }
429    }
430    #[derive(Clone, PartialEq, ::prost::Message)]
431    pub struct SwapClaim {
432        /// SwapCommitment to identify the Swap to be claimed.
433        /// Use the commitment from the Swap message:
434        /// penumbra.core.component.dex.v1.Swap.body.payload.commitment.
435        #[prost(message, optional, tag = "1")]
436        pub swap_commitment: ::core::option::Option<
437            super::super::super::crypto::tct::v1::StateCommitment,
438        >,
439    }
440    impl ::prost::Name for SwapClaim {
441        const NAME: &'static str = "SwapClaim";
442        const PACKAGE: &'static str = "penumbra.view.v1";
443        fn full_name() -> ::prost::alloc::string::String {
444            "penumbra.view.v1.TransactionPlannerRequest.SwapClaim".into()
445        }
446        fn type_url() -> ::prost::alloc::string::String {
447            "/penumbra.view.v1.TransactionPlannerRequest.SwapClaim".into()
448        }
449    }
450    #[derive(Clone, PartialEq, ::prost::Message)]
451    pub struct Delegate {
452        #[prost(message, optional, tag = "1")]
453        pub amount: ::core::option::Option<super::super::super::core::num::v1::Amount>,
454        #[prost(message, optional, tag = "3")]
455        pub rate_data: ::core::option::Option<
456            super::super::super::core::component::stake::v1::RateData,
457        >,
458    }
459    impl ::prost::Name for Delegate {
460        const NAME: &'static str = "Delegate";
461        const PACKAGE: &'static str = "penumbra.view.v1";
462        fn full_name() -> ::prost::alloc::string::String {
463            "penumbra.view.v1.TransactionPlannerRequest.Delegate".into()
464        }
465        fn type_url() -> ::prost::alloc::string::String {
466            "/penumbra.view.v1.TransactionPlannerRequest.Delegate".into()
467        }
468    }
469    #[derive(Clone, PartialEq, ::prost::Message)]
470    pub struct Undelegate {
471        #[prost(message, optional, tag = "1")]
472        pub value: ::core::option::Option<super::super::super::core::asset::v1::Value>,
473        #[prost(message, optional, tag = "2")]
474        pub rate_data: ::core::option::Option<
475            super::super::super::core::component::stake::v1::RateData,
476        >,
477    }
478    impl ::prost::Name for Undelegate {
479        const NAME: &'static str = "Undelegate";
480        const PACKAGE: &'static str = "penumbra.view.v1";
481        fn full_name() -> ::prost::alloc::string::String {
482            "penumbra.view.v1.TransactionPlannerRequest.Undelegate".into()
483        }
484        fn type_url() -> ::prost::alloc::string::String {
485            "/penumbra.view.v1.TransactionPlannerRequest.Undelegate".into()
486        }
487    }
488    #[derive(Clone, PartialEq, ::prost::Message)]
489    pub struct UndelegateClaim {
490        /// The identity key of the validator to finish undelegating from.
491        #[prost(message, optional, tag = "1")]
492        pub validator_identity: ::core::option::Option<
493            super::super::super::core::keys::v1::IdentityKey,
494        >,
495        /// The epoch in which unbonding began, used to verify the penalty.
496        #[deprecated]
497        #[prost(uint64, tag = "2")]
498        pub start_epoch_index: u64,
499        /// The penalty applied to undelegation, in bps^2 (10e-8).
500        /// In the happy path (no slashing), this is 0.
501        #[prost(message, optional, tag = "3")]
502        pub penalty: ::core::option::Option<
503            super::super::super::core::component::stake::v1::Penalty,
504        >,
505        /// The amount of unbonding tokens to claim.
506        /// This is a bare number because its denom is determined by the preceding data.
507        #[prost(message, optional, tag = "4")]
508        pub unbonding_amount: ::core::option::Option<
509            super::super::super::core::num::v1::Amount,
510        >,
511        /// The height at which unbonding began.
512        #[prost(uint64, tag = "5")]
513        pub unbonding_start_height: u64,
514    }
515    impl ::prost::Name for UndelegateClaim {
516        const NAME: &'static str = "UndelegateClaim";
517        const PACKAGE: &'static str = "penumbra.view.v1";
518        fn full_name() -> ::prost::alloc::string::String {
519            "penumbra.view.v1.TransactionPlannerRequest.UndelegateClaim".into()
520        }
521        fn type_url() -> ::prost::alloc::string::String {
522            "/penumbra.view.v1.TransactionPlannerRequest.UndelegateClaim".into()
523        }
524    }
525    #[derive(Clone, PartialEq, ::prost::Message)]
526    pub struct PositionOpen {
527        /// Contains the data defining the position, sufficient to compute its `PositionId`.
528        ///
529        /// Positions are immutable, so the `PositionData` (and hence the `PositionId`)
530        /// are unchanged over the entire lifetime of the position.
531        #[prost(message, optional, tag = "1")]
532        pub position: ::core::option::Option<
533            super::super::super::core::component::dex::v1::Position,
534        >,
535    }
536    impl ::prost::Name for PositionOpen {
537        const NAME: &'static str = "PositionOpen";
538        const PACKAGE: &'static str = "penumbra.view.v1";
539        fn full_name() -> ::prost::alloc::string::String {
540            "penumbra.view.v1.TransactionPlannerRequest.PositionOpen".into()
541        }
542        fn type_url() -> ::prost::alloc::string::String {
543            "/penumbra.view.v1.TransactionPlannerRequest.PositionOpen".into()
544        }
545    }
546    #[derive(Clone, PartialEq, ::prost::Message)]
547    pub struct PositionClose {
548        /// The position to close.
549        #[prost(message, optional, tag = "1")]
550        pub position_id: ::core::option::Option<
551            super::super::super::core::component::dex::v1::PositionId,
552        >,
553    }
554    impl ::prost::Name for PositionClose {
555        const NAME: &'static str = "PositionClose";
556        const PACKAGE: &'static str = "penumbra.view.v1";
557        fn full_name() -> ::prost::alloc::string::String {
558            "penumbra.view.v1.TransactionPlannerRequest.PositionClose".into()
559        }
560        fn type_url() -> ::prost::alloc::string::String {
561            "/penumbra.view.v1.TransactionPlannerRequest.PositionClose".into()
562        }
563    }
564    #[derive(Clone, PartialEq, ::prost::Message)]
565    pub struct PositionWithdraw {
566        /// The position to withdraw.
567        #[prost(message, optional, tag = "1")]
568        pub position_id: ::core::option::Option<
569            super::super::super::core::component::dex::v1::PositionId,
570        >,
571        /// The position's final reserves.
572        #[prost(message, optional, tag = "2")]
573        pub reserves: ::core::option::Option<
574            super::super::super::core::component::dex::v1::Reserves,
575        >,
576        /// The trading pair of the position.
577        #[prost(message, optional, tag = "3")]
578        pub trading_pair: ::core::option::Option<
579            super::super::super::core::component::dex::v1::TradingPair,
580        >,
581    }
582    impl ::prost::Name for PositionWithdraw {
583        const NAME: &'static str = "PositionWithdraw";
584        const PACKAGE: &'static str = "penumbra.view.v1";
585        fn full_name() -> ::prost::alloc::string::String {
586            "penumbra.view.v1.TransactionPlannerRequest.PositionWithdraw".into()
587        }
588        fn type_url() -> ::prost::alloc::string::String {
589            "/penumbra.view.v1.TransactionPlannerRequest.PositionWithdraw".into()
590        }
591    }
592    #[derive(Clone, PartialEq, ::prost::Message)]
593    pub struct ActionDutchAuctionSchedule {
594        /// The description of the auction to schedule.
595        #[prost(message, optional, tag = "1")]
596        pub description: ::core::option::Option<
597            super::super::super::core::component::auction::v1::DutchAuctionDescription,
598        >,
599    }
600    impl ::prost::Name for ActionDutchAuctionSchedule {
601        const NAME: &'static str = "ActionDutchAuctionSchedule";
602        const PACKAGE: &'static str = "penumbra.view.v1";
603        fn full_name() -> ::prost::alloc::string::String {
604            "penumbra.view.v1.TransactionPlannerRequest.ActionDutchAuctionSchedule"
605                .into()
606        }
607        fn type_url() -> ::prost::alloc::string::String {
608            "/penumbra.view.v1.TransactionPlannerRequest.ActionDutchAuctionSchedule"
609                .into()
610        }
611    }
612    #[derive(Clone, PartialEq, ::prost::Message)]
613    pub struct ActionDutchAuctionEnd {
614        /// The unique id of the auction to close.
615        #[prost(message, optional, tag = "1")]
616        pub auction_id: ::core::option::Option<
617            super::super::super::core::component::auction::v1::AuctionId,
618        >,
619    }
620    impl ::prost::Name for ActionDutchAuctionEnd {
621        const NAME: &'static str = "ActionDutchAuctionEnd";
622        const PACKAGE: &'static str = "penumbra.view.v1";
623        fn full_name() -> ::prost::alloc::string::String {
624            "penumbra.view.v1.TransactionPlannerRequest.ActionDutchAuctionEnd".into()
625        }
626        fn type_url() -> ::prost::alloc::string::String {
627            "/penumbra.view.v1.TransactionPlannerRequest.ActionDutchAuctionEnd".into()
628        }
629    }
630    #[derive(Clone, PartialEq, ::prost::Message)]
631    pub struct ActionDutchAuctionWithdraw {
632        /// The auction to withdraw funds from.
633        #[prost(message, optional, tag = "1")]
634        pub auction_id: ::core::option::Option<
635            super::super::super::core::component::auction::v1::AuctionId,
636        >,
637        /// The sequence number of the withdrawal.
638        #[prost(uint64, tag = "2")]
639        pub seq: u64,
640    }
641    impl ::prost::Name for ActionDutchAuctionWithdraw {
642        const NAME: &'static str = "ActionDutchAuctionWithdraw";
643        const PACKAGE: &'static str = "penumbra.view.v1";
644        fn full_name() -> ::prost::alloc::string::String {
645            "penumbra.view.v1.TransactionPlannerRequest.ActionDutchAuctionWithdraw"
646                .into()
647        }
648        fn type_url() -> ::prost::alloc::string::String {
649            "/penumbra.view.v1.TransactionPlannerRequest.ActionDutchAuctionWithdraw"
650                .into()
651        }
652    }
653    #[derive(Clone, PartialEq, ::prost::Message)]
654    pub struct DelegatorVote {
655        /// The proposal being voted on.
656        #[prost(uint64, tag = "1")]
657        pub proposal: u64,
658        /// The vote.
659        #[prost(message, optional, tag = "2")]
660        pub vote: ::core::option::Option<
661            super::super::super::core::component::governance::v1::Vote,
662        >,
663        /// The block height at which the proposal started voting.
664        #[prost(uint64, tag = "3")]
665        pub start_block_height: u64,
666        /// The position of the state commitment tree at which the proposal is considered to have started voting.
667        #[prost(uint64, tag = "4")]
668        pub start_position: u64,
669        /// The validators rate data for the proposal.
670        #[prost(message, repeated, tag = "5")]
671        pub rate_data: ::prost::alloc::vec::Vec<
672            super::super::super::core::component::stake::v1::RateData,
673        >,
674    }
675    impl ::prost::Name for DelegatorVote {
676        const NAME: &'static str = "DelegatorVote";
677        const PACKAGE: &'static str = "penumbra.view.v1";
678        fn full_name() -> ::prost::alloc::string::String {
679            "penumbra.view.v1.TransactionPlannerRequest.DelegatorVote".into()
680        }
681        fn type_url() -> ::prost::alloc::string::String {
682            "/penumbra.view.v1.TransactionPlannerRequest.DelegatorVote".into()
683        }
684    }
685    /// Specifies either that the planner should compute fees automatically or that it should use a fixed fee amount.
686    #[derive(Clone, PartialEq, ::prost::Oneof)]
687    pub enum FeeMode {
688        /// Automatically compute a fee based on gas use.
689        #[prost(message, tag = "100")]
690        AutoFee(super::super::super::core::component::fee::v1::FeeTier),
691        /// A manually set fee, rather than automatically computing a fee based on gas use.
692        #[prost(message, tag = "101")]
693        ManualFee(super::super::super::core::component::fee::v1::Fee),
694    }
695}
696impl ::prost::Name for TransactionPlannerRequest {
697    const NAME: &'static str = "TransactionPlannerRequest";
698    const PACKAGE: &'static str = "penumbra.view.v1";
699    fn full_name() -> ::prost::alloc::string::String {
700        "penumbra.view.v1.TransactionPlannerRequest".into()
701    }
702    fn type_url() -> ::prost::alloc::string::String {
703        "/penumbra.view.v1.TransactionPlannerRequest".into()
704    }
705}
706#[derive(Clone, PartialEq, ::prost::Message)]
707pub struct TransactionPlannerResponse {
708    #[prost(message, optional, tag = "1")]
709    pub plan: ::core::option::Option<
710        super::super::core::transaction::v1::TransactionPlan,
711    >,
712}
713impl ::prost::Name for TransactionPlannerResponse {
714    const NAME: &'static str = "TransactionPlannerResponse";
715    const PACKAGE: &'static str = "penumbra.view.v1";
716    fn full_name() -> ::prost::alloc::string::String {
717        "penumbra.view.v1.TransactionPlannerResponse".into()
718    }
719    fn type_url() -> ::prost::alloc::string::String {
720        "/penumbra.view.v1.TransactionPlannerResponse".into()
721    }
722}
723#[derive(Clone, PartialEq, ::prost::Message)]
724pub struct AddressByIndexRequest {
725    #[prost(message, optional, tag = "1")]
726    pub address_index: ::core::option::Option<
727        super::super::core::keys::v1::AddressIndex,
728    >,
729}
730impl ::prost::Name for AddressByIndexRequest {
731    const NAME: &'static str = "AddressByIndexRequest";
732    const PACKAGE: &'static str = "penumbra.view.v1";
733    fn full_name() -> ::prost::alloc::string::String {
734        "penumbra.view.v1.AddressByIndexRequest".into()
735    }
736    fn type_url() -> ::prost::alloc::string::String {
737        "/penumbra.view.v1.AddressByIndexRequest".into()
738    }
739}
740#[derive(Clone, PartialEq, ::prost::Message)]
741pub struct AddressByIndexResponse {
742    #[prost(message, optional, tag = "1")]
743    pub address: ::core::option::Option<super::super::core::keys::v1::Address>,
744}
745impl ::prost::Name for AddressByIndexResponse {
746    const NAME: &'static str = "AddressByIndexResponse";
747    const PACKAGE: &'static str = "penumbra.view.v1";
748    fn full_name() -> ::prost::alloc::string::String {
749        "penumbra.view.v1.AddressByIndexResponse".into()
750    }
751    fn type_url() -> ::prost::alloc::string::String {
752        "/penumbra.view.v1.AddressByIndexResponse".into()
753    }
754}
755#[derive(Clone, Copy, PartialEq, ::prost::Message)]
756pub struct WalletIdRequest {}
757impl ::prost::Name for WalletIdRequest {
758    const NAME: &'static str = "WalletIdRequest";
759    const PACKAGE: &'static str = "penumbra.view.v1";
760    fn full_name() -> ::prost::alloc::string::String {
761        "penumbra.view.v1.WalletIdRequest".into()
762    }
763    fn type_url() -> ::prost::alloc::string::String {
764        "/penumbra.view.v1.WalletIdRequest".into()
765    }
766}
767#[derive(Clone, PartialEq, ::prost::Message)]
768pub struct WalletIdResponse {
769    #[prost(message, optional, tag = "1")]
770    pub wallet_id: ::core::option::Option<super::super::core::keys::v1::WalletId>,
771}
772impl ::prost::Name for WalletIdResponse {
773    const NAME: &'static str = "WalletIdResponse";
774    const PACKAGE: &'static str = "penumbra.view.v1";
775    fn full_name() -> ::prost::alloc::string::String {
776        "penumbra.view.v1.WalletIdResponse".into()
777    }
778    fn type_url() -> ::prost::alloc::string::String {
779        "/penumbra.view.v1.WalletIdResponse".into()
780    }
781}
782#[derive(Clone, PartialEq, ::prost::Message)]
783pub struct IndexByAddressRequest {
784    #[prost(message, optional, tag = "1")]
785    pub address: ::core::option::Option<super::super::core::keys::v1::Address>,
786}
787impl ::prost::Name for IndexByAddressRequest {
788    const NAME: &'static str = "IndexByAddressRequest";
789    const PACKAGE: &'static str = "penumbra.view.v1";
790    fn full_name() -> ::prost::alloc::string::String {
791        "penumbra.view.v1.IndexByAddressRequest".into()
792    }
793    fn type_url() -> ::prost::alloc::string::String {
794        "/penumbra.view.v1.IndexByAddressRequest".into()
795    }
796}
797#[derive(Clone, PartialEq, ::prost::Message)]
798pub struct IndexByAddressResponse {
799    /// Will be absent if given an address not viewable by this viewing service
800    #[prost(message, optional, tag = "1")]
801    pub address_index: ::core::option::Option<
802        super::super::core::keys::v1::AddressIndex,
803    >,
804}
805impl ::prost::Name for IndexByAddressResponse {
806    const NAME: &'static str = "IndexByAddressResponse";
807    const PACKAGE: &'static str = "penumbra.view.v1";
808    fn full_name() -> ::prost::alloc::string::String {
809        "penumbra.view.v1.IndexByAddressResponse".into()
810    }
811    fn type_url() -> ::prost::alloc::string::String {
812        "/penumbra.view.v1.IndexByAddressResponse".into()
813    }
814}
815#[derive(Clone, PartialEq, ::prost::Message)]
816pub struct EphemeralAddressRequest {
817    #[prost(message, optional, tag = "1")]
818    pub address_index: ::core::option::Option<
819        super::super::core::keys::v1::AddressIndex,
820    >,
821}
822impl ::prost::Name for EphemeralAddressRequest {
823    const NAME: &'static str = "EphemeralAddressRequest";
824    const PACKAGE: &'static str = "penumbra.view.v1";
825    fn full_name() -> ::prost::alloc::string::String {
826        "penumbra.view.v1.EphemeralAddressRequest".into()
827    }
828    fn type_url() -> ::prost::alloc::string::String {
829        "/penumbra.view.v1.EphemeralAddressRequest".into()
830    }
831}
832#[derive(Clone, PartialEq, ::prost::Message)]
833pub struct EphemeralAddressResponse {
834    #[prost(message, optional, tag = "1")]
835    pub address: ::core::option::Option<super::super::core::keys::v1::Address>,
836}
837impl ::prost::Name for EphemeralAddressResponse {
838    const NAME: &'static str = "EphemeralAddressResponse";
839    const PACKAGE: &'static str = "penumbra.view.v1";
840    fn full_name() -> ::prost::alloc::string::String {
841        "penumbra.view.v1.EphemeralAddressResponse".into()
842    }
843    fn type_url() -> ::prost::alloc::string::String {
844        "/penumbra.view.v1.EphemeralAddressResponse".into()
845    }
846}
847#[derive(Clone, PartialEq, ::prost::Message)]
848pub struct BalancesRequest {
849    /// If present, filter balances to only include the account specified by the `AddressIndex`.
850    #[prost(message, optional, tag = "1")]
851    pub account_filter: ::core::option::Option<
852        super::super::core::keys::v1::AddressIndex,
853    >,
854    /// If present, filter balances to only include the specified asset ID.
855    #[prost(message, optional, tag = "2")]
856    pub asset_id_filter: ::core::option::Option<super::super::core::asset::v1::AssetId>,
857}
858impl ::prost::Name for BalancesRequest {
859    const NAME: &'static str = "BalancesRequest";
860    const PACKAGE: &'static str = "penumbra.view.v1";
861    fn full_name() -> ::prost::alloc::string::String {
862        "penumbra.view.v1.BalancesRequest".into()
863    }
864    fn type_url() -> ::prost::alloc::string::String {
865        "/penumbra.view.v1.BalancesRequest".into()
866    }
867}
868#[derive(Clone, PartialEq, ::prost::Message)]
869pub struct BalancesResponse {
870    /// Deprecated: use `account_address` instead.
871    #[deprecated]
872    #[prost(message, optional, tag = "1")]
873    pub account: ::core::option::Option<super::super::core::keys::v1::AddressIndex>,
874    /// Deprecated: use `balance_view` instead.
875    #[deprecated]
876    #[prost(message, optional, tag = "2")]
877    pub balance: ::core::option::Option<super::super::core::asset::v1::Value>,
878    /// The default address for the account.
879    ///
880    /// Note that the returned balance is for all funds sent to the account,
881    /// not just funds sent to its default address.
882    #[prost(message, optional, tag = "3")]
883    pub account_address: ::core::option::Option<
884        super::super::core::keys::v1::AddressView,
885    >,
886    /// The account's balance, with metadata.
887    #[prost(message, optional, tag = "4")]
888    pub balance_view: ::core::option::Option<super::super::core::asset::v1::ValueView>,
889}
890impl ::prost::Name for BalancesResponse {
891    const NAME: &'static str = "BalancesResponse";
892    const PACKAGE: &'static str = "penumbra.view.v1";
893    fn full_name() -> ::prost::alloc::string::String {
894        "penumbra.view.v1.BalancesResponse".into()
895    }
896    fn type_url() -> ::prost::alloc::string::String {
897        "/penumbra.view.v1.BalancesResponse".into()
898    }
899}
900/// Requests sync status of the view service.
901#[derive(Clone, Copy, PartialEq, ::prost::Message)]
902pub struct StatusRequest {}
903impl ::prost::Name for StatusRequest {
904    const NAME: &'static str = "StatusRequest";
905    const PACKAGE: &'static str = "penumbra.view.v1";
906    fn full_name() -> ::prost::alloc::string::String {
907        "penumbra.view.v1.StatusRequest".into()
908    }
909    fn type_url() -> ::prost::alloc::string::String {
910        "/penumbra.view.v1.StatusRequest".into()
911    }
912}
913/// Returns the status of the view service and whether it is synchronized with the chain state.
914#[derive(Clone, Copy, PartialEq, ::prost::Message)]
915pub struct StatusResponse {
916    /// The height the view service has synchronized to so far when doing a full linear sync
917    #[prost(uint64, tag = "1")]
918    pub full_sync_height: u64,
919    /// The height the view service has synchronized to so far when doing a partial sync
920    #[prost(uint64, tag = "2")]
921    pub partial_sync_height: u64,
922    /// Whether the view service is catching up with the chain state
923    #[prost(bool, tag = "3")]
924    pub catching_up: bool,
925}
926impl ::prost::Name for StatusResponse {
927    const NAME: &'static str = "StatusResponse";
928    const PACKAGE: &'static str = "penumbra.view.v1";
929    fn full_name() -> ::prost::alloc::string::String {
930        "penumbra.view.v1.StatusResponse".into()
931    }
932    fn type_url() -> ::prost::alloc::string::String {
933        "/penumbra.view.v1.StatusResponse".into()
934    }
935}
936/// Requests streaming updates on the sync height until the view service is synchronized.
937#[derive(Clone, Copy, PartialEq, ::prost::Message)]
938pub struct StatusStreamRequest {}
939impl ::prost::Name for StatusStreamRequest {
940    const NAME: &'static str = "StatusStreamRequest";
941    const PACKAGE: &'static str = "penumbra.view.v1";
942    fn full_name() -> ::prost::alloc::string::String {
943        "penumbra.view.v1.StatusStreamRequest".into()
944    }
945    fn type_url() -> ::prost::alloc::string::String {
946        "/penumbra.view.v1.StatusStreamRequest".into()
947    }
948}
949/// A streaming sync status update
950#[derive(Clone, Copy, PartialEq, ::prost::Message)]
951pub struct StatusStreamResponse {
952    /// The latest known block height
953    #[prost(uint64, tag = "1")]
954    pub latest_known_block_height: u64,
955    /// The height the view service has synchronized to so far when doing a full linear sync
956    #[prost(uint64, tag = "2")]
957    pub full_sync_height: u64,
958    /// The height the view service has synchronized to so far when doing a partial sync
959    #[prost(uint64, tag = "3")]
960    pub partial_sync_height: u64,
961}
962impl ::prost::Name for StatusStreamResponse {
963    const NAME: &'static str = "StatusStreamResponse";
964    const PACKAGE: &'static str = "penumbra.view.v1";
965    fn full_name() -> ::prost::alloc::string::String {
966        "penumbra.view.v1.StatusStreamResponse".into()
967    }
968    fn type_url() -> ::prost::alloc::string::String {
969        "/penumbra.view.v1.StatusStreamResponse".into()
970    }
971}
972/// A query for notes known by the view service.
973///
974/// This message uses the fact that all proto fields are optional
975/// to allow various filtering on the returned notes.
976#[derive(Clone, PartialEq, ::prost::Message)]
977pub struct NotesRequest {
978    /// If set, return spent notes as well as unspent notes.
979    #[prost(bool, tag = "2")]
980    pub include_spent: bool,
981    /// If set, only return notes with the specified asset id.
982    #[prost(message, optional, tag = "3")]
983    pub asset_id: ::core::option::Option<super::super::core::asset::v1::AssetId>,
984    /// If set, only return notes with the specified address incore.component.dex.v1.
985    #[prost(message, optional, tag = "4")]
986    pub address_index: ::core::option::Option<
987        super::super::core::keys::v1::AddressIndex,
988    >,
989    /// If set, stop returning notes once the total exceeds this amount.
990    ///
991    /// Ignored if `asset_id` is unset or if `include_spent` is set.
992    #[prost(message, optional, tag = "6")]
993    pub amount_to_spend: ::core::option::Option<super::super::core::num::v1::Amount>,
994}
995impl ::prost::Name for NotesRequest {
996    const NAME: &'static str = "NotesRequest";
997    const PACKAGE: &'static str = "penumbra.view.v1";
998    fn full_name() -> ::prost::alloc::string::String {
999        "penumbra.view.v1.NotesRequest".into()
1000    }
1001    fn type_url() -> ::prost::alloc::string::String {
1002        "/penumbra.view.v1.NotesRequest".into()
1003    }
1004}
1005/// A query for notes to be used for voting on a proposal.
1006#[derive(Clone, PartialEq, ::prost::Message)]
1007pub struct NotesForVotingRequest {
1008    /// The starting height of the proposal.
1009    #[prost(uint64, tag = "1")]
1010    pub votable_at_height: u64,
1011    /// If set, only return notes with the specified asset id.
1012    #[prost(message, optional, tag = "3")]
1013    pub address_index: ::core::option::Option<
1014        super::super::core::keys::v1::AddressIndex,
1015    >,
1016}
1017impl ::prost::Name for NotesForVotingRequest {
1018    const NAME: &'static str = "NotesForVotingRequest";
1019    const PACKAGE: &'static str = "penumbra.view.v1";
1020    fn full_name() -> ::prost::alloc::string::String {
1021        "penumbra.view.v1.NotesForVotingRequest".into()
1022    }
1023    fn type_url() -> ::prost::alloc::string::String {
1024        "/penumbra.view.v1.NotesForVotingRequest".into()
1025    }
1026}
1027#[derive(Clone, PartialEq, ::prost::Message)]
1028pub struct WitnessRequest {
1029    /// The transaction plan to witness
1030    #[prost(message, optional, tag = "3")]
1031    pub transaction_plan: ::core::option::Option<
1032        super::super::core::transaction::v1::TransactionPlan,
1033    >,
1034}
1035impl ::prost::Name for WitnessRequest {
1036    const NAME: &'static str = "WitnessRequest";
1037    const PACKAGE: &'static str = "penumbra.view.v1";
1038    fn full_name() -> ::prost::alloc::string::String {
1039        "penumbra.view.v1.WitnessRequest".into()
1040    }
1041    fn type_url() -> ::prost::alloc::string::String {
1042        "/penumbra.view.v1.WitnessRequest".into()
1043    }
1044}
1045#[derive(Clone, PartialEq, ::prost::Message)]
1046pub struct WitnessResponse {
1047    #[prost(message, optional, tag = "1")]
1048    pub witness_data: ::core::option::Option<
1049        super::super::core::transaction::v1::WitnessData,
1050    >,
1051}
1052impl ::prost::Name for WitnessResponse {
1053    const NAME: &'static str = "WitnessResponse";
1054    const PACKAGE: &'static str = "penumbra.view.v1";
1055    fn full_name() -> ::prost::alloc::string::String {
1056        "penumbra.view.v1.WitnessResponse".into()
1057    }
1058    fn type_url() -> ::prost::alloc::string::String {
1059        "/penumbra.view.v1.WitnessResponse".into()
1060    }
1061}
1062#[derive(Clone, PartialEq, ::prost::Message)]
1063pub struct WitnessAndBuildRequest {
1064    #[prost(message, optional, tag = "1")]
1065    pub transaction_plan: ::core::option::Option<
1066        super::super::core::transaction::v1::TransactionPlan,
1067    >,
1068    #[prost(message, optional, tag = "2")]
1069    pub authorization_data: ::core::option::Option<
1070        super::super::core::transaction::v1::AuthorizationData,
1071    >,
1072}
1073impl ::prost::Name for WitnessAndBuildRequest {
1074    const NAME: &'static str = "WitnessAndBuildRequest";
1075    const PACKAGE: &'static str = "penumbra.view.v1";
1076    fn full_name() -> ::prost::alloc::string::String {
1077        "penumbra.view.v1.WitnessAndBuildRequest".into()
1078    }
1079    fn type_url() -> ::prost::alloc::string::String {
1080        "/penumbra.view.v1.WitnessAndBuildRequest".into()
1081    }
1082}
1083#[derive(Clone, PartialEq, ::prost::Message)]
1084pub struct WitnessAndBuildResponse {
1085    #[prost(oneof = "witness_and_build_response::Status", tags = "1, 2")]
1086    pub status: ::core::option::Option<witness_and_build_response::Status>,
1087}
1088/// Nested message and enum types in `WitnessAndBuildResponse`.
1089pub mod witness_and_build_response {
1090    /// Signals that building is in progress.
1091    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
1092    pub struct BuildProgress {
1093        /// An approximate progress of the build, from 0 to 1.
1094        #[prost(float, tag = "1")]
1095        pub progress: f32,
1096    }
1097    impl ::prost::Name for BuildProgress {
1098        const NAME: &'static str = "BuildProgress";
1099        const PACKAGE: &'static str = "penumbra.view.v1";
1100        fn full_name() -> ::prost::alloc::string::String {
1101            "penumbra.view.v1.WitnessAndBuildResponse.BuildProgress".into()
1102        }
1103        fn type_url() -> ::prost::alloc::string::String {
1104            "/penumbra.view.v1.WitnessAndBuildResponse.BuildProgress".into()
1105        }
1106    }
1107    /// Signals that the transaction is complete.
1108    #[derive(Clone, PartialEq, ::prost::Message)]
1109    pub struct Complete {
1110        /// The finished transaction.
1111        #[prost(message, optional, tag = "1")]
1112        pub transaction: ::core::option::Option<
1113            super::super::super::core::transaction::v1::Transaction,
1114        >,
1115    }
1116    impl ::prost::Name for Complete {
1117        const NAME: &'static str = "Complete";
1118        const PACKAGE: &'static str = "penumbra.view.v1";
1119        fn full_name() -> ::prost::alloc::string::String {
1120            "penumbra.view.v1.WitnessAndBuildResponse.Complete".into()
1121        }
1122        fn type_url() -> ::prost::alloc::string::String {
1123            "/penumbra.view.v1.WitnessAndBuildResponse.Complete".into()
1124        }
1125    }
1126    #[derive(Clone, PartialEq, ::prost::Oneof)]
1127    pub enum Status {
1128        #[prost(message, tag = "1")]
1129        BuildProgress(BuildProgress),
1130        #[prost(message, tag = "2")]
1131        Complete(Complete),
1132    }
1133}
1134impl ::prost::Name for WitnessAndBuildResponse {
1135    const NAME: &'static str = "WitnessAndBuildResponse";
1136    const PACKAGE: &'static str = "penumbra.view.v1";
1137    fn full_name() -> ::prost::alloc::string::String {
1138        "penumbra.view.v1.WitnessAndBuildResponse".into()
1139    }
1140    fn type_url() -> ::prost::alloc::string::String {
1141        "/penumbra.view.v1.WitnessAndBuildResponse".into()
1142    }
1143}
1144/// Requests all assets known to the view service.
1145#[derive(Clone, PartialEq, ::prost::Message)]
1146pub struct AssetsRequest {
1147    /// If set to false (default), returns all assets, regardless of whether the rest of the fields of
1148    /// the request indicate a filter.
1149    #[prost(bool, tag = "1")]
1150    pub filtered: bool,
1151    /// Include these specific denominations in the response.
1152    #[prost(message, repeated, tag = "2")]
1153    pub include_specific_denominations: ::prost::alloc::vec::Vec<
1154        super::super::core::asset::v1::Denom,
1155    >,
1156    /// Include all delegation tokens, to any validator, in the response.
1157    #[prost(bool, tag = "3")]
1158    pub include_delegation_tokens: bool,
1159    /// Include all unbonding tokens, from any validator, in the response.
1160    #[prost(bool, tag = "4")]
1161    pub include_unbonding_tokens: bool,
1162    /// Include all LP NFTs in the response.
1163    #[prost(bool, tag = "5")]
1164    pub include_lp_nfts: bool,
1165    /// Include all proposal NFTs in the response.
1166    #[prost(bool, tag = "6")]
1167    pub include_proposal_nfts: bool,
1168    /// Include all voting receipt tokens in the response.
1169    #[prost(bool, tag = "7")]
1170    pub include_voting_receipt_tokens: bool,
1171}
1172impl ::prost::Name for AssetsRequest {
1173    const NAME: &'static str = "AssetsRequest";
1174    const PACKAGE: &'static str = "penumbra.view.v1";
1175    fn full_name() -> ::prost::alloc::string::String {
1176        "penumbra.view.v1.AssetsRequest".into()
1177    }
1178    fn type_url() -> ::prost::alloc::string::String {
1179        "/penumbra.view.v1.AssetsRequest".into()
1180    }
1181}
1182/// Requests all assets known to the view service.
1183#[derive(Clone, PartialEq, ::prost::Message)]
1184pub struct AssetsResponse {
1185    #[prost(message, optional, tag = "2")]
1186    pub denom_metadata: ::core::option::Option<super::super::core::asset::v1::Metadata>,
1187}
1188impl ::prost::Name for AssetsResponse {
1189    const NAME: &'static str = "AssetsResponse";
1190    const PACKAGE: &'static str = "penumbra.view.v1";
1191    fn full_name() -> ::prost::alloc::string::String {
1192        "penumbra.view.v1.AssetsResponse".into()
1193    }
1194    fn type_url() -> ::prost::alloc::string::String {
1195        "/penumbra.view.v1.AssetsResponse".into()
1196    }
1197}
1198/// Requests the current app parameters from the view service.
1199#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1200pub struct AppParametersRequest {}
1201impl ::prost::Name for AppParametersRequest {
1202    const NAME: &'static str = "AppParametersRequest";
1203    const PACKAGE: &'static str = "penumbra.view.v1";
1204    fn full_name() -> ::prost::alloc::string::String {
1205        "penumbra.view.v1.AppParametersRequest".into()
1206    }
1207    fn type_url() -> ::prost::alloc::string::String {
1208        "/penumbra.view.v1.AppParametersRequest".into()
1209    }
1210}
1211#[derive(Clone, PartialEq, ::prost::Message)]
1212pub struct AppParametersResponse {
1213    #[prost(message, optional, tag = "1")]
1214    pub parameters: ::core::option::Option<super::super::core::app::v1::AppParameters>,
1215}
1216impl ::prost::Name for AppParametersResponse {
1217    const NAME: &'static str = "AppParametersResponse";
1218    const PACKAGE: &'static str = "penumbra.view.v1";
1219    fn full_name() -> ::prost::alloc::string::String {
1220        "penumbra.view.v1.AppParametersResponse".into()
1221    }
1222    fn type_url() -> ::prost::alloc::string::String {
1223        "/penumbra.view.v1.AppParametersResponse".into()
1224    }
1225}
1226/// Requests the current gas prices from the view service.
1227#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1228pub struct GasPricesRequest {}
1229impl ::prost::Name for GasPricesRequest {
1230    const NAME: &'static str = "GasPricesRequest";
1231    const PACKAGE: &'static str = "penumbra.view.v1";
1232    fn full_name() -> ::prost::alloc::string::String {
1233        "penumbra.view.v1.GasPricesRequest".into()
1234    }
1235    fn type_url() -> ::prost::alloc::string::String {
1236        "/penumbra.view.v1.GasPricesRequest".into()
1237    }
1238}
1239#[derive(Clone, PartialEq, ::prost::Message)]
1240pub struct GasPricesResponse {
1241    /// The current gas prices, in the preferred (native) token.
1242    #[prost(message, optional, tag = "1")]
1243    pub gas_prices: ::core::option::Option<
1244        super::super::core::component::fee::v1::GasPrices,
1245    >,
1246    /// Other gas prices for other accepted tokens.
1247    #[prost(message, repeated, tag = "2")]
1248    pub alt_gas_prices: ::prost::alloc::vec::Vec<
1249        super::super::core::component::fee::v1::GasPrices,
1250    >,
1251}
1252impl ::prost::Name for GasPricesResponse {
1253    const NAME: &'static str = "GasPricesResponse";
1254    const PACKAGE: &'static str = "penumbra.view.v1";
1255    fn full_name() -> ::prost::alloc::string::String {
1256        "penumbra.view.v1.GasPricesResponse".into()
1257    }
1258    fn type_url() -> ::prost::alloc::string::String {
1259        "/penumbra.view.v1.GasPricesResponse".into()
1260    }
1261}
1262/// Requests the current FMD parameters from the view service.
1263#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1264pub struct FmdParametersRequest {}
1265impl ::prost::Name for FmdParametersRequest {
1266    const NAME: &'static str = "FMDParametersRequest";
1267    const PACKAGE: &'static str = "penumbra.view.v1";
1268    fn full_name() -> ::prost::alloc::string::String {
1269        "penumbra.view.v1.FMDParametersRequest".into()
1270    }
1271    fn type_url() -> ::prost::alloc::string::String {
1272        "/penumbra.view.v1.FMDParametersRequest".into()
1273    }
1274}
1275#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1276pub struct FmdParametersResponse {
1277    #[prost(message, optional, tag = "1")]
1278    pub parameters: ::core::option::Option<
1279        super::super::core::component::shielded_pool::v1::FmdParameters,
1280    >,
1281}
1282impl ::prost::Name for FmdParametersResponse {
1283    const NAME: &'static str = "FMDParametersResponse";
1284    const PACKAGE: &'static str = "penumbra.view.v1";
1285    fn full_name() -> ::prost::alloc::string::String {
1286        "penumbra.view.v1.FMDParametersResponse".into()
1287    }
1288    fn type_url() -> ::prost::alloc::string::String {
1289        "/penumbra.view.v1.FMDParametersResponse".into()
1290    }
1291}
1292#[derive(Clone, PartialEq, ::prost::Message)]
1293pub struct NoteByCommitmentRequest {
1294    #[prost(message, optional, tag = "2")]
1295    pub note_commitment: ::core::option::Option<
1296        super::super::crypto::tct::v1::StateCommitment,
1297    >,
1298    /// If set to true, waits to return until the requested note is detected.
1299    #[prost(bool, tag = "3")]
1300    pub await_detection: bool,
1301}
1302impl ::prost::Name for NoteByCommitmentRequest {
1303    const NAME: &'static str = "NoteByCommitmentRequest";
1304    const PACKAGE: &'static str = "penumbra.view.v1";
1305    fn full_name() -> ::prost::alloc::string::String {
1306        "penumbra.view.v1.NoteByCommitmentRequest".into()
1307    }
1308    fn type_url() -> ::prost::alloc::string::String {
1309        "/penumbra.view.v1.NoteByCommitmentRequest".into()
1310    }
1311}
1312#[derive(Clone, PartialEq, ::prost::Message)]
1313pub struct NoteByCommitmentResponse {
1314    #[prost(message, optional, tag = "1")]
1315    pub spendable_note: ::core::option::Option<SpendableNoteRecord>,
1316}
1317impl ::prost::Name for NoteByCommitmentResponse {
1318    const NAME: &'static str = "NoteByCommitmentResponse";
1319    const PACKAGE: &'static str = "penumbra.view.v1";
1320    fn full_name() -> ::prost::alloc::string::String {
1321        "penumbra.view.v1.NoteByCommitmentResponse".into()
1322    }
1323    fn type_url() -> ::prost::alloc::string::String {
1324        "/penumbra.view.v1.NoteByCommitmentResponse".into()
1325    }
1326}
1327#[derive(Clone, PartialEq, ::prost::Message)]
1328pub struct SwapByCommitmentRequest {
1329    #[prost(message, optional, tag = "2")]
1330    pub swap_commitment: ::core::option::Option<
1331        super::super::crypto::tct::v1::StateCommitment,
1332    >,
1333    /// If set to true, waits to return until the requested swap is detected.
1334    #[prost(bool, tag = "3")]
1335    pub await_detection: bool,
1336}
1337impl ::prost::Name for SwapByCommitmentRequest {
1338    const NAME: &'static str = "SwapByCommitmentRequest";
1339    const PACKAGE: &'static str = "penumbra.view.v1";
1340    fn full_name() -> ::prost::alloc::string::String {
1341        "penumbra.view.v1.SwapByCommitmentRequest".into()
1342    }
1343    fn type_url() -> ::prost::alloc::string::String {
1344        "/penumbra.view.v1.SwapByCommitmentRequest".into()
1345    }
1346}
1347#[derive(Clone, PartialEq, ::prost::Message)]
1348pub struct SwapByCommitmentResponse {
1349    #[prost(message, optional, tag = "1")]
1350    pub swap: ::core::option::Option<SwapRecord>,
1351}
1352impl ::prost::Name for SwapByCommitmentResponse {
1353    const NAME: &'static str = "SwapByCommitmentResponse";
1354    const PACKAGE: &'static str = "penumbra.view.v1";
1355    fn full_name() -> ::prost::alloc::string::String {
1356        "penumbra.view.v1.SwapByCommitmentResponse".into()
1357    }
1358    fn type_url() -> ::prost::alloc::string::String {
1359        "/penumbra.view.v1.SwapByCommitmentResponse".into()
1360    }
1361}
1362#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1363pub struct UnclaimedSwapsRequest {}
1364impl ::prost::Name for UnclaimedSwapsRequest {
1365    const NAME: &'static str = "UnclaimedSwapsRequest";
1366    const PACKAGE: &'static str = "penumbra.view.v1";
1367    fn full_name() -> ::prost::alloc::string::String {
1368        "penumbra.view.v1.UnclaimedSwapsRequest".into()
1369    }
1370    fn type_url() -> ::prost::alloc::string::String {
1371        "/penumbra.view.v1.UnclaimedSwapsRequest".into()
1372    }
1373}
1374#[derive(Clone, PartialEq, ::prost::Message)]
1375pub struct UnclaimedSwapsResponse {
1376    #[prost(message, optional, tag = "1")]
1377    pub swap: ::core::option::Option<SwapRecord>,
1378}
1379impl ::prost::Name for UnclaimedSwapsResponse {
1380    const NAME: &'static str = "UnclaimedSwapsResponse";
1381    const PACKAGE: &'static str = "penumbra.view.v1";
1382    fn full_name() -> ::prost::alloc::string::String {
1383        "penumbra.view.v1.UnclaimedSwapsResponse".into()
1384    }
1385    fn type_url() -> ::prost::alloc::string::String {
1386        "/penumbra.view.v1.UnclaimedSwapsResponse".into()
1387    }
1388}
1389#[derive(Clone, PartialEq, ::prost::Message)]
1390pub struct NullifierStatusRequest {
1391    #[prost(message, optional, tag = "2")]
1392    pub nullifier: ::core::option::Option<
1393        super::super::core::component::sct::v1::Nullifier,
1394    >,
1395    #[prost(bool, tag = "3")]
1396    pub await_detection: bool,
1397}
1398impl ::prost::Name for NullifierStatusRequest {
1399    const NAME: &'static str = "NullifierStatusRequest";
1400    const PACKAGE: &'static str = "penumbra.view.v1";
1401    fn full_name() -> ::prost::alloc::string::String {
1402        "penumbra.view.v1.NullifierStatusRequest".into()
1403    }
1404    fn type_url() -> ::prost::alloc::string::String {
1405        "/penumbra.view.v1.NullifierStatusRequest".into()
1406    }
1407}
1408#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1409pub struct NullifierStatusResponse {
1410    #[prost(bool, tag = "1")]
1411    pub spent: bool,
1412}
1413impl ::prost::Name for NullifierStatusResponse {
1414    const NAME: &'static str = "NullifierStatusResponse";
1415    const PACKAGE: &'static str = "penumbra.view.v1";
1416    fn full_name() -> ::prost::alloc::string::String {
1417        "penumbra.view.v1.NullifierStatusResponse".into()
1418    }
1419    fn type_url() -> ::prost::alloc::string::String {
1420        "/penumbra.view.v1.NullifierStatusResponse".into()
1421    }
1422}
1423#[derive(Clone, PartialEq, ::prost::Message)]
1424pub struct TransactionInfoByHashRequest {
1425    /// The transaction hash to query for.
1426    #[prost(message, optional, tag = "2")]
1427    pub id: ::core::option::Option<super::super::core::txhash::v1::TransactionId>,
1428}
1429impl ::prost::Name for TransactionInfoByHashRequest {
1430    const NAME: &'static str = "TransactionInfoByHashRequest";
1431    const PACKAGE: &'static str = "penumbra.view.v1";
1432    fn full_name() -> ::prost::alloc::string::String {
1433        "penumbra.view.v1.TransactionInfoByHashRequest".into()
1434    }
1435    fn type_url() -> ::prost::alloc::string::String {
1436        "/penumbra.view.v1.TransactionInfoByHashRequest".into()
1437    }
1438}
1439#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1440pub struct TransactionInfoRequest {
1441    /// If present, return only transactions after this height.
1442    #[prost(uint64, tag = "1")]
1443    pub start_height: u64,
1444    /// If present, return only transactions before this height.
1445    #[prost(uint64, tag = "2")]
1446    pub end_height: u64,
1447}
1448impl ::prost::Name for TransactionInfoRequest {
1449    const NAME: &'static str = "TransactionInfoRequest";
1450    const PACKAGE: &'static str = "penumbra.view.v1";
1451    fn full_name() -> ::prost::alloc::string::String {
1452        "penumbra.view.v1.TransactionInfoRequest".into()
1453    }
1454    fn type_url() -> ::prost::alloc::string::String {
1455        "/penumbra.view.v1.TransactionInfoRequest".into()
1456    }
1457}
1458#[derive(Clone, PartialEq, ::prost::Message)]
1459pub struct TransactionInfo {
1460    /// The height the transaction was included in a block, if known.
1461    #[prost(uint64, tag = "1")]
1462    pub height: u64,
1463    /// The hash of the transaction.
1464    #[prost(message, optional, tag = "2")]
1465    pub id: ::core::option::Option<super::super::core::txhash::v1::TransactionId>,
1466    /// The transaction data itself.
1467    #[prost(message, optional, tag = "3")]
1468    pub transaction: ::core::option::Option<
1469        super::super::core::transaction::v1::Transaction,
1470    >,
1471    /// The transaction perspective, as seen by this view server.
1472    #[prost(message, optional, tag = "4")]
1473    pub perspective: ::core::option::Option<
1474        super::super::core::transaction::v1::TransactionPerspective,
1475    >,
1476    /// A precomputed transaction view of `transaction` from `perspective`, included for convenience of clients that don't have support for viewing transactions on their own.
1477    #[prost(message, optional, tag = "5")]
1478    pub view: ::core::option::Option<
1479        super::super::core::transaction::v1::TransactionView,
1480    >,
1481    /// A short view of balances leaving and entering accounts, computed from transaction actions.
1482    #[prost(message, optional, tag = "6")]
1483    pub summary: ::core::option::Option<
1484        super::super::core::transaction::v1::TransactionSummary,
1485    >,
1486}
1487impl ::prost::Name for TransactionInfo {
1488    const NAME: &'static str = "TransactionInfo";
1489    const PACKAGE: &'static str = "penumbra.view.v1";
1490    fn full_name() -> ::prost::alloc::string::String {
1491        "penumbra.view.v1.TransactionInfo".into()
1492    }
1493    fn type_url() -> ::prost::alloc::string::String {
1494        "/penumbra.view.v1.TransactionInfo".into()
1495    }
1496}
1497#[derive(Clone, PartialEq, ::prost::Message)]
1498pub struct TransactionInfoResponse {
1499    #[prost(message, optional, tag = "1")]
1500    pub tx_info: ::core::option::Option<TransactionInfo>,
1501}
1502impl ::prost::Name for TransactionInfoResponse {
1503    const NAME: &'static str = "TransactionInfoResponse";
1504    const PACKAGE: &'static str = "penumbra.view.v1";
1505    fn full_name() -> ::prost::alloc::string::String {
1506        "penumbra.view.v1.TransactionInfoResponse".into()
1507    }
1508    fn type_url() -> ::prost::alloc::string::String {
1509        "/penumbra.view.v1.TransactionInfoResponse".into()
1510    }
1511}
1512#[derive(Clone, PartialEq, ::prost::Message)]
1513pub struct TransactionInfoByHashResponse {
1514    #[prost(message, optional, tag = "1")]
1515    pub tx_info: ::core::option::Option<TransactionInfo>,
1516}
1517impl ::prost::Name for TransactionInfoByHashResponse {
1518    const NAME: &'static str = "TransactionInfoByHashResponse";
1519    const PACKAGE: &'static str = "penumbra.view.v1";
1520    fn full_name() -> ::prost::alloc::string::String {
1521        "penumbra.view.v1.TransactionInfoByHashResponse".into()
1522    }
1523    fn type_url() -> ::prost::alloc::string::String {
1524        "/penumbra.view.v1.TransactionInfoByHashResponse".into()
1525    }
1526}
1527#[derive(Clone, PartialEq, ::prost::Message)]
1528pub struct NotesResponse {
1529    #[prost(message, optional, tag = "1")]
1530    pub note_record: ::core::option::Option<SpendableNoteRecord>,
1531}
1532impl ::prost::Name for NotesResponse {
1533    const NAME: &'static str = "NotesResponse";
1534    const PACKAGE: &'static str = "penumbra.view.v1";
1535    fn full_name() -> ::prost::alloc::string::String {
1536        "penumbra.view.v1.NotesResponse".into()
1537    }
1538    fn type_url() -> ::prost::alloc::string::String {
1539        "/penumbra.view.v1.NotesResponse".into()
1540    }
1541}
1542#[derive(Clone, PartialEq, ::prost::Message)]
1543pub struct NotesForVotingResponse {
1544    #[prost(message, optional, tag = "1")]
1545    pub note_record: ::core::option::Option<SpendableNoteRecord>,
1546    #[prost(message, optional, tag = "2")]
1547    pub identity_key: ::core::option::Option<super::super::core::keys::v1::IdentityKey>,
1548}
1549impl ::prost::Name for NotesForVotingResponse {
1550    const NAME: &'static str = "NotesForVotingResponse";
1551    const PACKAGE: &'static str = "penumbra.view.v1";
1552    fn full_name() -> ::prost::alloc::string::String {
1553        "penumbra.view.v1.NotesForVotingResponse".into()
1554    }
1555    fn type_url() -> ::prost::alloc::string::String {
1556        "/penumbra.view.v1.NotesForVotingResponse".into()
1557    }
1558}
1559/// A note plaintext with associated metadata about its status.
1560#[derive(Clone, PartialEq, ::prost::Message)]
1561pub struct SpendableNoteRecord {
1562    /// The note commitment, identifying the note.
1563    #[prost(message, optional, tag = "1")]
1564    pub note_commitment: ::core::option::Option<
1565        super::super::crypto::tct::v1::StateCommitment,
1566    >,
1567    /// The note plaintext itself.
1568    #[prost(message, optional, tag = "2")]
1569    pub note: ::core::option::Option<
1570        super::super::core::component::shielded_pool::v1::Note,
1571    >,
1572    /// A precomputed decryption of the note's address incore.component.dex.v1.
1573    #[prost(message, optional, tag = "3")]
1574    pub address_index: ::core::option::Option<
1575        super::super::core::keys::v1::AddressIndex,
1576    >,
1577    /// The note's nullifier.
1578    #[prost(message, optional, tag = "4")]
1579    pub nullifier: ::core::option::Option<
1580        super::super::core::component::sct::v1::Nullifier,
1581    >,
1582    /// The height at which the note was created.
1583    #[prost(uint64, tag = "5")]
1584    pub height_created: u64,
1585    /// Records whether the note was spent (and if so, at what height).
1586    #[prost(uint64, tag = "6")]
1587    pub height_spent: u64,
1588    /// The note position.
1589    #[prost(uint64, tag = "7")]
1590    pub position: u64,
1591    /// The source of the note
1592    #[prost(message, optional, tag = "8")]
1593    pub source: ::core::option::Option<
1594        super::super::core::component::sct::v1::CommitmentSource,
1595    >,
1596    /// The sender's return address, if known.
1597    #[prost(message, optional, tag = "9")]
1598    pub return_address: ::core::option::Option<
1599        super::super::core::keys::v1::AddressView,
1600    >,
1601}
1602impl ::prost::Name for SpendableNoteRecord {
1603    const NAME: &'static str = "SpendableNoteRecord";
1604    const PACKAGE: &'static str = "penumbra.view.v1";
1605    fn full_name() -> ::prost::alloc::string::String {
1606        "penumbra.view.v1.SpendableNoteRecord".into()
1607    }
1608    fn type_url() -> ::prost::alloc::string::String {
1609        "/penumbra.view.v1.SpendableNoteRecord".into()
1610    }
1611}
1612#[derive(Clone, PartialEq, ::prost::Message)]
1613pub struct SwapRecord {
1614    #[prost(message, optional, tag = "1")]
1615    pub swap_commitment: ::core::option::Option<
1616        super::super::crypto::tct::v1::StateCommitment,
1617    >,
1618    #[prost(message, optional, tag = "2")]
1619    pub swap: ::core::option::Option<
1620        super::super::core::component::dex::v1::SwapPlaintext,
1621    >,
1622    #[prost(uint64, tag = "3")]
1623    pub position: u64,
1624    #[prost(message, optional, tag = "4")]
1625    pub nullifier: ::core::option::Option<
1626        super::super::core::component::sct::v1::Nullifier,
1627    >,
1628    #[prost(message, optional, tag = "5")]
1629    pub output_data: ::core::option::Option<
1630        super::super::core::component::dex::v1::BatchSwapOutputData,
1631    >,
1632    #[prost(uint64, tag = "6")]
1633    pub height_claimed: u64,
1634    #[prost(message, optional, tag = "7")]
1635    pub source: ::core::option::Option<
1636        super::super::core::component::sct::v1::CommitmentSource,
1637    >,
1638}
1639impl ::prost::Name for SwapRecord {
1640    const NAME: &'static str = "SwapRecord";
1641    const PACKAGE: &'static str = "penumbra.view.v1";
1642    fn full_name() -> ::prost::alloc::string::String {
1643        "penumbra.view.v1.SwapRecord".into()
1644    }
1645    fn type_url() -> ::prost::alloc::string::String {
1646        "/penumbra.view.v1.SwapRecord".into()
1647    }
1648}
1649#[derive(Clone, PartialEq, ::prost::Message)]
1650pub struct OwnedPositionIdsRequest {
1651    /// If present, return only positions with this position state.
1652    #[prost(message, optional, tag = "1")]
1653    pub position_state: ::core::option::Option<
1654        super::super::core::component::dex::v1::PositionState,
1655    >,
1656    /// If present, return only positions for this trading pair.
1657    #[prost(message, optional, tag = "2")]
1658    pub trading_pair: ::core::option::Option<
1659        super::super::core::component::dex::v1::TradingPair,
1660    >,
1661    /// If present, return only positions for this subaccount index.
1662    #[prost(message, optional, tag = "3")]
1663    pub subaccount: ::core::option::Option<super::super::core::keys::v1::AddressIndex>,
1664}
1665impl ::prost::Name for OwnedPositionIdsRequest {
1666    const NAME: &'static str = "OwnedPositionIdsRequest";
1667    const PACKAGE: &'static str = "penumbra.view.v1";
1668    fn full_name() -> ::prost::alloc::string::String {
1669        "penumbra.view.v1.OwnedPositionIdsRequest".into()
1670    }
1671    fn type_url() -> ::prost::alloc::string::String {
1672        "/penumbra.view.v1.OwnedPositionIdsRequest".into()
1673    }
1674}
1675#[derive(Clone, PartialEq, ::prost::Message)]
1676pub struct OwnedPositionIdsResponse {
1677    #[prost(message, optional, tag = "1")]
1678    pub position_id: ::core::option::Option<
1679        super::super::core::component::dex::v1::PositionId,
1680    >,
1681    /// The subaccount this position belongs to.
1682    #[prost(message, optional, tag = "2")]
1683    pub subaccount: ::core::option::Option<super::super::core::keys::v1::AddressIndex>,
1684}
1685impl ::prost::Name for OwnedPositionIdsResponse {
1686    const NAME: &'static str = "OwnedPositionIdsResponse";
1687    const PACKAGE: &'static str = "penumbra.view.v1";
1688    fn full_name() -> ::prost::alloc::string::String {
1689        "penumbra.view.v1.OwnedPositionIdsResponse".into()
1690    }
1691    fn type_url() -> ::prost::alloc::string::String {
1692        "/penumbra.view.v1.OwnedPositionIdsResponse".into()
1693    }
1694}
1695/// Requests information on an asset by asset id
1696#[derive(Clone, PartialEq, ::prost::Message)]
1697pub struct AssetMetadataByIdRequest {
1698    /// The asset id to request information on.
1699    #[prost(message, optional, tag = "2")]
1700    pub asset_id: ::core::option::Option<super::super::core::asset::v1::AssetId>,
1701}
1702impl ::prost::Name for AssetMetadataByIdRequest {
1703    const NAME: &'static str = "AssetMetadataByIdRequest";
1704    const PACKAGE: &'static str = "penumbra.view.v1";
1705    fn full_name() -> ::prost::alloc::string::String {
1706        "penumbra.view.v1.AssetMetadataByIdRequest".into()
1707    }
1708    fn type_url() -> ::prost::alloc::string::String {
1709        "/penumbra.view.v1.AssetMetadataByIdRequest".into()
1710    }
1711}
1712#[derive(Clone, PartialEq, ::prost::Message)]
1713pub struct AssetMetadataByIdResponse {
1714    /// If present, information on the requested asset.
1715    ///
1716    /// If the requested asset was unknown, this field will not be present.
1717    #[prost(message, optional, tag = "1")]
1718    pub denom_metadata: ::core::option::Option<super::super::core::asset::v1::Metadata>,
1719}
1720impl ::prost::Name for AssetMetadataByIdResponse {
1721    const NAME: &'static str = "AssetMetadataByIdResponse";
1722    const PACKAGE: &'static str = "penumbra.view.v1";
1723    fn full_name() -> ::prost::alloc::string::String {
1724        "penumbra.view.v1.AssetMetadataByIdResponse".into()
1725    }
1726    fn type_url() -> ::prost::alloc::string::String {
1727        "/penumbra.view.v1.AssetMetadataByIdResponse".into()
1728    }
1729}
1730/// Requests `ValueView`s of delegation tokens for the given address index. The
1731/// returned `ValueView`s will include the `ValidatorInfo` for the delegated
1732/// validator in their `extended_metadata` fields.
1733#[derive(Clone, PartialEq, ::prost::Message)]
1734pub struct DelegationsByAddressIndexRequest {
1735    /// The address index to fetch delegation balances for.
1736    #[prost(message, optional, tag = "1")]
1737    pub address_index: ::core::option::Option<
1738        super::super::core::keys::v1::AddressIndex,
1739    >,
1740    #[prost(enumeration = "delegations_by_address_index_request::Filter", tag = "2")]
1741    pub filter: i32,
1742}
1743/// Nested message and enum types in `DelegationsByAddressIndexRequest`.
1744pub mod delegations_by_address_index_request {
1745    #[derive(
1746        Clone,
1747        Copy,
1748        Debug,
1749        PartialEq,
1750        Eq,
1751        Hash,
1752        PartialOrd,
1753        Ord,
1754        ::prost::Enumeration
1755    )]
1756    #[repr(i32)]
1757    pub enum Filter {
1758        /// By default, returns delegations for all active validators. For validators
1759        /// that the given address index has no delegation tokens for, a `ValueView`
1760        /// with a balance of `0` will be returned.
1761        Unspecified = 0,
1762        /// Returns only delegations to active validators that the given address
1763        /// index holds delegation tokens for.
1764        AllActiveWithNonzeroBalances = 1,
1765        /// Return delegations for all validators, whether active or not. For
1766        /// validators that the given address index has no delegation tokens for, a
1767        /// `ValueView` with a balance of `0` will be returned.
1768        All = 2,
1769    }
1770    impl Filter {
1771        /// String value of the enum field names used in the ProtoBuf definition.
1772        ///
1773        /// The values are not transformed in any way and thus are considered stable
1774        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
1775        pub fn as_str_name(&self) -> &'static str {
1776            match self {
1777                Self::Unspecified => "FILTER_UNSPECIFIED",
1778                Self::AllActiveWithNonzeroBalances => {
1779                    "FILTER_ALL_ACTIVE_WITH_NONZERO_BALANCES"
1780                }
1781                Self::All => "FILTER_ALL",
1782            }
1783        }
1784        /// Creates an enum from field names used in the ProtoBuf definition.
1785        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
1786            match value {
1787                "FILTER_UNSPECIFIED" => Some(Self::Unspecified),
1788                "FILTER_ALL_ACTIVE_WITH_NONZERO_BALANCES" => {
1789                    Some(Self::AllActiveWithNonzeroBalances)
1790                }
1791                "FILTER_ALL" => Some(Self::All),
1792                _ => None,
1793            }
1794        }
1795    }
1796}
1797impl ::prost::Name for DelegationsByAddressIndexRequest {
1798    const NAME: &'static str = "DelegationsByAddressIndexRequest";
1799    const PACKAGE: &'static str = "penumbra.view.v1";
1800    fn full_name() -> ::prost::alloc::string::String {
1801        "penumbra.view.v1.DelegationsByAddressIndexRequest".into()
1802    }
1803    fn type_url() -> ::prost::alloc::string::String {
1804        "/penumbra.view.v1.DelegationsByAddressIndexRequest".into()
1805    }
1806}
1807/// Contains a `ValueView` of delegation tokens for the requested address index.
1808/// The `ValueView` includes the `ValidatorInfo` for the delegated validator in
1809/// cits `extended_metadata` field.
1810#[derive(Clone, PartialEq, ::prost::Message)]
1811pub struct DelegationsByAddressIndexResponse {
1812    #[prost(message, optional, tag = "1")]
1813    pub value_view: ::core::option::Option<super::super::core::asset::v1::ValueView>,
1814}
1815impl ::prost::Name for DelegationsByAddressIndexResponse {
1816    const NAME: &'static str = "DelegationsByAddressIndexResponse";
1817    const PACKAGE: &'static str = "penumbra.view.v1";
1818    fn full_name() -> ::prost::alloc::string::String {
1819        "penumbra.view.v1.DelegationsByAddressIndexResponse".into()
1820    }
1821    fn type_url() -> ::prost::alloc::string::String {
1822        "/penumbra.view.v1.DelegationsByAddressIndexResponse".into()
1823    }
1824}
1825/// Requests unbonding tokens for a given address index, with optional filtering
1826/// for whether the tokens are currently claimable.
1827#[derive(Clone, PartialEq, ::prost::Message)]
1828pub struct UnbondingTokensByAddressIndexRequest {
1829    #[prost(
1830        enumeration = "unbonding_tokens_by_address_index_request::Filter",
1831        tag = "1"
1832    )]
1833    pub filter: i32,
1834    /// The address index to fetch unbonding tokens for.
1835    #[prost(message, optional, tag = "2")]
1836    pub address_index: ::core::option::Option<
1837        super::super::core::keys::v1::AddressIndex,
1838    >,
1839}
1840/// Nested message and enum types in `UnbondingTokensByAddressIndexRequest`.
1841pub mod unbonding_tokens_by_address_index_request {
1842    #[derive(
1843        Clone,
1844        Copy,
1845        Debug,
1846        PartialEq,
1847        Eq,
1848        Hash,
1849        PartialOrd,
1850        Ord,
1851        ::prost::Enumeration
1852    )]
1853    #[repr(i32)]
1854    pub enum Filter {
1855        /// Return all unbonding tokens, regardless of whether they're claimable
1856        /// right now.
1857        Unspecified = 0,
1858        /// Return all unbonding tokens that are currently claimable. This includes:
1859        ///
1860        /// * tokens that have passed the `unbonding_delay` (from `StakeParameters`)
1861        /// * tokens for unbonded validators
1862        Claimable = 1,
1863        /// Return all unbonding tokens that are not yet claimable, because they are
1864        /// still in the `unbonding_delay` (from `StakeParameters`) period.
1865        NotYetClaimable = 2,
1866    }
1867    impl Filter {
1868        /// String value of the enum field names used in the ProtoBuf definition.
1869        ///
1870        /// The values are not transformed in any way and thus are considered stable
1871        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
1872        pub fn as_str_name(&self) -> &'static str {
1873            match self {
1874                Self::Unspecified => "FILTER_UNSPECIFIED",
1875                Self::Claimable => "FILTER_CLAIMABLE",
1876                Self::NotYetClaimable => "FILTER_NOT_YET_CLAIMABLE",
1877            }
1878        }
1879        /// Creates an enum from field names used in the ProtoBuf definition.
1880        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
1881            match value {
1882                "FILTER_UNSPECIFIED" => Some(Self::Unspecified),
1883                "FILTER_CLAIMABLE" => Some(Self::Claimable),
1884                "FILTER_NOT_YET_CLAIMABLE" => Some(Self::NotYetClaimable),
1885                _ => None,
1886            }
1887        }
1888    }
1889}
1890impl ::prost::Name for UnbondingTokensByAddressIndexRequest {
1891    const NAME: &'static str = "UnbondingTokensByAddressIndexRequest";
1892    const PACKAGE: &'static str = "penumbra.view.v1";
1893    fn full_name() -> ::prost::alloc::string::String {
1894        "penumbra.view.v1.UnbondingTokensByAddressIndexRequest".into()
1895    }
1896    fn type_url() -> ::prost::alloc::string::String {
1897        "/penumbra.view.v1.UnbondingTokensByAddressIndexRequest".into()
1898    }
1899}
1900/// Returns unbonding tokens for the given address index, optionally filtered by
1901/// whether the tokens are currently claimable.
1902#[derive(Clone, PartialEq, ::prost::Message)]
1903pub struct UnbondingTokensByAddressIndexResponse {
1904    /// A `ValueView` representing the amount of the given unbonding token.
1905    #[prost(message, optional, tag = "1")]
1906    pub value_view: ::core::option::Option<super::super::core::asset::v1::ValueView>,
1907    /// Whether the unbonding token is currently claimable. This will only be
1908    /// `true` if the `unbonding_delay` (from `StakeParameters`) has passed or the
1909    /// validator has unbonded.
1910    #[prost(bool, tag = "2")]
1911    pub claimable: bool,
1912}
1913impl ::prost::Name for UnbondingTokensByAddressIndexResponse {
1914    const NAME: &'static str = "UnbondingTokensByAddressIndexResponse";
1915    const PACKAGE: &'static str = "penumbra.view.v1";
1916    fn full_name() -> ::prost::alloc::string::String {
1917        "penumbra.view.v1.UnbondingTokensByAddressIndexResponse".into()
1918    }
1919    fn type_url() -> ::prost::alloc::string::String {
1920        "/penumbra.view.v1.UnbondingTokensByAddressIndexResponse".into()
1921    }
1922}
1923/// Requests the latest swaps controlled by the user's wallet.
1924#[derive(Clone, PartialEq, ::prost::Message)]
1925pub struct LatestSwapsRequest {
1926    /// If present, filter balances to only include the account specified by the `AddressIndex`.
1927    #[prost(message, optional, tag = "1")]
1928    pub account_filter: ::core::option::Option<
1929        super::super::core::keys::v1::AddressIndex,
1930    >,
1931    /// If present, filter balances to only include trading activity on the specified pair.
1932    #[prost(message, optional, tag = "2")]
1933    pub pair: ::core::option::Option<
1934        super::super::core::component::dex::v1::DirectedTradingPair,
1935    >,
1936    /// If present, limit the responses to activity that occured after this block height.
1937    #[prost(uint64, tag = "3")]
1938    pub after_height: u64,
1939    /// Limit the response to the last entries within `response_limit`.
1940    #[prost(uint64, tag = "4")]
1941    pub response_limit: u64,
1942}
1943impl ::prost::Name for LatestSwapsRequest {
1944    const NAME: &'static str = "LatestSwapsRequest";
1945    const PACKAGE: &'static str = "penumbra.view.v1";
1946    fn full_name() -> ::prost::alloc::string::String {
1947        "penumbra.view.v1.LatestSwapsRequest".into()
1948    }
1949    fn type_url() -> ::prost::alloc::string::String {
1950        "/penumbra.view.v1.LatestSwapsRequest".into()
1951    }
1952}
1953#[derive(Clone, PartialEq, ::prost::Message)]
1954pub struct LatestSwapsResponse {
1955    /// The trading pair involved in this swap.
1956    #[prost(message, optional, tag = "1")]
1957    pub pair: ::core::option::Option<
1958        super::super::core::component::dex::v1::DirectedTradingPair,
1959    >,
1960    /// The input value for the swap.
1961    #[prost(message, optional, tag = "2")]
1962    pub input: ::core::option::Option<super::super::core::asset::v1::Value>,
1963    /// The output value received from the swap.
1964    #[prost(message, optional, tag = "3")]
1965    pub output: ::core::option::Option<super::super::core::asset::v1::Value>,
1966    /// The block height at which this swap occurred.
1967    #[prost(uint64, tag = "4")]
1968    pub block_height: u64,
1969    /// The hash of the transaction that was broadcast.
1970    #[prost(message, optional, tag = "5")]
1971    pub id: ::core::option::Option<super::super::core::txhash::v1::TransactionId>,
1972}
1973impl ::prost::Name for LatestSwapsResponse {
1974    const NAME: &'static str = "LatestSwapsResponse";
1975    const PACKAGE: &'static str = "penumbra.view.v1";
1976    fn full_name() -> ::prost::alloc::string::String {
1977        "penumbra.view.v1.LatestSwapsResponse".into()
1978    }
1979    fn type_url() -> ::prost::alloc::string::String {
1980        "/penumbra.view.v1.LatestSwapsResponse".into()
1981    }
1982}
1983/// Generated client implementations.
1984#[cfg(feature = "rpc")]
1985pub mod view_service_client {
1986    #![allow(
1987        unused_variables,
1988        dead_code,
1989        missing_docs,
1990        clippy::wildcard_imports,
1991        clippy::let_unit_value,
1992    )]
1993    use tonic::codegen::*;
1994    use tonic::codegen::http::Uri;
1995    /// The view RPC is used by a view client, who wants to do some
1996    /// transaction-related actions, to request data from a view service, which is
1997    /// responsible for synchronizing and scanning the public chain state with one or
1998    /// more full viewing keys.
1999    #[derive(Debug, Clone)]
2000    pub struct ViewServiceClient<T> {
2001        inner: tonic::client::Grpc<T>,
2002    }
2003    impl ViewServiceClient<tonic::transport::Channel> {
2004        /// Attempt to create a new client by connecting to a given endpoint.
2005        pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
2006        where
2007            D: TryInto<tonic::transport::Endpoint>,
2008            D::Error: Into<StdError>,
2009        {
2010            let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
2011            Ok(Self::new(conn))
2012        }
2013    }
2014    impl<T> ViewServiceClient<T>
2015    where
2016        T: tonic::client::GrpcService<tonic::body::BoxBody>,
2017        T::Error: Into<StdError>,
2018        T::ResponseBody: Body<Data = Bytes> + std::marker::Send + 'static,
2019        <T::ResponseBody as Body>::Error: Into<StdError> + std::marker::Send,
2020    {
2021        pub fn new(inner: T) -> Self {
2022            let inner = tonic::client::Grpc::new(inner);
2023            Self { inner }
2024        }
2025        pub fn with_origin(inner: T, origin: Uri) -> Self {
2026            let inner = tonic::client::Grpc::with_origin(inner, origin);
2027            Self { inner }
2028        }
2029        pub fn with_interceptor<F>(
2030            inner: T,
2031            interceptor: F,
2032        ) -> ViewServiceClient<InterceptedService<T, F>>
2033        where
2034            F: tonic::service::Interceptor,
2035            T::ResponseBody: Default,
2036            T: tonic::codegen::Service<
2037                http::Request<tonic::body::BoxBody>,
2038                Response = http::Response<
2039                    <T as tonic::client::GrpcService<tonic::body::BoxBody>>::ResponseBody,
2040                >,
2041            >,
2042            <T as tonic::codegen::Service<
2043                http::Request<tonic::body::BoxBody>,
2044            >>::Error: Into<StdError> + std::marker::Send + std::marker::Sync,
2045        {
2046            ViewServiceClient::new(InterceptedService::new(inner, interceptor))
2047        }
2048        /// Compress requests with the given encoding.
2049        ///
2050        /// This requires the server to support it otherwise it might respond with an
2051        /// error.
2052        #[must_use]
2053        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
2054            self.inner = self.inner.send_compressed(encoding);
2055            self
2056        }
2057        /// Enable decompressing responses.
2058        #[must_use]
2059        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
2060            self.inner = self.inner.accept_compressed(encoding);
2061            self
2062        }
2063        /// Limits the maximum size of a decoded message.
2064        ///
2065        /// Default: `4MB`
2066        #[must_use]
2067        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
2068            self.inner = self.inner.max_decoding_message_size(limit);
2069            self
2070        }
2071        /// Limits the maximum size of an encoded message.
2072        ///
2073        /// Default: `usize::MAX`
2074        #[must_use]
2075        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
2076            self.inner = self.inner.max_encoding_message_size(limit);
2077            self
2078        }
2079        /// Get current status of chain sync
2080        pub async fn status(
2081            &mut self,
2082            request: impl tonic::IntoRequest<super::StatusRequest>,
2083        ) -> std::result::Result<tonic::Response<super::StatusResponse>, tonic::Status> {
2084            self.inner
2085                .ready()
2086                .await
2087                .map_err(|e| {
2088                    tonic::Status::unknown(
2089                        format!("Service was not ready: {}", e.into()),
2090                    )
2091                })?;
2092            let codec = tonic::codec::ProstCodec::default();
2093            let path = http::uri::PathAndQuery::from_static(
2094                "/penumbra.view.v1.ViewService/Status",
2095            );
2096            let mut req = request.into_request();
2097            req.extensions_mut()
2098                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Status"));
2099            self.inner.unary(req, path, codec).await
2100        }
2101        /// Stream sync status updates until the view service has caught up with the chain.
2102        /// Returns a stream of `StatusStreamResponse`s.
2103        pub async fn status_stream(
2104            &mut self,
2105            request: impl tonic::IntoRequest<super::StatusStreamRequest>,
2106        ) -> std::result::Result<
2107            tonic::Response<tonic::codec::Streaming<super::StatusStreamResponse>>,
2108            tonic::Status,
2109        > {
2110            self.inner
2111                .ready()
2112                .await
2113                .map_err(|e| {
2114                    tonic::Status::unknown(
2115                        format!("Service was not ready: {}", e.into()),
2116                    )
2117                })?;
2118            let codec = tonic::codec::ProstCodec::default();
2119            let path = http::uri::PathAndQuery::from_static(
2120                "/penumbra.view.v1.ViewService/StatusStream",
2121            );
2122            let mut req = request.into_request();
2123            req.extensions_mut()
2124                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "StatusStream"));
2125            self.inner.server_streaming(req, path, codec).await
2126        }
2127        /// Queries for notes that have been accepted by the chain.
2128        /// Returns a stream of `NotesResponse`s.
2129        pub async fn notes(
2130            &mut self,
2131            request: impl tonic::IntoRequest<super::NotesRequest>,
2132        ) -> std::result::Result<
2133            tonic::Response<tonic::codec::Streaming<super::NotesResponse>>,
2134            tonic::Status,
2135        > {
2136            self.inner
2137                .ready()
2138                .await
2139                .map_err(|e| {
2140                    tonic::Status::unknown(
2141                        format!("Service was not ready: {}", e.into()),
2142                    )
2143                })?;
2144            let codec = tonic::codec::ProstCodec::default();
2145            let path = http::uri::PathAndQuery::from_static(
2146                "/penumbra.view.v1.ViewService/Notes",
2147            );
2148            let mut req = request.into_request();
2149            req.extensions_mut()
2150                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Notes"));
2151            self.inner.server_streaming(req, path, codec).await
2152        }
2153        /// Returns a stream of `NotesForVotingResponse`s.
2154        pub async fn notes_for_voting(
2155            &mut self,
2156            request: impl tonic::IntoRequest<super::NotesForVotingRequest>,
2157        ) -> std::result::Result<
2158            tonic::Response<tonic::codec::Streaming<super::NotesForVotingResponse>>,
2159            tonic::Status,
2160        > {
2161            self.inner
2162                .ready()
2163                .await
2164                .map_err(|e| {
2165                    tonic::Status::unknown(
2166                        format!("Service was not ready: {}", e.into()),
2167                    )
2168                })?;
2169            let codec = tonic::codec::ProstCodec::default();
2170            let path = http::uri::PathAndQuery::from_static(
2171                "/penumbra.view.v1.ViewService/NotesForVoting",
2172            );
2173            let mut req = request.into_request();
2174            req.extensions_mut()
2175                .insert(
2176                    GrpcMethod::new("penumbra.view.v1.ViewService", "NotesForVoting"),
2177                );
2178            self.inner.server_streaming(req, path, codec).await
2179        }
2180        /// Queries for metadata about known assets.
2181        /// Returns a stream of `AssetsResponse`s.
2182        pub async fn assets(
2183            &mut self,
2184            request: impl tonic::IntoRequest<super::AssetsRequest>,
2185        ) -> std::result::Result<
2186            tonic::Response<tonic::codec::Streaming<super::AssetsResponse>>,
2187            tonic::Status,
2188        > {
2189            self.inner
2190                .ready()
2191                .await
2192                .map_err(|e| {
2193                    tonic::Status::unknown(
2194                        format!("Service was not ready: {}", e.into()),
2195                    )
2196                })?;
2197            let codec = tonic::codec::ProstCodec::default();
2198            let path = http::uri::PathAndQuery::from_static(
2199                "/penumbra.view.v1.ViewService/Assets",
2200            );
2201            let mut req = request.into_request();
2202            req.extensions_mut()
2203                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Assets"));
2204            self.inner.server_streaming(req, path, codec).await
2205        }
2206        /// Query for metadata about a specific asset, by asset ID.
2207        ///
2208        /// This is the same as the method on the shielded pool's `QueryService`, but exposing it
2209        /// here allows a view server to provide more specific or opinionated asset metadata -- like
2210        /// using an asset registry to provide tickers, symbols, etc.
2211        pub async fn asset_metadata_by_id(
2212            &mut self,
2213            request: impl tonic::IntoRequest<super::AssetMetadataByIdRequest>,
2214        ) -> std::result::Result<
2215            tonic::Response<super::AssetMetadataByIdResponse>,
2216            tonic::Status,
2217        > {
2218            self.inner
2219                .ready()
2220                .await
2221                .map_err(|e| {
2222                    tonic::Status::unknown(
2223                        format!("Service was not ready: {}", e.into()),
2224                    )
2225                })?;
2226            let codec = tonic::codec::ProstCodec::default();
2227            let path = http::uri::PathAndQuery::from_static(
2228                "/penumbra.view.v1.ViewService/AssetMetadataById",
2229            );
2230            let mut req = request.into_request();
2231            req.extensions_mut()
2232                .insert(
2233                    GrpcMethod::new("penumbra.view.v1.ViewService", "AssetMetadataById"),
2234                );
2235            self.inner.unary(req, path, codec).await
2236        }
2237        /// Query for the current app parameters.
2238        pub async fn app_parameters(
2239            &mut self,
2240            request: impl tonic::IntoRequest<super::AppParametersRequest>,
2241        ) -> std::result::Result<
2242            tonic::Response<super::AppParametersResponse>,
2243            tonic::Status,
2244        > {
2245            self.inner
2246                .ready()
2247                .await
2248                .map_err(|e| {
2249                    tonic::Status::unknown(
2250                        format!("Service was not ready: {}", e.into()),
2251                    )
2252                })?;
2253            let codec = tonic::codec::ProstCodec::default();
2254            let path = http::uri::PathAndQuery::from_static(
2255                "/penumbra.view.v1.ViewService/AppParameters",
2256            );
2257            let mut req = request.into_request();
2258            req.extensions_mut()
2259                .insert(
2260                    GrpcMethod::new("penumbra.view.v1.ViewService", "AppParameters"),
2261                );
2262            self.inner.unary(req, path, codec).await
2263        }
2264        /// Query for the current gas prices.
2265        pub async fn gas_prices(
2266            &mut self,
2267            request: impl tonic::IntoRequest<super::GasPricesRequest>,
2268        ) -> std::result::Result<
2269            tonic::Response<super::GasPricesResponse>,
2270            tonic::Status,
2271        > {
2272            self.inner
2273                .ready()
2274                .await
2275                .map_err(|e| {
2276                    tonic::Status::unknown(
2277                        format!("Service was not ready: {}", e.into()),
2278                    )
2279                })?;
2280            let codec = tonic::codec::ProstCodec::default();
2281            let path = http::uri::PathAndQuery::from_static(
2282                "/penumbra.view.v1.ViewService/GasPrices",
2283            );
2284            let mut req = request.into_request();
2285            req.extensions_mut()
2286                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "GasPrices"));
2287            self.inner.unary(req, path, codec).await
2288        }
2289        /// Query for the current FMD parameters.
2290        pub async fn fmd_parameters(
2291            &mut self,
2292            request: impl tonic::IntoRequest<super::FmdParametersRequest>,
2293        ) -> std::result::Result<
2294            tonic::Response<super::FmdParametersResponse>,
2295            tonic::Status,
2296        > {
2297            self.inner
2298                .ready()
2299                .await
2300                .map_err(|e| {
2301                    tonic::Status::unknown(
2302                        format!("Service was not ready: {}", e.into()),
2303                    )
2304                })?;
2305            let codec = tonic::codec::ProstCodec::default();
2306            let path = http::uri::PathAndQuery::from_static(
2307                "/penumbra.view.v1.ViewService/FMDParameters",
2308            );
2309            let mut req = request.into_request();
2310            req.extensions_mut()
2311                .insert(
2312                    GrpcMethod::new("penumbra.view.v1.ViewService", "FMDParameters"),
2313                );
2314            self.inner.unary(req, path, codec).await
2315        }
2316        /// Query for an address given an address index
2317        pub async fn address_by_index(
2318            &mut self,
2319            request: impl tonic::IntoRequest<super::AddressByIndexRequest>,
2320        ) -> std::result::Result<
2321            tonic::Response<super::AddressByIndexResponse>,
2322            tonic::Status,
2323        > {
2324            self.inner
2325                .ready()
2326                .await
2327                .map_err(|e| {
2328                    tonic::Status::unknown(
2329                        format!("Service was not ready: {}", e.into()),
2330                    )
2331                })?;
2332            let codec = tonic::codec::ProstCodec::default();
2333            let path = http::uri::PathAndQuery::from_static(
2334                "/penumbra.view.v1.ViewService/AddressByIndex",
2335            );
2336            let mut req = request.into_request();
2337            req.extensions_mut()
2338                .insert(
2339                    GrpcMethod::new("penumbra.view.v1.ViewService", "AddressByIndex"),
2340                );
2341            self.inner.unary(req, path, codec).await
2342        }
2343        /// Returns the transparent address for the user's wallet.
2344        pub async fn transparent_address(
2345            &mut self,
2346            request: impl tonic::IntoRequest<super::TransparentAddressRequest>,
2347        ) -> std::result::Result<
2348            tonic::Response<super::TransparentAddressResponse>,
2349            tonic::Status,
2350        > {
2351            self.inner
2352                .ready()
2353                .await
2354                .map_err(|e| {
2355                    tonic::Status::unknown(
2356                        format!("Service was not ready: {}", e.into()),
2357                    )
2358                })?;
2359            let codec = tonic::codec::ProstCodec::default();
2360            let path = http::uri::PathAndQuery::from_static(
2361                "/penumbra.view.v1.ViewService/TransparentAddress",
2362            );
2363            let mut req = request.into_request();
2364            req.extensions_mut()
2365                .insert(
2366                    GrpcMethod::new("penumbra.view.v1.ViewService", "TransparentAddress"),
2367                );
2368            self.inner.unary(req, path, codec).await
2369        }
2370        /// Query for wallet id
2371        pub async fn wallet_id(
2372            &mut self,
2373            request: impl tonic::IntoRequest<super::WalletIdRequest>,
2374        ) -> std::result::Result<
2375            tonic::Response<super::WalletIdResponse>,
2376            tonic::Status,
2377        > {
2378            self.inner
2379                .ready()
2380                .await
2381                .map_err(|e| {
2382                    tonic::Status::unknown(
2383                        format!("Service was not ready: {}", e.into()),
2384                    )
2385                })?;
2386            let codec = tonic::codec::ProstCodec::default();
2387            let path = http::uri::PathAndQuery::from_static(
2388                "/penumbra.view.v1.ViewService/WalletId",
2389            );
2390            let mut req = request.into_request();
2391            req.extensions_mut()
2392                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "WalletId"));
2393            self.inner.unary(req, path, codec).await
2394        }
2395        /// Query for an address given an address index
2396        pub async fn index_by_address(
2397            &mut self,
2398            request: impl tonic::IntoRequest<super::IndexByAddressRequest>,
2399        ) -> std::result::Result<
2400            tonic::Response<super::IndexByAddressResponse>,
2401            tonic::Status,
2402        > {
2403            self.inner
2404                .ready()
2405                .await
2406                .map_err(|e| {
2407                    tonic::Status::unknown(
2408                        format!("Service was not ready: {}", e.into()),
2409                    )
2410                })?;
2411            let codec = tonic::codec::ProstCodec::default();
2412            let path = http::uri::PathAndQuery::from_static(
2413                "/penumbra.view.v1.ViewService/IndexByAddress",
2414            );
2415            let mut req = request.into_request();
2416            req.extensions_mut()
2417                .insert(
2418                    GrpcMethod::new("penumbra.view.v1.ViewService", "IndexByAddress"),
2419                );
2420            self.inner.unary(req, path, codec).await
2421        }
2422        /// Query for an ephemeral address
2423        pub async fn ephemeral_address(
2424            &mut self,
2425            request: impl tonic::IntoRequest<super::EphemeralAddressRequest>,
2426        ) -> std::result::Result<
2427            tonic::Response<super::EphemeralAddressResponse>,
2428            tonic::Status,
2429        > {
2430            self.inner
2431                .ready()
2432                .await
2433                .map_err(|e| {
2434                    tonic::Status::unknown(
2435                        format!("Service was not ready: {}", e.into()),
2436                    )
2437                })?;
2438            let codec = tonic::codec::ProstCodec::default();
2439            let path = http::uri::PathAndQuery::from_static(
2440                "/penumbra.view.v1.ViewService/EphemeralAddress",
2441            );
2442            let mut req = request.into_request();
2443            req.extensions_mut()
2444                .insert(
2445                    GrpcMethod::new("penumbra.view.v1.ViewService", "EphemeralAddress"),
2446                );
2447            self.inner.unary(req, path, codec).await
2448        }
2449        /// Query for balance of a given address.
2450        /// Returns a stream of `BalancesResponses`.
2451        pub async fn balances(
2452            &mut self,
2453            request: impl tonic::IntoRequest<super::BalancesRequest>,
2454        ) -> std::result::Result<
2455            tonic::Response<tonic::codec::Streaming<super::BalancesResponse>>,
2456            tonic::Status,
2457        > {
2458            self.inner
2459                .ready()
2460                .await
2461                .map_err(|e| {
2462                    tonic::Status::unknown(
2463                        format!("Service was not ready: {}", e.into()),
2464                    )
2465                })?;
2466            let codec = tonic::codec::ProstCodec::default();
2467            let path = http::uri::PathAndQuery::from_static(
2468                "/penumbra.view.v1.ViewService/Balances",
2469            );
2470            let mut req = request.into_request();
2471            req.extensions_mut()
2472                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Balances"));
2473            self.inner.server_streaming(req, path, codec).await
2474        }
2475        /// Query for a note by its note commitment, optionally waiting until the note is detected.
2476        pub async fn note_by_commitment(
2477            &mut self,
2478            request: impl tonic::IntoRequest<super::NoteByCommitmentRequest>,
2479        ) -> std::result::Result<
2480            tonic::Response<super::NoteByCommitmentResponse>,
2481            tonic::Status,
2482        > {
2483            self.inner
2484                .ready()
2485                .await
2486                .map_err(|e| {
2487                    tonic::Status::unknown(
2488                        format!("Service was not ready: {}", e.into()),
2489                    )
2490                })?;
2491            let codec = tonic::codec::ProstCodec::default();
2492            let path = http::uri::PathAndQuery::from_static(
2493                "/penumbra.view.v1.ViewService/NoteByCommitment",
2494            );
2495            let mut req = request.into_request();
2496            req.extensions_mut()
2497                .insert(
2498                    GrpcMethod::new("penumbra.view.v1.ViewService", "NoteByCommitment"),
2499                );
2500            self.inner.unary(req, path, codec).await
2501        }
2502        /// Query for a swap by its swap commitment, optionally waiting until the swap is detected.
2503        pub async fn swap_by_commitment(
2504            &mut self,
2505            request: impl tonic::IntoRequest<super::SwapByCommitmentRequest>,
2506        ) -> std::result::Result<
2507            tonic::Response<super::SwapByCommitmentResponse>,
2508            tonic::Status,
2509        > {
2510            self.inner
2511                .ready()
2512                .await
2513                .map_err(|e| {
2514                    tonic::Status::unknown(
2515                        format!("Service was not ready: {}", e.into()),
2516                    )
2517                })?;
2518            let codec = tonic::codec::ProstCodec::default();
2519            let path = http::uri::PathAndQuery::from_static(
2520                "/penumbra.view.v1.ViewService/SwapByCommitment",
2521            );
2522            let mut req = request.into_request();
2523            req.extensions_mut()
2524                .insert(
2525                    GrpcMethod::new("penumbra.view.v1.ViewService", "SwapByCommitment"),
2526                );
2527            self.inner.unary(req, path, codec).await
2528        }
2529        /// Query for all unclaimed swaps.
2530        pub async fn unclaimed_swaps(
2531            &mut self,
2532            request: impl tonic::IntoRequest<super::UnclaimedSwapsRequest>,
2533        ) -> std::result::Result<
2534            tonic::Response<tonic::codec::Streaming<super::UnclaimedSwapsResponse>>,
2535            tonic::Status,
2536        > {
2537            self.inner
2538                .ready()
2539                .await
2540                .map_err(|e| {
2541                    tonic::Status::unknown(
2542                        format!("Service was not ready: {}", e.into()),
2543                    )
2544                })?;
2545            let codec = tonic::codec::ProstCodec::default();
2546            let path = http::uri::PathAndQuery::from_static(
2547                "/penumbra.view.v1.ViewService/UnclaimedSwaps",
2548            );
2549            let mut req = request.into_request();
2550            req.extensions_mut()
2551                .insert(
2552                    GrpcMethod::new("penumbra.view.v1.ViewService", "UnclaimedSwaps"),
2553                );
2554            self.inner.server_streaming(req, path, codec).await
2555        }
2556        /// Query for whether a nullifier has been spent, optionally waiting until it is spent.
2557        pub async fn nullifier_status(
2558            &mut self,
2559            request: impl tonic::IntoRequest<super::NullifierStatusRequest>,
2560        ) -> std::result::Result<
2561            tonic::Response<super::NullifierStatusResponse>,
2562            tonic::Status,
2563        > {
2564            self.inner
2565                .ready()
2566                .await
2567                .map_err(|e| {
2568                    tonic::Status::unknown(
2569                        format!("Service was not ready: {}", e.into()),
2570                    )
2571                })?;
2572            let codec = tonic::codec::ProstCodec::default();
2573            let path = http::uri::PathAndQuery::from_static(
2574                "/penumbra.view.v1.ViewService/NullifierStatus",
2575            );
2576            let mut req = request.into_request();
2577            req.extensions_mut()
2578                .insert(
2579                    GrpcMethod::new("penumbra.view.v1.ViewService", "NullifierStatus"),
2580                );
2581            self.inner.unary(req, path, codec).await
2582        }
2583        /// Query for a given transaction by its hash.
2584        pub async fn transaction_info_by_hash(
2585            &mut self,
2586            request: impl tonic::IntoRequest<super::TransactionInfoByHashRequest>,
2587        ) -> std::result::Result<
2588            tonic::Response<super::TransactionInfoByHashResponse>,
2589            tonic::Status,
2590        > {
2591            self.inner
2592                .ready()
2593                .await
2594                .map_err(|e| {
2595                    tonic::Status::unknown(
2596                        format!("Service was not ready: {}", e.into()),
2597                    )
2598                })?;
2599            let codec = tonic::codec::ProstCodec::default();
2600            let path = http::uri::PathAndQuery::from_static(
2601                "/penumbra.view.v1.ViewService/TransactionInfoByHash",
2602            );
2603            let mut req = request.into_request();
2604            req.extensions_mut()
2605                .insert(
2606                    GrpcMethod::new(
2607                        "penumbra.view.v1.ViewService",
2608                        "TransactionInfoByHash",
2609                    ),
2610                );
2611            self.inner.unary(req, path, codec).await
2612        }
2613        /// Query for the full transactions in the given range of blocks.
2614        /// Returns a stream of `TransactionInfoResponse`s.
2615        pub async fn transaction_info(
2616            &mut self,
2617            request: impl tonic::IntoRequest<super::TransactionInfoRequest>,
2618        ) -> std::result::Result<
2619            tonic::Response<tonic::codec::Streaming<super::TransactionInfoResponse>>,
2620            tonic::Status,
2621        > {
2622            self.inner
2623                .ready()
2624                .await
2625                .map_err(|e| {
2626                    tonic::Status::unknown(
2627                        format!("Service was not ready: {}", e.into()),
2628                    )
2629                })?;
2630            let codec = tonic::codec::ProstCodec::default();
2631            let path = http::uri::PathAndQuery::from_static(
2632                "/penumbra.view.v1.ViewService/TransactionInfo",
2633            );
2634            let mut req = request.into_request();
2635            req.extensions_mut()
2636                .insert(
2637                    GrpcMethod::new("penumbra.view.v1.ViewService", "TransactionInfo"),
2638                );
2639            self.inner.server_streaming(req, path, codec).await
2640        }
2641        /// Query for owned position IDs for the given trading pair and in the given position state.
2642        pub async fn owned_position_ids(
2643            &mut self,
2644            request: impl tonic::IntoRequest<super::OwnedPositionIdsRequest>,
2645        ) -> std::result::Result<
2646            tonic::Response<tonic::codec::Streaming<super::OwnedPositionIdsResponse>>,
2647            tonic::Status,
2648        > {
2649            self.inner
2650                .ready()
2651                .await
2652                .map_err(|e| {
2653                    tonic::Status::unknown(
2654                        format!("Service was not ready: {}", e.into()),
2655                    )
2656                })?;
2657            let codec = tonic::codec::ProstCodec::default();
2658            let path = http::uri::PathAndQuery::from_static(
2659                "/penumbra.view.v1.ViewService/OwnedPositionIds",
2660            );
2661            let mut req = request.into_request();
2662            req.extensions_mut()
2663                .insert(
2664                    GrpcMethod::new("penumbra.view.v1.ViewService", "OwnedPositionIds"),
2665                );
2666            self.inner.server_streaming(req, path, codec).await
2667        }
2668        /// Translates a high-level intent ("send X funds to Y address") into a complete transaction plan.
2669        pub async fn transaction_planner(
2670            &mut self,
2671            request: impl tonic::IntoRequest<super::TransactionPlannerRequest>,
2672        ) -> std::result::Result<
2673            tonic::Response<super::TransactionPlannerResponse>,
2674            tonic::Status,
2675        > {
2676            self.inner
2677                .ready()
2678                .await
2679                .map_err(|e| {
2680                    tonic::Status::unknown(
2681                        format!("Service was not ready: {}", e.into()),
2682                    )
2683                })?;
2684            let codec = tonic::codec::ProstCodec::default();
2685            let path = http::uri::PathAndQuery::from_static(
2686                "/penumbra.view.v1.ViewService/TransactionPlanner",
2687            );
2688            let mut req = request.into_request();
2689            req.extensions_mut()
2690                .insert(
2691                    GrpcMethod::new("penumbra.view.v1.ViewService", "TransactionPlanner"),
2692                );
2693            self.inner.unary(req, path, codec).await
2694        }
2695        /// Returns authentication data for the given transaction plan.
2696        ///
2697        /// This method takes a complete transaction plan, so that the client can get a
2698        /// consistent set of authentication paths to a common root for the entire
2699        /// transaction.  (Otherwise, if a client made multiple requests, the wallet
2700        /// service could have advanced the state commitment tree  between queries).
2701        pub async fn witness(
2702            &mut self,
2703            request: impl tonic::IntoRequest<super::WitnessRequest>,
2704        ) -> std::result::Result<
2705            tonic::Response<super::WitnessResponse>,
2706            tonic::Status,
2707        > {
2708            self.inner
2709                .ready()
2710                .await
2711                .map_err(|e| {
2712                    tonic::Status::unknown(
2713                        format!("Service was not ready: {}", e.into()),
2714                    )
2715                })?;
2716            let codec = tonic::codec::ProstCodec::default();
2717            let path = http::uri::PathAndQuery::from_static(
2718                "/penumbra.view.v1.ViewService/Witness",
2719            );
2720            let mut req = request.into_request();
2721            req.extensions_mut()
2722                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Witness"));
2723            self.inner.unary(req, path, codec).await
2724        }
2725        /// Like `Witness`, but immediately uses the witness data to build (prove) the transaction.
2726        ///
2727        /// This method is useful for clients that can't easily do proving themselves, either because
2728        /// they're not written in Rust and can't easily import the proving code, or because they don't
2729        /// have access to proving keys, or some other reason.
2730        ///
2731        /// This method streams status updates to the caller before finally returning the transaction.
2732        pub async fn witness_and_build(
2733            &mut self,
2734            request: impl tonic::IntoRequest<super::WitnessAndBuildRequest>,
2735        ) -> std::result::Result<
2736            tonic::Response<tonic::codec::Streaming<super::WitnessAndBuildResponse>>,
2737            tonic::Status,
2738        > {
2739            self.inner
2740                .ready()
2741                .await
2742                .map_err(|e| {
2743                    tonic::Status::unknown(
2744                        format!("Service was not ready: {}", e.into()),
2745                    )
2746                })?;
2747            let codec = tonic::codec::ProstCodec::default();
2748            let path = http::uri::PathAndQuery::from_static(
2749                "/penumbra.view.v1.ViewService/WitnessAndBuild",
2750            );
2751            let mut req = request.into_request();
2752            req.extensions_mut()
2753                .insert(
2754                    GrpcMethod::new("penumbra.view.v1.ViewService", "WitnessAndBuild"),
2755                );
2756            self.inner.server_streaming(req, path, codec).await
2757        }
2758        /// Authorize a transaction plan and build the transaction.
2759        ///
2760        /// This method is only supported on view servers that have access to a custody
2761        /// service.  Otherwise, it will fail.
2762        ///
2763        /// Penumbra's transaction authorization mechanism is designed so transactions
2764        /// can be signed and built (proved) concurrently. This allows implementations
2765        /// to, e.g., start proving optimistically while presenting the user with an
2766        /// approval dialog.
2767        ///
2768        /// This method streams status updates to the caller before finally returning the transaction.
2769        pub async fn authorize_and_build(
2770            &mut self,
2771            request: impl tonic::IntoRequest<super::AuthorizeAndBuildRequest>,
2772        ) -> std::result::Result<
2773            tonic::Response<tonic::codec::Streaming<super::AuthorizeAndBuildResponse>>,
2774            tonic::Status,
2775        > {
2776            self.inner
2777                .ready()
2778                .await
2779                .map_err(|e| {
2780                    tonic::Status::unknown(
2781                        format!("Service was not ready: {}", e.into()),
2782                    )
2783                })?;
2784            let codec = tonic::codec::ProstCodec::default();
2785            let path = http::uri::PathAndQuery::from_static(
2786                "/penumbra.view.v1.ViewService/AuthorizeAndBuild",
2787            );
2788            let mut req = request.into_request();
2789            req.extensions_mut()
2790                .insert(
2791                    GrpcMethod::new("penumbra.view.v1.ViewService", "AuthorizeAndBuild"),
2792                );
2793            self.inner.server_streaming(req, path, codec).await
2794        }
2795        /// Broadcast a transaction to the network, optionally waiting for full confirmation.
2796        ///
2797        /// This method streams status updates to the caller before finally returning confirmation.
2798        pub async fn broadcast_transaction(
2799            &mut self,
2800            request: impl tonic::IntoRequest<super::BroadcastTransactionRequest>,
2801        ) -> std::result::Result<
2802            tonic::Response<
2803                tonic::codec::Streaming<super::BroadcastTransactionResponse>,
2804            >,
2805            tonic::Status,
2806        > {
2807            self.inner
2808                .ready()
2809                .await
2810                .map_err(|e| {
2811                    tonic::Status::unknown(
2812                        format!("Service was not ready: {}", e.into()),
2813                    )
2814                })?;
2815            let codec = tonic::codec::ProstCodec::default();
2816            let path = http::uri::PathAndQuery::from_static(
2817                "/penumbra.view.v1.ViewService/BroadcastTransaction",
2818            );
2819            let mut req = request.into_request();
2820            req.extensions_mut()
2821                .insert(
2822                    GrpcMethod::new(
2823                        "penumbra.view.v1.ViewService",
2824                        "BroadcastTransaction",
2825                    ),
2826                );
2827            self.inner.server_streaming(req, path, codec).await
2828        }
2829        /// Get delegation tokens for a given address index. Each delegation token will
2830        /// be represented by a `ValueView` with the given address index's balance of
2831        /// that token. Each `ValueView`'s `extended_metadata` field will contain the
2832        /// `ValidatorInfo` of the delegated validator.
2833        pub async fn delegations_by_address_index(
2834            &mut self,
2835            request: impl tonic::IntoRequest<super::DelegationsByAddressIndexRequest>,
2836        ) -> std::result::Result<
2837            tonic::Response<
2838                tonic::codec::Streaming<super::DelegationsByAddressIndexResponse>,
2839            >,
2840            tonic::Status,
2841        > {
2842            self.inner
2843                .ready()
2844                .await
2845                .map_err(|e| {
2846                    tonic::Status::unknown(
2847                        format!("Service was not ready: {}", e.into()),
2848                    )
2849                })?;
2850            let codec = tonic::codec::ProstCodec::default();
2851            let path = http::uri::PathAndQuery::from_static(
2852                "/penumbra.view.v1.ViewService/DelegationsByAddressIndex",
2853            );
2854            let mut req = request.into_request();
2855            req.extensions_mut()
2856                .insert(
2857                    GrpcMethod::new(
2858                        "penumbra.view.v1.ViewService",
2859                        "DelegationsByAddressIndex",
2860                    ),
2861                );
2862            self.inner.server_streaming(req, path, codec).await
2863        }
2864        /// Get unbonding tokens for the given address index, optionally filtered by
2865        /// whether the tokens are currently claimable.
2866        pub async fn unbonding_tokens_by_address_index(
2867            &mut self,
2868            request: impl tonic::IntoRequest<super::UnbondingTokensByAddressIndexRequest>,
2869        ) -> std::result::Result<
2870            tonic::Response<
2871                tonic::codec::Streaming<super::UnbondingTokensByAddressIndexResponse>,
2872            >,
2873            tonic::Status,
2874        > {
2875            self.inner
2876                .ready()
2877                .await
2878                .map_err(|e| {
2879                    tonic::Status::unknown(
2880                        format!("Service was not ready: {}", e.into()),
2881                    )
2882                })?;
2883            let codec = tonic::codec::ProstCodec::default();
2884            let path = http::uri::PathAndQuery::from_static(
2885                "/penumbra.view.v1.ViewService/UnbondingTokensByAddressIndex",
2886            );
2887            let mut req = request.into_request();
2888            req.extensions_mut()
2889                .insert(
2890                    GrpcMethod::new(
2891                        "penumbra.view.v1.ViewService",
2892                        "UnbondingTokensByAddressIndex",
2893                    ),
2894                );
2895            self.inner.server_streaming(req, path, codec).await
2896        }
2897        /// Gets the auctions controlled by the user's wallet.
2898        pub async fn auctions(
2899            &mut self,
2900            request: impl tonic::IntoRequest<super::AuctionsRequest>,
2901        ) -> std::result::Result<
2902            tonic::Response<tonic::codec::Streaming<super::AuctionsResponse>>,
2903            tonic::Status,
2904        > {
2905            self.inner
2906                .ready()
2907                .await
2908                .map_err(|e| {
2909                    tonic::Status::unknown(
2910                        format!("Service was not ready: {}", e.into()),
2911                    )
2912                })?;
2913            let codec = tonic::codec::ProstCodec::default();
2914            let path = http::uri::PathAndQuery::from_static(
2915                "/penumbra.view.v1.ViewService/Auctions",
2916            );
2917            let mut req = request.into_request();
2918            req.extensions_mut()
2919                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Auctions"));
2920            self.inner.server_streaming(req, path, codec).await
2921        }
2922        /// Gets the latest swaps controlled by the user's wallet.
2923        pub async fn latest_swaps(
2924            &mut self,
2925            request: impl tonic::IntoRequest<super::LatestSwapsRequest>,
2926        ) -> std::result::Result<
2927            tonic::Response<tonic::codec::Streaming<super::LatestSwapsResponse>>,
2928            tonic::Status,
2929        > {
2930            self.inner
2931                .ready()
2932                .await
2933                .map_err(|e| {
2934                    tonic::Status::unknown(
2935                        format!("Service was not ready: {}", e.into()),
2936                    )
2937                })?;
2938            let codec = tonic::codec::ProstCodec::default();
2939            let path = http::uri::PathAndQuery::from_static(
2940                "/penumbra.view.v1.ViewService/LatestSwaps",
2941            );
2942            let mut req = request.into_request();
2943            req.extensions_mut()
2944                .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "LatestSwaps"));
2945            self.inner.server_streaming(req, path, codec).await
2946        }
2947    }
2948}
2949/// Generated server implementations.
2950#[cfg(feature = "rpc")]
2951pub mod view_service_server {
2952    #![allow(
2953        unused_variables,
2954        dead_code,
2955        missing_docs,
2956        clippy::wildcard_imports,
2957        clippy::let_unit_value,
2958    )]
2959    use tonic::codegen::*;
2960    /// Generated trait containing gRPC methods that should be implemented for use with ViewServiceServer.
2961    #[async_trait]
2962    pub trait ViewService: std::marker::Send + std::marker::Sync + 'static {
2963        /// Get current status of chain sync
2964        async fn status(
2965            &self,
2966            request: tonic::Request<super::StatusRequest>,
2967        ) -> std::result::Result<tonic::Response<super::StatusResponse>, tonic::Status>;
2968        /// Server streaming response type for the StatusStream method.
2969        type StatusStreamStream: tonic::codegen::tokio_stream::Stream<
2970                Item = std::result::Result<super::StatusStreamResponse, tonic::Status>,
2971            >
2972            + std::marker::Send
2973            + 'static;
2974        /// Stream sync status updates until the view service has caught up with the chain.
2975        /// Returns a stream of `StatusStreamResponse`s.
2976        async fn status_stream(
2977            &self,
2978            request: tonic::Request<super::StatusStreamRequest>,
2979        ) -> std::result::Result<
2980            tonic::Response<Self::StatusStreamStream>,
2981            tonic::Status,
2982        >;
2983        /// Server streaming response type for the Notes method.
2984        type NotesStream: tonic::codegen::tokio_stream::Stream<
2985                Item = std::result::Result<super::NotesResponse, tonic::Status>,
2986            >
2987            + std::marker::Send
2988            + 'static;
2989        /// Queries for notes that have been accepted by the chain.
2990        /// Returns a stream of `NotesResponse`s.
2991        async fn notes(
2992            &self,
2993            request: tonic::Request<super::NotesRequest>,
2994        ) -> std::result::Result<tonic::Response<Self::NotesStream>, tonic::Status>;
2995        /// Server streaming response type for the NotesForVoting method.
2996        type NotesForVotingStream: tonic::codegen::tokio_stream::Stream<
2997                Item = std::result::Result<super::NotesForVotingResponse, tonic::Status>,
2998            >
2999            + std::marker::Send
3000            + 'static;
3001        /// Returns a stream of `NotesForVotingResponse`s.
3002        async fn notes_for_voting(
3003            &self,
3004            request: tonic::Request<super::NotesForVotingRequest>,
3005        ) -> std::result::Result<
3006            tonic::Response<Self::NotesForVotingStream>,
3007            tonic::Status,
3008        >;
3009        /// Server streaming response type for the Assets method.
3010        type AssetsStream: tonic::codegen::tokio_stream::Stream<
3011                Item = std::result::Result<super::AssetsResponse, tonic::Status>,
3012            >
3013            + std::marker::Send
3014            + 'static;
3015        /// Queries for metadata about known assets.
3016        /// Returns a stream of `AssetsResponse`s.
3017        async fn assets(
3018            &self,
3019            request: tonic::Request<super::AssetsRequest>,
3020        ) -> std::result::Result<tonic::Response<Self::AssetsStream>, tonic::Status>;
3021        /// Query for metadata about a specific asset, by asset ID.
3022        ///
3023        /// This is the same as the method on the shielded pool's `QueryService`, but exposing it
3024        /// here allows a view server to provide more specific or opinionated asset metadata -- like
3025        /// using an asset registry to provide tickers, symbols, etc.
3026        async fn asset_metadata_by_id(
3027            &self,
3028            request: tonic::Request<super::AssetMetadataByIdRequest>,
3029        ) -> std::result::Result<
3030            tonic::Response<super::AssetMetadataByIdResponse>,
3031            tonic::Status,
3032        >;
3033        /// Query for the current app parameters.
3034        async fn app_parameters(
3035            &self,
3036            request: tonic::Request<super::AppParametersRequest>,
3037        ) -> std::result::Result<
3038            tonic::Response<super::AppParametersResponse>,
3039            tonic::Status,
3040        >;
3041        /// Query for the current gas prices.
3042        async fn gas_prices(
3043            &self,
3044            request: tonic::Request<super::GasPricesRequest>,
3045        ) -> std::result::Result<
3046            tonic::Response<super::GasPricesResponse>,
3047            tonic::Status,
3048        >;
3049        /// Query for the current FMD parameters.
3050        async fn fmd_parameters(
3051            &self,
3052            request: tonic::Request<super::FmdParametersRequest>,
3053        ) -> std::result::Result<
3054            tonic::Response<super::FmdParametersResponse>,
3055            tonic::Status,
3056        >;
3057        /// Query for an address given an address index
3058        async fn address_by_index(
3059            &self,
3060            request: tonic::Request<super::AddressByIndexRequest>,
3061        ) -> std::result::Result<
3062            tonic::Response<super::AddressByIndexResponse>,
3063            tonic::Status,
3064        >;
3065        /// Returns the transparent address for the user's wallet.
3066        async fn transparent_address(
3067            &self,
3068            request: tonic::Request<super::TransparentAddressRequest>,
3069        ) -> std::result::Result<
3070            tonic::Response<super::TransparentAddressResponse>,
3071            tonic::Status,
3072        >;
3073        /// Query for wallet id
3074        async fn wallet_id(
3075            &self,
3076            request: tonic::Request<super::WalletIdRequest>,
3077        ) -> std::result::Result<
3078            tonic::Response<super::WalletIdResponse>,
3079            tonic::Status,
3080        >;
3081        /// Query for an address given an address index
3082        async fn index_by_address(
3083            &self,
3084            request: tonic::Request<super::IndexByAddressRequest>,
3085        ) -> std::result::Result<
3086            tonic::Response<super::IndexByAddressResponse>,
3087            tonic::Status,
3088        >;
3089        /// Query for an ephemeral address
3090        async fn ephemeral_address(
3091            &self,
3092            request: tonic::Request<super::EphemeralAddressRequest>,
3093        ) -> std::result::Result<
3094            tonic::Response<super::EphemeralAddressResponse>,
3095            tonic::Status,
3096        >;
3097        /// Server streaming response type for the Balances method.
3098        type BalancesStream: tonic::codegen::tokio_stream::Stream<
3099                Item = std::result::Result<super::BalancesResponse, tonic::Status>,
3100            >
3101            + std::marker::Send
3102            + 'static;
3103        /// Query for balance of a given address.
3104        /// Returns a stream of `BalancesResponses`.
3105        async fn balances(
3106            &self,
3107            request: tonic::Request<super::BalancesRequest>,
3108        ) -> std::result::Result<tonic::Response<Self::BalancesStream>, tonic::Status>;
3109        /// Query for a note by its note commitment, optionally waiting until the note is detected.
3110        async fn note_by_commitment(
3111            &self,
3112            request: tonic::Request<super::NoteByCommitmentRequest>,
3113        ) -> std::result::Result<
3114            tonic::Response<super::NoteByCommitmentResponse>,
3115            tonic::Status,
3116        >;
3117        /// Query for a swap by its swap commitment, optionally waiting until the swap is detected.
3118        async fn swap_by_commitment(
3119            &self,
3120            request: tonic::Request<super::SwapByCommitmentRequest>,
3121        ) -> std::result::Result<
3122            tonic::Response<super::SwapByCommitmentResponse>,
3123            tonic::Status,
3124        >;
3125        /// Server streaming response type for the UnclaimedSwaps method.
3126        type UnclaimedSwapsStream: tonic::codegen::tokio_stream::Stream<
3127                Item = std::result::Result<super::UnclaimedSwapsResponse, tonic::Status>,
3128            >
3129            + std::marker::Send
3130            + 'static;
3131        /// Query for all unclaimed swaps.
3132        async fn unclaimed_swaps(
3133            &self,
3134            request: tonic::Request<super::UnclaimedSwapsRequest>,
3135        ) -> std::result::Result<
3136            tonic::Response<Self::UnclaimedSwapsStream>,
3137            tonic::Status,
3138        >;
3139        /// Query for whether a nullifier has been spent, optionally waiting until it is spent.
3140        async fn nullifier_status(
3141            &self,
3142            request: tonic::Request<super::NullifierStatusRequest>,
3143        ) -> std::result::Result<
3144            tonic::Response<super::NullifierStatusResponse>,
3145            tonic::Status,
3146        >;
3147        /// Query for a given transaction by its hash.
3148        async fn transaction_info_by_hash(
3149            &self,
3150            request: tonic::Request<super::TransactionInfoByHashRequest>,
3151        ) -> std::result::Result<
3152            tonic::Response<super::TransactionInfoByHashResponse>,
3153            tonic::Status,
3154        >;
3155        /// Server streaming response type for the TransactionInfo method.
3156        type TransactionInfoStream: tonic::codegen::tokio_stream::Stream<
3157                Item = std::result::Result<super::TransactionInfoResponse, tonic::Status>,
3158            >
3159            + std::marker::Send
3160            + 'static;
3161        /// Query for the full transactions in the given range of blocks.
3162        /// Returns a stream of `TransactionInfoResponse`s.
3163        async fn transaction_info(
3164            &self,
3165            request: tonic::Request<super::TransactionInfoRequest>,
3166        ) -> std::result::Result<
3167            tonic::Response<Self::TransactionInfoStream>,
3168            tonic::Status,
3169        >;
3170        /// Server streaming response type for the OwnedPositionIds method.
3171        type OwnedPositionIdsStream: tonic::codegen::tokio_stream::Stream<
3172                Item = std::result::Result<
3173                    super::OwnedPositionIdsResponse,
3174                    tonic::Status,
3175                >,
3176            >
3177            + std::marker::Send
3178            + 'static;
3179        /// Query for owned position IDs for the given trading pair and in the given position state.
3180        async fn owned_position_ids(
3181            &self,
3182            request: tonic::Request<super::OwnedPositionIdsRequest>,
3183        ) -> std::result::Result<
3184            tonic::Response<Self::OwnedPositionIdsStream>,
3185            tonic::Status,
3186        >;
3187        /// Translates a high-level intent ("send X funds to Y address") into a complete transaction plan.
3188        async fn transaction_planner(
3189            &self,
3190            request: tonic::Request<super::TransactionPlannerRequest>,
3191        ) -> std::result::Result<
3192            tonic::Response<super::TransactionPlannerResponse>,
3193            tonic::Status,
3194        >;
3195        /// Returns authentication data for the given transaction plan.
3196        ///
3197        /// This method takes a complete transaction plan, so that the client can get a
3198        /// consistent set of authentication paths to a common root for the entire
3199        /// transaction.  (Otherwise, if a client made multiple requests, the wallet
3200        /// service could have advanced the state commitment tree  between queries).
3201        async fn witness(
3202            &self,
3203            request: tonic::Request<super::WitnessRequest>,
3204        ) -> std::result::Result<tonic::Response<super::WitnessResponse>, tonic::Status>;
3205        /// Server streaming response type for the WitnessAndBuild method.
3206        type WitnessAndBuildStream: tonic::codegen::tokio_stream::Stream<
3207                Item = std::result::Result<super::WitnessAndBuildResponse, tonic::Status>,
3208            >
3209            + std::marker::Send
3210            + 'static;
3211        /// Like `Witness`, but immediately uses the witness data to build (prove) the transaction.
3212        ///
3213        /// This method is useful for clients that can't easily do proving themselves, either because
3214        /// they're not written in Rust and can't easily import the proving code, or because they don't
3215        /// have access to proving keys, or some other reason.
3216        ///
3217        /// This method streams status updates to the caller before finally returning the transaction.
3218        async fn witness_and_build(
3219            &self,
3220            request: tonic::Request<super::WitnessAndBuildRequest>,
3221        ) -> std::result::Result<
3222            tonic::Response<Self::WitnessAndBuildStream>,
3223            tonic::Status,
3224        >;
3225        /// Server streaming response type for the AuthorizeAndBuild method.
3226        type AuthorizeAndBuildStream: tonic::codegen::tokio_stream::Stream<
3227                Item = std::result::Result<
3228                    super::AuthorizeAndBuildResponse,
3229                    tonic::Status,
3230                >,
3231            >
3232            + std::marker::Send
3233            + 'static;
3234        /// Authorize a transaction plan and build the transaction.
3235        ///
3236        /// This method is only supported on view servers that have access to a custody
3237        /// service.  Otherwise, it will fail.
3238        ///
3239        /// Penumbra's transaction authorization mechanism is designed so transactions
3240        /// can be signed and built (proved) concurrently. This allows implementations
3241        /// to, e.g., start proving optimistically while presenting the user with an
3242        /// approval dialog.
3243        ///
3244        /// This method streams status updates to the caller before finally returning the transaction.
3245        async fn authorize_and_build(
3246            &self,
3247            request: tonic::Request<super::AuthorizeAndBuildRequest>,
3248        ) -> std::result::Result<
3249            tonic::Response<Self::AuthorizeAndBuildStream>,
3250            tonic::Status,
3251        >;
3252        /// Server streaming response type for the BroadcastTransaction method.
3253        type BroadcastTransactionStream: tonic::codegen::tokio_stream::Stream<
3254                Item = std::result::Result<
3255                    super::BroadcastTransactionResponse,
3256                    tonic::Status,
3257                >,
3258            >
3259            + std::marker::Send
3260            + 'static;
3261        /// Broadcast a transaction to the network, optionally waiting for full confirmation.
3262        ///
3263        /// This method streams status updates to the caller before finally returning confirmation.
3264        async fn broadcast_transaction(
3265            &self,
3266            request: tonic::Request<super::BroadcastTransactionRequest>,
3267        ) -> std::result::Result<
3268            tonic::Response<Self::BroadcastTransactionStream>,
3269            tonic::Status,
3270        >;
3271        /// Server streaming response type for the DelegationsByAddressIndex method.
3272        type DelegationsByAddressIndexStream: tonic::codegen::tokio_stream::Stream<
3273                Item = std::result::Result<
3274                    super::DelegationsByAddressIndexResponse,
3275                    tonic::Status,
3276                >,
3277            >
3278            + std::marker::Send
3279            + 'static;
3280        /// Get delegation tokens for a given address index. Each delegation token will
3281        /// be represented by a `ValueView` with the given address index's balance of
3282        /// that token. Each `ValueView`'s `extended_metadata` field will contain the
3283        /// `ValidatorInfo` of the delegated validator.
3284        async fn delegations_by_address_index(
3285            &self,
3286            request: tonic::Request<super::DelegationsByAddressIndexRequest>,
3287        ) -> std::result::Result<
3288            tonic::Response<Self::DelegationsByAddressIndexStream>,
3289            tonic::Status,
3290        >;
3291        /// Server streaming response type for the UnbondingTokensByAddressIndex method.
3292        type UnbondingTokensByAddressIndexStream: tonic::codegen::tokio_stream::Stream<
3293                Item = std::result::Result<
3294                    super::UnbondingTokensByAddressIndexResponse,
3295                    tonic::Status,
3296                >,
3297            >
3298            + std::marker::Send
3299            + 'static;
3300        /// Get unbonding tokens for the given address index, optionally filtered by
3301        /// whether the tokens are currently claimable.
3302        async fn unbonding_tokens_by_address_index(
3303            &self,
3304            request: tonic::Request<super::UnbondingTokensByAddressIndexRequest>,
3305        ) -> std::result::Result<
3306            tonic::Response<Self::UnbondingTokensByAddressIndexStream>,
3307            tonic::Status,
3308        >;
3309        /// Server streaming response type for the Auctions method.
3310        type AuctionsStream: tonic::codegen::tokio_stream::Stream<
3311                Item = std::result::Result<super::AuctionsResponse, tonic::Status>,
3312            >
3313            + std::marker::Send
3314            + 'static;
3315        /// Gets the auctions controlled by the user's wallet.
3316        async fn auctions(
3317            &self,
3318            request: tonic::Request<super::AuctionsRequest>,
3319        ) -> std::result::Result<tonic::Response<Self::AuctionsStream>, tonic::Status>;
3320        /// Server streaming response type for the LatestSwaps method.
3321        type LatestSwapsStream: tonic::codegen::tokio_stream::Stream<
3322                Item = std::result::Result<super::LatestSwapsResponse, tonic::Status>,
3323            >
3324            + std::marker::Send
3325            + 'static;
3326        /// Gets the latest swaps controlled by the user's wallet.
3327        async fn latest_swaps(
3328            &self,
3329            request: tonic::Request<super::LatestSwapsRequest>,
3330        ) -> std::result::Result<
3331            tonic::Response<Self::LatestSwapsStream>,
3332            tonic::Status,
3333        >;
3334    }
3335    /// The view RPC is used by a view client, who wants to do some
3336    /// transaction-related actions, to request data from a view service, which is
3337    /// responsible for synchronizing and scanning the public chain state with one or
3338    /// more full viewing keys.
3339    #[derive(Debug)]
3340    pub struct ViewServiceServer<T> {
3341        inner: Arc<T>,
3342        accept_compression_encodings: EnabledCompressionEncodings,
3343        send_compression_encodings: EnabledCompressionEncodings,
3344        max_decoding_message_size: Option<usize>,
3345        max_encoding_message_size: Option<usize>,
3346    }
3347    impl<T> ViewServiceServer<T> {
3348        pub fn new(inner: T) -> Self {
3349            Self::from_arc(Arc::new(inner))
3350        }
3351        pub fn from_arc(inner: Arc<T>) -> Self {
3352            Self {
3353                inner,
3354                accept_compression_encodings: Default::default(),
3355                send_compression_encodings: Default::default(),
3356                max_decoding_message_size: None,
3357                max_encoding_message_size: None,
3358            }
3359        }
3360        pub fn with_interceptor<F>(
3361            inner: T,
3362            interceptor: F,
3363        ) -> InterceptedService<Self, F>
3364        where
3365            F: tonic::service::Interceptor,
3366        {
3367            InterceptedService::new(Self::new(inner), interceptor)
3368        }
3369        /// Enable decompressing requests with the given encoding.
3370        #[must_use]
3371        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
3372            self.accept_compression_encodings.enable(encoding);
3373            self
3374        }
3375        /// Compress responses with the given encoding, if the client supports it.
3376        #[must_use]
3377        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
3378            self.send_compression_encodings.enable(encoding);
3379            self
3380        }
3381        /// Limits the maximum size of a decoded message.
3382        ///
3383        /// Default: `4MB`
3384        #[must_use]
3385        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
3386            self.max_decoding_message_size = Some(limit);
3387            self
3388        }
3389        /// Limits the maximum size of an encoded message.
3390        ///
3391        /// Default: `usize::MAX`
3392        #[must_use]
3393        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
3394            self.max_encoding_message_size = Some(limit);
3395            self
3396        }
3397    }
3398    impl<T, B> tonic::codegen::Service<http::Request<B>> for ViewServiceServer<T>
3399    where
3400        T: ViewService,
3401        B: Body + std::marker::Send + 'static,
3402        B::Error: Into<StdError> + std::marker::Send + 'static,
3403    {
3404        type Response = http::Response<tonic::body::BoxBody>;
3405        type Error = std::convert::Infallible;
3406        type Future = BoxFuture<Self::Response, Self::Error>;
3407        fn poll_ready(
3408            &mut self,
3409            _cx: &mut Context<'_>,
3410        ) -> Poll<std::result::Result<(), Self::Error>> {
3411            Poll::Ready(Ok(()))
3412        }
3413        fn call(&mut self, req: http::Request<B>) -> Self::Future {
3414            match req.uri().path() {
3415                "/penumbra.view.v1.ViewService/Status" => {
3416                    #[allow(non_camel_case_types)]
3417                    struct StatusSvc<T: ViewService>(pub Arc<T>);
3418                    impl<
3419                        T: ViewService,
3420                    > tonic::server::UnaryService<super::StatusRequest>
3421                    for StatusSvc<T> {
3422                        type Response = super::StatusResponse;
3423                        type Future = BoxFuture<
3424                            tonic::Response<Self::Response>,
3425                            tonic::Status,
3426                        >;
3427                        fn call(
3428                            &mut self,
3429                            request: tonic::Request<super::StatusRequest>,
3430                        ) -> Self::Future {
3431                            let inner = Arc::clone(&self.0);
3432                            let fut = async move {
3433                                <T as ViewService>::status(&inner, request).await
3434                            };
3435                            Box::pin(fut)
3436                        }
3437                    }
3438                    let accept_compression_encodings = self.accept_compression_encodings;
3439                    let send_compression_encodings = self.send_compression_encodings;
3440                    let max_decoding_message_size = self.max_decoding_message_size;
3441                    let max_encoding_message_size = self.max_encoding_message_size;
3442                    let inner = self.inner.clone();
3443                    let fut = async move {
3444                        let method = StatusSvc(inner);
3445                        let codec = tonic::codec::ProstCodec::default();
3446                        let mut grpc = tonic::server::Grpc::new(codec)
3447                            .apply_compression_config(
3448                                accept_compression_encodings,
3449                                send_compression_encodings,
3450                            )
3451                            .apply_max_message_size_config(
3452                                max_decoding_message_size,
3453                                max_encoding_message_size,
3454                            );
3455                        let res = grpc.unary(method, req).await;
3456                        Ok(res)
3457                    };
3458                    Box::pin(fut)
3459                }
3460                "/penumbra.view.v1.ViewService/StatusStream" => {
3461                    #[allow(non_camel_case_types)]
3462                    struct StatusStreamSvc<T: ViewService>(pub Arc<T>);
3463                    impl<
3464                        T: ViewService,
3465                    > tonic::server::ServerStreamingService<super::StatusStreamRequest>
3466                    for StatusStreamSvc<T> {
3467                        type Response = super::StatusStreamResponse;
3468                        type ResponseStream = T::StatusStreamStream;
3469                        type Future = BoxFuture<
3470                            tonic::Response<Self::ResponseStream>,
3471                            tonic::Status,
3472                        >;
3473                        fn call(
3474                            &mut self,
3475                            request: tonic::Request<super::StatusStreamRequest>,
3476                        ) -> Self::Future {
3477                            let inner = Arc::clone(&self.0);
3478                            let fut = async move {
3479                                <T as ViewService>::status_stream(&inner, request).await
3480                            };
3481                            Box::pin(fut)
3482                        }
3483                    }
3484                    let accept_compression_encodings = self.accept_compression_encodings;
3485                    let send_compression_encodings = self.send_compression_encodings;
3486                    let max_decoding_message_size = self.max_decoding_message_size;
3487                    let max_encoding_message_size = self.max_encoding_message_size;
3488                    let inner = self.inner.clone();
3489                    let fut = async move {
3490                        let method = StatusStreamSvc(inner);
3491                        let codec = tonic::codec::ProstCodec::default();
3492                        let mut grpc = tonic::server::Grpc::new(codec)
3493                            .apply_compression_config(
3494                                accept_compression_encodings,
3495                                send_compression_encodings,
3496                            )
3497                            .apply_max_message_size_config(
3498                                max_decoding_message_size,
3499                                max_encoding_message_size,
3500                            );
3501                        let res = grpc.server_streaming(method, req).await;
3502                        Ok(res)
3503                    };
3504                    Box::pin(fut)
3505                }
3506                "/penumbra.view.v1.ViewService/Notes" => {
3507                    #[allow(non_camel_case_types)]
3508                    struct NotesSvc<T: ViewService>(pub Arc<T>);
3509                    impl<
3510                        T: ViewService,
3511                    > tonic::server::ServerStreamingService<super::NotesRequest>
3512                    for NotesSvc<T> {
3513                        type Response = super::NotesResponse;
3514                        type ResponseStream = T::NotesStream;
3515                        type Future = BoxFuture<
3516                            tonic::Response<Self::ResponseStream>,
3517                            tonic::Status,
3518                        >;
3519                        fn call(
3520                            &mut self,
3521                            request: tonic::Request<super::NotesRequest>,
3522                        ) -> Self::Future {
3523                            let inner = Arc::clone(&self.0);
3524                            let fut = async move {
3525                                <T as ViewService>::notes(&inner, request).await
3526                            };
3527                            Box::pin(fut)
3528                        }
3529                    }
3530                    let accept_compression_encodings = self.accept_compression_encodings;
3531                    let send_compression_encodings = self.send_compression_encodings;
3532                    let max_decoding_message_size = self.max_decoding_message_size;
3533                    let max_encoding_message_size = self.max_encoding_message_size;
3534                    let inner = self.inner.clone();
3535                    let fut = async move {
3536                        let method = NotesSvc(inner);
3537                        let codec = tonic::codec::ProstCodec::default();
3538                        let mut grpc = tonic::server::Grpc::new(codec)
3539                            .apply_compression_config(
3540                                accept_compression_encodings,
3541                                send_compression_encodings,
3542                            )
3543                            .apply_max_message_size_config(
3544                                max_decoding_message_size,
3545                                max_encoding_message_size,
3546                            );
3547                        let res = grpc.server_streaming(method, req).await;
3548                        Ok(res)
3549                    };
3550                    Box::pin(fut)
3551                }
3552                "/penumbra.view.v1.ViewService/NotesForVoting" => {
3553                    #[allow(non_camel_case_types)]
3554                    struct NotesForVotingSvc<T: ViewService>(pub Arc<T>);
3555                    impl<
3556                        T: ViewService,
3557                    > tonic::server::ServerStreamingService<super::NotesForVotingRequest>
3558                    for NotesForVotingSvc<T> {
3559                        type Response = super::NotesForVotingResponse;
3560                        type ResponseStream = T::NotesForVotingStream;
3561                        type Future = BoxFuture<
3562                            tonic::Response<Self::ResponseStream>,
3563                            tonic::Status,
3564                        >;
3565                        fn call(
3566                            &mut self,
3567                            request: tonic::Request<super::NotesForVotingRequest>,
3568                        ) -> Self::Future {
3569                            let inner = Arc::clone(&self.0);
3570                            let fut = async move {
3571                                <T as ViewService>::notes_for_voting(&inner, request).await
3572                            };
3573                            Box::pin(fut)
3574                        }
3575                    }
3576                    let accept_compression_encodings = self.accept_compression_encodings;
3577                    let send_compression_encodings = self.send_compression_encodings;
3578                    let max_decoding_message_size = self.max_decoding_message_size;
3579                    let max_encoding_message_size = self.max_encoding_message_size;
3580                    let inner = self.inner.clone();
3581                    let fut = async move {
3582                        let method = NotesForVotingSvc(inner);
3583                        let codec = tonic::codec::ProstCodec::default();
3584                        let mut grpc = tonic::server::Grpc::new(codec)
3585                            .apply_compression_config(
3586                                accept_compression_encodings,
3587                                send_compression_encodings,
3588                            )
3589                            .apply_max_message_size_config(
3590                                max_decoding_message_size,
3591                                max_encoding_message_size,
3592                            );
3593                        let res = grpc.server_streaming(method, req).await;
3594                        Ok(res)
3595                    };
3596                    Box::pin(fut)
3597                }
3598                "/penumbra.view.v1.ViewService/Assets" => {
3599                    #[allow(non_camel_case_types)]
3600                    struct AssetsSvc<T: ViewService>(pub Arc<T>);
3601                    impl<
3602                        T: ViewService,
3603                    > tonic::server::ServerStreamingService<super::AssetsRequest>
3604                    for AssetsSvc<T> {
3605                        type Response = super::AssetsResponse;
3606                        type ResponseStream = T::AssetsStream;
3607                        type Future = BoxFuture<
3608                            tonic::Response<Self::ResponseStream>,
3609                            tonic::Status,
3610                        >;
3611                        fn call(
3612                            &mut self,
3613                            request: tonic::Request<super::AssetsRequest>,
3614                        ) -> Self::Future {
3615                            let inner = Arc::clone(&self.0);
3616                            let fut = async move {
3617                                <T as ViewService>::assets(&inner, request).await
3618                            };
3619                            Box::pin(fut)
3620                        }
3621                    }
3622                    let accept_compression_encodings = self.accept_compression_encodings;
3623                    let send_compression_encodings = self.send_compression_encodings;
3624                    let max_decoding_message_size = self.max_decoding_message_size;
3625                    let max_encoding_message_size = self.max_encoding_message_size;
3626                    let inner = self.inner.clone();
3627                    let fut = async move {
3628                        let method = AssetsSvc(inner);
3629                        let codec = tonic::codec::ProstCodec::default();
3630                        let mut grpc = tonic::server::Grpc::new(codec)
3631                            .apply_compression_config(
3632                                accept_compression_encodings,
3633                                send_compression_encodings,
3634                            )
3635                            .apply_max_message_size_config(
3636                                max_decoding_message_size,
3637                                max_encoding_message_size,
3638                            );
3639                        let res = grpc.server_streaming(method, req).await;
3640                        Ok(res)
3641                    };
3642                    Box::pin(fut)
3643                }
3644                "/penumbra.view.v1.ViewService/AssetMetadataById" => {
3645                    #[allow(non_camel_case_types)]
3646                    struct AssetMetadataByIdSvc<T: ViewService>(pub Arc<T>);
3647                    impl<
3648                        T: ViewService,
3649                    > tonic::server::UnaryService<super::AssetMetadataByIdRequest>
3650                    for AssetMetadataByIdSvc<T> {
3651                        type Response = super::AssetMetadataByIdResponse;
3652                        type Future = BoxFuture<
3653                            tonic::Response<Self::Response>,
3654                            tonic::Status,
3655                        >;
3656                        fn call(
3657                            &mut self,
3658                            request: tonic::Request<super::AssetMetadataByIdRequest>,
3659                        ) -> Self::Future {
3660                            let inner = Arc::clone(&self.0);
3661                            let fut = async move {
3662                                <T as ViewService>::asset_metadata_by_id(&inner, request)
3663                                    .await
3664                            };
3665                            Box::pin(fut)
3666                        }
3667                    }
3668                    let accept_compression_encodings = self.accept_compression_encodings;
3669                    let send_compression_encodings = self.send_compression_encodings;
3670                    let max_decoding_message_size = self.max_decoding_message_size;
3671                    let max_encoding_message_size = self.max_encoding_message_size;
3672                    let inner = self.inner.clone();
3673                    let fut = async move {
3674                        let method = AssetMetadataByIdSvc(inner);
3675                        let codec = tonic::codec::ProstCodec::default();
3676                        let mut grpc = tonic::server::Grpc::new(codec)
3677                            .apply_compression_config(
3678                                accept_compression_encodings,
3679                                send_compression_encodings,
3680                            )
3681                            .apply_max_message_size_config(
3682                                max_decoding_message_size,
3683                                max_encoding_message_size,
3684                            );
3685                        let res = grpc.unary(method, req).await;
3686                        Ok(res)
3687                    };
3688                    Box::pin(fut)
3689                }
3690                "/penumbra.view.v1.ViewService/AppParameters" => {
3691                    #[allow(non_camel_case_types)]
3692                    struct AppParametersSvc<T: ViewService>(pub Arc<T>);
3693                    impl<
3694                        T: ViewService,
3695                    > tonic::server::UnaryService<super::AppParametersRequest>
3696                    for AppParametersSvc<T> {
3697                        type Response = super::AppParametersResponse;
3698                        type Future = BoxFuture<
3699                            tonic::Response<Self::Response>,
3700                            tonic::Status,
3701                        >;
3702                        fn call(
3703                            &mut self,
3704                            request: tonic::Request<super::AppParametersRequest>,
3705                        ) -> Self::Future {
3706                            let inner = Arc::clone(&self.0);
3707                            let fut = async move {
3708                                <T as ViewService>::app_parameters(&inner, request).await
3709                            };
3710                            Box::pin(fut)
3711                        }
3712                    }
3713                    let accept_compression_encodings = self.accept_compression_encodings;
3714                    let send_compression_encodings = self.send_compression_encodings;
3715                    let max_decoding_message_size = self.max_decoding_message_size;
3716                    let max_encoding_message_size = self.max_encoding_message_size;
3717                    let inner = self.inner.clone();
3718                    let fut = async move {
3719                        let method = AppParametersSvc(inner);
3720                        let codec = tonic::codec::ProstCodec::default();
3721                        let mut grpc = tonic::server::Grpc::new(codec)
3722                            .apply_compression_config(
3723                                accept_compression_encodings,
3724                                send_compression_encodings,
3725                            )
3726                            .apply_max_message_size_config(
3727                                max_decoding_message_size,
3728                                max_encoding_message_size,
3729                            );
3730                        let res = grpc.unary(method, req).await;
3731                        Ok(res)
3732                    };
3733                    Box::pin(fut)
3734                }
3735                "/penumbra.view.v1.ViewService/GasPrices" => {
3736                    #[allow(non_camel_case_types)]
3737                    struct GasPricesSvc<T: ViewService>(pub Arc<T>);
3738                    impl<
3739                        T: ViewService,
3740                    > tonic::server::UnaryService<super::GasPricesRequest>
3741                    for GasPricesSvc<T> {
3742                        type Response = super::GasPricesResponse;
3743                        type Future = BoxFuture<
3744                            tonic::Response<Self::Response>,
3745                            tonic::Status,
3746                        >;
3747                        fn call(
3748                            &mut self,
3749                            request: tonic::Request<super::GasPricesRequest>,
3750                        ) -> Self::Future {
3751                            let inner = Arc::clone(&self.0);
3752                            let fut = async move {
3753                                <T as ViewService>::gas_prices(&inner, request).await
3754                            };
3755                            Box::pin(fut)
3756                        }
3757                    }
3758                    let accept_compression_encodings = self.accept_compression_encodings;
3759                    let send_compression_encodings = self.send_compression_encodings;
3760                    let max_decoding_message_size = self.max_decoding_message_size;
3761                    let max_encoding_message_size = self.max_encoding_message_size;
3762                    let inner = self.inner.clone();
3763                    let fut = async move {
3764                        let method = GasPricesSvc(inner);
3765                        let codec = tonic::codec::ProstCodec::default();
3766                        let mut grpc = tonic::server::Grpc::new(codec)
3767                            .apply_compression_config(
3768                                accept_compression_encodings,
3769                                send_compression_encodings,
3770                            )
3771                            .apply_max_message_size_config(
3772                                max_decoding_message_size,
3773                                max_encoding_message_size,
3774                            );
3775                        let res = grpc.unary(method, req).await;
3776                        Ok(res)
3777                    };
3778                    Box::pin(fut)
3779                }
3780                "/penumbra.view.v1.ViewService/FMDParameters" => {
3781                    #[allow(non_camel_case_types)]
3782                    struct FMDParametersSvc<T: ViewService>(pub Arc<T>);
3783                    impl<
3784                        T: ViewService,
3785                    > tonic::server::UnaryService<super::FmdParametersRequest>
3786                    for FMDParametersSvc<T> {
3787                        type Response = super::FmdParametersResponse;
3788                        type Future = BoxFuture<
3789                            tonic::Response<Self::Response>,
3790                            tonic::Status,
3791                        >;
3792                        fn call(
3793                            &mut self,
3794                            request: tonic::Request<super::FmdParametersRequest>,
3795                        ) -> Self::Future {
3796                            let inner = Arc::clone(&self.0);
3797                            let fut = async move {
3798                                <T as ViewService>::fmd_parameters(&inner, request).await
3799                            };
3800                            Box::pin(fut)
3801                        }
3802                    }
3803                    let accept_compression_encodings = self.accept_compression_encodings;
3804                    let send_compression_encodings = self.send_compression_encodings;
3805                    let max_decoding_message_size = self.max_decoding_message_size;
3806                    let max_encoding_message_size = self.max_encoding_message_size;
3807                    let inner = self.inner.clone();
3808                    let fut = async move {
3809                        let method = FMDParametersSvc(inner);
3810                        let codec = tonic::codec::ProstCodec::default();
3811                        let mut grpc = tonic::server::Grpc::new(codec)
3812                            .apply_compression_config(
3813                                accept_compression_encodings,
3814                                send_compression_encodings,
3815                            )
3816                            .apply_max_message_size_config(
3817                                max_decoding_message_size,
3818                                max_encoding_message_size,
3819                            );
3820                        let res = grpc.unary(method, req).await;
3821                        Ok(res)
3822                    };
3823                    Box::pin(fut)
3824                }
3825                "/penumbra.view.v1.ViewService/AddressByIndex" => {
3826                    #[allow(non_camel_case_types)]
3827                    struct AddressByIndexSvc<T: ViewService>(pub Arc<T>);
3828                    impl<
3829                        T: ViewService,
3830                    > tonic::server::UnaryService<super::AddressByIndexRequest>
3831                    for AddressByIndexSvc<T> {
3832                        type Response = super::AddressByIndexResponse;
3833                        type Future = BoxFuture<
3834                            tonic::Response<Self::Response>,
3835                            tonic::Status,
3836                        >;
3837                        fn call(
3838                            &mut self,
3839                            request: tonic::Request<super::AddressByIndexRequest>,
3840                        ) -> Self::Future {
3841                            let inner = Arc::clone(&self.0);
3842                            let fut = async move {
3843                                <T as ViewService>::address_by_index(&inner, request).await
3844                            };
3845                            Box::pin(fut)
3846                        }
3847                    }
3848                    let accept_compression_encodings = self.accept_compression_encodings;
3849                    let send_compression_encodings = self.send_compression_encodings;
3850                    let max_decoding_message_size = self.max_decoding_message_size;
3851                    let max_encoding_message_size = self.max_encoding_message_size;
3852                    let inner = self.inner.clone();
3853                    let fut = async move {
3854                        let method = AddressByIndexSvc(inner);
3855                        let codec = tonic::codec::ProstCodec::default();
3856                        let mut grpc = tonic::server::Grpc::new(codec)
3857                            .apply_compression_config(
3858                                accept_compression_encodings,
3859                                send_compression_encodings,
3860                            )
3861                            .apply_max_message_size_config(
3862                                max_decoding_message_size,
3863                                max_encoding_message_size,
3864                            );
3865                        let res = grpc.unary(method, req).await;
3866                        Ok(res)
3867                    };
3868                    Box::pin(fut)
3869                }
3870                "/penumbra.view.v1.ViewService/TransparentAddress" => {
3871                    #[allow(non_camel_case_types)]
3872                    struct TransparentAddressSvc<T: ViewService>(pub Arc<T>);
3873                    impl<
3874                        T: ViewService,
3875                    > tonic::server::UnaryService<super::TransparentAddressRequest>
3876                    for TransparentAddressSvc<T> {
3877                        type Response = super::TransparentAddressResponse;
3878                        type Future = BoxFuture<
3879                            tonic::Response<Self::Response>,
3880                            tonic::Status,
3881                        >;
3882                        fn call(
3883                            &mut self,
3884                            request: tonic::Request<super::TransparentAddressRequest>,
3885                        ) -> Self::Future {
3886                            let inner = Arc::clone(&self.0);
3887                            let fut = async move {
3888                                <T as ViewService>::transparent_address(&inner, request)
3889                                    .await
3890                            };
3891                            Box::pin(fut)
3892                        }
3893                    }
3894                    let accept_compression_encodings = self.accept_compression_encodings;
3895                    let send_compression_encodings = self.send_compression_encodings;
3896                    let max_decoding_message_size = self.max_decoding_message_size;
3897                    let max_encoding_message_size = self.max_encoding_message_size;
3898                    let inner = self.inner.clone();
3899                    let fut = async move {
3900                        let method = TransparentAddressSvc(inner);
3901                        let codec = tonic::codec::ProstCodec::default();
3902                        let mut grpc = tonic::server::Grpc::new(codec)
3903                            .apply_compression_config(
3904                                accept_compression_encodings,
3905                                send_compression_encodings,
3906                            )
3907                            .apply_max_message_size_config(
3908                                max_decoding_message_size,
3909                                max_encoding_message_size,
3910                            );
3911                        let res = grpc.unary(method, req).await;
3912                        Ok(res)
3913                    };
3914                    Box::pin(fut)
3915                }
3916                "/penumbra.view.v1.ViewService/WalletId" => {
3917                    #[allow(non_camel_case_types)]
3918                    struct WalletIdSvc<T: ViewService>(pub Arc<T>);
3919                    impl<
3920                        T: ViewService,
3921                    > tonic::server::UnaryService<super::WalletIdRequest>
3922                    for WalletIdSvc<T> {
3923                        type Response = super::WalletIdResponse;
3924                        type Future = BoxFuture<
3925                            tonic::Response<Self::Response>,
3926                            tonic::Status,
3927                        >;
3928                        fn call(
3929                            &mut self,
3930                            request: tonic::Request<super::WalletIdRequest>,
3931                        ) -> Self::Future {
3932                            let inner = Arc::clone(&self.0);
3933                            let fut = async move {
3934                                <T as ViewService>::wallet_id(&inner, request).await
3935                            };
3936                            Box::pin(fut)
3937                        }
3938                    }
3939                    let accept_compression_encodings = self.accept_compression_encodings;
3940                    let send_compression_encodings = self.send_compression_encodings;
3941                    let max_decoding_message_size = self.max_decoding_message_size;
3942                    let max_encoding_message_size = self.max_encoding_message_size;
3943                    let inner = self.inner.clone();
3944                    let fut = async move {
3945                        let method = WalletIdSvc(inner);
3946                        let codec = tonic::codec::ProstCodec::default();
3947                        let mut grpc = tonic::server::Grpc::new(codec)
3948                            .apply_compression_config(
3949                                accept_compression_encodings,
3950                                send_compression_encodings,
3951                            )
3952                            .apply_max_message_size_config(
3953                                max_decoding_message_size,
3954                                max_encoding_message_size,
3955                            );
3956                        let res = grpc.unary(method, req).await;
3957                        Ok(res)
3958                    };
3959                    Box::pin(fut)
3960                }
3961                "/penumbra.view.v1.ViewService/IndexByAddress" => {
3962                    #[allow(non_camel_case_types)]
3963                    struct IndexByAddressSvc<T: ViewService>(pub Arc<T>);
3964                    impl<
3965                        T: ViewService,
3966                    > tonic::server::UnaryService<super::IndexByAddressRequest>
3967                    for IndexByAddressSvc<T> {
3968                        type Response = super::IndexByAddressResponse;
3969                        type Future = BoxFuture<
3970                            tonic::Response<Self::Response>,
3971                            tonic::Status,
3972                        >;
3973                        fn call(
3974                            &mut self,
3975                            request: tonic::Request<super::IndexByAddressRequest>,
3976                        ) -> Self::Future {
3977                            let inner = Arc::clone(&self.0);
3978                            let fut = async move {
3979                                <T as ViewService>::index_by_address(&inner, request).await
3980                            };
3981                            Box::pin(fut)
3982                        }
3983                    }
3984                    let accept_compression_encodings = self.accept_compression_encodings;
3985                    let send_compression_encodings = self.send_compression_encodings;
3986                    let max_decoding_message_size = self.max_decoding_message_size;
3987                    let max_encoding_message_size = self.max_encoding_message_size;
3988                    let inner = self.inner.clone();
3989                    let fut = async move {
3990                        let method = IndexByAddressSvc(inner);
3991                        let codec = tonic::codec::ProstCodec::default();
3992                        let mut grpc = tonic::server::Grpc::new(codec)
3993                            .apply_compression_config(
3994                                accept_compression_encodings,
3995                                send_compression_encodings,
3996                            )
3997                            .apply_max_message_size_config(
3998                                max_decoding_message_size,
3999                                max_encoding_message_size,
4000                            );
4001                        let res = grpc.unary(method, req).await;
4002                        Ok(res)
4003                    };
4004                    Box::pin(fut)
4005                }
4006                "/penumbra.view.v1.ViewService/EphemeralAddress" => {
4007                    #[allow(non_camel_case_types)]
4008                    struct EphemeralAddressSvc<T: ViewService>(pub Arc<T>);
4009                    impl<
4010                        T: ViewService,
4011                    > tonic::server::UnaryService<super::EphemeralAddressRequest>
4012                    for EphemeralAddressSvc<T> {
4013                        type Response = super::EphemeralAddressResponse;
4014                        type Future = BoxFuture<
4015                            tonic::Response<Self::Response>,
4016                            tonic::Status,
4017                        >;
4018                        fn call(
4019                            &mut self,
4020                            request: tonic::Request<super::EphemeralAddressRequest>,
4021                        ) -> Self::Future {
4022                            let inner = Arc::clone(&self.0);
4023                            let fut = async move {
4024                                <T as ViewService>::ephemeral_address(&inner, request).await
4025                            };
4026                            Box::pin(fut)
4027                        }
4028                    }
4029                    let accept_compression_encodings = self.accept_compression_encodings;
4030                    let send_compression_encodings = self.send_compression_encodings;
4031                    let max_decoding_message_size = self.max_decoding_message_size;
4032                    let max_encoding_message_size = self.max_encoding_message_size;
4033                    let inner = self.inner.clone();
4034                    let fut = async move {
4035                        let method = EphemeralAddressSvc(inner);
4036                        let codec = tonic::codec::ProstCodec::default();
4037                        let mut grpc = tonic::server::Grpc::new(codec)
4038                            .apply_compression_config(
4039                                accept_compression_encodings,
4040                                send_compression_encodings,
4041                            )
4042                            .apply_max_message_size_config(
4043                                max_decoding_message_size,
4044                                max_encoding_message_size,
4045                            );
4046                        let res = grpc.unary(method, req).await;
4047                        Ok(res)
4048                    };
4049                    Box::pin(fut)
4050                }
4051                "/penumbra.view.v1.ViewService/Balances" => {
4052                    #[allow(non_camel_case_types)]
4053                    struct BalancesSvc<T: ViewService>(pub Arc<T>);
4054                    impl<
4055                        T: ViewService,
4056                    > tonic::server::ServerStreamingService<super::BalancesRequest>
4057                    for BalancesSvc<T> {
4058                        type Response = super::BalancesResponse;
4059                        type ResponseStream = T::BalancesStream;
4060                        type Future = BoxFuture<
4061                            tonic::Response<Self::ResponseStream>,
4062                            tonic::Status,
4063                        >;
4064                        fn call(
4065                            &mut self,
4066                            request: tonic::Request<super::BalancesRequest>,
4067                        ) -> Self::Future {
4068                            let inner = Arc::clone(&self.0);
4069                            let fut = async move {
4070                                <T as ViewService>::balances(&inner, request).await
4071                            };
4072                            Box::pin(fut)
4073                        }
4074                    }
4075                    let accept_compression_encodings = self.accept_compression_encodings;
4076                    let send_compression_encodings = self.send_compression_encodings;
4077                    let max_decoding_message_size = self.max_decoding_message_size;
4078                    let max_encoding_message_size = self.max_encoding_message_size;
4079                    let inner = self.inner.clone();
4080                    let fut = async move {
4081                        let method = BalancesSvc(inner);
4082                        let codec = tonic::codec::ProstCodec::default();
4083                        let mut grpc = tonic::server::Grpc::new(codec)
4084                            .apply_compression_config(
4085                                accept_compression_encodings,
4086                                send_compression_encodings,
4087                            )
4088                            .apply_max_message_size_config(
4089                                max_decoding_message_size,
4090                                max_encoding_message_size,
4091                            );
4092                        let res = grpc.server_streaming(method, req).await;
4093                        Ok(res)
4094                    };
4095                    Box::pin(fut)
4096                }
4097                "/penumbra.view.v1.ViewService/NoteByCommitment" => {
4098                    #[allow(non_camel_case_types)]
4099                    struct NoteByCommitmentSvc<T: ViewService>(pub Arc<T>);
4100                    impl<
4101                        T: ViewService,
4102                    > tonic::server::UnaryService<super::NoteByCommitmentRequest>
4103                    for NoteByCommitmentSvc<T> {
4104                        type Response = super::NoteByCommitmentResponse;
4105                        type Future = BoxFuture<
4106                            tonic::Response<Self::Response>,
4107                            tonic::Status,
4108                        >;
4109                        fn call(
4110                            &mut self,
4111                            request: tonic::Request<super::NoteByCommitmentRequest>,
4112                        ) -> Self::Future {
4113                            let inner = Arc::clone(&self.0);
4114                            let fut = async move {
4115                                <T as ViewService>::note_by_commitment(&inner, request)
4116                                    .await
4117                            };
4118                            Box::pin(fut)
4119                        }
4120                    }
4121                    let accept_compression_encodings = self.accept_compression_encodings;
4122                    let send_compression_encodings = self.send_compression_encodings;
4123                    let max_decoding_message_size = self.max_decoding_message_size;
4124                    let max_encoding_message_size = self.max_encoding_message_size;
4125                    let inner = self.inner.clone();
4126                    let fut = async move {
4127                        let method = NoteByCommitmentSvc(inner);
4128                        let codec = tonic::codec::ProstCodec::default();
4129                        let mut grpc = tonic::server::Grpc::new(codec)
4130                            .apply_compression_config(
4131                                accept_compression_encodings,
4132                                send_compression_encodings,
4133                            )
4134                            .apply_max_message_size_config(
4135                                max_decoding_message_size,
4136                                max_encoding_message_size,
4137                            );
4138                        let res = grpc.unary(method, req).await;
4139                        Ok(res)
4140                    };
4141                    Box::pin(fut)
4142                }
4143                "/penumbra.view.v1.ViewService/SwapByCommitment" => {
4144                    #[allow(non_camel_case_types)]
4145                    struct SwapByCommitmentSvc<T: ViewService>(pub Arc<T>);
4146                    impl<
4147                        T: ViewService,
4148                    > tonic::server::UnaryService<super::SwapByCommitmentRequest>
4149                    for SwapByCommitmentSvc<T> {
4150                        type Response = super::SwapByCommitmentResponse;
4151                        type Future = BoxFuture<
4152                            tonic::Response<Self::Response>,
4153                            tonic::Status,
4154                        >;
4155                        fn call(
4156                            &mut self,
4157                            request: tonic::Request<super::SwapByCommitmentRequest>,
4158                        ) -> Self::Future {
4159                            let inner = Arc::clone(&self.0);
4160                            let fut = async move {
4161                                <T as ViewService>::swap_by_commitment(&inner, request)
4162                                    .await
4163                            };
4164                            Box::pin(fut)
4165                        }
4166                    }
4167                    let accept_compression_encodings = self.accept_compression_encodings;
4168                    let send_compression_encodings = self.send_compression_encodings;
4169                    let max_decoding_message_size = self.max_decoding_message_size;
4170                    let max_encoding_message_size = self.max_encoding_message_size;
4171                    let inner = self.inner.clone();
4172                    let fut = async move {
4173                        let method = SwapByCommitmentSvc(inner);
4174                        let codec = tonic::codec::ProstCodec::default();
4175                        let mut grpc = tonic::server::Grpc::new(codec)
4176                            .apply_compression_config(
4177                                accept_compression_encodings,
4178                                send_compression_encodings,
4179                            )
4180                            .apply_max_message_size_config(
4181                                max_decoding_message_size,
4182                                max_encoding_message_size,
4183                            );
4184                        let res = grpc.unary(method, req).await;
4185                        Ok(res)
4186                    };
4187                    Box::pin(fut)
4188                }
4189                "/penumbra.view.v1.ViewService/UnclaimedSwaps" => {
4190                    #[allow(non_camel_case_types)]
4191                    struct UnclaimedSwapsSvc<T: ViewService>(pub Arc<T>);
4192                    impl<
4193                        T: ViewService,
4194                    > tonic::server::ServerStreamingService<super::UnclaimedSwapsRequest>
4195                    for UnclaimedSwapsSvc<T> {
4196                        type Response = super::UnclaimedSwapsResponse;
4197                        type ResponseStream = T::UnclaimedSwapsStream;
4198                        type Future = BoxFuture<
4199                            tonic::Response<Self::ResponseStream>,
4200                            tonic::Status,
4201                        >;
4202                        fn call(
4203                            &mut self,
4204                            request: tonic::Request<super::UnclaimedSwapsRequest>,
4205                        ) -> Self::Future {
4206                            let inner = Arc::clone(&self.0);
4207                            let fut = async move {
4208                                <T as ViewService>::unclaimed_swaps(&inner, request).await
4209                            };
4210                            Box::pin(fut)
4211                        }
4212                    }
4213                    let accept_compression_encodings = self.accept_compression_encodings;
4214                    let send_compression_encodings = self.send_compression_encodings;
4215                    let max_decoding_message_size = self.max_decoding_message_size;
4216                    let max_encoding_message_size = self.max_encoding_message_size;
4217                    let inner = self.inner.clone();
4218                    let fut = async move {
4219                        let method = UnclaimedSwapsSvc(inner);
4220                        let codec = tonic::codec::ProstCodec::default();
4221                        let mut grpc = tonic::server::Grpc::new(codec)
4222                            .apply_compression_config(
4223                                accept_compression_encodings,
4224                                send_compression_encodings,
4225                            )
4226                            .apply_max_message_size_config(
4227                                max_decoding_message_size,
4228                                max_encoding_message_size,
4229                            );
4230                        let res = grpc.server_streaming(method, req).await;
4231                        Ok(res)
4232                    };
4233                    Box::pin(fut)
4234                }
4235                "/penumbra.view.v1.ViewService/NullifierStatus" => {
4236                    #[allow(non_camel_case_types)]
4237                    struct NullifierStatusSvc<T: ViewService>(pub Arc<T>);
4238                    impl<
4239                        T: ViewService,
4240                    > tonic::server::UnaryService<super::NullifierStatusRequest>
4241                    for NullifierStatusSvc<T> {
4242                        type Response = super::NullifierStatusResponse;
4243                        type Future = BoxFuture<
4244                            tonic::Response<Self::Response>,
4245                            tonic::Status,
4246                        >;
4247                        fn call(
4248                            &mut self,
4249                            request: tonic::Request<super::NullifierStatusRequest>,
4250                        ) -> Self::Future {
4251                            let inner = Arc::clone(&self.0);
4252                            let fut = async move {
4253                                <T as ViewService>::nullifier_status(&inner, request).await
4254                            };
4255                            Box::pin(fut)
4256                        }
4257                    }
4258                    let accept_compression_encodings = self.accept_compression_encodings;
4259                    let send_compression_encodings = self.send_compression_encodings;
4260                    let max_decoding_message_size = self.max_decoding_message_size;
4261                    let max_encoding_message_size = self.max_encoding_message_size;
4262                    let inner = self.inner.clone();
4263                    let fut = async move {
4264                        let method = NullifierStatusSvc(inner);
4265                        let codec = tonic::codec::ProstCodec::default();
4266                        let mut grpc = tonic::server::Grpc::new(codec)
4267                            .apply_compression_config(
4268                                accept_compression_encodings,
4269                                send_compression_encodings,
4270                            )
4271                            .apply_max_message_size_config(
4272                                max_decoding_message_size,
4273                                max_encoding_message_size,
4274                            );
4275                        let res = grpc.unary(method, req).await;
4276                        Ok(res)
4277                    };
4278                    Box::pin(fut)
4279                }
4280                "/penumbra.view.v1.ViewService/TransactionInfoByHash" => {
4281                    #[allow(non_camel_case_types)]
4282                    struct TransactionInfoByHashSvc<T: ViewService>(pub Arc<T>);
4283                    impl<
4284                        T: ViewService,
4285                    > tonic::server::UnaryService<super::TransactionInfoByHashRequest>
4286                    for TransactionInfoByHashSvc<T> {
4287                        type Response = super::TransactionInfoByHashResponse;
4288                        type Future = BoxFuture<
4289                            tonic::Response<Self::Response>,
4290                            tonic::Status,
4291                        >;
4292                        fn call(
4293                            &mut self,
4294                            request: tonic::Request<super::TransactionInfoByHashRequest>,
4295                        ) -> Self::Future {
4296                            let inner = Arc::clone(&self.0);
4297                            let fut = async move {
4298                                <T as ViewService>::transaction_info_by_hash(
4299                                        &inner,
4300                                        request,
4301                                    )
4302                                    .await
4303                            };
4304                            Box::pin(fut)
4305                        }
4306                    }
4307                    let accept_compression_encodings = self.accept_compression_encodings;
4308                    let send_compression_encodings = self.send_compression_encodings;
4309                    let max_decoding_message_size = self.max_decoding_message_size;
4310                    let max_encoding_message_size = self.max_encoding_message_size;
4311                    let inner = self.inner.clone();
4312                    let fut = async move {
4313                        let method = TransactionInfoByHashSvc(inner);
4314                        let codec = tonic::codec::ProstCodec::default();
4315                        let mut grpc = tonic::server::Grpc::new(codec)
4316                            .apply_compression_config(
4317                                accept_compression_encodings,
4318                                send_compression_encodings,
4319                            )
4320                            .apply_max_message_size_config(
4321                                max_decoding_message_size,
4322                                max_encoding_message_size,
4323                            );
4324                        let res = grpc.unary(method, req).await;
4325                        Ok(res)
4326                    };
4327                    Box::pin(fut)
4328                }
4329                "/penumbra.view.v1.ViewService/TransactionInfo" => {
4330                    #[allow(non_camel_case_types)]
4331                    struct TransactionInfoSvc<T: ViewService>(pub Arc<T>);
4332                    impl<
4333                        T: ViewService,
4334                    > tonic::server::ServerStreamingService<
4335                        super::TransactionInfoRequest,
4336                    > for TransactionInfoSvc<T> {
4337                        type Response = super::TransactionInfoResponse;
4338                        type ResponseStream = T::TransactionInfoStream;
4339                        type Future = BoxFuture<
4340                            tonic::Response<Self::ResponseStream>,
4341                            tonic::Status,
4342                        >;
4343                        fn call(
4344                            &mut self,
4345                            request: tonic::Request<super::TransactionInfoRequest>,
4346                        ) -> Self::Future {
4347                            let inner = Arc::clone(&self.0);
4348                            let fut = async move {
4349                                <T as ViewService>::transaction_info(&inner, request).await
4350                            };
4351                            Box::pin(fut)
4352                        }
4353                    }
4354                    let accept_compression_encodings = self.accept_compression_encodings;
4355                    let send_compression_encodings = self.send_compression_encodings;
4356                    let max_decoding_message_size = self.max_decoding_message_size;
4357                    let max_encoding_message_size = self.max_encoding_message_size;
4358                    let inner = self.inner.clone();
4359                    let fut = async move {
4360                        let method = TransactionInfoSvc(inner);
4361                        let codec = tonic::codec::ProstCodec::default();
4362                        let mut grpc = tonic::server::Grpc::new(codec)
4363                            .apply_compression_config(
4364                                accept_compression_encodings,
4365                                send_compression_encodings,
4366                            )
4367                            .apply_max_message_size_config(
4368                                max_decoding_message_size,
4369                                max_encoding_message_size,
4370                            );
4371                        let res = grpc.server_streaming(method, req).await;
4372                        Ok(res)
4373                    };
4374                    Box::pin(fut)
4375                }
4376                "/penumbra.view.v1.ViewService/OwnedPositionIds" => {
4377                    #[allow(non_camel_case_types)]
4378                    struct OwnedPositionIdsSvc<T: ViewService>(pub Arc<T>);
4379                    impl<
4380                        T: ViewService,
4381                    > tonic::server::ServerStreamingService<
4382                        super::OwnedPositionIdsRequest,
4383                    > for OwnedPositionIdsSvc<T> {
4384                        type Response = super::OwnedPositionIdsResponse;
4385                        type ResponseStream = T::OwnedPositionIdsStream;
4386                        type Future = BoxFuture<
4387                            tonic::Response<Self::ResponseStream>,
4388                            tonic::Status,
4389                        >;
4390                        fn call(
4391                            &mut self,
4392                            request: tonic::Request<super::OwnedPositionIdsRequest>,
4393                        ) -> Self::Future {
4394                            let inner = Arc::clone(&self.0);
4395                            let fut = async move {
4396                                <T as ViewService>::owned_position_ids(&inner, request)
4397                                    .await
4398                            };
4399                            Box::pin(fut)
4400                        }
4401                    }
4402                    let accept_compression_encodings = self.accept_compression_encodings;
4403                    let send_compression_encodings = self.send_compression_encodings;
4404                    let max_decoding_message_size = self.max_decoding_message_size;
4405                    let max_encoding_message_size = self.max_encoding_message_size;
4406                    let inner = self.inner.clone();
4407                    let fut = async move {
4408                        let method = OwnedPositionIdsSvc(inner);
4409                        let codec = tonic::codec::ProstCodec::default();
4410                        let mut grpc = tonic::server::Grpc::new(codec)
4411                            .apply_compression_config(
4412                                accept_compression_encodings,
4413                                send_compression_encodings,
4414                            )
4415                            .apply_max_message_size_config(
4416                                max_decoding_message_size,
4417                                max_encoding_message_size,
4418                            );
4419                        let res = grpc.server_streaming(method, req).await;
4420                        Ok(res)
4421                    };
4422                    Box::pin(fut)
4423                }
4424                "/penumbra.view.v1.ViewService/TransactionPlanner" => {
4425                    #[allow(non_camel_case_types)]
4426                    struct TransactionPlannerSvc<T: ViewService>(pub Arc<T>);
4427                    impl<
4428                        T: ViewService,
4429                    > tonic::server::UnaryService<super::TransactionPlannerRequest>
4430                    for TransactionPlannerSvc<T> {
4431                        type Response = super::TransactionPlannerResponse;
4432                        type Future = BoxFuture<
4433                            tonic::Response<Self::Response>,
4434                            tonic::Status,
4435                        >;
4436                        fn call(
4437                            &mut self,
4438                            request: tonic::Request<super::TransactionPlannerRequest>,
4439                        ) -> Self::Future {
4440                            let inner = Arc::clone(&self.0);
4441                            let fut = async move {
4442                                <T as ViewService>::transaction_planner(&inner, request)
4443                                    .await
4444                            };
4445                            Box::pin(fut)
4446                        }
4447                    }
4448                    let accept_compression_encodings = self.accept_compression_encodings;
4449                    let send_compression_encodings = self.send_compression_encodings;
4450                    let max_decoding_message_size = self.max_decoding_message_size;
4451                    let max_encoding_message_size = self.max_encoding_message_size;
4452                    let inner = self.inner.clone();
4453                    let fut = async move {
4454                        let method = TransactionPlannerSvc(inner);
4455                        let codec = tonic::codec::ProstCodec::default();
4456                        let mut grpc = tonic::server::Grpc::new(codec)
4457                            .apply_compression_config(
4458                                accept_compression_encodings,
4459                                send_compression_encodings,
4460                            )
4461                            .apply_max_message_size_config(
4462                                max_decoding_message_size,
4463                                max_encoding_message_size,
4464                            );
4465                        let res = grpc.unary(method, req).await;
4466                        Ok(res)
4467                    };
4468                    Box::pin(fut)
4469                }
4470                "/penumbra.view.v1.ViewService/Witness" => {
4471                    #[allow(non_camel_case_types)]
4472                    struct WitnessSvc<T: ViewService>(pub Arc<T>);
4473                    impl<
4474                        T: ViewService,
4475                    > tonic::server::UnaryService<super::WitnessRequest>
4476                    for WitnessSvc<T> {
4477                        type Response = super::WitnessResponse;
4478                        type Future = BoxFuture<
4479                            tonic::Response<Self::Response>,
4480                            tonic::Status,
4481                        >;
4482                        fn call(
4483                            &mut self,
4484                            request: tonic::Request<super::WitnessRequest>,
4485                        ) -> Self::Future {
4486                            let inner = Arc::clone(&self.0);
4487                            let fut = async move {
4488                                <T as ViewService>::witness(&inner, request).await
4489                            };
4490                            Box::pin(fut)
4491                        }
4492                    }
4493                    let accept_compression_encodings = self.accept_compression_encodings;
4494                    let send_compression_encodings = self.send_compression_encodings;
4495                    let max_decoding_message_size = self.max_decoding_message_size;
4496                    let max_encoding_message_size = self.max_encoding_message_size;
4497                    let inner = self.inner.clone();
4498                    let fut = async move {
4499                        let method = WitnessSvc(inner);
4500                        let codec = tonic::codec::ProstCodec::default();
4501                        let mut grpc = tonic::server::Grpc::new(codec)
4502                            .apply_compression_config(
4503                                accept_compression_encodings,
4504                                send_compression_encodings,
4505                            )
4506                            .apply_max_message_size_config(
4507                                max_decoding_message_size,
4508                                max_encoding_message_size,
4509                            );
4510                        let res = grpc.unary(method, req).await;
4511                        Ok(res)
4512                    };
4513                    Box::pin(fut)
4514                }
4515                "/penumbra.view.v1.ViewService/WitnessAndBuild" => {
4516                    #[allow(non_camel_case_types)]
4517                    struct WitnessAndBuildSvc<T: ViewService>(pub Arc<T>);
4518                    impl<
4519                        T: ViewService,
4520                    > tonic::server::ServerStreamingService<
4521                        super::WitnessAndBuildRequest,
4522                    > for WitnessAndBuildSvc<T> {
4523                        type Response = super::WitnessAndBuildResponse;
4524                        type ResponseStream = T::WitnessAndBuildStream;
4525                        type Future = BoxFuture<
4526                            tonic::Response<Self::ResponseStream>,
4527                            tonic::Status,
4528                        >;
4529                        fn call(
4530                            &mut self,
4531                            request: tonic::Request<super::WitnessAndBuildRequest>,
4532                        ) -> Self::Future {
4533                            let inner = Arc::clone(&self.0);
4534                            let fut = async move {
4535                                <T as ViewService>::witness_and_build(&inner, request).await
4536                            };
4537                            Box::pin(fut)
4538                        }
4539                    }
4540                    let accept_compression_encodings = self.accept_compression_encodings;
4541                    let send_compression_encodings = self.send_compression_encodings;
4542                    let max_decoding_message_size = self.max_decoding_message_size;
4543                    let max_encoding_message_size = self.max_encoding_message_size;
4544                    let inner = self.inner.clone();
4545                    let fut = async move {
4546                        let method = WitnessAndBuildSvc(inner);
4547                        let codec = tonic::codec::ProstCodec::default();
4548                        let mut grpc = tonic::server::Grpc::new(codec)
4549                            .apply_compression_config(
4550                                accept_compression_encodings,
4551                                send_compression_encodings,
4552                            )
4553                            .apply_max_message_size_config(
4554                                max_decoding_message_size,
4555                                max_encoding_message_size,
4556                            );
4557                        let res = grpc.server_streaming(method, req).await;
4558                        Ok(res)
4559                    };
4560                    Box::pin(fut)
4561                }
4562                "/penumbra.view.v1.ViewService/AuthorizeAndBuild" => {
4563                    #[allow(non_camel_case_types)]
4564                    struct AuthorizeAndBuildSvc<T: ViewService>(pub Arc<T>);
4565                    impl<
4566                        T: ViewService,
4567                    > tonic::server::ServerStreamingService<
4568                        super::AuthorizeAndBuildRequest,
4569                    > for AuthorizeAndBuildSvc<T> {
4570                        type Response = super::AuthorizeAndBuildResponse;
4571                        type ResponseStream = T::AuthorizeAndBuildStream;
4572                        type Future = BoxFuture<
4573                            tonic::Response<Self::ResponseStream>,
4574                            tonic::Status,
4575                        >;
4576                        fn call(
4577                            &mut self,
4578                            request: tonic::Request<super::AuthorizeAndBuildRequest>,
4579                        ) -> Self::Future {
4580                            let inner = Arc::clone(&self.0);
4581                            let fut = async move {
4582                                <T as ViewService>::authorize_and_build(&inner, request)
4583                                    .await
4584                            };
4585                            Box::pin(fut)
4586                        }
4587                    }
4588                    let accept_compression_encodings = self.accept_compression_encodings;
4589                    let send_compression_encodings = self.send_compression_encodings;
4590                    let max_decoding_message_size = self.max_decoding_message_size;
4591                    let max_encoding_message_size = self.max_encoding_message_size;
4592                    let inner = self.inner.clone();
4593                    let fut = async move {
4594                        let method = AuthorizeAndBuildSvc(inner);
4595                        let codec = tonic::codec::ProstCodec::default();
4596                        let mut grpc = tonic::server::Grpc::new(codec)
4597                            .apply_compression_config(
4598                                accept_compression_encodings,
4599                                send_compression_encodings,
4600                            )
4601                            .apply_max_message_size_config(
4602                                max_decoding_message_size,
4603                                max_encoding_message_size,
4604                            );
4605                        let res = grpc.server_streaming(method, req).await;
4606                        Ok(res)
4607                    };
4608                    Box::pin(fut)
4609                }
4610                "/penumbra.view.v1.ViewService/BroadcastTransaction" => {
4611                    #[allow(non_camel_case_types)]
4612                    struct BroadcastTransactionSvc<T: ViewService>(pub Arc<T>);
4613                    impl<
4614                        T: ViewService,
4615                    > tonic::server::ServerStreamingService<
4616                        super::BroadcastTransactionRequest,
4617                    > for BroadcastTransactionSvc<T> {
4618                        type Response = super::BroadcastTransactionResponse;
4619                        type ResponseStream = T::BroadcastTransactionStream;
4620                        type Future = BoxFuture<
4621                            tonic::Response<Self::ResponseStream>,
4622                            tonic::Status,
4623                        >;
4624                        fn call(
4625                            &mut self,
4626                            request: tonic::Request<super::BroadcastTransactionRequest>,
4627                        ) -> Self::Future {
4628                            let inner = Arc::clone(&self.0);
4629                            let fut = async move {
4630                                <T as ViewService>::broadcast_transaction(&inner, request)
4631                                    .await
4632                            };
4633                            Box::pin(fut)
4634                        }
4635                    }
4636                    let accept_compression_encodings = self.accept_compression_encodings;
4637                    let send_compression_encodings = self.send_compression_encodings;
4638                    let max_decoding_message_size = self.max_decoding_message_size;
4639                    let max_encoding_message_size = self.max_encoding_message_size;
4640                    let inner = self.inner.clone();
4641                    let fut = async move {
4642                        let method = BroadcastTransactionSvc(inner);
4643                        let codec = tonic::codec::ProstCodec::default();
4644                        let mut grpc = tonic::server::Grpc::new(codec)
4645                            .apply_compression_config(
4646                                accept_compression_encodings,
4647                                send_compression_encodings,
4648                            )
4649                            .apply_max_message_size_config(
4650                                max_decoding_message_size,
4651                                max_encoding_message_size,
4652                            );
4653                        let res = grpc.server_streaming(method, req).await;
4654                        Ok(res)
4655                    };
4656                    Box::pin(fut)
4657                }
4658                "/penumbra.view.v1.ViewService/DelegationsByAddressIndex" => {
4659                    #[allow(non_camel_case_types)]
4660                    struct DelegationsByAddressIndexSvc<T: ViewService>(pub Arc<T>);
4661                    impl<
4662                        T: ViewService,
4663                    > tonic::server::ServerStreamingService<
4664                        super::DelegationsByAddressIndexRequest,
4665                    > for DelegationsByAddressIndexSvc<T> {
4666                        type Response = super::DelegationsByAddressIndexResponse;
4667                        type ResponseStream = T::DelegationsByAddressIndexStream;
4668                        type Future = BoxFuture<
4669                            tonic::Response<Self::ResponseStream>,
4670                            tonic::Status,
4671                        >;
4672                        fn call(
4673                            &mut self,
4674                            request: tonic::Request<
4675                                super::DelegationsByAddressIndexRequest,
4676                            >,
4677                        ) -> Self::Future {
4678                            let inner = Arc::clone(&self.0);
4679                            let fut = async move {
4680                                <T as ViewService>::delegations_by_address_index(
4681                                        &inner,
4682                                        request,
4683                                    )
4684                                    .await
4685                            };
4686                            Box::pin(fut)
4687                        }
4688                    }
4689                    let accept_compression_encodings = self.accept_compression_encodings;
4690                    let send_compression_encodings = self.send_compression_encodings;
4691                    let max_decoding_message_size = self.max_decoding_message_size;
4692                    let max_encoding_message_size = self.max_encoding_message_size;
4693                    let inner = self.inner.clone();
4694                    let fut = async move {
4695                        let method = DelegationsByAddressIndexSvc(inner);
4696                        let codec = tonic::codec::ProstCodec::default();
4697                        let mut grpc = tonic::server::Grpc::new(codec)
4698                            .apply_compression_config(
4699                                accept_compression_encodings,
4700                                send_compression_encodings,
4701                            )
4702                            .apply_max_message_size_config(
4703                                max_decoding_message_size,
4704                                max_encoding_message_size,
4705                            );
4706                        let res = grpc.server_streaming(method, req).await;
4707                        Ok(res)
4708                    };
4709                    Box::pin(fut)
4710                }
4711                "/penumbra.view.v1.ViewService/UnbondingTokensByAddressIndex" => {
4712                    #[allow(non_camel_case_types)]
4713                    struct UnbondingTokensByAddressIndexSvc<T: ViewService>(pub Arc<T>);
4714                    impl<
4715                        T: ViewService,
4716                    > tonic::server::ServerStreamingService<
4717                        super::UnbondingTokensByAddressIndexRequest,
4718                    > for UnbondingTokensByAddressIndexSvc<T> {
4719                        type Response = super::UnbondingTokensByAddressIndexResponse;
4720                        type ResponseStream = T::UnbondingTokensByAddressIndexStream;
4721                        type Future = BoxFuture<
4722                            tonic::Response<Self::ResponseStream>,
4723                            tonic::Status,
4724                        >;
4725                        fn call(
4726                            &mut self,
4727                            request: tonic::Request<
4728                                super::UnbondingTokensByAddressIndexRequest,
4729                            >,
4730                        ) -> Self::Future {
4731                            let inner = Arc::clone(&self.0);
4732                            let fut = async move {
4733                                <T as ViewService>::unbonding_tokens_by_address_index(
4734                                        &inner,
4735                                        request,
4736                                    )
4737                                    .await
4738                            };
4739                            Box::pin(fut)
4740                        }
4741                    }
4742                    let accept_compression_encodings = self.accept_compression_encodings;
4743                    let send_compression_encodings = self.send_compression_encodings;
4744                    let max_decoding_message_size = self.max_decoding_message_size;
4745                    let max_encoding_message_size = self.max_encoding_message_size;
4746                    let inner = self.inner.clone();
4747                    let fut = async move {
4748                        let method = UnbondingTokensByAddressIndexSvc(inner);
4749                        let codec = tonic::codec::ProstCodec::default();
4750                        let mut grpc = tonic::server::Grpc::new(codec)
4751                            .apply_compression_config(
4752                                accept_compression_encodings,
4753                                send_compression_encodings,
4754                            )
4755                            .apply_max_message_size_config(
4756                                max_decoding_message_size,
4757                                max_encoding_message_size,
4758                            );
4759                        let res = grpc.server_streaming(method, req).await;
4760                        Ok(res)
4761                    };
4762                    Box::pin(fut)
4763                }
4764                "/penumbra.view.v1.ViewService/Auctions" => {
4765                    #[allow(non_camel_case_types)]
4766                    struct AuctionsSvc<T: ViewService>(pub Arc<T>);
4767                    impl<
4768                        T: ViewService,
4769                    > tonic::server::ServerStreamingService<super::AuctionsRequest>
4770                    for AuctionsSvc<T> {
4771                        type Response = super::AuctionsResponse;
4772                        type ResponseStream = T::AuctionsStream;
4773                        type Future = BoxFuture<
4774                            tonic::Response<Self::ResponseStream>,
4775                            tonic::Status,
4776                        >;
4777                        fn call(
4778                            &mut self,
4779                            request: tonic::Request<super::AuctionsRequest>,
4780                        ) -> Self::Future {
4781                            let inner = Arc::clone(&self.0);
4782                            let fut = async move {
4783                                <T as ViewService>::auctions(&inner, request).await
4784                            };
4785                            Box::pin(fut)
4786                        }
4787                    }
4788                    let accept_compression_encodings = self.accept_compression_encodings;
4789                    let send_compression_encodings = self.send_compression_encodings;
4790                    let max_decoding_message_size = self.max_decoding_message_size;
4791                    let max_encoding_message_size = self.max_encoding_message_size;
4792                    let inner = self.inner.clone();
4793                    let fut = async move {
4794                        let method = AuctionsSvc(inner);
4795                        let codec = tonic::codec::ProstCodec::default();
4796                        let mut grpc = tonic::server::Grpc::new(codec)
4797                            .apply_compression_config(
4798                                accept_compression_encodings,
4799                                send_compression_encodings,
4800                            )
4801                            .apply_max_message_size_config(
4802                                max_decoding_message_size,
4803                                max_encoding_message_size,
4804                            );
4805                        let res = grpc.server_streaming(method, req).await;
4806                        Ok(res)
4807                    };
4808                    Box::pin(fut)
4809                }
4810                "/penumbra.view.v1.ViewService/LatestSwaps" => {
4811                    #[allow(non_camel_case_types)]
4812                    struct LatestSwapsSvc<T: ViewService>(pub Arc<T>);
4813                    impl<
4814                        T: ViewService,
4815                    > tonic::server::ServerStreamingService<super::LatestSwapsRequest>
4816                    for LatestSwapsSvc<T> {
4817                        type Response = super::LatestSwapsResponse;
4818                        type ResponseStream = T::LatestSwapsStream;
4819                        type Future = BoxFuture<
4820                            tonic::Response<Self::ResponseStream>,
4821                            tonic::Status,
4822                        >;
4823                        fn call(
4824                            &mut self,
4825                            request: tonic::Request<super::LatestSwapsRequest>,
4826                        ) -> Self::Future {
4827                            let inner = Arc::clone(&self.0);
4828                            let fut = async move {
4829                                <T as ViewService>::latest_swaps(&inner, request).await
4830                            };
4831                            Box::pin(fut)
4832                        }
4833                    }
4834                    let accept_compression_encodings = self.accept_compression_encodings;
4835                    let send_compression_encodings = self.send_compression_encodings;
4836                    let max_decoding_message_size = self.max_decoding_message_size;
4837                    let max_encoding_message_size = self.max_encoding_message_size;
4838                    let inner = self.inner.clone();
4839                    let fut = async move {
4840                        let method = LatestSwapsSvc(inner);
4841                        let codec = tonic::codec::ProstCodec::default();
4842                        let mut grpc = tonic::server::Grpc::new(codec)
4843                            .apply_compression_config(
4844                                accept_compression_encodings,
4845                                send_compression_encodings,
4846                            )
4847                            .apply_max_message_size_config(
4848                                max_decoding_message_size,
4849                                max_encoding_message_size,
4850                            );
4851                        let res = grpc.server_streaming(method, req).await;
4852                        Ok(res)
4853                    };
4854                    Box::pin(fut)
4855                }
4856                _ => {
4857                    Box::pin(async move {
4858                        let mut response = http::Response::new(empty_body());
4859                        let headers = response.headers_mut();
4860                        headers
4861                            .insert(
4862                                tonic::Status::GRPC_STATUS,
4863                                (tonic::Code::Unimplemented as i32).into(),
4864                            );
4865                        headers
4866                            .insert(
4867                                http::header::CONTENT_TYPE,
4868                                tonic::metadata::GRPC_CONTENT_TYPE,
4869                            );
4870                        Ok(response)
4871                    })
4872                }
4873            }
4874        }
4875    }
4876    impl<T> Clone for ViewServiceServer<T> {
4877        fn clone(&self) -> Self {
4878            let inner = self.inner.clone();
4879            Self {
4880                inner,
4881                accept_compression_encodings: self.accept_compression_encodings,
4882                send_compression_encodings: self.send_compression_encodings,
4883                max_decoding_message_size: self.max_decoding_message_size,
4884                max_encoding_message_size: self.max_encoding_message_size,
4885            }
4886        }
4887    }
4888    /// Generated gRPC service name
4889    pub const SERVICE_NAME: &str = "penumbra.view.v1.ViewService";
4890    impl<T> tonic::server::NamedService for ViewServiceServer<T> {
4891        const NAME: &'static str = SERVICE_NAME;
4892    }
4893}