aboutsummaryrefslogtreecommitdiffstats
path: root/packages/asset-buyer
diff options
context:
space:
mode:
Diffstat (limited to 'packages/asset-buyer')
-rw-r--r--packages/asset-buyer/src/asset_buyer.ts24
-rw-r--r--packages/asset-buyer/src/utils/assert.ts16
2 files changed, 39 insertions, 1 deletions
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.`,
+ );
+ },
};