@0x:contracts-exchange
Added the tests for getOrdersInfo
back into the exchange
This commit is contained in:
@@ -8,6 +8,7 @@ import {
|
||||
ERC20BalancesByOwner,
|
||||
expect,
|
||||
getLatestBlockTimestampAsync,
|
||||
increaseTimeAndMineBlockAsync,
|
||||
OrderFactory,
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { assetDataUtils, ExchangeRevertErrors, orderHashUtils } from '@0x/order-utils';
|
||||
@@ -1172,5 +1173,189 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('getOrdersInfo', () => {
|
||||
beforeEach(async () => {
|
||||
signedOrders = [
|
||||
await orderFactory.newSignedOrderAsync(),
|
||||
await orderFactory.newSignedOrderAsync(),
|
||||
await orderFactory.newSignedOrderAsync(),
|
||||
];
|
||||
});
|
||||
it('should get the correct information for multiple unfilled orders', async () => {
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = new BigNumber(0);
|
||||
const expectedOrderStatus = OrderStatus.Fillable;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for multiple partially filled orders', async () => {
|
||||
const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
|
||||
await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
|
||||
const expectedOrderStatus = OrderStatus.Fillable;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for multiple fully filled orders', async () => {
|
||||
await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress);
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
|
||||
const expectedOrderStatus = OrderStatus.FullyFilled;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for multiple cancelled and unfilled orders', async () => {
|
||||
await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = new BigNumber(0);
|
||||
const expectedOrderStatus = OrderStatus.Cancelled;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for multiple cancelled and partially filled orders', async () => {
|
||||
const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
|
||||
await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
|
||||
await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
|
||||
const expectedOrderStatus = OrderStatus.Cancelled;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for multiple expired and unfilled orders', async () => {
|
||||
const currentTimestamp = await getLatestBlockTimestampAsync();
|
||||
const timeUntilExpiration = signedOrders[0].expirationTimeSeconds.minus(currentTimestamp).toNumber();
|
||||
await increaseTimeAndMineBlockAsync(timeUntilExpiration);
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = new BigNumber(0);
|
||||
const expectedOrderStatus = OrderStatus.Expired;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for multiple expired and partially filled orders', async () => {
|
||||
const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
|
||||
await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
|
||||
const currentTimestamp = await getLatestBlockTimestampAsync();
|
||||
const timeUntilExpiration = signedOrders[0].expirationTimeSeconds.minus(currentTimestamp).toNumber();
|
||||
await increaseTimeAndMineBlockAsync(timeUntilExpiration);
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(3);
|
||||
_.forEach(signedOrders, (signedOrder, index) => {
|
||||
const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
|
||||
const expectedOrderStatus = OrderStatus.Expired;
|
||||
const orderInfo = ordersInfo[index];
|
||||
expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
|
||||
expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
|
||||
expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
|
||||
});
|
||||
});
|
||||
it('should get the correct information for a mix of unfilled, partially filled, fully filled, cancelled, and expired orders', async () => {
|
||||
const unfilledOrder = await orderFactory.newSignedOrderAsync();
|
||||
const partiallyFilledOrder = await orderFactory.newSignedOrderAsync();
|
||||
await exchangeWrapper.fillOrderAsync(partiallyFilledOrder, takerAddress, {
|
||||
takerAssetFillAmount: partiallyFilledOrder.takerAssetAmount.div(2),
|
||||
});
|
||||
const fullyFilledOrder = await orderFactory.newSignedOrderAsync();
|
||||
await exchangeWrapper.fillOrderAsync(fullyFilledOrder, takerAddress);
|
||||
const cancelledOrder = await orderFactory.newSignedOrderAsync();
|
||||
await exchangeWrapper.cancelOrderAsync(cancelledOrder, makerAddress);
|
||||
const currentTimestamp = await getLatestBlockTimestampAsync();
|
||||
const expiredOrder = await orderFactory.newSignedOrderAsync({
|
||||
expirationTimeSeconds: new BigNumber(currentTimestamp),
|
||||
});
|
||||
signedOrders = [unfilledOrder, partiallyFilledOrder, fullyFilledOrder, cancelledOrder, expiredOrder];
|
||||
const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
|
||||
expect(ordersInfo.length).to.be.equal(5);
|
||||
|
||||
const expectedUnfilledOrderHash = orderHashUtils.getOrderHashHex(unfilledOrder);
|
||||
const expectedUnfilledTakerAssetFilledAmount = new BigNumber(0);
|
||||
const expectedUnfilledOrderStatus = OrderStatus.Fillable;
|
||||
const unfilledOrderInfo = ordersInfo[0];
|
||||
expect(unfilledOrderInfo.orderHash).to.be.equal(expectedUnfilledOrderHash);
|
||||
expect(unfilledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expectedUnfilledTakerAssetFilledAmount,
|
||||
);
|
||||
expect(unfilledOrderInfo.orderStatus).to.be.equal(expectedUnfilledOrderStatus);
|
||||
|
||||
const expectedPartialOrderHash = orderHashUtils.getOrderHashHex(partiallyFilledOrder);
|
||||
const expectedPartialTakerAssetFilledAmount = partiallyFilledOrder.takerAssetAmount.div(2);
|
||||
const expectedPartialOrderStatus = OrderStatus.Fillable;
|
||||
const partialOrderInfo = ordersInfo[1];
|
||||
expect(partialOrderInfo.orderHash).to.be.equal(expectedPartialOrderHash);
|
||||
expect(partialOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expectedPartialTakerAssetFilledAmount,
|
||||
);
|
||||
expect(partialOrderInfo.orderStatus).to.be.equal(expectedPartialOrderStatus);
|
||||
|
||||
const expectedFilledOrderHash = orderHashUtils.getOrderHashHex(fullyFilledOrder);
|
||||
const expectedFilledTakerAssetFilledAmount = fullyFilledOrder.takerAssetAmount;
|
||||
const expectedFilledOrderStatus = OrderStatus.FullyFilled;
|
||||
const filledOrderInfo = ordersInfo[2];
|
||||
expect(filledOrderInfo.orderHash).to.be.equal(expectedFilledOrderHash);
|
||||
expect(filledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expectedFilledTakerAssetFilledAmount,
|
||||
);
|
||||
expect(filledOrderInfo.orderStatus).to.be.equal(expectedFilledOrderStatus);
|
||||
|
||||
const expectedCancelledOrderHash = orderHashUtils.getOrderHashHex(cancelledOrder);
|
||||
const expectedCancelledTakerAssetFilledAmount = new BigNumber(0);
|
||||
const expectedCancelledOrderStatus = OrderStatus.Cancelled;
|
||||
const cancelledOrderInfo = ordersInfo[3];
|
||||
expect(cancelledOrderInfo.orderHash).to.be.equal(expectedCancelledOrderHash);
|
||||
expect(cancelledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expectedCancelledTakerAssetFilledAmount,
|
||||
);
|
||||
expect(cancelledOrderInfo.orderStatus).to.be.equal(expectedCancelledOrderStatus);
|
||||
|
||||
const expectedExpiredOrderHash = orderHashUtils.getOrderHashHex(expiredOrder);
|
||||
const expectedExpiredTakerAssetFilledAmount = new BigNumber(0);
|
||||
const expectedExpiredOrderStatus = OrderStatus.Expired;
|
||||
const expiredOrderInfo = ordersInfo[4];
|
||||
expect(expiredOrderInfo.orderHash).to.be.equal(expectedExpiredOrderHash);
|
||||
expect(expiredOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
|
||||
expectedExpiredTakerAssetFilledAmount,
|
||||
);
|
||||
expect(expiredOrderInfo.orderStatus).to.be.equal(expectedExpiredOrderStatus);
|
||||
});
|
||||
});
|
||||
});
|
||||
}); // tslint:disable-line:max-file-line-count
|
||||
|
@@ -10,7 +10,7 @@ import {
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { ReferenceFunctions as UtilReferenceFunctions } from '@0x/contracts-utils';
|
||||
import { ExchangeRevertErrors, orderHashUtils } from '@0x/order-utils';
|
||||
import { FillResults, OrderWithoutDomain as Order } from '@0x/types';
|
||||
import { FillResults, OrderInfo, OrderStatus, OrderWithoutDomain as Order } from '@0x/types';
|
||||
import { AnyRevertError, BigNumber, SafeMathRevertErrors, StringRevertError } from '@0x/utils';
|
||||
import { LogEntry, LogWithDecodedArgs } from 'ethereum-types';
|
||||
import * as ethjs from 'ethereumjs-util';
|
||||
@@ -1320,6 +1320,51 @@ blockchainTests('Exchange wrapper functions unit tests.', env => {
|
||||
const tx = txHelper.getResultAndReceiptAsync(testContract.batchCancelOrders, orders);
|
||||
return expect(tx).to.revertWith(expectedError);
|
||||
});
|
||||
|
||||
describe('getOrdersInfo', () => {
|
||||
// Computes the expected (fake) order info generated by the `TestWrapperFunctions` contract.
|
||||
function getExpectedOrderInfo(order: Order): OrderInfo {
|
||||
const MAX_ORDER_STATUS = OrderStatus.Cancelled as number;
|
||||
return {
|
||||
orderHash: getExpectedOrderHash(order),
|
||||
// Lower uint128 of `order.salt` is the `orderTakerAssetFilledAmount`.
|
||||
orderTakerAssetFilledAmount: order.salt.mod(new BigNumber(2).pow(128)),
|
||||
// High byte of `order.salt` is the `orderStatus`.
|
||||
orderStatus:
|
||||
order.salt.dividedToIntegerBy(new BigNumber(2).pow(248)).toNumber() % (MAX_ORDER_STATUS + 1),
|
||||
};
|
||||
}
|
||||
|
||||
it('works with no orders', async () => {
|
||||
const infos = await testContract.getOrdersInfo.callAsync([]);
|
||||
expect(infos.length).to.eq(0);
|
||||
});
|
||||
|
||||
it('works with one order', async () => {
|
||||
const orders = [randomOrder()];
|
||||
const expectedResult = orders.map(getExpectedOrderInfo);
|
||||
const actualResult = await testContract.getOrdersInfo.callAsync(orders);
|
||||
expect(actualResult).to.deep.eq(expectedResult);
|
||||
});
|
||||
|
||||
it('works with many orders', async () => {
|
||||
const NUM_ORDERS = 16;
|
||||
const orders = _.times(NUM_ORDERS, () => randomOrder());
|
||||
const expectedResult = orders.map(getExpectedOrderInfo);
|
||||
const actualResult = await testContract.getOrdersInfo.callAsync(orders);
|
||||
expect(actualResult).to.deep.eq(expectedResult);
|
||||
});
|
||||
|
||||
it('works with duplicate orders', async () => {
|
||||
const NUM_UNIQUE_ORDERS = 4;
|
||||
const CLONE_COUNT = 2;
|
||||
const uniqueOrders = _.times(NUM_UNIQUE_ORDERS, () => randomOrder());
|
||||
const orders = _.shuffle(_.flatten(_.times(CLONE_COUNT, () => uniqueOrders)));
|
||||
const expectedResult = orders.map(getExpectedOrderInfo);
|
||||
const actualResult = await testContract.getOrdersInfo.callAsync(orders);
|
||||
expect(actualResult).to.deep.eq(expectedResult);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
// tslint:disable-next-line: max-file-line-count
|
||||
|
Reference in New Issue
Block a user