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::BroadcastStateTransitionRequest,
234    platform_proto::BroadcastStateTransitionResponse,
235    PlatformGrpcClient,
236    RequestSettings::default(),
237    broadcast_state_transition
238);
239
240impl_transport_request_grpc!(
241    platform_proto::WaitForStateTransitionResultRequest,
242    platform_proto::WaitForStateTransitionResultResponse,
243    PlatformGrpcClient,
244    RequestSettings {
245        timeout: Some(Duration::from_secs(30)),
246        retries: Some(3),
247        ban_failed_address: None,
248        connect_timeout: None,
249        max_decoding_message_size: None,
250    },
251    wait_for_state_transition_result
252);
253
254impl_transport_request_grpc!(
255    platform_proto::GetIdentityByPublicKeyHashRequest,
256    platform_proto::GetIdentityByPublicKeyHashResponse,
257    PlatformGrpcClient,
258    RequestSettings::default(),
259    get_identity_by_public_key_hash
260);
261
262impl_transport_request_grpc!(
263    platform_proto::GetIdentityBalanceRequest,
264    platform_proto::GetIdentityBalanceResponse,
265    PlatformGrpcClient,
266    RequestSettings::default(),
267    get_identity_balance
268);
269
270impl_transport_request_grpc!(
271    platform_proto::GetIdentitiesBalancesRequest,
272    platform_proto::GetIdentitiesBalancesResponse,
273    PlatformGrpcClient,
274    RequestSettings::default(),
275    get_identities_balances
276);
277
278impl_transport_request_grpc!(
279    platform_proto::GetIdentityNonceRequest,
280    platform_proto::GetIdentityNonceResponse,
281    PlatformGrpcClient,
282    RequestSettings::default(),
283    get_identity_nonce
284);
285
286impl_transport_request_grpc!(
287    platform_proto::GetIdentityContractNonceRequest,
288    platform_proto::GetIdentityContractNonceResponse,
289    PlatformGrpcClient,
290    RequestSettings::default(),
291    get_identity_contract_nonce
292);
293
294impl_transport_request_grpc!(
295    platform_proto::GetIdentityBalanceAndRevisionRequest,
296    platform_proto::GetIdentityBalanceAndRevisionResponse,
297    PlatformGrpcClient,
298    RequestSettings::default(),
299    get_identity_balance_and_revision
300);
301
302impl_transport_request_grpc!(
303    platform_proto::GetIdentitiesContractKeysRequest,
304    platform_proto::GetIdentitiesContractKeysResponse,
305    PlatformGrpcClient,
306    RequestSettings::default(),
307    get_identities_contract_keys
308);
309
310impl_transport_request_grpc!(
311    platform_proto::GetIdentityKeysRequest,
312    platform_proto::GetIdentityKeysResponse,
313    PlatformGrpcClient,
314    RequestSettings::default(),
315    get_identity_keys
316);
317
318impl_transport_request_grpc!(
319    platform_proto::GetEpochsInfoRequest,
320    platform_proto::GetEpochsInfoResponse,
321    PlatformGrpcClient,
322    RequestSettings::default(),
323    get_epochs_info
324);
325
326impl_transport_request_grpc!(
327    platform_proto::GetFinalizedEpochInfosRequest,
328    platform_proto::GetFinalizedEpochInfosResponse,
329    PlatformGrpcClient,
330    RequestSettings::default(),
331    get_finalized_epoch_infos
332);
333
334impl_transport_request_grpc!(
335    platform_proto::GetProtocolVersionUpgradeStateRequest,
336    platform_proto::GetProtocolVersionUpgradeStateResponse,
337    PlatformGrpcClient,
338    RequestSettings::default(),
339    get_protocol_version_upgrade_state
340);
341
342impl_transport_request_grpc!(
343    platform_proto::GetProtocolVersionUpgradeVoteStatusRequest,
344    platform_proto::GetProtocolVersionUpgradeVoteStatusResponse,
345    PlatformGrpcClient,
346    RequestSettings::default(),
347    get_protocol_version_upgrade_vote_status
348);
349
350impl_transport_request_grpc!(
351    platform_proto::GetDataContractsRequest,
352    platform_proto::GetDataContractsResponse,
353    PlatformGrpcClient,
354    RequestSettings::default(),
355    get_data_contracts
356);
357
358// rpc getContestedResources(GetContestedResourcesRequest) returns (GetContestedResourcesResponse);
359impl_transport_request_grpc!(
360    platform_proto::GetContestedResourcesRequest,
361    platform_proto::GetContestedResourcesResponse,
362    PlatformGrpcClient,
363    RequestSettings::default(),
364    get_contested_resources
365);
366
367//  rpc getContestedResourceVoteState(GetContestedResourceVoteStateRequest) returns (GetContestedResourceVoteStateResponse);
368impl_transport_request_grpc!(
369    platform_proto::GetContestedResourceVoteStateRequest,
370    platform_proto::GetContestedResourceVoteStateResponse,
371    PlatformGrpcClient,
372    RequestSettings::default(),
373    get_contested_resource_vote_state
374);
375
376// rpc getContestedResourceVotersForIdentity(GetContestedResourceVotersForIdentityRequest) returns (GetContestedResourceVotersForIdentityResponse);
377impl_transport_request_grpc!(
378    platform_proto::GetContestedResourceVotersForIdentityRequest,
379    platform_proto::GetContestedResourceVotersForIdentityResponse,
380    PlatformGrpcClient,
381    RequestSettings::default(),
382    get_contested_resource_voters_for_identity
383);
384// rpc getContestedResourceIdentityVoteStatus(GetContestedResourceIdentityVoteStatusRequest) returns (GetContestedResourceIdentityVoteStatusResponse);
385impl_transport_request_grpc!(
386    platform_proto::GetContestedResourceIdentityVotesRequest,
387    platform_proto::GetContestedResourceIdentityVotesResponse,
388    PlatformGrpcClient,
389    RequestSettings::default(),
390    get_contested_resource_identity_votes
391);
392// rpc GetVotePollsByEndDateRequest(GetVotePollsByEndDateRequest) returns (GetVotePollsByEndDateResponse);
393impl_transport_request_grpc!(
394    platform_proto::GetVotePollsByEndDateRequest,
395    platform_proto::GetVotePollsByEndDateResponse,
396    PlatformGrpcClient,
397    RequestSettings::default(),
398    get_vote_polls_by_end_date
399);
400
401// rpc GetEvonodesProposedEpochBlocksByIdsRequest(GetEvonodesProposedEpochBlocksByIdsRequest) returns (GetEvonodesProposedEpochBlocksResponse);
402impl_transport_request_grpc!(
403    platform_proto::GetEvonodesProposedEpochBlocksByIdsRequest,
404    platform_proto::GetEvonodesProposedEpochBlocksResponse,
405    PlatformGrpcClient,
406    RequestSettings::default(),
407    get_evonodes_proposed_epoch_blocks_by_ids
408);
409
410// rpc GetEvonodesProposedEpochBlocksByRangeRequest(GetEvonodesProposedEpochBlocksByRangeRequest) returns (GetEvonodesProposedEpochBlocksResponse);
411impl_transport_request_grpc!(
412    platform_proto::GetEvonodesProposedEpochBlocksByRangeRequest,
413    platform_proto::GetEvonodesProposedEpochBlocksResponse,
414    PlatformGrpcClient,
415    RequestSettings::default(),
416    get_evonodes_proposed_epoch_blocks_by_range
417);
418
419// rpc getPrefundedSpecializedBalance(GetPrefundedSpecializedBalanceRequest) returns (GetPrefundedSpecializedBalanceResponse);
420impl_transport_request_grpc!(
421    platform_proto::GetPrefundedSpecializedBalanceRequest,
422    platform_proto::GetPrefundedSpecializedBalanceResponse,
423    PlatformGrpcClient,
424    RequestSettings::default(),
425    get_prefunded_specialized_balance
426);
427
428// rpc getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse);
429impl_transport_request_grpc!(
430    platform_proto::GetPathElementsRequest,
431    platform_proto::GetPathElementsResponse,
432    PlatformGrpcClient,
433    RequestSettings::default(),
434    get_path_elements
435);
436
437// rpc getTotalCreditsInPlatform(GetTotalCreditsInPlatformRequest) returns (GetTotalCreditsInPlatformResponse);
438impl_transport_request_grpc!(
439    platform_proto::GetTotalCreditsInPlatformRequest,
440    platform_proto::GetTotalCreditsInPlatformResponse,
441    PlatformGrpcClient,
442    RequestSettings::default(),
443    get_total_credits_in_platform
444);
445
446// rpc getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse);
447impl_transport_request_grpc!(
448    platform_proto::GetCurrentQuorumsInfoRequest,
449    platform_proto::GetCurrentQuorumsInfoResponse,
450    PlatformGrpcClient,
451    RequestSettings::default(),
452    get_current_quorums_info
453);
454
455// rpc getShieldedEncryptedNotes(GetShieldedEncryptedNotesRequest) returns (GetShieldedEncryptedNotesResponse);
456impl_transport_request_grpc!(
457    platform_proto::GetShieldedEncryptedNotesRequest,
458    platform_proto::GetShieldedEncryptedNotesResponse,
459    PlatformGrpcClient,
460    RequestSettings::default(),
461    get_shielded_encrypted_notes
462);
463
464// rpc getShieldedAnchors(GetShieldedAnchorsRequest) returns (GetShieldedAnchorsResponse);
465impl_transport_request_grpc!(
466    platform_proto::GetShieldedAnchorsRequest,
467    platform_proto::GetShieldedAnchorsResponse,
468    PlatformGrpcClient,
469    RequestSettings::default(),
470    get_shielded_anchors
471);
472
473// rpc getMostRecentShieldedAnchor(GetMostRecentShieldedAnchorRequest) returns (GetMostRecentShieldedAnchorResponse);
474impl_transport_request_grpc!(
475    platform_proto::GetMostRecentShieldedAnchorRequest,
476    platform_proto::GetMostRecentShieldedAnchorResponse,
477    PlatformGrpcClient,
478    RequestSettings::default(),
479    get_most_recent_shielded_anchor
480);
481
482// rpc getShieldedPoolState(GetShieldedPoolStateRequest) returns (GetShieldedPoolStateResponse);
483impl_transport_request_grpc!(
484    platform_proto::GetShieldedPoolStateRequest,
485    platform_proto::GetShieldedPoolStateResponse,
486    PlatformGrpcClient,
487    RequestSettings::default(),
488    get_shielded_pool_state
489);
490
491// rpc getShieldedNullifiers(GetShieldedNullifiersRequest) returns (GetShieldedNullifiersResponse);
492impl_transport_request_grpc!(
493    platform_proto::GetShieldedNullifiersRequest,
494    platform_proto::GetShieldedNullifiersResponse,
495    PlatformGrpcClient,
496    RequestSettings::default(),
497    get_shielded_nullifiers
498);
499
500// rpc getRecentNullifierChanges(GetRecentNullifierChangesRequest) returns (GetRecentNullifierChangesResponse);
501impl_transport_request_grpc!(
502    platform_proto::GetRecentNullifierChangesRequest,
503    platform_proto::GetRecentNullifierChangesResponse,
504    PlatformGrpcClient,
505    RequestSettings::default(),
506    get_recent_nullifier_changes
507);
508
509// rpc getRecentCompactedNullifierChanges(GetRecentCompactedNullifierChangesRequest) returns (GetRecentCompactedNullifierChangesResponse);
510impl_transport_request_grpc!(
511    platform_proto::GetRecentCompactedNullifierChangesRequest,
512    platform_proto::GetRecentCompactedNullifierChangesResponse,
513    PlatformGrpcClient,
514    RequestSettings {
515        max_decoding_message_size: Some(16 * 1024 * 1024),
516        ..RequestSettings::default()
517    },
518    get_recent_compacted_nullifier_changes
519);
520
521// rpc getNullifiersTrunkState(GetNullifiersTrunkStateRequest) returns (GetNullifiersTrunkStateResponse);
522impl_transport_request_grpc!(
523    platform_proto::GetNullifiersTrunkStateRequest,
524    platform_proto::GetNullifiersTrunkStateResponse,
525    PlatformGrpcClient,
526    RequestSettings::default(),
527    get_nullifiers_trunk_state
528);
529
530// rpc getNullifiersBranchState(GetNullifiersBranchStateRequest) returns (GetNullifiersBranchStateResponse);
531impl_transport_request_grpc!(
532    platform_proto::GetNullifiersBranchStateRequest,
533    platform_proto::GetNullifiersBranchStateResponse,
534    PlatformGrpcClient,
535    RequestSettings::default(),
536    get_nullifiers_branch_state
537);
538
539// Link to each core gRPC request what client and method to use:
540
541impl_transport_request_grpc!(
542    core_proto::GetTransactionRequest,
543    core_proto::GetTransactionResponse,
544    CoreGrpcClient,
545    RequestSettings::default(),
546    get_transaction
547);
548
549impl_transport_request_grpc!(
550    core_proto::GetBlockchainStatusRequest,
551    core_proto::GetBlockchainStatusResponse,
552    CoreGrpcClient,
553    RequestSettings::default(),
554    get_blockchain_status
555);
556
557impl_transport_request_grpc!(
558    core_proto::BroadcastTransactionRequest,
559    core_proto::BroadcastTransactionResponse,
560    CoreGrpcClient,
561    RequestSettings::default(),
562    broadcast_transaction
563);
564
565impl_transport_request_grpc!(
566    core_proto::TransactionsWithProofsRequest,
567    Streaming<core_proto::TransactionsWithProofsResponse>,
568    CoreGrpcClient,
569    RequestSettings {
570        timeout: Some(STREAMING_TIMEOUT),
571        ban_failed_address: None,
572        connect_timeout: None,
573        retries: None,
574        max_decoding_message_size: None,
575    },
576    subscribe_to_transactions_with_proofs
577);
578
579impl_transport_request_grpc!(
580    core_proto::MasternodeListRequest,
581    Streaming<core_proto::MasternodeListResponse>,
582    CoreGrpcClient,
583    RequestSettings {
584        timeout: Some(STREAMING_TIMEOUT),
585        ..RequestSettings::default()
586    },
587    subscribe_to_masternode_list
588);
589
590// rpc getStatus(GetStatusRequest) returns (GetStatusResponse);
591impl_transport_request_grpc!(
592    platform_proto::GetStatusRequest,
593    platform_proto::GetStatusResponse,
594    PlatformGrpcClient,
595    RequestSettings::default(),
596    get_status
597);
598
599//   rpc getIdentityByNonUniquePublicKeyHash(GetIdentityByNonUniquePublicKeyHashRequest) returns (GetIdentityByNonUniquePublicKeyHashResponse);
600impl_transport_request_grpc!(
601    platform_proto::GetIdentityByNonUniquePublicKeyHashRequest,
602    platform_proto::GetIdentityByNonUniquePublicKeyHashResponse,
603    PlatformGrpcClient,
604    RequestSettings::default(),
605    get_identity_by_non_unique_public_key_hash
606);
607
608// rpc getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse);
609impl_transport_request_grpc!(
610    platform_proto::GetIdentityTokenBalancesRequest,
611    platform_proto::GetIdentityTokenBalancesResponse,
612    PlatformGrpcClient,
613    RequestSettings::default(),
614    get_identity_token_balances
615);
616
617// rpc getIdentitiesTokenBalances(GetIdentitiesTokenBalancesRequest) returns (GetIdentitiesTokenBalancesResponse);
618impl_transport_request_grpc!(
619    platform_proto::GetIdentitiesTokenBalancesRequest,
620    platform_proto::GetIdentitiesTokenBalancesResponse,
621    PlatformGrpcClient,
622    RequestSettings::default(),
623    get_identities_token_balances
624);
625
626// rpc getIdentityTokenInfos(GetIdentityTokenInfosRequest) returns (GetIdentityTokenInfosResponse);
627impl_transport_request_grpc!(
628    platform_proto::GetIdentityTokenInfosRequest,
629    platform_proto::GetIdentityTokenInfosResponse,
630    PlatformGrpcClient,
631    RequestSettings::default(),
632    get_identity_token_infos
633);
634
635// rpc getIdentitiesTokenInfos(GetIdentitiesTokenInfosRequest) returns (GetIdentitiesTokenInfosResponse);
636impl_transport_request_grpc!(
637    platform_proto::GetIdentitiesTokenInfosRequest,
638    platform_proto::GetIdentitiesTokenInfosResponse,
639    PlatformGrpcClient,
640    RequestSettings::default(),
641    get_identities_token_infos
642);
643
644// rpc getTokenStatuses(GetTokenStatusesRequest) returns (GetTokenStatusesResponse);
645impl_transport_request_grpc!(
646    platform_proto::GetTokenStatusesRequest,
647    platform_proto::GetTokenStatusesResponse,
648    PlatformGrpcClient,
649    RequestSettings::default(),
650    get_token_statuses
651);
652
653// rpc getTokenPreProgrammedDistributions(GetTokenPreProgrammedDistributionsRequest) returns (GetTokenPreProgrammedDistributionsResponse);
654impl_transport_request_grpc!(
655    platform_proto::GetTokenPreProgrammedDistributionsRequest,
656    platform_proto::GetTokenPreProgrammedDistributionsResponse,
657    PlatformGrpcClient,
658    RequestSettings::default(),
659    get_token_pre_programmed_distributions
660);
661
662// rpc getTokenTotalSupply(GetTokenTotalSupplyRequest) returns (GetTokenTotalSupplyResponse);
663impl_transport_request_grpc!(
664    platform_proto::GetTokenTotalSupplyRequest,
665    platform_proto::GetTokenTotalSupplyResponse,
666    PlatformGrpcClient,
667    RequestSettings::default(),
668    get_token_total_supply
669);
670
671// rpc getGroupInfo(GetGroupInfoRequest) returns (GetGroupInfoResponse);
672impl_transport_request_grpc!(
673    platform_proto::GetGroupInfoRequest,
674    platform_proto::GetGroupInfoResponse,
675    PlatformGrpcClient,
676    RequestSettings::default(),
677    get_group_info
678);
679
680// rpc getGroupInfos(GetGroupInfosRequest) returns (GetGroupInfosResponse);
681impl_transport_request_grpc!(
682    platform_proto::GetGroupInfosRequest,
683    platform_proto::GetGroupInfosResponse,
684    PlatformGrpcClient,
685    RequestSettings::default(),
686    get_group_infos
687);
688
689// rpc getGroupActions(GetGroupActionsRequest) returns (GetGroupActionsResponse);
690impl_transport_request_grpc!(
691    platform_proto::GetGroupActionsRequest,
692    platform_proto::GetGroupActionsResponse,
693    PlatformGrpcClient,
694    RequestSettings::default(),
695    get_group_actions
696);
697
698// rpc getGroupActionSigners(GetGroupActionSignersRequest) returns (GetGroupActionSignersResponse);
699impl_transport_request_grpc!(
700    platform_proto::GetGroupActionSignersRequest,
701    platform_proto::GetGroupActionSignersResponse,
702    PlatformGrpcClient,
703    RequestSettings::default(),
704    get_group_action_signers
705);
706
707// rpc getTokenDirectPurchasePrices(GetTokenDirectPurchasePricesRequest) returns (GetTokenDirectPurchasePricesResponse);
708impl_transport_request_grpc!(
709    platform_proto::GetTokenDirectPurchasePricesRequest,
710    platform_proto::GetTokenDirectPurchasePricesResponse,
711    PlatformGrpcClient,
712    RequestSettings::default(),
713    get_token_direct_purchase_prices
714);
715
716// rpc getTokenContractInfo(GetTokenContractInfoRequest) returns (GetTokenContractInfoResponse);
717impl_transport_request_grpc!(
718    platform_proto::GetTokenContractInfoRequest,
719    platform_proto::GetTokenContractInfoResponse,
720    PlatformGrpcClient,
721    RequestSettings::default(),
722    get_token_contract_info
723);
724
725// rpc getTokenPerpetualDistributionLastClaimRequest(GetTokenPerpetualDistributionLastClaimRequest) returns (GetTokenPerpetualDistributionLastClaimResponse);
726impl_transport_request_grpc!(
727    platform_proto::GetTokenPerpetualDistributionLastClaimRequest,
728    platform_proto::GetTokenPerpetualDistributionLastClaimResponse,
729    PlatformGrpcClient,
730    RequestSettings::default(),
731    get_token_perpetual_distribution_last_claim
732);
733
734// rpc getAddressInfo(GetAddressInfoRequest) returns (GetAddressInfoResponse);
735impl_transport_request_grpc!(
736    platform_proto::GetAddressInfoRequest,
737    platform_proto::GetAddressInfoResponse,
738    PlatformGrpcClient,
739    RequestSettings::default(),
740    get_address_info
741);
742
743// rpc getAddressesInfos(GetAddressesInfosRequest) returns (GetAddressesInfosResponse);
744impl_transport_request_grpc!(
745    platform_proto::GetAddressesInfosRequest,
746    platform_proto::GetAddressesInfosResponse,
747    PlatformGrpcClient,
748    RequestSettings::default(),
749    get_addresses_infos
750);
751
752// rpc getAddressesTrunkState(GetAddressesTrunkStateRequest) returns (GetAddressesTrunkStateResponse);
753impl_transport_request_grpc!(
754    platform_proto::GetAddressesTrunkStateRequest,
755    platform_proto::GetAddressesTrunkStateResponse,
756    PlatformGrpcClient,
757    RequestSettings::default(),
758    get_addresses_trunk_state
759);
760
761// rpc getAddressesBranchState(GetAddressesBranchStateRequest) returns (GetAddressesBranchStateResponse);
762impl_transport_request_grpc!(
763    platform_proto::GetAddressesBranchStateRequest,
764    platform_proto::GetAddressesBranchStateResponse,
765    PlatformGrpcClient,
766    RequestSettings::default(),
767    get_addresses_branch_state
768);
769
770// rpc getRecentAddressBalanceChanges(GetRecentAddressBalanceChangesRequest) returns (GetRecentAddressBalanceChangesResponse);
771impl_transport_request_grpc!(
772    platform_proto::GetRecentAddressBalanceChangesRequest,
773    platform_proto::GetRecentAddressBalanceChangesResponse,
774    PlatformGrpcClient,
775    RequestSettings::default(),
776    get_recent_address_balance_changes
777);
778
779// rpc getRecentCompactedAddressBalanceChanges(GetRecentCompactedAddressBalanceChangesRequest) returns (GetRecentCompactedAddressBalanceChangesResponse);
780impl_transport_request_grpc!(
781    platform_proto::GetRecentCompactedAddressBalanceChangesRequest,
782    platform_proto::GetRecentCompactedAddressBalanceChangesResponse,
783    PlatformGrpcClient,
784    RequestSettings {
785        // GetRecentCompactedAddressBalanceChangesResponse can have 100 values * 2048 addresses * ~44  bytes each = ~9MB
786        // We set it to 16MB to be safe
787        max_decoding_message_size: Some(16 * 1024 * 1024),
788        ..RequestSettings::default()
789    },
790    get_recent_compacted_address_balance_changes
791);