import { Connection, Keypair, PublicKey, Transaction, TransactionSignature, TransactionInstruction } from "@solana/web3.js";
import { TokenMetadata } from "@solana/spl-token-metadata";
import { Token } from "../../core/token";
export interface MetadataConfig {
    name: string;
    symbol: string;
    uri: string;
    additionalMetadata?: Record<string, string>;
}
export interface NFTMetadataContent {
    name?: string;
    description?: string;
    image?: string;
    animation_url?: string;
    external_url?: string;
    attributes?: Array<{
        trait_type: string;
        value: string | number;
    }>;
    properties?: Record<string, unknown>;
    [key: string]: unknown;
}
export type MetadataUpdateResult = {
    signature: TransactionSignature;
    metadata: TokenMetadata;
};
export type MetadataInstructionResult = {
    instructions: TransactionInstruction[];
    metadata?: TokenMetadata;
};
export declare class TokenMetadataToken extends Token {
    private metadata;
    constructor(connection: Connection, mint: PublicKey, metadata: MetadataConfig);
    getMintAddress(): PublicKey;
    static create(connection: Connection, payer: Keypair, params: {
        decimals: number;
        mintAuthority: PublicKey;
        metadata: MetadataConfig;
    }): Promise<TokenMetadataToken>;
    static fromMint(connection: Connection, mint: PublicKey): Promise<TokenMetadataToken | null>;
    getTokenMetadata(): Promise<TokenMetadata>;
    updateMetadataField(authority: Keypair, field: string, value: string): Promise<MetadataUpdateResult>;
    createUpdateMetadataFieldInstruction(updateAuthority: PublicKey, field: string, value: string): TransactionInstruction;
    removeMetadataField(authority: Keypair, key: string): Promise<MetadataUpdateResult>;
    createRemoveMetadataFieldInstruction(updateAuthority: PublicKey, key: string, idempotent?: boolean): TransactionInstruction;
    updateMetadataBatch(authority: Keypair, fields: Record<string, string>): Promise<MetadataUpdateResult>;
    createUpdateMetadataBatchInstructions(updateAuthority: PublicKey, fields: Record<string, string>): TransactionInstruction[];
    getNFTMetadata(): Promise<NFTMetadataContent>;
    getMetadataConfig(): MetadataConfig;
    updateMetadataAuthority(currentAuthority: Keypair, newAuthority: PublicKey | null): Promise<TransactionSignature>;
    createUpdateMetadataAuthorityInstruction(currentAuthority: PublicKey, newAuthority: PublicKey | null): TransactionInstruction;
    /**
     * Tạo instruction ưu tiên với mức phí thích hợp
     * @param priorityLevel Mức độ ưu tiên: 'low', 'medium', 'high'
     * @returns Instruction phí ưu tiên
     */
    static createPriorityFeeInstruction(priorityLevel?: 'low' | 'medium' | 'high'): TransactionInstruction;
    /**
     * Calculate and allocate space for metadata
     * @param connection - Solana connection
     * @param mint - Mint address
     * @param fieldName - Name of the field to add or update
     * @param fieldValue - Value to set for the field
     * @param payer - Payer public key
     * @returns Instruction to allocate additional space (or null if not needed)
     */
    private calculateAndAllocateSpaceForField;
    /**
     * Calculate and allocate space efficiently for multiple metadata fields
     * @param connection - Solana connection
     * @param mint - Mint address
     * @param fields - Object with field names and values
     * @param payer - Payer public key
     * @returns Instruction to allocate additional space (or null if not needed)
     */
    private calculateAndAllocateSpaceForMultipleFields;
    /**
     * Cập nhật metadata với tối ưu hóa
     * @param connection Kết nối Solana
     * @param wallet Đối tượng wallet-adapter
     * @param fieldName Tên trường cần cập nhật
     * @param fieldValue Giá trị mới
     * @param options Tùy chọn (phí ưu tiên, skipPreflight...)
     * @returns Thông tin giao dịch
     */
    updateMetadataOptimized(connection: Connection, wallet: {
        publicKey: PublicKey;
        signTransaction: (tx: Transaction) => Promise<Transaction>;
    }, fieldName: string, fieldValue: string, options?: {
        priorityLevel?: 'low' | 'medium' | 'high';
        skipPreflight?: boolean;
        allocateStorage?: boolean;
    }): Promise<{
        signature: string;
    }>;
    /**
     * Cập nhật nhiều trường metadata với tối ưu hóa
     * @param connection Kết nối Solana
     * @param wallet Đối tượng wallet-adapter
     * @param fields Object chứa các cặp key-value cần cập nhật
     * @param options Tùy chọn cấu hình
     * @returns Mảng chữ ký giao dịch
     */
    updateMetadataBatchOptimized(connection: Connection, wallet: {
        publicKey: PublicKey;
        signTransaction: (tx: Transaction) => Promise<Transaction>;
    }, fields: Record<string, string>, options?: {
        maxFieldsPerTransaction?: number;
        priorityLevel?: 'low' | 'medium' | 'high';
        skipPreflight?: boolean;
        allocateStorage?: boolean;
    }): Promise<{
        signatures: string[];
    }>;
}
