@velora-dex/widget 0.10.1 → 0.10.2-dev.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.
Files changed (80) hide show
  1. package/dist/components/widget/NetworkIcon/NetworkIconSquare.js +23 -23
  2. package/dist/core/Updaters.d.ts.map +1 -1
  3. package/dist/core/Updaters.js +11 -11
  4. package/dist/core/Updaters.js.map +1 -1
  5. package/dist/core/across/isCrosschainPossible.js +4 -4
  6. package/dist/core/inputs/state/selectedTokenActionsAtom.js +32 -32
  7. package/dist/core/inputs/state/setTokenByAddressAtom.d.ts.map +1 -1
  8. package/dist/core/inputs/state/setTokenByAddressAtom.js +69 -67
  9. package/dist/core/inputs/state/setTokenByAddressAtom.js.map +1 -1
  10. package/dist/core/limit/state/selectedTokenActionsAtom.js +29 -29
  11. package/dist/core/limit/state/selectedTokenAtom.js +5 -5
  12. package/dist/core/state/configAtom.js +2 -2
  13. package/dist/core/state/configAtom.js.map +1 -1
  14. package/dist/core/state/tokenListsAtom.d.ts +2 -0
  15. package/dist/core/state/tokenListsAtom.d.ts.map +1 -0
  16. package/dist/core/state/tokenListsAtom.js +9 -0
  17. package/dist/core/state/tokenListsAtom.js.map +1 -0
  18. package/dist/core/twap/state/selectedTokenActionsAtom.js +29 -29
  19. package/dist/hooks/tokens/data/useCombineTokensWithFetched.js +4 -4
  20. package/dist/hooks/useSDK.d.ts +3 -1
  21. package/dist/hooks/useSDK.d.ts.map +1 -1
  22. package/dist/hooks/useSDK.js.map +1 -1
  23. package/dist/lib/constants/urls.d.ts +1 -0
  24. package/dist/lib/constants/urls.d.ts.map +1 -1
  25. package/dist/lib/constants/urls.js +1 -1
  26. package/dist/lib/constants/urls.js.map +1 -1
  27. package/dist/lib/utils/index.js +15 -23
  28. package/dist/lib/utils/index.js.map +1 -1
  29. package/dist/tokens/lists/constants.d.ts +0 -8
  30. package/dist/tokens/lists/constants.d.ts.map +1 -1
  31. package/dist/tokens/lists/constants.js +3 -10
  32. package/dist/tokens/lists/constants.js.map +1 -1
  33. package/dist/tokens/lists/download.d.ts +1 -1
  34. package/dist/tokens/lists/download.d.ts.map +1 -1
  35. package/dist/tokens/lists/download.js +5 -13
  36. package/dist/tokens/lists/download.js.map +1 -1
  37. package/dist/tokens/lists/state/effects.d.ts.map +1 -1
  38. package/dist/tokens/lists/state/effects.js +22 -21
  39. package/dist/tokens/lists/state/effects.js.map +1 -1
  40. package/dist/tokens/lists/state/tokenListsStateAtom.d.ts +1 -1
  41. package/dist/tokens/lists/state/tokenListsStateAtom.d.ts.map +1 -1
  42. package/dist/tokens/lists/state/tokenListsStateAtom.js +17 -21
  43. package/dist/tokens/lists/state/tokenListsStateAtom.js.map +1 -1
  44. package/dist/tokens/lists/utils.d.ts +1 -2
  45. package/dist/tokens/lists/utils.d.ts.map +1 -1
  46. package/dist/tokens/lists/utils.js +5 -6
  47. package/dist/tokens/lists/utils.js.map +1 -1
  48. package/dist/tokens/queries.d.ts.map +1 -1
  49. package/dist/tokens/queries.js +30 -32
  50. package/dist/tokens/queries.js.map +1 -1
  51. package/dist/tokens/stabeCoins/hooks.d.ts +2 -4
  52. package/dist/tokens/stabeCoins/hooks.d.ts.map +1 -1
  53. package/dist/tokens/stabeCoins/hooks.js +14 -16
  54. package/dist/tokens/stabeCoins/hooks.js.map +1 -1
  55. package/dist/tokens/state/addImportedTokenAtom.d.ts +0 -1
  56. package/dist/tokens/state/addImportedTokenAtom.d.ts.map +1 -1
  57. package/dist/tokens/state/addImportedTokenAtom.js.map +1 -1
  58. package/dist/tokens/state/allTokensByChainAtom.d.ts.map +1 -1
  59. package/dist/tokens/state/allTokensByChainAtom.js +20 -30
  60. package/dist/tokens/state/allTokensByChainAtom.js.map +1 -1
  61. package/dist/tokens/state/apiTokensAtom.d.ts +24 -0
  62. package/dist/tokens/state/apiTokensAtom.d.ts.map +1 -0
  63. package/dist/tokens/state/apiTokensAtom.js +53 -0
  64. package/dist/tokens/state/apiTokensAtom.js.map +1 -0
  65. package/dist/tokens/state/fromListsAtom.js +1 -1
  66. package/dist/tokens/state/fromListsAtom.js.map +1 -1
  67. package/dist/tokens/types.d.ts +0 -1
  68. package/dist/tokens/types.d.ts.map +1 -1
  69. package/package.json +2 -2
  70. package/dist/tokens/lists/lists.js +0 -6
  71. package/dist/tokens/lists/lists.js.map +0 -1
  72. package/dist/tokens/lists/lists.json.d.ts +0 -362
  73. package/dist/tokens/stabeCoins/index.d.ts +0 -2
  74. package/dist/tokens/stabeCoins/index.d.ts.map +0 -1
  75. package/dist/tokens/stabeCoins/index.js +0 -6
  76. package/dist/tokens/stabeCoins/index.js.map +0 -1
  77. package/dist/tokens/utils/sets.d.ts +0 -4
  78. package/dist/tokens/utils/sets.d.ts.map +0 -1
  79. package/dist/tokens/utils/sets.js +0 -16
  80. package/dist/tokens/utils/sets.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../../src/lib/constants/urls.ts"],"names":[],"mappings":"AAOA,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAIvC"}
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../../src/lib/constants/urls.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,2BAA2B,CAAC;AAIrD,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAIvC"}
@@ -15,6 +15,6 @@ function s() {
15
15
  return n || i;
16
16
  }
17
17
  //#endregion
18
- export { o as getApiProxyURL, a as getApiURL, s as getExplorerURL };
18
+ export { n as PROD_API_URL, o as getApiProxyURL, a as getApiURL, s as getExplorerURL };
19
19
 
20
20
  //# sourceMappingURL=urls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","names":["jotaiStore","devURLsAtom","PROD_API_URL","PROD_PROXY_API_URL","PROD_EXPLORER_URL","getApiURL","apiURL","get","getApiProxyURL","apiProxyURL","getExplorerURL","explorerURL"],"sources":["../../../src/lib/constants/urls.ts"],"sourcesContent":["import { jotaiStore } from \"@/core/store\";\nimport { devURLsAtom } from \"@/core/state/configAtom\";\n\nconst PROD_API_URL = \"https://api.velora.xyz\";\nconst PROD_PROXY_API_URL = \"https://proxy.paraswap.io\";\nconst PROD_EXPLORER_URL = \"https://explorer.velora.xyz\";\n\nexport function getApiURL(): string {\n const { apiURL } = jotaiStore.get(devURLsAtom);\n if (apiURL) return apiURL;\n\n return PROD_API_URL;\n}\n\nexport function getApiProxyURL(): string {\n const { apiProxyURL } = jotaiStore.get(devURLsAtom);\n if (apiProxyURL) return apiProxyURL;\n\n return PROD_PROXY_API_URL;\n}\n\nexport function getExplorerURL(): string {\n const { explorerURL } = jotaiStore.get(devURLsAtom);\n if (explorerURL) return explorerURL;\n return PROD_EXPLORER_URL;\n}\n"],"mappings":";;;AAGA,IAAME,IAAe,0BACfC,IAAqB,6BACrBC,IAAoB;AAE1B,SAAgBC,IAAoB;CAClC,IAAM,EAAEC,cAAWN,EAAWO,IAAIN,EAAY;CAG9C,OAFIK,KAEGJ;;AAGT,SAAgBM,IAAyB;CACvC,IAAM,EAAEC,mBAAgBT,EAAWO,IAAIN,EAAY;CAGnD,OAFIQ,KAEGN;;AAGT,SAAgBO,IAAyB;CACvC,IAAM,EAAEC,mBAAgBX,EAAWO,IAAIN,EAAY;CAEnD,OADIU,KACGP"}
1
+ {"version":3,"file":"urls.js","names":["jotaiStore","devURLsAtom","PROD_API_URL","PROD_PROXY_API_URL","PROD_EXPLORER_URL","getApiURL","apiURL","get","getApiProxyURL","apiProxyURL","getExplorerURL","explorerURL"],"sources":["../../../src/lib/constants/urls.ts"],"sourcesContent":["import { jotaiStore } from \"@/core/store\";\nimport { devURLsAtom } from \"@/core/state/configAtom\";\n\nexport const PROD_API_URL = \"https://api.velora.xyz\";\nconst PROD_PROXY_API_URL = \"https://proxy.paraswap.io\";\nconst PROD_EXPLORER_URL = \"https://explorer.velora.xyz\";\n\nexport function getApiURL(): string {\n const { apiURL } = jotaiStore.get(devURLsAtom);\n if (apiURL) return apiURL;\n\n return PROD_API_URL;\n}\n\nexport function getApiProxyURL(): string {\n const { apiProxyURL } = jotaiStore.get(devURLsAtom);\n if (apiProxyURL) return apiProxyURL;\n\n return PROD_PROXY_API_URL;\n}\n\nexport function getExplorerURL(): string {\n const { explorerURL } = jotaiStore.get(devURLsAtom);\n if (explorerURL) return explorerURL;\n return PROD_EXPLORER_URL;\n}\n"],"mappings":";;;AAGA,IAAaE,IAAe,0BACtBC,IAAqB,6BACrBC,IAAoB;AAE1B,SAAgBC,IAAoB;CAClC,IAAM,EAAEC,cAAWN,EAAWO,IAAIN,EAAY;CAG9C,OAFIK,KAEGJ;;AAGT,SAAgBM,IAAyB;CACvC,IAAM,EAAEC,mBAAgBT,EAAWO,IAAIN,EAAY;CAGnD,OAFIQ,KAEGN;;AAGT,SAAgBO,IAAyB;CACvC,IAAM,EAAEC,mBAAgBX,EAAWO,IAAIN,EAAY;CAEnD,OADIU,KACGP"}
@@ -20,60 +20,52 @@ function a(...e) {
20
20
  }
21
21
  return t;
22
22
  }
