import BigNumber from 'bignumber.js';

export function sortReserveCoinDenoms(x, y) {
  return [x, y].sort();
}

export function calculatePairAmount(inputAmount: string | number, state) {
  const {
    tokenB,
    tokenA,
    tokenBPoolAmount,
    tokenAPoolAmount,
    coinDecimalsA,
    coinDecimalsB,
    isReverse,
  } = state;

  let counterPairAmount = new BigNumber(0);
  let swapPrice = new BigNumber(0);
  let price = new BigNumber(0);
  const feeRatio = new BigNumber(0.003);
  const swapFeeRatio = new BigNumber(1).minus(feeRatio);

  const poolAmountA = new BigNumber(tokenAPoolAmount);
  const poolAmountB = new BigNumber(tokenBPoolAmount);

  const powA = new BigNumber(1).multipliedBy(new BigNumber(10).pow(coinDecimalsA));
  const powB = new BigNumber(1).multipliedBy(new BigNumber(10).pow(coinDecimalsB));

  const amount = new BigNumber(inputAmount).multipliedBy(isReverse ? powB : powA);

  const amount2 = amount.multipliedBy(2);

  const isPoolPair = [tokenA, tokenB].sort()[0] === tokenA;

  let poolCoins: BigNumber[] = [];

  if (isPoolPair) {
    poolCoins = [poolAmountA, poolAmountB];
  } else {
    poolCoins = [poolAmountB, poolAmountA];
  }

  if ((isPoolPair && !isReverse) || (!isPoolPair && isReverse)) {
    swapPrice = poolCoins[1].dividedBy(poolCoins[0].plus(amount2));
    price = new BigNumber(1).dividedBy(swapPrice);
  }

  if ((isPoolPair && isReverse) || (!isPoolPair && !isReverse)) {
    swapPrice = poolCoins[0].dividedBy(poolCoins[1].plus(amount2));
    price = new BigNumber(swapPrice);
  }

  if (isReverse) {
    counterPairAmount = amount
      .multipliedBy(swapPrice.multipliedBy(new BigNumber(1).plus(feeRatio)))
      .dividedBy(powA)
      .dp(coinDecimalsA, BigNumber.ROUND_FLOOR);
  } else {
    counterPairAmount = amount
      .multipliedBy(swapPrice.multipliedBy(swapFeeRatio))
      .dividedBy(powB)
      .dp(coinDecimalsB, BigNumber.ROUND_FLOOR);
  }

  return { counterPairAmount, price };
}

Synonyms

soft3.js/examples/utils.ts
cyb/src/utils/utils.ts
pussy-ts/src/utils/utils.ts
bostrom.network/src/lib/utils.ts
pussy-ts/src/services/ibc-history/utils.ts
cyb/src/services/CozoDb/utils.ts
cyb/src/features/ibc-history/utils.ts
cyb/src/containers/mint/utils.ts
cyb/src/containers/portal/utils.ts
pussy-ts/src/containers/portal/utils.ts
cyb/src/utils/search/utils.ts
pussy-ts/src/services/CozoDb/utils.ts
pussy-ts/src/utils/search/utils.ts
cyb/src/containers/warp/utils.ts
cyb/src/components/time/utils.ts
pussy-ts/src/containers/warp/utils.ts
pussy-ts/src/pages/teleport/swap/utils.ts
cyb/src/features/studio/utils/utils.ts
cyb/src/containers/sigma/hooks/utils.ts
cyb/src/pages/robot/Brain/utils.ts
cyb/src/services/backend/services/sync/utils.ts
pussy-ts/src/services/backend/services/sync/utils.ts
cyb/src/pages/teleport/components/Inputs/utils.ts
pussy-ts/src/services/backend/services/indexer/utils.ts
pussy-ts/src/services/backend/services/lcd/utils.ts
pussy-ts/src/pages/teleport/components/Inputs/utils.ts
cyb/src/features/studio/components/Editor/utils/utils.ts
cyb/src/pages/robot/_refactor/account/tabs/feeds/utils.ts

Neighbours