aboutsummaryrefslogtreecommitdiffstats
path: root/packages/order-utils/test/order_state_utils_test.ts
blob: 91ef23b695150bd0c99625b599ea4143700b2a0b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
import 'mocha';

import { AbstractBalanceAndProxyAllowanceFetcher } from '../src/abstract/abstract_balance_and_proxy_allowance_fetcher';
import { AbstractOrderFilledCancelledFetcher } from '../src/abstract/abstract_order_filled_cancelled_fetcher';
import { OrderStateUtils } from '../src/order_state_utils';

import { chaiSetup } from './utils/chai_setup';
import { testOrderFactory } from './utils/test_order_factory';

chaiSetup.configure();
const expect = chai.expect;

describe('OrderStateUtils', () => {
    describe('#getOpenOrderStateAsync', () => {
        const buildMockBalanceFetcher = (takerBalance: BigNumber): AbstractBalanceAndProxyAllowanceFetcher => {
            const balanceFetcher = {
                async getBalanceAsync(_assetData: string, _userAddress: string): Promise<BigNumber> {
                    return takerBalance;
                },
                async getProxyAllowanceAsync(_assetData: string, _userAddress: string): Promise<BigNumber> {
                    return takerBalance;
                },
            };
            return balanceFetcher;
        };
        const buildMockOrderFilledFetcher = (
            filledAmount: BigNumber = new BigNumber(0),
            cancelled: boolean = false,
        ): AbstractOrderFilledCancelledFetcher => {
            const orderFetcher = {
                async getFilledTakerAmountAsync(_orderHash: string): Promise<BigNumber> {
                    return filledAmount;
                },
                async isOrderCancelledAsync(_orderHash: string): Promise<boolean> {
                    return cancelled;
                },
                getZRXAssetData(): string {
                    return '';
                },
            };
            return orderFetcher;
        };
        it('should have valid order state if order can be fully filled with small maker amount', async () => {
            const makerAssetAmount = new BigNumber(10);
            const takerAssetAmount = new BigNumber(10000000000000000);
            const takerBalance = takerAssetAmount;
            const orderFilledAmount = new BigNumber(0);
            const mockBalanceFetcher = buildMockBalanceFetcher(takerBalance);
            const mockOrderFilledFetcher = buildMockOrderFilledFetcher(orderFilledAmount);
            const [signedOrder] = testOrderFactory.generateTestSignedOrders(
                {
                    makerAssetAmount,
                    takerAssetAmount,
                },
                1,
            );

            const orderStateUtils = new OrderStateUtils(mockBalanceFetcher, mockOrderFilledFetcher);
            const orderState = await orderStateUtils.getOpenOrderStateAsync(signedOrder);
            expect(orderState.isValid).to.eq(true);
        });
        it('should be invalid when an order is partially filled where only a rounding error remains', async () => {
            const makerAssetAmount = new BigNumber(1001);
            const takerAssetAmount = new BigNumber(3);
            const takerBalance = takerAssetAmount;
            const orderFilledAmount = new BigNumber(2);
            const mockBalanceFetcher = buildMockBalanceFetcher(takerBalance);
            const mockOrderFilledFetcher = buildMockOrderFilledFetcher(orderFilledAmount);
            const [signedOrder] = testOrderFactory.generateTestSignedOrders(
                {
                    makerAssetAmount,
                    takerAssetAmount,
                },
                1,
            );

            const orderStateUtils = new OrderStateUtils(mockBalanceFetcher, mockOrderFilledFetcher);
            const orderState = await orderStateUtils.getOpenOrderStateAsync(signedOrder);
            expect(orderState.isValid).to.eq(false);
        });
        it('should be invalid when an order is cancelled', async () => {
            const makerAssetAmount = new BigNumber(1000);
            const takerAssetAmount = new BigNumber(2);
            const takerBalance = takerAssetAmount;
            const orderFilledAmount = new BigNumber(0);
            const isCancelled = true;
            const mockBalanceFetcher = buildMockBalanceFetcher(takerBalance);
            const mockOrderFilledFetcher = buildMockOrderFilledFetcher(orderFilledAmount, isCancelled);
            const [signedOrder] = testOrderFactory.generateTestSignedOrders(
                {
                    makerAssetAmount,
                    takerAssetAmount,
                },
                1,
            );

            const orderStateUtils = new OrderStateUtils(mockBalanceFetcher, mockOrderFilledFetcher);
            const orderState = await orderStateUtils.getOpenOrderStateAsync(signedOrder);
            expect(orderState.isValid).to.eq(false);
        });
        it('should be invalid when an order is fully filled', async () => {
            const makerAssetAmount = new BigNumber(1000);
            const takerAssetAmount = new BigNumber(2);
            const takerBalance = takerAssetAmount;
            const orderFilledAmount = takerAssetAmount;
            const isCancelled = false;
            const mockBalanceFetcher = buildMockBalanceFetcher(takerBalance);
            const mockOrderFilledFetcher = buildMockOrderFilledFetcher(orderFilledAmount, isCancelled);
            const [signedOrder] = testOrderFactory.generateTestSignedOrders(
                {
                    makerAssetAmount,
                    takerAssetAmount,
                },
                1,
            );

            const orderStateUtils = new OrderStateUtils(mockBalanceFetcher, mockOrderFilledFetcher);
            const orderState = await orderStateUtils.getOpenOrderStateAsync(signedOrder);
            expect(orderState.isValid).to.eq(false);
        });
    });
});