Skip to main content

binance_sdk/wallet/rest_api/apis/
travel_rule_api.rs

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