check order statuses

This commit is contained in:
Michael Zhu 2019-08-19 14:25:16 -07:00
parent 090b83a237
commit 17a9edd8c3
2 changed files with 36 additions and 3 deletions

View File

@ -145,6 +145,7 @@ describe(ContractName.Forwarder, () => {
erc20Wrapper.addTokenOwnerAddress(forwarderContract.address); erc20Wrapper.addTokenOwnerAddress(forwarderContract.address);
forwarderTestFactory = new ForwarderTestFactory( forwarderTestFactory = new ForwarderTestFactory(
exchangeWrapper,
forwarderWrapper, forwarderWrapper,
erc20Wrapper, erc20Wrapper,
forwarderContract.address, forwarderContract.address,
@ -296,7 +297,7 @@ describe(ContractName.Forwarder, () => {
expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent)); expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
}); });
it('should not fill orders with different makerAssetData than the first order', async () => { it('should fail to fill orders with mismatched makerAssetData', async () => {
const firstOrderMakerAssetData = assetDataUtils.encodeERC20AssetData(erc20Token.address); const firstOrderMakerAssetData = assetDataUtils.encodeERC20AssetData(erc20Token.address);
const firstOrder = await orderFactory.newSignedOrderAsync({ const firstOrder = await orderFactory.newSignedOrderAsync({
makerAssetData: firstOrderMakerAssetData, makerAssetData: firstOrderMakerAssetData,

View File

@ -1,8 +1,9 @@
import { ERC20Wrapper } from '@0x/contracts-asset-proxy'; import { ERC20Wrapper } from '@0x/contracts-asset-proxy';
import { DummyERC20TokenContract } from '@0x/contracts-erc20'; import { DummyERC20TokenContract } from '@0x/contracts-erc20';
import { DummyERC721TokenContract } from '@0x/contracts-erc721'; import { DummyERC721TokenContract } from '@0x/contracts-erc721';
import { chaiSetup, constants, ERC20BalancesByOwner, web3Wrapper } from '@0x/contracts-test-utils'; import { ExchangeWrapper } from '@0x/contracts-exchange';
import { SignedOrder } from '@0x/types'; import { chaiSetup, constants, ERC20BalancesByOwner, OrderStatus, web3Wrapper } from '@0x/contracts-test-utils';
import { OrderInfo, SignedOrder } from '@0x/types';
import { BigNumber, RevertError } from '@0x/utils'; import { BigNumber, RevertError } from '@0x/utils';
import * as chai from 'chai'; import * as chai from 'chai';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -88,6 +89,7 @@ function expectBalanceWithin(balance: BigNumber, low: BigNumber, high: BigNumber
} }
export class ForwarderTestFactory { export class ForwarderTestFactory {
private readonly _exchangeWrapper: ExchangeWrapper;
private readonly _forwarderWrapper: ForwarderWrapper; private readonly _forwarderWrapper: ForwarderWrapper;
private readonly _erc20Wrapper: ERC20Wrapper; private readonly _erc20Wrapper: ERC20Wrapper;
private readonly _forwarderAddress: string; private readonly _forwarderAddress: string;
@ -105,6 +107,7 @@ export class ForwarderTestFactory {
} }
constructor( constructor(
exchangeWrapper: ExchangeWrapper,
forwarderWrapper: ForwarderWrapper, forwarderWrapper: ForwarderWrapper,
erc20Wrapper: ERC20Wrapper, erc20Wrapper: ERC20Wrapper,
forwarderAddress: string, forwarderAddress: string,
@ -115,6 +118,7 @@ export class ForwarderTestFactory {
wethAddress: string, wethAddress: string,
gasPrice: BigNumber, gasPrice: BigNumber,
) { ) {
this._exchangeWrapper = exchangeWrapper;
this._forwarderWrapper = forwarderWrapper; this._forwarderWrapper = forwarderWrapper;
this._erc20Wrapper = erc20Wrapper; this._erc20Wrapper = erc20Wrapper;
this._forwarderAddress = forwarderAddress; this._forwarderAddress = forwarderAddress;
@ -162,6 +166,9 @@ export class ForwarderTestFactory {
.plus(ethSpentOnForwarderFee) .plus(ethSpentOnForwarderFee)
.plus(ethValueAdjustment); .plus(ethValueAdjustment);
const ordersInfoBefore = await this._exchangeWrapper.getOrdersInfoAsync(orders);
const orderStatusesBefore = ordersInfoBefore.map(orderInfo => orderInfo.orderStatus);
const tx = this._forwarderWrapper.marketBuyOrdersWithEthAsync( const tx = this._forwarderWrapper.marketBuyOrdersWithEthAsync(
orders, orders,
expectedResults.makerAssetFillAmount.minus(expectedResults.percentageFees), expectedResults.makerAssetFillAmount.minus(expectedResults.percentageFees),
@ -176,7 +183,13 @@ export class ForwarderTestFactory {
await expect(tx).to.revertWith(options.revertError); await expect(tx).to.revertWith(options.revertError);
} else { } else {
const gasUsed = (await tx).gasUsed; const gasUsed = (await tx).gasUsed;
const ordersInfoAfter = await this._exchangeWrapper.getOrdersInfoAsync(orders);
const orderStatusesAfter = ordersInfoAfter.map(orderInfo => orderInfo.orderStatus);
await this._checkResultsAsync( await this._checkResultsAsync(
fractionalNumberOfOrdersToFill,
orderStatusesBefore,
orderStatusesAfter,
gasUsed, gasUsed,
expectedResults, expectedResults,
takerEthBalanceBefore, takerEthBalanceBefore,
@ -223,6 +236,9 @@ export class ForwarderTestFactory {
.plus(expectedResults.maxOversoldWeth) .plus(expectedResults.maxOversoldWeth)
.plus(ethSpentOnForwarderFee); .plus(ethSpentOnForwarderFee);
const ordersInfoBefore = await this._exchangeWrapper.getOrdersInfoAsync(orders);
const orderStatusesBefore = ordersInfoBefore.map(orderInfo => orderInfo.orderStatus);
const tx = this._forwarderWrapper.marketSellOrdersWithEthAsync( const tx = this._forwarderWrapper.marketSellOrdersWithEthAsync(
orders, orders,
{ {
@ -236,7 +252,13 @@ export class ForwarderTestFactory {
await expect(tx).to.revertWith(options.revertError); await expect(tx).to.revertWith(options.revertError);
} else { } else {
const gasUsed = (await tx).gasUsed; const gasUsed = (await tx).gasUsed;
const ordersInfoAfter = await this._exchangeWrapper.getOrdersInfoAsync(orders);
const orderStatusesAfter = ordersInfoAfter.map(orderInfo => orderInfo.orderStatus);
await this._checkResultsAsync( await this._checkResultsAsync(
fractionalNumberOfOrdersToFill,
orderStatusesBefore,
orderStatusesAfter,
gasUsed, gasUsed,
expectedResults, expectedResults,
takerEthBalanceBefore, takerEthBalanceBefore,
@ -281,6 +303,9 @@ export class ForwarderTestFactory {
} }
private async _checkResultsAsync( private async _checkResultsAsync(
fractionalNumberOfOrdersToFill: BigNumber,
orderStatusesBefore: OrderStatus[],
orderStatusesAfter: OrderStatus[],
gasUsed: number, gasUsed: number,
expectedResults: ForwarderFillState, expectedResults: ForwarderFillState,
takerEthBalanceBefore: BigNumber, takerEthBalanceBefore: BigNumber,
@ -292,6 +317,13 @@ export class ForwarderTestFactory {
makerAssetId?: BigNumber; makerAssetId?: BigNumber;
} = {}, } = {},
): Promise<void> { ): Promise<void> {
for (const [i, orderStatus] of orderStatusesAfter.entries()) {
const expectedOrderStatus = fractionalNumberOfOrdersToFill.gte(i + 1)
? OrderStatus.FullyFilled
: orderStatusesBefore[i];
expect(orderStatus).to.equal(expectedOrderStatus);
}
const ethSpentOnForwarderFee = ForwarderTestFactory.getPercentageOfValue( const ethSpentOnForwarderFee = ForwarderTestFactory.getPercentageOfValue(
expectedResults.takerAssetFillAmount, expectedResults.takerAssetFillAmount,
options.forwarderFeePercentage || constants.ZERO_AMOUNT, options.forwarderFeePercentage || constants.ZERO_AMOUNT,