diff options
author | Brandon Millman <brandon.millman@gmail.com> | 2018-09-15 19:56:20 +0800 |
---|---|---|
committer | Brandon Millman <brandon.millman@gmail.com> | 2018-09-15 20:14:55 +0800 |
commit | 190bf2599c1327fffd03d8a9d50bc7568190cf33 (patch) | |
tree | 587e65fdeda7067bf3f2980c309990a60804aae8 /packages/asset-buyer/src/order_fetchers/standard_relayer_api_order_fetcher.ts | |
parent | f1a22e9bd7943bc9cb8d8308daca0c60af6e0039 (diff) | |
download | dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.tar dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.tar.gz dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.tar.bz2 dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.tar.lz dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.tar.xz dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.tar.zst dexon-sol-tools-190bf2599c1327fffd03d8a9d50bc7568190cf33.zip |
Implement StandardRelayerAPIOrderFetcher
Diffstat (limited to 'packages/asset-buyer/src/order_fetchers/standard_relayer_api_order_fetcher.ts')
-rw-r--r-- | packages/asset-buyer/src/order_fetchers/standard_relayer_api_order_fetcher.ts | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/packages/asset-buyer/src/order_fetchers/standard_relayer_api_order_fetcher.ts b/packages/asset-buyer/src/order_fetchers/standard_relayer_api_order_fetcher.ts new file mode 100644 index 000000000..bf177b93b --- /dev/null +++ b/packages/asset-buyer/src/order_fetchers/standard_relayer_api_order_fetcher.ts @@ -0,0 +1,80 @@ +import { APIOrder, HttpClient, OrderbookResponse } from '@0xproject/connect'; +import { SignedOrder } from '@0xproject/types'; +import { BigNumber } from '@0xproject/utils'; +import * as _ from 'lodash'; + +import { constants } from '../constants'; +import { + AssetBuyerError, + OrderFetcher, + OrderFetcherRequest, + OrderFetcherResponse, + SignedOrderWithRemainingFillableMakerAssetAmount, +} from '../types'; +import { assert } from '../utils/assert'; +import { orderUtils } from '../utils/order_utils'; + +export class StandardRelayerAPIOrderFetcher implements OrderFetcher { + public readonly apiUrl: string; + private _sraClient: HttpClient; + /** + * Given an array of APIOrder objects from a standard relayer api, return an array + * of SignedOrderWithRemainingFillableMakerAssetAmounts + */ + private static _getSignedOrderWithRemainingFillableMakerAssetAmountFromApi( + apiOrders: APIOrder[], + ): SignedOrderWithRemainingFillableMakerAssetAmount[] { + const result = _.map(apiOrders, apiOrder => { + const { order, metaData } = apiOrder; + // calculate remainingFillableMakerAssetAmount from api metadata, else assume order is completely fillable + const remainingFillableTakerAssetAmount = _.get( + metaData, + 'remainingTakerAssetAmount', + order.takerAssetAmount, + ); + const remainingFillableMakerAssetAmount = orderUtils.calculateRemainingMakerAssetAmount( + order, + remainingFillableTakerAssetAmount, + ); + const newOrder = { + ...order, + remainingFillableMakerAssetAmount, + }; + return newOrder; + }); + return result; + } + /** + * Instantiates a new StandardRelayerAPIOrderFetcher instance + * @param apiUrl The relayer API base HTTP url you would like to interact with. + * @return An instance of StandardRelayerAPIOrderFetcher + */ + constructor(apiUrl: string) { + assert.isWebUri('apiUrl', apiUrl); + this.apiUrl = apiUrl; + this._sraClient = new HttpClient(apiUrl); + } + /** + * Given an object that conforms to OrderFetcherRequest, return the corresponding OrderFetcherResponse that satisfies the request. + * @param orderFetchRequest An instance of OrderFetcherRequest. See type for more information. + * @return An instance of OrderFetcherResponse. See type for more information. + */ + public async fetchOrdersAsync(orderFetchRequest: OrderFetcherRequest): Promise<OrderFetcherResponse> { + const { makerAssetData, takerAssetData, networkId } = orderFetchRequest; + const orderbookRequest = { baseAssetData: makerAssetData, quoteAssetData: takerAssetData }; + const requestOpts = { networkId }; + let orderbook: OrderbookResponse; + try { + orderbook = await this._sraClient.getOrderbookAsync(orderbookRequest, requestOpts); + } catch (err) { + throw new Error(AssetBuyerError.StandardRelayerApiError); + } + const apiOrders = orderbook.asks.records; + const orders = StandardRelayerAPIOrderFetcher._getSignedOrderWithRemainingFillableMakerAssetAmountFromApi( + apiOrders, + ); + return { + orders, + }; + } +} |