updated unit tests
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
import { BigNumber } from '@0x/utils';
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
 | 
					    ExtensionContractType,
 | 
				
			||||||
    ForwarderExtensionContractOpts,
 | 
					    ForwarderExtensionContractOpts,
 | 
				
			||||||
    OrderPrunerOpts,
 | 
					    OrderPrunerOpts,
 | 
				
			||||||
    OrderPrunerPermittedFeeTypes,
 | 
					    OrderPrunerPermittedFeeTypes,
 | 
				
			||||||
@@ -8,7 +9,6 @@ import {
 | 
				
			|||||||
    SwapQuoteGetOutputOpts,
 | 
					    SwapQuoteGetOutputOpts,
 | 
				
			||||||
    SwapQuoteRequestOpts,
 | 
					    SwapQuoteRequestOpts,
 | 
				
			||||||
    SwapQuoterOpts,
 | 
					    SwapQuoterOpts,
 | 
				
			||||||
    ExtensionContractType,
 | 
					 | 
				
			||||||
} from './types';
 | 
					} from './types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ETH_GAS_STATION_API_BASE_URL = 'https://ethgasstation.info';
 | 
					const ETH_GAS_STATION_API_BASE_URL = 'https://ethgasstation.info';
 | 
				
			||||||
@@ -18,7 +18,6 @@ const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
 | 
				
			|||||||
const MAINNET_CHAIN_ID = 1;
 | 
					const MAINNET_CHAIN_ID = 1;
 | 
				
			||||||
const ONE_SECOND_MS = 1000;
 | 
					const ONE_SECOND_MS = 1000;
 | 
				
			||||||
const DEFAULT_PER_PAGE = 1000;
 | 
					const DEFAULT_PER_PAGE = 1000;
 | 
				
			||||||
