From 734ee620b21c0a4eeffad7692542d16d9c86e4e2 Mon Sep 17 00:00:00 2001 From: Anxo Rodriguez Date: Tue, 6 Oct 2020 11:22:12 +0200 Subject: [PATCH] Add best ask API (#1477) * Add best ask * Change icon from wxDAI into DAI logo --- .../dexPriceEstimator/DexPriceEstimatorApi.ts | 29 ++++++++++++++++++ .../DexPriceEstimatorApiProxy.ts | 1 + ...1D153E0b41518A2Ce8Dd3D7944Fa863463a97d.png | Bin 291 -> 11815 bytes 3 files changed, 30 insertions(+) diff --git a/src/api/dexPriceEstimator/DexPriceEstimatorApi.ts b/src/api/dexPriceEstimator/DexPriceEstimatorApi.ts index dae559194..0c98def5e 100644 --- a/src/api/dexPriceEstimator/DexPriceEstimatorApi.ts +++ b/src/api/dexPriceEstimator/DexPriceEstimatorApi.ts @@ -4,6 +4,7 @@ import { ORDER_BOOK_HOPS_DEFAULT, ORDER_BOOK_HOPS_MAX } from 'const' export interface DexPriceEstimatorApi { getPrice(params: GetPriceParams): Promise + getBestAsk(params: GetBestAskParams): Promise getOrderBookUrl(params: OrderBookParams): string getOrderBookData(params: OrderBookParams): Promise getMinOrderAmounInOWLUrl(networkId: number): string @@ -18,6 +19,8 @@ interface GetPriceParams { inWei?: boolean } +type GetBestAskParams = Omit + interface OrderBookParams { networkId: number baseTokenId: number @@ -125,6 +128,32 @@ export class DexPriceEstimatorApiImpl implements DexPriceEstimatorApi { } } + public async getBestAsk(params: GetBestAskParams): Promise { + const { + networkId, + baseToken: { id: baseTokenId }, + quoteToken: { id: quoteTokenId }, + } = params + + // Query format: markets/7-1/estimated-best-ask-price?unit=baseunits&roundingBuffer=enabled + const queryString = `markets/${baseTokenId}-${quoteTokenId}/estimated-best-ask-price` + + try { + const response = await this.query(networkId, queryString) + + if (response === null) { + return response + } + + return new BigNumber(response) + } catch (e) { + console.error(e) + throw new Error( + `Failed to query best ask for baseToken id ${baseTokenId} quoteToken id ${quoteTokenId}: ${e.message}`, + ) + } + } + public getOrderBookUrl(params: OrderBookParams): string { const { networkId, baseTokenId, quoteTokenId, hops = ORDER_BOOK_HOPS_DEFAULT, batchId } = params assert(hops >= 0, 'Hops should be positive') diff --git a/src/api/dexPriceEstimator/DexPriceEstimatorApiProxy.ts b/src/api/dexPriceEstimator/DexPriceEstimatorApiProxy.ts index 453662d3c..71f92d00b 100644 --- a/src/api/dexPriceEstimator/DexPriceEstimatorApiProxy.ts +++ b/src/api/dexPriceEstimator/DexPriceEstimatorApiProxy.ts @@ -12,6 +12,7 @@ export class DexPriceEstimatorApiProxy extends DexPriceEstimatorApiImpl { this.cache.injectCache(this, [ { method: 'getPrice', ttl: PRICES_CACHE_TIME }, + { method: 'getBestAsk', ttl: PRICES_CACHE_TIME }, { method: 'getMinOrderAmounInOWL', ttl: PRICES_CACHE_TIME }, ]) } diff --git a/src/assets/img/tokens/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d.png b/src/assets/img/tokens/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d.png index 31ef3197cb233af5cf6751eb0851ec53c59bd28c..836fe787663b9e7d93e3b038123d07dec86fb37d 100644 GIT binary patch literal 11815 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 N80ebn)M&ZJ{}1DaK!E@N literal 291 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7#Nv>)VXbLJAo8ifKP}kkoH))Z1%jAQ$QAD zNswPKgTu2MX&_FLx4R2N2dk_Hki%Kv5m^j0>pBQCI%&+V01C2~c>21sKj9P?5aUa` zdGs()Xqu;sV@SoVx3>@SHYo5oToht26bUa*Q4jEMW9DS!Z+lREeUiOHuo6%ygWaTc zm;UigFDm2WzyN!=K`OxDK+LDiyMfi)Oz%7kWnSHY4i4Be>FzeEuVrOH2UW}$g+V5` Zl``|FoGwUecDw-Mdb;|#taD0e0suohOZ5N%