@metamask-previews/design-system-react-native 0.3.1-preview.1775c68 → 0.3.1-preview.89321d8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/temp-components/Blockies/Blockies.cjs +4 -1
- package/dist/components/temp-components/Blockies/Blockies.cjs.map +1 -1
- package/dist/components/temp-components/Blockies/Blockies.d.cts.map +1 -1
- package/dist/components/temp-components/Blockies/Blockies.d.mts.map +1 -1
- package/dist/components/temp-components/Blockies/Blockies.mjs +4 -1
- package/dist/components/temp-components/Blockies/Blockies.mjs.map +1 -1
- package/dist/components/temp-components/Jazzicon/Jazzicon.cjs +11 -6
- package/dist/components/temp-components/Jazzicon/Jazzicon.cjs.map +1 -1
- package/dist/components/temp-components/Jazzicon/Jazzicon.d.cts +1 -1
- package/dist/components/temp-components/Jazzicon/Jazzicon.d.cts.map +1 -1
- package/dist/components/temp-components/Jazzicon/Jazzicon.d.mts +1 -1
- package/dist/components/temp-components/Jazzicon/Jazzicon.d.mts.map +1 -1
- package/dist/components/temp-components/Jazzicon/Jazzicon.mjs +11 -6
- package/dist/components/temp-components/Jazzicon/Jazzicon.mjs.map +1 -1
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.cjs +7 -79
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.cjs.map +1 -1
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.cts +0 -26
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.cts.map +1 -1
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.mts +0 -26
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.d.mts.map +1 -1
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.mjs +6 -75
- package/dist/components/temp-components/Maskicon/Maskicon.utilities.mjs.map +1 -1
- package/package.json +6 -5
|
@@ -4,11 +4,14 @@ 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");
|
|
7
8
|
const react_1 = __importDefault(require("react"));
|
|
8
9
|
const react_native_1 = require("react-native/index.js");
|
|
9
10
|
const Blockies_utilities_1 = require("./Blockies.utilities.cjs");
|
|
10
11
|
const Blockies = ({ address, size = 32, ...props }) => {
|
|
11
|
-
|
|
12
|
+
// Extract the account address from CAIP-10 format if needed
|
|
13
|
+
const accountAddress = (0, design_system_shared_1.extractAccountAddress)(address);
|
|
14
|
+
return (<react_native_1.Image source={{ uri: (0, Blockies_utilities_1.toDataUrl)(accountAddress) }} width={size} height={size} {...props}/>);
|
|
12
15
|
};
|
|
13
16
|
exports.Blockies = Blockies;
|
|
14
17
|
//# sourceMappingURL=Blockies.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Blockies.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,wDAAqC;AAIrC,iEAAiD;AAE1C,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IAC1E,OAAO,CACL,CAAC,oBAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,IAAA,8BAAS,EAAC,
|
|
1
|
+
{"version":3,"file":"Blockies.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":";;;;;;AAAA,kFAAgF;AAChF,kDAA0B;AAC1B,wDAAqC;AAIrC,iEAAiD;AAE1C,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,CAAC,oBAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,IAAA,8BAAS,EAAC,cAAc,CAAC,EAAE,CAAC,CAC3C,KAAK,CAAC,CAAC,IAAI,CAAC,CACZ,MAAM,CAAC,CAAC,IAAI,CAAC,CACb,IAAI,KAAK,CAAC,EACV,CACH,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,QAAQ,YAYnB","sourcesContent":["import { extractAccountAddress } from '@metamask-previews/design-system-shared';\nimport React from 'react';\nimport { Image } from 'react-native';\n\n// @ts-ignore\nimport type { BlockiesProps } from './Blockies.types';\nimport { toDataUrl } from './Blockies.utilities';\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 <Image\n source={{ uri: toDataUrl(accountAddress) }}\n width={size}\n height={size}\n {...props}\n />\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Blockies.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Blockies.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc;AAI1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAGtD,eAAO,MAAM,QAAQ,gCAAsC,aAAa,sBAYvE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Blockies.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Blockies.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Blockies/Blockies.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc;AAI1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAGtD,eAAO,MAAM,QAAQ,gCAAsC,aAAa,sBAYvE,CAAC"}
|
|
@@ -4,11 +4,14 @@ function $importDefault(module) {
|
|
|
4
4
|
}
|
|
5
5
|
return module;
|
|
6
6
|
}
|
|
7
|
+
import { extractAccountAddress } from "@metamask-previews/design-system-shared";
|
|
7
8
|
import $React from "react";
|
|
8
9
|
const React = $importDefault($React);
|
|
9
10
|
import { Image } from "react-native/index.js";
|
|
10
11
|
import { toDataUrl } from "./Blockies.utilities.mjs";
|
|
11
12
|
export const Blockies = ({ address, size = 32, ...props }) => {
|
|
12
|
-
|
|
13
|
+
// Extract the account address from CAIP-10 format if needed
|
|
14
|
+
const accountAddress = extractAccountAddress(address);
|
|
15
|
+
return (<Image source={{ uri: toDataUrl(accountAddress) }} width={size} height={size} {...props}/>);
|
|
13
16
|
};
|
|
14
17
|
//# 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,MAAK,cAAc;;AAC1B,OAAO,EAAE,KAAK,EAAE,8BAAqB;AAIrC,OAAO,EAAE,SAAS,EAAE,iCAA6B;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IAC1E,OAAO,CACL,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,
|
|
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,MAAK,cAAc;;AAC1B,OAAO,EAAE,KAAK,EAAE,8BAAqB;AAIrC,OAAO,EAAE,SAAS,EAAE,iCAA6B;AAEjD,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,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAC3C,KAAK,CAAC,CAAC,IAAI,CAAC,CACZ,MAAM,CAAC,CAAC,IAAI,CAAC,CACb,IAAI,KAAK,CAAC,EACV,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { extractAccountAddress } from '@metamask-previews/design-system-shared';\nimport React from 'react';\nimport { Image } from 'react-native';\n\n// @ts-ignore\nimport type { BlockiesProps } from './Blockies.types';\nimport { toDataUrl } from './Blockies.utilities';\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 <Image\n source={{ uri: toDataUrl(accountAddress) }}\n width={size}\n height={size}\n {...props}\n />\n );\n};\n"]}
|
|
@@ -4,14 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Jazzicon = void 0;
|
|
7
|
+
const design_system_shared_1 = require("@metamask-previews/design-system-shared");
|
|
7
8
|
const react_1 = __importDefault(require("react"));
|
|
8
9
|
const react_native_1 = require("react-native/index.js");
|
|
9
10
|
const react_native_jazzicon_1 = __importDefault(require("react-native-jazzicon"));
|
|
10
|
-
const Jazzicon = ({ testID, ...props }) =>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const Jazzicon = ({ testID, address, ...props }) => {
|
|
12
|
+
// Extract the account address from CAIP-10 format if needed
|
|
13
|
+
const accountAddress = address ? (0, design_system_shared_1.extractAccountAddress)(address) : '';
|
|
14
|
+
return (<react_native_1.View testID={testID}>
|
|
15
|
+
<react_native_jazzicon_1.default {...props} address={accountAddress} containerStyle={{
|
|
16
|
+
borderRadius: 0,
|
|
17
|
+
...props.containerStyle,
|
|
18
|
+
}}/>
|
|
19
|
+
</react_native_1.View>);
|
|
20
|
+
};
|
|
16
21
|
exports.Jazzicon = Jazzicon;
|
|
17
22
|
//# sourceMappingURL=Jazzicon.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Jazzicon.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,wDAAoD;AACpD,kFAA+C;AAIxC,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"Jazzicon.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;AAAA,kFAAgF;AAChF,kDAA0B;AAC1B,wDAAoD;AACpD,kFAA+C;AAIxC,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IACvE,4DAA4D;IAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,IAAA,4CAAqB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,OAAO,CACL,CAAC,mBAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CACnB;MAAA,CAAC,+BAAU,CACT,IAAI,KAAK,CAAC,CACV,OAAO,CAAC,CAAC,cAAc,CAAC,CACxB,cAAc,CAAC,CAAC;YACd,YAAY,EAAE,CAAC;YACf,GAAI,KAAK,CAAC,cAA4B;SACvC,CAAC,EAEN;IAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,QAAQ,YAgBnB","sourcesContent":["import { extractAccountAddress } from '@metamask-previews/design-system-shared';\nimport React from 'react';\nimport { View, type ViewStyle } from 'react-native';\nimport RNJazzicon from 'react-native-jazzicon';\n\nimport type { JazziconProps } from './Jazzicon.types';\n\nexport const Jazzicon = ({ testID, address, ...props }: JazziconProps) => {\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = address ? extractAccountAddress(address) : '';\n\n return (\n <View testID={testID}>\n <RNJazzicon\n {...props}\n address={accountAddress}\n containerStyle={{\n borderRadius: 0, // Override circular border radius to make it square\n ...(props.containerStyle as ViewStyle),\n }}\n />\n </View>\n );\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { JazziconProps } from "./Jazzicon.types.cjs";
|
|
3
|
-
export declare const Jazzicon: ({ testID, ...props }: JazziconProps) => React.JSX.Element;
|
|
3
|
+
export declare const Jazzicon: ({ testID, address, ...props }: JazziconProps) => React.JSX.Element;
|
|
4
4
|
//# sourceMappingURL=Jazzicon.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Jazzicon.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Jazzicon.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc;AAI1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAEtD,eAAO,MAAM,QAAQ,kCAAmC,aAAa,sBAgBpE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { JazziconProps } from "./Jazzicon.types.mjs";
|
|
3
|
-
export declare const Jazzicon: ({ testID, ...props }: JazziconProps) => React.JSX.Element;
|
|
3
|
+
export declare const Jazzicon: ({ testID, address, ...props }: JazziconProps) => React.JSX.Element;
|
|
4
4
|
//# sourceMappingURL=Jazzicon.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Jazzicon.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Jazzicon.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc;AAI1B,OAAO,KAAK,EAAE,aAAa,EAAE,6BAAyB;AAEtD,eAAO,MAAM,QAAQ,kCAAmC,aAAa,sBAgBpE,CAAC"}
|
|
@@ -4,15 +4,20 @@ function $importDefault(module) {
|
|
|
4
4
|
}
|
|
5
5
|
return module;
|
|
6
6
|
}
|
|
7
|
+
import { extractAccountAddress } from "@metamask-previews/design-system-shared";
|
|
7
8
|
import $React from "react";
|
|
8
9
|
const React = $importDefault($React);
|
|
9
10
|
import { View } from "react-native/index.js";
|
|
10
11
|
import $RNJazzicon from "react-native-jazzicon";
|
|
11
12
|
const RNJazzicon = $importDefault($RNJazzicon);
|
|
12
|
-
export const Jazzicon = ({ testID, ...props }) =>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
export const Jazzicon = ({ testID, address, ...props }) => {
|
|
14
|
+
// Extract the account address from CAIP-10 format if needed
|
|
15
|
+
const accountAddress = address ? extractAccountAddress(address) : '';
|
|
16
|
+
return (<View testID={testID}>
|
|
17
|
+
<RNJazzicon {...props} address={accountAddress} containerStyle={{
|
|
18
|
+
borderRadius: 0,
|
|
19
|
+
...props.containerStyle,
|
|
20
|
+
}}/>
|
|
21
|
+
</View>);
|
|
22
|
+
};
|
|
18
23
|
//# sourceMappingURL=Jazzicon.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Jazzicon.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;AAAA,OAAO,MAAK,cAAc;;AAC1B,OAAO,EAAE,IAAI,EAAkB,8BAAqB;AACpD,OAAO,WAAU,8BAA8B;;AAI/C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"Jazzicon.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Jazzicon/Jazzicon.tsx"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,qBAAqB,EAAE,gDAAgD;AAChF,OAAO,MAAK,cAAc;;AAC1B,OAAO,EAAE,IAAI,EAAkB,8BAAqB;AACpD,OAAO,WAAU,8BAA8B;;AAI/C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAiB,EAAE,EAAE;IACvE,4DAA4D;IAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,OAAO,CACL,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CACnB;MAAA,CAAC,UAAU,CACT,IAAI,KAAK,CAAC,CACV,OAAO,CAAC,CAAC,cAAc,CAAC,CACxB,cAAc,CAAC,CAAC;YACd,YAAY,EAAE,CAAC;YACf,GAAI,KAAK,CAAC,cAA4B;SACvC,CAAC,EAEN;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { extractAccountAddress } from '@metamask-previews/design-system-shared';\nimport React from 'react';\nimport { View, type ViewStyle } from 'react-native';\nimport RNJazzicon from 'react-native-jazzicon';\n\nimport type { JazziconProps } from './Jazzicon.types';\n\nexport const Jazzicon = ({ testID, address, ...props }: JazziconProps) => {\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = address ? extractAccountAddress(address) : '';\n\n return (\n <View testID={testID}>\n <RNJazzicon\n {...props}\n address={accountAddress}\n containerStyle={{\n borderRadius: 0, // Override circular border radius to make it square\n ...(props.containerStyle as ViewStyle),\n }}\n />\n </View>\n );\n};\n"]}
|
|
@@ -1,78 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getMaskiconSVG = exports.createMaskiconSVG = exports.seedToString = exports.sdbmHash =
|
|
4
|
-
const
|
|
5
|
-
const addresses_1 = require("@solana/addresses");
|
|
3
|
+
exports.getMaskiconSVG = exports.createMaskiconSVG = exports.seedToString = exports.sdbmHash = void 0;
|
|
4
|
+
const design_system_shared_1 = require("@metamask-previews/design-system-shared");
|
|
6
5
|
// /////////////////////////////////////////////////////
|
|
7
|
-
//
|
|
6
|
+
// Shared utilities have been moved to @metamask-previews/design-system-shared
|
|
8
7
|
// /////////////////////////////////////////////////////
|
|
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;
|
|
76
8
|
// /////////////////////////////////////////////////////
|
|
77
9
|
// Maskicon SVG Creation
|
|
78
10
|
// /////////////////////////////////////////////////////
|
|
@@ -266,14 +198,10 @@ async function getMaskiconSVG(address, size) {
|
|
|
266
198
|
if (svgCache[cacheKey]) {
|
|
267
199
|
return svgCache[cacheKey];
|
|
268
200
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
seed = generateSeedNonEthereum(address);
|
|
276
|
-
}
|
|
201
|
+
// Extract the account address from CAIP-10 format if needed
|
|
202
|
+
const accountAddress = (0, design_system_shared_1.extractAccountAddress)(address);
|
|
203
|
+
// Generate appropriate seed based on address format
|
|
204
|
+
const seed = (0, design_system_shared_1.generateIconSeed)(accountAddress);
|
|
277
205
|
const svgString = createMaskiconSVG(seed, size);
|
|
278
206
|
svgCache[cacheKey] = svgString;
|
|
279
207
|
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 { 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
|
+
{"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// Shared utilities have been moved to @metamask-previews/design-system-shared\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 // 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,29 +1,3 @@
|
|
|
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>;
|
|
27
1
|
/**
|
|
28
2
|
* SDBM hash function
|
|
29
3
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Maskicon.utilities.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Maskicon.utilities.d.cts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AA0EA;;;;;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,29 +1,3 @@
|
|
|
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>;
|
|
27
1
|
/**
|
|
28
2
|
* SDBM hash function
|
|
29
3
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Maskicon.utilities.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Maskicon.utilities.d.mts","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AA0EA;;;;;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,72 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isAddress as isSolanaAddress } from "@solana/addresses";
|
|
1
|
+
import { extractAccountAddress, generateIconSeed } from "@metamask-previews/design-system-shared";
|
|
3
2
|
// /////////////////////////////////////////////////////
|
|
4
|
-
//
|
|
3
|
+
// Shared utilities have been moved to @metamask-previews/design-system-shared
|
|
5
4
|
// /////////////////////////////////////////////////////
|
|
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
|
-
}
|
|
70
5
|
// /////////////////////////////////////////////////////
|
|
71
6
|
// Maskicon SVG Creation
|
|
72
7
|
// /////////////////////////////////////////////////////
|
|
@@ -257,14 +192,10 @@ export async function getMaskiconSVG(address, size) {
|
|
|
257
192
|
if (svgCache[cacheKey]) {
|
|
258
193
|
return svgCache[cacheKey];
|
|
259
194
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
seed = generateSeedNonEthereum(address);
|
|
267
|
-
}
|
|
195
|
+
// Extract the account address from CAIP-10 format if needed
|
|
196
|
+
const accountAddress = extractAccountAddress(address);
|
|
197
|
+
// Generate appropriate seed based on address format
|
|
198
|
+
const seed = generateIconSeed(accountAddress);
|
|
268
199
|
const svgString = createMaskiconSVG(seed, size);
|
|
269
200
|
svgCache[cacheKey] = svgString;
|
|
270
201
|
return svgString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Maskicon.utilities.mjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,wBAAwB;AACpE,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,0BAA0B;AAEjE,wDAAwD;AACxD,qBAAqB;AACrB,wDAAwD;AACxD;;;;;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;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAe;IAEf,oDAAoD;IACpD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC5B,OAAO,kBAAkB,CAAC,MAAM,CAAC;KAClC;IAED,wCAAwC;IACxC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzB,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,OAAO,kBAAkB,CAAC,MAAM,CAAC;SAClC;QACD,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,OAAO,kBAAkB,CAAC,MAAM,CAAC;SAClC;KACF;IAED,0DAA0D;IAC1D,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,qCAAqC;KACtC;IAED,8DAA8D;IAC9D,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE;QAC5B,OAAO,kBAAkB,CAAC,MAAM,CAAC;KAClC;IAED,uBAAuB;IACvB,OAAO,kBAAkB,CAAC,MAAM,CAAC;AACnC,CAAC;AAED,wDAAwD;AACxD,wBAAwB;AACxB,wDAAwD;AACxD,iBAAiB;AACjB,MAAM,YAAY,GAAG;IACnB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,GAAG;IACjB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,kBAAkB,GAAG;IACzB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,sCAAsC;QACtC,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;KAC9D;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;YAClB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC1B;QACD,OAAO,GAAG,CAAC;KACZ;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;YAClB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC1B;QACD,OAAO,GAAG,CAAC;KACZ;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAuB,EAAE,IAAI,GAAG,GAAG;IACnE,uCAAuC;IACvC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE9B,uCAAuC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7D,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAEtD,oBAAoB;IACpB,MAAM,IAAI,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC;IACpC,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAElC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,MAAM,UAAU,GAAgB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAChE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACxB,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACvB,gHAAgH;QAChH,oEAAoE;QACpE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC5B,sCAAsC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAE3D,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,MAAM,UAAU,GAAuB;YACrC,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACR,CAAC;QACF,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,UAAU,EAAE;YACjC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;gBACvE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;aAC1B;SACF;QACD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;YACrE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACrB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;SAC3B;QAED,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc;QACnD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC;QAEjC,IAAI,QAAQ,EAAE;YACZ,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,IAAI,CAAC;SACtE;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE;YACzB,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;SACxD;aAAM,IAAI,QAAQ,KAAK,EAAE,EAAE;YAC1B,QAAQ,IAAI,IAAI,EAAE,GAAG,QAAQ,IAAI,EAAE,KAAK,QAAQ,MAAM,QAAQ,IAAI,CAAC;SACpE;aAAM,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC3B,QAAQ,IAAI,IAAI,EAAE,GAAG,QAAQ,IAAI,EAAE,GAAG,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI,CAAC;SAChF;aAAM;YACL,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,MAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC;SACpE;KACF;IAED,qDAAqD;IACrD,IAAI,SAAS,GAAG,eAAe,IAAI,aAAa,IAAI,kBAAkB,IAAI,IAAI,IAAI,uCAAuC,CAAC;IAC1H,SAAS,IAAI,gBAAgB,IAAI,aAAa,IAAI,WAAW,OAAO,MAAM,CAAC;IAC3E,SAAS,IAAI,YAAY,QAAQ,WAAW,OAAO,MAAM,CAAC;IAC1D,SAAS,IAAI,QAAQ,CAAC;IACtB,OAAO,SAAS,CAAC;AACnB,CAAC;AAMD,MAAM,QAAQ,GAA6B,EAAE,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,IAAY;IAEZ,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;IACpD,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACtB,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAC3B;IAED,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,IAAuB,CAAC;IAE5B,IAAI,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE;QAC3C,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;KACtC;SAAM;QACL,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;KACzC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC","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
|
+
{"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// Shared utilities have been moved to @metamask-previews/design-system-shared\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 // 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/design-system-react-native",
|
|
3
|
-
"version": "0.3.1-preview.
|
|
3
|
+
"version": "0.3.1-preview.89321d8",
|
|
4
4
|
"description": "Design System React Native",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
+
"@metamask-previews/design-system-shared": "0.0.0-preview.89321d8",
|
|
50
51
|
"react-native-jazzicon": "^0.1.2"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
@@ -55,10 +56,10 @@
|
|
|
55
56
|
"@babel/preset-react": "^7.25.9",
|
|
56
57
|
"@babel/preset-typescript": "^7.23.3",
|
|
57
58
|
"@figma/code-connect": "^1.0.0",
|
|
58
|
-
"@metamask-previews/design-system-twrnc-preset": "0.2.1-preview.
|
|
59
|
-
"@metamask-previews/design-tokens": "8.1.1-preview.
|
|
59
|
+
"@metamask-previews/design-system-twrnc-preset": "0.2.1-preview.89321d8",
|
|
60
|
+
"@metamask-previews/design-tokens": "8.1.1-preview.89321d8",
|
|
60
61
|
"@metamask/auto-changelog": "^5.0.2",
|
|
61
|
-
"@metamask/utils": "^11.
|
|
62
|
+
"@metamask/utils": "^11.7.0",
|
|
62
63
|
"@solana/addresses": "^2.0.0",
|
|
63
64
|
"@storybook/react-native": "6.5",
|
|
64
65
|
"@testing-library/react-hooks": "^8.0.1",
|
|
@@ -88,7 +89,7 @@
|
|
|
88
89
|
"peerDependencies": {
|
|
89
90
|
"@metamask/design-system-twrnc-preset": "^0.2.0",
|
|
90
91
|
"@metamask/design-tokens": "^8.1.0",
|
|
91
|
-
"@metamask/utils": "^11.
|
|
92
|
+
"@metamask/utils": "^11.7.0",
|
|
92
93
|
"@solana/addresses": "^2.0.0",
|
|
93
94
|
"bitcoin-address-validation": ">=2.0.0",
|
|
94
95
|
"react": ">=18.2.0",
|