const PROTOCOL_FEE_MULTIPLIER = 150000;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DEFAULT_ORDER_PRUNER_OPTS: OrderPrunerOpts = {
 | 
					const DEFAULT_ORDER_PRUNER_OPTS: OrderPrunerOpts = {
 | 
				
			||||||
    expiryBufferMs: 120000, // 2 minutes
 | 
					    expiryBufferMs: 120000, // 2 minutes
 | 
				
			||||||
@@ -68,6 +67,5 @@ export const constants = {
 | 
				
			|||||||
    DEFAULT_FORWARDER_SWAP_QUOTE_EXECUTE_OPTS,
 | 
					    DEFAULT_FORWARDER_SWAP_QUOTE_EXECUTE_OPTS,
 | 
				
			||||||
    DEFAULT_SWAP_QUOTE_REQUEST_OPTS,
 | 
					    DEFAULT_SWAP_QUOTE_REQUEST_OPTS,
 | 
				
			||||||
    DEFAULT_PER_PAGE,
 | 
					    DEFAULT_PER_PAGE,
 | 
				
			||||||
    PROTOCOL_FEE_MULTIPLIER,
 | 
					 | 
				
			||||||
    NULL_ERC20_ASSET_DATA,
 | 
					    NULL_ERC20_ASSET_DATA,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@ import * as _ from 'lodash';
 | 
				
			|||||||
import { constants } from '../constants';
 | 
					import { constants } from '../constants';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    CalldataInfo,
 | 
					    CalldataInfo,
 | 
				
			||||||
    ForwarderExtensionContractOpts,
 | 
					 | 
				
			||||||
    ForwarderSmartContractParams,
 | 
					    ForwarderSmartContractParams,
 | 
				
			||||||
    MarketOperation,
 | 
					    MarketOperation,
 | 
				
			||||||
    SmartContractParamsInfo,
 | 
					    SmartContractParamsInfo,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,9 +20,10 @@ import {
 | 
				
			|||||||
    MarketSellSwapQuote,
 | 
					    MarketSellSwapQuote,
 | 
				
			||||||
    PrunedSignedOrder,
 | 
					    PrunedSignedOrder,
 | 
				
			||||||
} from '../src/types';
 | 
					} from '../src/types';
 | 
				
			||||||
 | 
					import { ProtocolFeeUtils } from '../src/utils/protocol_fee_utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { chaiSetup } from './utils/chai_setup';
 | 
					import { chaiSetup } from './utils/chai_setup';
 | 
				
			||||||
import { getFullyFillableSwapQuoteWithNoFees } from './utils/swap_quote';
 | 
					import { getFullyFillableSwapQuoteWithNoFeesAsync } from './utils/swap_quote';
 | 
				
			||||||
import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
					import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chaiSetup.configure();
 | 
					chaiSetup.configure();
 | 
				
			||||||
@@ -67,6 +68,8 @@ const expectMakerAndTakerBalancesAsyncFactory = (
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('ExchangeSwapQuoteConsumer', () => {
 | 
					describe('ExchangeSwapQuoteConsumer', () => {
 | 
				
			||||||
 | 
					    let contractWrappers: ContractWrappers;
 | 
				
			||||||
 | 
					    let protocolFeeUtils: ProtocolFeeUtils;
 | 
				
			||||||
    let userAddresses: string[];
 | 
					    let userAddresses: string[];
 | 
				
			||||||
    let erc20MakerTokenContract: ERC20TokenContract;
 | 
					    let erc20MakerTokenContract: ERC20TokenContract;
 | 
				
			||||||
    let erc20TakerTokenContract: ERC20TokenContract;
 | 
					    let erc20TakerTokenContract: ERC20TokenContract;
 | 
				
			||||||
@@ -130,6 +133,7 @@ describe('ExchangeSwapQuoteConsumer', () => {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
        const privateKey = devConstants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
 | 
					        const privateKey = devConstants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
 | 
				
			||||||
        orderFactory = new OrderFactory(privateKey, defaultOrderParams);
 | 
					        orderFactory = new OrderFactory(privateKey, defaultOrderParams);
 | 
				
			||||||
 | 
					        protocolFeeUtils = new ProtocolFeeUtils(contractWrappers.exchange);
 | 
				
			||||||
        expectMakerAndTakerBalancesForTakerAssetAsync = expectMakerAndTakerBalancesAsyncFactory(
 | 
					        expectMakerAndTakerBalancesForTakerAssetAsync = expectMakerAndTakerBalancesAsyncFactory(
 | 
				
			||||||
            erc20TakerTokenContract,
 | 
					            erc20TakerTokenContract,
 | 
				
			||||||
            makerAddress,
 | 
					            makerAddress,
 | 
				
			||||||
@@ -156,20 +160,22 @@ describe('ExchangeSwapQuoteConsumer', () => {
 | 
				
			|||||||
            orders.push(prunedOrder as PrunedSignedOrder);
 | 
					            orders.push(prunedOrder as PrunedSignedOrder);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        marketSellSwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					        marketSellSwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
            makerAssetData,
 | 
					            makerAssetData,
 | 
				
			||||||
            takerAssetData,
 | 
					            takerAssetData,
 | 
				
			||||||
            orders,
 | 
					            orders,
 | 
				
			||||||
            MarketOperation.Sell,
 | 
					            MarketOperation.Sell,
 | 
				
			||||||
            GAS_PRICE,
 | 
					            GAS_PRICE,
 | 
				
			||||||
 | 
					            protocolFeeUtils,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        marketBuySwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					        marketBuySwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
            makerAssetData,
 | 
					            makerAssetData,
 | 
				
			||||||
            takerAssetData,
 | 
					            takerAssetData,
 | 
				
			||||||
            orders,
 | 
					            orders,
 | 
				
			||||||
            MarketOperation.Buy,
 | 
					            MarketOperation.Buy,
 | 
				
			||||||
            GAS_PRICE,
 | 
					            GAS_PRICE,
 | 
				
			||||||
 | 
					            protocolFeeUtils,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        swapQuoteConsumer = new ExchangeSwapQuoteConsumer(provider, contractAddresses, {
 | 
					        swapQuoteConsumer = new ExchangeSwapQuoteConsumer(provider, contractAddresses, {
 | 
				
			||||||
@@ -212,7 +218,6 @@ describe('ExchangeSwapQuoteConsumer', () => {
 | 
				
			|||||||
            );
 | 
					            );
 | 
				
			||||||
            await swapQuoteConsumer.executeSwapQuoteOrThrowAsync(marketSellSwapQuote, {
 | 
					            await swapQuoteConsumer.executeSwapQuoteOrThrowAsync(marketSellSwapQuote, {
 | 
				
			||||||
                takerAddress,
 | 
					                takerAddress,
 | 
				
			||||||
                gasPrice: GAS_PRICE,
 | 
					 | 
				
			||||||
                gasLimit: 4000000,
 | 
					                gasLimit: 4000000,
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            await expectMakerAndTakerBalancesForMakerAssetAsync(
 | 
					            await expectMakerAndTakerBalancesForMakerAssetAsync(
 | 
				
			||||||
@@ -235,7 +240,6 @@ describe('ExchangeSwapQuoteConsumer', () => {
 | 
				
			|||||||
            );
 | 
					            );
 | 
				
			||||||
            await swapQuoteConsumer.executeSwapQuoteOrThrowAsync(marketBuySwapQuote, {
 | 
					            await swapQuoteConsumer.executeSwapQuoteOrThrowAsync(marketBuySwapQuote, {
 | 
				
			||||||
                takerAddress,
 | 
					                takerAddress,
 | 
				
			||||||
                gasPrice: GAS_PRICE,
 | 
					 | 
				
			||||||
                gasLimit: 4000000,
 | 
					                gasLimit: 4000000,
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            await expectMakerAndTakerBalancesForMakerAssetAsync(
 | 
					            await expectMakerAndTakerBalancesForMakerAssetAsync(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,9 +19,10 @@ import {
 | 
				
			|||||||
    MarketOperation,
 | 
					    MarketOperation,
 | 
				
			||||||
    PrunedSignedOrder,
 | 
					    PrunedSignedOrder,
 | 
				
			||||||
} from '../src/types';
 | 
					} from '../src/types';
 | 
				
			||||||
 | 
					import { ProtocolFeeUtils } from '../src/utils/protocol_fee_utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { chaiSetup } from './utils/chai_setup';
 | 
					import { chaiSetup } from './utils/chai_setup';
 | 
				
			||||||
import { getFullyFillableSwapQuoteWithNoFees } from './utils/swap_quote';
 | 
					import { getFullyFillableSwapQuoteWithNoFeesAsync } from './utils/swap_quote';
 | 
				
			||||||
import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
					import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chaiSetup.configure();
 | 
					chaiSetup.configure();
 | 
				
			||||||
@@ -33,7 +34,7 @@ const ONE_ETH_IN_WEI = new BigNumber(1000000000000000000);
 | 
				
			|||||||
const TESTRPC_CHAIN_ID = devConstants.TESTRPC_CHAIN_ID;
 | 
					const TESTRPC_CHAIN_ID = devConstants.TESTRPC_CHAIN_ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const UNLIMITED_ALLOWANCE_IN_BASE_UNITS = new BigNumber(2).pow(256).minus(1); // tslint:disable-line:custom-no-magic-numbers
 | 
					const UNLIMITED_ALLOWANCE_IN_BASE_UNITS = new BigNumber(2).pow(256).minus(1); // tslint:disable-line:custom-no-magic-numbers
 | 
				
			||||||
 | 
					const FEE_PERCENTAGE = 0.05;
 | 
				
			||||||
const PARTIAL_PRUNED_SIGNED_ORDERS_FEELESS: Array<Partial<PrunedSignedOrder>> = [
 | 
					const PARTIAL_PRUNED_SIGNED_ORDERS_FEELESS: Array<Partial<PrunedSignedOrder>> = [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        takerAssetAmount: new BigNumber(2).multipliedBy(ONE_ETH_IN_WEI),
 | 
					        takerAssetAmount: new BigNumber(2).multipliedBy(ONE_ETH_IN_WEI),
 | 
				
			||||||
@@ -67,7 +68,9 @@ const expectMakerAndTakerBalancesAsyncFactory = (
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('ForwarderSwapQuoteConsumer', () => {
 | 
					describe('ForwarderSwapQuoteConsumer', () => {
 | 
				
			||||||
    const FEE_PERCENTAGE = 0.05;
 | 
					    let contractWrappers: ContractWrappers;
 | 
				
			||||||
 | 
					    let protocolFeeUtils: ProtocolFeeUtils;
 | 
				
			||||||
 | 
					    let erc20Token: ERC20TokenContract;
 | 
				
			||||||
    let userAddresses: string[];
 | 
					    let userAddresses: string[];
 | 
				
			||||||
    let coinbaseAddress: string;
 | 
					    let coinbaseAddress: string;
 | 
				
			||||||
    let makerAddress: string;
 | 
					    let makerAddress: string;
 | 
				
			||||||
@@ -133,6 +136,7 @@ describe('ForwarderSwapQuoteConsumer', () => {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
        const privateKey = devConstants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
 | 
					        const privateKey = devConstants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
 | 
				
			||||||
        orderFactory = new OrderFactory(privateKey, defaultOrderParams);
 | 
					        orderFactory = new OrderFactory(privateKey, defaultOrderParams);
 | 
				
			||||||
 | 
					        protocolFeeUtils = new ProtocolFeeUtils(contractWrappers.exchange);
 | 
				
			||||||
        expectMakerAndTakerBalancesAsync = expectMakerAndTakerBalancesAsyncFactory(
 | 
					        expectMakerAndTakerBalancesAsync = expectMakerAndTakerBalancesAsyncFactory(
 | 
				
			||||||
            erc20TokenContract,
 | 
					            erc20TokenContract,
 | 
				
			||||||
            makerAddress,
 | 
					            makerAddress,
 | 
				
			||||||
@@ -179,28 +183,31 @@ describe('ForwarderSwapQuoteConsumer', () => {
 | 
				
			|||||||
            invalidOrders.push(prunedOrder as PrunedSignedOrder);
 | 
					            invalidOrders.push(prunedOrder as PrunedSignedOrder);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        marketSellSwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					        marketSellSwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
            makerAssetData,
 | 
					            makerAssetData,
 | 
				
			||||||
            wethAssetData,
 | 
					            wethAssetData,
 | 
				
			||||||
            orders,
 | 
					            orders,
 | 
				
			||||||
            MarketOperation.Sell,
 | 
					            MarketOperation.Sell,
 | 
				
			||||||
            GAS_PRICE,
 | 
					            GAS_PRICE,
 | 
				
			||||||
 | 
					            protocolFeeUtils,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        marketBuySwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					        marketBuySwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
            makerAssetData,
 | 
					            makerAssetData,
 | 
				
			||||||
            wethAssetData,
 | 
					            wethAssetData,
 | 
				
			||||||
            orders,
 | 
					            orders,
 | 
				
			||||||
            MarketOperation.Buy,
 | 
					            MarketOperation.Buy,
 | 
				
			||||||
            GAS_PRICE,
 | 
					            GAS_PRICE,
 | 
				
			||||||
 | 
					            protocolFeeUtils,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        invalidMarketBuySwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					        invalidMarketBuySwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
            makerAssetData,
 | 
					            makerAssetData,
 | 
				
			||||||
            takerAssetData,
 | 
					            takerAssetData,
 | 
				
			||||||
            invalidOrders,
 | 
					            invalidOrders,
 | 
				
			||||||
            MarketOperation.Buy,
 | 
					            MarketOperation.Buy,
 | 
				
			||||||
            GAS_PRICE,
 | 
					            GAS_PRICE,
 | 
				
			||||||
 | 
					            protocolFeeUtils,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        swapQuoteConsumer = new ForwarderSwapQuoteConsumer(provider, contractAddresses, {
 | 
					        swapQuoteConsumer = new ForwarderSwapQuoteConsumer(provider, contractAddresses, {
 | 
				
			||||||
@@ -234,7 +241,6 @@ describe('ForwarderSwapQuoteConsumer', () => {
 | 
				
			|||||||
                );
 | 
					                );
 | 
				
			||||||
                await swapQuoteConsumer.executeSwapQuoteOrThrowAsync(marketBuySwapQuote, {
 | 
					                await swapQuoteConsumer.executeSwapQuoteOrThrowAsync(marketBuySwapQuote, {
 | 
				
			||||||
                    takerAddress,
 | 
					                    takerAddress,
 | 
				
			||||||
                    gasPrice: GAS_PRICE,
 | 
					 | 
				
			||||||
                    gasLimit: 4000000,
 | 
					                    gasLimit: 4000000,
 | 
				
			||||||
                    ethAmount: new BigNumber(10).multipliedBy(ONE_ETH_IN_WEI),
 | 
					                    ethAmount: new BigNumber(10).multipliedBy(ONE_ETH_IN_WEI),
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,21 +1,28 @@
 | 
				
			|||||||
 | 
					import { ContractAddresses, ContractWrappers } from '@0x/contract-wrappers';
 | 
				
			||||||
import { constants as devConstants } from '@0x/contracts-test-utils';
 | 
					import { constants as devConstants } from '@0x/contracts-test-utils';
 | 
				
			||||||
 | 
					import { BlockchainLifecycle } from '@0x/dev-utils';
 | 
				
			||||||
import { BigNumber } from '@0x/utils';
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
import * as chai from 'chai';
 | 
					import * as chai from 'chai';
 | 
				
			||||||
import * as _ from 'lodash';
 | 
					import * as _ from 'lodash';
 | 
				
			||||||
import 'mocha';
 | 
					import 'mocha';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { ProtocolFeeUtils } from '../src/utils/protocol_fee_utils';
 | 
				
			||||||
import { swapQuoteCalculator } from '../src/utils/swap_quote_calculator';
 | 
					import { swapQuoteCalculator } from '../src/utils/swap_quote_calculator';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { chaiSetup } from './utils/chai_setup';
 | 
					import { chaiSetup } from './utils/chai_setup';
 | 
				
			||||||
 | 
					import { migrateOnceAsync } from './utils/migrate';
 | 
				
			||||||
import { testHelpers } from './utils/test_helpers';
 | 
					import { testHelpers } from './utils/test_helpers';
 | 
				
			||||||
import { testOrders } from './utils/test_orders';
 | 
					import { testOrders } from './utils/test_orders';
 | 
				
			||||||
import { baseUnitAmount } from './utils/utils';
 | 
					import { baseUnitAmount } from './utils/utils';
 | 
				
			||||||
 | 
					import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chaiSetup.configure();
 | 
					chaiSetup.configure();
 | 
				
			||||||
const expect = chai.expect;
 | 
					const expect = chai.expect;
 | 
				
			||||||
 | 
					const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const GAS_PRICE = new BigNumber(devConstants.DEFAULT_GAS_PRICE);
 | 
					const GAS_PRICE = new BigNumber(devConstants.DEFAULT_GAS_PRICE);
 | 
				
			||||||
const ONE_ETH_IN_WEI = new BigNumber(1000000000000000000);
 | 
					const ONE_ETH_IN_WEI = new BigNumber(1000000000000000000);
 | 
				
			||||||
 | 
					const TESTRPC_CHAIN_ID = 1337;
 | 
				
			||||||
const MIXED_TEST_ORDERS = _.concat(
 | 
					const MIXED_TEST_ORDERS = _.concat(
 | 
				
			||||||
    testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					    testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
    testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					    testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
@@ -25,105 +32,130 @@ const MIXED_TEST_ORDERS = _.concat(
 | 
				
			|||||||
// tslint:disable:max-file-line-count
 | 
					// tslint:disable:max-file-line-count
 | 
				
			||||||
// tslint:disable:custom-no-magic-numbers
 | 
					// tslint:disable:custom-no-magic-numbers
 | 
				
			||||||
describe('swapQuoteCalculator', () => {
 | 
					describe('swapQuoteCalculator', () => {
 | 
				
			||||||
 | 
					    let contractWrappers: ContractWrappers;
 | 
				
			||||||
 | 
					    let protocolFeeUtils: ProtocolFeeUtils;
 | 
				
			||||||
 | 
					    let contractAddresses: ContractAddresses;
 | 
				
			||||||
 | 
					    const chainId = TESTRPC_CHAIN_ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    before(async () => {
 | 
				
			||||||
 | 
					        const config = {
 | 
				
			||||||
 | 
					            chainId,
 | 
				
			||||||
 | 
					            contractAddresses,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        contractAddresses = await migrateOnceAsync();
 | 
				
			||||||
 | 
					        await blockchainLifecycle.startAsync();
 | 
				
			||||||
 | 
					        contractWrappers = new ContractWrappers(provider, config);
 | 
				
			||||||
 | 
					        protocolFeeUtils = new ProtocolFeeUtils(contractWrappers.exchange);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('#calculateMarketSellSwapQuote', () => {
 | 
					    describe('#calculateMarketSellSwapQuote', () => {
 | 
				
			||||||
        describe('InsufficientLiquidityError', () => {
 | 
					        describe('InsufficientLiquidityError', () => {
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple feeless orders)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple feeless orders)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                        baseUnitAmount(10),
 | 
					                        baseUnitAmount(10),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(9));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(9));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple feeless orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple feeless orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                        baseUnitAmount(10),
 | 
					                        baseUnitAmount(10),
 | 
				
			||||||
                        0.2,
 | 
					                        0.2,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(7.5));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(7.5));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with no slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with no slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(20),
 | 
					                        baseUnitAmount(20),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(15));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(15));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(20),
 | 
					                        baseUnitAmount(20),
 | 
				
			||||||
                        0.2,
 | 
					                        0.2,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(12.5));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(12.5));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with no slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with no slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(10),
 | 
					                        baseUnitAmount(10),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(9));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(9));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(10),
 | 
					                        baseUnitAmount(10),
 | 
				
			||||||
                        0.2,
 | 
					                        0.2,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(7.5));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(7.5));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple mixed feeType orders with no slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple mixed feeType orders with no slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        MIXED_TEST_ORDERS,
 | 
					                        MIXED_TEST_ORDERS,
 | 
				
			||||||
                        baseUnitAmount(40),
 | 
					                        baseUnitAmount(40),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(33));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(33));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple mixed feeTyoe orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple mixed feeTyoe orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                        MIXED_TEST_ORDERS,
 | 
					                        MIXED_TEST_ORDERS,
 | 
				
			||||||
                        baseUnitAmount(40),
 | 
					                        baseUnitAmount(40),
 | 
				
			||||||
                        0.2,
 | 
					                        0.2,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(27.5));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(27.5));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with no slippage (feeless orders)', () => {
 | 
					        it('calculates a correct swapQuote with no slippage (feeless orders)', async () => {
 | 
				
			||||||
            const assetSellAmount = baseUnitAmount(0.5);
 | 
					            const assetSellAmount = baseUnitAmount(0.5);
 | 
				
			||||||
            const slippagePercentage = 0;
 | 
					            const slippagePercentage = 0;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                assetSellAmount,
 | 
					                assetSellAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEELESS[0]]);
 | 
					            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEELESS[0]]);
 | 
				
			||||||
@@ -144,14 +176,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with slippage (feeless orders)', () => {
 | 
					        it('calculates a correct swapQuote with slippage (feeless orders)', async () => {
 | 
				
			||||||
            const assetSellAmount = baseUnitAmount(1);
 | 
					            const assetSellAmount = baseUnitAmount(1);
 | 
				
			||||||
            const slippagePercentage = 0.2;
 | 
					            const slippagePercentage = 0.2;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                assetSellAmount,
 | 
					                assetSellAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([
 | 
					            expect(swapQuote.orders).to.deep.equal([
 | 
				
			||||||
@@ -175,14 +208,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with no slippage (takerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with no slippage (takerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetSellAmount = baseUnitAmount(4);
 | 
					            const assetSellAmount = baseUnitAmount(4);
 | 
				
			||||||
            const slippagePercentage = 0;
 | 
					            const slippagePercentage = 0;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                assetSellAmount,
 | 
					                assetSellAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET[0]]);
 | 
					            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET[0]]);
 | 
				
			||||||
@@ -203,14 +237,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with slippage (takerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with slippage (takerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetSellAmount = baseUnitAmount(3);
 | 
					            const assetSellAmount = baseUnitAmount(3);
 | 
				
			||||||
            const slippagePercentage = 0.5;
 | 
					            const slippagePercentage = 0.5;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                assetSellAmount,
 | 
					                assetSellAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([
 | 
					            expect(swapQuote.orders).to.deep.equal([
 | 
				
			||||||
@@ -234,14 +269,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with no slippage (makerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with no slippage (makerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetSellAmount = baseUnitAmount(4);
 | 
					            const assetSellAmount = baseUnitAmount(4);
 | 
				
			||||||
            const slippagePercentage = 0;
 | 
					            const slippagePercentage = 0;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                assetSellAmount,
 | 
					                assetSellAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET[0]]);
 | 
					            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET[0]]);
 | 
				
			||||||
@@ -262,14 +298,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with slippage (makerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with slippage (makerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetSellAmount = baseUnitAmount(4);
 | 
					            const assetSellAmount = baseUnitAmount(4);
 | 
				
			||||||
            const slippagePercentage = 0.5;
 | 
					            const slippagePercentage = 0.5;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketSellSwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketSellSwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                assetSellAmount,
 | 
					                assetSellAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([
 | 
					            expect(swapQuote.orders).to.deep.equal([
 | 
				
			||||||
@@ -295,105 +332,114 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    describe('#calculateMarketBuySwapQuote', () => {
 | 
					    describe('#calculateMarketBuySwapQuoteAsync', () => {
 | 
				
			||||||
        describe('InsufficientLiquidityError', () => {
 | 
					        describe('InsufficientLiquidityError', () => {
 | 
				
			||||||
            it('should throw if not enough maker asset liquidity (multiple feeless orders)', () => {
 | 
					            it('should throw if not enough maker asset liquidity (multiple feeless orders)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                        baseUnitAmount(12),
 | 
					                        baseUnitAmount(12),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(10));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(10));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple feeless orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple feeless orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                        baseUnitAmount(10),
 | 
					                        baseUnitAmount(10),
 | 
				
			||||||
                        0.6,
 | 
					                        0.6,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(6.25));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(6.25));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with no slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with no slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(12),
 | 
					                        baseUnitAmount(12),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(10));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(10));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple takerAsset denominated fee orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(12),
 | 
					                        baseUnitAmount(12),
 | 
				
			||||||
                        0.6,
 | 
					                        0.6,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(6.25));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(6.25));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with no slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with no slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(6),
 | 
					                        baseUnitAmount(6),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(5));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(5));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple makerAsset denominated fee orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                        testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                        baseUnitAmount(6),
 | 
					                        baseUnitAmount(6),
 | 
				
			||||||
                        0.6,
 | 
					                        0.6,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(3.125));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(3.125));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple mixed feeType orders with no slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple mixed feeType orders with no slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        MIXED_TEST_ORDERS,
 | 
					                        MIXED_TEST_ORDERS,
 | 
				
			||||||
                        baseUnitAmount(40),
 | 
					                        baseUnitAmount(40),
 | 
				
			||||||
                        0,
 | 
					                        0,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(25));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(25));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            it('should throw if not enough taker asset liquidity (multiple mixed feeTyoe orders with 20% slippage)', () => {
 | 
					            it('should throw if not enough taker asset liquidity (multiple mixed feeTyoe orders with 20% slippage)', () => {
 | 
				
			||||||
                const errorFunction = () => {
 | 
					                const errorFunction = async () => {
 | 
				
			||||||
                    swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					                    await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                        MIXED_TEST_ORDERS,
 | 
					                        MIXED_TEST_ORDERS,
 | 
				
			||||||
                        baseUnitAmount(40),
 | 
					                        baseUnitAmount(40),
 | 
				
			||||||
                        0.6,
 | 
					                        0.6,
 | 
				
			||||||
                        GAS_PRICE,
 | 
					                        GAS_PRICE,
 | 
				
			||||||
 | 
					                        protocolFeeUtils,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(15.625));
 | 
					                testHelpers.expectInsufficientLiquidityError(expect, errorFunction, baseUnitAmount(15.625));
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with no slippage (feeless orders)', () => {
 | 
					        it('calculates a correct swapQuote with no slippage (feeless orders)', async () => {
 | 
				
			||||||
            const assetBuyAmount = baseUnitAmount(3);
 | 
					            const assetBuyAmount = baseUnitAmount(3);
 | 
				
			||||||
            const slippagePercentage = 0;
 | 
					            const slippagePercentage = 0;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                assetBuyAmount,
 | 
					                assetBuyAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEELESS[0]]);
 | 
					            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEELESS[0]]);
 | 
				
			||||||
@@ -414,14 +460,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with slippage (feeless orders)', () => {
 | 
					        it('calculates a correct swapQuote with slippage (feeless orders)', async () => {
 | 
				
			||||||
            const assetBuyAmount = baseUnitAmount(5);
 | 
					            const assetBuyAmount = baseUnitAmount(5);
 | 
				
			||||||
            const slippagePercentage = 0.5;
 | 
					            const slippagePercentage = 0.5;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEELESS,
 | 
				
			||||||
                assetBuyAmount,
 | 
					                assetBuyAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([
 | 
					            expect(swapQuote.orders).to.deep.equal([
 | 
				
			||||||
@@ -450,14 +497,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with no slippage (takerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with no slippage (takerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetBuyAmount = baseUnitAmount(3);
 | 
					            const assetBuyAmount = baseUnitAmount(3);
 | 
				
			||||||
            const slippagePercentage = 0;
 | 
					            const slippagePercentage = 0;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                assetBuyAmount,
 | 
					                assetBuyAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET[0]]);
 | 
					            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET[0]]);
 | 
				
			||||||
@@ -478,14 +526,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with slippage (takerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with slippage (takerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetBuyAmount = baseUnitAmount(5);
 | 
					            const assetBuyAmount = baseUnitAmount(5);
 | 
				
			||||||
            const slippagePercentage = 0.5;
 | 
					            const slippagePercentage = 0.5;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_TAKER_ASSET,
 | 
				
			||||||
                assetBuyAmount,
 | 
					                assetBuyAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            const fiveSixthEthInWei = new BigNumber(5)
 | 
					            const fiveSixthEthInWei = new BigNumber(5)
 | 
				
			||||||
                .div(new BigNumber(6))
 | 
					                .div(new BigNumber(6))
 | 
				
			||||||
@@ -513,14 +562,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(30, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with no slippage (makerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with no slippage (makerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetBuyAmount = baseUnitAmount(1);
 | 
					            const assetBuyAmount = baseUnitAmount(1);
 | 
				
			||||||
            const slippagePercentage = 0;
 | 
					            const slippagePercentage = 0;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                assetBuyAmount,
 | 
					                assetBuyAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            // test if orders are correct
 | 
					            // test if orders are correct
 | 
				
			||||||
            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET[0]]);
 | 
					            expect(swapQuote.orders).to.deep.equal([testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET[0]]);
 | 
				
			||||||
@@ -541,14 +591,15 @@ describe('swapQuoteCalculator', () => {
 | 
				
			|||||||
                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
					                protocolFeeInEthAmount: baseUnitAmount(15, 4),
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        it('calculates a correct swapQuote with slippage (makerAsset denominated fee orders)', () => {
 | 
					        it('calculates a correct swapQuote with slippage (makerAsset denominated fee orders)', async () => {
 | 
				
			||||||
            const assetBuyAmount = baseUnitAmount(2.5);
 | 
					            const assetBuyAmount = baseUnitAmount(2.5);
 | 
				
			||||||
            const slippagePercentage = 0.5;
 | 
					            const slippagePercentage = 0.5;
 | 
				
			||||||
            const swapQuote = swapQuoteCalculator.calculateMarketBuySwapQuote(
 | 
					            const swapQuote = await swapQuoteCalculator.calculateMarketBuySwapQuoteAsync(
 | 
				
			||||||
                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
					                testOrders.PRUNED_SIGNED_ORDERS_FEE_IN_MAKER_ASSET,
 | 
				
			||||||
                assetBuyAmount,
 | 
					                assetBuyAmount,
 | 
				
			||||||
                slippagePercentage,
 | 
					                slippagePercentage,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            const totalTakerAssetAmount = new BigNumber(5)
 | 
					            const totalTakerAssetAmount = new BigNumber(5)
 | 
				
			||||||
                .div(new BigNumber(6))
 | 
					                .div(new BigNumber(6))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,9 +11,11 @@ import 'mocha';
 | 
				
			|||||||
import { SwapQuote, SwapQuoteConsumer } from '../src';
 | 
					import { SwapQuote, SwapQuoteConsumer } from '../src';
 | 
				
			||||||
import { constants } from '../src/constants';
 | 
					import { constants } from '../src/constants';
 | 
				
			||||||
import { ExtensionContractType, MarketOperation, PrunedSignedOrder } from '../src/types';
 | 
					import { ExtensionContractType, MarketOperation, PrunedSignedOrder } from '../src/types';
 | 
				
			||||||
 | 
					import { ProtocolFeeUtils } from '../src/utils/protocol_fee_utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { chaiSetup } from './utils/chai_setup';
 | 
					import { chaiSetup } from './utils/chai_setup';
 | 
				
			||||||
import { getFullyFillableSwapQuoteWithNoFees } from './utils/swap_quote';
 | 
					import { getFullyFillableSwapQuoteWithNoFeesAsync } from './utils/swap_quote';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
					import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chaiSetup.configure();
 | 
					chaiSetup.configure();
 | 
				
			||||||
@@ -68,6 +70,8 @@ const PARTIAL_LARGE_PRUNED_SIGNED_ORDERS: Array<Partial<PrunedSignedOrder>> = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
describe('swapQuoteConsumerUtils', () => {
 | 
					describe('swapQuoteConsumerUtils', () => {
 | 
				
			||||||
    let wethContract: WETH9Contract;
 | 
					    let wethContract: WETH9Contract;
 | 
				
			||||||
 | 
					    let contractWrappers: ContractWrappers;
 | 
				
			||||||
 | 
					    let protocolFeeUtils: ProtocolFeeUtils;
 | 
				
			||||||
    let userAddresses: string[];
 | 
					    let userAddresses: string[];
 | 
				
			||||||
    let makerAddress: string;
 | 
					    let makerAddress: string;
 | 
				
			||||||
    let takerAddress: string;
 | 
					    let takerAddress: string;
 | 
				
			||||||
@@ -118,6 +122,7 @@ describe('swapQuoteConsumerUtils', () => {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
        const privateKey = devConstants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
 | 
					        const privateKey = devConstants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
 | 
				
			||||||
        orderFactory = new OrderFactory(privateKey, defaultOrderParams);
 | 
					        orderFactory = new OrderFactory(privateKey, defaultOrderParams);
 | 
				
			||||||
 | 
					        protocolFeeUtils = new ProtocolFeeUtils(contractWrappers.exchange);
 | 
				
			||||||
        forwarderOrderFactory = new OrderFactory(privateKey, defaultForwarderOrderParams);
 | 
					        forwarderOrderFactory = new OrderFactory(privateKey, defaultForwarderOrderParams);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        swapQuoteConsumer = new SwapQuoteConsumer(provider, {
 | 
					        swapQuoteConsumer = new SwapQuoteConsumer(provider, {
 | 
				
			||||||
@@ -173,28 +178,31 @@ describe('swapQuoteConsumerUtils', () => {
 | 
				
			|||||||
                largeForwarderOrders.push(prunedOrder as PrunedSignedOrder);
 | 
					                largeForwarderOrders.push(prunedOrder as PrunedSignedOrder);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            forwarderSwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					            forwarderSwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
                makerAssetData,
 | 
					                makerAssetData,
 | 
				
			||||||
                wethAssetData,
 | 
					                wethAssetData,
 | 
				
			||||||
                forwarderOrders,
 | 
					                forwarderOrders,
 | 
				
			||||||
                MarketOperation.Sell,
 | 
					                MarketOperation.Sell,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            largeForwarderSwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					            largeForwarderSwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
                makerAssetData,
 | 
					                makerAssetData,
 | 
				
			||||||
                wethAssetData,
 | 
					                wethAssetData,
 | 
				
			||||||
                largeForwarderOrders,
 | 
					                largeForwarderOrders,
 | 
				
			||||||
                MarketOperation.Sell,
 | 
					                MarketOperation.Sell,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            exchangeSwapQuote = getFullyFillableSwapQuoteWithNoFees(
 | 
					            exchangeSwapQuote = await getFullyFillableSwapQuoteWithNoFeesAsync(
 | 
				
			||||||
                makerAssetData,
 | 
					                makerAssetData,
 | 
				
			||||||
                takerAssetData,
 | 
					                takerAssetData,
 | 
				
			||||||
                exchangeOrders,
 | 
					                exchangeOrders,
 | 
				
			||||||
                MarketOperation.Sell,
 | 
					                MarketOperation.Sell,
 | 
				
			||||||
                GAS_PRICE,
 | 
					                GAS_PRICE,
 | 
				
			||||||
 | 
					                protocolFeeUtils,
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,17 @@
 | 
				
			|||||||
 | 
					import { constants as devConstants } from '@0x/contracts-test-utils';
 | 
				
			||||||
import { AcceptedRejectedOrders, Orderbook } from '@0x/orderbook';
 | 
					import { AcceptedRejectedOrders, Orderbook } from '@0x/orderbook';
 | 
				
			||||||
import { Web3ProviderEngine } from '@0x/subproviders';
 | 
					import { Web3ProviderEngine } from '@0x/subproviders';
 | 
				
			||||||
import { APIOrder, AssetPairsItem, SignedOrder } from '@0x/types';
 | 
					import { APIOrder, AssetPairsItem, SignedOrder } from '@0x/types';
 | 
				
			||||||
 | 
					import { BigNumber } from '@0x/utils';
 | 
				
			||||||
import * as TypeMoq from 'typemoq';
 | 
					import * as TypeMoq from 'typemoq';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { SwapQuoter } from '../../src/swap_quoter';
 | 
					import { SwapQuoter } from '../../src/swap_quoter';
 | 
				
			||||||
import { PrunedSignedOrder } from '../../src/types';
 | 
					import { PrunedSignedOrder } from '../../src/types';
 | 
				
			||||||
 | 
					import { ProtocolFeeUtils } from '../../src/utils/protocol_fee_utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const PROTOCOL_FEE_MULTIPLIER = 150000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// tslint:disable: max-classes-per-file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class OrderbookClass extends Orderbook {
 | 
					class OrderbookClass extends Orderbook {
 | 
				
			||||||
    // tslint:disable-next-line:prefer-function-over-method
 | 
					    // tslint:disable-next-line:prefer-function-over-method
 | 
				
			||||||
@@ -49,6 +56,21 @@ const partiallyMockedSwapQuoter = (provider: Web3ProviderEngine, orderbook: Orde
 | 
				
			|||||||
    return mockedSwapQuoter;
 | 
					    return mockedSwapQuoter;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ProtocolFeeUtilsClass extends ProtocolFeeUtils {
 | 
				
			||||||
 | 
					    // tslint:disable-next-line:prefer-function-over-method
 | 
				
			||||||
 | 
					    public async getProtocolFeeMultiplierAsync(): Promise<BigNumber> {
 | 
				
			||||||
 | 
					        return Promise.resolve(new BigNumber(PROTOCOL_FEE_MULTIPLIER));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // tslint:disable-next-line:prefer-function-over-method
 | 
				
			||||||
 | 
					    public async getGasPriceEstimationOrThrowAsync(): Promise<BigNumber> {
 | 
				
			||||||
 | 
					        return Promise.resolve(new BigNumber(devConstants.DEFAULT_GAS_PRICE));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const protocolFeeUtilsMock = (): TypeMoq.IMock<ProtocolFeeUtils> => {
 | 
				
			||||||
 | 
					    return TypeMoq.Mock.ofType(ProtocolFeeUtilsClass, TypeMoq.MockBehavior.Strict);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mockGetPrunedSignedOrdersAsync = (
 | 
					const mockGetPrunedSignedOrdersAsync = (
 | 
				
			||||||
    mockedSwapQuoter: TypeMoq.IMock<SwapQuoter>,
 | 
					    mockedSwapQuoter: TypeMoq.IMock<SwapQuoter>,
 | 
				
			||||||
    makerAssetData: string,
 | 
					    makerAssetData: string,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,15 +4,16 @@ import * as _ from 'lodash';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { constants } from '../../src/constants';
 | 
					import { constants } from '../../src/constants';
 | 
				
			||||||
import { MarketOperation, PrunedSignedOrder, SwapQuote } from '../../src/types';
 | 
					import { MarketOperation, PrunedSignedOrder, SwapQuote } from '../../src/types';
 | 
				
			||||||
import { protocolFeeUtils } from '../../src/utils/protocol_fee_utils';
 | 
					import { ProtocolFeeUtils } from '../../src/utils/protocol_fee_utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getFullyFillableSwapQuoteWithNoFees = (
 | 
					export const getFullyFillableSwapQuoteWithNoFeesAsync = async (
 | 
				
			||||||
    makerAssetData: string,
 | 
					    makerAssetData: string,
 | 
				
			||||||
    takerAssetData: string,
 | 
					    takerAssetData: string,
 | 
				
			||||||
    orders: PrunedSignedOrder[],
 | 
					    orders: PrunedSignedOrder[],
 | 
				
			||||||
    operation: MarketOperation,
 | 
					    operation: MarketOperation,
 | 
				
			||||||
    gasPrice: BigNumber,
 | 
					    gasPrice: BigNumber,
 | 
				
			||||||
): SwapQuote => {
 | 
					    protocolFeeUtils: ProtocolFeeUtils,
 | 
				
			||||||
 | 
					): Promise<SwapQuote> => {
 | 
				
			||||||
    const makerAssetFillAmount = _.reduce(
 | 
					    const makerAssetFillAmount = _.reduce(
 | 
				
			||||||
        orders,
 | 
					        orders,
 | 
				
			||||||
        (a: BigNumber, c: SignedOrder) => a.plus(c.makerAssetAmount),
 | 
					        (a: BigNumber, c: SignedOrder) => a.plus(c.makerAssetAmount),
 | 
				
			||||||
@@ -28,13 +29,14 @@ export const getFullyFillableSwapQuoteWithNoFees = (
 | 
				
			|||||||
        feeTakerAssetAmount: constants.ZERO_AMOUNT,
 | 
					        feeTakerAssetAmount: constants.ZERO_AMOUNT,
 | 
				
			||||||
        takerAssetAmount: totalTakerAssetAmount,
 | 
					        takerAssetAmount: totalTakerAssetAmount,
 | 
				
			||||||
        totalTakerAssetAmount,
 | 
					        totalTakerAssetAmount,
 | 
				
			||||||
        protocolFeeInEthAmount: protocolFeeUtils.calculateWorstCaseProtocolFee(orders, gasPrice),
 | 
					        protocolFeeInEthAmount: await protocolFeeUtils.calculateWorstCaseProtocolFeeAsync(orders, gasPrice),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const quoteBase = {
 | 
					    const quoteBase = {
 | 
				
			||||||
        makerAssetData,
 | 
					        makerAssetData,
 | 
				
			||||||
        takerAssetData,
 | 
					        takerAssetData,
 | 
				
			||||||
        orders,
 | 
					        orders,
 | 
				
			||||||
 | 
					        gasPrice,
 | 
				
			||||||
        bestCaseQuoteInfo: quoteInfo,
 | 
					        bestCaseQuoteInfo: quoteInfo,
 | 
				
			||||||
        worstCaseQuoteInfo: quoteInfo,
 | 
					        worstCaseQuoteInfo: quoteInfo,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user