diff options
author | Jacob Evans <jacob@dekz.net> | 2017-11-13 08:17:27 +0800 |
---|---|---|
committer | Jacob Evans <jacob@dekz.net> | 2017-11-13 08:17:27 +0800 |
commit | 42e3ab91a794f61d65008d969b3d48080b5035d7 (patch) | |
tree | 80d1bc9a2b750009cd30db2e10e33963d9e47023 | |
parent | 5e77e8809abd96136fb11ebdc84a2aefa32d4cea (diff) | |
download | dexon-0x-contracts-42e3ab91a794f61d65008d969b3d48080b5035d7.tar.gz dexon-0x-contracts-42e3ab91a794f61d65008d969b3d48080b5035d7.tar.zst dexon-0x-contracts-42e3ab91a794f61d65008d969b3d48080b5035d7.zip |
Perform the division after multiplication to reduce compounding the rounding errors
-rw-r--r-- | src/utils/order_state_utils.ts | 6 | ||||
-rw-r--r-- | test/order_state_watcher_test.ts | 15 |
2 files changed, 11 insertions, 10 deletions
diff --git a/src/utils/order_state_utils.ts b/src/utils/order_state_utils.ts index 4f57de9fe..7c10a5480 100644 --- a/src/utils/order_state_utils.ts +++ b/src/utils/order_state_utils.ts @@ -66,13 +66,13 @@ export class OrderStateUtils { const totalTakerTokenAmount = signedOrder.takerTokenAmount; const remainingTakerTokenAmount = totalTakerTokenAmount.minus(unavailableTakerTokenAmount); // 200 in order, 100 unavailable = 100 remaning, 0.5 remaining in taker proportion - const remainingTakerProportion = remainingTakerTokenAmount.dividedBy(totalTakerTokenAmount); - const remainingMakerTokenAmount = remainingTakerProportion.times(totalMakerTokenAmount); + const remainingMakerTokenAmount = remainingTakerTokenAmount.times(totalMakerTokenAmount) + .dividedToIntegerBy(totalTakerTokenAmount); // min allowance, balance in account of maker const fillableMakerTokenAmount = BigNumber.min([makerProxyAllowance, makerBalance]); // min ^, remaining order maker token amount const remainingFillableMakerTokenAmount = BigNumber.min(fillableMakerTokenAmount, remainingMakerTokenAmount); - // edge case when maker token is ZRX + // TODO: Handle edge case where maker token is ZRX with fee const orderRelevantState = { makerBalance, makerProxyAllowance, diff --git a/test/order_state_watcher_test.ts b/test/order_state_watcher_test.ts index 07d18ae61..924e54772 100644 --- a/test/order_state_watcher_test.ts +++ b/test/order_state_watcher_test.ts @@ -190,7 +190,8 @@ describe('OrderStateWatcher', () => { const orderRelevantState = validOrderState.orderRelevantState; const remainingMakerBalance = makerBalance.sub(fillAmountInBaseUnits); const remainingFillable = fillableAmount.minus(fillAmountInBaseUnits); - expect(remainingFillable).to.be.bignumber.equal(fillableAmount.minus(fillAmountInBaseUnits)); + expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal( + remainingFillable); expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance); if (eventCount === 2) { done(); @@ -204,7 +205,7 @@ describe('OrderStateWatcher', () => { })().catch(done); }); describe('remainingFillableMakerTokenAmount', () => { - it('should calculate correct reamining fillable', (done: DoneCallback) => { + it('should calculate correct remaining fillable', (done: DoneCallback) => { (async () => { const takerFillableAmount = new BigNumber(10); const makerFillableAmount = new BigNumber(20); @@ -265,20 +266,20 @@ describe('OrderStateWatcher', () => { const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker); - const transferAmount = new BigNumber(1); + const remainingAmount = new BigNumber(1); + const transferAmount = makerBalance.sub(remainingAmount); 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( - transferAmount); + remainingAmount); done(); }); zeroEx.orderStateWatcher.subscribe(callback); - await zeroEx.token.transferAsync(makerToken.address, maker, ZeroEx.NULL_ADDRESS, - makerBalance.minus(transferAmount)); + await zeroEx.token.transferAsync( + makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferAmount); })().catch(done); }); }); |