zcash_client_backend/tor/http/cryptex/
kraken.rs1use std::io;
2
3use rust_decimal::Decimal;
4use serde::Deserialize;
5
6use super::{Exchange, ExchangeData, RETRY_LIMIT, retry_filter};
7use crate::tor::{Client, Error};
8
9pub struct Kraken {
11 _private: (),
12}
13
14impl Kraken {
15 pub fn unauthenticated() -> Self {
17 Self { _private: () }
18 }
19}
20
21#[derive(Debug, Deserialize)]
22#[allow(dead_code)]
23struct KrakenData {
24 a: (Decimal, u64, Decimal),
25 b: (Decimal, u64, Decimal),
26 c: (Decimal, Decimal),
27 v: (Decimal, Decimal),
28 p: (Decimal, Decimal),
29 t: (u32, u32),
30 l: (Decimal, Decimal),
31 h: (Decimal, Decimal),
32 o: Decimal,
33}
34
35type KrakenResponse = Result<KrakenData, Vec<String>>;
36
37impl Exchange for Kraken {
38 async fn query_zec_to_usd(&self, client: &Client) -> Result<ExchangeData, Error> {
39 let res = client
42 .http_get_json::<KrakenResponse>(
43 "https://api.kraken.com/0/public/Ticker?pair=XZECZUSD"
44 .parse()
45 .unwrap(),
46 |b| b,
47 RETRY_LIMIT,
48 retry_filter,
49 )
50 .await?;
51 let data = res.into_body().map_err(|e| {
52 Error::Io(io::Error::other(
53 e.into_iter()
54 .reduce(|mut acc, e| {
55 acc.push_str("; ");
56 acc.push_str(&e);
57 acc
58 })
59 .unwrap_or_default(),
60 ))
61 })?;
62 Ok(ExchangeData {
63 bid: data.b.0,
64 ask: data.a.0,
65 })
66 }
67}