aboutsummaryrefslogtreecommitdiffstats
path: root/packages/asset-buyer/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'packages/asset-buyer/src/utils')
-rw-r--r--packages/asset-buyer/src/utils/forwarder_helper_impl_config_utils.ts92
-rw-r--r--packages/asset-buyer/src/utils/order_utils.ts21
2 files changed, 113 insertions, 0 deletions
diff --git a/packages/asset-buyer/src/utils/forwarder_helper_impl_config_utils.ts b/packages/asset-buyer/src/utils/forwarder_helper_impl_config_utils.ts
new file mode 100644
index 000000000..253384f65
--- /dev/null
+++ b/packages/asset-buyer/src/utils/forwarder_helper_impl_config_utils.ts
@@ -0,0 +1,92 @@
+import { sortingUtils } from '@0xproject/order-utils';
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { ForwarderHelperImplConfig } from '../forwarder_helper_impl';
+
+interface SignedOrderWithAmount extends SignedOrder {
+ remainingFillAmount: BigNumber;
+}
+
+export const forwarderHelperImplConfigUtils = {
+ sortedConfig(config: ForwarderHelperImplConfig): ForwarderHelperImplConfig {
+ const { orders, feeOrders, remainingFillableMakerAssetAmounts, remainingFillableFeeAmounts } = config;
+ // TODO: provide a feeRate to the sorting function to more accurately sort based on the current market for ZRX tokens
+ const orderSorter = (ordersToSort: SignedOrder[]) => {
+ return sortingUtils.sortOrdersByFeeAdjustedRate(ordersToSort);
+ };
+ const sortOrdersResult = sortOrdersAndRemainingFillAmounts(
+ orderSorter,
+ orders,
+ remainingFillableMakerAssetAmounts,
+ );
+ const feeOrderSorter = (ordersToSort: SignedOrder[]) => {
+ return sortingUtils.sortFeeOrdersByFeeAdjustedRate(ordersToSort);
+ };
+ const sortFeeOrdersResult = sortOrdersAndRemainingFillAmounts(
+ feeOrderSorter,
+ feeOrders,
+ remainingFillableFeeAmounts,
+ );
+ return {
+ orders: sortOrdersResult.orders,
+ feeOrders: sortFeeOrdersResult.orders,
+ remainingFillableMakerAssetAmounts: sortOrdersResult.remainingFillAmounts,
+ remainingFillableFeeAmounts: sortFeeOrdersResult.remainingFillAmounts,
+ };
+ },
+};
+
+type OrderSorter = (orders: SignedOrder[]) => SignedOrder[];
+
+function sortOrdersAndRemainingFillAmounts(
+ orderSorter: OrderSorter,
+ orders: SignedOrder[],
+ remainingFillAmounts?: BigNumber[],
+): { orders: SignedOrder[]; remainingFillAmounts?: BigNumber[] } {
+ if (!_.isUndefined(remainingFillAmounts)) {
+ // Bundle orders together with their remainingFillAmounts so that we can sort them together
+ const orderWithAmounts = bundleSignedOrderWithAmounts(orders, remainingFillAmounts);
+ // Sort
+ const sortedOrderWithAmounts = orderSorter(orderWithAmounts) as SignedOrderWithAmount[];
+ // Unbundle after sorting
+ const unbundledSortedOrderWithAmounts = unbundleSignedOrderWithAmounts(sortedOrderWithAmounts);
+ return {
+ orders: unbundledSortedOrderWithAmounts.orders,
+ remainingFillAmounts: unbundledSortedOrderWithAmounts.amounts,
+ };
+ } else {
+ const sortedOrders = orderSorter(orders);
+ return {
+ orders: sortedOrders,
+ };
+ }
+}
+
+function bundleSignedOrderWithAmounts(orders: SignedOrder[], amounts: BigNumber[]): SignedOrderWithAmount[] {
+ const ordersAndAmounts = _.map(orders, (order, index) => {
+ return {
+ ...order,
+ remainingFillAmount: amounts[index],
+ };
+ });
+ return ordersAndAmounts;
+}
+
+function unbundleSignedOrderWithAmounts(
+ signedOrderWithAmounts: SignedOrderWithAmount[],
+): { orders: SignedOrder[]; amounts: BigNumber[] } {
+ const orders = _.map(signedOrderWithAmounts, order => {
+ const { remainingFillAmount, ...rest } = order;
+ return rest;
+ });
+ const amounts = _.map(signedOrderWithAmounts, order => {
+ const { remainingFillAmount } = order;
+ return remainingFillAmount;
+ });
+ return {
+ orders,
+ amounts,
+ };
+}
diff --git a/packages/asset-buyer/src/utils/order_utils.ts b/packages/asset-buyer/src/utils/order_utils.ts
new file mode 100644
index 000000000..bb0bdb80f
--- /dev/null
+++ b/packages/asset-buyer/src/utils/order_utils.ts
@@ -0,0 +1,21 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { constants } from '../constants';
+
+export const orderUtils = {
+ isOrderExpired(order: SignedOrder): boolean {
+ const millisecondsInSecond = 1000;
+ const currentUnixTimestampSec = new BigNumber(Date.now() / millisecondsInSecond).round();
+ return order.expirationTimeSeconds.lessThan(currentUnixTimestampSec);
+ },
+ calculateRemainingMakerAssetAmount(order: SignedOrder, remainingTakerAssetAmount: BigNumber): BigNumber {
+ const result = remainingTakerAssetAmount.eq(0)
+ ? constants.ZERO_AMOUNT
+ : remainingTakerAssetAmount.times(order.makerAssetAmount).dividedToIntegerBy(order.takerAssetAmount);
+ return result;
+ },
+ isOpenOrder(order: SignedOrder): boolean {
+ return order.takerAddress === constants.NULL_ADDRESS;
+ },
+};