"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isBorrowingEnabled = exports.getExpectedTokenBalanceAfterBorrow = void 0;
exports.isFlashLoanEnabled = isFlashLoanEnabled;
exports.determineFlashBorrowType = determineFlashBorrowType;
const classes_1 = require("../classes");
const utils_1 = require("../utils");
const bn_js_1 = __importDefault(require("bn.js"));
const getExpectedTokenBalanceAfterBorrow = async (rpc, mint, owner, amountToBorrowLamports, amountToBorrowMintDecimals) => {
    const initialUserTokenABalance = await (0, utils_1.getTokenAccountBalanceDecimal)(rpc, mint, owner);
    return initialUserTokenABalance
        .add((0, classes_1.lamportsToNumberDecimal)(amountToBorrowLamports, amountToBorrowMintDecimals))
        .toDecimalPlaces(amountToBorrowMintDecimals);
};
exports.getExpectedTokenBalanceAfterBorrow = getExpectedTokenBalanceAfterBorrow;
const isBorrowingEnabled = (reserve) => {
    return reserve.state.config.borrowLimit.gt(new bn_js_1.default(0));
};
exports.isBorrowingEnabled = isBorrowingEnabled;
/**
 * Returns true if flash loans are enabled on this reserve.
 * Flash loans are disabled when flashLoanFeeSf === U64_MAX (sentinel value).
 * Note: getFlashLoanFee() returns 0 for both "free" and "disabled", so we check the raw field.
 */
function isFlashLoanEnabled(reserve) {
    return reserve.state.config.fees.flashLoanFeeSf.toString() !== utils_1.U64_MAX;
}
/**
 * Determines which token to flash borrow based on reserve capabilities.
 *
 * Checks:
 * 1. Whether flash loans are enabled on the reserve (flashLoanFeeSf !== U64_MAX)
 * 2. Whether the reserve has sufficient available liquidity
 *
 * When both reserves are viable, prefers collateral (typically has more liquidity).
 *
 * @param collReserve - The collateral reserve
 * @param debtReserve - The debt reserve
 * @param requiredCollLamports - Amount needed if flash borrowing collateral
 * @param requiredDebtLamports - Amount needed if flash borrowing debt
 * @returns 'coll' or 'debt'
 * @throws if neither reserve supports flash borrowing the required amount
 */
function determineFlashBorrowType(collReserve, debtReserve, requiredCollLamports, requiredDebtLamports) {
    const collEnabled = isFlashLoanEnabled(collReserve);
    const debtEnabled = isFlashLoanEnabled(debtReserve);
    const collLiquidity = collReserve.getLiquidityAvailableAmount();
    const debtLiquidity = debtReserve.getLiquidityAvailableAmount();
    const collViable = collEnabled && collLiquidity.gte(requiredCollLamports);
    const debtViable = debtEnabled && debtLiquidity.gte(requiredDebtLamports);
    if (collViable && debtViable) {
        // Prefer collateral — collateral reserves typically have much more liquidity
        return 'coll';
    }
    if (collViable)
        return 'coll';
    if (debtViable)
        return 'debt';
    throw new Error(`Neither collateral nor debt reserve supports flash borrowing the required amount. ` +
        `Coll: enabled=${collEnabled}, available=${collLiquidity}, required=${requiredCollLamports}. ` +
        `Debt: enabled=${debtEnabled}, available=${debtLiquidity}, required=${requiredDebtLamports}.`);
}
//# sourceMappingURL=utils.js.map