Add fillOrderNoThrow to exchange wrapper and add test

This commit is contained in:
Amir Bandeali 2018-03-08 15:58:21 -08:00
parent 9cc1956b4b
commit 2c44c7ea83
2 changed files with 69 additions and 6 deletions

View File

@ -81,6 +81,27 @@ export class ExchangeWrapper {
}); });
return tx; return tx;
} }
public async fillOrderNoThrowAsync(
signedOrder: SignedOrder,
from: string,
opts: { takerTokenFillAmount?: BigNumber } = {},
): Promise<TransactionReceiptWithDecodedLogs> {
const params = orderUtils.createFill(signedOrder, opts.takerTokenFillAmount);
const txHash = await this._exchange.fillOrderNoThrow.sendTransactionAsync(
params.order,
params.takerTokenFillAmount,
params.signature,
{ from },
);
const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
tx.logs = _.map(tx.logs, log => {
const logWithDecodedArgs = this._logDecoder.decodeLogOrThrow(log);
wrapLogBigNumbers(logWithDecodedArgs);
return logWithDecodedArgs;
});
return tx;
}
public async batchFillOrdersAsync( public async batchFillOrdersAsync(
orders: SignedOrder[], orders: SignedOrder[],
from: string, from: string,

View File

@ -111,15 +111,12 @@ describe('Exchange', () => {
}); });
beforeEach(async () => { beforeEach(async () => {
await blockchainLifecycle.startAsync(); await blockchainLifecycle.startAsync();
balances = await dmyBalances.getAsync();
}); });
afterEach(async () => { afterEach(async () => {
await blockchainLifecycle.revertAsync(); await blockchainLifecycle.revertAsync();
}); });
describe('fillOrKillOrder', () => { describe('fillOrKillOrder', () => {
beforeEach(async () => {
balances = await dmyBalances.getAsync();
});
it('should transfer the correct amounts', async () => { it('should transfer the correct amounts', async () => {
const signedOrder = orderFactory.newSignedOrder({ const signedOrder = orderFactory.newSignedOrder({
makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18), makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
@ -187,6 +184,52 @@ describe('Exchange', () => {
}); });
}); });
describe('fillOrderNoThrow', () => {
it('should transfer the correct amounts', async () => {
const signedOrder = orderFactory.newSignedOrder({
makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
});
const takerTokenFillAmount = signedOrder.takerTokenAmount.div(2);
await exWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress, {
takerTokenFillAmount,
});
const newBalances = await dmyBalances.getAsync();
const makerTokenFillAmount = takerTokenFillAmount
.times(signedOrder.makerTokenAmount)
.dividedToIntegerBy(signedOrder.takerTokenAmount);
const makerFeeAmount = signedOrder.makerFeeAmount
.times(makerTokenFillAmount)
.dividedToIntegerBy(signedOrder.makerTokenAmount);
const takerFeeAmount = signedOrder.takerFeeAmount
.times(makerTokenFillAmount)
.dividedToIntegerBy(signedOrder.makerTokenAmount);
expect(newBalances[makerAddress][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
balances[makerAddress][signedOrder.makerTokenAddress].minus(makerTokenFillAmount),
);
expect(newBalances[makerAddress][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
balances[makerAddress][signedOrder.takerTokenAddress].add(takerTokenFillAmount),
);
expect(newBalances[makerAddress][zrx.address]).to.be.bignumber.equal(
balances[makerAddress][zrx.address].minus(makerFeeAmount),
);
expect(newBalances[takerAddress][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
balances[takerAddress][signedOrder.takerTokenAddress].minus(takerTokenFillAmount),
);
expect(newBalances[takerAddress][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
balances[takerAddress][signedOrder.makerTokenAddress].add(makerTokenFillAmount),
);
expect(newBalances[takerAddress][zrx.address]).to.be.bignumber.equal(
balances[takerAddress][zrx.address].minus(takerFeeAmount),
);
expect(newBalances[feeRecipientAddress][zrx.address]).to.be.bignumber.equal(
balances[feeRecipientAddress][zrx.address].add(makerFeeAmount.add(takerFeeAmount)),
);
});
});
describe('batch functions', () => { describe('batch functions', () => {
let signedOrders: SignedOrder[]; let signedOrders: SignedOrder[];
beforeEach(async () => { beforeEach(async () => {
@ -195,7 +238,6 @@ describe('Exchange', () => {
orderFactory.newSignedOrder(), orderFactory.newSignedOrder(),
orderFactory.newSignedOrder(), orderFactory.newSignedOrder(),
]; ];
balances = await dmyBalances.getAsync();
}); });
describe('batchFillOrders', () => { describe('batchFillOrders', () => {
@ -304,7 +346,7 @@ describe('Exchange', () => {
}); });
}); });
describe('fillOrdersUpTo', () => { describe('marketFillOrders', () => {
it('should stop when the entire takerTokenFillAmount is filled', async () => { it('should stop when the entire takerTokenFillAmount is filled', async () => {
const takerTokenFillAmount = signedOrders[0].takerTokenAmount.plus( const takerTokenFillAmount = signedOrders[0].takerTokenAmount.plus(
signedOrders[1].takerTokenAmount.div(2), signedOrders[1].takerTokenAmount.div(2),