@solana/spl-token
Version:
SPL Token Program JS API
76 lines • 3.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TRANSFER_FEE_AMOUNT_SIZE = exports.TransferFeeAmountLayout = exports.TRANSFER_FEE_CONFIG_SIZE = exports.TransferFeeConfigLayout = exports.ONE_IN_BASIS_POINTS = exports.MAX_FEE_BASIS_POINTS = void 0;
exports.transferFeeLayout = transferFeeLayout;
exports.calculateFee = calculateFee;
exports.getEpochFee = getEpochFee;
exports.calculateEpochFee = calculateEpochFee;
exports.getTransferFeeConfig = getTransferFeeConfig;
exports.getTransferFeeAmount = getTransferFeeAmount;
const buffer_layout_1 = require("@solana/buffer-layout");
const buffer_layout_utils_1 = require("@solana/buffer-layout-utils");
const extensionType_js_1 = require("../extensionType.js");
exports.MAX_FEE_BASIS_POINTS = 10000;
exports.ONE_IN_BASIS_POINTS = BigInt(exports.MAX_FEE_BASIS_POINTS);
/** Buffer layout for de/serializing a transfer fee */
function transferFeeLayout(property) {
return (0, buffer_layout_1.struct)([(0, buffer_layout_utils_1.u64)('epoch'), (0, buffer_layout_utils_1.u64)('maximumFee'), (0, buffer_layout_1.u16)('transferFeeBasisPoints')], property);
}
/** Calculate the transfer fee */
function calculateFee(transferFee, preFeeAmount) {
const transferFeeBasisPoints = transferFee.transferFeeBasisPoints;
if (transferFeeBasisPoints === 0 || preFeeAmount === BigInt(0)) {
return BigInt(0);
}
else {
const numerator = preFeeAmount * BigInt(transferFeeBasisPoints);
const rawFee = (numerator + exports.ONE_IN_BASIS_POINTS - BigInt(1)) / exports.ONE_IN_BASIS_POINTS;
const fee = rawFee > transferFee.maximumFee ? transferFee.maximumFee : rawFee;
return BigInt(fee);
}
}
/** Buffer layout for de/serializing a transfer fee config extension */
exports.TransferFeeConfigLayout = (0, buffer_layout_1.struct)([
(0, buffer_layout_utils_1.publicKey)('transferFeeConfigAuthority'),
(0, buffer_layout_utils_1.publicKey)('withdrawWithheldAuthority'),
(0, buffer_layout_utils_1.u64)('withheldAmount'),
transferFeeLayout('olderTransferFee'),
transferFeeLayout('newerTransferFee'),
]);
exports.TRANSFER_FEE_CONFIG_SIZE = exports.TransferFeeConfigLayout.span;
/** Get the fee for given epoch */
function getEpochFee(transferFeeConfig, epoch) {
if (epoch >= transferFeeConfig.newerTransferFee.epoch) {
return transferFeeConfig.newerTransferFee;
}
else {
return transferFeeConfig.olderTransferFee;
}
}
/** Calculate the fee for the given epoch and input amount */
function calculateEpochFee(transferFeeConfig, epoch, preFeeAmount) {
const transferFee = getEpochFee(transferFeeConfig, epoch);
return calculateFee(transferFee, preFeeAmount);
}
/** Buffer layout for de/serializing */
exports.TransferFeeAmountLayout = (0, buffer_layout_1.struct)([(0, buffer_layout_utils_1.u64)('withheldAmount')]);
exports.TRANSFER_FEE_AMOUNT_SIZE = exports.TransferFeeAmountLayout.span;
function getTransferFeeConfig(mint) {
const extensionData = (0, extensionType_js_1.getExtensionData)(extensionType_js_1.ExtensionType.TransferFeeConfig, mint.tlvData);
if (extensionData !== null) {
return exports.TransferFeeConfigLayout.decode(extensionData);
}
else {
return null;
}
}
function getTransferFeeAmount(account) {
const extensionData = (0, extensionType_js_1.getExtensionData)(extensionType_js_1.ExtensionType.TransferFeeAmount, account.tlvData);
if (extensionData !== null) {
return exports.TransferFeeAmountLayout.decode(extensionData);
}
else {
return null;
}
}
//# sourceMappingURL=state.js.map