Skip to main content

binance_sdk/staking/rest_api/apis/
on_chain_yields_api.rs

1/*
2 * Binance Staking REST API
3 *
4 * OpenAPI Specification for the Binance Staking REST API
5 *
6 * The version of the OpenAPI document: 1.0.0
7 *
8 *
9 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
10 * https://openapi-generator.tech
11 * Do not edit the class manually.
12 */
13
14#![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/// Request parameters for the [`get_on_chain_yields_locked_personal_left_quota`] operation.
96///
97/// This struct holds all of the inputs you can pass when calling
98/// [`get_on_chain_yields_locked_personal_left_quota`](#method.get_on_chain_yields_locked_personal_left_quota).
99#[derive(Clone, Debug, Builder)]
100#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
101pub struct GetOnChainYieldsLockedPersonalLeftQuotaParams {
102    ///
103    /// The `project_id` parameter.
104    ///
105    /// This field is **required.
106    #[builder(setter(into))]
107    pub project_id: String,
108    ///
109    /// The `recv_window` parameter.
110    ///
111    /// This field is **optional.
112    #[builder(setter(into), default)]
113    pub recv_window: Option<i64>,
114}
115
116impl GetOnChainYieldsLockedPersonalLeftQuotaParams {
117    /// Create a builder for [`get_on_chain_yields_locked_personal_left_quota`].
118    ///
119    /// Required parameters:
120    ///
121    /// * `project_id` — String
122    ///
123    #[must_use]
124    pub fn builder(project_id: String) -> GetOnChainYieldsLockedPersonalLeftQuotaParamsBuilder {
125        GetOnChainYieldsLockedPersonalLeftQuotaParamsBuilder::default().project_id(project_id)
126    }
127}
128/// Request parameters for the [`get_on_chain_yields_locked_product_list`] operation.
129///
130/// This struct holds all of the inputs you can pass when calling
131/// [`get_on_chain_yields_locked_product_list`](#method.get_on_chain_yields_locked_product_list).
132#[derive(Clone, Debug, Builder, Default)]
133#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
134pub struct GetOnChainYieldsLockedProductListParams {
135    /// WBETH or BETH, default to BETH
136    ///
137    /// This field is **optional.
138    #[builder(setter(into), default)]
139    pub asset: Option<String>,
140    /// Currently querying page. Start from 1. Default:1
141    ///
142    /// This field is **optional.
143    #[builder(setter(into), default)]
144    pub current: Option<i64>,
145    /// Default:10, Max:100
146    ///
147    /// This field is **optional.
148    #[builder(setter(into), default)]
149    pub size: Option<i64>,
150    ///
151    /// The `recv_window` parameter.
152    ///
153    /// This field is **optional.
154    #[builder(setter(into), default)]
155    pub recv_window: Option<i64>,
156}
157
158impl GetOnChainYieldsLockedProductListParams {
159    /// Create a builder for [`get_on_chain_yields_locked_product_list`].
160    ///
161    #[must_use]
162    pub fn builder() -> GetOnChainYieldsLockedProductListParamsBuilder {
163        GetOnChainYieldsLockedProductListParamsBuilder::default()
164    }
165}
166/// Request parameters for the [`get_on_chain_yields_locked_product_position`] operation.
167///
168/// This struct holds all of the inputs you can pass when calling
169/// [`get_on_chain_yields_locked_product_position`](#method.get_on_chain_yields_locked_product_position).
170#[derive(Clone, Debug, Builder, Default)]
171#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
172pub struct GetOnChainYieldsLockedProductPositionParams {
173    /// WBETH or BETH, default to BETH
174    ///
175    /// This field is **optional.
176    #[builder(setter(into), default)]
177    pub asset: Option<String>,
178    ///
179    /// The `position_id` parameter.
180    ///
181    /// This field is **optional.
182    #[builder(setter(into), default)]
183    pub position_id: Option<i64>,
184    ///
185    /// The `project_id` parameter.
186    ///
187    /// This field is **optional.
188    #[builder(setter(into), default)]
189    pub project_id: Option<String>,
190    /// Currently querying page. Start from 1. Default:1
191    ///
192    /// This field is **optional.
193    #[builder(setter(into), default)]
194    pub current: Option<i64>,
195    /// Default:10, Max:100
196    ///
197    /// This field is **optional.
198    #[builder(setter(into), default)]
199    pub size: Option<i64>,
200    ///
201    /// The `recv_window` parameter.
202    ///
203    /// This field is **optional.
204    #[builder(setter(into), default)]
205    pub recv_window: Option<i64>,
206}
207
208impl GetOnChainYieldsLockedProductPositionParams {
209    /// Create a builder for [`get_on_chain_yields_locked_product_position`].
210    ///
211    #[must_use]
212    pub fn builder() -> GetOnChainYieldsLockedProductPositionParamsBuilder {
213        GetOnChainYieldsLockedProductPositionParamsBuilder::default()
214    }
215}
216/// Request parameters for the [`get_on_chain_yields_locked_redemption_record`] operation.
217///
218/// This struct holds all of the inputs you can pass when calling
219/// [`get_on_chain_yields_locked_redemption_record`](#method.get_on_chain_yields_locked_redemption_record).
220#[derive(Clone, Debug, Builder, Default)]
221#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
222pub struct GetOnChainYieldsLockedRedemptionRecordParams {
223    ///
224    /// The `position_id` parameter.
225    ///
226    /// This field is **optional.
227    #[builder(setter(into), default)]
228    pub position_id: Option<i64>,
229    ///
230    /// The `redeem_id` parameter.
231    ///
232    /// This field is **optional.
233    #[builder(setter(into), default)]
234    pub redeem_id: Option<String>,
235    /// WBETH or BETH, default to BETH
236    ///
237    /// This field is **optional.
238    #[builder(setter(into), default)]
239    pub asset: Option<String>,
240    ///
241    /// The `start_time` parameter.
242    ///
243    /// This field is **optional.
244    #[builder(setter(into), default)]
245    pub start_time: Option<i64>,
246    ///
247    /// The `end_time` parameter.
248    ///
249    /// This field is **optional.
250    #[builder(setter(into), default)]
251    pub end_time: Option<i64>,
252    /// Currently querying page. Start from 1. Default:1
253    ///
254    /// This field is **optional.
255    #[builder(setter(into), default)]
256    pub current: Option<i64>,
257    /// Default:10, Max:100
258    ///
259    /// This field is **optional.
260    #[builder(setter(into), default)]
261    pub size: Option<i64>,
262    ///
263    /// The `recv_window` parameter.
264    ///
265    /// This field is **optional.
266    #[builder(setter(into), default)]
267    pub recv_window: Option<i64>,
268}
269
270impl GetOnChainYieldsLockedRedemptionRecordParams {
271    /// Create a builder for [`get_on_chain_yields_locked_redemption_record`].
272    ///
273    #[must_use]
274    pub fn builder() -> GetOnChainYieldsLockedRedemptionRecordParamsBuilder {
275        GetOnChainYieldsLockedRedemptionRecordParamsBuilder::default()
276    }
277}
278/// Request parameters for the [`get_on_chain_yields_locked_rewards_history`] operation.
279///
280/// This struct holds all of the inputs you can pass when calling
281/// [`get_on_chain_yields_locked_rewards_history`](#method.get_on_chain_yields_locked_rewards_history).
282#[derive(Clone, Debug, Builder, Default)]
283#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
284pub struct GetOnChainYieldsLockedRewardsHistoryParams {
285    ///
286    /// The `position_id` parameter.
287    ///
288    /// This field is **optional.
289    #[builder(setter(into), default)]
290    pub position_id: Option<String>,
291    /// WBETH or BETH, default to BETH
292    ///
293    /// This field is **optional.
294    #[builder(setter(into), default)]
295    pub asset: Option<String>,
296    ///
297    /// The `start_time` parameter.
298    ///
299    /// This field is **optional.
300    #[builder(setter(into), default)]
301    pub start_time: Option<i64>,
302    ///
303    /// The `end_time` parameter.
304    ///
305    /// This field is **optional.
306    #[builder(setter(into), default)]
307    pub end_time: Option<i64>,
308    /// Currently querying page. Start from 1. Default:1
309    ///
310    /// This field is **optional.
311    #[builder(setter(into), default)]
312    pub current: Option<i64>,
313    /// Default:10, Max:100
314    ///
315    /// This field is **optional.
316    #[builder(setter(into), default)]
317    pub size: Option<i64>,
318    ///
319    /// The `recv_window` parameter.
320    ///
321    /// This field is **optional.
322    #[builder(setter(into), default)]
323    pub recv_window: Option<i64>,
324}
325
326impl GetOnChainYieldsLockedRewardsHistoryParams {
327    /// Create a builder for [`get_on_chain_yields_locked_rewards_history`].
328    ///
329    #[must_use]
330    pub fn builder() -> GetOnChainYieldsLockedRewardsHistoryParamsBuilder {
331        GetOnChainYieldsLockedRewardsHistoryParamsBuilder::default()
332    }
333}
334/// Request parameters for the [`get_on_chain_yields_locked_subscription_preview`] operation.
335///
336/// This struct holds all of the inputs you can pass when calling
337/// [`get_on_chain_yields_locked_subscription_preview`](#method.get_on_chain_yields_locked_subscription_preview).
338#[derive(Clone, Debug, Builder)]
339#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
340pub struct GetOnChainYieldsLockedSubscriptionPreviewParams {
341    ///
342    /// The `project_id` parameter.
343    ///
344    /// This field is **required.
345    #[builder(setter(into))]
346    pub project_id: String,
347    /// Amount in SOL.
348    ///
349    /// This field is **required.
350    #[builder(setter(into))]
351    pub amount: rust_decimal::Decimal,
352    /// true or false, default true.
353    ///
354    /// This field is **optional.
355    #[builder(setter(into), default)]
356    pub auto_subscribe: Option<bool>,
357    ///
358    /// The `recv_window` parameter.
359    ///
360    /// This field is **optional.
361    #[builder(setter(into), default)]
362    pub recv_window: Option<i64>,
363}
364
365impl GetOnChainYieldsLockedSubscriptionPreviewParams {
366    /// Create a builder for [`get_on_chain_yields_locked_subscription_preview`].
367    ///
368    /// Required parameters:
369    ///
370    /// * `project_id` — String
371    /// * `amount` — Amount in SOL.
372    ///
373    #[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/// Request parameters for the [`get_on_chain_yields_locked_subscription_record`] operation.
384///
385/// This struct holds all of the inputs you can pass when calling
386/// [`get_on_chain_yields_locked_subscription_record`](#method.get_on_chain_yields_locked_subscription_record).
387#[derive(Clone, Debug, Builder, Default)]
388#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
389pub struct GetOnChainYieldsLockedSubscriptionRecordParams {
390    ///
391    /// The `purchase_id` parameter.
392    ///
393    /// This field is **optional.
394    #[builder(setter(into), default)]
395    pub purchase_id: Option<String>,
396    ///
397    /// The `client_id` parameter.
398    ///
399    /// This field is **optional.
400    #[builder(setter(into), default)]
401    pub client_id: Option<String>,
402    /// WBETH or BETH, default to BETH
403    ///
404    /// This field is **optional.
405    #[builder(setter(into), default)]
406    pub asset: Option<String>,
407    ///
408    /// The `start_time` parameter.
409    ///
410    /// This field is **optional.
411    #[builder(setter(into), default)]
412    pub start_time: Option<i64>,
413    ///
414    /// The `end_time` parameter.
415    ///
416    /// This field is **optional.
417    #[builder(setter(into), default)]
418    pub end_time: Option<i64>,
419    /// Currently querying page. Start from 1. Default:1
420    ///
421    /// This field is **optional.
422    #[builder(setter(into), default)]
423    pub current: Option<i64>,
424    /// Default:10, Max:100
425    ///
426    /// This field is **optional.
427    #[builder(setter(into), default)]
428    pub size: Option<i64>,
429    ///
430    /// The `recv_window` parameter.
431    ///
432    /// This field is **optional.
433    #[builder(setter(into), default)]
434    pub recv_window: Option<i64>,
435}
436
437impl GetOnChainYieldsLockedSubscriptionRecordParams {
438    /// Create a builder for [`get_on_chain_yields_locked_subscription_record`].
439    ///
440    #[must_use]
441    pub fn builder() -> GetOnChainYieldsLockedSubscriptionRecordParamsBuilder {
442        GetOnChainYieldsLockedSubscriptionRecordParamsBuilder::default()
443    }
444}
445/// Request parameters for the [`on_chain_yields_account`] operation.
446///
447/// This struct holds all of the inputs you can pass when calling
448/// [`on_chain_yields_account`](#method.on_chain_yields_account).
449#[derive(Clone, Debug, Builder, Default)]
450#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
451pub struct OnChainYieldsAccountParams {
452    ///
453    /// The `recv_window` parameter.
454    ///
455    /// This field is **optional.
456    #[builder(setter(into), default)]
457    pub recv_window: Option<i64>,
458}
459
460impl OnChainYieldsAccountParams {
461    /// Create a builder for [`on_chain_yields_account`].
462    ///
463    #[must_use]
464    pub fn builder() -> OnChainYieldsAccountParamsBuilder {
465        OnChainYieldsAccountParamsBuilder::default()
466    }
467}
468/// Request parameters for the [`redeem_on_chain_yields_locked_product`] operation.
469///
470/// This struct holds all of the inputs you can pass when calling
471/// [`redeem_on_chain_yields_locked_product`](#method.redeem_on_chain_yields_locked_product).
472#[derive(Clone, Debug, Builder)]
473#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
474pub struct RedeemOnChainYieldsLockedProductParams {
475    ///
476    /// The `position_id` parameter.
477    ///
478    /// This field is **required.
479    #[builder(setter(into))]
480    pub position_id: String,
481    ///
482    /// The `channel_id` parameter.
483    ///
484    /// This field is **optional.
485    #[builder(setter(into), default)]
486    pub channel_id: Option<String>,
487    ///
488    /// The `recv_window` parameter.
489    ///
490    /// This field is **optional.
491    #[builder(setter(into), default)]
492    pub recv_window: Option<i64>,
493}
494
495impl RedeemOnChainYieldsLockedProductParams {
496    /// Create a builder for [`redeem_on_chain_yields_locked_product`].
497    ///
498    /// Required parameters:
499    ///
500    /// * `position_id` — String
501    ///
502    #[must_use]
503    pub fn builder(position_id: String) -> RedeemOnChainYieldsLockedProductParamsBuilder {
504        RedeemOnChainYieldsLockedProductParamsBuilder::default().position_id(position_id)
505    }
506}
507/// Request parameters for the [`set_on_chain_yields_locked_auto_subscribe`] operation.
508///
509/// This struct holds all of the inputs you can pass when calling
510/// [`set_on_chain_yields_locked_auto_subscribe`](#method.set_on_chain_yields_locked_auto_subscribe).
511#[derive(Clone, Debug, Builder)]
512#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
513pub struct SetOnChainYieldsLockedAutoSubscribeParams {
514    ///
515    /// The `position_id` parameter.
516    ///
517    /// This field is **required.
518    #[builder(setter(into))]
519    pub position_id: String,
520    /// true or false
521    ///
522    /// This field is **required.
523    #[builder(setter(into))]
524    pub auto_subscribe: bool,
525    ///
526    /// The `recv_window` parameter.
527    ///
528    /// This field is **optional.
529    #[builder(setter(into), default)]
530    pub recv_window: Option<i64>,
531}
532
533impl SetOnChainYieldsLockedAutoSubscribeParams {
534    /// Create a builder for [`set_on_chain_yields_locked_auto_subscribe`].
535    ///
536    /// Required parameters:
537    ///
538    /// * `position_id` — String
539    /// * `auto_subscribe` — true or false
540    ///
541    #[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/// Request parameters for the [`set_on_chain_yields_locked_product_redeem_option`] operation.
552///
553/// This struct holds all of the inputs you can pass when calling
554/// [`set_on_chain_yields_locked_product_redeem_option`](#method.set_on_chain_yields_locked_product_redeem_option).
555#[derive(Clone, Debug, Builder)]
556#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
557pub struct SetOnChainYieldsLockedProductRedeemOptionParams {
558    ///
559    /// The `position_id` parameter.
560    ///
561    /// This field is **required.
562    #[builder(setter(into))]
563    pub position_id: String,
564    /// 'SPOT','FLEXIBLE'
565    ///
566    /// This field is **required.
567    #[builder(setter(into))]
568    pub redeem_to: String,
569    ///
570    /// The `recv_window` parameter.
571    ///
572    /// This field is **optional.
573    #[builder(setter(into), default)]
574    pub recv_window: Option<i64>,
575}
576
577impl SetOnChainYieldsLockedProductRedeemOptionParams {
578    /// Create a builder for [`set_on_chain_yields_locked_product_redeem_option`].
579    ///
580    /// Required parameters:
581    ///
582    /// * `position_id` — String
583    /// * `redeem_to` — 'SPOT','FLEXIBLE'
584    ///
585    #[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/// Request parameters for the [`subscribe_on_chain_yields_locked_product`] operation.
596///
597/// This struct holds all of the inputs you can pass when calling
598/// [`subscribe_on_chain_yields_locked_product`](#method.subscribe_on_chain_yields_locked_product).
599#[derive(Clone, Debug, Builder)]
600#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
601pub struct SubscribeOnChainYieldsLockedProductParams {
602    ///
603    /// The `project_id` parameter.
604    ///
605    /// This field is **required.
606    #[builder(setter(into))]
607    pub project_id: String,
608    /// Amount in SOL.
609    ///
610    /// This field is **required.
611    #[builder(setter(into))]
612    pub amount: rust_decimal::Decimal,
613    /// true or false, default true.
614    ///
615    /// This field is **optional.
616    #[builder(setter(into), default)]
617    pub auto_subscribe: Option<bool>,
618    /// `SPOT`,`FUND`,`ALL`, default `SPOT`
619    ///
620    /// This field is **optional.
621    #[builder(setter(into), default)]
622    pub source_account: Option<String>,
623    /// `SPOT`,`FLEXIBLE`, default `FLEXIBLE` Takes effect when Auto Subscribe is false
624    ///
625    /// This field is **optional.
626    #[builder(setter(into), default)]
627    pub redeem_to: Option<String>,
628    ///
629    /// The `channel_id` parameter.
630    ///
631    /// This field is **optional.
632    #[builder(setter(into), default)]
633    pub channel_id: Option<String>,
634    ///
635    /// The `client_id` parameter.
636    ///
637    /// This field is **optional.
638    #[builder(setter(into), default)]
639    pub client_id: Option<String>,
640    ///
641    /// The `recv_window` parameter.
642    ///
643    /// This field is **optional.
644    #[builder(setter(into), default)]
645    pub recv_window: Option<i64>,
646}
647
648impl SubscribeOnChainYieldsLockedProductParams {
649    /// Create a builder for [`subscribe_on_chain_yields_locked_product`].
650    ///
651    /// Required parameters:
652    ///
653    /// * `project_id` — String
654    /// * `amount` — Amount in SOL.
655    ///
656    #[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}