import { Effect as Eff, Equal, FastCheck, Hash, Inspectable, Schema } from "effect";
import * as AssetName from "./AssetName.js";
import * as CBOR from "./CBOR.js";
import * as MultiAsset from "./MultiAsset.js";
import * as PolicyId from "./PolicyId.js";
declare const Assets_base: Schema.Class<Assets, {
    lovelace: typeof Schema.BigInt;
    multiAsset: Schema.optional<typeof MultiAsset.MultiAsset>;
}, Schema.Struct.Encoded<{
    lovelace: typeof Schema.BigInt;
    multiAsset: Schema.optional<typeof MultiAsset.MultiAsset>;
}>, never, {
    readonly lovelace: bigint;
} & {
    readonly multiAsset?: MultiAsset.MultiAsset | undefined;
}, {}, {}>;
/**
 * Assets representing both ADA and native tokens.
 *
 * This is a **base type** with no constraints on values.
 * Lovelace and token quantities can be positive, negative, or zero
 * to support arithmetic operations (merge, subtract, negate).
 *
 * Constraints (positive values) are applied at boundaries like
 * `TransactionOutput` where CDDL requires `value = coin / [coin, multiasset<positive_coin>]`.
 *
 * @since 2.0.0
 * @category model
 */
export declare class Assets extends Assets_base {
    toJSON(): {
        lovelace: string;
        multiAsset: {
            _tag: "MultiAsset";
            map: Record<string, Record<string, string>>;
        } | undefined;
    };
    toString(): string;
    [Inspectable.NodeInspectSymbol](): unknown;
    [Equal.symbol](that: unknown): boolean;
    [Hash.symbol](): number;
}
/**
 * Create Assets containing only ADA/Lovelace.
 *
 * @since 2.0.0
 * @category constructors
 */
export declare const fromLovelace: (lovelace: bigint) => Assets;
/**
 * Create Assets containing ADA and native tokens.
 *
 * @since 2.0.0
 * @category constructors
 */
export declare const withMultiAsset: (lovelace: bigint, multiAsset: MultiAsset.MultiAsset) => Assets;
/**
 * Create a single asset (policy + asset name + quantity) with optional ADA.
 *
 * @since 2.0.0
 * @category constructors
 */
export declare const fromAsset: (policyId: PolicyId.PolicyId, assetName: AssetName.AssetName, quantity: bigint, lovelace?: bigint) => Assets;
/**
 * Create a single asset from unit string format (policyId.assetName or policyId for empty asset name).
 *
 * @since 2.0.0
 * @category constructors
 */
export declare const fromUnit: (unit: string, quantity: bigint, lovelace?: bigint) => Eff.Effect<Assets, Error>;
/**
 * Create a single asset from hex policy ID and hex asset name strings.
 * This is a synchronous version using pre-validated hex strings.
 *
 * @since 2.0.0
 * @category constructors
 */
export declare const fromHexStrings: (policyIdHex: string, assetNameHex: string, quantity: bigint, lovelace?: bigint) => Assets;
/**
 * Create Assets from a record format (for convenience/testing).
 *
 * Record format:
 * - `lovelace`: bigint for ADA amount
 * - `"<policyIdHex><assetNameHex>"`: bigint for native asset quantity
 *   where policyId is exactly 56 hex chars and assetName is remaining hex chars
 *
 * @example
 * ```ts
 * import * as Assets from "@evolution-sdk/evolution/Assets"
 *
 * const assets = Assets.fromRecord({
 *   lovelace: 5_000_000n,
 * })
 * ```
 *
 * @since 2.0.0
 * @category constructors
 */
export declare const fromRecord: (record: Record<string, bigint>) => Assets;
/**
 * Empty Assets with zero ADA and no tokens.
 *
 * @since 2.0.0
 * @category constants
 */
export declare const zero: Assets;
/**
 * Extract the ADA/Lovelace amount.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const lovelaceOf: (assets: Assets) => bigint;
/**
 * Check if Assets contains native tokens.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const hasMultiAsset: (assets: Assets) => boolean;
/**
 * Get the MultiAsset if present.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const getMultiAsset: (assets: Assets) => MultiAsset.MultiAsset | undefined;
/**
 * Check if Assets is zero (no ADA and no tokens).
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const isZero: (assets: Assets) => boolean;
/**
 * Check if all quantities are positive (lovelace >= 0, tokens > 0).
 * Used for validation at transaction output boundaries per CDDL:
 * `value = coin / [coin, multiasset<positive_coin>]`
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const allPositive: (assets: Assets) => boolean;
/**
 * Get quantity of a specific asset.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const quantityOf: (assets: Assets, policyId: PolicyId.PolicyId, assetName: AssetName.AssetName) => bigint;
/**
 * Get all policy IDs in the Assets.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const policies: (assets: Assets) => Array<PolicyId.PolicyId>;
/**
 * Get all tokens for a specific policy.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const tokens: (assets: Assets, policyId: PolicyId.PolicyId) => Map<AssetName.AssetName, bigint>;
/**
 * Add two Assets together.
 * Combines ADA amounts and merges MultiAssets.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const merge: (a: Assets, b: Assets) => Assets;
/**
 * Add a single asset to Assets.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const add: (assets: Assets, policyId: PolicyId.PolicyId, assetName: AssetName.AssetName, quantity: bigint) => Assets;
/**
 * Add a single asset to Assets using hex strings for policy ID and asset name.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const addByHex: (assets: Assets, policyIdHex: string, assetNameHex: string, quantity: bigint) => Assets;
/**
 * Negate all quantities (ADA and tokens).
 *
 * @since 2.0.0
 * @category combining
 */
