@metamask/smart-transactions-controller 21.1.0 → 22.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +47 -0
  3. package/dist/SmartTransactionsController.cjs +20 -6
  4. package/dist/SmartTransactionsController.cjs.map +1 -1
  5. package/dist/SmartTransactionsController.d.cts +13 -5
  6. package/dist/SmartTransactionsController.d.cts.map +1 -1
  7. package/dist/SmartTransactionsController.d.mts +13 -5
  8. package/dist/SmartTransactionsController.d.mts.map +1 -1
  9. package/dist/SmartTransactionsController.mjs +21 -7
  10. package/dist/SmartTransactionsController.mjs.map +1 -1
  11. package/dist/constants.cjs +21 -1
  12. package/dist/constants.cjs.map +1 -1
  13. package/dist/constants.d.cts +20 -0
  14. package/dist/constants.d.cts.map +1 -1
  15. package/dist/constants.d.mts +20 -0
  16. package/dist/constants.d.mts.map +1 -1
  17. package/dist/constants.mjs +20 -0
  18. package/dist/constants.mjs.map +1 -1
  19. package/dist/featureFlags/feature-flags.cjs +119 -0
  20. package/dist/featureFlags/feature-flags.cjs.map +1 -0
  21. package/dist/featureFlags/feature-flags.d.cts +76 -0
  22. package/dist/featureFlags/feature-flags.d.cts.map +1 -0
  23. package/dist/featureFlags/feature-flags.d.mts +76 -0
  24. package/dist/featureFlags/feature-flags.d.mts.map +1 -0
  25. package/dist/featureFlags/feature-flags.mjs +112 -0
  26. package/dist/featureFlags/feature-flags.mjs.map +1 -0
  27. package/dist/featureFlags/index.cjs +14 -0
  28. package/dist/featureFlags/index.cjs.map +1 -0
  29. package/dist/featureFlags/index.d.cts +3 -0
  30. package/dist/featureFlags/index.d.cts.map +1 -0
  31. package/dist/featureFlags/index.d.mts +3 -0
  32. package/dist/featureFlags/index.d.mts.map +1 -0
  33. package/dist/featureFlags/index.mjs +3 -0
  34. package/dist/featureFlags/index.mjs.map +1 -0
  35. package/dist/featureFlags/validators.cjs +126 -0
  36. package/dist/featureFlags/validators.cjs.map +1 -0
  37. package/dist/featureFlags/validators.d.cts +141 -0
  38. package/dist/featureFlags/validators.d.cts.map +1 -0
  39. package/dist/featureFlags/validators.d.mts +141 -0
  40. package/dist/featureFlags/validators.d.mts.map +1 -0
  41. package/dist/featureFlags/validators.mjs +121 -0
  42. package/dist/featureFlags/validators.mjs.map +1 -0
  43. package/dist/index.cjs +5 -1
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +2 -1
  46. package/dist/index.d.cts.map +1 -1
  47. package/dist/index.d.mts +2 -1
  48. package/dist/index.d.mts.map +1 -1
  49. package/dist/index.mjs +2 -0
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/selectors.cjs +66 -0
  52. package/dist/selectors.cjs.map +1 -0
  53. package/dist/selectors.d.cts +177 -0
  54. package/dist/selectors.d.cts.map +1 -0
  55. package/dist/selectors.d.mts +177 -0
  56. package/dist/selectors.d.mts.map +1 -0
  57. package/dist/selectors.mjs +63 -0
  58. package/dist/selectors.mjs.map +1 -0
  59. package/dist/types.cjs.map +1 -1
  60. package/dist/types.d.cts +24 -1
  61. package/dist/types.d.cts.map +1 -1
  62. package/dist/types.d.mts +24 -1
  63. package/dist/types.d.mts.map +1 -1
  64. package/dist/types.mjs.map +1 -1
  65. package/dist/utils.cjs +5 -7
  66. package/dist/utils.cjs.map +1 -1
  67. package/dist/utils.d.cts +4 -4
  68. package/dist/utils.d.cts.map +1 -1
  69. package/dist/utils.d.mts +4 -4
  70. package/dist/utils.d.mts.map +1 -1
  71. package/dist/utils.mjs +5 -7
  72. package/dist/utils.mjs.map +1 -1
  73. package/package.json +9 -5
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSmartTransactionsFeatureFlagsForChain = exports.getSmartTransactionsFeatureFlags = exports.processSmartTransactionsFeatureFlags = exports.normalizeChainId = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const constants_1 = require("../constants.cjs");
6
+ const validators_1 = require("./validators.cjs");
7
+ /**
8
+ * Normalizes a chain ID to hex format for EVM chains.
9
+ * - CAIP-2 EVM format (eip155:X) is converted to hex (0xY)
10
+ * - Hex format is returned as-is
11
+ * - Non-EVM CAIP-2 formats are returned as-is (exact match)
12
+ * - Invalid eip155 formats (non-numeric reference) are returned as-is
13
+ * - This is used because the current STX chains are EVM and declared as hex chain IDs in the existing flag.
14
+ *
15
+ * @param chainId - The chain ID in any supported format
16
+ * @returns Normalized chain ID (hex for EVM, original for non-EVM)
17
+ * @example
18
+ * ```ts
19
+ * normalizeChainId('0x1') // → '0x1'
20
+ * normalizeChainId('eip155:1') // → '0x1'
21
+ * normalizeChainId('eip155:137') // → '0x89'
22
+ * normalizeChainId('solana:...') // → 'solana:...' (unchanged)
23
+ * normalizeChainId('eip155:abc') // → 'eip155:abc' (invalid, unchanged)
24
+ * ```
25
+ */
26
+ function normalizeChainId(chainId) {
27
+ // If it's already hex or not a valid CAIP chain ID, return as-is
28
+ if (!(0, utils_1.isCaipChainId)(chainId)) {
29
+ return chainId;
30
+ }
31
+ const { namespace, reference } = (0, utils_1.parseCaipChainId)(chainId);
32
+ // Only normalize EVM CAIP-2 chains with valid numeric references to hex
33
+ if (namespace === utils_1.KnownCaipNamespace.Eip155) {
34
+ const decimal = parseInt(reference, 10);
35
+ // If reference is not a valid number, return as-is
36
+ if (Number.isNaN(decimal)) {
37
+ return chainId;
38
+ }
39
+ return (0, utils_1.numberToHex)(decimal);
40
+ }
41
+ // Non-EVM CAIP chains remain unchanged
42
+ return chainId;
43
+ }
44
+ exports.normalizeChainId = normalizeChainId;
45
+ /**
46
+ * Processes raw feature flags data and returns a validated configuration.
47
+ * Invalid chain configs are silently removed. Error reporting is handled by
48
+ * the SmartTransactionsController via ErrorReportingService.
49
+ *
50
+ * @param rawFeatureFlags - The raw feature flags data from the remote feature flag controller
51
+ * @returns The validated feature flags configuration (partial if some chains were invalid)
52
+ */
53
+ function processSmartTransactionsFeatureFlags(rawFeatureFlags) {
54
+ const { config } = (0, validators_1.validateSmartTransactionsFeatureFlags)(rawFeatureFlags);
55
+ // Return config if it has any valid data, otherwise return defaults
56
+ if (Object.keys(config).length > 0) {
57
+ return config;
58
+ }
59
+ return constants_1.DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS;
60
+ }
61
+ exports.processSmartTransactionsFeatureFlags = processSmartTransactionsFeatureFlags;
62
+ /**
63
+ * Gets the smart transactions feature flags from the remote feature flag controller.
64
+ *
65
+ * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState
66
+ * @returns The smart transactions feature flags configuration
67
+ * @example
68
+ * ```ts
69
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
70
+ * const chainConfig = featureFlags['0x1'] ?? featureFlags.default;
71
+ * ```
72
+ */
73
+ function getSmartTransactionsFeatureFlags(messenger) {
74
+ var _a;
75
+ const remoteFeatureFlagControllerState = messenger.call('RemoteFeatureFlagController:getState');
76
+ const rawSmartTransactionsNetworks = (_a = remoteFeatureFlagControllerState === null || remoteFeatureFlagControllerState === void 0 ? void 0 : remoteFeatureFlagControllerState.remoteFeatureFlags) === null || _a === void 0 ? void 0 : _a.smartTransactionsNetworks;
77
+ return processSmartTransactionsFeatureFlags(rawSmartTransactionsNetworks);
78
+ }
79
+ exports.getSmartTransactionsFeatureFlags = getSmartTransactionsFeatureFlags;
80
+ /**
81
+ * Gets the merged feature flags configuration for a specific chain.
82
+ * Chain-specific configuration takes precedence over default configuration.
83
+ *
84
+ * For EVM chains, the chain ID is normalized to hex format before lookup.
85
+ * This means both '0x1' and 'eip155:1' will resolve to the same configuration.
86
+ * Non-EVM chains (e.g., Solana, Bitcoin) use exact match.
87
+ *
88
+ * @param featureFlags - The full feature flags configuration
89
+ * @param chainId - The chain ID to get configuration for.
90
+ * Supports both hex (e.g., "0x1") and CAIP-2 format (e.g., "eip155:1", "solana:...")
91
+ * @returns The merged configuration for the specified chain
92
+ * @example
93
+ * ```ts
94
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
95
+ *
96
+ * // Both resolve to the same config (normalized to 0x1)
97
+ * const chainConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, '0x1');
98
+ * const sameConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'eip155:1');
99
+ *
100
+ * // Non-EVM uses exact match
101
+ * const solanaConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp');
102
+ *
103
+ * if (chainConfig.extensionActive) {
104
+ * // Smart transactions are enabled for this chain
105
+ * }
106
+ * ```
107
+ */
108
+ function getSmartTransactionsFeatureFlagsForChain(featureFlags, chainId) {
109
+ var _a;
110
+ const normalizedChainId = normalizeChainId(chainId);
111
+ const defaultRemoteConfig = (_a = featureFlags.default) !== null && _a !== void 0 ? _a : {};
112
+ const chainRemoteConfig = featureFlags[normalizedChainId];
113
+ if (chainRemoteConfig === undefined) {
114
+ return constants_1.DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default;
115
+ }
116
+ return Object.assign(Object.assign({}, defaultRemoteConfig), chainRemoteConfig);
117
+ }
118
+ exports.getSmartTransactionsFeatureFlagsForChain = getSmartTransactionsFeatureFlagsForChain;
119
+ //# sourceMappingURL=feature-flags.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/featureFlags/feature-flags.ts"],"names":[],"mappings":";;;AAEA,2CAKyB;AAEzB,gDAAiF;AAKjF,iDAAqE;AAErE;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,gBAAgB,CAC9B,OAA0B;IAE1B,iEAAiE;IACjE,IAAI,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,OAAO,CAAC;KAChB;IAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;IAE3D,wEAAwE;IACxE,IAAI,SAAS,KAAK,0BAAkB,CAAC,MAAM,EAAE;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxC,mDAAmD;QACnD,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC;KAC7B;IAED,uCAAuC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAtBD,4CAsBC;AAED;;;;;;;GAOG;AACH,SAAgB,oCAAoC,CAClD,eAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kDAAqC,EAAC,eAAe,CAAC,CAAC;IAE1E,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAClC,OAAO,MAAM,CAAC;KACf;IAED,OAAO,6DAAiD,CAAC;AAC3D,CAAC;AAXD,oFAWC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,gCAAgC,CAM9C,SAAY;;IACZ,MAAM,gCAAgC,GAAG,SAAS,CAAC,IAAI,CACrD,sCAAsC,CACvC,CAAC;IAEF,MAAM,4BAA4B,GAChC,MAAA,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,kBAAkB,0CAChD,yBAAyB,CAAC;IAEhC,OAAO,oCAAoC,CAAC,4BAA4B,CAAC,CAAC;AAC5E,CAAC;AAhBD,4EAgBC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,SAAgB,wCAAwC,CACtD,YAAiD,EACjD,OAA0B;;IAE1B,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,MAAA,YAAY,CAAC,OAAO,mCAAI,EAAE,CAAC;IACvD,MAAM,iBAAiB,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAE1D,IAAI,iBAAiB,KAAK,SAAS,EAAE;QACnC,OAAO,6DAAiD,CAAC,OAAO,CAAC;KAClE;IAED,uCACK,mBAAmB,GACnB,iBAAiB,EACpB;AACJ,CAAC;AAhBD,4FAgBC","sourcesContent":["import type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport {\n isCaipChainId,\n KnownCaipNamespace,\n numberToHex,\n parseCaipChainId,\n} from '@metamask/utils';\n\nimport { DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS } from '../constants';\nimport type {\n SmartTransactionsFeatureFlagsConfig,\n SmartTransactionsNetworkConfig,\n} from '../types';\nimport { validateSmartTransactionsFeatureFlags } from './validators';\n\n/**\n * Normalizes a chain ID to hex format for EVM chains.\n * - CAIP-2 EVM format (eip155:X) is converted to hex (0xY)\n * - Hex format is returned as-is\n * - Non-EVM CAIP-2 formats are returned as-is (exact match)\n * - Invalid eip155 formats (non-numeric reference) are returned as-is\n * - This is used because the current STX chains are EVM and declared as hex chain IDs in the existing flag.\n *\n * @param chainId - The chain ID in any supported format\n * @returns Normalized chain ID (hex for EVM, original for non-EVM)\n * @example\n * ```ts\n * normalizeChainId('0x1') // → '0x1'\n * normalizeChainId('eip155:1') // → '0x1'\n * normalizeChainId('eip155:137') // → '0x89'\n * normalizeChainId('solana:...') // → 'solana:...' (unchanged)\n * normalizeChainId('eip155:abc') // → 'eip155:abc' (invalid, unchanged)\n * ```\n */\nexport function normalizeChainId(\n chainId: Hex | CaipChainId,\n): Hex | CaipChainId {\n // If it's already hex or not a valid CAIP chain ID, return as-is\n if (!isCaipChainId(chainId)) {\n return chainId;\n }\n\n const { namespace, reference } = parseCaipChainId(chainId);\n\n // Only normalize EVM CAIP-2 chains with valid numeric references to hex\n if (namespace === KnownCaipNamespace.Eip155) {\n const decimal = parseInt(reference, 10);\n // If reference is not a valid number, return as-is\n if (Number.isNaN(decimal)) {\n return chainId;\n }\n return numberToHex(decimal);\n }\n\n // Non-EVM CAIP chains remain unchanged\n return chainId;\n}\n\n/**\n * Processes raw feature flags data and returns a validated configuration.\n * Invalid chain configs are silently removed. Error reporting is handled by\n * the SmartTransactionsController via ErrorReportingService.\n *\n * @param rawFeatureFlags - The raw feature flags data from the remote feature flag controller\n * @returns The validated feature flags configuration (partial if some chains were invalid)\n */\nexport function processSmartTransactionsFeatureFlags(\n rawFeatureFlags: unknown,\n): SmartTransactionsFeatureFlagsConfig {\n const { config } = validateSmartTransactionsFeatureFlags(rawFeatureFlags);\n\n // Return config if it has any valid data, otherwise return defaults\n if (Object.keys(config).length > 0) {\n return config;\n }\n\n return DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS;\n}\n\n/**\n * Gets the smart transactions feature flags from the remote feature flag controller.\n *\n * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState\n * @returns The smart transactions feature flags configuration\n * @example\n * ```ts\n * const featureFlags = getSmartTransactionsFeatureFlags(messenger);\n * const chainConfig = featureFlags['0x1'] ?? featureFlags.default;\n * ```\n */\nexport function getSmartTransactionsFeatureFlags<\n T extends {\n call(\n action: 'RemoteFeatureFlagController:getState',\n ): RemoteFeatureFlagControllerState;\n },\n>(messenger: T): SmartTransactionsFeatureFlagsConfig {\n const remoteFeatureFlagControllerState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const rawSmartTransactionsNetworks =\n remoteFeatureFlagControllerState?.remoteFeatureFlags\n ?.smartTransactionsNetworks;\n\n return processSmartTransactionsFeatureFlags(rawSmartTransactionsNetworks);\n}\n\n/**\n * Gets the merged feature flags configuration for a specific chain.\n * Chain-specific configuration takes precedence over default configuration.\n *\n * For EVM chains, the chain ID is normalized to hex format before lookup.\n * This means both '0x1' and 'eip155:1' will resolve to the same configuration.\n * Non-EVM chains (e.g., Solana, Bitcoin) use exact match.\n *\n * @param featureFlags - The full feature flags configuration\n * @param chainId - The chain ID to get configuration for.\n * Supports both hex (e.g., \"0x1\") and CAIP-2 format (e.g., \"eip155:1\", \"solana:...\")\n * @returns The merged configuration for the specified chain\n * @example\n * ```ts\n * const featureFlags = getSmartTransactionsFeatureFlags(messenger);\n *\n * // Both resolve to the same config (normalized to 0x1)\n * const chainConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, '0x1');\n * const sameConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'eip155:1');\n *\n * // Non-EVM uses exact match\n * const solanaConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp');\n *\n * if (chainConfig.extensionActive) {\n * // Smart transactions are enabled for this chain\n * }\n * ```\n */\nexport function getSmartTransactionsFeatureFlagsForChain(\n featureFlags: SmartTransactionsFeatureFlagsConfig,\n chainId: Hex | CaipChainId,\n): SmartTransactionsNetworkConfig {\n const normalizedChainId = normalizeChainId(chainId);\n const defaultRemoteConfig = featureFlags.default ?? {};\n const chainRemoteConfig = featureFlags[normalizedChainId];\n\n if (chainRemoteConfig === undefined) {\n return DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default;\n }\n\n return {\n ...defaultRemoteConfig,\n ...chainRemoteConfig,\n };\n}\n"]}
@@ -0,0 +1,76 @@
1
+ import type { RemoteFeatureFlagControllerState } from "@metamask/remote-feature-flag-controller";
2
+ import type { CaipChainId, Hex } from "@metamask/utils";
3
+ import type { SmartTransactionsFeatureFlagsConfig, SmartTransactionsNetworkConfig } from "../types.cjs";
4
+ /**
5
+ * Normalizes a chain ID to hex format for EVM chains.
6
+ * - CAIP-2 EVM format (eip155:X) is converted to hex (0xY)
7
+ * - Hex format is returned as-is
8
+ * - Non-EVM CAIP-2 formats are returned as-is (exact match)
9
+ * - Invalid eip155 formats (non-numeric reference) are returned as-is
10
+ * - This is used because the current STX chains are EVM and declared as hex chain IDs in the existing flag.
11
+ *
12
+ * @param chainId - The chain ID in any supported format
13
+ * @returns Normalized chain ID (hex for EVM, original for non-EVM)
14
+ * @example
15
+ * ```ts
16
+ * normalizeChainId('0x1') // → '0x1'
17
+ * normalizeChainId('eip155:1') // → '0x1'
18
+ * normalizeChainId('eip155:137') // → '0x89'
19
+ * normalizeChainId('solana:...') // → 'solana:...' (unchanged)
20
+ * normalizeChainId('eip155:abc') // → 'eip155:abc' (invalid, unchanged)
21
+ * ```
22
+ */
23
+ export declare function normalizeChainId(chainId: Hex | CaipChainId): Hex | CaipChainId;
24
+ /**
25
+ * Processes raw feature flags data and returns a validated configuration.
26
+ * Invalid chain configs are silently removed. Error reporting is handled by
27
+ * the SmartTransactionsController via ErrorReportingService.
28
+ *
29
+ * @param rawFeatureFlags - The raw feature flags data from the remote feature flag controller
30
+ * @returns The validated feature flags configuration (partial if some chains were invalid)
31
+ */
32
+ export declare function processSmartTransactionsFeatureFlags(rawFeatureFlags: unknown): SmartTransactionsFeatureFlagsConfig;
33
+ /**
34
+ * Gets the smart transactions feature flags from the remote feature flag controller.
35
+ *
36
+ * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState
37
+ * @returns The smart transactions feature flags configuration
38
+ * @example
39
+ * ```ts
40
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
41
+ * const chainConfig = featureFlags['0x1'] ?? featureFlags.default;
42
+ * ```
43
+ */
44
+ export declare function getSmartTransactionsFeatureFlags<T extends {
45
+ call(action: 'RemoteFeatureFlagController:getState'): RemoteFeatureFlagControllerState;
46
+ }>(messenger: T): SmartTransactionsFeatureFlagsConfig;
47
+ /**
48
+ * Gets the merged feature flags configuration for a specific chain.
49
+ * Chain-specific configuration takes precedence over default configuration.
50
+ *
51
+ * For EVM chains, the chain ID is normalized to hex format before lookup.
52
+ * This means both '0x1' and 'eip155:1' will resolve to the same configuration.
53
+ * Non-EVM chains (e.g., Solana, Bitcoin) use exact match.
54
+ *
55
+ * @param featureFlags - The full feature flags configuration
56
+ * @param chainId - The chain ID to get configuration for.
57
+ * Supports both hex (e.g., "0x1") and CAIP-2 format (e.g., "eip155:1", "solana:...")
58
+ * @returns The merged configuration for the specified chain
59
+ * @example
60
+ * ```ts
61
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
62
+ *
63
+ * // Both resolve to the same config (normalized to 0x1)
64
+ * const chainConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, '0x1');
65
+ * const sameConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'eip155:1');
66
+ *
67
+ * // Non-EVM uses exact match
68
+ * const solanaConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp');
69
+ *
70
+ * if (chainConfig.extensionActive) {
71
+ * // Smart transactions are enabled for this chain
72
+ * }
73
+ * ```
74
+ */
75
+ export declare function getSmartTransactionsFeatureFlagsForChain(featureFlags: SmartTransactionsFeatureFlagsConfig, chainId: Hex | CaipChainId): SmartTransactionsNetworkConfig;
76
+ //# sourceMappingURL=feature-flags.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/featureFlags/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,iDAAiD;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AASxD,OAAO,KAAK,EACV,mCAAmC,EACnC,8BAA8B,EAC/B,qBAAiB;AAGlB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,GAAG,GAAG,WAAW,GACzB,GAAG,GAAG,WAAW,CAoBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,oCAAoC,CAClD,eAAe,EAAE,OAAO,GACvB,mCAAmC,CASrC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,CAAC,SAAS;IACR,IAAI,CACF,MAAM,EAAE,sCAAsC,GAC7C,gCAAgC,CAAC;CACrC,EACD,SAAS,EAAE,CAAC,GAAG,mCAAmC,CAUnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,wCAAwC,CACtD,YAAY,EAAE,mCAAmC,EACjD,OAAO,EAAE,GAAG,GAAG,WAAW,GACzB,8BAA8B,CAahC"}
@@ -0,0 +1,76 @@
1
+ import type { RemoteFeatureFlagControllerState } from "@metamask/remote-feature-flag-controller";
2
+ import type { CaipChainId, Hex } from "@metamask/utils";
3
+ import type { SmartTransactionsFeatureFlagsConfig, SmartTransactionsNetworkConfig } from "../types.mjs";
4
+ /**
5
+ * Normalizes a chain ID to hex format for EVM chains.
6
+ * - CAIP-2 EVM format (eip155:X) is converted to hex (0xY)
7
+ * - Hex format is returned as-is
8
+ * - Non-EVM CAIP-2 formats are returned as-is (exact match)
9
+ * - Invalid eip155 formats (non-numeric reference) are returned as-is
10
+ * - This is used because the current STX chains are EVM and declared as hex chain IDs in the existing flag.
11
+ *
12
+ * @param chainId - The chain ID in any supported format
13
+ * @returns Normalized chain ID (hex for EVM, original for non-EVM)
14
+ * @example
15
+ * ```ts
16
+ * normalizeChainId('0x1') // → '0x1'
17
+ * normalizeChainId('eip155:1') // → '0x1'
18
+ * normalizeChainId('eip155:137') // → '0x89'
19
+ * normalizeChainId('solana:...') // → 'solana:...' (unchanged)
20
+ * normalizeChainId('eip155:abc') // → 'eip155:abc' (invalid, unchanged)
21
+ * ```
22
+ */
23
+ export declare function normalizeChainId(chainId: Hex | CaipChainId): Hex | CaipChainId;
24
+ /**
25
+ * Processes raw feature flags data and returns a validated configuration.
26
+ * Invalid chain configs are silently removed. Error reporting is handled by
27
+ * the SmartTransactionsController via ErrorReportingService.
28
+ *
29
+ * @param rawFeatureFlags - The raw feature flags data from the remote feature flag controller
30
+ * @returns The validated feature flags configuration (partial if some chains were invalid)
31
+ */
32
+ export declare function processSmartTransactionsFeatureFlags(rawFeatureFlags: unknown): SmartTransactionsFeatureFlagsConfig;
33
+ /**
34
+ * Gets the smart transactions feature flags from the remote feature flag controller.
35
+ *
36
+ * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState
37
+ * @returns The smart transactions feature flags configuration
38
+ * @example
39
+ * ```ts
40
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
41
+ * const chainConfig = featureFlags['0x1'] ?? featureFlags.default;
42
+ * ```
43
+ */
44
+ export declare function getSmartTransactionsFeatureFlags<T extends {
45
+ call(action: 'RemoteFeatureFlagController:getState'): RemoteFeatureFlagControllerState;
46
+ }>(messenger: T): SmartTransactionsFeatureFlagsConfig;
47
+ /**
48
+ * Gets the merged feature flags configuration for a specific chain.
49
+ * Chain-specific configuration takes precedence over default configuration.
50
+ *
51
+ * For EVM chains, the chain ID is normalized to hex format before lookup.
52
+ * This means both '0x1' and 'eip155:1' will resolve to the same configuration.
53
+ * Non-EVM chains (e.g., Solana, Bitcoin) use exact match.
54
+ *
55
+ * @param featureFlags - The full feature flags configuration
56
+ * @param chainId - The chain ID to get configuration for.
57
+ * Supports both hex (e.g., "0x1") and CAIP-2 format (e.g., "eip155:1", "solana:...")
58
+ * @returns The merged configuration for the specified chain
59
+ * @example
60
+ * ```ts
61
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
62
+ *
63
+ * // Both resolve to the same config (normalized to 0x1)
64
+ * const chainConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, '0x1');
65
+ * const sameConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'eip155:1');
66
+ *
67
+ * // Non-EVM uses exact match
68
+ * const solanaConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp');
69
+ *
70
+ * if (chainConfig.extensionActive) {
71
+ * // Smart transactions are enabled for this chain
72
+ * }
73
+ * ```
74
+ */
75
+ export declare function getSmartTransactionsFeatureFlagsForChain(featureFlags: SmartTransactionsFeatureFlagsConfig, chainId: Hex | CaipChainId): SmartTransactionsNetworkConfig;
76
+ //# sourceMappingURL=feature-flags.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/featureFlags/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,iDAAiD;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AASxD,OAAO,KAAK,EACV,mCAAmC,EACnC,8BAA8B,EAC/B,qBAAiB;AAGlB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,GAAG,GAAG,WAAW,GACzB,GAAG,GAAG,WAAW,CAoBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,oCAAoC,CAClD,eAAe,EAAE,OAAO,GACvB,mCAAmC,CASrC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,CAAC,SAAS;IACR,IAAI,CACF,MAAM,EAAE,sCAAsC,GAC7C,gCAAgC,CAAC;CACrC,EACD,SAAS,EAAE,CAAC,GAAG,mCAAmC,CAUnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,wCAAwC,CACtD,YAAY,EAAE,mCAAmC,EACjD,OAAO,EAAE,GAAG,GAAG,WAAW,GACzB,8BAA8B,CAahC"}
@@ -0,0 +1,112 @@
1
+ import { isCaipChainId, KnownCaipNamespace, numberToHex, parseCaipChainId } from "@metamask/utils";
2
+ import { DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS } from "../constants.mjs";
3
+ import { validateSmartTransactionsFeatureFlags } from "./validators.mjs";
4
+ /**
5
+ * Normalizes a chain ID to hex format for EVM chains.
6
+ * - CAIP-2 EVM format (eip155:X) is converted to hex (0xY)
7
+ * - Hex format is returned as-is
8
+ * - Non-EVM CAIP-2 formats are returned as-is (exact match)
9
+ * - Invalid eip155 formats (non-numeric reference) are returned as-is
10
+ * - This is used because the current STX chains are EVM and declared as hex chain IDs in the existing flag.
11
+ *
12
+ * @param chainId - The chain ID in any supported format
13
+ * @returns Normalized chain ID (hex for EVM, original for non-EVM)
14
+ * @example
15
+ * ```ts
16
+ * normalizeChainId('0x1') // → '0x1'
17
+ * normalizeChainId('eip155:1') // → '0x1'
18
+ * normalizeChainId('eip155:137') // → '0x89'
19
+ * normalizeChainId('solana:...') // → 'solana:...' (unchanged)
20
+ * normalizeChainId('eip155:abc') // → 'eip155:abc' (invalid, unchanged)
21
+ * ```
22
+ */
23
+ export function normalizeChainId(chainId) {
24
+ // If it's already hex or not a valid CAIP chain ID, return as-is
25
+ if (!isCaipChainId(chainId)) {
26
+ return chainId;
27
+ }
28
+ const { namespace, reference } = parseCaipChainId(chainId);
29
+ // Only normalize EVM CAIP-2 chains with valid numeric references to hex
30
+ if (namespace === KnownCaipNamespace.Eip155) {
31
+ const decimal = parseInt(reference, 10);
32
+ // If reference is not a valid number, return as-is
33
+ if (Number.isNaN(decimal)) {
34
+ return chainId;
35
+ }
36
+ return numberToHex(decimal);
37
+ }
38
+ // Non-EVM CAIP chains remain unchanged
39
+ return chainId;
40
+ }
41
+ /**
42
+ * Processes raw feature flags data and returns a validated configuration.
43
+ * Invalid chain configs are silently removed. Error reporting is handled by
44
+ * the SmartTransactionsController via ErrorReportingService.
45
+ *
46
+ * @param rawFeatureFlags - The raw feature flags data from the remote feature flag controller
47
+ * @returns The validated feature flags configuration (partial if some chains were invalid)
48
+ */
49
+ export function processSmartTransactionsFeatureFlags(rawFeatureFlags) {
50
+ const { config } = validateSmartTransactionsFeatureFlags(rawFeatureFlags);
51
+ // Return config if it has any valid data, otherwise return defaults
52
+ if (Object.keys(config).length > 0) {
53
+ return config;
54
+ }
55
+ return DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS;
56
+ }
57
+ /**
58
+ * Gets the smart transactions feature flags from the remote feature flag controller.
59
+ *
60
+ * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState
61
+ * @returns The smart transactions feature flags configuration
62
+ * @example
63
+ * ```ts
64
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
65
+ * const chainConfig = featureFlags['0x1'] ?? featureFlags.default;
66
+ * ```
67
+ */
68
+ export function getSmartTransactionsFeatureFlags(messenger) {
69
+ var _a;
70
+ const remoteFeatureFlagControllerState = messenger.call('RemoteFeatureFlagController:getState');
71
+ const rawSmartTransactionsNetworks = (_a = remoteFeatureFlagControllerState === null || remoteFeatureFlagControllerState === void 0 ? void 0 : remoteFeatureFlagControllerState.remoteFeatureFlags) === null || _a === void 0 ? void 0 : _a.smartTransactionsNetworks;
72
+ return processSmartTransactionsFeatureFlags(rawSmartTransactionsNetworks);
73
+ }
74
+ /**
75
+ * Gets the merged feature flags configuration for a specific chain.
76
+ * Chain-specific configuration takes precedence over default configuration.
77
+ *
78
+ * For EVM chains, the chain ID is normalized to hex format before lookup.
79
+ * This means both '0x1' and 'eip155:1' will resolve to the same configuration.
80
+ * Non-EVM chains (e.g., Solana, Bitcoin) use exact match.
81
+ *
82
+ * @param featureFlags - The full feature flags configuration
83
+ * @param chainId - The chain ID to get configuration for.
84
+ * Supports both hex (e.g., "0x1") and CAIP-2 format (e.g., "eip155:1", "solana:...")
85
+ * @returns The merged configuration for the specified chain
86
+ * @example
87
+ * ```ts
88
+ * const featureFlags = getSmartTransactionsFeatureFlags(messenger);
89
+ *
90
+ * // Both resolve to the same config (normalized to 0x1)
91
+ * const chainConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, '0x1');
92
+ * const sameConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'eip155:1');
93
+ *
94
+ * // Non-EVM uses exact match
95
+ * const solanaConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp');
96
+ *
97
+ * if (chainConfig.extensionActive) {
98
+ * // Smart transactions are enabled for this chain
99
+ * }
100
+ * ```
101
+ */
102
+ export function getSmartTransactionsFeatureFlagsForChain(featureFlags, chainId) {
103
+ var _a;
104
+ const normalizedChainId = normalizeChainId(chainId);
105
+ const defaultRemoteConfig = (_a = featureFlags.default) !== null && _a !== void 0 ? _a : {};
106
+ const chainRemoteConfig = featureFlags[normalizedChainId];
107
+ if (chainRemoteConfig === undefined) {
108
+ return DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default;
109
+ }
110
+ return Object.assign(Object.assign({}, defaultRemoteConfig), chainRemoteConfig);
111
+ }
112
+ //# sourceMappingURL=feature-flags.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/featureFlags/feature-flags.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EACjB,wBAAwB;AAEzB,OAAO,EAAE,iDAAiD,EAAE,yBAAqB;AAKjF,OAAO,EAAE,qCAAqC,EAAE,yBAAqB;AAErE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAA0B;IAE1B,iEAAiE;IACjE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,OAAO,CAAC;KAChB;IAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE3D,wEAAwE;IACxE,IAAI,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxC,mDAAmD;QACnD,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;KAC7B;IAED,uCAAuC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oCAAoC,CAClD,eAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,GAAG,qCAAqC,CAAC,eAAe,CAAC,CAAC;IAE1E,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAClC,OAAO,MAAM,CAAC;KACf;IAED,OAAO,iDAAiD,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gCAAgC,CAM9C,SAAY;;IACZ,MAAM,gCAAgC,GAAG,SAAS,CAAC,IAAI,CACrD,sCAAsC,CACvC,CAAC;IAEF,MAAM,4BAA4B,GAChC,MAAA,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,kBAAkB,0CAChD,yBAAyB,CAAC;IAEhC,OAAO,oCAAoC,CAAC,4BAA4B,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,wCAAwC,CACtD,YAAiD,EACjD,OAA0B;;IAE1B,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,MAAA,YAAY,CAAC,OAAO,mCAAI,EAAE,CAAC;IACvD,MAAM,iBAAiB,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAE1D,IAAI,iBAAiB,KAAK,SAAS,EAAE;QACnC,OAAO,iDAAiD,CAAC,OAAO,CAAC;KAClE;IAED,uCACK,mBAAmB,GACnB,iBAAiB,EACpB;AACJ,CAAC","sourcesContent":["import type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport {\n isCaipChainId,\n KnownCaipNamespace,\n numberToHex,\n parseCaipChainId,\n} from '@metamask/utils';\n\nimport { DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS } from '../constants';\nimport type {\n SmartTransactionsFeatureFlagsConfig,\n SmartTransactionsNetworkConfig,\n} from '../types';\nimport { validateSmartTransactionsFeatureFlags } from './validators';\n\n/**\n * Normalizes a chain ID to hex format for EVM chains.\n * - CAIP-2 EVM format (eip155:X) is converted to hex (0xY)\n * - Hex format is returned as-is\n * - Non-EVM CAIP-2 formats are returned as-is (exact match)\n * - Invalid eip155 formats (non-numeric reference) are returned as-is\n * - This is used because the current STX chains are EVM and declared as hex chain IDs in the existing flag.\n *\n * @param chainId - The chain ID in any supported format\n * @returns Normalized chain ID (hex for EVM, original for non-EVM)\n * @example\n * ```ts\n * normalizeChainId('0x1') // → '0x1'\n * normalizeChainId('eip155:1') // → '0x1'\n * normalizeChainId('eip155:137') // → '0x89'\n * normalizeChainId('solana:...') // → 'solana:...' (unchanged)\n * normalizeChainId('eip155:abc') // → 'eip155:abc' (invalid, unchanged)\n * ```\n */\nexport function normalizeChainId(\n chainId: Hex | CaipChainId,\n): Hex | CaipChainId {\n // If it's already hex or not a valid CAIP chain ID, return as-is\n if (!isCaipChainId(chainId)) {\n return chainId;\n }\n\n const { namespace, reference } = parseCaipChainId(chainId);\n\n // Only normalize EVM CAIP-2 chains with valid numeric references to hex\n if (namespace === KnownCaipNamespace.Eip155) {\n const decimal = parseInt(reference, 10);\n // If reference is not a valid number, return as-is\n if (Number.isNaN(decimal)) {\n return chainId;\n }\n return numberToHex(decimal);\n }\n\n // Non-EVM CAIP chains remain unchanged\n return chainId;\n}\n\n/**\n * Processes raw feature flags data and returns a validated configuration.\n * Invalid chain configs are silently removed. Error reporting is handled by\n * the SmartTransactionsController via ErrorReportingService.\n *\n * @param rawFeatureFlags - The raw feature flags data from the remote feature flag controller\n * @returns The validated feature flags configuration (partial if some chains were invalid)\n */\nexport function processSmartTransactionsFeatureFlags(\n rawFeatureFlags: unknown,\n): SmartTransactionsFeatureFlagsConfig {\n const { config } = validateSmartTransactionsFeatureFlags(rawFeatureFlags);\n\n // Return config if it has any valid data, otherwise return defaults\n if (Object.keys(config).length > 0) {\n return config;\n }\n\n return DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS;\n}\n\n/**\n * Gets the smart transactions feature flags from the remote feature flag controller.\n *\n * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState\n * @returns The smart transactions feature flags configuration\n * @example\n * ```ts\n * const featureFlags = getSmartTransactionsFeatureFlags(messenger);\n * const chainConfig = featureFlags['0x1'] ?? featureFlags.default;\n * ```\n */\nexport function getSmartTransactionsFeatureFlags<\n T extends {\n call(\n action: 'RemoteFeatureFlagController:getState',\n ): RemoteFeatureFlagControllerState;\n },\n>(messenger: T): SmartTransactionsFeatureFlagsConfig {\n const remoteFeatureFlagControllerState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const rawSmartTransactionsNetworks =\n remoteFeatureFlagControllerState?.remoteFeatureFlags\n ?.smartTransactionsNetworks;\n\n return processSmartTransactionsFeatureFlags(rawSmartTransactionsNetworks);\n}\n\n/**\n * Gets the merged feature flags configuration for a specific chain.\n * Chain-specific configuration takes precedence over default configuration.\n *\n * For EVM chains, the chain ID is normalized to hex format before lookup.\n * This means both '0x1' and 'eip155:1' will resolve to the same configuration.\n * Non-EVM chains (e.g., Solana, Bitcoin) use exact match.\n *\n * @param featureFlags - The full feature flags configuration\n * @param chainId - The chain ID to get configuration for.\n * Supports both hex (e.g., \"0x1\") and CAIP-2 format (e.g., \"eip155:1\", \"solana:...\")\n * @returns The merged configuration for the specified chain\n * @example\n * ```ts\n * const featureFlags = getSmartTransactionsFeatureFlags(messenger);\n *\n * // Both resolve to the same config (normalized to 0x1)\n * const chainConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, '0x1');\n * const sameConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'eip155:1');\n *\n * // Non-EVM uses exact match\n * const solanaConfig = getSmartTransactionsFeatureFlagsForChain(featureFlags, 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp');\n *\n * if (chainConfig.extensionActive) {\n * // Smart transactions are enabled for this chain\n * }\n * ```\n */\nexport function getSmartTransactionsFeatureFlagsForChain(\n featureFlags: SmartTransactionsFeatureFlagsConfig,\n chainId: Hex | CaipChainId,\n): SmartTransactionsNetworkConfig {\n const normalizedChainId = normalizeChainId(chainId);\n const defaultRemoteConfig = featureFlags.default ?? {};\n const chainRemoteConfig = featureFlags[normalizedChainId];\n\n if (chainRemoteConfig === undefined) {\n return DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default;\n }\n\n return {\n ...defaultRemoteConfig,\n ...chainRemoteConfig,\n };\n}\n"]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeChainId = exports.getSmartTransactionsFeatureFlagsForChain = exports.processSmartTransactionsFeatureFlags = exports.getSmartTransactionsFeatureFlags = exports.SmartTransactionsFeatureFlagsConfigSchema = exports.SmartTransactionsNetworkConfigSchema = exports.validateSmartTransactionsNetworkConfig = exports.validateSmartTransactionsFeatureFlags = void 0;
4
+ var validators_1 = require("./validators.cjs");
5
+ Object.defineProperty(exports, "validateSmartTransactionsFeatureFlags", { enumerable: true, get: function () { return validators_1.validateSmartTransactionsFeatureFlags; } });
6
+ Object.defineProperty(exports, "validateSmartTransactionsNetworkConfig", { enumerable: true, get: function () { return validators_1.validateSmartTransactionsNetworkConfig; } });
7
+ Object.defineProperty(exports, "SmartTransactionsNetworkConfigSchema", { enumerable: true, get: function () { return validators_1.SmartTransactionsNetworkConfigSchema; } });
8
+ Object.defineProperty(exports, "SmartTransactionsFeatureFlagsConfigSchema", { enumerable: true, get: function () { return validators_1.SmartTransactionsFeatureFlagsConfigSchema; } });
9
+ var feature_flags_1 = require("./feature-flags.cjs");
10
+ Object.defineProperty(exports, "getSmartTransactionsFeatureFlags", { enumerable: true, get: function () { return feature_flags_1.getSmartTransactionsFeatureFlags; } });
11
+ Object.defineProperty(exports, "processSmartTransactionsFeatureFlags", { enumerable: true, get: function () { return feature_flags_1.processSmartTransactionsFeatureFlags; } });
12
+ Object.defineProperty(exports, "getSmartTransactionsFeatureFlagsForChain", { enumerable: true, get: function () { return feature_flags_1.getSmartTransactionsFeatureFlagsForChain; } });
13
+ Object.defineProperty(exports, "normalizeChainId", { enumerable: true, get: function () { return feature_flags_1.normalizeChainId; } });
14
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":";;;AAAA,+CASsB;AARpB,mIAAA,qCAAqC,OAAA;AACrC,oIAAA,sCAAsC,OAAA;AACtC,kIAAA,oCAAoC,OAAA;AACpC,uIAAA,yCAAyC,OAAA;AAO3C,qDAKyB;AAJvB,iIAAA,gCAAgC,OAAA;AAChC,qIAAA,oCAAoC,OAAA;AACpC,yIAAA,wCAAwC,OAAA;AACxC,iHAAA,gBAAgB,OAAA","sourcesContent":["export {\n validateSmartTransactionsFeatureFlags,\n validateSmartTransactionsNetworkConfig,\n SmartTransactionsNetworkConfigSchema,\n SmartTransactionsFeatureFlagsConfigSchema,\n type SmartTransactionsNetworkConfigFromSchema,\n type SmartTransactionsNetworkConfigFromSchema as SmartTransactionsNetworkConfig,\n type SmartTransactionsFeatureFlagsConfigFromSchema,\n type FeatureFlagsProcessResult,\n} from './validators';\n\nexport {\n getSmartTransactionsFeatureFlags,\n processSmartTransactionsFeatureFlags,\n getSmartTransactionsFeatureFlagsForChain,\n normalizeChainId,\n} from './feature-flags';\n"]}
@@ -0,0 +1,3 @@
1
+ export { validateSmartTransactionsFeatureFlags, validateSmartTransactionsNetworkConfig, SmartTransactionsNetworkConfigSchema, SmartTransactionsFeatureFlagsConfigSchema, type SmartTransactionsNetworkConfigFromSchema, type SmartTransactionsNetworkConfigFromSchema as SmartTransactionsNetworkConfig, type SmartTransactionsFeatureFlagsConfigFromSchema, type FeatureFlagsProcessResult, } from "./validators.cjs";
2
+ export { getSmartTransactionsFeatureFlags, processSmartTransactionsFeatureFlags, getSmartTransactionsFeatureFlagsForChain, normalizeChainId, } from "./feature-flags.cjs";
3
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qCAAqC,EACrC,sCAAsC,EACtC,oCAAoC,EACpC,yCAAyC,EACzC,KAAK,wCAAwC,EAC7C,KAAK,wCAAwC,IAAI,8BAA8B,EAC/E,KAAK,6CAA6C,EAClD,KAAK,yBAAyB,GAC/B,yBAAqB;AAEtB,OAAO,EACL,gCAAgC,EAChC,oCAAoC,EACpC,wCAAwC,EACxC,gBAAgB,GACjB,4BAAwB"}
@@ -0,0 +1,3 @@
1
+ export { validateSmartTransactionsFeatureFlags, validateSmartTransactionsNetworkConfig, SmartTransactionsNetworkConfigSchema, SmartTransactionsFeatureFlagsConfigSchema, type SmartTransactionsNetworkConfigFromSchema, type SmartTransactionsNetworkConfigFromSchema as SmartTransactionsNetworkConfig, type SmartTransactionsFeatureFlagsConfigFromSchema, type FeatureFlagsProcessResult, } from "./validators.mjs";
2
+ export { getSmartTransactionsFeatureFlags, processSmartTransactionsFeatureFlags, getSmartTransactionsFeatureFlagsForChain, normalizeChainId, } from "./feature-flags.mjs";
3
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qCAAqC,EACrC,sCAAsC,EACtC,oCAAoC,EACpC,yCAAyC,EACzC,KAAK,wCAAwC,EAC7C,KAAK,wCAAwC,IAAI,8BAA8B,EAC/E,KAAK,6CAA6C,EAClD,KAAK,yBAAyB,GAC/B,yBAAqB;AAEtB,OAAO,EACL,gCAAgC,EAChC,oCAAoC,EACpC,wCAAwC,EACxC,gBAAgB,GACjB,4BAAwB"}
@@ -0,0 +1,3 @@
1
+ export { validateSmartTransactionsFeatureFlags, validateSmartTransactionsNetworkConfig, SmartTransactionsNetworkConfigSchema, SmartTransactionsFeatureFlagsConfigSchema } from "./validators.mjs";
2
+ export { getSmartTransactionsFeatureFlags, processSmartTransactionsFeatureFlags, getSmartTransactionsFeatureFlagsForChain, normalizeChainId } from "./feature-flags.mjs";
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/featureFlags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qCAAqC,EACrC,sCAAsC,EACtC,oCAAoC,EACpC,yCAAyC,EAK1C,yBAAqB;AAEtB,OAAO,EACL,gCAAgC,EAChC,oCAAoC,EACpC,wCAAwC,EACxC,gBAAgB,EACjB,4BAAwB","sourcesContent":["export {\n validateSmartTransactionsFeatureFlags,\n validateSmartTransactionsNetworkConfig,\n SmartTransactionsNetworkConfigSchema,\n SmartTransactionsFeatureFlagsConfigSchema,\n type SmartTransactionsNetworkConfigFromSchema,\n type SmartTransactionsNetworkConfigFromSchema as SmartTransactionsNetworkConfig,\n type SmartTransactionsFeatureFlagsConfigFromSchema,\n type FeatureFlagsProcessResult,\n} from './validators';\n\nexport {\n getSmartTransactionsFeatureFlags,\n processSmartTransactionsFeatureFlags,\n getSmartTransactionsFeatureFlagsForChain,\n normalizeChainId,\n} from './feature-flags';\n"]}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSmartTransactionsNetworkConfig = exports.validateSmartTransactionsFeatureFlags = exports.SmartTransactionsFeatureFlagsConfigSchema = exports.SmartTransactionsNetworkConfigSchema = void 0;
4
+ const superstruct_1 = require("@metamask/superstruct");
5
+ const utils_1 = require("@metamask/utils");
6
+ /**
7
+ * Validates that a key is a valid chain ID (hex or CAIP-2 format).
8
+ * Supports both EVM hex chain IDs and chain-agnostic CAIP-2 identifiers.
9
+ *
10
+ * @param key - The key to validate
11
+ * @returns True if the key is a valid chain ID format
12
+ */
13
+ function isValidChainIdKey(key) {
14
+ return (0, utils_1.isStrictHexString)(key) || (0, utils_1.isCaipChainId)(key);
15
+ }
16
+ /**
17
+ * Schema for validating per-network smart transactions configuration.
18
+ * All fields are optional to allow partial configuration and merging with defaults.
19
+ */
20
+ exports.SmartTransactionsNetworkConfigSchema = (0, superstruct_1.type)({
21
+ /** Whether smart transactions are active for the extension client */
22
+ extensionActive: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
23
+ /** Whether smart transactions are active for mobile clients (generic) */
24
+ mobileActive: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
25
+ /** Whether smart transactions are active for iOS specifically */
26
+ mobileActiveIOS: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
27
+ /** Whether smart transactions are active for Android specifically */
28
+ mobileActiveAndroid: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
29
+ /** Expected time in seconds for a smart transaction to be mined */
30
+ expectedDeadline: (0, superstruct_1.optional)((0, superstruct_1.number)()),
31
+ /** Maximum time in seconds before a smart transaction is considered failed */
32
+ maxDeadline: (0, superstruct_1.optional)((0, superstruct_1.number)()),
33
+ /** Whether extension should return tx hash immediately without waiting for confirmation */
34
+ extensionReturnTxHashAsap: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
35
+ /** Whether extension should return tx hash immediately for batch transactions */
36
+ extensionReturnTxHashAsapBatch: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
37
+ /** Whether mobile should return tx hash immediately without waiting for confirmation */
38
+ mobileReturnTxHashAsap: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
39
+ /** Whether extension should skip the smart transaction status page */
40
+ extensionSkipSmartTransactionStatusPage: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
41
+ /** Polling interval in milliseconds for batch status updates */
42
+ batchStatusPollingInterval: (0, superstruct_1.optional)((0, superstruct_1.number)()),
43
+ /** Custom sentinel URL for the network */
44
+ sentinelUrl: (0, superstruct_1.optional)((0, superstruct_1.string)()),
45
+ });
46
+ /**
47
+ * Schema for validating the complete smart transactions feature flags configuration.
48
+ * This includes a default configuration and optional chain-specific overrides.
49
+ */
50
+ exports.SmartTransactionsFeatureFlagsConfigSchema = (0, superstruct_1.type)({
51
+ /** Default configuration applied to all chains unless overridden */
52
+ default: (0, superstruct_1.optional)(exports.SmartTransactionsNetworkConfigSchema),
53
+ });
54
+ /**
55
+ * Validates smart transactions feature flags with per-chain validation.
56
+ * - If the input is not an object, returns empty config with error
57
+ * - If `default` is present and invalid, returns empty config with error
58
+ * - For each chain: if invalid, removes it and collects error; if valid, includes it
59
+ *
60
+ * @param data - The data to validate
61
+ * @returns The validated config and any validation errors
62
+ */
63
+ function validateSmartTransactionsFeatureFlags(data) {
64
+ const errors = [];
65
+ // Step 1: Check if it's a valid object
66
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
67
+ const typeDescription = data === null ? 'null' : typeof data;
68
+ const arraySuffix = Array.isArray(data) ? ' (array)' : '';
69
+ return {
70
+ config: {},
71
+ errors: [
72
+ new Error(`Expected an object, received ${typeDescription}${arraySuffix}`),
73
+ ],
74
+ };
75
+ }
76
+ const dataRecord = data;
77
+ const validConfig = {};
78
+ // Step 2: Validate 'default' - if present and invalid, reject everything
79
+ if (dataRecord.default !== undefined) {
80
+ const [defaultError, validatedDefault] = (0, superstruct_1.validate)(dataRecord.default, exports.SmartTransactionsNetworkConfigSchema);
81
+ if (defaultError) {
82
+ return {
83
+ config: {},
84
+ errors: [
85
+ new Error(`Invalid 'default' config: ${defaultError.message}`),
86
+ ],
87
+ };
88
+ }
89
+ // validatedDefault is properly typed from superstruct
90
+ validConfig.default = validatedDefault;
91
+ }
92
+ // Step 3: Validate chain-specific configs, keeping valid ones
93
+ for (const [key, value] of Object.entries(dataRecord)) {
94
+ if (key === 'default') {
95
+ continue;
96
+ }
97
+ // Check chain ID format
98
+ if (!isValidChainIdKey(key)) {
99
+ errors.push(new Error(`Invalid chain ID key "${key}". Expected hex string (e.g., "0x1") or CAIP-2 format (e.g., "eip155:1", "solana:...")`));
100
+ continue; // Skip this chain, don't add to result
101
+ }
102
+ // Validate chain config
103
+ if (value !== undefined) {
104
+ const [chainError, validatedChain] = (0, superstruct_1.validate)(value, exports.SmartTransactionsNetworkConfigSchema);
105
+ if (chainError) {
106
+ errors.push(new Error(`Chain "${key}": ${chainError.message}`));
107
+ continue; // Skip this chain, don't add to result
108
+ }
109
+ // validatedChain is properly typed from superstruct
110
+ validConfig[key] = validatedChain;
111
+ }
112
+ }
113
+ return { config: validConfig, errors };
114
+ }
115
+ exports.validateSmartTransactionsFeatureFlags = validateSmartTransactionsFeatureFlags;
116
+ /**
117
+ * Validates that the given data conforms to the SmartTransactionsNetworkConfig schema.
118
+ *
119
+ * @param data - The data to validate
120
+ * @returns True if the data is valid, false otherwise
121
+ */
122
+ function validateSmartTransactionsNetworkConfig(data) {
123
+ return (0, superstruct_1.is)(data, exports.SmartTransactionsNetworkConfigSchema);
124
+ }
125
+ exports.validateSmartTransactionsNetworkConfig = validateSmartTransactionsNetworkConfig;
126
+ //# sourceMappingURL=validators.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n boolean,\n number,\n optional,\n string,\n type,\n is,\n validate,\n} from '@metamask/superstruct';\nimport type { Infer } from '@metamask/superstruct';\nimport { isCaipChainId, isStrictHexString } from '@metamask/utils';\n\n/**\n * Validates that a key is a valid chain ID (hex or CAIP-2 format).\n * Supports both EVM hex chain IDs and chain-agnostic CAIP-2 identifiers.\n *\n * @param key - The key to validate\n * @returns True if the key is a valid chain ID format\n */\nfunction isValidChainIdKey(key: string): boolean {\n return isStrictHexString(key) || isCaipChainId(key);\n}\n\n/**\n * Schema for validating per-network smart transactions configuration.\n * All fields are optional to allow partial configuration and merging with defaults.\n */\nexport const SmartTransactionsNetworkConfigSchema = type({\n /** Whether smart transactions are active for the extension client */\n extensionActive: optional(boolean()),\n /** Whether smart transactions are active for mobile clients (generic) */\n mobileActive: optional(boolean()),\n /** Whether smart transactions are active for iOS specifically */\n mobileActiveIOS: optional(boolean()),\n /** Whether smart transactions are active for Android specifically */\n mobileActiveAndroid: optional(boolean()),\n /** Expected time in seconds for a smart transaction to be mined */\n expectedDeadline: optional(number()),\n /** Maximum time in seconds before a smart transaction is considered failed */\n maxDeadline: optional(number()),\n /** Whether extension should return tx hash immediately without waiting for confirmation */\n extensionReturnTxHashAsap: optional(boolean()),\n /** Whether extension should return tx hash immediately for batch transactions */\n extensionReturnTxHashAsapBatch: optional(boolean()),\n /** Whether mobile should return tx hash immediately without waiting for confirmation */\n mobileReturnTxHashAsap: optional(boolean()),\n /** Whether extension should skip the smart transaction status page */\n extensionSkipSmartTransactionStatusPage: optional(boolean()),\n /** Polling interval in milliseconds for batch status updates */\n batchStatusPollingInterval: optional(number()),\n /** Custom sentinel URL for the network */\n sentinelUrl: optional(string()),\n});\n\n/**\n * Schema for validating the complete smart transactions feature flags configuration.\n * This includes a default configuration and optional chain-specific overrides.\n */\nexport const SmartTransactionsFeatureFlagsConfigSchema = type({\n /** Default configuration applied to all chains unless overridden */\n default: optional(SmartTransactionsNetworkConfigSchema),\n});\n\n/**\n * Type inferred from the SmartTransactionsNetworkConfigSchema\n */\nexport type SmartTransactionsNetworkConfigFromSchema = Infer<\n typeof SmartTransactionsNetworkConfigSchema\n>;\n\n/**\n * Type inferred from the SmartTransactionsFeatureFlagsConfigSchema\n */\nexport type SmartTransactionsFeatureFlagsConfigFromSchema = Infer<\n typeof SmartTransactionsFeatureFlagsConfigSchema\n>;\n\n/**\n * Result of processing feature flags with collected validation errors.\n * Uses per-chain validation: invalid chains are removed, valid ones are kept.\n */\nexport type FeatureFlagsProcessResult = {\n /** The validated configuration (may be partial if some chains were invalid) */\n config: SmartTransactionsFeatureFlagsConfigFromSchema &\n Record<string, SmartTransactionsNetworkConfigFromSchema | undefined>;\n /** Validation errors for invalid parts of the configuration */\n errors: Error[];\n};\n\n/**\n * Validates smart transactions feature flags with per-chain validation.\n * - If the input is not an object, returns empty config with error\n * - If `default` is present and invalid, returns empty config with error\n * - For each chain: if invalid, removes it and collects error; if valid, includes it\n *\n * @param data - The data to validate\n * @returns The validated config and any validation errors\n */\nexport function validateSmartTransactionsFeatureFlags(\n data: unknown,\n): FeatureFlagsProcessResult {\n const errors: Error[] = [];\n\n // Step 1: Check if it's a valid object\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n const typeDescription = data === null ? 'null' : typeof data;\n const arraySuffix = Array.isArray(data) ? ' (array)' : '';\n return {\n config: {},\n errors: [\n new Error(\n `Expected an object, received ${typeDescription}${arraySuffix}`,\n ),\n ],\n };\n }\n\n const dataRecord = data as Record<string, unknown>;\n const validConfig: FeatureFlagsProcessResult['config'] = {};\n\n // Step 2: Validate 'default' - if present and invalid, reject everything\n if (dataRecord.default !== undefined) {\n const [defaultError, validatedDefault] = validate(\n dataRecord.default,\n SmartTransactionsNetworkConfigSchema,\n );\n if (defaultError) {\n return {\n config: {},\n errors: [\n new Error(`Invalid 'default' config: ${defaultError.message}`),\n ],\n };\n }\n // validatedDefault is properly typed from superstruct\n validConfig.default = validatedDefault;\n }\n\n // Step 3: Validate chain-specific configs, keeping valid ones\n for (const [key, value] of Object.entries(dataRecord)) {\n if (key === 'default') {\n continue;\n }\n\n // Check chain ID format\n if (!isValidChainIdKey(key)) {\n errors.push(\n new Error(\n `Invalid chain ID key \"${key}\". Expected hex string (e.g., \"0x1\") or CAIP-2 format (e.g., \"eip155:1\", \"solana:...\")`,\n ),\n );\n continue; // Skip this chain, don't add to result\n }\n\n // Validate chain config\n if (value !== undefined) {\n const [chainError, validatedChain] = validate(\n value,\n SmartTransactionsNetworkConfigSchema,\n );\n if (chainError) {\n errors.push(new Error(`Chain \"${key}\": ${chainError.message}`));\n continue; // Skip this chain, don't add to result\n }\n // validatedChain is properly typed from superstruct\n validConfig[key] = validatedChain;\n }\n }\n\n return { config: validConfig, errors };\n}\n\n/**\n * Validates that the given data conforms to the SmartTransactionsNetworkConfig schema.\n *\n * @param data - The data to validate\n * @returns True if the data is valid, false otherwise\n */\nexport function validateSmartTransactionsNetworkConfig(\n data: unknown,\n): data is SmartTransactionsNetworkConfigFromSchema {\n return is(data, SmartTransactionsNetworkConfigSchema);\n}\n"]}