Skip to main content

binance_sdk/wallet/rest_api/apis/
travel_rule_api.rs

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