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::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
366impl_transport_request_grpc!(
368 platform_proto::GetContestedResourcesRequest,
369 platform_proto::GetContestedResourcesResponse,
370 PlatformGrpcClient,
371 RequestSettings::default(),
372 get_contested_resources
373);
374
375impl_transport_request_grpc!(
377 platform_proto::GetContestedResourceVoteStateRequest,
378 platform_proto::GetContestedResourceVoteStateResponse,
379 PlatformGrpcClient,
380 RequestSettings::default(),
381 get_contested_resource_vote_state
382);
383
384impl_transport_request_grpc!(
386 platform_proto::GetContestedResourceVotersForIdentityRequest,
387 platform_proto::GetContestedResourceVotersForIdentityResponse,
388 PlatformGrpcClient,
389 RequestSettings::default(),
390 get_contested_resource_voters_for_identity
391);
392impl_transport_request_grpc!(
394 platform_proto::GetContestedResourceIdentityVotesRequest,
395 platform_proto::GetContestedResourceIdentityVotesResponse,
396 PlatformGrpcClient,
397 RequestSettings::default(),
398 get_contested_resource_identity_votes
399);
400impl_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
409impl_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
418impl_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
427impl_transport_request_grpc!(
429 platform_proto::GetPrefundedSpecializedBalanceRequest,
430 platform_proto::GetPrefundedSpecializedBalanceResponse,
431 PlatformGrpcClient,
432 RequestSettings::default(),
433 get_prefunded_specialized_balance
434);
435
436impl_transport_request_grpc!(
438 platform_proto::GetPathElementsRequest,
439 platform_proto::GetPathElementsResponse,
440 PlatformGrpcClient,
441 RequestSettings::default(),
442 get_path_elements
443);
444
445impl_transport_request_grpc!(
447 platform_proto::GetTotalCreditsInPlatformRequest,
448 platform_proto::GetTotalCreditsInPlatformResponse,
449 PlatformGrpcClient,
450 RequestSettings::default(),
451 get_total_credits_in_platform
452);
453
454impl_transport_request_grpc!(
456 platform_proto::GetCurrentQuorumsInfoRequest,
457 platform_proto::GetCurrentQuorumsInfoResponse,
458 PlatformGrpcClient,
459 RequestSettings::default(),
460 get_current_quorums_info
461);
462
463impl_transport_request_grpc!(
465 platform_proto::GetShieldedEncryptedNotesRequest,
466 platform_proto::GetShieldedEncryptedNotesResponse,
467 PlatformGrpcClient,
468 RequestSettings::default(),
469 get_shielded_encrypted_notes
470);
471
472impl_transport_request_grpc!(
474 platform_proto::GetShieldedAnchorsRequest,
475 platform_proto::GetShieldedAnchorsResponse,
476 PlatformGrpcClient,
477 RequestSettings::default(),
478 get_shielded_anchors
479);
480
481impl_transport_request_grpc!(
483 platform_proto::GetMostRecentShieldedAnchorRequest,
484 platform_proto::GetMostRecentShieldedAnchorResponse,
485 PlatformGrpcClient,
486 RequestSettings::default(),
487 get_most_recent_shielded_anchor
488);
489
490impl_transport_request_grpc!(
492 platform_proto::GetShieldedPoolStateRequest,
493 platform_proto::GetShieldedPoolStateResponse,
494 PlatformGrpcClient,
495 RequestSettings::default(),
496 get_shielded_pool_state
497);
498
499impl_transport_request_grpc!(
501 platform_proto::GetShieldedNotesCountRequest,
502 platform_proto::GetShieldedNotesCountResponse,
503 PlatformGrpcClient,
504 RequestSettings::default(),
505 get_shielded_notes_count
506);
507
508impl_transport_request_grpc!(
510 platform_proto::GetShieldedNullifiersRequest,
511 platform_proto::GetShieldedNullifiersResponse,
512 PlatformGrpcClient,
513 RequestSettings::default(),
514 get_shielded_nullifiers
515);
516
517impl_transport_request_grpc!(
519 platform_proto::GetRecentNullifierChangesRequest,
520 platform_proto::GetRecentNullifierChangesResponse,
521 PlatformGrpcClient,
522 RequestSettings::default(),
523 get_recent_nullifier_changes
524);
525
526impl_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
538impl_transport_request_grpc!(
540 platform_proto::GetNullifiersTrunkStateRequest,
541 platform_proto::GetNullifiersTrunkStateResponse,
542 PlatformGrpcClient,
543 RequestSettings::default(),
544 get_nullifiers_trunk_state
545);
546
547impl_transport_request_grpc!(
549 platform_proto::GetNullifiersBranchStateRequest,
550 platform_proto::GetNullifiersBranchStateResponse,
551 PlatformGrpcClient,
552 RequestSettings::default(),
553 get_nullifiers_branch_state
554);
555
556impl_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
607impl_transport_request_grpc!(
609 platform_proto::GetStatusRequest,
610 platform_proto::GetStatusResponse,
611 PlatformGrpcClient,
612 RequestSettings::default(),
613 get_status
614);
615
616impl_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
625impl_transport_request_grpc!(
627 platform_proto::GetIdentityTokenBalancesRequest,
628 platform_proto::GetIdentityTokenBalancesResponse,
629 PlatformGrpcClient,
630 RequestSettings::default(),
631 get_identity_token_balances
632);
633
634impl_transport_request_grpc!(
636 platform_proto::GetIdentitiesTokenBalancesRequest,
637 platform_proto::GetIdentitiesTokenBalancesResponse,
638 PlatformGrpcClient,
639 RequestSettings::default(),
640 get_identities_token_balances
641);
642
643impl_transport_request_grpc!(
645 platform_proto::GetIdentityTokenInfosRequest,
646 platform_proto::GetIdentityTokenInfosResponse,
647 PlatformGrpcClient,
648 RequestSettings::default(),
649 get_identity_token_infos
650);
651
652impl_transport_request_grpc!(
654 platform_proto::GetIdentitiesTokenInfosRequest,
655 platform_proto::GetIdentitiesTokenInfosResponse,
656 PlatformGrpcClient,
657 RequestSettings::default(),
658 get_identities_token_infos
659);
660
661impl_transport_request_grpc!(
663 platform_proto::GetTokenStatusesRequest,
664 platform_proto::GetTokenStatusesResponse,
665 PlatformGrpcClient,
666 RequestSettings::default(),
667 get_token_statuses
668);
669
670impl_transport_request_grpc!(
672 platform_proto::GetTokenPreProgrammedDistributionsRequest,
673 platform_proto::GetTokenPreProgrammedDistributionsResponse,
674 PlatformGrpcClient,
675 RequestSettings::default(),
676 get_token_pre_programmed_distributions
677);
678
679impl_transport_request_grpc!(
681 platform_proto::GetTokenTotalSupplyRequest,
682 platform_proto::GetTokenTotalSupplyResponse,
683 PlatformGrpcClient,
684 RequestSettings::default(),
685 get_token_total_supply
686);
687
688impl_transport_request_grpc!(
690 platform_proto::GetGroupInfoRequest,
691 platform_proto::GetGroupInfoResponse,
692 PlatformGrpcClient,
693 RequestSettings::default(),
694 get_group_info
695);
696
697impl_transport_request_grpc!(
699 platform_proto::GetGroupInfosRequest,
700 platform_proto::GetGroupInfosResponse,
701 PlatformGrpcClient,
702 RequestSettings::default(),
703 get_group_infos
704);
705
706impl_transport_request_grpc!(
708 platform_proto::GetGroupActionsRequest,
709 platform_proto::GetGroupActionsResponse,
710 PlatformGrpcClient,
711 RequestSettings::default(),
712 get_group_actions
713);
714
715impl_transport_request_grpc!(
717 platform_proto::GetGroupActionSignersRequest,
718 platform_proto::GetGroupActionSignersResponse,
719 PlatformGrpcClient,
720 RequestSettings::default(),
721 get_group_action_signers
722);
723
724impl_transport_request_grpc!(
726 platform_proto::GetTokenDirectPurchasePricesRequest,
727 platform_proto::GetTokenDirectPurchasePricesResponse,
728 PlatformGrpcClient,
729 RequestSettings::default(),
730 get_token_direct_purchase_prices
731);
732
733impl_transport_request_grpc!(
735 platform_proto::GetTokenContractInfoRequest,
736 platform_proto::GetTokenContractInfoResponse,
737 PlatformGrpcClient,
738 RequestSettings::default(),
739 get_token_contract_info
740);
741
742impl_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
751impl_transport_request_grpc!(
753 platform_proto::GetAddressInfoRequest,
754 platform_proto::GetAddressInfoResponse,
755 PlatformGrpcClient,
756 RequestSettings::default(),
757 get_address_info
758);
759
760impl_transport_request_grpc!(
762 platform_proto::GetAddressesInfosRequest,
763 platform_proto::GetAddressesInfosResponse,
764 PlatformGrpcClient,
765 RequestSettings::default(),
766 get_addresses_infos
767);
768
769impl_transport_request_grpc!(
771 platform_proto::GetAddressesTrunkStateRequest,
772 platform_proto::GetAddressesTrunkStateResponse,
773 PlatformGrpcClient,
774 RequestSettings::default(),
775 get_addresses_trunk_state
776);
777
778impl_transport_request_grpc!(
780 platform_proto::GetAddressesBranchStateRequest,
781 platform_proto::GetAddressesBranchStateResponse,
782 PlatformGrpcClient,
783 RequestSettings::default(),
784 get_addresses_branch_state
785);
786
787impl_transport_request_grpc!(
789 platform_proto::GetRecentAddressBalanceChangesRequest,
790 platform_proto::GetRecentAddressBalanceChangesResponse,
791 PlatformGrpcClient,
792 RequestSettings::default(),
793 get_recent_address_balance_changes
794);
795
796impl_transport_request_grpc!(
798 platform_proto::GetRecentCompactedAddressBalanceChangesRequest,
799 platform_proto::GetRecentCompactedAddressBalanceChangesResponse,
800 PlatformGrpcClient,
801 RequestSettings {
802 max_decoding_message_size: Some(16 * 1024 * 1024),
805 ..RequestSettings::default()
806 },
807 get_recent_compacted_address_balance_changes
808);