merged with develop

This commit is contained in:
lomonoshka
2023-08-10 15:18:55 +03:00
28 changed files with 461 additions and 154 deletions

View File

@@ -5,23 +5,33 @@ import calculateServiceFeeInFeeAsset from './calculateServiceFeeInFeeAsset.js';
const calculateFeeInFeeAsset = (
amount: BigNumber.Value,
feeAssetPriceInServiceToken: BigNumber.Value,
baseAssetPriceInServiceToken: BigNumber.Value,
baseCurrencyPriceInServiceToken: BigNumber.Value,
gasPriceGwei: BigNumber.Value,
feePercent: BigNumber.Value,
baseAssetName: string,
baseCurrencyName: string,
feeAssetName: string,
prices: Partial<Record<string, string>>,
) => {
const feeAssetPrice = prices[feeAssetName];
if (feeAssetPrice === undefined) throw Error(`Fee asset price not found. Available prices: ${Object.keys(prices).join(', ')}`);
const baseAssetPrice = prices[baseAssetName];
if (baseAssetPrice === undefined) throw Error(`Base asset price not found. Available prices: ${Object.keys(prices).join(', ')}`);
const baseCurrencyPrice = prices[baseCurrencyName]; // ETH, BNB, MATIC, etc.
if (baseCurrencyPrice === undefined) throw Error(`Base currency price not found. Available prices: ${Object.keys(prices).join(', ')}`);
const serviceFeeInFeeAsset = calculateServiceFeeInFeeAsset(
amount,
feeAssetPriceInServiceToken,
baseAssetPriceInServiceToken,
baseAssetName,
feeAssetName,
feePercent,
prices,
);
const networkFeeInFeeAsset = calculateNetworkFeeInFeeAsset(
gasPriceGwei,
FILL_ORDERS_GAS_LIMIT,
baseCurrencyPriceInServiceToken,
feeAssetPriceInServiceToken,
baseCurrencyName,
feeAssetName,
prices,
);
return {

View File

@@ -1,22 +1,22 @@
import { BigNumber } from 'bignumber.js';
import type { BigNumber } from 'bignumber.js';
import calculateNetworkFee from './calculateNetworkFee.js';
import convertPrice from './convertPrice.js';
const calculateNetworkFeeInFeeAsset = (
gasPriceGwei: BigNumber.Value,
gasLimit: BigNumber.Value,
baseCurrencyPriceInServiceToken: BigNumber.Value,
feeAssetPriceInServiceToken: BigNumber.Value,
baseCurrencyName: string,
feeAssetName: string,
prices: Partial<Record<string, string>>
) => {
const networkFee = calculateNetworkFee(gasPriceGwei, gasLimit);
const networkFeeInServiceToken = new BigNumber(networkFee).multipliedBy(baseCurrencyPriceInServiceToken);
const networkFeeInFeeAsset = networkFeeInServiceToken
.multipliedBy(
new BigNumber(1)
.div(feeAssetPriceInServiceToken),
);
return networkFeeInFeeAsset.toString();
return convertPrice(
networkFee,
baseCurrencyName, // from
feeAssetName, // to
prices
);
};
export default calculateNetworkFeeInFeeAsset;

View File

@@ -1,16 +1,21 @@
import { BigNumber } from 'bignumber.js';
import convertPrice from './convertPrice.js';
export default function calculateServiceFeeInFeeAsset(
amount: BigNumber.Value,
feeAssetPriceInServiceToken: BigNumber.Value,
baseAssetPriceInServiceToken: BigNumber.Value,
baseAssetName: string,
feeAssetName: string,
feePercent: BigNumber.Value,
prices: Partial<Record<string, string>>
) {
const result = new BigNumber(amount)
.multipliedBy(new BigNumber(feePercent).div(100))
.multipliedBy(baseAssetPriceInServiceToken)
.multipliedBy(new BigNumber(1).div(feeAssetPriceInServiceToken))
.toString();
const feeAmount = new BigNumber(amount).multipliedBy(new BigNumber(feePercent).div(100));
return result;
const feeAssetAmount = convertPrice(
feeAmount,
baseAssetName,
feeAssetName,
prices
);
return feeAssetAmount;
}

26
src/utils/convertPrice.ts Normal file
View File

@@ -0,0 +1,26 @@
import { BigNumber } from 'bignumber.js';
export default function convertPrice(
amount: BigNumber.Value,
assetInName: string,
assetOutName: string,
prices: Partial<Record<string, string>> // quoted in quoteAsset. [name]: priceQuotedInQuoteAsset
) {
const assetInPrice = prices[assetInName];
if (assetInPrice === undefined) throw Error(`Price conversion: AssetIn (${assetInName}) price is undefined. Available prices: ${JSON.stringify(prices)}`);
const assetOutPrice = prices[assetOutName];
if (assetOutPrice === undefined) throw Error(`Price conversion: AssetOut (${assetOutName}) price is undefined. Available prices: ${JSON.stringify(prices)}`);
const assetInPriceBN = new BigNumber(assetInPrice);
const assetOutPriceBN = new BigNumber(assetOutPrice);
const assetInAmountBN = new BigNumber(amount);
const assetInAmountInQuoteAsset = assetInAmountBN.multipliedBy(assetInPriceBN);
const assetInAmountInQuoteAssetBN = new BigNumber(assetInAmountInQuoteAsset);
const assetOutAmountInQuoteAsset = assetInAmountInQuoteAssetBN.dividedBy(assetOutPriceBN);
return assetOutAmountInQuoteAsset;
}

View File

@@ -16,6 +16,7 @@ export { default as getNativeCryptocurrencyName } from './getNativeCryptocurrenc
export { default as laconicParse } from './laconic-parse.js';
export { default as isValidChainId } from './isValidChainId.js';
export { default as isKnownEnv } from './isKnownEnv.js';
export { default as removeFieldsFromObject } from './removeFieldsFromObject.js';
// export { default as HttpError } from './httpError';
export * from './typeHelpers.js';

View File

@@ -0,0 +1,16 @@
const removeFieldsFromObject = <
T extends Record<string, unknown>,
K extends keyof T
>(
obj: T,
fields: K[]
): Omit<T, K> => {
const result = { ...obj };
for (const field of fields) {
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
delete result[field];
}
return result;
};
export default removeFieldsFromObject;