import { Address } from '../../../../../node_modules/@btc-vision/transaction/build/index.js';
import { CallResult } from '../../../../contracts/CallResult.js';
import { OPNetEvent } from '../../../../contracts/OPNetEvent.js';
import { TransferredEvent } from '../opnet/IOP20Contract.js';
import { IOP_NETContract } from '../opnet/IOP_NETContract.js';
export type LiquidityListedEvent = {
    readonly totalLiquidity: bigint;
    readonly provider: string;
};
export type LiquidityReservedEvent = {
    readonly depositAddress: string;
    readonly satoshisAmount: bigint;
    readonly providerId: bigint;
    readonly tokenAmount: bigint;
};
export type ListingCanceledEvent = {
    readonly amount: bigint;
    readonly penalty: bigint;
};
export type ProviderActivatedEvent = {
    readonly providerId: bigint;
    readonly listingAmount: bigint;
    readonly btcToRemove: bigint;
};
export type ProviderConsumedEvent = {
    readonly providerId: bigint;
    readonly amountUsed: bigint;
};
export type ProviderFulfilledEvent = {
    readonly providerId: bigint;
    readonly removalCompleted: boolean;
    readonly stakedAmount: bigint;
};
export type ReservationFallbackEvent = {
    readonly reservationId: bigint;
    readonly expirationBlock: bigint;
};
export type ReservationCreatedEvent = {
    readonly expectedAmountOut: bigint;
    readonly totalSatoshis: bigint;
};
export type ReservationPurgedEvent = {
    readonly reservationId: bigint;
    readonly currentBlock: bigint;
    readonly purgingBlock: bigint;
    readonly purgeIndex: number;
    readonly providerCount: number;
    readonly purgedAmount: bigint;
};
export type SwapExecutedEvent = {
    readonly buyer: Address;
    readonly amountIn: bigint;
    readonly amountOut: bigint;
    readonly totalFees: bigint;
};
export type WithdrawListingEvent = {
    readonly amount: bigint;
    readonly tokenAddress: Address;
    readonly providerId: bigint;
    readonly sender: Address;
};
export type ReserveNativeSwap = CallResult<{}, OPNetEvent<LiquidityReservedEvent | ReservationCreatedEvent | TransferredEvent | ProviderFulfilledEvent | ReservationPurgedEvent>[]>;
export type ListLiquidity = CallResult<{}, OPNetEvent<LiquidityListedEvent | TransferredEvent>[]>;
export type CancelListing = CallResult<{}, OPNetEvent<ListingCanceledEvent | TransferredEvent | ReservationPurgedEvent>[]>;
export type WithdrawListing = CallResult<{}, OPNetEvent<WithdrawListingEvent | TransferredEvent>[]>;
export type CreatePool = CallResult<{}, OPNetEvent<TransferredEvent | ReservationPurgedEvent>[]>;
export type SetFees = CallResult;
export type SetStakingContractAddress = CallResult;
export type SetFeesAddress = CallResult;
export type Pause = CallResult;
export type Unpause = CallResult;
export type ActivateWithdrawMode = CallResult;
export type IsPaused = CallResult<{
    paused: boolean;
}, []>;
export type IsWithdrawModeActive = CallResult<{
    active: boolean;
}, []>;
export type GetFees = CallResult<{
    reservationBaseFee: bigint;
    priorityQueueBaseFee: bigint;
}, []>;
export type Swap = CallResult<{}, OPNetEvent<SwapExecutedEvent | TransferredEvent | ProviderActivatedEvent | ProviderFulfilledEvent | ProviderConsumedEvent | ReservationFallbackEvent>[]>;
export type GetReserve = CallResult<{
    liquidity: bigint;
    reservedLiquidity: bigint;
    virtualBTCReserve: bigint;
    virtualTokenReserve: bigint;
}, [
]>;
export type GetQuote = CallResult<{
    tokensOut: bigint;
    requiredSatoshis: bigint;
    price: bigint;
    scale: bigint;
}, [
]>;
export type GetProviderDetails = CallResult<{
    id: bigint;
    liquidity: bigint;
    reserved: bigint;
    btcReceiver: string;
    indexedAt: number;
    isPriority: boolean;
    purgeIndex: number;
    isActive: boolean;
    lastListedTokensAtBlock: bigint;
    isPurged: boolean;
    isLiquidityProvisionAllowed: boolean;
    toReset: boolean;
}, [
]>;
export type GetProviderDetailsById = CallResult<{
    id: bigint;
    liquidity: bigint;
    reserved: bigint;
    btcReceiver: string;
    indexedAt: number;
    isPriority: boolean;
    purgeIndex: number;
    isActive: boolean;
    lastListedTokensAtBlock: bigint;
    isPurged: boolean;
    isLiquidityProvisionAllowed: boolean;
    toReset: boolean;
}, [
]>;
export type GetPriorityQueueCost = CallResult<{
    cost: bigint;
}, []>;
export type AntiBotSettings = CallResult<{
    antiBotExpirationBlock: bigint;
    maxTokensPerReservation: bigint;
}, [
]>;
export type StakingAddressResult = CallResult<{
    stakingAddress: Address;
}, []>;
export type FeesAddressResult = CallResult<{
    feesAddress: string;
}, []>;
export type QueueDetails = CallResult<{
    lastPurgedBlock: bigint;
    blockWithReservationsLength: number;
    priorityQueueLength: number;
    priorityQueueStartingIndex: number;
    standardQueueLength: number;
    standardQueueStartingIndex: number;
    priorityPurgeQueueLength: number;
    standardPurgeQueueLength: number;
}, [
]>;
export type GetPoolInfoNativeSwap = CallResult<{
    poolType: number;
    amplification: bigint;
    pegStalenessThreshold: bigint;
}, [
]>;
export type OnOP20ReceivedResult = CallResult<{
    selector: Uint8Array;
}, []>;
export interface INativeSwapContract extends IOP_NETContract {
    reserve(token: Address, maximumAmountIn: bigint, minimumAmountOut: bigint, activationDelay: number, sender: Uint8Array): Promise<ReserveNativeSwap>;
    listLiquidity(token: Address, receiver: Uint8Array, receiverStr: string, amountIn: bigint, priority: boolean): Promise<ListLiquidity>;
    cancelListing(token: Address): Promise<CancelListing>;
    withdrawListing(token: Address): Promise<WithdrawListing>;
    createPool(token: Address, floorPrice: bigint, initialLiquidity: bigint, receiver: Uint8Array, receiverStr: string, antiBotEnabledFor: number, antiBotMaximumTokensPerReservation: bigint, maxReservesIn5BlocksPercent: number, poolType: number, amplification: bigint, pegStalenessThreshold: bigint): Promise<CreatePool>;
    setFees(reservationBaseFee: bigint, priorityQueueBaseFee: bigint): Promise<SetFees>;
    setStakingContractAddress(stakingContractAddress: Address): Promise<SetStakingContractAddress>;
    setFeesAddress(feesAddress: string): Promise<SetFeesAddress>;
    pause(): Promise<Pause>;
    unpause(): Promise<Unpause>;
    activateWithdrawMode(): Promise<ActivateWithdrawMode>;
    isPaused(): Promise<IsPaused>;
    isWithdrawModeActive(): Promise<IsWithdrawModeActive>;
    getFees(): Promise<GetFees>;
    swap(token: Address): Promise<Swap>;
    getReserve(token: Address): Promise<GetReserve>;
    getQuote(token: Address, satoshisIn: bigint): Promise<GetQuote>;
    getProviderDetails(token: Address): Promise<GetProviderDetails>;
    getProviderDetailsById(providerId: bigint): Promise<GetProviderDetailsById>;
    getQueueDetails(token: Address): Promise<QueueDetails>;
    getPriorityQueueCost(): Promise<GetPriorityQueueCost>;
    getAntibotSettings(token: Address): Promise<AntiBotSettings>;
    getStakingContractAddress(): Promise<StakingAddressResult>;
    getFeesAddress(): Promise<FeesAddressResult>;
    getPoolInfo(token: Address): Promise<GetPoolInfoNativeSwap>;
    update(address: Address, calldata: Uint8Array): Promise<CallResult>;
}
