@metamask/smart-transactions-controller 21.0.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 +24 -1
  2. package/README.md +47 -0
  3. package/dist/SmartTransactionsController.cjs +32 -8
  4. package/dist/SmartTransactionsController.cjs.map +1 -1
  5. package/dist/SmartTransactionsController.d.cts +24 -6
  6. package/dist/SmartTransactionsController.d.cts.map +1 -1
  7. package/dist/SmartTransactionsController.d.mts +24 -6
  8. package/dist/SmartTransactionsController.d.mts.map +1 -1
  9. package/dist/SmartTransactionsController.mjs +33 -9
  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
@@ -19,5 +19,25 @@ export declare enum SmartTransactionsTraceName {
19
19
  CancelTransaction = "Smart Transactions: Cancel Transaction",
20
20
  FetchLiveness = "Smart Transactions: Fetch Liveness"
21
21
  }
22
+ /**
23
+ * Default feature flags configuration for smart transactions.
24
+ * Used as a fallback when remote feature flags are unavailable or invalid.
25
+ * This is voluntarily defensive because it is applied to any network without valid configuration.
26
+ */
27
+ export declare const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS: {
28
+ readonly default: {
29
+ readonly extensionActive: false;
30
+ readonly mobileActive: false;
31
+ readonly mobileActiveIOS: false;
32
+ readonly mobileActiveAndroid: false;
33
+ readonly expectedDeadline: 45;
34
+ readonly maxDeadline: 150;
35
+ readonly extensionReturnTxHashAsap: false;
36
+ readonly extensionReturnTxHashAsapBatch: false;
37
+ readonly mobileReturnTxHashAsap: false;
38
+ readonly extensionSkipSmartTransactionStatusPage: false;
39
+ readonly batchStatusPollingInterval: 1000;
40
+ };
41
+ };
22
42
  export {};
23
43
  //# sourceMappingURL=constants.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,aAAK,qBAAqB,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,EAAE,qBAQvC,CAAC;AAEF,oBAAY,oBAAoB;IAC9B,gBAAgB,uBAAuB;IACvC,YAAY,kBAAkB;IAC9B,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;CACnC;AAED,oBAAY,wBAAwB;IAClC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;CAC1B;AAED,oBAAY,0BAA0B;IACpC,OAAO,iCAAiC;IACxC,kBAAkB,4CAA4C;IAC9D,iBAAiB,2CAA2C;IAC5D,aAAa,uCAAuC;CACrD"}
1
+ {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,aAAK,qBAAqB,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,EAAE,qBAQvC,CAAC;AAEF,oBAAY,oBAAoB;IAC9B,gBAAgB,uBAAuB;IACvC,YAAY,kBAAkB;IAC9B,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;CACnC;AAED,oBAAY,wBAAwB;IAClC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;CAC1B;AAED,oBAAY,0BAA0B;IACpC,OAAO,iCAAiC;IACxC,kBAAkB,4CAA4C;IAC9D,iBAAiB,2CAA2C;IAC5D,aAAa,uCAAuC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;CAcpD,CAAC"}
@@ -28,4 +28,24 @@ export var SmartTransactionsTraceName;
28
28
  SmartTransactionsTraceName["CancelTransaction"] = "Smart Transactions: Cancel Transaction";
29
29
  SmartTransactionsTraceName["FetchLiveness"] = "Smart Transactions: Fetch Liveness";
30
30
  })(SmartTransactionsTraceName = SmartTransactionsTraceName || (SmartTransactionsTraceName = {}));
31
+ /**
32
+ * Default feature flags configuration for smart transactions.
33
+ * Used as a fallback when remote feature flags are unavailable or invalid.
34
+ * This is voluntarily defensive because it is applied to any network without valid configuration.
35
+ */
36
+ export const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {
37
+ default: {
38
+ extensionActive: false,
39
+ mobileActive: false,
40
+ mobileActiveIOS: false,
41
+ mobileActiveAndroid: false,
42
+ expectedDeadline: 45,
43
+ maxDeadline: 150,
44
+ extensionReturnTxHashAsap: false,
45
+ extensionReturnTxHashAsapBatch: false,
46
+ mobileReturnTxHashAsap: false,
47
+ extensionSkipSmartTransactionStatusPage: false,
48
+ batchStatusPollingInterval: 1000,
49
+ },
50
+ };
31
51
  //# sourceMappingURL=constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAMrE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,yBAAyB,GAA0B;IAC9D,CAAC,EAAE,yDAAyD;IAC5D,EAAE,EAAE,oDAAoD;IACxD,GAAG,EAAE,wDAAwD;IAC7D,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,sDAAsD;IAC7D,QAAQ,EAAE,yDAAyD;CACpE,CAAC;AAEF,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,+DAAuC,CAAA;IACvC,sDAA8B,CAAA;IAC9B,yEAAiD,CAAA;IACjD,0DAAkC,CAAA;AACpC,CAAC,EALW,oBAAoB,GAApB,oBAAoB,KAApB,oBAAoB,QAK/B;AAED,MAAM,CAAN,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,yDAA6B,CAAA;IAC7B,qDAAyB,CAAA;AAC3B,CAAC,EAHW,wBAAwB,GAAxB,wBAAwB,KAAxB,wBAAwB,QAGnC;AAED,MAAM,CAAN,IAAY,0BAKX;AALD,WAAY,0BAA0B;IACpC,sEAAwC,CAAA;IACxC,4FAA8D,CAAA;IAC9D,0FAA4D,CAAA;IAC5D,kFAAoD,CAAA;AACtD,CAAC,EALW,0BAA0B,GAA1B,0BAA0B,KAA1B,0BAA0B,QAKrC","sourcesContent":["export const API_BASE_URL = 'https://transaction.api.cx.metamask.io';\n\ntype SentinelApiBaseUrlMap = {\n [key: number]: string;\n};\n\n// The map with types applied\nexport const SENTINEL_API_BASE_URL_MAP: SentinelApiBaseUrlMap = {\n 1: 'https://tx-sentinel-ethereum-mainnet.api.cx.metamask.io',\n 56: 'https://tx-sentinel-bsc-mainnet.api.cx.metamask.io',\n 137: 'https://tx-sentinel-polygon-mainnet.api.cx.metamask.io',\n 8453: 'https://tx-sentinel-base-mainnet.api.cx.metamask.io',\n 42161: 'https://tx-sentinel-arbitrum-mainnet.api.cx.metamask.io',\n 59144: 'https://tx-sentinel-linea-mainnet.api.cx.metamask.io',\n 11155111: 'https://tx-sentinel-ethereum-sepolia.api.cx.metamask.io',\n};\n\nexport enum MetaMetricsEventName {\n StxStatusUpdated = 'STX Status Updated',\n StxConfirmed = 'STX Confirmed',\n StxConfirmationFailed = 'STX Confirmation Failed',\n ReceiveRequest = 'Receive Request',\n}\n\nexport enum MetaMetricsEventCategory {\n Transactions = 'Transactions',\n Navigation = 'Navigation',\n}\n\nexport enum SmartTransactionsTraceName {\n GetFees = 'Smart Transactions: Get Fees',\n SubmitTransactions = 'Smart Transactions: Submit Transactions',\n CancelTransaction = 'Smart Transactions: Cancel Transaction',\n FetchLiveness = 'Smart Transactions: Fetch Liveness',\n}\n"]}
