/// <reference types="node" />
import { SubstrateNetwork } from '../../../SubstrateNetwork';
import { SCALEAccountId } from './type/SCALEAccountId';
import { SCALEArray } from './type/SCALEArray';
import { SCALEBoolean } from './type/SCALEBoolean';
import { SCALEBytes } from './type/SCALEBytes';
import { SCALECompactInt } from './type/SCALECompactInt';
import { SCALEData } from './type/SCALEData';
import { SCALEEnum } from './type/SCALEEnum';
import { SCALEEra } from './type/SCALEEra';
import { SCALEHash } from './type/SCALEHash';
import { SCALEInt } from './type/SCALEInt';
import { SCALEOptional } from './type/SCALEOptional';
import { SCALEString } from './type/SCALEString';
import { SCALETuple } from './type/SCALETuple';
import { SCALEType } from './type/SCALEType';
export declare type DecoderMethod<T> = (network: SubstrateNetwork, hex: string) => SCALEDecodeResult<T>;
export declare type DecoderPartialMethod<T> = (hex: string) => SCALEDecodeResult<T>;
export interface SCALEDecodeResult<T> {
    bytesDecoded: number;
    decoded: T;
}
export declare class SCALEDecoder {
    private readonly network;
    private hex;
    constructor(network: SubstrateNetwork, bytes: string | Uint8Array | Buffer);
    decodeNextAccountId(): SCALEDecodeResult<SCALEAccountId>;
    decodeNextArray<T extends SCALEType>(decoderMethod: DecoderMethod<T>): SCALEDecodeResult<SCALEArray<T>>;
    decodeNextBoolean(): SCALEDecodeResult<SCALEBoolean>;
    decodeNextBytes(): SCALEDecodeResult<SCALEBytes>;
    decodeNextCompactInt(): SCALEDecodeResult<SCALECompactInt>;
    decodeNextEra(): SCALEDecodeResult<SCALEEra>;
    decodeNextHash(bitLength: number): SCALEDecodeResult<SCALEHash>;
    decodeNextInt(bitLength: number): SCALEDecodeResult<SCALEInt>;
    decodeNextOptional<T extends SCALEType>(decoderMethod: DecoderMethod<T>): SCALEDecodeResult<SCALEOptional<T>>;
    decodeNextString(): SCALEDecodeResult<SCALEString>;
    decodeNextTuple<T extends SCALEType, R extends SCALEType>(firstDecoderMethod: DecoderMethod<T>, secondDecoderMethod: DecoderMethod<R>): SCALEDecodeResult<SCALETuple<T, R>>;
    decodeNextEnum<T>(getEnumValue: (value: number) => T | null): SCALEDecodeResult<SCALEEnum<T>>;
    decodeNextData(): SCALEDecodeResult<SCALEData>;
    decodeNextObject<T>(decoderMethod: DecoderMethod<T>): SCALEDecodeResult<T>;
    private decodeNextValuePartial;
    private decodeNextValue;
    private moveCursor;
}
