aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/util/exchange_wrapper.ts
diff options
context:
space:
mode:
authorAmir Bandeali <abandeali1@gmail.com>2017-12-02 03:29:27 +0800
committerGitHub <noreply@github.com>2017-12-02 03:29:27 +0800
commitc291419141b06814c3e6d662998b7eaa6d554528 (patch)
tree4d85215ecfa9f627c12ca2dd14dc4e4c8ef3f22d /packages/contracts/util/exchange_wrapper.ts
parentc57190dead41846809effb8823bd4e486ca72512 (diff)
parent290a96d41f62b38a6d4b332fc716088caf666381 (diff)
downloaddexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.tar
dexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.tar.gz
dexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.tar.bz2
dexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.tar.lz
dexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.tar.xz
dexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.tar.zst
dexon-sol-tools-c291419141b06814c3e6d662998b7eaa6d554528.zip
Merge pull request #247 from 0xProject/feature/addContractsRepo
Add contracts repo
Diffstat (limited to 'packages/contracts/util/exchange_wrapper.ts')
-rw-r--r--packages/contracts/util/exchange_wrapper.ts167
1 files changed, 167 insertions, 0 deletions
diff --git a/packages/contracts/util/exchange_wrapper.ts b/packages/contracts/util/exchange_wrapper.ts
new file mode 100644
index 000000000..304dcdacf
--- /dev/null
+++ b/packages/contracts/util/exchange_wrapper.ts
@@ -0,0 +1,167 @@
+import {BigNumber} from 'bignumber.js';
+import * as _ from 'lodash';
+
+import {formatters} from './formatters';
+import {Order} from './order';
+import {ContractInstance} from './types';
+
+export class ExchangeWrapper {
+ private exchange: ContractInstance;
+ constructor(exchangeContractInstance: ContractInstance) {
+ this.exchange = exchangeContractInstance;
+ }
+ public async fillOrderAsync(order: Order, from: string,
+ opts: {
+ fillTakerTokenAmount?: BigNumber;
+ shouldThrowOnInsufficientBalanceOrAllowance?: boolean;
+ } = {}) {
+ const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
+ const params = order.createFill(shouldThrowOnInsufficientBalanceOrAllowance, opts.fillTakerTokenAmount);
+ const tx = await this.exchange.fillOrder(
+ params.orderAddresses,
+ params.orderValues,
+ params.fillTakerTokenAmount,
+ params.shouldThrowOnInsufficientBalanceOrAllowance,
+ params.v,
+ params.r,
+ params.s,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async cancelOrderAsync(order: Order, from: string,
+ opts: {cancelTakerTokenAmount?: BigNumber} = {}) {
+ const params = order.createCancel(opts.cancelTakerTokenAmount);
+ const tx = await this.exchange.cancelOrder(
+ params.orderAddresses,
+ params.orderValues,
+ params.cancelTakerTokenAmount,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async fillOrKillOrderAsync(order: Order, from: string,
+ opts: {fillTakerTokenAmount?: BigNumber} = {}) {
+ const shouldThrowOnInsufficientBalanceOrAllowance = true;
+ const params = order.createFill(shouldThrowOnInsufficientBalanceOrAllowance, opts.fillTakerTokenAmount);
+ const tx = await this.exchange.fillOrKillOrder(
+ params.orderAddresses,
+ params.orderValues,
+ params.fillTakerTokenAmount,
+ params.v,
+ params.r,
+ params.s,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async batchFillOrdersAsync(orders: Order[], from: string,
+ opts: {
+ fillTakerTokenAmounts?: BigNumber[];
+ shouldThrowOnInsufficientBalanceOrAllowance?: boolean;
+ } = {}) {
+ const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
+ const params = formatters.createBatchFill(
+ orders, shouldThrowOnInsufficientBalanceOrAllowance, opts.fillTakerTokenAmounts);
+ const tx = await this.exchange.batchFillOrders(
+ params.orderAddresses,
+ params.orderValues,
+ params.fillTakerTokenAmounts,
+ params.shouldThrowOnInsufficientBalanceOrAllowance,
+ params.v,
+ params.r,
+ params.s,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async batchFillOrKillOrdersAsync(orders: Order[], from: string,
+ opts: {fillTakerTokenAmounts?: BigNumber[]} = {}) {
+ const params = formatters.createBatchFill(orders, undefined, opts.fillTakerTokenAmounts);
+ const tx = await this.exchange.batchFillOrKillOrders(
+ params.orderAddresses,
+ params.orderValues,
+ params.fillTakerTokenAmounts,
+ params.v,
+ params.r,
+ params.s,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async fillOrdersUpToAsync(orders: Order[], from: string,
+ opts: {
+ fillTakerTokenAmount?: BigNumber;
+ shouldThrowOnInsufficientBalanceOrAllowance?: boolean;
+ } = {}) {
+ const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
+ const params = formatters.createFillUpTo(orders,
+ shouldThrowOnInsufficientBalanceOrAllowance,
+ opts.fillTakerTokenAmount);
+ const tx = await this.exchange.fillOrdersUpTo(
+ params.orderAddresses,
+ params.orderValues,
+ params.fillTakerTokenAmount,
+ params.shouldThrowOnInsufficientBalanceOrAllowance,
+ params.v,
+ params.r,
+ params.s,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async batchCancelOrdersAsync(orders: Order[], from: string,
+ opts: {cancelTakerTokenAmounts?: BigNumber[]} = {}) {
+ const params = formatters.createBatchCancel(orders, opts.cancelTakerTokenAmounts);
+ const tx = await this.exchange.batchCancelOrders(
+ params.orderAddresses,
+ params.orderValues,
+ params.cancelTakerTokenAmounts,
+ {from},
+ );
+ _.each(tx.logs, log => wrapLogBigNumbers(log));
+ return tx;
+ }
+ public async getOrderHashAsync(order: Order): Promise<string> {
+ const shouldThrowOnInsufficientBalanceOrAllowance = false;
+ const params = order.createFill(shouldThrowOnInsufficientBalanceOrAllowance);
+ const orderHash = await this.exchange.getOrderHash(params.orderAddresses, params.orderValues);
+ return orderHash;
+ }
+ public async isValidSignatureAsync(order: Order): Promise<boolean> {
+ const isValidSignature = await this.exchange.isValidSignature(
+ order.params.maker,
+ order.params.orderHashHex,
+ order.params.v,
+ order.params.r,
+ order.params.s,
+ );
+ return isValidSignature;
+ }
+ public async isRoundingErrorAsync(numerator: BigNumber, denominator: BigNumber,
+ target: BigNumber): Promise<boolean> {
+ const isRoundingError = await this.exchange.isRoundingError(numerator, denominator, target);
+ return isRoundingError;
+ }
+ public async getPartialAmountAsync(numerator: BigNumber, denominator: BigNumber,
+ target: BigNumber): Promise<BigNumber> {
+ const partialAmount = new BigNumber(await this.exchange.getPartialAmount(numerator, denominator, target));
+ return partialAmount;
+ }
+}
+
+function wrapLogBigNumbers(log: any): any {
+ const argNames = _.keys(log.args);
+ for (const argName of argNames) {
+ const isWeb3BigNumber = _.startsWith(log.args[argName].constructor.toString(), 'function BigNumber(');
+ if (isWeb3BigNumber) {
+ log.args[argName] = new BigNumber(log.args[argName]);
+ }
+ }
+}