1
+ {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAMrE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,yBAAyB,GAA0B;IAC9D,CAAC,EAAE,yDAAyD;IAC5D,EAAE,EAAE,oDAAoD;IACxD,GAAG,EAAE,wDAAwD;IAC7D,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,sDAAsD;IAC7D,QAAQ,EAAE,yDAAyD;CACpE,CAAC;AAEF,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,+DAAuC,CAAA;IACvC,sDAA8B,CAAA;IAC9B,yEAAiD,CAAA;IACjD,0DAAkC,CAAA;AACpC,CAAC,EALW,oBAAoB,GAApB,oBAAoB,KAApB,oBAAoB,QAK/B;AAED,MAAM,CAAN,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,yDAA6B,CAAA;IAC7B,qDAAyB,CAAA;AAC3B,CAAC,EAHW,wBAAwB,GAAxB,wBAAwB,KAAxB,wBAAwB,QAGnC;AAED,MAAM,CAAN,IAAY,0BAKX;AALD,WAAY,0BAA0B;IACpC,sEAAwC,CAAA;IACxC,4FAA8D,CAAA;IAC9D,0FAA4D,CAAA;IAC5D,kFAAoD,CAAA;AACtD,CAAC,EALW,0BAA0B,GAA1B,0BAA0B,KAA1B,0BAA0B,QAKrC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iDAAiD,GAAG;IAC/D,OAAO,EAAE;QACP,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,GAAG;QAChB,yBAAyB,EAAE,KAAK;QAChC,8BAA8B,EAAE,KAAK;QACrC,sBAAsB,EAAE,KAAK;QAC7B,uCAAuC,EAAE,KAAK;QAC9C,0BAA0B,EAAE,IAAI;KACjC;CACO,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.api.cx.metamask.io';\n\ntype SentinelApiBaseUrlMap = {\n [key: number]: string;\n};\n\n// The map with types applied\nexport const SENTINEL_API_BASE_URL_MAP: SentinelApiBaseUrlMap = {\n 1: 'https://tx-sentinel-ethereum-mainnet.api.cx.metamask.io',\n 56: 'https://tx-sentinel-bsc-mainnet.api.cx.metamask.io',\n 137: 'https://tx-sentinel-polygon-mainnet.api.cx.metamask.io',\n 8453: 'https://tx-sentinel-base-mainnet.api.cx.metamask.io',\n 42161: 'https://tx-sentinel-arbitrum-mainnet.api.cx.metamask.io',\n 59144: 'https://tx-sentinel-linea-mainnet.api.cx.metamask.io',\n 11155111: 'https://tx-sentinel-ethereum-sepolia.api.cx.metamask.io',\n};\n\nexport enum MetaMetricsEventName {\n StxStatusUpdated = 'STX Status Updated',\n StxConfirmed = 'STX Confirmed',\n StxConfirmationFailed = 'STX Confirmation Failed',\n ReceiveRequest = 'Receive Request',\n}\n\nexport enum MetaMetricsEventCategory {\n Transactions = 'Transactions',\n Navigation = 'Navigation',\n}\n\nexport enum SmartTransactionsTraceName {\n GetFees = 'Smart Transactions: Get Fees',\n SubmitTransactions = 'Smart Transactions: Submit Transactions',\n CancelTransaction = 'Smart Transactions: Cancel Transaction',\n FetchLiveness = 'Smart Transactions: Fetch Liveness',\n}\n\n/**\n * Default feature flags configuration for smart transactions.\n * Used as a fallback when remote feature flags are unavailable or invalid.\n * This is voluntarily defensive because it is applied to any network without valid configuration.\n */\nexport const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {\n default: {\n extensionActive: false,\n mobileActive: false,\n mobileActiveIOS: false,\n mobileActiveAndroid: false,\n expectedDeadline: 45,\n maxDeadline: 150,\n extensionReturnTxHashAsap: false,\n extensionReturnTxHashAsapBatch: false,\n mobileReturnTxHashAsap: false,\n extensionSkipSmartTransactionStatusPage: false,\n batchStatusPollingInterval: 1000,\n },\n} as const;\n"]}
@@ -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"]}