"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReserveConfig = void 0;
const bn_js_1 = __importDefault(require("bn.js")); // eslint-disable-line @typescript-eslint/no-unused-vars
const types = __importStar(require("../types")); // eslint-disable-line @typescript-eslint/no-unused-vars
const borsh = __importStar(require("@coral-xyz/borsh"));
class ReserveConfig {
    status;
    paddingDeprecatedAssetTier;
    hostFixedInterestRateBps;
    minDeleveragingBonusBps;
    blockCtokenUsage;
    earlyRepayRemainingInterestPct;
    emergencyMode;
    reserved1;
    protocolOrderExecutionFeePct;
    protocolTakeRatePct;
    protocolLiquidationFeePct;
    loanToValuePct;
    liquidationThresholdPct;
    minLiquidationBonusBps;
    maxLiquidationBonusBps;
    badDebtLiquidationBonusBps;
    deleveragingMarginCallPeriodSecs;
    deleveragingThresholdDecreaseBpsPerDay;
    fees;
    borrowRateCurve;
    borrowFactorPct;
    depositLimit;
    borrowLimit;
    tokenInfo;
    depositWithdrawalCap;
    debtWithdrawalCap;
    elevationGroups;
    disableUsageAsCollOutsideEmode;
    utilizationLimitBlockBorrowingAbovePct;
    autodeleverageEnabled;
    proposerAuthorityLocked;
    borrowLimitOutsideElevationGroup;
    borrowLimitAgainstThisCollateralInElevationGroup;
    deleveragingBonusIncreaseBpsPerDay;
    debtMaturityTimestamp;
    debtTermSeconds;
    rewardsAmountPerSlot;
    constructor(fields) {
        this.status = fields.status;
        this.paddingDeprecatedAssetTier = fields.paddingDeprecatedAssetTier;
        this.hostFixedInterestRateBps = fields.hostFixedInterestRateBps;
        this.minDeleveragingBonusBps = fields.minDeleveragingBonusBps;
        this.blockCtokenUsage = fields.blockCtokenUsage;
        this.earlyRepayRemainingInterestPct = fields.earlyRepayRemainingInterestPct;
        this.emergencyMode = fields.emergencyMode;
        this.reserved1 = fields.reserved1;
        this.protocolOrderExecutionFeePct = fields.protocolOrderExecutionFeePct;
        this.protocolTakeRatePct = fields.protocolTakeRatePct;
        this.protocolLiquidationFeePct = fields.protocolLiquidationFeePct;
        this.loanToValuePct = fields.loanToValuePct;
        this.liquidationThresholdPct = fields.liquidationThresholdPct;
        this.minLiquidationBonusBps = fields.minLiquidationBonusBps;
        this.maxLiquidationBonusBps = fields.maxLiquidationBonusBps;
        this.badDebtLiquidationBonusBps = fields.badDebtLiquidationBonusBps;
        this.deleveragingMarginCallPeriodSecs =
            fields.deleveragingMarginCallPeriodSecs;
        this.deleveragingThresholdDecreaseBpsPerDay =
            fields.deleveragingThresholdDecreaseBpsPerDay;
        this.fees = new types.ReserveFees({ ...fields.fees });
        this.borrowRateCurve = new types.BorrowRateCurve({
            ...fields.borrowRateCurve,
        });
        this.borrowFactorPct = fields.borrowFactorPct;
        this.depositLimit = fields.depositLimit;
        this.borrowLimit = fields.borrowLimit;
        this.tokenInfo = new types.TokenInfo({ ...fields.tokenInfo });
        this.depositWithdrawalCap = new types.WithdrawalCaps({
            ...fields.depositWithdrawalCap,
        });
        this.debtWithdrawalCap = new types.WithdrawalCaps({
            ...fields.debtWithdrawalCap,
        });
        this.elevationGroups = fields.elevationGroups;
        this.disableUsageAsCollOutsideEmode = fields.disableUsageAsCollOutsideEmode;
        this.utilizationLimitBlockBorrowingAbovePct =
            fields.utilizationLimitBlockBorrowingAbovePct;
        this.autodeleverageEnabled = fields.autodeleverageEnabled;
        this.proposerAuthorityLocked = fields.proposerAuthorityLocked;
        this.borrowLimitOutsideElevationGroup =
            fields.borrowLimitOutsideElevationGroup;
        this.borrowLimitAgainstThisCollateralInElevationGroup =
            fields.borrowLimitAgainstThisCollateralInElevationGroup;
        this.deleveragingBonusIncreaseBpsPerDay =
            fields.deleveragingBonusIncreaseBpsPerDay;
        this.debtMaturityTimestamp = fields.debtMaturityTimestamp;
        this.debtTermSeconds = fields.debtTermSeconds;
        this.rewardsAmountPerSlot = fields.rewardsAmountPerSlot;
    }
    static layout(property) {
        return borsh.struct([
            borsh.u8("status"),
            borsh.u8("paddingDeprecatedAssetTier"),
            borsh.u16("hostFixedInterestRateBps"),
            borsh.u16("minDeleveragingBonusBps"),
            borsh.u8("blockCtokenUsage"),
            borsh.u8("earlyRepayRemainingInterestPct"),
            borsh.u8("emergencyMode"),
            borsh.array(borsh.u8(), 4, "reserved1"),
            borsh.u8("protocolOrderExecutionFeePct"),
            borsh.u8("protocolTakeRatePct"),
            borsh.u8("protocolLiquidationFeePct"),
            borsh.u8("loanToValuePct"),
            borsh.u8("liquidationThresholdPct"),
            borsh.u16("minLiquidationBonusBps"),
            borsh.u16("maxLiquidationBonusBps"),
            borsh.u16("badDebtLiquidationBonusBps"),
            borsh.u64("deleveragingMarginCallPeriodSecs"),
            borsh.u64("deleveragingThresholdDecreaseBpsPerDay"),
            types.ReserveFees.layout("fees"),
            types.BorrowRateCurve.layout("borrowRateCurve"),
            borsh.u64("borrowFactorPct"),
            borsh.u64("depositLimit"),
            borsh.u64("borrowLimit"),
            types.TokenInfo.layout("tokenInfo"),
            types.WithdrawalCaps.layout("depositWithdrawalCap"),
            types.WithdrawalCaps.layout("debtWithdrawalCap"),
            borsh.array(borsh.u8(), 20, "elevationGroups"),
            borsh.u8("disableUsageAsCollOutsideEmode"),
            borsh.u8("utilizationLimitBlockBorrowingAbovePct"),
            borsh.u8("autodeleverageEnabled"),
            borsh.u8("proposerAuthorityLocked"),
            borsh.u64("borrowLimitOutsideElevationGroup"),
            borsh.array(borsh.u64(), 32, "borrowLimitAgainstThisCollateralInElevationGroup"),
            borsh.u64("deleveragingBonusIncreaseBpsPerDay"),
            borsh.u64("debtMaturityTimestamp"),
            borsh.u64("debtTermSeconds"),
            borsh.u64("rewardsAmountPerSlot"),
        ], property);
    }
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    static fromDecoded(obj) {
        return new ReserveConfig({
            status: obj.status,
            paddingDeprecatedAssetTier: obj.paddingDeprecatedAssetTier,
            hostFixedInterestRateBps: obj.hostFixedInterestRateBps,
            minDeleveragingBonusBps: obj.minDeleveragingBonusBps,
            blockCtokenUsage: obj.blockCtokenUsage,
            earlyRepayRemainingInterestPct: obj.earlyRepayRemainingInterestPct,
            emergencyMode: obj.emergencyMode,
            reserved1: obj.reserved1,
            protocolOrderExecutionFeePct: obj.protocolOrderExecutionFeePct,
            protocolTakeRatePct: obj.protocolTakeRatePct,
            protocolLiquidationFeePct: obj.protocolLiquidationFeePct,
            loanToValuePct: obj.loanToValuePct,
            liquidationThresholdPct: obj.liquidationThresholdPct,
            minLiquidationBonusBps: obj.minLiquidationBonusBps,
            maxLiquidationBonusBps: obj.maxLiquidationBonusBps,
            badDebtLiquidationBonusBps: obj.badDebtLiquidationBonusBps,
            deleveragingMarginCallPeriodSecs: obj.deleveragingMarginCallPeriodSecs,
            deleveragingThresholdDecreaseBpsPerDay: obj.deleveragingThresholdDecreaseBpsPerDay,
            fees: types.ReserveFees.fromDecoded(obj.fees),
            borrowRateCurve: types.BorrowRateCurve.fromDecoded(obj.borrowRateCurve),
            borrowFactorPct: obj.borrowFactorPct,
            depositLimit: obj.depositLimit,
            borrowLimit: obj.borrowLimit,
            tokenInfo: types.TokenInfo.fromDecoded(obj.tokenInfo),
            depositWithdrawalCap: types.WithdrawalCaps.fromDecoded(obj.depositWithdrawalCap),
            debtWithdrawalCap: types.WithdrawalCaps.fromDecoded(obj.debtWithdrawalCap),
            elevationGroups: obj.elevationGroups,
            disableUsageAsCollOutsideEmode: obj.disableUsageAsCollOutsideEmode,
            utilizationLimitBlockBorrowingAbovePct: obj.utilizationLimitBlockBorrowingAbovePct,
            autodeleverageEnabled: obj.autodeleverageEnabled,
            proposerAuthorityLocked: obj.proposerAuthorityLocked,
            borrowLimitOutsideElevationGroup: obj.borrowLimitOutsideElevationGroup,
            borrowLimitAgainstThisCollateralInElevationGroup: obj.borrowLimitAgainstThisCollateralInElevationGroup,
            deleveragingBonusIncreaseBpsPerDay: obj.deleveragingBonusIncreaseBpsPerDay,
            debtMaturityTimestamp: obj.debtMaturityTimestamp,
            debtTermSeconds: obj.debtTermSeconds,
            rewardsAmountPerSlot: obj.rewardsAmountPerSlot,
        });
    }
    static toEncodable(fields) {
        return {
            status: fields.status,
            paddingDeprecatedAssetTier: fields.paddingDeprecatedAssetTier,
            hostFixedInterestRateBps: fields.hostFixedInterestRateBps,
            minDeleveragingBonusBps: fields.minDeleveragingBonusBps,
            blockCtokenUsage: fields.blockCtokenUsage,
            earlyRepayRemainingInterestPct: fields.earlyRepayRemainingInterestPct,
            emergencyMode: fields.emergencyMode,
            reserved1: fields.reserved1,
            protocolOrderExecutionFeePct: fields.protocolOrderExecutionFeePct,
            protocolTakeRatePct: fields.protocolTakeRatePct,
            protocolLiquidationFeePct: fields.protocolLiquidationFeePct,
            loanToValuePct: fields.loanToValuePct,
            liquidationThresholdPct: fields.liquidationThresholdPct,
            minLiquidationBonusBps: fields.minLiquidationBonusBps,
            maxLiquidationBonusBps: fields.maxLiquidationBonusBps,
            badDebtLiquidationBonusBps: fields.badDebtLiquidationBonusBps,
            deleveragingMarginCallPeriodSecs: fields.deleveragingMarginCallPeriodSecs,
            deleveragingThresholdDecreaseBpsPerDay: fields.deleveragingThresholdDecreaseBpsPerDay,
            fees: types.ReserveFees.toEncodable(fields.fees),
            borrowRateCurve: types.BorrowRateCurve.toEncodable(fields.borrowRateCurve),
            borrowFactorPct: fields.borrowFactorPct,
            depositLimit: fields.depositLimit,
            borrowLimit: fields.borrowLimit,
            tokenInfo: types.TokenInfo.toEncodable(fields.tokenInfo),
            depositWithdrawalCap: types.WithdrawalCaps.toEncodable(fields.depositWithdrawalCap),
            debtWithdrawalCap: types.WithdrawalCaps.toEncodable(fields.debtWithdrawalCap),
            elevationGroups: fields.elevationGroups,
            disableUsageAsCollOutsideEmode: fields.disableUsageAsCollOutsideEmode,
            utilizationLimitBlockBorrowingAbovePct: fields.utilizationLimitBlockBorrowingAbovePct,
            autodeleverageEnabled: fields.autodeleverageEnabled,
            proposerAuthorityLocked: fields.proposerAuthorityLocked,
            borrowLimitOutsideElevationGroup: fields.borrowLimitOutsideElevationGroup,
            borrowLimitAgainstThisCollateralInElevationGroup: fields.borrowLimitAgainstThisCollateralInElevationGroup,
            deleveragingBonusIncreaseBpsPerDay: fields.deleveragingBonusIncreaseBpsPerDay,
            debtMaturityTimestamp: fields.debtMaturityTimestamp,
            debtTermSeconds: fields.debtTermSeconds,
            rewardsAmountPerSlot: fields.rewardsAmountPerSlot,
        };
    }
    toJSON() {
        return {
            status: this.status,
            paddingDeprecatedAssetTier: this.paddingDeprecatedAssetTier,
            hostFixedInterestRateBps: this.hostFixedInterestRateBps,
            minDeleveragingBonusBps: this.minDeleveragingBonusBps,
            blockCtokenUsage: this.blockCtokenUsage,
            earlyRepayRemainingInterestPct: this.earlyRepayRemainingInterestPct,
            emergencyMode: this.emergencyMode,
            reserved1: this.reserved1,
            protocolOrderExecutionFeePct: this.protocolOrderExecutionFeePct,
            protocolTakeRatePct: this.protocolTakeRatePct,
            protocolLiquidationFeePct: this.protocolLiquidationFeePct,
            loanToValuePct: this.loanToValuePct,
            liquidationThresholdPct: this.liquidationThresholdPct,
            minLiquidationBonusBps: this.minLiquidationBonusBps,
            maxLiquidationBonusBps: this.maxLiquidationBonusBps,
            badDebtLiquidationBonusBps: this.badDebtLiquidationBonusBps,
            deleveragingMarginCallPeriodSecs: this.deleveragingMarginCallPeriodSecs.toString(),
            deleveragingThresholdDecreaseBpsPerDay: this.deleveragingThresholdDecreaseBpsPerDay.toString(),
            fees: this.fees.toJSON(),
            borrowRateCurve: this.borrowRateCurve.toJSON(),
            borrowFactorPct: this.borrowFactorPct.toString(),
            depositLimit: this.depositLimit.toString(),
            borrowLimit: this.borrowLimit.toString(),
            tokenInfo: this.tokenInfo.toJSON(),
            depositWithdrawalCap: this.depositWithdrawalCap.toJSON(),
            debtWithdrawalCap: this.debtWithdrawalCap.toJSON(),
            elevationGroups: this.elevationGroups,
            disableUsageAsCollOutsideEmode: this.disableUsageAsCollOutsideEmode,
            utilizationLimitBlockBorrowingAbovePct: this.utilizationLimitBlockBorrowingAbovePct,
            autodeleverageEnabled: this.autodeleverageEnabled,
            proposerAuthorityLocked: this.proposerAuthorityLocked,
            borrowLimitOutsideElevationGroup: this.borrowLimitOutsideElevationGroup.toString(),
            borrowLimitAgainstThisCollateralInElevationGroup: this.borrowLimitAgainstThisCollateralInElevationGroup.map((item) => item.toString()),
            deleveragingBonusIncreaseBpsPerDay: this.deleveragingBonusIncreaseBpsPerDay.toString(),
            debtMaturityTimestamp: this.debtMaturityTimestamp.toString(),
            debtTermSeconds: this.debtTermSeconds.toString(),
            rewardsAmountPerSlot: this.rewardsAmountPerSlot.toString(),
        };
    }
    static fromJSON(obj) {
        return new ReserveConfig({
            status: obj.status,
            paddingDeprecatedAssetTier: obj.paddingDeprecatedAssetTier,
            hostFixedInterestRateBps: obj.hostFixedInterestRateBps,
            minDeleveragingBonusBps: obj.minDeleveragingBonusBps,
            blockCtokenUsage: obj.blockCtokenUsage,
            earlyRepayRemainingInterestPct: obj.earlyRepayRemainingInterestPct,
            emergencyMode: obj.emergencyMode,
            reserved1: obj.reserved1,
            protocolOrderExecutionFeePct: obj.protocolOrderExecutionFeePct,
            protocolTakeRatePct: obj.protocolTakeRatePct,
            protocolLiquidationFeePct: obj.protocolLiquidationFeePct,
            loanToValuePct: obj.loanToValuePct,
            liquidationThresholdPct: obj.liquidationThresholdPct,
            minLiquidationBonusBps: obj.minLiquidationBonusBps,
            maxLiquidationBonusBps: obj.maxLiquidationBonusBps,
            badDebtLiquidationBonusBps: obj.badDebtLiquidationBonusBps,
            deleveragingMarginCallPeriodSecs: new bn_js_1.default(obj.deleveragingMarginCallPeriodSecs),
            deleveragingThresholdDecreaseBpsPerDay: new bn_js_1.default(obj.deleveragingThresholdDecreaseBpsPerDay),
            fees: types.ReserveFees.fromJSON(obj.fees),
            borrowRateCurve: types.BorrowRateCurve.fromJSON(obj.borrowRateCurve),
            borrowFactorPct: new bn_js_1.default(obj.borrowFactorPct),
            depositLimit: new bn_js_1.default(obj.depositLimit),
            borrowLimit: new bn_js_1.default(obj.borrowLimit),
            tokenInfo: types.TokenInfo.fromJSON(obj.tokenInfo),
            depositWithdrawalCap: types.WithdrawalCaps.fromJSON(obj.depositWithdrawalCap),
            debtWithdrawalCap: types.WithdrawalCaps.fromJSON(obj.debtWithdrawalCap),
            elevationGroups: obj.elevationGroups,
            disableUsageAsCollOutsideEmode: obj.disableUsageAsCollOutsideEmode,
            utilizationLimitBlockBorrowingAbovePct: obj.utilizationLimitBlockBorrowingAbovePct,
            autodeleverageEnabled: obj.autodeleverageEnabled,
            proposerAuthorityLocked: obj.proposerAuthorityLocked,
            borrowLimitOutsideElevationGroup: new bn_js_1.default(obj.borrowLimitOutsideElevationGroup),
            borrowLimitAgainstThisCollateralInElevationGroup: obj.borrowLimitAgainstThisCollateralInElevationGroup.map((item) => new bn_js_1.default(item)),
            deleveragingBonusIncreaseBpsPerDay: new bn_js_1.default(obj.deleveragingBonusIncreaseBpsPerDay),
            debtMaturityTimestamp: new bn_js_1.default(obj.debtMaturityTimestamp),
            debtTermSeconds: new bn_js_1.default(obj.debtTermSeconds),
            rewardsAmountPerSlot: new bn_js_1.default(obj.rewardsAmountPerSlot),
        });
    }
    toEncodable() {
        return ReserveConfig.toEncodable(this);
    }
}
exports.ReserveConfig = ReserveConfig;
//# sourceMappingURL=ReserveConfig.js.map