diff options
author | Leonid <logvinov.leon@gmail.com> | 2017-06-08 17:17:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-08 17:17:04 +0800 |
commit | c6645f9f4f470323086d9004cf603a68091d71a3 (patch) | |
tree | 5f9de5948df1b471c93d3445a3deda7ac75d935a /src/contract_wrappers | |
parent | 834b28bfbe26e0331820d978b5be659b27423528 (diff) | |
parent | 32ba65ee265d6acc3fe8ff87a5a36df36cd9a3d5 (diff) | |
download | dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.tar dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.tar.gz dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.tar.bz2 dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.tar.lz dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.tar.xz dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.tar.zst dexon-sol-tools-c6645f9f4f470323086d9004cf603a68091d71a3.zip |
Merge pull request #43 from 0xProject/batchCancelAsync
Batch cancel order async
Diffstat (limited to 'src/contract_wrappers')
-rw-r--r-- | src/contract_wrappers/exchange_wrapper.ts | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/src/contract_wrappers/exchange_wrapper.ts b/src/contract_wrappers/exchange_wrapper.ts index 4f132656e..d144d8aad 100644 --- a/src/contract_wrappers/exchange_wrapper.ts +++ b/src/contract_wrappers/exchange_wrapper.ts @@ -19,6 +19,7 @@ import { ContractEventObj, EventCallback, ContractResponse, + OrderCancellationRequest, } from '../types'; import {assert} from '../utils/assert'; import {utils} from '../utils/utils'; @@ -226,8 +227,8 @@ export class ExchangeWrapper extends ContractWrapper { /** * Cancel a given fill amount of an order. Cancellations are cumulative. */ - public async cancelOrderAsync(order: Order|SignedOrder, takerTokenCancelAmount: BigNumber.BigNumber): - Promise<void> { + public async cancelOrderAsync( + order: Order|SignedOrder, takerTokenCancelAmount: BigNumber.BigNumber): Promise<void> { assert.doesConformToSchema('order', SchemaValidator.convertToJSONSchemaCompatibleObject(order as object), orderSchema); @@ -258,6 +259,59 @@ export class ExchangeWrapper extends ContractWrapper { this.throwErrorLogsAsErrors(response.logs); } /** + * Batch version of cancelOrderAsync. Atomically cancels multiple orders in a single transaction. + * All orders must be from the same maker. + */ + public async batchCancelOrderAsync(orderCancellationRequests: OrderCancellationRequest[]): Promise<void> { + if (_.isEmpty(orderCancellationRequests)) { + return; // no-op + } + const makers = _.map(orderCancellationRequests, cancellationRequest => cancellationRequest.order.maker); + assert.assert(_.uniq(makers).length === 1, ExchangeContractErrs.MULTIPLE_MAKERS_IN_SINGLE_CANCEL_BATCH); + const maker = makers[0]; + await assert.isSenderAddressAvailableAsync(this.web3Wrapper, 'maker', maker); + _.forEach(orderCancellationRequests, + async (cancellationRequest: OrderCancellationRequest, i: number) => { + assert.doesConformToSchema(`orderCancellationRequests[${i}].order`, + SchemaValidator.convertToJSONSchemaCompatibleObject(cancellationRequest.order as object), orderSchema, + ); + assert.isBigNumber(`orderCancellationRequests[${i}].takerTokenCancelAmount`, + cancellationRequest.takerTokenCancelAmount, + ); + await this.validateCancelOrderAndThrowIfInvalidAsync( + cancellationRequest.order, cancellationRequest.takerTokenCancelAmount, + ); + }); + const exchangeInstance = await this.getExchangeContractAsync(); + const orderAddressesValuesAndTakerTokenCancelAmounts = _.map(orderCancellationRequests, cancellationRequest => { + return [ + ...ExchangeWrapper.getOrderAddressesAndValues(cancellationRequest.order), + cancellationRequest.takerTokenCancelAmount, + ]; + }); + // We use _.unzip<any> because _.unzip doesn't type check if values have different types :'( + const [orderAddresses, orderValues, takerTokenCancelAmounts] = + _.unzip<any>(orderAddressesValuesAndTakerTokenCancelAmounts); + const gas = await exchangeInstance.batchCancel.estimateGas( + orderAddresses, + orderValues, + takerTokenCancelAmounts, + { + from: maker, + }, + ); + const response: ContractResponse = await exchangeInstance.batchCancel( + orderAddresses, + orderValues, + takerTokenCancelAmounts, + { + from: maker, + gas, + }, + ); + this.throwErrorLogsAsErrors(response.logs); + } + /** * Subscribe to an event type emitted by the Exchange smart contract */ public async subscribeAsync(eventName: ExchangeEvents, subscriptionOpts: SubscriptionOpts, |