@metamask-previews/design-system-react 0.3.1-preview.89321d8 → 0.3.1-preview.c4d6431

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 (29) hide show
  1. package/dist/components/temp-components/Blockies/Blockies.cjs +1 -4
  2. package/dist/components/temp-components/Blockies/Blockies.cjs.map +1 -1
  3. package/dist/components/temp-components/Blockies/Blockies.d.cts.map +1 -1
  4. package/dist/components/temp-components/Blockies/Blockies.d.mts.map +1 -1
  5. package/dist/components/temp-components/Blockies/Blockies.mjs +1 -4
  6. package/dist/components/temp-components/Blockies/Blockies.mjs.map +1 -1
  7. package/dist/components/temp-components/Jazzicon/Jazzicon.cjs +46 -35
  8. package/dist/components/temp-components/Jazzicon/Jazzicon.cjs.map +1 -1
  9. package/dist/components/temp-components/Jazzicon/Jazzicon.d.cts.map +1 -1
  10. package/dist/components/temp-components/Jazzicon/Jazzicon.d.mts.map +1 -1
  11. package/dist/components/temp-components/Jazzicon/Jazzicon.mjs +46 -35
  12. package/dist/components/temp-components/Jazzicon/Jazzicon.mjs.map +1 -1
  13. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.cjs +67 -0
  14. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.cjs.map +1 -0
  15. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.d.cts +24 -0
  16. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.d.cts.map +1 -0
  17. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.d.mts +24 -0
  18. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.d.mts.map +1 -0
  19. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.mjs +61 -0
  20. package/dist/components/temp-components/Jazzicon/Jazzicon.utilities.mjs.map +1 -0
  21. package/dist/components/temp-components/Maskicon/Maskicon.utilities.cjs +81 -6
  22. package/dist/components/temp-components/Maskicon/Maskicon.utilities.cjs.map +1 -1
  23. package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.cts +26 -0
  24. package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.cts.map +1 -1
  25. package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.mts +26 -0
  26. package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.mts.map +1 -1
  27. package/dist/components/temp-components/Maskicon/Maskicon.utilities.mjs +77 -5
  28. package/dist/components/temp-components/Maskicon/Maskicon.utilities.mjs.map +1 -1
  29. package/package.json +2 -3
@@ -4,13 +4,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Blockies = void 0;
7
- const design_system_shared_1 = require("@metamask-previews/design-system-shared");
8
7
  const blo_1 = require("blo");
9
8
  const react_1 = __importDefault(require("react"));
10
9
  const Blockies = ({ address, size = 32, ...props }) => {
11
- // Extract the account address from CAIP-10 format if needed
12
- const accountAddress = (0, design_system_shared_1.extractAccountAddress)(address);
13
- return (react_1.default.createElement("img", { src: (0, blo_1.blo)(accountAddress), height: size, width: size, alt: `Blockies for ${address}`, ...props }));
10
+ return (react_1.default.createElement("img", { src: (0, blo_1.blo)(address), height: size, width: size, alt: `Blockies for ${address}`, ...props }));
14
11
  };
15
12
  exports.Blockies = Blockies;
16
13
  exports.Blockies.displayName = 'Blockies';
@@ -1 +1 @@
1
- {"version":3,"file":"Blockies.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":";;;;;;AAAA,kFAAgF;AAChF,6BAA0B;AAC1B,kDAA0B;AAInB,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IAC1E,4DAA4D;IAC5D,MAAM,cAAc,GAAG,IAAA,4CAAqB,EAAC,OAAO,CAAC,CAAC;IAEtD,OAAO,CACL,uCACE,GAAG,EAAE,IAAA,SAAG,EAAC,cAA+B,CAAC,EACzC,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,gBAAgB,OAAO,EAAE,KAC1B,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,QAAQ,YAanB;AAEF,gBAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import { extractAccountAddress } from '@metamask-previews/design-system-shared';\nimport { blo } from 'blo';\nimport React from 'react';\n\nimport type { BlockiesProps } from './Blockies.types';\n\nexport const Blockies = ({ address, size = 32, ...props }: BlockiesProps) => {\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n return (\n <img\n src={blo(accountAddress as `0x${string}`)}\n height={size}\n width={size}\n alt={`Blockies for ${address}`} // TODO: Add localization for this\n {...props}\n />\n );\n};\n\nBlockies.displayName = 'Blockies';\n"]}
1
+ {"version":3,"file":"Blockies.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":";;;;;;AAAA,6BAA0B;AAC1B,kDAA0B;AAInB,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IAC1E,OAAO,CACL,uCACE,GAAG,EAAE,IAAA,SAAG,EAAC,OAAwB,CAAC,EAClC,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,gBAAgB,OAAO,EAAE,KAC1B,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,QAAQ,YAUnB;AAEF,gBAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import { blo } from 'blo';\nimport React from 'react';\n\nimport type { BlockiesProps } from './Blockies.types';\n\nexport const Blockies = ({ address, size = 32, ...props }: BlockiesProps) => {\n return (\n <img\n src={blo(address as `0x${string}`)}\n height={size}\n width={size}\n alt={`Blockies for ${address}`} // TODO: Add localization for this\n {...props}\n />\n );\n};\n\nBlockies.displayName = 'Blockies';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Blockies.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,cAAc;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAEtD,eAAO,MAAM,QAAQ;kCAAsC,aAAa;;CAavE,CAAC"}
1
+ {"version":3,"file":"Blockies.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAEtD,eAAO,MAAM,QAAQ;kCAAsC,aAAa;;CAUvE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Blockies.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,cAAc;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAEtD,eAAO,MAAM,QAAQ;kCAAsC,aAAa;;CAavE,CAAC"}
1
+ {"version":3,"file":"Blockies.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAEtD,eAAO,MAAM,QAAQ;kCAAsC,aAAa;;CAUvE,CAAC"}
@@ -4,14 +4,11 @@ function $importDefault(module) {
4
4
  }
5
5
  return module;
6
6
  }
7
- import { extractAccountAddress } from "@metamask-previews/design-system-shared";
8
7
  import { blo } from "blo";
9
8
  import $React from "react";
10
9
  const React = $importDefault($React);
11
10
  export const Blockies = ({ address, size = 32, ...props }) => {
12
- // Extract the account address from CAIP-10 format if needed
13
- const accountAddress = extractAccountAddress(address);
14
- return (React.createElement("img", { src: blo(accountAddress), height: size, width: size, alt: `Blockies for ${address}`, ...props }));
11
+ return (React.createElement("img", { src: blo(address), height: size, width: size, alt: `Blockies for ${address}`, ...props }));
15
12
  };
16
13
  Blockies.displayName = 'Blockies';
17
14
  //# sourceMappingURL=Blockies.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Blockies.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,qBAAqB,EAAE,gDAAgD;AAChF,OAAO,EAAE,GAAG,EAAE,YAAY;AAC1B,OAAO,MAAK,cAAc;;AAI1B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IAC1E,4DAA4D;IAC5D,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEtD,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,CAAC,cAA+B,CAAC,EACzC,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,gBAAgB,OAAO,EAAE,KAC1B,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import { extractAccountAddress } from '@metamask-previews/design-system-shared';\nimport { blo } from 'blo';\nimport React from 'react';\n\nimport type { BlockiesProps } from './Blockies.types';\n\nexport const Blockies = ({ address, size = 32, ...props }: BlockiesProps) => {\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n return (\n <img\n src={blo(accountAddress as `0x${string}`)}\n height={size}\n width={size}\n alt={`Blockies for ${address}`} // TODO: Add localization for this\n {...props}\n />\n );\n};\n\nBlockies.displayName = 'Blockies';\n"]}
1
+ {"version":3,"file":"Blockies.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,YAAY;AAC1B,OAAO,MAAK,cAAc;;AAI1B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IAC1E,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,CAAC,OAAwB,CAAC,EAClC,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,gBAAgB,OAAO,EAAE,KAC1B,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import { blo } from 'blo';\nimport React from 'react';\n\nimport type { BlockiesProps } from './Blockies.types';\n\nexport const Blockies = ({ address, size = 32, ...props }: BlockiesProps) => {\n return (\n <img\n src={blo(address as `0x${string}`)}\n height={size}\n width={size}\n alt={`Blockies for ${address}`} // TODO: Add localization for this\n {...props}\n />\n );\n};\n\nBlockies.displayName = 'Blockies';\n"]}
@@ -27,10 +27,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.Jazzicon = void 0;
30
- const design_system_shared_1 = require("@metamask-previews/design-system-shared");
31
30
  const jazzicon_1 = __importDefault(require("@metamask/jazzicon"));
31
+ const utils_1 = require("@metamask/utils");
32
32
  const react_1 = __importStar(require("react"));
33
33
  const tw_merge_1 = require("../../../utils/tw-merge.cjs");
