Shortcut if everything satisfies in the non dependent use case

This commit is contained in:
Jacob Evans
2017-11-15 16:20:39 -05:00
parent 54c891a447
commit c32938fa43
2 changed files with 32 additions and 2 deletions

View File

@@ -110,7 +110,13 @@ export class OrderStateUtils {
if (makerFee.isZero()) {
return BigNumber.min(makerTransferrable, remainingMakerAmount);
}
if (makerFeeTransferrable.greaterThanOrEqualTo(makerFee) &&
makerTransferrable.greaterThanOrEqualTo(remainingMakerAmount) &&
makerTokenAddress !== zrxTokenAddress) {
return BigNumber.min(makerTransferrable, remainingMakerAmount);
}
const orderToFeeRatio = totalMakerAmount.dividedToIntegerBy(makerFee);
console.log('order to fee ratio: ', orderToFeeRatio.toString());
let fillableTimesInMakerToken = makerTransferrable.dividedToIntegerBy(orderToFeeRatio);
const fillableTimesInFeeToken = BigNumber.min(makerFeeTransferrable, remainingMakerFee);
if (makerTokenAddress === zrxTokenAddress) {

View File

@@ -335,8 +335,8 @@ describe('OrderStateWatcher', () => {
const remainingFeeAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), 18);
const transferFeeAmount = makerFee.sub(remainingFeeAmount);
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), 18);
const transferTokenAmount = makerFee.sub(remainingFeeAmount);
const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), 18);
const transferTokenAmount = makerFee.sub(remainingTokenAmount);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportCallbackErrors(done)((orderState: OrderState) => {
@@ -352,6 +352,30 @@ describe('OrderStateWatcher', () => {
makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferTokenAmount);
})().catch(done);
});
it('should calculate full amount when all available and non-divisible', (done: DoneCallback) => {
(async () => {
const takerFee = ZeroEx.toBaseUnitAmount(new BigNumber(0), 18);
const makerFee = ZeroEx.toBaseUnitAmount(new BigNumber(2), 18);
const feeRecipient = taker;
signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
makerToken.address, takerToken.address, makerFee, takerFee, maker,
taker, fillableAmount, feeRecipient);
const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
zeroEx.orderStateWatcher.addOrder(signedOrder);
const callback = reportCallbackErrors(done)((orderState: OrderState) => {
const validOrderState = orderState as OrderStateValid;
const orderRelevantState = validOrderState.orderRelevantState;
expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
fillableAmount);
done();
});
zeroEx.orderStateWatcher.subscribe(callback);
await zeroEx.token.setProxyAllowanceAsync(
makerToken.address, maker, ZeroEx.toBaseUnitAmount(new BigNumber(100), 18));
})().catch(done);
});
});
it('should emit orderStateInvalid when watched order cancelled', (done: DoneCallback) => {
(async () => {