diff options
author | Brandon Millman <brandon.millman@gmail.com> | 2018-08-15 04:48:21 +0800 |
---|---|---|
committer | Brandon Millman <brandon.millman@gmail.com> | 2018-08-15 04:48:21 +0800 |
commit | 9c3d10d5be40abe86cb24ec437946707167c19ff (patch) | |
tree | ecdc085c2439090728e8816687357cf489320dd3 /packages/order-utils/src/rate_utils.ts | |
parent | 6a2634d362e50e5a611f388c0785df3209cee308 (diff) | |
parent | 3afe405bbe92f9c549a59f26b9c82654f0e304c4 (diff) | |
download | dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.tar dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.tar.gz dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.tar.bz2 dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.tar.lz dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.tar.xz dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.tar.zst dexon-sol-tools-9c3d10d5be40abe86cb24ec437946707167c19ff.zip |
Merge branch 'development' into refactor/order-utils/market-utils-api
* development:
feat: Upgrade TypeScript to 3.0.1
Add defaults for networkId and pagination
Update sortingUtils to support Order and SignedOrder
Change rateUtils to use Order
Updated CHANGELOG
Fix lint errors
Update tests for optional feeRate
Make feeRate optional with a default of 0
Add tests for sortingUtils
Implement sorting utils
Add tests for rateUtils
Implement rate utils
Diffstat (limited to 'packages/order-utils/src/rate_utils.ts')
-rw-r--r-- | packages/order-utils/src/rate_utils.ts | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/packages/order-utils/src/rate_utils.ts b/packages/order-utils/src/rate_utils.ts new file mode 100644 index 000000000..c9ca72c59 --- /dev/null +++ b/packages/order-utils/src/rate_utils.ts @@ -0,0 +1,48 @@ +import { schemas } from '@0xproject/json-schemas'; +import { Order } from '@0xproject/types'; +import { BigNumber } from '@0xproject/utils'; + +import { assert } from './assert'; +import { constants } from './constants'; + +export const rateUtils = { + /** + * Takes an order and calculates the fee adjusted rate (takerAsset/makerAsset) by calculating how much takerAsset + * is required to cover the fees (feeRate * takerFee), adding the takerAssetAmount and dividing by makerAssetAmount + * @param order An object that conforms to the order interface + * @param feeRate The market rate of ZRX denominated in takerAssetAmount + * (ex. feeRate is 0.1 takerAsset/ZRX if it takes 1 unit of takerAsset to buy 10 ZRX) + * Defaults to 0 + * @return The rate (takerAsset/makerAsset) of the order adjusted for fees + */ + getFeeAdjustedRateOfOrder(order: Order, feeRate: BigNumber = constants.ZERO_AMOUNT): BigNumber { + assert.doesConformToSchema('order', order, schemas.orderSchema); + assert.isBigNumber('feeRate', feeRate); + assert.assert( + feeRate.gte(constants.ZERO_AMOUNT), + `Expected feeRate: ${feeRate} to be greater than or equal to 0`, + ); + const takerAssetAmountNeededToPayForFees = order.takerFee.mul(feeRate); + const totalTakerAssetAmount = takerAssetAmountNeededToPayForFees.plus(order.takerAssetAmount); + const rate = totalTakerAssetAmount.div(order.makerAssetAmount); + return rate; + }, + /** + * Takes a fee order (makerAssetData corresponds to ZRX and takerAssetData corresponds to WETH) and calculates + * the fee adjusted rate (WETH/ZRX) by dividing the takerAssetAmount by the makerAmount minus the takerFee + * @param feeOrder An object that conforms to the order interface + * @return The rate (WETH/ZRX) of the fee order adjusted for fees + */ + getFeeAdjustedRateOfFeeOrder(feeOrder: Order): BigNumber { + assert.doesConformToSchema('feeOrder', feeOrder, schemas.orderSchema); + const zrxAmountAfterFees = feeOrder.makerAssetAmount.sub(feeOrder.takerFee); + assert.assert( + zrxAmountAfterFees.greaterThan(constants.ZERO_AMOUNT), + `Expected takerFee: ${JSON.stringify(feeOrder.takerFee)} to be less than makerAssetAmount: ${JSON.stringify( + feeOrder.makerAssetAmount, + )}`, + ); + const rate = feeOrder.takerAssetAmount.div(zrxAmountAfterFees); + return rate; + }, +}; |