/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
import type {
    BaseContract,
    BigNumberish,
    BytesLike,
    FunctionFragment,
    Result,
    Interface,
    EventFragment,
    AddressLike,
    ContractRunner,
    ContractMethod,
    Listener,
} from "ethers";
import type {
    TypedContractEvent,
    TypedDeferredTopicFilter,
    TypedEventLog,
    TypedLogDescription,
    TypedListener,
    TypedContractMethod,
} from "../typechain/common";

export type SpvVaultParametersStruct = {
    btcRelayContract: AddressLike;
    token0: AddressLike;
    token1: AddressLike;
    token0Multiplier: BigNumberish;
    token1Multiplier: BigNumberish;
    confirmations: BigNumberish;
};

export type SpvVaultParametersStructOutput = [
    btcRelayContract: string,
    token0: string,
    token1: string,
    token0Multiplier: bigint,
    token1Multiplier: bigint,
    confirmations: bigint
] & {
    btcRelayContract: string;
    token0: string;
    token1: string;
    token0Multiplier: bigint;
    token1Multiplier: bigint;
    confirmations: bigint;
};

export type StoredBlockHeaderStruct = {
    data: [BytesLike, BytesLike, BytesLike, BytesLike, BytesLike];
};

export type StoredBlockHeaderStructOutput = [
    data: [string, string, string, string, string]
] & { data: [string, string, string, string, string] };

export type BitcoinVaultTransactionDataStruct = {
    recipient: AddressLike;
    amount0: BigNumberish;
    amount1: BigNumberish;
    callerFee0: BigNumberish;
    callerFee1: BigNumberish;
    frontingFee0: BigNumberish;
    frontingFee1: BigNumberish;
    executionHandlerFeeAmount0: BigNumberish;
    executionHash: BytesLike;
    executionExpiry: BigNumberish;
};

export type BitcoinVaultTransactionDataStructOutput = [
    recipient: string,
    amount0: bigint,
    amount1: bigint,
    callerFee0: bigint,
    callerFee1: bigint,
    frontingFee0: bigint,
    frontingFee1: bigint,
    executionHandlerFeeAmount0: bigint,
    executionHash: string,
    executionExpiry: bigint
] & {
    recipient: string;
    amount0: bigint;
    amount1: bigint;
    callerFee0: bigint;
    callerFee1: bigint;
    frontingFee0: bigint;
    frontingFee1: bigint;
    executionHandlerFeeAmount0: bigint;
    executionHash: string;
    executionExpiry: bigint;
};

export type SpvVaultStateStruct = {
    spvVaultParametersCommitment: BytesLike;
    utxoTxHash: BytesLike;
    utxoVout: BigNumberish;
    openBlockheight: BigNumberish;
    withdrawCount: BigNumberish;
    depositCount: BigNumberish;
    token0Amount: BigNumberish;
    token1Amount: BigNumberish;
};

export type SpvVaultStateStructOutput = [
    spvVaultParametersCommitment: string,
    utxoTxHash: string,
    utxoVout: bigint,
    openBlockheight: bigint,
    withdrawCount: bigint,
    depositCount: bigint,
    token0Amount: bigint,
    token1Amount: bigint
] & {
    spvVaultParametersCommitment: string;
    utxoTxHash: string;
    utxoVout: bigint;
    openBlockheight: bigint;
    withdrawCount: bigint;
    depositCount: bigint;
    token0Amount: bigint;
    token1Amount: bigint;
};

export interface SpvVaultManagerInterface extends Interface {
    getFunction(
        nameOrSignature:
            | "claim"
            | "deposit"
            | "front"
            | "getFronterAddress"
            | "getFronterById"
            | "getVault"
            | "open"
            | "parseBitcoinTx"
    ): FunctionFragment;

    getEvent(
        nameOrSignatureOrTopic:
            | "Claimed"
            | "Closed"
            | "Deposited"
            | "Fronted"
            | "Opened"
    ): EventFragment;

