import { Coin, CoinSDKType } from "../../cosmos/base/v1beta1/coin";
import { Long, DeepPartial } from "../../helpers";
import * as _m0 from "protobufjs/minimal";
/**
 * WithdrawalStatus представляет статус вывода
 * Flow: PENDING_TIMELOCK -> SIGNING -> READY -> RELAYED -> (deleted after EVM confirmation)
 * При ошибке/отмене: refund + emit event + delete (не храним FAILED/CANCELLED)
 * ERROR: вывод подтверждён EVM, но не обработан на chain (ошибка баланса/резерва при recovery)
 */
export declare enum WithdrawalStatus {
    /** WITHDRAWAL_STATUS_UNSPECIFIED - WITHDRAWAL_STATUS_UNSPECIFIED - неопределенный статус */
    WITHDRAWAL_STATUS_UNSPECIFIED = 0,
    /** WITHDRAWAL_STATUS_PENDING_TIMELOCK - WITHDRAWAL_STATUS_PENDING_TIMELOCK - ожидает timelock (для крупных сумм) */
    WITHDRAWAL_STATUS_PENDING_TIMELOCK = 1,
    /** WITHDRAWAL_STATUS_SIGNING - WITHDRAWAL_STATUS_SIGNING - ожидает подписи валидаторов (667/1000 от числа валидаторов) */
    WITHDRAWAL_STATUS_SIGNING = 2,
    /** WITHDRAWAL_STATUS_READY - WITHDRAWAL_STATUS_READY - готов к relay на EVM (достаточно подписей) */
    WITHDRAWAL_STATUS_READY = 3,
    /** WITHDRAWAL_STATUS_RELAYED - WITHDRAWAL_STATUS_RELAYED - relay выполнен, ожидает EVM confirmation от bridge daemon */
    WITHDRAWAL_STATUS_RELAYED = 4,
    /** WITHDRAWAL_STATUS_ERROR - WITHDRAWAL_STATUS_ERROR - подтверждён EVM, но не обработан на chain (ошибка при recovery) */
    WITHDRAWAL_STATUS_ERROR = 5,
    /** WITHDRAWAL_STATUS_EXPIRED - WITHDRAWAL_STATUS_EXPIRED - EVM confirmation timeout (relay мог пройти, ручное разбирательство) */
    WITHDRAWAL_STATUS_EXPIRED = 6,
    UNRECOGNIZED = -1
}
export declare const WithdrawalStatusSDKType: typeof WithdrawalStatus;
export declare function withdrawalStatusFromJSON(object: any): WithdrawalStatus;
export declare function withdrawalStatusToJSON(object: WithdrawalStatus): string;
/** Withdrawal представляет запрос на вывод токенов из Protocol в EVM chain */
export interface Withdrawal {
    /** Уникальный идентификатор вывода */
    id: Long;
    /** Сумма токенов для вывода (в минимальных единицах) */
    amount: string;
    /** Адрес получателя на EVM chain */
    ethRecipient: string;
    /** Адрес отправителя в Protocol */
    protocolSender: string;
    /** Текущий статус вывода */
    status: WithdrawalStatus;
    /** Блок Protocol в котором создан вывод */
    createdAtBlock: Long;
    /** Количество блоков задержки (timelock) для крупных сумм */
    timelockBlocks: Long;
    /** Chain ID целевой EVM сети */
    ethChainId: Long;
    /** Хеш ETH транзакции после исполнения (заполняется relayer) */
    ethTxHash: string;
    /** Сообщение об ошибке если статус FAILED/CANCELLED */
    errorMessage: string;
    /** Asset ID из модуля x/assets */
    assetId: number;
    /** Счётчик неудачных попыток relay */
    relayAttempts: number;
    /** Блок в котором withdrawal получил статус READY (для fallback relay) */
    readyAtBlock: Long;
}
/** Withdrawal представляет запрос на вывод токенов из Protocol в EVM chain */
export interface WithdrawalSDKType {
    id: Long;
    amount: string;
    eth_recipient: string;
    protocol_sender: string;
    status: WithdrawalStatus;
    created_at_block: Long;
    timelock_blocks: Long;
    eth_chain_id: Long;
    eth_tx_hash: string;
    error_message: string;
    asset_id: number;
    relay_attempts: number;
    ready_at_block: Long;
}
/** AssetChainDailyLimitConfig — per-asset-per-chain дневной лимит выводов (конфигурация) */
export interface AssetChainDailyLimitConfig {
    /** EVM chain ID */
    chainId: Long;
    /** Asset ID из модуля x/assets */
    assetId: number;
    /** Дневной лимит выводов для этой пары (chain, asset) */
    dailyLimit: string;
}
/** AssetChainDailyLimitConfig — per-asset-per-chain дневной лимит выводов (конфигурация) */
export interface AssetChainDailyLimitConfigSDKType {
    chain_id: Long;
    asset_id: number;
    daily_limit: string;
}
/** ChainWithdrawalState — per-chain runtime состояние для генерации уникальных ID выводов */
export interface ChainWithdrawalState {
    /** EVM chain ID */
    chainId: Long;
    /** Следующий ID для нового вывода на этой сети */
    nextId: Long;
}
/** ChainWithdrawalState — per-chain runtime состояние для генерации уникальных ID выводов */
export interface ChainWithdrawalStateSDKType {
    chain_id: Long;
    next_id: Long;
}
/** AssetChainWithdrawalDailyUsage — per-asset-per-chain runtime состояние для tracking дневных лимитов */
export interface AssetChainWithdrawalDailyUsage {
    /** EVM chain ID */
    chainId: Long;
    /** Asset ID из модуля x/assets */
    assetId: number;
    /** Сумма выведенная за текущий день для этой пары (chain, asset) */
    dailyUsed: string;
    /** Unix timestamp последнего сброса дневного счётчика */
    lastReset: Long;
}
/** AssetChainWithdrawalDailyUsage — per-asset-per-chain runtime состояние для tracking дневных лимитов */
export interface AssetChainWithdrawalDailyUsageSDKType {
    chain_id: Long;
    asset_id: number;
    daily_used: string;
    last_reset: Long;
}
/** WithdrawalParams содержит параметры для системы выводов */
export interface WithdrawalParams {
    /** Per-chain настройки вывода (вложенные по цепям, аналогично event_params.chains) */
    chainWithdrawalConfigs: ChainWithdrawalConfig[];
    /** Per-asset-per-chain дневные лимиты выводов */
    dailyLimitConfigs: AssetChainDailyLimitConfig[];
    /** Флаг отключения выводов (emergency pause) */
    withdrawalsDisabled: boolean;
    /** Кол-во блоков на сбор подписей, после чего withdrawal отменяется и токены возвращаются */
    signingTimeoutBlocks: Long;
    /** Максимальное число неудачных попыток relay до рефанда (0 = без лимита) */
    maxRelayAttempts: number;
    /** Таймаут READY фазы: если relay не произошёл за N блоков → рефанд (0 = disabled) */
    relayTimeoutBlocks: Long;
    /** Таймаут RELAYED фазы: если EVM confirmation не пришло за N блоков → EXPIRED (0 = disabled) */
    confirmationTimeoutBlocks: Long;
}
/** WithdrawalParams содержит параметры для системы выводов */
export interface WithdrawalParamsSDKType {
    chain_withdrawal_configs: ChainWithdrawalConfigSDKType[];
    daily_limit_configs: AssetChainDailyLimitConfigSDKType[];
    withdrawals_disabled: boolean;
    signing_timeout_blocks: Long;
    max_relay_attempts: number;
    relay_timeout_blocks: Long;
    confirmation_timeout_blocks: Long;
}
/**
 * ChainWithdrawalConfig — per-chain группировка настроек вывода.
 * Структура аналогична event_params.chains[].token_mappings[].
 */
