penumbra_sdk_app/
rpc.rs

1mod query;
2
3// TODO: Once we migrate to Tonic 0.10.0, we'll be able to use the `Routes` structure to have each
4// component define a method that returns a `Routes` with all of its query services bundled inside.
5//
6// This means we won't have to import all this shit and recite every single service -- we can e.g.,
7// have the app crate assemble all of its components' query services into a single `Routes` and
8// then just add that to the gRPC server.
9use {
10    self::query::AppQueryServer,
11    crate::PenumbraHost,
12    anyhow::Context,
13    cnidarium::{
14        proto::v1::query_service_server::QueryServiceServer as StorageQueryServiceServer,
15        rpc::Server as StorageServer,
16    },
17    ibc_proto::{
18        cosmos::bank::v1beta1::query_server::QueryServer as TransferQueryServer,
19        ibc::{
20            applications::transfer::v1::query_server::QueryServer as BankQueryServer,
21            core::{
22                channel::v1::query_server::QueryServer as ChannelQueryServer,
23                client::v1::query_server::QueryServer as ClientQueryServer,
24                connection::v1::query_server::QueryServer as ConnectionQueryServer,
25            },
26        },
27    },
28    penumbra_sdk_auction::component::rpc::Server as AuctionServer,
29    penumbra_sdk_community_pool::component::rpc::Server as CommunityPoolServer,
30    penumbra_sdk_compact_block::component::rpc::Server as CompactBlockServer,
31    penumbra_sdk_dex::component::rpc::Server as DexServer,
32    penumbra_sdk_fee::component::rpc::Server as FeeServer,
33    penumbra_sdk_funding::component::rpc::Server as FundingServer,
34    penumbra_sdk_governance::component::rpc::Server as GovernanceServer,
35    penumbra_sdk_proto::{
36        core::{
37            app::v1::query_service_server::QueryServiceServer as AppQueryServiceServer,
38            component::{
39                auction::v1::query_service_server::QueryServiceServer as AuctionQueryServiceServer,
40                community_pool::v1::query_service_server::QueryServiceServer as CommunityPoolQueryServiceServer,
41                compact_block::v1::query_service_server::QueryServiceServer as CompactBlockQueryServiceServer,
42                dex::v1::{
43                    query_service_server::QueryServiceServer as DexQueryServiceServer,
44                    simulation_service_server::SimulationServiceServer,
45                },
46                fee::v1::query_service_server::QueryServiceServer as FeeQueryServiceServer,
47                funding::v1::funding_service_server::FundingServiceServer as FundingQueryServiceServer,
48                governance::v1::query_service_server::QueryServiceServer as GovernanceQueryServiceServer,
49                sct::v1::query_service_server::QueryServiceServer as SctQueryServiceServer,
50                shielded_pool::v1::query_service_server::QueryServiceServer as ShieldedPoolQueryServiceServer,
51                stake::v1::query_service_server::QueryServiceServer as StakeQueryServiceServer,
52            },
53        },
54        util::tendermint_proxy::v1::tendermint_proxy_service_server::{
55            TendermintProxyService, TendermintProxyServiceServer,
56        },
57    },
58    penumbra_sdk_sct::component::rpc::Server as SctServer,
59    penumbra_sdk_shielded_pool::component::rpc::Server as ShieldedPoolServer,
60    penumbra_sdk_stake::component::rpc::Server as StakeServer,
61    tonic::service::Routes,
62    tonic_web::enable as we,
63};
64
65pub fn routes(
66    storage: &cnidarium::Storage,
67    tm_proxy: impl TendermintProxyService,
68    _enable_expensive_rpc: bool,
69) -> anyhow::Result<tonic::service::Routes> {
70    let ibc = penumbra_sdk_ibc::component::rpc::IbcQuery::<PenumbraHost>::new(storage.clone());
71
72    let mut builder = Routes::builder();
73    builder
74        // As part of #2932, we are disabling all timeouts until we circle back to our
75        // performance story.
76        // Sets a timeout for all gRPC requests, but note that in the case of streaming
77        // requests, the timeout is only applied to the initial request. This means that
78        // this does not prevent long lived streams, for example to allow clients to obtain
79        // new blocks.
80        // .timeout(std::time::Duration::from_secs(7))
81        // Wrap each of the gRPC services in a tonic-web proxy:
82        .add_service(we(StorageQueryServiceServer::new(StorageServer::new(
83            storage.clone(),
84        ))))
85        .add_service(we(AuctionQueryServiceServer::new(AuctionServer::new(
86            storage.clone(),
87        ))))
88        .add_service(we(AppQueryServiceServer::new(AppQueryServer::new(
89            storage.clone(),
90        ))))
91        .add_service(we(CompactBlockQueryServiceServer::new(
92            CompactBlockServer::new(storage.clone()),
93        )))
94        .add_service(we(DexQueryServiceServer::new(DexServer::new(
95            storage.clone(),
96        ))))
97        .add_service(we(FeeQueryServiceServer::new(FeeServer::new(
98            storage.clone(),
99        ))))
100        .add_service(we(GovernanceQueryServiceServer::new(
101            GovernanceServer::new(storage.clone()),
102        )))
103        .add_service(we(SctQueryServiceServer::new(SctServer::new(
104            storage.clone(),
105        ))))
106        .add_service(we(ShieldedPoolQueryServiceServer::new(
107            ShieldedPoolServer::new(storage.clone()),
108        )))
109        .add_service(we(TransferQueryServer::new(ShieldedPoolServer::new(
110            storage.clone(),
111        ))))
112        .add_service(we(BankQueryServer::new(ShieldedPoolServer::new(
113            storage.clone(),
114        ))))
115        .add_service(we(CommunityPoolQueryServiceServer::new(
116            CommunityPoolServer::new(storage.clone()),
117        )))
118        .add_service(we(StakeQueryServiceServer::new(StakeServer::new(
119            storage.clone(),
120        ))))
121        .add_service(we(ClientQueryServer::new(ibc.clone())))
122        .add_service(we(ChannelQueryServer::new(ibc.clone())))
123        .add_service(we(ConnectionQueryServer::new(ibc.clone())))
124        .add_service(we(TendermintProxyServiceServer::new(tm_proxy)))
125        .add_service(we(SimulationServiceServer::new(DexServer::new(
126            storage.clone(),
127        ))))
128        .add_service(we(FundingQueryServiceServer::new(FundingServer::new(
129            storage.clone(),
130        ))))
131        .add_service(we(tonic_reflection::server::Builder::configure()
132            .register_encoded_file_descriptor_set(penumbra_sdk_proto::FILE_DESCRIPTOR_SET)
133            .build_v1()
134            .with_context(|| "could not configure grpc reflection service")?));
135    Ok(builder.routes().prepare())
136}