import { Address } from '@btc-vision/transaction';
import { CallResult } from '../../../../contracts/CallResult.js';
import { OPNetEvent } from '../../../../contracts/OPNetEvent.js';
import { TransferEvent } from '../opnet/IOP_20Contract.js';
import { IOP_NETContract } from '../opnet/IOP_NETContract.js';
export type LiquidityAddedEvent = {
    readonly totalTokensContributed: bigint;
    readonly virtualTokenExchanged: bigint;
    readonly totalSatoshisSpent: bigint;
};
export type LiquidityListedEvent = {
    readonly totalLiquidity: bigint;
    readonly provider: string;
};
export type LiquidityRemovedEvent = {
    readonly providerId: bigint;
    readonly btcOwed: bigint;
    readonly tokenAmount: 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;
};
export type ReservationPurgingEvent = {
    readonly reservationId: bigint;
    readonly purgeIndex: number;
    readonly purgeQueueLength: number;
};
export type SwapExecutedEvent = {
    readonly buyer: Address;
    readonly amountIn: bigint;
    readonly amountOut: bigint;
};
export type LiquidityReservedEvent = {
    readonly depositAddress: string;
    readonly amount: bigint;
    readonly providerId: bigint;
};
export type ListingCanceledEvent = {
    readonly amount: bigint;
    readonly penalty: bigint;
};
export type ActivateProviderEvent = {
    readonly providerId: bigint;
    readonly listingAmount: bigint;
    readonly btcToRemove: bigint;
};
export type FulfilledProviderEvent = {
    readonly providerId: bigint;
    readonly canceled: boolean;
    readonly removalCompleted: boolean;
};
export type ReserveNativeSwap = CallResult<{
    ok: boolean;
}, OPNetEvent<LiquidityReservedEvent | ReservationCreatedEvent | TransferEvent | FulfilledProviderEvent>[]>;
export type AddLiquidity = CallResult<{
    ok: boolean;
}, OPNetEvent<LiquidityAddedEvent | TransferEvent | ActivateProviderEvent | FulfilledProviderEvent>[]>;
export type RemoveLiquidity = CallResult<{
    ok: boolean;
}, OPNetEvent<LiquidityRemovedEvent | TransferEvent | FulfilledProviderEvent>[]>;
export type ListLiquidity = CallResult<{
    ok: boolean;
}, OPNetEvent<LiquidityListedEvent>[]>;
export type CancelListing = CallResult<{
    ok: boolean;
}, OPNetEvent<ListingCanceledEvent | TransferEvent | FulfilledProviderEvent>[]>;
export type CreatePool = CallResult<{
    ok: boolean;
}, OPNetEvent<TransferEvent | LiquidityAddedEvent>[]>;
export type SetFees = CallResult<{
    ok: boolean;
}, []>;
export type GetFees = CallResult<{
    reservationBaseFee: bigint;
    priorityQueueBaseFee: bigint;
}, []>;
export type Swap = CallResult<{
    ok: boolean;
}, OPNetEvent<SwapExecutedEvent | TransferEvent | ActivateProviderEvent | FulfilledProviderEvent>[]>;
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<{
    liquidity: bigint;
    reserved: bigint;
    lpShares: bigint;
    btcReceiver: string;
    indexedAt: number;
    isPriority: boolean;
}, [
]>;
export type GetPriorityQueueCost = CallResult<{
    cost: bigint;
}, []>;
export type AntiBotSettings = CallResult<{
    antiBotExpirationBlock: bigint;
    maxTokensPerReservation: bigint;
}, [
]>;
export type StakingAddressResult = CallResult<{
    stakingAddress: Address;
}, []>;
export type QueueDetails = CallResult<{
    lastPurgedBlock: number;
    blockWithReservationsLength: number;
    removalQueueLength: number;
    removalQueueStartingIndex: number;
    priorityQueueLength: number;
    priorityQueueStartingIndex: number;
    standardQueueLength: number;
    standardQueueStartingIndex: number;
    priorityPurgeQueueLength: number;
    standardPurgeQueueLength: number;
    removePurgeQueueLength: number;
}, [
]>;
export interface INativeSwapContract extends IOP_NETContract {
    reserve(token: Address, maximumAmountIn: bigint, minimumAmountOut: bigint, forLP: boolean, activationDelay: number): Promise<ReserveNativeSwap>;
    listLiquidity(token: Address, receiver: string, amountIn: bigint, priority: boolean): Promise<ListLiquidity>;
    cancelListing(token: Address): Promise<CancelListing>;
    createPool(token: Address, floorPrice: bigint, initialLiquidity: bigint, receiver: string, antiBotEnabledFor: number, antiBotMaximumTokensPerReservation: bigint, maxReservesIn5BlocksPercent: number): Promise<CreatePool>;
    setFees(reservationBaseFee: bigint, priorityQueueBaseFee: bigint): Promise<SetFees>;
    getFees(): Promise<GetFees>;
    addLiquidity(token: Address, receiver: string): Promise<AddLiquidity>;
    removeLiquidity(token: Address): Promise<RemoveLiquidity>;
    swap(token: Address): Promise<Swap>;
    getReserve(token: Address): Promise<GetReserve>;
    getQuote(token: Address, satoshisIn: bigint): Promise<GetQuote>;
    getProviderDetails(token: Address): Promise<GetProviderDetails>;
    getQueueDetails(token: Address): Promise<QueueDetails>;
    getPriorityQueueCost(token: Address): Promise<GetPriorityQueueCost>;
    getAntibotSettings(token: Address): Promise<AntiBotSettings>;
    setStakingContractAddress(stakingContractAddress: Address): Promise<CallResult<{
        ok: boolean;
    }, []>>;
    getStakingContractAddress(): Promise<StakingAddressResult>;
}
