From d9bd07c397d814c510be6374e98e03ab1fe8e968 Mon Sep 17 00:00:00 2001 From: Maxim Kucherov Date: Tue, 23 Aug 2022 15:58:52 +0300 Subject: [PATCH] Implement Kraken rates provider --- src/exchange/ratesProvider/index.ts | 3 ++ src/exchange/ratesProvider/kraken/dtos.ts | 51 +++++++++++++++++++ src/exchange/ratesProvider/kraken/index.ts | 1 + .../kraken/krakenRatesProvider.ts | 34 +++++++++++++ src/exchange/ratesProvider/ratesProvider.ts | 7 +++ 5 files changed, 96 insertions(+) create mode 100644 src/exchange/ratesProvider/index.ts create mode 100644 src/exchange/ratesProvider/kraken/dtos.ts create mode 100644 src/exchange/ratesProvider/kraken/index.ts create mode 100644 src/exchange/ratesProvider/kraken/krakenRatesProvider.ts create mode 100644 src/exchange/ratesProvider/ratesProvider.ts diff --git a/src/exchange/ratesProvider/index.ts b/src/exchange/ratesProvider/index.ts new file mode 100644 index 00000000..3e4f0e45 --- /dev/null +++ b/src/exchange/ratesProvider/index.ts @@ -0,0 +1,3 @@ +export type { RatesProvider } from './ratesProvider'; +export { BinanceRatesProvider } from './binance/index'; +export { KrakenRatesProvider } from './kraken/index'; diff --git a/src/exchange/ratesProvider/kraken/dtos.ts b/src/exchange/ratesProvider/kraken/dtos.ts new file mode 100644 index 00000000..1a65a792 --- /dev/null +++ b/src/exchange/ratesProvider/kraken/dtos.ts @@ -0,0 +1,51 @@ +export interface KrakenRatesDto { + error: string[]; + result: Record; +} + +export interface KrakenTickerInfo { + /** + * Ask + */ + a: [price: string, wholeLotVolume: string, lotVolume: string]; + + /** + * Bid + */ + b: [price: string, wholeLotVolume: string, lotVolume: string]; + + /** + * Last trade closed + */ + c: [price: string, lotVolume: string]; + + /** + * Volume + */ + v: [today: string, last24Hours: string]; + + /** + * Volume weighted average price + */ + p: [today: string, last24Hours: string]; + + /** + * Number of trades + */ + t: [today: number, last24Hours: number]; + + /** + * Low + */ + l: [today: string, last24Hours: string]; + + /** + * High + */ + h: [today: string, last24Hours: string]; + + /** + * Today's opening price + */ + o: string; +} diff --git a/src/exchange/ratesProvider/kraken/index.ts b/src/exchange/ratesProvider/kraken/index.ts new file mode 100644 index 00000000..882bb11d --- /dev/null +++ b/src/exchange/ratesProvider/kraken/index.ts @@ -0,0 +1 @@ +export { KrakenRatesProvider } from './krakenRatesProvider'; diff --git a/src/exchange/ratesProvider/kraken/krakenRatesProvider.ts b/src/exchange/ratesProvider/kraken/krakenRatesProvider.ts new file mode 100644 index 00000000..b43d0d17 --- /dev/null +++ b/src/exchange/ratesProvider/kraken/krakenRatesProvider.ts @@ -0,0 +1,34 @@ +import BigNumber from 'bignumber.js'; + +import { HttpClient } from '../../../core'; +import type { RatesProvider } from '../ratesProvider'; +import type { KrakenRatesDto } from './dtos'; + +export class KrakenRatesProvider implements RatesProvider { + private static readonly baseUrl = 'https://api.kraken.com'; + + private readonly httpClient: HttpClient; + + constructor() { + this.httpClient = new HttpClient(KrakenRatesProvider.baseUrl); + } + + async getPrice(quoteCurrency: string, baseCurrency: string): Promise { + const symbol = `${quoteCurrency}${baseCurrency}`; + const urlPath = `/0/public/Ticker?pair=${symbol}`; + const responseDto = await this.httpClient.request({ urlPath }, false); + + return this.mapRatesDtoToPrice(responseDto, symbol); + } + + private mapRatesDtoToPrice(dto: KrakenRatesDto, symbol: string): BigNumber | undefined { + if (dto.error) + return undefined; + + const tickerInfo = dto.result[symbol]; + if (!tickerInfo) + return undefined; + + return new BigNumber(tickerInfo.c[0]); + } +} diff --git a/src/exchange/ratesProvider/ratesProvider.ts b/src/exchange/ratesProvider/ratesProvider.ts new file mode 100644 index 00000000..169c2862 --- /dev/null +++ b/src/exchange/ratesProvider/ratesProvider.ts @@ -0,0 +1,7 @@ +import type BigNumber from 'bignumber.js'; + +import type { Currency } from '../../common'; + +export interface RatesProvider { + getPrice(quoteCurrency: Currency['id'], baseCurrency: Currency['id']): Promise; +}