Skip to main content

zcash_client_backend/tor/http/cryptex/
kraken.rs

1use 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
9/// Querier for the Kraken exchange.
10pub struct Kraken {
11    _private: (),
12}
13
14impl Kraken {
15    /// Prepares for unauthenticated connections to Kraken.
16    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        // API documentation:
40        // https://docs.kraken.com/api/docs/rest-api/get-ticker-information
41        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}