{"version":3,"file":"Amount.cjs","sources":["../../../src/types/Amount.ts"],"sourcesContent":["import { LAMPORTS_PER_SOL } from '@solana/web3.js';\nimport BN from 'bn.js';\n\nimport { CurrencyMismatchError, UnexpectedCurrencyError } from '../errors';\nimport { BigNumber, BigNumberValues, toBigNumber } from './BigNumber';\n\nexport type Amount<T extends Currency = Currency> = {\n  basisPoints: BigNumber;\n  currency: T;\n};\n\nexport type Currency = {\n  symbol: string;\n  decimals: number;\n  namespace?: 'spl-token';\n};\n\nexport type SplTokenCurrency = {\n  symbol: string;\n  decimals: number;\n  namespace: 'spl-token';\n};\nexport type SplTokenAmount = Amount<SplTokenCurrency>;\n\n/** @group Constants */\nexport const SOL = {\n  symbol: 'SOL',\n  decimals: 9,\n} as const;\nexport type SolCurrency = typeof SOL;\nexport type SolAmount = Amount<SolCurrency>;\n\n/** @group Constants */\nexport const USD = {\n  symbol: 'USD',\n  decimals: 2,\n} as const;\nexport type UsdCurrency = typeof USD;\nexport type UsdAmount = Amount<UsdCurrency>;\n\nexport const amount = <T extends Currency = Currency>(\n  basisPoints: BigNumberValues,\n  currency: T\n): Amount<T> => {\n  return {\n    basisPoints: toBigNumber(basisPoints),\n    currency,\n  };\n};\n\nexport const lamports = (lamports: BigNumberValues): SolAmount => {\n  return amount(lamports, SOL);\n};\n\nexport const sol = (sol: number): SolAmount => {\n  return lamports(sol * LAMPORTS_PER_SOL);\n};\n\nexport const usd = (usd: number): UsdAmount => {\n  return amount(usd * 100, USD);\n};\n\nexport const token = (\n  amount: BigNumberValues,\n  decimals = 0,\n  symbol = 'Token'\n): SplTokenAmount => {\n  const basisPoints = toBigNumber(\n    toBigNumber(amount).mul(toBigNumber(Math.pow(10, decimals)))\n  );\n\n  return {\n    basisPoints,\n    currency: {\n      symbol,\n      decimals,\n      namespace: 'spl-token',\n    },\n  };\n};\n\nexport const isSol = (currencyOrAmount: Currency | Amount): boolean => {\n  return sameCurrencies(currencyOrAmount, SOL);\n};\n\nexport const sameAmounts = (left: Amount, right: Amount): boolean => {\n  return sameCurrencies(left, right) && left.basisPoints.eq(right.basisPoints);\n};\n\nexport const sameCurrencies = (\n  left: Currency | Amount,\n  right: Currency | Amount\n): boolean => {\n  if ('currency' in left) {\n    left = left.currency;\n  }\n\n  if ('currency' in right) {\n    right = right.currency;\n  }\n\n  return (\n    left.symbol === right.symbol &&\n    left.decimals === right.decimals &&\n    left.namespace === right.namespace\n  );\n};\n\nexport function assertCurrency<T extends Currency>(\n  actual: Currency,\n  expected: T\n): asserts actual is T;\nexport function assertCurrency<T extends Currency>(\n  actual: Amount,\n  expected: T\n): asserts actual is Amount<T>;\nexport function assertCurrency<T extends Currency>(\n  actual: Currency | Amount,\n  expected: T\n): asserts actual is T | Amount<T>;\nexport function assertCurrency<T extends Currency>(\n  actual: Currency | Amount,\n  expected: T\n): asserts actual is T | Amount<T> {\n  if ('currency' in actual) {\n    actual = actual.currency;\n  }\n\n  if (!sameCurrencies(actual, expected)) {\n    throw new UnexpectedCurrencyError(actual, expected);\n  }\n}\nexport function assertSol(actual: Amount): asserts actual is SolAmount;\nexport function assertSol(actual: Currency): asserts actual is SolCurrency;\nexport function assertSol(\n  actual: Currency | Amount\n): asserts actual is SolCurrency | SolAmount;\nexport function assertSol(\n  actual: Currency | Amount\n): asserts actual is SolCurrency | SolAmount {\n  assertCurrency(actual, SOL);\n}\n\nexport function assertSameCurrencies<L extends Currency, R extends Currency>(\n  left: L | Amount<L>,\n  right: R | Amount<R>,\n  operation?: string\n) {\n  if ('currency' in left) {\n    left = left.currency;\n  }\n\n  if ('currency' in right) {\n    right = right.currency;\n  }\n\n  if (!sameCurrencies(left, right)) {\n    throw new CurrencyMismatchError(left, right, operation);\n  }\n}\n\nexport const addAmounts = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): Amount<T> => {\n  assertSameCurrencies(left, right, 'add');\n\n  return amount(left.basisPoints.add(right.basisPoints), left.currency);\n};\n\nexport const subtractAmounts = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): Amount<T> => {\n  assertSameCurrencies(left, right, 'subtract');\n\n  return amount(left.basisPoints.sub(right.basisPoints), left.currency);\n};\n\nexport const multiplyAmount = <T extends Currency>(\n  left: Amount<T>,\n  multiplier: number\n): Amount<T> => {\n  return amount(left.basisPoints.muln(multiplier), left.currency);\n};\n\nexport const divideAmount = <T extends Currency>(\n  left: Amount<T>,\n  divisor: number\n): Amount<T> => {\n  return amount(left.basisPoints.divn(divisor), left.currency);\n};\n\nexport const absoluteAmount = <T extends Currency>(\n  value: Amount<T>\n): Amount<T> => {\n  return amount(value.basisPoints.abs(), value.currency);\n};\n\nexport const compareAmounts = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): -1 | 0 | 1 => {\n  assertSameCurrencies(left, right, 'compare');\n\n  return left.basisPoints.cmp(right.basisPoints);\n};\n\nexport const isEqualToAmount = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>,\n  tolerance?: Amount<T>\n): boolean => {\n  tolerance = tolerance ?? amount(0, left.currency);\n  assertSameCurrencies(left, right, 'isEqualToAmount');\n  assertSameCurrencies(left, tolerance, 'isEqualToAmount');\n\n  const delta = absoluteAmount(subtractAmounts(left, right));\n\n  return isLessThanOrEqualToAmount(delta, tolerance);\n};\n\nexport const isLessThanAmount = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): boolean => compareAmounts(left, right) < 0;\n\nexport const isLessThanOrEqualToAmount = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): boolean => compareAmounts(left, right) <= 0;\n\nexport const isGreaterThanAmount = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): boolean => compareAmounts(left, right) > 0;\n\nexport const isGreaterThanOrEqualToAmount = <T extends Currency>(\n  left: Amount<T>,\n  right: Amount<T>\n): boolean => compareAmounts(left, right) >= 0;\n\nexport const isZeroAmount = (value: Amount): boolean =>\n  compareAmounts(value, amount(0, value.currency)) === 0;\n\nexport const isPositiveAmount = (value: Amount): boolean =>\n  compareAmounts(value, amount(0, value.currency)) >= 0;\n\nexport const isNegativeAmount = (value: Amount): boolean =>\n  compareAmounts(value, amount(0, value.currency)) < 0;\n\nexport const formatAmount = (value: Amount): string => {\n  if (value.currency.decimals === 0) {\n    return `${value.currency.symbol} ${value.basisPoints.toString()}`;\n  }\n\n  const power = new BN(10).pow(new BN(value.currency.decimals));\n  const basisPoints = value.basisPoints as unknown as BN & {\n    divmod: (other: BN) => { div: BN; mod: BN };\n  };\n\n  const { div, mod } = basisPoints.divmod(power);\n  const units = `${div.toString()}.${mod\n    .abs()\n    .toString(10, value.currency.decimals)}`;\n\n  return `${value.currency.symbol} ${units}`;\n};\n"],"names":["SOL","symbol","decimals","USD","amount","basisPoints","currency","toBigNumber","lamports","sol","LAMPORTS_PER_SOL","usd","token","arguments","length","undefined","mul","Math","pow","namespace","isSol","currencyOrAmount","sameCurrencies","sameAmounts","left","right","eq","assertCurrency","actual","expected","UnexpectedCurrencyError","assertSol","assertSameCurrencies","operation","CurrencyMismatchError","addAmounts","add","subtractAmounts","sub","multiplyAmount","multiplier","muln","divideAmount","divisor","divn","absoluteAmount","value","abs","compareAmounts","cmp","isEqualToAmount","tolerance","_tolerance","delta","isLessThanOrEqualToAmount","isLessThanAmount","isGreaterThanAmount","isGreaterThanOrEqualToAmount","isZeroAmount","isPositiveAmount","isNegativeAmount","formatAmount","concat","toString","power","BN","_basisPoints$divmod","divmod","div","mod","units"],"mappings":"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"}