    encodeFunctionData(
        functionFragment: "claim",
        values: [
            AddressLike,
            BigNumberish,
            SpvVaultParametersStruct,
            BytesLike,
            StoredBlockHeaderStruct,
            BytesLike[],
            BigNumberish
        ]
    ): string;
    encodeFunctionData(
        functionFragment: "deposit",
        values: [
            AddressLike,
            BigNumberish,
            SpvVaultParametersStruct,
            BigNumberish,
            BigNumberish
        ]
    ): string;
    encodeFunctionData(
        functionFragment: "front",
        values: [
            AddressLike,
            BigNumberish,
            SpvVaultParametersStruct,
            BigNumberish,
            BytesLike,
            BitcoinVaultTransactionDataStruct
        ]
    ): string;
    encodeFunctionData(
        functionFragment: "getFronterAddress",
        values: [
            AddressLike,
            BigNumberish,
            BytesLike,
            BitcoinVaultTransactionDataStruct
        ]
    ): string;
    encodeFunctionData(
        functionFragment: "getFronterById",
        values: [AddressLike, BigNumberish, BytesLike]
    ): string;
    encodeFunctionData(
        functionFragment: "getVault",
        values: [AddressLike, BigNumberish]
    ): string;
    encodeFunctionData(
        functionFragment: "open",
        values: [BigNumberish, SpvVaultParametersStruct, BytesLike, BigNumberish]
    ): string;
    encodeFunctionData(
        functionFragment: "parseBitcoinTx",
        values: [BytesLike]
    ): string;

    decodeFunctionResult(functionFragment: "claim", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "front", data: BytesLike): Result;
    decodeFunctionResult(
        functionFragment: "getFronterAddress",
        data: BytesLike
    ): Result;
    decodeFunctionResult(
        functionFragment: "getFronterById",
        data: BytesLike
    ): Result;
    decodeFunctionResult(functionFragment: "getVault", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "open", data: BytesLike): Result;
    decodeFunctionResult(
        functionFragment: "parseBitcoinTx",
        data: BytesLike
    ): Result;
}

export namespace ClaimedEvent {
    export type InputTuple = [
        ownerAndVaultId: BytesLike,
        recipient: AddressLike,
        btcTxHash: BytesLike,
        caller: AddressLike,
        executionHash: BytesLike,
        frontingAddress: AddressLike,
        withdrawCount: BigNumberish,
        amount0: BigNumberish,
        amount1: BigNumberish
    ];
    export type OutputTuple = [
        ownerAndVaultId: string,
        recipient: string,
        btcTxHash: string,
        caller: string,
        executionHash: string,
        frontingAddress: string,
        withdrawCount: bigint,
        amount0: bigint,
        amount1: bigint
    ];
    export interface OutputObject {
        ownerAndVaultId: string;
        recipient: string;
        btcTxHash: string;
        caller: string;
        executionHash: string;
        frontingAddress: string;
        withdrawCount: bigint;
        amount0: bigint;
        amount1: bigint;
    }
    export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
    export type Filter = TypedDeferredTopicFilter<Event>;
    export type Log = TypedEventLog<Event>;
    export type LogDescription = TypedLogDescription<Event>;
}

export namespace ClosedEvent {
    export type InputTuple = [
        owner: AddressLike,
        vaultId: BigNumberish,
        btcTxHash: BytesLike,
        error: BytesLike
    ];
    export type OutputTuple = [
        owner: string,
        vaultId: bigint,
        btcTxHash: string,
        error: string
    ];
    export interface OutputObject {
        owner: string;
        vaultId: bigint;
        btcTxHash: string;
        error: string;
    }
    export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
    export type Filter = TypedDeferredTopicFilter<Event>;
    export type Log = TypedEventLog<Event>;
    export type LogDescription = TypedLogDescription<Event>;
}

export namespace DepositedEvent {
    export type InputTuple = [
        ownerAndVaultId: BytesLike,
        depositCount: BigNumberish,
        amount0: BigNumberish,
        amount1: BigNumberish
    ];
    export type OutputTuple = [
        ownerAndVaultId: string,
        depositCount: bigint,
        amount0: bigint,
        amount1: bigint
    ];
    export interface OutputObject {
        ownerAndVaultId: string;
        depositCount: bigint;
        amount0: bigint;
        amount1: bigint;
    }
    export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
    export type Filter = TypedDeferredTopicFilter<Event>;
    export type Log = TypedEventLog<Event>;
    export type LogDescription = TypedLogDescription<Event>;
}

export namespace FrontedEvent {
    export type InputTuple = [
        ownerAndVaultId: BytesLike,
        recipient: AddressLike,
        btcTxHash: BytesLike,
        caller: AddressLike,
        executionHash: BytesLike,
        amount0: BigNumberish,
        amount1: BigNumberish
    ];
    export type OutputTuple = [
        ownerAndVaultId: string,
        recipient: string,
        btcTxHash: string,
        caller: string,
        executionHash: string,
        amount0: bigint,
        amount1: bigint
    ];
    export interface OutputObject {
        ownerAndVaultId: string;
        recipient: string;
        btcTxHash: string;
        caller: string;
        executionHash: string;
        amount0: bigint;
        amount1: bigint;
    }
    export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
    export type Filter = TypedDeferredTopicFilter<Event>;
    export type Log = TypedEventLog<Event>;
    export type LogDescription = TypedLogDescription<Event>;
}

