Skip to main content

rs_dapi_client/transport/
grpc.rs

1//! Listing of gRPC requests used in DAPI.
2
3use std::time::Duration;
4
5use super::create_channel;
6use super::{CanRetry, TransportClient, TransportError, TransportRequest};
7use super::{CoreGrpcClient, PlatformGrpcClient};
8use crate::connection_pool::{ConnectionPool, PoolPrefix};
9use crate::{request_settings::AppliedRequestSettings, RequestSettings, Uri};
10use dapi_grpc::core::v0::{self as core_proto};
11use dapi_grpc::platform::v0::{self as platform_proto};
12use dapi_grpc::tonic::{IntoRequest, Streaming};
13use futures::{future::BoxFuture, FutureExt, TryFutureExt};
14
15impl TransportClient for PlatformGrpcClient {
16    fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result<Self, TransportError> {
17        Ok(pool
18            .get_or_create(PoolPrefix::Platform, &uri, None, || {
19                match create_channel(uri.clone(), None) {
20                    Ok(channel) => Ok(Self::new(channel).into()),
21                    Err(e) => Err(dapi_grpc::tonic::Status::invalid_argument(format!(
22                        "channel creation failed: {}",
23                        e
24                    ))),
25                }
26            })?
27            .into())
28    }
29
30    fn with_uri_and_settings(
31        uri: Uri,
32        settings: &AppliedRequestSettings,
33        pool: &ConnectionPool,
34    ) -> Result<Self, TransportError> {
35        Ok(pool
36            .get_or_create(
37                PoolPrefix::Platform,
38                &uri,
39                Some(settings),
40                || match create_channel(uri.clone(), Some(settings)) {
41                    Ok(channel) => {
42                        let mut client = Self::new(channel);
43                        if let Some(max_size) = settings.max_decoding_message_size {
44                            client = client.max_decoding_message_size(max_size);
45                        }
46                        Ok(client.into())
47                    }
48                    Err(e) => Err(dapi_grpc::tonic::Status::invalid_argument(format!(
49                        "Channel creation failed: {}",
50                        e
51                    ))),
52                },
53            )?
54            .into())
55    }
56}
57
58impl TransportClient for CoreGrpcClient {
59    fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result<Self, TransportError> {
60        Ok(pool
61            .get_or_create(PoolPrefix::Core, &uri, None, || {
62                match create_channel(uri.clone(), None) {
63                    Ok(channel) => Ok(Self::new(channel).into()),
64                    Err(e) => Err(dapi_grpc::tonic::Status::invalid_argument(format!(
65                        "Channel creation failed: {}",
66                        e
67                    ))),
68                }
69            })?
70            .into())
71    }
72
73    fn with_uri_and_settings(
74        uri: Uri,
75        settings: &AppliedRequestSettings,
76        pool: &ConnectionPool,
77    ) -> Result<Self, TransportError> {
78        Ok(pool
79            .get_or_create(
80                PoolPrefix::Core,
81                &uri,
82                Some(settings),
83                || match create_channel(uri.clone(), Some(settings)) {
84                    Ok(channel) => {
85                        let mut client = Self::new(channel);
86                        if let Some(max_size) = settings.max_decoding_message_size {
87                            client = client.max_decoding_message_size(max_size);
88                        }
89                        Ok(client.into())
90                    }
91                    Err(e) => Err(dapi_grpc::tonic::Status::invalid_argument(format!(
92                        "Channel creation failed: {}",
93                        e
94                    ))),
95                },
96            )?
97            .into())
98    }
99}
100
101impl CanRetry for dapi_grpc::tonic::Status {
102    fn can_retry(&self) -> bool {
103        let code = self.code();
104
105        use dapi_grpc::tonic::Code::*;
106
107        matches!(
108            code,
109            Ok | DataLoss
110                | Cancelled
111                | Unknown
112                | DeadlineExceeded
113                | ResourceExhausted
114                | Aborted
115                | Internal
116                | Unavailable
117        )
118    }
119}
120
121/// Macro to implement the `TransportRequest` trait for a given request type, response type, client type, and settings.
122///
123/// # Parameters
124///
125/// - `$request:ty`: The request type for which the `TransportRequest` trait will be implemented.
126/// - `$response:ty`: The response type returned by the transport request.
127/// - `$client:ty`: The client type used to execute the transport request (eg. generated by `tonic` crate).
128/// - `$settings:expr`: The settings to be used for the transport request; these settings will override client's
129///   default settings, but can still be overridden by arguments to
130///   the [`DapiRequestExecutor::execute`](crate::DapiRequestExecutor::execute) method.
131/// - `$($method:tt)+`: The method of `$client` to be called to execute the request.
132///
133/// # Example
134///
135/// ```compile_fail
136/// impl_transport_request_grpc!(
137///     MyRequestType,
138///     MyResponseType,
139///     MyClientType,
140///     my_settings,
141///     my_method
142/// );
143/// ```
144///
145/// This will generate an implementation of the `TransportRequest` trait for `MyRequestType`
146/// that uses `MyClientType` to execute the `my_method` method, with the specified `my_settings`.
147///
148/// The generated implementation will:
149/// - Define the associated types `Client` and `Response`.
150/// - Set the `SETTINGS_OVERRIDES` constant to the provided settings.
151/// - Implement the `method_name` function to return the name of the method as a string.
152/// - Implement the `execute_transport` function to execute the transport request using the provided client and settings.
153macro_rules! impl_transport_request_grpc {
154    ($request:ty, $response:ty, $client:ty, $settings:expr, $($method:tt)+) => {
155        impl TransportRequest for $request {
156            type Client = $client;
157
158            type Response = $response;
159
160            const SETTINGS_OVERRIDES: RequestSettings = $settings;
161
162            fn method_name(&self) -> &'static str {
163                stringify!($($method)+)
164            }
165
166            fn execute_transport<'c>(
167                self,
168                client: &'c mut Self::Client,
169                settings: &AppliedRequestSettings,
170            ) -> BoxFuture<'c, Result<Self::Response, TransportError>>
171            {
172                let mut grpc_request = self.into_request();
173
174                if !settings.timeout.is_zero() {
175                    grpc_request.set_timeout(settings.timeout);
176                }
177
178                client
179                    .$($method)+(grpc_request)
180                    .map_err(TransportError::Grpc)
181                    .map_ok(|response| response.into_inner())
182                    .boxed()
183            }
184        }
185    };
186}
187
188// Link to each platform gRPC request what client and method to use:
189
190const STREAMING_TIMEOUT: Duration = Duration::from_secs(5 * 60);
191
192impl_transport_request_grpc!(
193    platform_proto::GetIdentityRequest,
194    platform_proto::GetIdentityResponse,
195    PlatformGrpcClient,
196    RequestSettings::default(),
197    get_identity
198);
199
200impl_transport_request_grpc!(
201    platform_proto::GetDocumentsRequest,
202    platform_proto::GetDocumentsResponse,
203    PlatformGrpcClient,
204    RequestSettings::default(),
205    get_documents
206);
207
208impl_transport_request_grpc!(
209    platform_proto::GetDataContractRequest,
210    platform_proto::GetDataContractResponse,
211    PlatformGrpcClient,
212    RequestSettings::default(),
213    get_data_contract
214);
215
216impl_transport_request_grpc!(
217    platform_proto::GetConsensusParamsRequest,
218    platform_proto::GetConsensusParamsResponse,
219    PlatformGrpcClient,
220    RequestSettings::default(),
221    get_consensus_params
222);
223
224impl_transport_request_grpc!(
225    platform_proto::GetDataContractHistoryRequest,
226    platform_proto::GetDataContractHistoryResponse,
227    PlatformGrpcClient,
228    RequestSettings::default(),
229    get_data_contract_history
230);
231
232impl_transport_request_grpc!(
233    platform_proto::GetDocumentHistoryRequest,
234    platform_proto::GetDocumentHistoryResponse,
235    PlatformGrpcClient,
236    RequestSettings::default(),
237    get_document_history
238);
239
240impl_transport_request_grpc!(
241    platform_proto::BroadcastStateTransitionRequest,
242    platform_proto::BroadcastStateTransitionResponse,
243    PlatformGrpcClient,
244    RequestSettings::default(),
245    broadcast_state_transition
246);
247
248impl_transport_request_grpc!(
249    platform_proto::WaitForStateTransitionResultRequest,
250    platform_proto::WaitForStateTransitionResultResponse,
251    PlatformGrpcClient,
252    RequestSettings {
253        timeout: Some(Duration::from_secs(30)),
254        retries: Some(3),
255        ban_failed_address: None,
256        connect_timeout: None,
257        max_decoding_message_size: None,
258    },
259    wait_for_state_transition_result
260);
261
262impl_transport_request_grpc!(
263    platform_proto::GetIdentityByPublicKeyHashRequest,
264    platform_proto::GetIdentityByPublicKeyHashResponse,
265    PlatformGrpcClient,
266    RequestSettings::default(),
267    get_identity_by_public_key_hash
268);
269
270impl_transport_request_grpc!(
271    platform_proto::GetIdentityBalanceRequest,
272    platform_proto::GetIdentityBalanceResponse,
273    PlatformGrpcClient,
274    RequestSettings::default(),
275    get_identity_balance
276);
277
278impl_transport_request_grpc!(
279    platform_proto::GetIdentitiesBalancesRequest,
280    platform_proto::GetIdentitiesBalancesResponse,
281    PlatformGrpcClient,
282    RequestSettings::default(),
283    get_identities_balances
284);
285
286impl_transport_request_grpc!(
287    platform_proto::GetIdentityNonceRequest,
288    platform_proto::GetIdentityNonceResponse,
289    PlatformGrpcClient,
290    RequestSettings::default(),
291    get_identity_nonce
292);
293
294impl_transport_request_grpc!(
295    platform_proto::GetIdentityContractNonceRequest,
296    platform_proto::GetIdentityContractNonceResponse,
297    PlatformGrpcClient,
298    RequestSettings::default(),
299    get_identity_contract_nonce
300);
301
302impl_transport_request_grpc!(
303    platform_proto::GetIdentityBalanceAndRevisionRequest,
304    platform_proto::GetIdentityBalanceAndRevisionResponse,
305    PlatformGrpcClient,
306    RequestSettings::default(),
307    get_identity_balance_and_revision
308);
309
310impl_transport_request_grpc!(
311    platform_proto::GetIdentitiesContractKeysRequest,
312    platform_proto::GetIdentitiesContractKeysResponse,
313    PlatformGrpcClient,
314    RequestSettings::default(),
315    get_identities_contract_keys
316);
317
318impl_transport_request_grpc!(
319    platform_proto::GetIdentityKeysRequest,
320    platform_proto::GetIdentityKeysResponse,
321    PlatformGrpcClient,
322    RequestSettings::default(),
323    get_identity_keys
324);
325
326impl_transport_request_grpc!(
327    platform_proto::GetEpochsInfoRequest,
328    platform_proto::GetEpochsInfoResponse,
329    PlatformGrpcClient,
330    RequestSettings::default(),
331    get_epochs_info
332);
333
334impl_transport_request_grpc!(
335    platform_proto::GetFinalizedEpochInfosRequest,
336    platform_proto::GetFinalizedEpochInfosResponse,
337    PlatformGrpcClient,
338    RequestSettings::default(),
339    get_finalized_epoch_infos
340);
341
342impl_transport_request_grpc!(
343    platform_proto::GetProtocolVersionUpgradeStateRequest,
344    platform_proto::GetProtocolVersionUpgradeStateResponse,
345    PlatformGrpcClient,
346    RequestSettings::default(),
347    get_protocol_version_upgrade_state
348);
349
350impl_transport_request_grpc!(
351    platform_proto::GetProtocolVersionUpgradeVoteStatusRequest,
352    platform_proto::GetProtocolVersionUpgradeVoteStatusResponse,
353    PlatformGrpcClient,
354    RequestSettings::default(),
355    get_protocol_version_upgrade_vote_status
356);
357
358impl_transport_request_grpc!(
359    platform_proto::GetDataContractsRequest,
360    platform_proto::GetDataContractsResponse,
361    PlatformGrpcClient,
362    RequestSettings::default(),
363    get_data_contracts
364);
365
366// rpc getContestedResources(GetContestedResourcesRequest) returns (GetContestedResourcesResponse);
367impl_transport_request_grpc!(
368    platform_proto::GetContestedResourcesRequest,
369    platform_proto::GetContestedResourcesResponse,
370    PlatformGrpcClient,
371    RequestSettings::default(),
372    get_contested_resources
373);
374
375//  rpc getContestedResourceVoteState(GetContestedResourceVoteStateRequest) returns (GetContestedResourceVoteStateResponse);
376impl_transport_request_grpc!(
377    platform_proto::GetContestedResourceVoteStateRequest,
378    platform_proto::GetContestedResourceVoteStateResponse,
379    PlatformGrpcClient,
380    RequestSettings::default(),
381    get_contested_resource_vote_state
382);
383
384// rpc getContestedResourceVotersForIdentity(GetContestedResourceVotersForIdentityRequest) returns (GetContestedResourceVotersForIdentityResponse);
385impl_transport_request_grpc!(
386    platform_proto::GetContestedResourceVotersForIdentityRequest,
387    platform_proto::GetContestedResourceVotersForIdentityResponse,
388    PlatformGrpcClient,
389    RequestSettings::default(),
390    get_contested_resource_voters_for_identity
391);
392// rpc getContestedResourceIdentityVoteStatus(GetContestedResourceIdentityVoteStatusRequest) returns (GetContestedResourceIdentityVoteStatusResponse);
393impl_transport_request_grpc!(
394    platform_proto::GetContestedResourceIdentityVotesRequest,
395    platform_proto::GetContestedResourceIdentityVotesResponse,
396    PlatformGrpcClient,
397    RequestSettings::default(),
398    get_contested_resource_identity_votes
399);
400// rpc GetVotePollsByEndDateRequest(GetVotePollsByEndDateRequest) returns (GetVotePollsByEndDateResponse);
401impl_transport_request_grpc!(
402    platform_proto::GetVotePollsByEndDateRequest,
403    platform_proto::GetVotePollsByEndDateResponse,
404    PlatformGrpcClient,
405    RequestSettings::default(),
406    get_vote_polls_by_end_date
407);
408
409// rpc GetEvonodesProposedEpochBlocksByIdsRequest(GetEvonodesProposedEpochBlocksByIdsRequest) returns (GetEvonodesProposedEpochBlocksResponse);
410impl_transport_request_grpc!(
411    platform_proto::GetEvonodesProposedEpochBlocksByIdsRequest,
412    platform_proto::GetEvonodesProposedEpochBlocksResponse,
413    PlatformGrpcClient,
414    RequestSettings::default(),
415    get_evonodes_proposed_epoch_blocks_by_ids
416);
417
418// rpc GetEvonodesProposedEpochBlocksByRangeRequest(GetEvonodesProposedEpochBlocksByRangeRequest) returns (GetEvonodesProposedEpochBlocksResponse);
419impl_transport_request_grpc!(
420    platform_proto::GetEvonodesProposedEpochBlocksByRangeRequest,
421    platform_proto::GetEvonodesProposedEpochBlocksResponse,
422    PlatformGrpcClient,
423    RequestSettings::default(),
424    get_evonodes_proposed_epoch_blocks_by_range
425);
426
427// rpc getPrefundedSpecializedBalance(GetPrefundedSpecializedBalanceRequest) returns (GetPrefundedSpecializedBalanceResponse);
428impl_transport_request_grpc!(
429    platform_proto::GetPrefundedSpecializedBalanceRequest,
430    platform_proto::GetPrefundedSpecializedBalanceResponse,
431    PlatformGrpcClient,
432    RequestSettings::default(),
433    get_prefunded_specialized_balance
434);
435
436// rpc getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse);
437impl_transport_request_grpc!(
438    platform_proto::GetPathElementsRequest,
439    platform_proto::GetPathElementsResponse,
440    PlatformGrpcClient,
441    RequestSettings::default(),
442    get_path_elements
443);
444
445// rpc getTotalCreditsInPlatform(GetTotalCreditsInPlatformRequest) returns (GetTotalCreditsInPlatformResponse);
446impl_transport_request_grpc!(
447    platform_proto::GetTotalCreditsInPlatformRequest,
448    platform_proto::GetTotalCreditsInPlatformResponse,
449    PlatformGrpcClient,
450    RequestSettings::default(),
451    get_total_credits_in_platform
452);
453
454// rpc getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse);
455impl_transport_request_grpc!(
456    platform_proto::GetCurrentQuorumsInfoRequest,
457    platform_proto::GetCurrentQuorumsInfoResponse,
458    PlatformGrpcClient,
459    RequestSettings::default(),
460    get_current_quorums_info
461);
462
463// rpc getShieldedEncryptedNotes(GetShieldedEncryptedNotesRequest) returns (GetShieldedEncryptedNotesResponse);
464impl_transport_request_grpc!(
465    platform_proto::GetShieldedEncryptedNotesRequest,
466    platform_proto::GetShieldedEncryptedNotesResponse,
467    PlatformGrpcClient,
468    RequestSettings::default(),
469    get_shielded_encrypted_notes
470);
471
472// rpc getShieldedAnchors(GetShieldedAnchorsRequest) returns (GetShieldedAnchorsResponse);
473impl_transport_request_grpc!(
474    platform_proto::GetShieldedAnchorsRequest,
475    platform_proto::GetShieldedAnchorsResponse,
476    PlatformGrpcClient,
477    RequestSettings::default(),
478    get_shielded_anchors
479);
480
481// rpc getMostRecentShieldedAnchor(GetMostRecentShieldedAnchorRequest) returns (GetMostRecentShieldedAnchorResponse);
482impl_transport_request_grpc!(
483    platform_proto::GetMostRecentShieldedAnchorRequest,
484    platform_proto::GetMostRecentShieldedAnchorResponse,
485    PlatformGrpcClient,
486    RequestSettings::default(),
487    get_most_recent_shielded_anchor
488);
489
490// rpc getShieldedPoolState(GetShieldedPoolStateRequest) returns (GetShieldedPoolStateResponse);
491impl_transport_request_grpc!(
492    platform_proto::GetShieldedPoolStateRequest,
493    platform_proto::GetShieldedPoolStateResponse,
494    PlatformGrpcClient,
495    RequestSettings::default(),
496    get_shielded_pool_state
497);
498
499// rpc getShieldedNotesCount(GetShieldedNotesCountRequest) returns (GetShieldedNotesCountResponse);
500impl_transport_request_grpc!(
501    platform_proto::GetShieldedNotesCountRequest,
502    platform_proto::GetShieldedNotesCountResponse,
503    PlatformGrpcClient,
504    RequestSettings::default(),
505    get_shielded_notes_count
506);
507
508// rpc getShieldedNullifiers(GetShieldedNullifiersRequest) returns (GetShieldedNullifiersResponse);
509impl_transport_request_grpc!(
510    platform_proto::GetShieldedNullifiersRequest,
511    platform_proto::GetShieldedNullifiersResponse,
512    PlatformGrpcClient,
513    RequestSettings::default(),
514    get_shielded_nullifiers
515);
516
517// rpc getRecentNullifierChanges(GetRecentNullifierChangesRequest) returns (GetRecentNullifierChangesResponse);
518impl_transport_request_grpc!(
519    platform_proto::GetRecentNullifierChangesRequest,
520    platform_proto::GetRecentNullifierChangesResponse,
521    PlatformGrpcClient,
522    RequestSettings::default(),
523    get_recent_nullifier_changes
524);
525
526// rpc getRecentCompactedNullifierChanges(GetRecentCompactedNullifierChangesRequest) returns (GetRecentCompactedNullifierChangesResponse);
527impl_transport_request_grpc!(
528    platform_proto::GetRecentCompactedNullifierChangesRequest,
529    platform_proto::GetRecentCompactedNullifierChangesResponse,
530    PlatformGrpcClient,
531    RequestSettings {
532        max_decoding_message_size: Some(16 * 1024 * 1024),
533        ..RequestSettings::default()
534    },
535    get_recent_compacted_nullifier_changes
536);
537
538// rpc getNullifiersTrunkState(GetNullifiersTrunkStateRequest) returns (GetNullifiersTrunkStateResponse);
539impl_transport_request_grpc!(
540    platform_proto::GetNullifiersTrunkStateRequest,
541    platform_proto::GetNullifiersTrunkStateResponse,
542    PlatformGrpcClient,
543    RequestSettings::default(),
544    get_nullifiers_trunk_state
545);
546
547// rpc getNullifiersBranchState(GetNullifiersBranchStateRequest) returns (GetNullifiersBranchStateResponse);
548impl_transport_request_grpc!(
549    platform_proto::GetNullifiersBranchStateRequest,
550    platform_proto::GetNullifiersBranchStateResponse,
551    PlatformGrpcClient,
552    RequestSettings::default(),
553    get_nullifiers_branch_state
554);
555
556// Link to each core gRPC request what client and method to use:
557
558impl_transport_request_grpc!(
559    core_proto::GetTransactionRequest,
560    core_proto::GetTransactionResponse,
561    CoreGrpcClient,
562    RequestSettings::default(),
563    get_transaction
564);
565
566impl_transport_request_grpc!(
567    core_proto::GetBlockchainStatusRequest,
568    core_proto::GetBlockchainStatusResponse,
569    CoreGrpcClient,
570    RequestSettings::default(),
571    get_blockchain_status
572);
573
574impl_transport_request_grpc!(
575    core_proto::BroadcastTransactionRequest,
576    core_proto::BroadcastTransactionResponse,
577    CoreGrpcClient,
578    RequestSettings::default(),
579    broadcast_transaction
580);
581
582impl_transport_request_grpc!(
583    core_proto::TransactionsWithProofsRequest,
584    Streaming<core_proto::TransactionsWithProofsResponse>,
585    CoreGrpcClient,
586    RequestSettings {
587        timeout: Some(STREAMING_TIMEOUT),
588        ban_failed_address: None,
589        connect_timeout: None,
590        retries: None,
591        max_decoding_message_size: None,
592    },
593    subscribe_to_transactions_with_proofs
594);
595
596impl_transport_request_grpc!(
597    core_proto::MasternodeListRequest,
598    Streaming<core_proto::MasternodeListResponse>,
599    CoreGrpcClient,
600    RequestSettings {
601        timeout: Some(STREAMING_TIMEOUT),
602        ..RequestSettings::default()
603    },
604    subscribe_to_masternode_list
605);
606
607// rpc getStatus(GetStatusRequest) returns (GetStatusResponse);
608impl_transport_request_grpc!(
609    platform_proto::GetStatusRequest,
610    platform_proto::GetStatusResponse,
611    PlatformGrpcClient,
612    RequestSettings::default(),
613    get_status
614);
615
616//   rpc getIdentityByNonUniquePublicKeyHash(GetIdentityByNonUniquePublicKeyHashRequest) returns (GetIdentityByNonUniquePublicKeyHashResponse);
617impl_transport_request_grpc!(
618    platform_proto::GetIdentityByNonUniquePublicKeyHashRequest,
619    platform_proto::GetIdentityByNonUniquePublicKeyHashResponse,
620    PlatformGrpcClient,
621    RequestSettings::default(),
622    get_identity_by_non_unique_public_key_hash
623);
624
625// rpc getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse);
626impl_transport_request_grpc!(
627    platform_proto::GetIdentityTokenBalancesRequest,
628    platform_proto::GetIdentityTokenBalancesResponse,
629    PlatformGrpcClient,
630    RequestSettings::default(),
631    get_identity_token_balances
632);
633
634// rpc getIdentitiesTokenBalances(GetIdentitiesTokenBalancesRequest) returns (GetIdentitiesTokenBalancesResponse);
635impl_transport_request_grpc!(
636    platform_proto::GetIdentitiesTokenBalancesRequest,
637    platform_proto::GetIdentitiesTokenBalancesResponse,
638    PlatformGrpcClient,
639    RequestSettings::default(),
640    get_identities_token_balances
641);
642
643// rpc getIdentityTokenInfos(GetIdentityTokenInfosRequest) returns (GetIdentityTokenInfosResponse);
644impl_transport_request_grpc!(
645    platform_proto::GetIdentityTokenInfosRequest,
646    platform_proto::GetIdentityTokenInfosResponse,
647    PlatformGrpcClient,
648    RequestSettings::default(),
649    get_identity_token_infos
650);
651
652// rpc getIdentitiesTokenInfos(GetIdentitiesTokenInfosRequest) returns (GetIdentitiesTokenInfosResponse);
653impl_transport_request_grpc!(
654    platform_proto::GetIdentitiesTokenInfosRequest,
655    platform_proto::GetIdentitiesTokenInfosResponse,
656    PlatformGrpcClient,
657    RequestSettings::default(),
658    get_identities_token_infos
659);
660
661// rpc getTokenStatuses(GetTokenStatusesRequest) returns (GetTokenStatusesResponse);
662impl_transport_request_grpc!(
663    platform_proto::GetTokenStatusesRequest,
664    platform_proto::GetTokenStatusesResponse,
665    PlatformGrpcClient,
666    RequestSettings::default(),
667    get_token_statuses
668);
669
670// rpc getTokenPreProgrammedDistributions(GetTokenPreProgrammedDistributionsRequest) returns (GetTokenPreProgrammedDistributionsResponse);
671impl_transport_request_grpc!(
672    platform_proto::GetTokenPreProgrammedDistributionsRequest,
673    platform_proto::GetTokenPreProgrammedDistributionsResponse,
674    PlatformGrpcClient,
675    RequestSettings::default(),
676    get_token_pre_programmed_distributions
677);
678
679// rpc getTokenTotalSupply(GetTokenTotalSupplyRequest) returns (GetTokenTotalSupplyResponse);
680impl_transport_request_grpc!(
681    platform_proto::GetTokenTotalSupplyRequest,
682    platform_proto::GetTokenTotalSupplyResponse,
683    PlatformGrpcClient,
684    RequestSettings::default(),
685    get_token_total_supply
686);
687
688// rpc getGroupInfo(GetGroupInfoRequest) returns (GetGroupInfoResponse);
689impl_transport_request_grpc!(
690    platform_proto::GetGroupInfoRequest,
691    platform_proto::GetGroupInfoResponse,
692    PlatformGrpcClient,
693    RequestSettings::default(),
694    get_group_info
695);
696
697// rpc getGroupInfos(GetGroupInfosRequest) returns (GetGroupInfosResponse);
698impl_transport_request_grpc!(
699    platform_proto::GetGroupInfosRequest,
700    platform_proto::GetGroupInfosResponse,
701    PlatformGrpcClient,
702    RequestSettings::default(),
703    get_group_infos
704);
705
706// rpc getGroupActions(GetGroupActionsRequest) returns (GetGroupActionsResponse);
707impl_transport_request_grpc!(
708    platform_proto::GetGroupActionsRequest,
709    platform_proto::GetGroupActionsResponse,
710    PlatformGrpcClient,
711    RequestSettings::default(),
712    get_group_actions
713);
714
715// rpc getGroupActionSigners(GetGroupActionSignersRequest) returns (GetGroupActionSignersResponse);
716impl_transport_request_grpc!(
717    platform_proto::GetGroupActionSignersRequest,
718    platform_proto::GetGroupActionSignersResponse,
719    PlatformGrpcClient,
720    RequestSettings::default(),
721    get_group_action_signers
722);
723
724// rpc getTokenDirectPurchasePrices(GetTokenDirectPurchasePricesRequest) returns (GetTokenDirectPurchasePricesResponse);
725impl_transport_request_grpc!(
726    platform_proto::GetTokenDirectPurchasePricesRequest,
727    platform_proto::GetTokenDirectPurchasePricesResponse,
728    PlatformGrpcClient,
729    RequestSettings::default(),
730    get_token_direct_purchase_prices
731);
732
733// rpc getTokenContractInfo(GetTokenContractInfoRequest) returns (GetTokenContractInfoResponse);
734impl_transport_request_grpc!(
735    platform_proto::GetTokenContractInfoRequest,
736    platform_proto::GetTokenContractInfoResponse,
737    PlatformGrpcClient,
738    RequestSettings::default(),
739    get_token_contract_info
740);
741
742// rpc getTokenPerpetualDistributionLastClaimRequest(GetTokenPerpetualDistributionLastClaimRequest) returns (GetTokenPerpetualDistributionLastClaimResponse);
743impl_transport_request_grpc!(
744    platform_proto::GetTokenPerpetualDistributionLastClaimRequest,
745    platform_proto::GetTokenPerpetualDistributionLastClaimResponse,
746    PlatformGrpcClient,
747    RequestSettings::default(),
748    get_token_perpetual_distribution_last_claim
749);
750
751// rpc getAddressInfo(GetAddressInfoRequest) returns (GetAddressInfoResponse);
752impl_transport_request_grpc!(
753    platform_proto::GetAddressInfoRequest,
754    platform_proto::GetAddressInfoResponse,
755    PlatformGrpcClient,
756    RequestSettings::default(),
757    get_address_info
758);
759
760// rpc getAddressesInfos(GetAddressesInfosRequest) returns (GetAddressesInfosResponse);
761impl_transport_request_grpc!(
762    platform_proto::GetAddressesInfosRequest,
763    platform_proto::GetAddressesInfosResponse,
764    PlatformGrpcClient,
765    RequestSettings::default(),
766    get_addresses_infos
767);
768
769// rpc getAddressesTrunkState(GetAddressesTrunkStateRequest) returns (GetAddressesTrunkStateResponse);
770impl_transport_request_grpc!(
771    platform_proto::GetAddressesTrunkStateRequest,
772    platform_proto::GetAddressesTrunkStateResponse,
773    PlatformGrpcClient,
774    RequestSettings::default(),
775    get_addresses_trunk_state
776);
777
778// rpc getAddressesBranchState(GetAddressesBranchStateRequest) returns (GetAddressesBranchStateResponse);
779impl_transport_request_grpc!(
780    platform_proto::GetAddressesBranchStateRequest,
781    platform_proto::GetAddressesBranchStateResponse,
782    PlatformGrpcClient,
783    RequestSettings::default(),
784    get_addresses_branch_state
785);
786
787// rpc getRecentAddressBalanceChanges(GetRecentAddressBalanceChangesRequest) returns (GetRecentAddressBalanceChangesResponse);
788impl_transport_request_grpc!(
789    platform_proto::GetRecentAddressBalanceChangesRequest,
790    platform_proto::GetRecentAddressBalanceChangesResponse,
791    PlatformGrpcClient,
792    RequestSettings::default(),
793    get_recent_address_balance_changes
794);
795
796// rpc getRecentCompactedAddressBalanceChanges(GetRecentCompactedAddressBalanceChangesRequest) returns (GetRecentCompactedAddressBalanceChangesResponse);
797impl_transport_request_grpc!(
798    platform_proto::GetRecentCompactedAddressBalanceChangesRequest,
799    platform_proto::GetRecentCompactedAddressBalanceChangesResponse,
800    PlatformGrpcClient,
801    RequestSettings {
802        // GetRecentCompactedAddressBalanceChangesResponse can have 100 values * 2048 addresses * ~44  bytes each = ~9MB
803        // We set it to 16MB to be safe
804        max_decoding_message_size: Some(16 * 1024 * 1024),
805        ..RequestSettings::default()
806    },
807    get_recent_compacted_address_balance_changes
808);