From af40989f5f6b606172370d8e878c51ce2e7382eb Mon Sep 17 00:00:00 2001
From: Brandon Millman <brandon.millman@gmail.com>
Date: Sat, 15 Sep 2018 14:47:44 +0200
Subject: Add factory method on AssetBuyer for provided orders

---
 packages/asset-buyer/src/asset_buyer.ts  | 24 +++++++++++++++++++++++-
 packages/asset-buyer/src/utils/assert.ts | 16 ++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

(limited to 'packages/asset-buyer/src')

diff --git a/packages/asset-buyer/src/asset_buyer.ts b/packages/asset-buyer/src/asset_buyer.ts
index 3b603d929..a68658d22 100644
--- a/packages/asset-buyer/src/asset_buyer.ts
+++ b/packages/asset-buyer/src/asset_buyer.ts
@@ -1,5 +1,6 @@
 import { ContractWrappers } from '@0xproject/contract-wrappers';
-import { assetDataUtils } from '@0xproject/order-utils';
+import { schemas } from '@0xproject/json-schemas';
+import { assetDataUtils, SignedOrder } from '@0xproject/order-utils';
 import { BigNumber } from '@0xproject/utils';
 import { Web3Wrapper } from '@0xproject/web3-wrapper';
 import { Provider } from 'ethereum-types';
@@ -13,6 +14,7 @@ import {
     OrderFetcher,
     OrderFetcherResponse,
 } from './types';
+import { ProvidedOrderFetcher } from './order_fetchers/provided_order_fetcher';
 import { assert } from './utils/assert';
 import { buyQuoteCalculator } from './utils/buy_quote_calculator';
 import { orderFetcherResponseProcessor } from './utils/order_fetcher_response_processor';
@@ -31,6 +33,26 @@ export class AssetBuyer {
     private readonly _contractWrappers: ContractWrappers;
     private _lastRefreshTimeIfExists?: number;
     private _currentOrdersAndFillableAmountsIfExists?: AssetBuyerOrdersAndFillableAmounts;
+    public static getAssetBuyerForProvidedOrders(
+        provider: Provider,
+        orders: SignedOrder[],
+        feeOrders: SignedOrder[] = [],
+        networkId: number = constants.MAINNET_NETWORK_ID,
+        orderRefreshIntervalMs: number = DEFAULT_ORDER_REFRESH_INTERVAL_MS,
+    ): AssetBuyer {
+        assert.isWeb3Provider('provider', provider);
+        assert.doesConformToSchema('orders', orders, schemas.signedOrdersSchema);
+        assert.doesConformToSchema('feeOrders', feeOrders, schemas.signedOrdersSchema);
+        assert.isNumber('networkId', networkId);
+        assert.isNumber('orderRefreshIntervalMs', orderRefreshIntervalMs);
+        assert.areValidProvidedOrders('orders', orders);
+        assert.areValidProvidedOrders('feeOrders', feeOrders);
+        assert.assert(orders.length !== 0, `Expected orders to contain at least one order`);
+        const assetData = orders[0].makerAssetData;
+        const orderFetcher = new ProvidedOrderFetcher(_.concat(orders, feeOrders));
+        const assetBuyer = new AssetBuyer(provider, assetData, orderFetcher, networkId, orderRefreshIntervalMs);
+        return assetBuyer;
+    }
     /**
      * Instantiates a new AssetBuyer instance
      * @param   provider                The Provider instance you would like to use for interacting with the Ethereum network.
diff --git a/packages/asset-buyer/src/utils/assert.ts b/packages/asset-buyer/src/utils/assert.ts
index 0085ca41e..edc90608c 100644
--- a/packages/asset-buyer/src/utils/assert.ts
+++ b/packages/asset-buyer/src/utils/assert.ts
@@ -1,5 +1,6 @@
 import { assert as sharedAssert } from '@0xproject/assert';
 import { schemas } from '@0xproject/json-schemas';
+import { SignedOrder } from '@0xproject/types';
 import * as _ from 'lodash';
 
 import { BuyQuote, OrderFetcher, OrderFetcherRequest } from '../types';
@@ -25,4 +26,19 @@ export const assert = {
         sharedAssert.isHexString(`${variableName}.takerAssetData`, orderFetcherRequest.takerAssetData);
         sharedAssert.isNumber(`${variableName}.networkId`, orderFetcherRequest.networkId);
     },
+    areValidProvidedOrders(variableName: string, orders: SignedOrder[]): void {
+        if (orders.length === 0) {
+            return;
+        }
+        const makerAssetData = orders[0].makerAssetData;
+        const takerAssetData = orders[0].takerAssetData;
+        const filteredOrders = _.filter(
+            orders,
+            order => order.makerAssetData === makerAssetData && order.takerAssetData === takerAssetData,
+        );
+        sharedAssert.assert(
+            orders.length === filteredOrders.length,
+            `Expected all orders in ${variableName} to have the same makerAssetData and takerAssetData.`,
+        );
+    },
 };
-- 
cgit v1.2.3