@metamask/design-system-react
Version:
Design system react ui components
1 lines • 17.7 kB
Source Map (JSON)
{"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"]}