import { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';
import { CommitmentValidationDataType, DimDataType } from './circom-data.types';
import { OKXAccount } from './okx.types';
import { Adapter } from '@solana/wallet-adapter-base';
import { AdminDataType } from './admin.types';
export interface SolanaEvent {
    signature: string;
    slot: number;
    blockTime: number;
    programId: PublicKey;
    data: any;
    eventName: string;
}
export type SolanaWallet = {
    publicKey: PublicKey;
    signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
    signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
    signMessage: (message: Uint8Array, display?: string) => Promise<{
        signature: Uint8Array;
        publicKey: PublicKey;
    }>;
    adapter?: Adapter;
    isLedger?: boolean;
};
export interface SolanaArgs {
    proofAArr: number[];
    proofBArr: number[];
    proofCArr: number[];
    publicInputsArr: number[][];
    encryptedOutputs: number[][];
    relayerFee: string;
    variableRate?: string | null;
    dimensions: DimDataType;
}
export type SolanaTransactArgs = SolanaArgs;
export interface SolanaSwapArgs extends SolanaArgs {
    hinkalInstructions: Array<{
        accountIndexes: number[];
        data: number[];
        programIndex: number;
    }>;
}
export interface SolanaAccounts {
    recipient: string;
}
export interface SolanaTransactAccounts extends SolanaAccounts {
    mint?: string;
}
export interface SolanaSwapAccounts extends SolanaAccounts {
    storageAccount: string;
    storageVault: string;
    swapperAccount: string;
    mintFrom: string | null;
    mintTo: string | null;
    remainingAccounts: OKXAccount[];
    addressLookupTableAccount: string[];
}
export interface SolanaTransactBody {
    relayAddress: string;
    functionName: 'transact' | 'transfer';
    args: SolanaTransactArgs;
    accounts: SolanaTransactAccounts;
}
export interface SolanaSwapBody {
    relayAddress: string;
    functionName: 'swap';
    args: SolanaSwapArgs;
    accounts: SolanaSwapAccounts;
}
export interface SolanaAccessTokenData {
    accessKey: string;
    ethereumAddress: string;
}
export type SolanaTransactionBody = (SolanaTransactBody | SolanaSwapBody) & {
    chainId: number;
    commitmentValidationData?: CommitmentValidationDataType;
    recipientAmount?: string;
    solanaAccessTokenData?: SolanaAccessTokenData;
    adminData?: AdminDataType;
};
export interface SolanaTransactionParams {
    mintFrom?: string;
    mintTo?: string;
    recipient?: string;
    nullifierCount?: number;
}
export interface SolanaAccountKeys {
    storageAccount: string;
    swapperAccount: string;
    relayerPublicKey: string;
}
