import { AbstractStore, type ObjectLiteral, type Syncable, type TokenLikeModel, type TokenRaw, type Watchable } from '@broxus/js-core';
import { type Connection, PublicKey } from '@solana/web3.js';
import { SolanaTokenUtils } from '../../models/solana-token/SolanaTokenUtils';
export interface SolanaTokenData extends TokenRaw<PublicKey> {
}
export interface SolanaTokenState {
    isSyncing: boolean;
    isSyncingBalance: boolean;
}
export interface SolanaTokenCtorData extends Omit<SolanaTokenData, 'address'> {
    address: PublicKey | string;
}
export interface SolanaTokenCreateOptions extends Syncable, Watchable {
}
export declare class SolanaToken<T extends SolanaTokenData | ObjectLiteral = SolanaTokenData> extends AbstractStore<SolanaTokenData & T, SolanaTokenState> implements TokenLikeModel<PublicKey> {
    protected readonly _connection: Connection;
    static Utils: typeof SolanaTokenUtils;
    constructor(_connection: Connection, data: SolanaTokenCtorData['address'] | Readonly<T & SolanaTokenCtorData>);
    static create<V extends SolanaTokenData | ObjectLiteral = SolanaTokenData>(connection: Connection, data: SolanaTokenCtorData['address'] | Readonly<V & SolanaTokenCtorData>, options?: Readonly<SolanaTokenCreateOptions>): Promise<SolanaToken<V>>;
    balance(ownerAddress: PublicKey | string): Promise<string>;
    /**
     * Returns token root address as instance of Address.
     * @returns {SolanaTokenData['address']}
     */
    get address(): SolanaTokenData['address'];
    /**
     *
     */
    get chainId(): SolanaTokenData['chainId'];
    /**
     *
     */
    get decimals(): SolanaTokenData['decimals'];
    /**
     *
     */
    get icon(): SolanaTokenData['logoURI'];
    /**
     *
     */
    get name(): SolanaTokenData['name'];
    /**
     *
     */
    get root(): string;
    /**
     *
     */
    get symbol(): SolanaTokenData['symbol'];
    /**
     * Get custom value by the given key
     * @param {K extends keyof T & string} key
     */
    get<K extends keyof T & string>(key: K): T[K];
    /**
     * Returns copy of the current token
     */
    clone(): SolanaToken<T>;
}
