import { UnlockCondition } from './unlock-condition';
import { Feature } from './feature';
import { HexEncodedString, NumericString, u64 } from '../../utils';
import { TokenScheme } from './token-scheme';
import { AccountId, NftId, AnchorId, DelegationId } from '../id';
import { EpochIndex } from '../../block/slot';
import { NativeToken } from '../../models/native-token';
import { Address, AccountAddress } from '../address';
export type OutputId = HexEncodedString;
/**
 * All of the output types.
 */
declare enum OutputType {
    /** A Basic output. */
    Basic = 0,
    /** An Account output. */
    Account = 1,
    /** An Anchor output. */
    Anchor = 2,
    /** A Foundry output. */
    Foundry = 3,
    /** An NFT output. */
    Nft = 4,
    /** A Delegation output. */
    Delegation = 5
}
/**
 * The base class for outputs.
 */
declare abstract class Output {
    readonly amount: NumericString;
    /**
     * The type of output.
     */
    readonly type: OutputType;
    /**
     * @param type The type of output.
     * @param amount The amount of the output as big-integer or string.
     */
    constructor(type: OutputType, amount: u64 | NumericString);
    /**
     * Get the amount of the output.
     */
    getAmount(): u64;
    /**
     * Parse an output from a plain JS JSON object.
     */
    static parse(data: any): Output;
}
/**
 * The base class for common outputs.
 */
declare abstract class CommonOutput extends Output {
    /**
     * The unlock conditions for the output.
     */
    readonly unlockConditions: UnlockCondition[];
    /**
     * The features contained by the output.
     */
    readonly features?: Feature[];
    /**
     * @param type The type of output.
     * @param amount The amount of the output.
     * @param unlockConditions Conditions to unlock the output.
     */
    constructor(type: OutputType, amount: u64, unlockConditions: UnlockCondition[]);
    /**
     * The native token held by the output.
     */
    getNativeToken(): NativeToken | undefined;
}
/**
 * A Basic output.
 */
declare class BasicOutput extends CommonOutput {
    /**
     * The amount of (stored) Mana held by the output.
     */
    readonly mana: u64;
    /**
     * @param amount The amount of the output.
     * @param mana The mana of the output.
     * @param unlockConditions The unlock conditions for the output.
     */
    constructor(amount: u64, mana: u64, unlockConditions: UnlockCondition[]);
}
/**
 * Base class for immutable feature outputs.
 */
declare abstract class ImmutableFeaturesOutput extends CommonOutput {
    readonly immutableFeatures?: Feature[];
    /**
     * @param type The type of output.
     * @param amount The amount of the output.
     * @param unlockConditions The unlock conditions for the output.
     */
    constructor(type: OutputType, amount: u64, unlockConditions: UnlockCondition[]);
}
/**
 * An Account output.
 */
declare class AccountOutput extends ImmutableFeaturesOutput {
    /**
     * Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it.
     * Unless its a newly created account, then the id is zeroed.
     */
    readonly accountId: AccountId;
    /**
     * A counter that denotes the number of foundries created by this account output.
     */
    readonly foundryCounter: number;
    /**
     * The amount of (stored) Mana held by the output.
     */
    readonly mana: u64;
    /**
     * @param amount The amount of the output.
     * @param mana The amount of stored mana.
     * @param accountId The account ID as hex-encoded string.
     * @param foundryCounter A counter that denotes the number of foundries created by this account output.
     * @param unlockConditions The unlock conditions of the output.
     */
    constructor(amount: u64, mana: u64, accountId: AccountId, foundryCounter: number, unlockConditions: UnlockCondition[]);
}
/**
 * An Anchor output.
 */
