ibc_query/core/channel/
service.rs

1//! [`ChannelQueryService`](ChannelQueryService) takes a generic `I` to store `ibc_context` that implements [`QueryContext`](QueryContext).
2//! `I` must be a type where writes from one thread are readable from another.
3//! This means using `Arc<Mutex<_>>` or `Arc<RwLock<_>>` in most cases.
4
5use ibc::core::host::ConsensusStateRef;
6use ibc::core::primitives::prelude::*;
7use ibc_proto::google::protobuf::Any;
8use ibc_proto::ibc::core::channel::v1::query_server::Query as ChannelQuery;
9use ibc_proto::ibc::core::channel::v1::{
10    QueryChannelClientStateRequest, QueryChannelClientStateResponse,
11    QueryChannelConsensusStateRequest, QueryChannelConsensusStateResponse,
12    QueryChannelParamsRequest, QueryChannelParamsResponse, QueryChannelRequest,
13    QueryChannelResponse, QueryChannelsRequest, QueryChannelsResponse,
14    QueryConnectionChannelsRequest, QueryConnectionChannelsResponse,
15    QueryNextSequenceReceiveRequest, QueryNextSequenceReceiveResponse,
16    QueryNextSequenceSendRequest, QueryNextSequenceSendResponse, QueryPacketAcknowledgementRequest,
17    QueryPacketAcknowledgementResponse, QueryPacketAcknowledgementsRequest,
18    QueryPacketAcknowledgementsResponse, QueryPacketCommitmentRequest,
19    QueryPacketCommitmentResponse, QueryPacketCommitmentsRequest, QueryPacketCommitmentsResponse,
20    QueryPacketReceiptRequest, QueryPacketReceiptResponse, QueryUnreceivedAcksRequest,
21    QueryUnreceivedAcksResponse, QueryUnreceivedPacketsRequest, QueryUnreceivedPacketsResponse,
22    QueryUpgradeErrorRequest, QueryUpgradeErrorResponse, QueryUpgradeRequest, QueryUpgradeResponse,
23};
24use tonic::{Request, Response, Status};
25
26use super::{
27    query_channel, query_channel_client_state, query_channel_consensus_state, query_channels,
28    query_connection_channels, query_next_sequence_receive, query_next_sequence_send,
29    query_packet_acknowledgement, query_packet_acknowledgements, query_packet_commitment,
30    query_packet_commitments, query_packet_receipt, query_unreceived_acks,
31    query_unreceived_packets,
32};
33use crate::core::context::QueryContext;
34use crate::utils::{IntoDomain, IntoResponse, TryIntoDomain};
35
36// TODO(rano): currently the services don't support pagination, so we return all the results.
37
38/// The generic `I` must be a type where writes from one thread are readable from another.
39/// This means using `Arc<Mutex<_>>` or `Arc<RwLock<_>>` in most cases.
40pub struct ChannelQueryService<I>
41where
42    I: QueryContext + Send + Sync + 'static,
43    ConsensusStateRef<I>: Into<Any>,
44{
45    ibc_context: I,
46}
47
48impl<I> ChannelQueryService<I>
49where
50    I: QueryContext + Send + Sync + 'static,
51    ConsensusStateRef<I>: Into<Any>,
52{
53    /// The parameter `ibc_context` must be a type where writes from one thread are readable from another.
54    /// This means using `Arc<Mutex<_>>` or `Arc<RwLock<_>>` in most cases.
55    pub fn new(ibc_context: I) -> Self {
56        Self { ibc_context }
57    }
58}
59
60#[tonic::async_trait]
61impl<I> ChannelQuery for ChannelQueryService<I>
62where
63    I: QueryContext + Send + Sync + 'static,
64    ConsensusStateRef<I>: Into<Any>,
65{
66    async fn channel(
67        &self,
68        request: Request<QueryChannelRequest>,
69    ) -> Result<Response<QueryChannelResponse>, Status> {
70        query_channel(&self.ibc_context, &request.try_into_domain()?)?.into_response()
71    }
72
73    async fn channels(
74        &self,
75        request: Request<QueryChannelsRequest>,
76    ) -> Result<Response<QueryChannelsResponse>, Status> {
77        query_channels(&self.ibc_context, &request.into_domain())?.into_response()
78    }
79
80    async fn connection_channels(
81        &self,
82        request: Request<QueryConnectionChannelsRequest>,
83    ) -> Result<Response<QueryConnectionChannelsResponse>, Status> {
84        query_connection_channels(&self.ibc_context, &request.try_into_domain()?)?.into_response()
85    }
86
87    async fn channel_client_state(
88        &self,
89        request: Request<QueryChannelClientStateRequest>,
90    ) -> Result<Response<QueryChannelClientStateResponse>, Status> {
91        query_channel_client_state(&self.ibc_context, &request.try_into_domain()?)?.into_response()
92    }
93
94    async fn channel_consensus_state(
95        &self,
96        request: Request<QueryChannelConsensusStateRequest>,
97    ) -> Result<Response<QueryChannelConsensusStateResponse>, Status> {
98        query_channel_consensus_state(&self.ibc_context, &request.try_into_domain()?)?
99            .into_response()
100    }
101
102    async fn packet_commitment(
103        &self,
104        request: Request<QueryPacketCommitmentRequest>,
105    ) -> Result<Response<QueryPacketCommitmentResponse>, Status> {
106        query_packet_commitment(&self.ibc_context, &request.try_into_domain()?)?.into_response()
107    }
108
109    async fn packet_commitments(
110        &self,
111        request: Request<QueryPacketCommitmentsRequest>,
112    ) -> Result<Response<QueryPacketCommitmentsResponse>, Status> {
113        query_packet_commitments(&self.ibc_context, &request.try_into_domain()?)?.into_response()
114    }
115
116    async fn packet_receipt(
117        &self,
118        request: Request<QueryPacketReceiptRequest>,
119    ) -> Result<Response<QueryPacketReceiptResponse>, Status> {
120        query_packet_receipt(&self.ibc_context, &request.try_into_domain()?)?.into_response()
121    }
122
123    async fn packet_acknowledgement(
124        &self,
125        request: Request<QueryPacketAcknowledgementRequest>,
126    ) -> Result<Response<QueryPacketAcknowledgementResponse>, Status> {
127        query_packet_acknowledgement(&self.ibc_context, &request.try_into_domain()?)?
128            .into_response()
129    }
130
131    /// Returns all the acknowledgements if sequences are omitted.
132    async fn packet_acknowledgements(
133        &self,
134        request: Request<QueryPacketAcknowledgementsRequest>,
135    ) -> Result<Response<QueryPacketAcknowledgementsResponse>, Status> {
136        query_packet_acknowledgements(&self.ibc_context, &request.try_into_domain()?)?
137            .into_response()
138    }
139
140    /// Returns all the unreceived packets if sequences are omitted.
141    async fn unreceived_packets(
142        &self,
143        request: Request<QueryUnreceivedPacketsRequest>,
144    ) -> Result<Response<QueryUnreceivedPacketsResponse>, Status> {
145        query_unreceived_packets(&self.ibc_context, &request.try_into_domain()?)?.into_response()
146    }
147
148    /// Returns all the unreceived acknowledgements if sequences are omitted.
149    async fn unreceived_acks(
150        &self,
151        request: Request<QueryUnreceivedAcksRequest>,
152    ) -> Result<Response<QueryUnreceivedAcksResponse>, Status> {
153        query_unreceived_acks(&self.ibc_context, &request.try_into_domain()?)?.into_response()
154    }
155
156    async fn next_sequence_receive(
157        &self,
158        request: Request<QueryNextSequenceReceiveRequest>,
159    ) -> Result<Response<QueryNextSequenceReceiveResponse>, Status> {
160        query_next_sequence_receive(&self.ibc_context, &request.try_into_domain()?)?.into_response()
161    }
162
163    async fn next_sequence_send(
164        &self,
165        request: Request<QueryNextSequenceSendRequest>,
166    ) -> Result<Response<QueryNextSequenceSendResponse>, Status> {
167        query_next_sequence_send(&self.ibc_context, &request.try_into_domain()?)?.into_response()
168    }
169
170    async fn upgrade_error(
171        &self,
172        _request: Request<QueryUpgradeErrorRequest>,
173    ) -> Result<Response<QueryUpgradeErrorResponse>, Status> {
174        Err(Status::unimplemented(
175            "Querying UpgradeError is not supported yet",
176        ))
177    }
178
179    async fn upgrade(
180        &self,
181        _request: Request<QueryUpgradeRequest>,
182    ) -> Result<Response<QueryUpgradeResponse>, Status> {
183        Err(Status::unimplemented(
184            "Querying Upgrade is not supported yet",
185        ))
186    }
187
188    async fn channel_params(
189        &self,
190        _request: Request<QueryChannelParamsRequest>,
191    ) -> Result<Response<QueryChannelParamsResponse>, Status> {
192        Err(Status::unimplemented(
193            "Querying ChannelParams is not supported yet",
194        ))
195    }
196}