@leather.io/utils 0.48.3 → 0.49.0

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @leather.io/utils@0.48.3 build /home/runner/work/mono/mono/packages/utils
2
+ > @leather.io/utils@0.49.0 build /home/runner/work/mono/mono/packages/utils
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -8,9 +8,9 @@
8
8
  CLI Using tsup config: /home/runner/work/mono/mono/packages/utils/tsup.config.ts
9
9
  CLI Target: es2022
10
10
  ESM Build start
11
- ESM dist/index.js 73.59 KB
12
- ESM dist/index.js.map 139.33 KB
13
- ESM ⚡️ Build success in 41ms
11
+ ESM dist/index.js 73.66 KB
12
+ ESM dist/index.js.map 139.51 KB
13
+ ESM ⚡️ Build success in 86ms
14
14
  DTS Build start
15
- DTS ⚡️ Build success in 2258ms
16
- DTS dist/index.d.ts 14.78 KB
15
+ DTS ⚡️ Build success in 3207ms
16
+ DTS dist/index.d.ts 15.02 KB
package/CHANGELOG.md CHANGED
@@ -368,6 +368,54 @@
368
368
  * devDependencies
369
369
  * @leather.io/prettier-config bumped to 0.9.0
370
370
 
371
+ ## [0.49.0](https://github.com/leather-io/mono/compare/@leather.io/utils-v0.48.3...@leather.io/utils-v0.49.0) (2025-11-19)
372
+
373
+
374
+ ### Features
375
+
376
+ * add alex swap provider ([152fd3a](https://github.com/leather-io/mono/commit/152fd3a6d015aace7bd682819a7d3d6112a64730))
377
+ * add descriptors to get addresses rpc ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
378
+ * add portfolio table ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
379
+ * portfolio activity ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
380
+ * portfolio ui hover, borders, token count ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
381
+ * **web:** add empty state ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
382
+ * **web:** add hover events ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
383
+ * **web:** add portfolio modal ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
384
+ * **web:** add stacked bar chart ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
385
+ * **web:** add stacks to portfolio list ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
386
+ * **web:** add tooltip ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
387
+ * **web:** adjust hover events ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
388
+ * **web:** bitcoin balance for portfolio ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
389
+ * **web:** breakdown by allocation ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
390
+ * **web:** scaffold portfolio page ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
391
+ * **web:** sip10 avatar icons web ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
392
+ * **web:** sip10 balances and assets ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
393
+ * **web:** stacks portfolio balance ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
394
+
395
+
396
+ ### Bug Fixes
397
+
398
+ * **mobile:** ensure translations updated ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
399
+ * **mobile:** name is now defined for all models used ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
400
+ * responsive portfolio ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
401
+ * **web:** a few style fixes ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
402
+ * **web:** add loading spinner to asset list ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
403
+ * **web:** add loading state to bar ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
404
+ * **web:** ensure stacks renders in list ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
405
+ * **web:** improve hover events and styles ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
406
+ * **web:** invisible hover overlay ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
407
+ * **web:** layout as per designs ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
408
+ * **web:** remove unused ui ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
409
+ * **web:** remove unused var ([0e664a7](https://github.com/leather-io/mono/commit/0e664a7066a31776ac7e5ec60fa5a0ad893b96ff))
410
+
411
+
412
+ ### Dependencies
413
+
414
+ * The following workspace dependencies were updated
415
+ * dependencies
416
+ * @leather.io/constants bumped to 0.28.0
417
+ * @leather.io/models bumped to 0.49.0
418
+
371
419
  ## [0.48.3](https://github.com/leather-io/mono/compare/@leather.io/utils-v0.48.2...@leather.io/utils-v0.48.3) (2025-11-17)
372
420
 
373
421
 
package/dist/index.d.ts CHANGED
@@ -102,6 +102,11 @@ declare function isSameAssetId(assetId1: CryptoAssetId, assetId2: CryptoAssetId)
102
102
  declare function isSameAsset(asset1: CryptoAsset, asset2: CryptoAsset): boolean;
103
103
  declare function getAssetId(asset: CryptoAsset): CryptoAssetId;
104
104
  declare function createSip9AssetId(asset: Sip9Asset): CryptoAssetId;
105
+ declare function formatSip9IdField(asset: Sip9Asset): string;
106
+ declare function parseSip9IdField(id: string): {
107
+ assetId: string;
108
+ tokenId: number;
109
+ };
105
110
  type SerializedCryptoAssetId = `${string}|${string}`;
106
111
  declare function serializeAssetId(assetId: CryptoAssetId): SerializedCryptoAssetId;
107
112
  declare function deserializeAssetId(serializedAssetId: SerializedCryptoAssetId): CryptoAssetId;
@@ -206,6 +211,8 @@ interface FlattenedObject {
206
211
  */
207
212
  declare function flattenObject(input: ObjectValue, prefix?: string): FlattenedObject;
208
213
 
214
+ declare const minusSign = "\u2212";
215
+
209
216
  interface SpamFilterArgs {
210
217
  input: string;
211
218
  whitelist: string[];
@@ -284,4 +291,4 @@ declare function uniqueArray<T>(arr: T[]): T[];
284
291
  declare function removeTrailingNullCharacters(s: string): string;
285
292
  declare function isNumberOrNumberList(value: unknown): value is number | number[];
286
293
 
287
- export { type CreateInscriptionData, type FormatAmountOptions, type SerializedCryptoAssetId, aggregateBaseCryptoAssetBalances, aggregateBtcBalances, aggregateStxBalances, assertExistence, assertIsTruthy, assertUnreachable, baseCurrencyAmountInQuote, baseCurrencyAmountInQuoteWithFallback, btcToSat, calculateMeanAverage, capitalize, convertAmountToBaseUnit, convertAmountToFractionalUnit, convertToMoneyTypeWithDefaultOfZero, countDecimals, createAccountAddresses, createBaseCryptoAssetBalance, createBtcBalance, createCounter, createCurrencyFormatter, createInscriptionAsset, createMoney, createMoneyFromDecimal, createNullArrayOfLength, createNumArrayOfRange, createSip9AssetId, createStxBalance, dateToUnixTimestamp, daysInMs, daysInSec, defaultWalletKeyId, delay, deserializeAssetId, ensureArray, extractPhraseFromString, fibonacciGenerator, fiveMinInMs, flattenObject, getAssetDisplayName, getAssetId, getTicker, hasBitcoinAddress, hasStacksAddress, hexToNumber, hoursInMs, hoursInSec, increaseValueByOneMicroStx, initBigNumber, invertExchangeRate, isBigInt, isBoolean, isDefined, isEmpty, isEmptyArray, isEmptyString, isError, isEven, isFiatCurrencyCode, isFulfilled, isFunction, isHexString, isMoney, isMoneyGreaterThanZero, isNumber, isNumberOrNumberList, isObject, isRejected, isSameAsset, isSameAssetId, isString, isTypedArray, isUndefined, makeNumberRange, makeStacksTxExplorerLink, mapObject, matchesAssetId, maxMoney, microStxToStx, migratePositiveAssetBalancesToTop, minMoney, minutesInMs, minutesInSec, moneyToBaseUnit, noop, oneDayInMs, oneMinInMs, oneWeekInMs, propIfDefined, pxStringToNumber, quoteCurrencyAmountToBase, rebaseMarketData, removeTrailingNullCharacters, reverseBytes, safelyFormatHexTxid, sanitizeContent, satToBtc, scaleValue, secondsInMs, serializeAssetId, sortAssetsByName, spamFilter, stxToMicroStx, subtractMoney, sumMoney, sumNumbers, toHexString, truncateMiddle, undefinedIfLengthZero, uniqueArray, unitToFractionalUnit, weeksInMs, weeksInSec, whenInscriptionMimeType, whenNetwork };
294
+ export { type CreateInscriptionData, type FormatAmountOptions, type SerializedCryptoAssetId, aggregateBaseCryptoAssetBalances, aggregateBtcBalances, aggregateStxBalances, assertExistence, assertIsTruthy, assertUnreachable, baseCurrencyAmountInQuote, baseCurrencyAmountInQuoteWithFallback, btcToSat, calculateMeanAverage, capitalize, convertAmountToBaseUnit, convertAmountToFractionalUnit, convertToMoneyTypeWithDefaultOfZero, countDecimals, createAccountAddresses, createBaseCryptoAssetBalance, createBtcBalance, createCounter, createCurrencyFormatter, createInscriptionAsset, createMoney, createMoneyFromDecimal, createNullArrayOfLength, createNumArrayOfRange, createSip9AssetId, createStxBalance, dateToUnixTimestamp, daysInMs, daysInSec, defaultWalletKeyId, delay, deserializeAssetId, ensureArray, extractPhraseFromString, fibonacciGenerator, fiveMinInMs, flattenObject, formatSip9IdField, getAssetDisplayName, getAssetId, getTicker, hasBitcoinAddress, hasStacksAddress, hexToNumber, hoursInMs, hoursInSec, increaseValueByOneMicroStx, initBigNumber, invertExchangeRate, isBigInt, isBoolean, isDefined, isEmpty, isEmptyArray, isEmptyString, isError, isEven, isFiatCurrencyCode, isFulfilled, isFunction, isHexString, isMoney, isMoneyGreaterThanZero, isNumber, isNumberOrNumberList, isObject, isRejected, isSameAsset, isSameAssetId, isString, isTypedArray, isUndefined, makeNumberRange, makeStacksTxExplorerLink, mapObject, matchesAssetId, maxMoney, microStxToStx, migratePositiveAssetBalancesToTop, minMoney, minusSign, minutesInMs, minutesInSec, moneyToBaseUnit, noop, oneDayInMs, oneMinInMs, oneWeekInMs, parseSip9IdField, propIfDefined, pxStringToNumber, quoteCurrencyAmountToBase, rebaseMarketData, removeTrailingNullCharacters, reverseBytes, safelyFormatHexTxid, sanitizeContent, satToBtc, scaleValue, secondsInMs, serializeAssetId, sortAssetsByName, spamFilter, stxToMicroStx, subtractMoney, sumMoney, sumNumbers, toHexString, truncateMiddle, undefinedIfLengthZero, uniqueArray, unitToFractionalUnit, weeksInMs, weeksInSec, whenInscriptionMimeType, whenNetwork };
package/dist/index.js CHANGED
@@ -1598,16 +1598,11 @@ function createInscriptionAsset(data) {
1598
1598
 
1599
1599
  // src/assets/asset-id.ts
1600
1600
  import {
1601
- CryptoAssetProtocols as CryptoAssetProtocols2,
1602
- isSip9Asset
1601
+ CryptoAssetProtocols as CryptoAssetProtocols2
1603
1602
  } from "@leather.io/models";
1604
1603
  function matchesAssetId(asset, assetId) {
1605
- const protocol = getAssetId(asset).protocol;
1606
- const id = getAssetId(asset).id;
1607
- if (isSip9Asset(asset)) {
1608
- return protocol === assetId.protocol && assetId.id === asset.assetId && assetId.tokenId === asset.tokenId;
1609
- }
1610
- return protocol === assetId.protocol && id === assetId.id;
1604
+ const assetIdentifier = getAssetId(asset);
1605
+ return isSameAssetId(assetIdentifier, assetId);
1611
1606
  }
1612
1607
  function isSameAssetId(assetId1, assetId2) {
1613
1608
  return assetId1.protocol === assetId2.protocol && assetId1.id === assetId2.id;
@@ -1671,21 +1666,28 @@ function getAssetId(asset) {
1671
1666
  function createSip9AssetId(asset) {
1672
1667
  return {
1673
1668
  protocol: asset.protocol,
1674
- id: `${asset.assetId}|${asset.tokenId}`
1669
+ id: formatSip9IdField(asset)
1675
1670
  };
1676
1671
  }
1672
+ function formatSip9IdField(asset) {
1673
+ return `${asset.assetId}|${asset.tokenId}`;
1674
+ }
1675
+ function parseSip9IdField(id) {
1676
+ const [assetId, tokenId] = id.split("|");
1677
+ return { assetId, tokenId: Number(tokenId) };
1678
+ }
1677
1679
  function serializeAssetId(assetId) {
1678
1680
  return `${assetId.protocol}|${assetId.id}`;
1679
1681
  }
1680
1682
  function deserializeAssetId(serializedAssetId) {
1681
- const [protocol, id, tokenId] = serializedAssetId.split("|");
1683
+ const [protocol, ...idParts] = serializedAssetId.split("|");
1684
+ const id = idParts.join("|");
1682
1685
  if (!Object.keys(CryptoAssetProtocols2).includes(protocol)) {
1683
1686
  throw new Error(`Unrecognized Asset Protocol: ${protocol}`);
1684
1687
  }
1685
1688
  return {
1686
1689
  protocol,
1687
- id,
1688
- tokenId: tokenId ? parseInt(tokenId, 10) : void 0
1690
+ id
1689
1691
  };
1690
1692
  }
1691
1693
 
@@ -1996,6 +1998,9 @@ function flattenObject(input, prefix = "") {
1996
1998
  return result;
1997
1999
  }
1998
2000
 
2001
+ // src/special-char.ts
2002
+ var minusSign = "\u2212";
2003
+
1999
2004
  // src/spam-filter/tlds-list.ts
2000
2005
  var tlds = [
2001
2006
  "AAA",
@@ -3703,6 +3708,7 @@ export {
3703
3708
  fibonacciGenerator,
3704
3709
  fiveMinInMs,
3705
3710
  flattenObject,
3711
+ formatSip9IdField,
3706
3712
  getAssetDisplayName,
3707
3713
  getAssetId,
3708
3714
  getTicker,
@@ -3745,6 +3751,7 @@ export {
3745
3751
  microStxToStx,
3746
3752
  migratePositiveAssetBalancesToTop,
3747
3753
  minMoney,
3754
+ minusSign,
3748
3755
  minutesInMs,
3749
3756
  minutesInSec,
3750
3757
  moneyToBaseUnit,
@@ -3752,6 +3759,7 @@ export {
3752
3759
  oneDayInMs,
3753
3760
  oneMinInMs,
3754
3761
  oneWeekInMs,
3762
+ parseSip9IdField,
3755
3763
  propIfDefined,
3756
3764
  pxStringToNumber,
3757
3765
  quoteCurrencyAmountToBase,
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/create-money.ts","../src/money/is-money.ts","../src/fiat-metadata.ts","../src/money/is-fiat-currency-code.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/assets/asset-id.ts","../src/truncate-middle.ts","../src/market-data.ts","../src/currency-formatter/currency-formatter-presets.ts","../src/currency-formatter/currency-formatter.ts","../src/flatten-object.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/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 './assets/asset-id';\nexport * from './truncate-middle';\nexport * from './time';\nexport * from './market-data';\nexport * from './currency-formatter/currency-formatter';\nexport * from './flatten-object';\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 { 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 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 } from './create-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 ${quantity.amount.toString()} ${quantity.symbol} 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 quoteCurrencyAmountToBase(\n quantity: Money,\n { pair, price }: MarketData,\n decimals: number\n) {\n if (quantity.symbol !== pair.quote)\n throw new Error(\n `Cannot calculate value of ${quantity.amount.toString()} ${quantity.symbol} with market pair of ${formatMarketPair(\n pair\n )}`\n );\n\n const baseAmount = quantity.amount\n .dividedBy(price.amount)\n .shiftedBy(decimals)\n .integerValue(BigNumber.ROUND_FLOOR);\n\n return createMoney(baseAmount, pair.base, decimals);\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","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","export const FIAT_METADATA = [\n {\n name: 'US Dollar',\n symbol: '$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'USD',\n namePlural: 'US dollars',\n },\n {\n name: 'Canadian Dollar',\n symbol: 'CA$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'CAD',\n namePlural: 'Canadian dollars',\n },\n {\n name: 'Euro',\n symbol: '€',\n symbolNative: '€',\n decimalDigits: 2,\n rounding: 0,\n code: 'EUR',\n namePlural: 'euros',\n },\n {\n name: 'United Arab Emirates Dirham',\n symbol: 'AED',\n symbolNative: 'د.إ.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'AED',\n namePlural: 'UAE dirhams',\n },\n {\n name: 'Afghan Afghani',\n symbol: 'Af',\n symbolNative: '؋',\n decimalDigits: 0,\n rounding: 0,\n code: 'AFN',\n namePlural: 'Afghan Afghanis',\n },\n {\n name: 'Albanian Lek',\n symbol: 'ALL',\n symbolNative: 'Lek',\n decimalDigits: 0,\n rounding: 0,\n code: 'ALL',\n namePlural: 'Albanian lekë',\n },\n {\n name: 'Armenian Dram',\n symbol: 'AMD',\n symbolNative: 'դր.',\n decimalDigits: 0,\n rounding: 0,\n code: 'AMD',\n namePlural: 'Armenian drams',\n },\n {\n name: 'Argentine Peso',\n symbol: 'AR$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'ARS',\n namePlural: 'Argentine pesos',\n },\n {\n name: 'Australian Dollar',\n symbol: 'AU$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'AUD',\n namePlural: 'Australian dollars',\n },\n {\n name: 'Azerbaijani Manat',\n symbol: 'man.',\n symbolNative: 'ман.',\n decimalDigits: 2,\n rounding: 0,\n code: 'AZN',\n namePlural: 'Azerbaijani manats',\n },\n {\n name: 'Bosnia-Herzegovina Convertible Mark',\n symbol: 'KM',\n symbolNative: 'KM',\n decimalDigits: 2,\n rounding: 0,\n code: 'BAM',\n namePlural: 'Bosnia-Herzegovina convertible marks',\n },\n {\n name: 'Bangladeshi Taka',\n symbol: 'Tk',\n symbolNative: '৳',\n decimalDigits: 2,\n rounding: 0,\n code: 'BDT',\n namePlural: 'Bangladeshi takas',\n },\n {\n name: 'Bulgarian Lev',\n symbol: 'BGN',\n symbolNative: 'лв.',\n decimalDigits: 2,\n rounding: 0,\n code: 'BGN',\n namePlural: 'Bulgarian leva',\n },\n {\n name: 'Bahraini Dinar',\n symbol: 'BD',\n symbolNative: 'د.ب.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'BHD',\n namePlural: 'Bahraini dinars',\n },\n {\n name: 'Burundian Franc',\n symbol: 'FBu',\n symbolNative: 'FBu',\n decimalDigits: 0,\n rounding: 0,\n code: 'BIF',\n namePlural: 'Burundian francs',\n },\n {\n name: 'Brunei Dollar',\n symbol: 'BN$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'BND',\n namePlural: 'Brunei dollars',\n },\n {\n name: 'Bolivian Boliviano',\n symbol: 'Bs',\n symbolNative: 'Bs',\n decimalDigits: 2,\n rounding: 0,\n code: 'BOB',\n namePlural: 'Bolivian bolivianos',\n },\n {\n name: 'Brazilian Real',\n symbol: 'R$',\n symbolNative: 'R$',\n decimalDigits: 2,\n rounding: 0,\n code: 'BRL',\n namePlural: 'Brazilian reals',\n },\n {\n name: 'Botswanan Pula',\n symbol: 'BWP',\n symbolNative: 'P',\n decimalDigits: 2,\n rounding: 0,\n code: 'BWP',\n namePlural: 'Botswanan pulas',\n },\n {\n name: 'Belarusian Ruble',\n symbol: 'Br',\n symbolNative: 'руб.',\n decimalDigits: 2,\n rounding: 0,\n code: 'BYN',\n namePlural: 'Belarusian rubles',\n },\n {\n name: 'Belize Dollar',\n symbol: 'BZ$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'BZD',\n namePlural: 'Belize dollars',\n },\n {\n name: 'Congolese Franc',\n symbol: 'CDF',\n symbolNative: 'FrCD',\n decimalDigits: 2,\n rounding: 0,\n code: 'CDF',\n namePlural: 'Congolese francs',\n },\n {\n name: 'Swiss Franc',\n symbol: 'CHF',\n symbolNative: 'CHF',\n decimalDigits: 2,\n rounding: 0.05,\n code: 'CHF',\n namePlural: 'Swiss francs',\n },\n {\n name: 'Chilean Peso',\n symbol: 'CL$',\n symbolNative: '$',\n decimalDigits: 0,\n rounding: 0,\n code: 'CLP',\n namePlural: 'Chilean pesos',\n },\n {\n name: 'Chinese Yuan',\n symbol: 'CN¥',\n symbolNative: 'CN¥',\n decimalDigits: 2,\n rounding: 0,\n code: 'CNY',\n namePlural: 'Chinese yuan',\n },\n {\n name: 'Colombian Peso',\n symbol: 'CO$',\n symbolNative: '$',\n decimalDigits: 0,\n rounding: 0,\n code: 'COP',\n namePlural: 'Colombian pesos',\n },\n {\n name: 'Costa Rican Colón',\n symbol: '₡',\n symbolNative: '₡',\n decimalDigits: 0,\n rounding: 0,\n code: 'CRC',\n namePlural: 'Costa Rican colóns',\n },\n {\n name: 'Cape Verdean Escudo',\n symbol: 'CV$',\n symbolNative: 'CV$',\n decimalDigits: 2,\n rounding: 0,\n code: 'CVE',\n namePlural: 'Cape Verdean escudos',\n },\n {\n name: 'Czech Republic Koruna',\n symbol: 'Kč',\n symbolNative: 'Kč',\n decimalDigits: 2,\n rounding: 0,\n code: 'CZK',\n namePlural: 'Czech Republic korunas',\n },\n {\n name: 'Djiboutian Franc',\n symbol: 'Fdj',\n symbolNative: 'Fdj',\n decimalDigits: 0,\n rounding: 0,\n code: 'DJF',\n namePlural: 'Djiboutian francs',\n },\n {\n name: 'Danish Krone',\n symbol: 'Dkr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'DKK',\n namePlural: 'Danish kroner',\n },\n {\n name: 'Dominican Peso',\n symbol: 'RD$',\n symbolNative: 'RD$',\n decimalDigits: 2,\n rounding: 0,\n code: 'DOP',\n namePlural: 'Dominican pesos',\n },\n {\n name: 'Algerian Dinar',\n symbol: 'DA',\n symbolNative: 'د.ج.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'DZD',\n namePlural: 'Algerian dinars',\n },\n {\n name: 'Estonian Kroon',\n symbol: 'Ekr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'EEK',\n namePlural: 'Estonian kroons',\n },\n {\n name: 'Egyptian Pound',\n symbol: 'EGP',\n symbolNative: 'ج.م.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'EGP',\n namePlural: 'Egyptian pounds',\n },\n {\n name: 'Eritrean Nakfa',\n symbol: 'Nfk',\n symbolNative: 'Nfk',\n decimalDigits: 2,\n rounding: 0,\n code: 'ERN',\n namePlural: 'Eritrean nakfas',\n },\n {\n name: 'Ethiopian Birr',\n symbol: 'Br',\n symbolNative: 'Br',\n decimalDigits: 2,\n rounding: 0,\n code: 'ETB',\n namePlural: 'Ethiopian birrs',\n },\n {\n name: 'British Pound Sterling',\n symbol: '£',\n symbolNative: '£',\n decimalDigits: 2,\n rounding: 0,\n code: 'GBP',\n namePlural: 'British pounds sterling',\n },\n {\n name: 'Georgian Lari',\n symbol: 'GEL',\n symbolNative: 'GEL',\n decimalDigits: 2,\n rounding: 0,\n code: 'GEL',\n namePlural: 'Georgian laris',\n },\n {\n name: 'Ghanaian Cedi',\n symbol: 'GH₵',\n symbolNative: 'GH₵',\n decimalDigits: 2,\n rounding: 0,\n code: 'GHS',\n namePlural: 'Ghanaian cedis',\n },\n {\n name: 'Guinean Franc',\n symbol: 'FG',\n symbolNative: 'FG',\n decimalDigits: 0,\n rounding: 0,\n code: 'GNF',\n namePlural: 'Guinean francs',\n },\n {\n name: 'Guatemalan Quetzal',\n symbol: 'GTQ',\n symbolNative: 'Q',\n decimalDigits: 2,\n rounding: 0,\n code: 'GTQ',\n namePlural: 'Guatemalan quetzals',\n },\n {\n name: 'Hong Kong Dollar',\n symbol: 'HK$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'HKD',\n namePlural: 'Hong Kong dollars',\n },\n {\n name: 'Honduran Lempira',\n symbol: 'HNL',\n symbolNative: 'L',\n decimalDigits: 2,\n rounding: 0,\n code: 'HNL',\n namePlural: 'Honduran lempiras',\n },\n {\n name: 'Croatian Kuna',\n symbol: 'kn',\n symbolNative: 'kn',\n decimalDigits: 2,\n rounding: 0,\n code: 'HRK',\n namePlural: 'Croatian kunas',\n },\n {\n name: 'Hungarian Forint',\n symbol: 'Ft',\n symbolNative: 'Ft',\n decimalDigits: 0,\n rounding: 0,\n code: 'HUF',\n namePlural: 'Hungarian forints',\n },\n {\n name: 'Indonesian Rupiah',\n symbol: 'Rp',\n symbolNative: 'Rp',\n decimalDigits: 0,\n rounding: 0,\n code: 'IDR',\n namePlural: 'Indonesian rupiahs',\n },\n {\n name: 'Israeli New Sheqel',\n symbol: '₪',\n symbolNative: '₪',\n decimalDigits: 2,\n rounding: 0,\n code: 'ILS',\n namePlural: 'Israeli new sheqels',\n },\n {\n name: 'Indian Rupee',\n symbol: '₹',\n symbolNative: 'টকা',\n decimalDigits: 2,\n rounding: 0,\n code: 'INR',\n namePlural: 'Indian rupees',\n },\n {\n name: 'Iraqi Dinar',\n symbol: 'IQD',\n symbolNative: 'د.ع.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'IQD',\n namePlural: 'Iraqi dinars',\n },\n {\n name: 'Iranian Rial',\n symbol: 'IRR',\n symbolNative: '﷼',\n decimalDigits: 0,\n rounding: 0,\n code: 'IRR',\n namePlural: 'Iranian rials',\n },\n {\n name: 'Icelandic Króna',\n symbol: 'Ikr',\n symbolNative: 'kr',\n decimalDigits: 0,\n rounding: 0,\n code: 'ISK',\n namePlural: 'Icelandic krónur',\n },\n {\n name: 'Jamaican Dollar',\n symbol: 'J$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'JMD',\n namePlural: 'Jamaican dollars',\n },\n {\n name: 'Jordanian Dinar',\n symbol: 'JD',\n symbolNative: 'د.أ.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'JOD',\n namePlural: 'Jordanian dinars',\n },\n {\n name: 'Japanese Yen',\n symbol: '¥',\n symbolNative: '¥',\n decimalDigits: 0,\n rounding: 0,\n code: 'JPY',\n namePlural: 'Japanese yen',\n },\n {\n name: 'Kenyan Shilling',\n symbol: 'Ksh',\n symbolNative: 'Ksh',\n decimalDigits: 2,\n rounding: 0,\n code: 'KES',\n namePlural: 'Kenyan shillings',\n },\n {\n name: 'Cambodian Riel',\n symbol: 'KHR',\n symbolNative: '៛',\n decimalDigits: 2,\n rounding: 0,\n code: 'KHR',\n namePlural: 'Cambodian riels',\n },\n {\n name: 'Comorian Franc',\n symbol: 'CF',\n symbolNative: 'FC',\n decimalDigits: 0,\n rounding: 0,\n code: 'KMF',\n namePlural: 'Comorian francs',\n },\n {\n name: 'South Korean Won',\n symbol: '₩',\n symbolNative: '₩',\n decimalDigits: 0,\n rounding: 0,\n code: 'KRW',\n namePlural: 'South Korean won',\n },\n {\n name: 'Kuwaiti Dinar',\n symbol: 'KD',\n symbolNative: 'د.ك.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'KWD',\n namePlural: 'Kuwaiti dinars',\n },\n {\n name: 'Kazakhstani Tenge',\n symbol: 'KZT',\n symbolNative: 'тңг.',\n decimalDigits: 2,\n rounding: 0,\n code: 'KZT',\n namePlural: 'Kazakhstani tenges',\n },\n {\n name: 'Lebanese Pound',\n symbol: 'LB£',\n symbolNative: 'ل.ل.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'LBP',\n namePlural: 'Lebanese pounds',\n },\n {\n name: 'Sri Lankan Rupee',\n symbol: 'SLRs',\n symbolNative: 'SL Re',\n decimalDigits: 2,\n rounding: 0,\n code: 'LKR',\n namePlural: 'Sri Lankan rupees',\n },\n {\n name: 'Lithuanian Litas',\n symbol: 'Lt',\n symbolNative: 'Lt',\n decimalDigits: 2,\n rounding: 0,\n code: 'LTL',\n namePlural: 'Lithuanian litai',\n },\n {\n name: 'Latvian Lats',\n symbol: 'Ls',\n symbolNative: 'Ls',\n decimalDigits: 2,\n rounding: 0,\n code: 'LVL',\n namePlural: 'Latvian lati',\n },\n {\n name: 'Libyan Dinar',\n symbol: 'LD',\n symbolNative: 'د.ل.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'LYD',\n namePlural: 'Libyan dinars',\n },\n {\n name: 'Moroccan Dirham',\n symbol: 'MAD',\n symbolNative: 'د.م.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'MAD',\n namePlural: 'Moroccan dirhams',\n },\n {\n name: 'Moldovan Leu',\n symbol: 'MDL',\n symbolNative: 'MDL',\n decimalDigits: 2,\n rounding: 0,\n code: 'MDL',\n namePlural: 'Moldovan lei',\n },\n {\n name: 'Malagasy Ariary',\n symbol: 'MGA',\n symbolNative: 'MGA',\n decimalDigits: 0,\n rounding: 0,\n code: 'MGA',\n namePlural: 'Malagasy Ariaries',\n },\n {\n name: 'Macedonian Denar',\n symbol: 'MKD',\n symbolNative: 'MKD',\n decimalDigits: 2,\n rounding: 0,\n code: 'MKD',\n namePlural: 'Macedonian denari',\n },\n {\n name: 'Myanma Kyat',\n symbol: 'MMK',\n symbolNative: 'K',\n decimalDigits: 0,\n rounding: 0,\n code: 'MMK',\n namePlural: 'Myanma kyats',\n },\n {\n name: 'Macanese Pataca',\n symbol: 'MOP$',\n symbolNative: 'MOP$',\n decimalDigits: 2,\n rounding: 0,\n code: 'MOP',\n namePlural: 'Macanese patacas',\n },\n {\n name: 'Mauritian Rupee',\n symbol: 'MURs',\n symbolNative: 'MURs',\n decimalDigits: 0,\n rounding: 0,\n code: 'MUR',\n namePlural: 'Mauritian rupees',\n },\n {\n name: 'Mexican Peso',\n symbol: 'MX$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'MXN',\n namePlural: 'Mexican pesos',\n },\n {\n name: 'Malaysian Ringgit',\n symbol: 'RM',\n symbolNative: 'RM',\n decimalDigits: 2,\n rounding: 0,\n code: 'MYR',\n namePlural: 'Malaysian ringgits',\n },\n {\n name: 'Mozambican Metical',\n symbol: 'MTn',\n symbolNative: 'MTn',\n decimalDigits: 2,\n rounding: 0,\n code: 'MZN',\n namePlural: 'Mozambican meticals',\n },\n {\n name: 'Namibian Dollar',\n symbol: 'N$',\n symbolNative: 'N$',\n decimalDigits: 2,\n rounding: 0,\n code: 'NAD',\n namePlural: 'Namibian dollars',\n },\n {\n name: 'Nigerian Naira',\n symbol: '₦',\n symbolNative: '₦',\n decimalDigits: 2,\n rounding: 0,\n code: 'NGN',\n namePlural: 'Nigerian nairas',\n },\n {\n name: 'Nicaraguan Córdoba',\n symbol: 'C$',\n symbolNative: 'C$',\n decimalDigits: 2,\n rounding: 0,\n code: 'NIO',\n namePlural: 'Nicaraguan córdobas',\n },\n {\n name: 'Norwegian Krone',\n symbol: 'Nkr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'NOK',\n namePlural: 'Norwegian kroner',\n },\n {\n name: 'Nepalese Rupee',\n symbol: 'NPRs',\n symbolNative: 'नेरू',\n decimalDigits: 2,\n rounding: 0,\n code: 'NPR',\n namePlural: 'Nepalese rupees',\n },\n {\n name: 'New Zealand Dollar',\n symbol: 'NZ$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'NZD',\n namePlural: 'New Zealand dollars',\n },\n {\n name: 'Omani Rial',\n symbol: 'OMR',\n symbolNative: 'ر.ع.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'OMR',\n namePlural: 'Omani rials',\n },\n {\n name: 'Panamanian Balboa',\n symbol: 'B/.',\n symbolNative: 'B/.',\n decimalDigits: 2,\n rounding: 0,\n code: 'PAB',\n namePlural: 'Panamanian balboas',\n },\n {\n name: 'Peruvian Nuevo Sol',\n symbol: 'S/.',\n symbolNative: 'S/.',\n decimalDigits: 2,\n rounding: 0,\n code: 'PEN',\n namePlural: 'Peruvian nuevos soles',\n },\n {\n name: 'Philippine Peso',\n symbol: '₱',\n symbolNative: '₱',\n decimalDigits: 2,\n rounding: 0,\n code: 'PHP',\n namePlural: 'Philippine pesos',\n },\n {\n name: 'Pakistani Rupee',\n symbol: 'PKRs',\n symbolNative: '₨',\n decimalDigits: 0,\n rounding: 0,\n code: 'PKR',\n namePlural: 'Pakistani rupees',\n },\n {\n name: 'Polish Zloty',\n symbol: 'zł',\n symbolNative: 'zł',\n decimalDigits: 2,\n rounding: 0,\n code: 'PLN',\n namePlural: 'Polish zlotys',\n },\n {\n name: 'Paraguayan Guarani',\n symbol: '₲',\n symbolNative: '₲',\n decimalDigits: 0,\n rounding: 0,\n code: 'PYG',\n namePlural: 'Paraguayan guaranis',\n },\n {\n name: 'Qatari Rial',\n symbol: 'QR',\n symbolNative: 'ر.ق.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'QAR',\n namePlural: 'Qatari rials',\n },\n {\n name: 'Romanian Leu',\n symbol: 'RON',\n symbolNative: 'RON',\n decimalDigits: 2,\n rounding: 0,\n code: 'RON',\n namePlural: 'Romanian lei',\n },\n {\n name: 'Serbian Dinar',\n symbol: 'din.',\n symbolNative: 'дин.',\n decimalDigits: 0,\n rounding: 0,\n code: 'RSD',\n namePlural: 'Serbian dinars',\n },\n {\n name: 'Russian Ruble',\n symbol: 'RUB',\n symbolNative: '₽.',\n decimalDigits: 2,\n rounding: 0,\n code: 'RUB',\n namePlural: 'Russian rubles',\n },\n {\n name: 'Rwandan Franc',\n symbol: 'RWF',\n symbolNative: 'FR',\n decimalDigits: 0,\n rounding: 0,\n code: 'RWF',\n namePlural: 'Rwandan francs',\n },\n {\n name: 'Saudi Riyal',\n symbol: 'SR',\n symbolNative: 'ر.س.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'SAR',\n namePlural: 'Saudi riyals',\n },\n {\n name: 'Sudanese Pound',\n symbol: 'SDG',\n symbolNative: 'SDG',\n decimalDigits: 2,\n rounding: 0,\n code: 'SDG',\n namePlural: 'Sudanese pounds',\n },\n {\n name: 'Swedish Krona',\n symbol: 'Skr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'SEK',\n namePlural: 'Swedish kronor',\n },\n {\n name: 'Singapore Dollar',\n symbol: 'S$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'SGD',\n namePlural: 'Singapore dollars',\n },\n {\n name: 'Somali Shilling',\n symbol: 'Ssh',\n symbolNative: 'Ssh',\n decimalDigits: 0,\n rounding: 0,\n code: 'SOS',\n namePlural: 'Somali shillings',\n },\n {\n name: 'Syrian Pound',\n symbol: 'SY£',\n symbolNative: 'ل.س.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'SYP',\n namePlural: 'Syrian pounds',\n },\n {\n name: 'Thai Baht',\n symbol: '฿',\n symbolNative: '฿',\n decimalDigits: 2,\n rounding: 0,\n code: 'THB',\n namePlural: 'Thai baht',\n },\n {\n name: 'Tunisian Dinar',\n symbol: 'DT',\n symbolNative: 'د.ت.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'TND',\n namePlural: 'Tunisian dinars',\n },\n {\n name: 'Tongan Paʻanga',\n symbol: 'T$',\n symbolNative: 'T$',\n decimalDigits: 2,\n rounding: 0,\n code: 'TOP',\n namePlural: 'Tongan paʻanga',\n },\n {\n name: 'Turkish Lira',\n symbol: 'TL',\n symbolNative: 'TL',\n decimalDigits: 2,\n rounding: 0,\n code: 'TRY',\n namePlural: 'Turkish Lira',\n },\n {\n name: 'Trinidad and Tobago Dollar',\n symbol: 'TT$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'TTD',\n namePlural: 'Trinidad and Tobago dollars',\n },\n {\n name: 'New Taiwan Dollar',\n symbol: 'NT$',\n symbolNative: 'NT$',\n decimalDigits: 2,\n rounding: 0,\n code: 'TWD',\n namePlural: 'New Taiwan dollars',\n },\n {\n name: 'Tanzanian Shilling',\n symbol: 'TSh',\n symbolNative: 'TSh',\n decimalDigits: 0,\n rounding: 0,\n code: 'TZS',\n namePlural: 'Tanzanian shillings',\n },\n {\n name: 'Ukrainian Hryvnia',\n symbol: '₴',\n symbolNative: '₴',\n decimalDigits: 2,\n rounding: 0,\n code: 'UAH',\n namePlural: 'Ukrainian hryvnias',\n },\n {\n name: 'Ugandan Shilling',\n symbol: 'USh',\n symbolNative: 'USh',\n decimalDigits: 0,\n rounding: 0,\n code: 'UGX',\n namePlural: 'Ugandan shillings',\n },\n {\n name: 'Uruguayan Peso',\n symbol: '$U',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'UYU',\n namePlural: 'Uruguayan pesos',\n },\n {\n name: 'Uzbekistan Som',\n symbol: 'UZS',\n symbolNative: 'UZS',\n decimalDigits: 0,\n rounding: 0,\n code: 'UZS',\n namePlural: 'Uzbekistan som',\n },\n {\n name: 'Venezuelan Bolívar',\n symbol: 'Bs.F.',\n symbolNative: 'Bs.F.',\n decimalDigits: 2,\n rounding: 0,\n code: 'VEF',\n namePlural: 'Venezuelan bolívars',\n },\n {\n name: 'Vietnamese Dong',\n symbol: '₫',\n symbolNative: '₫',\n decimalDigits: 0,\n rounding: 0,\n code: 'VND',\n namePlural: 'Vietnamese dong',\n },\n {\n name: 'CFA Franc BEAC',\n symbol: 'FCFA',\n symbolNative: 'FCFA',\n decimalDigits: 0,\n rounding: 0,\n code: 'XAF',\n namePlural: 'CFA francs BEAC',\n },\n {\n name: 'CFA Franc BCEAO',\n symbol: 'CFA',\n symbolNative: 'CFA',\n decimalDigits: 0,\n rounding: 0,\n code: 'XOF',\n namePlural: 'CFA francs BCEAO',\n },\n {\n name: 'Yemeni Rial',\n symbol: 'YR',\n symbolNative: 'ر.ي.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'YER',\n namePlural: 'Yemeni rials',\n },\n {\n name: 'South African Rand',\n symbol: 'R',\n symbolNative: 'R',\n decimalDigits: 2,\n rounding: 0,\n code: 'ZAR',\n namePlural: 'South African rand',\n },\n {\n name: 'Zambian Kwacha',\n symbol: 'ZK',\n symbolNative: 'ZK',\n decimalDigits: 0,\n rounding: 0,\n code: 'ZMK',\n namePlural: 'Zambian kwachas',\n },\n {\n name: 'Zimbabwean Dollar',\n symbol: 'ZWL$',\n symbolNative: 'ZWL$',\n decimalDigits: 0,\n rounding: 0,\n code: 'ZWL',\n namePlural: 'Zimbabwean Dollar',\n },\n];\n","import { FIAT_METADATA } from '../fiat-metadata';\n\nconst fiatCurrencyCodeList = new Set(FIAT_METADATA.map(currency => currency.code));\n\nexport function isFiatCurrencyCode(code: string) {\n return fiatCurrencyCodeList.has(code);\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 { CryptoAsset } from '@leather.io/models';\n\nimport { assertUnreachable } from '../index';\n\nexport function getAssetDisplayName(asset: CryptoAsset) {\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 { BaseCryptoAssetBalance, BtcBalance, Money, StxBalance } 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 createBtcBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n protectedBal?: Money,\n dustBal?: Money,\n unspendableBal?: Money\n): BtcBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n const protectedBalance = protectedBal ?? zeroBalance;\n const dustBalance = dustBal ?? zeroBalance;\n const unspendableBalance = unspendableBal ?? zeroBalance;\n const baseBalance = createBaseCryptoAssetBalance(totalBalance, inboundBalance, outboundBalance);\n return {\n ...baseBalance,\n protectedBalance,\n dustBalance,\n availableBalance: subtractMoney(totalBalance, unspendableBalance),\n unspendableBalance,\n };\n}\n\nexport function createStxBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n lockedBal?: Money\n): StxBalance {\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 aggregateBtcBalances(balances: BtcBalance[]): BtcBalance {\n return createBtcBalance(\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.dustBalance)),\n sumMoney(balances.map(b => b.unspendableBalance))\n );\n}\n\nexport function aggregateStxBalances(balances: StxBalance[]): StxBalance {\n return createStxBalance(\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 { ORD_IO_URL } from '@leather.io/constants';\nimport {\n CryptoAssetCategories,\n CryptoAssetChains,\n CryptoAssetProtocols,\n InscriptionAsset,\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 readonly thumbnailSrc?: string;\n}\n\nexport function createInscriptionAsset(data: CreateInscriptionData): InscriptionAsset {\n const ordinalPreviewSrc = `https://ordinals.com/preview/${data.id}`;\n const ordIoSrc = `${ORD_IO_URL}/content/${data.id}`;\n const thumbnailSrc = data.thumbnailSrc ?? ordinalPreviewSrc;\n const primarySrc = data.contentSrc || ordinalPreviewSrc;\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 thumbnailSrc,\n };\n\n if (!data.mimeType) {\n return {\n ...sharedInfo,\n mimeType: 'other',\n src: '',\n };\n }\n\n return whenInscriptionMimeType<InscriptionAsset>(data.mimeType, {\n audio: () => ({\n ...sharedInfo,\n mimeType: 'audio',\n name: 'inscription',\n src: primarySrc,\n }),\n gltf: () => ({\n ...sharedInfo,\n mimeType: 'gltf',\n name: 'inscription',\n src: primarySrc,\n }),\n html: () => ({\n ...sharedInfo,\n mimeType: 'html',\n name: 'inscription',\n thumbnailSrc: ordIoSrc,\n src: primarySrc,\n }),\n image: () => ({\n ...sharedInfo,\n mimeType: 'image',\n name: 'inscription',\n thumbnailSrc: ordIoSrc,\n src: primarySrc,\n }),\n svg: () => ({\n ...sharedInfo,\n mimeType: 'svg',\n name: 'inscription',\n src: primarySrc,\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: primarySrc,\n }),\n other: () => ({\n ...sharedInfo,\n mimeType: 'other',\n name: 'inscription',\n src: data.contentSrc ?? '',\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","import {\n CryptoAsset,\n CryptoAssetId,\n CryptoAssetProtocol,\n CryptoAssetProtocols,\n Sip9Asset,\n isSip9Asset,\n} from '@leather.io/models';\n\nimport { assertUnreachable } from '../index';\n\nexport function matchesAssetId(asset: CryptoAsset, assetId: CryptoAssetId) {\n const protocol = getAssetId(asset).protocol;\n const id = getAssetId(asset).id;\n if (isSip9Asset(asset)) {\n return (\n protocol === assetId.protocol &&\n assetId.id === asset.assetId &&\n assetId.tokenId === asset.tokenId\n );\n }\n return protocol === assetId.protocol && id === assetId.id;\n}\n\nexport function isSameAssetId(assetId1: CryptoAssetId, assetId2: CryptoAssetId) {\n return assetId1.protocol === assetId2.protocol && assetId1.id === assetId2.id;\n}\n\nexport function isSameAsset(asset1: CryptoAsset, asset2: CryptoAsset) {\n return isSameAssetId(getAssetId(asset1), getAssetId(asset2));\n}\n\nexport function getAssetId(asset: CryptoAsset): CryptoAssetId {\n switch (asset.protocol) {\n case 'nativeBtc':\n return {\n protocol: 'nativeBtc',\n id: asset.symbol,\n };\n case 'nativeStx':\n return {\n protocol: 'nativeStx',\n id: asset.symbol,\n };\n case 'sip10':\n return {\n protocol: 'sip10',\n id: asset.assetId,\n };\n case 'rune':\n return {\n protocol: 'rune',\n id: asset.runeName,\n };\n case 'brc20':\n return {\n protocol: 'brc20',\n id: asset.symbol,\n };\n case 'src20':\n return {\n protocol: 'src20',\n id: asset.id,\n };\n case 'stx20':\n return {\n protocol: 'stx20',\n id: asset.symbol,\n };\n case 'inscription':\n return {\n protocol: 'inscription',\n id: asset.id,\n };\n case 'stamp':\n return {\n protocol: 'stamp',\n id: asset.stamp.toString(),\n };\n case 'sip9':\n return createSip9AssetId(asset);\n default:\n assertUnreachable(asset);\n }\n}\n\nexport function createSip9AssetId(asset: Sip9Asset): CryptoAssetId {\n return {\n protocol: asset.protocol,\n id: `${asset.assetId}|${asset.tokenId}`,\n };\n}\n\nexport type SerializedCryptoAssetId = `${string}|${string}`;\n\nexport function serializeAssetId(assetId: CryptoAssetId): SerializedCryptoAssetId {\n return `${assetId.protocol}|${assetId.id}`;\n}\n\nexport function deserializeAssetId(serializedAssetId: SerializedCryptoAssetId): CryptoAssetId {\n const [protocol, id, tokenId] = serializedAssetId.split('|');\n if (!Object.keys(CryptoAssetProtocols).includes(protocol)) {\n throw new Error(`Unrecognized Asset Protocol: ${protocol}`);\n }\n\n return {\n protocol: protocol as CryptoAssetProtocol,\n id,\n tokenId: tokenId ? parseInt(tokenId, 10) : undefined,\n };\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","import { BigNumber } from 'bignumber.js';\n\nimport { currencyDecimalsMap, currencyNameMap } from '@leather.io/constants';\nimport { type MarketData, createMarketData, createMarketPair } from '@leather.io/models';\n\nimport { convertAmountToBaseUnit, convertAmountToFractionalUnit } from './money/calculate-money';\nimport { createMoney } from './money/create-money';\n\n/**\n * Rebases MarketData to a different quote currency using exchange rate.\n *\n * @param marketData - e.g. STX/USD\n * @param exchangeRate - e.g. EUR/USD (EUR is target quote currency)\n * @returns e.g. STX/EUR\n */\nexport function rebaseMarketData(marketData: MarketData, exchangeRate: MarketData): MarketData {\n if (exchangeRate.pair.quote !== marketData.pair.quote) {\n throw new Error(\n `Exchange rate quote currency (${exchangeRate.pair.quote}) must match original quote currency (${marketData.pair.quote})`\n );\n }\n\n const targetQuoteCurrency = exchangeRate.pair.base;\n if (!(targetQuoteCurrency in currencyNameMap)) {\n throw new Error(`Target currency must be a supported quote currency: ${targetQuoteCurrency}`);\n }\n\n const rebasedPrice = createMoney(\n convertAmountToFractionalUnit(\n marketData.price.amount.dividedBy(exchangeRate.price.amount),\n currencyDecimalsMap[targetQuoteCurrency]\n ),\n targetQuoteCurrency\n );\n\n return createMarketData(\n createMarketPair(marketData.pair.base, targetQuoteCurrency),\n rebasedPrice\n );\n}\n\n/**\n * Inverts exchange rate market data by swapping base/quote currencies (e.g. USD/EUR -> EUR/USD)\n */\nexport function invertExchangeRate(exchangeRate: MarketData): MarketData {\n if (!(exchangeRate.pair.base in currencyNameMap)) {\n throw new Error(`Base currency must be a supported quote currency: ${exchangeRate.pair.base}`);\n }\n\n const invertedPrice = createMoney(\n convertAmountToFractionalUnit(\n new BigNumber(1).dividedBy(convertAmountToBaseUnit(exchangeRate.price)),\n currencyDecimalsMap[exchangeRate.pair.base]\n ),\n exchangeRate.pair.base\n );\n\n return createMarketData(\n createMarketPair(exchangeRate.pair.quote, exchangeRate.pair.base),\n invertedPrice\n );\n}\n","import { isFiatCurrencyCode } from '../money';\nimport {\n CurrencyFormatterPreset,\n CurrencyFormatterPresetResult,\n CurrencyFormatterPresetValue,\n} from './currency-formatter.types';\n\nexport const currencyFormatterPresets: Record<\n CurrencyFormatterPreset,\n CurrencyFormatterPresetValue\n> = {\n price: input => {\n const options: CurrencyFormatterPresetResult = {\n compactThreshold: Infinity,\n approximateDust: false,\n showCurrency: true,\n numberFormatOptions: {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n } as const;\n\n if (input.amount >= 0 && input.amount <= 99) {\n options.numberFormatOptions = {\n minimumFractionDigits: 2,\n maximumFractionDigits: 6,\n };\n }\n\n return options;\n },\n 'shorthand-balance': input => {\n function getMaximumFractionDigits() {\n if (isFiatCurrencyCode(input.currencyCode)) {\n return 2;\n }\n\n return input.amount < 0.001 ? input.decimals : 4;\n }\n\n return {\n showCurrency: isFiatCurrencyCode(input.currencyCode),\n numberFormatOptions: {\n minimumFractionDigits: 2,\n maximumFractionDigits: getMaximumFractionDigits(),\n },\n };\n },\n 'pad-decimals': input => ({\n compactThreshold: Infinity,\n numberFormatOptions: {\n minimumFractionDigits: input.decimals,\n maximumFractionDigits: input.decimals,\n },\n }),\n};\n","import { isFiatCurrencyCode } from '../money';\nimport { currencyFormatterPresets } from './currency-formatter-presets';\nimport {\n CurrencyFormatterPreset,\n FormatAmountCustomOptions,\n FormatAmountInput,\n FormatAmountOptions,\n} from './currency-formatter.types';\n\ninterface CreateCurrencyFormatterParams {\n locale: string;\n onError?: (\n error: unknown,\n context: { locale: string; options: Intl.NumberFormatOptions }\n ) => void;\n}\n\nconst fallback = '';\nconst defaultCompactThreshold = 1_000_000;\nconst thinSpace = '\\u2009';\nconst defaultCustomOptions = {\n compactThreshold: defaultCompactThreshold,\n showCurrency: true,\n approximateDust: true,\n};\n\nexport function createCurrencyFormatter({ locale, onError }: CreateCurrencyFormatterParams) {\n function safeInitializeNumberFormat(locale: string, options: Intl.NumberFormatOptions) {\n try {\n return new Intl.NumberFormat(locale, options);\n } catch (e) {\n onError?.(e, { locale, options });\n return null;\n }\n }\n\n function formatAmount(input: FormatAmountInput, options: FormatAmountOptions = {}) {\n return formatAmountWithMeta(input, options).result;\n }\n\n function formatAmountWithMeta(input: FormatAmountInput, options: FormatAmountOptions = {}) {\n const { amount, currencyCode, decimals } = input;\n const { preset, numberFormatOptions = {}, ...customOptions } = options;\n const { numberFormatOptions: presetNumberFormatOptions = {}, ...presetCustomOptions } =\n getPresetResult(preset, input);\n const { compactThreshold, showCurrency, approximateDust } = mergeCustomOptions(\n presetCustomOptions,\n customOptions\n );\n const shouldCompact = evaluateCompactNotation(compactThreshold, amount);\n const isFiatCurrency = isFiatCurrencyCode(currencyCode);\n const isDust = isFiatCurrency && isSmallerThanMinorUnit(amount, decimals);\n const { minimumFractionDigits, maximumFractionDigits } = deriveFractionOptions(\n amount,\n decimals,\n shouldCompact,\n presetNumberFormatOptions,\n numberFormatOptions\n );\n const formatterOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits,\n maximumFractionDigits,\n ...(shouldCompact && { notation: 'compact' }),\n ...omitFractionOptions(presetNumberFormatOptions),\n ...omitFractionOptions(numberFormatOptions),\n };\n\n if (isFiatCurrency && showCurrency) {\n formatterOptions.style = 'currency';\n formatterOptions.currency = currencyCode;\n } else {\n formatterOptions.style = 'decimal';\n }\n\n const formatter = safeInitializeNumberFormat(locale, formatterOptions);\n\n if (!formatter)\n return {\n valid: false,\n result: fallback,\n parts: [],\n resolvedOptions: {},\n };\n\n let result: string;\n\n if (isDust && approximateDust) {\n const smallestUnit = getSmallestUnit(decimals);\n const multiplier = amount < 0 ? -1 : 1;\n result = `<${thinSpace}${formatter.format(smallestUnit * multiplier)}`;\n } else {\n result = formatter.format(amount);\n }\n\n if (!isFiatCurrency && showCurrency) {\n result += `\\u00A0${currencyCode}`;\n }\n\n return {\n valid: true,\n result,\n parts: buildParts({\n formatter,\n amount,\n isDust,\n approximateDust,\n decimals,\n currencyCode,\n isFiatCurrency,\n showCurrency,\n }),\n resolvedOptions: formatter.resolvedOptions(),\n };\n }\n\n function formatPercentage(amount: number, decimals = 2) {\n const formatter = safeInitializeNumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n\n if (!formatter) return fallback;\n\n return formatter.format(amount);\n }\n\n return {\n formatAmount,\n formatAmountWithMeta,\n formatPercentage,\n };\n}\n\nexport { type FormatAmountOptions };\n\n// -----------------------------------------------------------------------------\n//\n// Helpers\n//\n// -----------------------------------------------------------------------------\n// Amend NumberFormat's formatToParts with crypto and approximate dust display\nfunction buildParts({\n formatter,\n amount,\n isDust,\n approximateDust,\n decimals,\n currencyCode,\n isFiatCurrency,\n showCurrency,\n}: {\n formatter: Intl.NumberFormat;\n amount: number;\n isDust: boolean;\n approximateDust: boolean;\n decimals: number;\n currencyCode: string;\n isFiatCurrency: boolean;\n showCurrency: boolean;\n}): Intl.NumberFormatPart[] {\n if (typeof formatter.formatToParts !== 'function') return [];\n\n const baseAmount =\n isDust && approximateDust ? getSmallestUnit(decimals) * (amount < 0 ? -1 : 1) : amount;\n\n const parts = formatter.formatToParts(baseAmount);\n\n if (isDust && approximateDust) {\n parts.unshift({ type: 'unknown', value: '<' }, { type: 'literal', value: thinSpace });\n }\n\n if (!isFiatCurrency && showCurrency) {\n parts.push({ type: 'literal', value: '\\u00A0' }, { type: 'currency', value: currencyCode });\n }\n\n return parts;\n}\n\nfunction getPresetResult(preset: CurrencyFormatterPreset | undefined, input: FormatAmountInput) {\n if (!preset) return {};\n\n if (typeof currencyFormatterPresets[preset] === 'function') {\n return currencyFormatterPresets[preset](input);\n }\n\n return currencyFormatterPresets[preset];\n}\n\nfunction mergeCustomOptions(\n presetCustomOptions: FormatAmountCustomOptions,\n customOptions: FormatAmountCustomOptions\n) {\n return {\n ...defaultCustomOptions,\n ...presetCustomOptions,\n ...customOptions,\n };\n}\n\nfunction evaluateCompactNotation(compactThreshold: number, amount: number) {\n return Math.abs(amount) >= compactThreshold;\n}\n\nfunction getSmallestUnit(decimals: number) {\n return 1 / 10 ** decimals;\n}\n\nfunction isSmallerThanMinorUnit(value: number, decimals: number): boolean {\n if (value === 0) return false;\n const unit = 1 / 10 ** decimals;\n return Math.abs(value) < unit;\n}\n\nfunction omitFractionOptions(options: Intl.NumberFormatOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { minimumFractionDigits, maximumFractionDigits, ...rest } = options;\n return rest;\n}\n\nfunction deriveFractionOptions(\n amount: number,\n decimals: number,\n compact: boolean,\n presetNumberFormatOptions: Intl.NumberFormatOptions,\n numberFormatOptions: Intl.NumberFormatOptions\n) {\n const defaultMinimumFractionDigits = 2;\n\n function getMaximumFractionDigits() {\n if (compact && !numberFormatOptions.maximumFractionDigits) {\n return defaultMinimumFractionDigits;\n }\n\n if (\n !presetNumberFormatOptions.maximumFractionDigits &&\n !numberFormatOptions.maximumFractionDigits\n ) {\n if (amount >= 1000 && amount <= 999999) {\n return Math.min(decimals, defaultMinimumFractionDigits);\n }\n }\n\n return (\n numberFormatOptions.maximumFractionDigits ??\n presetNumberFormatOptions.maximumFractionDigits ??\n decimals\n );\n }\n\n const maximumFractionDigits = getMaximumFractionDigits();\n // Ensure final minimumFractionDigits <= maximumFractionDigits to avoid Intl.NumberFormat RangeError\n const minimumFractionDigits = Math.min(\n numberFormatOptions.minimumFractionDigits ??\n presetNumberFormatOptions.minimumFractionDigits ??\n defaultMinimumFractionDigits,\n maximumFractionDigits\n );\n\n return {\n maximumFractionDigits,\n minimumFractionDigits,\n };\n}\n","type ObjectValue = string | number | boolean | null | NestedObject | ObjectValue[];\ninterface NestedObject {\n [key: string]: ObjectValue;\n}\n\ninterface FlattenedObject {\n [key: string]: string | number | boolean | null;\n}\n\n/**\n * Flattens a nested object or array into a flat object with dot-notation key paths.\n *\n * @param input - The object or array to flatten\n * @param prefix - Internal parameter for recursion, represents the current key path\n * @returns A flat object where keys represent the path to the original nested value\n *\n * @example\n * ```typescript\n * // Object example\n * flattenObject({ layer1: { layer2: 'value' } })\n * // Returns: { 'layer1.layer2': 'value' }\n *\n * // Array example\n * flattenObject([{ key: 'value' }])\n * // Returns: { '[0].key': 'value' }\n *\n * // Mixed example\n * flattenObject({ users: [{ name: 'John', age: 30 }] })\n * // Returns: { 'users[0].name': 'John', 'users[0].age': 30 }\n * ```\n */\nexport function flattenObject(input: ObjectValue, prefix = ''): FlattenedObject {\n const result: FlattenedObject = {};\n\n if (input === null || typeof input !== 'object') {\n if (prefix === '') return { value: input };\n return { [prefix]: input };\n }\n\n if (Array.isArray(input)) {\n input.forEach((item, index) => {\n const key = prefix === '' ? `[${index}]` : `${prefix}[${index}]`;\n const flattened = flattenObject(item, key);\n Object.assign(result, flattened);\n });\n } else {\n Object.entries(input).forEach(([key, value]) => {\n const newKey = prefix === '' ? key : `${prefix}.${key}`;\n const flattened = flattenObject(value, newKey);\n Object.assign(result, flattened);\n });\n }\n\n return result;\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","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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n"],"mappings":"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A,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACp6CA,IAAM,WAAW,KAAK,KAAK,GAAG;AAC9B,IAAM,WAAW,IAAI,OAAO,oBAAoB,QAAQ,QAAQ,IAAI;AAEpE,IAAM,YAAY,CAAC,OAAO,OAAO,OAAO;AACjC,IAAM,kBAAkB;AAE/B,SAAS,cAAc,OAAe;AACpC,SAAO,MAAM,MAAM,QAAQ;AAC7B;AAEA,SAAS,eAAe,OAAwB;AAC9C,WAAS,aAAa,SAAiB;AACrC,WAAO,MAAM,YAAY,EAAE,SAAS,OAAO;AAAA,EAC7C;AACA,SAAO,UAAU,KAAK,YAAY;AACpC;AAOO,SAAS,WAAW,EAAE,OAAO,UAAU,GAA2B;AACvE,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AAEtC,QAAM,WAAW,cAAc,KAAK;AACpC,QAAM,iBAAiB,eAAe,KAAK;AAE3C,MAAI,YAAY,gBAAgB;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACnCO,SAAS,wBAAwB,OAAe;AACrD,QAAM,QAAQ,MAAM,KAAK;AACzB,QAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,MAAI,OAAO,QAAQ;AACjB,WAAO,MACJ,IAAI,UAAS,KAAK,MAAM,UAAU,IAAI,OAAO,IAAK,EAClD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,EACb,OAAO;AACL,WAAO;AAAA,EACT;AACF;;;ACXO,SAAS,iBAAiB,UAA0B;AACzD,MAAI,CAAC,UAAU,KAAK,QAAQ,GAAG;AAC7B,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,SAAO,CAAC,SAAS,QAAQ,MAAM,EAAE;AACnC;;;ACLA,SAAS,yBAAyB;AAClC,SAA8B,0CAA0C;AASjE,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,eAAe,IAAI,gBAAgB;AAAA,EACnC;AAAA,EACA,aAAa;AACf,GAAiC;AAC/B,MAAI,SAAS,UAAW,QAAO,gCAAgC;AAC/D,eAAa,OAAO,SAAS,IAAI;AACjC,MAAI,WAAY,cAAa,OAAO,OAAO,kCAAkC;AAC7E,SAAO,GAAG,iBAAiB,SAAS,IAAI,IAAI,aAAa,SAAS,CAAC;AACrE;;;ACpBA,OAAO,eAAe;AAMf,SAAS,gBAAgB,OAAuB;AACrD,MAAI,OAAO,WAAW,eAAe,OAAO,cAAc,aAAa;AACrE,WAAO,UAAU,SAAS,OAAO,EAAE,cAAc,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,EACnE;AAEA,SAAO,OAAO,KAAK,EAChB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;;;A7BOO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,cAAc,OAA6B;AACzD,SAAO,SAAS,KAAK,KAAK,UAAU;AACtC;AAEO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,YAAY,OAAoC;AAC9D,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,WAAW,OAAqC;AAC9D,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,UAAU,OAAkC;AAC1D,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,QAAQ,OAAgC;AACtD,SAAO,iBAAiB;AAC1B;AAEO,SAAS,QAAQ,OAAe;AACrC,SAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AACvC;AAEO,SAAS,UAAa,UAAwC;AACnE,SAAO,CAAC,YAAY,QAAQ;AAC9B;AAEO,SAAS,aAAa,KAAiC;AAC5D,QAAM,aAAa,OAAO,eAAe,UAAU;AACnD,SAAO,eAAe;AACxB;AAGO,SAAS,OAAO;AAAC;AAEjB,SAAS,YAAe,OAAqB;AAClD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAEO,SAAS,sBAAuC,KAAQ;AAC7D,SAAO,IAAI,SAAS,MAAM;AAC5B;AAIO,SAAS,YAAY,MAAoB;AAC9C,SAAO,CAAgC,eAAkB,WAAW,IAAI;AAC1E;AAEO,SAAS,aAAa,MAAiB;AAC5C,SAAO,KAAK,WAAW;AACzB;AAGO,IAAM,qBAAqB;AAI3B,SAAS,aAAa,OAA4B;AACvD,MAAI,OAAO,SAAS,KAAK,EAAG,QAAO,OAAO,KAAK,KAAK,EAAE,QAAQ;AAC9D,SAAO,IAAI,WAAW,MAAM,MAAM,EAAE,QAAQ,CAAC;AAC/C;AAEO,SAAS,gBAAgB,KAAa;AAC3C,SAAO,CAAC,GAAG,MAAM,GAAG,EAAE,KAAK,CAAC;AAC9B;AAEO,SAAS,sBAAsB,WAAmB,SAAiB;AACxE,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,WAAW,KAAK,SAAS,KAAK;AACzC,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO;AACT;AAEA,eAAsB,MAAM,IAAY;AACtC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;AAEO,SAAS,WAAW,MAAgB;AACzC,SAAO,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,GAAG,GAAG,IAAIC,WAAU,CAAC,CAAC;AAClE;AAEO,SAAS,YAAe,GAA4D;AACzF,SAAO,EAAE,WAAW;AACtB;AAEO,SAAS,WAAc,GAAwD;AACpF,SAAO,EAAE,WAAW;AACtB;AAEO,SAAS,wBAAwB,QAAgB;AACtD,SAAO,IAAI,MAAM,MAAM,EAAE,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB,IAAY;AAC9C,QAAM,SAAS;AACf,MAAI,GAAG,WAAW,MAAM,EAAG,QAAO;AAClC,SAAO,SAAS;AAClB;AAEA,SAAS,UAAU,KAAa;AAC9B,SAAO,IAAI,QAAQ,aAAa,WAAS,MAAM,MAAM,YAAY,CAAC;AACpE;AAEA,SAAS,WAAW,QAAgB,SAAS,GAAG;AAC9C,SAAO,OAAO,MAAM,GAAG,MAAM;AAC/B;AAEO,SAAS,UAAU,OAAe;AACvC,MAAI,OAAO,UAAU,KAAK;AAC1B,MAAI,KAAK,SAAS,GAAG,GAAG;AACtB,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,MAAM,UAAU,GAAG;AACrB,aAAO,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9E,OAAO;AACL,aAAO,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,MAAM,CAAC,GAAG,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF,WAAW,KAAK,UAAU,GAAG;AAC3B,WAAO,GAAG,WAAW,MAAM,CAAC,CAAC;AAAA,EAC/B;AACA,SAAO,KAAK,YAAY;AAC1B;AAEO,SAAS,cAAc,MAAc,OAAY;AACtD,SAAO,UAAU,KAAK,IAAI,EAAE,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC;AACjD;AAEO,SAAS,YAAY,OAAe;AACzC,SAAO,iBAAiB,KAAK,KAAK;AACpC;AAEO,SAAS,YAAY,OAAe;AACzC,SAAO,MAAM,SAAS,EAAE;AAC1B;AAEO,SAAS,YAAY,KAAa;AACvC,SAAO,SAAS,KAAK,EAAE;AACzB;AAIO,SAAS,UACd,KACA,OACuB;AACvB,QAAM,SAAyC,CAAC;AAEhD,aAAW,OAAO,KAAK;AACrB,QAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AAClD,aAAO,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,GAAG;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAkB,KAAuC;AACvE,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAC5D;AAQO,SAAS,kBAAkB,OAAqB;AACrD,QAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,KAAK,CAAC,EAAE;AAC9D;AAEO,SAAS,gBAAmB,OAAU,SAAkD;AAC7F,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACF;AAEO,SAAS,WAAW,KAAa;AACtC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;AAEO,SAAS,YAAe,KAAU;AACvC,SAAO,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC;AAChC;AAEO,SAAS,6BAA6B,GAAW;AACtD,SAAO,EAAE,QAAQ,SAAS,EAAE;AAC9B;AAEO,SAAS,qBAAqB,OAA4C;AAC/E,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,MAAM,UAAQ,SAAS,IAAI,CAAC;AACnE,SAAO,SAAS,KAAK;AACvB;","names":["BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","BigNumber","CryptoAssetProtocols","CryptoAssetProtocols","BigNumber","currencyDecimalsMap","currencyDecimalsMap","BigNumber","locale","BigNumber"]}
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/create-money.ts","../src/money/is-money.ts","../src/fiat-metadata.ts","../src/money/is-fiat-currency-code.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/assets/asset-id.ts","../src/truncate-middle.ts","../src/market-data.ts","../src/currency-formatter/currency-formatter-presets.ts","../src/currency-formatter/currency-formatter.ts","../src/flatten-object.ts","../src/special-char.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/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 './assets/asset-id';\nexport * from './truncate-middle';\nexport * from './time';\nexport * from './market-data';\nexport * from './currency-formatter/currency-formatter';\nexport * from './flatten-object';\nexport * from './special-char';\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 { 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 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 } from './create-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 ${quantity.amount.toString()} ${quantity.symbol} 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 quoteCurrencyAmountToBase(\n quantity: Money,\n { pair, price }: MarketData,\n decimals: number\n) {\n if (quantity.symbol !== pair.quote)\n throw new Error(\n `Cannot calculate value of ${quantity.amount.toString()} ${quantity.symbol} with market pair of ${formatMarketPair(\n pair\n )}`\n );\n\n const baseAmount = quantity.amount\n .dividedBy(price.amount)\n .shiftedBy(decimals)\n .integerValue(BigNumber.ROUND_FLOOR);\n\n return createMoney(baseAmount, pair.base, decimals);\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","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","export const FIAT_METADATA = [\n {\n name: 'US Dollar',\n symbol: '$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'USD',\n namePlural: 'US dollars',\n },\n {\n name: 'Canadian Dollar',\n symbol: 'CA$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'CAD',\n namePlural: 'Canadian dollars',\n },\n {\n name: 'Euro',\n symbol: '€',\n symbolNative: '€',\n decimalDigits: 2,\n rounding: 0,\n code: 'EUR',\n namePlural: 'euros',\n },\n {\n name: 'United Arab Emirates Dirham',\n symbol: 'AED',\n symbolNative: 'د.إ.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'AED',\n namePlural: 'UAE dirhams',\n },\n {\n name: 'Afghan Afghani',\n symbol: 'Af',\n symbolNative: '؋',\n decimalDigits: 0,\n rounding: 0,\n code: 'AFN',\n namePlural: 'Afghan Afghanis',\n },\n {\n name: 'Albanian Lek',\n symbol: 'ALL',\n symbolNative: 'Lek',\n decimalDigits: 0,\n rounding: 0,\n code: 'ALL',\n namePlural: 'Albanian lekë',\n },\n {\n name: 'Armenian Dram',\n symbol: 'AMD',\n symbolNative: 'դր.',\n decimalDigits: 0,\n rounding: 0,\n code: 'AMD',\n namePlural: 'Armenian drams',\n },\n {\n name: 'Argentine Peso',\n symbol: 'AR$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'ARS',\n namePlural: 'Argentine pesos',\n },\n {\n name: 'Australian Dollar',\n symbol: 'AU$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'AUD',\n namePlural: 'Australian dollars',\n },\n {\n name: 'Azerbaijani Manat',\n symbol: 'man.',\n symbolNative: 'ман.',\n decimalDigits: 2,\n rounding: 0,\n code: 'AZN',\n namePlural: 'Azerbaijani manats',\n },\n {\n name: 'Bosnia-Herzegovina Convertible Mark',\n symbol: 'KM',\n symbolNative: 'KM',\n decimalDigits: 2,\n rounding: 0,\n code: 'BAM',\n namePlural: 'Bosnia-Herzegovina convertible marks',\n },\n {\n name: 'Bangladeshi Taka',\n symbol: 'Tk',\n symbolNative: '৳',\n decimalDigits: 2,\n rounding: 0,\n code: 'BDT',\n namePlural: 'Bangladeshi takas',\n },\n {\n name: 'Bulgarian Lev',\n symbol: 'BGN',\n symbolNative: 'лв.',\n decimalDigits: 2,\n rounding: 0,\n code: 'BGN',\n namePlural: 'Bulgarian leva',\n },\n {\n name: 'Bahraini Dinar',\n symbol: 'BD',\n symbolNative: 'د.ب.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'BHD',\n namePlural: 'Bahraini dinars',\n },\n {\n name: 'Burundian Franc',\n symbol: 'FBu',\n symbolNative: 'FBu',\n decimalDigits: 0,\n rounding: 0,\n code: 'BIF',\n namePlural: 'Burundian francs',\n },\n {\n name: 'Brunei Dollar',\n symbol: 'BN$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'BND',\n namePlural: 'Brunei dollars',\n },\n {\n name: 'Bolivian Boliviano',\n symbol: 'Bs',\n symbolNative: 'Bs',\n decimalDigits: 2,\n rounding: 0,\n code: 'BOB',\n namePlural: 'Bolivian bolivianos',\n },\n {\n name: 'Brazilian Real',\n symbol: 'R$',\n symbolNative: 'R$',\n decimalDigits: 2,\n rounding: 0,\n code: 'BRL',\n namePlural: 'Brazilian reals',\n },\n {\n name: 'Botswanan Pula',\n symbol: 'BWP',\n symbolNative: 'P',\n decimalDigits: 2,\n rounding: 0,\n code: 'BWP',\n namePlural: 'Botswanan pulas',\n },\n {\n name: 'Belarusian Ruble',\n symbol: 'Br',\n symbolNative: 'руб.',\n decimalDigits: 2,\n rounding: 0,\n code: 'BYN',\n namePlural: 'Belarusian rubles',\n },\n {\n name: 'Belize Dollar',\n symbol: 'BZ$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'BZD',\n namePlural: 'Belize dollars',\n },\n {\n name: 'Congolese Franc',\n symbol: 'CDF',\n symbolNative: 'FrCD',\n decimalDigits: 2,\n rounding: 0,\n code: 'CDF',\n namePlural: 'Congolese francs',\n },\n {\n name: 'Swiss Franc',\n symbol: 'CHF',\n symbolNative: 'CHF',\n decimalDigits: 2,\n rounding: 0.05,\n code: 'CHF',\n namePlural: 'Swiss francs',\n },\n {\n name: 'Chilean Peso',\n symbol: 'CL$',\n symbolNative: '$',\n decimalDigits: 0,\n rounding: 0,\n code: 'CLP',\n namePlural: 'Chilean pesos',\n },\n {\n name: 'Chinese Yuan',\n symbol: 'CN¥',\n symbolNative: 'CN¥',\n decimalDigits: 2,\n rounding: 0,\n code: 'CNY',\n namePlural: 'Chinese yuan',\n },\n {\n name: 'Colombian Peso',\n symbol: 'CO$',\n symbolNative: '$',\n decimalDigits: 0,\n rounding: 0,\n code: 'COP',\n namePlural: 'Colombian pesos',\n },\n {\n name: 'Costa Rican Colón',\n symbol: '₡',\n symbolNative: '₡',\n decimalDigits: 0,\n rounding: 0,\n code: 'CRC',\n namePlural: 'Costa Rican colóns',\n },\n {\n name: 'Cape Verdean Escudo',\n symbol: 'CV$',\n symbolNative: 'CV$',\n decimalDigits: 2,\n rounding: 0,\n code: 'CVE',\n namePlural: 'Cape Verdean escudos',\n },\n {\n name: 'Czech Republic Koruna',\n symbol: 'Kč',\n symbolNative: 'Kč',\n decimalDigits: 2,\n rounding: 0,\n code: 'CZK',\n namePlural: 'Czech Republic korunas',\n },\n {\n name: 'Djiboutian Franc',\n symbol: 'Fdj',\n symbolNative: 'Fdj',\n decimalDigits: 0,\n rounding: 0,\n code: 'DJF',\n namePlural: 'Djiboutian francs',\n },\n {\n name: 'Danish Krone',\n symbol: 'Dkr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'DKK',\n namePlural: 'Danish kroner',\n },\n {\n name: 'Dominican Peso',\n symbol: 'RD$',\n symbolNative: 'RD$',\n decimalDigits: 2,\n rounding: 0,\n code: 'DOP',\n namePlural: 'Dominican pesos',\n },\n {\n name: 'Algerian Dinar',\n symbol: 'DA',\n symbolNative: 'د.ج.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'DZD',\n namePlural: 'Algerian dinars',\n },\n {\n name: 'Estonian Kroon',\n symbol: 'Ekr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'EEK',\n namePlural: 'Estonian kroons',\n },\n {\n name: 'Egyptian Pound',\n symbol: 'EGP',\n symbolNative: 'ج.م.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'EGP',\n namePlural: 'Egyptian pounds',\n },\n {\n name: 'Eritrean Nakfa',\n symbol: 'Nfk',\n symbolNative: 'Nfk',\n decimalDigits: 2,\n rounding: 0,\n code: 'ERN',\n namePlural: 'Eritrean nakfas',\n },\n {\n name: 'Ethiopian Birr',\n symbol: 'Br',\n symbolNative: 'Br',\n decimalDigits: 2,\n rounding: 0,\n code: 'ETB',\n namePlural: 'Ethiopian birrs',\n },\n {\n name: 'British Pound Sterling',\n symbol: '£',\n symbolNative: '£',\n decimalDigits: 2,\n rounding: 0,\n code: 'GBP',\n namePlural: 'British pounds sterling',\n },\n {\n name: 'Georgian Lari',\n symbol: 'GEL',\n symbolNative: 'GEL',\n decimalDigits: 2,\n rounding: 0,\n code: 'GEL',\n namePlural: 'Georgian laris',\n },\n {\n name: 'Ghanaian Cedi',\n symbol: 'GH₵',\n symbolNative: 'GH₵',\n decimalDigits: 2,\n rounding: 0,\n code: 'GHS',\n namePlural: 'Ghanaian cedis',\n },\n {\n name: 'Guinean Franc',\n symbol: 'FG',\n symbolNative: 'FG',\n decimalDigits: 0,\n rounding: 0,\n code: 'GNF',\n namePlural: 'Guinean francs',\n },\n {\n name: 'Guatemalan Quetzal',\n symbol: 'GTQ',\n symbolNative: 'Q',\n decimalDigits: 2,\n rounding: 0,\n code: 'GTQ',\n namePlural: 'Guatemalan quetzals',\n },\n {\n name: 'Hong Kong Dollar',\n symbol: 'HK$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'HKD',\n namePlural: 'Hong Kong dollars',\n },\n {\n name: 'Honduran Lempira',\n symbol: 'HNL',\n symbolNative: 'L',\n decimalDigits: 2,\n rounding: 0,\n code: 'HNL',\n namePlural: 'Honduran lempiras',\n },\n {\n name: 'Croatian Kuna',\n symbol: 'kn',\n symbolNative: 'kn',\n decimalDigits: 2,\n rounding: 0,\n code: 'HRK',\n namePlural: 'Croatian kunas',\n },\n {\n name: 'Hungarian Forint',\n symbol: 'Ft',\n symbolNative: 'Ft',\n decimalDigits: 0,\n rounding: 0,\n code: 'HUF',\n namePlural: 'Hungarian forints',\n },\n {\n name: 'Indonesian Rupiah',\n symbol: 'Rp',\n symbolNative: 'Rp',\n decimalDigits: 0,\n rounding: 0,\n code: 'IDR',\n namePlural: 'Indonesian rupiahs',\n },\n {\n name: 'Israeli New Sheqel',\n symbol: '₪',\n symbolNative: '₪',\n decimalDigits: 2,\n rounding: 0,\n code: 'ILS',\n namePlural: 'Israeli new sheqels',\n },\n {\n name: 'Indian Rupee',\n symbol: '₹',\n symbolNative: 'টকা',\n decimalDigits: 2,\n rounding: 0,\n code: 'INR',\n namePlural: 'Indian rupees',\n },\n {\n name: 'Iraqi Dinar',\n symbol: 'IQD',\n symbolNative: 'د.ع.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'IQD',\n namePlural: 'Iraqi dinars',\n },\n {\n name: 'Iranian Rial',\n symbol: 'IRR',\n symbolNative: '﷼',\n decimalDigits: 0,\n rounding: 0,\n code: 'IRR',\n namePlural: 'Iranian rials',\n },\n {\n name: 'Icelandic Króna',\n symbol: 'Ikr',\n symbolNative: 'kr',\n decimalDigits: 0,\n rounding: 0,\n code: 'ISK',\n namePlural: 'Icelandic krónur',\n },\n {\n name: 'Jamaican Dollar',\n symbol: 'J$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'JMD',\n namePlural: 'Jamaican dollars',\n },\n {\n name: 'Jordanian Dinar',\n symbol: 'JD',\n symbolNative: 'د.أ.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'JOD',\n namePlural: 'Jordanian dinars',\n },\n {\n name: 'Japanese Yen',\n symbol: '¥',\n symbolNative: '¥',\n decimalDigits: 0,\n rounding: 0,\n code: 'JPY',\n namePlural: 'Japanese yen',\n },\n {\n name: 'Kenyan Shilling',\n symbol: 'Ksh',\n symbolNative: 'Ksh',\n decimalDigits: 2,\n rounding: 0,\n code: 'KES',\n namePlural: 'Kenyan shillings',\n },\n {\n name: 'Cambodian Riel',\n symbol: 'KHR',\n symbolNative: '៛',\n decimalDigits: 2,\n rounding: 0,\n code: 'KHR',\n namePlural: 'Cambodian riels',\n },\n {\n name: 'Comorian Franc',\n symbol: 'CF',\n symbolNative: 'FC',\n decimalDigits: 0,\n rounding: 0,\n code: 'KMF',\n namePlural: 'Comorian francs',\n },\n {\n name: 'South Korean Won',\n symbol: '₩',\n symbolNative: '₩',\n decimalDigits: 0,\n rounding: 0,\n code: 'KRW',\n namePlural: 'South Korean won',\n },\n {\n name: 'Kuwaiti Dinar',\n symbol: 'KD',\n symbolNative: 'د.ك.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'KWD',\n namePlural: 'Kuwaiti dinars',\n },\n {\n name: 'Kazakhstani Tenge',\n symbol: 'KZT',\n symbolNative: 'тңг.',\n decimalDigits: 2,\n rounding: 0,\n code: 'KZT',\n namePlural: 'Kazakhstani tenges',\n },\n {\n name: 'Lebanese Pound',\n symbol: 'LB£',\n symbolNative: 'ل.ل.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'LBP',\n namePlural: 'Lebanese pounds',\n },\n {\n name: 'Sri Lankan Rupee',\n symbol: 'SLRs',\n symbolNative: 'SL Re',\n decimalDigits: 2,\n rounding: 0,\n code: 'LKR',\n namePlural: 'Sri Lankan rupees',\n },\n {\n name: 'Lithuanian Litas',\n symbol: 'Lt',\n symbolNative: 'Lt',\n decimalDigits: 2,\n rounding: 0,\n code: 'LTL',\n namePlural: 'Lithuanian litai',\n },\n {\n name: 'Latvian Lats',\n symbol: 'Ls',\n symbolNative: 'Ls',\n decimalDigits: 2,\n rounding: 0,\n code: 'LVL',\n namePlural: 'Latvian lati',\n },\n {\n name: 'Libyan Dinar',\n symbol: 'LD',\n symbolNative: 'د.ل.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'LYD',\n namePlural: 'Libyan dinars',\n },\n {\n name: 'Moroccan Dirham',\n symbol: 'MAD',\n symbolNative: 'د.م.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'MAD',\n namePlural: 'Moroccan dirhams',\n },\n {\n name: 'Moldovan Leu',\n symbol: 'MDL',\n symbolNative: 'MDL',\n decimalDigits: 2,\n rounding: 0,\n code: 'MDL',\n namePlural: 'Moldovan lei',\n },\n {\n name: 'Malagasy Ariary',\n symbol: 'MGA',\n symbolNative: 'MGA',\n decimalDigits: 0,\n rounding: 0,\n code: 'MGA',\n namePlural: 'Malagasy Ariaries',\n },\n {\n name: 'Macedonian Denar',\n symbol: 'MKD',\n symbolNative: 'MKD',\n decimalDigits: 2,\n rounding: 0,\n code: 'MKD',\n namePlural: 'Macedonian denari',\n },\n {\n name: 'Myanma Kyat',\n symbol: 'MMK',\n symbolNative: 'K',\n decimalDigits: 0,\n rounding: 0,\n code: 'MMK',\n namePlural: 'Myanma kyats',\n },\n {\n name: 'Macanese Pataca',\n symbol: 'MOP$',\n symbolNative: 'MOP$',\n decimalDigits: 2,\n rounding: 0,\n code: 'MOP',\n namePlural: 'Macanese patacas',\n },\n {\n name: 'Mauritian Rupee',\n symbol: 'MURs',\n symbolNative: 'MURs',\n decimalDigits: 0,\n rounding: 0,\n code: 'MUR',\n namePlural: 'Mauritian rupees',\n },\n {\n name: 'Mexican Peso',\n symbol: 'MX$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'MXN',\n namePlural: 'Mexican pesos',\n },\n {\n name: 'Malaysian Ringgit',\n symbol: 'RM',\n symbolNative: 'RM',\n decimalDigits: 2,\n rounding: 0,\n code: 'MYR',\n namePlural: 'Malaysian ringgits',\n },\n {\n name: 'Mozambican Metical',\n symbol: 'MTn',\n symbolNative: 'MTn',\n decimalDigits: 2,\n rounding: 0,\n code: 'MZN',\n namePlural: 'Mozambican meticals',\n },\n {\n name: 'Namibian Dollar',\n symbol: 'N$',\n symbolNative: 'N$',\n decimalDigits: 2,\n rounding: 0,\n code: 'NAD',\n namePlural: 'Namibian dollars',\n },\n {\n name: 'Nigerian Naira',\n symbol: '₦',\n symbolNative: '₦',\n decimalDigits: 2,\n rounding: 0,\n code: 'NGN',\n namePlural: 'Nigerian nairas',\n },\n {\n name: 'Nicaraguan Córdoba',\n symbol: 'C$',\n symbolNative: 'C$',\n decimalDigits: 2,\n rounding: 0,\n code: 'NIO',\n namePlural: 'Nicaraguan córdobas',\n },\n {\n name: 'Norwegian Krone',\n symbol: 'Nkr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'NOK',\n namePlural: 'Norwegian kroner',\n },\n {\n name: 'Nepalese Rupee',\n symbol: 'NPRs',\n symbolNative: 'नेरू',\n decimalDigits: 2,\n rounding: 0,\n code: 'NPR',\n namePlural: 'Nepalese rupees',\n },\n {\n name: 'New Zealand Dollar',\n symbol: 'NZ$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'NZD',\n namePlural: 'New Zealand dollars',\n },\n {\n name: 'Omani Rial',\n symbol: 'OMR',\n symbolNative: 'ر.ع.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'OMR',\n namePlural: 'Omani rials',\n },\n {\n name: 'Panamanian Balboa',\n symbol: 'B/.',\n symbolNative: 'B/.',\n decimalDigits: 2,\n rounding: 0,\n code: 'PAB',\n namePlural: 'Panamanian balboas',\n },\n {\n name: 'Peruvian Nuevo Sol',\n symbol: 'S/.',\n symbolNative: 'S/.',\n decimalDigits: 2,\n rounding: 0,\n code: 'PEN',\n namePlural: 'Peruvian nuevos soles',\n },\n {\n name: 'Philippine Peso',\n symbol: '₱',\n symbolNative: '₱',\n decimalDigits: 2,\n rounding: 0,\n code: 'PHP',\n namePlural: 'Philippine pesos',\n },\n {\n name: 'Pakistani Rupee',\n symbol: 'PKRs',\n symbolNative: '₨',\n decimalDigits: 0,\n rounding: 0,\n code: 'PKR',\n namePlural: 'Pakistani rupees',\n },\n {\n name: 'Polish Zloty',\n symbol: 'zł',\n symbolNative: 'zł',\n decimalDigits: 2,\n rounding: 0,\n code: 'PLN',\n namePlural: 'Polish zlotys',\n },\n {\n name: 'Paraguayan Guarani',\n symbol: '₲',\n symbolNative: '₲',\n decimalDigits: 0,\n rounding: 0,\n code: 'PYG',\n namePlural: 'Paraguayan guaranis',\n },\n {\n name: 'Qatari Rial',\n symbol: 'QR',\n symbolNative: 'ر.ق.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'QAR',\n namePlural: 'Qatari rials',\n },\n {\n name: 'Romanian Leu',\n symbol: 'RON',\n symbolNative: 'RON',\n decimalDigits: 2,\n rounding: 0,\n code: 'RON',\n namePlural: 'Romanian lei',\n },\n {\n name: 'Serbian Dinar',\n symbol: 'din.',\n symbolNative: 'дин.',\n decimalDigits: 0,\n rounding: 0,\n code: 'RSD',\n namePlural: 'Serbian dinars',\n },\n {\n name: 'Russian Ruble',\n symbol: 'RUB',\n symbolNative: '₽.',\n decimalDigits: 2,\n rounding: 0,\n code: 'RUB',\n namePlural: 'Russian rubles',\n },\n {\n name: 'Rwandan Franc',\n symbol: 'RWF',\n symbolNative: 'FR',\n decimalDigits: 0,\n rounding: 0,\n code: 'RWF',\n namePlural: 'Rwandan francs',\n },\n {\n name: 'Saudi Riyal',\n symbol: 'SR',\n symbolNative: 'ر.س.‏',\n decimalDigits: 2,\n rounding: 0,\n code: 'SAR',\n namePlural: 'Saudi riyals',\n },\n {\n name: 'Sudanese Pound',\n symbol: 'SDG',\n symbolNative: 'SDG',\n decimalDigits: 2,\n rounding: 0,\n code: 'SDG',\n namePlural: 'Sudanese pounds',\n },\n {\n name: 'Swedish Krona',\n symbol: 'Skr',\n symbolNative: 'kr',\n decimalDigits: 2,\n rounding: 0,\n code: 'SEK',\n namePlural: 'Swedish kronor',\n },\n {\n name: 'Singapore Dollar',\n symbol: 'S$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'SGD',\n namePlural: 'Singapore dollars',\n },\n {\n name: 'Somali Shilling',\n symbol: 'Ssh',\n symbolNative: 'Ssh',\n decimalDigits: 0,\n rounding: 0,\n code: 'SOS',\n namePlural: 'Somali shillings',\n },\n {\n name: 'Syrian Pound',\n symbol: 'SY£',\n symbolNative: 'ل.س.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'SYP',\n namePlural: 'Syrian pounds',\n },\n {\n name: 'Thai Baht',\n symbol: '฿',\n symbolNative: '฿',\n decimalDigits: 2,\n rounding: 0,\n code: 'THB',\n namePlural: 'Thai baht',\n },\n {\n name: 'Tunisian Dinar',\n symbol: 'DT',\n symbolNative: 'د.ت.‏',\n decimalDigits: 3,\n rounding: 0,\n code: 'TND',\n namePlural: 'Tunisian dinars',\n },\n {\n name: 'Tongan Paʻanga',\n symbol: 'T$',\n symbolNative: 'T$',\n decimalDigits: 2,\n rounding: 0,\n code: 'TOP',\n namePlural: 'Tongan paʻanga',\n },\n {\n name: 'Turkish Lira',\n symbol: 'TL',\n symbolNative: 'TL',\n decimalDigits: 2,\n rounding: 0,\n code: 'TRY',\n namePlural: 'Turkish Lira',\n },\n {\n name: 'Trinidad and Tobago Dollar',\n symbol: 'TT$',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'TTD',\n namePlural: 'Trinidad and Tobago dollars',\n },\n {\n name: 'New Taiwan Dollar',\n symbol: 'NT$',\n symbolNative: 'NT$',\n decimalDigits: 2,\n rounding: 0,\n code: 'TWD',\n namePlural: 'New Taiwan dollars',\n },\n {\n name: 'Tanzanian Shilling',\n symbol: 'TSh',\n symbolNative: 'TSh',\n decimalDigits: 0,\n rounding: 0,\n code: 'TZS',\n namePlural: 'Tanzanian shillings',\n },\n {\n name: 'Ukrainian Hryvnia',\n symbol: '₴',\n symbolNative: '₴',\n decimalDigits: 2,\n rounding: 0,\n code: 'UAH',\n namePlural: 'Ukrainian hryvnias',\n },\n {\n name: 'Ugandan Shilling',\n symbol: 'USh',\n symbolNative: 'USh',\n decimalDigits: 0,\n rounding: 0,\n code: 'UGX',\n namePlural: 'Ugandan shillings',\n },\n {\n name: 'Uruguayan Peso',\n symbol: '$U',\n symbolNative: '$',\n decimalDigits: 2,\n rounding: 0,\n code: 'UYU',\n namePlural: 'Uruguayan pesos',\n },\n {\n name: 'Uzbekistan Som',\n symbol: 'UZS',\n symbolNative: 'UZS',\n decimalDigits: 0,\n rounding: 0,\n code: 'UZS',\n namePlural: 'Uzbekistan som',\n },\n {\n name: 'Venezuelan Bolívar',\n symbol: 'Bs.F.',\n symbolNative: 'Bs.F.',\n decimalDigits: 2,\n rounding: 0,\n code: 'VEF',\n namePlural: 'Venezuelan bolívars',\n },\n {\n name: 'Vietnamese Dong',\n symbol: '₫',\n symbolNative: '₫',\n decimalDigits: 0,\n rounding: 0,\n code: 'VND',\n namePlural: 'Vietnamese dong',\n },\n {\n name: 'CFA Franc BEAC',\n symbol: 'FCFA',\n symbolNative: 'FCFA',\n decimalDigits: 0,\n rounding: 0,\n code: 'XAF',\n namePlural: 'CFA francs BEAC',\n },\n {\n name: 'CFA Franc BCEAO',\n symbol: 'CFA',\n symbolNative: 'CFA',\n decimalDigits: 0,\n rounding: 0,\n code: 'XOF',\n namePlural: 'CFA francs BCEAO',\n },\n {\n name: 'Yemeni Rial',\n symbol: 'YR',\n symbolNative: 'ر.ي.‏',\n decimalDigits: 0,\n rounding: 0,\n code: 'YER',\n namePlural: 'Yemeni rials',\n },\n {\n name: 'South African Rand',\n symbol: 'R',\n symbolNative: 'R',\n decimalDigits: 2,\n rounding: 0,\n code: 'ZAR',\n namePlural: 'South African rand',\n },\n {\n name: 'Zambian Kwacha',\n symbol: 'ZK',\n symbolNative: 'ZK',\n decimalDigits: 0,\n rounding: 0,\n code: 'ZMK',\n namePlural: 'Zambian kwachas',\n },\n {\n name: 'Zimbabwean Dollar',\n symbol: 'ZWL$',\n symbolNative: 'ZWL$',\n decimalDigits: 0,\n rounding: 0,\n code: 'ZWL',\n namePlural: 'Zimbabwean Dollar',\n },\n];\n","import { FIAT_METADATA } from '../fiat-metadata';\n\nconst fiatCurrencyCodeList = new Set(FIAT_METADATA.map(currency => currency.code));\n\nexport function isFiatCurrencyCode(code: string) {\n return fiatCurrencyCodeList.has(code);\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 { CryptoAsset } from '@leather.io/models';\n\nimport { assertUnreachable } from '../index';\n\nexport function getAssetDisplayName(asset: CryptoAsset) {\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 { BaseCryptoAssetBalance, BtcBalance, Money, StxBalance } 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 createBtcBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n protectedBal?: Money,\n dustBal?: Money,\n unspendableBal?: Money\n): BtcBalance {\n const zeroBalance = createMoney(0, totalBalance.symbol);\n const inboundBalance = inboundBal ?? zeroBalance;\n const outboundBalance = outboundBal ?? zeroBalance;\n const protectedBalance = protectedBal ?? zeroBalance;\n const dustBalance = dustBal ?? zeroBalance;\n const unspendableBalance = unspendableBal ?? zeroBalance;\n const baseBalance = createBaseCryptoAssetBalance(totalBalance, inboundBalance, outboundBalance);\n return {\n ...baseBalance,\n protectedBalance,\n dustBalance,\n availableBalance: subtractMoney(totalBalance, unspendableBalance),\n unspendableBalance,\n };\n}\n\nexport function createStxBalance(\n totalBalance: Money,\n inboundBal?: Money,\n outboundBal?: Money,\n lockedBal?: Money\n): StxBalance {\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 aggregateBtcBalances(balances: BtcBalance[]): BtcBalance {\n return createBtcBalance(\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.dustBalance)),\n sumMoney(balances.map(b => b.unspendableBalance))\n );\n}\n\nexport function aggregateStxBalances(balances: StxBalance[]): StxBalance {\n return createStxBalance(\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 { ORD_IO_URL } from '@leather.io/constants';\nimport {\n CryptoAssetCategories,\n CryptoAssetChains,\n CryptoAssetProtocols,\n InscriptionAsset,\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 readonly thumbnailSrc?: string;\n}\n\nexport function createInscriptionAsset(data: CreateInscriptionData): InscriptionAsset {\n const ordinalPreviewSrc = `https://ordinals.com/preview/${data.id}`;\n const ordIoSrc = `${ORD_IO_URL}/content/${data.id}`;\n const thumbnailSrc = data.thumbnailSrc ?? ordinalPreviewSrc;\n const primarySrc = data.contentSrc || ordinalPreviewSrc;\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 thumbnailSrc,\n };\n\n if (!data.mimeType) {\n return {\n ...sharedInfo,\n mimeType: 'other',\n src: '',\n };\n }\n\n return whenInscriptionMimeType<InscriptionAsset>(data.mimeType, {\n audio: () => ({\n ...sharedInfo,\n mimeType: 'audio',\n name: 'inscription',\n src: primarySrc,\n }),\n gltf: () => ({\n ...sharedInfo,\n mimeType: 'gltf',\n name: 'inscription',\n src: primarySrc,\n }),\n html: () => ({\n ...sharedInfo,\n mimeType: 'html',\n name: 'inscription',\n thumbnailSrc: ordIoSrc,\n src: primarySrc,\n }),\n image: () => ({\n ...sharedInfo,\n mimeType: 'image',\n name: 'inscription',\n thumbnailSrc: ordIoSrc,\n src: primarySrc,\n }),\n svg: () => ({\n ...sharedInfo,\n mimeType: 'svg',\n name: 'inscription',\n src: primarySrc,\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: primarySrc,\n }),\n other: () => ({\n ...sharedInfo,\n mimeType: 'other',\n name: 'inscription',\n src: data.contentSrc ?? '',\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","import {\n CryptoAsset,\n CryptoAssetId,\n CryptoAssetProtocol,\n CryptoAssetProtocols,\n Sip9Asset,\n} from '@leather.io/models';\n\nimport { assertUnreachable } from '../index';\n\nexport function matchesAssetId(asset: CryptoAsset, assetId: CryptoAssetId) {\n const assetIdentifier = getAssetId(asset);\n return isSameAssetId(assetIdentifier, assetId);\n}\n\nexport function isSameAssetId(assetId1: CryptoAssetId, assetId2: CryptoAssetId) {\n return assetId1.protocol === assetId2.protocol && assetId1.id === assetId2.id;\n}\n\nexport function isSameAsset(asset1: CryptoAsset, asset2: CryptoAsset) {\n return isSameAssetId(getAssetId(asset1), getAssetId(asset2));\n}\n\nexport function getAssetId(asset: CryptoAsset): CryptoAssetId {\n switch (asset.protocol) {\n case 'nativeBtc':\n return {\n protocol: 'nativeBtc',\n id: asset.symbol,\n };\n case 'nativeStx':\n return {\n protocol: 'nativeStx',\n id: asset.symbol,\n };\n case 'sip10':\n return {\n protocol: 'sip10',\n id: asset.assetId,\n };\n case 'rune':\n return {\n protocol: 'rune',\n id: asset.runeName,\n };\n case 'brc20':\n return {\n protocol: 'brc20',\n id: asset.symbol,\n };\n case 'src20':\n return {\n protocol: 'src20',\n id: asset.id,\n };\n case 'stx20':\n return {\n protocol: 'stx20',\n id: asset.symbol,\n };\n case 'inscription':\n return {\n protocol: 'inscription',\n id: asset.id,\n };\n case 'stamp':\n return {\n protocol: 'stamp',\n id: asset.stamp.toString(),\n };\n case 'sip9':\n return createSip9AssetId(asset);\n default:\n assertUnreachable(asset);\n }\n}\n\nexport function createSip9AssetId(asset: Sip9Asset): CryptoAssetId {\n return {\n protocol: asset.protocol,\n id: formatSip9IdField(asset),\n };\n}\n\nexport function formatSip9IdField(asset: Sip9Asset) {\n return `${asset.assetId}|${asset.tokenId}`;\n}\n\nexport function parseSip9IdField(id: string) {\n const [assetId, tokenId] = id.split('|');\n return { assetId, tokenId: Number(tokenId) };\n}\n\nexport type SerializedCryptoAssetId = `${string}|${string}`;\n\nexport function serializeAssetId(assetId: CryptoAssetId): SerializedCryptoAssetId {\n return `${assetId.protocol}|${assetId.id}`;\n}\n\nexport function deserializeAssetId(serializedAssetId: SerializedCryptoAssetId): CryptoAssetId {\n const [protocol, ...idParts] = serializedAssetId.split('|');\n const id = idParts.join('|');\n if (!Object.keys(CryptoAssetProtocols).includes(protocol)) {\n throw new Error(`Unrecognized Asset Protocol: ${protocol}`);\n }\n\n return {\n protocol: protocol as CryptoAssetProtocol,\n id,\n };\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","import { BigNumber } from 'bignumber.js';\n\nimport { currencyDecimalsMap, currencyNameMap } from '@leather.io/constants';\nimport { type MarketData, createMarketData, createMarketPair } from '@leather.io/models';\n\nimport { convertAmountToBaseUnit, convertAmountToFractionalUnit } from './money/calculate-money';\nimport { createMoney } from './money/create-money';\n\n/**\n * Rebases MarketData to a different quote currency using exchange rate.\n *\n * @param marketData - e.g. STX/USD\n * @param exchangeRate - e.g. EUR/USD (EUR is target quote currency)\n * @returns e.g. STX/EUR\n */\nexport function rebaseMarketData(marketData: MarketData, exchangeRate: MarketData): MarketData {\n if (exchangeRate.pair.quote !== marketData.pair.quote) {\n throw new Error(\n `Exchange rate quote currency (${exchangeRate.pair.quote}) must match original quote currency (${marketData.pair.quote})`\n );\n }\n\n const targetQuoteCurrency = exchangeRate.pair.base;\n if (!(targetQuoteCurrency in currencyNameMap)) {\n throw new Error(`Target currency must be a supported quote currency: ${targetQuoteCurrency}`);\n }\n\n const rebasedPrice = createMoney(\n convertAmountToFractionalUnit(\n marketData.price.amount.dividedBy(exchangeRate.price.amount),\n currencyDecimalsMap[targetQuoteCurrency]\n ),\n targetQuoteCurrency\n );\n\n return createMarketData(\n createMarketPair(marketData.pair.base, targetQuoteCurrency),\n rebasedPrice\n );\n}\n\n/**\n * Inverts exchange rate market data by swapping base/quote currencies (e.g. USD/EUR -> EUR/USD)\n */\nexport function invertExchangeRate(exchangeRate: MarketData): MarketData {\n if (!(exchangeRate.pair.base in currencyNameMap)) {\n throw new Error(`Base currency must be a supported quote currency: ${exchangeRate.pair.base}`);\n }\n\n const invertedPrice = createMoney(\n convertAmountToFractionalUnit(\n new BigNumber(1).dividedBy(convertAmountToBaseUnit(exchangeRate.price)),\n currencyDecimalsMap[exchangeRate.pair.base]\n ),\n exchangeRate.pair.base\n );\n\n return createMarketData(\n createMarketPair(exchangeRate.pair.quote, exchangeRate.pair.base),\n invertedPrice\n );\n}\n","import { isFiatCurrencyCode } from '../money';\nimport {\n CurrencyFormatterPreset,\n CurrencyFormatterPresetResult,\n CurrencyFormatterPresetValue,\n} from './currency-formatter.types';\n\nexport const currencyFormatterPresets: Record<\n CurrencyFormatterPreset,\n CurrencyFormatterPresetValue\n> = {\n price: input => {\n const options: CurrencyFormatterPresetResult = {\n compactThreshold: Infinity,\n approximateDust: false,\n showCurrency: true,\n numberFormatOptions: {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n },\n } as const;\n\n if (input.amount >= 0 && input.amount <= 99) {\n options.numberFormatOptions = {\n minimumFractionDigits: 2,\n maximumFractionDigits: 6,\n };\n }\n\n return options;\n },\n 'shorthand-balance': input => {\n function getMaximumFractionDigits() {\n if (isFiatCurrencyCode(input.currencyCode)) {\n return 2;\n }\n\n return input.amount < 0.001 ? input.decimals : 4;\n }\n\n return {\n showCurrency: isFiatCurrencyCode(input.currencyCode),\n numberFormatOptions: {\n minimumFractionDigits: 2,\n maximumFractionDigits: getMaximumFractionDigits(),\n },\n };\n },\n 'pad-decimals': input => ({\n compactThreshold: Infinity,\n numberFormatOptions: {\n minimumFractionDigits: input.decimals,\n maximumFractionDigits: input.decimals,\n },\n }),\n};\n","import { isFiatCurrencyCode } from '../money';\nimport { currencyFormatterPresets } from './currency-formatter-presets';\nimport {\n CurrencyFormatterPreset,\n FormatAmountCustomOptions,\n FormatAmountInput,\n FormatAmountOptions,\n} from './currency-formatter.types';\n\ninterface CreateCurrencyFormatterParams {\n locale: string;\n onError?: (\n error: unknown,\n context: { locale: string; options: Intl.NumberFormatOptions }\n ) => void;\n}\n\nconst fallback = '';\nconst defaultCompactThreshold = 1_000_000;\nconst thinSpace = '\\u2009';\nconst defaultCustomOptions = {\n compactThreshold: defaultCompactThreshold,\n showCurrency: true,\n approximateDust: true,\n};\n\nexport function createCurrencyFormatter({ locale, onError }: CreateCurrencyFormatterParams) {\n function safeInitializeNumberFormat(locale: string, options: Intl.NumberFormatOptions) {\n try {\n return new Intl.NumberFormat(locale, options);\n } catch (e) {\n onError?.(e, { locale, options });\n return null;\n }\n }\n\n function formatAmount(input: FormatAmountInput, options: FormatAmountOptions = {}) {\n return formatAmountWithMeta(input, options).result;\n }\n\n function formatAmountWithMeta(input: FormatAmountInput, options: FormatAmountOptions = {}) {\n const { amount, currencyCode, decimals } = input;\n const { preset, numberFormatOptions = {}, ...customOptions } = options;\n const { numberFormatOptions: presetNumberFormatOptions = {}, ...presetCustomOptions } =\n getPresetResult(preset, input);\n const { compactThreshold, showCurrency, approximateDust } = mergeCustomOptions(\n presetCustomOptions,\n customOptions\n );\n const shouldCompact = evaluateCompactNotation(compactThreshold, amount);\n const isFiatCurrency = isFiatCurrencyCode(currencyCode);\n const isDust = isFiatCurrency && isSmallerThanMinorUnit(amount, decimals);\n const { minimumFractionDigits, maximumFractionDigits } = deriveFractionOptions(\n amount,\n decimals,\n shouldCompact,\n presetNumberFormatOptions,\n numberFormatOptions\n );\n const formatterOptions: Intl.NumberFormatOptions = {\n minimumFractionDigits,\n maximumFractionDigits,\n ...(shouldCompact && { notation: 'compact' }),\n ...omitFractionOptions(presetNumberFormatOptions),\n ...omitFractionOptions(numberFormatOptions),\n };\n\n if (isFiatCurrency && showCurrency) {\n formatterOptions.style = 'currency';\n formatterOptions.currency = currencyCode;\n } else {\n formatterOptions.style = 'decimal';\n }\n\n const formatter = safeInitializeNumberFormat(locale, formatterOptions);\n\n if (!formatter)\n return {\n valid: false,\n result: fallback,\n parts: [],\n resolvedOptions: {},\n };\n\n let result: string;\n\n if (isDust && approximateDust) {\n const smallestUnit = getSmallestUnit(decimals);\n const multiplier = amount < 0 ? -1 : 1;\n result = `<${thinSpace}${formatter.format(smallestUnit * multiplier)}`;\n } else {\n result = formatter.format(amount);\n }\n\n if (!isFiatCurrency && showCurrency) {\n result += `\\u00A0${currencyCode}`;\n }\n\n return {\n valid: true,\n result,\n parts: buildParts({\n formatter,\n amount,\n isDust,\n approximateDust,\n decimals,\n currencyCode,\n isFiatCurrency,\n showCurrency,\n }),\n resolvedOptions: formatter.resolvedOptions(),\n };\n }\n\n function formatPercentage(amount: number, decimals = 2) {\n const formatter = safeInitializeNumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n\n if (!formatter) return fallback;\n\n return formatter.format(amount);\n }\n\n return {\n formatAmount,\n formatAmountWithMeta,\n formatPercentage,\n };\n}\n\nexport { type FormatAmountOptions };\n\n// -----------------------------------------------------------------------------\n//\n// Helpers\n//\n// -----------------------------------------------------------------------------\n// Amend NumberFormat's formatToParts with crypto and approximate dust display\nfunction buildParts({\n formatter,\n amount,\n isDust,\n approximateDust,\n decimals,\n currencyCode,\n isFiatCurrency,\n showCurrency,\n}: {\n formatter: Intl.NumberFormat;\n amount: number;\n isDust: boolean;\n approximateDust: boolean;\n decimals: number;\n currencyCode: string;\n isFiatCurrency: boolean;\n showCurrency: boolean;\n}): Intl.NumberFormatPart[] {\n if (typeof formatter.formatToParts !== 'function') return [];\n\n const baseAmount =\n isDust && approximateDust ? getSmallestUnit(decimals) * (amount < 0 ? -1 : 1) : amount;\n\n const parts = formatter.formatToParts(baseAmount);\n\n if (isDust && approximateDust) {\n parts.unshift({ type: 'unknown', value: '<' }, { type: 'literal', value: thinSpace });\n }\n\n if (!isFiatCurrency && showCurrency) {\n parts.push({ type: 'literal', value: '\\u00A0' }, { type: 'currency', value: currencyCode });\n }\n\n return parts;\n}\n\nfunction getPresetResult(preset: CurrencyFormatterPreset | undefined, input: FormatAmountInput) {\n if (!preset) return {};\n\n if (typeof currencyFormatterPresets[preset] === 'function') {\n return currencyFormatterPresets[preset](input);\n }\n\n return currencyFormatterPresets[preset];\n}\n\nfunction mergeCustomOptions(\n presetCustomOptions: FormatAmountCustomOptions,\n customOptions: FormatAmountCustomOptions\n) {\n return {\n ...defaultCustomOptions,\n ...presetCustomOptions,\n ...customOptions,\n };\n}\n\nfunction evaluateCompactNotation(compactThreshold: number, amount: number) {\n return Math.abs(amount) >= compactThreshold;\n}\n\nfunction getSmallestUnit(decimals: number) {\n return 1 / 10 ** decimals;\n}\n\nfunction isSmallerThanMinorUnit(value: number, decimals: number): boolean {\n if (value === 0) return false;\n const unit = 1 / 10 ** decimals;\n return Math.abs(value) < unit;\n}\n\nfunction omitFractionOptions(options: Intl.NumberFormatOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { minimumFractionDigits, maximumFractionDigits, ...rest } = options;\n return rest;\n}\n\nfunction deriveFractionOptions(\n amount: number,\n decimals: number,\n compact: boolean,\n presetNumberFormatOptions: Intl.NumberFormatOptions,\n numberFormatOptions: Intl.NumberFormatOptions\n) {\n const defaultMinimumFractionDigits = 2;\n\n function getMaximumFractionDigits() {\n if (compact && !numberFormatOptions.maximumFractionDigits) {\n return defaultMinimumFractionDigits;\n }\n\n if (\n !presetNumberFormatOptions.maximumFractionDigits &&\n !numberFormatOptions.maximumFractionDigits\n ) {\n if (amount >= 1000 && amount <= 999999) {\n return Math.min(decimals, defaultMinimumFractionDigits);\n }\n }\n\n return (\n numberFormatOptions.maximumFractionDigits ??\n presetNumberFormatOptions.maximumFractionDigits ??\n decimals\n );\n }\n\n const maximumFractionDigits = getMaximumFractionDigits();\n // Ensure final minimumFractionDigits <= maximumFractionDigits to avoid Intl.NumberFormat RangeError\n const minimumFractionDigits = Math.min(\n numberFormatOptions.minimumFractionDigits ??\n presetNumberFormatOptions.minimumFractionDigits ??\n defaultMinimumFractionDigits,\n maximumFractionDigits\n );\n\n return {\n maximumFractionDigits,\n minimumFractionDigits,\n };\n}\n","type ObjectValue = string | number | boolean | null | NestedObject | ObjectValue[];\ninterface NestedObject {\n [key: string]: ObjectValue;\n}\n\ninterface FlattenedObject {\n [key: string]: string | number | boolean | null;\n}\n\n/**\n * Flattens a nested object or array into a flat object with dot-notation key paths.\n *\n * @param input - The object or array to flatten\n * @param prefix - Internal parameter for recursion, represents the current key path\n * @returns A flat object where keys represent the path to the original nested value\n *\n * @example\n * ```typescript\n * // Object example\n * flattenObject({ layer1: { layer2: 'value' } })\n * // Returns: { 'layer1.layer2': 'value' }\n *\n * // Array example\n * flattenObject([{ key: 'value' }])\n * // Returns: { '[0].key': 'value' }\n *\n * // Mixed example\n * flattenObject({ users: [{ name: 'John', age: 30 }] })\n * // Returns: { 'users[0].name': 'John', 'users[0].age': 30 }\n * ```\n */\nexport function flattenObject(input: ObjectValue, prefix = ''): FlattenedObject {\n const result: FlattenedObject = {};\n\n if (input === null || typeof input !== 'object') {\n if (prefix === '') return { value: input };\n return { [prefix]: input };\n }\n\n if (Array.isArray(input)) {\n input.forEach((item, index) => {\n const key = prefix === '' ? `[${index}]` : `${prefix}[${index}]`;\n const flattened = flattenObject(item, key);\n Object.assign(result, flattened);\n });\n } else {\n Object.entries(input).forEach(([key, value]) => {\n const newKey = prefix === '' ? key : `${prefix}.${key}`;\n const flattened = flattenObject(value, newKey);\n Object.assign(result, flattened);\n });\n }\n\n return result;\n}\n","// A minus sign is a wider character than a hyphen, and should be used in\n// numerical contexts\nexport const minusSign = '−';\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","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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\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","CryptoAssetProtocols","CryptoAssetProtocols","BigNumber","currencyDecimalsMap","currencyDecimalsMap","BigNumber","locale","BigNumber"]}
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.48.3",
5
+ "version": "0.49.0",
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/constants": "0.27.5",
23
- "@leather.io/models": "0.48.0"
22
+ "@leather.io/constants": "0.28.0",
23
+ "@leather.io/models": "0.49.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/dompurify": "3.0.5",
@@ -4,22 +4,13 @@ import {
4
4
  CryptoAssetProtocol,
5
5
  CryptoAssetProtocols,
6
6
  Sip9Asset,
7
- isSip9Asset,
8
7
  } from '@leather.io/models';
9
8
 
10
9
  import { assertUnreachable } from '../index';
11
10
 
12
11
  export function matchesAssetId(asset: CryptoAsset, assetId: CryptoAssetId) {
13
- const protocol = getAssetId(asset).protocol;
14
- const id = getAssetId(asset).id;
15
- if (isSip9Asset(asset)) {
16
- return (
17
- protocol === assetId.protocol &&
18
- assetId.id === asset.assetId &&
19
- assetId.tokenId === asset.tokenId
20
- );
21
- }
22
- return protocol === assetId.protocol && id === assetId.id;
12
+ const assetIdentifier = getAssetId(asset);
13
+ return isSameAssetId(assetIdentifier, assetId);
23
14
  }
24
15
 
25
16
  export function isSameAssetId(assetId1: CryptoAssetId, assetId2: CryptoAssetId) {
@@ -87,10 +78,19 @@ export function getAssetId(asset: CryptoAsset): CryptoAssetId {
87
78
  export function createSip9AssetId(asset: Sip9Asset): CryptoAssetId {
88
79
  return {
89
80
  protocol: asset.protocol,
90
- id: `${asset.assetId}|${asset.tokenId}`,
81
+ id: formatSip9IdField(asset),
91
82
  };
92
83
  }
93
84
 
85
+ export function formatSip9IdField(asset: Sip9Asset) {
86
+ return `${asset.assetId}|${asset.tokenId}`;
87
+ }
88
+
89
+ export function parseSip9IdField(id: string) {
90
+ const [assetId, tokenId] = id.split('|');
91
+ return { assetId, tokenId: Number(tokenId) };
92
+ }
93
+
94
94
  export type SerializedCryptoAssetId = `${string}|${string}`;
95
95
 
96
96
  export function serializeAssetId(assetId: CryptoAssetId): SerializedCryptoAssetId {
@@ -98,7 +98,8 @@ export function serializeAssetId(assetId: CryptoAssetId): SerializedCryptoAssetI
98
98
  }
99
99
 
100
100
  export function deserializeAssetId(serializedAssetId: SerializedCryptoAssetId): CryptoAssetId {
101
- const [protocol, id, tokenId] = serializedAssetId.split('|');
101
+ const [protocol, ...idParts] = serializedAssetId.split('|');
102
+ const id = idParts.join('|');
102
103
  if (!Object.keys(CryptoAssetProtocols).includes(protocol)) {
103
104
  throw new Error(`Unrecognized Asset Protocol: ${protocol}`);
104
105
  }
@@ -106,6 +107,5 @@ export function deserializeAssetId(serializedAssetId: SerializedCryptoAssetId):
106
107
  return {
107
108
  protocol: protocol as CryptoAssetProtocol,
108
109
  id,
109
- tokenId: tokenId ? parseInt(tokenId, 10) : undefined,
110
110
  };
111
111
  }
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ export * from './time';
17
17
  export * from './market-data';
18
18
  export * from './currency-formatter/currency-formatter';
19
19
  export * from './flatten-object';
20
+ export * from './special-char';
20
21
 
21
22
  export { spamFilter } from './spam-filter/spam-filter';
22
23
  export { extractPhraseFromString } from './extract-phrase-from-string/extract-phrase-from-string';
@@ -0,0 +1,3 @@
1
+ // A minus sign is a wider character than a hyphen, and should be used in
2
+ // numerical contexts
3
+ export const minusSign = '−';
@@ -0,0 +1,11 @@
1
+ import { describe, expect, test } from 'vitest';
2
+
3
+ import { minusSign } from './special-char';
4
+
5
+ describe('minusSign', () => {
6
+ test('should be the Unicode minus sign character (U+2212)', () => {
7
+ expect(minusSign).toBe('−');
8
+ expect(minusSign.charCodeAt(0)).toBe(0x2212);
9
+ expect(minusSign).not.toBe('-');
10
+ });
11
+ });
package/src/swap.ts ADDED
@@ -0,0 +1,14 @@
1
+ import BigNumber from 'bignumber.js';
2
+
3
+ import type { Money } from '@leather.io/models';
4
+
5
+ import { createMoney } from './money';
6
+
7
+ export function calculateMinToReceiveAmount(quoteAmount: Money, slippage: number): Money {
8
+ const minReceiveAmount = quoteAmount.amount.times(BigNumber(1).minus(slippage));
9
+ return createMoney(
10
+ minReceiveAmount.integerValue(BigNumber.ROUND_DOWN),
11
+ quoteAmount.symbol,
12
+ quoteAmount.decimals
13
+ );
14
+ }