import { BridgeRecipient, ERC20Token, ExternalActionId, FeeStructure, LoginMessageMode, StealthAddressStructure, SubAccount, TokenBalance, TokenChanges } from '../common/src/types';
import { ethers, TypedDataDomain, TypedDataField } from 'ethers';
import { Utxo } from '../common/src/data-structures/utxo/Utxo';
import { PublicKey } from '@solana/web3.js';
import { IProviderAdapter } from './IProviderAdapter';
import { PrivateBalanceUpdateEventType } from './balances.types';
export interface IHinkal<ConnectorType = unknown> {
    getProviderAdapter(chainId?: number): IProviderAdapter;
    initProviderAdapter(connector: ConnectorType, providerAdapter: IProviderAdapter<ConnectorType>): Promise<void>;
    initUserKeys(mode?: LoginMessageMode): Promise<void>;
    initUserKeysWithSignature(signature: string): void;
    initUserKeysFromSeedPhrases(seedPhrases: string[]): Promise<void>;
    resetProviderAdapters(): Promise<void>;
    disconnectFromConnector(): Promise<void>;
    signMessage(message: string): Promise<string>;
    signTypedData(domain: TypedDataDomain, types: Record<string, TypedDataField[]>, value: Record<string, unknown>): Promise<string>;
    getSupportedChains(): number[];
    isSelectedNetworkSupported(chainId: number): boolean;
    switchNetwork(chainId: number): Promise<unknown>;
    resetMerkle(chainIdsToReset?: number[]): Promise<void>;
    resetMerkleTreesIfNecessary(chainIdsToCheck?: number[]): Promise<void>;
    onBalanceRefresh(callback: (detail: PrivateBalanceUpdateEventType) => void | Promise<void>): () => void;
    getTotalBalance(chainId: number, resetCacheBefore?: boolean, updateTokensListBefore?: boolean): Promise<TokenBalance[]>;
    getStuckShieldedBalances(chainId: number, resetCacheBefore?: boolean, updateTokensListBefore?: boolean): Promise<TokenBalance[]>;
    monitorConnectedAddress(chainId: number): Promise<void>;
    getSupportedPassportLinks(): string[];
    checkAccessToken(chainId: number, accessKeyOverride?: string): Promise<boolean>;
    waitForTransaction(chainId: number, transactionHash: string, confirmations?: number): Promise<boolean>;
    getSolanaPublicKey(): PublicKey;
    getEthereumAddress(): Promise<string>;
    getEthereumAddressByChain(chainId: number): Promise<string>;
    getRecipientInfo(): string;
    getShieldedPublicKey(): string;
    prooflessDeposit(erc20Tokens: ERC20Token[], amountChanges: bigint[], stealthAddressStructures?: StealthAddressStructure[]): Promise<string>;
    deposit(erc20Tokens: ERC20Token[], amountChanges: bigint[], preEstimateGas?: boolean, returnTxData?: boolean): Promise<ethers.TransactionResponse | ethers.TransactionRequest>;
    depositSolana(amount: bigint, token: ERC20Token): Promise<string>;
    depositForOther(erc20Tokens: ERC20Token[], amountChanges: bigint[], recipientInfo: string, preEstimateGas?: boolean, returnTxData?: boolean): Promise<ethers.TransactionResponse | ethers.TransactionRequest>;
    depositSolanaForOther(amount: bigint, token: ERC20Token, recipientInfo: string): Promise<string>;
    depositAndWithdraw(erc20Token: ERC20Token, recipientAmounts: bigint[], recipientAddresses: string[], txCompletionTime?: number, feeStructureOverride?: FeeStructure, preEstimateGas?: boolean): Promise<string>;
    depositAndBridge(erc20Token: ERC20Token, recipientBridges: BridgeRecipient[], txCompletionTime?: number, feeStructureOverride?: FeeStructure, preEstimateGas?: boolean): Promise<string>;
    claimUtxo(erc20Token: ERC20Token, utxo: Utxo, feeStructureOverride?: FeeStructure): Promise<string>;
    transfer(erc20Tokens: ERC20Token[], amountChanges: bigint[], recipientAddress: string, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<string>;
    withdraw(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], recipientAddress: string, isRelayerOff: boolean, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<ethers.TransactionResponse | string>;
    withdrawStuckUtxos(erc20Token: ERC20Token, recipientAddress: string): Promise<string[]>;
    swap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<string>;
    actionPrivateWallet(chainId: number, erc20Tokens: ERC20Token[], deltaAmounts: bigint[], onChainCreation: boolean[], ops: string[], emporiumTokenChanges: TokenChanges<bigint>[], subAccount?: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<string>;
    proxySwap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<string>;
    proxyToPrivate(erc20Tokens: ERC20Token[], deltaAmountsBase: bigint[], subAccount: SubAccount, recipientInfo: string, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<string>;
    proxySend(erc20Tokens: ERC20Token[], amounts: bigint[], subAccount: SubAccount, recipientAddress: string, feeToken?: string, feeStructureOverride?: FeeStructure): Promise<string>;
}
