@cobaltx/sdk-v2
Version:
An SDK for building applications on top of CobaltX.
1 lines • 8.1 kB
Source Map (JSON)
{"version":3,"sources":["../../src/common/transfer.ts"],"sourcesContent":["import { TransferFee, TransferFeeConfig } from \"@solana/spl-token\";\nimport { EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { TransferFeeDataBaseType } from \"../api/type\";\nimport { GetTransferAmountFee } from \"../cobaltx/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","expirationTime","nowMaxFee","_TAmount","BNDivCeil","TAmount","_fee","fee","getTransferAmountFeeV2","_feeConfig","minExpirationTime","expirationTime1","expirationTime2","bn1","bn2","div","mod"]}