diff options
Implement `zeroEx.exchange.getOrderStateAsync`
-rw-r--r-- | packages/0x.js/CHANGELOG.md | 2 | ||||
-rw-r--r-- | packages/0x.js/src/contract_wrappers/exchange_wrapper.ts | 53 | ||||
-rw-r--r-- | packages/0x.js/test/exchange_wrapper_test.ts | 39 |
3 files changed, 76 insertions, 18 deletions
diff --git a/packages/0x.js/CHANGELOG.md b/packages/0x.js/CHANGELOG.md index c18915417..63c82ac94 100644 --- a/packages/0x.js/CHANGELOG.md +++ b/packages/0x.js/CHANGELOG.md @@ -4,6 +4,8 @@ Edit the package's CHANGELOG.json file only. --> CHANGELOG +## v0.36.0 - TBD + * Add `zeroEx.exchange.getOrderStateAsync` to allow obtaining current OrderState for a signedOrder ## v0.35.0 - _April 2, 2018_ diff --git a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts index 378ae8111..fb1877f4a 100644 --- a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts @@ -13,35 +13,38 @@ import { Web3Wrapper } from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; import { artifacts } from '../artifacts'; +import { BalanceAndProxyAllowanceLazyStore } from '../stores/balance_proxy_allowance_lazy_store'; +import { OrderFilledCancelledLazyStore } from '../stores/order_filled_cancelled_lazy_store'; import { - BlockRange, - EventCallback, - ExchangeContractErrCodes, - ExchangeContractErrs, - IndexedFilterValues, - MethodOpts, - OrderAddresses, - OrderCancellationRequest, - OrderFillRequest, - OrderTransactionOpts, - OrderValues, - ValidateOrderFillableOpts, +BlockRange, +EventCallback, +ExchangeContractErrCodes, +ExchangeContractErrs, +IndexedFilterValues, +MethodOpts, +OrderAddresses, +OrderCancellationRequest, +OrderFillRequest, +OrderState, +OrderTransactionOpts, +OrderValues, +ValidateOrderFillableOpts, } from '../types'; import { assert } from '../utils/assert'; import { decorators } from '../utils/decorators'; import { ExchangeTransferSimulator } from '../utils/exchange_transfer_simulator'; +import { OrderStateUtils } from '../utils/order_state_utils'; import { OrderValidationUtils } from '../utils/order_validation_utils'; import { utils } from '../utils/utils'; import { ContractWrapper } from './contract_wrapper'; import { - ExchangeContract, - ExchangeContractEventArgs, - ExchangeEvents, - LogErrorContractEventArgs, +ExchangeContract, +ExchangeContractEventArgs, +ExchangeEvents, +LogErrorContractEventArgs, } from './generated/exchange'; import { TokenWrapper } from './token_wrapper'; - const SHOULD_VALIDATE_BY_DEFAULT = true; interface ExchangeContractErrCodesToMsgs { @@ -874,6 +877,22 @@ export class ExchangeWrapper extends ContractWrapper { } } /** + * Gets the latest OrderState of a signedOrder + * @param signedOrder The signedOrder + */ + public async getOrderStateAsync(signedOrder: SignedOrder): Promise<OrderState> { + const balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore( + this._tokenWrapper, + BlockParamLiteral.Latest, + ); + const orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(this); + const orderStateUtils = new OrderStateUtils( + balanceAndProxyAllowanceLazyStore, + orderFilledCancelledLazyStore, + ); + return orderStateUtils.getOrderStateAsync(signedOrder); + } + /** * Returns the ZRX token address used by the exchange contract. * @return Address of ZRX token */ diff --git a/packages/0x.js/test/exchange_wrapper_test.ts b/packages/0x.js/test/exchange_wrapper_test.ts index cfc390bae..b6eaa2591 100644 --- a/packages/0x.js/test/exchange_wrapper_test.ts +++ b/packages/0x.js/test/exchange_wrapper_test.ts @@ -14,7 +14,7 @@ import { LogCancelContractEventArgs, LogFillContractEventArgs, OrderCancellationRequest, - OrderFillRequest, + OrderFillRequest, OrderState, OrderStateInvalid, SignedOrder, Token, ZeroEx, @@ -1156,4 +1156,41 @@ describe('ExchangeWrapper', () => { expect(args.maker).to.be.equal(differentMakerAddress); }); }); + describe('#getOrderState', () => { + let maker: string; + let taker: string; + let makerToken: Token; + let takerToken: Token; + let signedOrder: SignedOrder; + let orderState: OrderState; + const fillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(5), constants.ZRX_DECIMALS); + before(async () => { + [, maker, taker] = userAddresses; + tokens = await zeroEx.tokenRegistry.getTokensAsync(); + [makerToken, takerToken] = tokenUtils.getDummyTokens(); + }); + it('should report orderStateValid when order is fillable', async () => { + signedOrder = await fillScenarios.createFillableSignedOrderAsync( + makerToken.address, + takerToken.address, + maker, + taker, + fillableAmount, + ); + orderState = await zeroEx.exchange.getOrderStateAsync(signedOrder); + expect(orderState.isValid).to.be.true(); + }); + it('should report orderStateInvalid when maker allowance set to 0', async () => { + signedOrder = await fillScenarios.createFillableSignedOrderAsync( + makerToken.address, + takerToken.address, + maker, + taker, + fillableAmount, + ); + await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0)); + orderState = await zeroEx.exchange.getOrderStateAsync(signedOrder); + expect(orderState.isValid).to.be.false(); + }); + }); }); // tslint:disable:max-file-line-count |