1use 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
45pub trait KrakenClient: Send + Sync {
54 fn get_server_time(&self) -> impl Future<Output = Result<ServerTime, KrakenError>> + Send;
58
59 fn get_system_status(&self) -> impl Future<Output = Result<SystemStatus, KrakenError>> + Send;
61
62 fn get_assets(
64 &self,
65 request: Option<&AssetInfoRequest>,
66 ) -> impl Future<Output = Result<HashMap<String, AssetInfo>, KrakenError>> + Send;
67
68 fn get_asset_pairs(
70 &self,
71 request: Option<&AssetPairsRequest>,
72 ) -> impl Future<Output = Result<HashMap<String, AssetPair>, KrakenError>> + Send;
73
74 fn get_ticker(
76 &self,
77 pairs: &str,
78 ) -> impl Future<Output = Result<HashMap<String, TickerInfo>, KrakenError>> + Send;
79
80 fn get_ohlc(
82 &self,
83 request: &OhlcRequest,
84 ) -> impl Future<Output = Result<OhlcResponse, KrakenError>> + Send;
85
86 fn get_order_book(
88 &self,
89 request: &OrderBookRequest,
90 ) -> impl Future<Output = Result<HashMap<String, OrderBook>, KrakenError>> + Send;
91
92 fn get_recent_trades(
94 &self,
95 request: &RecentTradesRequest,
96 ) -> impl Future<Output = Result<RecentTradesResponse, KrakenError>> + Send;
97
98 fn get_recent_spreads(
100 &self,
101 request: &RecentSpreadsRequest,
102 ) -> impl Future<Output = Result<RecentSpreadsResponse, KrakenError>> + Send;
103
104 fn get_account_balance(
108 &self,
109 ) -> impl Future<Output = Result<HashMap<String, Decimal>, KrakenError>> + Send;
110
111 fn get_extended_balance(
113 &self,
114 ) -> impl Future<Output = Result<ExtendedBalances, KrakenError>> + Send;
115
116 fn get_trade_balance(
118 &self,
119 request: Option<&TradeBalanceRequest>,
120 ) -> impl Future<Output = Result<TradeBalance, KrakenError>> + Send;
121
122 fn get_open_orders(
124 &self,
125 request: Option<&OpenOrdersRequest>,
126 ) -> impl Future<Output = Result<OpenOrders, KrakenError>> + Send;
127
128 fn get_closed_orders(
130 &self,
131 request: Option<&ClosedOrdersRequest>,
132 ) -> impl Future<Output = Result<ClosedOrders, KrakenError>> + Send;
133
134 fn query_orders(
136 &self,
137 request: &QueryOrdersRequest,
138 ) -> impl Future<Output = Result<HashMap<String, Order>, KrakenError>> + Send;
139
140 fn get_trades_history(
142 &self,
143 request: Option<&TradesHistoryRequest>,
144 ) -> impl Future<Output = Result<TradesHistory, KrakenError>> + Send;
145
146 fn get_open_positions(
148 &self,
149 request: Option<&OpenPositionsRequest>,
150 ) -> impl Future<Output = Result<HashMap<String, Position>, KrakenError>> + Send;
151
152 fn get_ledgers(
154 &self,
155 request: Option<&LedgersRequest>,
156 ) -> impl Future<Output = Result<LedgersInfo, KrakenError>> + Send;
157
158 fn get_trade_volume(
160 &self,
161 request: Option<&TradeVolumeRequest>,
162 ) -> impl Future<Output = Result<TradeVolume, KrakenError>> + Send;
163
164 fn get_deposit_methods(
168 &self,
169 request: &DepositMethodsRequest,
170 ) -> impl Future<Output = Result<Vec<DepositMethod>, KrakenError>> + Send;
171
172 fn get_deposit_addresses(
174 &self,
175 request: &DepositAddressesRequest,
176 ) -> impl Future<Output = Result<Vec<DepositAddress>, KrakenError>> + Send;
177
178 fn get_deposit_status(
180 &self,
181 request: Option<&DepositStatusRequest>,
182 ) -> impl Future<Output = Result<DepositWithdrawStatusResponse, KrakenError>> + Send;
183
184 fn get_withdraw_methods(
186 &self,
187 request: Option<&WithdrawMethodsRequest>,
188 ) -> impl Future<Output = Result<Vec<WithdrawMethod>, KrakenError>> + Send;
189
190 fn get_withdraw_addresses(
192 &self,
193 request: Option<&WithdrawAddressesRequest>,
194 ) -> impl Future<Output = Result<Vec<WithdrawalAddress>, KrakenError>> + Send;
195
196 fn get_withdraw_info(
198 &self,
199 request: &WithdrawInfoRequest,
200 ) -> impl Future<Output = Result<WithdrawInfo, KrakenError>> + Send;
201
202 fn withdraw_funds(
204 &self,
205 request: &WithdrawRequest,
206 ) -> impl Future<Output = Result<ConfirmationRefId, KrakenError>> + Send;
207
208 fn get_withdraw_status(
210 &self,
211 request: Option<&WithdrawStatusRequest>,
212 ) -> impl Future<Output = Result<DepositWithdrawStatusResponse, KrakenError>> + Send;
213
214 fn withdraw_cancel(
216 &self,
217 request: &WithdrawCancelRequest,
218 ) -> impl Future<Output = Result<bool, KrakenError>> + Send;
219
220 fn wallet_transfer(
222 &self,
223 request: &WalletTransferRequest,
224 ) -> impl Future<Output = Result<ConfirmationRefId, KrakenError>> + Send;
225
226 fn earn_allocate(
230 &self,
231 request: &EarnAllocateRequest,
232 ) -> impl Future<Output = Result<bool, KrakenError>> + Send;
233
234 fn earn_deallocate(
236 &self,
237 request: &EarnAllocateRequest,
238 ) -> impl Future<Output = Result<bool, KrakenError>> + Send;
239
240 fn get_earn_allocation_status(
242 &self,
243 request: &EarnAllocationStatusRequest,
244 ) -> impl Future<Output = Result<AllocationStatus, KrakenError>> + Send;
245
246 fn get_earn_deallocation_status(
248 &self,
249 request: &EarnAllocationStatusRequest,
250 ) -> impl Future<Output = Result<AllocationStatus, KrakenError>> + Send;
251
252 fn list_earn_strategies(
254 &self,
255 request: Option<&EarnStrategiesRequest>,
256 ) -> impl Future<Output = Result<EarnStrategies, KrakenError>> + Send;
257
258 fn list_earn_allocations(
260 &self,
261 request: Option<&EarnAllocationsRequest>,
262 ) -> impl Future<Output = Result<EarnAllocations, KrakenError>> + Send;
263
264 fn add_order(
268 &self,
269 request: &AddOrderRequest,
270 ) -> impl Future<Output = Result<AddOrderResponse, KrakenError>> + Send;
271
272 fn cancel_order(
274 &self,
275 request: &CancelOrderRequest,
276 ) -> impl Future<Output = Result<CancelOrderResponse, KrakenError>> + Send;
277
278 fn cancel_all_orders(
280 &self,
281 ) -> impl Future<Output = Result<CancelOrderResponse, KrakenError>> + Send;
282
283 fn get_websocket_token(
287 &self,
288 ) -> impl Future<Output = Result<WebSocketToken, KrakenError>> + Send;
289}
290
291#[allow(async_fn_in_trait)]
295pub trait KrakenClientExt: Send + Sync {
296 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 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 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 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 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 async fn get_websocket_token(&self) -> Result<WebSocketToken, KrakenError>;
433}
434
435impl<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}