Skip to main content

kraken_api_client/spot/rest/
traits.rs

1//! Trait definition for the Kraken REST API client.
2//!
3//! This module provides the `KrakenClient` trait which abstracts all REST API operations.
4//! This enables:
5//! - Mock implementations for testing
6//! - Decorator pattern (e.g., rate limiting wrapper)
7//! - Alternative implementations
8//!
9//! # Example
10//!
11//! ```rust,ignore
12//! use kraken_api_client::spot::rest::{KrakenClient, SpotRestClient};
13//!
14//! async fn check_balance<C: KrakenClient>(client: &C) -> Result<(), kraken_api_client::KrakenError> {
15//!     let time = client.get_server_time().await?;
16//!     println!("Server time: {}", time.unixtime);
17//!     Ok(())
18//! }
19//! ```
20
21use std::collections::HashMap;
22use std::future::Future;
23
24use rust_decimal::Decimal;
25
26use crate::error::KrakenError;
27use crate::spot::rest::private::{
28    AddOrderRequest, AddOrderResponse, AllocationStatus, CancelOrderRequest, CancelOrderResponse,
29    ClosedOrders, ClosedOrdersRequest, ConfirmationRefId, DepositAddress, DepositAddressesRequest,
30    DepositMethod, DepositMethodsRequest, DepositStatusRequest, DepositWithdrawStatusResponse,
31    EarnAllocateRequest, EarnAllocationStatusRequest, EarnAllocations, EarnAllocationsRequest,
32    EarnStrategies, EarnStrategiesRequest, ExtendedBalances, LedgersInfo, LedgersRequest,
33    OpenOrders, OpenOrdersRequest, OpenPositionsRequest, Order, Position, QueryOrdersRequest,
34    TradeBalance, TradeBalanceRequest, TradeVolume, TradeVolumeRequest, TradesHistory,
35    TradesHistoryRequest, WalletTransferRequest, WebSocketToken, WithdrawAddressesRequest,
36    WithdrawCancelRequest, WithdrawInfo, WithdrawInfoRequest, WithdrawMethod,
37    WithdrawMethodsRequest, WithdrawRequest, WithdrawStatusRequest, WithdrawalAddress,
38};
39use crate::spot::rest::public::{
40    AssetInfo, AssetInfoRequest, AssetPair, AssetPairsRequest, OhlcRequest, OhlcResponse,
41    OrderBook, OrderBookRequest, RecentSpreadsRequest, RecentSpreadsResponse, RecentTradesRequest,
42    RecentTradesResponse, ServerTime, SystemStatus, TickerInfo,
43};
44
45/// Trait defining all Kraken REST API operations.
46///
47/// This trait enables dependency injection and allows for:
48/// - Testing with mock implementations
49/// - Wrapping with decorators (e.g., rate limiting)
50/// - Alternative implementations
51///
52/// All methods are async and return `Result<T, KrakenError>`.
53pub trait KrakenClient: Send + Sync {
54    // ========== Public Endpoints ==========
55
56    /// Get the server time.
57    fn get_server_time(&self) -> impl Future<Output = Result<ServerTime, KrakenError>> + Send;
58
59    /// Get the system status.
60    fn get_system_status(&self) -> impl Future<Output = Result<SystemStatus, KrakenError>> + Send;
61
62    /// Get asset information.
63    fn get_assets(
64        &self,
65        request: Option<&AssetInfoRequest>,
66    ) -> impl Future<Output = Result<HashMap<String, AssetInfo>, KrakenError>> + Send;
67
68    /// Get tradable asset pairs.
69    fn get_asset_pairs(
70        &self,
71        request: Option<&AssetPairsRequest>,
72    ) -> impl Future<Output = Result<HashMap<String, AssetPair>, KrakenError>> + Send;
73
74    /// Get ticker information for one or more pairs.
75    fn get_ticker(
76        &self,
77        pairs: &str,
78    ) -> impl Future<Output = Result<HashMap<String, TickerInfo>, KrakenError>> + Send;
79
80    /// Get OHLC (candlestick) data.
81    fn get_ohlc(
82        &self,
83        request: &OhlcRequest,
84    ) -> impl Future<Output = Result<OhlcResponse, KrakenError>> + Send;
85
86    /// Get order book for a pair.
87    fn get_order_book(
88        &self,
89        request: &OrderBookRequest,
90    ) -> impl Future<Output = Result<HashMap<String, OrderBook>, KrakenError>> + Send;
91
92    /// Get recent trades for a pair.
93    fn get_recent_trades(
94        &self,
95        request: &RecentTradesRequest,
96    ) -> impl Future<Output = Result<RecentTradesResponse, KrakenError>> + Send;
97
98    /// Get recent spreads for a pair.
99    fn get_recent_spreads(
100        &self,
101        request: &RecentSpreadsRequest,
102    ) -> impl Future<Output = Result<RecentSpreadsResponse, KrakenError>> + Send;
103
104    // ========== Private Endpoints - Account ==========
105
106    /// Get account balance.
107    fn get_account_balance(
108        &self,
109    ) -> impl Future<Output = Result<HashMap<String, Decimal>, KrakenError>> + Send;
110
111    /// Get extended balance with hold amounts.
112    fn get_extended_balance(
113        &self,
114    ) -> impl Future<Output = Result<ExtendedBalances, KrakenError>> + Send;
115
116    /// Get trade balance (margin account details).
117    fn get_trade_balance(
118        &self,
119        request: Option<&TradeBalanceRequest>,
120    ) -> impl Future<Output = Result<TradeBalance, KrakenError>> + Send;
121
122    /// Get open orders.
123    fn get_open_orders(
124        &self,
125        request: Option<&OpenOrdersRequest>,
126    ) -> impl Future<Output = Result<OpenOrders, KrakenError>> + Send;
127
128    /// Get closed orders.
129    fn get_closed_orders(
130        &self,
131        request: Option<&ClosedOrdersRequest>,
132    ) -> impl Future<Output = Result<ClosedOrders, KrakenError>> + Send;
133
134    /// Query specific orders by ID.
135    fn query_orders(
136        &self,
137        request: &QueryOrdersRequest,
138    ) -> impl Future<Output = Result<HashMap<String, Order>, KrakenError>> + Send;
139
140    /// Get trades history.
141    fn get_trades_history(
142        &self,
143        request: Option<&TradesHistoryRequest>,
144    ) -> impl Future<Output = Result<TradesHistory, KrakenError>> + Send;
145
146    /// Get open positions.
147    fn get_open_positions(
148        &self,
149        request: Option<&OpenPositionsRequest>,
150    ) -> impl Future<Output = Result<HashMap<String, Position>, KrakenError>> + Send;
151
152    /// Get ledger entries.
153    fn get_ledgers(
154        &self,
155        request: Option<&LedgersRequest>,
156    ) -> impl Future<Output = Result<LedgersInfo, KrakenError>> + Send;
157
158    /// Get trade volume and fee info.
159    fn get_trade_volume(
160        &self,
161        request: Option<&TradeVolumeRequest>,
162    ) -> impl Future<Output = Result<TradeVolume, KrakenError>> + Send;
163
164    // ========== Private Endpoints - Funding ==========
165
166    /// Get available deposit methods.
167    fn get_deposit_methods(
168        &self,
169        request: &DepositMethodsRequest,
170    ) -> impl Future<Output = Result<Vec<DepositMethod>, KrakenError>> + Send;
171
172    /// Get deposit addresses.
173    fn get_deposit_addresses(
174        &self,
175        request: &DepositAddressesRequest,
176    ) -> impl Future<Output = Result<Vec<DepositAddress>, KrakenError>> + Send;
177
178    /// Get deposit status.
179    fn get_deposit_status(
180        &self,
181        request: Option<&DepositStatusRequest>,
182    ) -> impl Future<Output = Result<DepositWithdrawStatusResponse, KrakenError>> + Send;
183
184    /// Get available withdrawal methods.
185    fn get_withdraw_methods(
186        &self,
187        request: Option<&WithdrawMethodsRequest>,
188    ) -> impl Future<Output = Result<Vec<WithdrawMethod>, KrakenError>> + Send;
189
190    /// Get withdrawal addresses.
191    fn get_withdraw_addresses(
192        &self,
193        request: Option<&WithdrawAddressesRequest>,
194    ) -> impl Future<Output = Result<Vec<WithdrawalAddress>, KrakenError>> + Send;
195
196    /// Get withdrawal info.
197    fn get_withdraw_info(
198        &self,
199        request: &WithdrawInfoRequest,
200    ) -> impl Future<Output = Result<WithdrawInfo, KrakenError>> + Send;
201
202    /// Withdraw funds.
203    fn withdraw_funds(
204        &self,
205        request: &WithdrawRequest,
206    ) -> impl Future<Output = Result<ConfirmationRefId, KrakenError>> + Send;
207
208    /// Get withdrawal status.
209    fn get_withdraw_status(
210        &self,
211        request: Option<&WithdrawStatusRequest>,
212    ) -> impl Future<Output = Result<DepositWithdrawStatusResponse, KrakenError>> + Send;
213
214    /// Cancel a withdrawal.
215    fn withdraw_cancel(
216        &self,
217        request: &WithdrawCancelRequest,
218    ) -> impl Future<Output = Result<bool, KrakenError>> + Send;
219
220    /// Transfer funds between wallets.
221    fn wallet_transfer(
222        &self,
223        request: &WalletTransferRequest,
224    ) -> impl Future<Output = Result<ConfirmationRefId, KrakenError>> + Send;
225
226    // ========== Private Endpoints - Earn ==========
227
228    /// Allocate funds to an earn strategy.
229    fn earn_allocate(
230        &self,
231        request: &EarnAllocateRequest,
232    ) -> impl Future<Output = Result<bool, KrakenError>> + Send;
233
234    /// Deallocate funds from an earn strategy.
235    fn earn_deallocate(
236        &self,
237        request: &EarnAllocateRequest,
238    ) -> impl Future<Output = Result<bool, KrakenError>> + Send;
239
240    /// Get earn allocation status.
241    fn get_earn_allocation_status(
242        &self,
243        request: &EarnAllocationStatusRequest,
244    ) -> impl Future<Output = Result<AllocationStatus, KrakenError>> + Send;
245
246    /// Get earn deallocation status.
247    fn get_earn_deallocation_status(
248        &self,
249        request: &EarnAllocationStatusRequest,
250    ) -> impl Future<Output = Result<AllocationStatus, KrakenError>> + Send;
251
252    /// List earn strategies.
253    fn list_earn_strategies(
254        &self,
255        request: Option<&EarnStrategiesRequest>,
256    ) -> impl Future<Output = Result<EarnStrategies, KrakenError>> + Send;
257
258    /// List earn allocations.
259    fn list_earn_allocations(
260        &self,
261        request: Option<&EarnAllocationsRequest>,
262    ) -> impl Future<Output = Result<EarnAllocations, KrakenError>> + Send;
263
264    // ========== Private Endpoints - Trading ==========
265
266    /// Add a new order.
267    fn add_order(
268        &self,
269        request: &AddOrderRequest,
270    ) -> impl Future<Output = Result<AddOrderResponse, KrakenError>> + Send;
271
272    /// Cancel an order.
273    fn cancel_order(
274        &self,
275        request: &CancelOrderRequest,
276    ) -> impl Future<Output = Result<CancelOrderResponse, KrakenError>> + Send;
277
278    /// Cancel all open orders.
279    fn cancel_all_orders(
280        &self,
281    ) -> impl Future<Output = Result<CancelOrderResponse, KrakenError>> + Send;
282
283    // ========== Private Endpoints - WebSocket ==========
284
285    /// Get a WebSocket authentication token.
286    fn get_websocket_token(
287        &self,
288    ) -> impl Future<Output = Result<WebSocketToken, KrakenError>> + Send;
289}
290
291/// Extension trait for boxed trait objects.
292///
293/// This allows using `KrakenClient` as a trait object via `Box<dyn KrakenClientExt>`.
294#[allow(async_fn_in_trait)]
295pub trait KrakenClientExt: Send + Sync {
296    // ========== Public Endpoints ==========
297
298    async fn get_server_time(&self) -> Result<ServerTime, KrakenError>;
299    async fn get_system_status(&self) -> Result<SystemStatus, KrakenError>;
300    async fn get_assets(
301        &self,
302        request: Option<&AssetInfoRequest>,
303    ) -> Result<HashMap<String, AssetInfo>, KrakenError>;
304    async fn get_asset_pairs(
305        &self,
306        request: Option<&AssetPairsRequest>,
307    ) -> Result<HashMap<String, AssetPair>, KrakenError>;
308    async fn get_ticker(&self, pairs: &str) -> Result<HashMap<String, TickerInfo>, KrakenError>;
309    async fn get_ohlc(&self, request: &OhlcRequest) -> Result<OhlcResponse, KrakenError>;
310    async fn get_order_book(
311        &self,
312        request: &OrderBookRequest,
313    ) -> Result<HashMap<String, OrderBook>, KrakenError>;
314    async fn get_recent_trades(
315        &self,
316        request: &RecentTradesRequest,
317    ) -> Result<RecentTradesResponse, KrakenError>;
318    async fn get_recent_spreads(
319        &self,
320        request: &RecentSpreadsRequest,
321    ) -> Result<RecentSpreadsResponse, KrakenError>;
322
323    // ========== Private Endpoints - Account ==========
324
325    async fn get_account_balance(&self) -> Result<HashMap<String, Decimal>, KrakenError>;
326    async fn get_extended_balance(&self) -> Result<ExtendedBalances, KrakenError>;
327    async fn get_trade_balance(
328        &self,
329        request: Option<&TradeBalanceRequest>,
330    ) -> Result<TradeBalance, KrakenError>;
331    async fn get_open_orders(
332        &self,
333        request: Option<&OpenOrdersRequest>,
334    ) -> Result<OpenOrders, KrakenError>;
335    async fn get_closed_orders(
336        &self,
337        request: Option<&ClosedOrdersRequest>,
338    ) -> Result<ClosedOrders, KrakenError>;
339    async fn query_orders(
340        &self,
341        request: &QueryOrdersRequest,
342    ) -> Result<HashMap<String, Order>, KrakenError>;
343    async fn get_trades_history(
344        &self,
345        request: Option<&TradesHistoryRequest>,
346    ) -> Result<TradesHistory, KrakenError>;
347    async fn get_open_positions(
348        &self,
349        request: Option<&OpenPositionsRequest>,
350    ) -> Result<HashMap<String, Position>, KrakenError>;
351    async fn get_ledgers(
352        &self,
353        request: Option<&LedgersRequest>,
354    ) -> Result<LedgersInfo, KrakenError>;
355    async fn get_trade_volume(
356        &self,
357        request: Option<&TradeVolumeRequest>,
358    ) -> Result<TradeVolume, KrakenError>;
359
360    // ========== Private Endpoints - Funding ==========
361
362    async fn get_deposit_methods(
363        &self,
364        request: &DepositMethodsRequest,
365    ) -> Result<Vec<DepositMethod>, KrakenError>;
366    async fn get_deposit_addresses(
367        &self,
368        request: &DepositAddressesRequest,
369    ) -> Result<Vec<DepositAddress>, KrakenError>;
370    async fn get_deposit_status(
371        &self,
372        request: Option<&DepositStatusRequest>,
373    ) -> Result<DepositWithdrawStatusResponse, KrakenError>;
374    async fn get_withdraw_methods(
375        &self,
376        request: Option<&WithdrawMethodsRequest>,
377    ) -> Result<Vec<WithdrawMethod>, KrakenError>;
378    async fn get_withdraw_addresses(
379        &self,
380        request: Option<&WithdrawAddressesRequest>,
381    ) -> Result<Vec<WithdrawalAddress>, KrakenError>;
382    async fn get_withdraw_info(
383        &self,
384        request: &WithdrawInfoRequest,
385    ) -> Result<WithdrawInfo, KrakenError>;
386    async fn withdraw_funds(
387        &self,
388        request: &WithdrawRequest,
389    ) -> Result<ConfirmationRefId, KrakenError>;
390    async fn get_withdraw_status(
391        &self,
392        request: Option<&WithdrawStatusRequest>,
393    ) -> Result<DepositWithdrawStatusResponse, KrakenError>;
394    async fn withdraw_cancel(&self, request: &WithdrawCancelRequest) -> Result<bool, KrakenError>;
395    async fn wallet_transfer(
396        &self,
397        request: &WalletTransferRequest,
398    ) -> Result<ConfirmationRefId, KrakenError>;
399
400    // ========== Private Endpoints - Earn ==========
401
402    async fn earn_allocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError>;
403    async fn earn_deallocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError>;
404    async fn get_earn_allocation_status(
405        &self,
406        request: &EarnAllocationStatusRequest,
407    ) -> Result<AllocationStatus, KrakenError>;
408    async fn get_earn_deallocation_status(
409        &self,
410        request: &EarnAllocationStatusRequest,
411    ) -> Result<AllocationStatus, KrakenError>;
412    async fn list_earn_strategies(
413        &self,
414        request: Option<&EarnStrategiesRequest>,
415    ) -> Result<EarnStrategies, KrakenError>;
416    async fn list_earn_allocations(
417        &self,
418        request: Option<&EarnAllocationsRequest>,
419    ) -> Result<EarnAllocations, KrakenError>;
420
421    // ========== Private Endpoints - Trading ==========
422
423    async fn add_order(&self, request: &AddOrderRequest) -> Result<AddOrderResponse, KrakenError>;
424    async fn cancel_order(
425        &self,
426        request: &CancelOrderRequest,
427    ) -> Result<CancelOrderResponse, KrakenError>;
428    async fn cancel_all_orders(&self) -> Result<CancelOrderResponse, KrakenError>;
429
430    // ========== Private Endpoints - WebSocket ==========
431
432    async fn get_websocket_token(&self) -> Result<WebSocketToken, KrakenError>;
433}
434
435// Blanket implementation for types that implement KrakenClient
436impl<T: KrakenClient> KrakenClientExt for T {
437    async fn get_server_time(&self) -> Result<ServerTime, KrakenError> {
438        KrakenClient::get_server_time(self).await
439    }
440
441    async fn get_system_status(&self) -> Result<SystemStatus, KrakenError> {
442        KrakenClient::get_system_status(self).await
443    }
444
445    async fn get_assets(
446        &self,
447        request: Option<&AssetInfoRequest>,
448    ) -> Result<HashMap<String, AssetInfo>, KrakenError> {
449        KrakenClient::get_assets(self, request).await
450    }
451
452    async fn get_asset_pairs(
453        &self,
454        request: Option<&AssetPairsRequest>,
455    ) -> Result<HashMap<String, AssetPair>, KrakenError> {
456        KrakenClient::get_asset_pairs(self, request).await
457    }
458
459    async fn get_ticker(&self, pairs: &str) -> Result<HashMap<String, TickerInfo>, KrakenError> {
460        KrakenClient::get_ticker(self, pairs).await
461    }
462
463    async fn get_ohlc(&self, request: &OhlcRequest) -> Result<OhlcResponse, KrakenError> {
464        KrakenClient::get_ohlc(self, request).await
465    }
466
467    async fn get_order_book(
468        &self,
469        request: &OrderBookRequest,
470    ) -> Result<HashMap<String, OrderBook>, KrakenError> {
471        KrakenClient::get_order_book(self, request).await
472    }
473
474    async fn get_recent_trades(
475        &self,
476        request: &RecentTradesRequest,
477    ) -> Result<RecentTradesResponse, KrakenError> {
478        KrakenClient::get_recent_trades(self, request).await
479    }
480
481    async fn get_recent_spreads(
482        &self,
483        request: &RecentSpreadsRequest,
484    ) -> Result<RecentSpreadsResponse, KrakenError> {
485        KrakenClient::get_recent_spreads(self, request).await
486    }
487
488    async fn get_account_balance(&self) -> Result<HashMap<String, Decimal>, KrakenError> {
489        KrakenClient::get_account_balance(self).await
490    }
491
492    async fn get_extended_balance(&self) -> Result<ExtendedBalances, KrakenError> {
493        KrakenClient::get_extended_balance(self).await
494    }
495
496    async fn get_trade_balance(
497        &self,
498        request: Option<&TradeBalanceRequest>,
499    ) -> Result<TradeBalance, KrakenError> {
500        KrakenClient::get_trade_balance(self, request).await
501    }
502
503    async fn get_open_orders(
504        &self,
505        request: Option<&OpenOrdersRequest>,
506    ) -> Result<OpenOrders, KrakenError> {
507        KrakenClient::get_open_orders(self, request).await
508    }
509
510    async fn get_closed_orders(
511        &self,
512        request: Option<&ClosedOrdersRequest>,
513    ) -> Result<ClosedOrders, KrakenError> {
514        KrakenClient::get_closed_orders(self, request).await
515    }
516
517    async fn query_orders(
518        &self,
519        request: &QueryOrdersRequest,
520    ) -> Result<HashMap<String, Order>, KrakenError> {
521        KrakenClient::query_orders(self, request).await
522    }
523
524    async fn get_trades_history(
525        &self,
526        request: Option<&TradesHistoryRequest>,
527    ) -> Result<TradesHistory, KrakenError> {
528        KrakenClient::get_trades_history(self, request).await
529    }
530
531    async fn get_open_positions(
532        &self,
533        request: Option<&OpenPositionsRequest>,
534    ) -> Result<HashMap<String, Position>, KrakenError> {
535        KrakenClient::get_open_positions(self, request).await
536    }
537
538    async fn get_ledgers(
539        &self,
540        request: Option<&LedgersRequest>,
541    ) -> Result<LedgersInfo, KrakenError> {
542        KrakenClient::get_ledgers(self, request).await
543    }
544
545    async fn get_trade_volume(
546        &self,
547        request: Option<&TradeVolumeRequest>,
548    ) -> Result<TradeVolume, KrakenError> {
549        KrakenClient::get_trade_volume(self, request).await
550    }
551
552    async fn get_deposit_methods(
553        &self,
554        request: &DepositMethodsRequest,
555    ) -> Result<Vec<DepositMethod>, KrakenError> {
556        KrakenClient::get_deposit_methods(self, request).await
557    }
558
559    async fn get_deposit_addresses(
560        &self,
561        request: &DepositAddressesRequest,
562    ) -> Result<Vec<DepositAddress>, KrakenError> {
563        KrakenClient::get_deposit_addresses(self, request).await
564    }
565
566    async fn get_deposit_status(
567        &self,
568        request: Option<&DepositStatusRequest>,
569    ) -> Result<DepositWithdrawStatusResponse, KrakenError> {
570        KrakenClient::get_deposit_status(self, request).await
571    }
572
573    async fn get_withdraw_methods(
574        &self,
575        request: Option<&WithdrawMethodsRequest>,
576    ) -> Result<Vec<WithdrawMethod>, KrakenError> {
577        KrakenClient::get_withdraw_methods(self, request).await
578    }
579
580    async fn get_withdraw_addresses(
581        &self,
582        request: Option<&WithdrawAddressesRequest>,
583    ) -> Result<Vec<WithdrawalAddress>, KrakenError> {
584        KrakenClient::get_withdraw_addresses(self, request).await
585    }
586
587    async fn get_withdraw_info(
588        &self,
589        request: &WithdrawInfoRequest,
590    ) -> Result<WithdrawInfo, KrakenError> {
591        KrakenClient::get_withdraw_info(self, request).await
592    }
593
594    async fn withdraw_funds(
595        &self,
596        request: &WithdrawRequest,
597    ) -> Result<ConfirmationRefId, KrakenError> {
598        KrakenClient::withdraw_funds(self, request).await
599    }
600
601    async fn get_withdraw_status(
602        &self,
603        request: Option<&WithdrawStatusRequest>,
604    ) -> Result<DepositWithdrawStatusResponse, KrakenError> {
605        KrakenClient::get_withdraw_status(self, request).await
606    }
607
608    async fn withdraw_cancel(&self, request: &WithdrawCancelRequest) -> Result<bool, KrakenError> {
609        KrakenClient::withdraw_cancel(self, request).await
610    }
611
612    async fn wallet_transfer(
613        &self,
614        request: &WalletTransferRequest,
615    ) -> Result<ConfirmationRefId, KrakenError> {
616        KrakenClient::wallet_transfer(self, request).await
617    }
618
619    async fn earn_allocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError> {
620        KrakenClient::earn_allocate(self, request).await
621    }
622
623    async fn earn_deallocate(&self, request: &EarnAllocateRequest) -> Result<bool, KrakenError> {
624        KrakenClient::earn_deallocate(self, request).await
625    }
626
627    async fn get_earn_allocation_status(
628        &self,
629        request: &EarnAllocationStatusRequest,
630    ) -> Result<AllocationStatus, KrakenError> {
631        KrakenClient::get_earn_allocation_status(self, request).await
632    }
633
634    async fn get_earn_deallocation_status(
635        &self,
636        request: &EarnAllocationStatusRequest,
637    ) -> Result<AllocationStatus, KrakenError> {
638        KrakenClient::get_earn_deallocation_status(self, request).await
639    }
640
641    async fn list_earn_strategies(
642        &self,
643        request: Option<&EarnStrategiesRequest>,
644    ) -> Result<EarnStrategies, KrakenError> {
645        KrakenClient::list_earn_strategies(self, request).await
646    }
647
648    async fn list_earn_allocations(
649        &self,
650        request: Option<&EarnAllocationsRequest>,
651    ) -> Result<EarnAllocations, KrakenError> {
652        KrakenClient::list_earn_allocations(self, request).await
653    }
654
655    async fn add_order(&self, request: &AddOrderRequest) -> Result<AddOrderResponse, KrakenError> {
656        KrakenClient::add_order(self, request).await
657    }
658
659    async fn cancel_order(
660        &self,
661        request: &CancelOrderRequest,
662    ) -> Result<CancelOrderResponse, KrakenError> {
663        KrakenClient::cancel_order(self, request).await
664    }
665
666    async fn cancel_all_orders(&self) -> Result<CancelOrderResponse, KrakenError> {
667        KrakenClient::cancel_all_orders(self).await
668    }
669
670    async fn get_websocket_token(&self) -> Result<WebSocketToken, KrakenError> {
671        KrakenClient::get_websocket_token(self).await
672    }
673}