export declare const negate: (assets: Assets) => Assets;
/**
 * Get Assets without the ADA/Lovelace component.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const withoutLovelace: (assets: Assets) => Assets;
/**
 * Create a new Assets with a different lovelace amount, keeping multiAsset.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const withLovelace: (assets: Assets, lovelace: bigint) => Assets;
/**
 * Add lovelace to existing assets. Creates new Assets with added lovelace.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const addLovelace: (assets: Assets, additionalLovelace: bigint) => Assets;
/**
 * Subtract lovelace from existing assets. Creates new Assets with reduced lovelace.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const subtractLovelace: (assets: Assets, lovelaceToSubtract: bigint) => Assets;
/**
 * Subtract assets (a - b). Result can have negative values.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const subtract: (a: Assets, b: Assets) => Assets;
/**
 * Filter assets based on a predicate.
 *
 * @since 2.0.0
 * @category combining
 */
export declare const filter: (assets: Assets, predicate: (unit: string, amount: bigint) => boolean) => Assets;
/**
 * Check if assets are empty (zero lovelace and no tokens).
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const isEmpty: (assets: Assets) => boolean;
/**
 * Check if assets contain only ADA (no native tokens).
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const hasOnlyLovelace: (assets: Assets) => boolean;
/**
 * Get asset quantity by unit string.
 * Unit is either "lovelace" or "policyId.assetName" (hex encoded).
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const getByUnit: (assets: Assets, unit: string) => bigint;
/**
 * Get all unit strings from Assets.
 * Returns "lovelace" plus all "policyId.assetName" strings.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const getUnits: (assets: Assets) => Array<string>;
/**
 * Check if all requirements are covered by accumulated assets.
 * Compares lovelace and all token quantities.
 *
 * @since 2.0.0
 * @category inspection
 */
export declare const covers: (accumulated: Assets, required: Assets) => boolean;
/**
 * Flatten Assets into a list of [PolicyId, AssetName, Quantity] tuples.
 *
 * @since 2.0.0
 * @category transforming
 */
export declare const flatten: (assets: Assets) => Array<[PolicyId.PolicyId, AssetName.AssetName, bigint]>;
/**
 * Convert Assets to a nested Map structure.
 *
 * @since 2.0.0
 * @category transforming
 */
export declare const toDict: (assets: Assets) => Map<PolicyId.PolicyId, Map<AssetName.AssetName, bigint>>;
/**
 * CDDL schema type for Assets
 *
 * @since 2.0.0
 * @category schemas
 */
export declare const CDDLSchema: Schema.Union<[typeof Schema.BigIntFromSelf, Schema.Tuple2<typeof Schema.BigIntFromSelf, Schema.SchemaClass<ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, never>>]>;
/**
 * CDDL schema for Assets.
 *
 * CDDL: `value = coin / [coin, multiasset<positive_coin>]`
 *
 * @since 2.0.0
 * @category schemas
 */
export declare const FromCDDL: Schema.transformOrFail<Schema.Union<[typeof Schema.BigIntFromSelf, Schema.Tuple2<typeof Schema.BigIntFromSelf, Schema.SchemaClass<ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, never>>]>, Schema.SchemaClass<Assets, Assets, never>, never>;
/**
 * CBOR bytes transformation schema for Assets.
 *
 * @since 2.0.0
 * @category schemas
 */
export declare const FromCBORBytes: (options?: CBOR.CodecOptions) => Schema.transform<Schema.transformOrFail<typeof Schema.Uint8ArrayFromSelf, Schema.declare<CBOR.CBOR, CBOR.CBOR, readonly [], never>, never>, Schema.transformOrFail<Schema.Union<[typeof Schema.BigIntFromSelf, Schema.Tuple2<typeof Schema.BigIntFromSelf, Schema.SchemaClass<ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, never>>]>, Schema.SchemaClass<Assets, Assets, never>, never>>;
/**
 * CBOR hex transformation schema for Assets.
 *
 * @since 2.0.0
 * @category schemas
 */
export declare const FromCBORHex: (options?: CBOR.CodecOptions) => Schema.transform<Schema.Schema<Uint8Array<ArrayBufferLike>, string, never>, Schema.transform<Schema.transformOrFail<typeof Schema.Uint8ArrayFromSelf, Schema.declare<CBOR.CBOR, CBOR.CBOR, readonly [], never>, never>, Schema.transformOrFail<Schema.Union<[typeof Schema.BigIntFromSelf, Schema.Tuple2<typeof Schema.BigIntFromSelf, Schema.SchemaClass<ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, ReadonlyMap<Uint8Array<ArrayBufferLike>, ReadonlyMap<Uint8Array<ArrayBufferLike>, bigint>>, never>>]>, Schema.SchemaClass<Assets, Assets, never>, never>>>;
/**
 * @since 2.0.0
 * @category arbitrary
 */
export declare const arbitrary: FastCheck.Arbitrary<Assets>;
/**
 * Parse Assets from CBOR bytes.
 *
 * @since 2.0.0
 * @category decoding
 */
export declare const fromCBORBytes: (bytes: Uint8Array, options?: CBOR.CodecOptions) => Assets;
/**
 * Parse Assets from CBOR hex string.
 *
 * @since 2.0.0
 * @category decoding
 */
export declare const fromCBORHex: (hex: string, options?: CBOR.CodecOptions) => Assets;
/**
 * Encode Assets to CBOR bytes.
 *
 * @since 2.0.0
 * @category encoding
 */
export declare const toCBORBytes: (data: Assets, options?: CBOR.CodecOptions) => Uint8Array<ArrayBufferLike>;
/**
 * Encode Assets to CBOR hex string.
 *
 * @since 2.0.0
 * @category encoding
 */
export declare const toCBORHex: (data: Assets, options?: CBOR.CodecOptions) => string;
export {};
//# sourceMappingURL=Assets.d.ts.map