168 lines
7.2 KiB
TypeScript
168 lines
7.2 KiB
TypeScript
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]);
|
|
}
|
|
}
|
|
}
|