23
- function o(e, t) {
24
- if (e.length <= 1) return e;
25
- let n = /* @__PURE__ */ new Set();
26
- return e.filter((e) => {
27
- let r = t(e);
28
- return r.some((e) => n.has(e)) ? !1 : (r.forEach((e) => n.add(e)), !0);
29
- });
30
- }
31
- var s = (e) => !!e;
32
- function c(e) {
23
+ var o = (e) => !!e;
24
+ function s(e) {
33
25
  return e[1] !== null && e[1] !== void 0;
34
26
  }
35
- function l(e, t) {
36
- n(s(e[t]), `${String(t)} is required`);
27
+ function c(e, t) {
28
+ n(o(e[t]), `${String(t)} is required`);
37
29
  }
38
- function u(e) {
30
+ function l(e) {
39
31
  return e.length === 42;
40
32
  }
41
- var d = ({ address: e }) => u(e), f = (e, t) => e.toLowerCase().includes(t.toLowerCase()), p = (e, t, n = 0) => {
33
+ var u = ({ address: e }) => l(e), d = (e, t) => e.toLowerCase().includes(t.toLowerCase()), f = (e, t, n = 0) => {
42
34
  let r = RegExp(`(.{${t}}).{3,}(.{${n}})`);
43
35
  return e.replace(r, "$1...$2");
44
36
  };
45
- function m(e, t = 6, n = 4) {
46
- return p(e, t, n);
37
+ function p(e, t = 6, n = 4) {
38
+ return f(e, t, n);
47
39
  }
48
- function h(e) {
40
+ function m(e) {
49
41
  return e.replace(/_/g, " ");
50
42
  }
51
- function g(e) {
43
+ function h(e) {
52
44
  try {
53
45
  return new URL(e), !0;
54
46
  } catch {
55
47
  return !1;
56
48
  }
57
49
  }
58
- function _(e, t) {
50
+ function g(e, t) {
59
51
  if (e.length !== t.length) return !1;
60
52
  let n = new Set(e);
61
53
  for (let e of t) if (!n.has(e)) return !1;
62
54
  return !0;
63
55
  }
64
- function v(e) {
56
+ function _(e) {
65
57
  return (t, n) => e.every((e) => t[e] === n[e]);
66
58
  }
67
- function y(e, t) {
59
+ function v(e, t) {
68
60
  if (e === t) return !0;
69
61
  if (typeof e != "object" || typeof t != "object" || !e || !t) return !1;
70
62
  let n = Object.keys(e), r = Object.keys(t);
71
63
  return n.length === r.length ? n.every((n) => Object.prototype.hasOwnProperty.call(t, n) && e[n] === t[n]) : !1;
72
64
  }
73
- function b(e, t, n) {
65
+ function y(e, t, n) {
74
66
  return Math.min(Math.max(e, t), n);
75
67
  }
76
68
  //#endregion
77
- export { l as assertProp, r as cn, a as concatClassNamesMaps, v as constructPropertiesEqual, d as filterInvalidTokenAddress, o as filterUnique, i as gatherObjectsByProp, b as getNumberWithinRange, c as isNonNullableEntry, s as isTruthy, g as isValidUrl, h as replaceUnderscoresWithSpaces, y as shallowEqual, m as shortenAddress, f as stringIncludes, _ as unorderedShallowEqual };
69
+ export { c as assertProp, r as cn, a as concatClassNamesMaps, _ as constructPropertiesEqual, u as filterInvalidTokenAddress, i as gatherObjectsByProp, y as getNumberWithinRange, s as isNonNullableEntry, o as isTruthy, h as isValidUrl, m as replaceUnderscoresWithSpaces, v as shallowEqual, p as shortenAddress, d as stringIncludes, g as unorderedShallowEqual };
78
70
 
79
71
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Token","clsx","ClassValue","twMerge","assert","Prettify","cn","inputs","gatherObjectsByProp","elements","T","pickProp","elem","Record","transform","accumElem","U","reduce","accum","element","key","transformedElement","RemoveNullableElements","Head","Tail","MergeRecordsWithStrings","R1","R2","K","ConcatString","_ConcatString","Parts","Delim","RecordOfStrings","_MergeNStrings","Tuple","Result","MergeNStrings","MergeWithoutNullable","concatClassNamesMaps","maps","length","gathered","map","value","undefined","filterUnique","constructUniqueKeys","hasSeen","Set","filter","keys","some","has","forEach","add","isTruthy","x","isNonNullableEntry","entry","ReturnIfTruthy","assertProp","obj","prop","P","String","hasCorrectAddressLength","maybeAddress","filterInvalidTokenAddress","address","Pick","stringIncludes","a","b","toLowerCase","includes","shortenText","str","start","end","regexp","RegExp","replace","shortenAddress","slashIndex","rightCutLength","replaceUnderscoresWithSpaces","isValidUrl","url","URL","unorderedShallowEqual","setA","item","constructPropertiesEqual","properties","Partial","every","shallowEqual","aKeys","Object","bKeys","prototype","hasOwnProperty","call","getNumberWithinRange","num","min","max","Math"],"sources":["../../../src/lib/utils/index.ts"],"sourcesContent":["import type { Token } from \"@/tokens/state/types\";\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { assert, type Prettify } from \"ts-essentials\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// reduce element[] to Object{key: prop, val?: element}\n// for example\n// gatherObjectsByProp(Token[], token => token.address) => Record<address, Token|undefined>\nexport function gatherObjectsByProp<T>(\n elements: T[],\n pickProp: (elem: T) => string\n): Record<string, T>;\nexport function gatherObjectsByProp<T, U>(\n elements: T[],\n pickProp: (elem: T) => string,\n transform: (elem: T, accumElem?: U) => U\n): Record<string, U>;\nexport function gatherObjectsByProp<T, U>(\n elements: T[],\n pickProp: (elem: T) => string,\n transform?: (elem: T, accumElem?: U) => U\n): Record<string, T> | Record<string, U> {\n return elements.reduce<Record<string, T> | Record<string, U>>(\n (accum, element) => {\n const key = pickProp(element);\n\n const accumElem: T | U | undefined = accum[key];\n const transformedElement = transform\n ? // if transform is available, can only be U | undefined\n transform(element, accumElem as U | undefined)\n : element;\n\n accum[key] = transformedElement;\n\n return accum;\n },\n {}\n );\n}\n\ntype RemoveNullableElements<T extends readonly unknown[]> = T extends readonly [\n infer Head,\n ...infer Tail,\n]\n ? Head extends undefined | null\n ? RemoveNullableElements<Tail>\n : [Head, ...RemoveNullableElements<Tail>]\n : [];\n\ntype MergeRecordsWithStrings<\n R1 extends Record<string, string>,\n R2 extends Record<string, string>,\n> = {\n [K in keyof R1 | keyof R2]: K extends keyof R1\n ? K extends keyof R2\n ? ConcatString<\" \", [R1[K], R2[K]]>\n : R1[K]\n : K extends keyof R2\n ? R2[K]\n : never;\n};\n\ntype _ConcatString<\n Delim extends string,\n Parts extends readonly string[],\n> = Parts extends readonly []\n ? \"\"\n : Parts extends readonly [\n infer Head extends string,\n ...infer Tail extends readonly string[],\n ]\n ? Tail extends readonly []\n ? Head\n : `${Head}${Delim}${_ConcatString<Delim, Tail>}`\n : never;\n\nexport type ConcatString<\n Delim extends string = \"\",\n Parts extends readonly string[] = [],\n> = _ConcatString<Delim, Parts>;\n\ntype RecordOfStrings = Record<string, string>;\n\ntype _MergeNStrings<\n Tuple extends readonly RecordOfStrings[],\n Result extends RecordOfStrings,\n> = Tuple extends readonly [\n infer Head extends RecordOfStrings,\n ...infer Tail extends readonly RecordOfStrings[],\n]\n ? _MergeNStrings<Tail, MergeRecordsWithStrings<Result, Head>>\n : Result;\ntype MergeNStrings<Tuple extends readonly RecordOfStrings[]> = _MergeNStrings<\n Tuple,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n {}\n>;\n\ntype MergeWithoutNullable<\n Tuple extends readonly (RecordOfStrings | undefined | null)[],\n> = MergeNStrings<RemoveNullableElements<Tuple>>;\n\nexport function concatClassNamesMaps<\n T extends readonly (RecordOfStrings | undefined | null)[],\n>(...maps: T): Prettify<MergeWithoutNullable<T>> {\n if (maps.length <= 1)\n return (maps[0] || {}) as Prettify<MergeWithoutNullable<T>>;\n\n const gathered: Record<string, string> = {};\n\n for (const map of maps) {\n if (!map) continue;\n\n for (const key in map) {\n const value = map[key];\n if (value !== undefined) {\n gathered[key] = cn(gathered[key], value);\n }\n }\n }\n\n return gathered as Prettify<MergeWithoutNullable<T>>;\n}\n\nexport function filterUnique<T, U>(\n elements: T[],\n // supports multikey filtering, if only one key required return [U]\n constructUniqueKeys: (element: T) => U[]\n): T[] {\n if (elements.length <= 1) return elements;\n const hasSeen = new Set<U>();\n\n return elements.filter((element) => {\n const keys = constructUniqueKeys(element);\n if (keys.some((key) => hasSeen.has(key))) return false;\n\n keys.forEach((key) => hasSeen.add(key));\n return true;\n });\n}\n\nexport const isTruthy = <T>(\n x: T | false | 0 | 0n | \"\" | null | undefined\n): x is T => !!x;\n\nexport function isNonNullableEntry<T>(\n entry: [key: string, value: T | null | undefined]\n): entry is [string, T] {\n return entry[1] !== null && entry[1] !== undefined;\n}\n\ntype ReturnIfTruthy<T> = typeof isTruthy<T>;\n\nexport function assertProp<\n T extends Record<string, unknown>,\n K extends keyof T,\n>(obj: T, prop: K): asserts obj is T & { [P in K]-?: ReturnIfTruthy<T[P]> } {\n assert(isTruthy(obj[prop]), `${String(prop)} is required`);\n}\n\nexport function hasCorrectAddressLength(maybeAddress: string): boolean {\n return maybeAddress.length === 42;\n}\n\nexport const filterInvalidTokenAddress = ({\n address,\n}: Pick<Token, \"address\">) => hasCorrectAddressLength(address);\n\nexport const stringIncludes = (a: string, b: string): boolean => {\n return a.toLowerCase().includes(b.toLowerCase());\n};\n\n/**\n * Shorten any string with more than 6 characters (included) by inserting ellipsis placeholder in between\n *\n * @param {string} str the string to shorten\n * @param {number} start how much to leave off the start\n * @param {number} [end=0] how much to leave off the end\n * @returns {string} shortened text\n */\nexport const shortenText = (\n str: string,\n start: number,\n end: number = 0\n): string => {\n const regexp = new RegExp(`(.{${start}}).{3,}(.{${end}})`);\n return str.replace(regexp, \"$1...$2\");\n};\n\nexport function shortenAddress(\n address: string,\n slashIndex = 6,\n rightCutLength = 4\n): string {\n // An ethereum address has 42 characters\n return shortenText(address, slashIndex, rightCutLength);\n}\n\nexport function replaceUnderscoresWithSpaces(str: string): string {\n return str.replace(/_/g, \" \");\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function unorderedShallowEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return false;\n const setA = new Set(a);\n for (const item of b) {\n if (!setA.has(item)) return false;\n }\n return true;\n}\n\nexport function constructPropertiesEqual<K extends string>(\n properties: readonly K[]\n): (a: Partial<Record<K, unknown>>, b: Partial<Record<K, unknown>>) => boolean {\n return (a, b) => {\n return properties.every((key) => a[key] === b[key]);\n };\n}\n\nexport function shallowEqual<T>(a: T, b: T): boolean {\n // both the same value, check would pass for primitive values\n if (a === b) {\n return true;\n }\n\n // not an object, and checks for primitive have already been made\n if (typeof a !== \"object\" || typeof b !== \"object\" || !a || !b) {\n return false;\n }\n // both objects, check if they have the same keys\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n // different number of keys\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every(\n (key) =>\n // b[key] exists, and not a[key] === undefined && b[key] doesn't exist\n Object.prototype.hasOwnProperty.call(b, key) &&\n a[key as keyof typeof a] === b[key as keyof typeof b]\n );\n}\n\nexport function getNumberWithinRange(\n num: number,\n min: number,\n max: number\n): number {\n return Math.min(Math.max(num, min), max);\n}\n"],"mappings":";;;;AAKA,SAAgBM,EAAG,GAAGC,GAAsB;CAC1C,OAAOJ,EAAQF,EAAKM,EAAO,CAAC;;AAe9B,SAAgBC,EACdC,GACAE,GACAG,GACuC;CACvC,OAAOL,EAASQ,QACbC,GAAOC,MAAY;EAClB,IAAMC,IAAMT,EAASQ,EAAQ,EAEvBJ,IAA+BG,EAAME;EAQ3C,OAFAF,EAAME,KALqBN,IAEvBA,EAAUK,GAASJ,EAA2B,GAC9CI,GAIGD;IAET,EACF,CAAC;;AAiEH,SAAgBqB,EAEd,GAAGC,GAA4C;CAC/C,IAAIA,EAAKC,UAAU,GACjB,OAAQD,EAAK,MAAM,EAAE;CAEvB,IAAME,IAAmC,EAAE;CAE3C,KAAK,IAAMC,KAAOH,GACXG,OAEL,KAAK,IAAMvB,KAAOuB,GAAK;EACrB,IAAMC,IAAQD,EAAIvB;EAClB,AAAIwB,MAAUC,KAAAA,MACZH,EAAStB,KAAOd,EAAGoC,EAAStB,IAAMwB,EAAM;;CAK9C,OAAOF;;AAGT,SAAgBI,EACdrC,GAEAsC,GACK;CACL,IAAItC,EAASgC,UAAU,GAAG,OAAOhC;CACjC,IAAMuC,oBAAU,IAAIC,KAAQ;CAE5B,OAAOxC,EAASyC,QAAQ/B,MAAY;EAClC,IAAMgC,IAAOJ,EAAoB5B,EAAQ;EAIzC,OAHIgC,EAAKC,MAAMhC,MAAQ4B,EAAQK,IAAIjC,EAAI,CAAC,GAAS,MAEjD+B,EAAKG,SAASlC,MAAQ4B,EAAQO,IAAInC,EAAI,CAAC,EAChC;GACP;;AAGJ,IAAaoC,KACXC,MACW,CAAC,CAACA;AAEf,SAAgBC,EACdC,GACsB;CACtB,OAAOA,EAAM,OAAO,QAAQA,EAAM,OAAOd,KAAAA;;AAK3C,SAAgBgB,EAGdC,GAAQC,GAAkE;CAC1E3D,EAAOoD,EAASM,EAAIC,GAAM,EAAE,GAAGE,OAAOF,EAAK,CAAA,cAAe;;AAG5D,SAAgBG,EAAwBC,GAA+B;CACrE,OAAOA,EAAa1B,WAAW;;AAGjC,IAAa2B,KAA6B,EACxCC,iBAC4BH,EAAwBG,EAAQ,EAEjDE,KAAkBC,GAAWC,MACjCD,EAAEE,aAAa,CAACC,SAASF,EAAEC,aAAa,CAAC,EAWrCE,KACXC,GACAC,GACAC,IAAc,MACH;CACX,IAAMC,IAAaC,OAAO,MAAMH,EAAK,YAAaC,EAAG,IAAK;CAC1D,OAAOF,EAAIK,QAAQF,GAAQ,UAAU;;AAGvC,SAAgBG,EACdd,GACAe,IAAa,GACbC,IAAiB,GACT;CAER,OAAOT,EAAYP,GAASe,GAAYC,EAAe;;AAGzD,SAAgBC,EAA6BT,GAAqB;CAChE,OAAOA,EAAIK,QAAQ,MAAM,IAAI;;AAG/B,SAAgBK,EAAWC,GAAsB;CAC/C,IAAI;EAEF,OADA,IAAIC,IAAID,EAAI,EACL;SACD;EACN,OAAO;;;AAIX,SAAgBE,EAAyBlB,GAAQC,GAAiB;CAChE,IAAID,EAAE/B,WAAWgC,EAAEhC,QAAQ,OAAO;CAClC,IAAMkD,IAAO,IAAI1C,IAAIuB,EAAE;CACvB,KAAK,IAAMoB,KAAQnB,GACjB,IAAI,CAACkB,EAAKtC,IAAIuC,EAAK,EAAE,OAAO;CAE9B,OAAO;;AAGT,SAAgBC,EACdC,GAC6E;CAC7E,QAAQtB,GAAGC,MACFqB,EAAWE,OAAO5E,MAAQoD,EAAEpD,OAASqD,EAAErD,GAAK;;AAIvD,SAAgB6E,EAAgBzB,GAAMC,GAAe;CAEnD,IAAID,MAAMC,GACR,OAAO;CAIT,IAAI,OAAOD,KAAM,YAAY,OAAOC,KAAM,YAAY,CAACD,KAAK,CAACC,GAC3D,OAAO;CAGT,IAAMyB,IAAQC,OAAOhD,KAAKqB,EAAE,EACtB4B,IAAQD,OAAOhD,KAAKsB,EAAE;CAK5B,OAHIyB,EAAMzD,WAAW2D,EAAM3D,SAGpByD,EAAMF,OACV5E,MAEC+E,OAAOE,UAAUC,eAAeC,KAAK9B,GAAGrD,EAAI,IAC5CoD,EAAEpD,OAA2BqD,EAAErD,GAClC,GAPQ;;AAUX,SAAgBoF,EACdC,GACAC,GACAC,GACQ;CACR,OAAOC,KAAKF,IAAIE,KAAKD,IAAIF,GAAKC,EAAI,EAAEC,EAAI"}
1
+ {"version":3,"file":"index.js","names":["Token","clsx","ClassValue","twMerge","assert","Prettify","cn","inputs","gatherObjectsByProp","elements","T","pickProp","elem","Record","transform","accumElem","U","reduce","accum","element","key","transformedElement","RemoveNullableElements","Head","Tail","MergeRecordsWithStrings","R1","R2","K","ConcatString","_ConcatString","Parts","Delim","RecordOfStrings","_MergeNStrings","Tuple","Result","MergeNStrings","MergeWithoutNullable","concatClassNamesMaps","maps","length","gathered","map","value","undefined","filterUnique","constructUniqueKeys","hasSeen","Set","filter","keys","some","has","forEach","add","isTruthy","x","isNonNullableEntry","entry","ReturnIfTruthy","assertProp","obj","prop","P","String","hasCorrectAddressLength","maybeAddress","filterInvalidTokenAddress","address","Pick","stringIncludes","a","b","toLowerCase","includes","shortenText","str","start","end","regexp","RegExp","replace","shortenAddress","slashIndex","rightCutLength","replaceUnderscoresWithSpaces","isValidUrl","url","URL","unorderedShallowEqual","setA","item","constructPropertiesEqual","properties","Partial","every","shallowEqual","aKeys","Object","bKeys","prototype","hasOwnProperty","call","getNumberWithinRange","num","min","max","Math"],"sources":["../../../src/lib/utils/index.ts"],"sourcesContent":["import type { Token } from \"@/tokens/state/types\";\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { assert, type Prettify } from \"ts-essentials\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// reduce element[] to Object{key: prop, val?: element}\n// for example\n// gatherObjectsByProp(Token[], token => token.address) => Record<address, Token|undefined>\nexport function gatherObjectsByProp<T>(\n elements: T[],\n pickProp: (elem: T) => string\n): Record<string, T>;\nexport function gatherObjectsByProp<T, U>(\n elements: T[],\n pickProp: (elem: T) => string,\n transform: (elem: T, accumElem?: U) => U\n): Record<string, U>;\nexport function gatherObjectsByProp<T, U>(\n elements: T[],\n pickProp: (elem: T) => string,\n transform?: (elem: T, accumElem?: U) => U\n): Record<string, T> | Record<string, U> {\n return elements.reduce<Record<string, T> | Record<string, U>>(\n (accum, element) => {\n const key = pickProp(element);\n\n const accumElem: T | U | undefined = accum[key];\n const transformedElement = transform\n ? // if transform is available, can only be U | undefined\n transform(element, accumElem as U | undefined)\n : element;\n\n accum[key] = transformedElement;\n\n return accum;\n },\n {}\n );\n}\n\ntype RemoveNullableElements<T extends readonly unknown[]> = T extends readonly [\n infer Head,\n ...infer Tail,\n]\n ? Head extends undefined | null\n ? RemoveNullableElements<Tail>\n : [Head, ...RemoveNullableElements<Tail>]\n : [];\n\ntype MergeRecordsWithStrings<\n R1 extends Record<string, string>,\n R2 extends Record<string, string>,\n> = {\n [K in keyof R1 | keyof R2]: K extends keyof R1\n ? K extends keyof R2\n ? ConcatString<\" \", [R1[K], R2[K]]>\n : R1[K]\n : K extends keyof R2\n ? R2[K]\n : never;\n};\n\ntype _ConcatString<\n Delim extends string,\n Parts extends readonly string[],\n> = Parts extends readonly []\n ? \"\"\n : Parts extends readonly [\n infer Head extends string,\n ...infer Tail extends readonly string[],\n ]\n ? Tail extends readonly []\n ? Head\n : `${Head}${Delim}${_ConcatString<Delim, Tail>}`\n : never;\n\nexport type ConcatString<\n Delim extends string = \"\",\n Parts extends readonly string[] = [],\n> = _ConcatString<Delim, Parts>;\n\ntype RecordOfStrings = Record<string, string>;\n\ntype _MergeNStrings<\n Tuple extends readonly RecordOfStrings[],\n Result extends RecordOfStrings,\n> = Tuple extends readonly [\n infer Head extends RecordOfStrings,\n ...infer Tail extends readonly RecordOfStrings[],\n]\n ? _MergeNStrings<Tail, MergeRecordsWithStrings<Result, Head>>\n : Result;\ntype MergeNStrings<Tuple extends readonly RecordOfStrings[]> = _MergeNStrings<\n Tuple,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n {}\n>;\n\ntype MergeWithoutNullable<\n Tuple extends readonly (RecordOfStrings | undefined | null)[],\n> = MergeNStrings<RemoveNullableElements<Tuple>>;\n\nexport function concatClassNamesMaps<\n T extends readonly (RecordOfStrings | undefined | null)[],\n>(...maps: T): Prettify<MergeWithoutNullable<T>> {\n if (maps.length <= 1)\n return (maps[0] || {}) as Prettify<MergeWithoutNullable<T>>;\n\n const gathered: Record<string, string> = {};\n\n for (const map of maps) {\n if (!map) continue;\n\n for (const key in map) {\n const value = map[key];\n if (value !== undefined) {\n gathered[key] = cn(gathered[key], value);\n }\n }\n }\n\n return gathered as Prettify<MergeWithoutNullable<T>>;\n}\n\nexport function filterUnique<T, U>(\n elements: T[],\n // supports multikey filtering, if only one key required return [U]\n constructUniqueKeys: (element: T) => U[]\n): T[] {\n if (elements.length <= 1) return elements;\n const hasSeen = new Set<U>();\n\n return elements.filter((element) => {\n const keys = constructUniqueKeys(element);\n if (keys.some((key) => hasSeen.has(key))) return false;\n\n keys.forEach((key) => hasSeen.add(key));\n return true;\n });\n}\n\nexport const isTruthy = <T>(\n x: T | false | 0 | 0n | \"\" | null | undefined\n): x is T => !!x;\n\nexport function isNonNullableEntry<T>(\n entry: [key: string, value: T | null | undefined]\n): entry is [string, T] {\n return entry[1] !== null && entry[1] !== undefined;\n}\n\ntype ReturnIfTruthy<T> = typeof isTruthy<T>;\n\nexport function assertProp<\n T extends Record<string, unknown>,\n K extends keyof T,\n>(obj: T, prop: K): asserts obj is T & { [P in K]-?: ReturnIfTruthy<T[P]> } {\n assert(isTruthy(obj[prop]), `${String(prop)} is required`);\n}\n\nexport function hasCorrectAddressLength(maybeAddress: string): boolean {\n return maybeAddress.length === 42;\n}\n\nexport const filterInvalidTokenAddress = ({\n address,\n}: Pick<Token, \"address\">) => hasCorrectAddressLength(address);\n\nexport const stringIncludes = (a: string, b: string): boolean => {\n return a.toLowerCase().includes(b.toLowerCase());\n};\n\n/**\n * Shorten any string with more than 6 characters (included) by inserting ellipsis placeholder in between\n *\n * @param {string} str the string to shorten\n * @param {number} start how much to leave off the start\n * @param {number} [end=0] how much to leave off the end\n * @returns {string} shortened text\n */\nexport const shortenText = (\n str: string,\n start: number,\n end: number = 0\n): string => {\n const regexp = new RegExp(`(.{${start}}).{3,}(.{${end}})`);\n return str.replace(regexp, \"$1...$2\");\n};\n\nexport function shortenAddress(\n address: string,\n slashIndex = 6,\n rightCutLength = 4\n): string {\n // An ethereum address has 42 characters\n return shortenText(address, slashIndex, rightCutLength);\n}\n\nexport function replaceUnderscoresWithSpaces(str: string): string {\n return str.replace(/_/g, \" \");\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function unorderedShallowEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return false;\n const setA = new Set(a);\n for (const item of b) {\n if (!setA.has(item)) return false;\n }\n return true;\n}\n\nexport function constructPropertiesEqual<K extends string>(\n properties: readonly K[]\n): (a: Partial<Record<K, unknown>>, b: Partial<Record<K, unknown>>) => boolean {\n return (a, b) => {\n return properties.every((key) => a[key] === b[key]);\n };\n}\n\nexport function shallowEqual<T>(a: T, b: T): boolean {\n // both the same value, check would pass for primitive values\n if (a === b) {\n return true;\n }\n\n // not an object, and checks for primitive have already been made\n if (typeof a !== \"object\" || typeof b !== \"object\" || !a || !b) {\n return false;\n }\n // both objects, check if they have the same keys\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n // different number of keys\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every(\n (key) =>\n // b[key] exists, and not a[key] === undefined && b[key] doesn't exist\n Object.prototype.hasOwnProperty.call(b, key) &&\n a[key as keyof typeof a] === b[key as keyof typeof b]\n );\n}\n\nexport function getNumberWithinRange(\n num: number,\n min: number,\n max: number\n): number {\n return Math.min(Math.max(num, min), max);\n}\n"],"mappings":";;;;AAKA,SAAgBM,EAAG,GAAGC,GAAsB;CAC1C,OAAOJ,EAAQF,EAAKM,EAAO,CAAC;;AAe9B,SAAgBC,EACdC,GACAE,GACAG,GACuC;CACvC,OAAOL,EAASQ,QACbC,GAAOC,MAAY;EAClB,IAAMC,IAAMT,EAASQ,EAAQ,EAEvBJ,IAA+BG,EAAME;EAQ3C,OAFAF,EAAME,KALqBN,IAEvBA,EAAUK,GAASJ,EAA2B,GAC9CI,GAIGD;IAET,EACF,CAAC;;AAiEH,SAAgBqB,EAEd,GAAGC,GAA4C;CAC/C,IAAIA,EAAKC,UAAU,GACjB,OAAQD,EAAK,MAAM,EAAE;CAEvB,IAAME,IAAmC,EAAE;CAE3C,KAAK,IAAMC,KAAOH,GACXG,OAEL,KAAK,IAAMvB,KAAOuB,GAAK;EACrB,IAAMC,IAAQD,EAAIvB;EAClB,AAAIwB,MAAUC,KAAAA,MACZH,EAAStB,KAAOd,EAAGoC,EAAStB,IAAMwB,EAAM;;CAK9C,OAAOF;;AAoBT,IAAac,KACXC,MACW,CAAC,CAACA;AAEf,SAAgBC,EACdC,GACsB;CACtB,OAAOA,EAAM,OAAO,QAAQA,EAAM,OAAOd,KAAAA;;AAK3C,SAAgBgB,EAGdC,GAAQC,GAAkE;CAC1E3D,EAAOoD,EAASM,EAAIC,GAAM,EAAE,GAAGE,OAAOF,EAAK,CAAA,cAAe;;AAG5D,SAAgBG,EAAwBC,GAA+B;CACrE,OAAOA,EAAa1B,WAAW;;AAGjC,IAAa2B,KAA6B,EACxCC,iBAC4BH,EAAwBG,EAAQ,EAEjDE,KAAkBC,GAAWC,MACjCD,EAAEE,aAAa,CAACC,SAASF,EAAEC,aAAa,CAAC,EAWrCE,KACXC,GACAC,GACAC,IAAc,MACH;CACX,IAAMC,IAAaC,OAAO,MAAMH,EAAK,YAAaC,EAAG,IAAK;CAC1D,OAAOF,EAAIK,QAAQF,GAAQ,UAAU;;AAGvC,SAAgBG,EACdd,GACAe,IAAa,GACbC,IAAiB,GACT;CAER,OAAOT,EAAYP,GAASe,GAAYC,EAAe;;AAGzD,SAAgBC,EAA6BT,GAAqB;CAChE,OAAOA,EAAIK,QAAQ,MAAM,IAAI;;AAG/B,SAAgBK,EAAWC,GAAsB;CAC/C,IAAI;EAEF,OADA,IAAIC,IAAID,EAAI,EACL;SACD;EACN,OAAO;;;AAIX,SAAgBE,EAAyBlB,GAAQC,GAAiB;CAChE,IAAID,EAAE/B,WAAWgC,EAAEhC,QAAQ,OAAO;CAClC,IAAMkD,IAAO,IAAI1C,IAAIuB,EAAE;CACvB,KAAK,IAAMoB,KAAQnB,GACjB,IAAI,CAACkB,EAAKtC,IAAIuC,EAAK,EAAE,OAAO;CAE9B,OAAO;;AAGT,SAAgBC,EACdC,GAC6E;CAC7E,QAAQtB,GAAGC,MACFqB,EAAWE,OAAO5E,MAAQoD,EAAEpD,OAASqD,EAAErD,GAAK;;AAIvD,SAAgB6E,EAAgBzB,GAAMC,GAAe;CAEnD,IAAID,MAAMC,GACR,OAAO;CAIT,IAAI,OAAOD,KAAM,YAAY,OAAOC,KAAM,YAAY,CAACD,KAAK,CAACC,GAC3D,OAAO;CAGT,IAAMyB,IAAQC,OAAOhD,KAAKqB,EAAE,EACtB4B,IAAQD,OAAOhD,KAAKsB,EAAE;CAK5B,OAHIyB,EAAMzD,WAAW2D,EAAM3D,SAGpByD,EAAMF,OACV5E,MAEC+E,OAAOE,UAAUC,eAAeC,KAAK9B,GAAGrD,EAAI,IAC5CoD,EAAEpD,OAA2BqD,EAAErD,GAClC,GAPQ;;AAUX,SAAgBoF,EACdC,GACAC,GACAC,GACQ;CACR,OAAOC,KAAKF,IAAIE,KAAKD,IAAIF,GAAKC,EAAI,EAAEC,EAAI"}
@@ -1,10 +1,2 @@
1
- import { TokenListDownloadData } from './types';
2
1
  export declare const defaultTokenLists: string[];
3
- export declare const url2TokenList: Record<string, TokenListDownloadData>;
4
- export declare const urlChain2TokenList: Record<string, TokenListDownloadData>;
5
- export declare const chainId2TokenListURLs: Record<string, {
6
- all: string[];
7
- enabled: string[];
8
- }>;
9
- export declare const FALLBACK_CDN_URL = "https://cdn.velora.xyz/web/token-lists";
10
2
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/tokens/lists/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAerD,eAAO,MAAM,iBAAiB,UAEV,CAAC;AACrB,eAAO,MAAM,aAAa,uCAGzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,uCAG9B,CAAC;AAEF,eAAO,MAAM,qBAAqB;SAEzB,MAAM,EAAE;aAAW,MAAM,EAAE;EAiBnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,2CAA2C,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/tokens/lists/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAA0B,CAAC"}
@@ -1,14 +1,7 @@
1
- import { filterUnique as e, gatherObjectsByProp as t, isValidUrl as n } from "../../lib/utils/index.js";
2
- import r from "./lists.js";
1
+ import { API_TOKENS_LIST_URL as e } from "../state/apiTokensAtom.js";
3
2
  //#region src/tokens/lists/constants.ts
4
- var i = e(r, (e) => [e.url + e.chainId, e.filename + e.chainId]), a = Array.from(new Set(i.map((e) => e.url))).filter(n), o = t(i, (e) => e.url), s = t(i, (e) => `${e.url}@${e.chainId}`), c = t(i, (e) => String(e.chainId), (e, t) => {
5
- let n = t || {
6
- all: [],
7
- enabled: []
8
- };
9
- return e.chainId === "multi" ? n : (n.all.push(e.url), e.onByDefault && n.enabled.push(e.url), n);
10
- }), l = "https://cdn.velora.xyz/web/token-lists";
3
+ var t = [e];
11
4
  //#endregion
12
- export { l as FALLBACK_CDN_URL, c as chainId2TokenListURLs, a as defaultTokenLists, o as url2TokenList, s as urlChain2TokenList };
5
+ export { t as defaultTokenLists };
13
6
 
14
7
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["filterUnique","gatherObjectsByProp","isValidUrl","TokenListDownloadData","TokenLists","UniqueTokenLists","list","url","chainId","filename","defaultTokenLists","Array","from","Set","map","filter","url2TokenList","urlChain2TokenList","chainId2TokenListURLs","all","enabled","String","accumElem","acc","push","onByDefault","FALLBACK_CDN_URL"],"sources":["../../../src/tokens/lists/constants.ts"],"sourcesContent":["import { filterUnique, gatherObjectsByProp, isValidUrl } from \"@/lib/utils\";\nimport type { TokenListDownloadData } from \"./types\";\n\nimport TokenLists from \"./lists.json\";\n\n// filter out lists with duplicate `url` or `filename` so we don't load or fallback to potentially wrong list\n// which shouldn't happen as long as we keep `lists.json` lists unique.\n\n// In UI it makes sense to skip such malformed duplicate lists, rather than hard break\nconst UniqueTokenLists: TokenListDownloadData[] = filterUnique(\n // have to cast chainId: string to \"multi\"\n TokenLists as TokenListDownloadData[],\n // account for one list being used on multiple chains\n (list) => [list.url + list.chainId, list.filename + list.chainId]\n);\n\nexport const defaultTokenLists = Array.from(\n new Set(UniqueTokenLists.map((list) => list.url)) // URLs only\n).filter(isValidUrl); // validate just in case\nexport const url2TokenList = gatherObjectsByProp<TokenListDownloadData>(\n UniqueTokenLists,\n (list) => list.url\n);\n\nexport const urlChain2TokenList = gatherObjectsByProp<TokenListDownloadData>(\n UniqueTokenLists,\n (list) => `${list.url}@${list.chainId}`\n);\n\nexport const chainId2TokenListURLs = gatherObjectsByProp<\n TokenListDownloadData,\n { all: string[]; enabled: string[] }\n>(\n UniqueTokenLists,\n (list) => String(list.chainId),\n (list, accumElem) => {\n const acc = accumElem || { all: [], enabled: [] };\n // so far only auxiliary stablecoins list is multichain\n if (list.chainId === \"multi\") return acc;\n\n acc.all.push(list.url);\n\n if (list.onByDefault) {\n acc.enabled.push(list.url);\n }\n\n return acc;\n }\n);\n\nexport const FALLBACK_CDN_URL = \"https://cdn.velora.xyz/web/token-lists\";\n"],"mappings":";;;AASA,IAAMK,IAA4CL,EAEhDI,IAECE,MAAS,CAACA,EAAKC,MAAMD,EAAKE,SAASF,EAAKG,WAAWH,EAAKE,QAC3D,CAAC,EAEYE,IAAoBC,MAAMC,KACrC,IAAIC,IAAIR,EAAiBS,KAAKR,MAASA,EAAKC,IAAI,CAAC,CAClD,CAACQ,OAAOb,EAAW,EACPc,IAAgBf,EAC3BI,IACCC,MAASA,EAAKC,IAChB,EAEYU,IAAqBhB,EAChCI,IACCC,MAAS,GAAGA,EAAKC,IAAG,GAAID,EAAKE,UAC/B,EAEYU,IAAwBjB,EAInCI,IACCC,MAASe,OAAOf,EAAKE,QAAQ,GAC7BF,GAAMgB,MAAc;CACnB,IAAMC,IAAMD,KAAa;EAAEH,KAAK,EAAE;EAAEC,SAAS,EAAA;EAAI;CAUjD,OARId,EAAKE,YAAY,UAAgBe,KAErCA,EAAIJ,IAAIK,KAAKlB,EAAKC,IAAI,EAElBD,EAAKmB,eACPF,EAAIH,QAAQI,KAAKlB,EAAKC,IAAI,EAGrBgB;EAEV,EAEYG,IAAmB"}
1
+ {"version":3,"file":"constants.js","names":["API_TOKENS_LIST_URL","defaultTokenLists"],"sources":["../../../src/tokens/lists/constants.ts"],"sourcesContent":["// Default tokens now come from the Velora API (getAllTokens), which the API serves\n// at this endpoint. Exposed publicly via `defaults.tokenLists`.\n\nimport { API_TOKENS_LIST_URL } from \"../state/apiTokensAtom\";\n\n// User-provided token lists (WidgetProps.tokenLists) still download and construct as before.\nexport const defaultTokenLists: string[] = [API_TOKENS_LIST_URL];\n"],"mappings":";;AAMA,IAAaC,IAA8B,CAACD,EAAoB"}
@@ -1,3 +1,3 @@
1
1
  import { TokenList } from '@uniswap/token-lists';
2
- export declare const downloadTokenListDataWithFallback: (listURL: string, signal?: AbortSignal) => Promise<TokenList>;
2
+ export declare const downloadTokenListData: (listURL: string, signal?: AbortSignal) => Promise<TokenList>;
3
3
  //# sourceMappingURL=download.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/tokens/lists/download.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAItD,eAAO,MAAM,iCAAiC,GAC5C,SAAS,MAAM,EACf,SAAS,WAAW,KACnB,OAAO,CAAC,SAAS,CA2BnB,CAAC"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/tokens/lists/download.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,qBAAqB,GAChC,SAAS,MAAM,EACf,SAAS,WAAW,KACnB,OAAO,CAAC,SAAS,CAWnB,CAAC"}
@@ -1,18 +1,10 @@
1
- import { FALLBACK_CDN_URL as e, url2TokenList as t } from "./constants.js";
2
- import n from "axios";
1
+ import e from "axios";
3
2
  //#region src/tokens/lists/download.ts
4
- var r = async (r, i) => {
5
- try {
6
- let { data: e } = await n.get(r, { signal: i });
7
- return e.version.major === null && (e.version.major = 0), e.version.minor === null && (e.version.minor = 0), e.version.patch === null && (e.version.patch = 0), e;
8
- } catch (a) {
9
- let { filename: o } = t[r] || {};
10
- if (!o) throw a;
11
- let s = `${e}/${o}.json`, { data: c } = await n.get(s, { signal: i });
12
- return c;
13
- }
3
+ var t = async (t, n) => {
4
+ let { data: r } = await e.get(t, { signal: n });
5
+ return r.version.major === null && (r.version.major = 0), r.version.minor === null && (r.version.minor = 0), r.version.patch === null && (r.version.patch = 0), r;
14
6
  };
15
7
  //#endregion
16
- export { r as downloadTokenListDataWithFallback };
8
+ export { t as downloadTokenListData };
17
9
 
18
10
  //# sourceMappingURL=download.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","names":["axios","TokenList","url2TokenList","FALLBACK_CDN_URL","downloadTokenListDataWithFallback","listURL","signal","AbortSignal","Promise","data","get","version","major","minor","patch","error","filename","url"],"sources":["../../../src/tokens/lists/download.ts"],"sourcesContent":["import axios from \"axios\";\nimport type { TokenList } from \"@uniswap/token-lists\";\n\nimport { url2TokenList, FALLBACK_CDN_URL } from \"./constants\";\n\nexport const downloadTokenListDataWithFallback = async (\n listURL: string,\n signal?: AbortSignal\n): Promise<TokenList> => {\n try {\n // from the direct url\n const { data } = await axios.get<TokenList>(listURL, {\n signal,\n });\n // @ts-expect-error malformed tokenList.version\n if (data.version.major === null) data.version.major = 0; // https://tokens.coingecko.com/xdai/all.json has `null`\n // @ts-expect-error malformed tokenList.version\n if (data.version.minor === null) data.version.minor = 0;\n // @ts-expect-error malformed tokenList.version\n if (data.version.patch === null) data.version.patch = 0;\n return data;\n } catch (error) {\n const { filename } = url2TokenList[listURL] || {};\n\n if (!filename) throw error;\n\n const url = `${FALLBACK_CDN_URL}/${filename}.json`;\n\n // from fallback on CDN\n const { data } = await axios.get<TokenList>(url, {\n signal,\n });\n\n return data;\n }\n};\n"],"mappings":";;;AAKA,IAAaI,IAAoC,OAC/CC,GACAC,MACuB;CACvB,IAAI;EAEF,IAAM,EAAEG,YAAS,MAAMT,EAAMU,IAAeL,GAAS,EACnDC,WACD,CAAC;EAOF,OALIG,EAAKE,QAAQC,UAAU,SAAMH,EAAKE,QAAQC,QAAQ,IAElDH,EAAKE,QAAQE,UAAU,SAAMJ,EAAKE,QAAQE,QAAQ,IAElDJ,EAAKE,QAAQG,UAAU,SAAML,EAAKE,QAAQG,QAAQ,IAC/CL;UACAM,GAAO;EACd,IAAM,EAAEC,gBAAad,EAAcG,MAAY,EAAE;EAEjD,IAAI,CAACW,GAAU,MAAMD;EAErB,IAAME,IAAM,GAAGd,EAAgB,GAAIa,EAAQ,QAGrC,EAAEP,YAAS,MAAMT,EAAMU,IAAeO,GAAK,EAC/CX,WACD,CAAC;EAEF,OAAOG"}
1
+ {"version":3,"file":"download.js","names":["axios","TokenList","downloadTokenListData","listURL","signal","AbortSignal","Promise","data","get","version","major","minor","patch"],"sources":["../../../src/tokens/lists/download.ts"],"sourcesContent":["import axios from \"axios\";\nimport type { TokenList } from \"@uniswap/token-lists\";\n\nexport const downloadTokenListData = async (\n listURL: string,\n signal?: AbortSignal\n): Promise<TokenList> => {\n const { data } = await axios.get<TokenList>(listURL, {\n signal,\n });\n // @ts-expect-error malformed tokenList.version\n if (data.version.major === null) data.version.major = 0; // https://tokens.coingecko.com/xdai/all.json has `null`\n // @ts-expect-error malformed tokenList.version\n if (data.version.minor === null) data.version.minor = 0;\n // @ts-expect-error malformed tokenList.version\n if (data.version.patch === null) data.version.patch = 0;\n return data;\n};\n"],"mappings":";;AAGA,IAAaE,IAAwB,OACnCC,GACAC,MACuB;CACvB,IAAM,EAAEG,YAAS,MAAMP,EAAMQ,IAAeL,GAAS,EACnDC,WACD,CAAC;CAOF,OALIG,EAAKE,QAAQC,UAAU,SAAMH,EAAKE,QAAQC,QAAQ,IAElDH,EAAKE,QAAQE,UAAU,SAAMJ,EAAKE,QAAQE,QAAQ,IAElDJ,EAAKE,QAAQG,UAAU,SAAML,EAAKE,QAAQG,QAAQ,IAC/CL"}
@@ -1 +1 @@
1
- {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../../src/tokens/lists/state/effects.ts"],"names":[],"mappings":"AAiCA,wBAAgB,kBAAkB,SAEjC;AAWD,eAAO,MAAM,wBAAwB,eAEpC,CAAC"}
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../../src/tokens/lists/state/effects.ts"],"names":[],"mappings":"AAkCA,wBAAgB,kBAAkB,SAEjC;AAYD,eAAO,MAAM,wBAAwB,eAEpC,CAAC"}
@@ -1,30 +1,31 @@
1
1
  import { jotaiStore as e, useAtomValue as t } from "../../../core/store.js";
2
2
  import { queryClient as n } from "../../../lib/queryClient.js";
3
- import { constructedTokensByURLAtom as r, tokenListUrlsAtom as i } from "./tokenListsStateAtom.js";
4
- import { produceSingleQueryOptionMin as a } from "../../queries.js";
5
- import { addTokenListsAtom as o } from "./tokenListsActionsAtom.js";
6
- import { atom as s } from "jotai";
7
- import { atomEffect as c } from "jotai-effect";
3
+ import { apiTokensQueryAtom as r } from "../../state/apiTokensAtom.js";
4
+ import { constructedTokensByURLAtom as i, tokenListUrlsAtom as a } from "./tokenListsStateAtom.js";
5
+ import { produceSingleQueryOptionMin as o } from "../../queries.js";
6
+ import { addTokenListsAtom as s } from "./tokenListsActionsAtom.js";
7
+ import { atom as c } from "jotai";
8
+ import { atomEffect as l } from "jotai-effect";
8
9
  //#region src/tokens/lists/state/effects.ts
9
- var l = /* @__PURE__ */ new Set();
10
- async function u(t) {
11
- if (l.has(t)) return;
12
- let r = a(t), i = await n.ensureQueryData(r);
13
- l.add(t), i?.available && e.set(o, [i]);
10
+ var u = /* @__PURE__ */ new Set();
11
+ async function d(t) {
12
+ if (u.has(t)) return;
13
+ let r = o(t), i = await n.ensureQueryData(r);
14
+ u.add(t), i?.available && e.set(s, [i]);
14
15
  }
15
- var d = c((e) => {
16
- e(i).forEach(u);
16
+ var f = l((e) => {
17
+ e(a).forEach(d);
17
18
  });
18
- function f() {
19
- t(d);
19
+ function p() {
20
+ t(f);
20
21
  }
21
- var p = s((e) => {
22
- let t = e(i);
23
- if (t.length === 0) return !1;
24
- let n = e(r);
25
- return t.every((e) => n[e] !== void 0);
26
- }), m = () => t(p);
22
+ var m = c((e) => {
23
+ let t = e(a), { isSuccess: n } = e(r);
24
+ if (t.length === 0) return n;
25
+ let o = e(i);
26
+ return t.every((e) => o[e] !== void 0);
27
+ }), h = () => t(m);
27
28
  //#endregion
28
- export { f as useActivateEffects, m as useAllTokensListsFetched };
29
+ export { p as useActivateEffects, h as useAllTokensListsFetched };
29
30
 
30
31
  //# sourceMappingURL=effects.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effects.js","names":["jotaiStore","queryClient","produceSingleQueryOptionMin","atomEffect","addTokenListsAtom","constructedTokensByURLAtom","tokenListUrlsAtom","useAtomValue","atom","addedUrlsSet","Set","addTokenList","url","has","queryOptions","tokenList","ensureQueryData","add","available","set","addTokenListEffect","get","forEach","useActivateEffects","allTokensListsFetchedSuccesfully","tokenListUrls","length","constructedTokensByURL","every","undefined","useAllTokensListsFetched"],"sources":["../../../../src/tokens/lists/state/effects.ts"],"sourcesContent":["import { jotaiStore } from \"@/core/store\";\nimport { queryClient } from \"@/lib/queryClient\";\nimport { produceSingleQueryOptionMin } from \"@/tokens/queries\";\nimport { atomEffect } from \"jotai-effect\";\nimport { addTokenListsAtom } from \"./tokenListsActionsAtom\";\nimport {\n constructedTokensByURLAtom,\n tokenListUrlsAtom,\n} from \"./tokenListsStateAtom\";\nimport { useAtomValue } from \"@/core/store\";\nimport { atom } from \"jotai\";\n\nconst addedUrlsSet = new Set<string>();\n\nasync function addTokenList(url: string) {\n // list already in store\n if (addedUrlsSet.has(url)) return;\n\n // fetch token list or get from cache\n const queryOptions = produceSingleQueryOptionMin(url);\n const tokenList = await queryClient.ensureQueryData(queryOptions);\n\n // add url to set\n addedUrlsSet.add(url);\n\n // add to state once per fetched list\n if (tokenList?.available) jotaiStore.set(addTokenListsAtom, [tokenList]);\n}\n\nconst addTokenListEffect = atomEffect((get) => {\n get(tokenListUrlsAtom).forEach(addTokenList);\n});\n\nexport function useActivateEffects() {\n useAtomValue(addTokenListEffect);\n}\n\nconst allTokensListsFetchedSuccesfully = atom<boolean>((get) => {\n const tokenListUrls = get(tokenListUrlsAtom);\n if (tokenListUrls.length === 0) return false;\n const constructedTokensByURL = get(constructedTokensByURLAtom);\n return tokenListUrls.every(\n (url) => constructedTokensByURL[url] !== undefined\n );\n});\n\nexport const useAllTokensListsFetched = () => {\n return useAtomValue(allTokensListsFetchedSuccesfully);\n};\n"],"mappings":";;;;;;;;AAYA,IAAMS,oBAAe,IAAIC,KAAa;AAEtC,eAAeC,EAAaC,GAAa;CAEvC,IAAIH,EAAaI,IAAID,EAAI,EAAE;CAG3B,IAAME,IAAeZ,EAA4BU,EAAI,EAC/CG,IAAY,MAAMd,EAAYe,gBAAgBF,EAAa;CAMjE,AAHAL,EAAaQ,IAAIL,EAAI,EAGjBG,GAAWG,aAAWlB,EAAWmB,IAAIf,GAAmB,CAACW,EAAU,CAAC;;AAG1E,IAAMK,IAAqBjB,GAAYkB,MAAQ;CAC7CA,EAAIf,EAAkB,CAACgB,QAAQX,EAAa;EAC5C;AAEF,SAAOY,IAAA;CACLhB,EAAaa,EAAmB;;AAGlC,IAAMI,IAAmChB,GAAea,MAAQ;CAC9D,IAAMI,IAAgBJ,EAAIf,EAAkB;CAC5C,IAAImB,EAAcC,WAAW,GAAG,OAAO;CACvC,IAAMC,IAAyBN,EAAIhB,EAA2B;CAC9D,OAAOoB,EAAcG,OAClBhB,MAAQe,EAAuBf,OAASiB,KAAAA,EAC1C;EACD,EAEWC,UACJvB,EAAaiB,EAAiC"}
1
+ {"version":3,"file":"effects.js","names":["jotaiStore","queryClient","produceSingleQueryOptionMin","atomEffect","addTokenListsAtom","constructedTokensByURLAtom","tokenListUrlsAtom","useAtomValue","atom","apiTokensQueryAtom","addedUrlsSet","Set","addTokenList","url","has","queryOptions","tokenList","ensureQueryData","add","available","set","addTokenListEffect","get","forEach","useActivateEffects","allTokensListsFetchedSuccesfully","tokenListUrls","isSuccess","length","constructedTokensByURL","every","undefined","useAllTokensListsFetched"],"sources":["../../../../src/tokens/lists/state/effects.ts"],"sourcesContent":["import { jotaiStore } from \"@/core/store\";\nimport { queryClient } from \"@/lib/queryClient\";\nimport { produceSingleQueryOptionMin } from \"@/tokens/queries\";\nimport { atomEffect } from \"jotai-effect\";\nimport { addTokenListsAtom } from \"./tokenListsActionsAtom\";\nimport {\n constructedTokensByURLAtom,\n tokenListUrlsAtom,\n} from \"./tokenListsStateAtom\";\nimport { useAtomValue } from \"@/core/store\";\nimport { atom } from \"jotai\";\nimport { apiTokensQueryAtom } from \"@/tokens/state/apiTokensAtom\";\n\nconst addedUrlsSet = new Set<string>();\n\nasync function addTokenList(url: string) {\n // list already in store\n if (addedUrlsSet.has(url)) return;\n\n // fetch token list or get from cache\n const queryOptions = produceSingleQueryOptionMin(url);\n const tokenList = await queryClient.ensureQueryData(queryOptions);\n\n // add url to set\n addedUrlsSet.add(url);\n\n // add to state once per fetched list\n if (tokenList?.available) jotaiStore.set(addTokenListsAtom, [tokenList]);\n}\n\nconst addTokenListEffect = atomEffect((get) => {\n get(tokenListUrlsAtom).forEach(addTokenList);\n});\n\nexport function useActivateEffects() {\n useAtomValue(addTokenListEffect);\n}\n\nconst allTokensListsFetchedSuccesfully = atom<boolean>((get) => {\n const tokenListUrls = get(tokenListUrlsAtom);\n const { isSuccess } = get(apiTokensQueryAtom);\n if (tokenListUrls.length === 0) return isSuccess;\n const constructedTokensByURL = get(constructedTokensByURLAtom);\n return tokenListUrls.every(\n (url) => constructedTokensByURL[url] !== undefined\n );\n});\n\nexport const useAllTokensListsFetched = () => {\n return useAtomValue(allTokensListsFetchedSuccesfully);\n};\n"],"mappings":";;;;;;;;;AAaA,IAAMU,oBAAe,IAAIC,KAAa;AAEtC,eAAeC,EAAaC,GAAa;CAEvC,IAAIH,EAAaI,IAAID,EAAI,EAAE;CAG3B,IAAME,IAAeb,EAA4BW,EAAI,EAC/CG,IAAY,MAAMf,EAAYgB,gBAAgBF,EAAa;CAMjE,AAHAL,EAAaQ,IAAIL,EAAI,EAGjBG,GAAWG,aAAWnB,EAAWoB,IAAIhB,GAAmB,CAACY,EAAU,CAAC;;AAG1E,IAAMK,IAAqBlB,GAAYmB,MAAQ;CAC7CA,EAAIhB,EAAkB,CAACiB,QAAQX,EAAa;EAC5C;AAEF,SAAOY,IAAA;CACLjB,EAAac,EAAmB;;AAGlC,IAAMI,IAAmCjB,GAAec,MAAQ;CAC9D,IAAMI,IAAgBJ,EAAIhB,EAAkB,EACtC,EAAEqB,iBAAcL,EAAIb,EAAmB;CAC7C,IAAIiB,EAAcE,WAAW,GAAG,OAAOD;CACvC,IAAME,IAAyBP,EAAIjB,EAA2B;CAC9D,OAAOqB,EAAcI,OAClBjB,MAAQgB,EAAuBhB,OAASkB,KAAAA,EAC1C;EACD,EAEWC,UACJzB,EAAakB,EAAiC"}
@@ -4,7 +4,7 @@ export declare const tokenListUrlsAtom: import('jotai').Atom<string[]>;
4
4
  Enabled and default token list URLs by chain ID,
5
5
  taking into account any configured lists in the widget config.
6
6
  **/
7
- export declare const enabledAndDefaultTokenURLSAtom: import('jotai').Atom<{
7
+ export declare const enabledTokenURLSAtom: import('jotai').Atom<{
8
8
  1: {
9
9
  all: string[];
10
10
  enabled: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"tokenListsStateAtom.d.ts","sourceRoot":"","sources":["../../../../src/tokens/lists/state/tokenListsStateAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAyBrD,eAAO,MAAM,iBAAiB,gCAQ5B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBzC,CAAC;AAEH;;IAEI;AACJ,eAAO,MAAM,6BAA6B;;CAAkC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,0BAA0B,6CASrC,CAAC"}
1
+ {"version":3,"file":"tokenListsStateAtom.d.ts","sourceRoot":"","sources":["../../../../src/tokens/lists/state/tokenListsStateAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAWrD,eAAO,MAAM,iBAAiB,gCAK5B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsB/B,CAAC;AAEH;;IAEI;AACJ,eAAO,MAAM,6BAA6B;;CAAkC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,0BAA0B,6CASrC,CAAC"}
@@ -1,34 +1,30 @@
1
- import { isValidUrl as e } from "../../../lib/utils/index.js";
2
- import { tokenListsAtom as t } from "../../../core/state/configAtom.js";
1
+ import { emptyArray as e } from "../../../lib/constants/index.js";
2
+ import { isValidUrl as t } from "../../../lib/utils/index.js";
3
3
  import { isSupportedChainId as n } from "../../../lib/web3/wagmi/utils.js";
4
- import { gatherEnabledAndDefaultUrlsMappingByChainId as r } from "../utils.js";
5
- import { allEnabledChainsAtom as i } from "../../../core/state/enabledChainsAtom.js";
6
- import { atom as a } from "jotai";
4
+ import { allEnabledChainsAtom as r } from "../../../core/state/enabledChainsAtom.js";
5
+ import { gatherEmptyTokenUrlsMappingByChainId as i } from "../utils.js";
6
+ import { enabledTokenListsAtom as a } from "../../../core/state/tokenListsAtom.js";
7
+ import { atom as o } from "jotai";
7
8
  //#region src/tokens/lists/state/tokenListsStateAtom.ts
8
- var o = a((e) => r(e(i))), s = a((t) => {
9
- let n = t(o);
10
- return Object.values(n).flatMap((e) => e.all).filter(e);
11
- }), c = (t) => Array.from(new Set(t)).filter(e), l = a((e) => {
12
- let n = e(t);
13
- return n.length === 0 ? c(e(s)) : c(n);
14
- }), u = a((r) => {
15
- let i = r(t), a = r(o);
16
- if (i.length === 0) return a;
17
- let s = { ...a };
18
- return i.forEach((t) => {
9
+ var s = (e) => Array.from(new Set(e)).filter(t), c = o((t) => {
10
+ let n = t(a);
11
+ return n.length === 0 ? e : s(n);
12
+ }), l = o((e) => {
13
+ let o = e(a), s = i(e(r));
14
+ return o.length === 0 || o.forEach((e) => {
19
15
  Object.keys(s).forEach((r) => {
20
16
  let i = Number(r);
21
- n(i) && e(t) && (s[i].all.includes(t) || s[i].all.push(t), s[i].enabled.includes(t) || s[i].enabled.push(t));
17
+ n(i) && t(e) && (s[i].all.includes(e) || s[i].all.push(e), s[i].enabled.includes(e) || s[i].enabled.push(e));
22
18
  });
23
19
  }), s;
24
- }), d = a({}), f = a((e) => {
25
- let t = e(d);
26
- return e(l).reduce((e, n) => {
20
+ }), u = o({}), d = o((e) => {
21
+ let t = e(u);
22
+ return e(c).reduce((e, n) => {
27
23
  let r = t[n];
28
24
  return r && (e[n] = r), e;
29
25
  }, {});
30
26
  });
31
27
  //#endregion
32
- export { d as allConstructedTokensByURLAtom, f as constructedTokensByURLAtom, u as enabledAndDefaultTokenURLSAtom, l as tokenListUrlsAtom };
28
+ export { u as allConstructedTokensByURLAtom, d as constructedTokensByURLAtom, l as enabledTokenURLSAtom, c as tokenListUrlsAtom };
33
29
 
34
30
  //# sourceMappingURL=tokenListsStateAtom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenListsStateAtom.js","names":["ConstructedListsByURL","atom","tokenListsAtom","isValidUrl","isSupportedChainId","allEnabledChainsAtom","gatherEnabledAndDefaultUrlsMappingByChainId","enabledAndDefaultUrlsMappingAtom","get","allEnabledChains","defaultListsAtom","enabledAndDefaultTokenURLS","Object","values","flatMap","lists","all","filter","getUniqueValidUrls","urls","Array","from","Set","tokenListUrlsAtom","configuredLists","length","defaultLists","enabledAndDefaultTokenURLSAtom","enabledAndDefault","forEach","url","keys","_chainId","chainId","Number","includes","push","enabled","allConstructedTokensByURLAtom","constructedTokensByURLAtom","constructedLists","tokenListUrls","reduce","acc","tokens"],"sources":["../../../../src/tokens/lists/state/tokenListsStateAtom.ts"],"sourcesContent":["import type { ConstructedListsByURL } from \"./types\";\nimport { atom } from \"jotai\";\nimport { tokenListsAtom } from \"@/core/state/configAtom\";\nimport { isValidUrl } from \"@/lib/utils\";\nimport { isSupportedChainId } from \"@/lib/web3/wagmi/utils\";\nimport { allEnabledChainsAtom } from \"@/core/state/enabledChainsAtom\";\nimport { gatherEnabledAndDefaultUrlsMappingByChainId } from \"../utils\";\n\nconst enabledAndDefaultUrlsMappingAtom = atom((get) => {\n const allEnabledChains = get(allEnabledChainsAtom);\n return gatherEnabledAndDefaultUrlsMappingByChainId(allEnabledChains);\n});\n\n/**\n * Returns default token list URLs available for enabled chains.\n */\nconst defaultListsAtom = atom<string[]>((get) => {\n const enabledAndDefaultTokenURLS = get(enabledAndDefaultUrlsMappingAtom);\n return Object.values(enabledAndDefaultTokenURLS)\n .flatMap((lists) => lists.all)\n .filter(isValidUrl);\n});\n\nconst getUniqueValidUrls = (urls: string[]) =>\n Array.from(new Set(urls)).filter(isValidUrl);\nexport const tokenListUrlsAtom = atom<string[]>((get) => {\n const configuredLists = get(tokenListsAtom);\n if (configuredLists.length === 0) {\n const defaultLists = get(defaultListsAtom);\n return getUniqueValidUrls(defaultLists);\n }\n\n return getUniqueValidUrls(configuredLists);\n});\n\n/** \n Enabled and default token list URLs by chain ID,\n taking into account any configured lists in the widget config. \n**/\nexport const enabledAndDefaultTokenURLSAtom = atom((get) => {\n const configuredLists = get(tokenListsAtom);\n\n const enabledAndDefaultTokenURLS = get(enabledAndDefaultUrlsMappingAtom);\n if (configuredLists.length === 0) return enabledAndDefaultTokenURLS;\n\n const enabledAndDefault = { ...enabledAndDefaultTokenURLS };\n configuredLists.forEach((url) => {\n Object.keys(enabledAndDefault).forEach((_chainId) => {\n const chainId = Number(_chainId);\n if (!isSupportedChainId(chainId)) return; // Object.keys destroys types\n if (!isValidUrl(url)) return; // skip if provided URL is not valid\n\n // put URL from config into both enabled and all lists\n if (!enabledAndDefault[chainId].all.includes(url))\n enabledAndDefault[chainId].all.push(url);\n if (!enabledAndDefault[chainId].enabled.includes(url))\n enabledAndDefault[chainId].enabled.push(url);\n });\n });\n\n return enabledAndDefault;\n});\n\n/**\n All constructed tokens from all fetched lists during the widget lifecycle.\n **/\nexport const allConstructedTokensByURLAtom = atom<ConstructedListsByURL>({});\n\n/**\n Constructed tokens from currently enabled lists only (from config or defaults).\n**/\nexport const constructedTokensByURLAtom = atom<ConstructedListsByURL>((get) => {\n const constructedLists = get(allConstructedTokensByURLAtom);\n const tokenListUrls = get(tokenListUrlsAtom);\n\n return tokenListUrls.reduce<ConstructedListsByURL>((acc, url) => {\n const tokens = constructedLists[url];\n if (tokens) acc[url] = tokens;\n return acc;\n }, {});\n});\n"],"mappings":";;;;;;;AAQA,IAAMO,IAAmCN,GAAMO,MAEtCF,EADkBE,EAAIH,EACsBI,CAAiB,CACpE,EAKIC,IAAmBT,GAAgBO,MAAQ;CAC/C,IAAMG,IAA6BH,EAAID,EAAiC;CACxE,OAAOK,OAAOC,OAAOF,EAA2B,CAC7CG,SAASC,MAAUA,EAAMC,IAAI,CAC7BC,OAAOd,EAAW;EACrB,EAEIe,KAAsBC,MAC1BC,MAAMC,KAAK,IAAIC,IAAIH,EAAK,CAAC,CAACF,OAAOd,EAAW,EACjCoB,IAAoBtB,GAAgBO,MAAQ;CACvD,IAAMgB,IAAkBhB,EAAIN,EAAe;CAM3C,OALIsB,EAAgBC,WAAW,IAEtBP,EADcV,EAAIE,EACCgB,CAAa,GAGlCR,EAAmBM,EAAgB;EAC1C,EAMWG,IAAiC1B,GAAMO,MAAQ;CAC1D,IAAMgB,IAAkBhB,EAAIN,EAAe,EAErCS,IAA6BH,EAAID,EAAiC;CACxE,IAAIiB,EAAgBC,WAAW,GAAG,OAAOd;CAEzC,IAAMiB,IAAoB,EAAE,GAAGjB,GAA4B;CAe3D,OAdAa,EAAgBK,SAASC,MAAQ;EAC/BlB,OAAOmB,KAAKH,EAAkB,CAACC,SAASG,MAAa;GACnD,IAAMC,IAAUC,OAAOF,EAAS;GAC3B5B,EAAmB6B,EAAQ,IAC3B9B,EAAW2B,EAAI,KAGfF,EAAkBK,GAASjB,IAAImB,SAASL,EAAI,IAC/CF,EAAkBK,GAASjB,IAAIoB,KAAKN,EAAI,EACrCF,EAAkBK,GAASI,QAAQF,SAASL,EAAI,IACnDF,EAAkBK,GAASI,QAAQD,KAAKN,EAAI;IAC9C;GACF,EAEKF;EACP,EAKWU,IAAgCrC,EAA4B,EAAE,CAAC,EAK/DsC,IAA6BtC,GAA6BO,MAAQ;CAC7E,IAAMgC,IAAmBhC,EAAI8B,EAA8B;CAG3D,OAFsB9B,EAAIe,EAEnBkB,CAAcC,QAA+BC,GAAKb,MAAQ;EAC/D,IAAMc,IAASJ,EAAiBV;EAEhC,OADIc,MAAQD,EAAIb,KAAOc,IAChBD;IACN,EAAE,CAAC;EACN"}
1
+ {"version":3,"file":"tokenListsStateAtom.js","names":["ConstructedListsByURL","atom","isValidUrl","isSupportedChainId","allEnabledChainsAtom","gatherEmptyTokenUrlsMappingByChainId","emptyArray","enabledTokenListsAtom","getUniqueValidUrls","urls","Array","from","Set","filter","tokenListUrlsAtom","get","enabledLists","length","enabledTokenURLSAtom","allEnabledChains","result","forEach","url","Object","keys","_chainId","chainId","Number","all","includes","push","enabled","allConstructedTokensByURLAtom","constructedTokensByURLAtom","constructedLists","tokenListUrls","reduce","acc","tokens"],"sources":["../../../../src/tokens/lists/state/tokenListsStateAtom.ts"],"sourcesContent":["import type { ConstructedListsByURL } from \"./types\";\nimport { atom } from \"jotai\";\nimport { isValidUrl } from \"@/lib/utils\";\nimport { isSupportedChainId } from \"@/lib/web3/wagmi/utils\";\nimport { allEnabledChainsAtom } from \"@/core/state/enabledChainsAtom\";\nimport { gatherEmptyTokenUrlsMappingByChainId } from \"../utils\";\nimport { emptyArray } from \"@/lib/constants\";\nimport { enabledTokenListsAtom } from \"@/core/state/tokenListsAtom\";\n\nconst getUniqueValidUrls = (urls: string[]) =>\n Array.from(new Set(urls)).filter(isValidUrl);\nexport const tokenListUrlsAtom = atom<string[]>((get) => {\n const enabledLists = get(enabledTokenListsAtom);\n if (enabledLists.length === 0) return emptyArray;\n\n return getUniqueValidUrls(enabledLists);\n});\n\n/** \n Enabled and default token list URLs by chain ID,\n taking into account any configured lists in the widget config. \n**/\nexport const enabledTokenURLSAtom = atom((get) => {\n const enabledLists = get(enabledTokenListsAtom);\n\n const allEnabledChains = get(allEnabledChainsAtom);\n const result = gatherEmptyTokenUrlsMappingByChainId(allEnabledChains);\n\n if (enabledLists.length === 0) return result;\n\n enabledLists.forEach((url) => {\n Object.keys(result).forEach((_chainId) => {\n const chainId = Number(_chainId);\n if (!isSupportedChainId(chainId)) return; // Object.keys destroys types\n if (!isValidUrl(url)) return; // skip if provided URL is not valid\n\n // put URL from config into both enabled and all lists\n if (!result[chainId].all.includes(url)) result[chainId].all.push(url);\n if (!result[chainId].enabled.includes(url))\n result[chainId].enabled.push(url);\n });\n });\n\n return result;\n});\n\n/**\n All constructed tokens from all fetched lists during the widget lifecycle.\n **/\nexport const allConstructedTokensByURLAtom = atom<ConstructedListsByURL>({});\n\n/**\n Constructed tokens from currently enabled lists only (from config or defaults).\n**/\nexport const constructedTokensByURLAtom = atom<ConstructedListsByURL>((get) => {\n const constructedLists = get(allConstructedTokensByURLAtom);\n const tokenListUrls = get(tokenListUrlsAtom);\n\n return tokenListUrls.reduce<ConstructedListsByURL>((acc, url) => {\n const tokens = constructedLists[url];\n if (tokens) acc[url] = tokens;\n return acc;\n }, {});\n});\n"],"mappings":";;;;;;;;AASA,IAAMQ,KAAsBC,MAC1BC,MAAMC,KAAK,IAAIC,IAAIH,EAAK,CAAC,CAACI,OAAOX,EAAW,EACjCY,IAAoBb,GAAgBc,MAAQ;CACvD,IAAMC,IAAeD,EAAIR,EAAsB;CAG/C,OAFIS,EAAaC,WAAW,IAAUX,IAE/BE,EAAmBQ,EAAa;EACvC,EAMWE,IAAuBjB,GAAMc,MAAQ;CAChD,IAAMC,IAAeD,EAAIR,EAAsB,EAGzCa,IAASf,EADUU,EAAIX,EACuBe,CAAiB;CAiBrE,OAfIH,EAAaC,WAAW,KAE5BD,EAAaK,SAASC,MAAQ;EAC5BC,OAAOC,KAAKJ,EAAO,CAACC,SAASI,MAAa;GACxC,IAAMC,IAAUC,OAAOF,EAAS;GAC3BtB,EAAmBuB,EAAQ,IAC3BxB,EAAWoB,EAAI,KAGfF,EAAOM,GAASE,IAAIC,SAASP,EAAI,IAAEF,EAAOM,GAASE,IAAIE,KAAKR,EAAI,EAChEF,EAAOM,GAASK,QAAQF,SAASP,EAAI,IACxCF,EAAOM,GAASK,QAAQD,KAAKR,EAAI;IACnC;GACF,EAboCF;EAgBtC,EAKWY,IAAgC/B,EAA4B,EAAE,CAAC,EAK/DgC,IAA6BhC,GAA6Bc,MAAQ;CAC7E,IAAMmB,IAAmBnB,EAAIiB,EAA8B;CAG3D,OAFsBjB,EAAID,EAEnBqB,CAAcC,QAA+BC,GAAKf,MAAQ;EAC/D,IAAMgB,IAASJ,EAAiBZ;EAEhC,OADIgB,MAAQD,EAAIf,KAAOgB,IAChBD;IACN,EAAE,CAAC;EACN"}
@@ -1,7 +1,6 @@
1
1
  import { TokenListUnavailable } from '../types';
2
- export declare const getTokenListPlaceholderName: (listUrl: string, chainId: number) => string | undefined;
3
2
  export declare const constructPlaceholderData: (listURL: string) => TokenListUnavailable;
4
- export declare const gatherEnabledAndDefaultUrlsMappingByChainId: <ChainID extends number>(chainIds: ChainID[]) => { [K in ChainID]: {
3
+ export declare const gatherEmptyTokenUrlsMappingByChainId: <ChainID extends number>(chainIds: ChainID[]) => { [K in ChainID]: {
5
4
  all: string[];
6
5
  enabled: string[];
7
6
  }; };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tokens/lists/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGrD,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,EACf,SAAS,MAAM,KACd,MAAM,GAAG,SAAkE,CAAC;AAE/E,eAAO,MAAM,wBAAwB,GACnC,SAAS,MAAM,KACd,oBAMF,CAAC;AAEF,eAAO,MAAM,2CAA2C,GACtD,OAAO,SAAS,MAAM,EAEtB,UAAU,OAAO,EAAE,KAClB,GAAG,CAAC,IAAI,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAMxD,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tokens/lists/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,wBAAwB,GACnC,SAAS,MAAM,KACd,oBAMF,CAAC;AAEF,eAAO,MAAM,oCAAoC,GAAI,OAAO,SAAS,MAAM,EACzE,UAAU,OAAO,EAAE,KAClB,GAAG,CAAC,IAAI,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAMxD,CAAC"}
@@ -1,15 +1,14 @@
1
1
  import { gatherObjectsByProp as e } from "../../lib/utils/index.js";
2
- import { chainId2TokenListURLs as t, urlChain2TokenList as n } from "./constants.js";
3
2
  //#region src/tokens/lists/utils.ts
4
- var r = (e, t) => n[`${e}@${t}`]?.listName, i = (e) => ({
3
+ var t = (e) => ({
5
4
  url: e,
6
5
  available: !1,
7
- name: r(e, 0)
8
- }), a = (n) => e(n, (e) => String(e), (e) => t[e] || {
6
+ name: void 0
7
+ }), n = (t) => e(t, (e) => String(e), () => ({
9
8
  enabled: [],
10
9
  all: []
11
- });
10
+ }));
12
11
  //#endregion
13
- export { i as constructPlaceholderData, a as gatherEnabledAndDefaultUrlsMappingByChainId };
12
+ export { t as constructPlaceholderData, n as gatherEmptyTokenUrlsMappingByChainId };
14
13
 
15
14
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["gatherObjectsByProp","TokenListUnavailable","chainId2TokenListURLs","urlChain2TokenList","getTokenListPlaceholderName","listUrl","chainId","listName","constructPlaceholderData","listURL","url","available","name","gatherEnabledAndDefaultUrlsMappingByChainId","chainIds","ChainID","all","enabled","String"],"sources":["../../../src/tokens/lists/utils.ts"],"sourcesContent":["import { gatherObjectsByProp } from \"@/lib/utils\";\nimport type { TokenListUnavailable } from \"../types\";\nimport { chainId2TokenListURLs, urlChain2TokenList } from \"./constants\";\n\nexport const getTokenListPlaceholderName = (\n listUrl: string,\n chainId: number\n): string | undefined => urlChain2TokenList[`${listUrl}@${chainId}`]?.listName;\n\nexport const constructPlaceholderData = (\n listURL: string\n): TokenListUnavailable => {\n return {\n url: listURL,\n available: false,\n name: getTokenListPlaceholderName(listURL, 0),\n };\n};\n\nexport const gatherEnabledAndDefaultUrlsMappingByChainId = <\n ChainID extends number,\n>(\n chainIds: ChainID[]\n): { [K in ChainID]: { all: string[]; enabled: string[] } } => {\n return gatherObjectsByProp(\n chainIds,\n (chainId) => String(chainId),\n (chainId) => chainId2TokenListURLs[chainId] || { enabled: [], all: [] }\n );\n};\n"],"mappings":";;;AAIA,IAAaI,KACXC,GACAC,MACuBH,EAAmB,GAAGE,EAAO,GAAIC,MAAYC,UAEzDC,KACXC,OAEO;CACLC,KAAKD;CACLE,WAAW;CACXC,MAAMR,EAA4BK,GAAS,EAAC;CAC7C,GAGUI,KAGXC,MAEOd,EACLc,IACCR,MAAYY,OAAOZ,EAAQ,GAC3BA,MAAYJ,EAAsBI,MAAY;CAAEW,SAAS,EAAE;CAAED,KAAK,EAAA;CACrE,CAAC"}
1
+ {"version":3,"file":"utils.js","names":["gatherObjectsByProp","TokenListUnavailable","constructPlaceholderData","listURL","url","available","name","undefined","gatherEmptyTokenUrlsMappingByChainId","chainIds","ChainID","all","enabled","chainId","String"],"sources":["../../../src/tokens/lists/utils.ts"],"sourcesContent":["import { gatherObjectsByProp } from \"@/lib/utils\";\nimport type { TokenListUnavailable } from \"../types\";\n\nexport const constructPlaceholderData = (\n listURL: string\n): TokenListUnavailable => {\n return {\n url: listURL,\n available: false,\n name: undefined,\n };\n};\n\nexport const gatherEmptyTokenUrlsMappingByChainId = <ChainID extends number>(\n chainIds: ChainID[]\n): { [K in ChainID]: { all: string[]; enabled: string[] } } => {\n return gatherObjectsByProp(\n chainIds,\n (chainId) => String(chainId),\n () => ({ enabled: [], all: [] })\n );\n};\n"],"mappings":";;AAGA,IAAaE,KACXC,OAEO;CACLC,KAAKD;CACLE,WAAW;CACXC,MAAMC,KAAAA;CACP,GAGUC,KACXC,MAEOT,EACLS,IACCI,MAAYC,OAAOD,EAAQ,SACrB;CAAED,SAAS,EAAE;CAAED,KAAK,EAAA;CAAI,EAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/tokens/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAShD,KAAK,mBAAmB,CAAC,CAAC,SAAS,MAAM,IAAI;IAC3C,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;CACzD,CAAC;AAiBF,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EACpE,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,CAAC,EAAE,CAAC,6GAaR;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EAC1E,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,CAAC,GACN,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CA6BlD;AAGD,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EACvE,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,CAAC,GACN,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAOlD;AAED,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EAC3E,UAAU,MAAM,EAAE,EAClB,MAAM,CAAC,KACN,mBAAmB,CAAC,CAAC,CAAC,EAkBxB,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EAC5D,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,CAAC,EAAE,CAAC,GACN,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAOvB;AAED,wBAAgB,kBAAkB,IAAI,gBAAgB,EAAE,CASvD"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/tokens/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAQhD,KAAK,mBAAmB,CAAC,CAAC,SAAS,MAAM,IAAI;IAC3C,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;CACzD,CAAC;AAiBF,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EACpE,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,CAAC,EAAE,CAAC,6GAaR;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EAC1E,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,CAAC,GACN,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CA6BlD;AAGD,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EACvE,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,CAAC,GACN,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAOlD;AAED,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EAC3E,UAAU,MAAM,EAAE,EAClB,MAAM,CAAC,KACN,mBAAmB,CAAC,CAAC,CAAC,EAkBxB,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,KAAK,GAAG,KAAK,EAC5D,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,CAAC,EAAE,CAAC,GACN,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAOvB;AAED,wBAAgB,kBAAkB,IAAI,gBAAgB,EAAE,CAIvD"}