export interface ChainWithdrawalConfig {
    /** EVM chain ID */
    chainId: Long;
    /** Настройки вывода для каждого ассета на этой цепи */
    assetConfigs: AssetWithdrawalConfig[];
}
/**
 * ChainWithdrawalConfig — per-chain группировка настроек вывода.
 * Структура аналогична event_params.chains[].token_mappings[].
 */
export interface ChainWithdrawalConfigSDKType {
    chain_id: Long;
    asset_configs: AssetWithdrawalConfigSDKType[];
}
/**
 * AssetWithdrawalConfig — per-asset настройки вывода.
 * Таймлок опционален: если large_withdrawal_threshold = 0 — все выводы мгновенные.
 * Разрешение вывода определяется наличием токена в event_params.token_mappings.
 */
export interface AssetWithdrawalConfig {
    /** Asset ID из модуля x/assets (например, 0 для USDC) */
    assetId: number;
    /** Порог суммы для timelock (0 = без таймлока, все выводы мгновенные) */
    largeWithdrawalThreshold: string;
    /** Количество блоков задержки для крупных выводов (0 = без таймлока) */
    timelockBlocks: Long;
    /**
     * Комиссия за вывод (логика ИЛИ: пользователь платит один из вариантов).
     * Пустое = бесплатный вывод.
     */
    withdrawalFee: Coin[];
}
/**
 * AssetWithdrawalConfig — per-asset настройки вывода.
 * Таймлок опционален: если large_withdrawal_threshold = 0 — все выводы мгновенные.
 * Разрешение вывода определяется наличием токена в event_params.token_mappings.
 */
