112 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { SignedOrder } from '0x.js';
 | 
						|
import { BigNumber } from '@0xproject/utils';
 | 
						|
import * as _ from 'lodash';
 | 
						|
 | 
						|
import { BatchCancelOrders, BatchFillOrders, FillOrdersUpTo } from './types';
 | 
						|
 | 
						|
export const formatters = {
 | 
						|
    createBatchFill(
 | 
						|
        signedOrders: SignedOrder[],
 | 
						|
        shouldThrowOnInsufficientBalanceOrAllowance: boolean,
 | 
						|
        fillTakerTokenAmounts: BigNumber[] = [],
 | 
						|
    ) {
 | 
						|
        const batchFill: BatchFillOrders = {
 | 
						|
            orderAddresses: [],
 | 
						|
            orderValues: [],
 | 
						|
            fillTakerTokenAmounts,
 | 
						|
            shouldThrowOnInsufficientBalanceOrAllowance,
 | 
						|
            v: [],
 | 
						|
            r: [],
 | 
						|
            s: [],
 | 
						|
        };
 | 
						|
        _.forEach(signedOrders, signedOrder => {
 | 
						|
            batchFill.orderAddresses.push([
 | 
						|
                signedOrder.maker,
 | 
						|
                signedOrder.taker,
 | 
						|
                signedOrder.makerTokenAddress,
 | 
						|
                signedOrder.takerTokenAddress,
 | 
						|
                signedOrder.feeRecipient,
 | 
						|
            ]);
 | 
						|
            batchFill.orderValues.push([
 | 
						|
                signedOrder.makerTokenAmount,
 | 
						|
                signedOrder.takerTokenAmount,
 | 
						|
                signedOrder.makerFee,
 | 
						|
                signedOrder.takerFee,
 | 
						|
                signedOrder.expirationUnixTimestampSec,
 | 
						|
                signedOrder.salt,
 | 
						|
            ]);
 | 
						|
            batchFill.v.push(signedOrder.ecSignature.v);
 | 
						|
            batchFill.r.push(signedOrder.ecSignature.r);
 | 
						|
            batchFill.s.push(signedOrder.ecSignature.s);
 | 
						|
            if (fillTakerTokenAmounts.length < signedOrders.length) {
 | 
						|
                batchFill.fillTakerTokenAmounts.push(signedOrder.takerTokenAmount);
 | 
						|
            }
 | 
						|
        });
 | 
						|
        return batchFill;
 | 
						|
    },
 | 
						|
    createFillUpTo(
 | 
						|
        signedOrders: SignedOrder[],
 | 
						|
        shouldThrowOnInsufficientBalanceOrAllowance: boolean,
 | 
						|
        fillTakerTokenAmount: BigNumber,
 | 
						|
    ) {
 | 
						|
        const fillUpTo: FillOrdersUpTo = {
 | 
						|
            orderAddresses: [],
 | 
						|
            orderValues: [],
 | 
						|
            fillTakerTokenAmount,
 | 
						|
            shouldThrowOnInsufficientBalanceOrAllowance,
 | 
						|
            v: [],
 | 
						|
            r: [],
 | 
						|
            s: [],
 | 
						|
        };
 | 
						|
        signedOrders.forEach(signedOrder => {
 | 
						|
            fillUpTo.orderAddresses.push([
 | 
						|
                signedOrder.maker,
 | 
						|
                signedOrder.taker,
 | 
						|
                signedOrder.makerTokenAddress,
 | 
						|
                signedOrder.takerTokenAddress,
 | 
						|
                signedOrder.feeRecipient,
 | 
						|
            ]);
 | 
						|
            fillUpTo.orderValues.push([
 | 
						|
                signedOrder.makerTokenAmount,
 | 
						|
                signedOrder.takerTokenAmount,
 | 
						|
                signedOrder.makerFee,
 | 
						|
                signedOrder.takerFee,
 | 
						|
                signedOrder.expirationUnixTimestampSec,
 | 
						|
                signedOrder.salt,
 | 
						|
            ]);
 | 
						|
            fillUpTo.v.push(signedOrder.ecSignature.v);
 | 
						|
            fillUpTo.r.push(signedOrder.ecSignature.r);
 | 
						|
            fillUpTo.s.push(signedOrder.ecSignature.s);
 | 
						|
        });
 | 
						|
        return fillUpTo;
 | 
						|
    },
 | 
						|
    createBatchCancel(signedOrders: SignedOrder[], cancelTakerTokenAmounts: BigNumber[] = []) {
 | 
						|
        const batchCancel: BatchCancelOrders = {
 | 
						|
            orderAddresses: [],
 | 
						|
            orderValues: [],
 | 
						|
            cancelTakerTokenAmounts,
 | 
						|
        };
 | 
						|
        signedOrders.forEach(signedOrder => {
 | 
						|
            batchCancel.orderAddresses.push([
 | 
						|
                signedOrder.maker,
 | 
						|
                signedOrder.taker,
 | 
						|
                signedOrder.makerTokenAddress,
 | 
						|
                signedOrder.takerTokenAddress,
 | 
						|
                signedOrder.feeRecipient,
 | 
						|
            ]);
 | 
						|
            batchCancel.orderValues.push([
 | 
						|
                signedOrder.makerTokenAmount,
 | 
						|
                signedOrder.takerTokenAmount,
 | 
						|
                signedOrder.makerFee,
 | 
						|
                signedOrder.takerFee,
 | 
						|
                signedOrder.expirationUnixTimestampSec,
 | 
						|
                signedOrder.salt,
 | 
						|
            ]);
 | 
						|
            if (cancelTakerTokenAmounts.length < signedOrders.length) {
 | 
						|
                batchCancel.cancelTakerTokenAmounts.push(signedOrder.takerTokenAmount);
 | 
						|
            }
 | 
						|
        });
 | 
						|
        return batchCancel;
 | 
						|
    },
 | 
						|
};
 |