import { BigNumber } from "bignumber.js"; declare type Dimension = "tokens" | "shares"; declare type DimensionVector = { [k in Dimension]: number; }; declare abstract class Quantity> { readonly derivedConstructor: QuantityConstructor; readonly magnitude: BigNumber; readonly dimension: DimensionVector; readonly sign: -1 | 1; protected constructor(derivedConstructor: QuantityConstructor, magnitude: BigNumber, dimension: DimensionVector); multipliedBy(other: Percent): T extends (Scalar) ? Percent : T; multipliedBy(other: Scalar): T extends (Percent) ? Percent : T; multipliedBy>(other: B): T extends (Scalar | Percent) ? B : UnverifiedQuantity; dividedBy(other: Percent): T extends (Scalar) ? Percent : T; dividedBy(other: Scalar): T extends (Percent) ? Percent : T; dividedBy>(other: B): T extends (Scalar | Percent) ? B : UnverifiedQuantity; plus>(other: B): T; minus>(other: B): T; isZero(): boolean; lt>(other: B): boolean; lte>(other: B): boolean; gt>(other: B): boolean; gte>(other: B): boolean; abs(): T; negated(): T; min>(other: B): T; max>(other: B): T; toNumber(): number; } interface QuantityConstructor> { new (magnitude: BigNumber): T; } interface VerifiableQuantity> extends QuantityConstructor { ZERO: T; isValidMagnitude?(magnitude: BigNumber): undefined | Error; } declare class UnverifiedQuantity extends Quantity { constructor(magnitude: BigNumber, dimension: DimensionVector); expect>(vq: VerifiableQuantity): T; } export declare function scalar(magnitude: number | BigNumber): Scalar; export declare class Scalar extends Quantity { static ZERO: Scalar; static ONE: Scalar; static TWO: Scalar; scalar: true; constructor(magnitude: BigNumber); } export declare function percent(magnitude: number | BigNumber): Percent; export declare class Percent extends Quantity { static ZERO: Percent; static ONE: Percent; percent: true; constructor(magnitude: BigNumber); } export declare function tokens(magnitude: number | BigNumber): Tokens; export declare class Tokens extends Quantity { static ZERO: Tokens; tokens: true; constructor(magnitude: BigNumber); } export declare function shares(magnitude: number | BigNumber): Shares; export declare class Shares extends Quantity { static ZERO: Shares; static ONE: Shares; shares: true; constructor(magnitude: BigNumber); } export declare function price(magnitude: number | BigNumber): Price; export declare class Price extends Quantity { static ZERO: Price; price: true; constructor(magnitude: BigNumber); } export declare function safePercent, B extends Quantity>(params: { numerator: A | undefined | null; denominator: B | undefined | null; subtractOne: boolean; }): Percent; export {};