1use 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
121macro_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
188const 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
358impl_transport_request_grpc!(
360 platform_proto::GetContestedResourcesRequest,
361 platform_proto::GetContestedResourcesResponse,
362 PlatformGrpcClient,
363 RequestSettings::default(),
364 get_contested_resources
365);
366
367impl_transport_request_grpc!(
369 platform_proto::GetContestedResourceVoteStateRequest,
370 platform_proto::GetContestedResourceVoteStateResponse,
371 PlatformGrpcClient,
372 RequestSettings::default(),
373 get_contested_resource_vote_state
374);
375
376impl_transport_request_grpc!(
378 platform_proto::GetContestedResourceVotersForIdentityRequest,
379 platform_proto::GetContestedResourceVotersForIdentityResponse,
380 PlatformGrpcClient,
381 RequestSettings::default(),
382 get_contested_resource_voters_for_identity
383);
384impl_transport_request_grpc!(
386 platform_proto::GetContestedResourceIdentityVotesRequest,
387 platform_proto::GetContestedResourceIdentityVotesResponse,
388 PlatformGrpcClient,
389 RequestSettings::default(),
390 get_contested_resource_identity_votes
391);
392impl_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
401impl_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
410impl_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
419impl_transport_request_grpc!(
421 platform_proto::GetPrefundedSpecializedBalanceRequest,
422 platform_proto::GetPrefundedSpecializedBalanceResponse,
423 PlatformGrpcClient,
424 RequestSettings::default(),
425 get_prefunded_specialized_balance
426);
427
428impl_transport_request_grpc!(
430 platform_proto::GetPathElementsRequest,
431 platform_proto::GetPathElementsResponse,
432 PlatformGrpcClient,
433 RequestSettings::default(),
434 get_path_elements
435);
436
437impl_transport_request_grpc!(
439 platform_proto::GetTotalCreditsInPlatformRequest,
440 platform_proto::GetTotalCreditsInPlatformResponse,
441 PlatformGrpcClient,
442 RequestSettings::default(),
443 get_total_credits_in_platform
444);
445
446impl_transport_request_grpc!(
448 platform_proto::GetCurrentQuorumsInfoRequest,
449 platform_proto::GetCurrentQuorumsInfoResponse,
450 PlatformGrpcClient,
451 RequestSettings::default(),
452 get_current_quorums_info
453);
454
455impl_transport_request_grpc!(
457 platform_proto::GetShieldedEncryptedNotesRequest,
458 platform_proto::GetShieldedEncryptedNotesResponse,
459 PlatformGrpcClient,
460 RequestSettings::default(),
461 get_shielded_encrypted_notes
462);
463
464impl_transport_request_grpc!(
466 platform_proto::GetShieldedAnchorsRequest,
467 platform_proto::GetShieldedAnchorsResponse,
468 PlatformGrpcClient,
469 RequestSettings::default(),
470 get_shielded_anchors
471);
472
473impl_transport_request_grpc!(
475 platform_proto::GetMostRecentShieldedAnchorRequest,
476 platform_proto::GetMostRecentShieldedAnchorResponse,
477 PlatformGrpcClient,
478 RequestSettings::default(),
479 get_most_recent_shielded_anchor
480);
481
482impl_transport_request_grpc!(
484 platform_proto::GetShieldedPoolStateRequest,
485 platform_proto::GetShieldedPoolStateResponse,
486 PlatformGrpcClient,
487 RequestSettings::default(),
488 get_shielded_pool_state
489);
490
491impl_transport_request_grpc!(
493 platform_proto::GetShieldedNullifiersRequest,
494 platform_proto::GetShieldedNullifiersResponse,
495 PlatformGrpcClient,
496 RequestSettings::default(),
497 get_shielded_nullifiers
498);
499
500impl_transport_request_grpc!(
502 platform_proto::GetRecentNullifierChangesRequest,
503 platform_proto::GetRecentNullifierChangesResponse,
504 PlatformGrpcClient,
505 RequestSettings::default(),
506 get_recent_nullifier_changes
507);
508
509impl_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
521impl_transport_request_grpc!(
523 platform_proto::GetNullifiersTrunkStateRequest,
524 platform_proto::GetNullifiersTrunkStateResponse,
525 PlatformGrpcClient,
526 RequestSettings::default(),
527 get_nullifiers_trunk_state
528);
529
530impl_transport_request_grpc!(
532 platform_proto::GetNullifiersBranchStateRequest,
533 platform_proto::GetNullifiersBranchStateResponse,
534 PlatformGrpcClient,
535 RequestSettings::default(),
536 get_nullifiers_branch_state
537);
538
539impl_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
590impl_transport_request_grpc!(
592 platform_proto::GetStatusRequest,
593 platform_proto::GetStatusResponse,
594 PlatformGrpcClient,
595 RequestSettings::default(),
596 get_status
597);
598
599impl_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
608impl_transport_request_grpc!(
610 platform_proto::GetIdentityTokenBalancesRequest,
611 platform_proto::GetIdentityTokenBalancesResponse,
612 PlatformGrpcClient,
613 RequestSettings::default(),
614 get_identity_token_balances
615);
616
617impl_transport_request_grpc!(
619 platform_proto::GetIdentitiesTokenBalancesRequest,
620 platform_proto::GetIdentitiesTokenBalancesResponse,
621 PlatformGrpcClient,
622 RequestSettings::default(),
623 get_identities_token_balances
624);
625
626impl_transport_request_grpc!(
628 platform_proto::GetIdentityTokenInfosRequest,
629 platform_proto::GetIdentityTokenInfosResponse,
630 PlatformGrpcClient,
631 RequestSettings::default(),
632 get_identity_token_infos
633);
634
635impl_transport_request_grpc!(
637 platform_proto::GetIdentitiesTokenInfosRequest,
638 platform_proto::GetIdentitiesTokenInfosResponse,
639 PlatformGrpcClient,
640 RequestSettings::default(),
641 get_identities_token_infos
642);
643
644impl_transport_request_grpc!(
646 platform_proto::GetTokenStatusesRequest,
647 platform_proto::GetTokenStatusesResponse,
648 PlatformGrpcClient,
649 RequestSettings::default(),
650 get_token_statuses
651);
652
653impl_transport_request_grpc!(
655 platform_proto::GetTokenPreProgrammedDistributionsRequest,
656 platform_proto::GetTokenPreProgrammedDistributionsResponse,
657 PlatformGrpcClient,
658 RequestSettings::default(),
659 get_token_pre_programmed_distributions
660);
661
662impl_transport_request_grpc!(
664 platform_proto::GetTokenTotalSupplyRequest,
665 platform_proto::GetTokenTotalSupplyResponse,
666 PlatformGrpcClient,
667 RequestSettings::default(),
668 get_token_total_supply
669);
670
671impl_transport_request_grpc!(
673 platform_proto::GetGroupInfoRequest,
674 platform_proto::GetGroupInfoResponse,
675 PlatformGrpcClient,
676 RequestSettings::default(),
677 get_group_info
678);
679
680impl_transport_request_grpc!(
682 platform_proto::GetGroupInfosRequest,
683 platform_proto::GetGroupInfosResponse,
684 PlatformGrpcClient,
685 RequestSettings::default(),
686 get_group_infos
687);
688
689impl_transport_request_grpc!(
691 platform_proto::GetGroupActionsRequest,
692 platform_proto::GetGroupActionsResponse,
693 PlatformGrpcClient,
694 RequestSettings::default(),
695 get_group_actions
696);
697
698impl_transport_request_grpc!(
700 platform_proto::GetGroupActionSignersRequest,
701 platform_proto::GetGroupActionSignersResponse,
702 PlatformGrpcClient,
703 RequestSettings::default(),
704 get_group_action_signers
705);
706
707impl_transport_request_grpc!(
709 platform_proto::GetTokenDirectPurchasePricesRequest,
710 platform_proto::GetTokenDirectPurchasePricesResponse,
711 PlatformGrpcClient,
712 RequestSettings::default(),
713 get_token_direct_purchase_prices
714);
715
716impl_transport_request_grpc!(
718 platform_proto::GetTokenContractInfoRequest,
719 platform_proto::GetTokenContractInfoResponse,
720 PlatformGrpcClient,
721 RequestSettings::default(),
722 get_token_contract_info
723);
724
725impl_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
734impl_transport_request_grpc!(
736 platform_proto::GetAddressInfoRequest,
737 platform_proto::GetAddressInfoResponse,
738 PlatformGrpcClient,
739 RequestSettings::default(),
740 get_address_info
741);
742
743impl_transport_request_grpc!(
745 platform_proto::GetAddressesInfosRequest,
746 platform_proto::GetAddressesInfosResponse,
747 PlatformGrpcClient,
748 RequestSettings::default(),
749 get_addresses_infos
750);
751
752impl_transport_request_grpc!(
754 platform_proto::GetAddressesTrunkStateRequest,
755 platform_proto::GetAddressesTrunkStateResponse,
756 PlatformGrpcClient,
757 RequestSettings::default(),
758 get_addresses_trunk_state
759);
760
761impl_transport_request_grpc!(
763 platform_proto::GetAddressesBranchStateRequest,
764 platform_proto::GetAddressesBranchStateResponse,
765 PlatformGrpcClient,
766 RequestSettings::default(),
767 get_addresses_branch_state
768);
769
770impl_transport_request_grpc!(
772 platform_proto::GetRecentAddressBalanceChangesRequest,
773 platform_proto::GetRecentAddressBalanceChangesResponse,
774 PlatformGrpcClient,
775 RequestSettings::default(),
776 get_recent_address_balance_changes
777);
778
779impl_transport_request_grpc!(
781 platform_proto::GetRecentCompactedAddressBalanceChangesRequest,
782 platform_proto::GetRecentCompactedAddressBalanceChangesResponse,
783 PlatformGrpcClient,
784 RequestSettings {
785 max_decoding_message_size: Some(16 * 1024 * 1024),
788 ..RequestSettings::default()
789 },
790 get_recent_compacted_address_balance_changes
791);