{"version":3,"sources":["../../src/common/transfer.ts"],"sourcesContent":["import { EpochInfo } from \"@solana/web3.js\";\nimport { TransferFeeConfig, TransferFee } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\n\nimport { GetTransferAmountFee } from \"../raydium/type\";\nimport { TransferFeeDataBaseType } from \"../api/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n  amount: BN,\n  feeConfig: TransferFeeConfig | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function getTransferAmountFeeV2(\n  amount: BN,\n  _feeConfig: TransferFeeDataBaseType | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (_feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n  const feeConfig = {\n    ..._feeConfig,\n    olderTransferFee: {\n      epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n    },\n    newerTransferFee: {\n      epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n    },\n  };\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function minExpirationTime(\n  expirationTime1: number | undefined,\n  expirationTime2: number | undefined,\n): number | undefined {\n  if (expirationTime1 === undefined) return expirationTime2;\n  if (expirationTime2 === undefined) return expirationTime1;\n\n  return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n  const { div, mod } = bn1.divmod(bn2);\n\n  if (mod.gt(new BN(0))) {\n    return div.add(new BN(1));\n  } else {\n    return div;\n  }\n}\n"],"mappings":"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","names":[]}