1#![allow(unused_imports)]
15use async_trait::async_trait;
16use derive_builder::Builder;
17use reqwest;
18use rust_decimal::prelude::*;
19use serde::{Deserialize, Serialize};
20use serde_json::{Value, json};
21use std::collections::BTreeMap;
22
23use crate::common::{
24 config::ConfigurationRestApi,
25 models::{ParamBuildError, RestApiResponse},
26 utils::send_request,
27};
28use crate::wallet::rest_api::models;
29
30const HAS_TIME_UNIT: bool = false;
31
32#[async_trait]
33pub trait TravelRuleApi: Send + Sync {
34 async fn broker_withdraw(
35 &self,
36 params: BrokerWithdrawParams,
37 ) -> anyhow::Result<RestApiResponse<models::BrokerWithdrawResponse>>;
38 async fn check_questionnaire_requirements(
39 &self,
40 params: CheckQuestionnaireRequirementsParams,
41 ) -> anyhow::Result<RestApiResponse<models::CheckQuestionnaireRequirementsResponse>>;
42 async fn deposit_history_travel_rule(
43 &self,
44 params: DepositHistoryTravelRuleParams,
45 ) -> anyhow::Result<RestApiResponse<Vec<models::DepositHistoryTravelRuleResponseInner>>>;
46 async fn deposit_history_v2(
47 &self,
48 params: DepositHistoryV2Params,
49 ) -> anyhow::Result<RestApiResponse<Vec<models::DepositHistoryV2ResponseInner>>>;
50 async fn fetch_address_verification_list(
51 &self,
52 params: FetchAddressVerificationListParams,
53 ) -> anyhow::Result<RestApiResponse<Vec<models::FetchAddressVerificationListResponseInner>>>;
54 async fn get_country_list(
55 &self,
56 params: GetCountryListParams,
57 ) -> anyhow::Result<RestApiResponse<models::GetCountryListResponse>>;
58 async fn get_region_list(
59 &self,
60 params: GetRegionListParams,
61 ) -> anyhow::Result<RestApiResponse<models::GetRegionListResponse>>;
62 async fn submit_deposit_questionnaire(
63 &self,
64 params: SubmitDepositQuestionnaireParams,
65 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireResponse>>;
66 async fn submit_deposit_questionnaire_travel_rule(
67 &self,
68 params: SubmitDepositQuestionnaireTravelRuleParams,
69 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireTravelRuleResponse>>;
70 async fn submit_deposit_questionnaire_v2(
71 &self,
72 params: SubmitDepositQuestionnaireV2Params,
73 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireV2Response>>;
74 async fn vasp_list(
75 &self,
76 params: VaspListParams,
77 ) -> anyhow::Result<RestApiResponse<Vec<models::VaspListResponseInner>>>;
78 async fn withdraw_history_v1(
79 &self,
80 params: WithdrawHistoryV1Params,
81 ) -> anyhow::Result<RestApiResponse<Vec<models::WithdrawHistoryV1ResponseInner>>>;
82 async fn withdraw_history_v2(
83 &self,
84 params: WithdrawHistoryV2Params,
85 ) -> anyhow::Result<RestApiResponse<Vec<models::WithdrawHistoryV1ResponseInner>>>;
86 async fn withdraw_travel_rule(
87 &self,
88 params: WithdrawTravelRuleParams,
89 ) -> anyhow::Result<RestApiResponse<models::WithdrawTravelRuleResponse>>;
90}
91
92#[derive(Debug, Clone)]
93pub struct TravelRuleApiClient {
94 configuration: ConfigurationRestApi,
95}
96
97impl TravelRuleApiClient {
98 pub fn new(configuration: ConfigurationRestApi) -> Self {
99 Self { configuration }
100 }
101}
102
103#[derive(Clone, Debug, Builder, Deserialize)]
108#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
109pub struct BrokerWithdrawParams {
110 #[builder(setter(into))]
115 #[serde(rename = "address")]
116 pub address: String,
117 #[builder(setter(into))]
122 #[serde(rename = "coin")]
123 pub coin: String,
124 #[builder(setter(into))]
129 #[serde(rename = "amount")]
130 pub amount: rust_decimal::Decimal,
131 #[builder(setter(into))]
135 #[serde(rename = "withdrawOrderId")]
136 pub withdraw_order_id: String,
137 #[builder(setter(into))]
141 #[serde(rename = "questionnaire")]
142 pub questionnaire: String,
143 #[builder(setter(into))]
147 #[serde(rename = "originatorPii")]
148 pub originator_pii: String,
149 #[builder(setter(into), default)]
153 #[serde(rename = "addressTag", default)]
154 pub address_tag: Option<String>,
155 #[builder(setter(into), default)]
160 #[serde(rename = "network", default)]
161 pub network: Option<String>,
162 #[builder(setter(into), default)]
166 #[serde(rename = "addressName", default)]
167 pub address_name: Option<String>,
168 #[builder(setter(into), default)]
173 #[serde(rename = "transactionFeeFlag", default)]
174 pub transaction_fee_flag: Option<bool>,
175 #[builder(setter(into), default)]
180 #[serde(rename = "walletType", default)]
181 pub wallet_type: Option<i64>,
182}
183
184impl BrokerWithdrawParams {
185 #[must_use]
197 pub fn builder(
198 address: String,
199 coin: String,
200 amount: rust_decimal::Decimal,
201 withdraw_order_id: String,
202 questionnaire: String,
203 originator_pii: String,
204 ) -> BrokerWithdrawParamsBuilder {
205 BrokerWithdrawParamsBuilder::default()
206 .address(address)
207 .coin(coin)
208 .amount(amount)
209 .withdraw_order_id(withdraw_order_id)
210 .questionnaire(questionnaire)
211 .originator_pii(originator_pii)
212 }
213}
214#[derive(Clone, Debug, Builder, Deserialize, Default)]
219#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
220pub struct CheckQuestionnaireRequirementsParams {
221 #[builder(setter(into), default)]
226 #[serde(rename = "recvWindow", default)]
227 pub recv_window: Option<i64>,
228}
229
230impl CheckQuestionnaireRequirementsParams {
231 #[must_use]
234 pub fn builder() -> CheckQuestionnaireRequirementsParamsBuilder {
235 CheckQuestionnaireRequirementsParamsBuilder::default()
236 }
237}
238#[derive(Clone, Debug, Builder, Deserialize, Default)]
243#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
244pub struct DepositHistoryTravelRuleParams {
245 #[builder(setter(into), default)]
249 #[serde(rename = "trId", default)]
250 pub tr_id: Option<String>,
251 #[builder(setter(into), default)]
255 #[serde(rename = "txId", default)]
256 pub tx_id: Option<String>,
257 #[builder(setter(into), default)]
261 #[serde(rename = "tranId", default)]
262 pub tran_id: Option<String>,
263 #[builder(setter(into), default)]
268 #[serde(rename = "network", default)]
269 pub network: Option<String>,
270 #[builder(setter(into), default)]
275 #[serde(rename = "coin", default)]
276 pub coin: Option<String>,
277 #[builder(setter(into), default)]
281 #[serde(rename = "travelRuleStatus", default)]
282 pub travel_rule_status: Option<i64>,
283 #[builder(setter(into), default)]
287 #[serde(rename = "pendingQuestionnaire", default)]
288 pub pending_questionnaire: Option<bool>,
289 #[builder(setter(into), default)]
293 #[serde(rename = "startTime", default)]
294 pub start_time: Option<i64>,
295 #[builder(setter(into), default)]
299 #[serde(rename = "endTime", default)]
300 pub end_time: Option<i64>,
301 #[builder(setter(into), default)]
305 #[serde(rename = "offset", default)]
306 pub offset: Option<i64>,
307 #[builder(setter(into), default)]
312 #[serde(rename = "limit", default)]
313 pub limit: Option<i64>,
314}
315
316impl DepositHistoryTravelRuleParams {
317 #[must_use]
320 pub fn builder() -> DepositHistoryTravelRuleParamsBuilder {
321 DepositHistoryTravelRuleParamsBuilder::default()
322 }
323}
324#[derive(Clone, Debug, Builder, Deserialize, Default)]
329#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
330pub struct DepositHistoryV2Params {
331 #[builder(setter(into), default)]
335 #[serde(rename = "depositId", default)]
336 pub deposit_id: Option<i64>,
337 #[builder(setter(into), default)]
341 #[serde(rename = "txId", default)]
342 pub tx_id: Option<String>,
343 #[builder(setter(into), default)]
348 #[serde(rename = "network", default)]
349 pub network: Option<String>,
350 #[builder(setter(into), default)]
355 #[serde(rename = "coin", default)]
356 pub coin: Option<String>,
357 #[builder(setter(into), default)]
361 #[serde(rename = "retrieveQuestionnaire", default)]
362 pub retrieve_questionnaire: Option<bool>,
363 #[builder(setter(into), default)]
367 #[serde(rename = "startTime", default)]
368 pub start_time: Option<i64>,
369 #[builder(setter(into), default)]
373 #[serde(rename = "endTime", default)]
374 pub end_time: Option<i64>,
375 #[builder(setter(into), default)]
380 #[serde(rename = "offset", default)]
381 pub offset: Option<i64>,
382 #[builder(setter(into), default)]
387 #[serde(rename = "limit", default)]
388 pub limit: Option<i64>,
389}
390
391impl DepositHistoryV2Params {
392 #[must_use]
395 pub fn builder() -> DepositHistoryV2ParamsBuilder {
396 DepositHistoryV2ParamsBuilder::default()
397 }
398}
399#[derive(Clone, Debug, Builder, Deserialize, Default)]
404#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
405pub struct FetchAddressVerificationListParams {
406 #[builder(setter(into), default)]
411 #[serde(rename = "recvWindow", default)]
412 pub recv_window: Option<i64>,
413}
414
415impl FetchAddressVerificationListParams {
416 #[must_use]
419 pub fn builder() -> FetchAddressVerificationListParamsBuilder {
420 FetchAddressVerificationListParamsBuilder::default()
421 }
422}
423#[derive(Clone, Debug, Builder, Deserialize, Default)]
428#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
429pub struct GetCountryListParams {
430 #[builder(setter(into), default)]
435 #[serde(rename = "recvWindow", default)]
436 pub recv_window: Option<i64>,
437}
438
439impl GetCountryListParams {
440 #[must_use]
443 pub fn builder() -> GetCountryListParamsBuilder {
444 GetCountryListParamsBuilder::default()
445 }
446}
447#[derive(Clone, Debug, Builder, Deserialize)]
452#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
453pub struct GetRegionListParams {
454 #[builder(setter(into))]
458 #[serde(rename = "countryCode")]
459 pub country_code: String,
460 #[builder(setter(into), default)]
465 #[serde(rename = "recvWindow", default)]
466 pub recv_window: Option<i64>,
467}
468
469impl GetRegionListParams {
470 #[must_use]
477 pub fn builder(country_code: String) -> GetRegionListParamsBuilder {
478 GetRegionListParamsBuilder::default().country_code(country_code)
479 }
480}
481#[derive(Clone, Debug, Builder, Deserialize)]
486#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
487pub struct SubmitDepositQuestionnaireParams {
488 #[builder(setter(into))]
492 #[serde(rename = "subAccountId")]
493 pub sub_account_id: String,
494 #[builder(setter(into))]
498 #[serde(rename = "depositId")]
499 pub deposit_id: i64,
500 #[builder(setter(into))]
504 #[serde(rename = "questionnaire")]
505 pub questionnaire: String,
506 #[builder(setter(into))]
510 #[serde(rename = "beneficiaryPii")]
511 pub beneficiary_pii: String,
512 #[builder(setter(into), default)]
517 #[serde(rename = "network", default)]
518 pub network: Option<String>,
519 #[builder(setter(into), default)]
524 #[serde(rename = "coin", default)]
525 pub coin: Option<String>,
526 #[builder(setter(into), default)]
531 #[serde(rename = "amount", default)]
532 pub amount: Option<rust_decimal::Decimal>,
533 #[builder(setter(into), default)]
538 #[serde(rename = "address", default)]
539 pub address: Option<String>,
540 #[builder(setter(into), default)]
545 #[serde(rename = "addressTag", default)]
546 pub address_tag: Option<String>,
547}
548
549impl SubmitDepositQuestionnaireParams {
550 #[must_use]
560 pub fn builder(
561 sub_account_id: String,
562 deposit_id: i64,
563 questionnaire: String,
564 beneficiary_pii: String,
565 ) -> SubmitDepositQuestionnaireParamsBuilder {
566 SubmitDepositQuestionnaireParamsBuilder::default()
567 .sub_account_id(sub_account_id)
568 .deposit_id(deposit_id)
569 .questionnaire(questionnaire)
570 .beneficiary_pii(beneficiary_pii)
571 }
572}
573#[derive(Clone, Debug, Builder, Deserialize)]
578#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
579pub struct SubmitDepositQuestionnaireTravelRuleParams {
580 #[builder(setter(into))]
584 #[serde(rename = "tranId")]
585 pub tran_id: i64,
586 #[builder(setter(into))]
590 #[serde(rename = "questionnaire")]
591 pub questionnaire: String,
592}
593
594impl SubmitDepositQuestionnaireTravelRuleParams {
595 #[must_use]
603 pub fn builder(
604 tran_id: i64,
605 questionnaire: String,
606 ) -> SubmitDepositQuestionnaireTravelRuleParamsBuilder {
607 SubmitDepositQuestionnaireTravelRuleParamsBuilder::default()
608 .tran_id(tran_id)
609 .questionnaire(questionnaire)
610 }
611}
612#[derive(Clone, Debug, Builder, Deserialize)]
617#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
618pub struct SubmitDepositQuestionnaireV2Params {
619 #[builder(setter(into))]
623 #[serde(rename = "depositId")]
624 pub deposit_id: i64,
625 #[builder(setter(into))]
629 #[serde(rename = "questionnaire")]
630 pub questionnaire: String,
631}
632
633impl SubmitDepositQuestionnaireV2Params {
634 #[must_use]
642 pub fn builder(
643 deposit_id: i64,
644 questionnaire: String,
645 ) -> SubmitDepositQuestionnaireV2ParamsBuilder {
646 SubmitDepositQuestionnaireV2ParamsBuilder::default()
647 .deposit_id(deposit_id)
648 .questionnaire(questionnaire)
649 }
650}
651#[derive(Clone, Debug, Builder, Deserialize, Default)]
656#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
657pub struct VaspListParams {
658 #[builder(setter(into), default)]
663 #[serde(rename = "recvWindow", default)]
664 pub recv_window: Option<i64>,
665}
666
667impl VaspListParams {
668 #[must_use]
671 pub fn builder() -> VaspListParamsBuilder {
672 VaspListParamsBuilder::default()
673 }
674}
675#[derive(Clone, Debug, Builder, Deserialize, Default)]
680#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
681pub struct WithdrawHistoryV1Params {
682 #[builder(setter(into), default)]
686 #[serde(rename = "trId", default)]
687 pub tr_id: Option<String>,
688 #[builder(setter(into), default)]
692 #[serde(rename = "txId", default)]
693 pub tx_id: Option<String>,
694 #[builder(setter(into), default)]
699 #[serde(rename = "withdrawOrderId", default)]
700 pub withdraw_order_id: Option<String>,
701 #[builder(setter(into), default)]
706 #[serde(rename = "network", default)]
707 pub network: Option<String>,
708 #[builder(setter(into), default)]
713 #[serde(rename = "coin", default)]
714 pub coin: Option<String>,
715 #[builder(setter(into), default)]
719 #[serde(rename = "travelRuleStatus", default)]
720 pub travel_rule_status: Option<i64>,
721 #[builder(setter(into), default)]
726 #[serde(rename = "offset", default)]
727 pub offset: Option<i64>,
728 #[builder(setter(into), default)]
733 #[serde(rename = "limit", default)]
734 pub limit: Option<i64>,
735 #[builder(setter(into), default)]
739 #[serde(rename = "startTime", default)]
740 pub start_time: Option<i64>,
741 #[builder(setter(into), default)]
745 #[serde(rename = "endTime", default)]
746 pub end_time: Option<i64>,
747 #[builder(setter(into), default)]
752 #[serde(rename = "recvWindow", default)]
753 pub recv_window: Option<i64>,
754}
755
756impl WithdrawHistoryV1Params {
757 #[must_use]
760 pub fn builder() -> WithdrawHistoryV1ParamsBuilder {
761 WithdrawHistoryV1ParamsBuilder::default()
762 }
763}
764#[derive(Clone, Debug, Builder, Deserialize, Default)]
769#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
770pub struct WithdrawHistoryV2Params {
771 #[builder(setter(into), default)]
775 #[serde(rename = "trId", default)]
776 pub tr_id: Option<String>,
777 #[builder(setter(into), default)]
781 #[serde(rename = "txId", default)]
782 pub tx_id: Option<String>,
783 #[builder(setter(into), default)]
788 #[serde(rename = "withdrawOrderId", default)]
789 pub withdraw_order_id: Option<String>,
790 #[builder(setter(into), default)]
795 #[serde(rename = "network", default)]
796 pub network: Option<String>,
797 #[builder(setter(into), default)]
802 #[serde(rename = "coin", default)]
803 pub coin: Option<String>,
804 #[builder(setter(into), default)]
808 #[serde(rename = "travelRuleStatus", default)]
809 pub travel_rule_status: Option<i64>,
810 #[builder(setter(into), default)]
815 #[serde(rename = "offset", default)]
816 pub offset: Option<i64>,
817 #[builder(setter(into), default)]
822 #[serde(rename = "limit", default)]
823 pub limit: Option<i64>,
824 #[builder(setter(into), default)]
828 #[serde(rename = "startTime", default)]
829 pub start_time: Option<i64>,
830 #[builder(setter(into), default)]
834 #[serde(rename = "endTime", default)]
835 pub end_time: Option<i64>,
836 #[builder(setter(into), default)]
841 #[serde(rename = "recvWindow", default)]
842 pub recv_window: Option<i64>,
843}
844
845impl WithdrawHistoryV2Params {
846 #[must_use]
849 pub fn builder() -> WithdrawHistoryV2ParamsBuilder {
850 WithdrawHistoryV2ParamsBuilder::default()
851 }
852}
853#[derive(Clone, Debug, Builder, Deserialize)]
858#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
859pub struct WithdrawTravelRuleParams {
860 #[builder(setter(into))]
865 #[serde(rename = "coin")]
866 pub coin: String,
867 #[builder(setter(into))]
871 #[serde(rename = "address")]
872 pub address: String,
873 #[builder(setter(into))]
877 #[serde(rename = "amount")]
878 pub amount: rust_decimal::Decimal,
879 #[builder(setter(into))]
883 #[serde(rename = "questionnaire")]
884 pub questionnaire: String,
885 #[builder(setter(into), default)]
889 #[serde(rename = "withdrawOrderId", default)]
890 pub withdraw_order_id: Option<String>,
891 #[builder(setter(into), default)]
895 #[serde(rename = "network", default)]
896 pub network: Option<String>,
897 #[builder(setter(into), default)]
901 #[serde(rename = "addressTag", default)]
902 pub address_tag: Option<String>,
903 #[builder(setter(into), default)]
908 #[serde(rename = "transactionFeeFlag", default)]
909 pub transaction_fee_flag: Option<bool>,
910 #[builder(setter(into), default)]
915 #[serde(rename = "name", default)]
916 pub name: Option<String>,
917 #[builder(setter(into), default)]
922 #[serde(rename = "walletType", default)]
923 pub wallet_type: Option<i64>,
924 #[builder(setter(into), default)]
929 #[serde(rename = "recvWindow", default)]
930 pub recv_window: Option<i64>,
931}
932
933impl WithdrawTravelRuleParams {
934 #[must_use]
944 pub fn builder(
945 coin: String,
946 address: String,
947 amount: rust_decimal::Decimal,
948 questionnaire: String,
949 ) -> WithdrawTravelRuleParamsBuilder {
950 WithdrawTravelRuleParamsBuilder::default()
951 .coin(coin)
952 .address(address)
953 .amount(amount)
954 .questionnaire(questionnaire)
955 }
956}
957
958#[async_trait]
959impl TravelRuleApi for TravelRuleApiClient {
960 async fn broker_withdraw(
961 &self,
962 params: BrokerWithdrawParams,
963 ) -> anyhow::Result<RestApiResponse<models::BrokerWithdrawResponse>> {
964 let BrokerWithdrawParams {
965 address,
966 coin,
967 amount,
968 withdraw_order_id,
969 questionnaire,
970 originator_pii,
971 address_tag,
972 network,
973 address_name,
974 transaction_fee_flag,
975 wallet_type,
976 } = params;
977
978 let mut query_params = BTreeMap::new();
979 let body_params = BTreeMap::new();
980
981 query_params.insert("address".to_string(), json!(address));
982
983 if let Some(rw) = address_tag {
984 query_params.insert("addressTag".to_string(), json!(rw));
985 }
986
987 if let Some(rw) = network {
988 query_params.insert("network".to_string(), json!(rw));
989 }
990
991 query_params.insert("coin".to_string(), json!(coin));
992
993 if let Some(rw) = address_name {
994 query_params.insert("addressName".to_string(), json!(rw));
995 }
996
997 query_params.insert("amount".to_string(), json!(amount));
998
999 query_params.insert("withdrawOrderId".to_string(), json!(withdraw_order_id));
1000
1001 if let Some(rw) = transaction_fee_flag {
1002 query_params.insert("transactionFeeFlag".to_string(), json!(rw));
1003 }
1004
1005 if let Some(rw) = wallet_type {
1006 query_params.insert("walletType".to_string(), json!(rw));
1007 }
1008
1009 query_params.insert("questionnaire".to_string(), json!(questionnaire));
1010
1011 query_params.insert("originatorPii".to_string(), json!(originator_pii));
1012
1013 send_request::<models::BrokerWithdrawResponse>(
1014 &self.configuration,
1015 "/sapi/v1/localentity/broker/withdraw/apply",
1016 reqwest::Method::POST,
1017 query_params,
1018 body_params,
1019 if HAS_TIME_UNIT {
1020 self.configuration.time_unit
1021 } else {
1022 None
1023 },
1024 true,
1025 )
1026 .await
1027 }
1028
1029 async fn check_questionnaire_requirements(
1030 &self,
1031 params: CheckQuestionnaireRequirementsParams,
1032 ) -> anyhow::Result<RestApiResponse<models::CheckQuestionnaireRequirementsResponse>> {
1033 let CheckQuestionnaireRequirementsParams { recv_window } = params;
1034
1035 let mut query_params = BTreeMap::new();
1036 let body_params = BTreeMap::new();
1037
1038 if let Some(rw) = recv_window {
1039 query_params.insert("recvWindow".to_string(), json!(rw));
1040 }
1041
1042 send_request::<models::CheckQuestionnaireRequirementsResponse>(
1043 &self.configuration,
1044 "/sapi/v1/localentity/questionnaire-requirements",
1045 reqwest::Method::GET,
1046 query_params,
1047 body_params,
1048 if HAS_TIME_UNIT {
1049 self.configuration.time_unit
1050 } else {
1051 None
1052 },
1053 true,
1054 )
1055 .await
1056 }
1057
1058 async fn deposit_history_travel_rule(
1059 &self,
1060 params: DepositHistoryTravelRuleParams,
1061 ) -> anyhow::Result<RestApiResponse<Vec<models::DepositHistoryTravelRuleResponseInner>>> {
1062 let DepositHistoryTravelRuleParams {
1063 tr_id,
1064 tx_id,
1065 tran_id,
1066 network,
1067 coin,
1068 travel_rule_status,
1069 pending_questionnaire,
1070 start_time,
1071 end_time,
1072 offset,
1073 limit,
1074 } = params;
1075
1076 let mut query_params = BTreeMap::new();
1077 let body_params = BTreeMap::new();
1078
1079 if let Some(rw) = tr_id {
1080 query_params.insert("trId".to_string(), json!(rw));
1081 }
1082
1083 if let Some(rw) = tx_id {
1084 query_params.insert("txId".to_string(), json!(rw));
1085 }
1086
1087 if let Some(rw) = tran_id {
1088 query_params.insert("tranId".to_string(), json!(rw));
1089 }
1090
1091 if let Some(rw) = network {
1092 query_params.insert("network".to_string(), json!(rw));
1093 }
1094
1095 if let Some(rw) = coin {
1096 query_params.insert("coin".to_string(), json!(rw));
1097 }
1098
1099 if let Some(rw) = travel_rule_status {
1100 query_params.insert("travelRuleStatus".to_string(), json!(rw));
1101 }
1102
1103 if let Some(rw) = pending_questionnaire {
1104 query_params.insert("pendingQuestionnaire".to_string(), json!(rw));
1105 }
1106
1107 if let Some(rw) = start_time {
1108 query_params.insert("startTime".to_string(), json!(rw));
1109 }
1110
1111 if let Some(rw) = end_time {
1112 query_params.insert("endTime".to_string(), json!(rw));
1113 }
1114
1115 if let Some(rw) = offset {
1116 query_params.insert("offset".to_string(), json!(rw));
1117 }
1118
1119 if let Some(rw) = limit {
1120 query_params.insert("limit".to_string(), json!(rw));
1121 }
1122
1123 send_request::<Vec<models::DepositHistoryTravelRuleResponseInner>>(
1124 &self.configuration,
1125 "/sapi/v1/localentity/deposit/history",
1126 reqwest::Method::GET,
1127 query_params,
1128 body_params,
1129 if HAS_TIME_UNIT {
1130 self.configuration.time_unit
1131 } else {
1132 None
1133 },
1134 true,
1135 )
1136 .await
1137 }
1138
1139 async fn deposit_history_v2(
1140 &self,
1141 params: DepositHistoryV2Params,
1142 ) -> anyhow::Result<RestApiResponse<Vec<models::DepositHistoryV2ResponseInner>>> {
1143 let DepositHistoryV2Params {
1144 deposit_id,
1145 tx_id,
1146 network,
1147 coin,
1148 retrieve_questionnaire,
1149 start_time,
1150 end_time,
1151 offset,
1152 limit,
1153 } = params;
1154
1155 let mut query_params = BTreeMap::new();
1156 let body_params = BTreeMap::new();
1157
1158 if let Some(rw) = deposit_id {
1159 query_params.insert("depositId".to_string(), json!(rw));
1160 }
1161
1162 if let Some(rw) = tx_id {
1163 query_params.insert("txId".to_string(), json!(rw));
1164 }
1165
1166 if let Some(rw) = network {
1167 query_params.insert("network".to_string(), json!(rw));
1168 }
1169
1170 if let Some(rw) = coin {
1171 query_params.insert("coin".to_string(), json!(rw));
1172 }
1173
1174 if let Some(rw) = retrieve_questionnaire {
1175 query_params.insert("retrieveQuestionnaire".to_string(), json!(rw));
1176 }
1177
1178 if let Some(rw) = start_time {
1179 query_params.insert("startTime".to_string(), json!(rw));
1180 }
1181
1182 if let Some(rw) = end_time {
1183 query_params.insert("endTime".to_string(), json!(rw));
1184 }
1185
1186 if let Some(rw) = offset {
1187 query_params.insert("offset".to_string(), json!(rw));
1188 }
1189
1190 if let Some(rw) = limit {
1191 query_params.insert("limit".to_string(), json!(rw));
1192 }
1193
1194 send_request::<Vec<models::DepositHistoryV2ResponseInner>>(
1195 &self.configuration,
1196 "/sapi/v2/localentity/deposit/history",
1197 reqwest::Method::GET,
1198 query_params,
1199 body_params,
1200 if HAS_TIME_UNIT {
1201 self.configuration.time_unit
1202 } else {
1203 None
1204 },
1205 true,
1206 )
1207 .await
1208 }
1209
1210 async fn fetch_address_verification_list(
1211 &self,
1212 params: FetchAddressVerificationListParams,
1213 ) -> anyhow::Result<RestApiResponse<Vec<models::FetchAddressVerificationListResponseInner>>>
1214 {
1215 let FetchAddressVerificationListParams { recv_window } = params;
1216
1217 let mut query_params = BTreeMap::new();
1218 let body_params = BTreeMap::new();
1219
1220 if let Some(rw) = recv_window {
1221 query_params.insert("recvWindow".to_string(), json!(rw));
1222 }
1223
1224 send_request::<Vec<models::FetchAddressVerificationListResponseInner>>(
1225 &self.configuration,
1226 "/sapi/v1/addressVerify/list",
1227 reqwest::Method::GET,
1228 query_params,
1229 body_params,
1230 if HAS_TIME_UNIT {
1231 self.configuration.time_unit
1232 } else {
1233 None
1234 },
1235 true,
1236 )
1237 .await
1238 }
1239
1240 async fn get_country_list(
1241 &self,
1242 params: GetCountryListParams,
1243 ) -> anyhow::Result<RestApiResponse<models::GetCountryListResponse>> {
1244 let GetCountryListParams { recv_window } = params;
1245
1246 let mut query_params = BTreeMap::new();
1247 let body_params = BTreeMap::new();
1248
1249 if let Some(rw) = recv_window {
1250 query_params.insert("recvWindow".to_string(), json!(rw));
1251 }
1252
1253 send_request::<models::GetCountryListResponse>(
1254 &self.configuration,
1255 "/sapi/v1/localentity/country/list",
1256 reqwest::Method::GET,
1257 query_params,
1258 body_params,
1259 if HAS_TIME_UNIT {
1260 self.configuration.time_unit
1261 } else {
1262 None
1263 },
1264 true,
1265 )
1266 .await
1267 }
1268
1269 async fn get_region_list(
1270 &self,
1271 params: GetRegionListParams,
1272 ) -> anyhow::Result<RestApiResponse<models::GetRegionListResponse>> {
1273 let GetRegionListParams {
1274 country_code,
1275 recv_window,
1276 } = params;
1277
1278 let mut query_params = BTreeMap::new();
1279 let body_params = BTreeMap::new();
1280
1281 query_params.insert("countryCode".to_string(), json!(country_code));
1282
1283 if let Some(rw) = recv_window {
1284 query_params.insert("recvWindow".to_string(), json!(rw));
1285 }
1286
1287 send_request::<models::GetRegionListResponse>(
1288 &self.configuration,
1289 "/sapi/v1/localentity/region/list",
1290 reqwest::Method::GET,
1291 query_params,
1292 body_params,
1293 if HAS_TIME_UNIT {
1294 self.configuration.time_unit
1295 } else {
1296 None
1297 },
1298 true,
1299 )
1300 .await
1301 }
1302
1303 async fn submit_deposit_questionnaire(
1304 &self,
1305 params: SubmitDepositQuestionnaireParams,
1306 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireResponse>> {
1307 let SubmitDepositQuestionnaireParams {
1308 sub_account_id,
1309 deposit_id,
1310 questionnaire,
1311 beneficiary_pii,
1312 network,
1313 coin,
1314 amount,
1315 address,
1316 address_tag,
1317 } = params;
1318
1319 let mut query_params = BTreeMap::new();
1320 let body_params = BTreeMap::new();
1321
1322 query_params.insert("subAccountId".to_string(), json!(sub_account_id));
1323
1324 query_params.insert("depositId".to_string(), json!(deposit_id));
1325
1326 query_params.insert("questionnaire".to_string(), json!(questionnaire));
1327
1328 query_params.insert("beneficiaryPii".to_string(), json!(beneficiary_pii));
1329
1330 if let Some(rw) = network {
1331 query_params.insert("network".to_string(), json!(rw));
1332 }
1333
1334 if let Some(rw) = coin {
1335 query_params.insert("coin".to_string(), json!(rw));
1336 }
1337
1338 if let Some(rw) = amount {
1339 query_params.insert("amount".to_string(), json!(rw));
1340 }
1341
1342 if let Some(rw) = address {
1343 query_params.insert("address".to_string(), json!(rw));
1344 }
1345
1346 if let Some(rw) = address_tag {
1347 query_params.insert("addressTag".to_string(), json!(rw));
1348 }
1349
1350 send_request::<models::SubmitDepositQuestionnaireResponse>(
1351 &self.configuration,
1352 "/sapi/v1/localentity/broker/deposit/provide-info",
1353 reqwest::Method::PUT,
1354 query_params,
1355 body_params,
1356 if HAS_TIME_UNIT {
1357 self.configuration.time_unit
1358 } else {
1359 None
1360 },
1361 true,
1362 )
1363 .await
1364 }
1365
1366 async fn submit_deposit_questionnaire_travel_rule(
1367 &self,
1368 params: SubmitDepositQuestionnaireTravelRuleParams,
1369 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireTravelRuleResponse>> {
1370 let SubmitDepositQuestionnaireTravelRuleParams {
1371 tran_id,
1372 questionnaire,
1373 } = params;
1374
1375 let mut query_params = BTreeMap::new();
1376 let body_params = BTreeMap::new();
1377
1378 query_params.insert("tranId".to_string(), json!(tran_id));
1379
1380 query_params.insert("questionnaire".to_string(), json!(questionnaire));
1381
1382 send_request::<models::SubmitDepositQuestionnaireTravelRuleResponse>(
1383 &self.configuration,
1384 "/sapi/v1/localentity/deposit/provide-info",
1385 reqwest::Method::PUT,
1386 query_params,
1387 body_params,
1388 if HAS_TIME_UNIT {
1389 self.configuration.time_unit
1390 } else {
1391 None
1392 },
1393 true,
1394 )
1395 .await
1396 }
1397
1398 async fn submit_deposit_questionnaire_v2(
1399 &self,
1400 params: SubmitDepositQuestionnaireV2Params,
1401 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireV2Response>> {
1402 let SubmitDepositQuestionnaireV2Params {
1403 deposit_id,
1404 questionnaire,
1405 } = params;
1406
1407 let mut query_params = BTreeMap::new();
1408 let body_params = BTreeMap::new();
1409
1410 query_params.insert("depositId".to_string(), json!(deposit_id));
1411
1412 query_params.insert("questionnaire".to_string(), json!(questionnaire));
1413
1414 send_request::<models::SubmitDepositQuestionnaireV2Response>(
1415 &self.configuration,
1416 "/sapi/v2/localentity/deposit/provide-info",
1417 reqwest::Method::PUT,
1418 query_params,
1419 body_params,
1420 if HAS_TIME_UNIT {
1421 self.configuration.time_unit
1422 } else {
1423 None
1424 },
1425 true,
1426 )
1427 .await
1428 }
1429
1430 async fn vasp_list(
1431 &self,
1432 params: VaspListParams,
1433 ) -> anyhow::Result<RestApiResponse<Vec<models::VaspListResponseInner>>> {
1434 let VaspListParams { recv_window } = params;
1435
1436 let mut query_params = BTreeMap::new();
1437 let body_params = BTreeMap::new();
1438
1439 if let Some(rw) = recv_window {
1440 query_params.insert("recvWindow".to_string(), json!(rw));
1441 }
1442
1443 send_request::<Vec<models::VaspListResponseInner>>(
1444 &self.configuration,
1445 "/sapi/v1/localentity/vasp",
1446 reqwest::Method::GET,
1447 query_params,
1448 body_params,
1449 if HAS_TIME_UNIT {
1450 self.configuration.time_unit
1451 } else {
1452 None
1453 },
1454 true,
1455 )
1456 .await
1457 }
1458
1459 async fn withdraw_history_v1(
1460 &self,
1461 params: WithdrawHistoryV1Params,
1462 ) -> anyhow::Result<RestApiResponse<Vec<models::WithdrawHistoryV1ResponseInner>>> {
1463 let WithdrawHistoryV1Params {
1464 tr_id,
1465 tx_id,
1466 withdraw_order_id,
1467 network,
1468 coin,
1469 travel_rule_status,
1470 offset,
1471 limit,
1472 start_time,
1473 end_time,
1474 recv_window,
1475 } = params;
1476
1477 let mut query_params = BTreeMap::new();
1478 let body_params = BTreeMap::new();
1479
1480 if let Some(rw) = tr_id {
1481 query_params.insert("trId".to_string(), json!(rw));
1482 }
1483
1484 if let Some(rw) = tx_id {
1485 query_params.insert("txId".to_string(), json!(rw));
1486 }
1487
1488 if let Some(rw) = withdraw_order_id {
1489 query_params.insert("withdrawOrderId".to_string(), json!(rw));
1490 }
1491
1492 if let Some(rw) = network {
1493 query_params.insert("network".to_string(), json!(rw));
1494 }
1495
1496 if let Some(rw) = coin {
1497 query_params.insert("coin".to_string(), json!(rw));
1498 }
1499
1500 if let Some(rw) = travel_rule_status {
1501 query_params.insert("travelRuleStatus".to_string(), json!(rw));
1502 }
1503
1504 if let Some(rw) = offset {
1505 query_params.insert("offset".to_string(), json!(rw));
1506 }
1507
1508 if let Some(rw) = limit {
1509 query_params.insert("limit".to_string(), json!(rw));
1510 }
1511
1512 if let Some(rw) = start_time {
1513 query_params.insert("startTime".to_string(), json!(rw));
1514 }
1515
1516 if let Some(rw) = end_time {
1517 query_params.insert("endTime".to_string(), json!(rw));
1518 }
1519
1520 if let Some(rw) = recv_window {
1521 query_params.insert("recvWindow".to_string(), json!(rw));
1522 }
1523
1524 send_request::<Vec<models::WithdrawHistoryV1ResponseInner>>(
1525 &self.configuration,
1526 "/sapi/v1/localentity/withdraw/history",
1527 reqwest::Method::GET,
1528 query_params,
1529 body_params,
1530 if HAS_TIME_UNIT {
1531 self.configuration.time_unit
1532 } else {
1533 None
1534 },
1535 true,
1536 )
1537 .await
1538 }
1539
1540 async fn withdraw_history_v2(
1541 &self,
1542 params: WithdrawHistoryV2Params,
1543 ) -> anyhow::Result<RestApiResponse<Vec<models::WithdrawHistoryV1ResponseInner>>> {
1544 let WithdrawHistoryV2Params {
1545 tr_id,
1546 tx_id,
1547 withdraw_order_id,
1548 network,
1549 coin,
1550 travel_rule_status,
1551 offset,
1552 limit,
1553 start_time,
1554 end_time,
1555 recv_window,
1556 } = params;
1557
1558 let mut query_params = BTreeMap::new();
1559 let body_params = BTreeMap::new();
1560
1561 if let Some(rw) = tr_id {
1562 query_params.insert("trId".to_string(), json!(rw));
1563 }
1564
1565 if let Some(rw) = tx_id {
1566 query_params.insert("txId".to_string(), json!(rw));
1567 }
1568
1569 if let Some(rw) = withdraw_order_id {
1570 query_params.insert("withdrawOrderId".to_string(), json!(rw));
1571 }
1572
1573 if let Some(rw) = network {
1574 query_params.insert("network".to_string(), json!(rw));
1575 }
1576
1577 if let Some(rw) = coin {
1578 query_params.insert("coin".to_string(), json!(rw));
1579 }
1580
1581 if let Some(rw) = travel_rule_status {
1582 query_params.insert("travelRuleStatus".to_string(), json!(rw));
1583 }
1584
1585 if let Some(rw) = offset {
1586 query_params.insert("offset".to_string(), json!(rw));
1587 }
1588
1589 if let Some(rw) = limit {
1590 query_params.insert("limit".to_string(), json!(rw));
1591 }
1592
1593 if let Some(rw) = start_time {
1594 query_params.insert("startTime".to_string(), json!(rw));
1595 }
1596
1597 if let Some(rw) = end_time {
1598 query_params.insert("endTime".to_string(), json!(rw));
1599 }
1600
1601 if let Some(rw) = recv_window {
1602 query_params.insert("recvWindow".to_string(), json!(rw));
1603 }
1604
1605 send_request::<Vec<models::WithdrawHistoryV1ResponseInner>>(
1606 &self.configuration,
1607 "/sapi/v2/localentity/withdraw/history",
1608 reqwest::Method::GET,
1609 query_params,
1610 body_params,
1611 if HAS_TIME_UNIT {
1612 self.configuration.time_unit
1613 } else {
1614 None
1615 },
1616 true,
1617 )
1618 .await
1619 }
1620
1621 async fn withdraw_travel_rule(
1622 &self,
1623 params: WithdrawTravelRuleParams,
1624 ) -> anyhow::Result<RestApiResponse<models::WithdrawTravelRuleResponse>> {
1625 let WithdrawTravelRuleParams {
1626 coin,
1627 address,
1628 amount,
1629 questionnaire,
1630 withdraw_order_id,
1631 network,
1632 address_tag,
1633 transaction_fee_flag,
1634 name,
1635 wallet_type,
1636 recv_window,
1637 } = params;
1638
1639 let mut query_params = BTreeMap::new();
1640 let body_params = BTreeMap::new();
1641
1642 query_params.insert("coin".to_string(), json!(coin));
1643
1644 if let Some(rw) = withdraw_order_id {
1645 query_params.insert("withdrawOrderId".to_string(), json!(rw));
1646 }
1647
1648 if let Some(rw) = network {
1649 query_params.insert("network".to_string(), json!(rw));
1650 }
1651
1652 query_params.insert("address".to_string(), json!(address));
1653
1654 if let Some(rw) = address_tag {
1655 query_params.insert("addressTag".to_string(), json!(rw));
1656 }
1657
1658 query_params.insert("amount".to_string(), json!(amount));
1659
1660 if let Some(rw) = transaction_fee_flag {
1661 query_params.insert("transactionFeeFlag".to_string(), json!(rw));
1662 }
1663
1664 if let Some(rw) = name {
1665 query_params.insert("name".to_string(), json!(rw));
1666 }
1667
1668 if let Some(rw) = wallet_type {
1669 query_params.insert("walletType".to_string(), json!(rw));
1670 }
1671
1672 if let Some(rw) = recv_window {
1673 query_params.insert("recvWindow".to_string(), json!(rw));
1674 }
1675
1676 query_params.insert("questionnaire".to_string(), json!(questionnaire));
1677
1678 send_request::<models::WithdrawTravelRuleResponse>(
1679 &self.configuration,
1680 "/sapi/v1/localentity/withdraw/apply",
1681 reqwest::Method::POST,
1682 query_params,
1683 body_params,
1684 if HAS_TIME_UNIT {
1685 self.configuration.time_unit
1686 } else {
1687 None
1688 },
1689 true,
1690 )
1691 .await
1692 }
1693}
1694
1695#[cfg(all(test, feature = "wallet"))]
1696mod tests {
1697 use super::*;
1698 use crate::TOKIO_SHARED_RT;
1699 use crate::{errors::ConnectorError, models::DataFuture, models::RestApiRateLimit};
1700 use async_trait::async_trait;
1701 use std::collections::HashMap;
1702
1703 struct DummyRestApiResponse<T> {
1704 inner: Box<dyn FnOnce() -> DataFuture<Result<T, ConnectorError>> + Send + Sync>,
1705 status: u16,
1706 headers: HashMap<String, String>,
1707 rate_limits: Option<Vec<RestApiRateLimit>>,
1708 }
1709
1710 impl<T> From<DummyRestApiResponse<T>> for RestApiResponse<T> {
1711 fn from(dummy: DummyRestApiResponse<T>) -> Self {
1712 Self {
1713 data_fn: dummy.inner,
1714 status: dummy.status,
1715 headers: dummy.headers,
1716 rate_limits: dummy.rate_limits,
1717 }
1718 }
1719 }
1720
1721 struct MockTravelRuleApiClient {
1722 force_error: bool,
1723 }
1724
1725 #[async_trait]
1726 impl TravelRuleApi for MockTravelRuleApiClient {
1727 async fn broker_withdraw(
1728 &self,
1729 _params: BrokerWithdrawParams,
1730 ) -> anyhow::Result<RestApiResponse<models::BrokerWithdrawResponse>> {
1731 if self.force_error {
1732 return Err(ConnectorError::ConnectorClientError {
1733 msg: "ResponseError".to_string(),
1734 code: None,
1735 }
1736 .into());
1737 }
1738
1739 let resp_json: Value = serde_json::from_str(
1740 r#"{"trId":123456,"accepted":true,"info":"Withdraw request accepted"}"#,
1741 )
1742 .unwrap_or_else(|_| serde_json::json!({}));
1743 let dummy_response: models::BrokerWithdrawResponse =
1744 serde_json::from_value(resp_json.clone())
1745 .expect("should parse into models::BrokerWithdrawResponse");
1746
1747 let dummy = DummyRestApiResponse {
1748 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1749 status: 200,
1750 headers: HashMap::new(),
1751 rate_limits: None,
1752 };
1753
1754 Ok(dummy.into())
1755 }
1756
1757 async fn check_questionnaire_requirements(
1758 &self,
1759 _params: CheckQuestionnaireRequirementsParams,
1760 ) -> anyhow::Result<RestApiResponse<models::CheckQuestionnaireRequirementsResponse>>
1761 {
1762 if self.force_error {
1763 return Err(ConnectorError::ConnectorClientError {
1764 msg: "ResponseError".to_string(),
1765 code: None,
1766 }
1767 .into());
1768 }
1769
1770 let resp_json: Value = serde_json::from_str(r#"{"questionnaireCountryCode":"AE"}"#)
1771 .unwrap_or_else(|_| serde_json::json!({}));
1772 let dummy_response: models::CheckQuestionnaireRequirementsResponse =
1773 serde_json::from_value(resp_json.clone())
1774 .expect("should parse into models::CheckQuestionnaireRequirementsResponse");
1775
1776 let dummy = DummyRestApiResponse {
1777 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1778 status: 200,
1779 headers: HashMap::new(),
1780 rate_limits: None,
1781 };
1782
1783 Ok(dummy.into())
1784 }
1785
1786 async fn deposit_history_travel_rule(
1787 &self,
1788 _params: DepositHistoryTravelRuleParams,
1789 ) -> anyhow::Result<RestApiResponse<Vec<models::DepositHistoryTravelRuleResponseInner>>>
1790 {
1791 if self.force_error {
1792 return Err(ConnectorError::ConnectorClientError {
1793 msg: "ResponseError".to_string(),
1794 code: None,
1795 }
1796 .into());
1797 }
1798
1799 let resp_json: Value = serde_json::from_str(r#"[{"trId":123451123,"tranId":17644346245865,"amount":"0.001","coin":"BNB","network":"BNB","depositStatus":0,"travelRuleStatus":1,"travelRuleStatusV2":"PENDING","address":"bnb136ns6lfw4zs5hg4n85vdthaad7hq5m4gtkgf23","addressTag":"101764890","txId":"98A3EA560C6B3336D348B6C83F0F95ECE4F1F5919E94BD006E5BF3BF264FACFC","insertTime":1661493146000,"completeTime":1661493206000,"transferType":0,"confirmTimes":"1/1","requireQuestionnaire":false,"questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}"}]"#).unwrap_or_else(|_| serde_json::json!({}));
1800 let dummy_response: Vec<models::DepositHistoryTravelRuleResponseInner> =
1801 serde_json::from_value(resp_json.clone())
1802 .expect("should parse into Vec<models::DepositHistoryTravelRuleResponseInner>");
1803
1804 let dummy = DummyRestApiResponse {
1805 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1806 status: 200,
1807 headers: HashMap::new(),
1808 rate_limits: None,
1809 };
1810
1811 Ok(dummy.into())
1812 }
1813
1814 async fn deposit_history_v2(
1815 &self,
1816 _params: DepositHistoryV2Params,
1817 ) -> anyhow::Result<RestApiResponse<Vec<models::DepositHistoryV2ResponseInner>>> {
1818 if self.force_error {
1819 return Err(ConnectorError::ConnectorClientError {
1820 msg: "ResponseError".to_string(),
1821 code: None,
1822 }
1823 .into());
1824 }
1825
1826 let resp_json: Value = serde_json::from_str(r#"[{"depositId":"4615328107052018945","amount":"0.01","network":"AVAXC","coin":"AVAX","depositStatus":1,"travelRuleReqStatus":0,"address":"0x0010627ab66d69232f4080d54e0f838b4dc3894a","addressTag":"","txId":"0xdde578983015741eed764e7ca10defb5a2caafdca3db5f92872d24a96beb1879","transferType":0,"confirmTimes":"12/12","requireQuestionnaire":false,"questionnaire":{"vaspName":"BINANCE","depositOriginator":0},"insertTime":1753053392000}]"#).unwrap_or_else(|_| serde_json::json!({}));
1827 let dummy_response: Vec<models::DepositHistoryV2ResponseInner> =
1828 serde_json::from_value(resp_json.clone())
1829 .expect("should parse into Vec<models::DepositHistoryV2ResponseInner>");
1830
1831 let dummy = DummyRestApiResponse {
1832 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1833 status: 200,
1834 headers: HashMap::new(),
1835 rate_limits: None,
1836 };
1837
1838 Ok(dummy.into())
1839 }
1840
1841 async fn fetch_address_verification_list(
1842 &self,
1843 _params: FetchAddressVerificationListParams,
1844 ) -> anyhow::Result<RestApiResponse<Vec<models::FetchAddressVerificationListResponseInner>>>
1845 {
1846 if self.force_error {
1847 return Err(ConnectorError::ConnectorClientError {
1848 msg: "ResponseError".to_string(),
1849 code: None,
1850 }
1851 .into());
1852 }
1853
1854 let resp_json: Value = serde_json::from_str(r#"[{"status":"PENDING","token":"AVAX","network":"AVAXC","walletAddress":"0xc03a6aa728a8dde7464c33828424ede7553a0021","addressQuestionnaire":{"sendTo":1,"satoshiToken":"AVAX","isAddressOwner":1,"verifyMethod":1}}]"#).unwrap_or_else(|_| serde_json::json!({}));
1855 let dummy_response: Vec<models::FetchAddressVerificationListResponseInner> =
1856 serde_json::from_value(resp_json.clone()).expect(
1857 "should parse into Vec<models::FetchAddressVerificationListResponseInner>",
1858 );
1859
1860 let dummy = DummyRestApiResponse {
1861 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1862 status: 200,
1863 headers: HashMap::new(),
1864 rate_limits: None,
1865 };
1866
1867 Ok(dummy.into())
1868 }
1869
1870 async fn get_country_list(
1871 &self,
1872 _params: GetCountryListParams,
1873 ) -> anyhow::Result<RestApiResponse<models::GetCountryListResponse>> {
1874 if self.force_error {
1875 return Err(ConnectorError::ConnectorClientError {
1876 msg: "ResponseError".to_string(),
1877 code: None,
1878 }
1879 .into());
1880 }
1881
1882 let resp_json: Value = serde_json::from_str(r#"{"countries":[{"countryCode":"au","countryName":"Australia","blockType":"supported","depositAllowed":true,"withdrawalAllowed":true,"hasRegionRestrictions":false}],"lastUpdated":1716300000000}"#).unwrap_or_else(|_| serde_json::json!({}));
1883 let dummy_response: models::GetCountryListResponse =
1884 serde_json::from_value(resp_json.clone())
1885 .expect("should parse into models::GetCountryListResponse");
1886
1887 let dummy = DummyRestApiResponse {
1888 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1889 status: 200,
1890 headers: HashMap::new(),
1891 rate_limits: None,
1892 };
1893
1894 Ok(dummy.into())
1895 }
1896
1897 async fn get_region_list(
1898 &self,
1899 _params: GetRegionListParams,
1900 ) -> anyhow::Result<RestApiResponse<models::GetRegionListResponse>> {
1901 if self.force_error {
1902 return Err(ConnectorError::ConnectorClientError {
1903 msg: "ResponseError".to_string(),
1904 code: None,
1905 }
1906 .into());
1907 }
1908
1909 let resp_json: Value = serde_json::from_str(r#"{"countryCode":"au","regions":[{"regionName":"New South Wales","blockType":"supported","depositAllowed":true,"withdrawalAllowed":true}],"lastUpdated":1716300000000}"#).unwrap_or_else(|_| serde_json::json!({}));
1910 let dummy_response: models::GetRegionListResponse =
1911 serde_json::from_value(resp_json.clone())
1912 .expect("should parse into models::GetRegionListResponse");
1913
1914 let dummy = DummyRestApiResponse {
1915 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1916 status: 200,
1917 headers: HashMap::new(),
1918 rate_limits: None,
1919 };
1920
1921 Ok(dummy.into())
1922 }
1923
1924 async fn submit_deposit_questionnaire(
1925 &self,
1926 _params: SubmitDepositQuestionnaireParams,
1927 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireResponse>> {
1928 if self.force_error {
1929 return Err(ConnectorError::ConnectorClientError {
1930 msg: "ResponseError".to_string(),
1931 code: None,
1932 }
1933 .into());
1934 }
1935
1936 let resp_json: Value = serde_json::from_str(
1937 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
1938 )
1939 .unwrap_or_else(|_| serde_json::json!({}));
1940 let dummy_response: models::SubmitDepositQuestionnaireResponse =
1941 serde_json::from_value(resp_json.clone())
1942 .expect("should parse into models::SubmitDepositQuestionnaireResponse");
1943
1944 let dummy = DummyRestApiResponse {
1945 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1946 status: 200,
1947 headers: HashMap::new(),
1948 rate_limits: None,
1949 };
1950
1951 Ok(dummy.into())
1952 }
1953
1954 async fn submit_deposit_questionnaire_travel_rule(
1955 &self,
1956 _params: SubmitDepositQuestionnaireTravelRuleParams,
1957 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireTravelRuleResponse>>
1958 {
1959 if self.force_error {
1960 return Err(ConnectorError::ConnectorClientError {
1961 msg: "ResponseError".to_string(),
1962 code: None,
1963 }
1964 .into());
1965 }
1966
1967 let resp_json: Value = serde_json::from_str(
1968 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
1969 )
1970 .unwrap_or_else(|_| serde_json::json!({}));
1971 let dummy_response: models::SubmitDepositQuestionnaireTravelRuleResponse =
1972 serde_json::from_value(resp_json.clone()).expect(
1973 "should parse into models::SubmitDepositQuestionnaireTravelRuleResponse",
1974 );
1975
1976 let dummy = DummyRestApiResponse {
1977 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1978 status: 200,
1979 headers: HashMap::new(),
1980 rate_limits: None,
1981 };
1982
1983 Ok(dummy.into())
1984 }
1985
1986 async fn submit_deposit_questionnaire_v2(
1987 &self,
1988 _params: SubmitDepositQuestionnaireV2Params,
1989 ) -> anyhow::Result<RestApiResponse<models::SubmitDepositQuestionnaireV2Response>> {
1990 if self.force_error {
1991 return Err(ConnectorError::ConnectorClientError {
1992 msg: "ResponseError".to_string(),
1993 code: None,
1994 }
1995 .into());
1996 }
1997
1998 let resp_json: Value = serde_json::from_str(
1999 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2000 )
2001 .unwrap_or_else(|_| serde_json::json!({}));
2002 let dummy_response: models::SubmitDepositQuestionnaireV2Response =
2003 serde_json::from_value(resp_json.clone())
2004 .expect("should parse into models::SubmitDepositQuestionnaireV2Response");
2005
2006 let dummy = DummyRestApiResponse {
2007 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2008 status: 200,
2009 headers: HashMap::new(),
2010 rate_limits: None,
2011 };
2012
2013 Ok(dummy.into())
2014 }
2015
2016 async fn vasp_list(
2017 &self,
2018 _params: VaspListParams,
2019 ) -> anyhow::Result<RestApiResponse<Vec<models::VaspListResponseInner>>> {
2020 if self.force_error {
2021 return Err(ConnectorError::ConnectorClientError {
2022 msg: "ResponseError".to_string(),
2023 code: None,
2024 }
2025 .into());
2026 }
2027
2028 let resp_json: Value = serde_json::from_str(
2029 r#"[{"vaspName":"Binance","vaspCode":"BINANCE","identifier":"xxx"}]"#,
2030 )
2031 .unwrap_or_else(|_| serde_json::json!({}));
2032 let dummy_response: Vec<models::VaspListResponseInner> =
2033 serde_json::from_value(resp_json.clone())
2034 .expect("should parse into Vec<models::VaspListResponseInner>");
2035
2036 let dummy = DummyRestApiResponse {
2037 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2038 status: 200,
2039 headers: HashMap::new(),
2040 rate_limits: None,
2041 };
2042
2043 Ok(dummy.into())
2044 }
2045
2046 async fn withdraw_history_v1(
2047 &self,
2048 _params: WithdrawHistoryV1Params,
2049 ) -> anyhow::Result<RestApiResponse<Vec<models::WithdrawHistoryV1ResponseInner>>> {
2050 if self.force_error {
2051 return Err(ConnectorError::ConnectorClientError {
2052 msg: "ResponseError".to_string(),
2053 code: None,
2054 }
2055 .into());
2056 }
2057
2058 let resp_json: Value = serde_json::from_str(r#"[{"id":"b6ae22b3aa844210a7041aee7589627c","trId":1234456,"amount":"8.91000000","transactionFee":"0.004","coin":"USDT","withdrawalStatus":6,"travelRuleStatus":0,"address":"0x94df8b352de7f46f64b01d3666bf6e936e44ce60","txId":"0xb5ef8c13b968a406cc62a93a8bd80f9e9a906ef1b3fcf20a2e48573c17659268","applyTime":"2019-10-12 11:12:02","network":"ETH","transferType":0,"withdrawOrderId":"WITHDRAWtest123","info":"The address is not valid. Please confirm with the recipient","confirmNo":3,"walletType":1,"txKey":"","questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}","completeTime":"2023-03-23 16:52:41"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2059 let dummy_response: Vec<models::WithdrawHistoryV1ResponseInner> =
2060 serde_json::from_value(resp_json.clone())
2061 .expect("should parse into Vec<models::WithdrawHistoryV1ResponseInner>");
2062
2063 let dummy = DummyRestApiResponse {
2064 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2065 status: 200,
2066 headers: HashMap::new(),
2067 rate_limits: None,
2068 };
2069
2070 Ok(dummy.into())
2071 }
2072
2073 async fn withdraw_history_v2(
2074 &self,
2075 _params: WithdrawHistoryV2Params,
2076 ) -> anyhow::Result<RestApiResponse<Vec<models::WithdrawHistoryV1ResponseInner>>> {
2077 if self.force_error {
2078 return Err(ConnectorError::ConnectorClientError {
2079 msg: "ResponseError".to_string(),
2080 code: None,
2081 }
2082 .into());
2083 }
2084
2085 let resp_json: Value = serde_json::from_str(r#"[{"id":"b6ae22b3aa844210a7041aee7589627c","trId":1234456,"amount":"8.91000000","transactionFee":"0.004","coin":"USDT","withdrawalStatus":6,"travelRuleStatus":0,"address":"0x94df8b352de7f46f64b01d3666bf6e936e44ce60","txId":"0xb5ef8c13b968a406cc62a93a8bd80f9e9a906ef1b3fcf20a2e48573c17659268","applyTime":"2019-10-12 11:12:02","network":"ETH","transferType":0,"withdrawOrderId":"WITHDRAWtest123","info":"The address is not valid. Please confirm with the recipient","confirmNo":3,"walletType":1,"txKey":"","questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}","completeTime":"2023-03-23 16:52:41"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2086 let dummy_response: Vec<models::WithdrawHistoryV1ResponseInner> =
2087 serde_json::from_value(resp_json.clone())
2088 .expect("should parse into Vec<models::WithdrawHistoryV1ResponseInner>");
2089
2090 let dummy = DummyRestApiResponse {
2091 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2092 status: 200,
2093 headers: HashMap::new(),
2094 rate_limits: None,
2095 };
2096
2097 Ok(dummy.into())
2098 }
2099
2100 async fn withdraw_travel_rule(
2101 &self,
2102 _params: WithdrawTravelRuleParams,
2103 ) -> anyhow::Result<RestApiResponse<models::WithdrawTravelRuleResponse>> {
2104 if self.force_error {
2105 return Err(ConnectorError::ConnectorClientError {
2106 msg: "ResponseError".to_string(),
2107 code: None,
2108 }
2109 .into());
2110 }
2111
2112 let resp_json: Value = serde_json::from_str(
2113 r#"{"trId":123456,"accepted":true,"info":"Withdraw request accepted"}"#,
2114 )
2115 .unwrap_or_else(|_| serde_json::json!({}));
2116 let dummy_response: models::WithdrawTravelRuleResponse =
2117 serde_json::from_value(resp_json.clone())
2118 .expect("should parse into models::WithdrawTravelRuleResponse");
2119
2120 let dummy = DummyRestApiResponse {
2121 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2122 status: 200,
2123 headers: HashMap::new(),
2124 rate_limits: None,
2125 };
2126
2127 Ok(dummy.into())
2128 }
2129 }
2130
2131 #[test]
2132 fn broker_withdraw_required_params_success() {
2133 TOKIO_SHARED_RT.block_on(async {
2134 let client = MockTravelRuleApiClient { force_error: false };
2135
2136 let params = BrokerWithdrawParams::builder(
2137 "address_example".to_string(),
2138 "BTC".to_string(),
2139 dec!(1.0),
2140 "1".to_string(),
2141 "questionnaire_example".to_string(),
2142 "originator_pii_example".to_string(),
2143 )
2144 .build()
2145 .unwrap();
2146
2147 let resp_json: Value = serde_json::from_str(
2148 r#"{"trId":123456,"accepted":true,"info":"Withdraw request accepted"}"#,
2149 )
2150 .unwrap_or_else(|_| serde_json::json!({}));
2151 let expected_response: models::BrokerWithdrawResponse =
2152 serde_json::from_value(resp_json.clone())
2153 .expect("should parse into models::BrokerWithdrawResponse");
2154
2155 let resp = client
2156 .broker_withdraw(params)
2157 .await
2158 .expect("Expected a response");
2159 let data_future = resp.data();
2160 let actual_response = data_future.await.unwrap();
2161 assert_eq!(actual_response, expected_response);
2162 });
2163 }
2164
2165 #[test]
2166 fn broker_withdraw_optional_params_success() {
2167 TOKIO_SHARED_RT.block_on(async {
2168 let client = MockTravelRuleApiClient { force_error: false };
2169
2170 let params = BrokerWithdrawParams::builder(
2171 "address_example".to_string(),
2172 "BTC".to_string(),
2173 dec!(1.0),
2174 "1".to_string(),
2175 "questionnaire_example".to_string(),
2176 "originator_pii_example".to_string(),
2177 )
2178 .address_tag("address_tag_example".to_string())
2179 .network("network_example".to_string())
2180 .address_name("address_name_example".to_string())
2181 .transaction_fee_flag(true)
2182 .wallet_type(0)
2183 .build()
2184 .unwrap();
2185
2186 let resp_json: Value = serde_json::from_str(
2187 r#"{"trId":123456,"accepted":true,"info":"Withdraw request accepted"}"#,
2188 )
2189 .unwrap_or_else(|_| serde_json::json!({}));
2190 let expected_response: models::BrokerWithdrawResponse =
2191 serde_json::from_value(resp_json.clone())
2192 .expect("should parse into models::BrokerWithdrawResponse");
2193
2194 let resp = client
2195 .broker_withdraw(params)
2196 .await
2197 .expect("Expected a response");
2198 let data_future = resp.data();
2199 let actual_response = data_future.await.unwrap();
2200 assert_eq!(actual_response, expected_response);
2201 });
2202 }
2203
2204 #[test]
2205 fn broker_withdraw_response_error() {
2206 TOKIO_SHARED_RT.block_on(async {
2207 let client = MockTravelRuleApiClient { force_error: true };
2208
2209 let params = BrokerWithdrawParams::builder(
2210 "address_example".to_string(),
2211 "BTC".to_string(),
2212 dec!(1.0),
2213 "1".to_string(),
2214 "questionnaire_example".to_string(),
2215 "originator_pii_example".to_string(),
2216 )
2217 .build()
2218 .unwrap();
2219
2220 match client.broker_withdraw(params).await {
2221 Ok(_) => panic!("Expected an error"),
2222 Err(err) => {
2223 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2224 }
2225 }
2226 });
2227 }
2228
2229 #[test]
2230 fn check_questionnaire_requirements_required_params_success() {
2231 TOKIO_SHARED_RT.block_on(async {
2232 let client = MockTravelRuleApiClient { force_error: false };
2233
2234 let params = CheckQuestionnaireRequirementsParams::builder()
2235 .build()
2236 .unwrap();
2237
2238 let resp_json: Value = serde_json::from_str(r#"{"questionnaireCountryCode":"AE"}"#)
2239 .unwrap_or_else(|_| serde_json::json!({}));
2240 let expected_response: models::CheckQuestionnaireRequirementsResponse =
2241 serde_json::from_value(resp_json.clone())
2242 .expect("should parse into models::CheckQuestionnaireRequirementsResponse");
2243
2244 let resp = client
2245 .check_questionnaire_requirements(params)
2246 .await
2247 .expect("Expected a response");
2248 let data_future = resp.data();
2249 let actual_response = data_future.await.unwrap();
2250 assert_eq!(actual_response, expected_response);
2251 });
2252 }
2253
2254 #[test]
2255 fn check_questionnaire_requirements_optional_params_success() {
2256 TOKIO_SHARED_RT.block_on(async {
2257 let client = MockTravelRuleApiClient { force_error: false };
2258
2259 let params = CheckQuestionnaireRequirementsParams::builder()
2260 .recv_window(5000)
2261 .build()
2262 .unwrap();
2263
2264 let resp_json: Value = serde_json::from_str(r#"{"questionnaireCountryCode":"AE"}"#)
2265 .unwrap_or_else(|_| serde_json::json!({}));
2266 let expected_response: models::CheckQuestionnaireRequirementsResponse =
2267 serde_json::from_value(resp_json.clone())
2268 .expect("should parse into models::CheckQuestionnaireRequirementsResponse");
2269
2270 let resp = client
2271 .check_questionnaire_requirements(params)
2272 .await
2273 .expect("Expected a response");
2274 let data_future = resp.data();
2275 let actual_response = data_future.await.unwrap();
2276 assert_eq!(actual_response, expected_response);
2277 });
2278 }
2279
2280 #[test]
2281 fn check_questionnaire_requirements_response_error() {
2282 TOKIO_SHARED_RT.block_on(async {
2283 let client = MockTravelRuleApiClient { force_error: true };
2284
2285 let params = CheckQuestionnaireRequirementsParams::builder()
2286 .build()
2287 .unwrap();
2288
2289 match client.check_questionnaire_requirements(params).await {
2290 Ok(_) => panic!("Expected an error"),
2291 Err(err) => {
2292 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2293 }
2294 }
2295 });
2296 }
2297
2298 #[test]
2299 fn deposit_history_travel_rule_required_params_success() {
2300 TOKIO_SHARED_RT.block_on(async {
2301 let client = MockTravelRuleApiClient { force_error: false };
2302
2303 let params = DepositHistoryTravelRuleParams::builder().build().unwrap();
2304
2305 let resp_json: Value = serde_json::from_str(r#"[{"trId":123451123,"tranId":17644346245865,"amount":"0.001","coin":"BNB","network":"BNB","depositStatus":0,"travelRuleStatus":1,"travelRuleStatusV2":"PENDING","address":"bnb136ns6lfw4zs5hg4n85vdthaad7hq5m4gtkgf23","addressTag":"101764890","txId":"98A3EA560C6B3336D348B6C83F0F95ECE4F1F5919E94BD006E5BF3BF264FACFC","insertTime":1661493146000,"completeTime":1661493206000,"transferType":0,"confirmTimes":"1/1","requireQuestionnaire":false,"questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2306 let expected_response : Vec<models::DepositHistoryTravelRuleResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::DepositHistoryTravelRuleResponseInner>");
2307
2308 let resp = client.deposit_history_travel_rule(params).await.expect("Expected a response");
2309 let data_future = resp.data();
2310 let actual_response = data_future.await.unwrap();
2311 assert_eq!(actual_response, expected_response);
2312 });
2313 }
2314
2315 #[test]
2316 fn deposit_history_travel_rule_optional_params_success() {
2317 TOKIO_SHARED_RT.block_on(async {
2318 let client = MockTravelRuleApiClient { force_error: false };
2319
2320 let params = DepositHistoryTravelRuleParams::builder().tr_id("1".to_string()).tx_id("1".to_string()).tran_id("1".to_string()).network("network_example".to_string()).coin("BTC".to_string()).travel_rule_status(0).pending_questionnaire(true).start_time(1623319461670).end_time(1641782889000).offset(789).limit(1000).build().unwrap();
2321
2322 let resp_json: Value = serde_json::from_str(r#"[{"trId":123451123,"tranId":17644346245865,"amount":"0.001","coin":"BNB","network":"BNB","depositStatus":0,"travelRuleStatus":1,"travelRuleStatusV2":"PENDING","address":"bnb136ns6lfw4zs5hg4n85vdthaad7hq5m4gtkgf23","addressTag":"101764890","txId":"98A3EA560C6B3336D348B6C83F0F95ECE4F1F5919E94BD006E5BF3BF264FACFC","insertTime":1661493146000,"completeTime":1661493206000,"transferType":0,"confirmTimes":"1/1","requireQuestionnaire":false,"questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2323 let expected_response : Vec<models::DepositHistoryTravelRuleResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::DepositHistoryTravelRuleResponseInner>");
2324
2325 let resp = client.deposit_history_travel_rule(params).await.expect("Expected a response");
2326 let data_future = resp.data();
2327 let actual_response = data_future.await.unwrap();
2328 assert_eq!(actual_response, expected_response);
2329 });
2330 }
2331
2332 #[test]
2333 fn deposit_history_travel_rule_response_error() {
2334 TOKIO_SHARED_RT.block_on(async {
2335 let client = MockTravelRuleApiClient { force_error: true };
2336
2337 let params = DepositHistoryTravelRuleParams::builder().build().unwrap();
2338
2339 match client.deposit_history_travel_rule(params).await {
2340 Ok(_) => panic!("Expected an error"),
2341 Err(err) => {
2342 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2343 }
2344 }
2345 });
2346 }
2347
2348 #[test]
2349 fn deposit_history_v2_required_params_success() {
2350 TOKIO_SHARED_RT.block_on(async {
2351 let client = MockTravelRuleApiClient { force_error: false };
2352
2353 let params = DepositHistoryV2Params::builder().build().unwrap();
2354
2355 let resp_json: Value = serde_json::from_str(r#"[{"depositId":"4615328107052018945","amount":"0.01","network":"AVAXC","coin":"AVAX","depositStatus":1,"travelRuleReqStatus":0,"address":"0x0010627ab66d69232f4080d54e0f838b4dc3894a","addressTag":"","txId":"0xdde578983015741eed764e7ca10defb5a2caafdca3db5f92872d24a96beb1879","transferType":0,"confirmTimes":"12/12","requireQuestionnaire":false,"questionnaire":{"vaspName":"BINANCE","depositOriginator":0},"insertTime":1753053392000}]"#).unwrap_or_else(|_| serde_json::json!({}));
2356 let expected_response : Vec<models::DepositHistoryV2ResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::DepositHistoryV2ResponseInner>");
2357
2358 let resp = client.deposit_history_v2(params).await.expect("Expected a response");
2359 let data_future = resp.data();
2360 let actual_response = data_future.await.unwrap();
2361 assert_eq!(actual_response, expected_response);
2362 });
2363 }
2364
2365 #[test]
2366 fn deposit_history_v2_optional_params_success() {
2367 TOKIO_SHARED_RT.block_on(async {
2368 let client = MockTravelRuleApiClient { force_error: false };
2369
2370 let params = DepositHistoryV2Params::builder().deposit_id(1).tx_id("1".to_string()).network("network_example".to_string()).coin("BTC".to_string()).retrieve_questionnaire(true).start_time(1623319461670).end_time(1641782889000).offset(0).limit(1000).build().unwrap();
2371
2372 let resp_json: Value = serde_json::from_str(r#"[{"depositId":"4615328107052018945","amount":"0.01","network":"AVAXC","coin":"AVAX","depositStatus":1,"travelRuleReqStatus":0,"address":"0x0010627ab66d69232f4080d54e0f838b4dc3894a","addressTag":"","txId":"0xdde578983015741eed764e7ca10defb5a2caafdca3db5f92872d24a96beb1879","transferType":0,"confirmTimes":"12/12","requireQuestionnaire":false,"questionnaire":{"vaspName":"BINANCE","depositOriginator":0},"insertTime":1753053392000}]"#).unwrap_or_else(|_| serde_json::json!({}));
2373 let expected_response : Vec<models::DepositHistoryV2ResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::DepositHistoryV2ResponseInner>");
2374
2375 let resp = client.deposit_history_v2(params).await.expect("Expected a response");
2376 let data_future = resp.data();
2377 let actual_response = data_future.await.unwrap();
2378 assert_eq!(actual_response, expected_response);
2379 });
2380 }
2381
2382 #[test]
2383 fn deposit_history_v2_response_error() {
2384 TOKIO_SHARED_RT.block_on(async {
2385 let client = MockTravelRuleApiClient { force_error: true };
2386
2387 let params = DepositHistoryV2Params::builder().build().unwrap();
2388
2389 match client.deposit_history_v2(params).await {
2390 Ok(_) => panic!("Expected an error"),
2391 Err(err) => {
2392 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2393 }
2394 }
2395 });
2396 }
2397
2398 #[test]
2399 fn fetch_address_verification_list_required_params_success() {
2400 TOKIO_SHARED_RT.block_on(async {
2401 let client = MockTravelRuleApiClient { force_error: false };
2402
2403 let params = FetchAddressVerificationListParams::builder().build().unwrap();
2404
2405 let resp_json: Value = serde_json::from_str(r#"[{"status":"PENDING","token":"AVAX","network":"AVAXC","walletAddress":"0xc03a6aa728a8dde7464c33828424ede7553a0021","addressQuestionnaire":{"sendTo":1,"satoshiToken":"AVAX","isAddressOwner":1,"verifyMethod":1}}]"#).unwrap_or_else(|_| serde_json::json!({}));
2406 let expected_response : Vec<models::FetchAddressVerificationListResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::FetchAddressVerificationListResponseInner>");
2407
2408 let resp = client.fetch_address_verification_list(params).await.expect("Expected a response");
2409 let data_future = resp.data();
2410 let actual_response = data_future.await.unwrap();
2411 assert_eq!(actual_response, expected_response);
2412 });
2413 }
2414
2415 #[test]
2416 fn fetch_address_verification_list_optional_params_success() {
2417 TOKIO_SHARED_RT.block_on(async {
2418 let client = MockTravelRuleApiClient { force_error: false };
2419
2420 let params = FetchAddressVerificationListParams::builder().recv_window(5000).build().unwrap();
2421
2422 let resp_json: Value = serde_json::from_str(r#"[{"status":"PENDING","token":"AVAX","network":"AVAXC","walletAddress":"0xc03a6aa728a8dde7464c33828424ede7553a0021","addressQuestionnaire":{"sendTo":1,"satoshiToken":"AVAX","isAddressOwner":1,"verifyMethod":1}}]"#).unwrap_or_else(|_| serde_json::json!({}));
2423 let expected_response : Vec<models::FetchAddressVerificationListResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::FetchAddressVerificationListResponseInner>");
2424
2425 let resp = client.fetch_address_verification_list(params).await.expect("Expected a response");
2426 let data_future = resp.data();
2427 let actual_response = data_future.await.unwrap();
2428 assert_eq!(actual_response, expected_response);
2429 });
2430 }
2431
2432 #[test]
2433 fn fetch_address_verification_list_response_error() {
2434 TOKIO_SHARED_RT.block_on(async {
2435 let client = MockTravelRuleApiClient { force_error: true };
2436
2437 let params = FetchAddressVerificationListParams::builder()
2438 .build()
2439 .unwrap();
2440
2441 match client.fetch_address_verification_list(params).await {
2442 Ok(_) => panic!("Expected an error"),
2443 Err(err) => {
2444 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2445 }
2446 }
2447 });
2448 }
2449
2450 #[test]
2451 fn get_country_list_required_params_success() {
2452 TOKIO_SHARED_RT.block_on(async {
2453 let client = MockTravelRuleApiClient { force_error: false };
2454
2455 let params = GetCountryListParams::builder().build().unwrap();
2456
2457 let resp_json: Value = serde_json::from_str(r#"{"countries":[{"countryCode":"au","countryName":"Australia","blockType":"supported","depositAllowed":true,"withdrawalAllowed":true,"hasRegionRestrictions":false}],"lastUpdated":1716300000000}"#).unwrap_or_else(|_| serde_json::json!({}));
2458 let expected_response : models::GetCountryListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetCountryListResponse");
2459
2460 let resp = client.get_country_list(params).await.expect("Expected a response");
2461 let data_future = resp.data();
2462 let actual_response = data_future.await.unwrap();
2463 assert_eq!(actual_response, expected_response);
2464 });
2465 }
2466
2467 #[test]
2468 fn get_country_list_optional_params_success() {
2469 TOKIO_SHARED_RT.block_on(async {
2470 let client = MockTravelRuleApiClient { force_error: false };
2471
2472 let params = GetCountryListParams::builder().recv_window(5000).build().unwrap();
2473
2474 let resp_json: Value = serde_json::from_str(r#"{"countries":[{"countryCode":"au","countryName":"Australia","blockType":"supported","depositAllowed":true,"withdrawalAllowed":true,"hasRegionRestrictions":false}],"lastUpdated":1716300000000}"#).unwrap_or_else(|_| serde_json::json!({}));
2475 let expected_response : models::GetCountryListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetCountryListResponse");
2476
2477 let resp = client.get_country_list(params).await.expect("Expected a response");
2478 let data_future = resp.data();
2479 let actual_response = data_future.await.unwrap();
2480 assert_eq!(actual_response, expected_response);
2481 });
2482 }
2483
2484 #[test]
2485 fn get_country_list_response_error() {
2486 TOKIO_SHARED_RT.block_on(async {
2487 let client = MockTravelRuleApiClient { force_error: true };
2488
2489 let params = GetCountryListParams::builder().build().unwrap();
2490
2491 match client.get_country_list(params).await {
2492 Ok(_) => panic!("Expected an error"),
2493 Err(err) => {
2494 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2495 }
2496 }
2497 });
2498 }
2499
2500 #[test]
2501 fn get_region_list_required_params_success() {
2502 TOKIO_SHARED_RT.block_on(async {
2503 let client = MockTravelRuleApiClient { force_error: false };
2504
2505 let params = GetRegionListParams::builder("au".to_string(),).build().unwrap();
2506
2507 let resp_json: Value = serde_json::from_str(r#"{"countryCode":"au","regions":[{"regionName":"New South Wales","blockType":"supported","depositAllowed":true,"withdrawalAllowed":true}],"lastUpdated":1716300000000}"#).unwrap_or_else(|_| serde_json::json!({}));
2508 let expected_response : models::GetRegionListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetRegionListResponse");
2509
2510 let resp = client.get_region_list(params).await.expect("Expected a response");
2511 let data_future = resp.data();
2512 let actual_response = data_future.await.unwrap();
2513 assert_eq!(actual_response, expected_response);
2514 });
2515 }
2516
2517 #[test]
2518 fn get_region_list_optional_params_success() {
2519 TOKIO_SHARED_RT.block_on(async {
2520 let client = MockTravelRuleApiClient { force_error: false };
2521
2522 let params = GetRegionListParams::builder("au".to_string(),).recv_window(5000).build().unwrap();
2523
2524 let resp_json: Value = serde_json::from_str(r#"{"countryCode":"au","regions":[{"regionName":"New South Wales","blockType":"supported","depositAllowed":true,"withdrawalAllowed":true}],"lastUpdated":1716300000000}"#).unwrap_or_else(|_| serde_json::json!({}));
2525 let expected_response : models::GetRegionListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetRegionListResponse");
2526
2527 let resp = client.get_region_list(params).await.expect("Expected a response");
2528 let data_future = resp.data();
2529 let actual_response = data_future.await.unwrap();
2530 assert_eq!(actual_response, expected_response);
2531 });
2532 }
2533
2534 #[test]
2535 fn get_region_list_response_error() {
2536 TOKIO_SHARED_RT.block_on(async {
2537 let client = MockTravelRuleApiClient { force_error: true };
2538
2539 let params = GetRegionListParams::builder("au".to_string())
2540 .build()
2541 .unwrap();
2542
2543 match client.get_region_list(params).await {
2544 Ok(_) => panic!("Expected an error"),
2545 Err(err) => {
2546 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2547 }
2548 }
2549 });
2550 }
2551
2552 #[test]
2553 fn submit_deposit_questionnaire_required_params_success() {
2554 TOKIO_SHARED_RT.block_on(async {
2555 let client = MockTravelRuleApiClient { force_error: false };
2556
2557 let params = SubmitDepositQuestionnaireParams::builder(
2558 "1".to_string(),
2559 1,
2560 "questionnaire_example".to_string(),
2561 "beneficiary_pii_example".to_string(),
2562 )
2563 .build()
2564 .unwrap();
2565
2566 let resp_json: Value = serde_json::from_str(
2567 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2568 )
2569 .unwrap_or_else(|_| serde_json::json!({}));
2570 let expected_response: models::SubmitDepositQuestionnaireResponse =
2571 serde_json::from_value(resp_json.clone())
2572 .expect("should parse into models::SubmitDepositQuestionnaireResponse");
2573
2574 let resp = client
2575 .submit_deposit_questionnaire(params)
2576 .await
2577 .expect("Expected a response");
2578 let data_future = resp.data();
2579 let actual_response = data_future.await.unwrap();
2580 assert_eq!(actual_response, expected_response);
2581 });
2582 }
2583
2584 #[test]
2585 fn submit_deposit_questionnaire_optional_params_success() {
2586 TOKIO_SHARED_RT.block_on(async {
2587 let client = MockTravelRuleApiClient { force_error: false };
2588
2589 let params = SubmitDepositQuestionnaireParams::builder(
2590 "1".to_string(),
2591 1,
2592 "questionnaire_example".to_string(),
2593 "beneficiary_pii_example".to_string(),
2594 )
2595 .network("network_example".to_string())
2596 .coin("BTC".to_string())
2597 .amount(dec!(1.0))
2598 .address("address_example".to_string())
2599 .address_tag("address_tag_example".to_string())
2600 .build()
2601 .unwrap();
2602
2603 let resp_json: Value = serde_json::from_str(
2604 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2605 )
2606 .unwrap_or_else(|_| serde_json::json!({}));
2607 let expected_response: models::SubmitDepositQuestionnaireResponse =
2608 serde_json::from_value(resp_json.clone())
2609 .expect("should parse into models::SubmitDepositQuestionnaireResponse");
2610
2611 let resp = client
2612 .submit_deposit_questionnaire(params)
2613 .await
2614 .expect("Expected a response");
2615 let data_future = resp.data();
2616 let actual_response = data_future.await.unwrap();
2617 assert_eq!(actual_response, expected_response);
2618 });
2619 }
2620
2621 #[test]
2622 fn submit_deposit_questionnaire_response_error() {
2623 TOKIO_SHARED_RT.block_on(async {
2624 let client = MockTravelRuleApiClient { force_error: true };
2625
2626 let params = SubmitDepositQuestionnaireParams::builder(
2627 "1".to_string(),
2628 1,
2629 "questionnaire_example".to_string(),
2630 "beneficiary_pii_example".to_string(),
2631 )
2632 .build()
2633 .unwrap();
2634
2635 match client.submit_deposit_questionnaire(params).await {
2636 Ok(_) => panic!("Expected an error"),
2637 Err(err) => {
2638 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2639 }
2640 }
2641 });
2642 }
2643
2644 #[test]
2645 fn submit_deposit_questionnaire_travel_rule_required_params_success() {
2646 TOKIO_SHARED_RT.block_on(async {
2647 let client = MockTravelRuleApiClient { force_error: false };
2648
2649 let params = SubmitDepositQuestionnaireTravelRuleParams::builder(
2650 1,
2651 "questionnaire_example".to_string(),
2652 )
2653 .build()
2654 .unwrap();
2655
2656 let resp_json: Value = serde_json::from_str(
2657 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2658 )
2659 .unwrap_or_else(|_| serde_json::json!({}));
2660 let expected_response: models::SubmitDepositQuestionnaireTravelRuleResponse =
2661 serde_json::from_value(resp_json.clone()).expect(
2662 "should parse into models::SubmitDepositQuestionnaireTravelRuleResponse",
2663 );
2664
2665 let resp = client
2666 .submit_deposit_questionnaire_travel_rule(params)
2667 .await
2668 .expect("Expected a response");
2669 let data_future = resp.data();
2670 let actual_response = data_future.await.unwrap();
2671 assert_eq!(actual_response, expected_response);
2672 });
2673 }
2674
2675 #[test]
2676 fn submit_deposit_questionnaire_travel_rule_optional_params_success() {
2677 TOKIO_SHARED_RT.block_on(async {
2678 let client = MockTravelRuleApiClient { force_error: false };
2679
2680 let params = SubmitDepositQuestionnaireTravelRuleParams::builder(
2681 1,
2682 "questionnaire_example".to_string(),
2683 )
2684 .build()
2685 .unwrap();
2686
2687 let resp_json: Value = serde_json::from_str(
2688 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2689 )
2690 .unwrap_or_else(|_| serde_json::json!({}));
2691 let expected_response: models::SubmitDepositQuestionnaireTravelRuleResponse =
2692 serde_json::from_value(resp_json.clone()).expect(
2693 "should parse into models::SubmitDepositQuestionnaireTravelRuleResponse",
2694 );
2695
2696 let resp = client
2697 .submit_deposit_questionnaire_travel_rule(params)
2698 .await
2699 .expect("Expected a response");
2700 let data_future = resp.data();
2701 let actual_response = data_future.await.unwrap();
2702 assert_eq!(actual_response, expected_response);
2703 });
2704 }
2705
2706 #[test]
2707 fn submit_deposit_questionnaire_travel_rule_response_error() {
2708 TOKIO_SHARED_RT.block_on(async {
2709 let client = MockTravelRuleApiClient { force_error: true };
2710
2711 let params = SubmitDepositQuestionnaireTravelRuleParams::builder(
2712 1,
2713 "questionnaire_example".to_string(),
2714 )
2715 .build()
2716 .unwrap();
2717
2718 match client
2719 .submit_deposit_questionnaire_travel_rule(params)
2720 .await
2721 {
2722 Ok(_) => panic!("Expected an error"),
2723 Err(err) => {
2724 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2725 }
2726 }
2727 });
2728 }
2729
2730 #[test]
2731 fn submit_deposit_questionnaire_v2_required_params_success() {
2732 TOKIO_SHARED_RT.block_on(async {
2733 let client = MockTravelRuleApiClient { force_error: false };
2734
2735 let params =
2736 SubmitDepositQuestionnaireV2Params::builder(1, "questionnaire_example".to_string())
2737 .build()
2738 .unwrap();
2739
2740 let resp_json: Value = serde_json::from_str(
2741 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2742 )
2743 .unwrap_or_else(|_| serde_json::json!({}));
2744 let expected_response: models::SubmitDepositQuestionnaireV2Response =
2745 serde_json::from_value(resp_json.clone())
2746 .expect("should parse into models::SubmitDepositQuestionnaireV2Response");
2747
2748 let resp = client
2749 .submit_deposit_questionnaire_v2(params)
2750 .await
2751 .expect("Expected a response");
2752 let data_future = resp.data();
2753 let actual_response = data_future.await.unwrap();
2754 assert_eq!(actual_response, expected_response);
2755 });
2756 }
2757
2758 #[test]
2759 fn submit_deposit_questionnaire_v2_optional_params_success() {
2760 TOKIO_SHARED_RT.block_on(async {
2761 let client = MockTravelRuleApiClient { force_error: false };
2762
2763 let params =
2764 SubmitDepositQuestionnaireV2Params::builder(1, "questionnaire_example".to_string())
2765 .build()
2766 .unwrap();
2767
2768 let resp_json: Value = serde_json::from_str(
2769 r#"{"trId":765127651,"accepted":true,"info":"Deposit questionnaire accepted."}"#,
2770 )
2771 .unwrap_or_else(|_| serde_json::json!({}));
2772 let expected_response: models::SubmitDepositQuestionnaireV2Response =
2773 serde_json::from_value(resp_json.clone())
2774 .expect("should parse into models::SubmitDepositQuestionnaireV2Response");
2775
2776 let resp = client
2777 .submit_deposit_questionnaire_v2(params)
2778 .await
2779 .expect("Expected a response");
2780 let data_future = resp.data();
2781 let actual_response = data_future.await.unwrap();
2782 assert_eq!(actual_response, expected_response);
2783 });
2784 }
2785
2786 #[test]
2787 fn submit_deposit_questionnaire_v2_response_error() {
2788 TOKIO_SHARED_RT.block_on(async {
2789 let client = MockTravelRuleApiClient { force_error: true };
2790
2791 let params =
2792 SubmitDepositQuestionnaireV2Params::builder(1, "questionnaire_example".to_string())
2793 .build()
2794 .unwrap();
2795
2796 match client.submit_deposit_questionnaire_v2(params).await {
2797 Ok(_) => panic!("Expected an error"),
2798 Err(err) => {
2799 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2800 }
2801 }
2802 });
2803 }
2804
2805 #[test]
2806 fn vasp_list_required_params_success() {
2807 TOKIO_SHARED_RT.block_on(async {
2808 let client = MockTravelRuleApiClient { force_error: false };
2809
2810 let params = VaspListParams::builder().build().unwrap();
2811
2812 let resp_json: Value = serde_json::from_str(
2813 r#"[{"vaspName":"Binance","vaspCode":"BINANCE","identifier":"xxx"}]"#,
2814 )
2815 .unwrap_or_else(|_| serde_json::json!({}));
2816 let expected_response: Vec<models::VaspListResponseInner> =
2817 serde_json::from_value(resp_json.clone())
2818 .expect("should parse into Vec<models::VaspListResponseInner>");
2819
2820 let resp = client.vasp_list(params).await.expect("Expected a response");
2821 let data_future = resp.data();
2822 let actual_response = data_future.await.unwrap();
2823 assert_eq!(actual_response, expected_response);
2824 });
2825 }
2826
2827 #[test]
2828 fn vasp_list_optional_params_success() {
2829 TOKIO_SHARED_RT.block_on(async {
2830 let client = MockTravelRuleApiClient { force_error: false };
2831
2832 let params = VaspListParams::builder().recv_window(5000).build().unwrap();
2833
2834 let resp_json: Value = serde_json::from_str(
2835 r#"[{"vaspName":"Binance","vaspCode":"BINANCE","identifier":"xxx"}]"#,
2836 )
2837 .unwrap_or_else(|_| serde_json::json!({}));
2838 let expected_response: Vec<models::VaspListResponseInner> =
2839 serde_json::from_value(resp_json.clone())
2840 .expect("should parse into Vec<models::VaspListResponseInner>");
2841
2842 let resp = client.vasp_list(params).await.expect("Expected a response");
2843 let data_future = resp.data();
2844 let actual_response = data_future.await.unwrap();
2845 assert_eq!(actual_response, expected_response);
2846 });
2847 }
2848
2849 #[test]
2850 fn vasp_list_response_error() {
2851 TOKIO_SHARED_RT.block_on(async {
2852 let client = MockTravelRuleApiClient { force_error: true };
2853
2854 let params = VaspListParams::builder().build().unwrap();
2855
2856 match client.vasp_list(params).await {
2857 Ok(_) => panic!("Expected an error"),
2858 Err(err) => {
2859 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2860 }
2861 }
2862 });
2863 }
2864
2865 #[test]
2866 fn withdraw_history_v1_required_params_success() {
2867 TOKIO_SHARED_RT.block_on(async {
2868 let client = MockTravelRuleApiClient { force_error: false };
2869
2870 let params = WithdrawHistoryV1Params::builder().build().unwrap();
2871
2872 let resp_json: Value = serde_json::from_str(r#"[{"id":"b6ae22b3aa844210a7041aee7589627c","trId":1234456,"amount":"8.91000000","transactionFee":"0.004","coin":"USDT","withdrawalStatus":6,"travelRuleStatus":0,"address":"0x94df8b352de7f46f64b01d3666bf6e936e44ce60","txId":"0xb5ef8c13b968a406cc62a93a8bd80f9e9a906ef1b3fcf20a2e48573c17659268","applyTime":"2019-10-12 11:12:02","network":"ETH","transferType":0,"withdrawOrderId":"WITHDRAWtest123","info":"The address is not valid. Please confirm with the recipient","confirmNo":3,"walletType":1,"txKey":"","questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}","completeTime":"2023-03-23 16:52:41"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2873 let expected_response : Vec<models::WithdrawHistoryV1ResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::WithdrawHistoryV1ResponseInner>");
2874
2875 let resp = client.withdraw_history_v1(params).await.expect("Expected a response");
2876 let data_future = resp.data();
2877 let actual_response = data_future.await.unwrap();
2878 assert_eq!(actual_response, expected_response);
2879 });
2880 }
2881
2882 #[test]
2883 fn withdraw_history_v1_optional_params_success() {
2884 TOKIO_SHARED_RT.block_on(async {
2885 let client = MockTravelRuleApiClient { force_error: false };
2886
2887 let params = WithdrawHistoryV1Params::builder().tr_id("1".to_string()).tx_id("1".to_string()).withdraw_order_id("1".to_string()).network("network_example".to_string()).coin("BTC".to_string()).travel_rule_status(0).offset(0).limit(1000).start_time(1623319461670).end_time(1641782889000).recv_window(5000).build().unwrap();
2888
2889 let resp_json: Value = serde_json::from_str(r#"[{"id":"b6ae22b3aa844210a7041aee7589627c","trId":1234456,"amount":"8.91000000","transactionFee":"0.004","coin":"USDT","withdrawalStatus":6,"travelRuleStatus":0,"address":"0x94df8b352de7f46f64b01d3666bf6e936e44ce60","txId":"0xb5ef8c13b968a406cc62a93a8bd80f9e9a906ef1b3fcf20a2e48573c17659268","applyTime":"2019-10-12 11:12:02","network":"ETH","transferType":0,"withdrawOrderId":"WITHDRAWtest123","info":"The address is not valid. Please confirm with the recipient","confirmNo":3,"walletType":1,"txKey":"","questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}","completeTime":"2023-03-23 16:52:41"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2890 let expected_response : Vec<models::WithdrawHistoryV1ResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::WithdrawHistoryV1ResponseInner>");
2891
2892 let resp = client.withdraw_history_v1(params).await.expect("Expected a response");
2893 let data_future = resp.data();
2894 let actual_response = data_future.await.unwrap();
2895 assert_eq!(actual_response, expected_response);
2896 });
2897 }
2898
2899 #[test]
2900 fn withdraw_history_v1_response_error() {
2901 TOKIO_SHARED_RT.block_on(async {
2902 let client = MockTravelRuleApiClient { force_error: true };
2903
2904 let params = WithdrawHistoryV1Params::builder().build().unwrap();
2905
2906 match client.withdraw_history_v1(params).await {
2907 Ok(_) => panic!("Expected an error"),
2908 Err(err) => {
2909 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2910 }
2911 }
2912 });
2913 }
2914
2915 #[test]
2916 fn withdraw_history_v2_required_params_success() {
2917 TOKIO_SHARED_RT.block_on(async {
2918 let client = MockTravelRuleApiClient { force_error: false };
2919
2920 let params = WithdrawHistoryV2Params::builder().build().unwrap();
2921
2922 let resp_json: Value = serde_json::from_str(r#"[{"id":"b6ae22b3aa844210a7041aee7589627c","trId":1234456,"amount":"8.91000000","transactionFee":"0.004","coin":"USDT","withdrawalStatus":6,"travelRuleStatus":0,"address":"0x94df8b352de7f46f64b01d3666bf6e936e44ce60","txId":"0xb5ef8c13b968a406cc62a93a8bd80f9e9a906ef1b3fcf20a2e48573c17659268","applyTime":"2019-10-12 11:12:02","network":"ETH","transferType":0,"withdrawOrderId":"WITHDRAWtest123","info":"The address is not valid. Please confirm with the recipient","confirmNo":3,"walletType":1,"txKey":"","questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}","completeTime":"2023-03-23 16:52:41"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2923 let expected_response : Vec<models::WithdrawHistoryV1ResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::WithdrawHistoryV1ResponseInner>");
2924
2925 let resp = client.withdraw_history_v2(params).await.expect("Expected a response");
2926 let data_future = resp.data();
2927 let actual_response = data_future.await.unwrap();
2928 assert_eq!(actual_response, expected_response);
2929 });
2930 }
2931
2932 #[test]
2933 fn withdraw_history_v2_optional_params_success() {
2934 TOKIO_SHARED_RT.block_on(async {
2935 let client = MockTravelRuleApiClient { force_error: false };
2936
2937 let params = WithdrawHistoryV2Params::builder().tr_id("1".to_string()).tx_id("1".to_string()).withdraw_order_id("1".to_string()).network("network_example".to_string()).coin("coin_example".to_string()).travel_rule_status(0).offset(0).limit(1000).start_time(1623319461670).end_time(1641782889000).recv_window(5000).build().unwrap();
2938
2939 let resp_json: Value = serde_json::from_str(r#"[{"id":"b6ae22b3aa844210a7041aee7589627c","trId":1234456,"amount":"8.91000000","transactionFee":"0.004","coin":"USDT","withdrawalStatus":6,"travelRuleStatus":0,"address":"0x94df8b352de7f46f64b01d3666bf6e936e44ce60","txId":"0xb5ef8c13b968a406cc62a93a8bd80f9e9a906ef1b3fcf20a2e48573c17659268","applyTime":"2019-10-12 11:12:02","network":"ETH","transferType":0,"withdrawOrderId":"WITHDRAWtest123","info":"The address is not valid. Please confirm with the recipient","confirmNo":3,"walletType":1,"txKey":"","questionnaire":"{\"question1\":\"answer1\",\"question2\":\"answer2\"}","completeTime":"2023-03-23 16:52:41"}]"#).unwrap_or_else(|_| serde_json::json!({}));
2940 let expected_response : Vec<models::WithdrawHistoryV1ResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::WithdrawHistoryV1ResponseInner>");
2941
2942 let resp = client.withdraw_history_v2(params).await.expect("Expected a response");
2943 let data_future = resp.data();
2944 let actual_response = data_future.await.unwrap();
2945 assert_eq!(actual_response, expected_response);
2946 });
2947 }
2948
2949 #[test]
2950 fn withdraw_history_v2_response_error() {
2951 TOKIO_SHARED_RT.block_on(async {
2952 let client = MockTravelRuleApiClient { force_error: true };
2953
2954 let params = WithdrawHistoryV2Params::builder().build().unwrap();
2955
2956 match client.withdraw_history_v2(params).await {
2957 Ok(_) => panic!("Expected an error"),
2958 Err(err) => {
2959 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2960 }
2961 }
2962 });
2963 }
2964
2965 #[test]
2966 fn withdraw_travel_rule_required_params_success() {
2967 TOKIO_SHARED_RT.block_on(async {
2968 let client = MockTravelRuleApiClient { force_error: false };
2969
2970 let params = WithdrawTravelRuleParams::builder(
2971 "BTC".to_string(),
2972 "address_example".to_string(),
2973 dec!(1.0),
2974 "questionnaire_example".to_string(),
2975 )
2976 .build()
2977 .unwrap();
2978
2979 let resp_json: Value = serde_json::from_str(
2980 r#"{"trId":123456,"accepted":true,"info":"Withdraw request accepted"}"#,
2981 )
2982 .unwrap_or_else(|_| serde_json::json!({}));
2983 let expected_response: models::WithdrawTravelRuleResponse =
2984 serde_json::from_value(resp_json.clone())
2985 .expect("should parse into models::WithdrawTravelRuleResponse");
2986
2987 let resp = client
2988 .withdraw_travel_rule(params)
2989 .await
2990 .expect("Expected a response");
2991 let data_future = resp.data();
2992 let actual_response = data_future.await.unwrap();
2993 assert_eq!(actual_response, expected_response);
2994 });
2995 }
2996
2997 #[test]
2998 fn withdraw_travel_rule_optional_params_success() {
2999 TOKIO_SHARED_RT.block_on(async {
3000 let client = MockTravelRuleApiClient { force_error: false };
3001
3002 let params = WithdrawTravelRuleParams::builder(
3003 "BTC".to_string(),
3004 "address_example".to_string(),
3005 dec!(1.0),
3006 "questionnaire_example".to_string(),
3007 )
3008 .withdraw_order_id("1".to_string())
3009 .network("network_example".to_string())
3010 .address_tag("address_tag_example".to_string())
3011 .transaction_fee_flag(true)
3012 .name("name_example".to_string())
3013 .wallet_type(0)
3014 .recv_window(5000)
3015 .build()
3016 .unwrap();
3017
3018 let resp_json: Value = serde_json::from_str(
3019 r#"{"trId":123456,"accepted":true,"info":"Withdraw request accepted"}"#,
3020 )
3021 .unwrap_or_else(|_| serde_json::json!({}));
3022 let expected_response: models::WithdrawTravelRuleResponse =
3023 serde_json::from_value(resp_json.clone())
3024 .expect("should parse into models::WithdrawTravelRuleResponse");
3025
3026 let resp = client
3027 .withdraw_travel_rule(params)
3028 .await
3029 .expect("Expected a response");
3030 let data_future = resp.data();
3031 let actual_response = data_future.await.unwrap();
3032 assert_eq!(actual_response, expected_response);
3033 });
3034 }
3035
3036 #[test]
3037 fn withdraw_travel_rule_response_error() {
3038 TOKIO_SHARED_RT.block_on(async {
3039 let client = MockTravelRuleApiClient { force_error: true };
3040
3041 let params = WithdrawTravelRuleParams::builder(
3042 "BTC".to_string(),
3043 "address_example".to_string(),
3044 dec!(1.0),
3045 "questionnaire_example".to_string(),
3046 )
3047 .build()
3048 .unwrap();
3049
3050 match client.withdraw_travel_rule(params).await {
3051 Ok(_) => panic!("Expected an error"),
3052 Err(err) => {
3053 assert_eq!(err.to_string(), "Connector client error: ResponseError");
3054 }
3055 }
3056 });
3057 }
3058}