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