{"version":3,"sources":["../../src/common/transfer.ts"],"sourcesContent":["import { EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { TransferFee, TransferFeeConfig } from \"@solana/spl-token\";\n\nimport { TransferFeeDataBaseType } from \"../api/type\";\nimport { GetTransferAmountFee } from \"@/sega/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":["BN","POINT","getTransferAmountFee","amount","feeConfig","epochInfo","addFee","nowFeeConfig","maxFee","BN","expirationTime","nowMaxFee","_TAmount","BNDivCeil","TAmount","_fee","fee","getTransferAmountFeeV2","_feeConfig","__spreadProps","__spreadValues","minExpirationTime","expirationTime1","expirationTime2","bn1","bn2","div","mod"]}