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::sub_account::rest_api::models;
29
30const HAS_TIME_UNIT: bool = false;
31
32#[async_trait]
33pub trait ManagedSubAccountApi: Send + Sync {
34 async fn deposit_assets_into_the_managed_sub_account(
35 &self,
36 params: DepositAssetsIntoTheManagedSubAccountParams,
37 ) -> anyhow::Result<RestApiResponse<models::DepositAssetsIntoTheManagedSubAccountResponse>>;
38 async fn get_managed_sub_account_deposit_address(
39 &self,
40 params: GetManagedSubAccountDepositAddressParams,
41 ) -> anyhow::Result<RestApiResponse<models::GetManagedSubAccountDepositAddressResponse>>;
42 async fn query_managed_sub_account_asset_details(
43 &self,
44 params: QueryManagedSubAccountAssetDetailsParams,
45 ) -> anyhow::Result<RestApiResponse<Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>>>;
46 async fn query_managed_sub_account_futures_asset_details(
47 &self,
48 params: QueryManagedSubAccountFuturesAssetDetailsParams,
49 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountFuturesAssetDetailsResponse>>;
50 async fn query_managed_sub_account_list(
51 &self,
52 params: QueryManagedSubAccountListParams,
53 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountListResponse>>;
54 async fn query_managed_sub_account_margin_asset_details(
55 &self,
56 params: QueryManagedSubAccountMarginAssetDetailsParams,
57 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountMarginAssetDetailsResponse>>;
58 async fn query_managed_sub_account_snapshot(
59 &self,
60 params: QueryManagedSubAccountSnapshotParams,
61 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountSnapshotResponse>>;
62 async fn query_managed_sub_account_transfer_log_master_account_investor(
63 &self,
64 params: QueryManagedSubAccountTransferLogMasterAccountInvestorParams,
65 ) -> anyhow::Result<
66 RestApiResponse<models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse>,
67 >;
68 async fn query_managed_sub_account_transfer_log_master_account_trading(
69 &self,
70 params: QueryManagedSubAccountTransferLogMasterAccountTradingParams,
71 ) -> anyhow::Result<
72 RestApiResponse<models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse>,
73 >;
74 async fn query_managed_sub_account_transfer_log_sub_account_trading(
75 &self,
76 params: QueryManagedSubAccountTransferLogSubAccountTradingParams,
77 ) -> anyhow::Result<
78 RestApiResponse<models::QueryManagedSubAccountTransferLogSubAccountTradingResponse>,
79 >;
80 async fn withdrawl_assets_from_the_managed_sub_account(
81 &self,
82 params: WithdrawlAssetsFromTheManagedSubAccountParams,
83 ) -> anyhow::Result<RestApiResponse<models::WithdrawlAssetsFromTheManagedSubAccountResponse>>;
84}
85
86#[derive(Debug, Clone)]
87pub struct ManagedSubAccountApiClient {
88 configuration: ConfigurationRestApi,
89}
90
91impl ManagedSubAccountApiClient {
92 pub fn new(configuration: ConfigurationRestApi) -> Self {
93 Self { configuration }
94 }
95}
96
97#[derive(Clone, Debug, Builder)]
102#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
103pub struct DepositAssetsIntoTheManagedSubAccountParams {
104 #[builder(setter(into))]
109 pub to_email: String,
110 #[builder(setter(into))]
115 pub asset: String,
116 #[builder(setter(into))]
121 pub amount: rust_decimal::Decimal,
122 #[builder(setter(into), default)]
127 pub recv_window: Option<i64>,
128}
129
130impl DepositAssetsIntoTheManagedSubAccountParams {
131 #[must_use]
140 pub fn builder(
141 to_email: String,
142 asset: String,
143 amount: rust_decimal::Decimal,
144 ) -> DepositAssetsIntoTheManagedSubAccountParamsBuilder {
145 DepositAssetsIntoTheManagedSubAccountParamsBuilder::default()
146 .to_email(to_email)
147 .asset(asset)
148 .amount(amount)
149 }
150}
151#[derive(Clone, Debug, Builder)]
156#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
157pub struct GetManagedSubAccountDepositAddressParams {
158 #[builder(setter(into))]
162 pub email: String,
163 #[builder(setter(into))]
168 pub coin: String,
169 #[builder(setter(into), default)]
173 pub network: Option<String>,
174 #[builder(setter(into), default)]
179 pub amount: Option<rust_decimal::Decimal>,
180 #[builder(setter(into), default)]
185 pub recv_window: Option<i64>,
186}
187
188impl GetManagedSubAccountDepositAddressParams {
189 #[must_use]
197 pub fn builder(email: String, coin: String) -> GetManagedSubAccountDepositAddressParamsBuilder {
198 GetManagedSubAccountDepositAddressParamsBuilder::default()
199 .email(email)
200 .coin(coin)
201 }
202}
203#[derive(Clone, Debug, Builder)]
208#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
209pub struct QueryManagedSubAccountAssetDetailsParams {
210 #[builder(setter(into))]
214 pub email: String,
215 #[builder(setter(into), default)]
220 pub recv_window: Option<i64>,
221}
222
223impl QueryManagedSubAccountAssetDetailsParams {
224 #[must_use]
231 pub fn builder(email: String) -> QueryManagedSubAccountAssetDetailsParamsBuilder {
232 QueryManagedSubAccountAssetDetailsParamsBuilder::default().email(email)
233 }
234}
235#[derive(Clone, Debug, Builder)]
240#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
241pub struct QueryManagedSubAccountFuturesAssetDetailsParams {
242 #[builder(setter(into))]
246 pub email: String,
247 #[builder(setter(into), default)]
251 pub account_type: Option<String>,
252}
253
254impl QueryManagedSubAccountFuturesAssetDetailsParams {
255 #[must_use]
262 pub fn builder(email: String) -> QueryManagedSubAccountFuturesAssetDetailsParamsBuilder {
263 QueryManagedSubAccountFuturesAssetDetailsParamsBuilder::default().email(email)
264 }
265}
266#[derive(Clone, Debug, Builder, Default)]
271#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
272pub struct QueryManagedSubAccountListParams {
273 #[builder(setter(into), default)]
277 pub email: Option<String>,
278 #[builder(setter(into), default)]
282 pub page: Option<i64>,
283 #[builder(setter(into), default)]
287 pub limit: Option<i64>,
288 #[builder(setter(into), default)]
293 pub recv_window: Option<i64>,
294}
295
296impl QueryManagedSubAccountListParams {
297 #[must_use]
300 pub fn builder() -> QueryManagedSubAccountListParamsBuilder {
301 QueryManagedSubAccountListParamsBuilder::default()
302 }
303}
304#[derive(Clone, Debug, Builder)]
309#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
310pub struct QueryManagedSubAccountMarginAssetDetailsParams {
311 #[builder(setter(into))]
315 pub email: String,
316 #[builder(setter(into), default)]
320 pub account_type: Option<String>,
321}
322
323impl QueryManagedSubAccountMarginAssetDetailsParams {
324 #[must_use]
331 pub fn builder(email: String) -> QueryManagedSubAccountMarginAssetDetailsParamsBuilder {
332 QueryManagedSubAccountMarginAssetDetailsParamsBuilder::default().email(email)
333 }
334}
335#[derive(Clone, Debug, Builder)]
340#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
341pub struct QueryManagedSubAccountSnapshotParams {
342 #[builder(setter(into))]
346 pub email: String,
347 #[builder(setter(into))]
351 pub r#type: String,
352 #[builder(setter(into), default)]
357 pub start_time: Option<i64>,
358 #[builder(setter(into), default)]
363 pub end_time: Option<i64>,
364 #[builder(setter(into), default)]
368 pub limit: Option<i64>,
369 #[builder(setter(into), default)]
374 pub recv_window: Option<i64>,
375}
376
377impl QueryManagedSubAccountSnapshotParams {
378 #[must_use]
386 pub fn builder(email: String, r#type: String) -> QueryManagedSubAccountSnapshotParamsBuilder {
387 QueryManagedSubAccountSnapshotParamsBuilder::default()
388 .email(email)
389 .r#type(r#type)
390 }
391}
392#[derive(Clone, Debug, Builder)]
397#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
398pub struct QueryManagedSubAccountTransferLogMasterAccountInvestorParams {
399 #[builder(setter(into))]
403 pub email: String,
404 #[builder(setter(into))]
408 pub start_time: i64,
409 #[builder(setter(into))]
413 pub end_time: i64,
414 #[builder(setter(into))]
418 pub page: i64,
419 #[builder(setter(into))]
423 pub limit: i64,
424 #[builder(setter(into), default)]
428 pub transfers: Option<String>,
429 #[builder(setter(into), default)]
433 pub transfer_function_account_type: Option<String>,
434}
435
436impl QueryManagedSubAccountTransferLogMasterAccountInvestorParams {
437 #[must_use]
448 pub fn builder(
449 email: String,
450 start_time: i64,
451 end_time: i64,
452 page: i64,
453 limit: i64,
454 ) -> QueryManagedSubAccountTransferLogMasterAccountInvestorParamsBuilder {
455 QueryManagedSubAccountTransferLogMasterAccountInvestorParamsBuilder::default()
456 .email(email)
457 .start_time(start_time)
458 .end_time(end_time)
459 .page(page)
460 .limit(limit)
461 }
462}
463#[derive(Clone, Debug, Builder)]
468#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
469pub struct QueryManagedSubAccountTransferLogMasterAccountTradingParams {
470 #[builder(setter(into))]
474 pub email: String,
475 #[builder(setter(into))]
479 pub start_time: i64,
480 #[builder(setter(into))]
484 pub end_time: i64,
485 #[builder(setter(into))]
489 pub page: i64,
490 #[builder(setter(into))]
494 pub limit: i64,
495 #[builder(setter(into), default)]
499 pub transfers: Option<String>,
500 #[builder(setter(into), default)]
504 pub transfer_function_account_type: Option<String>,
505}
506
507impl QueryManagedSubAccountTransferLogMasterAccountTradingParams {
508 #[must_use]
519 pub fn builder(
520 email: String,
521 start_time: i64,
522 end_time: i64,
523 page: i64,
524 limit: i64,
525 ) -> QueryManagedSubAccountTransferLogMasterAccountTradingParamsBuilder {
526 QueryManagedSubAccountTransferLogMasterAccountTradingParamsBuilder::default()
527 .email(email)
528 .start_time(start_time)
529 .end_time(end_time)
530 .page(page)
531 .limit(limit)
532 }
533}
534#[derive(Clone, Debug, Builder)]
539#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
540pub struct QueryManagedSubAccountTransferLogSubAccountTradingParams {
541 #[builder(setter(into))]
545 pub start_time: i64,
546 #[builder(setter(into))]
550 pub end_time: i64,
551 #[builder(setter(into))]
555 pub page: i64,
556 #[builder(setter(into))]
560 pub limit: i64,
561 #[builder(setter(into), default)]
565 pub transfers: Option<String>,
566 #[builder(setter(into), default)]
570 pub transfer_function_account_type: Option<String>,
571 #[builder(setter(into), default)]
576 pub recv_window: Option<i64>,
577}
578
579impl QueryManagedSubAccountTransferLogSubAccountTradingParams {
580 #[must_use]
590 pub fn builder(
591 start_time: i64,
592 end_time: i64,
593 page: i64,
594 limit: i64,
595 ) -> QueryManagedSubAccountTransferLogSubAccountTradingParamsBuilder {
596 QueryManagedSubAccountTransferLogSubAccountTradingParamsBuilder::default()
597 .start_time(start_time)
598 .end_time(end_time)
599 .page(page)
600 .limit(limit)
601 }
602}
603#[derive(Clone, Debug, Builder)]
608#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
609pub struct WithdrawlAssetsFromTheManagedSubAccountParams {
610 #[builder(setter(into))]
615 pub from_email: String,
616 #[builder(setter(into))]
621 pub asset: String,
622 #[builder(setter(into))]
627 pub amount: rust_decimal::Decimal,
628 #[builder(setter(into), default)]
632 pub transfer_date: Option<i64>,
633 #[builder(setter(into), default)]
638 pub recv_window: Option<i64>,
639}
640
641impl WithdrawlAssetsFromTheManagedSubAccountParams {
642 #[must_use]
651 pub fn builder(
652 from_email: String,
653 asset: String,
654 amount: rust_decimal::Decimal,
655 ) -> WithdrawlAssetsFromTheManagedSubAccountParamsBuilder {
656 WithdrawlAssetsFromTheManagedSubAccountParamsBuilder::default()
657 .from_email(from_email)
658 .asset(asset)
659 .amount(amount)
660 }
661}
662
663#[async_trait]
664impl ManagedSubAccountApi for ManagedSubAccountApiClient {
665 async fn deposit_assets_into_the_managed_sub_account(
666 &self,
667 params: DepositAssetsIntoTheManagedSubAccountParams,
668 ) -> anyhow::Result<RestApiResponse<models::DepositAssetsIntoTheManagedSubAccountResponse>>
669 {
670 let DepositAssetsIntoTheManagedSubAccountParams {
671 to_email,
672 asset,
673 amount,
674 recv_window,
675 } = params;
676
677 let mut query_params = BTreeMap::new();
678 let body_params = BTreeMap::new();
679
680 query_params.insert("toEmail".to_string(), json!(to_email));
681
682 query_params.insert("asset".to_string(), json!(asset));
683
684 query_params.insert("amount".to_string(), json!(amount));
685
686 if let Some(rw) = recv_window {
687 query_params.insert("recvWindow".to_string(), json!(rw));
688 }
689
690 send_request::<models::DepositAssetsIntoTheManagedSubAccountResponse>(
691 &self.configuration,
692 "/sapi/v1/managed-subaccount/deposit",
693 reqwest::Method::POST,
694 query_params,
695 body_params,
696 if HAS_TIME_UNIT {
697 self.configuration.time_unit
698 } else {
699 None
700 },
701 true,
702 )
703 .await
704 }
705
706 async fn get_managed_sub_account_deposit_address(
707 &self,
708 params: GetManagedSubAccountDepositAddressParams,
709 ) -> anyhow::Result<RestApiResponse<models::GetManagedSubAccountDepositAddressResponse>> {
710 let GetManagedSubAccountDepositAddressParams {
711 email,
712 coin,
713 network,
714 amount,
715 recv_window,
716 } = params;
717
718 let mut query_params = BTreeMap::new();
719 let body_params = BTreeMap::new();
720
721 query_params.insert("email".to_string(), json!(email));
722
723 query_params.insert("coin".to_string(), json!(coin));
724
725 if let Some(rw) = network {
726 query_params.insert("network".to_string(), json!(rw));
727 }
728
729 if let Some(rw) = amount {
730 query_params.insert("amount".to_string(), json!(rw));
731 }
732
733 if let Some(rw) = recv_window {
734 query_params.insert("recvWindow".to_string(), json!(rw));
735 }
736
737 send_request::<models::GetManagedSubAccountDepositAddressResponse>(
738 &self.configuration,
739 "/sapi/v1/managed-subaccount/deposit/address",
740 reqwest::Method::GET,
741 query_params,
742 body_params,
743 if HAS_TIME_UNIT {
744 self.configuration.time_unit
745 } else {
746 None
747 },
748 true,
749 )
750 .await
751 }
752
753 async fn query_managed_sub_account_asset_details(
754 &self,
755 params: QueryManagedSubAccountAssetDetailsParams,
756 ) -> anyhow::Result<RestApiResponse<Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>>>
757 {
758 let QueryManagedSubAccountAssetDetailsParams { email, recv_window } = params;
759
760 let mut query_params = BTreeMap::new();
761 let body_params = BTreeMap::new();
762
763 query_params.insert("email".to_string(), json!(email));
764
765 if let Some(rw) = recv_window {
766 query_params.insert("recvWindow".to_string(), json!(rw));
767 }
768
769 send_request::<Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>>(
770 &self.configuration,
771 "/sapi/v1/managed-subaccount/asset",
772 reqwest::Method::GET,
773 query_params,
774 body_params,
775 if HAS_TIME_UNIT {
776 self.configuration.time_unit
777 } else {
778 None
779 },
780 true,
781 )
782 .await
783 }
784
785 async fn query_managed_sub_account_futures_asset_details(
786 &self,
787 params: QueryManagedSubAccountFuturesAssetDetailsParams,
788 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountFuturesAssetDetailsResponse>>
789 {
790 let QueryManagedSubAccountFuturesAssetDetailsParams {
791 email,
792 account_type,
793 } = params;
794
795 let mut query_params = BTreeMap::new();
796 let body_params = BTreeMap::new();
797
798 query_params.insert("email".to_string(), json!(email));
799
800 if let Some(rw) = account_type {
801 query_params.insert("accountType".to_string(), json!(rw));
802 }
803
804 send_request::<models::QueryManagedSubAccountFuturesAssetDetailsResponse>(
805 &self.configuration,
806 "/sapi/v1/managed-subaccount/fetch-future-asset",
807 reqwest::Method::GET,
808 query_params,
809 body_params,
810 if HAS_TIME_UNIT {
811 self.configuration.time_unit
812 } else {
813 None
814 },
815 true,
816 )
817 .await
818 }
819
820 async fn query_managed_sub_account_list(
821 &self,
822 params: QueryManagedSubAccountListParams,
823 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountListResponse>> {
824 let QueryManagedSubAccountListParams {
825 email,
826 page,
827 limit,
828 recv_window,
829 } = params;
830
831 let mut query_params = BTreeMap::new();
832 let body_params = BTreeMap::new();
833
834 if let Some(rw) = email {
835 query_params.insert("email".to_string(), json!(rw));
836 }
837
838 if let Some(rw) = page {
839 query_params.insert("page".to_string(), json!(rw));
840 }
841
842 if let Some(rw) = limit {
843 query_params.insert("limit".to_string(), json!(rw));
844 }
845
846 if let Some(rw) = recv_window {
847 query_params.insert("recvWindow".to_string(), json!(rw));
848 }
849
850 send_request::<models::QueryManagedSubAccountListResponse>(
851 &self.configuration,
852 "/sapi/v1/managed-subaccount/info",
853 reqwest::Method::GET,
854 query_params,
855 body_params,
856 if HAS_TIME_UNIT {
857 self.configuration.time_unit
858 } else {
859 None
860 },
861 true,
862 )
863 .await
864 }
865
866 async fn query_managed_sub_account_margin_asset_details(
867 &self,
868 params: QueryManagedSubAccountMarginAssetDetailsParams,
869 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountMarginAssetDetailsResponse>>
870 {
871 let QueryManagedSubAccountMarginAssetDetailsParams {
872 email,
873 account_type,
874 } = params;
875
876 let mut query_params = BTreeMap::new();
877 let body_params = BTreeMap::new();
878
879 query_params.insert("email".to_string(), json!(email));
880
881 if let Some(rw) = account_type {
882 query_params.insert("accountType".to_string(), json!(rw));
883 }
884
885 send_request::<models::QueryManagedSubAccountMarginAssetDetailsResponse>(
886 &self.configuration,
887 "/sapi/v1/managed-subaccount/marginAsset",
888 reqwest::Method::GET,
889 query_params,
890 body_params,
891 if HAS_TIME_UNIT {
892 self.configuration.time_unit
893 } else {
894 None
895 },
896 true,
897 )
898 .await
899 }
900
901 async fn query_managed_sub_account_snapshot(
902 &self,
903 params: QueryManagedSubAccountSnapshotParams,
904 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountSnapshotResponse>> {
905 let QueryManagedSubAccountSnapshotParams {
906 email,
907 r#type,
908 start_time,
909 end_time,
910 limit,
911 recv_window,
912 } = params;
913
914 let mut query_params = BTreeMap::new();
915 let body_params = BTreeMap::new();
916
917 query_params.insert("email".to_string(), json!(email));
918
919 query_params.insert("type".to_string(), json!(r#type));
920
921 if let Some(rw) = start_time {
922 query_params.insert("startTime".to_string(), json!(rw));
923 }
924
925 if let Some(rw) = end_time {
926 query_params.insert("endTime".to_string(), json!(rw));
927 }
928
929 if let Some(rw) = limit {
930 query_params.insert("limit".to_string(), json!(rw));
931 }
932
933 if let Some(rw) = recv_window {
934 query_params.insert("recvWindow".to_string(), json!(rw));
935 }
936
937 send_request::<models::QueryManagedSubAccountSnapshotResponse>(
938 &self.configuration,
939 "/sapi/v1/managed-subaccount/accountSnapshot",
940 reqwest::Method::GET,
941 query_params,
942 body_params,
943 if HAS_TIME_UNIT {
944 self.configuration.time_unit
945 } else {
946 None
947 },
948 true,
949 )
950 .await
951 }
952
953 async fn query_managed_sub_account_transfer_log_master_account_investor(
954 &self,
955 params: QueryManagedSubAccountTransferLogMasterAccountInvestorParams,
956 ) -> anyhow::Result<
957 RestApiResponse<models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse>,
958 > {
959 let QueryManagedSubAccountTransferLogMasterAccountInvestorParams {
960 email,
961 start_time,
962 end_time,
963 page,
964 limit,
965 transfers,
966 transfer_function_account_type,
967 } = params;
968
969 let mut query_params = BTreeMap::new();
970 let body_params = BTreeMap::new();
971
972 query_params.insert("email".to_string(), json!(email));
973
974 query_params.insert("startTime".to_string(), json!(start_time));
975
976 query_params.insert("endTime".to_string(), json!(end_time));
977
978 query_params.insert("page".to_string(), json!(page));
979
980 query_params.insert("limit".to_string(), json!(limit));
981
982 if let Some(rw) = transfers {
983 query_params.insert("transfers".to_string(), json!(rw));
984 }
985
986 if let Some(rw) = transfer_function_account_type {
987 query_params.insert("transferFunctionAccountType".to_string(), json!(rw));
988 }
989
990 send_request::<models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse>(
991 &self.configuration,
992 "/sapi/v1/managed-subaccount/queryTransLogForInvestor",
993 reqwest::Method::GET,
994 query_params,
995 body_params,
996 if HAS_TIME_UNIT {
997 self.configuration.time_unit
998 } else {
999 None
1000 },
1001 true,
1002 )
1003 .await
1004 }
1005
1006 async fn query_managed_sub_account_transfer_log_master_account_trading(
1007 &self,
1008 params: QueryManagedSubAccountTransferLogMasterAccountTradingParams,
1009 ) -> anyhow::Result<
1010 RestApiResponse<models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse>,
1011 > {
1012 let QueryManagedSubAccountTransferLogMasterAccountTradingParams {
1013 email,
1014 start_time,
1015 end_time,
1016 page,
1017 limit,
1018 transfers,
1019 transfer_function_account_type,
1020 } = params;
1021
1022 let mut query_params = BTreeMap::new();
1023 let body_params = BTreeMap::new();
1024
1025 query_params.insert("email".to_string(), json!(email));
1026
1027 query_params.insert("startTime".to_string(), json!(start_time));
1028
1029 query_params.insert("endTime".to_string(), json!(end_time));
1030
1031 query_params.insert("page".to_string(), json!(page));
1032
1033 query_params.insert("limit".to_string(), json!(limit));
1034
1035 if let Some(rw) = transfers {
1036 query_params.insert("transfers".to_string(), json!(rw));
1037 }
1038
1039 if let Some(rw) = transfer_function_account_type {
1040 query_params.insert("transferFunctionAccountType".to_string(), json!(rw));
1041 }
1042
1043 send_request::<models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse>(
1044 &self.configuration,
1045 "/sapi/v1/managed-subaccount/queryTransLogForTradeParent",
1046 reqwest::Method::GET,
1047 query_params,
1048 body_params,
1049 if HAS_TIME_UNIT {
1050 self.configuration.time_unit
1051 } else {
1052 None
1053 },
1054 true,
1055 )
1056 .await
1057 }
1058
1059 async fn query_managed_sub_account_transfer_log_sub_account_trading(
1060 &self,
1061 params: QueryManagedSubAccountTransferLogSubAccountTradingParams,
1062 ) -> anyhow::Result<
1063 RestApiResponse<models::QueryManagedSubAccountTransferLogSubAccountTradingResponse>,
1064 > {
1065 let QueryManagedSubAccountTransferLogSubAccountTradingParams {
1066 start_time,
1067 end_time,
1068 page,
1069 limit,
1070 transfers,
1071 transfer_function_account_type,
1072 recv_window,
1073 } = params;
1074
1075 let mut query_params = BTreeMap::new();
1076 let body_params = BTreeMap::new();
1077
1078 query_params.insert("startTime".to_string(), json!(start_time));
1079
1080 query_params.insert("endTime".to_string(), json!(end_time));
1081
1082 query_params.insert("page".to_string(), json!(page));
1083
1084 query_params.insert("limit".to_string(), json!(limit));
1085
1086 if let Some(rw) = transfers {
1087 query_params.insert("transfers".to_string(), json!(rw));
1088 }
1089
1090 if let Some(rw) = transfer_function_account_type {
1091 query_params.insert("transferFunctionAccountType".to_string(), json!(rw));
1092 }
1093
1094 if let Some(rw) = recv_window {
1095 query_params.insert("recvWindow".to_string(), json!(rw));
1096 }
1097
1098 send_request::<models::QueryManagedSubAccountTransferLogSubAccountTradingResponse>(
1099 &self.configuration,
1100 "/sapi/v1/managed-subaccount/query-trans-log",
1101 reqwest::Method::GET,
1102 query_params,
1103 body_params,
1104 if HAS_TIME_UNIT {
1105 self.configuration.time_unit
1106 } else {
1107 None
1108 },
1109 true,
1110 )
1111 .await
1112 }
1113
1114 async fn withdrawl_assets_from_the_managed_sub_account(
1115 &self,
1116 params: WithdrawlAssetsFromTheManagedSubAccountParams,
1117 ) -> anyhow::Result<RestApiResponse<models::WithdrawlAssetsFromTheManagedSubAccountResponse>>
1118 {
1119 let WithdrawlAssetsFromTheManagedSubAccountParams {
1120 from_email,
1121 asset,
1122 amount,
1123 transfer_date,
1124 recv_window,
1125 } = params;
1126
1127 let mut query_params = BTreeMap::new();
1128 let body_params = BTreeMap::new();
1129
1130 query_params.insert("fromEmail".to_string(), json!(from_email));
1131
1132 query_params.insert("asset".to_string(), json!(asset));
1133
1134 query_params.insert("amount".to_string(), json!(amount));
1135
1136 if let Some(rw) = transfer_date {
1137 query_params.insert("transferDate".to_string(), json!(rw));
1138 }
1139
1140 if let Some(rw) = recv_window {
1141 query_params.insert("recvWindow".to_string(), json!(rw));
1142 }
1143
1144 send_request::<models::WithdrawlAssetsFromTheManagedSubAccountResponse>(
1145 &self.configuration,
1146 "/sapi/v1/managed-subaccount/withdraw",
1147 reqwest::Method::POST,
1148 query_params,
1149 body_params,
1150 if HAS_TIME_UNIT {
1151 self.configuration.time_unit
1152 } else {
1153 None
1154 },
1155 true,
1156 )
1157 .await
1158 }
1159}
1160
1161#[cfg(all(test, feature = "sub_account"))]
1162mod tests {
1163 use super::*;
1164 use crate::TOKIO_SHARED_RT;
1165 use crate::{errors::ConnectorError, models::DataFuture, models::RestApiRateLimit};
1166 use async_trait::async_trait;
1167 use std::collections::HashMap;
1168
1169 struct DummyRestApiResponse<T> {
1170 inner: Box<dyn FnOnce() -> DataFuture<Result<T, ConnectorError>> + Send + Sync>,
1171 status: u16,
1172 headers: HashMap<String, String>,
1173 rate_limits: Option<Vec<RestApiRateLimit>>,
1174 }
1175
1176 impl<T> From<DummyRestApiResponse<T>> for RestApiResponse<T> {
1177 fn from(dummy: DummyRestApiResponse<T>) -> Self {
1178 Self {
1179 data_fn: dummy.inner,
1180 status: dummy.status,
1181 headers: dummy.headers,
1182 rate_limits: dummy.rate_limits,
1183 }
1184 }
1185 }
1186
1187 struct MockManagedSubAccountApiClient {
1188 force_error: bool,
1189 }
1190
1191 #[async_trait]
1192 impl ManagedSubAccountApi for MockManagedSubAccountApiClient {
1193 async fn deposit_assets_into_the_managed_sub_account(
1194 &self,
1195 _params: DepositAssetsIntoTheManagedSubAccountParams,
1196 ) -> anyhow::Result<RestApiResponse<models::DepositAssetsIntoTheManagedSubAccountResponse>>
1197 {
1198 if self.force_error {
1199 return Err(ConnectorError::ConnectorClientError {
1200 msg: "ResponseError".to_string(),
1201 code: None,
1202 }
1203 .into());
1204 }
1205
1206 let resp_json: Value = serde_json::from_str(r#"{"tranId":66157362489}"#).unwrap();
1207 let dummy_response: models::DepositAssetsIntoTheManagedSubAccountResponse =
1208 serde_json::from_value(resp_json.clone()).expect(
1209 "should parse into models::DepositAssetsIntoTheManagedSubAccountResponse",
1210 );
1211
1212 let dummy = DummyRestApiResponse {
1213 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1214 status: 200,
1215 headers: HashMap::new(),
1216 rate_limits: None,
1217 };
1218
1219 Ok(dummy.into())
1220 }
1221
1222 async fn get_managed_sub_account_deposit_address(
1223 &self,
1224 _params: GetManagedSubAccountDepositAddressParams,
1225 ) -> anyhow::Result<RestApiResponse<models::GetManagedSubAccountDepositAddressResponse>>
1226 {
1227 if self.force_error {
1228 return Err(ConnectorError::ConnectorClientError {
1229 msg: "ResponseError".to_string(),
1230 code: None,
1231 }
1232 .into());
1233 }
1234
1235 let resp_json: Value = serde_json::from_str(r#"{"coin":"USDT","address":"0x206c22d833bb0bb2102da6b7c7d4c3eb14bcf73d","tag":"","url":"https://etherscan.io/address/0x206c22d833bb0bb2102da6b7c7d4c3eb14bcf73d"}"#).unwrap();
1236 let dummy_response: models::GetManagedSubAccountDepositAddressResponse =
1237 serde_json::from_value(resp_json.clone())
1238 .expect("should parse into models::GetManagedSubAccountDepositAddressResponse");
1239
1240 let dummy = DummyRestApiResponse {
1241 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1242 status: 200,
1243 headers: HashMap::new(),
1244 rate_limits: None,
1245 };
1246
1247 Ok(dummy.into())
1248 }
1249
1250 async fn query_managed_sub_account_asset_details(
1251 &self,
1252 _params: QueryManagedSubAccountAssetDetailsParams,
1253 ) -> anyhow::Result<
1254 RestApiResponse<Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>>,
1255 > {
1256 if self.force_error {
1257 return Err(ConnectorError::ConnectorClientError {
1258 msg: "ResponseError".to_string(),
1259 code: None,
1260 }
1261 .into());
1262 }
1263
1264 let resp_json: Value = serde_json::from_str(r#"[{"coin":"INJ","name":"Injective Protocol","totalBalance":"0","availableBalance":"0","inOrder":"0","btcValue":"0"},{"coin":"FILDOWN","name":"FILDOWN","totalBalance":"0","availableBalance":"0","inOrder":"0","btcValue":"0"}]"#).unwrap();
1265 let dummy_response : Vec<models::QueryManagedSubAccountAssetDetailsResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>");
1266
1267 let dummy = DummyRestApiResponse {
1268 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1269 status: 200,
1270 headers: HashMap::new(),
1271 rate_limits: None,
1272 };
1273
1274 Ok(dummy.into())
1275 }
1276
1277 async fn query_managed_sub_account_futures_asset_details(
1278 &self,
1279 _params: QueryManagedSubAccountFuturesAssetDetailsParams,
1280 ) -> anyhow::Result<
1281 RestApiResponse<models::QueryManagedSubAccountFuturesAssetDetailsResponse>,
1282 > {
1283 if self.force_error {
1284 return Err(ConnectorError::ConnectorClientError {
1285 msg: "ResponseError".to_string(),
1286 code: None,
1287 }
1288 .into());
1289 }
1290
1291 let resp_json: Value = serde_json::from_str(r#"{"code":"200","message":"OK","snapshotVos":[{"type":"FUTURES","updateTime":1672893855394,"data":{"assets":[{"asset":"USDT","marginBalance":100,"walletBalance":120}],"position":[{"symbol":"BTCUSDT","entryPrice":17000,"markPrice":17000,"positionAmt":1.0E-4}]}}]}"#).unwrap();
1292 let dummy_response: models::QueryManagedSubAccountFuturesAssetDetailsResponse =
1293 serde_json::from_value(resp_json.clone()).expect(
1294 "should parse into models::QueryManagedSubAccountFuturesAssetDetailsResponse",
1295 );
1296
1297 let dummy = DummyRestApiResponse {
1298 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1299 status: 200,
1300 headers: HashMap::new(),
1301 rate_limits: None,
1302 };
1303
1304 Ok(dummy.into())
1305 }
1306
1307 async fn query_managed_sub_account_list(
1308 &self,
1309 _params: QueryManagedSubAccountListParams,
1310 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountListResponse>> {
1311 if self.force_error {
1312 return Err(ConnectorError::ConnectorClientError {
1313 msg: "ResponseError".to_string(),
1314 code: None,
1315 }
1316 .into());
1317 }
1318
1319 let resp_json: Value = serde_json::from_str(r#"{"total":3,"managerSubUserInfoVoList":[{"rootUserId":1000138475670,"managersubUserId":1000137842513,"bindParentUserId":1000138475669,"email":"test_0_virtual@kq3kno9imanagedsub.com","insertTimeStamp":1678435149000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false},{"rootUserId":1000138475670,"managersubUserId":1000137842514,"bindParentUserId":1000138475669,"email":"test_1_virtual@4qd2u7zxmanagedsub.com","insertTimeStamp":1678435152000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false},{"rootUserId":1000138475670,"managersubUserId":1000137842515,"bindParentUserId":1000138475669,"email":"test_2_virtual@akc05o8hmanagedsub.com","insertTimeStamp":1678435153000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false}]}"#).unwrap();
1320 let dummy_response: models::QueryManagedSubAccountListResponse =
1321 serde_json::from_value(resp_json.clone())
1322 .expect("should parse into models::QueryManagedSubAccountListResponse");
1323
1324 let dummy = DummyRestApiResponse {
1325 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1326 status: 200,
1327 headers: HashMap::new(),
1328 rate_limits: None,
1329 };
1330
1331 Ok(dummy.into())
1332 }
1333
1334 async fn query_managed_sub_account_margin_asset_details(
1335 &self,
1336 _params: QueryManagedSubAccountMarginAssetDetailsParams,
1337 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountMarginAssetDetailsResponse>>
1338 {
1339 if self.force_error {
1340 return Err(ConnectorError::ConnectorClientError {
1341 msg: "ResponseError".to_string(),
1342 code: None,
1343 }
1344 .into());
1345 }
1346
1347 let resp_json: Value = serde_json::from_str(r#"{"marginLevel":"999","totalAssetOfBtc":"0","totalLiabilityOfBtc":"0","totalNetAssetOfBtc":"0","userAssets":[{"asset":"MATIC","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"},{"asset":"VET","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"},{"asset":"BAKE","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"}]}"#).unwrap();
1348 let dummy_response: models::QueryManagedSubAccountMarginAssetDetailsResponse =
1349 serde_json::from_value(resp_json.clone()).expect(
1350 "should parse into models::QueryManagedSubAccountMarginAssetDetailsResponse",
1351 );
1352
1353 let dummy = DummyRestApiResponse {
1354 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1355 status: 200,
1356 headers: HashMap::new(),
1357 rate_limits: None,
1358 };
1359
1360 Ok(dummy.into())
1361 }
1362
1363 async fn query_managed_sub_account_snapshot(
1364 &self,
1365 _params: QueryManagedSubAccountSnapshotParams,
1366 ) -> anyhow::Result<RestApiResponse<models::QueryManagedSubAccountSnapshotResponse>>
1367 {
1368 if self.force_error {
1369 return Err(ConnectorError::ConnectorClientError {
1370 msg: "ResponseError".to_string(),
1371 code: None,
1372 }
1373 .into());
1374 }
1375
1376 let resp_json: Value = serde_json::from_str(r#"{"code":200,"msg":"","snapshotVos":[{"data":{"balances":[{"asset":"BTC","free":"0.09905021","locked":"0.00000000"},{"asset":"USDT","free":"1.89109409","locked":"0.00000000"}],"totalAssetOfBtc":"0.09942700"},"type":"spot","updateTime":1576281599000},{"data":{"marginLevel":"2748.02909813","totalAssetOfBtc":"0.00274803","totalLiabilityOfBtc":"0.00000100","totalNetAssetOfBtc":"0.00274750","userAssets":[{"asset":"XRP","borrowed":"0.00000000","free":"1.00000000","interest":"0.00000000","locked":"0.00000000","netAsset":"1.00000000"}]},"type":"margin","updateTime":1576281599000},{"data":{"assets":[{"asset":"USDT","marginBalance":"118.99782335","walletBalance":"120.23811389"}],"position":[{"entryPrice":"7130.41000000","markPrice":"7257.66239673","positionAmt":"0.01000000","symbol":"BTCUSDT","unRealizedProfit":"1.24029054"}]},"type":"futures","updateTime":1576281599000}]}"#).unwrap();
1377 let dummy_response: models::QueryManagedSubAccountSnapshotResponse =
1378 serde_json::from_value(resp_json.clone())
1379 .expect("should parse into models::QueryManagedSubAccountSnapshotResponse");
1380
1381 let dummy = DummyRestApiResponse {
1382 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1383 status: 200,
1384 headers: HashMap::new(),
1385 rate_limits: None,
1386 };
1387
1388 Ok(dummy.into())
1389 }
1390
1391 async fn query_managed_sub_account_transfer_log_master_account_investor(
1392 &self,
1393 _params: QueryManagedSubAccountTransferLogMasterAccountInvestorParams,
1394 ) -> anyhow::Result<
1395 RestApiResponse<models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse>,
1396 > {
1397 if self.force_error {
1398 return Err(ConnectorError::ConnectorClientError {
1399 msg: "ResponseError".to_string(),
1400 code: None,
1401 }
1402 .into());
1403 }
1404
1405 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
1406 let dummy_response : models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse");
1407
1408 let dummy = DummyRestApiResponse {
1409 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1410 status: 200,
1411 headers: HashMap::new(),
1412 rate_limits: None,
1413 };
1414
1415 Ok(dummy.into())
1416 }
1417
1418 async fn query_managed_sub_account_transfer_log_master_account_trading(
1419 &self,
1420 _params: QueryManagedSubAccountTransferLogMasterAccountTradingParams,
1421 ) -> anyhow::Result<
1422 RestApiResponse<models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse>,
1423 > {
1424 if self.force_error {
1425 return Err(ConnectorError::ConnectorClientError {
1426 msg: "ResponseError".to_string(),
1427 code: None,
1428 }
1429 .into());
1430 }
1431
1432 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
1433 let dummy_response : models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse");
1434
1435 let dummy = DummyRestApiResponse {
1436 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1437 status: 200,
1438 headers: HashMap::new(),
1439 rate_limits: None,
1440 };
1441
1442 Ok(dummy.into())
1443 }
1444
1445 async fn query_managed_sub_account_transfer_log_sub_account_trading(
1446 &self,
1447 _params: QueryManagedSubAccountTransferLogSubAccountTradingParams,
1448 ) -> anyhow::Result<
1449 RestApiResponse<models::QueryManagedSubAccountTransferLogSubAccountTradingResponse>,
1450 > {
1451 if self.force_error {
1452 return Err(ConnectorError::ConnectorClientError {
1453 msg: "ResponseError".to_string(),
1454 code: None,
1455 }
1456 .into());
1457 }
1458
1459 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
1460 let dummy_response : models::QueryManagedSubAccountTransferLogSubAccountTradingResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogSubAccountTradingResponse");
1461
1462 let dummy = DummyRestApiResponse {
1463 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1464 status: 200,
1465 headers: HashMap::new(),
1466 rate_limits: None,
1467 };
1468
1469 Ok(dummy.into())
1470 }
1471
1472 async fn withdrawl_assets_from_the_managed_sub_account(
1473 &self,
1474 _params: WithdrawlAssetsFromTheManagedSubAccountParams,
1475 ) -> anyhow::Result<RestApiResponse<models::WithdrawlAssetsFromTheManagedSubAccountResponse>>
1476 {
1477 if self.force_error {
1478 return Err(ConnectorError::ConnectorClientError {
1479 msg: "ResponseError".to_string(),
1480 code: None,
1481 }
1482 .into());
1483 }
1484
1485 let resp_json: Value = serde_json::from_str(r#"{"tranId":66157362489}"#).unwrap();
1486 let dummy_response: models::WithdrawlAssetsFromTheManagedSubAccountResponse =
1487 serde_json::from_value(resp_json.clone()).expect(
1488 "should parse into models::WithdrawlAssetsFromTheManagedSubAccountResponse",
1489 );
1490
1491 let dummy = DummyRestApiResponse {
1492 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1493 status: 200,
1494 headers: HashMap::new(),
1495 rate_limits: None,
1496 };
1497
1498 Ok(dummy.into())
1499 }
1500 }
1501
1502 #[test]
1503 fn deposit_assets_into_the_managed_sub_account_required_params_success() {
1504 TOKIO_SHARED_RT.block_on(async {
1505 let client = MockManagedSubAccountApiClient { force_error: false };
1506
1507 let params = DepositAssetsIntoTheManagedSubAccountParams::builder(
1508 "to_email_example".to_string(),
1509 "asset_example".to_string(),
1510 dec!(1.0),
1511 )
1512 .build()
1513 .unwrap();
1514
1515 let resp_json: Value = serde_json::from_str(r#"{"tranId":66157362489}"#).unwrap();
1516 let expected_response: models::DepositAssetsIntoTheManagedSubAccountResponse =
1517 serde_json::from_value(resp_json.clone()).expect(
1518 "should parse into models::DepositAssetsIntoTheManagedSubAccountResponse",
1519 );
1520
1521 let resp = client
1522 .deposit_assets_into_the_managed_sub_account(params)
1523 .await
1524 .expect("Expected a response");
1525 let data_future = resp.data();
1526 let actual_response = data_future.await.unwrap();
1527 assert_eq!(actual_response, expected_response);
1528 });
1529 }
1530
1531 #[test]
1532 fn deposit_assets_into_the_managed_sub_account_optional_params_success() {
1533 TOKIO_SHARED_RT.block_on(async {
1534 let client = MockManagedSubAccountApiClient { force_error: false };
1535
1536 let params = DepositAssetsIntoTheManagedSubAccountParams::builder(
1537 "to_email_example".to_string(),
1538 "asset_example".to_string(),
1539 dec!(1.0),
1540 )
1541 .recv_window(5000)
1542 .build()
1543 .unwrap();
1544
1545 let resp_json: Value = serde_json::from_str(r#"{"tranId":66157362489}"#).unwrap();
1546 let expected_response: models::DepositAssetsIntoTheManagedSubAccountResponse =
1547 serde_json::from_value(resp_json.clone()).expect(
1548 "should parse into models::DepositAssetsIntoTheManagedSubAccountResponse",
1549 );
1550
1551 let resp = client
1552 .deposit_assets_into_the_managed_sub_account(params)
1553 .await
1554 .expect("Expected a response");
1555 let data_future = resp.data();
1556 let actual_response = data_future.await.unwrap();
1557 assert_eq!(actual_response, expected_response);
1558 });
1559 }
1560
1561 #[test]
1562 fn deposit_assets_into_the_managed_sub_account_response_error() {
1563 TOKIO_SHARED_RT.block_on(async {
1564 let client = MockManagedSubAccountApiClient { force_error: true };
1565
1566 let params = DepositAssetsIntoTheManagedSubAccountParams::builder(
1567 "to_email_example".to_string(),
1568 "asset_example".to_string(),
1569 dec!(1.0),
1570 )
1571 .build()
1572 .unwrap();
1573
1574 match client
1575 .deposit_assets_into_the_managed_sub_account(params)
1576 .await
1577 {
1578 Ok(_) => panic!("Expected an error"),
1579 Err(err) => {
1580 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1581 }
1582 }
1583 });
1584 }
1585
1586 #[test]
1587 fn get_managed_sub_account_deposit_address_required_params_success() {
1588 TOKIO_SHARED_RT.block_on(async {
1589 let client = MockManagedSubAccountApiClient { force_error: false };
1590
1591 let params = GetManagedSubAccountDepositAddressParams::builder("sub-account-email@email.com".to_string(),"coin_example".to_string(),).build().unwrap();
1592
1593 let resp_json: Value = serde_json::from_str(r#"{"coin":"USDT","address":"0x206c22d833bb0bb2102da6b7c7d4c3eb14bcf73d","tag":"","url":"https://etherscan.io/address/0x206c22d833bb0bb2102da6b7c7d4c3eb14bcf73d"}"#).unwrap();
1594 let expected_response : models::GetManagedSubAccountDepositAddressResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetManagedSubAccountDepositAddressResponse");
1595
1596 let resp = client.get_managed_sub_account_deposit_address(params).await.expect("Expected a response");
1597 let data_future = resp.data();
1598 let actual_response = data_future.await.unwrap();
1599 assert_eq!(actual_response, expected_response);
1600 });
1601 }
1602
1603 #[test]
1604 fn get_managed_sub_account_deposit_address_optional_params_success() {
1605 TOKIO_SHARED_RT.block_on(async {
1606 let client = MockManagedSubAccountApiClient { force_error: false };
1607
1608 let params = GetManagedSubAccountDepositAddressParams::builder("sub-account-email@email.com".to_string(),"coin_example".to_string(),).network("network_example".to_string()).amount(dec!(1.0)).recv_window(5000).build().unwrap();
1609
1610 let resp_json: Value = serde_json::from_str(r#"{"coin":"USDT","address":"0x206c22d833bb0bb2102da6b7c7d4c3eb14bcf73d","tag":"","url":"https://etherscan.io/address/0x206c22d833bb0bb2102da6b7c7d4c3eb14bcf73d"}"#).unwrap();
1611 let expected_response : models::GetManagedSubAccountDepositAddressResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetManagedSubAccountDepositAddressResponse");
1612
1613 let resp = client.get_managed_sub_account_deposit_address(params).await.expect("Expected a response");
1614 let data_future = resp.data();
1615 let actual_response = data_future.await.unwrap();
1616 assert_eq!(actual_response, expected_response);
1617 });
1618 }
1619
1620 #[test]
1621 fn get_managed_sub_account_deposit_address_response_error() {
1622 TOKIO_SHARED_RT.block_on(async {
1623 let client = MockManagedSubAccountApiClient { force_error: true };
1624
1625 let params = GetManagedSubAccountDepositAddressParams::builder(
1626 "sub-account-email@email.com".to_string(),
1627 "coin_example".to_string(),
1628 )
1629 .build()
1630 .unwrap();
1631
1632 match client.get_managed_sub_account_deposit_address(params).await {
1633 Ok(_) => panic!("Expected an error"),
1634 Err(err) => {
1635 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1636 }
1637 }
1638 });
1639 }
1640
1641 #[test]
1642 fn query_managed_sub_account_asset_details_required_params_success() {
1643 TOKIO_SHARED_RT.block_on(async {
1644 let client = MockManagedSubAccountApiClient { force_error: false };
1645
1646 let params = QueryManagedSubAccountAssetDetailsParams::builder("sub-account-email@email.com".to_string(),).build().unwrap();
1647
1648 let resp_json: Value = serde_json::from_str(r#"[{"coin":"INJ","name":"Injective Protocol","totalBalance":"0","availableBalance":"0","inOrder":"0","btcValue":"0"},{"coin":"FILDOWN","name":"FILDOWN","totalBalance":"0","availableBalance":"0","inOrder":"0","btcValue":"0"}]"#).unwrap();
1649 let expected_response : Vec<models::QueryManagedSubAccountAssetDetailsResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>");
1650
1651 let resp = client.query_managed_sub_account_asset_details(params).await.expect("Expected a response");
1652 let data_future = resp.data();
1653 let actual_response = data_future.await.unwrap();
1654 assert_eq!(actual_response, expected_response);
1655 });
1656 }
1657
1658 #[test]
1659 fn query_managed_sub_account_asset_details_optional_params_success() {
1660 TOKIO_SHARED_RT.block_on(async {
1661 let client = MockManagedSubAccountApiClient { force_error: false };
1662
1663 let params = QueryManagedSubAccountAssetDetailsParams::builder("sub-account-email@email.com".to_string(),).recv_window(5000).build().unwrap();
1664
1665 let resp_json: Value = serde_json::from_str(r#"[{"coin":"INJ","name":"Injective Protocol","totalBalance":"0","availableBalance":"0","inOrder":"0","btcValue":"0"},{"coin":"FILDOWN","name":"FILDOWN","totalBalance":"0","availableBalance":"0","inOrder":"0","btcValue":"0"}]"#).unwrap();
1666 let expected_response : Vec<models::QueryManagedSubAccountAssetDetailsResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::QueryManagedSubAccountAssetDetailsResponseInner>");
1667
1668 let resp = client.query_managed_sub_account_asset_details(params).await.expect("Expected a response");
1669 let data_future = resp.data();
1670 let actual_response = data_future.await.unwrap();
1671 assert_eq!(actual_response, expected_response);
1672 });
1673 }
1674
1675 #[test]
1676 fn query_managed_sub_account_asset_details_response_error() {
1677 TOKIO_SHARED_RT.block_on(async {
1678 let client = MockManagedSubAccountApiClient { force_error: true };
1679
1680 let params = QueryManagedSubAccountAssetDetailsParams::builder(
1681 "sub-account-email@email.com".to_string(),
1682 )
1683 .build()
1684 .unwrap();
1685
1686 match client.query_managed_sub_account_asset_details(params).await {
1687 Ok(_) => panic!("Expected an error"),
1688 Err(err) => {
1689 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1690 }
1691 }
1692 });
1693 }
1694
1695 #[test]
1696 fn query_managed_sub_account_futures_asset_details_required_params_success() {
1697 TOKIO_SHARED_RT.block_on(async {
1698 let client = MockManagedSubAccountApiClient { force_error: false };
1699
1700 let params = QueryManagedSubAccountFuturesAssetDetailsParams::builder("sub-account-email@email.com".to_string(),).build().unwrap();
1701
1702 let resp_json: Value = serde_json::from_str(r#"{"code":"200","message":"OK","snapshotVos":[{"type":"FUTURES","updateTime":1672893855394,"data":{"assets":[{"asset":"USDT","marginBalance":100,"walletBalance":120}],"position":[{"symbol":"BTCUSDT","entryPrice":17000,"markPrice":17000,"positionAmt":1.0E-4}]}}]}"#).unwrap();
1703 let expected_response : models::QueryManagedSubAccountFuturesAssetDetailsResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountFuturesAssetDetailsResponse");
1704
1705 let resp = client.query_managed_sub_account_futures_asset_details(params).await.expect("Expected a response");
1706 let data_future = resp.data();
1707 let actual_response = data_future.await.unwrap();
1708 assert_eq!(actual_response, expected_response);
1709 });
1710 }
1711
1712 #[test]
1713 fn query_managed_sub_account_futures_asset_details_optional_params_success() {
1714 TOKIO_SHARED_RT.block_on(async {
1715 let client = MockManagedSubAccountApiClient { force_error: false };
1716
1717 let params = QueryManagedSubAccountFuturesAssetDetailsParams::builder("sub-account-email@email.com".to_string(),).account_type("account_type_example".to_string()).build().unwrap();
1718
1719 let resp_json: Value = serde_json::from_str(r#"{"code":"200","message":"OK","snapshotVos":[{"type":"FUTURES","updateTime":1672893855394,"data":{"assets":[{"asset":"USDT","marginBalance":100,"walletBalance":120}],"position":[{"symbol":"BTCUSDT","entryPrice":17000,"markPrice":17000,"positionAmt":1.0E-4}]}}]}"#).unwrap();
1720 let expected_response : models::QueryManagedSubAccountFuturesAssetDetailsResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountFuturesAssetDetailsResponse");
1721
1722 let resp = client.query_managed_sub_account_futures_asset_details(params).await.expect("Expected a response");
1723 let data_future = resp.data();
1724 let actual_response = data_future.await.unwrap();
1725 assert_eq!(actual_response, expected_response);
1726 });
1727 }
1728
1729 #[test]
1730 fn query_managed_sub_account_futures_asset_details_response_error() {
1731 TOKIO_SHARED_RT.block_on(async {
1732 let client = MockManagedSubAccountApiClient { force_error: true };
1733
1734 let params = QueryManagedSubAccountFuturesAssetDetailsParams::builder(
1735 "sub-account-email@email.com".to_string(),
1736 )
1737 .build()
1738 .unwrap();
1739
1740 match client
1741 .query_managed_sub_account_futures_asset_details(params)
1742 .await
1743 {
1744 Ok(_) => panic!("Expected an error"),
1745 Err(err) => {
1746 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1747 }
1748 }
1749 });
1750 }
1751
1752 #[test]
1753 fn query_managed_sub_account_list_required_params_success() {
1754 TOKIO_SHARED_RT.block_on(async {
1755 let client = MockManagedSubAccountApiClient { force_error: false };
1756
1757 let params = QueryManagedSubAccountListParams::builder().build().unwrap();
1758
1759 let resp_json: Value = serde_json::from_str(r#"{"total":3,"managerSubUserInfoVoList":[{"rootUserId":1000138475670,"managersubUserId":1000137842513,"bindParentUserId":1000138475669,"email":"test_0_virtual@kq3kno9imanagedsub.com","insertTimeStamp":1678435149000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false},{"rootUserId":1000138475670,"managersubUserId":1000137842514,"bindParentUserId":1000138475669,"email":"test_1_virtual@4qd2u7zxmanagedsub.com","insertTimeStamp":1678435152000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false},{"rootUserId":1000138475670,"managersubUserId":1000137842515,"bindParentUserId":1000138475669,"email":"test_2_virtual@akc05o8hmanagedsub.com","insertTimeStamp":1678435153000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false}]}"#).unwrap();
1760 let expected_response : models::QueryManagedSubAccountListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountListResponse");
1761
1762 let resp = client.query_managed_sub_account_list(params).await.expect("Expected a response");
1763 let data_future = resp.data();
1764 let actual_response = data_future.await.unwrap();
1765 assert_eq!(actual_response, expected_response);
1766 });
1767 }
1768
1769 #[test]
1770 fn query_managed_sub_account_list_optional_params_success() {
1771 TOKIO_SHARED_RT.block_on(async {
1772 let client = MockManagedSubAccountApiClient { force_error: false };
1773
1774 let params = QueryManagedSubAccountListParams::builder().email("email_example".to_string()).page(1).limit(1).recv_window(5000).build().unwrap();
1775
1776 let resp_json: Value = serde_json::from_str(r#"{"total":3,"managerSubUserInfoVoList":[{"rootUserId":1000138475670,"managersubUserId":1000137842513,"bindParentUserId":1000138475669,"email":"test_0_virtual@kq3kno9imanagedsub.com","insertTimeStamp":1678435149000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false},{"rootUserId":1000138475670,"managersubUserId":1000137842514,"bindParentUserId":1000138475669,"email":"test_1_virtual@4qd2u7zxmanagedsub.com","insertTimeStamp":1678435152000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false},{"rootUserId":1000138475670,"managersubUserId":1000137842515,"bindParentUserId":1000138475669,"email":"test_2_virtual@akc05o8hmanagedsub.com","insertTimeStamp":1678435153000,"bindParentEmail":"wdyw8xsh8pey@test.com","isSubUserEnabled":true,"isUserActive":true,"isMarginEnabled":false,"isFutureEnabled":false,"isSignedLVTRiskAgreement":false}]}"#).unwrap();
1777 let expected_response : models::QueryManagedSubAccountListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountListResponse");
1778
1779 let resp = client.query_managed_sub_account_list(params).await.expect("Expected a response");
1780 let data_future = resp.data();
1781 let actual_response = data_future.await.unwrap();
1782 assert_eq!(actual_response, expected_response);
1783 });
1784 }
1785
1786 #[test]
1787 fn query_managed_sub_account_list_response_error() {
1788 TOKIO_SHARED_RT.block_on(async {
1789 let client = MockManagedSubAccountApiClient { force_error: true };
1790
1791 let params = QueryManagedSubAccountListParams::builder().build().unwrap();
1792
1793 match client.query_managed_sub_account_list(params).await {
1794 Ok(_) => panic!("Expected an error"),
1795 Err(err) => {
1796 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1797 }
1798 }
1799 });
1800 }
1801
1802 #[test]
1803 fn query_managed_sub_account_margin_asset_details_required_params_success() {
1804 TOKIO_SHARED_RT.block_on(async {
1805 let client = MockManagedSubAccountApiClient { force_error: false };
1806
1807 let params = QueryManagedSubAccountMarginAssetDetailsParams::builder("sub-account-email@email.com".to_string(),).build().unwrap();
1808
1809 let resp_json: Value = serde_json::from_str(r#"{"marginLevel":"999","totalAssetOfBtc":"0","totalLiabilityOfBtc":"0","totalNetAssetOfBtc":"0","userAssets":[{"asset":"MATIC","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"},{"asset":"VET","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"},{"asset":"BAKE","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"}]}"#).unwrap();
1810 let expected_response : models::QueryManagedSubAccountMarginAssetDetailsResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountMarginAssetDetailsResponse");
1811
1812 let resp = client.query_managed_sub_account_margin_asset_details(params).await.expect("Expected a response");
1813 let data_future = resp.data();
1814 let actual_response = data_future.await.unwrap();
1815 assert_eq!(actual_response, expected_response);
1816 });
1817 }
1818
1819 #[test]
1820 fn query_managed_sub_account_margin_asset_details_optional_params_success() {
1821 TOKIO_SHARED_RT.block_on(async {
1822 let client = MockManagedSubAccountApiClient { force_error: false };
1823
1824 let params = QueryManagedSubAccountMarginAssetDetailsParams::builder("sub-account-email@email.com".to_string(),).account_type("account_type_example".to_string()).build().unwrap();
1825
1826 let resp_json: Value = serde_json::from_str(r#"{"marginLevel":"999","totalAssetOfBtc":"0","totalLiabilityOfBtc":"0","totalNetAssetOfBtc":"0","userAssets":[{"asset":"MATIC","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"},{"asset":"VET","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"},{"asset":"BAKE","borrowed":"0","free":"0","interest":"0","locked":"0","netAsset":"0"}]}"#).unwrap();
1827 let expected_response : models::QueryManagedSubAccountMarginAssetDetailsResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountMarginAssetDetailsResponse");
1828
1829 let resp = client.query_managed_sub_account_margin_asset_details(params).await.expect("Expected a response");
1830 let data_future = resp.data();
1831 let actual_response = data_future.await.unwrap();
1832 assert_eq!(actual_response, expected_response);
1833 });
1834 }
1835
1836 #[test]
1837 fn query_managed_sub_account_margin_asset_details_response_error() {
1838 TOKIO_SHARED_RT.block_on(async {
1839 let client = MockManagedSubAccountApiClient { force_error: true };
1840
1841 let params = QueryManagedSubAccountMarginAssetDetailsParams::builder(
1842 "sub-account-email@email.com".to_string(),
1843 )
1844 .build()
1845 .unwrap();
1846
1847 match client
1848 .query_managed_sub_account_margin_asset_details(params)
1849 .await
1850 {
1851 Ok(_) => panic!("Expected an error"),
1852 Err(err) => {
1853 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1854 }
1855 }
1856 });
1857 }
1858
1859 #[test]
1860 fn query_managed_sub_account_snapshot_required_params_success() {
1861 TOKIO_SHARED_RT.block_on(async {
1862 let client = MockManagedSubAccountApiClient { force_error: false };
1863
1864 let params = QueryManagedSubAccountSnapshotParams::builder("sub-account-email@email.com".to_string(),"r#type_example".to_string(),).build().unwrap();
1865
1866 let resp_json: Value = serde_json::from_str(r#"{"code":200,"msg":"","snapshotVos":[{"data":{"balances":[{"asset":"BTC","free":"0.09905021","locked":"0.00000000"},{"asset":"USDT","free":"1.89109409","locked":"0.00000000"}],"totalAssetOfBtc":"0.09942700"},"type":"spot","updateTime":1576281599000},{"data":{"marginLevel":"2748.02909813","totalAssetOfBtc":"0.00274803","totalLiabilityOfBtc":"0.00000100","totalNetAssetOfBtc":"0.00274750","userAssets":[{"asset":"XRP","borrowed":"0.00000000","free":"1.00000000","interest":"0.00000000","locked":"0.00000000","netAsset":"1.00000000"}]},"type":"margin","updateTime":1576281599000},{"data":{"assets":[{"asset":"USDT","marginBalance":"118.99782335","walletBalance":"120.23811389"}],"position":[{"entryPrice":"7130.41000000","markPrice":"7257.66239673","positionAmt":"0.01000000","symbol":"BTCUSDT","unRealizedProfit":"1.24029054"}]},"type":"futures","updateTime":1576281599000}]}"#).unwrap();
1867 let expected_response : models::QueryManagedSubAccountSnapshotResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountSnapshotResponse");
1868
1869 let resp = client.query_managed_sub_account_snapshot(params).await.expect("Expected a response");
1870 let data_future = resp.data();
1871 let actual_response = data_future.await.unwrap();
1872 assert_eq!(actual_response, expected_response);
1873 });
1874 }
1875
1876 #[test]
1877 fn query_managed_sub_account_snapshot_optional_params_success() {
1878 TOKIO_SHARED_RT.block_on(async {
1879 let client = MockManagedSubAccountApiClient { force_error: false };
1880
1881 let params = QueryManagedSubAccountSnapshotParams::builder("sub-account-email@email.com".to_string(),"r#type_example".to_string(),).start_time(1623319461670).end_time(1641782889000).limit(1).recv_window(5000).build().unwrap();
1882
1883 let resp_json: Value = serde_json::from_str(r#"{"code":200,"msg":"","snapshotVos":[{"data":{"balances":[{"asset":"BTC","free":"0.09905021","locked":"0.00000000"},{"asset":"USDT","free":"1.89109409","locked":"0.00000000"}],"totalAssetOfBtc":"0.09942700"},"type":"spot","updateTime":1576281599000},{"data":{"marginLevel":"2748.02909813","totalAssetOfBtc":"0.00274803","totalLiabilityOfBtc":"0.00000100","totalNetAssetOfBtc":"0.00274750","userAssets":[{"asset":"XRP","borrowed":"0.00000000","free":"1.00000000","interest":"0.00000000","locked":"0.00000000","netAsset":"1.00000000"}]},"type":"margin","updateTime":1576281599000},{"data":{"assets":[{"asset":"USDT","marginBalance":"118.99782335","walletBalance":"120.23811389"}],"position":[{"entryPrice":"7130.41000000","markPrice":"7257.66239673","positionAmt":"0.01000000","symbol":"BTCUSDT","unRealizedProfit":"1.24029054"}]},"type":"futures","updateTime":1576281599000}]}"#).unwrap();
1884 let expected_response : models::QueryManagedSubAccountSnapshotResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountSnapshotResponse");
1885
1886 let resp = client.query_managed_sub_account_snapshot(params).await.expect("Expected a response");
1887 let data_future = resp.data();
1888 let actual_response = data_future.await.unwrap();
1889 assert_eq!(actual_response, expected_response);
1890 });
1891 }
1892
1893 #[test]
1894 fn query_managed_sub_account_snapshot_response_error() {
1895 TOKIO_SHARED_RT.block_on(async {
1896 let client = MockManagedSubAccountApiClient { force_error: true };
1897
1898 let params = QueryManagedSubAccountSnapshotParams::builder(
1899 "sub-account-email@email.com".to_string(),
1900 "r#type_example".to_string(),
1901 )
1902 .build()
1903 .unwrap();
1904
1905 match client.query_managed_sub_account_snapshot(params).await {
1906 Ok(_) => panic!("Expected an error"),
1907 Err(err) => {
1908 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1909 }
1910 }
1911 });
1912 }
1913
1914 #[test]
1915 fn query_managed_sub_account_transfer_log_master_account_investor_required_params_success() {
1916 TOKIO_SHARED_RT.block_on(async {
1917 let client = MockManagedSubAccountApiClient { force_error: false };
1918
1919 let params = QueryManagedSubAccountTransferLogMasterAccountInvestorParams::builder("sub-account-email@email.com".to_string(),1623319461670,1641782889000,789,789,).build().unwrap();
1920
1921 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
1922 let expected_response : models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse");
1923
1924 let resp = client.query_managed_sub_account_transfer_log_master_account_investor(params).await.expect("Expected a response");
1925 let data_future = resp.data();
1926 let actual_response = data_future.await.unwrap();
1927 assert_eq!(actual_response, expected_response);
1928 });
1929 }
1930
1931 #[test]
1932 fn query_managed_sub_account_transfer_log_master_account_investor_optional_params_success() {
1933 TOKIO_SHARED_RT.block_on(async {
1934 let client = MockManagedSubAccountApiClient { force_error: false };
1935
1936 let params = QueryManagedSubAccountTransferLogMasterAccountInvestorParams::builder("sub-account-email@email.com".to_string(),1623319461670,1641782889000,789,789,).transfers("transfers_example".to_string()).transfer_function_account_type("transfer_function_account_type_example".to_string()).build().unwrap();
1937
1938 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
1939 let expected_response : models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogMasterAccountInvestorResponse");
1940
1941 let resp = client.query_managed_sub_account_transfer_log_master_account_investor(params).await.expect("Expected a response");
1942 let data_future = resp.data();
1943 let actual_response = data_future.await.unwrap();
1944 assert_eq!(actual_response, expected_response);
1945 });
1946 }
1947
1948 #[test]
1949 fn query_managed_sub_account_transfer_log_master_account_investor_response_error() {
1950 TOKIO_SHARED_RT.block_on(async {
1951 let client = MockManagedSubAccountApiClient { force_error: true };
1952
1953 let params = QueryManagedSubAccountTransferLogMasterAccountInvestorParams::builder(
1954 "sub-account-email@email.com".to_string(),
1955 1623319461670,
1956 1641782889000,
1957 789,
1958 789,
1959 )
1960 .build()
1961 .unwrap();
1962
1963 match client
1964 .query_managed_sub_account_transfer_log_master_account_investor(params)
1965 .await
1966 {
1967 Ok(_) => panic!("Expected an error"),
1968 Err(err) => {
1969 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1970 }
1971 }
1972 });
1973 }
1974
1975 #[test]
1976 fn query_managed_sub_account_transfer_log_master_account_trading_required_params_success() {
1977 TOKIO_SHARED_RT.block_on(async {
1978 let client = MockManagedSubAccountApiClient { force_error: false };
1979
1980 let params = QueryManagedSubAccountTransferLogMasterAccountTradingParams::builder("sub-account-email@email.com".to_string(),1623319461670,1641782889000,789,789,).build().unwrap();
1981
1982 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
1983 let expected_response : models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse");
1984
1985 let resp = client.query_managed_sub_account_transfer_log_master_account_trading(params).await.expect("Expected a response");
1986 let data_future = resp.data();
1987 let actual_response = data_future.await.unwrap();
1988 assert_eq!(actual_response, expected_response);
1989 });
1990 }
1991
1992 #[test]
1993 fn query_managed_sub_account_transfer_log_master_account_trading_optional_params_success() {
1994 TOKIO_SHARED_RT.block_on(async {
1995 let client = MockManagedSubAccountApiClient { force_error: false };
1996
1997 let params = QueryManagedSubAccountTransferLogMasterAccountTradingParams::builder("sub-account-email@email.com".to_string(),1623319461670,1641782889000,789,789,).transfers("transfers_example".to_string()).transfer_function_account_type("transfer_function_account_type_example".to_string()).build().unwrap();
1998
1999 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
2000 let expected_response : models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogMasterAccountTradingResponse");
2001
2002 let resp = client.query_managed_sub_account_transfer_log_master_account_trading(params).await.expect("Expected a response");
2003 let data_future = resp.data();
2004 let actual_response = data_future.await.unwrap();
2005 assert_eq!(actual_response, expected_response);
2006 });
2007 }
2008
2009 #[test]
2010 fn query_managed_sub_account_transfer_log_master_account_trading_response_error() {
2011 TOKIO_SHARED_RT.block_on(async {
2012 let client = MockManagedSubAccountApiClient { force_error: true };
2013
2014 let params = QueryManagedSubAccountTransferLogMasterAccountTradingParams::builder(
2015 "sub-account-email@email.com".to_string(),
2016 1623319461670,
2017 1641782889000,
2018 789,
2019 789,
2020 )
2021 .build()
2022 .unwrap();
2023
2024 match client
2025 .query_managed_sub_account_transfer_log_master_account_trading(params)
2026 .await
2027 {
2028 Ok(_) => panic!("Expected an error"),
2029 Err(err) => {
2030 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2031 }
2032 }
2033 });
2034 }
2035
2036 #[test]
2037 fn query_managed_sub_account_transfer_log_sub_account_trading_required_params_success() {
2038 TOKIO_SHARED_RT.block_on(async {
2039 let client = MockManagedSubAccountApiClient { force_error: false };
2040
2041 let params = QueryManagedSubAccountTransferLogSubAccountTradingParams::builder(1623319461670,1641782889000,789,789,).build().unwrap();
2042
2043 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
2044 let expected_response : models::QueryManagedSubAccountTransferLogSubAccountTradingResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogSubAccountTradingResponse");
2045
2046 let resp = client.query_managed_sub_account_transfer_log_sub_account_trading(params).await.expect("Expected a response");
2047 let data_future = resp.data();
2048 let actual_response = data_future.await.unwrap();
2049 assert_eq!(actual_response, expected_response);
2050 });
2051 }
2052
2053 #[test]
2054 fn query_managed_sub_account_transfer_log_sub_account_trading_optional_params_success() {
2055 TOKIO_SHARED_RT.block_on(async {
2056 let client = MockManagedSubAccountApiClient { force_error: false };
2057
2058 let params = QueryManagedSubAccountTransferLogSubAccountTradingParams::builder(1623319461670,1641782889000,789,789,).transfers("transfers_example".to_string()).transfer_function_account_type("transfer_function_account_type_example".to_string()).recv_window(5000).build().unwrap();
2059
2060 let resp_json: Value = serde_json::from_str(r#"{"managerSubTransferHistoryVos":[{"fromEmail":"test_0_virtual@kq3kno9imanagedsub.com","fromAccountType":"SPOT","toEmail":"wdywl0lddakh@test.com","toAccountType":"SPOT","asset":"BNB","amount":"0.01","scheduledData":1679416673000,"createTime":1679416673000,"status":"SUCCESS","tranId":91077779},{"fromEmail":"wdywl0lddakh@test.com","fromAccountType":"SPOT","toEmail":"test_0_virtual@kq3kno9imanagedsub.com","toAccountType":"SPOT","asset":"BNB","amount":"1","scheduledData":1679416616000,"createTime":1679416616000,"status":"SUCCESS","tranId":91077676}],"count":2}"#).unwrap();
2061 let expected_response : models::QueryManagedSubAccountTransferLogSubAccountTradingResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::QueryManagedSubAccountTransferLogSubAccountTradingResponse");
2062
2063 let resp = client.query_managed_sub_account_transfer_log_sub_account_trading(params).await.expect("Expected a response");
2064 let data_future = resp.data();
2065 let actual_response = data_future.await.unwrap();
2066 assert_eq!(actual_response, expected_response);
2067 });
2068 }
2069
2070 #[test]
2071 fn query_managed_sub_account_transfer_log_sub_account_trading_response_error() {
2072 TOKIO_SHARED_RT.block_on(async {
2073 let client = MockManagedSubAccountApiClient { force_error: true };
2074
2075 let params = QueryManagedSubAccountTransferLogSubAccountTradingParams::builder(
2076 1623319461670,
2077 1641782889000,
2078 789,
2079 789,
2080 )
2081 .build()
2082 .unwrap();
2083
2084 match client
2085 .query_managed_sub_account_transfer_log_sub_account_trading(params)
2086 .await
2087 {
2088 Ok(_) => panic!("Expected an error"),
2089 Err(err) => {
2090 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2091 }
2092 }
2093 });
2094 }
2095
2096 #[test]
2097 fn withdrawl_assets_from_the_managed_sub_account_required_params_success() {
2098 TOKIO_SHARED_RT.block_on(async {
2099 let client = MockManagedSubAccountApiClient { force_error: false };
2100
2101 let params = WithdrawlAssetsFromTheManagedSubAccountParams::builder(
2102 "from_email_example".to_string(),
2103 "asset_example".to_string(),
2104 dec!(1.0),
2105 )
2106 .build()
2107 .unwrap();
2108
2109 let resp_json: Value = serde_json::from_str(r#"{"tranId":66157362489}"#).unwrap();
2110 let expected_response: models::WithdrawlAssetsFromTheManagedSubAccountResponse =
2111 serde_json::from_value(resp_json.clone()).expect(
2112 "should parse into models::WithdrawlAssetsFromTheManagedSubAccountResponse",
2113 );
2114
2115 let resp = client
2116 .withdrawl_assets_from_the_managed_sub_account(params)
2117 .await
2118 .expect("Expected a response");
2119 let data_future = resp.data();
2120 let actual_response = data_future.await.unwrap();
2121 assert_eq!(actual_response, expected_response);
2122 });
2123 }
2124
2125 #[test]
2126 fn withdrawl_assets_from_the_managed_sub_account_optional_params_success() {
2127 TOKIO_SHARED_RT.block_on(async {
2128 let client = MockManagedSubAccountApiClient { force_error: false };
2129
2130 let params = WithdrawlAssetsFromTheManagedSubAccountParams::builder(
2131 "from_email_example".to_string(),
2132 "asset_example".to_string(),
2133 dec!(1.0),
2134 )
2135 .transfer_date(789)
2136 .recv_window(5000)
2137 .build()
2138 .unwrap();
2139
2140 let resp_json: Value = serde_json::from_str(r#"{"tranId":66157362489}"#).unwrap();
2141 let expected_response: models::WithdrawlAssetsFromTheManagedSubAccountResponse =
2142 serde_json::from_value(resp_json.clone()).expect(
2143 "should parse into models::WithdrawlAssetsFromTheManagedSubAccountResponse",
2144 );
2145
2146 let resp = client
2147 .withdrawl_assets_from_the_managed_sub_account(params)
2148 .await
2149 .expect("Expected a response");
2150 let data_future = resp.data();
2151 let actual_response = data_future.await.unwrap();
2152 assert_eq!(actual_response, expected_response);
2153 });
2154 }
2155
2156 #[test]
2157 fn withdrawl_assets_from_the_managed_sub_account_response_error() {
2158 TOKIO_SHARED_RT.block_on(async {
2159 let client = MockManagedSubAccountApiClient { force_error: true };
2160
2161 let params = WithdrawlAssetsFromTheManagedSubAccountParams::builder(
2162 "from_email_example".to_string(),
2163 "asset_example".to_string(),
2164 dec!(1.0),
2165 )
2166 .build()
2167 .unwrap();
2168
2169 match client
2170 .withdrawl_assets_from_the_managed_sub_account(params)
2171 .await
2172 {
2173 Ok(_) => panic!("Expected an error"),
2174 Err(err) => {
2175 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2176 }
2177 }
2178 });
2179 }
2180}