{"version":3,"sources":["../src/version.ts","../src/positions.ts","../src/constants.ts","../src/utils.ts","../src/account.ts","../src/order.ts"],"sourcesContent":["declare global {\n  interface Window {\n    __ORDERLY_VERSION__?: {\n      [key: string]: string;\n    };\n  }\n}\nif (typeof window !== \"undefined\") {\n  window.__ORDERLY_VERSION__ = window.__ORDERLY_VERSION__ || {};\n  window.__ORDERLY_VERSION__[\"@kodiak-finance/orderly-perp\"] = \"4.7.4\";\n}\n\nexport default \"4.7.4\";\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\nimport { IMRFactorPower } from \"./constants\";\nimport { DMax } from \"./utils\";\n\nconst MaxIterates = 30;\nconst CONVERGENCE_THRESHOLD = 0.0001;\n\n/**\n * Calculates the notional value of a single position.\n * @param qty The quantity of the position.\n * @param mark_price The price of the position.\n * @returns The notional value of the position.\n */\nexport function notional(qty: number, mark_price: number): number {\n  return new Decimal(qty).mul(mark_price).abs().toNumber();\n}\n\n/**\n * Calculates the total notional value of all positions.\n * @param positions The array of positions.\n * @returns The total notional value of all positions.\n */\nexport function totalNotional(positions: API.Position[]): number {\n  return positions.reduce((acc, cur) => {\n    return acc + notional(cur.position_qty, cur.mark_price);\n  }, 0);\n}\n\nexport type UnrealPnLInputs = {\n  markPrice: number;\n  openPrice: number;\n  qty: number;\n};\n\n/**\n * Calculates the unrealized profit or loss of a single position.\n * @param inputs The inputs for calculating the unrealized profit or loss.\n * @returns The unrealized profit or loss of the position.\n */\nexport function unrealizedPnL(inputs: UnrealPnLInputs): number {\n  return new Decimal(inputs.qty)\n    .mul(inputs.markPrice - inputs.openPrice)\n    .toNumber();\n}\n\nexport type UnrealPnLROIInputs = {\n  positionQty: number;\n  openPrice: number;\n  IMR: number;\n  unrealizedPnL: number;\n};\n\n/**\n * Calculates the return on investment (ROI) of a single position's unrealized profit or loss.\n * @param inputs The inputs for calculating the ROI.\n * @returns The ROI of the position's unrealized profit or loss.\n */\nexport function unrealizedPnLROI(inputs: UnrealPnLROIInputs): number {\n  const { openPrice, IMR } = inputs;\n\n  if (\n    inputs.unrealizedPnL === 0 ||\n    inputs.positionQty === 0 ||\n    openPrice === 0 ||\n    IMR === 0\n  )\n    return 0;\n\n  return new Decimal(inputs.unrealizedPnL)\n    .div(new Decimal(Math.abs(inputs.positionQty)).mul(openPrice).mul(IMR))\n    .toNumber();\n}\n\n/**\n * Calculates the total unrealized profit or loss of all positions.\n * @param positions The array of positions.\n * @returns The total unrealized profit or loss of all positions.\n */\nexport function totalUnrealizedPnL(positions: API.Position[]): number {\n  return positions.reduce((acc, cur) => {\n    return (\n      acc +\n      unrealizedPnL({\n        qty: cur.position_qty,\n        openPrice: cur.average_open_price,\n        markPrice: cur.mark_price,\n      })\n    );\n  }, 0);\n}\n\nconst mmForOtherSymbols = (\n  positions: Pick<API.Position, \"position_qty\" | \"mark_price\" | \"mmr\">[],\n) => {\n  // sum_i ( abs(position_qty_i) * mark_price_i * mmr_i )\n  return positions.reduce<Decimal>((acc, cur) => {\n    return acc.add(\n      new Decimal(cur.position_qty).abs().mul(cur.mark_price).mul(cur.mmr),\n    );\n  }, zero);\n};\n\n/**\n * Calculates the liquidation price based on the formula:\n * return max(mark_price + [total_collateral - abs(position_qty) * mark_price * mmr - mm_for_other_symbols] / [abs(position_qty) * mmr - position_qty], 0)\n *\n * Note: The condition check \"if position_qty >= 0 AND abs(position_qty) * mmr - position_qty >= 0\" from the formula\n * has been removed as it was causing issues with SHORT position calculations.\n */\nconst calculateLiqPrice = (\n  // symbol: string,\n  markPrice: number,\n  positionQty: number,\n  MMR: number,\n  totalCollateral: number,\n  positions: Pick<API.Position, \"position_qty\" | \"mark_price\" | \"mmr\">[],\n): Decimal => {\n  const decimalMarkPrice = new Decimal(markPrice);\n  const absQty = new Decimal(positionQty).abs();\n  const denominator = absQty.mul(MMR).sub(positionQty);\n\n  const liqPrice = new Decimal(totalCollateral)\n    .sub(absQty.mul(decimalMarkPrice).mul(MMR))\n    .sub(mmForOtherSymbols(positions))\n    .div(denominator)\n    .add(decimalMarkPrice);\n\n  return DMax(liqPrice, zero);\n};\n\nconst compareCollateralWithMM = (\n  // price: number,\n  inputs: {\n    totalCollateral: number;\n    positionQty: number;\n    markPrice: number;\n    baseMMR: number;\n    baseIMR: number;\n    IMRFactor: number;\n    // IMRFactorPower: number;\n    positions: Pick<\n      API.PositionExt,\n      \"position_qty\" | \"mark_price\" | \"mmr\" | \"symbol\"\n    >[];\n  },\n) => {\n  return (price: Decimal) => {\n    const {\n      totalCollateral,\n      positionQty,\n      markPrice,\n      baseMMR,\n      baseIMR,\n      IMRFactor,\n      positions,\n    } = inputs;\n    const decimalPositionQty = new Decimal(positionQty);\n    const collateral = new Decimal(totalCollateral)\n      .sub(decimalPositionQty.mul(markPrice))\n      .add(decimalPositionQty.mul(price));\n\n    const mm = decimalPositionQty\n      .abs()\n      .mul(price)\n      .mul(\n        Math.max(\n          baseMMR,\n          new Decimal(baseMMR)\n            .div(baseIMR)\n            .mul(IMRFactor)\n            .mul(decimalPositionQty.mul(price).abs().toPower(IMRFactorPower))\n            .toNumber(),\n        ),\n      )\n      .add(mmForOtherSymbols(positions));\n\n    // console.log(\"*****\", {\n    //   collateral: collateral.toNumber(),\n    //   mm: mm.toNumber(),\n    // });\n\n    return collateral.gte(mm);\n  };\n};\n\nexport const liqPrice = (inputs: {\n  markPrice: number;\n  symbol: string;\n  totalCollateral: number;\n  positionQty: number;\n  positions: Pick<\n    API.PositionExt,\n    \"position_qty\" | \"mark_price\" | \"mmr\" | \"symbol\"\n  >[];\n  MMR: number;\n  baseMMR: number;\n  baseIMR: number;\n  IMRFactor: number;\n  costPosition: number;\n}) => {\n  const {\n    positionQty,\n    markPrice,\n    totalCollateral,\n    positions,\n    MMR,\n    baseMMR,\n    baseIMR,\n    IMRFactor,\n    symbol,\n  } = inputs;\n\n  if (positionQty === 0 || totalCollateral === 0) {\n    return null;\n  }\n  const isLONG = positionQty > 0;\n\n  const otherPositions = positions.filter((item) => item.symbol !== symbol);\n\n  if (isLONG) {\n    let liqPriceLeft = calculateLiqPrice(\n      markPrice,\n      positionQty,\n      baseMMR,\n      totalCollateral,\n      otherPositions,\n    );\n    let liqPriceRight = calculateLiqPrice(\n      markPrice,\n      positionQty,\n      MMR,\n      totalCollateral,\n      otherPositions,\n    );\n\n    const compareCollateralWithMMFunc = compareCollateralWithMM({\n      totalCollateral,\n      positionQty,\n      markPrice,\n      baseIMR,\n      baseMMR,\n      IMRFactor,\n      positions: otherPositions,\n    });\n\n    for (let i = 0; i < MaxIterates; i++) {\n      if (liqPriceLeft.gte(liqPriceRight)) {\n        return liqPriceRight.toNumber();\n      }\n\n      const mid = new Decimal(liqPriceLeft).add(liqPriceRight).div(2);\n\n      if (compareCollateralWithMMFunc(mid)) {\n        liqPriceRight = mid;\n      } else {\n        liqPriceLeft = mid;\n      }\n\n      if (\n        liqPriceRight\n          .sub(liqPriceLeft)\n          .div(liqPriceLeft.add(liqPriceRight))\n          .mul(2)\n          .lte(CONVERGENCE_THRESHOLD)\n      ) {\n        break;\n      }\n    }\n    return liqPriceRight.toNumber();\n  } else {\n    // const decimalBaseMMR = new Decimal(baseMMR);\n    let liqPriceRight = calculateLiqPrice(\n      markPrice,\n      positionQty,\n      MMR,\n      totalCollateral,\n      otherPositions,\n    );\n\n    let liqPriceLeft = calculateLiqPrice(\n      markPrice,\n      positionQty,\n      Math.max(\n        baseIMR,\n        new Decimal(baseMMR)\n          .div(baseIMR)\n          .mul(IMRFactor)\n          .mul(\n            new Decimal(positionQty)\n              .mul(liqPriceRight)\n              .abs()\n              .toPower(IMRFactorPower),\n          )\n          .toNumber(),\n      ),\n      totalCollateral,\n      otherPositions,\n    );\n\n    const compareCollateralWithMMFunc = compareCollateralWithMM({\n      totalCollateral,\n      positionQty,\n      markPrice,\n      baseMMR,\n      baseIMR,\n      IMRFactor,\n      positions: otherPositions,\n    });\n\n    for (let i = 0; i < MaxIterates; i++) {\n      if (liqPriceLeft.gte(liqPriceRight)) {\n        return liqPriceLeft.toNumber();\n      }\n\n      const mid = liqPriceLeft.add(liqPriceRight).div(2);\n\n      if (compareCollateralWithMMFunc(mid)) {\n        liqPriceLeft = mid;\n      } else {\n        liqPriceRight = mid;\n      }\n\n      if (\n        liqPriceRight\n          .sub(liqPriceLeft)\n          .div(liqPriceLeft.add(liqPriceRight))\n          .mul(2)\n          .lte(CONVERGENCE_THRESHOLD)\n      ) {\n        break;\n      }\n\n      // return liqPriceLeft.toNumber();\n    }\n\n    return liqPriceLeft.toNumber();\n  }\n};\n\nexport type MMInputs = {\n  positionQty: number;\n  markPrice: number;\n  MMR: number;\n};\n\n/**\n * Calculates the maintenance margin of a position.\n * @param inputs The inputs for calculating the maintenance margin.\n * @returns The maintenance margin of the position.\n */\nexport function maintenanceMargin(inputs: MMInputs) {\n  const { positionQty, markPrice, MMR } = inputs;\n\n  return new Decimal(positionQty).mul(markPrice).mul(MMR).abs().toNumber();\n}\n\nexport type UnsettlementPnLInputs = {\n  positionQty: number;\n  markPrice: number;\n  costPosition: number;\n  sumUnitaryFunding: number;\n  lastSumUnitaryFunding: number;\n};\n\n/**\n * Calculates the unrealized profit or loss of each position.\n * @param inputs The inputs for calculating the unrealized profit or loss.\n * @returns The unrealized profit or loss of each position.\n */\nexport function unsettlementPnL(inputs: UnsettlementPnLInputs): number {\n  const {\n    positionQty,\n    markPrice,\n    costPosition,\n    sumUnitaryFunding,\n    lastSumUnitaryFunding,\n  } = inputs;\n\n  const qty = new Decimal(positionQty);\n\n  return qty\n    .mul(markPrice)\n    .sub(costPosition)\n    .sub(qty.mul(new Decimal(sumUnitaryFunding).sub(lastSumUnitaryFunding)))\n    .toNumber();\n}\n\nexport type TotalUnsettlementPnLInputs = {\n  positions: (API.Position & {\n    sum_unitary_funding: number;\n  })[];\n  sumUnitaryFunding: number;\n};\n\n/**\n * Calculates the total unrealized profit or loss of all positions.\n * @param positions The array of positions.\n * @returns The total unrealized profit or loss of all positions.\n */\nexport function totalUnsettlementPnL(\n  positions: (API.Position & { sum_unitary_funding: number })[],\n): number {\n  if (!Array.isArray(positions) || positions.length === 0) {\n    return 0;\n  }\n\n  return positions.reduce((acc, cur) => {\n    return (\n      acc +\n      unsettlementPnL({\n        positionQty: cur.position_qty,\n        markPrice: cur.mark_price,\n        costPosition: cur.cost_position,\n        sumUnitaryFunding: cur.sum_unitary_funding,\n        lastSumUnitaryFunding: cur.last_sum_unitary_funding,\n      })\n    );\n  }, 0);\n}\n\nexport type MMRInputs = {\n  baseMMR: number;\n  baseIMR: number;\n  IMRFactor: number;\n  positionNotional: number;\n  IMR_factor_power: number;\n};\n\n/**\n * Calculates the maintenance margin requirement (MMR) of a position.\n * @param inputs The inputs for calculating the MMR.\n * @returns The MMR of the position.\n */\nexport function MMR(inputs: MMRInputs): number {\n  const {\n    baseMMR,\n    baseIMR,\n    IMRFactor,\n    positionNotional,\n    IMR_factor_power = IMRFactorPower,\n  } = inputs;\n  return Math.max(\n    baseMMR,\n    new Decimal(baseMMR)\n      .div(baseIMR)\n      .mul(IMRFactor)\n      .mul(Math.pow(Math.abs(positionNotional), IMR_factor_power))\n      // .toPower(IMR_factor_power)\n      .toNumber(),\n  );\n}\n\n/**\n * Calculates the profit or loss for take profit.\n * @returns The profit or loss for take profit.\n */\nexport function estPnLForTP(inputs: {\n  positionQty: number;\n  entryPrice: number;\n  price: number;\n}): number {\n  return new Decimal(inputs.positionQty)\n    .mul(new Decimal(inputs.price).sub(inputs.entryPrice))\n    .toNumber();\n}\n\n/**\n * Calculates the estimated price for take profit.\n * This is the inverse of estPnLForTP: given PnL, calculates the price.\n * Formula: price = PnL / positionQty + entryPrice\n */\nexport function estPriceForTP(inputs: {\n  positionQty: number;\n  entryPrice: number;\n  pnl: number;\n}): number {\n  return new Decimal(inputs.pnl)\n    .div(inputs.positionQty)\n    .add(inputs.entryPrice)\n    .toNumber();\n}\n\n/**\n * Calculates the estimated offset for take profit.\n */\nexport function estOffsetForTP(inputs: {\n  price: number;\n  entryPrice: number;\n}): number {\n  return new Decimal(inputs.price).div(inputs.entryPrice).toNumber();\n}\n\n/**\n * Calculates the estimated price from offset for take profit.\n */\nexport function estPriceFromOffsetForTP(inputs: {\n  offset: number;\n  entryPrice: number;\n}): number {\n  return new Decimal(inputs.offset).add(inputs.entryPrice).toNumber();\n}\n\n/**\n * Calculates the PnL for stop loss.\n */\nexport function estPnLForSL(inputs: {\n  positionQty: number;\n  entryPrice: number;\n}): number {\n  return 0;\n}\n\n/**\n * calculate the max position notional\n * max_notional = ( (1/ (leverage * imr_factor) ) ^ (1/0.8)\n */\nexport function maxPositionNotional(inputs: {\n  /** symbol leverage */\n  leverage: number;\n  IMRFactor: number;\n}) {\n  const { leverage, IMRFactor } = inputs;\n  return new Decimal(1)\n    .div(new Decimal(leverage).mul(IMRFactor))\n    .pow(1 / 0.8)\n    .toNumber();\n}\n\n/**\n * symbol_leverage_max = 1 / ( imr_factor * notional ^ 0.8 )\n */\nexport function maxPositionLeverage(inputs: {\n  IMRFactor: number;\n  notional: number;\n}) {\n  const { IMRFactor, notional } = inputs;\n  return new Decimal(1)\n    .div(new Decimal(IMRFactor).mul(new Decimal(notional).pow(0.8)))\n    .toNumber();\n}\n","/**\n * The power of the IMR factor.\n * @constant\n * @default\n */\nexport const IMRFactorPower = 4 / 5;\n","import { Decimal } from \"@kodiak-finance/orderly-utils\";\n\n/**\n * Returns the maximum value among the given Decimal or number values.\n * Similar to Math.max but works with Decimal instances.\n * @param values - Variable number of Decimal instances or numbers to compare\n * @returns The maximum value as a Decimal instance\n */\nexport const DMax = (...values: (Decimal | number)[]): Decimal => {\n  if (values.length === 0) {\n    throw new Error(\"DMax requires at least one argument\");\n  }\n\n  // Convert all values to Decimal instances\n  const decimals = values.map((val) =>\n    val instanceof Decimal ? val : new Decimal(val),\n  );\n\n  // Find the maximum by comparing each value\n  let max = decimals[0];\n  for (let i = 1; i < decimals.length; i++) {\n    if (decimals[i].gte(max)) {\n      max = decimals[i];\n    }\n  }\n\n  return max;\n};\n","import { API, OrderSide } from \"@kodiak-finance/orderly-types\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\nimport { IMRFactorPower } from \"./constants\";\n\nexport type ResultOptions = {\n  dp: number;\n};\n\nexport type TotalValueInputs = {\n  totalUnsettlementPnL: number;\n\n  USDCHolding: number;\n  nonUSDCHolding: {\n    holding: number;\n    indexPrice: number;\n  }[];\n};\n\n/**\n * User's total asset value (denominated in USDC), including assets that cannot be used as collateral.\n */\nexport function totalValue(inputs: TotalValueInputs): Decimal {\n  const { totalUnsettlementPnL, USDCHolding, nonUSDCHolding } = inputs;\n  const nonUSDCHoldingValue = nonUSDCHolding.reduce((acc, cur) => {\n    return new Decimal(cur.holding).mul(cur.indexPrice).add(acc);\n  }, zero);\n  return nonUSDCHoldingValue.add(USDCHolding).add(totalUnsettlementPnL);\n}\n\n/**\n * Total value of available collateral in the user's account (denominated in USDC).\n */\nexport type FreeCollateralInputs = {\n  // Total collateral\n  totalCollateral: Decimal;\n  // Total initial margin with orders\n  totalInitialMarginWithOrders: number;\n};\n/**\n * Calculate free collateral.\n */\nexport function freeCollateral(inputs: FreeCollateralInputs): Decimal {\n  const value = inputs.totalCollateral.sub(inputs.totalInitialMarginWithOrders);\n  // free collateral cannot be less than 0\n  return value.isNegative() ? zero : value;\n}\n\nexport type TotalCollateralValueInputs = {\n  USDCHolding: number;\n  nonUSDCHolding: {\n    holding: number;\n    indexPrice: number;\n    collateralCap: number;\n    collateralRatio: Decimal;\n  }[];\n  unsettlementPnL: number;\n};\n\n/**\n * Calculate total collateral.\n */\nexport function totalCollateral(inputs: TotalCollateralValueInputs): Decimal {\n  const { USDCHolding, nonUSDCHolding, unsettlementPnL } = inputs;\n  const nonUSDCHoldingValue = nonUSDCHolding.reduce<Decimal>((acc, cur) => {\n    const finalHolding = Math.min(cur.holding, cur.collateralCap);\n    const value = new Decimal(finalHolding)\n      .mul(cur.collateralRatio)\n      .mul(cur.indexPrice);\n    return acc.add(value);\n  }, zero);\n\n  return new Decimal(USDCHolding).add(nonUSDCHoldingValue).add(unsettlementPnL);\n}\n\nexport function initialMarginWithOrder() {}\n\nexport type PositionNotionalWithOrderInputs = {\n  markPrice: number;\n  positionQtyWithOrders: number;\n};\n/**\n * Sum of notional value for a symbol's position and orders.\n */\nexport function positionNotionalWithOrder_by_symbol(\n  inputs: PositionNotionalWithOrderInputs,\n): Decimal {\n  return new Decimal(inputs.markPrice).mul(inputs.positionQtyWithOrders);\n}\n\nexport type PositionQtyWithOrderInputs = {\n  positionQty: number;\n  // Total quantity of buy orders for a symbol\n  buyOrdersQty: number;\n  // Total quantity of sell orders for a symbol\n  sellOrdersQty: number;\n};\n/**\n *  Sum of position quantity and orders quantity for a symbol.\n */\nexport function positionQtyWithOrders_by_symbol(\n  inputs: PositionQtyWithOrderInputs,\n): number {\n  const { positionQty, buyOrdersQty, sellOrdersQty } = inputs;\n  const positionQtyDecimal = new Decimal(positionQty);\n  const qty = Math.max(\n    positionQtyDecimal.add(buyOrdersQty).abs().toNumber(),\n    positionQtyDecimal.sub(sellOrdersQty).abs().toNumber(),\n  );\n\n  return qty;\n}\n\nexport type IMRInputs = {\n  /**\n   * effective max leverage\n   */\n  maxLeverage: number;\n  baseIMR: number;\n  IMR_Factor: number;\n  positionNotional: number;\n  ordersNotional: number;\n  IMR_factor_power?: number;\n};\n\n/**\n * Initial margin rate for a symbol.\n * Max(1 / Max Account Leverage, Base IMR i, IMR Factor i * Abs(Position Notional i + Order Notional i)^(4/5))\n */\nexport function IMR(inputs: IMRInputs): number {\n  const {\n    maxLeverage,\n    baseIMR,\n    IMR_Factor,\n    positionNotional,\n    ordersNotional: orderNotional,\n    IMR_factor_power = IMRFactorPower,\n  } = inputs;\n  return Math.max(\n    1 / maxLeverage,\n    baseIMR,\n    new Decimal(IMR_Factor)\n      .mul(\n        new Decimal(positionNotional)\n          .add(orderNotional)\n          .abs()\n          .toPower(IMR_factor_power),\n      )\n      .toNumber(),\n  );\n}\n\nexport function buyOrdersFilter_by_symbol(\n  orders: API.Order[],\n  symbol: string,\n): API.Order[] {\n  return orders.filter(\n    (item) => item.symbol === symbol && item.side === OrderSide.BUY,\n  );\n}\n\nexport function sellOrdersFilter_by_symbol(\n  orders: API.Order[],\n  symbol: string,\n): API.Order[] {\n  return orders.filter(\n    (item) => item.symbol === symbol && item.side === OrderSide.SELL,\n  );\n}\n\n/**\n * Get the quantity of a specified symbol from the list of positions.\n */\nexport function getQtyFromPositions(\n  positions: API.Position[],\n  symbol: string,\n): number {\n  if (!positions) {\n    return 0;\n  }\n  const position = positions.find((item) => item.symbol === symbol);\n  return position?.position_qty || 0;\n}\n\n/**\n * Get the quantity of long and short orders for a specified symbol from the list of orders.\n */\nexport function getQtyFromOrdersBySide(\n  orders: API.Order[],\n  symbol: string,\n  side: OrderSide,\n): number {\n  const ordersBySide =\n    side === OrderSide.SELL\n      ? sellOrdersFilter_by_symbol(orders, symbol)\n      : buyOrdersFilter_by_symbol(orders, symbol);\n  return ordersBySide.reduce((acc, cur) => {\n    return acc + cur.quantity;\n  }, 0);\n}\n\nexport function getPositonsAndOrdersNotionalBySymbol(inputs: {\n  positions: API.Position[];\n  orders: API.Order[];\n  symbol: string;\n  markPrice: number;\n}): number {\n  const { positions, orders, symbol, markPrice } = inputs;\n  const positionQty = getQtyFromPositions(positions, symbol);\n  const buyOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.BUY);\n  const sellOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.SELL);\n\n  const markPriceDecimal = new Decimal(markPrice);\n\n  return markPriceDecimal\n    .mul(positionQty)\n    .add(markPriceDecimal.mul(new Decimal(buyOrdersQty).add(sellOrdersQty)))\n    .abs()\n    .toNumber();\n}\n\nexport type TotalInitialMarginWithOrdersInputs = {\n  positions: API.Position[];\n  orders: API.Order[];\n  // account: API.AccountInfo;\n  markPrices: { [key: string]: number };\n  symbolInfo: any;\n  IMR_Factors: { [key: string]: number };\n} & Pick<IMRInputs, \"maxLeverage\">;\n\n/**\n * @deprecated\n * Calculate the total initial margin used by the user (including positions and orders).\n */\nexport function totalInitialMarginWithOrders(\n  inputs: TotalInitialMarginWithOrdersInputs,\n): number {\n  const {\n    positions,\n    orders,\n    markPrices,\n    IMR_Factors,\n    maxLeverage,\n    symbolInfo,\n  } = inputs;\n\n  const symbols = extractSymbols(positions, orders);\n\n  const total_initial_margin_with_orders = symbols.reduce((acc, cur) => {\n    const symbol = cur;\n    const positionQty = getQtyFromPositions(positions, symbol);\n    const buyOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.BUY);\n    const sellOrdersQty = getQtyFromOrdersBySide(\n      orders,\n      symbol,\n      OrderSide.SELL,\n    );\n\n    const markPrice = markPrices[symbol] || 0;\n\n    //---\n    const positionQtyWithOrders = positionQtyWithOrders_by_symbol({\n      positionQty,\n      buyOrdersQty,\n      sellOrdersQty,\n    });\n\n    //---\n    const position_notional_with_orders = positionNotionalWithOrder_by_symbol({\n      markPrice,\n      positionQtyWithOrders,\n    });\n\n    //----\n    const markPriceDecimal = new Decimal(markPrice);\n\n    const imr = IMR({\n      positionNotional: markPriceDecimal.mul(positionQty).toNumber(),\n      ordersNotional: markPriceDecimal\n        .mul(new Decimal(buyOrdersQty).add(sellOrdersQty))\n        .toNumber(),\n      maxLeverage,\n      IMR_Factor: IMR_Factors[symbol],\n      baseIMR: symbolInfo[symbol](\"base_imr\", 0),\n    });\n\n    return position_notional_with_orders.mul(imr).add(acc).toNumber();\n  }, 0);\n\n  return total_initial_margin_with_orders;\n}\n\nexport function totalInitialMarginWithQty(inputs: {\n  positions: API.Position[];\n  // account: API.AccountInfo;\n  markPrices: { [key: string]: number };\n  symbolInfo: any;\n  IMR_Factors: { [key: string]: number };\n  /**\n   * account max leverage\n   */\n  maxLeverage: number;\n}) {\n  const { positions, markPrices, IMR_Factors, symbolInfo } = inputs;\n  const symbols = positions.map((item) => item.symbol);\n\n  const total_initial_margin_with_orders = symbols.reduce((acc, cur) => {\n    const symbol = cur;\n    const position = positions.find((item) => item.symbol === symbol);\n    const positionQty = position?.position_qty || 0;\n\n    const buyOrdersQty = position?.pending_long_qty || 0;\n    const sellOrdersQty = position?.pending_short_qty || 0;\n\n    const markPrice = markPrices[symbol] || 0;\n\n    //---\n    const positionQtyWithOrders = positionQtyWithOrders_by_symbol({\n      positionQty,\n      buyOrdersQty,\n      sellOrdersQty,\n    });\n\n    //---\n    const position_notional_with_orders = positionNotionalWithOrder_by_symbol({\n      markPrice,\n      positionQtyWithOrders,\n    });\n\n    //----\n    const markPriceDecimal = new Decimal(markPrice);\n\n    const imr = IMR({\n      positionNotional: markPriceDecimal.mul(positionQty).toNumber(),\n      ordersNotional: markPriceDecimal\n        .mul(new Decimal(buyOrdersQty).add(sellOrdersQty))\n        .toNumber(),\n      maxLeverage: maxLeverage({\n        symbolLeverage: position?.leverage ?? inputs.maxLeverage,\n        accountLeverage: inputs.maxLeverage,\n      }),\n      IMR_Factor: IMR_Factors[symbol],\n      baseIMR: symbolInfo[symbol](\"base_imr\", 0),\n    });\n\n    return position_notional_with_orders.mul(imr).add(acc).toNumber();\n  }, 0);\n\n  return total_initial_margin_with_orders;\n}\n\n/**\n * Group orders by symbol, as a symbol can have multiple orders.\n */\nexport function groupOrdersBySymbol(orders: API.Order[]) {\n  const symbols: { [key: string]: API.Order[] } = {};\n\n  orders.forEach((item) => {\n    if (!symbols[item.symbol]) {\n      symbols[item.symbol] = [];\n    }\n\n    symbols[item.symbol].push(item);\n  });\n\n  return symbols;\n}\n\n/**\n * Extracts all unique symbols from positions and orders.\n * @param positions - An array of position objects.\n * @param orders - An array of order objects.\n * @returns An array of unique symbols.\n */\nexport function extractSymbols(\n  positions: Pick<API.Position, \"symbol\">[],\n  orders: Pick<API.Order, \"symbol\">[],\n): string[] {\n  const symbols = new Set<string>();\n\n  positions.forEach((item) => {\n    symbols.add(item.symbol);\n  });\n\n  orders.forEach((item) => {\n    symbols.add(item.symbol);\n  });\n\n  return Array.from(symbols);\n}\n\n//=========== max qty ==================\n\n// function otherIM(inputs: {}): number {}\n\nexport type OtherIMsInputs = {\n  // the position list for other symbols except the current symbol\n  positions: API.Position[];\n  markPrices: { [key: string]: number };\n  /**\n   * account max leverage\n   */\n  maxLeverage: number;\n  symbolInfo: any;\n  IMR_Factors: { [key: string]: number };\n};\n/**\n * Total margin used by other symbols (except the current symbol).\n */\nexport function otherIMs(inputs: OtherIMsInputs): number {\n  const {\n    // orders,\n    positions,\n    IMR_Factors,\n    symbolInfo,\n    markPrices,\n  } = inputs;\n\n  const symbols = positions.map((item) => item.symbol);\n\n  return symbols\n    .reduce((acc, cur) => {\n      const symbol = cur;\n\n      if (typeof markPrices[symbol] === \"undefined\") {\n        console.warn(\"markPrices[%s] is undefined\", symbol);\n        return acc;\n      }\n\n      const markPriceDecimal = new Decimal(markPrices[symbol] || 0);\n\n      const position = positions.find((item) => item.symbol === symbol);\n\n      const positionQty = getQtyFromPositions(positions, symbol);\n      const positionNotional = markPriceDecimal.mul(positionQty).toNumber();\n\n      const buyOrdersQty = position!.pending_long_qty;\n      const sellOrdersQty = position!.pending_short_qty;\n\n      const ordersNotional = markPriceDecimal\n        .mul(new Decimal(buyOrdersQty).add(sellOrdersQty))\n        .toNumber();\n\n      const IMR_Factor = IMR_Factors[symbol];\n\n      // IMR_Factor is possible to be 0\n      if (typeof IMR_Factor === \"undefined\") {\n        console.warn(\"IMR_Factor is not found:\", symbol);\n        return acc;\n      }\n\n      const imr = IMR({\n        maxLeverage: maxLeverage({\n          symbolLeverage: position!.leverage,\n          accountLeverage: inputs.maxLeverage,\n        }),\n        IMR_Factor,\n        baseIMR: symbolInfo[symbol](\"base_imr\", 0),\n        positionNotional,\n        ordersNotional,\n      });\n\n      const positionQtyWithOrders = positionQtyWithOrders_by_symbol({\n        positionQty,\n        buyOrdersQty,\n        sellOrdersQty,\n      });\n\n      const positionNotionalWithOrders = positionNotionalWithOrder_by_symbol({\n        markPrice: markPrices[symbol] || 0,\n        positionQtyWithOrders,\n      });\n\n      return acc.add(positionNotionalWithOrders.mul(imr));\n    }, zero)\n    .toNumber();\n}\n\nexport type MaxQtyInputs = {\n  symbol: string;\n\n  // Maximum quantity limit for opening a single position, /v1/public/info.base_max\n  baseMaxQty: number;\n  /**\n   * Total collateral of the user (denominated in USDC), can be calculated from totalCollateral.\n   * @see totalCollateral\n   */\n  totalCollateral: number;\n  maxLeverage: number;\n  baseIMR: number;\n  /**\n   * @see otherIMs\n   */\n  otherIMs: number;\n  markPrice: number;\n  // Quantity of open positions\n  positionQty: number;\n  // Quantity of long orders\n  buyOrdersQty: number;\n  // Quantity of short orders\n  sellOrdersQty: number;\n\n  IMR_Factor: number;\n\n  takerFeeRate: number;\n};\n\n/**\n * Maximum order quantity.\n */\nexport function maxQty(\n  side: OrderSide,\n  inputs: MaxQtyInputs,\n  options?: ResultOptions,\n): number {\n  if (side === OrderSide.BUY) {\n    return maxQtyByLong(inputs);\n  }\n  return maxQtyByShort(inputs);\n}\n\nexport function maxQtyByLong(\n  inputs: Omit<MaxQtyInputs, \"side\">,\n  options?: ResultOptions,\n): number {\n  try {\n    const {\n      baseMaxQty,\n      totalCollateral,\n      otherIMs,\n      maxLeverage,\n      baseIMR,\n      markPrice,\n      IMR_Factor,\n      positionQty,\n      buyOrdersQty,\n      takerFeeRate,\n    } = inputs;\n\n    if (totalCollateral === 0) {\n      return 0;\n    }\n\n    const totalCollateralDecimal = new Decimal(totalCollateral);\n\n    const factor_1 = totalCollateralDecimal\n      .sub(otherIMs)\n      .div(\n        new Decimal(takerFeeRate)\n          .mul(2)\n          .mul(0.0001)\n          .add(Math.max(1 / maxLeverage, baseIMR)),\n      )\n      .div(markPrice)\n      .mul(0.995)\n      .sub(new Decimal(positionQty).add(buyOrdersQty))\n      .toNumber();\n\n    if (positionQty === 0 && buyOrdersQty === 0) {\n      return Math.min(baseMaxQty, factor_1);\n    }\n\n    if (IMR_Factor === 0) {\n      return Math.min(baseMaxQty, factor_1);\n    }\n\n    const factor_2 = totalCollateralDecimal\n      .sub(otherIMs)\n      .div(IMR_Factor)\n      .toPower(1 / 1.8)\n      .div(markPrice)\n      .sub(\n        new Decimal(positionQty).add(buyOrdersQty),\n        // .abs()\n        // .div(new Decimal(takerFeeRate).mul(2).mul(0.0001).add(1))\n      )\n      .div(new Decimal(takerFeeRate).mul(2).mul(0.0001).add(1))\n      .mul(0.995)\n      .toNumber();\n\n    return Math.min(baseMaxQty, factor_1, factor_2);\n  } catch (error) {\n    return 0;\n  }\n}\n\nexport function maxQtyByShort(\n  inputs: Omit<MaxQtyInputs, \"side\">,\n  options?: ResultOptions,\n): number {\n  try {\n    const {\n      baseMaxQty,\n      totalCollateral,\n      otherIMs,\n      maxLeverage,\n      baseIMR,\n      markPrice,\n      IMR_Factor,\n      positionQty,\n      buyOrdersQty,\n      sellOrdersQty,\n      takerFeeRate,\n    } = inputs;\n\n    const totalCollateralDecimal = new Decimal(totalCollateral);\n\n    const factor_1 = totalCollateralDecimal\n      .sub(otherIMs)\n      .div(\n        new Decimal(takerFeeRate)\n          .mul(2)\n          .mul(0.0001)\n          .add(Math.max(1 / maxLeverage, baseIMR)),\n      )\n      .div(markPrice)\n      .mul(0.995)\n      // .add(new Decimal(positionQty).add(sellOrdersQty))\n      .add(positionQty)\n      .sub(Math.abs(sellOrdersQty))\n      .toNumber();\n\n    if (positionQty === 0 && sellOrdersQty === 0) {\n      return Math.min(baseMaxQty, factor_1);\n    }\n\n    if (IMR_Factor === 0) {\n      return Math.min(baseMaxQty, factor_1);\n    }\n\n    const factor_2 = totalCollateralDecimal\n      .sub(otherIMs)\n      .div(IMR_Factor)\n      .toPower(1 / 1.8)\n      .div(markPrice)\n      // .add(\n      // new Decimal(positionQty)\n      //   .add(sellOrdersQty)\n      //   // .abs()\n      //   )\n      .add(positionQty)\n      .sub(sellOrdersQty)\n      .div(new Decimal(takerFeeRate).mul(2).mul(0.0001).add(1))\n      .mul(0.995)\n      .toNumber();\n\n    return Math.min(baseMaxQty, factor_1, factor_2);\n  } catch (error) {\n    return 0;\n  }\n}\n\nexport type TotalMarginRatioInputs = {\n  totalCollateral: number;\n  markPrices: { [key: string]: number };\n  positions: API.Position[];\n};\n/**\n * total margin ratio\n */\nexport function totalMarginRatio(\n  inputs: TotalMarginRatioInputs,\n  dp?: number,\n): number {\n  const { totalCollateral, markPrices, positions } = inputs;\n\n  if (totalCollateral === 0) {\n    return 0;\n  }\n\n  const totalCollateralDecimal = new Decimal(totalCollateral);\n\n  const totalPositionNotional = positions.reduce((acc, cur) => {\n    const markPrice = markPrices[cur.symbol] || 0;\n    return acc.add(new Decimal(cur.position_qty).mul(markPrice).abs());\n  }, zero);\n\n  if (totalPositionNotional.eq(zero)) {\n    return 0;\n  }\n\n  return totalCollateralDecimal.div(totalPositionNotional).toNumber();\n}\n\nexport type TotalUnrealizedROIInputs = {\n  totalUnrealizedPnL: number;\n  totalValue: number;\n};\n\n/**\n * totalUnrealizedROI\n */\nexport function totalUnrealizedROI(inputs: TotalUnrealizedROIInputs) {\n  const { totalUnrealizedPnL, totalValue } = inputs;\n\n  return new Decimal(totalUnrealizedPnL)\n    .div(totalValue - totalUnrealizedPnL)\n    .toNumber();\n}\n\n/**\n * current account leverage\n */\nexport function currentLeverage(totalMarginRatio: number) {\n  if (totalMarginRatio === 0) {\n    return 0;\n  }\n  return 1 / totalMarginRatio;\n}\n\nexport type AvailableBalanceInputs = {\n  USDCHolding: number;\n  unsettlementPnL: number;\n};\nexport function availableBalance(inputs: AvailableBalanceInputs) {\n  const { USDCHolding, unsettlementPnL } = inputs;\n\n  return new Decimal(USDCHolding).add(unsettlementPnL).toNumber();\n}\n\nexport type AccountMMRInputs = {\n  // Total Maintenance Margin of all positions of the user (USDC)\n  positionsMMR: number;\n  /**\n   * Notional sum of all positions,\n   * positions.totalNotional()\n   */\n  positionsNotional: number;\n};\n\n/**\n * total maintenance margin ratio\n * @param inputs AccountMMRInputs\n * @returns number|null\n */\nexport function MMR(inputs: AccountMMRInputs): number | null {\n  // If the user does not have any positions, return null\n  if (inputs.positionsNotional === 0) {\n    return null;\n  }\n  if (inputs.positionsMMR === 0) {\n    return null;\n  }\n  return new Decimal(inputs.positionsMMR)\n    .div(inputs.positionsNotional)\n    .toNumber();\n}\n\nexport const collateralRatio = (params: {\n  baseWeight: number;\n  discountFactor: number | null;\n  collateralQty: number;\n  collateralCap: number;\n  indexPrice: number;\n}) => {\n  const {\n    baseWeight,\n    discountFactor,\n    collateralQty,\n    collateralCap,\n    indexPrice,\n  } = params;\n\n  // if collateralCap is -1, it means the collateral is unlimited\n  const cap = collateralCap === -1 ? collateralQty : collateralCap;\n\n  const K = new Decimal(1.2);\n  const DCF = new Decimal(discountFactor || 0);\n  const qty = new Decimal(Math.min(collateralQty, cap));\n\n  const notionalAbs = qty.mul(indexPrice).abs();\n  const dynamicWeight = DCF.mul(notionalAbs.toPower(IMRFactorPower));\n  const result = K.div(new Decimal(1).add(dynamicWeight));\n\n  return result.lt(baseWeight) ? result : new Decimal(baseWeight);\n};\n\n/** collateral_value_i = min(collateral_qty_i , collateral_cap_i) * weight_i * index_price_i */\nexport const collateralContribution = (params: {\n  collateralQty: number;\n  collateralCap: number;\n  collateralRatio: number;\n  indexPrice: number;\n}) => {\n  const { collateralQty, collateralCap, collateralRatio, indexPrice } = params;\n\n  // if collateralCap is -1, it means the collateral is unlimited\n  const cap = collateralCap === -1 ? collateralQty : collateralCap;\n\n  return new Decimal(Math.min(collateralQty, cap))\n    .mul(collateralRatio)\n    .mul(indexPrice)\n    .toNumber();\n};\n\nexport const LTV = (params: {\n  usdcBalance: number;\n  upnl: number;\n  assets: Array<{ qty: number; indexPrice: number; weight: number }>;\n}) => {\n  const { usdcBalance, upnl, assets } = params;\n\n  const usdcLoss = new Decimal(Math.min(usdcBalance, 0)).abs();\n  const upnlLoss = new Decimal(Math.min(upnl, 0)).abs();\n  const numerator = usdcLoss.add(upnlLoss);\n\n  const collateralSum = assets.reduce<Decimal>((acc, asset) => {\n    return acc.add(\n      new Decimal(Math.max(asset.qty, 0))\n        .mul(new Decimal(asset.indexPrice))\n        .mul(new Decimal(asset.weight)),\n    );\n  }, zero);\n\n  const denominator = collateralSum.add(new Decimal(Math.max(upnl, 0)));\n\n  if (numerator.isZero() || denominator.isZero()) {\n    return 0;\n  }\n\n  return numerator.div(denominator).toNumber();\n};\n\n/**\n * max(0, min(USDC_balance, free_collateral - max(upnl, 0)))\n */\nexport const maxWithdrawalUSDC = (inputs: {\n  USDCBalance: number;\n  freeCollateral: Decimal;\n  upnl: number;\n}) => {\n  const { USDCBalance, freeCollateral, upnl } = inputs;\n  const value = Math.min(\n    new Decimal(USDCBalance).toNumber(),\n    new Decimal(freeCollateral).sub(Math.max(upnl, 0)).toNumber(),\n  );\n  return Math.max(0, value);\n};\n\n/**\n *\n * Other collateral: min(collateral_qty_i, free_collateral / (index_price_i × weight_i)\n * Other collateral with negative USDC: min(collateral_qty_i, free_collateral / (index_price_i × (1 + buffer) × weight_i)\n * buffer: 0.2%\n */\nexport const maxWithdrawalOtherCollateral = (inputs: {\n  USDCBalance: number;\n  collateralQty: number;\n  freeCollateral: Decimal;\n  indexPrice: number;\n  weight: Decimal;\n}) => {\n  const { USDCBalance, collateralQty, freeCollateral, indexPrice, weight } =\n    inputs;\n  const usdcBalance = new Decimal(USDCBalance);\n  const denominator = usdcBalance.isNegative()\n    ? new Decimal(indexPrice).mul(weight).mul(new Decimal(1).add(0.002))\n    : new Decimal(indexPrice).mul(weight);\n  if (denominator.isZero()) {\n    return zero;\n  }\n  const qty = new Decimal(collateralQty);\n  const maxQtyByValue = new Decimal(freeCollateral).div(denominator);\n  return maxQtyByValue.lt(qty) ? maxQtyByValue : qty;\n};\n\nexport const calcMinimumReceived = (inputs: {\n  amount: number;\n  slippage: number;\n}) => {\n  const { amount, slippage } = inputs;\n  const slippageRatio = new Decimal(slippage).div(100);\n  return new Decimal(amount)\n    .mul(new Decimal(1).minus(slippageRatio))\n    .toNumber();\n};\n\n/**\n * @deprecated This method will be removed soon. Please update your code to use symbolLeverage directly.\n */\n// Warning: The maxLeverage method will be deprecated soon. Please use symbolLeverage directly and update all related calls as soon as possible.\nexport const maxLeverage = (inputs: {\n  symbolLeverage?: number;\n  accountLeverage: number;\n}) => {\n  const { symbolLeverage, accountLeverage } = inputs;\n\n  return symbolLeverage ?? 1;\n};\n","import { OrderSide, API as orderUtils } from \"@kodiak-finance/orderly-types\";\nimport { Decimal, getTPSLDirection, zero } from \"@kodiak-finance/orderly-utils\";\nimport { notional } from \"./positions\";\n\n/**\n * Maximum price when placing an order\n */\nexport function maxPrice(markprice: number, range: number) {\n  return markprice * (1 + range);\n}\n\n/**\n * Minimum price when placing an order\n */\nexport function minPrice(markprice: number, range: number) {\n  return markprice * (1 - range);\n}\n\n/**\n * Scope price when placing an order\n * @returns number\n */\nexport function scopePrice(\n  price: number,\n  scope: number,\n  side: \"BUY\" | \"SELL\",\n): number {\n  if (side === \"BUY\") {\n    return price * (1 - scope);\n  }\n  return price * (1 + scope);\n}\n\n/**\n * Calculate the order fee\n */\nexport function orderFee(inputs: {\n  /**\n   * Order quantity\n   */\n  qty: number;\n  price: number;\n  futuresTakeFeeRate: number;\n}): number {\n  return new Decimal(inputs.qty)\n    .mul(inputs.price)\n    .mul(inputs.futuresTakeFeeRate)\n    .toNumber();\n}\n\nexport type EstimatedLiquidationPriceInputs = {\n  totalCollateral: number;\n  markPrice: number;\n  baseMMR: number;\n  baseIMR: number;\n  IMR_Factor: number;\n  orderFee: number;\n  positions: Pick<\n    orderUtils.PositionExt,\n    \"position_qty\" | \"mark_price\" | \"symbol\" | \"mmr\"\n  >[];\n  newOrder: {\n    symbol: string;\n    qty: number;\n    price: number;\n  };\n};\n\n/**\n * Estimated liquidation price\n * @param inputs\n * @returns\n */\nexport function estLiqPrice(inputs: EstimatedLiquidationPriceInputs): number {\n  const {\n    positions,\n    newOrder,\n    totalCollateral,\n    markPrice,\n    baseIMR,\n    baseMMR,\n    orderFee,\n    IMR_Factor,\n  } = inputs;\n  // opened positions for the symbol\n  let currentPosition:\n    | Pick<\n        orderUtils.PositionExt,\n        \"position_qty\" | \"mark_price\" | \"symbol\" | \"mmr\"\n      >\n    | undefined = undefined;\n\n  let newTotalMM = zero;\n\n  const hasPosition =\n    positions.filter((item) => item.position_qty > 0).length > 0;\n\n  const basePrice = hasPosition ? markPrice : newOrder.price;\n\n  const newOrderNotional = new Decimal(newOrder.qty).mul(newOrder.price);\n\n  for (let index = 0; index < positions.length; index++) {\n    const position = positions[index];\n    let notional = new Decimal(position.position_qty).mul(position.mark_price);\n    if (newOrder.symbol === position.symbol) {\n      currentPosition = position;\n      notional = notional.add(newOrderNotional);\n    }\n\n    newTotalMM = newTotalMM.add(notional.abs().mul(position.mmr));\n  }\n\n  // if no position\n  if (!currentPosition) {\n    newTotalMM = newTotalMM.add(newOrderNotional.mul(baseMMR));\n  }\n\n  const newMMR = Math.max(\n    baseMMR,\n    new Decimal(baseMMR)\n      .div(baseIMR)\n      .mul(IMR_Factor)\n      .mul(\n        newOrderNotional\n          .add(\n            !!currentPosition\n              ? new Decimal(currentPosition.position_qty).mul(\n                  currentPosition.mark_price,\n                )\n              : zero,\n          )\n          .abs(),\n      )\n      .toPower(4 / 5)\n      .toNumber(),\n  );\n\n  // console.log(\"new MMR\", newMMR, newTotalMM.toNumber());\n\n  const newQty = new Decimal(newOrder.qty).add(\n    currentPosition?.position_qty ?? 0,\n  );\n\n  if (newQty.eq(0)) {\n    return 0;\n  }\n\n  const denominator = newQty.abs().mul(newMMR).sub(newQty);\n\n  if (denominator.eq(zero)) {\n    return 0;\n  }\n\n  const price = new Decimal(basePrice)\n    .add(\n      new Decimal(totalCollateral)\n        .sub(newTotalMM)\n        .sub(orderFee)\n        .div(denominator),\n    )\n    .toNumber();\n\n  return Math.max(0, price);\n}\n\nexport type EstimatedLeverageInputs = {\n  totalCollateral: number;\n  positions: Pick<\n    orderUtils.PositionExt,\n    \"position_qty\" | \"mark_price\" | \"symbol\"\n  >[];\n  newOrder: {\n    symbol: string;\n    qty: number;\n    price: number;\n  };\n};\n\n/**\n * Estimated leverage\n * @param inputs EstimtedLeverageInputs\n * @returns number\n */\nexport function estLeverage(inputs: EstimatedLeverageInputs): number | null {\n  const { totalCollateral, positions, newOrder } = inputs;\n  if (totalCollateral <= 0) {\n    return null;\n  }\n  let hasPosition = false;\n  let sumPositionNotional = positions.reduce((acc, cur) => {\n    let count = new Decimal(cur.position_qty).mul(cur.mark_price);\n    // acc = acc.add(\n    //   new Decimal(cur.position_qty).mul(cur.mark_price)\n    //   // .abs()\n    // );\n\n    if (cur.symbol === newOrder.symbol) {\n      hasPosition = true;\n      // acc = acc.add(new Decimal(newOrder.qty).mul(newOrder.price));\n      count = count.add(new Decimal(newOrder.qty).mul(newOrder.price));\n    }\n\n    return acc.add(count.abs());\n  }, zero);\n\n  if (!hasPosition) {\n    sumPositionNotional = sumPositionNotional.add(\n      new Decimal(newOrder.qty).mul(newOrder.price).abs(),\n    );\n  }\n\n  if (sumPositionNotional.eq(zero)) {\n    return null;\n  }\n\n  const totalMarginRatio = new Decimal(totalCollateral).div(\n    sumPositionNotional,\n  );\n\n  return new Decimal(1)\n    .div(totalMarginRatio)\n    .toDecimalPlaces(2, Decimal.ROUND_HALF_EVEN)\n    .toNumber();\n}\n\n// ROI = (close price - order_price) / order_price × leverage × direction\n// leverage = MIN( current_account_leverage, symbol_leverage)\nexport function tpslROI(inputs: {\n  side: OrderSide;\n  type: \"tp\" | \"sl\";\n  closePrice: number;\n  orderPrice: number;\n  leverage: number;\n}) {\n  const direction = getTPSLDirection({\n    side: inputs.side,\n    type: inputs.type,\n    closePrice: inputs.closePrice,\n    orderPrice: inputs.orderPrice,\n  });\n\n  const { closePrice, orderPrice, leverage } = inputs;\n  return new Decimal(closePrice)\n    .minus(orderPrice)\n    .div(orderPrice)\n    .mul(leverage)\n    .abs()\n    .mul(direction)\n    .toNumber();\n}\n"],"mappings":"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","names":["Decimal","Decimal","IMR","MMR","totalCollateral","liqPrice","notional","MMR","Decimal","zero","totalUnsettlementPnL","Decimal","zero","unsettlementPnL","maxLeverage","totalCollateral","otherIMs","totalUnrealizedPnL","totalValue","totalMarginRatio","MMR","collateralRatio","freeCollateral","Decimal","zero","totalCollateral","orderFee","notional","totalMarginRatio"]}