export namespace OpenedEvent {
    export type InputTuple = [
        owner: AddressLike,
        vaultId: BigNumberish,
        btcTxHash: BytesLike,
        vout: BigNumberish,
        params: SpvVaultParametersStruct
    ];
    export type OutputTuple = [
        owner: string,
        vaultId: bigint,
        btcTxHash: string,
        vout: bigint,
        params: SpvVaultParametersStructOutput
    ];
    export interface OutputObject {
        owner: string;
        vaultId: bigint;
        btcTxHash: string;
        vout: bigint;
        params: SpvVaultParametersStructOutput;
    }
    export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
    export type Filter = TypedDeferredTopicFilter<Event>;
    export type Log = TypedEventLog<Event>;
    export type LogDescription = TypedLogDescription<Event>;
}

export interface SpvVaultManager extends BaseContract {
    connect(runner?: ContractRunner | null): SpvVaultManager;
    waitForDeployment(): Promise<this>;

    interface: SpvVaultManagerInterface;

    queryFilter<TCEvent extends TypedContractEvent>(
        event: TCEvent,
        fromBlockOrBlockhash?: string | number | undefined,
        toBlock?: string | number | undefined
    ): Promise<Array<TypedEventLog<TCEvent>>>;
    queryFilter<TCEvent extends TypedContractEvent>(
        filter: TypedDeferredTopicFilter<TCEvent>,
        fromBlockOrBlockhash?: string | number | undefined,
        toBlock?: string | number | undefined
    ): Promise<Array<TypedEventLog<TCEvent>>>;

    on<TCEvent extends TypedContractEvent>(
        event: TCEvent,
        listener: TypedListener<TCEvent>
    ): Promise<this>;
    on<TCEvent extends TypedContractEvent>(
        filter: TypedDeferredTopicFilter<TCEvent>,
        listener: TypedListener<TCEvent>
    ): Promise<this>;

    once<TCEvent extends TypedContractEvent>(
        event: TCEvent,
        listener: TypedListener<TCEvent>
    ): Promise<this>;
    once<TCEvent extends TypedContractEvent>(
        filter: TypedDeferredTopicFilter<TCEvent>,
        listener: TypedListener<TCEvent>
    ): Promise<this>;

    listeners<TCEvent extends TypedContractEvent>(
        event: TCEvent
    ): Promise<Array<TypedListener<TCEvent>>>;
    listeners(eventName?: string): Promise<Array<Listener>>;
    removeAllListeners<TCEvent extends TypedContractEvent>(
        event?: TCEvent
    ): Promise<this>;

