aboutsummaryrefslogtreecommitdiffstats
path: root/packages/pipeline/src/parsers/utils.ts
blob: 860729e9f923b7b84d74a58ff7e9304ce7b3679f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { BigNumber } from '@0x/utils';

export interface GenericRawOrder {
    price: string;
    amount: string;
}

/**
 * Aggregates individual orders by price point. Filters zero amount orders.
 * @param rawOrders An array of objects that have price and amount information.
 */
export function aggregateOrders(rawOrders: GenericRawOrder[]): Array<[string, BigNumber]> {
    const aggregatedOrders = new Map<string, BigNumber>();
    rawOrders.forEach(order => {
        const amount = new BigNumber(order.amount);
        if (amount.isZero()) {
            return;
        }
        // Use string instead of BigNum to aggregate by value instead of variable.
        // Convert to BigNumber first to consolidate different string
        // representations of the same number. Eg. '0.0' and '0.00'.
        const price = new BigNumber(order.price).toString();

        const existingAmount = aggregatedOrders.get(price) || new BigNumber(0);
        aggregatedOrders.set(price, amount.plus(existingAmount));
    });
    return Array.from(aggregatedOrders.entries());
}