/** Declared unit for a schedule entry — never magnitude-inferred. */
type RateUnit = 'fraction' | 'percent' | 'basisPoints';
interface VatScheduleEntry {
    /** Inclusive lower bound, `YYYY-MM-DD`. */
    effectiveFrom: string;
    value: string | number;
    unit: RateUnit;
}
declare const vatRateBrand: unique symbol;
/** Opaque basis-points rate — construct only via `resolveVatRate` or the `from*` helpers. */
type VatRate = bigint & {
    readonly [vatRateBrand]: true;
};
/** A rate value failed the basis-points trust-boundary contract (integer, ≥ 0). */
declare class InvalidVatRateError extends Error {
    readonly value: string;
    constructor(message: string, value: unknown);
}
declare function fromBasisPoints(bp: bigint | number): VatRate;
declare function fromPercent(pct: bigint | number): VatRate;
/** `frac` is a decimal fraction string or number (e.g. `0.1700` → 1700 bp). */
declare function fromFraction(frac: string | number): VatRate;
/**
 * A `date` argument failed the `YYYY-MM-DD` trust-boundary contract.
 * Validated by shape only (no `Date` construction — that would reintroduce the
 * UTC-guess timezone pitfall the string contract exists to remove).
 */
declare class InvalidVatDateError extends Error {
    readonly value: string;
    constructor(message: string, value: unknown);
}
declare class NoRateForDateError extends Error {
    readonly date: string;
    readonly firstEffectiveFrom: string | undefined;
    constructor(date: string, firstEffectiveFrom?: string);
}
declare function fractionToBasisPoints(frac: string | number): bigint;
declare function normalizeToBasisPoints(value: string | number, unit: RateUnit): bigint;
/**
 * Last schedule entry with `effectiveFrom ≤ date` (most-recent-on-or-before).
 *
 * `date` is a **host-resolved `YYYY-MM-DD` legal date string** — never a JS
 * `Date`. A `Date` is an instant that only becomes a calendar day *through* a
 * timezone, and this module is country-neutral so it cannot know the legal
 * timezone; the host owns that resolution (see spec Money-math § date-contract).
 * Malformed input throws `InvalidVatDateError` (trust boundary). Throws
 * `NoRateForDateError` when the date precedes every entry.
 */
declare function resolveVatRate(schedule: readonly VatScheduleEntry[], date: string): VatRate;

/**
 * Israel VAT rate history — byte-faithful `IL_VAT_RATES` seed.
 * Sources: Israeli Tax Authority historical records.
 */
declare const IL_VAT_SCHEDULE: readonly VatScheduleEntry[];
/** EU per-country standard-rate schedules — scaffold; extend with full matrix over time. */
declare const EU_VAT_SCHEDULES: Readonly<Record<string, readonly VatScheduleEntry[]>>;
/**
 * EU reduced-rate category matrix — structure scaffold only.
 * Keys = category id; values = per-country rate in **basis points** (host resolves
 * category). Basis points (not percent) so non-integer reduced rates — e.g. FR 5.5%
 * = 550 bp — are represented losslessly; a float `5.5` would break the integer-only
 * `percent`/`basisPoints` normalizers (`BigInt(5.5)` throws).
 */
declare const EU_REDUCED_RATE_MATRIX: Readonly<Record<string, Readonly<Record<string, number>>>>;

/** A money amount failed the non-negative-agorot trust-boundary contract. */
declare class InvalidAmountError extends Error {
    readonly amount: string;
    constructor(label: string, amount: bigint);
}
/** Exclusive: VAT added to net; `gross = net + vat`. */
declare function applyVat(netAgorot: bigint, rate: VatRate): {
    vat: bigint;
    gross: bigint;
};
/** Inclusive: VAT extracted from gross; `net = gross − vat`. */
declare function extractVat(grossAgorot: bigint, rate: VatRate): {
    net: bigint;
    vat: bigint;
};

export { EU_REDUCED_RATE_MATRIX, EU_VAT_SCHEDULES, IL_VAT_SCHEDULE, InvalidAmountError, InvalidVatDateError, InvalidVatRateError, NoRateForDateError, type RateUnit, type VatRate, type VatScheduleEntry, applyVat, extractVat, fractionToBasisPoints, fromBasisPoints, fromFraction, fromPercent, normalizeToBasisPoints, resolveVatRate };