    claim: TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            transaction: BytesLike,
            blockheader: StoredBlockHeaderStruct,
            merkleProof: BytesLike[],
            position: BigNumberish
        ],
        [void],
        "nonpayable"
    >;

    deposit: TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            rawToken0: BigNumberish,
            rawToken1: BigNumberish
        ],
        [void],
        "payable"
    >;

    front: TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            withdrawalSequence: BigNumberish,
            btcTxHash: BytesLike,
            data: BitcoinVaultTransactionDataStruct
        ],
        [void],
        "payable"
    >;

    getFronterAddress: TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            btcTxHash: BytesLike,
            data: BitcoinVaultTransactionDataStruct
        ],
        [string],
        "view"
    >;

    getFronterById: TypedContractMethod<
        [owner: AddressLike, vaultId: BigNumberish, frontingId: BytesLike],
        [string],
        "view"
    >;

    getVault: TypedContractMethod<
        [owner: AddressLike, vaultId: BigNumberish],
        [SpvVaultStateStructOutput],
        "view"
    >;

    open: TypedContractMethod<
        [
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            utxoTxHash: BytesLike,
            utxoVout: BigNumberish
        ],
        [void],
        "nonpayable"
    >;

    parseBitcoinTx: TypedContractMethod<
        [transaction: BytesLike],
        [BitcoinVaultTransactionDataStructOutput],
        "view"
    >;

    getFunction<T extends ContractMethod = ContractMethod>(
        key: string | FunctionFragment
    ): T;

    getFunction(
        nameOrSignature: "claim"
    ): TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            transaction: BytesLike,
            blockheader: StoredBlockHeaderStruct,
            merkleProof: BytesLike[],
            position: BigNumberish
        ],
        [void],
        "nonpayable"
    >;
    getFunction(
        nameOrSignature: "deposit"
    ): TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            rawToken0: BigNumberish,
            rawToken1: BigNumberish
        ],
        [void],
        "payable"
    >;
    getFunction(
        nameOrSignature: "front"
    ): TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            withdrawalSequence: BigNumberish,
            btcTxHash: BytesLike,
            data: BitcoinVaultTransactionDataStruct
        ],
        [void],
        "payable"
    >;
    getFunction(
        nameOrSignature: "getFronterAddress"
    ): TypedContractMethod<
        [
            owner: AddressLike,
            vaultId: BigNumberish,
            btcTxHash: BytesLike,
            data: BitcoinVaultTransactionDataStruct
        ],
        [string],
        "view"
    >;
    getFunction(
        nameOrSignature: "getFronterById"
    ): TypedContractMethod<
        [owner: AddressLike, vaultId: BigNumberish, frontingId: BytesLike],
        [string],
        "view"
    >;
    getFunction(
        nameOrSignature: "getVault"
    ): TypedContractMethod<
        [owner: AddressLike, vaultId: BigNumberish],
        [SpvVaultStateStructOutput],
        "view"
    >;
    getFunction(
        nameOrSignature: "open"
    ): TypedContractMethod<
        [
            vaultId: BigNumberish,
            vaultParams: SpvVaultParametersStruct,
            utxoTxHash: BytesLike,
            utxoVout: BigNumberish
        ],
        [void],
        "nonpayable"
    >;
    getFunction(
        nameOrSignature: "parseBitcoinTx"
    ): TypedContractMethod<
        [transaction: BytesLike],
        [BitcoinVaultTransactionDataStructOutput],
        "view"
    >;

    getEvent(
        key: "Claimed"
    ): TypedContractEvent<
        ClaimedEvent.InputTuple,
        ClaimedEvent.OutputTuple,
        ClaimedEvent.OutputObject
    >;
    getEvent(
        key: "Closed"
    ): TypedContractEvent<
        ClosedEvent.InputTuple,
        ClosedEvent.OutputTuple,
        ClosedEvent.OutputObject
    >;
    getEvent(
        key: "Deposited"
    ): TypedContractEvent<
        DepositedEvent.InputTuple,
        DepositedEvent.OutputTuple,
        DepositedEvent.OutputObject
    >;
    getEvent(
        key: "Fronted"
    ): TypedContractEvent<
        FrontedEvent.InputTuple,
        FrontedEvent.OutputTuple,
        FrontedEvent.OutputObject
    >;
    getEvent(
        key: "Opened"
    ): TypedContractEvent<
        OpenedEvent.InputTuple,
        OpenedEvent.OutputTuple,
        OpenedEvent.OutputObject
    >;

    filters: {
        "Claimed(bytes32,address,bytes32,address,bytes32,address,uint32,uint64,uint64)": TypedContractEvent<
            ClaimedEvent.InputTuple,
            ClaimedEvent.OutputTuple,
            ClaimedEvent.OutputObject
        >;
        Claimed: TypedContractEvent<
            ClaimedEvent.InputTuple,
            ClaimedEvent.OutputTuple,
            ClaimedEvent.OutputObject
        >;

        "Closed(address,uint96,bytes32,bytes)": TypedContractEvent<
            ClosedEvent.InputTuple,
            ClosedEvent.OutputTuple,
            ClosedEvent.OutputObject
        >;
        Closed: TypedContractEvent<
            ClosedEvent.InputTuple,
            ClosedEvent.OutputTuple,
            ClosedEvent.OutputObject
        >;

        "Deposited(bytes32,uint32,uint64,uint64)": TypedContractEvent<
            DepositedEvent.InputTuple,
            DepositedEvent.OutputTuple,
            DepositedEvent.OutputObject
        >;
        Deposited: TypedContractEvent<
            DepositedEvent.InputTuple,
            DepositedEvent.OutputTuple,
            DepositedEvent.OutputObject
        >;

        "Fronted(bytes32,address,bytes32,address,bytes32,uint64,uint64)": TypedContractEvent<
            FrontedEvent.InputTuple,
            FrontedEvent.OutputTuple,
            FrontedEvent.OutputObject
        >;
        Fronted: TypedContractEvent<
            FrontedEvent.InputTuple,
            FrontedEvent.OutputTuple,
            FrontedEvent.OutputObject
        >;

        "Opened(address,uint96,bytes32,uint32,tuple)": TypedContractEvent<
            OpenedEvent.InputTuple,
            OpenedEvent.OutputTuple,
            OpenedEvent.OutputObject
        >;
        Opened: TypedContractEvent<
            OpenedEvent.InputTuple,
            OpenedEvent.OutputTuple,
            OpenedEvent.OutputObject
        >;
    };
}
