aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/order-utils/src/index.ts1
-rw-r--r--packages/order-utils/src/rate_utils.ts44
2 files changed, 45 insertions, 0 deletions
diff --git a/packages/order-utils/src/index.ts b/packages/order-utils/src/index.ts
index 858f500c6..a52f936b6 100644
--- a/packages/order-utils/src/index.ts
+++ b/packages/order-utils/src/index.ts
@@ -33,3 +33,4 @@ export { EIP712Utils } from './eip712_utils';
export { OrderValidationUtils } from './order_validation_utils';
export { ExchangeTransferSimulator } from './exchange_transfer_simulator';
export { marketUtils } from './market_utils';
+export { rateUtils } from './rate_utils';
diff --git a/packages/order-utils/src/rate_utils.ts b/packages/order-utils/src/rate_utils.ts
new file mode 100644
index 000000000..212431e0c
--- /dev/null
+++ b/packages/order-utils/src/rate_utils.ts
@@ -0,0 +1,44 @@
+import { schemas } from '@0xproject/json-schemas';
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { assert } from './assert';
+import { constants } from './constants';
+
+export const rateUtils = {
+ /**
+ * Takes a signed 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 signedOrder An object that conforms to the signedOrder 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)
+ * @return The rate (takerAsset/makerAsset) of the order adjusted for fees
+ */
+ getFeeAdjustedRateOfOrder(signedOrder: SignedOrder, feeRate: BigNumber): BigNumber {
+ assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
+ assert.isBigNumber('feeRate', feeRate);
+ assert.assert(feeRate.greaterThan(constants.ZERO_AMOUNT), `Expected feeRate: ${feeRate} to be greater than 0`);
+ const takerAssetAmountNeededToPayForFees = signedOrder.takerFee.mul(feeRate);
+ const totalTakerAssetAmount = takerAssetAmountNeededToPayForFees.plus(signedOrder.takerAssetAmount);
+ const rate = totalTakerAssetAmount.div(signedOrder.makerAssetAmount);
+ return rate;
+ },
+ /**
+ * Takes a signed 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 signedFeeOrder An object that conforms to the signedOrder interface
+ * @return The rate (WETH/ZRX) of the fee order adjusted for fees
+ */
+ getFeeAdjustedRateOfFeeOrder(signedFeeOrder: SignedOrder): BigNumber {
+ assert.doesConformToSchema('signedFeeOrder', signedFeeOrder, schemas.signedOrderSchema);
+ const zrxAmountAfterFees = signedFeeOrder.makerAssetAmount.sub(signedFeeOrder.takerFee);
+ assert.assert(
+ zrxAmountAfterFees.greaterThan(constants.ZERO_AMOUNT),
+ `Expected takerFee: ${JSON.stringify(
+ signedFeeOrder.takerFee,
+ )} to be less than makerAssetAmount: ${JSON.stringify(signedFeeOrder.makerAssetAmount)}`,
+ );
+ const rate = signedFeeOrder.takerAssetAmount.div(zrxAmountAfterFees);
+ return rate;
+ },
+};