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::staking::rest_api::models;
29
30const HAS_TIME_UNIT: bool = false;
31
32#[async_trait]
33pub trait OnChainYieldsApi: Send + Sync {
34 async fn get_on_chain_yields_locked_personal_left_quota(
35 &self,
36 params: GetOnChainYieldsLockedPersonalLeftQuotaParams,
37 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedPersonalLeftQuotaResponse>>;
38 async fn get_on_chain_yields_locked_product_list(
39 &self,
40 params: GetOnChainYieldsLockedProductListParams,
41 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedProductListResponse>>;
42 async fn get_on_chain_yields_locked_product_position(
43 &self,
44 params: GetOnChainYieldsLockedProductPositionParams,
45 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedProductPositionResponse>>;
46 async fn get_on_chain_yields_locked_redemption_record(
47 &self,
48 params: GetOnChainYieldsLockedRedemptionRecordParams,
49 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedRedemptionRecordResponse>>;
50 async fn get_on_chain_yields_locked_rewards_history(
51 &self,
52 params: GetOnChainYieldsLockedRewardsHistoryParams,
53 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedRewardsHistoryResponse>>;
54 async fn get_on_chain_yields_locked_subscription_preview(
55 &self,
56 params: GetOnChainYieldsLockedSubscriptionPreviewParams,
57 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedSubscriptionPreviewResponse>>;
58 async fn get_on_chain_yields_locked_subscription_record(
59 &self,
60 params: GetOnChainYieldsLockedSubscriptionRecordParams,
61 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedSubscriptionRecordResponse>>;
62 async fn on_chain_yields_account(
63 &self,
64 params: OnChainYieldsAccountParams,
65 ) -> anyhow::Result<RestApiResponse<models::OnChainYieldsAccountResponse>>;
66 async fn redeem_on_chain_yields_locked_product(
67 &self,
68 params: RedeemOnChainYieldsLockedProductParams,
69 ) -> anyhow::Result<RestApiResponse<models::RedeemOnChainYieldsLockedProductResponse>>;
70 async fn set_on_chain_yields_locked_auto_subscribe(
71 &self,
72 params: SetOnChainYieldsLockedAutoSubscribeParams,
73 ) -> anyhow::Result<RestApiResponse<models::SetOnChainYieldsLockedAutoSubscribeResponse>>;
74 async fn set_on_chain_yields_locked_product_redeem_option(
75 &self,
76 params: SetOnChainYieldsLockedProductRedeemOptionParams,
77 ) -> anyhow::Result<RestApiResponse<models::SetOnChainYieldsLockedProductRedeemOptionResponse>>;
78 async fn subscribe_on_chain_yields_locked_product(
79 &self,
80 params: SubscribeOnChainYieldsLockedProductParams,
81 ) -> anyhow::Result<RestApiResponse<models::SubscribeOnChainYieldsLockedProductResponse>>;
82}
83
84#[derive(Debug, Clone)]
85pub struct OnChainYieldsApiClient {
86 configuration: ConfigurationRestApi,
87}
88
89impl OnChainYieldsApiClient {
90 pub fn new(configuration: ConfigurationRestApi) -> Self {
91 Self { configuration }
92 }
93}
94
95#[derive(Clone, Debug, Builder)]
100#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
101pub struct GetOnChainYieldsLockedPersonalLeftQuotaParams {
102 #[builder(setter(into))]
107 pub project_id: String,
108 #[builder(setter(into), default)]
113 pub recv_window: Option<i64>,
114}
115
116impl GetOnChainYieldsLockedPersonalLeftQuotaParams {
117 #[must_use]
124 pub fn builder(project_id: String) -> GetOnChainYieldsLockedPersonalLeftQuotaParamsBuilder {
125 GetOnChainYieldsLockedPersonalLeftQuotaParamsBuilder::default().project_id(project_id)
126 }
127}
128#[derive(Clone, Debug, Builder, Default)]
133#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
134pub struct GetOnChainYieldsLockedProductListParams {
135 #[builder(setter(into), default)]
139 pub asset: Option<String>,
140 #[builder(setter(into), default)]
144 pub current: Option<i64>,
145 #[builder(setter(into), default)]
149 pub size: Option<i64>,
150 #[builder(setter(into), default)]
155 pub recv_window: Option<i64>,
156}
157
158impl GetOnChainYieldsLockedProductListParams {
159 #[must_use]
162 pub fn builder() -> GetOnChainYieldsLockedProductListParamsBuilder {
163 GetOnChainYieldsLockedProductListParamsBuilder::default()
164 }
165}
166#[derive(Clone, Debug, Builder, Default)]
171#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
172pub struct GetOnChainYieldsLockedProductPositionParams {
173 #[builder(setter(into), default)]
177 pub asset: Option<String>,
178 #[builder(setter(into), default)]
183 pub position_id: Option<i64>,
184 #[builder(setter(into), default)]
189 pub project_id: Option<String>,
190 #[builder(setter(into), default)]
194 pub current: Option<i64>,
195 #[builder(setter(into), default)]
199 pub size: Option<i64>,
200 #[builder(setter(into), default)]
205 pub recv_window: Option<i64>,
206}
207
208impl GetOnChainYieldsLockedProductPositionParams {
209 #[must_use]
212 pub fn builder() -> GetOnChainYieldsLockedProductPositionParamsBuilder {
213 GetOnChainYieldsLockedProductPositionParamsBuilder::default()
214 }
215}
216#[derive(Clone, Debug, Builder, Default)]
221#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
222pub struct GetOnChainYieldsLockedRedemptionRecordParams {
223 #[builder(setter(into), default)]
228 pub position_id: Option<i64>,
229 #[builder(setter(into), default)]
234 pub redeem_id: Option<String>,
235 #[builder(setter(into), default)]
239 pub asset: Option<String>,
240 #[builder(setter(into), default)]
245 pub start_time: Option<i64>,
246 #[builder(setter(into), default)]
251 pub end_time: Option<i64>,
252 #[builder(setter(into), default)]
256 pub current: Option<i64>,
257 #[builder(setter(into), default)]
261 pub size: Option<i64>,
262 #[builder(setter(into), default)]
267 pub recv_window: Option<i64>,
268}
269
270impl GetOnChainYieldsLockedRedemptionRecordParams {
271 #[must_use]
274 pub fn builder() -> GetOnChainYieldsLockedRedemptionRecordParamsBuilder {
275 GetOnChainYieldsLockedRedemptionRecordParamsBuilder::default()
276 }
277}
278#[derive(Clone, Debug, Builder, Default)]
283#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
284pub struct GetOnChainYieldsLockedRewardsHistoryParams {
285 #[builder(setter(into), default)]
290 pub position_id: Option<String>,
291 #[builder(setter(into), default)]
295 pub asset: Option<String>,
296 #[builder(setter(into), default)]
301 pub start_time: Option<i64>,
302 #[builder(setter(into), default)]
307 pub end_time: Option<i64>,
308 #[builder(setter(into), default)]
312 pub current: Option<i64>,
313 #[builder(setter(into), default)]
317 pub size: Option<i64>,
318 #[builder(setter(into), default)]
323 pub recv_window: Option<i64>,
324}
325
326impl GetOnChainYieldsLockedRewardsHistoryParams {
327 #[must_use]
330 pub fn builder() -> GetOnChainYieldsLockedRewardsHistoryParamsBuilder {
331 GetOnChainYieldsLockedRewardsHistoryParamsBuilder::default()
332 }
333}
334#[derive(Clone, Debug, Builder)]
339#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
340pub struct GetOnChainYieldsLockedSubscriptionPreviewParams {
341 #[builder(setter(into))]
346 pub project_id: String,
347 #[builder(setter(into))]
351 pub amount: rust_decimal::Decimal,
352 #[builder(setter(into), default)]
356 pub auto_subscribe: Option<bool>,
357 #[builder(setter(into), default)]
362 pub recv_window: Option<i64>,
363}
364
365impl GetOnChainYieldsLockedSubscriptionPreviewParams {
366 #[must_use]
374 pub fn builder(
375 project_id: String,
376 amount: rust_decimal::Decimal,
377 ) -> GetOnChainYieldsLockedSubscriptionPreviewParamsBuilder {
378 GetOnChainYieldsLockedSubscriptionPreviewParamsBuilder::default()
379 .project_id(project_id)
380 .amount(amount)
381 }
382}
383#[derive(Clone, Debug, Builder, Default)]
388#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
389pub struct GetOnChainYieldsLockedSubscriptionRecordParams {
390 #[builder(setter(into), default)]
395 pub purchase_id: Option<String>,
396 #[builder(setter(into), default)]
401 pub client_id: Option<String>,
402 #[builder(setter(into), default)]
406 pub asset: Option<String>,
407 #[builder(setter(into), default)]
412 pub start_time: Option<i64>,
413 #[builder(setter(into), default)]
418 pub end_time: Option<i64>,
419 #[builder(setter(into), default)]
423 pub current: Option<i64>,
424 #[builder(setter(into), default)]
428 pub size: Option<i64>,
429 #[builder(setter(into), default)]
434 pub recv_window: Option<i64>,
435}
436
437impl GetOnChainYieldsLockedSubscriptionRecordParams {
438 #[must_use]
441 pub fn builder() -> GetOnChainYieldsLockedSubscriptionRecordParamsBuilder {
442 GetOnChainYieldsLockedSubscriptionRecordParamsBuilder::default()
443 }
444}
445#[derive(Clone, Debug, Builder, Default)]
450#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
451pub struct OnChainYieldsAccountParams {
452 #[builder(setter(into), default)]
457 pub recv_window: Option<i64>,
458}
459
460impl OnChainYieldsAccountParams {
461 #[must_use]
464 pub fn builder() -> OnChainYieldsAccountParamsBuilder {
465 OnChainYieldsAccountParamsBuilder::default()
466 }
467}
468#[derive(Clone, Debug, Builder)]
473#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
474pub struct RedeemOnChainYieldsLockedProductParams {
475 #[builder(setter(into))]
480 pub position_id: String,
481 #[builder(setter(into), default)]
486 pub channel_id: Option<String>,
487 #[builder(setter(into), default)]
492 pub recv_window: Option<i64>,
493}
494
495impl RedeemOnChainYieldsLockedProductParams {
496 #[must_use]
503 pub fn builder(position_id: String) -> RedeemOnChainYieldsLockedProductParamsBuilder {
504 RedeemOnChainYieldsLockedProductParamsBuilder::default().position_id(position_id)
505 }
506}
507#[derive(Clone, Debug, Builder)]
512#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
513pub struct SetOnChainYieldsLockedAutoSubscribeParams {
514 #[builder(setter(into))]
519 pub position_id: String,
520 #[builder(setter(into))]
524 pub auto_subscribe: bool,
525 #[builder(setter(into), default)]
530 pub recv_window: Option<i64>,
531}
532
533impl SetOnChainYieldsLockedAutoSubscribeParams {
534 #[must_use]
542 pub fn builder(
543 position_id: String,
544 auto_subscribe: bool,
545 ) -> SetOnChainYieldsLockedAutoSubscribeParamsBuilder {
546 SetOnChainYieldsLockedAutoSubscribeParamsBuilder::default()
547 .position_id(position_id)
548 .auto_subscribe(auto_subscribe)
549 }
550}
551#[derive(Clone, Debug, Builder)]
556#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
557pub struct SetOnChainYieldsLockedProductRedeemOptionParams {
558 #[builder(setter(into))]
563 pub position_id: String,
564 #[builder(setter(into))]
568 pub redeem_to: String,
569 #[builder(setter(into), default)]
574 pub recv_window: Option<i64>,
575}
576
577impl SetOnChainYieldsLockedProductRedeemOptionParams {
578 #[must_use]
586 pub fn builder(
587 position_id: String,
588 redeem_to: String,
589 ) -> SetOnChainYieldsLockedProductRedeemOptionParamsBuilder {
590 SetOnChainYieldsLockedProductRedeemOptionParamsBuilder::default()
591 .position_id(position_id)
592 .redeem_to(redeem_to)
593 }
594}
595#[derive(Clone, Debug, Builder)]
600#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
601pub struct SubscribeOnChainYieldsLockedProductParams {
602 #[builder(setter(into))]
607 pub project_id: String,
608 #[builder(setter(into))]
612 pub amount: rust_decimal::Decimal,
613 #[builder(setter(into), default)]
617 pub auto_subscribe: Option<bool>,
618 #[builder(setter(into), default)]
622 pub source_account: Option<String>,
623 #[builder(setter(into), default)]
627 pub redeem_to: Option<String>,
628 #[builder(setter(into), default)]
633 pub channel_id: Option<String>,
634 #[builder(setter(into), default)]
639 pub client_id: Option<String>,
640 #[builder(setter(into), default)]
645 pub recv_window: Option<i64>,
646}
647
648impl SubscribeOnChainYieldsLockedProductParams {
649 #[must_use]
657 pub fn builder(
658 project_id: String,
659 amount: rust_decimal::Decimal,
660 ) -> SubscribeOnChainYieldsLockedProductParamsBuilder {
661 SubscribeOnChainYieldsLockedProductParamsBuilder::default()
662 .project_id(project_id)
663 .amount(amount)
664 }
665}
666
667#[async_trait]
668impl OnChainYieldsApi for OnChainYieldsApiClient {
669 async fn get_on_chain_yields_locked_personal_left_quota(
670 &self,
671 params: GetOnChainYieldsLockedPersonalLeftQuotaParams,
672 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedPersonalLeftQuotaResponse>>
673 {
674 let GetOnChainYieldsLockedPersonalLeftQuotaParams {
675 project_id,
676 recv_window,
677 } = params;
678
679 let mut query_params = BTreeMap::new();
680 let body_params = BTreeMap::new();
681
682 query_params.insert("projectId".to_string(), json!(project_id));
683
684 if let Some(rw) = recv_window {
685 query_params.insert("recvWindow".to_string(), json!(rw));
686 }
687
688 send_request::<models::GetOnChainYieldsLockedPersonalLeftQuotaResponse>(
689 &self.configuration,
690 "/sapi/v1/onchain-yields/locked/personalLeftQuota",
691 reqwest::Method::GET,
692 query_params,
693 body_params,
694 if HAS_TIME_UNIT {
695 self.configuration.time_unit
696 } else {
697 None
698 },
699 true,
700 )
701 .await
702 }
703
704 async fn get_on_chain_yields_locked_product_list(
705 &self,
706 params: GetOnChainYieldsLockedProductListParams,
707 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedProductListResponse>> {
708 let GetOnChainYieldsLockedProductListParams {
709 asset,
710 current,
711 size,
712 recv_window,
713 } = params;
714
715 let mut query_params = BTreeMap::new();
716 let body_params = BTreeMap::new();
717
718 if let Some(rw) = asset {
719 query_params.insert("asset".to_string(), json!(rw));
720 }
721
722 if let Some(rw) = current {
723 query_params.insert("current".to_string(), json!(rw));
724 }
725
726 if let Some(rw) = size {
727 query_params.insert("size".to_string(), json!(rw));
728 }
729
730 if let Some(rw) = recv_window {
731 query_params.insert("recvWindow".to_string(), json!(rw));
732 }
733
734 send_request::<models::GetOnChainYieldsLockedProductListResponse>(
735 &self.configuration,
736 "/sapi/v1/onchain-yields/locked/list",
737 reqwest::Method::GET,
738 query_params,
739 body_params,
740 if HAS_TIME_UNIT {
741 self.configuration.time_unit
742 } else {
743 None
744 },
745 true,
746 )
747 .await
748 }
749
750 async fn get_on_chain_yields_locked_product_position(
751 &self,
752 params: GetOnChainYieldsLockedProductPositionParams,
753 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedProductPositionResponse>>
754 {
755 let GetOnChainYieldsLockedProductPositionParams {
756 asset,
757 position_id,
758 project_id,
759 current,
760 size,
761 recv_window,
762 } = params;
763
764 let mut query_params = BTreeMap::new();
765 let body_params = BTreeMap::new();
766
767 if let Some(rw) = asset {
768 query_params.insert("asset".to_string(), json!(rw));
769 }
770
771 if let Some(rw) = position_id {
772 query_params.insert("positionId".to_string(), json!(rw));
773 }
774
775 if let Some(rw) = project_id {
776 query_params.insert("projectId".to_string(), json!(rw));
777 }
778
779 if let Some(rw) = current {
780 query_params.insert("current".to_string(), json!(rw));
781 }
782
783 if let Some(rw) = size {
784 query_params.insert("size".to_string(), json!(rw));
785 }
786
787 if let Some(rw) = recv_window {
788 query_params.insert("recvWindow".to_string(), json!(rw));
789 }
790
791 send_request::<models::GetOnChainYieldsLockedProductPositionResponse>(
792 &self.configuration,
793 "/sapi/v1/onchain-yields/locked/position",
794 reqwest::Method::GET,
795 query_params,
796 body_params,
797 if HAS_TIME_UNIT {
798 self.configuration.time_unit
799 } else {
800 None
801 },
802 true,
803 )
804 .await
805 }
806
807 async fn get_on_chain_yields_locked_redemption_record(
808 &self,
809 params: GetOnChainYieldsLockedRedemptionRecordParams,
810 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedRedemptionRecordResponse>>
811 {
812 let GetOnChainYieldsLockedRedemptionRecordParams {
813 position_id,
814 redeem_id,
815 asset,
816 start_time,
817 end_time,
818 current,
819 size,
820 recv_window,
821 } = params;
822
823 let mut query_params = BTreeMap::new();
824 let body_params = BTreeMap::new();
825
826 if let Some(rw) = position_id {
827 query_params.insert("positionId".to_string(), json!(rw));
828 }
829
830 if let Some(rw) = redeem_id {
831 query_params.insert("redeemId".to_string(), json!(rw));
832 }
833
834 if let Some(rw) = asset {
835 query_params.insert("asset".to_string(), json!(rw));
836 }
837
838 if let Some(rw) = start_time {
839 query_params.insert("startTime".to_string(), json!(rw));
840 }
841
842 if let Some(rw) = end_time {
843 query_params.insert("endTime".to_string(), json!(rw));
844 }
845
846 if let Some(rw) = current {
847 query_params.insert("current".to_string(), json!(rw));
848 }
849
850 if let Some(rw) = size {
851 query_params.insert("size".to_string(), json!(rw));
852 }
853
854 if let Some(rw) = recv_window {
855 query_params.insert("recvWindow".to_string(), json!(rw));
856 }
857
858 send_request::<models::GetOnChainYieldsLockedRedemptionRecordResponse>(
859 &self.configuration,
860 "/sapi/v1/onchain-yields/locked/history/redemptionRecord",
861 reqwest::Method::GET,
862 query_params,
863 body_params,
864 if HAS_TIME_UNIT {
865 self.configuration.time_unit
866 } else {
867 None
868 },
869 true,
870 )
871 .await
872 }
873
874 async fn get_on_chain_yields_locked_rewards_history(
875 &self,
876 params: GetOnChainYieldsLockedRewardsHistoryParams,
877 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedRewardsHistoryResponse>> {
878 let GetOnChainYieldsLockedRewardsHistoryParams {
879 position_id,
880 asset,
881 start_time,
882 end_time,
883 current,
884 size,
885 recv_window,
886 } = params;
887
888 let mut query_params = BTreeMap::new();
889 let body_params = BTreeMap::new();
890
891 if let Some(rw) = position_id {
892 query_params.insert("positionId".to_string(), json!(rw));
893 }
894
895 if let Some(rw) = asset {
896 query_params.insert("asset".to_string(), json!(rw));
897 }
898
899 if let Some(rw) = start_time {
900 query_params.insert("startTime".to_string(), json!(rw));
901 }
902
903 if let Some(rw) = end_time {
904 query_params.insert("endTime".to_string(), json!(rw));
905 }
906
907 if let Some(rw) = current {
908 query_params.insert("current".to_string(), json!(rw));
909 }
910
911 if let Some(rw) = size {
912 query_params.insert("size".to_string(), json!(rw));
913 }
914
915 if let Some(rw) = recv_window {
916 query_params.insert("recvWindow".to_string(), json!(rw));
917 }
918
919 send_request::<models::GetOnChainYieldsLockedRewardsHistoryResponse>(
920 &self.configuration,
921 "/sapi/v1/onchain-yields/locked/history/rewardsRecord",
922 reqwest::Method::GET,
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 get_on_chain_yields_locked_subscription_preview(
936 &self,
937 params: GetOnChainYieldsLockedSubscriptionPreviewParams,
938 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedSubscriptionPreviewResponse>>
939 {
940 let GetOnChainYieldsLockedSubscriptionPreviewParams {
941 project_id,
942 amount,
943 auto_subscribe,
944 recv_window,
945 } = params;
946
947 let mut query_params = BTreeMap::new();
948 let body_params = BTreeMap::new();
949
950 query_params.insert("projectId".to_string(), json!(project_id));
951
952 query_params.insert("amount".to_string(), json!(amount));
953
954 if let Some(rw) = auto_subscribe {
955 query_params.insert("autoSubscribe".to_string(), json!(rw));
956 }
957
958 if let Some(rw) = recv_window {
959 query_params.insert("recvWindow".to_string(), json!(rw));
960 }
961
962 send_request::<models::GetOnChainYieldsLockedSubscriptionPreviewResponse>(
963 &self.configuration,
964 "/sapi/v1/onchain-yields/locked/subscriptionPreview",
965 reqwest::Method::GET,
966 query_params,
967 body_params,
968 if HAS_TIME_UNIT {
969 self.configuration.time_unit
970 } else {
971 None
972 },
973 true,
974 )
975 .await
976 }
977
978 async fn get_on_chain_yields_locked_subscription_record(
979 &self,
980 params: GetOnChainYieldsLockedSubscriptionRecordParams,
981 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedSubscriptionRecordResponse>>
982 {
983 let GetOnChainYieldsLockedSubscriptionRecordParams {
984 purchase_id,
985 client_id,
986 asset,
987 start_time,
988 end_time,
989 current,
990 size,
991 recv_window,
992 } = params;
993
994 let mut query_params = BTreeMap::new();
995 let body_params = BTreeMap::new();
996
997 if let Some(rw) = purchase_id {
998 query_params.insert("purchaseId".to_string(), json!(rw));
999 }
1000
1001 if let Some(rw) = client_id {
1002 query_params.insert("clientId".to_string(), json!(rw));
1003 }
1004
1005 if let Some(rw) = asset {
1006 query_params.insert("asset".to_string(), json!(rw));
1007 }
1008
1009 if let Some(rw) = start_time {
1010 query_params.insert("startTime".to_string(), json!(rw));
1011 }
1012
1013 if let Some(rw) = end_time {
1014 query_params.insert("endTime".to_string(), json!(rw));
1015 }
1016
1017 if let Some(rw) = current {
1018 query_params.insert("current".to_string(), json!(rw));
1019 }
1020
1021 if let Some(rw) = size {
1022 query_params.insert("size".to_string(), json!(rw));
1023 }
1024
1025 if let Some(rw) = recv_window {
1026 query_params.insert("recvWindow".to_string(), json!(rw));
1027 }
1028
1029 send_request::<models::GetOnChainYieldsLockedSubscriptionRecordResponse>(
1030 &self.configuration,
1031 "/sapi/v1/onchain-yields/locked/history/subscriptionRecord",
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 on_chain_yields_account(
1046 &self,
1047 params: OnChainYieldsAccountParams,
1048 ) -> anyhow::Result<RestApiResponse<models::OnChainYieldsAccountResponse>> {
1049 let OnChainYieldsAccountParams { recv_window } = params;
1050
1051 let mut query_params = BTreeMap::new();
1052 let body_params = BTreeMap::new();
1053
1054 if let Some(rw) = recv_window {
1055 query_params.insert("recvWindow".to_string(), json!(rw));
1056 }
1057
1058 send_request::<models::OnChainYieldsAccountResponse>(
1059 &self.configuration,
1060 "/sapi/v1/onchain-yields/account",
1061 reqwest::Method::GET,
1062 query_params,
1063 body_params,
1064 if HAS_TIME_UNIT {
1065 self.configuration.time_unit
1066 } else {
1067 None
1068 },
1069 true,
1070 )
1071 .await
1072 }
1073
1074 async fn redeem_on_chain_yields_locked_product(
1075 &self,
1076 params: RedeemOnChainYieldsLockedProductParams,
1077 ) -> anyhow::Result<RestApiResponse<models::RedeemOnChainYieldsLockedProductResponse>> {
1078 let RedeemOnChainYieldsLockedProductParams {
1079 position_id,
1080 channel_id,
1081 recv_window,
1082 } = params;
1083
1084 let mut query_params = BTreeMap::new();
1085 let body_params = BTreeMap::new();
1086
1087 query_params.insert("positionId".to_string(), json!(position_id));
1088
1089 if let Some(rw) = channel_id {
1090 query_params.insert("channelId".to_string(), json!(rw));
1091 }
1092
1093 if let Some(rw) = recv_window {
1094 query_params.insert("recvWindow".to_string(), json!(rw));
1095 }
1096
1097 send_request::<models::RedeemOnChainYieldsLockedProductResponse>(
1098 &self.configuration,
1099 "/sapi/v1/onchain-yields/locked/redeem",
1100 reqwest::Method::POST,
1101 query_params,
1102 body_params,
1103 if HAS_TIME_UNIT {
1104 self.configuration.time_unit
1105 } else {
1106 None
1107 },
1108 true,
1109 )
1110 .await
1111 }
1112
1113 async fn set_on_chain_yields_locked_auto_subscribe(
1114 &self,
1115 params: SetOnChainYieldsLockedAutoSubscribeParams,
1116 ) -> anyhow::Result<RestApiResponse<models::SetOnChainYieldsLockedAutoSubscribeResponse>> {
1117 let SetOnChainYieldsLockedAutoSubscribeParams {
1118 position_id,
1119 auto_subscribe,
1120 recv_window,
1121 } = params;
1122
1123 let mut query_params = BTreeMap::new();
1124 let body_params = BTreeMap::new();
1125
1126 query_params.insert("positionId".to_string(), json!(position_id));
1127
1128 query_params.insert("autoSubscribe".to_string(), json!(auto_subscribe));
1129
1130 if let Some(rw) = recv_window {
1131 query_params.insert("recvWindow".to_string(), json!(rw));
1132 }
1133
1134 send_request::<models::SetOnChainYieldsLockedAutoSubscribeResponse>(
1135 &self.configuration,
1136 "/sapi/v1/onchain-yields/locked/setAutoSubscribe",
1137 reqwest::Method::POST,
1138 query_params,
1139 body_params,
1140 if HAS_TIME_UNIT {
1141 self.configuration.time_unit
1142 } else {
1143 None
1144 },
1145 true,
1146 )
1147 .await
1148 }
1149
1150 async fn set_on_chain_yields_locked_product_redeem_option(
1151 &self,
1152 params: SetOnChainYieldsLockedProductRedeemOptionParams,
1153 ) -> anyhow::Result<RestApiResponse<models::SetOnChainYieldsLockedProductRedeemOptionResponse>>
1154 {
1155 let SetOnChainYieldsLockedProductRedeemOptionParams {
1156 position_id,
1157 redeem_to,
1158 recv_window,
1159 } = params;
1160
1161 let mut query_params = BTreeMap::new();
1162 let body_params = BTreeMap::new();
1163
1164 query_params.insert("positionId".to_string(), json!(position_id));
1165
1166 query_params.insert("redeemTo".to_string(), json!(redeem_to));
1167
1168 if let Some(rw) = recv_window {
1169 query_params.insert("recvWindow".to_string(), json!(rw));
1170 }
1171
1172 send_request::<models::SetOnChainYieldsLockedProductRedeemOptionResponse>(
1173 &self.configuration,
1174 "/sapi/v1/onchain-yields/locked/setRedeemOption",
1175 reqwest::Method::POST,
1176 query_params,
1177 body_params,
1178 if HAS_TIME_UNIT {
1179 self.configuration.time_unit
1180 } else {
1181 None
1182 },
1183 true,
1184 )
1185 .await
1186 }
1187
1188 async fn subscribe_on_chain_yields_locked_product(
1189 &self,
1190 params: SubscribeOnChainYieldsLockedProductParams,
1191 ) -> anyhow::Result<RestApiResponse<models::SubscribeOnChainYieldsLockedProductResponse>> {
1192 let SubscribeOnChainYieldsLockedProductParams {
1193 project_id,
1194 amount,
1195 auto_subscribe,
1196 source_account,
1197 redeem_to,
1198 channel_id,
1199 client_id,
1200 recv_window,
1201 } = params;
1202
1203 let mut query_params = BTreeMap::new();
1204 let body_params = BTreeMap::new();
1205
1206 query_params.insert("projectId".to_string(), json!(project_id));
1207
1208 query_params.insert("amount".to_string(), json!(amount));
1209
1210 if let Some(rw) = auto_subscribe {
1211 query_params.insert("autoSubscribe".to_string(), json!(rw));
1212 }
1213
1214 if let Some(rw) = source_account {
1215 query_params.insert("sourceAccount".to_string(), json!(rw));
1216 }
1217
1218 if let Some(rw) = redeem_to {
1219 query_params.insert("redeemTo".to_string(), json!(rw));
1220 }
1221
1222 if let Some(rw) = channel_id {
1223 query_params.insert("channelId".to_string(), json!(rw));
1224 }
1225
1226 if let Some(rw) = client_id {
1227 query_params.insert("clientId".to_string(), json!(rw));
1228 }
1229
1230 if let Some(rw) = recv_window {
1231 query_params.insert("recvWindow".to_string(), json!(rw));
1232 }
1233
1234 send_request::<models::SubscribeOnChainYieldsLockedProductResponse>(
1235 &self.configuration,
1236 "/sapi/v1/onchain-yields/locked/subscribe",
1237 reqwest::Method::POST,
1238 query_params,
1239 body_params,
1240 if HAS_TIME_UNIT {
1241 self.configuration.time_unit
1242 } else {
1243 None
1244 },
1245 true,
1246 )
1247 .await
1248 }
1249}
1250
1251#[cfg(all(test, feature = "staking"))]
1252mod tests {
1253 use super::*;
1254 use crate::TOKIO_SHARED_RT;
1255 use crate::{errors::ConnectorError, models::DataFuture, models::RestApiRateLimit};
1256 use async_trait::async_trait;
1257 use std::collections::HashMap;
1258
1259 struct DummyRestApiResponse<T> {
1260 inner: Box<dyn FnOnce() -> DataFuture<Result<T, ConnectorError>> + Send + Sync>,
1261 status: u16,
1262 headers: HashMap<String, String>,
1263 rate_limits: Option<Vec<RestApiRateLimit>>,
1264 }
1265
1266 impl<T> From<DummyRestApiResponse<T>> for RestApiResponse<T> {
1267 fn from(dummy: DummyRestApiResponse<T>) -> Self {
1268 Self {
1269 data_fn: dummy.inner,
1270 status: dummy.status,
1271 headers: dummy.headers,
1272 rate_limits: dummy.rate_limits,
1273 }
1274 }
1275 }
1276
1277 struct MockOnChainYieldsApiClient {
1278 force_error: bool,
1279 }
1280
1281 #[async_trait]
1282 impl OnChainYieldsApi for MockOnChainYieldsApiClient {
1283 async fn get_on_chain_yields_locked_personal_left_quota(
1284 &self,
1285 _params: GetOnChainYieldsLockedPersonalLeftQuotaParams,
1286 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedPersonalLeftQuotaResponse>>
1287 {
1288 if self.force_error {
1289 return Err(ConnectorError::ConnectorClientError {
1290 msg: "ResponseError".to_string(),
1291 code: None,
1292 }
1293 .into());
1294 }
1295
1296 let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#).unwrap();
1297 let dummy_response: models::GetOnChainYieldsLockedPersonalLeftQuotaResponse =
1298 serde_json::from_value(resp_json.clone()).expect(
1299 "should parse into models::GetOnChainYieldsLockedPersonalLeftQuotaResponse",
1300 );
1301
1302 let dummy = DummyRestApiResponse {
1303 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1304 status: 200,
1305 headers: HashMap::new(),
1306 rate_limits: None,
1307 };
1308
1309 Ok(dummy.into())
1310 }
1311
1312 async fn get_on_chain_yields_locked_product_list(
1313 &self,
1314 _params: GetOnChainYieldsLockedProductListParams,
1315 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedProductListResponse>>
1316 {
1317 if self.force_error {
1318 return Err(ConnectorError::ConnectorClientError {
1319 msg: "ResponseError".to_string(),
1320 code: None,
1321 }
1322 .into());
1323 }
1324
1325 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"projectId":"Solv-60d","detail":{"asset":"BTC","rewardAsset":"SOLV","duration":60,"renewable":true,"isSoldOut":true,"apr":"0.039","status":"PREHEATING","subscriptionStartTime":1646182276000,"canRedeemToFlex":true},"quota":{"totalPersonalQuota":"2","minimum":"0.001"}}],"total":1}"#).unwrap();
1326 let dummy_response: models::GetOnChainYieldsLockedProductListResponse =
1327 serde_json::from_value(resp_json.clone())
1328 .expect("should parse into models::GetOnChainYieldsLockedProductListResponse");
1329
1330 let dummy = DummyRestApiResponse {
1331 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1332 status: 200,
1333 headers: HashMap::new(),
1334 rate_limits: None,
1335 };
1336
1337 Ok(dummy.into())
1338 }
1339
1340 async fn get_on_chain_yields_locked_product_position(
1341 &self,
1342 _params: GetOnChainYieldsLockedProductPositionParams,
1343 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedProductPositionResponse>>
1344 {
1345 if self.force_error {
1346 return Err(ConnectorError::ConnectorClientError {
1347 msg: "ResponseError".to_string(),
1348 code: None,
1349 }
1350 .into());
1351 }
1352
1353 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","projectId":"Solv-60d","asset":"BTC","amount":"122.09202928","purchaseTime":"1646182276000","duration":"60","accrualDays":"4","rewardAsset":"SOLV","APY":"0.039","rewardAmt":"5.17181528","nextPay":"1.29295383","nextPayDate":"1646697600000","payPeriod":"1","rewardsPayDate":"1646697600000","rewardsEndDate":"1651449600000","deliverDate":"1651536000000","nextSubscriptionDate":"1651536000000","redeemingAmt":"232.2323","redeemTo":"FLEXIBLE","canRedeemEarly":true,"autoSubscribe":true,"type":"AUTO","status":"HOLDING"}],"total":1}"#).unwrap();
1354 let dummy_response: models::GetOnChainYieldsLockedProductPositionResponse =
1355 serde_json::from_value(resp_json.clone()).expect(
1356 "should parse into models::GetOnChainYieldsLockedProductPositionResponse",
1357 );
1358
1359 let dummy = DummyRestApiResponse {
1360 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1361 status: 200,
1362 headers: HashMap::new(),
1363 rate_limits: None,
1364 };
1365
1366 Ok(dummy.into())
1367 }
1368
1369 async fn get_on_chain_yields_locked_redemption_record(
1370 &self,
1371 _params: GetOnChainYieldsLockedRedemptionRecordParams,
1372 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedRedemptionRecordResponse>>
1373 {
1374 if self.force_error {
1375 return Err(ConnectorError::ConnectorClientError {
1376 msg: "ResponseError".to_string(),
1377 code: None,
1378 }
1379 .into());
1380 }
1381
1382 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","redeemId":40607,"time":1575018510000,"asset":"BTC","lockPeriod":"30","amount":"21312.23223","originalAmount":"21312.23223","type":"NORMAL","deliverDate":"1575018510000","lossAmount":"0.00001232","isComplete":true,"rewardAsset":"SOLV","rewardAmt":"5.17181528","status":"PAID"}],"total":1}"#).unwrap();
1383 let dummy_response: models::GetOnChainYieldsLockedRedemptionRecordResponse =
1384 serde_json::from_value(resp_json.clone()).expect(
1385 "should parse into models::GetOnChainYieldsLockedRedemptionRecordResponse",
1386 );
1387
1388 let dummy = DummyRestApiResponse {
1389 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1390 status: 200,
1391 headers: HashMap::new(),
1392 rate_limits: None,
1393 };
1394
1395 Ok(dummy.into())
1396 }
1397
1398 async fn get_on_chain_yields_locked_rewards_history(
1399 &self,
1400 _params: GetOnChainYieldsLockedRewardsHistoryParams,
1401 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedRewardsHistoryResponse>>
1402 {
1403 if self.force_error {
1404 return Err(ConnectorError::ConnectorClientError {
1405 msg: "ResponseError".to_string(),
1406 code: None,
1407 }
1408 .into());
1409 }
1410
1411 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223"}],"total":1}"#).unwrap();
1412 let dummy_response: models::GetOnChainYieldsLockedRewardsHistoryResponse =
1413 serde_json::from_value(resp_json.clone()).expect(
1414 "should parse into models::GetOnChainYieldsLockedRewardsHistoryResponse",
1415 );
1416
1417 let dummy = DummyRestApiResponse {
1418 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1419 status: 200,
1420 headers: HashMap::new(),
1421 rate_limits: None,
1422 };
1423
1424 Ok(dummy.into())
1425 }
1426
1427 async fn get_on_chain_yields_locked_subscription_preview(
1428 &self,
1429 _params: GetOnChainYieldsLockedSubscriptionPreviewParams,
1430 ) -> anyhow::Result<
1431 RestApiResponse<models::GetOnChainYieldsLockedSubscriptionPreviewResponse>,
1432 > {
1433 if self.force_error {
1434 return Err(ConnectorError::ConnectorClientError {
1435 msg: "ResponseError".to_string(),
1436 code: None,
1437 }
1438 .into());
1439 }
1440
1441 let resp_json: Value = serde_json::from_str(r#"{"rewardAsset":"SOLV","totalRewardAmt":"5.17181528","nextPay":"1.29295383","nextPayDate":"1646697600000","rewardsPayDate":"1646697600000","valueDate":"1646697600000","rewardsEndDate":"1651449600000","deliverDate":"1651536000000","nextSubscriptionDate":"1651536000000"}"#).unwrap();
1442 let dummy_response: models::GetOnChainYieldsLockedSubscriptionPreviewResponse =
1443 serde_json::from_value(resp_json.clone()).expect(
1444 "should parse into models::GetOnChainYieldsLockedSubscriptionPreviewResponse",
1445 );
1446
1447 let dummy = DummyRestApiResponse {
1448 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1449 status: 200,
1450 headers: HashMap::new(),
1451 rate_limits: None,
1452 };
1453
1454 Ok(dummy.into())
1455 }
1456
1457 async fn get_on_chain_yields_locked_subscription_record(
1458 &self,
1459 _params: GetOnChainYieldsLockedSubscriptionRecordParams,
1460 ) -> anyhow::Result<RestApiResponse<models::GetOnChainYieldsLockedSubscriptionRecordResponse>>
1461 {
1462 if self.force_error {
1463 return Err(ConnectorError::ConnectorClientError {
1464 msg: "ResponseError".to_string(),
1465 code: None,
1466 }
1467 .into());
1468 }
1469
1470 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","purchaseId":"26055","projectId":"Solv-60d","clientId":"ABC","time":1575018510000,"asset":"BTC","amount":"21312.23223","lockPeriod":"30","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap();
1471 let dummy_response: models::GetOnChainYieldsLockedSubscriptionRecordResponse =
1472 serde_json::from_value(resp_json.clone()).expect(
1473 "should parse into models::GetOnChainYieldsLockedSubscriptionRecordResponse",
1474 );
1475
1476 let dummy = DummyRestApiResponse {
1477 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1478 status: 200,
1479 headers: HashMap::new(),
1480 rate_limits: None,
1481 };
1482
1483 Ok(dummy.into())
1484 }
1485
1486 async fn on_chain_yields_account(
1487 &self,
1488 _params: OnChainYieldsAccountParams,
1489 ) -> anyhow::Result<RestApiResponse<models::OnChainYieldsAccountResponse>> {
1490 if self.force_error {
1491 return Err(ConnectorError::ConnectorClientError {
1492 msg: "ResponseError".to_string(),
1493 code: None,
1494 }
1495 .into());
1496 }
1497
1498 let resp_json: Value = serde_json::from_str(r#"{"totalAmountInBTC":"0.01067982","totalAmountInUSDT":"77.13289230","totalFlexibleAmountInBTC":"0.00000000","totalFlexibleAmountInUSDT":"0.00000000","totalLockedInBTC":"0.01067982","totalLockedInUSDT":"77.13289230"}"#).unwrap();
1499 let dummy_response: models::OnChainYieldsAccountResponse =
1500 serde_json::from_value(resp_json.clone())
1501 .expect("should parse into models::OnChainYieldsAccountResponse");
1502
1503 let dummy = DummyRestApiResponse {
1504 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1505 status: 200,
1506 headers: HashMap::new(),
1507 rate_limits: None,
1508 };
1509
1510 Ok(dummy.into())
1511 }
1512
1513 async fn redeem_on_chain_yields_locked_product(
1514 &self,
1515 _params: RedeemOnChainYieldsLockedProductParams,
1516 ) -> anyhow::Result<RestApiResponse<models::RedeemOnChainYieldsLockedProductResponse>>
1517 {
1518 if self.force_error {
1519 return Err(ConnectorError::ConnectorClientError {
1520 msg: "ResponseError".to_string(),
1521 code: None,
1522 }
1523 .into());
1524 }
1525
1526 let resp_json: Value =
1527 serde_json::from_str(r#"{"redeemId":40607,"success":true}"#).unwrap();
1528 let dummy_response: models::RedeemOnChainYieldsLockedProductResponse =
1529 serde_json::from_value(resp_json.clone())
1530 .expect("should parse into models::RedeemOnChainYieldsLockedProductResponse");
1531
1532 let dummy = DummyRestApiResponse {
1533 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1534 status: 200,
1535 headers: HashMap::new(),
1536 rate_limits: None,
1537 };
1538
1539 Ok(dummy.into())
1540 }
1541
1542 async fn set_on_chain_yields_locked_auto_subscribe(
1543 &self,
1544 _params: SetOnChainYieldsLockedAutoSubscribeParams,
1545 ) -> anyhow::Result<RestApiResponse<models::SetOnChainYieldsLockedAutoSubscribeResponse>>
1546 {
1547 if self.force_error {
1548 return Err(ConnectorError::ConnectorClientError {
1549 msg: "ResponseError".to_string(),
1550 code: None,
1551 }
1552 .into());
1553 }
1554
1555 let resp_json: Value = serde_json::from_str(r#"{"success":true}"#).unwrap();
1556 let dummy_response: models::SetOnChainYieldsLockedAutoSubscribeResponse =
1557 serde_json::from_value(resp_json.clone()).expect(
1558 "should parse into models::SetOnChainYieldsLockedAutoSubscribeResponse",
1559 );
1560
1561 let dummy = DummyRestApiResponse {
1562 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1563 status: 200,
1564 headers: HashMap::new(),
1565 rate_limits: None,
1566 };
1567
1568 Ok(dummy.into())
1569 }
1570
1571 async fn set_on_chain_yields_locked_product_redeem_option(
1572 &self,
1573 _params: SetOnChainYieldsLockedProductRedeemOptionParams,
1574 ) -> anyhow::Result<
1575 RestApiResponse<models::SetOnChainYieldsLockedProductRedeemOptionResponse>,
1576 > {
1577 if self.force_error {
1578 return Err(ConnectorError::ConnectorClientError {
1579 msg: "ResponseError".to_string(),
1580 code: None,
1581 }
1582 .into());
1583 }
1584
1585 let resp_json: Value = serde_json::from_str(r#"{"success":true}"#).unwrap();
1586 let dummy_response: models::SetOnChainYieldsLockedProductRedeemOptionResponse =
1587 serde_json::from_value(resp_json.clone()).expect(
1588 "should parse into models::SetOnChainYieldsLockedProductRedeemOptionResponse",
1589 );
1590
1591 let dummy = DummyRestApiResponse {
1592 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1593 status: 200,
1594 headers: HashMap::new(),
1595 rate_limits: None,
1596 };
1597
1598 Ok(dummy.into())
1599 }
1600
1601 async fn subscribe_on_chain_yields_locked_product(
1602 &self,
1603 _params: SubscribeOnChainYieldsLockedProductParams,
1604 ) -> anyhow::Result<RestApiResponse<models::SubscribeOnChainYieldsLockedProductResponse>>
1605 {
1606 if self.force_error {
1607 return Err(ConnectorError::ConnectorClientError {
1608 msg: "ResponseError".to_string(),
1609 code: None,
1610 }
1611 .into());
1612 }
1613
1614 let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","amount":"75.46000000","success":true}"#).unwrap();
1615 let dummy_response: models::SubscribeOnChainYieldsLockedProductResponse =
1616 serde_json::from_value(resp_json.clone()).expect(
1617 "should parse into models::SubscribeOnChainYieldsLockedProductResponse",
1618 );
1619
1620 let dummy = DummyRestApiResponse {
1621 inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
1622 status: 200,
1623 headers: HashMap::new(),
1624 rate_limits: None,
1625 };
1626
1627 Ok(dummy.into())
1628 }
1629 }
1630
1631 #[test]
1632 fn get_on_chain_yields_locked_personal_left_quota_required_params_success() {
1633 TOKIO_SHARED_RT.block_on(async {
1634 let client = MockOnChainYieldsApiClient { force_error: false };
1635
1636 let params = GetOnChainYieldsLockedPersonalLeftQuotaParams::builder("1".to_string())
1637 .build()
1638 .unwrap();
1639
1640 let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#).unwrap();
1641 let expected_response: models::GetOnChainYieldsLockedPersonalLeftQuotaResponse =
1642 serde_json::from_value(resp_json.clone()).expect(
1643 "should parse into models::GetOnChainYieldsLockedPersonalLeftQuotaResponse",
1644 );
1645
1646 let resp = client
1647 .get_on_chain_yields_locked_personal_left_quota(params)
1648 .await
1649 .expect("Expected a response");
1650 let data_future = resp.data();
1651 let actual_response = data_future.await.unwrap();
1652 assert_eq!(actual_response, expected_response);
1653 });
1654 }
1655
1656 #[test]
1657 fn get_on_chain_yields_locked_personal_left_quota_optional_params_success() {
1658 TOKIO_SHARED_RT.block_on(async {
1659 let client = MockOnChainYieldsApiClient { force_error: false };
1660
1661 let params = GetOnChainYieldsLockedPersonalLeftQuotaParams::builder("1".to_string())
1662 .recv_window(5000)
1663 .build()
1664 .unwrap();
1665
1666 let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#).unwrap();
1667 let expected_response: models::GetOnChainYieldsLockedPersonalLeftQuotaResponse =
1668 serde_json::from_value(resp_json.clone()).expect(
1669 "should parse into models::GetOnChainYieldsLockedPersonalLeftQuotaResponse",
1670 );
1671
1672 let resp = client
1673 .get_on_chain_yields_locked_personal_left_quota(params)
1674 .await
1675 .expect("Expected a response");
1676 let data_future = resp.data();
1677 let actual_response = data_future.await.unwrap();
1678 assert_eq!(actual_response, expected_response);
1679 });
1680 }
1681
1682 #[test]
1683 fn get_on_chain_yields_locked_personal_left_quota_response_error() {
1684 TOKIO_SHARED_RT.block_on(async {
1685 let client = MockOnChainYieldsApiClient { force_error: true };
1686
1687 let params = GetOnChainYieldsLockedPersonalLeftQuotaParams::builder("1".to_string())
1688 .build()
1689 .unwrap();
1690
1691 match client
1692 .get_on_chain_yields_locked_personal_left_quota(params)
1693 .await
1694 {
1695 Ok(_) => panic!("Expected an error"),
1696 Err(err) => {
1697 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1698 }
1699 }
1700 });
1701 }
1702
1703 #[test]
1704 fn get_on_chain_yields_locked_product_list_required_params_success() {
1705 TOKIO_SHARED_RT.block_on(async {
1706 let client = MockOnChainYieldsApiClient { force_error: false };
1707
1708 let params = GetOnChainYieldsLockedProductListParams::builder().build().unwrap();
1709
1710 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"projectId":"Solv-60d","detail":{"asset":"BTC","rewardAsset":"SOLV","duration":60,"renewable":true,"isSoldOut":true,"apr":"0.039","status":"PREHEATING","subscriptionStartTime":1646182276000,"canRedeemToFlex":true},"quota":{"totalPersonalQuota":"2","minimum":"0.001"}}],"total":1}"#).unwrap();
1711 let expected_response : models::GetOnChainYieldsLockedProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedProductListResponse");
1712
1713 let resp = client.get_on_chain_yields_locked_product_list(params).await.expect("Expected a response");
1714 let data_future = resp.data();
1715 let actual_response = data_future.await.unwrap();
1716 assert_eq!(actual_response, expected_response);
1717 });
1718 }
1719
1720 #[test]
1721 fn get_on_chain_yields_locked_product_list_optional_params_success() {
1722 TOKIO_SHARED_RT.block_on(async {
1723 let client = MockOnChainYieldsApiClient { force_error: false };
1724
1725 let params = GetOnChainYieldsLockedProductListParams::builder().asset("BETH".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
1726
1727 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"projectId":"Solv-60d","detail":{"asset":"BTC","rewardAsset":"SOLV","duration":60,"renewable":true,"isSoldOut":true,"apr":"0.039","status":"PREHEATING","subscriptionStartTime":1646182276000,"canRedeemToFlex":true},"quota":{"totalPersonalQuota":"2","minimum":"0.001"}}],"total":1}"#).unwrap();
1728 let expected_response : models::GetOnChainYieldsLockedProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedProductListResponse");
1729
1730 let resp = client.get_on_chain_yields_locked_product_list(params).await.expect("Expected a response");
1731 let data_future = resp.data();
1732 let actual_response = data_future.await.unwrap();
1733 assert_eq!(actual_response, expected_response);
1734 });
1735 }
1736
1737 #[test]
1738 fn get_on_chain_yields_locked_product_list_response_error() {
1739 TOKIO_SHARED_RT.block_on(async {
1740 let client = MockOnChainYieldsApiClient { force_error: true };
1741
1742 let params = GetOnChainYieldsLockedProductListParams::builder()
1743 .build()
1744 .unwrap();
1745
1746 match client.get_on_chain_yields_locked_product_list(params).await {
1747 Ok(_) => panic!("Expected an error"),
1748 Err(err) => {
1749 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1750 }
1751 }
1752 });
1753 }
1754
1755 #[test]
1756 fn get_on_chain_yields_locked_product_position_required_params_success() {
1757 TOKIO_SHARED_RT.block_on(async {
1758 let client = MockOnChainYieldsApiClient { force_error: false };
1759
1760 let params = GetOnChainYieldsLockedProductPositionParams::builder().build().unwrap();
1761
1762 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","projectId":"Solv-60d","asset":"BTC","amount":"122.09202928","purchaseTime":"1646182276000","duration":"60","accrualDays":"4","rewardAsset":"SOLV","APY":"0.039","rewardAmt":"5.17181528","nextPay":"1.29295383","nextPayDate":"1646697600000","payPeriod":"1","rewardsPayDate":"1646697600000","rewardsEndDate":"1651449600000","deliverDate":"1651536000000","nextSubscriptionDate":"1651536000000","redeemingAmt":"232.2323","redeemTo":"FLEXIBLE","canRedeemEarly":true,"autoSubscribe":true,"type":"AUTO","status":"HOLDING"}],"total":1}"#).unwrap();
1763 let expected_response : models::GetOnChainYieldsLockedProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedProductPositionResponse");
1764
1765 let resp = client.get_on_chain_yields_locked_product_position(params).await.expect("Expected a response");
1766 let data_future = resp.data();
1767 let actual_response = data_future.await.unwrap();
1768 assert_eq!(actual_response, expected_response);
1769 });
1770 }
1771
1772 #[test]
1773 fn get_on_chain_yields_locked_product_position_optional_params_success() {
1774 TOKIO_SHARED_RT.block_on(async {
1775 let client = MockOnChainYieldsApiClient { force_error: false };
1776
1777 let params = GetOnChainYieldsLockedProductPositionParams::builder().asset("BETH".to_string()).position_id(1).project_id("1".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
1778
1779 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","projectId":"Solv-60d","asset":"BTC","amount":"122.09202928","purchaseTime":"1646182276000","duration":"60","accrualDays":"4","rewardAsset":"SOLV","APY":"0.039","rewardAmt":"5.17181528","nextPay":"1.29295383","nextPayDate":"1646697600000","payPeriod":"1","rewardsPayDate":"1646697600000","rewardsEndDate":"1651449600000","deliverDate":"1651536000000","nextSubscriptionDate":"1651536000000","redeemingAmt":"232.2323","redeemTo":"FLEXIBLE","canRedeemEarly":true,"autoSubscribe":true,"type":"AUTO","status":"HOLDING"}],"total":1}"#).unwrap();
1780 let expected_response : models::GetOnChainYieldsLockedProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedProductPositionResponse");
1781
1782 let resp = client.get_on_chain_yields_locked_product_position(params).await.expect("Expected a response");
1783 let data_future = resp.data();
1784 let actual_response = data_future.await.unwrap();
1785 assert_eq!(actual_response, expected_response);
1786 });
1787 }
1788
1789 #[test]
1790 fn get_on_chain_yields_locked_product_position_response_error() {
1791 TOKIO_SHARED_RT.block_on(async {
1792 let client = MockOnChainYieldsApiClient { force_error: true };
1793
1794 let params = GetOnChainYieldsLockedProductPositionParams::builder()
1795 .build()
1796 .unwrap();
1797
1798 match client
1799 .get_on_chain_yields_locked_product_position(params)
1800 .await
1801 {
1802 Ok(_) => panic!("Expected an error"),
1803 Err(err) => {
1804 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1805 }
1806 }
1807 });
1808 }
1809
1810 #[test]
1811 fn get_on_chain_yields_locked_redemption_record_required_params_success() {
1812 TOKIO_SHARED_RT.block_on(async {
1813 let client = MockOnChainYieldsApiClient { force_error: false };
1814
1815 let params = GetOnChainYieldsLockedRedemptionRecordParams::builder().build().unwrap();
1816
1817 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","redeemId":40607,"time":1575018510000,"asset":"BTC","lockPeriod":"30","amount":"21312.23223","originalAmount":"21312.23223","type":"NORMAL","deliverDate":"1575018510000","lossAmount":"0.00001232","isComplete":true,"rewardAsset":"SOLV","rewardAmt":"5.17181528","status":"PAID"}],"total":1}"#).unwrap();
1818 let expected_response : models::GetOnChainYieldsLockedRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedRedemptionRecordResponse");
1819
1820 let resp = client.get_on_chain_yields_locked_redemption_record(params).await.expect("Expected a response");
1821 let data_future = resp.data();
1822 let actual_response = data_future.await.unwrap();
1823 assert_eq!(actual_response, expected_response);
1824 });
1825 }
1826
1827 #[test]
1828 fn get_on_chain_yields_locked_redemption_record_optional_params_success() {
1829 TOKIO_SHARED_RT.block_on(async {
1830 let client = MockOnChainYieldsApiClient { force_error: false };
1831
1832 let params = GetOnChainYieldsLockedRedemptionRecordParams::builder().position_id(1).redeem_id("1".to_string()).asset("BETH".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
1833
1834 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","redeemId":40607,"time":1575018510000,"asset":"BTC","lockPeriod":"30","amount":"21312.23223","originalAmount":"21312.23223","type":"NORMAL","deliverDate":"1575018510000","lossAmount":"0.00001232","isComplete":true,"rewardAsset":"SOLV","rewardAmt":"5.17181528","status":"PAID"}],"total":1}"#).unwrap();
1835 let expected_response : models::GetOnChainYieldsLockedRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedRedemptionRecordResponse");
1836
1837 let resp = client.get_on_chain_yields_locked_redemption_record(params).await.expect("Expected a response");
1838 let data_future = resp.data();
1839 let actual_response = data_future.await.unwrap();
1840 assert_eq!(actual_response, expected_response);
1841 });
1842 }
1843
1844 #[test]
1845 fn get_on_chain_yields_locked_redemption_record_response_error() {
1846 TOKIO_SHARED_RT.block_on(async {
1847 let client = MockOnChainYieldsApiClient { force_error: true };
1848
1849 let params = GetOnChainYieldsLockedRedemptionRecordParams::builder()
1850 .build()
1851 .unwrap();
1852
1853 match client
1854 .get_on_chain_yields_locked_redemption_record(params)
1855 .await
1856 {
1857 Ok(_) => panic!("Expected an error"),
1858 Err(err) => {
1859 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1860 }
1861 }
1862 });
1863 }
1864
1865 #[test]
1866 fn get_on_chain_yields_locked_rewards_history_required_params_success() {
1867 TOKIO_SHARED_RT.block_on(async {
1868 let client = MockOnChainYieldsApiClient { force_error: false };
1869
1870 let params = GetOnChainYieldsLockedRewardsHistoryParams::builder().build().unwrap();
1871
1872 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223"}],"total":1}"#).unwrap();
1873 let expected_response : models::GetOnChainYieldsLockedRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedRewardsHistoryResponse");
1874
1875 let resp = client.get_on_chain_yields_locked_rewards_history(params).await.expect("Expected a response");
1876 let data_future = resp.data();
1877 let actual_response = data_future.await.unwrap();
1878 assert_eq!(actual_response, expected_response);
1879 });
1880 }
1881
1882 #[test]
1883 fn get_on_chain_yields_locked_rewards_history_optional_params_success() {
1884 TOKIO_SHARED_RT.block_on(async {
1885 let client = MockOnChainYieldsApiClient { force_error: false };
1886
1887 let params = GetOnChainYieldsLockedRewardsHistoryParams::builder().position_id("1".to_string()).asset("BETH".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
1888
1889 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223"}],"total":1}"#).unwrap();
1890 let expected_response : models::GetOnChainYieldsLockedRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedRewardsHistoryResponse");
1891
1892 let resp = client.get_on_chain_yields_locked_rewards_history(params).await.expect("Expected a response");
1893 let data_future = resp.data();
1894 let actual_response = data_future.await.unwrap();
1895 assert_eq!(actual_response, expected_response);
1896 });
1897 }
1898
1899 #[test]
1900 fn get_on_chain_yields_locked_rewards_history_response_error() {
1901 TOKIO_SHARED_RT.block_on(async {
1902 let client = MockOnChainYieldsApiClient { force_error: true };
1903
1904 let params = GetOnChainYieldsLockedRewardsHistoryParams::builder()
1905 .build()
1906 .unwrap();
1907
1908 match client
1909 .get_on_chain_yields_locked_rewards_history(params)
1910 .await
1911 {
1912 Ok(_) => panic!("Expected an error"),
1913 Err(err) => {
1914 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1915 }
1916 }
1917 });
1918 }
1919
1920 #[test]
1921 fn get_on_chain_yields_locked_subscription_preview_required_params_success() {
1922 TOKIO_SHARED_RT.block_on(async {
1923 let client = MockOnChainYieldsApiClient { force_error: false };
1924
1925 let params = GetOnChainYieldsLockedSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).build().unwrap();
1926
1927 let resp_json: Value = serde_json::from_str(r#"{"rewardAsset":"SOLV","totalRewardAmt":"5.17181528","nextPay":"1.29295383","nextPayDate":"1646697600000","rewardsPayDate":"1646697600000","valueDate":"1646697600000","rewardsEndDate":"1651449600000","deliverDate":"1651536000000","nextSubscriptionDate":"1651536000000"}"#).unwrap();
1928 let expected_response : models::GetOnChainYieldsLockedSubscriptionPreviewResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedSubscriptionPreviewResponse");
1929
1930 let resp = client.get_on_chain_yields_locked_subscription_preview(params).await.expect("Expected a response");
1931 let data_future = resp.data();
1932 let actual_response = data_future.await.unwrap();
1933 assert_eq!(actual_response, expected_response);
1934 });
1935 }
1936
1937 #[test]
1938 fn get_on_chain_yields_locked_subscription_preview_optional_params_success() {
1939 TOKIO_SHARED_RT.block_on(async {
1940 let client = MockOnChainYieldsApiClient { force_error: false };
1941
1942 let params = GetOnChainYieldsLockedSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).auto_subscribe(true).recv_window(5000).build().unwrap();
1943
1944 let resp_json: Value = serde_json::from_str(r#"{"rewardAsset":"SOLV","totalRewardAmt":"5.17181528","nextPay":"1.29295383","nextPayDate":"1646697600000","rewardsPayDate":"1646697600000","valueDate":"1646697600000","rewardsEndDate":"1651449600000","deliverDate":"1651536000000","nextSubscriptionDate":"1651536000000"}"#).unwrap();
1945 let expected_response : models::GetOnChainYieldsLockedSubscriptionPreviewResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedSubscriptionPreviewResponse");
1946
1947 let resp = client.get_on_chain_yields_locked_subscription_preview(params).await.expect("Expected a response");
1948 let data_future = resp.data();
1949 let actual_response = data_future.await.unwrap();
1950 assert_eq!(actual_response, expected_response);
1951 });
1952 }
1953
1954 #[test]
1955 fn get_on_chain_yields_locked_subscription_preview_response_error() {
1956 TOKIO_SHARED_RT.block_on(async {
1957 let client = MockOnChainYieldsApiClient { force_error: true };
1958
1959 let params = GetOnChainYieldsLockedSubscriptionPreviewParams::builder(
1960 "1".to_string(),
1961 dec!(1.0),
1962 )
1963 .build()
1964 .unwrap();
1965
1966 match client
1967 .get_on_chain_yields_locked_subscription_preview(params)
1968 .await
1969 {
1970 Ok(_) => panic!("Expected an error"),
1971 Err(err) => {
1972 assert_eq!(err.to_string(), "Connector client error: ResponseError");
1973 }
1974 }
1975 });
1976 }
1977
1978 #[test]
1979 fn get_on_chain_yields_locked_subscription_record_required_params_success() {
1980 TOKIO_SHARED_RT.block_on(async {
1981 let client = MockOnChainYieldsApiClient { force_error: false };
1982
1983 let params = GetOnChainYieldsLockedSubscriptionRecordParams::builder().build().unwrap();
1984
1985 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","purchaseId":"26055","projectId":"Solv-60d","clientId":"ABC","time":1575018510000,"asset":"BTC","amount":"21312.23223","lockPeriod":"30","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap();
1986 let expected_response : models::GetOnChainYieldsLockedSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedSubscriptionRecordResponse");
1987
1988 let resp = client.get_on_chain_yields_locked_subscription_record(params).await.expect("Expected a response");
1989 let data_future = resp.data();
1990 let actual_response = data_future.await.unwrap();
1991 assert_eq!(actual_response, expected_response);
1992 });
1993 }
1994
1995 #[test]
1996 fn get_on_chain_yields_locked_subscription_record_optional_params_success() {
1997 TOKIO_SHARED_RT.block_on(async {
1998 let client = MockOnChainYieldsApiClient { force_error: false };
1999
2000 let params = GetOnChainYieldsLockedSubscriptionRecordParams::builder().purchase_id("1".to_string()).client_id("1".to_string()).asset("BETH".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
2001
2002 let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":"123123","purchaseId":"26055","projectId":"Solv-60d","clientId":"ABC","time":1575018510000,"asset":"BTC","amount":"21312.23223","lockPeriod":"30","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap();
2003 let expected_response : models::GetOnChainYieldsLockedSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetOnChainYieldsLockedSubscriptionRecordResponse");
2004
2005 let resp = client.get_on_chain_yields_locked_subscription_record(params).await.expect("Expected a response");
2006 let data_future = resp.data();
2007 let actual_response = data_future.await.unwrap();
2008 assert_eq!(actual_response, expected_response);
2009 });
2010 }
2011
2012 #[test]
2013 fn get_on_chain_yields_locked_subscription_record_response_error() {
2014 TOKIO_SHARED_RT.block_on(async {
2015 let client = MockOnChainYieldsApiClient { force_error: true };
2016
2017 let params = GetOnChainYieldsLockedSubscriptionRecordParams::builder()
2018 .build()
2019 .unwrap();
2020
2021 match client
2022 .get_on_chain_yields_locked_subscription_record(params)
2023 .await
2024 {
2025 Ok(_) => panic!("Expected an error"),
2026 Err(err) => {
2027 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2028 }
2029 }
2030 });
2031 }
2032
2033 #[test]
2034 fn on_chain_yields_account_required_params_success() {
2035 TOKIO_SHARED_RT.block_on(async {
2036 let client = MockOnChainYieldsApiClient { force_error: false };
2037
2038 let params = OnChainYieldsAccountParams::builder().build().unwrap();
2039
2040 let resp_json: Value = serde_json::from_str(r#"{"totalAmountInBTC":"0.01067982","totalAmountInUSDT":"77.13289230","totalFlexibleAmountInBTC":"0.00000000","totalFlexibleAmountInUSDT":"0.00000000","totalLockedInBTC":"0.01067982","totalLockedInUSDT":"77.13289230"}"#).unwrap();
2041 let expected_response : models::OnChainYieldsAccountResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::OnChainYieldsAccountResponse");
2042
2043 let resp = client.on_chain_yields_account(params).await.expect("Expected a response");
2044 let data_future = resp.data();
2045 let actual_response = data_future.await.unwrap();
2046 assert_eq!(actual_response, expected_response);
2047 });
2048 }
2049
2050 #[test]
2051 fn on_chain_yields_account_optional_params_success() {
2052 TOKIO_SHARED_RT.block_on(async {
2053 let client = MockOnChainYieldsApiClient { force_error: false };
2054
2055 let params = OnChainYieldsAccountParams::builder().recv_window(5000).build().unwrap();
2056
2057 let resp_json: Value = serde_json::from_str(r#"{"totalAmountInBTC":"0.01067982","totalAmountInUSDT":"77.13289230","totalFlexibleAmountInBTC":"0.00000000","totalFlexibleAmountInUSDT":"0.00000000","totalLockedInBTC":"0.01067982","totalLockedInUSDT":"77.13289230"}"#).unwrap();
2058 let expected_response : models::OnChainYieldsAccountResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::OnChainYieldsAccountResponse");
2059
2060 let resp = client.on_chain_yields_account(params).await.expect("Expected a response");
2061 let data_future = resp.data();
2062 let actual_response = data_future.await.unwrap();
2063 assert_eq!(actual_response, expected_response);
2064 });
2065 }
2066
2067 #[test]
2068 fn on_chain_yields_account_response_error() {
2069 TOKIO_SHARED_RT.block_on(async {
2070 let client = MockOnChainYieldsApiClient { force_error: true };
2071
2072 let params = OnChainYieldsAccountParams::builder().build().unwrap();
2073
2074 match client.on_chain_yields_account(params).await {
2075 Ok(_) => panic!("Expected an error"),
2076 Err(err) => {
2077 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2078 }
2079 }
2080 });
2081 }
2082
2083 #[test]
2084 fn redeem_on_chain_yields_locked_product_required_params_success() {
2085 TOKIO_SHARED_RT.block_on(async {
2086 let client = MockOnChainYieldsApiClient { force_error: false };
2087
2088 let params = RedeemOnChainYieldsLockedProductParams::builder("1".to_string())
2089 .build()
2090 .unwrap();
2091
2092 let resp_json: Value =
2093 serde_json::from_str(r#"{"redeemId":40607,"success":true}"#).unwrap();
2094 let expected_response: models::RedeemOnChainYieldsLockedProductResponse =
2095 serde_json::from_value(resp_json.clone())
2096 .expect("should parse into models::RedeemOnChainYieldsLockedProductResponse");
2097
2098 let resp = client
2099 .redeem_on_chain_yields_locked_product(params)
2100 .await
2101 .expect("Expected a response");
2102 let data_future = resp.data();
2103 let actual_response = data_future.await.unwrap();
2104 assert_eq!(actual_response, expected_response);
2105 });
2106 }
2107
2108 #[test]
2109 fn redeem_on_chain_yields_locked_product_optional_params_success() {
2110 TOKIO_SHARED_RT.block_on(async {
2111 let client = MockOnChainYieldsApiClient { force_error: false };
2112
2113 let params = RedeemOnChainYieldsLockedProductParams::builder("1".to_string())
2114 .channel_id("1".to_string())
2115 .recv_window(5000)
2116 .build()
2117 .unwrap();
2118
2119 let resp_json: Value =
2120 serde_json::from_str(r#"{"redeemId":40607,"success":true}"#).unwrap();
2121 let expected_response: models::RedeemOnChainYieldsLockedProductResponse =
2122 serde_json::from_value(resp_json.clone())
2123 .expect("should parse into models::RedeemOnChainYieldsLockedProductResponse");
2124
2125 let resp = client
2126 .redeem_on_chain_yields_locked_product(params)
2127 .await
2128 .expect("Expected a response");
2129 let data_future = resp.data();
2130 let actual_response = data_future.await.unwrap();
2131 assert_eq!(actual_response, expected_response);
2132 });
2133 }
2134
2135 #[test]
2136 fn redeem_on_chain_yields_locked_product_response_error() {
2137 TOKIO_SHARED_RT.block_on(async {
2138 let client = MockOnChainYieldsApiClient { force_error: true };
2139
2140 let params = RedeemOnChainYieldsLockedProductParams::builder("1".to_string())
2141 .build()
2142 .unwrap();
2143
2144 match client.redeem_on_chain_yields_locked_product(params).await {
2145 Ok(_) => panic!("Expected an error"),
2146 Err(err) => {
2147 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2148 }
2149 }
2150 });
2151 }
2152
2153 #[test]
2154 fn set_on_chain_yields_locked_auto_subscribe_required_params_success() {
2155 TOKIO_SHARED_RT.block_on(async {
2156 let client = MockOnChainYieldsApiClient { force_error: false };
2157
2158 let params = SetOnChainYieldsLockedAutoSubscribeParams::builder("1".to_string(), true)
2159 .build()
2160 .unwrap();
2161
2162 let resp_json: Value = serde_json::from_str(r#"{"success":true}"#).unwrap();
2163 let expected_response: models::SetOnChainYieldsLockedAutoSubscribeResponse =
2164 serde_json::from_value(resp_json.clone()).expect(
2165 "should parse into models::SetOnChainYieldsLockedAutoSubscribeResponse",
2166 );
2167
2168 let resp = client
2169 .set_on_chain_yields_locked_auto_subscribe(params)
2170 .await
2171 .expect("Expected a response");
2172 let data_future = resp.data();
2173 let actual_response = data_future.await.unwrap();
2174 assert_eq!(actual_response, expected_response);
2175 });
2176 }
2177
2178 #[test]
2179 fn set_on_chain_yields_locked_auto_subscribe_optional_params_success() {
2180 TOKIO_SHARED_RT.block_on(async {
2181 let client = MockOnChainYieldsApiClient { force_error: false };
2182
2183 let params = SetOnChainYieldsLockedAutoSubscribeParams::builder("1".to_string(), true)
2184 .recv_window(5000)
2185 .build()
2186 .unwrap();
2187
2188 let resp_json: Value = serde_json::from_str(r#"{"success":true}"#).unwrap();
2189 let expected_response: models::SetOnChainYieldsLockedAutoSubscribeResponse =
2190 serde_json::from_value(resp_json.clone()).expect(
2191 "should parse into models::SetOnChainYieldsLockedAutoSubscribeResponse",
2192 );
2193
2194 let resp = client
2195 .set_on_chain_yields_locked_auto_subscribe(params)
2196 .await
2197 .expect("Expected a response");
2198 let data_future = resp.data();
2199 let actual_response = data_future.await.unwrap();
2200 assert_eq!(actual_response, expected_response);
2201 });
2202 }
2203
2204 #[test]
2205 fn set_on_chain_yields_locked_auto_subscribe_response_error() {
2206 TOKIO_SHARED_RT.block_on(async {
2207 let client = MockOnChainYieldsApiClient { force_error: true };
2208
2209 let params = SetOnChainYieldsLockedAutoSubscribeParams::builder("1".to_string(), true)
2210 .build()
2211 .unwrap();
2212
2213 match client
2214 .set_on_chain_yields_locked_auto_subscribe(params)
2215 .await
2216 {
2217 Ok(_) => panic!("Expected an error"),
2218 Err(err) => {
2219 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2220 }
2221 }
2222 });
2223 }
2224
2225 #[test]
2226 fn set_on_chain_yields_locked_product_redeem_option_required_params_success() {
2227 TOKIO_SHARED_RT.block_on(async {
2228 let client = MockOnChainYieldsApiClient { force_error: false };
2229
2230 let params = SetOnChainYieldsLockedProductRedeemOptionParams::builder(
2231 "1".to_string(),
2232 "redeem_to_example".to_string(),
2233 )
2234 .build()
2235 .unwrap();
2236
2237 let resp_json: Value = serde_json::from_str(r#"{"success":true}"#).unwrap();
2238 let expected_response: models::SetOnChainYieldsLockedProductRedeemOptionResponse =
2239 serde_json::from_value(resp_json.clone()).expect(
2240 "should parse into models::SetOnChainYieldsLockedProductRedeemOptionResponse",
2241 );
2242
2243 let resp = client
2244 .set_on_chain_yields_locked_product_redeem_option(params)
2245 .await
2246 .expect("Expected a response");
2247 let data_future = resp.data();
2248 let actual_response = data_future.await.unwrap();
2249 assert_eq!(actual_response, expected_response);
2250 });
2251 }
2252
2253 #[test]
2254 fn set_on_chain_yields_locked_product_redeem_option_optional_params_success() {
2255 TOKIO_SHARED_RT.block_on(async {
2256 let client = MockOnChainYieldsApiClient { force_error: false };
2257
2258 let params = SetOnChainYieldsLockedProductRedeemOptionParams::builder(
2259 "1".to_string(),
2260 "redeem_to_example".to_string(),
2261 )
2262 .recv_window(5000)
2263 .build()
2264 .unwrap();
2265
2266 let resp_json: Value = serde_json::from_str(r#"{"success":true}"#).unwrap();
2267 let expected_response: models::SetOnChainYieldsLockedProductRedeemOptionResponse =
2268 serde_json::from_value(resp_json.clone()).expect(
2269 "should parse into models::SetOnChainYieldsLockedProductRedeemOptionResponse",
2270 );
2271
2272 let resp = client
2273 .set_on_chain_yields_locked_product_redeem_option(params)
2274 .await
2275 .expect("Expected a response");
2276 let data_future = resp.data();
2277 let actual_response = data_future.await.unwrap();
2278 assert_eq!(actual_response, expected_response);
2279 });
2280 }
2281
2282 #[test]
2283 fn set_on_chain_yields_locked_product_redeem_option_response_error() {
2284 TOKIO_SHARED_RT.block_on(async {
2285 let client = MockOnChainYieldsApiClient { force_error: true };
2286
2287 let params = SetOnChainYieldsLockedProductRedeemOptionParams::builder(
2288 "1".to_string(),
2289 "redeem_to_example".to_string(),
2290 )
2291 .build()
2292 .unwrap();
2293
2294 match client
2295 .set_on_chain_yields_locked_product_redeem_option(params)
2296 .await
2297 {
2298 Ok(_) => panic!("Expected an error"),
2299 Err(err) => {
2300 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2301 }
2302 }
2303 });
2304 }
2305
2306 #[test]
2307 fn subscribe_on_chain_yields_locked_product_required_params_success() {
2308 TOKIO_SHARED_RT.block_on(async {
2309 let client = MockOnChainYieldsApiClient { force_error: false };
2310
2311 let params = SubscribeOnChainYieldsLockedProductParams::builder("1".to_string(),dec!(1.0),).build().unwrap();
2312
2313 let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","amount":"75.46000000","success":true}"#).unwrap();
2314 let expected_response : models::SubscribeOnChainYieldsLockedProductResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::SubscribeOnChainYieldsLockedProductResponse");
2315
2316 let resp = client.subscribe_on_chain_yields_locked_product(params).await.expect("Expected a response");
2317 let data_future = resp.data();
2318 let actual_response = data_future.await.unwrap();
2319 assert_eq!(actual_response, expected_response);
2320 });
2321 }
2322
2323 #[test]
2324 fn subscribe_on_chain_yields_locked_product_optional_params_success() {
2325 TOKIO_SHARED_RT.block_on(async {
2326 let client = MockOnChainYieldsApiClient { force_error: false };
2327
2328 let params = SubscribeOnChainYieldsLockedProductParams::builder("1".to_string(),dec!(1.0),).auto_subscribe(true).source_account("SPOT".to_string()).redeem_to(String::new()).channel_id("1".to_string()).client_id("1".to_string()).recv_window(5000).build().unwrap();
2329
2330 let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","amount":"75.46000000","success":true}"#).unwrap();
2331 let expected_response : models::SubscribeOnChainYieldsLockedProductResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::SubscribeOnChainYieldsLockedProductResponse");
2332
2333 let resp = client.subscribe_on_chain_yields_locked_product(params).await.expect("Expected a response");
2334 let data_future = resp.data();
2335 let actual_response = data_future.await.unwrap();
2336 assert_eq!(actual_response, expected_response);
2337 });
2338 }
2339
2340 #[test]
2341 fn subscribe_on_chain_yields_locked_product_response_error() {
2342 TOKIO_SHARED_RT.block_on(async {
2343 let client = MockOnChainYieldsApiClient { force_error: true };
2344
2345 let params =
2346 SubscribeOnChainYieldsLockedProductParams::builder("1".to_string(), dec!(1.0))
2347 .build()
2348 .unwrap();
2349
2350 match client
2351 .subscribe_on_chain_yields_locked_product(params)
2352 .await
2353 {
2354 Ok(_) => panic!("Expected an error"),
2355 Err(err) => {
2356 assert_eq!(err.to_string(), "Connector client error: ResponseError");
2357 }
2358 }
2359 });
2360 }
2361}