```ts
export function baseAmount(amount: number, unit: string, defs: Record<string, [number, string]>, base: string): number {
    if (amount < 0 || !Number.isInteger(amount)) throw new Error("Invalid amount");
    if (!(unit in defs) && unit !== base) throw new Error("Invalid unit");

    const seen = new Set<string>();

    while (unit !== base) {
        if (seen.has(unit)) throw new Error("Circular definition detected");
        seen.add(unit);

        const [factor, finer] = defs[unit];
        if (factor <= 0 || !Number.isInteger(factor)) throw new Error("Invalid factor");

        amount *= factor;
        unit = finer;
    }

    return amount;
}
```