aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Evans <jacob@dekz.net>2017-11-13 08:17:27 +0800
committerJacob Evans <jacob@dekz.net>2017-11-13 08:17:27 +0800
commit42e3ab91a794f61d65008d969b3d48080b5035d7 (patch)
tree80d1bc9a2b750009cd30db2e10e33963d9e47023
parent5e77e8809abd96136fb11ebdc84a2aefa32d4cea (diff)
downloaddexon-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.ts6
-rw-r--r--test/order_state_watcher_test.ts15
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);
});
});