import { Address } from 'viem';

/**
 * @file Vault configuration
 * @module vaults/config
 * @description Defines the configuration for all supported vaults
 */

/**
 * Available vault keys in the system
 * @constant {Object} VaultKeys
 * @property {string} NRWA - Key for the nRWA vault
 * @property {string} NTBILL - Key for the nTBILL vault
 * @property {string} NBASIS - Key for the nBASIS vault
 * @property {string} NCREDIT - Key for the nCREDIT vault
 * @property {string} NINSTO - Key for the nINSTO vault
 * @property {string} NPAYFI - Key for the nPAYFI vault
 * @property {string} OPNRWA - Key for the Op-nRWA vault
 * @property {string} OPNTBILL - Key for the Op-nTBILL vault
 * @property {string} OPNBASIS - Key for the Op-nBASIS vault
 * @property {string} OPPLUME - Key for the Op-plume vault
 * @property {string} OPPUSD - Key for the Op-pUSD vault
 */
declare const VaultKeys: {
    readonly OPNALPHA: "op-nALPHA";
    readonly OPNBASIS: "op-nBASIS";
    readonly OPNETF: "op-nETF";
    readonly OPNPAYFI: "op-nPAYFI";
    readonly OPNPLUME: "op-PLUME";
    readonly OPNRWA: "op-nRWA";
    readonly OPNTBILL: "op-nTBILL";
    readonly OPPUSD: "op-pUSD";
    readonly XLHYPE: "XLHYPE";
};
/**
 * Type representing valid vault keys
 * @typedef {string} VaultKey
 */
type VaultKey = (typeof VaultKeys)[keyof typeof VaultKeys];
interface Token {
    symbol: string;
    address: Address;
    decimals: number;
}
interface VaultToken extends Token {
    name: string;
}
interface VaultContracts {
    accountant: Address;
    boringVault: Address;
    teller: Address;
}
interface Bridge {
    type: "hyperlane" | "layerzero" | "none";
    chainIdentifier: number;
}
interface Deposit {
    sourceChains: {
        [chainId: string]: DepositSourceChain;
    };
}
interface DepositSourceChain {
    displayName: string;
    destinationChains: {
        [chainId: string]: DepositDestinationChain;
    };
    depositTokens: {
        [tokenSymbol: string]: Token;
    };
}
interface DepositDestinationChain {
    displayName: string;
    bridge: Bridge;
}
interface Withdraw {
    sourceChains: {
        [chainId: string]: WithdrawSourceChain;
    };
}
interface WithdrawSourceChain {
    displayName: string;
    destinationChains: {
        [chainId: string]: WithdrawDestinationChain;
    };
}
interface WithdrawDestinationChain {
    displayName: string;
    bridge: Bridge;
    wantTokens: {
        [tokenSymbol: string]: Token;
    };
}
interface Vault {
    contracts: VaultContracts;
    token: VaultToken;
    deposit: Deposit;
    withdraw: Withdraw;
}

export { type Vault, type VaultKey, VaultKeys };
