import { FeeStructure, LoginMessageMode } from '../../types/hinkal.types';
import { ContractType, EthereumNetwork } from '../../types/ethereum-network.types';
import { EncryptedOutputWithSign } from '../../types/commitments.types';
import { ExternalActionId } from '../../types/external-action.types';
import { IMultiThreadedUtxoUtils } from '../../types/IMultiThreadedUtxoUtils';
import { ERC20Token, PrivateRecipientInfo, TokenBalance, TokenChanges } from '../../types/token.types';
import { ethers } from 'ethers';
import { UserKeys } from '../crypto-keys/keys';
import { IProviderAdapter } from '../provider-adapter/IProviderAdapter';
import { ClientAccessTokenSnapshotService, ClientCommitmentsSnapshotService, ClientNullifierSnapshotService, ClientSolanaAccessTokenSnapshotService, ClientSolanaCommitmentsSnapshotService, ClientSolanaNullifierSnapshotService } from '../snapshot';
import { MerkleTree } from '../merkle-tree';
import { IAPI } from '../../API/API';
import { ICacheDevice } from '../../types/ICacheDevice';
import { StealthAddressStructure, TypedData } from '../../types/circom-data.types';
import { SubAccount } from '../../types/proxy.types';
import { AdminTransactionType } from '../../types/admin.types';
import { Idl, Program } from '@coral-xyz/anchor';
import { PublicKey } from '@solana/web3.js';
import { BridgeRecipient } from '../../types/bridging-tx.types';
import { Utxo } from '../utxo/Utxo';
import { TronWeb } from 'tronweb';
export interface IHinkal<ConnectorType = unknown> {
    userKeys: UserKeys;
    readonly signingMessage: string;
    readonly privateTransferSigningMessage: string;
    merkleTreeHinkalByChain: Record<number, MerkleTree<bigint>>;
    merkleTreeAccessTokenByChain: Record<number, MerkleTree<bigint>>;
    nullifiersByChain: Record<number, Set<string>>;
    encryptedOutputsByChain: Record<number, EncryptedOutputWithSign[]>;
    commitmentsSnapshotServiceByChain: Record<number, ClientCommitmentsSnapshotService | ClientSolanaCommitmentsSnapshotService | undefined>;
    nullifierSnapshotServiceByChain: Record<number, ClientNullifierSnapshotService | ClientSolanaNullifierSnapshotService | undefined>;
    accessTokenSnapshotServiceByChain: Record<number, ClientAccessTokenSnapshotService | ClientSolanaAccessTokenSnapshotService | undefined>;
    generateProofRemotely: boolean;
    utxoUtils: IMultiThreadedUtxoUtils;
    cacheDevice: ICacheDevice;
    getBalances(chainId: number, passedShieldedPrivateKey: string, passedShieldedPublicKey: string, ethAddress: string, resetCacheBefore?: boolean, updateTokensListBefore?: boolean): Promise<Map<string, TokenBalance>>;
    getTotalBalance(chainId: number, userKeys?: UserKeys, ethAddress?: string, resetCacheBefore?: boolean, updateTokensListBefore?: boolean, useBlockedUtxos?: boolean): Promise<TokenBalance[]>;
    getStuckShieldedBalances(chainId: number, userKeys?: UserKeys, ethAddress?: string, resetCacheBefore?: boolean, updateTokensListBefore?: boolean): Promise<TokenBalance[]>;
    getSupportedPassportLinks(): string[];
    checkAccessToken(chainId: number, accessKeyOverride?: string): Promise<boolean>;
    checkExternalTokenLimitsUSD(chainId: number, tokenAddresses: string[], amounts: bigint[]): Promise<boolean>;
    getSupportedChains(): number[];
    getEthereumAddress(): Promise<string>;
    getEthereumAddressByChain(chainId: number): Promise<string>;
    getHinkalTreeRootHash(chainId: number): Promise<bigint>;
    getAccessTokenTreeRootHash(chainId: number): Promise<bigint>;
    resetMerkleTreesIfNecessary(chainIdsToCheck?: number[]): Promise<void>;
    resetMerkle(chainIds?: number[]): Promise<void>;
    getRandomRelay(chainId: number, markAsPending?: boolean): Promise<string | undefined>;
    getGasPrice(chainId: number): Promise<bigint>;
    getAPI(): IAPI;
    snapshotsClearInterval(): void;
    checkTokenRegistry(chainId: number, erc20Addresses: string[], amountChanges: bigint[]): Promise<boolean>;
    getRecipientInfo(): string;
    deposit(erc20Tokens: ERC20Token[], amountChanges: bigint[], preEstimateGas?: boolean, returnTxData?: boolean): Promise<ethers.TransactionResponse | ethers.TransactionRequest>;
    depositForOther(erc20Tokens: ERC20Token[], amountChanges: bigint[], recepinetInfo: string, preEstimateGas?: boolean, returnTxData?: boolean): Promise<ethers.TransactionResponse | ethers.TransactionRequest>;
    claimUtxo(erc20Token: ERC20Token, utxo: Utxo, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
    depositAndWithdraw(erc20Token: ERC20Token, recipientAmounts: bigint[], recipientAddresses: string[], txCompletionTime?: number, feeStructureOverride?: FeeStructure, ref?: string, action?: AdminTransactionType, dashboardAccountId?: string, preEstimateGas?: boolean): Promise<string>;
    depositAndBridge(erc20Token: ERC20Token, recipientBridges: BridgeRecipient[], txCompletionTime?: number, feeStructureOverride?: FeeStructure, ref?: string, action?: AdminTransactionType, dashboardAccountId?: string, preEstimateGas?: boolean): Promise<string>;
    prooflessDeposit(erc20Tokens: ERC20Token[], amountChanges: bigint[], stealthAddressStructures?: StealthAddressStructure[], action?: AdminTransactionType): Promise<string>;
    getSolanaProgram(idl: Idl): Program;
    getSolanaPublicKey(): PublicKey;
    depositSolana(amount: bigint, token: ERC20Token): Promise<string>;
    depositSolanaForOther(amount: bigint, token: ERC20Token, recipientInfo: string): Promise<string>;
    transfer(erc20Tokens: ERC20Token[], amountChanges: bigint[], recipientAddress: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
    withdraw(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], recipientAddress: string, isRelayerOff: boolean, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<ethers.TransactionResponse | string>;
    withdrawStuckUtxos(erc20Token: ERC20Token, recipientAddress: string): Promise<string[]>;
    swap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
    getProviderAdapter(chainId?: number): IProviderAdapter;
    getTronWeb(): TronWeb;
    getSigningMessage(mode?: LoginMessageMode): string;
    initUserKeys(mode?: LoginMessageMode): Promise<void>;
    initUserKeysWithSignature(signature: string): void;
    initUserKeysFromSeedPhrases(seedPhrases: string[]): Promise<void>;
    initProviderAdapter(connector: ConnectorType, providerAdapter: IProviderAdapter<ConnectorType>): Promise<void>;
    disconnectFromConnector(): Promise<void>;
    resetProviderAdapters(): Promise<void>;
    setListeners(providerAdapter: IProviderAdapter): Promise<void>;
    waitForTransaction(chainId: number, transactionHash: string, confirmations?: number): Promise<boolean>;
    getContract(chainId: number, contractType: ContractType, contractAddress?: string): ethers.Contract;
    getContractWithSigner(chainId: number, contractType: ContractType, contractAddress?: string): ethers.Contract;
    getContractWithFetcher(chainId: number, contractType: ContractType, contractAddress?: string): ethers.Contract;
    getContractWithFetcherByChainId(chainId: number, contractType: ContractType, contractAddress?: string): ethers.Contract;
    isSelectedNetworkSupported(chainId: number): boolean;
    switchNetwork(network: EthereumNetwork): Promise<unknown>;
    monitorConnectedAddress(chainId: number): Promise<void>;
    isPermitterAvailable(chainId: number): boolean;
    signMessage(message: string): Promise<string>;
    signTypedData(domain: ethers.TypedDataDomain, types: Record<string, ethers.TypedDataField[]>, value: Record<string, unknown>): Promise<string>;
    signWithSubAccount(chainId: number, messageToSign: string | undefined, typedData: TypedData | undefined, subAccount: SubAccount): Promise<string>;
    actionPrivateWallet(chainId: number, erc20Tokens: ERC20Token[], deltaAmounts: bigint[], onChainCreation: boolean[], ops: string[], emporiumTokenChanges: TokenChanges<bigint>[], subAccount?: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, relayOverride?: string, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType, privateRecipientInfo?: PrivateRecipientInfo): Promise<string>;
    actionReceive(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], feeTokens?: string, feeStructureOverride?: FeeStructure, subAccount?: SubAccount, action?: AdminTransactionType): Promise<string>;
    proxySwap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType): Promise<string>;
    proxyToPrivate(erc20Tokens: ERC20Token[], deltaAmountsBase: bigint[], subAccount: SubAccount, recipientInfo: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
    proxySend(erc20Tokens: ERC20Token[], amounts: bigint[], subAccount: SubAccount, recipientAddress: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
    multiSendPrivateRecipients(erc20Tokens: ERC20Token[], amounts: bigint[], extendedRecipientInfos?: string[]): Promise<string>;
    areMerkleTreeUpdatesDisabled(): boolean;
    updateMerkleTreeUpdates(value: boolean): void;
}