export interface AssetWithdrawalConfigSDKType {
    asset_id: number;
    large_withdrawal_threshold: string;
    timelock_blocks: Long;
    withdrawal_fee: CoinSDKType[];
}
/** ValidatorEvmAddress содержит EVM адрес валидатора для подписания выводов */
export interface ValidatorEvmAddress {
    /** Адрес валидатора (operator address) */
    validatorAddress: string;
    /** EVM адрес для подписей withdrawals (secp256k1) */
    evmAddress: string;
    /** Блок в котором ключ был зарегистрирован */
    registeredAtBlock: Long;
}
/** ValidatorEvmAddress содержит EVM адрес валидатора для подписания выводов */
export interface ValidatorEvmAddressSDKType {
    validator_address: string;
    evm_address: string;
    registered_at_block: Long;
}
/** WithdrawalSignature содержит подпись валидатора для вывода */
export interface WithdrawalSignature {
    /** ID вывода который подписан */
    withdrawalId: Long;
    /** Адрес валидатора который подписал */
    validatorAddress: string;
    /** ETH адрес валидатора (для верификации на EVM) */
    validatorEthAddress: string;
    /** ECDSA подпись (secp256k1) - 65 bytes (r, s, v) */
    ethSignature: Uint8Array;
    /** Блок в котором была создана подпись */
    signedAtBlock: Long;
}
/** WithdrawalSignature содержит подпись валидатора для вывода */
export interface WithdrawalSignatureSDKType {
    withdrawal_id: Long;
    validator_address: string;
    validator_eth_address: string;
    eth_signature: Uint8Array;
    signed_at_block: Long;
}
/** AggregatedWithdrawal содержит withdrawal с агрегированными подписями */
export interface AggregatedWithdrawal {
    /** Исходный withdrawal */
    withdrawal?: Withdrawal;
    /** Собранные подписи валидаторов */
    signatures: WithdrawalSignature[];
    /** Число собранных подписей */
    signatureCount: Long;
    /** Требуемое число подписей (667/1000 от общего числа валидаторов) */
    requiredSignatures: Long;
    /** Готов ли withdrawal к relay (signature_count >= required_signatures) */
    readyForRelay: boolean;
    /** Блок в котором withdrawal стал ready_for_relay (для fallback relay) */
    readyAtBlock: Long;
    /** Protocol адрес валидатора который должен relay'ить (по duty rotation) */
    assignedRelayer: string;
}
/** AggregatedWithdrawal содержит withdrawal с агрегированными подписями */
export interface AggregatedWithdrawalSDKType {
    withdrawal?: WithdrawalSDKType;
    signatures: WithdrawalSignatureSDKType[];
    signature_count: Long;
    required_signatures: Long;
    ready_for_relay: boolean;
    ready_at_block: Long;
    assigned_relayer: string;
}
export declare const Withdrawal: {
    encode(message: Withdrawal, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): Withdrawal;
    fromPartial(object: DeepPartial<Withdrawal>): Withdrawal;
};
export declare const AssetChainDailyLimitConfig: {
    encode(message: AssetChainDailyLimitConfig, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): AssetChainDailyLimitConfig;
    fromPartial(object: DeepPartial<AssetChainDailyLimitConfig>): AssetChainDailyLimitConfig;
};
export declare const ChainWithdrawalState: {
    encode(message: ChainWithdrawalState, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): ChainWithdrawalState;
    fromPartial(object: DeepPartial<ChainWithdrawalState>): ChainWithdrawalState;
};
export declare const AssetChainWithdrawalDailyUsage: {
    encode(message: AssetChainWithdrawalDailyUsage, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): AssetChainWithdrawalDailyUsage;
    fromPartial(object: DeepPartial<AssetChainWithdrawalDailyUsage>): AssetChainWithdrawalDailyUsage;
};
export declare const WithdrawalParams: {
    encode(message: WithdrawalParams, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): WithdrawalParams;
    fromPartial(object: DeepPartial<WithdrawalParams>): WithdrawalParams;
};
export declare const ChainWithdrawalConfig: {
    encode(message: ChainWithdrawalConfig, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): ChainWithdrawalConfig;
    fromPartial(object: DeepPartial<ChainWithdrawalConfig>): ChainWithdrawalConfig;
};
export declare const AssetWithdrawalConfig: {
    encode(message: AssetWithdrawalConfig, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): AssetWithdrawalConfig;
    fromPartial(object: DeepPartial<AssetWithdrawalConfig>): AssetWithdrawalConfig;
};
export declare const ValidatorEvmAddress: {
    encode(message: ValidatorEvmAddress, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): ValidatorEvmAddress;
    fromPartial(object: DeepPartial<ValidatorEvmAddress>): ValidatorEvmAddress;
};
export declare const WithdrawalSignature: {
    encode(message: WithdrawalSignature, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): WithdrawalSignature;
    fromPartial(object: DeepPartial<WithdrawalSignature>): WithdrawalSignature;
};
export declare const AggregatedWithdrawal: {
    encode(message: AggregatedWithdrawal, writer?: _m0.Writer): _m0.Writer;
    decode(input: _m0.Reader | Uint8Array, length?: number): AggregatedWithdrawal;
    fromPartial(object: DeepPartial<AggregatedWithdrawal>): AggregatedWithdrawal;
};
//# sourceMappingURL=withdrawal.d.ts.map