declare class AnchorOutput extends ImmutableFeaturesOutput {
    /**
     * Unique identifier of the anchor, which is the BLAKE2b-256 hash of the Output ID that created it.
     * Unless its a newly created anchor, then the id is zeroed.
     */
    readonly anchorId: AnchorId;
    /**
     * A counter that must increase by 1 every time the anchor output is state transitioned.
     */
    readonly stateIndex: number;
    /**
     * The amount of (stored) Mana held by the output.
     */
    readonly mana: u64;
    /**
     * @param amount The amount of the output.
     * @param mana The amount of stored mana.
     * @param anchorId The anchor ID as hex-encoded string.
     * @param stateIndex A counter that must increase by 1 every time the anchor output is state transitioned.
     * @param unlockConditions The unlock conditions of the output.
     */
    constructor(amount: u64, mana: u64, anchorId: AnchorId, stateIndex: number, unlockConditions: UnlockCondition[]);
}
/**
 * A Foundry output.
 */
declare class FoundryOutput extends ImmutableFeaturesOutput {
    /**
     * The serial number of the Foundry with respect to the controlling account.
     */
    readonly serialNumber: number;
    /**
     * The token scheme for the Foundry.
     */
    readonly tokenScheme: TokenScheme;
    /**
     * @param amount The amount of the output.
     * @param serialNumber The serial number of the Foundry with respect to the controlling account.
     * @param unlockConditions The unlock conditions of the output.
     * @param tokenScheme The token scheme for the Foundry.
     */
    constructor(amount: u64, serialNumber: number, unlockConditions: UnlockCondition[], tokenScheme: TokenScheme);
}
/**
 * An NFT output.
 */
declare class NftOutput extends ImmutableFeaturesOutput {
    /**
     * Unique identifier of the NFT, which is the BLAKE2b-256 hash of the Output ID that created it.
     * Unless its newly minted, then the id is zeroed.
     */
    readonly nftId: NftId;
    /**
     * The amount of (stored) Mana held by the output.
     */
    readonly mana: u64;
    /**
     * @param amount The amount of the output.
     * @param mana The amount of stored mana.
     * @param nftId The NFT ID as hex-encoded string.
     * @param unlockConditions The unlock conditions of the output.
     */
    constructor(amount: u64, mana: u64, nftId: NftId, unlockConditions: UnlockCondition[]);
}
/**
 * A Delegation output.
 */
declare class DelegationOutput extends Output {
    /**
     * The amount of delegated coins.
     */
    readonly delegatedAmount: u64;
    /**
     * Unique identifier of the Delegation Output, which is the BLAKE2b-256 hash of the Output ID that created it.
     */
    readonly delegationId: DelegationId;
    /**
     * The Account ID of the validator to which this output is delegating.
     */
    readonly validatorAddress: Address;
    /**
     * The index of the first epoch for which this output delegates.
     */
    readonly startEpoch: EpochIndex;
    /**
     * The index of the last epoch for which this output delegates.
     */
    readonly endEpoch: EpochIndex;
    /**
     * The unlock conditions for the output.
     */
    readonly unlockConditions: UnlockCondition[];
    /**
     * @param amount The amount of the output.
     * @param delegatedAmount The amount of delegated coins.
     * @param delegationId Unique identifier of the Delegation Output, which is the BLAKE2b-256 hash of the Output ID that created it.
     * @param validatorAddress The Account address of the validator to which this output is delegating.
     * @param startEpoch The index of the first epoch for which this output delegates.
     * @param endEpoch The index of the last epoch for which this output delegates.
     * @param unlockConditions The unlock conditions of the output.
     */
    constructor(amount: u64, delegatedAmount: u64, delegationId: DelegationId, validatorAddress: AccountAddress, startEpoch: EpochIndex, endEpoch: EpochIndex, unlockConditions: UnlockCondition[]);
}
declare const OutputDiscriminator: {
    property: string;
    subTypes: ({
        value: typeof BasicOutput;
        name: any;
    } | {
        value: typeof AccountOutput;
        name: any;
    } | {
        value: typeof AnchorOutput;
        name: any;
    } | {
        value: typeof FoundryOutput;
        name: any;
    } | {
        value: typeof NftOutput;
        name: any;
    } | {
        value: typeof DelegationOutput;
        name: any;
    })[];
};
export { OutputDiscriminator, Output, OutputType, CommonOutput, BasicOutput, AccountOutput, AnchorOutput, FoundryOutput, NftOutput, DelegationOutput, };
