import { ethers, TransactionResponse, Contract } from 'ethers';

type ChainName = "ethereum" | "polygon" | "lukso";
type Token = {
    name: string;
    symbol: string;
    mint: string;
    contract: string;
    chainId: number;
    wChainId?: number;
    decimals: number;
    logoURI: string;
    coingeckoId: string;
    realOriginChainId?: number;
    realOriginContractAddress?: string;
};
interface ContractInstance {
    contract: ethers.Contract;
}
type WrappedTokenInfo = {
    tokenAddress: string;
    srcChain: number;
    tokenType: number;
    decimals: number;
    symbol: string;
    name: string;
    wrappedTokenAddress: string;
};

declare function bridgeTokens(contractAddressSrc: string, signer: ethers.Signer, tokenAddress: string, amount: bigint, dstAddress: string, dstChain: number): Promise<TransactionResponse | null>;
declare function bridgeNonFungibleTokens(contractAddressSrc: string, signer: ethers.Signer, tokenAddress: string, dstAddress: string, dstChain: number, tokenId: number, tokenUri: string): Promise<any | null>;
declare function getAllSupportedTokens(contractAddress: string, signerOrProvider: ethers.Signer | ethers.JsonRpcProvider): Promise<any>;
declare function getFee(contractAddress: string, signerOrProvider: ethers.Signer | ethers.JsonRpcProvider, isFungible: boolean): Promise<number>;
declare function isTokenSupported(contractAddressDst: string, signerOrProvider: ethers.Signer | ethers.JsonRpcProvider, tokenAddress: string, srcChain: number): Promise<boolean>;
declare function getWrappedTokenInfo(contractAddressOnSrc: string, signerOrProvider: ethers.Signer | ethers.JsonRpcProvider, wrappedTokenAddress: string): Promise<WrappedTokenInfo>;
declare function wrapNativeToken(signerOrProvider: ethers.Signer | ethers.JsonRpcProvider, chainId: number, amount: bigint): Promise<any>;
declare function unwrapNativeToken(signerOrProvider: ethers.Signer | ethers.JsonRpcProvider, chainId: number, amount: bigint): Promise<any>;

declare const ADDRESSES: {
    LOOPSO_LUKSO_CONTRACT_ADDRESS: string;
    LOOPSO_MUMBAI_CONTRACT_ADDRESS: string;
    LAJOS_TOKEN_ADDRESS_MUMBAI: string;
    LAJOS_NFT_ADDRESS_MUMBAI: string;
    WRAPPED_MATIC_ADDRESS_MUMBAI: string;
    LAJOS_TOKEN_ADDRESS_WRAPPED_LUKSO: string;
    LAJOS_NFT_ADDRESS_WRAPPED_LUKSO: string;
    WRAPPED_LYX_ADDRESS_LUKSO: string;
};
declare const LOOPSO_ABI: ({
    inputs: any[];
    stateMutability: string;
    type: string;
    name?: undefined;
    anonymous?: undefined;
    outputs?: undefined;
} | {
    inputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    type: string;
    stateMutability?: undefined;
    anonymous?: undefined;
    outputs?: undefined;
} | {
    anonymous: boolean;
    inputs: {
        indexed: boolean;
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    type: string;
    stateMutability?: undefined;
    outputs?: undefined;
} | {
    inputs: {
        components: {
            internalType: string;
            name: string;
            type: string;
        }[];
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    outputs: any[];
    stateMutability: string;
    type: string;
    anonymous?: undefined;
} | {
    inputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    outputs: ({
        components: {
            internalType: string;
            name: string;
            type: string;
        }[];
        internalType: string;
        name: string;
        type: string;
    } | {
        internalType: string;
        name: string;
        type: string;
        components?: undefined;
    })[];
    stateMutability: string;
    type: string;
    anonymous?: undefined;
})[];
declare const ERC20_ABI: ({
    constant: boolean;
    inputs: {
        name: string;
        type: string;
    }[];
    name: string;
    outputs: {
        name: string;
        type: string;
    }[];
    payable: boolean;
    stateMutability: string;
    type: string;
    anonymous?: undefined;
} | {
    payable: boolean;
    stateMutability: string;
    type: string;
    constant?: undefined;
    inputs?: undefined;
    name?: undefined;
    outputs?: undefined;
    anonymous?: undefined;
} | {
    anonymous: boolean;
    inputs: {
        indexed: boolean;
        name: string;
        type: string;
    }[];
    name: string;
    type: string;
    constant?: undefined;
    outputs?: undefined;
    payable?: undefined;
    stateMutability?: undefined;
})[];
declare const ERC721_ABI: ({
    inputs: any[];
    payable: boolean;
    stateMutability: string;
    type: string;
    anonymous?: undefined;
    name?: undefined;
    constant?: undefined;
    outputs?: undefined;
} | {
    anonymous: boolean;
    inputs: {
        indexed: boolean;
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    type: string;
    payable?: undefined;
    stateMutability?: undefined;
    constant?: undefined;
    outputs?: undefined;
} | {
    constant: boolean;
    inputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    outputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    payable: boolean;
    stateMutability: string;
    type: string;
    anonymous?: undefined;
})[];
declare const WRAPPED_ABI: ({
    inputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    stateMutability: string;
    type: string;
    anonymous?: undefined;
    name?: undefined;
    outputs?: undefined;
} | {
    anonymous: boolean;
    inputs: {
        indexed: boolean;
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    type: string;
    stateMutability?: undefined;
    outputs?: undefined;
} | {
    inputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    name: string;
    outputs: {
        internalType: string;
        name: string;
        type: string;
    }[];
    stateMutability: string;
    type: string;
    anonymous?: undefined;
} | {
    stateMutability: string;
    type: string;
    inputs?: undefined;
    anonymous?: undefined;
    name?: undefined;
    outputs?: undefined;
})[];
declare const FEE_ABI: string[];

declare function checkTokenAllowance(signer: ethers.Signer, tokenContract: ethers.Contract, contractAddressSrc: string, convertedAmount: bigint): Promise<void>;
declare function getAttestationIDHash(wrappedTokenAddr: string, dstChainId: number): string;
declare function checkNftApproval(signer: ethers.Signer, erc721Contract: ethers.Contract, contractAddressSrc: string, tokenId: number): Promise<string | null>;
declare function getLoopsoContractFromChainId(chainId: number, signerOrProvider: ethers.Signer | ethers.JsonRpcProvider): Contract | null;
declare function getLoopsoContractFromContractAddr(contractAddress: string, signerOrProvider: ethers.Signer | ethers.JsonRpcProvider): Contract | null;
declare function getContractAddressFromChainId(chainId: number): string | null;

interface NftMetadata {
    id: string;
    contractAddress: string;
    metadata: {
        description: string;
        image: string;
        name: string;
    };
}
declare const getLuksoNftMetadata: (filteredData: any[]) => Promise<NftMetadata[] | null>;
declare const fetchLuksoNfts: (searchText: string) => Promise<NftMetadata[] | null>;

export { ADDRESSES, ChainName, ContractInstance, ERC20_ABI, ERC721_ABI, FEE_ABI, LOOPSO_ABI, NftMetadata, Token, WRAPPED_ABI, WrappedTokenInfo, bridgeNonFungibleTokens, bridgeTokens, checkNftApproval, checkTokenAllowance, fetchLuksoNfts, getAllSupportedTokens, getAttestationIDHash, getContractAddressFromChainId, getFee, getLoopsoContractFromChainId, getLoopsoContractFromContractAddr, getLuksoNftMetadata, getWrappedTokenInfo, isTokenSupported, unwrapNativeToken, wrapNativeToken };
