import { Address, Option } from '@solana/kit';
import { KaminoMarket, KaminoObligation } from '../classes';
export type ObligationType = VanillaObligation | MultiplyObligation | LendingObligation | LeverageObligation | MultiplyObligationFixedRate | LendingObligationFixedRate | LeverageObligationFixedRate;
export declare enum ObligationTypeTag {
    Vanilla = 0,
    Multiply = 1,
    Lending = 2,
    Leverage = 3,
    MultiplyFixedRate = 4,
    LendingFixedRate = 5,
    LeverageFixedRate = 6
}
export type InitObligationArgsModel = {
    tag: number;
    id: number;
    seed1: Address;
    seed2: Address;
};
export declare class VanillaObligation {
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare class MultiplyObligation {
    readonly collToken: Address;
    readonly debtToken: Address;
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(collToken: Address, debtToken: Address, programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare class MultiplyObligationFixedRate {
    readonly collReserveAddress: Address;
    readonly debtReserveAddress: Address;
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(collReserveAddress: Address, debtReserveAddress: Address, programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare class LeverageObligation {
    readonly collToken: Address;
    readonly debtToken: Address;
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(collToken: Address, debtToken: Address, programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare class LeverageObligationFixedRate {
    readonly collReserveAddress: Address;
    readonly debtReserveAddress: Address;
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(collReserveAddress: Address, debtReserveAddress: Address, programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare class LendingObligation {
    readonly token: Address;
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(token: Address, programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare class LendingObligationFixedRate {
    readonly reserveAddress: Address;
    readonly programId: Address;
    readonly id: number;
    static tag: number;
    constructor(reserveAddress: Address, programId: Address, id?: number);
    toArgs(): InitObligationArgsModel;
    toPda(market: Address, user: Address): Promise<Address>;
}
export declare function getObligationPdaWithArgs(market: Address, user: Address, args: InitObligationArgsModel, programId: Address): Promise<Address>;
/**
 * Resolves the {@link ObligationType} subclass for the given tag.
 *
 * **Reserve-addresses only** (a single mint can map to a float-rate reserve plus multiple
 * fixed-rate reserves — mint alone is ambiguous). Variable-rate tags (1/2/3) derive their
 * mint seeds from the supplied reserve address via {@link KaminoMarket.getExistingReserveByAddress};
 * fixed-rate tags (4/5/6) use the reserve address directly as the seed.
 *
 * @param reserveAddress1 deposit/collateral reserve. Required for every non-Vanilla tag.
 * @param reserveAddress2 borrow/debt reserve. Required for Multiply/Leverage (variable and fixed-rate).
 */
export declare function getObligationType(kaminoMarket: KaminoMarket, obligationTag: ObligationTypeTag, reserveAddress1?: Option<Address>, reserveAddress2?: Option<Address>): ObligationType;
export declare function getObligationTypeFromObligation(kaminoMarket: KaminoMarket, obligation: KaminoObligation): ObligationType;
//# sourceMappingURL=ObligationType.d.ts.map