34
+ const Jazzicon_utilities_1 = require("./Jazzicon.utilities.cjs");
34
35
  /**
35
36
  * Cache for storing generated SVG elements by `address:diameter` so
36
37
  * we don't regenerate them repeatedly.
@@ -39,43 +40,53 @@ const iconCache = {};
39
40
  const Jazzicon = ({ address, size = 32, className, ...props }) => {
40
41
  const containerRef = (0, react_1.useRef)(null);
41
42
  (0, react_1.useEffect)(() => {
42
- if (!containerRef.current) {
43
- return () => {
44
- // No cleanup needed if container ref was null
45
- };
46
- }
47
- // Clear any existing content
48
- while (containerRef.current.firstChild) {
49
- containerRef.current.removeChild(containerRef.current.firstChild);
50
- }
51
- // Check the cache
52
- const cacheKey = `${address.toLowerCase()}:${size}`;
53
- if (iconCache[cacheKey]) {
54
- // If cached, just append a clone
55
- const clone = iconCache[cacheKey].cloneNode(true);
56
- containerRef.current.appendChild(clone);
57
- return () => {
58
- if (containerRef.current) {
59
- while (containerRef.current.firstChild) {
60
- containerRef.current.removeChild(containerRef.current.firstChild);
61
- }
43
+ let isCancelled = false;
44
+ const generateJazzicon = async () => {
45
+ if (!containerRef.current) {
46
+ return;
47
+ }
48
+ // Clear any existing content
49
+ while (containerRef.current.firstChild) {
50
+ containerRef.current.removeChild(containerRef.current.firstChild);
51
+ }
52
+ // Check the cache
53
+ const cacheKey = `${address.toLowerCase()}:${size}`;
54
+ if (iconCache[cacheKey]) {
55
+ // If cached, just append a clone
56
+ if (!isCancelled) {
57
+ const clone = iconCache[cacheKey].cloneNode(true);
58
+ containerRef.current.appendChild(clone);
62
59
  }
63
- };
64
- }
65
- // Extract the account address from CAIP-10 format if needed
66
- const accountAddress = (0, design_system_shared_1.extractAccountAddress)(address);
67
- // Generate appropriate seed based on address format
68
- const seed = (0, design_system_shared_1.generateIconSeed)(accountAddress);
69
- // Create Jazzicon
70
- const newIcon = (0, jazzicon_1.default)(size, seed);
71
- // Cache it
72
- iconCache[cacheKey] = newIcon;
73
- // Append a fresh clone
74
- if (containerRef.current) {
75
- containerRef.current.appendChild(newIcon.cloneNode(true));
76
- }
60
+ return;
61
+ }
62
+ // Determine the CAIP namespace
63
+ const namespace = await (0, Jazzicon_utilities_1.getCaipNamespaceFromAddress)(address);
64
+ if (isCancelled) {
65
+ return;
66
+ }
67
+ // Pick seeding strategy based on namespace
68
+ let seed;
69
+ if (namespace === utils_1.KnownCaipNamespace.Eip155) {
70
+ seed = (0, Jazzicon_utilities_1.generateSeedEthereum)(address);
71
+ }
72
+ else {
73
+ seed = (0, Jazzicon_utilities_1.generateSeedNonEthereum)(address);
74
+ }
75
+ // Create Jazzicon
76
+ const newIcon = (0, jazzicon_1.default)(size, seed);
77
+ // Cache it
78
+ iconCache[cacheKey] = newIcon;
79
+ // Append a fresh clone
80
+ if (!isCancelled && containerRef.current) {
81
+ containerRef.current.appendChild(newIcon.cloneNode(true));
82
+ }
83
+ };
84
+ generateJazzicon().catch(() => {
85
+ // Silently ignore errors during async generation
86
+ });
77
87
  // Cleanup
78
88
  return () => {
89
+ isCancelled = true;
79
90
  if (containerRef.current) {
80
91
  while (containerRef.current.firstChild) {
81
92
  containerRef.current.removeChild(containerRef.current.firstChild);
@@ -1 +1 @@
1
- {"version":3,"file":"Jazzicon.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kFAGiD;AACjD,kEAA0C;AAC1C,+CAAiD;AAEjD,0DAAkD;AAIlD;;;GAGG;AACH,MAAM,SAAS,GAAmC,EAAE,CAAC;AAE9C,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,EACP,IAAI,GAAG,EAAE,EACT,SAAS,EACT,GAAG,KAAK,EACM,EAAE,EAAE;IAClB,MAAM,YAAY,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAElD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACzB,OAAO,GAAG,EAAE;gBACV,8CAA8C;YAChD,CAAC,CAAC;SACH;QAED,6BAA6B;QAC7B,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;YACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACnE;QAED,kBAAkB;QAClB,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;YACvB,iCAAiC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAmB,CAAC;YACpE,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,GAAG,EAAE;gBACV,IAAI,YAAY,CAAC,OAAO,EAAE;oBACxB,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;wBACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;qBACnE;iBACF;YACH,CAAC,CAAC;SACH;QAED,4DAA4D;QAC5D,MAAM,cAAc,GAAG,IAAA,4CAAqB,EAAC,OAAO,CAAC,CAAC;QAEtD,oDAAoD;QACpD,MAAM,IAAI,GAAG,IAAA,uCAAgB,EAAC,cAAc,CAAC,CAAC;QAE9C,kBAAkB;QAClB,MAAM,OAAO,GAAG,IAAA,kBAAQ,EAAC,IAAI,EAAE,IAAI,CAAmB,CAAC;QAEvD,WAAW;QACX,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAyB,CAAC;QAEhD,uBAAuB;QACvB,IAAI,YAAY,CAAC,OAAO,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;SAC3D;QAED,UAAU;QACV,OAAO,GAAG,EAAE;YACV,IAAI,YAAY,CAAC,OAAO,EAAE;gBACxB,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;oBACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;iBACnE;aACF;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,uCACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,IAAA,kBAAO,EAAC,4BAA4B,EAAE,SAAS,CAAC,KACvD,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AArEW,QAAA,QAAQ,YAqEnB;AAEF,gBAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import {\n extractAccountAddress,\n generateIconSeed,\n} from '@metamask-previews/design-system-shared';\nimport jazzicon from '@metamask/jazzicon';\nimport React, { useEffect, useRef } from 'react';\n\nimport { twMerge } from '../../../utils/tw-merge';\n\nimport type { JazziconProps } from './Jazzicon.types';\n\n/**\n * Cache for storing generated SVG elements by `address:diameter` so\n * we don't regenerate them repeatedly.\n */\nconst iconCache: Record<string, HTMLDivElement> = {};\n\nexport const Jazzicon = ({\n address,\n size = 32,\n className,\n ...props\n}: JazziconProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) {\n return () => {\n // No cleanup needed if container ref was null\n };\n }\n\n // Clear any existing content\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n\n // Check the cache\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (iconCache[cacheKey]) {\n // If cached, just append a clone\n const clone = iconCache[cacheKey].cloneNode(true) as HTMLDivElement;\n containerRef.current.appendChild(clone);\n return () => {\n if (containerRef.current) {\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n }\n };\n }\n\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n // Generate appropriate seed based on address format\n const seed = generateIconSeed(accountAddress);\n\n // Create Jazzicon\n const newIcon = jazzicon(size, seed) as HTMLDivElement;\n\n // Cache it\n iconCache[cacheKey] = newIcon as HTMLDivElement;\n\n // Append a fresh clone\n if (containerRef.current) {\n containerRef.current.appendChild(newIcon.cloneNode(true));\n }\n\n // Cleanup\n return () => {\n if (containerRef.current) {\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n }\n };\n }, [address, size]);\n\n return (\n <div\n ref={containerRef}\n className={twMerge('flex [&>div]:!rounded-none', className)}\n {...props}\n />\n );\n};\n\nJazzicon.displayName = 'Jazzicon';\n"]}
1
+ {"version":3,"file":"Jazzicon.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kEAA0C;AAC1C,2CAAqD;AACrD,+CAAiD;AAEjD,0DAAkD;AAGlD,iEAI8B;AAE9B;;;GAGG;AACH,MAAM,SAAS,GAAmC,EAAE,CAAC;AAE9C,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,EACP,IAAI,GAAG,EAAE,EACT,SAAS,EACT,GAAG,KAAK,EACM,EAAE,EAAE;IAClB,MAAM,YAAY,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAElD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;gBACzB,OAAO;aACR;YACD,6BAA6B;YAC7B,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;gBACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aACnE;YAED,kBAAkB;YAClB,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;YACpD,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;gBACvB,iCAAiC;gBACjC,IAAI,CAAC,WAAW,EAAE;oBAChB,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAmB,CAAC;oBACpE,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;iBACzC;gBACD,OAAO;aACR;YAED,+BAA+B;YAC/B,MAAM,SAAS,GAAG,MAAM,IAAA,gDAA2B,EAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,WAAW,EAAE;gBACf,OAAO;aACR;YAED,2CAA2C;YAC3C,IAAI,IAAuB,CAAC;YAC5B,IAAI,SAAS,KAAK,0BAAkB,CAAC,MAAM,EAAE;gBAC3C,IAAI,GAAG,IAAA,yCAAoB,EAAC,OAAO,CAAC,CAAC;aACtC;iBAAM;gBACL,IAAI,GAAG,IAAA,4CAAuB,EAAC,OAAO,CAAC,CAAC;aACzC;YAED,kBAAkB;YAClB,MAAM,OAAO,GAAG,IAAA,kBAAQ,EAAC,IAAI,EAAE,IAAI,CAAmB,CAAC;YAEvD,WAAW;YACX,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAyB,CAAC;YAEhD,uBAAuB;YACvB,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,OAAO,EAAE;gBACxC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;aAC3D;QACH,CAAC,CAAC;QAEF,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YAC5B,iDAAiD;QACnD,CAAC,CAAC,CAAC;QAEH,UAAU;QACV,OAAO,GAAG,EAAE;YACV,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,YAAY,CAAC,OAAO,EAAE;gBACxB,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;oBACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;iBACnE;aACF;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,uCACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,IAAA,kBAAO,EAAC,4BAA4B,EAAE,SAAS,CAAC,KACvD,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AA/EW,QAAA,QAAQ,YA+EnB;AAEF,gBAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import jazzicon from '@metamask/jazzicon';\nimport { KnownCaipNamespace } from '@metamask/utils';\nimport React, { useEffect, useRef } from 'react';\n\nimport { twMerge } from '../../../utils/tw-merge';\n\nimport type { JazziconProps } from './Jazzicon.types';\nimport {\n generateSeedEthereum,\n generateSeedNonEthereum,\n getCaipNamespaceFromAddress,\n} from './Jazzicon.utilities';\n\n/**\n * Cache for storing generated SVG elements by `address:diameter` so\n * we don't regenerate them repeatedly.\n */\nconst iconCache: Record<string, HTMLDivElement> = {};\n\nexport const Jazzicon = ({\n address,\n size = 32,\n className,\n ...props\n}: JazziconProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const generateJazzicon = async () => {\n if (!containerRef.current) {\n return;\n }\n // Clear any existing content\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n\n // Check the cache\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (iconCache[cacheKey]) {\n // If cached, just append a clone\n if (!isCancelled) {\n const clone = iconCache[cacheKey].cloneNode(true) as HTMLDivElement;\n containerRef.current.appendChild(clone);\n }\n return;\n }\n\n // Determine the CAIP namespace\n const namespace = await getCaipNamespaceFromAddress(address);\n if (isCancelled) {\n return;\n }\n\n // Pick seeding strategy based on namespace\n let seed: number | number[];\n if (namespace === KnownCaipNamespace.Eip155) {\n seed = generateSeedEthereum(address);\n } else {\n seed = generateSeedNonEthereum(address);\n }\n\n // Create Jazzicon\n const newIcon = jazzicon(size, seed) as HTMLDivElement;\n\n // Cache it\n iconCache[cacheKey] = newIcon as HTMLDivElement;\n\n // Append a fresh clone\n if (!isCancelled && containerRef.current) {\n containerRef.current.appendChild(newIcon.cloneNode(true));\n }\n };\n\n generateJazzicon().catch(() => {\n // Silently ignore errors during async generation\n });\n\n // Cleanup\n return () => {\n isCancelled = true;\n if (containerRef.current) {\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n }\n };\n }, [address, size]);\n\n return (\n <div\n ref={containerRef}\n className={twMerge('flex [&>div]:!rounded-none', className)}\n {...props}\n />\n );\n};\n\nJazzicon.displayName = 'Jazzicon';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Jazzicon.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA4B,cAAc;AAIjD,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAQtD,eAAO,MAAM,QAAQ;6CAKlB,aAAa;;CAgEf,CAAC"}
1
+ {"version":3,"file":"Jazzicon.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4B,cAAc;AAIjD,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAatD,eAAO,MAAM,QAAQ;6CAKlB,aAAa;;CA0Ef,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Jazzicon.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA4B,cAAc;AAIjD,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAQtD,eAAO,MAAM,QAAQ;6CAKlB,aAAa;;CAgEf,CAAC"}
1
+ {"version":3,"file":"Jazzicon.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4B,cAAc;AAIjD,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAatD,eAAO,MAAM,QAAQ;6CAKlB,aAAa;;CA0Ef,CAAC"}
@@ -4,12 +4,13 @@ function $importDefault(module) {
4
4
  }
5
5
  return module;
6
6
  }
7
- import { extractAccountAddress, generateIconSeed } from "@metamask-previews/design-system-shared";
8
7
  import $jazzicon from "@metamask/jazzicon";
9
8
  const jazzicon = $importDefault($jazzicon);
9
+ import { KnownCaipNamespace } from "@metamask/utils";
10
10
  import $React, { useEffect, useRef } from "react";
11
11
  const React = $importDefault($React);
12
12
  import { twMerge } from "../../../utils/tw-merge.mjs";
13
+ import { generateSeedEthereum, generateSeedNonEthereum, getCaipNamespaceFromAddress } from "./Jazzicon.utilities.mjs";
13
14
  /**
14
15
  * Cache for storing generated SVG elements by `address:diameter` so
15
16
  * we don't regenerate them repeatedly.
@@ -18,43 +19,53 @@ const iconCache = {};
18
19
  export const Jazzicon = ({ address, size = 32, className, ...props }) => {
19
20
  const containerRef = useRef(null);
20
21
  useEffect(() => {
21
- if (!containerRef.current) {
22
- return () => {
23
- // No cleanup needed if container ref was null
24
- };
25
- }
26
- // Clear any existing content
27
- while (containerRef.current.firstChild) {
28
- containerRef.current.removeChild(containerRef.current.firstChild);
29
- }
30
- // Check the cache
31
- const cacheKey = `${address.toLowerCase()}:${size}`;
32
- if (iconCache[cacheKey]) {
33
- // If cached, just append a clone
34
- const clone = iconCache[cacheKey].cloneNode(true);
35
- containerRef.current.appendChild(clone);
36
- return () => {
37
- if (containerRef.current) {
38
- while (containerRef.current.firstChild) {
39
- containerRef.current.removeChild(containerRef.current.firstChild);
40
- }
22
+ let isCancelled = false;
23
+ const generateJazzicon = async () => {
24
+ if (!containerRef.current) {
25
+ return;
26
+ }
27
+ // Clear any existing content
28
+ while (containerRef.current.firstChild) {
29
+ containerRef.current.removeChild(containerRef.current.firstChild);
30
+ }
31
+ // Check the cache
32
+ const cacheKey = `${address.toLowerCase()}:${size}`;
33
+ if (iconCache[cacheKey]) {
34
+ // If cached, just append a clone
35
+ if (!isCancelled) {
36
+ const clone = iconCache[cacheKey].cloneNode(true);
37
+ containerRef.current.appendChild(clone);
41
38
  }
42
- };
43
- }
44
- // Extract the account address from CAIP-10 format if needed
45
- const accountAddress = extractAccountAddress(address);
46
- // Generate appropriate seed based on address format
47
- const seed = generateIconSeed(accountAddress);
48
- // Create Jazzicon
49
- const newIcon = jazzicon(size, seed);
50
- // Cache it
51
- iconCache[cacheKey] = newIcon;
52
- // Append a fresh clone
53
- if (containerRef.current) {
54
- containerRef.current.appendChild(newIcon.cloneNode(true));
55
- }
39
+ return;
40
+ }
41
+ // Determine the CAIP namespace
42
+ const namespace = await getCaipNamespaceFromAddress(address);
43
+ if (isCancelled) {
44
+ return;
45
+ }
46
+ // Pick seeding strategy based on namespace
47
+ let seed;
48
+ if (namespace === KnownCaipNamespace.Eip155) {
49
+ seed = generateSeedEthereum(address);
50
+ }
51
+ else {
52
+ seed = generateSeedNonEthereum(address);
53
+ }
54
+ // Create Jazzicon
55
+ const newIcon = jazzicon(size, seed);
56
+ // Cache it
57
+ iconCache[cacheKey] = newIcon;
58
+ // Append a fresh clone
59
+ if (!isCancelled && containerRef.current) {
60
+ containerRef.current.appendChild(newIcon.cloneNode(true));
61
+ }
62
+ };
63
+ generateJazzicon().catch(() => {
64
+ // Silently ignore errors during async generation
65
+ });
56
66
  // Cleanup
57
67
  return () => {
68
+ isCancelled = true;
58
69
  if (containerRef.current) {
59
70
  while (containerRef.current.firstChild) {
60
71
  containerRef.current.removeChild(containerRef.current.firstChild);
@@ -1 +1 @@
1
- {"version":3,"file":"Jazzicon.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EACjB,gDAAgD;AACjD,OAAO,SAAQ,2BAA2B;;AAC1C,OAAO,QAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc;;AAEjD,OAAO,EAAE,OAAO,EAAE,oCAAgC;AAIlD;;;GAGG;AACH,MAAM,SAAS,GAAmC,EAAE,CAAC;AAErD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,EACP,IAAI,GAAG,EAAE,EACT,SAAS,EACT,GAAG,KAAK,EACM,EAAE,EAAE;IAClB,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACzB,OAAO,GAAG,EAAE;gBACV,8CAA8C;YAChD,CAAC,CAAC;SACH;QAED,6BAA6B;QAC7B,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;YACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACnE;QAED,kBAAkB;QAClB,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;YACvB,iCAAiC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAmB,CAAC;YACpE,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,GAAG,EAAE;gBACV,IAAI,YAAY,CAAC,OAAO,EAAE;oBACxB,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;wBACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;qBACnE;iBACF;YACH,CAAC,CAAC;SACH;QAED,4DAA4D;QAC5D,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAEtD,oDAAoD;QACpD,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAE9C,kBAAkB;QAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAmB,CAAC;QAEvD,WAAW;QACX,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAyB,CAAC;QAEhD,uBAAuB;QACvB,IAAI,YAAY,CAAC,OAAO,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;SAC3D;QAED,UAAU;QACV,OAAO,GAAG,EAAE;YACV,IAAI,YAAY,CAAC,OAAO,EAAE;gBACxB,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE;oBACtC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;iBACnE;aACF;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,6BACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,OAAO,CAAC,4BAA4B,EAAE,SAAS,CAAC,KACvD,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC","sourcesContent":["import {\n extractAccountAddress,\n generateIconSeed,\n} from '@metamask-previews/design-system-shared';\nimport jazzicon from '@metamask/jazzicon';\nimport React, { useEffect, useRef } from 'react';\n\nimport { twMerge } from '../../../utils/tw-merge';\n\nimport type { JazziconProps } from './Jazzicon.types';\n\n/**\n * Cache for storing generated SVG elements by `address:diameter` so\n * we don't regenerate them repeatedly.\n */\nconst iconCache: Record<string, HTMLDivElement> = {};\n\nexport const Jazzicon = ({\n address,\n size = 32,\n className,\n ...props\n}: JazziconProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) {\n return () => {\n // No cleanup needed if container ref was null\n };\n }\n\n // Clear any existing content\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n\n // Check the cache\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (iconCache[cacheKey]) {\n // If cached, just append a clone\n const clone = iconCache[cacheKey].cloneNode(true) as HTMLDivElement;\n containerRef.current.appendChild(clone);\n return () => {\n if (containerRef.current) {\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n }\n };\n }\n\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n // Generate appropriate seed based on address format\n const seed = generateIconSeed(accountAddress);\n\n // Create Jazzicon\n const newIcon = jazzicon(size, seed) as HTMLDivElement;\n\n // Cache it\n iconCache[cacheKey] = newIcon as HTMLDivElement;\n\n // Append a fresh clone\n if (containerRef.current) {\n containerRef.current.appendChild(newIcon.cloneNode(true));\n }\n\n // Cleanup\n return () => {\n if (containerRef.current) {\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n }\n };\n }, [address, size]);\n\n return (\n <div\n ref={containerRef}\n className={twMerge('flex [&>div]:!rounded-none', className)}\n {...props}\n />\n );\n};\n\nJazzicon.displayName = 'Jazzicon';\n"]}
1
+ {"version":3,"file":"Jazzicon.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"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","sourcesContent":["import jazzicon from '@metamask/jazzicon';\nimport { KnownCaipNamespace } from '@metamask/utils';\nimport React, { useEffect, useRef } from 'react';\n\nimport { twMerge } from '../../../utils/tw-merge';\n\nimport type { JazziconProps } from './Jazzicon.types';\nimport {\n generateSeedEthereum,\n generateSeedNonEthereum,\n getCaipNamespaceFromAddress,\n} from './Jazzicon.utilities';\n\n/**\n * Cache for storing generated SVG elements by `address:diameter` so\n * we don't regenerate them repeatedly.\n */\nconst iconCache: Record<string, HTMLDivElement> = {};\n\nexport const Jazzicon = ({\n address,\n size = 32,\n className,\n ...props\n}: JazziconProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const generateJazzicon = async () => {\n if (!containerRef.current) {\n return;\n }\n // Clear any existing content\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n\n // Check the cache\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (iconCache[cacheKey]) {\n // If cached, just append a clone\n if (!isCancelled) {\n const clone = iconCache[cacheKey].cloneNode(true) as HTMLDivElement;\n containerRef.current.appendChild(clone);\n }\n return;\n }\n\n // Determine the CAIP namespace\n const namespace = await getCaipNamespaceFromAddress(address);\n if (isCancelled) {\n return;\n }\n\n // Pick seeding strategy based on namespace\n let seed: number | number[];\n if (namespace === KnownCaipNamespace.Eip155) {\n seed = generateSeedEthereum(address);\n } else {\n seed = generateSeedNonEthereum(address);\n }\n\n // Create Jazzicon\n const newIcon = jazzicon(size, seed) as HTMLDivElement;\n\n // Cache it\n iconCache[cacheKey] = newIcon as HTMLDivElement;\n\n // Append a fresh clone\n if (!isCancelled && containerRef.current) {\n containerRef.current.appendChild(newIcon.cloneNode(true));\n }\n };\n\n generateJazzicon().catch(() => {\n // Silently ignore errors during async generation\n });\n\n // Cleanup\n return () => {\n isCancelled = true;\n if (containerRef.current) {\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n }\n };\n }, [address, size]);\n\n return (\n <div\n ref={containerRef}\n className={twMerge('flex [&>div]:!rounded-none', className)}\n {...props}\n />\n );\n};\n\nJazzicon.displayName = 'Jazzicon';\n"]}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCaipNamespaceFromAddress = exports.generateSeedNonEthereum = exports.generateSeedEthereum = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const addresses_1 = require("@solana/addresses");
6
+ /**
7
+ * Generates a numeric seed for Ethereum (eip155) addresses.
8
+ *
9
+ * @param address - The Ethereum address to generate a seed from
10
+ * @returns A numeric seed for jazzicon generation
11
+ */
12
+ function generateSeedEthereum(address) {
13
+ // Example: parse the first 8 chars of the address after '0x'
14
+ const addr = address.slice(2, 10);
15
+ return parseInt(addr, 16);
16
+ }
17
+ exports.generateSeedEthereum = generateSeedEthereum;
18
+ /**
19
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
20
+ *
21
+ * @param address - The address to generate a byte array seed from
22
+ * @returns An array of numbers representing the bytes of the address
23
+ */
24
+ function generateSeedNonEthereum(address) {
25
+ return Array.from((0, utils_1.stringToBytes)(address.normalize('NFKC').toLowerCase()));
26
+ }
27
+ exports.generateSeedNonEthereum = generateSeedNonEthereum;
28
+ /**
29
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise default to Ethereum.
30
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
31
+ *
32
+ * @param address - The address to determine the CAIP namespace for
33
+ * @returns A Promise that resolves to a KnownCaipNamespace
34
+ */
35
+ async function getCaipNamespaceFromAddress(address) {
36
+ // Check for CAIP-10 formatted addresses
37
+ if (address.includes(':')) {
38
+ const [namespace] = address.split(':');
39
+ if (namespace.toLowerCase() === 'bip122') {
40
+ return utils_1.KnownCaipNamespace.Bip122;
41
+ }
42
+ if (namespace.toLowerCase() === 'solana') {
43
+ return utils_1.KnownCaipNamespace.Solana;
44
+ }
45
+ if (namespace.toLowerCase() === 'eip155') {
46
+ return utils_1.KnownCaipNamespace.Eip155;
47
+ }
48
+ // Add other namespaces as needed.
49
+ }
50
+ try {
51
+ const { validate, Network } = await import("bitcoin-address-validation");
52
+ if (validate(address, Network.mainnet) ||
53
+ validate(address, Network.testnet)) {
54
+ return utils_1.KnownCaipNamespace.Bip122;
55
+ }
56
+ }
57
+ catch {
58
+ // If the import fails or 'validate' is not available, fall through
59
+ }
60
+ if ((0, addresses_1.isAddress)(address)) {
61
+ return utils_1.KnownCaipNamespace.Solana;
62
+ }
63
+ // Default to Ethereum
64
+ return utils_1.KnownCaipNamespace.Eip155;
65
+ }
66
+ exports.getCaipNamespaceFromAddress = getCaipNamespaceFromAddress;
67
+ //# sourceMappingURL=Jazzicon.utilities.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jazzicon.utilities.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.utilities.ts"],"names":[],"mappings":";;;AAAA,2CAAoE;AACpE,iDAAiE;AAEjE;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,OAAe;IAClD,6DAA6D;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC;AAJD,oDAIC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,OAAe;IACrD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAFD,0DAEC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,2BAA2B,CAC/C,OAAe;IAEf,wCAAwC;IACxC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACxC,OAAO,0BAAkB,CAAC,MAAM,CAAC;SAClC;QACD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACxC,OAAO,0BAAkB,CAAC,MAAM,CAAC;SAClC;QACD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACxC,OAAO,0BAAkB,CAAC,MAAM,CAAC;SAClC;QACD,kCAAkC;KACnC;IAED,IAAI;QACF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,8BAA8B,CAAC;QACzE,IACE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;YAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAClC;YACA,OAAO,0BAAkB,CAAC,MAAM,CAAC;SAClC;KACF;IAAC,MAAM;QACN,mEAAmE;KACpE;IAED,IAAI,IAAA,qBAAe,EAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,0BAAkB,CAAC,MAAM,CAAC;KAClC;IAED,sBAAsB;IACtB,OAAO,0BAAkB,CAAC,MAAM,CAAC;AACnC,CAAC;AApCD,kEAoCC","sourcesContent":["import { stringToBytes, KnownCaipNamespace } from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\n/**\n * Generates a numeric seed for Ethereum (eip155) addresses.\n *\n * @param address - The Ethereum address to generate a seed from\n * @returns A numeric seed for jazzicon generation\n */\nexport function generateSeedEthereum(address: string): number {\n // Example: parse the first 8 chars of the address after '0x'\n const addr = address.slice(2, 10);\n return parseInt(addr, 16);\n}\n\n/**\n * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).\n *\n * @param address - The address to generate a byte array seed from\n * @returns An array of numbers representing the bytes of the address\n */\nexport function generateSeedNonEthereum(address: string): number[] {\n return Array.from(stringToBytes(address.normalize('NFKC').toLowerCase()));\n}\n\n/**\n * Dynamically checks if the address is Bitcoin or Solana; otherwise default to Ethereum.\n * Returns a Promise that resolves to one of the known CAIP-2 namespaces.\n *\n * @param address - The address to determine the CAIP namespace for\n * @returns A Promise that resolves to a KnownCaipNamespace\n */\nexport async function getCaipNamespaceFromAddress(\n address: string,\n): Promise<KnownCaipNamespace> {\n // Check for CAIP-10 formatted addresses\n if (address.includes(':')) {\n const [namespace] = address.split(':');\n if (namespace.toLowerCase() === 'bip122') {\n return KnownCaipNamespace.Bip122;\n }\n if (namespace.toLowerCase() === 'solana') {\n return KnownCaipNamespace.Solana;\n }\n if (namespace.toLowerCase() === 'eip155') {\n return KnownCaipNamespace.Eip155;\n }\n // Add other namespaces as needed.\n }\n\n try {\n const { validate, Network } = await import('bitcoin-address-validation');\n if (\n validate(address, Network.mainnet) ||\n validate(address, Network.testnet)\n ) {\n return KnownCaipNamespace.Bip122;\n }\n } catch {\n // If the import fails or 'validate' is not available, fall through\n }\n\n if (isSolanaAddress(address)) {\n return KnownCaipNamespace.Solana;\n }\n\n // Default to Ethereum\n return KnownCaipNamespace.Eip155;\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { KnownCaipNamespace } from "@metamask/utils";
2
+ /**
3
+ * Generates a numeric seed for Ethereum (eip155) addresses.
4
+ *
5
+ * @param address - The Ethereum address to generate a seed from
6
+ * @returns A numeric seed for jazzicon generation
7
+ */
8
+ export declare function generateSeedEthereum(address: string): number;
9
+ /**
10
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
11
+ *
12
+ * @param address - The address to generate a byte array seed from
13
+ * @returns An array of numbers representing the bytes of the address
14
+ */
15
+ export declare function generateSeedNonEthereum(address: string): number[];
16
+ /**
17
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise default to Ethereum.
18
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
19
+ *
20
+ * @param address - The address to determine the CAIP namespace for
21
+ * @returns A Promise that resolves to a KnownCaipNamespace
22
+ */
23
+ export declare function getCaipNamespaceFromAddress(address: string): Promise<KnownCaipNamespace>;
24
+ //# sourceMappingURL=Jazzicon.utilities.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jazzicon.utilities.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,kBAAkB,EAAE,wBAAwB;AAGpE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAkC7B"}
@@ -0,0 +1,24 @@
1
+ import { KnownCaipNamespace } from "@metamask/utils";
2
+ /**
3
+ * Generates a numeric seed for Ethereum (eip155) addresses.
4
+ *
5
+ * @param address - The Ethereum address to generate a seed from
6
+ * @returns A numeric seed for jazzicon generation
7
+ */
8
+ export declare function generateSeedEthereum(address: string): number;
9
+ /**
10
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
11
+ *
12
+ * @param address - The address to generate a byte array seed from
13
+ * @returns An array of numbers representing the bytes of the address
14
+ */
15
+ export declare function generateSeedNonEthereum(address: string): number[];
16
+ /**
17
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise default to Ethereum.
18
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
19
+ *
20
+ * @param address - The address to determine the CAIP namespace for
21
+ * @returns A Promise that resolves to a KnownCaipNamespace
22
+ */
23
+ export declare function getCaipNamespaceFromAddress(address: string): Promise<KnownCaipNamespace>;
24
+ //# sourceMappingURL=Jazzicon.utilities.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jazzicon.utilities.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,kBAAkB,EAAE,wBAAwB;AAGpE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAkC7B"}
@@ -0,0 +1,61 @@
1
+ import { stringToBytes, KnownCaipNamespace } from "@metamask/utils";
2
+ import { isAddress as isSolanaAddress } from "@solana/addresses";
3
+ /**
4
+ * Generates a numeric seed for Ethereum (eip155) addresses.
5
+ *
6
+ * @param address - The Ethereum address to generate a seed from
7
+ * @returns A numeric seed for jazzicon generation
8
+ */
9
+ export function generateSeedEthereum(address) {
10
+ // Example: parse the first 8 chars of the address after '0x'
11
+ const addr = address.slice(2, 10);
12
+ return parseInt(addr, 16);
13
+ }
14
+ /**
15
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
16
+ *
17
+ * @param address - The address to generate a byte array seed from
18
+ * @returns An array of numbers representing the bytes of the address
19
+ */
20
+ export function generateSeedNonEthereum(address) {
21
+ return Array.from(stringToBytes(address.normalize('NFKC').toLowerCase()));
22
+ }
23
+ /**
24
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise default to Ethereum.
25
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
26
+ *
27
+ * @param address - The address to determine the CAIP namespace for
28
+ * @returns A Promise that resolves to a KnownCaipNamespace
29
+ */
30
+ export async function getCaipNamespaceFromAddress(address) {
31
+ // Check for CAIP-10 formatted addresses
32
+ if (address.includes(':')) {
33
+ const [namespace] = address.split(':');
34
+ if (namespace.toLowerCase() === 'bip122') {
35
+ return KnownCaipNamespace.Bip122;
36
+ }
37
+ if (namespace.toLowerCase() === 'solana') {
38
+ return KnownCaipNamespace.Solana;
39
+ }
40
+ if (namespace.toLowerCase() === 'eip155') {
41
+ return KnownCaipNamespace.Eip155;
42
+ }
43
+ // Add other namespaces as needed.
44
+ }
45
+ try {
46
+ const { validate, Network } = await import("bitcoin-address-validation");
47
+ if (validate(address, Network.mainnet) ||
48
+ validate(address, Network.testnet)) {
49
+ return KnownCaipNamespace.Bip122;
50
+ }
51
+ }
52
+ catch {
53
+ // If the import fails or 'validate' is not available, fall through
54
+ }
55
+ if (isSolanaAddress(address)) {
56
+ return KnownCaipNamespace.Solana;
57
+ }
58
+ // Default to Ethereum
59
+ return KnownCaipNamespace.Eip155;
60
+ }
61
+ //# sourceMappingURL=Jazzicon.utilities.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jazzicon.utilities.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,wBAAwB;AACpE,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,0BAA0B;AAEjE;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,6DAA6D;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAe;IAEf,wCAAwC;IACxC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACxC,OAAO,kBAAkB,CAAC,MAAM,CAAC;SAClC;QACD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACxC,OAAO,kBAAkB,CAAC,MAAM,CAAC;SAClC;QACD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACxC,OAAO,kBAAkB,CAAC,MAAM,CAAC;SAClC;QACD,kCAAkC;KACnC;IAED,IAAI;QACF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,8BAA8B,CAAC;QACzE,IACE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;YAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAClC;YACA,OAAO,kBAAkB,CAAC,MAAM,CAAC;SAClC;KACF;IAAC,MAAM;QACN,mEAAmE;KACpE;IAED,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,kBAAkB,CAAC,MAAM,CAAC;KAClC;IAED,sBAAsB;IACtB,OAAO,kBAAkB,CAAC,MAAM,CAAC;AACnC,CAAC","sourcesContent":["import { stringToBytes, KnownCaipNamespace } from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\n/**\n * Generates a numeric seed for Ethereum (eip155) addresses.\n *\n * @param address - The Ethereum address to generate a seed from\n * @returns A numeric seed for jazzicon generation\n */\nexport function generateSeedEthereum(address: string): number {\n // Example: parse the first 8 chars of the address after '0x'\n const addr = address.slice(2, 10);\n return parseInt(addr, 16);\n}\n\n/**\n * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).\n *\n * @param address - The address to generate a byte array seed from\n * @returns An array of numbers representing the bytes of the address\n */\nexport function generateSeedNonEthereum(address: string): number[] {\n return Array.from(stringToBytes(address.normalize('NFKC').toLowerCase()));\n}\n\n/**\n * Dynamically checks if the address is Bitcoin or Solana; otherwise default to Ethereum.\n * Returns a Promise that resolves to one of the known CAIP-2 namespaces.\n *\n * @param address - The address to determine the CAIP namespace for\n * @returns A Promise that resolves to a KnownCaipNamespace\n */\nexport async function getCaipNamespaceFromAddress(\n address: string,\n): Promise<KnownCaipNamespace> {\n // Check for CAIP-10 formatted addresses\n if (address.includes(':')) {\n const [namespace] = address.split(':');\n if (namespace.toLowerCase() === 'bip122') {\n return KnownCaipNamespace.Bip122;\n }\n if (namespace.toLowerCase() === 'solana') {\n return KnownCaipNamespace.Solana;\n }\n if (namespace.toLowerCase() === 'eip155') {\n return KnownCaipNamespace.Eip155;\n }\n // Add other namespaces as needed.\n }\n\n try {\n const { validate, Network } = await import('bitcoin-address-validation');\n if (\n validate(address, Network.mainnet) ||\n validate(address, Network.testnet)\n ) {\n return KnownCaipNamespace.Bip122;\n }\n } catch {\n // If the import fails or 'validate' is not available, fall through\n }\n\n if (isSolanaAddress(address)) {\n return KnownCaipNamespace.Solana;\n }\n\n // Default to Ethereum\n return KnownCaipNamespace.Eip155;\n}\n"]}
@@ -1,7 +1,78 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMaskiconSVG = exports.createMaskiconSVG = exports.seedToString = exports.sdbmHash = void 0;
4
- const design_system_shared_1 = require("@metamask-previews/design-system-shared");
3
+ exports.getMaskiconSVG = exports.createMaskiconSVG = exports.seedToString = exports.sdbmHash = exports.getCaipNamespaceFromAddress = exports.generateSeedNonEthereum = exports.generateSeedEthereum = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const addresses_1 = require("@solana/addresses");
6
+ // /////////////////////////////////////////////////////
7
+ // Address validation
8
+ // /////////////////////////////////////////////////////
9
+ /**
10
+ * Generates a numeric seed for Ethereum (eip155) addresses.
11
+ *
12
+ * @param address The Ethereum address to generate a seed from
13
+ * @returns A numeric seed derived from the address
14
+ */
15
+ function generateSeedEthereum(address) {
16
+ // Example: parse the first 8 chars of the address after '0x'
17
+ const addr = address.slice(2, 10);
18
+ return parseInt(addr, 16);
19
+ }
20
+ exports.generateSeedEthereum = generateSeedEthereum;
21
+ /**
22
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
23
+ *
24
+ * @param address The non-Ethereum address to generate a seed from
25
+ * @returns An array of numbers representing the byte-array seed
26
+ */
27
+ function generateSeedNonEthereum(address) {
28
+ return Array.from((0, utils_1.stringToBytes)(address.normalize('NFKC').toLowerCase()));
29
+ }
30
+ exports.generateSeedNonEthereum = generateSeedNonEthereum;
31
+ /**
32
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise defaults to Ethereum.
33
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
34
+ *
35
+ * In this update, if the address starts with "0x", we'll assume it's Ethereum (Eip155)
36
+ * and avoid the dynamic import that can cause the "Requiring unknown module '2021'" error.
37
+ *
38
+ * @param address The address to check and determine its namespace
39
+ * @returns A promise that resolves to the detected CAIP-2 namespace
40
+ */
41
+ async function getCaipNamespaceFromAddress(address) {
42
+ // If the address starts with '0x', assume Ethereum.
43
+ if (address.startsWith('0x')) {
44
+ return utils_1.KnownCaipNamespace.Eip155;
45
+ }
46
+ // Check for CAIP-10 formatted addresses
47
+ if (address.includes(':')) {
48
+ const [namespace] = address.split(':');
49
+ const nsLower = namespace.toLowerCase();
50
+ if (nsLower === 'bip122') {
51
+ return utils_1.KnownCaipNamespace.Bip122;
52
+ }
53
+ if (nsLower === 'solana') {
54
+ return utils_1.KnownCaipNamespace.Solana;
55
+ }
56
+ }
57
+ // Attempt to use bitcoin-address-validation if available.
58
+ try {
59
+ const { validate, Network } = await import("bitcoin-address-validation");
60
+ if (validate(address, Network.mainnet) ||
61
+ validate(address, Network.testnet)) {
62
+ return utils_1.KnownCaipNamespace.Bip122;
63
+ }
64
+ }
65
+ catch {
66
+ // If the import fails, fall through.
67
+ }
68
+ // Fallback: if it looks like a Solana address, return Solana.
69
+ if ((0, addresses_1.isAddress)(address)) {
70
+ return utils_1.KnownCaipNamespace.Solana;
71
+ }
72
+ // Default to Ethereum.
73
+ return utils_1.KnownCaipNamespace.Eip155;
74
+ }
75
+ exports.getCaipNamespaceFromAddress = getCaipNamespaceFromAddress;
5
76
  // /////////////////////////////////////////////////////
6
77
  // Maskicon SVG Creation
7
78
  // /////////////////////////////////////////////////////
@@ -195,10 +266,14 @@ async function getMaskiconSVG(address, size) {
195
266
  if (svgCache[cacheKey]) {
196
267
  return svgCache[cacheKey];
197
268
  }
198
- // Extract the account address from CAIP-10 format if needed
199
- const accountAddress = (0, design_system_shared_1.extractAccountAddress)(address);
200
- // Generate appropriate seed based on address format
201
- const seed = (0, design_system_shared_1.generateIconSeed)(accountAddress);
269
+ const namespace = await getCaipNamespaceFromAddress(address);
270
+ let seed;
271
+ if (namespace === utils_1.KnownCaipNamespace.Eip155) {
272
+ seed = generateSeedEthereum(address);
273
+ }
274
+ else {
275
+ seed = generateSeedNonEthereum(address);
276
+ }
202
277
  const svgString = createMaskiconSVG(seed, size);
203
278
  svgCache[cacheKey] = svgString;
204
279
  return svgString;
@@ -1 +1 @@
1
- {"version":3,"file":"Maskicon.utilities.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n extractAccountAddress,\n generateIconSeed,\n} from '@metamask-previews/design-system-shared';\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation\n// /////////////////////////////////////////////////////\n// Color Palettes\nconst neutralPairs = [\n ['#FF5C16', '#FCFCFC'],\n ['#FF5C16', '#131416'],\n ['#D075FF', '#FCFCFC'],\n ['#D075FF', '#131416'],\n ['#BAF24A', '#FCFCFC'],\n ['#BAF24A', '#131416'],\n ['#89B0FF', '#FCFCFC'],\n ['#89B0FF', '#131416'],\n ['#FCFCFC', '#FF5C16'],\n ['#131416', '#FF5C16'],\n ['#FCFCFC', '#D075FF'],\n ['#131416', '#D075FF'],\n ['#FCFCFC', '#BAF24A'],\n ['#131416', '#BAF24A'],\n ['#FCFCFC', '#89B0FF'],\n ['#131416', '#89B0FF'],\n];\n\nconst tonalPairs = [\n ['#FFA680', '#FF5C16'],\n ['#661800', '#FF5C16'],\n ['#EAC2FF', '#D075FF'],\n ['#3D065F', '#D075FF'],\n ['#E5FFC3', '#BAF24A'],\n ['#013330', '#BAF24A'],\n ['#CCE7FF', '#89B0FF'],\n ['#190066', '#89B0FF'],\n ['#FF5C16', '#FFA680'],\n ['#FF5C16', '#661800'],\n ['#D075FF', '#EAC2FF'],\n ['#D075FF', '#3D065F'],\n ['#BAF24A', '#E5FFC3'],\n ['#BAF24A', '#013330'],\n ['#89B0FF', '#CCE7FF'],\n ['#89B0FF', '#190066'],\n ['#661800', '#FFA680'],\n ['#FFA680', '#661800'],\n ['#3D065F', '#EAC2FF'],\n ['#EAC2FF', '#3D065F'],\n ['#013330', '#E5FFC3'],\n ['#E5FFC3', '#013330'],\n ['#190066', '#CCE7FF'],\n ['#CCE7FF', '#190066'],\n];\n\nconst complementaryPairs = [\n ['#EAC2FF', '#013330'],\n ['#013330', '#EAC2FF'],\n ['#CCE7FF', '#661800'],\n ['#661800', '#CCE7FF'],\n ['#E5FFC3', '#3D065F'],\n ['#3D065F', '#E5FFC3'],\n ['#FFA680', '#190066'],\n ['#190066', '#FFA680'],\n ['#CCE7FF', '#013330'],\n ['#013330', '#CCE7FF'],\n];\n\nconst colorPairs = neutralPairs.concat(tonalPairs).concat(complementaryPairs);\n\n/**\n * SDBM hash function\n *\n * @param str The string to hash\n * @returns A numeric hash value\n */\nexport function sdbmHash(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = str.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;\n }\n return hash;\n}\n\n/**\n * Convert numeric/byte-array seed to a 6+ length string\n *\n * @param seed The seed value to convert (either a number or array of numbers)\n * @returns A string representation of the seed (minimum 6 characters)\n */\nexport function seedToString(seed: number | number[]): string {\n if (typeof seed === 'number') {\n let hex = seed.toString(16);\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n if (Array.isArray(seed)) {\n let hex = seed.map((b) => b.toString(16).padStart(2, '0')).join('');\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n return 'seed000';\n}\n\n/**\n * Builds a full <svg> string containing the Maskicon shapes.\n *\n * @param seed The seed value used to generate the icon\n * @param size The size of the SVG icon in pixels\n * @returns An SVG string representing the Maskicon\n */\nexport function createMaskiconSVG(seed: number | number[], size = 100): string {\n // 1) Convert seed to string, then hash\n const str = seedToString(seed);\n const hashVal = sdbmHash(str);\n\n // 2) Pick color pair based on the hash\n const colorPairIndex = Math.abs(hashVal) % colorPairs.length;\n const [bgColor, fgColor] = colorPairs[colorPairIndex];\n\n // 3) Geometry setup\n const grid = 2;\n const margin = size * 0.25;\n const innerSize = size - 2 * margin;\n const cellSize = innerSize / grid;\n\n let pathData = '';\n const filledGrid: boolean[][] = Array.from({ length: grid }, () =>\n Array(grid).fill(false),\n );\n\n const startX = Math.floor(grid / 2);\n const startY = Math.floor(grid / 2);\n const stack = [[startX, startY]];\n filledGrid[startX][startY] = true;\n\n while (stack.length > 0) {\n // Using destructuring assignment with a non-null assertion is safe here because we've verified stack.length > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [x, y] = stack.pop()!;\n // eslint-disable-next-line no-bitwise\n const cellHash = Math.abs(hashVal >> (x * 3 + y * 5)) & 15;\n\n const neighbors: [number, number][] = [];\n const directions: [number, number][] = [\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, 0],\n ];\n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n if (nx >= 0 && nx < grid && ny >= 0 && ny < grid && !filledGrid[nx][ny]) {\n neighbors.push([nx, ny]);\n }\n }\n while (neighbors.length > 0) {\n const idx = Math.abs(cellHash + neighbors.length) % neighbors.length;\n const [nx, ny] = neighbors.splice(idx, 1)[0];\n stack.push([nx, ny]);\n filledGrid[nx][ny] = true;\n }\n\n // Determine shape: square or right triangle (with rotation)\n const rotation = (cellHash % 4) * 90;\n const isSquare = cellHash % 5 === 0; // ~20% chance\n const cx = margin + x * cellSize;\n const cy = margin + y * cellSize;\n\n if (isSquare) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 0) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize}z `;\n } else if (rotation === 90) {\n pathData += `M${cx + cellSize},${cy} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 180) {\n pathData += `M${cx + cellSize},${cy + cellSize} h-${cellSize} v-${cellSize}z `;\n } else {\n pathData += `M${cx},${cy + cellSize} v-${cellSize} h${cellSize}z `;\n }\n }\n\n // 4) Construct final SVG string (always rectangular)\n let svgString = `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n svgString += `<rect width=\"${size}\" height=\"${size}\" fill=\"${bgColor}\" />`;\n svgString += `<path d=\"${pathData}\" fill=\"${fgColor}\" />`;\n svgString += `</svg>`;\n return svgString;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation and Caching\n// /////////////////////////////////////////////////////\ntype CacheKey = string;\nconst svgCache: Record<CacheKey, string> = {};\n\n/**\n * Returns a Promise that resolves to the final <svg> string for the given address.\n *\n * @param address The address to generate the Maskicon for\n * @param size The size of the icon in pixels\n * @returns A promise that resolves to an SVG string\n */\nexport async function getMaskiconSVG(\n address: string,\n size: number,\n): Promise<string> {\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (svgCache[cacheKey]) {\n return svgCache[cacheKey];\n }\n\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n // Generate appropriate seed based on address format\n const seed = generateIconSeed(accountAddress);\n\n const svgString = createMaskiconSVG(seed, size);\n svgCache[cacheKey] = svgString;\n return svgString;\n}\n"]}
1
+ {"version":3,"file":"Maskicon.utilities.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { stringToBytes, KnownCaipNamespace } from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\n// /////////////////////////////////////////////////////\n// Address validation\n// /////////////////////////////////////////////////////\n/**\n * Generates a numeric seed for Ethereum (eip155) addresses.\n *\n * @param address The Ethereum address to generate a seed from\n * @returns A numeric seed derived from the address\n */\nexport function generateSeedEthereum(address: string): number {\n // Example: parse the first 8 chars of the address after '0x'\n const addr = address.slice(2, 10);\n return parseInt(addr, 16);\n}\n\n/**\n * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).\n *\n * @param address The non-Ethereum address to generate a seed from\n * @returns An array of numbers representing the byte-array seed\n */\nexport function generateSeedNonEthereum(address: string): number[] {\n return Array.from(stringToBytes(address.normalize('NFKC').toLowerCase()));\n}\n\n/**\n * Dynamically checks if the address is Bitcoin or Solana; otherwise defaults to Ethereum.\n * Returns a Promise that resolves to one of the known CAIP-2 namespaces.\n *\n * In this update, if the address starts with \"0x\", we'll assume it's Ethereum (Eip155)\n * and avoid the dynamic import that can cause the \"Requiring unknown module '2021'\" error.\n *\n * @param address The address to check and determine its namespace\n * @returns A promise that resolves to the detected CAIP-2 namespace\n */\nexport async function getCaipNamespaceFromAddress(\n address: string,\n): Promise<KnownCaipNamespace> {\n // If the address starts with '0x', assume Ethereum.\n if (address.startsWith('0x')) {\n return KnownCaipNamespace.Eip155;\n }\n\n // Check for CAIP-10 formatted addresses\n if (address.includes(':')) {\n const [namespace] = address.split(':');\n const nsLower = namespace.toLowerCase();\n if (nsLower === 'bip122') {\n return KnownCaipNamespace.Bip122;\n }\n if (nsLower === 'solana') {\n return KnownCaipNamespace.Solana;\n }\n }\n\n // Attempt to use bitcoin-address-validation if available.\n try {\n const { validate, Network } = await import('bitcoin-address-validation');\n if (\n validate(address, Network.mainnet) ||\n validate(address, Network.testnet)\n ) {\n return KnownCaipNamespace.Bip122;\n }\n } catch {\n // If the import fails, fall through.\n }\n\n // Fallback: if it looks like a Solana address, return Solana.\n if (isSolanaAddress(address)) {\n return KnownCaipNamespace.Solana;\n }\n\n // Default to Ethereum.\n return KnownCaipNamespace.Eip155;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation\n// /////////////////////////////////////////////////////\n// Color Palettes\nconst neutralPairs = [\n ['#FF5C16', '#FCFCFC'],\n ['#FF5C16', '#131416'],\n ['#D075FF', '#FCFCFC'],\n ['#D075FF', '#131416'],\n ['#BAF24A', '#FCFCFC'],\n ['#BAF24A', '#131416'],\n ['#89B0FF', '#FCFCFC'],\n ['#89B0FF', '#131416'],\n ['#FCFCFC', '#FF5C16'],\n ['#131416', '#FF5C16'],\n ['#FCFCFC', '#D075FF'],\n ['#131416', '#D075FF'],\n ['#FCFCFC', '#BAF24A'],\n ['#131416', '#BAF24A'],\n ['#FCFCFC', '#89B0FF'],\n ['#131416', '#89B0FF'],\n];\n\nconst tonalPairs = [\n ['#FFA680', '#FF5C16'],\n ['#661800', '#FF5C16'],\n ['#EAC2FF', '#D075FF'],\n ['#3D065F', '#D075FF'],\n ['#E5FFC3', '#BAF24A'],\n ['#013330', '#BAF24A'],\n ['#CCE7FF', '#89B0FF'],\n ['#190066', '#89B0FF'],\n ['#FF5C16', '#FFA680'],\n ['#FF5C16', '#661800'],\n ['#D075FF', '#EAC2FF'],\n ['#D075FF', '#3D065F'],\n ['#BAF24A', '#E5FFC3'],\n ['#BAF24A', '#013330'],\n ['#89B0FF', '#CCE7FF'],\n ['#89B0FF', '#190066'],\n ['#661800', '#FFA680'],\n ['#FFA680', '#661800'],\n ['#3D065F', '#EAC2FF'],\n ['#EAC2FF', '#3D065F'],\n ['#013330', '#E5FFC3'],\n ['#E5FFC3', '#013330'],\n ['#190066', '#CCE7FF'],\n ['#CCE7FF', '#190066'],\n];\n\nconst complementaryPairs = [\n ['#EAC2FF', '#013330'],\n ['#013330', '#EAC2FF'],\n ['#CCE7FF', '#661800'],\n ['#661800', '#CCE7FF'],\n ['#E5FFC3', '#3D065F'],\n ['#3D065F', '#E5FFC3'],\n ['#FFA680', '#190066'],\n ['#190066', '#FFA680'],\n ['#CCE7FF', '#013330'],\n ['#013330', '#CCE7FF'],\n];\n\nconst colorPairs = neutralPairs.concat(tonalPairs).concat(complementaryPairs);\n\n/**\n * SDBM hash function\n *\n * @param str The string to hash\n * @returns A numeric hash value\n */\nexport function sdbmHash(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = str.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;\n }\n return hash;\n}\n\n/**\n * Convert numeric/byte-array seed to a 6+ length string\n *\n * @param seed The seed value to convert (either a number or array of numbers)\n * @returns A string representation of the seed (minimum 6 characters)\n */\nexport function seedToString(seed: number | number[]): string {\n if (typeof seed === 'number') {\n let hex = seed.toString(16);\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n if (Array.isArray(seed)) {\n let hex = seed.map((b) => b.toString(16).padStart(2, '0')).join('');\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n return 'seed000';\n}\n\n/**\n * Builds a full <svg> string containing the Maskicon shapes.\n *\n * @param seed The seed value used to generate the icon\n * @param size The size of the SVG icon in pixels\n * @returns An SVG string representing the Maskicon\n */\nexport function createMaskiconSVG(seed: number | number[], size = 100): string {\n // 1) Convert seed to string, then hash\n const str = seedToString(seed);\n const hashVal = sdbmHash(str);\n\n // 2) Pick color pair based on the hash\n const colorPairIndex = Math.abs(hashVal) % colorPairs.length;\n const [bgColor, fgColor] = colorPairs[colorPairIndex];\n\n // 3) Geometry setup\n const grid = 2;\n const margin = size * 0.25;\n const innerSize = size - 2 * margin;\n const cellSize = innerSize / grid;\n\n let pathData = '';\n const filledGrid: boolean[][] = Array.from({ length: grid }, () =>\n Array(grid).fill(false),\n );\n\n const startX = Math.floor(grid / 2);\n const startY = Math.floor(grid / 2);\n const stack = [[startX, startY]];\n filledGrid[startX][startY] = true;\n\n while (stack.length > 0) {\n // Using destructuring assignment with a non-null assertion is safe here because we've verified stack.length > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [x, y] = stack.pop()!;\n // eslint-disable-next-line no-bitwise\n const cellHash = Math.abs(hashVal >> (x * 3 + y * 5)) & 15;\n\n const neighbors: [number, number][] = [];\n const directions: [number, number][] = [\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, 0],\n ];\n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n if (nx >= 0 && nx < grid && ny >= 0 && ny < grid && !filledGrid[nx][ny]) {\n neighbors.push([nx, ny]);\n }\n }\n while (neighbors.length > 0) {\n const idx = Math.abs(cellHash + neighbors.length) % neighbors.length;\n const [nx, ny] = neighbors.splice(idx, 1)[0];\n stack.push([nx, ny]);\n filledGrid[nx][ny] = true;\n }\n\n // Determine shape: square or right triangle (with rotation)\n const rotation = (cellHash % 4) * 90;\n const isSquare = cellHash % 5 === 0; // ~20% chance\n const cx = margin + x * cellSize;\n const cy = margin + y * cellSize;\n\n if (isSquare) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 0) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize}z `;\n } else if (rotation === 90) {\n pathData += `M${cx + cellSize},${cy} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 180) {\n pathData += `M${cx + cellSize},${cy + cellSize} h-${cellSize} v-${cellSize}z `;\n } else {\n pathData += `M${cx},${cy + cellSize} v-${cellSize} h${cellSize}z `;\n }\n }\n\n // 4) Construct final SVG string (always rectangular)\n let svgString = `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n svgString += `<rect width=\"${size}\" height=\"${size}\" fill=\"${bgColor}\" />`;\n svgString += `<path d=\"${pathData}\" fill=\"${fgColor}\" />`;\n svgString += `</svg>`;\n return svgString;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation and Caching\n// /////////////////////////////////////////////////////\ntype CacheKey = string;\nconst svgCache: Record<CacheKey, string> = {};\n\n/**\n * Returns a Promise that resolves to the final <svg> string for the given address.\n *\n * @param address The address to generate the Maskicon for\n * @param size The size of the icon in pixels\n * @returns A promise that resolves to an SVG string\n */\nexport async function getMaskiconSVG(\n address: string,\n size: number,\n): Promise<string> {\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (svgCache[cacheKey]) {\n return svgCache[cacheKey];\n }\n\n const namespace = await getCaipNamespaceFromAddress(address);\n let seed: number | number[];\n\n if (namespace === KnownCaipNamespace.Eip155) {\n seed = generateSeedEthereum(address);\n } else {\n seed = generateSeedNonEthereum(address);\n }\n\n const svgString = createMaskiconSVG(seed, size);\n svgCache[cacheKey] = svgString;\n return svgString;\n}\n"]}
@@ -1,3 +1,29 @@
1
+ import { KnownCaipNamespace } from "@metamask/utils";
2
+ /**
3
+ * Generates a numeric seed for Ethereum (eip155) addresses.
4
+ *
5
+ * @param address The Ethereum address to generate a seed from
6
+ * @returns A numeric seed derived from the address
7
+ */
8
+ export declare function generateSeedEthereum(address: string): number;
9
+ /**
10
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
11
+ *
12
+ * @param address The non-Ethereum address to generate a seed from
13
+ * @returns An array of numbers representing the byte-array seed
14
+ */
15
+ export declare function generateSeedNonEthereum(address: string): number[];
16
+ /**
17
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise defaults to Ethereum.
18
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
19
+ *
20
+ * In this update, if the address starts with "0x", we'll assume it's Ethereum (Eip155)
21
+ * and avoid the dynamic import that can cause the "Requiring unknown module '2021'" error.
22
+ *
23
+ * @param address The address to check and determine its namespace
24
+ * @returns A promise that resolves to the detected CAIP-2 namespace
25
+ */
26
+ export declare function getCaipNamespaceFromAddress(address: string): Promise<KnownCaipNamespace>;
1
27
  /**
2
28
  * SDBM hash function
3
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Maskicon.utilities.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AAsEA;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAgB5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,SAAM,GAAG,MAAM,CA8E7E;AAQD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAejB"}
1
+ {"version":3,"file":"Maskicon.utilities.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,kBAAkB,EAAE,wBAAwB;AAMpE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;AAmED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAgB5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,SAAM,GAAG,MAAM,CA8E7E;AAQD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -1,3 +1,29 @@
1
+ import { KnownCaipNamespace } from "@metamask/utils";
2
+ /**
3
+ * Generates a numeric seed for Ethereum (eip155) addresses.
4
+ *
5
+ * @param address The Ethereum address to generate a seed from
6
+ * @returns A numeric seed derived from the address
7
+ */
8
+ export declare function generateSeedEthereum(address: string): number;
9
+ /**
10
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
11
+ *
12
+ * @param address The non-Ethereum address to generate a seed from
13
+ * @returns An array of numbers representing the byte-array seed
14
+ */
15
+ export declare function generateSeedNonEthereum(address: string): number[];
16
+ /**
17
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise defaults to Ethereum.
18
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
19
+ *
20
+ * In this update, if the address starts with "0x", we'll assume it's Ethereum (Eip155)
21
+ * and avoid the dynamic import that can cause the "Requiring unknown module '2021'" error.
22
+ *
23
+ * @param address The address to check and determine its namespace
24
+ * @returns A promise that resolves to the detected CAIP-2 namespace
25
+ */
26
+ export declare function getCaipNamespaceFromAddress(address: string): Promise<KnownCaipNamespace>;
1
27
  /**
2
28
  * SDBM hash function
3
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Maskicon.utilities.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AAsEA;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAgB5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,SAAM,GAAG,MAAM,CA8E7E;AAQD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAejB"}
1
+ {"version":3,"file":"Maskicon.utilities.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,kBAAkB,EAAE,wBAAwB;AAMpE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;AAmED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAgB5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,SAAM,GAAG,MAAM,CA8E7E;AAQD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -1,4 +1,72 @@
1
- import { extractAccountAddress, generateIconSeed } from "@metamask-previews/design-system-shared";
1
+ import { stringToBytes, KnownCaipNamespace } from "@metamask/utils";
2
+ import { isAddress as isSolanaAddress } from "@solana/addresses";
3
+ // /////////////////////////////////////////////////////
4
+ // Address validation
5
+ // /////////////////////////////////////////////////////
6
+ /**
7
+ * Generates a numeric seed for Ethereum (eip155) addresses.
8
+ *
9
+ * @param address The Ethereum address to generate a seed from
10
+ * @returns A numeric seed derived from the address
11
+ */
12
+ export function generateSeedEthereum(address) {
13
+ // Example: parse the first 8 chars of the address after '0x'
14
+ const addr = address.slice(2, 10);
15
+ return parseInt(addr, 16);
16
+ }
17
+ /**
18
+ * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).
19
+ *
20
+ * @param address The non-Ethereum address to generate a seed from
21
+ * @returns An array of numbers representing the byte-array seed
22
+ */
23
+ export function generateSeedNonEthereum(address) {
24
+ return Array.from(stringToBytes(address.normalize('NFKC').toLowerCase()));
25
+ }
26
+ /**
27
+ * Dynamically checks if the address is Bitcoin or Solana; otherwise defaults to Ethereum.
28
+ * Returns a Promise that resolves to one of the known CAIP-2 namespaces.
29
+ *
30
+ * In this update, if the address starts with "0x", we'll assume it's Ethereum (Eip155)
31
+ * and avoid the dynamic import that can cause the "Requiring unknown module '2021'" error.
32
+ *
33
+ * @param address The address to check and determine its namespace
34
+ * @returns A promise that resolves to the detected CAIP-2 namespace
35
+ */
36
+ export async function getCaipNamespaceFromAddress(address) {
37
+ // If the address starts with '0x', assume Ethereum.
38
+ if (address.startsWith('0x')) {
39
+ return KnownCaipNamespace.Eip155;
40
+ }
41
+ // Check for CAIP-10 formatted addresses
42
+ if (address.includes(':')) {
43
+ const [namespace] = address.split(':');
44
+ const nsLower = namespace.toLowerCase();
45
+ if (nsLower === 'bip122') {
46
+ return KnownCaipNamespace.Bip122;
47
+ }
48
+ if (nsLower === 'solana') {
49
+ return KnownCaipNamespace.Solana;
50
+ }
51
+ }
52
+ // Attempt to use bitcoin-address-validation if available.
53
+ try {
54
+ const { validate, Network } = await import("bitcoin-address-validation");
55
+ if (validate(address, Network.mainnet) ||
56
+ validate(address, Network.testnet)) {
57
+ return KnownCaipNamespace.Bip122;
58
+ }
59
+ }
60
+ catch {
61
+ // If the import fails, fall through.
62
+ }
63
+ // Fallback: if it looks like a Solana address, return Solana.
64
+ if (isSolanaAddress(address)) {
65
+ return KnownCaipNamespace.Solana;
66
+ }
67
+ // Default to Ethereum.
68
+ return KnownCaipNamespace.Eip155;
69
+ }
2
70
  // /////////////////////////////////////////////////////
3
71
  // Maskicon SVG Creation
4
72
  // /////////////////////////////////////////////////////
@@ -189,10 +257,14 @@ export async function getMaskiconSVG(address, size) {
189
257
  if (svgCache[cacheKey]) {
190
258
  return svgCache[cacheKey];
191
259
  }
192
- // Extract the account address from CAIP-10 format if needed
193
- const accountAddress = extractAccountAddress(address);
194
- // Generate appropriate seed based on address format
195
- const seed = generateIconSeed(accountAddress);
260
+ const namespace = await getCaipNamespaceFromAddress(address);
261
+ let seed;
262
+ if (namespace === KnownCaipNamespace.Eip155) {
263
+ seed = generateSeedEthereum(address);
264
+ }
265
+ else {
266
+ seed = generateSeedNonEthereum(address);
267
+ }
196
268
  const svgString = createMaskiconSVG(seed, size);
197
269
  svgCache[cacheKey] = svgString;
198
270
  return svgString;
@@ -1 +1 @@
1
- {"version":3,"file":"Maskicon.utilities.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n extractAccountAddress,\n generateIconSeed,\n} from '@metamask-previews/design-system-shared';\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation\n// /////////////////////////////////////////////////////\n// Color Palettes\nconst neutralPairs = [\n ['#FF5C16', '#FCFCFC'],\n ['#FF5C16', '#131416'],\n ['#D075FF', '#FCFCFC'],\n ['#D075FF', '#131416'],\n ['#BAF24A', '#FCFCFC'],\n ['#BAF24A', '#131416'],\n ['#89B0FF', '#FCFCFC'],\n ['#89B0FF', '#131416'],\n ['#FCFCFC', '#FF5C16'],\n ['#131416', '#FF5C16'],\n ['#FCFCFC', '#D075FF'],\n ['#131416', '#D075FF'],\n ['#FCFCFC', '#BAF24A'],\n ['#131416', '#BAF24A'],\n ['#FCFCFC', '#89B0FF'],\n ['#131416', '#89B0FF'],\n];\n\nconst tonalPairs = [\n ['#FFA680', '#FF5C16'],\n ['#661800', '#FF5C16'],\n ['#EAC2FF', '#D075FF'],\n ['#3D065F', '#D075FF'],\n ['#E5FFC3', '#BAF24A'],\n ['#013330', '#BAF24A'],\n ['#CCE7FF', '#89B0FF'],\n ['#190066', '#89B0FF'],\n ['#FF5C16', '#FFA680'],\n ['#FF5C16', '#661800'],\n ['#D075FF', '#EAC2FF'],\n ['#D075FF', '#3D065F'],\n ['#BAF24A', '#E5FFC3'],\n ['#BAF24A', '#013330'],\n ['#89B0FF', '#CCE7FF'],\n ['#89B0FF', '#190066'],\n ['#661800', '#FFA680'],\n ['#FFA680', '#661800'],\n ['#3D065F', '#EAC2FF'],\n ['#EAC2FF', '#3D065F'],\n ['#013330', '#E5FFC3'],\n ['#E5FFC3', '#013330'],\n ['#190066', '#CCE7FF'],\n ['#CCE7FF', '#190066'],\n];\n\nconst complementaryPairs = [\n ['#EAC2FF', '#013330'],\n ['#013330', '#EAC2FF'],\n ['#CCE7FF', '#661800'],\n ['#661800', '#CCE7FF'],\n ['#E5FFC3', '#3D065F'],\n ['#3D065F', '#E5FFC3'],\n ['#FFA680', '#190066'],\n ['#190066', '#FFA680'],\n ['#CCE7FF', '#013330'],\n ['#013330', '#CCE7FF'],\n];\n\nconst colorPairs = neutralPairs.concat(tonalPairs).concat(complementaryPairs);\n\n/**\n * SDBM hash function\n *\n * @param str The string to hash\n * @returns A numeric hash value\n */\nexport function sdbmHash(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = str.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;\n }\n return hash;\n}\n\n/**\n * Convert numeric/byte-array seed to a 6+ length string\n *\n * @param seed The seed value to convert (either a number or array of numbers)\n * @returns A string representation of the seed (minimum 6 characters)\n */\nexport function seedToString(seed: number | number[]): string {\n if (typeof seed === 'number') {\n let hex = seed.toString(16);\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n if (Array.isArray(seed)) {\n let hex = seed.map((b) => b.toString(16).padStart(2, '0')).join('');\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n return 'seed000';\n}\n\n/**\n * Builds a full <svg> string containing the Maskicon shapes.\n *\n * @param seed The seed value used to generate the icon\n * @param size The size of the SVG icon in pixels\n * @returns An SVG string representing the Maskicon\n */\nexport function createMaskiconSVG(seed: number | number[], size = 100): string {\n // 1) Convert seed to string, then hash\n const str = seedToString(seed);\n const hashVal = sdbmHash(str);\n\n // 2) Pick color pair based on the hash\n const colorPairIndex = Math.abs(hashVal) % colorPairs.length;\n const [bgColor, fgColor] = colorPairs[colorPairIndex];\n\n // 3) Geometry setup\n const grid = 2;\n const margin = size * 0.25;\n const innerSize = size - 2 * margin;\n const cellSize = innerSize / grid;\n\n let pathData = '';\n const filledGrid: boolean[][] = Array.from({ length: grid }, () =>\n Array(grid).fill(false),\n );\n\n const startX = Math.floor(grid / 2);\n const startY = Math.floor(grid / 2);\n const stack = [[startX, startY]];\n filledGrid[startX][startY] = true;\n\n while (stack.length > 0) {\n // Using destructuring assignment with a non-null assertion is safe here because we've verified stack.length > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [x, y] = stack.pop()!;\n // eslint-disable-next-line no-bitwise\n const cellHash = Math.abs(hashVal >> (x * 3 + y * 5)) & 15;\n\n const neighbors: [number, number][] = [];\n const directions: [number, number][] = [\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, 0],\n ];\n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n if (nx >= 0 && nx < grid && ny >= 0 && ny < grid && !filledGrid[nx][ny]) {\n neighbors.push([nx, ny]);\n }\n }\n while (neighbors.length > 0) {\n const idx = Math.abs(cellHash + neighbors.length) % neighbors.length;\n const [nx, ny] = neighbors.splice(idx, 1)[0];\n stack.push([nx, ny]);\n filledGrid[nx][ny] = true;\n }\n\n // Determine shape: square or right triangle (with rotation)\n const rotation = (cellHash % 4) * 90;\n const isSquare = cellHash % 5 === 0; // ~20% chance\n const cx = margin + x * cellSize;\n const cy = margin + y * cellSize;\n\n if (isSquare) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 0) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize}z `;\n } else if (rotation === 90) {\n pathData += `M${cx + cellSize},${cy} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 180) {\n pathData += `M${cx + cellSize},${cy + cellSize} h-${cellSize} v-${cellSize}z `;\n } else {\n pathData += `M${cx},${cy + cellSize} v-${cellSize} h${cellSize}z `;\n }\n }\n\n // 4) Construct final SVG string (always rectangular)\n let svgString = `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n svgString += `<rect width=\"${size}\" height=\"${size}\" fill=\"${bgColor}\" />`;\n svgString += `<path d=\"${pathData}\" fill=\"${fgColor}\" />`;\n svgString += `</svg>`;\n return svgString;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation and Caching\n// /////////////////////////////////////////////////////\ntype CacheKey = string;\nconst svgCache: Record<CacheKey, string> = {};\n\n/**\n * Returns a Promise that resolves to the final <svg> string for the given address.\n *\n * @param address The address to generate the Maskicon for\n * @param size The size of the icon in pixels\n * @returns A promise that resolves to an SVG string\n */\nexport async function getMaskiconSVG(\n address: string,\n size: number,\n): Promise<string> {\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (svgCache[cacheKey]) {\n return svgCache[cacheKey];\n }\n\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n // Generate appropriate seed based on address format\n const seed = generateIconSeed(accountAddress);\n\n const svgString = createMaskiconSVG(seed, size);\n svgCache[cacheKey] = svgString;\n return svgString;\n}\n"]}
1
+ {"version":3,"file":"Maskicon.utilities.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { stringToBytes, KnownCaipNamespace } from '@metamask/utils';\nimport { isAddress as isSolanaAddress } from '@solana/addresses';\n\n// /////////////////////////////////////////////////////\n// Address validation\n// /////////////////////////////////////////////////////\n/**\n * Generates a numeric seed for Ethereum (eip155) addresses.\n *\n * @param address The Ethereum address to generate a seed from\n * @returns A numeric seed derived from the address\n */\nexport function generateSeedEthereum(address: string): number {\n // Example: parse the first 8 chars of the address after '0x'\n const addr = address.slice(2, 10);\n return parseInt(addr, 16);\n}\n\n/**\n * Generates a byte-array seed for non-Ethereum addresses (Solana, Bitcoin, etc.).\n *\n * @param address The non-Ethereum address to generate a seed from\n * @returns An array of numbers representing the byte-array seed\n */\nexport function generateSeedNonEthereum(address: string): number[] {\n return Array.from(stringToBytes(address.normalize('NFKC').toLowerCase()));\n}\n\n/**\n * Dynamically checks if the address is Bitcoin or Solana; otherwise defaults to Ethereum.\n * Returns a Promise that resolves to one of the known CAIP-2 namespaces.\n *\n * In this update, if the address starts with \"0x\", we'll assume it's Ethereum (Eip155)\n * and avoid the dynamic import that can cause the \"Requiring unknown module '2021'\" error.\n *\n * @param address The address to check and determine its namespace\n * @returns A promise that resolves to the detected CAIP-2 namespace\n */\nexport async function getCaipNamespaceFromAddress(\n address: string,\n): Promise<KnownCaipNamespace> {\n // If the address starts with '0x', assume Ethereum.\n if (address.startsWith('0x')) {\n return KnownCaipNamespace.Eip155;\n }\n\n // Check for CAIP-10 formatted addresses\n if (address.includes(':')) {\n const [namespace] = address.split(':');\n const nsLower = namespace.toLowerCase();\n if (nsLower === 'bip122') {\n return KnownCaipNamespace.Bip122;\n }\n if (nsLower === 'solana') {\n return KnownCaipNamespace.Solana;\n }\n }\n\n // Attempt to use bitcoin-address-validation if available.\n try {\n const { validate, Network } = await import('bitcoin-address-validation');\n if (\n validate(address, Network.mainnet) ||\n validate(address, Network.testnet)\n ) {\n return KnownCaipNamespace.Bip122;\n }\n } catch {\n // If the import fails, fall through.\n }\n\n // Fallback: if it looks like a Solana address, return Solana.\n if (isSolanaAddress(address)) {\n return KnownCaipNamespace.Solana;\n }\n\n // Default to Ethereum.\n return KnownCaipNamespace.Eip155;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation\n// /////////////////////////////////////////////////////\n// Color Palettes\nconst neutralPairs = [\n ['#FF5C16', '#FCFCFC'],\n ['#FF5C16', '#131416'],\n ['#D075FF', '#FCFCFC'],\n ['#D075FF', '#131416'],\n ['#BAF24A', '#FCFCFC'],\n ['#BAF24A', '#131416'],\n ['#89B0FF', '#FCFCFC'],\n ['#89B0FF', '#131416'],\n ['#FCFCFC', '#FF5C16'],\n ['#131416', '#FF5C16'],\n ['#FCFCFC', '#D075FF'],\n ['#131416', '#D075FF'],\n ['#FCFCFC', '#BAF24A'],\n ['#131416', '#BAF24A'],\n ['#FCFCFC', '#89B0FF'],\n ['#131416', '#89B0FF'],\n];\n\nconst tonalPairs = [\n ['#FFA680', '#FF5C16'],\n ['#661800', '#FF5C16'],\n ['#EAC2FF', '#D075FF'],\n ['#3D065F', '#D075FF'],\n ['#E5FFC3', '#BAF24A'],\n ['#013330', '#BAF24A'],\n ['#CCE7FF', '#89B0FF'],\n ['#190066', '#89B0FF'],\n ['#FF5C16', '#FFA680'],\n ['#FF5C16', '#661800'],\n ['#D075FF', '#EAC2FF'],\n ['#D075FF', '#3D065F'],\n ['#BAF24A', '#E5FFC3'],\n ['#BAF24A', '#013330'],\n ['#89B0FF', '#CCE7FF'],\n ['#89B0FF', '#190066'],\n ['#661800', '#FFA680'],\n ['#FFA680', '#661800'],\n ['#3D065F', '#EAC2FF'],\n ['#EAC2FF', '#3D065F'],\n ['#013330', '#E5FFC3'],\n ['#E5FFC3', '#013330'],\n ['#190066', '#CCE7FF'],\n ['#CCE7FF', '#190066'],\n];\n\nconst complementaryPairs = [\n ['#EAC2FF', '#013330'],\n ['#013330', '#EAC2FF'],\n ['#CCE7FF', '#661800'],\n ['#661800', '#CCE7FF'],\n ['#E5FFC3', '#3D065F'],\n ['#3D065F', '#E5FFC3'],\n ['#FFA680', '#190066'],\n ['#190066', '#FFA680'],\n ['#CCE7FF', '#013330'],\n ['#013330', '#CCE7FF'],\n];\n\nconst colorPairs = neutralPairs.concat(tonalPairs).concat(complementaryPairs);\n\n/**\n * SDBM hash function\n *\n * @param str The string to hash\n * @returns A numeric hash value\n */\nexport function sdbmHash(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = str.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;\n }\n return hash;\n}\n\n/**\n * Convert numeric/byte-array seed to a 6+ length string\n *\n * @param seed The seed value to convert (either a number or array of numbers)\n * @returns A string representation of the seed (minimum 6 characters)\n */\nexport function seedToString(seed: number | number[]): string {\n if (typeof seed === 'number') {\n let hex = seed.toString(16);\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n if (Array.isArray(seed)) {\n let hex = seed.map((b) => b.toString(16).padStart(2, '0')).join('');\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n return 'seed000';\n}\n\n/**\n * Builds a full <svg> string containing the Maskicon shapes.\n *\n * @param seed The seed value used to generate the icon\n * @param size The size of the SVG icon in pixels\n * @returns An SVG string representing the Maskicon\n */\nexport function createMaskiconSVG(seed: number | number[], size = 100): string {\n // 1) Convert seed to string, then hash\n const str = seedToString(seed);\n const hashVal = sdbmHash(str);\n\n // 2) Pick color pair based on the hash\n const colorPairIndex = Math.abs(hashVal) % colorPairs.length;\n const [bgColor, fgColor] = colorPairs[colorPairIndex];\n\n // 3) Geometry setup\n const grid = 2;\n const margin = size * 0.25;\n const innerSize = size - 2 * margin;\n const cellSize = innerSize / grid;\n\n let pathData = '';\n const filledGrid: boolean[][] = Array.from({ length: grid }, () =>\n Array(grid).fill(false),\n );\n\n const startX = Math.floor(grid / 2);\n const startY = Math.floor(grid / 2);\n const stack = [[startX, startY]];\n filledGrid[startX][startY] = true;\n\n while (stack.length > 0) {\n // Using destructuring assignment with a non-null assertion is safe here because we've verified stack.length > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [x, y] = stack.pop()!;\n // eslint-disable-next-line no-bitwise\n const cellHash = Math.abs(hashVal >> (x * 3 + y * 5)) & 15;\n\n const neighbors: [number, number][] = [];\n const directions: [number, number][] = [\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, 0],\n ];\n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n if (nx >= 0 && nx < grid && ny >= 0 && ny < grid && !filledGrid[nx][ny]) {\n neighbors.push([nx, ny]);\n }\n }\n while (neighbors.length > 0) {\n const idx = Math.abs(cellHash + neighbors.length) % neighbors.length;\n const [nx, ny] = neighbors.splice(idx, 1)[0];\n stack.push([nx, ny]);\n filledGrid[nx][ny] = true;\n }\n\n // Determine shape: square or right triangle (with rotation)\n const rotation = (cellHash % 4) * 90;\n const isSquare = cellHash % 5 === 0; // ~20% chance\n const cx = margin + x * cellSize;\n const cy = margin + y * cellSize;\n\n if (isSquare) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 0) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize}z `;\n } else if (rotation === 90) {\n pathData += `M${cx + cellSize},${cy} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 180) {\n pathData += `M${cx + cellSize},${cy + cellSize} h-${cellSize} v-${cellSize}z `;\n } else {\n pathData += `M${cx},${cy + cellSize} v-${cellSize} h${cellSize}z `;\n }\n }\n\n // 4) Construct final SVG string (always rectangular)\n let svgString = `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n svgString += `<rect width=\"${size}\" height=\"${size}\" fill=\"${bgColor}\" />`;\n svgString += `<path d=\"${pathData}\" fill=\"${fgColor}\" />`;\n svgString += `</svg>`;\n return svgString;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation and Caching\n// /////////////////////////////////////////////////////\ntype CacheKey = string;\nconst svgCache: Record<CacheKey, string> = {};\n\n/**\n * Returns a Promise that resolves to the final <svg> string for the given address.\n *\n * @param address The address to generate the Maskicon for\n * @param size The size of the icon in pixels\n * @returns A promise that resolves to an SVG string\n */\nexport async function getMaskiconSVG(\n address: string,\n size: number,\n): Promise<string> {\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (svgCache[cacheKey]) {\n return svgCache[cacheKey];\n }\n\n const namespace = await getCaipNamespaceFromAddress(address);\n let seed: number | number[];\n\n if (namespace === KnownCaipNamespace.Eip155) {\n seed = generateSeedEthereum(address);\n } else {\n seed = generateSeedNonEthereum(address);\n }\n\n const svgString = createMaskiconSVG(seed, size);\n svgCache[cacheKey] = svgString;\n return svgString;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/design-system-react",
3
- "version": "0.3.1-preview.89321d8",
3
+ "version": "0.3.1-preview.c4d6431",
4
4
  "description": "Design system react ui components",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -50,7 +50,6 @@
50
50
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
51
51
  },
52
52
  "dependencies": {
53
- "@metamask-previews/design-system-shared": "0.0.0-preview.89321d8",
54
53
  "@metamask/jazzicon": "^2.0.0",
55
54
  "@radix-ui/react-slot": "^1.1.0",
56
55
  "blo": "^2.0.0",
@@ -59,7 +58,7 @@
59
58
  "devDependencies": {
60
59
  "@figma/code-connect": "^1.0.0",
61
60
  "@jest/globals": "^29.7.0",
62
- "@metamask-previews/design-system-tailwind-preset": "0.6.1-preview.89321d8",
61
+ "@metamask-previews/design-system-tailwind-preset": "0.6.1-preview.c4d6431",
63
62
  "@metamask/auto-changelog": "^5.0.2",
64
63
  "@metamask/utils": "^11.7.0",
65
64
  "@solana/addresses": "^2.0.0",