@leather.io/utils 0.35.1 → 0.35.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -5
- package/CHANGELOG.md +7 -0
- package/dist/index.js +2 -25
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/money/calculate-money.spec.ts +7 -1
- package/src/money/format-money.ts +2 -27
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @leather.io/utils@0.35.
|
|
2
|
+
> @leather.io/utils@0.35.2 build /home/runner/work/mono/mono/packages/utils
|
|
3
3
|
> tsup
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
[34mCLI[39m Using tsup config: /home/runner/work/mono/mono/packages/utils/tsup.config.ts
|
|
9
9
|
[34mCLI[39m Target: es2022
|
|
10
10
|
[34mESM[39m Build start
|
|
11
|
-
[32mESM[39m [1mdist/index.js [22m[
|
|
12
|
-
[32mESM[39m [1mdist/index.js.map [22m[
|
|
13
|
-
[32mESM[39m ⚡️ Build success in
|
|
11
|
+
[32mESM[39m [1mdist/index.js [22m[32m43.58 KB[39m
|
|
12
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m84.28 KB[39m
|
|
13
|
+
[32mESM[39m ⚡️ Build success in 27ms
|
|
14
14
|
[34mDTS[39m Build start
|
|
15
|
-
[32mDTS[39m ⚡️ Build success in
|
|
15
|
+
[32mDTS[39m ⚡️ Build success in 1574ms
|
|
16
16
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m12.48 KB[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -318,6 +318,13 @@
|
|
|
318
318
|
* @leather.io/constants bumped to 0.20.4
|
|
319
319
|
* @leather.io/models bumped to 0.33.0
|
|
320
320
|
|
|
321
|
+
## [0.35.2](https://github.com/leather-io/mono/compare/@leather.io/utils-v0.35.1...@leather.io/utils-v0.35.2) (2025-06-02)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
### Bug Fixes
|
|
325
|
+
|
|
326
|
+
* revert change to format money ([37d6044](https://github.com/leather-io/mono/commit/37d604476d51b949dffc1b7f0fef2698766404f2))
|
|
327
|
+
|
|
321
328
|
## [0.35.0](https://github.com/leather-io/mono/compare/@leather.io/utils-v0.34.1...@leather.io/utils-v0.35.0) (2025-05-28)
|
|
322
329
|
|
|
323
330
|
|
package/dist/index.js
CHANGED
|
@@ -108,34 +108,11 @@ function createMoney(value, symbol, resolution) {
|
|
|
108
108
|
return Object.freeze({ amount, symbol, decimals });
|
|
109
109
|
}
|
|
110
110
|
var thinSpace = "\u2009";
|
|
111
|
-
function exponentialToNumerical(amount) {
|
|
112
|
-
const [integral, decimal, power] = amount.toString().split(/[eE]|\./);
|
|
113
|
-
const expPowerValuePosition = 2;
|
|
114
|
-
const expPower = power ? +power.substring(0, expPowerValuePosition) : 0;
|
|
115
|
-
const positiveExponential = expPower >= 0;
|
|
116
|
-
if (decimal) {
|
|
117
|
-
if (positiveExponential) {
|
|
118
|
-
return Number(`${integral}${decimal.slice(0, +expPower)}.${decimal.slice(+expPower)}`);
|
|
119
|
-
}
|
|
120
|
-
return 0;
|
|
121
|
-
}
|
|
122
|
-
return Number(integral);
|
|
123
|
-
}
|
|
124
|
-
function formatMoneyWithoutSymbolWithoutScientific(amount, decimals) {
|
|
125
|
-
const numericalAmount = exponentialToNumerical(amount);
|
|
126
|
-
const formattedAmount = new BigNumber3(numericalAmount).shiftedBy(-decimals).toString();
|
|
127
|
-
const formattedAmountWithoutScientific = new BigNumber3(formattedAmount).toFixed(decimals);
|
|
128
|
-
return `${formattedAmountWithoutScientific}`;
|
|
129
|
-
}
|
|
130
111
|
function formatMoney({ amount, symbol, decimals }) {
|
|
131
|
-
|
|
132
|
-
amount,
|
|
133
|
-
decimals
|
|
134
|
-
);
|
|
135
|
-
return `${formattedAmountWithoutScientific} ${symbol}`;
|
|
112
|
+
return `${amount.shiftedBy(-decimals).toString()} ${symbol}`;
|
|
136
113
|
}
|
|
137
114
|
function formatMoneyWithoutSymbol({ amount, decimals }) {
|
|
138
|
-
return
|
|
115
|
+
return `${amount.shiftedBy(-decimals).toString()}`;
|
|
139
116
|
}
|
|
140
117
|
function formatMoneyToFixedDecimal({ amount, symbol, decimals }, fixedDecimals) {
|
|
141
118
|
return `${amount.shiftedBy(-decimals).toFixed(fixedDecimals)} ${symbol}`;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/counter.ts","../src/math/calculate-averages.ts","../src/math/helpers.ts","../src/math/fibonacci.ts","../src/math/scale-value.ts","../src/money/calculate-money.ts","../src/money/format-money.ts","../src/money/is-money.ts","../src/money/is-valid-precision.ts","../src/money/unit-conversion.ts","../src/accounts/account-addresses.ts","../src/assets/sort-assets.ts","../src/assets/asset-display-name.ts","../src/assets/balance-helpers.ts","../src/assets/inscription-helpers.ts","../src/time.ts","../src/truncate-middle.ts","../src/spam-filter/tlds-list.ts","../src/spam-filter/spam-filter.ts","../src/extract-phrase-from-string/extract-phrase-from-string.ts","../src/px-string-to-number/px-string-to-number.ts","../src/abbreviate-number/abbreviate-number.ts","../src/money/format-balance/remove-commas.ts","../src/money/format-balance/format-balance.ts","../src/explorer/make-stacks-tx-explorer-link.ts","../src/sanitize-content.ts"],"sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport { KEBAB_REGEX } from '@leather.io/constants';\nimport type { NetworkModes } from '@leather.io/models';\n\nexport { createCounter } from './counter';\nexport * from './math';\nexport * from './money';\nexport * from './accounts/account-addresses';\nexport * from './assets/sort-assets';\nexport * from './assets/asset-display-name';\nexport * from './assets/balance-helpers';\nexport * from './assets/inscription-helpers';\nexport * from './truncate-middle';\nexport * from './time';\n\nexport { spamFilter } from './spam-filter/spam-filter';\nexport { extractPhraseFromString } from './extract-phrase-from-string/extract-phrase-from-string';\nexport { pxStringToNumber } from './px-string-to-number/px-string-to-number';\nexport { formatBalance } from './money/format-balance/format-balance';\nexport { abbreviateNumber } from './abbreviate-number/abbreviate-number';\nexport { makeStacksTxExplorerLink } from './explorer/make-stacks-tx-explorer-link';\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number';\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nexport function isEmptyString(value: unknown): value is '' {\n return isString(value) && value === '';\n}\n\nexport function isBigInt(value: unknown): value is bigint {\n return typeof value === 'bigint';\n}\n\nexport function isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n\nexport function isFunction(value: unknown): value is () => void {\n return typeof value === 'function';\n}\n\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object';\n}\n\nexport function isError(value: unknown): value is Error {\n return value instanceof Error;\n}\n\nexport function isEmpty(value: object) {\n return Object.keys(value).length === 0;\n}\n\nexport function isDefined<T>(argument: T | undefined): argument is T {\n return !isUndefined(argument);\n}\n\nexport function isTypedArray(val: unknown): val is Uint8Array {\n const TypedArray = Object.getPrototypeOf(Uint8Array);\n return val instanceof TypedArray;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function undefinedIfLengthZero<T extends any[]>(arr: T) {\n return arr.length ? arr : undefined;\n}\n\ntype NetworkMap<T> = Record<NetworkModes, T>;\n\nexport function whenNetwork(mode: NetworkModes) {\n return <T extends NetworkMap<unknown>>(networkMap: T) => networkMap[mode] as T[NetworkModes];\n}\n\nexport function isEmptyArray(data: unknown[]) {\n return data.length === 0;\n}\n\n// TODO: extension concept, remove remove from utils\nexport const defaultWalletKeyId = 'default';\n\nexport function reverseBytes(bytes: Buffer): Buffer;\nexport function reverseBytes(bytes: Uint8Array): Uint8Array;\nexport function reverseBytes(bytes: Buffer | Uint8Array) {\n if (Buffer.isBuffer(bytes)) return Buffer.from(bytes).reverse();\n return new Uint8Array(bytes.slice().reverse());\n}\n\nexport function makeNumberRange(num: number) {\n return [...Array(num).keys()];\n}\n\nexport function createNumArrayOfRange(fromIndex: number, toIndex: number) {\n const result = [];\n for (let i = fromIndex; i <= toIndex; i++) {\n result.push(i);\n }\n return result;\n}\n\nexport async function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function sumNumbers(nums: number[]) {\n return nums.reduce((acc, num) => acc.plus(num), new BigNumber(0));\n}\n\nexport function isFulfilled<T>(p: PromiseSettledResult<T>): p is PromiseFulfilledResult<T> {\n return p.status === 'fulfilled';\n}\n\nexport function isRejected<T>(p: PromiseSettledResult<T>): p is PromiseRejectedResult {\n return p.status === 'rejected';\n}\n\nexport function createNullArrayOfLength(length: number) {\n return new Array(length).fill(null);\n}\n\nexport function safelyFormatHexTxid(id: string) {\n const prefix = '0x';\n if (id.startsWith(prefix)) return id;\n return prefix + id;\n}\n\nfunction kebabCase(str: string) {\n return str.replace(KEBAB_REGEX, match => '-' + match.toLowerCase());\n}\n\nfunction getLetters(string: string, offset = 1) {\n return string.slice(0, offset);\n}\n\nexport function getTicker(value: string) {\n let name = kebabCase(value);\n if (name.includes('-')) {\n const words = name.split('-');\n if (words.length >= 3) {\n name = `${getLetters(words[0])}${getLetters(words[1])}${getLetters(words[2])}`;\n } else {\n name = `${getLetters(words[0])}${getLetters(words[1], 2)}`;\n }\n } else if (name.length >= 3) {\n name = `${getLetters(name, 3)}`;\n }\n return name.toUpperCase();\n}\n\nexport function propIfDefined(prop: string, value: any) {\n return isBoolean(value) ? { [prop]: value } : {};\n}\n\nexport function isHexString(value: string) {\n return /^[0-9a-fA-F]+$/.test(value);\n}\n\nexport function toHexString(value: number) {\n return value.toString(16);\n}\n\nexport function hexToNumber(hex: string) {\n return parseInt(hex, 16);\n}\n\ntype MapFunction<T, U> = (value: T[keyof T], key: string) => U;\n\nexport function mapObject<T extends object, U>(\n obj: T,\n mapFn: MapFunction<T, U>\n): { [K in keyof T]: U } {\n const result: Partial<{ [K in keyof T]: U }> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = mapFn(obj[key], key);\n }\n }\n\n return result as { [K in keyof T]: U };\n}\n\nexport function assertIsTruthy<T>(val: T): asserts val is NonNullable<T> {\n if (!val) throw new Error(`expected: true, actual: ${val}`);\n}\n\n/**\n * Ensure all cases in a control flow are handled by asserting a value is `never`.\n *\n * Typically used in `switch` statements to enforce exhaustiveness.\n * TypeScript's type checking will catch unhandled cases at compile time.\n */\nexport function assertUnreachable(value: never): never {\n throw new Error(`Unexpected value: ${JSON.stringify(value)}`);\n}\n\nexport function assertExistence<T>(value: T, message: string): asserts value is NonNullable<T> {\n if (value === null || value === undefined) {\n throw new Error(message);\n }\n}\n\nexport function capitalize(val: string) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\n\nexport function uniqueArray<T>(arr: T[]) {\n return Array.from(new Set(arr));\n}\n\nexport function match<Variant extends string | number>() {\n return function matchVariant<T>(variant: Variant, match: Record<Variant, T>) {\n return match[variant];\n };\n}\n\nexport function removeTrailingNullCharacters(s: string) {\n return s.replace(/\\0*$/g, '');\n}\n\nexport function isNumberOrNumberList(value: unknown): value is number | number[] {\n if (Array.isArray(value)) return value.every(item => isNumber(item));\n return isNumber(value);\n}\n\nexport { sanitizeContent } from './sanitize-content';\n","export function createCounter(startPosition = 0) {\n let count = startPosition;\n return {\n getValue() {\n return count;\n },\n increment() {\n return (count += 1);\n },\n incrementBy(amount: number) {\n return (count += amount);\n },\n decrement() {\n return (count -= 1);\n },\n };\n}\n","import BigNumber from 'bignumber.js';\n\nimport { initBigNumber } from './helpers';\n\nexport function calculateMeanAverage(numbers: BigNumber[] | number[]) {\n if (numbers.length === 0) return new BigNumber(0);\n return numbers\n .map(initBigNumber)\n .reduce((acc, price) => acc.plus(price), new BigNumber(0))\n .dividedBy(numbers.length);\n}\n","import BigNumber from 'bignumber.js';\n\nimport { isBigInt } from '..';\n\nexport function initBigNumber(num: string | number | BigNumber | bigint) {\n if (BigNumber.isBigNumber(num)) return num;\n return isBigInt(num) ? new BigNumber(num.toString()) : new BigNumber(num);\n}\n\nexport function sumNumbers(nums: number[]) {\n return nums.reduce((acc, num) => acc.plus(num), new BigNumber(0));\n}\n\nfunction isMultipleOf(multiple: number) {\n return (num: number) => num % multiple === 0;\n}\n\nexport function isEven(num: number) {\n return isMultipleOf(2)(num);\n}\n\nexport function countDecimals(num: string | number | BigNumber) {\n const LARGE_NUMBER_OF_DECIMALS = 100;\n BigNumber.config({ DECIMAL_PLACES: LARGE_NUMBER_OF_DECIMALS });\n const amount = initBigNumber(num);\n const decimals = amount.toString(10).split('.')[1];\n return decimals ? decimals.length : 0;\n}\n\nexport function increaseValueByOneMicroStx(value: string | number | BigNumber) {\n return new BigNumber(value).plus(0.000001).toNumber();\n}\n","function fibonacci(n = 0): number {\n if (n < 0) throw new Error('Cannot calculate from negative number');\n if (n < 2) return n;\n return fibonacci(n - 1) + fibonacci(n - 2);\n}\n\nexport function* fibonacciGenerator(startIndex = 0): IterableIterator<number> {\n let index = startIndex;\n while (index < Infinity) yield fibonacci(index++);\n return Infinity;\n}\n","export function scaleValue(num: number): number {\n if (num === 0) return 0;\n const absNum = Math.abs(num);\n const exponent = Math.floor(Math.log10(absNum));\n const scale = Math.pow(10, exponent);\n const msd = Math.floor(absNum / scale);\n const result = msd * scale;\n // Fix floating point precision issues by rounding to 12 decimal places\n const rounded = Math.round(result * 1e12) / 1e12;\n return num < 0 ? -rounded : rounded;\n}\n","import { BigNumber } from 'bignumber.js';\n\nimport { type MarketData, type Money, type NumType, formatMarketPair } from '@leather.io/models';\n\nimport { isNumber } from '..';\nimport { initBigNumber } from '../math/helpers';\nimport { createMoney, formatMoney } from './format-money';\nimport { isMoney } from './is-money';\n\nexport function baseCurrencyAmountInQuoteWithFallback(quantity: Money, marketData?: MarketData) {\n return marketData ? baseCurrencyAmountInQuote(quantity, marketData) : createMoney(0, 'USD');\n}\n\nexport function baseCurrencyAmountInQuote(quantity: Money, { pair, price }: MarketData) {\n if (quantity.symbol !== pair.base)\n throw new Error(\n `Cannot calculate value of ${formatMoney(quantity)} with market pair of ${formatMarketPair(\n pair\n )}`\n );\n\n return createMoney(\n convertAmountToFractionalUnit(\n convertAmountToBaseUnit(quantity).times(convertAmountToBaseUnit(price)),\n price.decimals\n ),\n pair.quote\n );\n}\n\nexport function convertAmountToFractionalUnit(num: Money | BigNumber, decimals?: number) {\n if (isMoney(num)) return num.amount.shiftedBy(num.decimals);\n if (!isNumber(decimals)) throw new Error('Must define decimal of given currency');\n return num.shiftedBy(decimals);\n}\n\nexport function convertToMoneyTypeWithDefaultOfZero(\n symbol: string,\n num?: NumType,\n decimals?: number\n) {\n return createMoney(initBigNumber(num ?? 0), symbol.toUpperCase(), decimals);\n}\n\nexport function convertAmountToBaseUnit(num: Money | BigNumber, decimals?: number) {\n if (isMoney(num)) return num.amount.shiftedBy(-num.decimals);\n if (!isNumber(decimals)) throw new Error('Must define decimal of given currency');\n return num.shiftedBy(-decimals);\n}\n\nexport function subtractMoney(xAmount: Money, yAmount: Money) {\n if (xAmount.symbol !== yAmount.symbol) throw new Error('Cannot subtract different currencies');\n return createMoney(xAmount.amount.minus(yAmount.amount), xAmount.symbol, xAmount.decimals);\n}\n\nexport function sumMoney(moneysArr: Money[]) {\n if (moneysArr.some(item => item.symbol !== moneysArr[0].symbol))\n throw new Error('Cannot sum different currencies');\n\n const sum = moneysArr.reduce((acc, item) => acc.plus(item.amount), new BigNumber(0));\n return createMoney(sum, moneysArr[0].symbol, moneysArr[0].decimals);\n}\n\nexport function minMoney(moneyArr: Money[]) {\n if (moneyArr.length === 0) throw new Error('Cannot calculate min of empty array');\n\n const currency = moneyArr[0].symbol;\n if (!moneyArr.every(money => money.symbol === currency)) {\n throw new Error('Cannot calculate min of different currencies');\n }\n\n return moneyArr.reduce((smallest: Money, current: Money) => {\n return current.amount.isLessThan(smallest.amount) ? current : smallest;\n }, moneyArr[0]);\n}\n\nexport function maxMoney(moneyArr: Money[]) {\n if (moneyArr.length === 0) throw new Error('Cannot calculate max of empty array');\n\n const currency = moneyArr[0].symbol;\n if (!moneyArr.every(money => money.symbol === currency)) {\n throw new Error('Cannot calculate max of different currencies');\n }\n\n return moneyArr.reduce((largest: Money, current: Money) => {\n return current.amount.isGreaterThan(largest.amount) ? current : largest;\n }, moneyArr[0]);\n}\n","import BigNumber from 'bignumber.js';\n\nimport { currencyDecimalsMap } from '@leather.io/constants';\nimport type { Currency, Money, NumType } from '@leather.io/models';\n\nimport { isBigInt, isUndefined } from '..';\n\ntype KnownCurrencyDecimals = keyof typeof currencyDecimalsMap;\n\nfunction isResolutionOfCurrencyKnown(symbol: Currency): symbol is KnownCurrencyDecimals {\n return symbol in currencyDecimalsMap;\n}\n\nfunction getDecimalsOfSymbolIfKnown(symbol: Currency) {\n if (isResolutionOfCurrencyKnown(symbol)) return currencyDecimalsMap[symbol];\n return null;\n}\n\nfunction throwWhenDecimalUnknown(symbol: Currency, decimals?: number): asserts decimals is number {\n if (isUndefined(decimals) && isUndefined(getDecimalsOfSymbolIfKnown(symbol)))\n throw new Error(`Resolution of currency ${symbol} is unknown, must be described`);\n}\n\n/**\n * @param value Amount described in currency's primary unit\n * @param symbol Identifying letter code, e.g. EUR\n * @param resolution Optional, required if value not known at build-time\n */\nexport function createMoneyFromDecimal(\n value: NumType,\n symbol: Currency,\n resolution?: number\n): Money {\n throwWhenDecimalUnknown(symbol, resolution);\n const decimals = getDecimalsOfSymbolIfKnown(symbol) ?? resolution;\n const amount = new BigNumber(isBigInt(value) ? value.toString() : value).shiftedBy(decimals);\n return Object.freeze({ amount, symbol, decimals });\n}\n\n/**\n * @param value Amount described in currency's fractional base unit, e.g. cents for USD amounts\n * @param symbol Identifying letter code, e.g. EUR\n * @param resolution Optional, required if value not known at build-time\n */\nexport function createMoney(value: NumType, symbol: Currency, resolution?: number): Money {\n throwWhenDecimalUnknown(symbol, resolution);\n const decimals = getDecimalsOfSymbolIfKnown(symbol) ?? resolution;\n const amount = new BigNumber(isBigInt(value) ? value.toString() : value);\n return Object.freeze({ amount, symbol, decimals });\n}\n\nconst thinSpace = ' ';\n\nfunction exponentialToNumerical(amount: BigNumber) {\n const [integral, decimal, power] = amount.toString().split(/[eE]|\\./);\n const expPowerValuePosition = 2;\n const expPower = power ? +power.substring(0, expPowerValuePosition) : 0;\n const positiveExponential = expPower >= 0;\n if (decimal) {\n if (positiveExponential) {\n return Number(`${integral}${decimal.slice(0, +expPower)}.${decimal.slice(+expPower)}`);\n }\n return 0;\n }\n return Number(integral);\n}\n\nfunction formatMoneyWithoutSymbolWithoutScientific(amount: BigNumber, decimals: number) {\n const numericalAmount = exponentialToNumerical(amount);\n const formattedAmount = new BigNumber(numericalAmount).shiftedBy(-decimals).toString();\n const formattedAmountWithoutScientific = new BigNumber(formattedAmount).toFixed(decimals);\n return `${formattedAmountWithoutScientific}`;\n}\n\nexport function formatMoney({ amount, symbol, decimals }: Money) {\n const formattedAmountWithoutScientific = formatMoneyWithoutSymbolWithoutScientific(\n amount,\n decimals\n );\n return `${formattedAmountWithoutScientific} ${symbol}`;\n}\n\nexport function formatMoneyWithoutSymbol({ amount, decimals }: Money) {\n return formatMoneyWithoutSymbolWithoutScientific(amount, decimals);\n}\n\nexport function formatMoneyToFixedDecimal(\n { amount, symbol, decimals }: Money,\n fixedDecimals: number\n) {\n return `${amount.shiftedBy(-decimals).toFixed(fixedDecimals)} ${symbol}`;\n}\n\nexport function formatMoneyToFixedDecimalWithoutSymbol(\n { amount, decimals }: Money,\n fixedDecimals: number\n) {\n return `${amount.shiftedBy(-decimals).toFixed(fixedDecimals)}`;\n}\n\nexport function formatMoneyPadded({ amount, symbol, decimals }: Money) {\n return `${amount.shiftedBy(-decimals).toFormat(decimals)} ${symbol}`;\n}\n\nexport function i18nFormatCurrency(quantity: Money, decimals = 2) {\n const currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: quantity.symbol,\n maximumFractionDigits: decimals,\n });\n\n const formatted = currencyFormatter.format(\n quantity.amount.shiftedBy(-quantity.decimals).toNumber()\n );\n\n if (quantity.amount.isGreaterThan(0) && formatted === '$0.00')\n return '<' + thinSpace + formatted.replace('0.00', '0.01');\n\n return formatted;\n}\n\nexport function formatDustUsdAmounts(value: string) {\n return value.endsWith('0.00') ? '<' + thinSpace + value.replace('0.00', '0.01') : value;\n}\n","import BigNumber from 'bignumber.js';\n\nimport { Money } from '@leather.io/models';\n\nimport { isObject } from '..';\n\nexport function isMoney(val: unknown): val is Money {\n if (!isObject(val)) return false;\n return 'amount' in val && 'symbol' in val && 'decimals' in val;\n}\n\nexport function isMoneyGreaterThanZero(money: Money) {\n if (!BigNumber.isBigNumber(money.amount)) return;\n return !(money.amount.isNaN() || money.amount.isZero());\n}\n","import { isNumber } from '../index';\nimport { countDecimals } from '../math';\n\nexport function isValidPrecision(amount: number, precision: number) {\n if (!isNumber(amount)) return false;\n return countDecimals(amount) <= precision;\n}\n","import BigNumber from 'bignumber.js';\n\nimport { BTC_DECIMALS, STX_DECIMALS } from '@leather.io/constants';\nimport { Money } from '@leather.io/models';\n\nimport { initBigNumber } from '../math/helpers';\n\nfunction fractionalUnitToUnit(decimals: number) {\n return (unit: number | string | BigNumber) => {\n const unitBigNumber = initBigNumber(unit);\n return unitBigNumber.shiftedBy(-decimals);\n };\n}\n\nexport function unitToFractionalUnit(decimals: number) {\n return (unit: number | string | BigNumber) => {\n const unitBigNumber = initBigNumber(unit);\n return unitBigNumber.shiftedBy(decimals);\n };\n}\n\nexport const satToBtc = fractionalUnitToUnit(BTC_DECIMALS);\nexport const btcToSat = unitToFractionalUnit(BTC_DECIMALS);\n\nexport const microStxToStx = fractionalUnitToUnit(STX_DECIMALS);\nexport const stxToMicroStx = unitToFractionalUnit(STX_DECIMALS);\n\nexport function moneyToBaseUnit(sum: Money) {\n return fractionalUnitToUnit(sum.decimals)(sum.amount);\n}\n","import {\n AccountAddresses,\n AccountId,\n BitcoinAddressInfo,\n StacksAddressInfo,\n} from '@leather.io/models';\n\nexport function createAccountAddresses(\n accountId: AccountId,\n btcDescriptors: string[] = [],\n stxAddress?: string\n): AccountAddresses {\n const accountAddresses: AccountAddresses = { id: accountId };\n const taprootDescriptor = btcDescriptors.find(desc => desc.startsWith('tr('));\n const nativeSegwitDescriptor = btcDescriptors.find(desc => desc.startsWith('wpkh('));\n if (taprootDescriptor && nativeSegwitDescriptor) {\n accountAddresses.bitcoin = {\n taprootDescriptor,\n nativeSegwitDescriptor,\n };\n }\n if (stxAddress) {\n accountAddresses.stacks = { stxAddress };\n }\n return accountAddresses;\n}\n\nexport function hasBitcoinAddress(\n account: AccountAddresses\n): account is AccountAddresses & { bitcoin: BitcoinAddressInfo } {\n return account.bitcoin !== undefined;\n}\n\nexport function hasStacksAddress(\n account: AccountAddresses\n): account is AccountAddresses & { stacks: StacksAddressInfo } {\n return account.stacks !== undefined;\n}\n","import type { Money } from '@leather.io/models';\n\nexport function sortAssetsByName<T extends { name: string }[]>(assets: T) {\n return assets\n .sort((a, b) => {\n if (a.name < b.name) return -1;\n if (a.name > b.name) return 1;\n return 0;\n })\n .sort((a, b) => {\n if (a.name === 'STX') return -1;\n if (b.name !== 'STX') return 1;\n return 0;\n })\n .sort((a, b) => {\n if (a.name === 'BTC') return -1;\n if (b.name !== 'BTC') return 1;\n return 0;\n });\n}\n\nexport function migratePositiveAssetBalancesToTop<T extends { balance: Money }[]>(assets: T) {\n const assetsWithPositiveBalance = assets.filter(asset => asset.balance.amount.isGreaterThan(0));\n const assetsWithZeroBalance = assets.filter(asset => asset.balance.amount.isEqualTo(0));\n return [...assetsWithPositiveBalance, ...assetsWithZeroBalance] as T;\n}\n","import { CryptoAssetInfo } from '@leather.io/models';\n\nimport { assertUnreachable } from '../index';\n\nexport function getAssetDisplayName(asset: CryptoAssetInfo) {\n const { protocol } = asset;\n\n switch (protocol) {\n case 'nativeBtc':\n return 'bitcoin';\n case 'nativeStx':\n return 'stacks';\n case 'brc20':\n return 'brc-20';\n case 'inscription':\n return 'inscription';\n case 'rune':\n return 'rune';\n case 'sip10':\n return asset.name;\n case 'sip9':\n return asset.name;\n case 'stamp':\n return 'stamp';\n case 'src20':\n return 'src-20';\n case 'stx20':\n return 'stx-20';\n default:\n assertUnreachable(protocol);\n }\n}\n","import {\n BaseCryptoAssetBalance,\n BtcCryptoAssetBalance,\n Money,\n StxCryptoAssetBalance,\n} from '@leather.io/models';\n\nimport { createMoney, subtractMoney, sumMoney } from '../money';\n\nexport function createBaseCryptoAssetBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money\n): BaseCryptoAssetBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n return {\n totalBalance,\n inboundBalance,\n outboundBalance,\n pendingBalance: subtractMoney(sumMoney([totalBalance, inboundBalance]), outboundBalance),\n availableBalance: subtractMoney(totalBalance, outboundBalance),\n };\n}\n\nexport function createBtcCryptoAssetBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n protectedBal?: Money,\n uneconomicalBal?: Money,\n unspendableBal?: Money\n): BtcCryptoAssetBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n const protectedBalance = protectedBal ?? zeroBalance;\n const uneconomicalBalance = uneconomicalBal ?? zeroBalance;\n const unspendableBalance = unspendableBal ?? zeroBalance;\n const baseBalance = createBaseCryptoAssetBalance(totalBalance, inboundBalance, outboundBalance);\n return {\n ...baseBalance,\n protectedBalance,\n uneconomicalBalance,\n availableBalance: subtractMoney(totalBalance, unspendableBalance),\n unspendableBalance,\n };\n}\n\nexport function createStxCryptoAssetBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n lockedBal?: Money\n): StxCryptoAssetBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n const lockedBalance = lockedBal ?? zeroBalance;\n const baseBalance = createBaseCryptoAssetBalance(totalBalance, inboundBalance, outboundBalance);\n const availableBalance = subtractMoney(totalBalance, outboundBalance);\n return {\n ...baseBalance,\n lockedBalance,\n unlockedBalance: subtractMoney(totalBalance, lockedBalance),\n availableBalance,\n availableUnlockedBalance: subtractMoney(availableBalance, lockedBalance),\n };\n}\n\nexport function aggregateBaseCryptoAssetBalances(\n balances: BaseCryptoAssetBalance[]\n): BaseCryptoAssetBalance {\n return createBaseCryptoAssetBalance(\n sumMoney(balances.map(b => b.totalBalance)),\n sumMoney(balances.map(b => b.inboundBalance)),\n sumMoney(balances.map(b => b.outboundBalance))\n );\n}\n\nexport function aggregateBtcCryptoAssetBalances(\n balances: BtcCryptoAssetBalance[]\n): BtcCryptoAssetBalance {\n return createBtcCryptoAssetBalance(\n sumMoney(balances.map(b => b.totalBalance)),\n sumMoney(balances.map(b => b.inboundBalance)),\n sumMoney(balances.map(b => b.outboundBalance)),\n sumMoney(balances.map(b => b.protectedBalance)),\n sumMoney(balances.map(b => b.uneconomicalBalance)),\n sumMoney(balances.map(b => b.unspendableBalance))\n );\n}\n\nexport function aggregateStxCryptoAssetBalances(\n balances: StxCryptoAssetBalance[]\n): StxCryptoAssetBalance {\n return createStxCryptoAssetBalance(\n sumMoney(balances.map(b => b.totalBalance)),\n sumMoney(balances.map(b => b.inboundBalance)),\n sumMoney(balances.map(b => b.outboundBalance)),\n sumMoney(balances.map(b => b.lockedBalance))\n );\n}\n","import {\n CryptoAssetCategories,\n CryptoAssetChains,\n CryptoAssetProtocols,\n InscriptionCryptoAssetInfo,\n InscriptionMimeType,\n} from '@leather.io/models';\n\nimport { dateToUnixTimestamp } from '../time';\n\nexport function whenInscriptionMimeType<T>(\n mimeType: string,\n branches: { [k in InscriptionMimeType]?: () => T }\n) {\n if (mimeType.startsWith('audio/') && branches.audio) {\n return branches.audio();\n }\n if (mimeType.startsWith('text/html') && branches.html) {\n return branches.html();\n }\n if (mimeType.startsWith('image/svg') && branches.svg) {\n return branches.svg();\n }\n if (mimeType.startsWith('image/') && branches.image) {\n return branches.image();\n }\n if (mimeType.startsWith('text') && branches.text) {\n return branches.text();\n }\n if (mimeType.startsWith('video/') && branches.video) {\n return branches.video();\n }\n if (mimeType.startsWith('model/gltf') && branches.gltf) {\n return branches.gltf();\n }\n if (branches.other) return branches.other();\n\n throw new Error('Unhandled inscription type');\n}\n\nexport interface CreateInscriptionData {\n readonly id: string;\n readonly number: number;\n readonly contentSrc: string;\n readonly mimeType?: string;\n readonly ownerAddress: string;\n readonly satPoint: string;\n readonly genesisBlockHash: string;\n readonly genesisTimestamp: string | number;\n readonly genesisBlockHeight: number;\n readonly outputValue: string;\n}\n\nexport function createInscriptionCryptoAssetInfo(\n data: CreateInscriptionData\n): InscriptionCryptoAssetInfo {\n const iframeSrc = `https://ordinals.com/preview/${data.id}`;\n const preview = `https://ordinals.hiro.so/inscription/${data.id}`;\n const title = `Inscription ${data.number}`;\n const [txid, output, offset] = data.satPoint.split(':');\n\n const sharedInfo = {\n chain: CryptoAssetChains.bitcoin,\n category: CryptoAssetCategories.nft,\n protocol: CryptoAssetProtocols.inscription,\n id: data.id,\n number: data.number,\n output,\n txid,\n offset,\n address: data.ownerAddress,\n preview,\n title,\n genesisBlockHeight: data.genesisBlockHeight,\n genesisBlockHash: data.genesisBlockHash,\n genesisTimestamp: dateToUnixTimestamp(new Date(data.genesisTimestamp)),\n value: data.outputValue,\n };\n\n if (!data.mimeType) {\n return {\n ...sharedInfo,\n mimeType: 'other',\n src: '',\n };\n }\n\n return whenInscriptionMimeType<InscriptionCryptoAssetInfo>(data.mimeType, {\n audio: () => ({\n ...sharedInfo,\n mimeType: 'audio',\n name: 'inscription',\n src: iframeSrc,\n }),\n gltf: () => ({\n ...sharedInfo,\n mimeType: 'gltf',\n name: 'inscription',\n src: iframeSrc,\n }),\n html: () => ({\n ...sharedInfo,\n mimeType: 'html',\n name: 'inscription',\n src: iframeSrc,\n }),\n image: () => ({\n ...sharedInfo,\n mimeType: 'image',\n name: 'inscription',\n src: data.contentSrc,\n }),\n svg: () => ({\n ...sharedInfo,\n mimeType: 'svg',\n name: 'inscription',\n src: iframeSrc,\n }),\n text: () => ({\n ...sharedInfo,\n mimeType: 'text',\n name: 'inscription',\n src: data.contentSrc,\n }),\n video: () => ({\n ...sharedInfo,\n mimeType: 'video',\n name: 'inscription',\n src: iframeSrc,\n }),\n other: () => ({\n ...sharedInfo,\n mimeType: 'other',\n name: 'inscription',\n src: '',\n }),\n });\n}\n","// WARNING: When using `setTimeout` method, there is an upper maximum\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nexport const oneMinInMs = 60 * 1000;\nexport const fiveMinInMs = 5 * oneMinInMs;\nexport const oneDayInMs = 24 * 60 * 60 * 1000;\nexport const oneWeekInMs = 7 * oneDayInMs;\n\nexport function dateToUnixTimestamp(date: Date): number {\n return Math.floor(date.getTime() / 1000);\n}\n\nexport function weeksInMs(weeks: number) {\n return daysInMs(weeks * 7);\n}\n\nexport function daysInMs(days: number) {\n return hoursInMs(days * 24);\n}\n\nexport function hoursInMs(hours: number) {\n return minutesInMs(hours * 60);\n}\n\nexport function minutesInMs(minutes: number) {\n return secondsInMs(minutes * 60);\n}\n\nexport function secondsInMs(seconds: number) {\n return seconds * 1000;\n}\n\nexport function weeksInSec(weeks: number) {\n return daysInSec(weeks * 7);\n}\n\nexport function daysInSec(days: number) {\n return hoursInSec(days * 24);\n}\n\nexport function hoursInSec(hours: number) {\n return minutesInSec(hours * 60);\n}\n\nexport function minutesInSec(minutes: number) {\n return minutes * 60;\n}\n","function truncateHex(hex: string, offset = 5): string {\n return `${hex.substring(0, offset + 2)}…${hex.substring(hex.length - offset)}`;\n}\n\nexport function truncateMiddle(input: string, offset = 5): string {\n if (!input) return '';\n // Hex\n if (input.startsWith('0x')) {\n return truncateHex(input, offset);\n }\n // For contracts\n if (input.includes('.')) {\n const parts = input.split('.');\n const start = parts[0]?.substring(0, offset);\n const end = parts[0]?.substring(parts[0].length - offset, parts[0].length);\n return `${start}…${end}.${parts[1]}`;\n } else {\n // Everything else\n const start = input?.substring(0, offset);\n const end = input?.substring(input.length - offset, input.length);\n return `${start}…${end}`;\n }\n}\n","export const tlds = [\n 'AAA',\n 'AARP',\n 'ABB',\n 'ABBOTT',\n 'ABBVIE',\n 'ABC',\n 'ABLE',\n 'ABOGADO',\n 'ABUDHABI',\n 'AC',\n 'ACADEMY',\n 'ACCENTURE',\n 'ACCOUNTANT',\n 'ACCOUNTANTS',\n 'ACO',\n 'ACTOR',\n 'AD',\n 'ADS',\n 'ADULT',\n 'AE',\n 'AEG',\n 'AERO',\n 'AETNA',\n 'AF',\n 'AFL',\n 'AFRICA',\n 'AG',\n 'AGAKHAN',\n 'AGENCY',\n 'AI',\n 'AIG',\n 'AIRBUS',\n 'AIRFORCE',\n 'AIRTEL',\n 'AKDN',\n 'AL',\n 'ALIBABA',\n 'ALIPAY',\n 'ALLFINANZ',\n 'ALLSTATE',\n 'ALLY',\n 'ALSACE',\n 'ALSTOM',\n 'AM',\n 'AMAZON',\n 'AMERICANEXPRESS',\n 'AMERICANFAMILY',\n 'AMEX',\n 'AMFAM',\n 'AMICA',\n 'AMSTERDAM',\n 'ANALYTICS',\n 'ANDROID',\n 'ANQUAN',\n 'ANZ',\n 'AO',\n 'AOL',\n 'APARTMENTS',\n 'APP',\n 'APPLE',\n 'AQ',\n 'AQUARELLE',\n 'AR',\n 'ARAB',\n 'ARAMCO',\n 'ARCHI',\n 'ARMY',\n 'ARPA',\n 'ART',\n 'ARTE',\n 'AS',\n 'ASDA',\n 'ASIA',\n 'ASSOCIATES',\n 'AT',\n 'ATHLETA',\n 'ATTORNEY',\n 'AU',\n 'AUCTION',\n 'AUDI',\n 'AUDIBLE',\n 'AUDIO',\n 'AUSPOST',\n 'AUTHOR',\n 'AUTO',\n 'AUTOS',\n 'AW',\n 'AWS',\n 'AX',\n 'AXA',\n 'AZ',\n 'AZURE',\n 'BA',\n 'BABY',\n 'BAIDU',\n 'BANAMEX',\n 'BAND',\n 'BANK',\n 'BAR',\n 'BARCELONA',\n 'BARCLAYCARD',\n 'BARCLAYS',\n 'BAREFOOT',\n 'BARGAINS',\n 'BASEBALL',\n 'BASKETBALL',\n 'BAUHAUS',\n 'BAYERN',\n 'BB',\n 'BBC',\n 'BBT',\n 'BBVA',\n 'BCG',\n 'BCN',\n 'BD',\n 'BE',\n 'BEATS',\n 'BEAUTY',\n 'BEER',\n 'BENTLEY',\n 'BERLIN',\n 'BEST',\n 'BESTBUY',\n 'BET',\n 'BF',\n 'BG',\n 'BH',\n 'BHARTI',\n 'BI',\n 'BIBLE',\n 'BID',\n 'BIKE',\n 'BING',\n 'BINGO',\n 'BIO',\n 'BIZ',\n 'BJ',\n 'BLACK',\n 'BLACKFRIDAY',\n 'BLOCKBUSTER',\n 'BLOG',\n 'BLOOMBERG',\n 'BLUE',\n 'BM',\n 'BMS',\n 'BMW',\n 'BN',\n 'BNPPARIBAS',\n 'BO',\n 'BOATS',\n 'BOEHRINGER',\n 'BOFA',\n 'BOM',\n 'BOND',\n 'BOO',\n 'BOOK',\n 'BOOKING',\n 'BOSCH',\n 'BOSTIK',\n 'BOSTON',\n 'BOT',\n 'BOUTIQUE',\n 'BOX',\n 'BR',\n 'BRADESCO',\n 'BRIDGESTONE',\n 'BROADWAY',\n 'BROKER',\n 'BROTHER',\n 'BRUSSELS',\n 'BS',\n 'BT',\n 'BUILD',\n 'BUILDERS',\n 'BUSINESS',\n 'BUY',\n 'BUZZ',\n 'BV',\n 'BW',\n 'BY',\n 'BZ',\n 'BZH',\n 'CA',\n 'CAB',\n 'CAFE',\n 'CAL',\n 'CALL',\n 'CALVINKLEIN',\n 'CAM',\n 'CAMERA',\n 'CAMP',\n 'CANON',\n 'CAPETOWN',\n 'CAPITAL',\n 'CAPITALONE',\n 'CAR',\n 'CARAVAN',\n 'CARDS',\n 'CARE',\n 'CAREER',\n 'CAREERS',\n 'CARS',\n 'CASA',\n 'CASE',\n 'CASH',\n 'CASINO',\n 'CAT',\n 'CATERING',\n 'CATHOLIC',\n 'CBA',\n 'CBN',\n 'CBRE',\n 'CC',\n 'CD',\n 'CENTER',\n 'CEO',\n 'CERN',\n 'CF',\n 'CFA',\n 'CFD',\n 'CG',\n 'CH',\n 'CHANEL',\n 'CHANNEL',\n 'CHARITY',\n 'CHASE',\n 'CHAT',\n 'CHEAP',\n 'CHINTAI',\n 'CHRISTMAS',\n 'CHROME',\n 'CHURCH',\n 'CI',\n 'CIPRIANI',\n 'CIRCLE',\n 'CISCO',\n 'CITADEL',\n 'CITI',\n 'CITIC',\n 'CITY',\n 'CK',\n 'CL',\n 'CLAIMS',\n 'CLEANING',\n 'CLICK',\n 'CLINIC',\n 'CLINIQUE',\n 'CLOTHING',\n 'CLOUD',\n 'CLUB',\n 'CLUBMED',\n 'CM',\n 'CN',\n 'CO',\n 'COACH',\n 'CODES',\n 'COFFEE',\n 'COLLEGE',\n 'COLOGNE',\n 'COM',\n 'COMMBANK',\n 'COMMUNITY',\n 'COMPANY',\n 'COMPARE',\n 'COMPUTER',\n 'COMSEC',\n 'CONDOS',\n 'CONSTRUCTION',\n 'CONSULTING',\n 'CONTACT',\n 'CONTRACTORS',\n 'COOKING',\n 'COOL',\n 'COOP',\n 'CORSICA',\n 'COUNTRY',\n 'COUPON',\n 'COUPONS',\n 'COURSES',\n 'CPA',\n 'CR',\n 'CREDIT',\n 'CREDITCARD',\n 'CREDITUNION',\n 'CRICKET',\n 'CROWN',\n 'CRS',\n 'CRUISE',\n 'CRUISES',\n 'CU',\n 'CUISINELLA',\n 'CV',\n 'CW',\n 'CX',\n 'CY',\n 'CYMRU',\n 'CYOU',\n 'CZ',\n 'DAD',\n 'DANCE',\n 'DATA',\n 'DATE',\n 'DATING',\n 'DATSUN',\n 'DAY',\n 'DCLK',\n 'DDS',\n 'DE',\n 'DEAL',\n 'DEALER',\n 'DEALS',\n 'DEGREE',\n 'DELIVERY',\n 'DELL',\n 'DELOITTE',\n 'DELTA',\n 'DEMOCRAT',\n 'DENTAL',\n 'DENTIST',\n 'DESI',\n 'DESIGN',\n 'DEV',\n 'DHL',\n 'DIAMONDS',\n 'DIET',\n 'DIGITAL',\n 'DIRECT',\n 'DIRECTORY',\n 'DISCOUNT',\n 'DISCOVER',\n 'DISH',\n 'DIY',\n 'DJ',\n 'DK',\n 'DM',\n 'DNP',\n 'DO',\n 'DOCS',\n 'DOCTOR',\n 'DOG',\n 'DOMAINS',\n 'DOT',\n 'DOWNLOAD',\n 'DRIVE',\n 'DTV',\n 'DUBAI',\n 'DUNLOP',\n 'DUPONT',\n 'DURBAN',\n 'DVAG',\n 'DVR',\n 'DZ',\n 'EARTH',\n 'EAT',\n 'EC',\n 'ECO',\n 'EDEKA',\n 'EDU',\n 'EDUCATION',\n 'EE',\n 'EG',\n 'EMAIL',\n 'EMERCK',\n 'ENERGY',\n 'ENGINEER',\n 'ENGINEERING',\n 'ENTERPRISES',\n 'EPSON',\n 'EQUIPMENT',\n 'ER',\n 'ERICSSON',\n 'ERNI',\n 'ES',\n 'ESQ',\n 'ESTATE',\n 'ET',\n 'EU',\n 'EUROVISION',\n 'EUS',\n 'EVENTS',\n 'EXCHANGE',\n 'EXPERT',\n 'EXPOSED',\n 'EXPRESS',\n 'EXTRASPACE',\n 'FAGE',\n 'FAIL',\n 'FAIRWINDS',\n 'FAITH',\n 'FAMILY',\n 'FAN',\n 'FANS',\n 'FARM',\n 'FARMERS',\n 'FASHION',\n 'FAST',\n 'FEDEX',\n 'FEEDBACK',\n 'FERRARI',\n 'FERRERO',\n 'FI',\n 'FIDELITY',\n 'FIDO',\n 'FILM',\n 'FINAL',\n 'FINANCE',\n 'FINANCIAL',\n 'FIRE',\n 'FIRESTONE',\n 'FIRMDALE',\n 'FISH',\n 'FISHING',\n 'FIT',\n 'FITNESS',\n 'FJ',\n 'FK',\n 'FLICKR',\n 'FLIGHTS',\n 'FLIR',\n 'FLORIST',\n 'FLOWERS',\n 'FLY',\n 'FM',\n 'FO',\n 'FOO',\n 'FOOD',\n 'FOOTBALL',\n 'FORD',\n 'FOREX',\n 'FORSALE',\n 'FORUM',\n 'FOUNDATION',\n 'FOX',\n 'FR',\n 'FREE',\n 'FRESENIUS',\n 'FRL',\n 'FROGANS',\n 'FRONTIER',\n 'FTR',\n 'FUJITSU',\n 'FUN',\n 'FUND',\n 'FURNITURE',\n 'FUTBOL',\n 'FYI',\n 'GA',\n 'GAL',\n 'GALLERY',\n 'GALLO',\n 'GALLUP',\n 'GAME',\n 'GAMES',\n 'GAP',\n 'GARDEN',\n 'GAY',\n 'GB',\n 'GBIZ',\n 'GD',\n 'GDN',\n 'GE',\n 'GEA',\n 'GENT',\n 'GENTING',\n 'GEORGE',\n 'GF',\n 'GG',\n 'GGEE',\n 'GH',\n 'GI',\n 'GIFT',\n 'GIFTS',\n 'GIVES',\n 'GIVING',\n 'GL',\n 'GLASS',\n 'GLE',\n 'GLOBAL',\n 'GLOBO',\n 'GM',\n 'GMAIL',\n 'GMBH',\n 'GMO',\n 'GMX',\n 'GN',\n 'GODADDY',\n 'GOLD',\n 'GOLDPOINT',\n 'GOLF',\n 'GOO',\n 'GOODYEAR',\n 'GOOG',\n 'GOOGLE',\n 'GOP',\n 'GOT',\n 'GOV',\n 'GP',\n 'GQ',\n 'GR',\n 'GRAINGER',\n 'GRAPHICS',\n 'GRATIS',\n 'GREEN',\n 'GRIPE',\n 'GROCERY',\n 'GROUP',\n 'GS',\n 'GT',\n 'GU',\n 'GUCCI',\n 'GUGE',\n 'GUIDE',\n 'GUITARS',\n 'GURU',\n 'GW',\n 'GY',\n 'HAIR',\n 'HAMBURG',\n 'HANGOUT',\n 'HAUS',\n 'HBO',\n 'HDFC',\n 'HDFCBANK',\n 'HEALTH',\n 'HEALTHCARE',\n 'HELP',\n 'HELSINKI',\n 'HERE',\n 'HERMES',\n 'HIPHOP',\n 'HISAMITSU',\n 'HITACHI',\n 'HIV',\n 'HK',\n 'HKT',\n 'HM',\n 'HN',\n 'HOCKEY',\n 'HOLDINGS',\n 'HOLIDAY',\n 'HOMEDEPOT',\n 'HOMEGOODS',\n 'HOMES',\n 'HOMESENSE',\n 'HONDA',\n 'HORSE',\n 'HOSPITAL',\n 'HOST',\n 'HOSTING',\n 'HOT',\n 'HOTELS',\n 'HOTMAIL',\n 'HOUSE',\n 'HOW',\n 'HR',\n 'HSBC',\n 'HT',\n 'HU',\n 'HUGHES',\n 'HYATT',\n 'HYUNDAI',\n 'IBM',\n 'ICBC',\n 'ICE',\n 'ICU',\n 'ID',\n 'IE',\n 'IEEE',\n 'IFM',\n 'IKANO',\n 'IL',\n 'IM',\n 'IMAMAT',\n 'IMDB',\n 'IMMO',\n 'IMMOBILIEN',\n 'IN',\n 'INC',\n 'INDUSTRIES',\n 'INFINITI',\n 'INFO',\n 'ING',\n 'INK',\n 'INSTITUTE',\n 'INSURANCE',\n 'INSURE',\n 'INT',\n 'INTERNATIONAL',\n 'INTUIT',\n 'INVESTMENTS',\n 'IO',\n 'IPIRANGA',\n 'IQ',\n 'IR',\n 'IRISH',\n 'IS',\n 'ISMAILI',\n 'IST',\n 'ISTANBUL',\n 'IT',\n 'ITAU',\n 'ITV',\n 'JAGUAR',\n 'JAVA',\n 'JCB',\n 'JE',\n 'JEEP',\n 'JETZT',\n 'JEWELRY',\n 'JIO',\n 'JLL',\n 'JM',\n 'JMP',\n 'JNJ',\n 'JO',\n 'JOBS',\n 'JOBURG',\n 'JOT',\n 'JOY',\n 'JP',\n 'JPMORGAN',\n 'JPRS',\n 'JUEGOS',\n 'JUNIPER',\n 'KAUFEN',\n 'KDDI',\n 'KE',\n 'KERRYHOTELS',\n 'KERRYLOGISTICS',\n 'KERRYPROPERTIES',\n 'KFH',\n 'KG',\n 'KH',\n 'KI',\n 'KIA',\n 'KIDS',\n 'KIM',\n 'KINDLE',\n 'KITCHEN',\n 'KIWI',\n 'KM',\n 'KN',\n 'KOELN',\n 'KOMATSU',\n 'KOSHER',\n 'KP',\n 'KPMG',\n 'KPN',\n 'KR',\n 'KRD',\n 'KRED',\n 'KUOKGROUP',\n 'KW',\n 'KY',\n 'KYOTO',\n 'KZ',\n 'LA',\n 'LACAIXA',\n 'LAMBORGHINI',\n 'LAMER',\n 'LANCASTER',\n 'LAND',\n 'LANDROVER',\n 'LANXESS',\n 'LASALLE',\n 'LAT',\n 'LATINO',\n 'LATROBE',\n 'LAW',\n 'LAWYER',\n 'LB',\n 'LC',\n 'LDS',\n 'LEASE',\n 'LECLERC',\n 'LEFRAK',\n 'LEGAL',\n 'LEGO',\n 'LEXUS',\n 'LGBT',\n 'LI',\n 'LIDL',\n 'LIFE',\n 'LIFEINSURANCE',\n 'LIFESTYLE',\n 'LIGHTING',\n 'LIKE',\n 'LILLY',\n 'LIMITED',\n 'LIMO',\n 'LINCOLN',\n 'LINK',\n 'LIPSY',\n 'LIVE',\n 'LIVING',\n 'LK',\n 'LLC',\n 'LLP',\n 'LOAN',\n 'LOANS',\n 'LOCKER',\n 'LOCUS',\n 'LOL',\n 'LONDON',\n 'LOTTE',\n 'LOTTO',\n 'LOVE',\n 'LPL',\n 'LPLFINANCIAL',\n 'LR',\n 'LS',\n 'LT',\n 'LTD',\n 'LTDA',\n 'LU',\n 'LUNDBECK',\n 'LUXE',\n 'LUXURY',\n 'LV',\n 'LY',\n 'MA',\n 'MADRID',\n 'MAIF',\n 'MAISON',\n 'MAKEUP',\n 'MAN',\n 'MANAGEMENT',\n 'MANGO',\n 'MAP',\n 'MARKET',\n 'MARKETING',\n 'MARKETS',\n 'MARRIOTT',\n 'MARSHALLS',\n 'MATTEL',\n 'MBA',\n 'MC',\n 'MCKINSEY',\n 'MD',\n 'ME',\n 'MED',\n 'MEDIA',\n 'MEET',\n 'MELBOURNE',\n 'MEME',\n 'MEMORIAL',\n 'MEN',\n 'MENU',\n 'MERCKMSD',\n 'MG',\n 'MH',\n 'MIAMI',\n 'MICROSOFT',\n 'MIL',\n 'MINI',\n 'MINT',\n 'MIT',\n 'MITSUBISHI',\n 'MK',\n 'ML',\n 'MLB',\n 'MLS',\n 'MM',\n 'MMA',\n 'MN',\n 'MO',\n 'MOBI',\n 'MOBILE',\n 'MODA',\n 'MOE',\n 'MOI',\n 'MOM',\n 'MONASH',\n 'MONEY',\n 'MONSTER',\n 'MORMON',\n 'MORTGAGE',\n 'MOSCOW',\n 'MOTO',\n 'MOTORCYCLES',\n 'MOV',\n 'MOVIE',\n 'MP',\n 'MQ',\n 'MR',\n 'MS',\n 'MSD',\n 'MT',\n 'MTN',\n 'MTR',\n 'MU',\n 'MUSEUM',\n 'MUSIC',\n 'MV',\n 'MW',\n 'MX',\n 'MY',\n 'MZ',\n 'NA',\n 'NAB',\n 'NAGOYA',\n 'NAME',\n 'NAVY',\n 'NBA',\n 'NC',\n 'NE',\n 'NEC',\n 'NET',\n 'NETBANK',\n 'NETFLIX',\n 'NETWORK',\n 'NEUSTAR',\n 'NEW',\n 'NEWS',\n 'NEXT',\n 'NEXTDIRECT',\n 'NEXUS',\n 'NF',\n 'NFL',\n 'NG',\n 'NGO',\n 'NHK',\n 'NI',\n 'NICO',\n 'NIKE',\n 'NIKON',\n 'NINJA',\n 'NISSAN',\n 'NISSAY',\n 'NL',\n 'NO',\n 'NOKIA',\n 'NORTON',\n 'NOW',\n 'NOWRUZ',\n 'NOWTV',\n 'NP',\n 'NR',\n 'NRA',\n 'NRW',\n 'NTT',\n 'NU',\n 'NYC',\n 'NZ',\n 'OBI',\n 'OBSERVER',\n 'OFFICE',\n 'OKINAWA',\n 'OLAYAN',\n 'OLAYANGROUP',\n 'OLLO',\n 'OM',\n 'OMEGA',\n 'ONE',\n 'ONG',\n 'ONL',\n 'ONLINE',\n 'OOO',\n 'OPEN',\n 'ORACLE',\n 'ORANGE',\n 'ORG',\n 'ORGANIC',\n 'ORIGINS',\n 'OSAKA',\n 'OTSUKA',\n 'OTT',\n 'OVH',\n 'PA',\n 'PAGE',\n 'PANASONIC',\n 'PARIS',\n 'PARS',\n 'PARTNERS',\n 'PARTS',\n 'PARTY',\n 'PAY',\n 'PCCW',\n 'PE',\n 'PET',\n 'PF',\n 'PFIZER',\n 'PG',\n 'PH',\n 'PHARMACY',\n 'PHD',\n 'PHILIPS',\n 'PHONE',\n 'PHOTO',\n 'PHOTOGRAPHY',\n 'PHOTOS',\n 'PHYSIO',\n 'PICS',\n 'PICTET',\n 'PICTURES',\n 'PID',\n 'PIN',\n 'PING',\n 'PINK',\n 'PIONEER',\n 'PIZZA',\n 'PK',\n 'PL',\n 'PLACE',\n 'PLAY',\n 'PLAYSTATION',\n 'PLUMBING',\n 'PLUS',\n 'PM',\n 'PN',\n 'PNC',\n 'POHL',\n 'POKER',\n 'POLITIE',\n 'PORN',\n 'POST',\n 'PR',\n 'PRAMERICA',\n 'PRAXI',\n 'PRESS',\n 'PRIME',\n 'PRO',\n 'PROD',\n 'PRODUCTIONS',\n 'PROF',\n 'PROGRESSIVE',\n 'PROMO',\n 'PROPERTIES',\n 'PROPERTY',\n 'PROTECTION',\n 'PRU',\n 'PRUDENTIAL',\n 'PS',\n 'PT',\n 'PUB',\n 'PW',\n 'PWC',\n 'PY',\n 'QA',\n 'QPON',\n 'QUEBEC',\n 'QUEST',\n 'RACING',\n 'RADIO',\n 'RE',\n 'READ',\n 'REALESTATE',\n 'REALTOR',\n 'REALTY',\n 'RECIPES',\n 'RED',\n 'REDSTONE',\n 'REDUMBRELLA',\n 'REHAB',\n 'REISE',\n 'REISEN',\n 'REIT',\n 'RELIANCE',\n 'REN',\n 'RENT',\n 'RENTALS',\n 'REPAIR',\n 'REPORT',\n 'REPUBLICAN',\n 'REST',\n 'RESTAURANT',\n 'REVIEW',\n 'REVIEWS',\n 'REXROTH',\n 'RICH',\n 'RICHARDLI',\n 'RICOH',\n 'RIL',\n 'RIO',\n 'RIP',\n 'RO',\n 'ROCKS',\n 'RODEO',\n 'ROGERS',\n 'ROOM',\n 'RS',\n 'RSVP',\n 'RU',\n 'RUGBY',\n 'RUHR',\n 'RUN',\n 'RW',\n 'RWE',\n 'RYUKYU',\n 'SA',\n 'SAARLAND',\n 'SAFE',\n 'SAFETY',\n 'SAKURA',\n 'SALE',\n 'SALON',\n 'SAMSCLUB',\n 'SAMSUNG',\n 'SANDVIK',\n 'SANDVIKCOROMANT',\n 'SANOFI',\n 'SAP',\n 'SARL',\n 'SAS',\n 'SAVE',\n 'SAXO',\n 'SB',\n 'SBI',\n 'SBS',\n 'SC',\n 'SCB',\n 'SCHAEFFLER',\n 'SCHMIDT',\n 'SCHOLARSHIPS',\n 'SCHOOL',\n 'SCHULE',\n 'SCHWARZ',\n 'SCIENCE',\n 'SCOT',\n 'SD',\n 'SE',\n 'SEARCH',\n 'SEAT',\n 'SECURE',\n 'SECURITY',\n 'SEEK',\n 'SELECT',\n 'SENER',\n 'SERVICES',\n 'SEVEN',\n 'SEW',\n 'SEX',\n 'SEXY',\n 'SFR',\n 'SG',\n 'SH',\n 'SHANGRILA',\n 'SHARP',\n 'SHELL',\n 'SHIA',\n 'SHIKSHA',\n 'SHOES',\n 'SHOP',\n 'SHOPPING',\n 'SHOUJI',\n 'SHOW',\n 'SI',\n 'SILK',\n 'SINA',\n 'SINGLES',\n 'SITE',\n 'SJ',\n 'SK',\n 'SKI',\n 'SKIN',\n 'SKY',\n 'SKYPE',\n 'SL',\n 'SLING',\n 'SM',\n 'SMART',\n 'SMILE',\n 'SN',\n 'SNCF',\n 'SO',\n 'SOCCER',\n 'SOCIAL',\n 'SOFTBANK',\n 'SOFTWARE',\n 'SOHU',\n 'SOLAR',\n 'SOLUTIONS',\n 'SONG',\n 'SONY',\n 'SOY',\n 'SPA',\n 'SPACE',\n 'SPORT',\n 'SPOT',\n 'SR',\n 'SRL',\n 'SS',\n 'ST',\n 'STADA',\n 'STAPLES',\n 'STAR',\n 'STATEBANK',\n 'STATEFARM',\n 'STC',\n 'STCGROUP',\n 'STOCKHOLM',\n 'STORAGE',\n 'STORE',\n 'STREAM',\n 'STUDIO',\n 'STUDY',\n 'STYLE',\n 'SU',\n 'SUCKS',\n 'SUPPLIES',\n 'SUPPLY',\n 'SUPPORT',\n 'SURF',\n 'SURGERY',\n 'SUZUKI',\n 'SV',\n 'SWATCH',\n 'SWISS',\n 'SX',\n 'SY',\n 'SYDNEY',\n 'SYSTEMS',\n 'SZ',\n 'TAB',\n 'TAIPEI',\n 'TALK',\n 'TAOBAO',\n 'TARGET',\n 'TATAMOTORS',\n 'TATAR',\n 'TATTOO',\n 'TAX',\n 'TAXI',\n 'TC',\n 'TCI',\n 'TD',\n 'TDK',\n 'TEAM',\n 'TECH',\n 'TECHNOLOGY',\n 'TEL',\n 'TEMASEK',\n 'TENNIS',\n 'TEVA',\n 'TF',\n 'TG',\n 'TH',\n 'THD',\n 'THEATER',\n 'THEATRE',\n 'TIAA',\n 'TICKETS',\n 'TIENDA',\n 'TIPS',\n 'TIRES',\n 'TIROL',\n 'TJ',\n 'TJMAXX',\n 'TJX',\n 'TK',\n 'TKMAXX',\n 'TL',\n 'TM',\n 'TMALL',\n 'TN',\n 'TO',\n 'TODAY',\n 'TOKYO',\n 'TOOLS',\n 'TOP',\n 'TORAY',\n 'TOSHIBA',\n 'TOTAL',\n 'TOURS',\n 'TOWN',\n 'TOYOTA',\n 'TOYS',\n 'TR',\n 'TRADE',\n 'TRADING',\n 'TRAINING',\n 'TRAVEL',\n 'TRAVELERS',\n 'TRAVELERSINSURANCE',\n 'TRUST',\n 'TRV',\n 'TT',\n 'TUBE',\n 'TUI',\n 'TUNES',\n 'TUSHU',\n 'TV',\n 'TVS',\n 'TW',\n 'TZ',\n 'UA',\n 'UBANK',\n 'UBS',\n 'UG',\n 'UK',\n 'UNICOM',\n 'UNIVERSITY',\n 'UNO',\n 'UOL',\n 'UPS',\n 'US',\n 'UY',\n 'UZ',\n 'VA',\n 'VACATIONS',\n 'VANA',\n 'VANGUARD',\n 'VC',\n 'VE',\n 'VEGAS',\n 'VENTURES',\n 'VERISIGN',\n 'VERSICHERUNG',\n 'VET',\n 'VG',\n 'VI',\n 'VIAJES',\n 'VIDEO',\n 'VIG',\n 'VIKING',\n 'VILLAS',\n 'VIN',\n 'VIP',\n 'VIRGIN',\n 'VISA',\n 'VISION',\n 'VIVA',\n 'VIVO',\n 'VLAANDEREN',\n 'VN',\n 'VODKA',\n 'VOLVO',\n 'VOTE',\n 'VOTING',\n 'VOTO',\n 'VOYAGE',\n 'VU',\n 'WALES',\n 'WALMART',\n 'WALTER',\n 'WANG',\n 'WANGGOU',\n 'WATCH',\n 'WATCHES',\n 'WEATHER',\n 'WEATHERCHANNEL',\n 'WEBCAM',\n 'WEBER',\n 'WEBSITE',\n 'WED',\n 'WEDDING',\n 'WEIBO',\n 'WEIR',\n 'WF',\n 'WHOSWHO',\n 'WIEN',\n 'WIKI',\n 'WILLIAMHILL',\n 'WIN',\n 'WINDOWS',\n 'WINE',\n 'WINNERS',\n 'WME',\n 'WOLTERSKLUWER',\n 'WOODSIDE',\n 'WORK',\n 'WORKS',\n 'WORLD',\n 'WOW',\n 'WS',\n 'WTC',\n 'WTF',\n 'XBOX',\n 'XEROX',\n 'XIHUAN',\n 'XIN',\n 'XN--11B4C3D',\n 'XN--1CK2E1B',\n 'XN--1QQW23A',\n 'XN--2SCRJ9C',\n 'XN--30RR7Y',\n 'XN--3BST00M',\n 'XN--3DS443G',\n 'XN--3E0B707E',\n 'XN--3HCRJ9C',\n 'XN--3PXU8K',\n 'XN--42C2D9A',\n 'XN--45BR5CYL',\n 'XN--45BRJ9C',\n 'XN--45Q11C',\n 'XN--4DBRK0CE',\n 'XN--4GBRIM',\n 'XN--54B7FTA0CC',\n 'XN--55QW42G',\n 'XN--55QX5D',\n 'XN--5SU34J936BGSG',\n 'XN--5TZM5G',\n 'XN--6FRZ82G',\n 'XN--6QQ986B3XL',\n 'XN--80ADXHKS',\n 'XN--80AO21A',\n 'XN--80AQECDR1A',\n 'XN--80ASEHDB',\n 'XN--80ASWG',\n 'XN--8Y0A063A',\n 'XN--90A3AC',\n 'XN--90AE',\n 'XN--90AIS',\n 'XN--9DBQ2A',\n 'XN--9ET52U',\n 'XN--9KRT00A',\n 'XN--B4W605FERD',\n 'XN--BCK1B9A5DRE4C',\n 'XN--C1AVG',\n 'XN--C2BR7G',\n 'XN--CCK2B3B',\n 'XN--CCKWCXETD',\n 'XN--CG4BKI',\n 'XN--CLCHC0EA0B2G2A9GCD',\n 'XN--CZR694B',\n 'XN--CZRS0T',\n 'XN--CZRU2D',\n 'XN--D1ACJ3B',\n 'XN--D1ALF',\n 'XN--E1A4C',\n 'XN--ECKVDTC9D',\n 'XN--EFVY88H',\n 'XN--FCT429K',\n 'XN--FHBEI',\n 'XN--FIQ228C5HS',\n 'XN--FIQ64B',\n 'XN--FIQS8S',\n 'XN--FIQZ9S',\n 'XN--FJQ720A',\n 'XN--FLW351E',\n 'XN--FPCRJ9C3D',\n 'XN--FZC2C9E2C',\n 'XN--FZYS8D69UVGM',\n 'XN--G2XX48C',\n 'XN--GCKR3F0F',\n 'XN--GECRJ9C',\n 'XN--GK3AT1E',\n 'XN--H2BREG3EVE',\n 'XN--H2BRJ9C',\n 'XN--H2BRJ9C8C',\n 'XN--HXT814E',\n 'XN--I1B6B1A6A2E',\n 'XN--IMR513N',\n 'XN--IO0A7I',\n 'XN--J1AEF',\n 'XN--J1AMH',\n 'XN--J6W193G',\n 'XN--JLQ480N2RG',\n 'XN--JVR189M',\n 'XN--KCRX77D1X4A',\n 'XN--KPRW13D',\n 'XN--KPRY57D',\n 'XN--KPUT3I',\n 'XN--L1ACC',\n 'XN--LGBBAT1AD8J',\n 'XN--MGB9AWBF',\n 'XN--MGBA3A3EJT',\n 'XN--MGBA3A4F16A',\n 'XN--MGBA7C0BBN0A',\n 'XN--MGBAAM7A8H',\n 'XN--MGBAB2BD',\n 'XN--MGBAH1A3HJKRD',\n 'XN--MGBAI9AZGQP6J',\n 'XN--MGBAYH7GPA',\n 'XN--MGBBH1A',\n 'XN--MGBBH1A71E',\n 'XN--MGBC0A9AZCG',\n 'XN--MGBCA7DZDO',\n 'XN--MGBCPQ6GPA1A',\n 'XN--MGBERP4A5D4AR',\n 'XN--MGBGU82A',\n 'XN--MGBI4ECEXP',\n 'XN--MGBPL2FH',\n 'XN--MGBT3DHD',\n 'XN--MGBTX2B',\n 'XN--MGBX4CD0AB',\n 'XN--MIX891F',\n 'XN--MK1BU44C',\n 'XN--MXTQ1M',\n 'XN--NGBC5AZD',\n 'XN--NGBE9E0A',\n 'XN--NGBRX',\n 'XN--NODE',\n 'XN--NQV7F',\n 'XN--NQV7FS00EMA',\n 'XN--NYQY26A',\n 'XN--O3CW4H',\n 'XN--OGBPF8FL',\n 'XN--OTU796D',\n 'XN--P1ACF',\n 'XN--P1AI',\n 'XN--PGBS0DH',\n 'XN--PSSY2U',\n 'XN--Q7CE6A',\n 'XN--Q9JYB4C',\n 'XN--QCKA1PMC',\n 'XN--QXA6A',\n 'XN--QXAM',\n 'XN--RHQV96G',\n 'XN--ROVU88B',\n 'XN--RVC1E0AM3E',\n 'XN--S9BRJ9C',\n 'XN--SES554G',\n 'XN--T60B56A',\n 'XN--TCKWE',\n 'XN--TIQ49XQYJ',\n 'XN--UNUP4Y',\n 'XN--VERMGENSBERATER-CTB',\n 'XN--VERMGENSBERATUNG-PWB',\n 'XN--VHQUV',\n 'XN--VUQ861B',\n 'XN--W4R85EL8FHU5DNRA',\n 'XN--W4RS40L',\n 'XN--WGBH1C',\n 'XN--WGBL6A',\n 'XN--XHQ521B',\n 'XN--XKC2AL3HYE2A',\n 'XN--XKC2DL3A5EE0H',\n 'XN--Y9A3AQ',\n 'XN--YFRO4I67O',\n 'XN--YGBI2AMMX',\n 'XN--ZFR164B',\n 'XXX',\n 'XYZ',\n 'YACHTS',\n 'YAHOO',\n 'YAMAXUN',\n 'YANDEX',\n 'YE',\n 'YODOBASHI',\n 'YOGA',\n 'YOKOHAMA',\n 'YOU',\n 'YOUTUBE',\n 'YT',\n 'YUN',\n 'ZA',\n 'ZAPPOS',\n 'ZARA',\n 'ZERO',\n 'ZIP',\n 'ZM',\n 'ZONE',\n 'ZUERICH',\n 'ZW',\n];\n","import { tlds } from './tlds-list';\n\nconst tldRegex = tlds.join('|');\nconst urlRegex = new RegExp(`\\\\b.*\\\\s*\\\\.\\\\s*(${tldRegex})\\\\b`, 'gi');\n\nconst spamWords = ['won', 'win', 'click'];\nexport const spamReplacement = 'Suspicious token';\n\nfunction spamUrlFilter(input: string) {\n return input.match(urlRegex);\n}\n\nfunction spamWordFilter(input: string): boolean {\n function containsSpam(element: string) {\n return input.toLowerCase().includes(element);\n }\n return spamWords.some(containsSpam);\n}\n\ninterface SpamFilterArgs {\n input: string;\n whitelist: string[];\n}\n\nexport function spamFilter({ input, whitelist }: SpamFilterArgs): string {\n if (whitelist.includes(input)) return input;\n\n const urlFound = spamUrlFilter(input);\n const spamWordsFound = spamWordFilter(input);\n\n if (urlFound || spamWordsFound) {\n return spamReplacement;\n }\n\n return input;\n}\n","export function extractPhraseFromString(value: string) {\n const clean = value.trim();\n const words = clean.match(/\\S+/g);\n if (words?.length) {\n return words\n .map(word => (word.match(/[^0-9]+/g) ? word : null))\n .filter(Boolean)\n .join(' ');\n } else {\n return clean;\n }\n}\n","export function pxStringToNumber(pxString: string): number {\n if (!/^\\d+px$/.test(pxString)) {\n throw new Error('Invalid pixel string format');\n }\n return +pxString.replace('px', '');\n}\n","export function abbreviateNumber(n: number) {\n if (n < 1e3) return n.toString();\n if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(2) + 'K';\n if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(2) + 'M';\n if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(2) + 'B';\n if (n >= 1e12) return +(n / 1e12).toFixed(2) + 'T';\n return n.toString();\n}\n","export function removeCommas(amountWithCommas: string) {\n if (typeof amountWithCommas !== 'string') {\n throw new Error('Amount with commas must be a string');\n }\n return amountWithCommas.replace(/,/g, '');\n}\n","import { abbreviateNumber } from '../../abbreviate-number/abbreviate-number';\nimport { removeCommas } from './remove-commas';\n\n/**\n * TODO: investigate improving\n * @param amount is a string\n * in the extension we pre-convert it from Money with formatMoneyWithoutSymbol\n */\nexport function formatBalance(amount: string) {\n if (typeof amount !== 'string' || amount.trim() === '' || isNaN(Number(removeCommas(amount)))) {\n throw new Error('Invalid input: amount must be a non-empty string representing a valid number');\n }\n\n const noCommas = removeCommas(amount);\n const number = parseFloat(noCommas);\n return number > 10_000\n ? {\n isAbbreviated: true,\n value: abbreviateNumber(number),\n }\n : { isAbbreviated: false, value: amount };\n}\n","import { HIRO_EXPLORER_URL } from '@leather.io/constants';\nimport { BitcoinNetworkModes, HIRO_API_BASE_URL_NAKAMOTO_TESTNET } from '@leather.io/models';\n\ninterface MakeStacksTxExplorerLinkArgs {\n mode: BitcoinNetworkModes;\n searchParams?: URLSearchParams;\n txid: string;\n isNakamoto?: boolean;\n}\n// TODO LEA-2285: Remove this function from the extension\nexport function makeStacksTxExplorerLink({\n mode,\n searchParams = new URLSearchParams(),\n txid,\n isNakamoto = false,\n}: MakeStacksTxExplorerLinkArgs) {\n if (mode === 'regtest') return 'http://localhost:8000/txid/' + txid;\n searchParams.append('chain', mode);\n if (isNakamoto) searchParams.append('api', HIRO_API_BASE_URL_NAKAMOTO_TESTNET);\n return `${HIRO_EXPLORER_URL}/txid/${txid}?${searchParams.toString()}`;\n}\n","import DOMPurify from 'dompurify';\n\n/**\n * Universal sanitizer for dynamic HTML content.\n * Uses DOMPurify in the browser, and a safe fallback for SSR (returns plain text).\n */\nexport function sanitizeContent(dirty: string): string {\n if (typeof window !== 'undefined' && typeof DOMPurify !== 'undefined') {\n return DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });\n }\n // SSR fallback: escape HTML tags to prevent injection\n return String(dirty)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n"],"mappings":"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ACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","names":["BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","match"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/counter.ts","../src/math/calculate-averages.ts","../src/math/helpers.ts","../src/math/fibonacci.ts","../src/math/scale-value.ts","../src/money/calculate-money.ts","../src/money/format-money.ts","../src/money/is-money.ts","../src/money/is-valid-precision.ts","../src/money/unit-conversion.ts","../src/accounts/account-addresses.ts","../src/assets/sort-assets.ts","../src/assets/asset-display-name.ts","../src/assets/balance-helpers.ts","../src/assets/inscription-helpers.ts","../src/time.ts","../src/truncate-middle.ts","../src/spam-filter/tlds-list.ts","../src/spam-filter/spam-filter.ts","../src/extract-phrase-from-string/extract-phrase-from-string.ts","../src/px-string-to-number/px-string-to-number.ts","../src/abbreviate-number/abbreviate-number.ts","../src/money/format-balance/remove-commas.ts","../src/money/format-balance/format-balance.ts","../src/explorer/make-stacks-tx-explorer-link.ts","../src/sanitize-content.ts"],"sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport { KEBAB_REGEX } from '@leather.io/constants';\nimport type { NetworkModes } from '@leather.io/models';\n\nexport { createCounter } from './counter';\nexport * from './math';\nexport * from './money';\nexport * from './accounts/account-addresses';\nexport * from './assets/sort-assets';\nexport * from './assets/asset-display-name';\nexport * from './assets/balance-helpers';\nexport * from './assets/inscription-helpers';\nexport * from './truncate-middle';\nexport * from './time';\n\nexport { spamFilter } from './spam-filter/spam-filter';\nexport { extractPhraseFromString } from './extract-phrase-from-string/extract-phrase-from-string';\nexport { pxStringToNumber } from './px-string-to-number/px-string-to-number';\nexport { formatBalance } from './money/format-balance/format-balance';\nexport { abbreviateNumber } from './abbreviate-number/abbreviate-number';\nexport { makeStacksTxExplorerLink } from './explorer/make-stacks-tx-explorer-link';\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number';\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nexport function isEmptyString(value: unknown): value is '' {\n return isString(value) && value === '';\n}\n\nexport function isBigInt(value: unknown): value is bigint {\n return typeof value === 'bigint';\n}\n\nexport function isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n\nexport function isFunction(value: unknown): value is () => void {\n return typeof value === 'function';\n}\n\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object';\n}\n\nexport function isError(value: unknown): value is Error {\n return value instanceof Error;\n}\n\nexport function isEmpty(value: object) {\n return Object.keys(value).length === 0;\n}\n\nexport function isDefined<T>(argument: T | undefined): argument is T {\n return !isUndefined(argument);\n}\n\nexport function isTypedArray(val: unknown): val is Uint8Array {\n const TypedArray = Object.getPrototypeOf(Uint8Array);\n return val instanceof TypedArray;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop() {}\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function undefinedIfLengthZero<T extends any[]>(arr: T) {\n return arr.length ? arr : undefined;\n}\n\ntype NetworkMap<T> = Record<NetworkModes, T>;\n\nexport function whenNetwork(mode: NetworkModes) {\n return <T extends NetworkMap<unknown>>(networkMap: T) => networkMap[mode] as T[NetworkModes];\n}\n\nexport function isEmptyArray(data: unknown[]) {\n return data.length === 0;\n}\n\n// TODO: extension concept, remove remove from utils\nexport const defaultWalletKeyId = 'default';\n\nexport function reverseBytes(bytes: Buffer): Buffer;\nexport function reverseBytes(bytes: Uint8Array): Uint8Array;\nexport function reverseBytes(bytes: Buffer | Uint8Array) {\n if (Buffer.isBuffer(bytes)) return Buffer.from(bytes).reverse();\n return new Uint8Array(bytes.slice().reverse());\n}\n\nexport function makeNumberRange(num: number) {\n return [...Array(num).keys()];\n}\n\nexport function createNumArrayOfRange(fromIndex: number, toIndex: number) {\n const result = [];\n for (let i = fromIndex; i <= toIndex; i++) {\n result.push(i);\n }\n return result;\n}\n\nexport async function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function sumNumbers(nums: number[]) {\n return nums.reduce((acc, num) => acc.plus(num), new BigNumber(0));\n}\n\nexport function isFulfilled<T>(p: PromiseSettledResult<T>): p is PromiseFulfilledResult<T> {\n return p.status === 'fulfilled';\n}\n\nexport function isRejected<T>(p: PromiseSettledResult<T>): p is PromiseRejectedResult {\n return p.status === 'rejected';\n}\n\nexport function createNullArrayOfLength(length: number) {\n return new Array(length).fill(null);\n}\n\nexport function safelyFormatHexTxid(id: string) {\n const prefix = '0x';\n if (id.startsWith(prefix)) return id;\n return prefix + id;\n}\n\nfunction kebabCase(str: string) {\n return str.replace(KEBAB_REGEX, match => '-' + match.toLowerCase());\n}\n\nfunction getLetters(string: string, offset = 1) {\n return string.slice(0, offset);\n}\n\nexport function getTicker(value: string) {\n let name = kebabCase(value);\n if (name.includes('-')) {\n const words = name.split('-');\n if (words.length >= 3) {\n name = `${getLetters(words[0])}${getLetters(words[1])}${getLetters(words[2])}`;\n } else {\n name = `${getLetters(words[0])}${getLetters(words[1], 2)}`;\n }\n } else if (name.length >= 3) {\n name = `${getLetters(name, 3)}`;\n }\n return name.toUpperCase();\n}\n\nexport function propIfDefined(prop: string, value: any) {\n return isBoolean(value) ? { [prop]: value } : {};\n}\n\nexport function isHexString(value: string) {\n return /^[0-9a-fA-F]+$/.test(value);\n}\n\nexport function toHexString(value: number) {\n return value.toString(16);\n}\n\nexport function hexToNumber(hex: string) {\n return parseInt(hex, 16);\n}\n\ntype MapFunction<T, U> = (value: T[keyof T], key: string) => U;\n\nexport function mapObject<T extends object, U>(\n obj: T,\n mapFn: MapFunction<T, U>\n): { [K in keyof T]: U } {\n const result: Partial<{ [K in keyof T]: U }> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = mapFn(obj[key], key);\n }\n }\n\n return result as { [K in keyof T]: U };\n}\n\nexport function assertIsTruthy<T>(val: T): asserts val is NonNullable<T> {\n if (!val) throw new Error(`expected: true, actual: ${val}`);\n}\n\n/**\n * Ensure all cases in a control flow are handled by asserting a value is `never`.\n *\n * Typically used in `switch` statements to enforce exhaustiveness.\n * TypeScript's type checking will catch unhandled cases at compile time.\n */\nexport function assertUnreachable(value: never): never {\n throw new Error(`Unexpected value: ${JSON.stringify(value)}`);\n}\n\nexport function assertExistence<T>(value: T, message: string): asserts value is NonNullable<T> {\n if (value === null || value === undefined) {\n throw new Error(message);\n }\n}\n\nexport function capitalize(val: string) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\n\nexport function uniqueArray<T>(arr: T[]) {\n return Array.from(new Set(arr));\n}\n\nexport function match<Variant extends string | number>() {\n return function matchVariant<T>(variant: Variant, match: Record<Variant, T>) {\n return match[variant];\n };\n}\n\nexport function removeTrailingNullCharacters(s: string) {\n return s.replace(/\\0*$/g, '');\n}\n\nexport function isNumberOrNumberList(value: unknown): value is number | number[] {\n if (Array.isArray(value)) return value.every(item => isNumber(item));\n return isNumber(value);\n}\n\nexport { sanitizeContent } from './sanitize-content';\n","export function createCounter(startPosition = 0) {\n let count = startPosition;\n return {\n getValue() {\n return count;\n },\n increment() {\n return (count += 1);\n },\n incrementBy(amount: number) {\n return (count += amount);\n },\n decrement() {\n return (count -= 1);\n },\n };\n}\n","import BigNumber from 'bignumber.js';\n\nimport { initBigNumber } from './helpers';\n\nexport function calculateMeanAverage(numbers: BigNumber[] | number[]) {\n if (numbers.length === 0) return new BigNumber(0);\n return numbers\n .map(initBigNumber)\n .reduce((acc, price) => acc.plus(price), new BigNumber(0))\n .dividedBy(numbers.length);\n}\n","import BigNumber from 'bignumber.js';\n\nimport { isBigInt } from '..';\n\nexport function initBigNumber(num: string | number | BigNumber | bigint) {\n if (BigNumber.isBigNumber(num)) return num;\n return isBigInt(num) ? new BigNumber(num.toString()) : new BigNumber(num);\n}\n\nexport function sumNumbers(nums: number[]) {\n return nums.reduce((acc, num) => acc.plus(num), new BigNumber(0));\n}\n\nfunction isMultipleOf(multiple: number) {\n return (num: number) => num % multiple === 0;\n}\n\nexport function isEven(num: number) {\n return isMultipleOf(2)(num);\n}\n\nexport function countDecimals(num: string | number | BigNumber) {\n const LARGE_NUMBER_OF_DECIMALS = 100;\n BigNumber.config({ DECIMAL_PLACES: LARGE_NUMBER_OF_DECIMALS });\n const amount = initBigNumber(num);\n const decimals = amount.toString(10).split('.')[1];\n return decimals ? decimals.length : 0;\n}\n\nexport function increaseValueByOneMicroStx(value: string | number | BigNumber) {\n return new BigNumber(value).plus(0.000001).toNumber();\n}\n","function fibonacci(n = 0): number {\n if (n < 0) throw new Error('Cannot calculate from negative number');\n if (n < 2) return n;\n return fibonacci(n - 1) + fibonacci(n - 2);\n}\n\nexport function* fibonacciGenerator(startIndex = 0): IterableIterator<number> {\n let index = startIndex;\n while (index < Infinity) yield fibonacci(index++);\n return Infinity;\n}\n","export function scaleValue(num: number): number {\n if (num === 0) return 0;\n const absNum = Math.abs(num);\n const exponent = Math.floor(Math.log10(absNum));\n const scale = Math.pow(10, exponent);\n const msd = Math.floor(absNum / scale);\n const result = msd * scale;\n // Fix floating point precision issues by rounding to 12 decimal places\n const rounded = Math.round(result * 1e12) / 1e12;\n return num < 0 ? -rounded : rounded;\n}\n","import { BigNumber } from 'bignumber.js';\n\nimport { type MarketData, type Money, type NumType, formatMarketPair } from '@leather.io/models';\n\nimport { isNumber } from '..';\nimport { initBigNumber } from '../math/helpers';\nimport { createMoney, formatMoney } from './format-money';\nimport { isMoney } from './is-money';\n\nexport function baseCurrencyAmountInQuoteWithFallback(quantity: Money, marketData?: MarketData) {\n return marketData ? baseCurrencyAmountInQuote(quantity, marketData) : createMoney(0, 'USD');\n}\n\nexport function baseCurrencyAmountInQuote(quantity: Money, { pair, price }: MarketData) {\n if (quantity.symbol !== pair.base)\n throw new Error(\n `Cannot calculate value of ${formatMoney(quantity)} with market pair of ${formatMarketPair(\n pair\n )}`\n );\n\n return createMoney(\n convertAmountToFractionalUnit(\n convertAmountToBaseUnit(quantity).times(convertAmountToBaseUnit(price)),\n price.decimals\n ),\n pair.quote\n );\n}\n\nexport function convertAmountToFractionalUnit(num: Money | BigNumber, decimals?: number) {\n if (isMoney(num)) return num.amount.shiftedBy(num.decimals);\n if (!isNumber(decimals)) throw new Error('Must define decimal of given currency');\n return num.shiftedBy(decimals);\n}\n\nexport function convertToMoneyTypeWithDefaultOfZero(\n symbol: string,\n num?: NumType,\n decimals?: number\n) {\n return createMoney(initBigNumber(num ?? 0), symbol.toUpperCase(), decimals);\n}\n\nexport function convertAmountToBaseUnit(num: Money | BigNumber, decimals?: number) {\n if (isMoney(num)) return num.amount.shiftedBy(-num.decimals);\n if (!isNumber(decimals)) throw new Error('Must define decimal of given currency');\n return num.shiftedBy(-decimals);\n}\n\nexport function subtractMoney(xAmount: Money, yAmount: Money) {\n if (xAmount.symbol !== yAmount.symbol) throw new Error('Cannot subtract different currencies');\n return createMoney(xAmount.amount.minus(yAmount.amount), xAmount.symbol, xAmount.decimals);\n}\n\nexport function sumMoney(moneysArr: Money[]) {\n if (moneysArr.some(item => item.symbol !== moneysArr[0].symbol))\n throw new Error('Cannot sum different currencies');\n\n const sum = moneysArr.reduce((acc, item) => acc.plus(item.amount), new BigNumber(0));\n return createMoney(sum, moneysArr[0].symbol, moneysArr[0].decimals);\n}\n\nexport function minMoney(moneyArr: Money[]) {\n if (moneyArr.length === 0) throw new Error('Cannot calculate min of empty array');\n\n const currency = moneyArr[0].symbol;\n if (!moneyArr.every(money => money.symbol === currency)) {\n throw new Error('Cannot calculate min of different currencies');\n }\n\n return moneyArr.reduce((smallest: Money, current: Money) => {\n return current.amount.isLessThan(smallest.amount) ? current : smallest;\n }, moneyArr[0]);\n}\n\nexport function maxMoney(moneyArr: Money[]) {\n if (moneyArr.length === 0) throw new Error('Cannot calculate max of empty array');\n\n const currency = moneyArr[0].symbol;\n if (!moneyArr.every(money => money.symbol === currency)) {\n throw new Error('Cannot calculate max of different currencies');\n }\n\n return moneyArr.reduce((largest: Money, current: Money) => {\n return current.amount.isGreaterThan(largest.amount) ? current : largest;\n }, moneyArr[0]);\n}\n","import BigNumber from 'bignumber.js';\n\nimport { currencyDecimalsMap } from '@leather.io/constants';\nimport type { Currency, Money, NumType } from '@leather.io/models';\n\nimport { isBigInt, isUndefined } from '..';\n\ntype KnownCurrencyDecimals = keyof typeof currencyDecimalsMap;\n\nfunction isResolutionOfCurrencyKnown(symbol: Currency): symbol is KnownCurrencyDecimals {\n return symbol in currencyDecimalsMap;\n}\n\nfunction getDecimalsOfSymbolIfKnown(symbol: Currency) {\n if (isResolutionOfCurrencyKnown(symbol)) return currencyDecimalsMap[symbol];\n return null;\n}\n\nfunction throwWhenDecimalUnknown(symbol: Currency, decimals?: number): asserts decimals is number {\n if (isUndefined(decimals) && isUndefined(getDecimalsOfSymbolIfKnown(symbol)))\n throw new Error(`Resolution of currency ${symbol} is unknown, must be described`);\n}\n\n/**\n * @param value Amount described in currency's primary unit\n * @param symbol Identifying letter code, e.g. EUR\n * @param resolution Optional, required if value not known at build-time\n */\nexport function createMoneyFromDecimal(\n value: NumType,\n symbol: Currency,\n resolution?: number\n): Money {\n throwWhenDecimalUnknown(symbol, resolution);\n const decimals = getDecimalsOfSymbolIfKnown(symbol) ?? resolution;\n const amount = new BigNumber(isBigInt(value) ? value.toString() : value).shiftedBy(decimals);\n return Object.freeze({ amount, symbol, decimals });\n}\n\n/**\n * @param value Amount described in currency's fractional base unit, e.g. cents for USD amounts\n * @param symbol Identifying letter code, e.g. EUR\n * @param resolution Optional, required if value not known at build-time\n */\nexport function createMoney(value: NumType, symbol: Currency, resolution?: number): Money {\n throwWhenDecimalUnknown(symbol, resolution);\n const decimals = getDecimalsOfSymbolIfKnown(symbol) ?? resolution;\n const amount = new BigNumber(isBigInt(value) ? value.toString() : value);\n return Object.freeze({ amount, symbol, decimals });\n}\n\nconst thinSpace = ' ';\n\nexport function formatMoney({ amount, symbol, decimals }: Money) {\n return `${amount.shiftedBy(-decimals).toString()} ${symbol}`;\n}\n\nexport function formatMoneyWithoutSymbol({ amount, decimals }: Money) {\n return `${amount.shiftedBy(-decimals).toString()}`;\n}\n\nexport function formatMoneyToFixedDecimal(\n { amount, symbol, decimals }: Money,\n fixedDecimals: number\n) {\n return `${amount.shiftedBy(-decimals).toFixed(fixedDecimals)} ${symbol}`;\n}\n\nexport function formatMoneyToFixedDecimalWithoutSymbol(\n { amount, decimals }: Money,\n fixedDecimals: number\n) {\n return `${amount.shiftedBy(-decimals).toFixed(fixedDecimals)}`;\n}\n\nexport function formatMoneyPadded({ amount, symbol, decimals }: Money) {\n return `${amount.shiftedBy(-decimals).toFormat(decimals)} ${symbol}`;\n}\n\nexport function i18nFormatCurrency(quantity: Money, decimals = 2) {\n const currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: quantity.symbol,\n maximumFractionDigits: decimals,\n });\n\n const formatted = currencyFormatter.format(\n quantity.amount.shiftedBy(-quantity.decimals).toNumber()\n );\n\n if (quantity.amount.isGreaterThan(0) && formatted === '$0.00')\n return '<' + thinSpace + formatted.replace('0.00', '0.01');\n\n return formatted;\n}\n\nexport function formatDustUsdAmounts(value: string) {\n return value.endsWith('0.00') ? '<' + thinSpace + value.replace('0.00', '0.01') : value;\n}\n","import BigNumber from 'bignumber.js';\n\nimport { Money } from '@leather.io/models';\n\nimport { isObject } from '..';\n\nexport function isMoney(val: unknown): val is Money {\n if (!isObject(val)) return false;\n return 'amount' in val && 'symbol' in val && 'decimals' in val;\n}\n\nexport function isMoneyGreaterThanZero(money: Money) {\n if (!BigNumber.isBigNumber(money.amount)) return;\n return !(money.amount.isNaN() || money.amount.isZero());\n}\n","import { isNumber } from '../index';\nimport { countDecimals } from '../math';\n\nexport function isValidPrecision(amount: number, precision: number) {\n if (!isNumber(amount)) return false;\n return countDecimals(amount) <= precision;\n}\n","import BigNumber from 'bignumber.js';\n\nimport { BTC_DECIMALS, STX_DECIMALS } from '@leather.io/constants';\nimport { Money } from '@leather.io/models';\n\nimport { initBigNumber } from '../math/helpers';\n\nfunction fractionalUnitToUnit(decimals: number) {\n return (unit: number | string | BigNumber) => {\n const unitBigNumber = initBigNumber(unit);\n return unitBigNumber.shiftedBy(-decimals);\n };\n}\n\nexport function unitToFractionalUnit(decimals: number) {\n return (unit: number | string | BigNumber) => {\n const unitBigNumber = initBigNumber(unit);\n return unitBigNumber.shiftedBy(decimals);\n };\n}\n\nexport const satToBtc = fractionalUnitToUnit(BTC_DECIMALS);\nexport const btcToSat = unitToFractionalUnit(BTC_DECIMALS);\n\nexport const microStxToStx = fractionalUnitToUnit(STX_DECIMALS);\nexport const stxToMicroStx = unitToFractionalUnit(STX_DECIMALS);\n\nexport function moneyToBaseUnit(sum: Money) {\n return fractionalUnitToUnit(sum.decimals)(sum.amount);\n}\n","import {\n AccountAddresses,\n AccountId,\n BitcoinAddressInfo,\n StacksAddressInfo,\n} from '@leather.io/models';\n\nexport function createAccountAddresses(\n accountId: AccountId,\n btcDescriptors: string[] = [],\n stxAddress?: string\n): AccountAddresses {\n const accountAddresses: AccountAddresses = { id: accountId };\n const taprootDescriptor = btcDescriptors.find(desc => desc.startsWith('tr('));\n const nativeSegwitDescriptor = btcDescriptors.find(desc => desc.startsWith('wpkh('));\n if (taprootDescriptor && nativeSegwitDescriptor) {\n accountAddresses.bitcoin = {\n taprootDescriptor,\n nativeSegwitDescriptor,\n };\n }\n if (stxAddress) {\n accountAddresses.stacks = { stxAddress };\n }\n return accountAddresses;\n}\n\nexport function hasBitcoinAddress(\n account: AccountAddresses\n): account is AccountAddresses & { bitcoin: BitcoinAddressInfo } {\n return account.bitcoin !== undefined;\n}\n\nexport function hasStacksAddress(\n account: AccountAddresses\n): account is AccountAddresses & { stacks: StacksAddressInfo } {\n return account.stacks !== undefined;\n}\n","import type { Money } from '@leather.io/models';\n\nexport function sortAssetsByName<T extends { name: string }[]>(assets: T) {\n return assets\n .sort((a, b) => {\n if (a.name < b.name) return -1;\n if (a.name > b.name) return 1;\n return 0;\n })\n .sort((a, b) => {\n if (a.name === 'STX') return -1;\n if (b.name !== 'STX') return 1;\n return 0;\n })\n .sort((a, b) => {\n if (a.name === 'BTC') return -1;\n if (b.name !== 'BTC') return 1;\n return 0;\n });\n}\n\nexport function migratePositiveAssetBalancesToTop<T extends { balance: Money }[]>(assets: T) {\n const assetsWithPositiveBalance = assets.filter(asset => asset.balance.amount.isGreaterThan(0));\n const assetsWithZeroBalance = assets.filter(asset => asset.balance.amount.isEqualTo(0));\n return [...assetsWithPositiveBalance, ...assetsWithZeroBalance] as T;\n}\n","import { CryptoAssetInfo } from '@leather.io/models';\n\nimport { assertUnreachable } from '../index';\n\nexport function getAssetDisplayName(asset: CryptoAssetInfo) {\n const { protocol } = asset;\n\n switch (protocol) {\n case 'nativeBtc':\n return 'bitcoin';\n case 'nativeStx':\n return 'stacks';\n case 'brc20':\n return 'brc-20';\n case 'inscription':\n return 'inscription';\n case 'rune':\n return 'rune';\n case 'sip10':\n return asset.name;\n case 'sip9':\n return asset.name;\n case 'stamp':\n return 'stamp';\n case 'src20':\n return 'src-20';\n case 'stx20':\n return 'stx-20';\n default:\n assertUnreachable(protocol);\n }\n}\n","import {\n BaseCryptoAssetBalance,\n BtcCryptoAssetBalance,\n Money,\n StxCryptoAssetBalance,\n} from '@leather.io/models';\n\nimport { createMoney, subtractMoney, sumMoney } from '../money';\n\nexport function createBaseCryptoAssetBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money\n): BaseCryptoAssetBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n return {\n totalBalance,\n inboundBalance,\n outboundBalance,\n pendingBalance: subtractMoney(sumMoney([totalBalance, inboundBalance]), outboundBalance),\n availableBalance: subtractMoney(totalBalance, outboundBalance),\n };\n}\n\nexport function createBtcCryptoAssetBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n protectedBal?: Money,\n uneconomicalBal?: Money,\n unspendableBal?: Money\n): BtcCryptoAssetBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n const protectedBalance = protectedBal ?? zeroBalance;\n const uneconomicalBalance = uneconomicalBal ?? zeroBalance;\n const unspendableBalance = unspendableBal ?? zeroBalance;\n const baseBalance = createBaseCryptoAssetBalance(totalBalance, inboundBalance, outboundBalance);\n return {\n ...baseBalance,\n protectedBalance,\n uneconomicalBalance,\n availableBalance: subtractMoney(totalBalance, unspendableBalance),\n unspendableBalance,\n };\n}\n\nexport function createStxCryptoAssetBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n lockedBal?: Money\n): StxCryptoAssetBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n const lockedBalance = lockedBal ?? zeroBalance;\n const baseBalance = createBaseCryptoAssetBalance(totalBalance, inboundBalance, outboundBalance);\n const availableBalance = subtractMoney(totalBalance, outboundBalance);\n return {\n ...baseBalance,\n lockedBalance,\n unlockedBalance: subtractMoney(totalBalance, lockedBalance),\n availableBalance,\n availableUnlockedBalance: subtractMoney(availableBalance, lockedBalance),\n };\n}\n\nexport function aggregateBaseCryptoAssetBalances(\n balances: BaseCryptoAssetBalance[]\n): BaseCryptoAssetBalance {\n return createBaseCryptoAssetBalance(\n sumMoney(balances.map(b => b.totalBalance)),\n sumMoney(balances.map(b => b.inboundBalance)),\n sumMoney(balances.map(b => b.outboundBalance))\n );\n}\n\nexport function aggregateBtcCryptoAssetBalances(\n balances: BtcCryptoAssetBalance[]\n): BtcCryptoAssetBalance {\n return createBtcCryptoAssetBalance(\n sumMoney(balances.map(b => b.totalBalance)),\n sumMoney(balances.map(b => b.inboundBalance)),\n sumMoney(balances.map(b => b.outboundBalance)),\n sumMoney(balances.map(b => b.protectedBalance)),\n sumMoney(balances.map(b => b.uneconomicalBalance)),\n sumMoney(balances.map(b => b.unspendableBalance))\n );\n}\n\nexport function aggregateStxCryptoAssetBalances(\n balances: StxCryptoAssetBalance[]\n): StxCryptoAssetBalance {\n return createStxCryptoAssetBalance(\n sumMoney(balances.map(b => b.totalBalance)),\n sumMoney(balances.map(b => b.inboundBalance)),\n sumMoney(balances.map(b => b.outboundBalance)),\n sumMoney(balances.map(b => b.lockedBalance))\n );\n}\n","import {\n CryptoAssetCategories,\n CryptoAssetChains,\n CryptoAssetProtocols,\n InscriptionCryptoAssetInfo,\n InscriptionMimeType,\n} from '@leather.io/models';\n\nimport { dateToUnixTimestamp } from '../time';\n\nexport function whenInscriptionMimeType<T>(\n mimeType: string,\n branches: { [k in InscriptionMimeType]?: () => T }\n) {\n if (mimeType.startsWith('audio/') && branches.audio) {\n return branches.audio();\n }\n if (mimeType.startsWith('text/html') && branches.html) {\n return branches.html();\n }\n if (mimeType.startsWith('image/svg') && branches.svg) {\n return branches.svg();\n }\n if (mimeType.startsWith('image/') && branches.image) {\n return branches.image();\n }\n if (mimeType.startsWith('text') && branches.text) {\n return branches.text();\n }\n if (mimeType.startsWith('video/') && branches.video) {\n return branches.video();\n }\n if (mimeType.startsWith('model/gltf') && branches.gltf) {\n return branches.gltf();\n }\n if (branches.other) return branches.other();\n\n throw new Error('Unhandled inscription type');\n}\n\nexport interface CreateInscriptionData {\n readonly id: string;\n readonly number: number;\n readonly contentSrc: string;\n readonly mimeType?: string;\n readonly ownerAddress: string;\n readonly satPoint: string;\n readonly genesisBlockHash: string;\n readonly genesisTimestamp: string | number;\n readonly genesisBlockHeight: number;\n readonly outputValue: string;\n}\n\nexport function createInscriptionCryptoAssetInfo(\n data: CreateInscriptionData\n): InscriptionCryptoAssetInfo {\n const iframeSrc = `https://ordinals.com/preview/${data.id}`;\n const preview = `https://ordinals.hiro.so/inscription/${data.id}`;\n const title = `Inscription ${data.number}`;\n const [txid, output, offset] = data.satPoint.split(':');\n\n const sharedInfo = {\n chain: CryptoAssetChains.bitcoin,\n category: CryptoAssetCategories.nft,\n protocol: CryptoAssetProtocols.inscription,\n id: data.id,\n number: data.number,\n output,\n txid,\n offset,\n address: data.ownerAddress,\n preview,\n title,\n genesisBlockHeight: data.genesisBlockHeight,\n genesisBlockHash: data.genesisBlockHash,\n genesisTimestamp: dateToUnixTimestamp(new Date(data.genesisTimestamp)),\n value: data.outputValue,\n };\n\n if (!data.mimeType) {\n return {\n ...sharedInfo,\n mimeType: 'other',\n src: '',\n };\n }\n\n return whenInscriptionMimeType<InscriptionCryptoAssetInfo>(data.mimeType, {\n audio: () => ({\n ...sharedInfo,\n mimeType: 'audio',\n name: 'inscription',\n src: iframeSrc,\n }),\n gltf: () => ({\n ...sharedInfo,\n mimeType: 'gltf',\n name: 'inscription',\n src: iframeSrc,\n }),\n html: () => ({\n ...sharedInfo,\n mimeType: 'html',\n name: 'inscription',\n src: iframeSrc,\n }),\n image: () => ({\n ...sharedInfo,\n mimeType: 'image',\n name: 'inscription',\n src: data.contentSrc,\n }),\n svg: () => ({\n ...sharedInfo,\n mimeType: 'svg',\n name: 'inscription',\n src: iframeSrc,\n }),\n text: () => ({\n ...sharedInfo,\n mimeType: 'text',\n name: 'inscription',\n src: data.contentSrc,\n }),\n video: () => ({\n ...sharedInfo,\n mimeType: 'video',\n name: 'inscription',\n src: iframeSrc,\n }),\n other: () => ({\n ...sharedInfo,\n mimeType: 'other',\n name: 'inscription',\n src: '',\n }),\n });\n}\n","// WARNING: When using `setTimeout` method, there is an upper maximum\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nexport const oneMinInMs = 60 * 1000;\nexport const fiveMinInMs = 5 * oneMinInMs;\nexport const oneDayInMs = 24 * 60 * 60 * 1000;\nexport const oneWeekInMs = 7 * oneDayInMs;\n\nexport function dateToUnixTimestamp(date: Date): number {\n return Math.floor(date.getTime() / 1000);\n}\n\nexport function weeksInMs(weeks: number) {\n return daysInMs(weeks * 7);\n}\n\nexport function daysInMs(days: number) {\n return hoursInMs(days * 24);\n}\n\nexport function hoursInMs(hours: number) {\n return minutesInMs(hours * 60);\n}\n\nexport function minutesInMs(minutes: number) {\n return secondsInMs(minutes * 60);\n}\n\nexport function secondsInMs(seconds: number) {\n return seconds * 1000;\n}\n\nexport function weeksInSec(weeks: number) {\n return daysInSec(weeks * 7);\n}\n\nexport function daysInSec(days: number) {\n return hoursInSec(days * 24);\n}\n\nexport function hoursInSec(hours: number) {\n return minutesInSec(hours * 60);\n}\n\nexport function minutesInSec(minutes: number) {\n return minutes * 60;\n}\n","function truncateHex(hex: string, offset = 5): string {\n return `${hex.substring(0, offset + 2)}…${hex.substring(hex.length - offset)}`;\n}\n\nexport function truncateMiddle(input: string, offset = 5): string {\n if (!input) return '';\n // Hex\n if (input.startsWith('0x')) {\n return truncateHex(input, offset);\n }\n // For contracts\n if (input.includes('.')) {\n const parts = input.split('.');\n const start = parts[0]?.substring(0, offset);\n const end = parts[0]?.substring(parts[0].length - offset, parts[0].length);\n return `${start}…${end}.${parts[1]}`;\n } else {\n // Everything else\n const start = input?.substring(0, offset);\n const end = input?.substring(input.length - offset, input.length);\n return `${start}…${end}`;\n }\n}\n","export const tlds = [\n 'AAA',\n 'AARP',\n 'ABB',\n 'ABBOTT',\n 'ABBVIE',\n 'ABC',\n 'ABLE',\n 'ABOGADO',\n 'ABUDHABI',\n 'AC',\n 'ACADEMY',\n 'ACCENTURE',\n 'ACCOUNTANT',\n 'ACCOUNTANTS',\n 'ACO',\n 'ACTOR',\n 'AD',\n 'ADS',\n 'ADULT',\n 'AE',\n 'AEG',\n 'AERO',\n 'AETNA',\n 'AF',\n 'AFL',\n 'AFRICA',\n 'AG',\n 'AGAKHAN',\n 'AGENCY',\n 'AI',\n 'AIG',\n 'AIRBUS',\n 'AIRFORCE',\n 'AIRTEL',\n 'AKDN',\n 'AL',\n 'ALIBABA',\n 'ALIPAY',\n 'ALLFINANZ',\n 'ALLSTATE',\n 'ALLY',\n 'ALSACE',\n 'ALSTOM',\n 'AM',\n 'AMAZON',\n 'AMERICANEXPRESS',\n 'AMERICANFAMILY',\n 'AMEX',\n 'AMFAM',\n 'AMICA',\n 'AMSTERDAM',\n 'ANALYTICS',\n 'ANDROID',\n 'ANQUAN',\n 'ANZ',\n 'AO',\n 'AOL',\n 'APARTMENTS',\n 'APP',\n 'APPLE',\n 'AQ',\n 'AQUARELLE',\n 'AR',\n 'ARAB',\n 'ARAMCO',\n 'ARCHI',\n 'ARMY',\n 'ARPA',\n 'ART',\n 'ARTE',\n 'AS',\n 'ASDA',\n 'ASIA',\n 'ASSOCIATES',\n 'AT',\n 'ATHLETA',\n 'ATTORNEY',\n 'AU',\n 'AUCTION',\n 'AUDI',\n 'AUDIBLE',\n 'AUDIO',\n 'AUSPOST',\n 'AUTHOR',\n 'AUTO',\n 'AUTOS',\n 'AW',\n 'AWS',\n 'AX',\n 'AXA',\n 'AZ',\n 'AZURE',\n 'BA',\n 'BABY',\n 'BAIDU',\n 'BANAMEX',\n 'BAND',\n 'BANK',\n 'BAR',\n 'BARCELONA',\n 'BARCLAYCARD',\n 'BARCLAYS',\n 'BAREFOOT',\n 'BARGAINS',\n 'BASEBALL',\n 'BASKETBALL',\n 'BAUHAUS',\n 'BAYERN',\n 'BB',\n 'BBC',\n 'BBT',\n 'BBVA',\n 'BCG',\n 'BCN',\n 'BD',\n 'BE',\n 'BEATS',\n 'BEAUTY',\n 'BEER',\n 'BENTLEY',\n 'BERLIN',\n 'BEST',\n 'BESTBUY',\n 'BET',\n 'BF',\n 'BG',\n 'BH',\n 'BHARTI',\n 'BI',\n 'BIBLE',\n 'BID',\n 'BIKE',\n 'BING',\n 'BINGO',\n 'BIO',\n 'BIZ',\n 'BJ',\n 'BLACK',\n 'BLACKFRIDAY',\n 'BLOCKBUSTER',\n 'BLOG',\n 'BLOOMBERG',\n 'BLUE',\n 'BM',\n 'BMS',\n 'BMW',\n 'BN',\n 'BNPPARIBAS',\n 'BO',\n 'BOATS',\n 'BOEHRINGER',\n 'BOFA',\n 'BOM',\n 'BOND',\n 'BOO',\n 'BOOK',\n 'BOOKING',\n 'BOSCH',\n 'BOSTIK',\n 'BOSTON',\n 'BOT',\n 'BOUTIQUE',\n 'BOX',\n 'BR',\n 'BRADESCO',\n 'BRIDGESTONE',\n 'BROADWAY',\n 'BROKER',\n 'BROTHER',\n 'BRUSSELS',\n 'BS',\n 'BT',\n 'BUILD',\n 'BUILDERS',\n 'BUSINESS',\n 'BUY',\n 'BUZZ',\n 'BV',\n 'BW',\n 'BY',\n 'BZ',\n 'BZH',\n 'CA',\n 'CAB',\n 'CAFE',\n 'CAL',\n 'CALL',\n 'CALVINKLEIN',\n 'CAM',\n 'CAMERA',\n 'CAMP',\n 'CANON',\n 'CAPETOWN',\n 'CAPITAL',\n 'CAPITALONE',\n 'CAR',\n 'CARAVAN',\n 'CARDS',\n 'CARE',\n 'CAREER',\n 'CAREERS',\n 'CARS',\n 'CASA',\n 'CASE',\n 'CASH',\n 'CASINO',\n 'CAT',\n 'CATERING',\n 'CATHOLIC',\n 'CBA',\n 'CBN',\n 'CBRE',\n 'CC',\n 'CD',\n 'CENTER',\n 'CEO',\n 'CERN',\n 'CF',\n 'CFA',\n 'CFD',\n 'CG',\n 'CH',\n 'CHANEL',\n 'CHANNEL',\n 'CHARITY',\n 'CHASE',\n 'CHAT',\n 'CHEAP',\n 'CHINTAI',\n 'CHRISTMAS',\n 'CHROME',\n 'CHURCH',\n 'CI',\n 'CIPRIANI',\n 'CIRCLE',\n 'CISCO',\n 'CITADEL',\n 'CITI',\n 'CITIC',\n 'CITY',\n 'CK',\n 'CL',\n 'CLAIMS',\n 'CLEANING',\n 'CLICK',\n 'CLINIC',\n 'CLINIQUE',\n 'CLOTHING',\n 'CLOUD',\n 'CLUB',\n 'CLUBMED',\n 'CM',\n 'CN',\n 'CO',\n 'COACH',\n 'CODES',\n 'COFFEE',\n 'COLLEGE',\n 'COLOGNE',\n 'COM',\n 'COMMBANK',\n 'COMMUNITY',\n 'COMPANY',\n 'COMPARE',\n 'COMPUTER',\n 'COMSEC',\n 'CONDOS',\n 'CONSTRUCTION',\n 'CONSULTING',\n 'CONTACT',\n 'CONTRACTORS',\n 'COOKING',\n 'COOL',\n 'COOP',\n 'CORSICA',\n 'COUNTRY',\n 'COUPON',\n 'COUPONS',\n 'COURSES',\n 'CPA',\n 'CR',\n 'CREDIT',\n 'CREDITCARD',\n 'CREDITUNION',\n 'CRICKET',\n 'CROWN',\n 'CRS',\n 'CRUISE',\n 'CRUISES',\n 'CU',\n 'CUISINELLA',\n 'CV',\n 'CW',\n 'CX',\n 'CY',\n 'CYMRU',\n 'CYOU',\n 'CZ',\n 'DAD',\n 'DANCE',\n 'DATA',\n 'DATE',\n 'DATING',\n 'DATSUN',\n 'DAY',\n 'DCLK',\n 'DDS',\n 'DE',\n 'DEAL',\n 'DEALER',\n 'DEALS',\n 'DEGREE',\n 'DELIVERY',\n 'DELL',\n 'DELOITTE',\n 'DELTA',\n 'DEMOCRAT',\n 'DENTAL',\n 'DENTIST',\n 'DESI',\n 'DESIGN',\n 'DEV',\n 'DHL',\n 'DIAMONDS',\n 'DIET',\n 'DIGITAL',\n 'DIRECT',\n 'DIRECTORY',\n 'DISCOUNT',\n 'DISCOVER',\n 'DISH',\n 'DIY',\n 'DJ',\n 'DK',\n 'DM',\n 'DNP',\n 'DO',\n 'DOCS',\n 'DOCTOR',\n 'DOG',\n 'DOMAINS',\n 'DOT',\n 'DOWNLOAD',\n 'DRIVE',\n 'DTV',\n 'DUBAI',\n 'DUNLOP',\n 'DUPONT',\n 'DURBAN',\n 'DVAG',\n 'DVR',\n 'DZ',\n 'EARTH',\n 'EAT',\n 'EC',\n 'ECO',\n 'EDEKA',\n 'EDU',\n 'EDUCATION',\n 'EE',\n 'EG',\n 'EMAIL',\n 'EMERCK',\n 'ENERGY',\n 'ENGINEER',\n 'ENGINEERING',\n 'ENTERPRISES',\n 'EPSON',\n 'EQUIPMENT',\n 'ER',\n 'ERICSSON',\n 'ERNI',\n 'ES',\n 'ESQ',\n 'ESTATE',\n 'ET',\n 'EU',\n 'EUROVISION',\n 'EUS',\n 'EVENTS',\n 'EXCHANGE',\n 'EXPERT',\n 'EXPOSED',\n 'EXPRESS',\n 'EXTRASPACE',\n 'FAGE',\n 'FAIL',\n 'FAIRWINDS',\n 'FAITH',\n 'FAMILY',\n 'FAN',\n 'FANS',\n 'FARM',\n 'FARMERS',\n 'FASHION',\n 'FAST',\n 'FEDEX',\n 'FEEDBACK',\n 'FERRARI',\n 'FERRERO',\n 'FI',\n 'FIDELITY',\n 'FIDO',\n 'FILM',\n 'FINAL',\n 'FINANCE',\n 'FINANCIAL',\n 'FIRE',\n 'FIRESTONE',\n 'FIRMDALE',\n 'FISH',\n 'FISHING',\n 'FIT',\n 'FITNESS',\n 'FJ',\n 'FK',\n 'FLICKR',\n 'FLIGHTS',\n 'FLIR',\n 'FLORIST',\n 'FLOWERS',\n 'FLY',\n 'FM',\n 'FO',\n 'FOO',\n 'FOOD',\n 'FOOTBALL',\n 'FORD',\n 'FOREX',\n 'FORSALE',\n 'FORUM',\n 'FOUNDATION',\n 'FOX',\n 'FR',\n 'FREE',\n 'FRESENIUS',\n 'FRL',\n 'FROGANS',\n 'FRONTIER',\n 'FTR',\n 'FUJITSU',\n 'FUN',\n 'FUND',\n 'FURNITURE',\n 'FUTBOL',\n 'FYI',\n 'GA',\n 'GAL',\n 'GALLERY',\n 'GALLO',\n 'GALLUP',\n 'GAME',\n 'GAMES',\n 'GAP',\n 'GARDEN',\n 'GAY',\n 'GB',\n 'GBIZ',\n 'GD',\n 'GDN',\n 'GE',\n 'GEA',\n 'GENT',\n 'GENTING',\n 'GEORGE',\n 'GF',\n 'GG',\n 'GGEE',\n 'GH',\n 'GI',\n 'GIFT',\n 'GIFTS',\n 'GIVES',\n 'GIVING',\n 'GL',\n 'GLASS',\n 'GLE',\n 'GLOBAL',\n 'GLOBO',\n 'GM',\n 'GMAIL',\n 'GMBH',\n 'GMO',\n 'GMX',\n 'GN',\n 'GODADDY',\n 'GOLD',\n 'GOLDPOINT',\n 'GOLF',\n 'GOO',\n 'GOODYEAR',\n 'GOOG',\n 'GOOGLE',\n 'GOP',\n 'GOT',\n 'GOV',\n 'GP',\n 'GQ',\n 'GR',\n 'GRAINGER',\n 'GRAPHICS',\n 'GRATIS',\n 'GREEN',\n 'GRIPE',\n 'GROCERY',\n 'GROUP',\n 'GS',\n 'GT',\n 'GU',\n 'GUCCI',\n 'GUGE',\n 'GUIDE',\n 'GUITARS',\n 'GURU',\n 'GW',\n 'GY',\n 'HAIR',\n 'HAMBURG',\n 'HANGOUT',\n 'HAUS',\n 'HBO',\n 'HDFC',\n 'HDFCBANK',\n 'HEALTH',\n 'HEALTHCARE',\n 'HELP',\n 'HELSINKI',\n 'HERE',\n 'HERMES',\n 'HIPHOP',\n 'HISAMITSU',\n 'HITACHI',\n 'HIV',\n 'HK',\n 'HKT',\n 'HM',\n 'HN',\n 'HOCKEY',\n 'HOLDINGS',\n 'HOLIDAY',\n 'HOMEDEPOT',\n 'HOMEGOODS',\n 'HOMES',\n 'HOMESENSE',\n 'HONDA',\n 'HORSE',\n 'HOSPITAL',\n 'HOST',\n 'HOSTING',\n 'HOT',\n 'HOTELS',\n 'HOTMAIL',\n 'HOUSE',\n 'HOW',\n 'HR',\n 'HSBC',\n 'HT',\n 'HU',\n 'HUGHES',\n 'HYATT',\n 'HYUNDAI',\n 'IBM',\n 'ICBC',\n 'ICE',\n 'ICU',\n 'ID',\n 'IE',\n 'IEEE',\n 'IFM',\n 'IKANO',\n 'IL',\n 'IM',\n 'IMAMAT',\n 'IMDB',\n 'IMMO',\n 'IMMOBILIEN',\n 'IN',\n 'INC',\n 'INDUSTRIES',\n 'INFINITI',\n 'INFO',\n 'ING',\n 'INK',\n 'INSTITUTE',\n 'INSURANCE',\n 'INSURE',\n 'INT',\n 'INTERNATIONAL',\n 'INTUIT',\n 'INVESTMENTS',\n 'IO',\n 'IPIRANGA',\n 'IQ',\n 'IR',\n 'IRISH',\n 'IS',\n 'ISMAILI',\n 'IST',\n 'ISTANBUL',\n 'IT',\n 'ITAU',\n 'ITV',\n 'JAGUAR',\n 'JAVA',\n 'JCB',\n 'JE',\n 'JEEP',\n 'JETZT',\n 'JEWELRY',\n 'JIO',\n 'JLL',\n 'JM',\n 'JMP',\n 'JNJ',\n 'JO',\n 'JOBS',\n 'JOBURG',\n 'JOT',\n 'JOY',\n 'JP',\n 'JPMORGAN',\n 'JPRS',\n 'JUEGOS',\n 'JUNIPER',\n 'KAUFEN',\n 'KDDI',\n 'KE',\n 'KERRYHOTELS',\n 'KERRYLOGISTICS',\n 'KERRYPROPERTIES',\n 'KFH',\n 'KG',\n 'KH',\n 'KI',\n 'KIA',\n 'KIDS',\n 'KIM',\n 'KINDLE',\n 'KITCHEN',\n 'KIWI',\n 'KM',\n 'KN',\n 'KOELN',\n 'KOMATSU',\n 'KOSHER',\n 'KP',\n 'KPMG',\n 'KPN',\n 'KR',\n 'KRD',\n 'KRED',\n 'KUOKGROUP',\n 'KW',\n 'KY',\n 'KYOTO',\n 'KZ',\n 'LA',\n 'LACAIXA',\n 'LAMBORGHINI',\n 'LAMER',\n 'LANCASTER',\n 'LAND',\n 'LANDROVER',\n 'LANXESS',\n 'LASALLE',\n 'LAT',\n 'LATINO',\n 'LATROBE',\n 'LAW',\n 'LAWYER',\n 'LB',\n 'LC',\n 'LDS',\n 'LEASE',\n 'LECLERC',\n 'LEFRAK',\n 'LEGAL',\n 'LEGO',\n 'LEXUS',\n 'LGBT',\n 'LI',\n 'LIDL',\n 'LIFE',\n 'LIFEINSURANCE',\n 'LIFESTYLE',\n 'LIGHTING',\n 'LIKE',\n 'LILLY',\n 'LIMITED',\n 'LIMO',\n 'LINCOLN',\n 'LINK',\n 'LIPSY',\n 'LIVE',\n 'LIVING',\n 'LK',\n 'LLC',\n 'LLP',\n 'LOAN',\n 'LOANS',\n 'LOCKER',\n 'LOCUS',\n 'LOL',\n 'LONDON',\n 'LOTTE',\n 'LOTTO',\n 'LOVE',\n 'LPL',\n 'LPLFINANCIAL',\n 'LR',\n 'LS',\n 'LT',\n 'LTD',\n 'LTDA',\n 'LU',\n 'LUNDBECK',\n 'LUXE',\n 'LUXURY',\n 'LV',\n 'LY',\n 'MA',\n 'MADRID',\n 'MAIF',\n 'MAISON',\n 'MAKEUP',\n 'MAN',\n 'MANAGEMENT',\n 'MANGO',\n 'MAP',\n 'MARKET',\n 'MARKETING',\n 'MARKETS',\n 'MARRIOTT',\n 'MARSHALLS',\n 'MATTEL',\n 'MBA',\n 'MC',\n 'MCKINSEY',\n 'MD',\n 'ME',\n 'MED',\n 'MEDIA',\n 'MEET',\n 'MELBOURNE',\n 'MEME',\n 'MEMORIAL',\n 'MEN',\n 'MENU',\n 'MERCKMSD',\n 'MG',\n 'MH',\n 'MIAMI',\n 'MICROSOFT',\n 'MIL',\n 'MINI',\n 'MINT',\n 'MIT',\n 'MITSUBISHI',\n 'MK',\n 'ML',\n 'MLB',\n 'MLS',\n 'MM',\n 'MMA',\n 'MN',\n 'MO',\n 'MOBI',\n 'MOBILE',\n 'MODA',\n 'MOE',\n 'MOI',\n 'MOM',\n 'MONASH',\n 'MONEY',\n 'MONSTER',\n 'MORMON',\n 'MORTGAGE',\n 'MOSCOW',\n 'MOTO',\n 'MOTORCYCLES',\n 'MOV',\n 'MOVIE',\n 'MP',\n 'MQ',\n 'MR',\n 'MS',\n 'MSD',\n 'MT',\n 'MTN',\n 'MTR',\n 'MU',\n 'MUSEUM',\n 'MUSIC',\n 'MV',\n 'MW',\n 'MX',\n 'MY',\n 'MZ',\n 'NA',\n 'NAB',\n 'NAGOYA',\n 'NAME',\n 'NAVY',\n 'NBA',\n 'NC',\n 'NE',\n 'NEC',\n 'NET',\n 'NETBANK',\n 'NETFLIX',\n 'NETWORK',\n 'NEUSTAR',\n 'NEW',\n 'NEWS',\n 'NEXT',\n 'NEXTDIRECT',\n 'NEXUS',\n 'NF',\n 'NFL',\n 'NG',\n 'NGO',\n 'NHK',\n 'NI',\n 'NICO',\n 'NIKE',\n 'NIKON',\n 'NINJA',\n 'NISSAN',\n 'NISSAY',\n 'NL',\n 'NO',\n 'NOKIA',\n 'NORTON',\n 'NOW',\n 'NOWRUZ',\n 'NOWTV',\n 'NP',\n 'NR',\n 'NRA',\n 'NRW',\n 'NTT',\n 'NU',\n 'NYC',\n 'NZ',\n 'OBI',\n 'OBSERVER',\n 'OFFICE',\n 'OKINAWA',\n 'OLAYAN',\n 'OLAYANGROUP',\n 'OLLO',\n 'OM',\n 'OMEGA',\n 'ONE',\n 'ONG',\n 'ONL',\n 'ONLINE',\n 'OOO',\n 'OPEN',\n 'ORACLE',\n 'ORANGE',\n 'ORG',\n 'ORGANIC',\n 'ORIGINS',\n 'OSAKA',\n 'OTSUKA',\n 'OTT',\n 'OVH',\n 'PA',\n 'PAGE',\n 'PANASONIC',\n 'PARIS',\n 'PARS',\n 'PARTNERS',\n 'PARTS',\n 'PARTY',\n 'PAY',\n 'PCCW',\n 'PE',\n 'PET',\n 'PF',\n 'PFIZER',\n 'PG',\n 'PH',\n 'PHARMACY',\n 'PHD',\n 'PHILIPS',\n 'PHONE',\n 'PHOTO',\n 'PHOTOGRAPHY',\n 'PHOTOS',\n 'PHYSIO',\n 'PICS',\n 'PICTET',\n 'PICTURES',\n 'PID',\n 'PIN',\n 'PING',\n 'PINK',\n 'PIONEER',\n 'PIZZA',\n 'PK',\n 'PL',\n 'PLACE',\n 'PLAY',\n 'PLAYSTATION',\n 'PLUMBING',\n 'PLUS',\n 'PM',\n 'PN',\n 'PNC',\n 'POHL',\n 'POKER',\n 'POLITIE',\n 'PORN',\n 'POST',\n 'PR',\n 'PRAMERICA',\n 'PRAXI',\n 'PRESS',\n 'PRIME',\n 'PRO',\n 'PROD',\n 'PRODUCTIONS',\n 'PROF',\n 'PROGRESSIVE',\n 'PROMO',\n 'PROPERTIES',\n 'PROPERTY',\n 'PROTECTION',\n 'PRU',\n 'PRUDENTIAL',\n 'PS',\n 'PT',\n 'PUB',\n 'PW',\n 'PWC',\n 'PY',\n 'QA',\n 'QPON',\n 'QUEBEC',\n 'QUEST',\n 'RACING',\n 'RADIO',\n 'RE',\n 'READ',\n 'REALESTATE',\n 'REALTOR',\n 'REALTY',\n 'RECIPES',\n 'RED',\n 'REDSTONE',\n 'REDUMBRELLA',\n 'REHAB',\n 'REISE',\n 'REISEN',\n 'REIT',\n 'RELIANCE',\n 'REN',\n 'RENT',\n 'RENTALS',\n 'REPAIR',\n 'REPORT',\n 'REPUBLICAN',\n 'REST',\n 'RESTAURANT',\n 'REVIEW',\n 'REVIEWS',\n 'REXROTH',\n 'RICH',\n 'RICHARDLI',\n 'RICOH',\n 'RIL',\n 'RIO',\n 'RIP',\n 'RO',\n 'ROCKS',\n 'RODEO',\n 'ROGERS',\n 'ROOM',\n 'RS',\n 'RSVP',\n 'RU',\n 'RUGBY',\n 'RUHR',\n 'RUN',\n 'RW',\n 'RWE',\n 'RYUKYU',\n 'SA',\n 'SAARLAND',\n 'SAFE',\n 'SAFETY',\n 'SAKURA',\n 'SALE',\n 'SALON',\n 'SAMSCLUB',\n 'SAMSUNG',\n 'SANDVIK',\n 'SANDVIKCOROMANT',\n 'SANOFI',\n 'SAP',\n 'SARL',\n 'SAS',\n 'SAVE',\n 'SAXO',\n 'SB',\n 'SBI',\n 'SBS',\n 'SC',\n 'SCB',\n 'SCHAEFFLER',\n 'SCHMIDT',\n 'SCHOLARSHIPS',\n 'SCHOOL',\n 'SCHULE',\n 'SCHWARZ',\n 'SCIENCE',\n 'SCOT',\n 'SD',\n 'SE',\n 'SEARCH',\n 'SEAT',\n 'SECURE',\n 'SECURITY',\n 'SEEK',\n 'SELECT',\n 'SENER',\n 'SERVICES',\n 'SEVEN',\n 'SEW',\n 'SEX',\n 'SEXY',\n 'SFR',\n 'SG',\n 'SH',\n 'SHANGRILA',\n 'SHARP',\n 'SHELL',\n 'SHIA',\n 'SHIKSHA',\n 'SHOES',\n 'SHOP',\n 'SHOPPING',\n 'SHOUJI',\n 'SHOW',\n 'SI',\n 'SILK',\n 'SINA',\n 'SINGLES',\n 'SITE',\n 'SJ',\n 'SK',\n 'SKI',\n 'SKIN',\n 'SKY',\n 'SKYPE',\n 'SL',\n 'SLING',\n 'SM',\n 'SMART',\n 'SMILE',\n 'SN',\n 'SNCF',\n 'SO',\n 'SOCCER',\n 'SOCIAL',\n 'SOFTBANK',\n 'SOFTWARE',\n 'SOHU',\n 'SOLAR',\n 'SOLUTIONS',\n 'SONG',\n 'SONY',\n 'SOY',\n 'SPA',\n 'SPACE',\n 'SPORT',\n 'SPOT',\n 'SR',\n 'SRL',\n 'SS',\n 'ST',\n 'STADA',\n 'STAPLES',\n 'STAR',\n 'STATEBANK',\n 'STATEFARM',\n 'STC',\n 'STCGROUP',\n 'STOCKHOLM',\n 'STORAGE',\n 'STORE',\n 'STREAM',\n 'STUDIO',\n 'STUDY',\n 'STYLE',\n 'SU',\n 'SUCKS',\n 'SUPPLIES',\n 'SUPPLY',\n 'SUPPORT',\n 'SURF',\n 'SURGERY',\n 'SUZUKI',\n 'SV',\n 'SWATCH',\n 'SWISS',\n 'SX',\n 'SY',\n 'SYDNEY',\n 'SYSTEMS',\n 'SZ',\n 'TAB',\n 'TAIPEI',\n 'TALK',\n 'TAOBAO',\n 'TARGET',\n 'TATAMOTORS',\n 'TATAR',\n 'TATTOO',\n 'TAX',\n 'TAXI',\n 'TC',\n 'TCI',\n 'TD',\n 'TDK',\n 'TEAM',\n 'TECH',\n 'TECHNOLOGY',\n 'TEL',\n 'TEMASEK',\n 'TENNIS',\n 'TEVA',\n 'TF',\n 'TG',\n 'TH',\n 'THD',\n 'THEATER',\n 'THEATRE',\n 'TIAA',\n 'TICKETS',\n 'TIENDA',\n 'TIPS',\n 'TIRES',\n 'TIROL',\n 'TJ',\n 'TJMAXX',\n 'TJX',\n 'TK',\n 'TKMAXX',\n 'TL',\n 'TM',\n 'TMALL',\n 'TN',\n 'TO',\n 'TODAY',\n 'TOKYO',\n 'TOOLS',\n 'TOP',\n 'TORAY',\n 'TOSHIBA',\n 'TOTAL',\n 'TOURS',\n 'TOWN',\n 'TOYOTA',\n 'TOYS',\n 'TR',\n 'TRADE',\n 'TRADING',\n 'TRAINING',\n 'TRAVEL',\n 'TRAVELERS',\n 'TRAVELERSINSURANCE',\n 'TRUST',\n 'TRV',\n 'TT',\n 'TUBE',\n 'TUI',\n 'TUNES',\n 'TUSHU',\n 'TV',\n 'TVS',\n 'TW',\n 'TZ',\n 'UA',\n 'UBANK',\n 'UBS',\n 'UG',\n 'UK',\n 'UNICOM',\n 'UNIVERSITY',\n 'UNO',\n 'UOL',\n 'UPS',\n 'US',\n 'UY',\n 'UZ',\n 'VA',\n 'VACATIONS',\n 'VANA',\n 'VANGUARD',\n 'VC',\n 'VE',\n 'VEGAS',\n 'VENTURES',\n 'VERISIGN',\n 'VERSICHERUNG',\n 'VET',\n 'VG',\n 'VI',\n 'VIAJES',\n 'VIDEO',\n 'VIG',\n 'VIKING',\n 'VILLAS',\n 'VIN',\n 'VIP',\n 'VIRGIN',\n 'VISA',\n 'VISION',\n 'VIVA',\n 'VIVO',\n 'VLAANDEREN',\n 'VN',\n 'VODKA',\n 'VOLVO',\n 'VOTE',\n 'VOTING',\n 'VOTO',\n 'VOYAGE',\n 'VU',\n 'WALES',\n 'WALMART',\n 'WALTER',\n 'WANG',\n 'WANGGOU',\n 'WATCH',\n 'WATCHES',\n 'WEATHER',\n 'WEATHERCHANNEL',\n 'WEBCAM',\n 'WEBER',\n 'WEBSITE',\n 'WED',\n 'WEDDING',\n 'WEIBO',\n 'WEIR',\n 'WF',\n 'WHOSWHO',\n 'WIEN',\n 'WIKI',\n 'WILLIAMHILL',\n 'WIN',\n 'WINDOWS',\n 'WINE',\n 'WINNERS',\n 'WME',\n 'WOLTERSKLUWER',\n 'WOODSIDE',\n 'WORK',\n 'WORKS',\n 'WORLD',\n 'WOW',\n 'WS',\n 'WTC',\n 'WTF',\n 'XBOX',\n 'XEROX',\n 'XIHUAN',\n 'XIN',\n 'XN--11B4C3D',\n 'XN--1CK2E1B',\n 'XN--1QQW23A',\n 'XN--2SCRJ9C',\n 'XN--30RR7Y',\n 'XN--3BST00M',\n 'XN--3DS443G',\n 'XN--3E0B707E',\n 'XN--3HCRJ9C',\n 'XN--3PXU8K',\n 'XN--42C2D9A',\n 'XN--45BR5CYL',\n 'XN--45BRJ9C',\n 'XN--45Q11C',\n 'XN--4DBRK0CE',\n 'XN--4GBRIM',\n 'XN--54B7FTA0CC',\n 'XN--55QW42G',\n 'XN--55QX5D',\n 'XN--5SU34J936BGSG',\n 'XN--5TZM5G',\n 'XN--6FRZ82G',\n 'XN--6QQ986B3XL',\n 'XN--80ADXHKS',\n 'XN--80AO21A',\n 'XN--80AQECDR1A',\n 'XN--80ASEHDB',\n 'XN--80ASWG',\n 'XN--8Y0A063A',\n 'XN--90A3AC',\n 'XN--90AE',\n 'XN--90AIS',\n 'XN--9DBQ2A',\n 'XN--9ET52U',\n 'XN--9KRT00A',\n 'XN--B4W605FERD',\n 'XN--BCK1B9A5DRE4C',\n 'XN--C1AVG',\n 'XN--C2BR7G',\n 'XN--CCK2B3B',\n 'XN--CCKWCXETD',\n 'XN--CG4BKI',\n 'XN--CLCHC0EA0B2G2A9GCD',\n 'XN--CZR694B',\n 'XN--CZRS0T',\n 'XN--CZRU2D',\n 'XN--D1ACJ3B',\n 'XN--D1ALF',\n 'XN--E1A4C',\n 'XN--ECKVDTC9D',\n 'XN--EFVY88H',\n 'XN--FCT429K',\n 'XN--FHBEI',\n 'XN--FIQ228C5HS',\n 'XN--FIQ64B',\n 'XN--FIQS8S',\n 'XN--FIQZ9S',\n 'XN--FJQ720A',\n 'XN--FLW351E',\n 'XN--FPCRJ9C3D',\n 'XN--FZC2C9E2C',\n 'XN--FZYS8D69UVGM',\n 'XN--G2XX48C',\n 'XN--GCKR3F0F',\n 'XN--GECRJ9C',\n 'XN--GK3AT1E',\n 'XN--H2BREG3EVE',\n 'XN--H2BRJ9C',\n 'XN--H2BRJ9C8C',\n 'XN--HXT814E',\n 'XN--I1B6B1A6A2E',\n 'XN--IMR513N',\n 'XN--IO0A7I',\n 'XN--J1AEF',\n 'XN--J1AMH',\n 'XN--J6W193G',\n 'XN--JLQ480N2RG',\n 'XN--JVR189M',\n 'XN--KCRX77D1X4A',\n 'XN--KPRW13D',\n 'XN--KPRY57D',\n 'XN--KPUT3I',\n 'XN--L1ACC',\n 'XN--LGBBAT1AD8J',\n 'XN--MGB9AWBF',\n 'XN--MGBA3A3EJT',\n 'XN--MGBA3A4F16A',\n 'XN--MGBA7C0BBN0A',\n 'XN--MGBAAM7A8H',\n 'XN--MGBAB2BD',\n 'XN--MGBAH1A3HJKRD',\n 'XN--MGBAI9AZGQP6J',\n 'XN--MGBAYH7GPA',\n 'XN--MGBBH1A',\n 'XN--MGBBH1A71E',\n 'XN--MGBC0A9AZCG',\n 'XN--MGBCA7DZDO',\n 'XN--MGBCPQ6GPA1A',\n 'XN--MGBERP4A5D4AR',\n 'XN--MGBGU82A',\n 'XN--MGBI4ECEXP',\n 'XN--MGBPL2FH',\n 'XN--MGBT3DHD',\n 'XN--MGBTX2B',\n 'XN--MGBX4CD0AB',\n 'XN--MIX891F',\n 'XN--MK1BU44C',\n 'XN--MXTQ1M',\n 'XN--NGBC5AZD',\n 'XN--NGBE9E0A',\n 'XN--NGBRX',\n 'XN--NODE',\n 'XN--NQV7F',\n 'XN--NQV7FS00EMA',\n 'XN--NYQY26A',\n 'XN--O3CW4H',\n 'XN--OGBPF8FL',\n 'XN--OTU796D',\n 'XN--P1ACF',\n 'XN--P1AI',\n 'XN--PGBS0DH',\n 'XN--PSSY2U',\n 'XN--Q7CE6A',\n 'XN--Q9JYB4C',\n 'XN--QCKA1PMC',\n 'XN--QXA6A',\n 'XN--QXAM',\n 'XN--RHQV96G',\n 'XN--ROVU88B',\n 'XN--RVC1E0AM3E',\n 'XN--S9BRJ9C',\n 'XN--SES554G',\n 'XN--T60B56A',\n 'XN--TCKWE',\n 'XN--TIQ49XQYJ',\n 'XN--UNUP4Y',\n 'XN--VERMGENSBERATER-CTB',\n 'XN--VERMGENSBERATUNG-PWB',\n 'XN--VHQUV',\n 'XN--VUQ861B',\n 'XN--W4R85EL8FHU5DNRA',\n 'XN--W4RS40L',\n 'XN--WGBH1C',\n 'XN--WGBL6A',\n 'XN--XHQ521B',\n 'XN--XKC2AL3HYE2A',\n 'XN--XKC2DL3A5EE0H',\n 'XN--Y9A3AQ',\n 'XN--YFRO4I67O',\n 'XN--YGBI2AMMX',\n 'XN--ZFR164B',\n 'XXX',\n 'XYZ',\n 'YACHTS',\n 'YAHOO',\n 'YAMAXUN',\n 'YANDEX',\n 'YE',\n 'YODOBASHI',\n 'YOGA',\n 'YOKOHAMA',\n 'YOU',\n 'YOUTUBE',\n 'YT',\n 'YUN',\n 'ZA',\n 'ZAPPOS',\n 'ZARA',\n 'ZERO',\n 'ZIP',\n 'ZM',\n 'ZONE',\n 'ZUERICH',\n 'ZW',\n];\n","import { tlds } from './tlds-list';\n\nconst tldRegex = tlds.join('|');\nconst urlRegex = new RegExp(`\\\\b.*\\\\s*\\\\.\\\\s*(${tldRegex})\\\\b`, 'gi');\n\nconst spamWords = ['won', 'win', 'click'];\nexport const spamReplacement = 'Suspicious token';\n\nfunction spamUrlFilter(input: string) {\n return input.match(urlRegex);\n}\n\nfunction spamWordFilter(input: string): boolean {\n function containsSpam(element: string) {\n return input.toLowerCase().includes(element);\n }\n return spamWords.some(containsSpam);\n}\n\ninterface SpamFilterArgs {\n input: string;\n whitelist: string[];\n}\n\nexport function spamFilter({ input, whitelist }: SpamFilterArgs): string {\n if (whitelist.includes(input)) return input;\n\n const urlFound = spamUrlFilter(input);\n const spamWordsFound = spamWordFilter(input);\n\n if (urlFound || spamWordsFound) {\n return spamReplacement;\n }\n\n return input;\n}\n","export function extractPhraseFromString(value: string) {\n const clean = value.trim();\n const words = clean.match(/\\S+/g);\n if (words?.length) {\n return words\n .map(word => (word.match(/[^0-9]+/g) ? word : null))\n .filter(Boolean)\n .join(' ');\n } else {\n return clean;\n }\n}\n","export function pxStringToNumber(pxString: string): number {\n if (!/^\\d+px$/.test(pxString)) {\n throw new Error('Invalid pixel string format');\n }\n return +pxString.replace('px', '');\n}\n","export function abbreviateNumber(n: number) {\n if (n < 1e3) return n.toString();\n if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(2) + 'K';\n if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(2) + 'M';\n if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(2) + 'B';\n if (n >= 1e12) return +(n / 1e12).toFixed(2) + 'T';\n return n.toString();\n}\n","export function removeCommas(amountWithCommas: string) {\n if (typeof amountWithCommas !== 'string') {\n throw new Error('Amount with commas must be a string');\n }\n return amountWithCommas.replace(/,/g, '');\n}\n","import { abbreviateNumber } from '../../abbreviate-number/abbreviate-number';\nimport { removeCommas } from './remove-commas';\n\n/**\n * TODO: investigate improving\n * @param amount is a string\n * in the extension we pre-convert it from Money with formatMoneyWithoutSymbol\n */\nexport function formatBalance(amount: string) {\n if (typeof amount !== 'string' || amount.trim() === '' || isNaN(Number(removeCommas(amount)))) {\n throw new Error('Invalid input: amount must be a non-empty string representing a valid number');\n }\n\n const noCommas = removeCommas(amount);\n const number = parseFloat(noCommas);\n return number > 10_000\n ? {\n isAbbreviated: true,\n value: abbreviateNumber(number),\n }\n : { isAbbreviated: false, value: amount };\n}\n","import { HIRO_EXPLORER_URL } from '@leather.io/constants';\nimport { BitcoinNetworkModes, HIRO_API_BASE_URL_NAKAMOTO_TESTNET } from '@leather.io/models';\n\ninterface MakeStacksTxExplorerLinkArgs {\n mode: BitcoinNetworkModes;\n searchParams?: URLSearchParams;\n txid: string;\n isNakamoto?: boolean;\n}\n// TODO LEA-2285: Remove this function from the extension\nexport function makeStacksTxExplorerLink({\n mode,\n searchParams = new URLSearchParams(),\n txid,\n isNakamoto = false,\n}: MakeStacksTxExplorerLinkArgs) {\n if (mode === 'regtest') return 'http://localhost:8000/txid/' + txid;\n searchParams.append('chain', mode);\n if (isNakamoto) searchParams.append('api', HIRO_API_BASE_URL_NAKAMOTO_TESTNET);\n return `${HIRO_EXPLORER_URL}/txid/${txid}?${searchParams.toString()}`;\n}\n","import DOMPurify from 'dompurify';\n\n/**\n * Universal sanitizer for dynamic HTML content.\n * Uses DOMPurify in the browser, and a safe fallback for SSR (returns plain text).\n */\nexport function sanitizeContent(dirty: string): string {\n if (typeof window !== 'undefined' && typeof DOMPurify !== 'undefined') {\n return DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });\n }\n // SSR fallback: escape HTML tags to prevent injection\n return String(dirty)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n"],"mappings":"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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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","names":["BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","match"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@leather.io/utils",
|
|
3
3
|
"author": "Leather.io contact@leather.io",
|
|
4
4
|
"description": "Shared bitcoin utilities",
|
|
5
|
-
"version": "0.35.
|
|
5
|
+
"version": "0.35.2",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/leather-io/mono/tree/dev/packages/utils",
|
|
8
8
|
"repository": {
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"bignumber.js": "9.1.2",
|
|
21
21
|
"dompurify": "3.2.4",
|
|
22
|
-
"@leather.io/
|
|
23
|
-
"@leather.io/
|
|
22
|
+
"@leather.io/models": "0.33.0",
|
|
23
|
+
"@leather.io/constants": "0.20.4"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/dompurify": "3.0.5",
|
|
@@ -5,12 +5,13 @@ import { MarketData, createMarketData, createMarketPair } from '@leather.io/mode
|
|
|
5
5
|
import {
|
|
6
6
|
baseCurrencyAmountInQuote,
|
|
7
7
|
convertAmountToFractionalUnit,
|
|
8
|
+
convertToMoneyTypeWithDefaultOfZero,
|
|
8
9
|
maxMoney,
|
|
9
10
|
minMoney,
|
|
10
11
|
subtractMoney,
|
|
11
12
|
sumMoney,
|
|
12
13
|
} from './calculate-money';
|
|
13
|
-
import { createMoney, createMoneyFromDecimal } from './format-money';
|
|
14
|
+
import { createMoney, createMoneyFromDecimal, formatMoney } from './format-money';
|
|
14
15
|
|
|
15
16
|
const tenMicroStx = createMoney(10, 'STX');
|
|
16
17
|
const tenStx = createMoneyFromDecimal(10, 'STX');
|
|
@@ -55,6 +56,11 @@ describe(convertAmountToFractionalUnit.name, () => {
|
|
|
55
56
|
expect(convertAmountToFractionalUnit(new BigNumber(99), 6).toNumber()).toEqual(99000000));
|
|
56
57
|
});
|
|
57
58
|
|
|
59
|
+
describe(convertToMoneyTypeWithDefaultOfZero.name, () => {
|
|
60
|
+
test('it converts and formats a number to a money object', () =>
|
|
61
|
+
expect(formatMoney(convertToMoneyTypeWithDefaultOfZero('STX', 400))).toEqual('0.0004 STX'));
|
|
62
|
+
});
|
|
63
|
+
|
|
58
64
|
describe(sumMoney.name, () => {
|
|
59
65
|
test('it sums two money objects', () => {
|
|
60
66
|
const result = sumMoney([tenMicroStx, tenMicroStx]);
|
|
@@ -51,37 +51,12 @@ export function createMoney(value: NumType, symbol: Currency, resolution?: numbe
|
|
|
51
51
|
|
|
52
52
|
const thinSpace = ' ';
|
|
53
53
|
|
|
54
|
-
function exponentialToNumerical(amount: BigNumber) {
|
|
55
|
-
const [integral, decimal, power] = amount.toString().split(/[eE]|\./);
|
|
56
|
-
const expPowerValuePosition = 2;
|
|
57
|
-
const expPower = power ? +power.substring(0, expPowerValuePosition) : 0;
|
|
58
|
-
const positiveExponential = expPower >= 0;
|
|
59
|
-
if (decimal) {
|
|
60
|
-
if (positiveExponential) {
|
|
61
|
-
return Number(`${integral}${decimal.slice(0, +expPower)}.${decimal.slice(+expPower)}`);
|
|
62
|
-
}
|
|
63
|
-
return 0;
|
|
64
|
-
}
|
|
65
|
-
return Number(integral);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function formatMoneyWithoutSymbolWithoutScientific(amount: BigNumber, decimals: number) {
|
|
69
|
-
const numericalAmount = exponentialToNumerical(amount);
|
|
70
|
-
const formattedAmount = new BigNumber(numericalAmount).shiftedBy(-decimals).toString();
|
|
71
|
-
const formattedAmountWithoutScientific = new BigNumber(formattedAmount).toFixed(decimals);
|
|
72
|
-
return `${formattedAmountWithoutScientific}`;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
54
|
export function formatMoney({ amount, symbol, decimals }: Money) {
|
|
76
|
-
|
|
77
|
-
amount,
|
|
78
|
-
decimals
|
|
79
|
-
);
|
|
80
|
-
return `${formattedAmountWithoutScientific} ${symbol}`;
|
|
55
|
+
return `${amount.shiftedBy(-decimals).toString()} ${symbol}`;
|
|
81
56
|
}
|
|
82
57
|
|
|
83
58
|
export function formatMoneyWithoutSymbol({ amount, decimals }: Money) {
|
|
84
|
-
return
|
|
59
|
+
return `${amount.shiftedBy(-decimals).toString()}`;
|
|
85
60
|
}
|
|
86
61
|
|
|
87
62
|
export function formatMoneyToFixedDecimal(
|