@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
package/CHANGELOG.md CHANGED
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [22.0.0]
11
+
12
+ ### Changed
13
+
14
+ - **BREAKING**: The controller now reads feature flags directly from `RemoteFeatureFlagController` via the messenger instead of using the `getFeatureFlags` callback ([#550](https://github.com/MetaMask/smart-transactions-controller/pull/550))
15
+ - Clients must configure the following as allowed actions in the controller messenger:
16
+ - `RemoteFeatureFlagController:getState`
17
+ - `ErrorReportingService:captureException` (for reporting validation errors to Sentry)
18
+ - Clients must configure `RemoteFeatureFlagController:stateChange` as an allowed event
19
+ - The `getFeatureFlags` constructor option is now deprecated and ignored
20
+
21
+ ## [21.1.0]
22
+
23
+ ### Added
24
+
25
+ - Add `chainId` parameter to `fetchLiveness` method, allowing direct chain ID specification without requiring a network client ID ([#554](https://github.com/MetaMask/smart-transactions-controller/pull/554))
26
+
27
+ ### Deprecated
28
+
29
+ - Deprecate `networkClientId` parameter in `fetchLiveness` in favor of `chainId` ([#554](https://github.com/MetaMask/smart-transactions-controller/pull/554))
30
+
10
31
  ## [21.0.0]
11
32
 
12
33
  ### Changed
@@ -671,7 +692,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
671
692
  - Add initial SmartTransactionsController ([#1](https://github.com/MetaMask/smart-transactions-controller/pull/1))
672
693
  - Initial commit
673
694
 
674
- [Unreleased]: https://github.com/MetaMask/smart-transactions-controller/compare/v21.0.0...HEAD
695
+ [Unreleased]: https://github.com/MetaMask/smart-transactions-controller/compare/v22.0.0...HEAD
696
+ [22.0.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v21.1.0...v22.0.0
697
+ [21.1.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v21.0.0...v21.1.0
675
698
  [21.0.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v20.1.0...v21.0.0
676
699
  [20.1.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v20.0.0...v20.1.0
677
700
  [20.0.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v19.2.1...v20.0.0
package/README.md CHANGED
@@ -25,6 +25,53 @@ Run `yarn test` to run the tests once. To run tests on file changes, run `yarn t
25
25
 
26
26
  Run `yarn lint` to run the linter, or run `yarn lint:fix` to run the linter and fix any automatically fixable issues.
27
27
 
28
+ ### Feature Flags
29
+
30
+ Smart transactions feature flags are managed via `RemoteFeatureFlagController` (LaunchDarkly). The configuration uses a `default` remote object for global settings and chain-specific overrides keyed by hex chain ID.
31
+
32
+ The flag in LaunchDarkly is named `smartTransactionsNetworks`.
33
+
34
+ #### Adding a New Flag
35
+
36
+ 1. **Add the field to the schema** in `src/utils/validators.ts`:
37
+
38
+ ```typescript
39
+ export const SmartTransactionsNetworkConfigSchema = type({
40
+ // ... existing fields
41
+ myNewFlag: optional(boolean()),
42
+ });
43
+ ```
44
+
45
+ The `SmartTransactionsNetworkConfig` type is automatically inferred from this schema.
46
+
47
+ 2. **Add default value** in `src/constants.ts` under `DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS`:
48
+
49
+ These values should be defensive. They are applied when the remote config is invalid or does not exist for a network.
50
+ It disables smart transaction.
51
+
52
+ ```typescript
53
+ export const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {
54
+ default: {
55
+ // ... existing defaults
56
+ myNewFlag: false,
57
+ },
58
+ };
59
+ ```
60
+
61
+ 3. **Use in clients** via the exported selectors:
62
+
63
+ ```typescript
64
+ import { selectSmartTransactionsFeatureFlagsForChain } from '@metamask/smart-transactions-controller';
65
+
66
+ const chainConfig = selectSmartTransactionsFeatureFlagsForChain(
67
+ state,
68
+ '0x1',
69
+ );
70
+ if (chainConfig.myNewFlag) {
71
+ // Feature is enabled
72
+ }
73
+ ```
74
+
28
75
  ### Release & Publishing
29
76
 
30
77
  The project follows the same release process as the other libraries in the MetaMask organization. The GitHub Actions [`action-create-release-pr`](https://github.com/MetaMask/action-create-release-pr) and [`action-publish-release`](https://github.com/MetaMask/action-publish-release) are used to automate the release process; see those repositories for more information about how they work.
@@ -13,7 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _SmartTransactionsController_instances, _SmartTransactionsController_interval, _SmartTransactionsController_clientId, _SmartTransactionsController_chainId, _SmartTransactionsController_supportedChainIds, _SmartTransactionsController_ethQuery, _SmartTransactionsController_trackMetaMetricsEvent, _SmartTransactionsController_getMetaMetricsProps, _SmartTransactionsController_getFeatureFlags, _SmartTransactionsController_trace, _SmartTransactionsController_fetch, _SmartTransactionsController_updateSmartTransaction, _SmartTransactionsController_addMetaMetricsPropsToNewSmartTransaction, _SmartTransactionsController_createOrUpdateSmartTransaction, _SmartTransactionsController_confirmSmartTransaction, _SmartTransactionsController_addNonceToTransaction, _SmartTransactionsController_getChainId, _SmartTransactionsController_getChainIds, _SmartTransactionsController_getNetworkClientId, _SmartTransactionsController_getEthQuery, _SmartTransactionsController_getCurrentSmartTransactions, _SmartTransactionsController_wipeSmartTransactionsPerChainId;
16
+ var _SmartTransactionsController_instances, _SmartTransactionsController_interval, _SmartTransactionsController_clientId, _SmartTransactionsController_chainId, _SmartTransactionsController_supportedChainIds, _SmartTransactionsController_ethQuery, _SmartTransactionsController_trackMetaMetricsEvent, _SmartTransactionsController_getMetaMetricsProps, _SmartTransactionsController_trace, _SmartTransactionsController_validateAndReportFeatureFlags, _SmartTransactionsController_fetch, _SmartTransactionsController_updateSmartTransaction, _SmartTransactionsController_addMetaMetricsPropsToNewSmartTransaction, _SmartTransactionsController_createOrUpdateSmartTransaction, _SmartTransactionsController_confirmSmartTransaction, _SmartTransactionsController_addNonceToTransaction, _SmartTransactionsController_getChainId, _SmartTransactionsController_getChainIds, _SmartTransactionsController_getNetworkClientId, _SmartTransactionsController_getEthQuery, _SmartTransactionsController_getCurrentSmartTransactions, _SmartTransactionsController_wipeSmartTransactionsPerChainId;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.SmartTransactionsController = exports.getDefaultSmartTransactionsControllerState = exports.DEFAULT_INTERVAL = void 0;
19
19
  const bytes_1 = require("@ethersproject/bytes");
@@ -23,6 +23,8 @@ const polling_controller_1 = require("@metamask/polling-controller");
23
23
  const bignumber_js_1 = require("bignumber.js");
24
24
  const cloneDeep_1 = __importDefault(require("lodash/cloneDeep.js"));
25
25
  const constants_1 = require("./constants.cjs");
26
+ const feature_flags_1 = require("./featureFlags/feature-flags.cjs");
27
+ const validators_1 = require("./featureFlags/validators.cjs");
26
28
  const types_1 = require("./types.cjs");
27
29
  const utils_1 = require("./utils.cjs");
28
30
  const SECOND = 1000;
@@ -55,6 +57,7 @@ function getDefaultSmartTransactionsControllerState() {
55
57
  approvalTxFees: null,
56
58
  tradeTxFees: null,
57
59
  },
60
+ // TODO: set this to false once the clients are all refreshing the liveness state.
58
61
  liveness: true,
59
62
  livenessByChainId: {
60
63
  [controller_utils_1.ChainId.mainnet]: true,
@@ -75,7 +78,7 @@ function getDefaultSmartTransactionsControllerState() {
75
78
  }
76
79
  exports.getDefaultSmartTransactionsControllerState = getDefaultSmartTransactionsControllerState;
77
80
  class SmartTransactionsController extends (0, polling_controller_1.StaticIntervalPollingController)() {
78
- constructor({ interval = exports.DEFAULT_INTERVAL, clientId, chainId: InitialChainId = controller_utils_1.ChainId.mainnet, supportedChainIds = [controller_utils_1.ChainId.mainnet, controller_utils_1.ChainId.sepolia], trackMetaMetricsEvent, state = {}, messenger, getMetaMetricsProps, getFeatureFlags, trace, }) {
81
+ constructor({ interval = exports.DEFAULT_INTERVAL, clientId, chainId: InitialChainId = controller_utils_1.ChainId.mainnet, supportedChainIds = [controller_utils_1.ChainId.mainnet, controller_utils_1.ChainId.sepolia], trackMetaMetricsEvent, state = {}, messenger, getMetaMetricsProps, trace, }) {
79
82
  super({
80
83
  name: controllerName,
81
84
  metadata: controllerMetadata,
@@ -90,7 +93,6 @@ class SmartTransactionsController extends (0, polling_controller_1.StaticInterva
90
93
  _SmartTransactionsController_ethQuery.set(this, void 0);
91
94
  _SmartTransactionsController_trackMetaMetricsEvent.set(this, void 0);
92
95
  _SmartTransactionsController_getMetaMetricsProps.set(this, void 0);
93
- _SmartTransactionsController_getFeatureFlags.set(this, void 0);
94
96
  _SmartTransactionsController_trace.set(this, void 0);
95
97
  __classPrivateFieldSet(this, _SmartTransactionsController_interval, interval, "f");
96
98
  __classPrivateFieldSet(this, _SmartTransactionsController_clientId, clientId, "f");
@@ -100,7 +102,6 @@ class SmartTransactionsController extends (0, polling_controller_1.StaticInterva
100
102
  __classPrivateFieldSet(this, _SmartTransactionsController_ethQuery, undefined, "f");
101
103
  __classPrivateFieldSet(this, _SmartTransactionsController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
102
104
  __classPrivateFieldSet(this, _SmartTransactionsController_getMetaMetricsProps, getMetaMetricsProps, "f");
103
- __classPrivateFieldSet(this, _SmartTransactionsController_getFeatureFlags, getFeatureFlags, "f");
104
105
  __classPrivateFieldSet(this, _SmartTransactionsController_trace, trace !== null && trace !== void 0 ? trace : ((_request, fn) => fn === null || fn === void 0 ? void 0 : fn()), "f");
105
106
  this.initializeSmartTransactionsForChainId();
106
107
  this.messenger.subscribe('NetworkController:stateChange', ({ selectedNetworkClientId }) => {
@@ -111,6 +112,10 @@ class SmartTransactionsController extends (0, polling_controller_1.StaticInterva
111
112
  this.checkPoll(this.state);
112
113
  });
113
114
  this.messenger.subscribe(`${controllerName}:stateChange`, (currentState) => this.checkPoll(currentState));
115
+ // Validate feature flags on changes
116
+ this.messenger.subscribe('RemoteFeatureFlagController:stateChange', () => {
117
+ __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_validateAndReportFeatureFlags).call(this);
118
+ });
114
119
  }
115
120
  async _executePoll({ chainIds, }) {
116
121
  // if this is going to be truly UI driven polling we shouldn't really reach here
@@ -413,8 +418,17 @@ class SmartTransactionsController extends (0, polling_controller_1.StaticInterva
413
418
  body: JSON.stringify({ uuid }),
414
419
  }));
415
420
  }
416
- async fetchLiveness({ networkClientId, } = {}) {
417
- const chainId = __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_getChainId).call(this, { networkClientId });
421
+ /**
422
+ * Fetches the liveness status of Smart Transactions for a given chain.
423
+ *
424
+ * @param options - The options object.
425
+ * @param options.chainId - The chain ID to fetch liveness for. Preferred over networkClientId.
426
+ * @param options.networkClientId - The network client ID to derive chain ID from.
427
+ * @returns A promise that resolves to the liveness status.
428
+ */
429
+ async fetchLiveness({ networkClientId, chainId: chainIdArg, } = {}) {
430
+ // Use chainId directly if provided, otherwise derive from networkClientId
431
+ const chainId = chainIdArg !== null && chainIdArg !== void 0 ? chainIdArg : __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_getChainId).call(this, { networkClientId });
418
432
  let liveness = false;
419
433
  try {
420
434
  const response = await __classPrivateFieldGet(this, _SmartTransactionsController_trace, "f").call(this, { name: constants_1.SmartTransactionsTraceName.FetchLiveness }, async () => await __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_fetch).call(this, (0, utils_1.getAPIRequestURL)(types_1.APIType.LIVENESS, chainId)));
@@ -477,7 +491,16 @@ class SmartTransactionsController extends (0, polling_controller_1.StaticInterva
477
491
  }
478
492
  }
479
493
  exports.SmartTransactionsController = SmartTransactionsController;
480
- _SmartTransactionsController_interval = new WeakMap(), _SmartTransactionsController_clientId = new WeakMap(), _SmartTransactionsController_chainId = new WeakMap(), _SmartTransactionsController_supportedChainIds = new WeakMap(), _SmartTransactionsController_ethQuery = new WeakMap(), _SmartTransactionsController_trackMetaMetricsEvent = new WeakMap(), _SmartTransactionsController_getMetaMetricsProps = new WeakMap(), _SmartTransactionsController_getFeatureFlags = new WeakMap(), _SmartTransactionsController_trace = new WeakMap(), _SmartTransactionsController_instances = new WeakSet(), _SmartTransactionsController_fetch =
494
+ _SmartTransactionsController_interval = new WeakMap(), _SmartTransactionsController_clientId = new WeakMap(), _SmartTransactionsController_chainId = new WeakMap(), _SmartTransactionsController_supportedChainIds = new WeakMap(), _SmartTransactionsController_ethQuery = new WeakMap(), _SmartTransactionsController_trackMetaMetricsEvent = new WeakMap(), _SmartTransactionsController_getMetaMetricsProps = new WeakMap(), _SmartTransactionsController_trace = new WeakMap(), _SmartTransactionsController_instances = new WeakSet(), _SmartTransactionsController_validateAndReportFeatureFlags = function _SmartTransactionsController_validateAndReportFeatureFlags() {
495
+ var _a;
496
+ const remoteFeatureFlagControllerState = this.messenger.call('RemoteFeatureFlagController:getState');
497
+ const rawFlags = (_a = remoteFeatureFlagControllerState === null || remoteFeatureFlagControllerState === void 0 ? void 0 : remoteFeatureFlagControllerState.remoteFeatureFlags) === null || _a === void 0 ? void 0 : _a.smartTransactionsNetworks;
498
+ const { errors } = (0, validators_1.validateSmartTransactionsFeatureFlags)(rawFlags);
499
+ // Report each validation error to Sentry
500
+ for (const error of errors) {
501
+ this.messenger.call('ErrorReportingService:captureException', new Error(`[SmartTransactionsController] Feature flag validation failed: ${error.message}. Please check the SmartTransactionNetworks feature flag in Remote Config. Smart transactions are disabled for this network. Default disabled config: ${JSON.stringify(constants_1.DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default)}`));
502
+ }
503
+ }, _SmartTransactionsController_fetch =
481
504
  /* istanbul ignore next */
482
505
  async function _SmartTransactionsController_fetch(request, options) {
483
506
  const fetchOptions = Object.assign(Object.assign({}, options), { headers: Object.assign({ 'Content-Type': 'application/json' }, (__classPrivateFieldGet(this, _SmartTransactionsController_clientId, "f") && { 'X-Client-Id': __classPrivateFieldGet(this, _SmartTransactionsController_clientId, "f") })) });
@@ -549,10 +572,11 @@ async function _SmartTransactionsController_fetch(request, options) {
549
572
  const nextSmartTransaction = Object.assign(Object.assign({}, currentSmartTransaction), smartTransaction);
550
573
  // We have to emit this event here, so a txHash is returned to the TransactionController once it's available.
551
574
  this.messenger.publish(`SmartTransactionsController:smartTransaction`, nextSmartTransaction);
575
+ const featureFlags = (0, feature_flags_1.getSmartTransactionsFeatureFlagsForChain)((0, feature_flags_1.getSmartTransactionsFeatureFlags)(this.messenger), chainId);
552
576
  if ((0, utils_1.shouldMarkRegularTransactionsAsFailed)({
553
577
  smartTransaction: nextSmartTransaction,
554
578
  clientId: __classPrivateFieldGet(this, _SmartTransactionsController_clientId, "f"),
555
- getFeatureFlags: __classPrivateFieldGet(this, _SmartTransactionsController_getFeatureFlags, "f"),
579
+ featureFlags,
556
580
  })) {
557
581
  (0, utils_1.markRegularTransactionsAsFailed)({
558
582
  smartTransaction: nextSmartTransaction,
@@ -1 +1 @@
1
- {"version":3,"file":"SmartTransactionsController.cjs","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexlify } from '@ethersproject/bytes';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport {\n query,\n safelyExecute,\n ChainId,\n isSafeDynamicKey,\n type TraceCallback,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n TransactionControllerGetNonceLockAction,\n TransactionControllerGetTransactionsAction,\n TransactionControllerUpdateTransactionAction,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport {\n MetaMetricsEventCategory,\n MetaMetricsEventName,\n SmartTransactionsTraceName,\n} from './constants';\nimport type {\n Fees,\n Hex,\n IndividualTxFees,\n SignedCanceledTransaction,\n SignedTransaction,\n SmartTransaction,\n SmartTransactionsStatus,\n UnsignedTransaction,\n MetaMetricsProps,\n FeatureFlags,\n ClientId,\n} from './types';\nimport { APIType, SmartTransactionStatuses } from './types';\nimport {\n calculateStatus,\n getAPIRequestURL,\n handleFetch,\n incrementNonceInHex,\n isSmartTransactionCancellable,\n isSmartTransactionPending,\n getTxHash,\n getSmartTransactionMetricsProperties,\n getSmartTransactionMetricsSensitiveProperties,\n shouldMarkRegularTransactionsAsFailed,\n markRegularTransactionsAsFailed,\n} from './utils';\n\nconst SECOND = 1000;\nexport const DEFAULT_INTERVAL = SECOND * 5;\nconst ETH_QUERY_ERROR_MSG =\n '`ethQuery` is not defined on SmartTransactionsController';\n\n/**\n * The name of the {@link SmartTransactionsController}\n */\nconst controllerName = 'SmartTransactionsController';\n\nconst controllerMetadata: StateMetadata<SmartTransactionsControllerState> = {\n smartTransactionsState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n};\n\ntype FeeEstimates = {\n approvalTxFees: IndividualTxFees | null;\n tradeTxFees: IndividualTxFees | null;\n};\n\nexport type SmartTransactionsControllerState = {\n smartTransactionsState: {\n smartTransactions: Record<Hex, SmartTransaction[]>;\n userOptIn: boolean | null;\n userOptInV2: boolean | null;\n liveness: boolean | null;\n fees: FeeEstimates;\n feesByChainId: Record<Hex, FeeEstimates>;\n livenessByChainId: Record<Hex, boolean>;\n };\n};\n\n/**\n * Get the default {@link SmartTransactionsController} state.\n *\n * @returns The default {@link SmartTransactionsController} state.\n */\nexport function getDefaultSmartTransactionsControllerState(): SmartTransactionsControllerState {\n return {\n smartTransactionsState: {\n smartTransactions: {},\n userOptIn: null,\n userOptInV2: null,\n fees: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n liveness: true,\n livenessByChainId: {\n [ChainId.mainnet]: true,\n [ChainId.sepolia]: true,\n },\n feesByChainId: {\n [ChainId.mainnet]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n [ChainId.sepolia]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n },\n },\n };\n}\n\nexport type SmartTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\n/**\n * The actions that can be performed using the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerActions =\n SmartTransactionsControllerGetStateAction;\n\ntype AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | TransactionControllerGetNonceLockAction\n | TransactionControllerGetTransactionsAction\n | TransactionControllerUpdateTransactionAction;\n\nexport type SmartTransactionsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\nexport type SmartTransactionsControllerSmartTransactionEvent = {\n type: 'SmartTransactionsController:smartTransaction';\n payload: [SmartTransaction];\n};\n\nexport type SmartTransactionsControllerSmartTransactionConfirmationDoneEvent = {\n type: 'SmartTransactionsController:smartTransactionConfirmationDone';\n payload: [SmartTransaction];\n};\n\n/**\n * The events that {@link SmartTransactionsController} can emit.\n */\nexport type SmartTransactionsControllerEvents =\n | SmartTransactionsControllerStateChangeEvent\n | SmartTransactionsControllerSmartTransactionEvent\n | SmartTransactionsControllerSmartTransactionConfirmationDoneEvent;\n\ntype AllowedEvents = NetworkControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n SmartTransactionsControllerActions | AllowedActions,\n SmartTransactionsControllerEvents | AllowedEvents\n>;\n\ntype SmartTransactionsControllerOptions = {\n interval?: number;\n clientId: ClientId;\n chainId?: Hex;\n supportedChainIds?: Hex[];\n trackMetaMetricsEvent: (\n event: {\n event: MetaMetricsEventName;\n category: MetaMetricsEventCategory;\n properties?: ReturnType<typeof getSmartTransactionMetricsProperties>;\n sensitiveProperties?: ReturnType<\n typeof getSmartTransactionMetricsSensitiveProperties\n >;\n },\n options?: { metaMetricsId?: string } & Record<string, boolean>,\n ) => void;\n state?: Partial<SmartTransactionsControllerState>;\n messenger: SmartTransactionsControllerMessenger;\n getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n getFeatureFlags: () => FeatureFlags;\n trace?: TraceCallback;\n};\n\nexport type SmartTransactionsControllerPollingInput = {\n chainIds: Hex[];\n};\n\nexport class SmartTransactionsController extends StaticIntervalPollingController<SmartTransactionsControllerPollingInput>()<\n typeof controllerName,\n SmartTransactionsControllerState,\n SmartTransactionsControllerMessenger\n> {\n #interval: number;\n\n #clientId: ClientId;\n\n #chainId: Hex;\n\n #supportedChainIds: Hex[];\n\n timeoutHandle?: NodeJS.Timeout;\n\n #ethQuery: EthQuery | undefined;\n\n readonly #trackMetaMetricsEvent: SmartTransactionsControllerOptions['trackMetaMetricsEvent'];\n\n readonly #getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n\n #getFeatureFlags: SmartTransactionsControllerOptions['getFeatureFlags'];\n\n #trace: TraceCallback;\n\n /* istanbul ignore next */\n async #fetch(request: string, options?: RequestInit) {\n const fetchOptions = {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.#clientId && { 'X-Client-Id': this.#clientId }),\n },\n };\n\n return handleFetch(request, fetchOptions);\n }\n\n constructor({\n interval = DEFAULT_INTERVAL,\n clientId,\n chainId: InitialChainId = ChainId.mainnet,\n supportedChainIds = [ChainId.mainnet, ChainId.sepolia],\n trackMetaMetricsEvent,\n state = {},\n messenger,\n getMetaMetricsProps,\n getFeatureFlags,\n trace,\n }: SmartTransactionsControllerOptions) {\n super({\n name: controllerName,\n metadata: controllerMetadata,\n messenger,\n state: {\n ...getDefaultSmartTransactionsControllerState(),\n ...state,\n },\n });\n this.#interval = interval;\n this.#clientId = clientId;\n this.#chainId = InitialChainId;\n this.#supportedChainIds = supportedChainIds;\n this.setIntervalLength(interval);\n this.#ethQuery = undefined;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.#getMetaMetricsProps = getMetaMetricsProps;\n this.#getFeatureFlags = getFeatureFlags;\n this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n this.initializeSmartTransactionsForChainId();\n\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId },\n provider,\n } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n this.#chainId = chainId;\n this.#ethQuery = new EthQuery(provider);\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n },\n );\n\n this.messenger.subscribe(`${controllerName}:stateChange`, (currentState) =>\n this.checkPoll(currentState),\n );\n }\n\n async _executePoll({\n chainIds,\n }: SmartTransactionsControllerPollingInput): Promise<void> {\n // if this is going to be truly UI driven polling we shouldn't really reach here\n // with a networkClientId that is not supported, but for now I'll add a check in case\n // wondering if we should add some kind of predicate to the polling controller to check whether\n // we should poll or not\n const filteredChainIds = (chainIds ?? []).filter((chainId) =>\n this.#supportedChainIds.includes(chainId),\n );\n\n if (filteredChainIds.length === 0) {\n return Promise.resolve();\n }\n return this.updateSmartTransactions({ chainIds: filteredChainIds });\n }\n\n checkPoll({\n smartTransactionsState: { smartTransactions },\n }: SmartTransactionsControllerState) {\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n\n const pendingTransactions = smartTransactionsForAllChains?.filter(\n isSmartTransactionPending,\n );\n if (!this.timeoutHandle && pendingTransactions?.length > 0) {\n this.poll();\n } else if (this.timeoutHandle && pendingTransactions?.length === 0) {\n this.stop();\n }\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.#supportedChainIds.includes(this.#chainId)) {\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[this.#chainId] =\n state.smartTransactionsState.smartTransactions[this.#chainId] ?? [];\n });\n }\n }\n\n async poll(interval?: number): Promise<void> {\n if (interval) {\n this.#interval = interval;\n }\n\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n\n if (!this.#supportedChainIds.includes(this.#chainId)) {\n return;\n }\n\n this.timeoutHandle = setInterval(() => {\n safelyExecute(async () => this.updateSmartTransactions());\n }, this.#interval);\n await safelyExecute(async () => this.updateSmartTransactions());\n }\n\n async stop() {\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n\n setOptInState(optInState: boolean | null): void {\n this.update((state) => {\n state.smartTransactionsState.userOptInV2 = optInState;\n });\n }\n\n trackStxStatusChange(\n smartTransaction: SmartTransaction,\n prevSmartTransaction?: SmartTransaction,\n ) {\n let updatedSmartTransaction = cloneDeep(smartTransaction);\n updatedSmartTransaction = {\n ...cloneDeep(prevSmartTransaction),\n ...updatedSmartTransaction,\n };\n\n if (updatedSmartTransaction.status === prevSmartTransaction?.status) {\n return; // If status hasn't changed, don't track it again.\n }\n\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxStatusUpdated,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(updatedSmartTransaction),\n sensitiveProperties: getSmartTransactionMetricsSensitiveProperties(\n updatedSmartTransaction,\n ),\n });\n }\n\n isNewSmartTransaction(smartTransactionUuid: string, chainId?: Hex): boolean {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions =\n smartTransactions[chainId ?? this.#chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransactionUuid,\n );\n return currentIndex === -1 || currentIndex === undefined;\n }\n\n updateSmartTransaction(\n smartTransaction: SmartTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ) {\n let ethQuery = this.#ethQuery;\n let chainId = this.#chainId;\n if (networkClientId) {\n const { configuration, provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n chainId = configuration.chainId;\n ethQuery = new EthQuery(provider);\n }\n\n this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n #updateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n }: {\n chainId: Hex;\n },\n ) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n\n if (currentIndex === -1) {\n return; // Smart transaction not found, don't update anything.\n }\n\n if (!isSafeDynamicKey(chainId)) {\n return;\n }\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId][currentIndex] = {\n ...state.smartTransactionsState.smartTransactions[chainId][\n currentIndex\n ],\n ...smartTransaction,\n };\n });\n }\n\n async #addMetaMetricsPropsToNewSmartTransaction(\n smartTransaction: SmartTransaction,\n ) {\n const metaMetricsProps = await this.#getMetaMetricsProps();\n smartTransaction.accountHardwareType =\n metaMetricsProps?.accountHardwareType;\n smartTransaction.accountType = metaMetricsProps?.accountType;\n smartTransaction.deviceModel = metaMetricsProps?.deviceModel;\n }\n\n async #createOrUpdateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction = this.isNewSmartTransaction(\n smartTransaction.uuid,\n chainId,\n );\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n if (isNewSmartTransaction) {\n try {\n await this.#addMetaMetricsPropsToNewSmartTransaction(smartTransaction);\n } catch (error) {\n console.error(\n 'Failed to add metrics props to smart transaction:',\n error,\n );\n // Continue without metrics props\n }\n }\n\n this.trackStxStatusChange(\n smartTransaction,\n isNewSmartTransaction\n ? undefined\n : currentSmartTransactions[currentIndex],\n );\n\n if (isNewSmartTransaction) {\n // add smart transaction\n const cancelledNonceIndex = currentSmartTransactions?.findIndex(\n (stx: SmartTransaction) =>\n stx.txParams?.nonce === smartTransaction.txParams?.nonce &&\n stx.status?.startsWith('cancelled'),\n );\n const snapshot = cloneDeep(smartTransaction);\n const history = [snapshot];\n const historifiedSmartTransaction = { ...smartTransaction, history };\n const nextSmartTransactions =\n cancelledNonceIndex > -1\n ? currentSmartTransactions\n .slice(0, cancelledNonceIndex)\n .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))\n .concat(historifiedSmartTransaction)\n : currentSmartTransactions.concat(historifiedSmartTransaction);\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n nextSmartTransactions;\n });\n return;\n }\n\n const currentSmartTransaction = currentSmartTransactions[currentIndex];\n const nextSmartTransaction = {\n ...currentSmartTransaction,\n ...smartTransaction,\n };\n\n // We have to emit this event here, so a txHash is returned to the TransactionController once it's available.\n this.messenger.publish(\n `SmartTransactionsController:smartTransaction`,\n nextSmartTransaction,\n );\n\n if (\n shouldMarkRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n clientId: this.#clientId,\n getFeatureFlags: this.#getFeatureFlags,\n })\n ) {\n markRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n getRegularTransactions: () =>\n this.messenger.call('TransactionController:getTransactions'),\n updateTransaction: (transactionMeta: TransactionMeta, note: string) =>\n this.messenger.call(\n 'TransactionController:updateTransaction',\n transactionMeta,\n note,\n ),\n });\n }\n\n if (\n (smartTransaction.status === SmartTransactionStatuses.SUCCESS ||\n smartTransaction.status === SmartTransactionStatuses.REVERTED) &&\n !smartTransaction.confirmed\n ) {\n await this.#confirmSmartTransaction(nextSmartTransaction, {\n chainId,\n ethQuery,\n });\n } else {\n this.#updateSmartTransaction(smartTransaction, {\n chainId,\n });\n }\n }\n\n async updateSmartTransactions(\n {\n chainIds,\n }: {\n chainIds: Hex[];\n } = {\n chainIds: this.#getChainIds(),\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n\n // Iterate over each chain group directly\n for (const [chainId, transactions] of Object.entries(smartTransactions)) {\n if (chainIds && !chainIds.includes(chainId as Hex)) {\n continue;\n }\n // Filter pending transactions and map them to the desired shape\n const pendingTransactions = transactions\n .filter(isSmartTransactionPending)\n .map((pendingSmartTransaction) => {\n // Use the transaction's chainId (from the key) to derive a networkClientId\n const networkClientIdToUse = this.#getNetworkClientId({\n chainId: chainId as Hex,\n });\n return {\n uuid: pendingSmartTransaction.uuid,\n networkClientId: networkClientIdToUse,\n chainId: pendingSmartTransaction.chainId as Hex, // same as the key, but explicit on the transaction\n };\n });\n\n if (pendingTransactions.length > 0) {\n // Since each group is per chain, all transactions share the same chainId.\n await this.fetchSmartTransactionsStatus(pendingTransactions);\n }\n }\n }\n\n async #confirmSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ) {\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n const txHash = smartTransaction.statusMetadata?.minedHash;\n try {\n const transactionReceipt: {\n blockNumber: string;\n } | null = await query(ethQuery, 'getTransactionReceipt', [txHash]);\n\n if (transactionReceipt?.blockNumber) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmed,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(smartTransaction),\n sensitiveProperties:\n getSmartTransactionMetricsSensitiveProperties(smartTransaction),\n });\n this.#updateSmartTransaction(\n { ...smartTransaction, confirmed: true },\n {\n chainId,\n },\n );\n }\n } catch (error) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmationFailed,\n category: MetaMetricsEventCategory.Transactions,\n });\n console.error('confirm error', error);\n } finally {\n this.messenger.publish(\n `SmartTransactionsController:smartTransactionConfirmationDone`,\n smartTransaction,\n );\n }\n }\n\n // ! Ask backend API to accept list of uuids as params\n async fetchSmartTransactionsStatus(\n transactions: {\n uuid: string;\n networkClientId?: NetworkClientId;\n chainId: Hex;\n }[],\n ): Promise<Record<string, SmartTransactionsStatus>> {\n // Since transactions come from the same chain group, take the chainId from the first one.\n const { chainId } = transactions[0];\n\n // Build query parameters with all UUIDs\n const uuids = transactions.map((tx) => tx.uuid);\n const params = new URLSearchParams({ uuids: uuids.join(',') });\n\n // Get the ethQuery for the first transaction's networkClientId\n const ethQuery = this.#getEthQuery({\n networkClientId: transactions[0].networkClientId,\n });\n\n // Construct the URL and fetch the data\n const url = `${getAPIRequestURL(\n APIType.BATCH_STATUS,\n chainId,\n )}?${params.toString()}`;\n const data = (await this.#fetch(url)) as Record<\n string,\n SmartTransactionsStatus\n >;\n\n // Process each returned status\n for (const [uuid, stxStatus] of Object.entries(data)) {\n const matchingTx = transactions.find((tx) => tx.uuid === uuid);\n if (!matchingTx) {\n console.error(`No matching transaction found for uuid: ${uuid}`);\n continue;\n }\n\n const smartTransaction: SmartTransaction = {\n statusMetadata: stxStatus,\n status: calculateStatus(stxStatus),\n cancellable: isSmartTransactionCancellable(stxStatus),\n uuid,\n networkClientId: matchingTx.networkClientId,\n };\n\n await this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n return data;\n }\n\n async #addNonceToTransaction(\n transaction: UnsignedTransaction,\n networkClientId: NetworkClientId,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n transaction.from,\n networkClientId,\n );\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce: `0x${nonce.toString(16)}`,\n };\n }\n\n clearFees(): Fees {\n const fees = {\n approvalTxFees: null,\n tradeTxFees: null,\n };\n this.update((state) => {\n state.smartTransactionsState.fees = fees;\n });\n\n return fees;\n }\n\n async getFees(\n tradeTx: UnsignedTransaction,\n approvalTx?: UnsignedTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ): Promise<Fees> {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const transactions: UnsignedTransaction[] = [];\n let unsignedTradeTransactionWithNonce;\n if (approvalTx) {\n const unsignedApprovalTransactionWithNonce =\n await this.#addNonceToTransaction(approvalTx, selectedNetworkClientId);\n transactions.push(unsignedApprovalTransactionWithNonce);\n unsignedTradeTransactionWithNonce = {\n ...tradeTx,\n // If there is an approval tx, the trade tx's nonce is increased by 1.\n nonce: incrementNonceInHex(unsignedApprovalTransactionWithNonce.nonce),\n };\n } else if (tradeTx.nonce) {\n unsignedTradeTransactionWithNonce = tradeTx;\n } else {\n unsignedTradeTransactionWithNonce = await this.#addNonceToTransaction(\n tradeTx,\n selectedNetworkClientId,\n );\n }\n transactions.push(unsignedTradeTransactionWithNonce);\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.GetFees },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({\n txs: transactions,\n }),\n }),\n );\n let approvalTxFees: IndividualTxFees | null;\n let tradeTxFees: IndividualTxFees | null;\n if (approvalTx) {\n approvalTxFees = data?.txs[0];\n tradeTxFees = data?.txs[1];\n } else {\n approvalTxFees = null;\n tradeTxFees = data?.txs[0];\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.fees = {\n approvalTxFees,\n tradeTxFees,\n };\n }\n state.smartTransactionsState.feesByChainId[chainId] = {\n approvalTxFees,\n tradeTxFees,\n };\n });\n\n return {\n approvalTxFees,\n tradeTxFees,\n };\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n transactionMeta,\n txParams,\n signedTransactions,\n signedCanceledTransactions = [],\n networkClientId,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions?: SignedCanceledTransaction[];\n transactionMeta?: TransactionMeta;\n txParams?: TransactionParams;\n networkClientId?: NetworkClientId;\n }) {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const ethQuery = this.#getEthQuery({\n networkClientId: selectedNetworkClientId,\n });\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.SubmitTransactions },\n async () =>\n await this.#fetch(\n getAPIRequestURL(APIType.SUBMIT_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({\n rawTxs: signedTransactions,\n rawCancelTxs: signedCanceledTransactions,\n }),\n },\n ),\n );\n const time = Date.now();\n let preTxBalance;\n try {\n if (txParams?.from) {\n const preTxBalanceBN = await query(ethQuery, 'getBalance', [\n txParams.from,\n ]);\n preTxBalance = new BigNumber(preTxBalanceBN).toString(16);\n }\n } catch (error) {\n console.error('ethQuery.getBalance error:', error);\n }\n\n const requiresNonce = txParams && !txParams.nonce;\n let nonce;\n let nonceLock;\n let nonceDetails = {};\n\n // This should only happen for Swaps. Non-swaps transactions should already have a nonce\n if (requiresNonce) {\n try {\n nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n txParams.from,\n selectedNetworkClientId,\n );\n nonce = hexlify(nonceLock.nextNonce);\n nonceDetails = nonceLock.nonceDetails;\n txParams.nonce ??= nonce;\n } catch (error) {\n console.error('Failed to acquire nonce lock:', error);\n throw error;\n }\n }\n\n const txHashes = signedTransactions.map((tx) => getTxHash(tx));\n const submitTransactionResponse = {\n ...data,\n txHash: txHashes[txHashes.length - 1], // For backward compatibility - use the last tx hash\n txHashes,\n };\n\n try {\n await this.#createOrUpdateSmartTransaction(\n {\n chainId,\n nonceDetails,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: submitTransactionResponse.uuid,\n txHash: submitTransactionResponse.txHash,\n cancellable: true,\n type: transactionMeta?.type ?? 'swap',\n transactionId: transactionMeta?.id,\n networkClientId: selectedNetworkClientId,\n txHashes, // Add support for multiple transaction hashes\n },\n { chainId, ethQuery },\n );\n } catch (error) {\n console.error('Failed to create a smart transaction:', error);\n throw error;\n } finally {\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n }\n\n return submitTransactionResponse;\n }\n\n #getChainId({\n networkClientId,\n }: { networkClientId?: NetworkClientId } = {}): Hex {\n if (networkClientId) {\n return this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n ).configuration.chainId;\n }\n\n return this.#chainId;\n }\n\n #getChainIds(): Hex[] {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return Object.keys(networkConfigurationsByChainId).filter(\n (chainId): chainId is Hex =>\n this.#supportedChainIds.includes(chainId as Hex),\n );\n }\n\n #getNetworkClientId({ chainId }: { chainId: string }): string {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return networkConfigurationsByChainId[chainId as Hex].rpcEndpoints[\n networkConfigurationsByChainId[chainId as Hex].defaultRpcEndpointIndex\n ].networkClientId;\n }\n\n #getEthQuery({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): EthQuery {\n if (networkClientId) {\n const { provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n return new EthQuery(provider);\n }\n\n if (this.#ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n return this.#ethQuery;\n }\n\n // TODO: This should return if the cancellation was on chain or not (for nonce management)\n // After this successful call client must update nonce representative\n // in transaction controller external transactions list\n async cancelSmartTransaction(\n uuid: string,\n {\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<void> {\n const chainId = this.#getChainId({ networkClientId });\n await this.#trace(\n { name: SmartTransactionsTraceName.CancelTransaction },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.CANCEL, chainId), {\n method: 'POST',\n body: JSON.stringify({ uuid }),\n }),\n );\n }\n\n async fetchLiveness({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): Promise<boolean> {\n const chainId = this.#getChainId({ networkClientId });\n let liveness = false;\n try {\n const response = await this.#trace(\n { name: SmartTransactionsTraceName.FetchLiveness },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.LIVENESS, chainId)),\n );\n liveness = Boolean(response.smartTransactions);\n } catch (error) {\n console.log('\"fetchLiveness\" API call failed');\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.liveness = liveness;\n }\n state.smartTransactionsState.livenessByChainId[chainId] = liveness;\n });\n\n return liveness;\n }\n\n async setStatusRefreshInterval(interval: number): Promise<void> {\n if (interval !== this.#interval) {\n this.#interval = interval;\n }\n }\n\n #getCurrentSmartTransactions(): SmartTransaction[] {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n if (\n !smartTransactionsForAllChains ||\n smartTransactionsForAllChains.length === 0\n ) {\n return [];\n }\n return smartTransactionsForAllChains;\n }\n\n getTransactions({\n addressFrom,\n status,\n }: {\n addressFrom: string;\n status: SmartTransactionStatuses;\n }): SmartTransaction[] {\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.filter((stx) => {\n return stx.status === status && stx.txParams?.from === addressFrom;\n });\n }\n\n getSmartTransactionByMinedTxHash(\n txHash: string | undefined,\n ): SmartTransaction | undefined {\n if (!txHash) {\n return undefined;\n }\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.find((smartTransaction) => {\n return (\n smartTransaction.statusMetadata?.minedHash?.toLowerCase() ===\n txHash.toLowerCase()\n );\n });\n }\n\n wipeSmartTransactions({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork?: boolean;\n }): void {\n if (!address) {\n return;\n }\n const addressLowerCase = address.toLowerCase();\n if (ignoreNetwork) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n (Object.keys(smartTransactions) as Hex[]).forEach((chainId) => {\n this.#wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n });\n });\n } else {\n this.#wipeSmartTransactionsPerChainId({\n chainId: this.#chainId,\n addressLowerCase,\n });\n }\n }\n\n #wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n }: {\n chainId: Hex;\n addressLowerCase: string;\n }): void {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForSelectedChain: SmartTransaction[] =\n smartTransactions?.[chainId];\n if (\n !smartTransactionsForSelectedChain ||\n smartTransactionsForSelectedChain.length === 0\n ) {\n return;\n }\n const newSmartTransactionsForSelectedChain =\n smartTransactionsForSelectedChain.filter(\n (smartTransaction: SmartTransaction) =>\n smartTransaction.txParams?.from !== addressLowerCase,\n );\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n newSmartTransactionsForSelectedChain;\n });\n }\n}\n"]}
1
+ {"version":3,"file":"SmartTransactionsController.cjs","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexlify } from '@ethersproject/bytes';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport {\n query,\n safelyExecute,\n ChainId,\n isSafeDynamicKey,\n type TraceCallback,\n} from '@metamask/controller-utils';\nimport type { ErrorReportingServiceCaptureExceptionAction } from '@metamask/error-reporting-service';\nimport EthQuery from '@metamask/eth-query';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n RemoteFeatureFlagControllerGetStateAction,\n RemoteFeatureFlagControllerStateChangeEvent,\n} from '@metamask/remote-feature-flag-controller';\nimport type {\n TransactionControllerGetNonceLockAction,\n TransactionControllerGetTransactionsAction,\n TransactionControllerUpdateTransactionAction,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport {\n DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS,\n MetaMetricsEventCategory,\n MetaMetricsEventName,\n SmartTransactionsTraceName,\n} from './constants';\nimport {\n getSmartTransactionsFeatureFlags,\n getSmartTransactionsFeatureFlagsForChain,\n} from './featureFlags/feature-flags';\nimport { validateSmartTransactionsFeatureFlags } from './featureFlags/validators';\nimport type {\n Fees,\n IndividualTxFees,\n SignedCanceledTransaction,\n SignedTransaction,\n SmartTransaction,\n SmartTransactionsStatus,\n UnsignedTransaction,\n MetaMetricsProps,\n FeatureFlags,\n ClientId,\n} from './types';\nimport { APIType, SmartTransactionStatuses } from './types';\nimport {\n calculateStatus,\n getAPIRequestURL,\n handleFetch,\n incrementNonceInHex,\n isSmartTransactionCancellable,\n isSmartTransactionPending,\n getTxHash,\n getSmartTransactionMetricsProperties,\n getSmartTransactionMetricsSensitiveProperties,\n shouldMarkRegularTransactionsAsFailed,\n markRegularTransactionsAsFailed,\n} from './utils';\n\nconst SECOND = 1000;\nexport const DEFAULT_INTERVAL = SECOND * 5;\nconst ETH_QUERY_ERROR_MSG =\n '`ethQuery` is not defined on SmartTransactionsController';\n\n/**\n * The name of the {@link SmartTransactionsController}\n */\nconst controllerName = 'SmartTransactionsController';\n\nconst controllerMetadata: StateMetadata<SmartTransactionsControllerState> = {\n smartTransactionsState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n};\n\ntype FeeEstimates = {\n approvalTxFees: IndividualTxFees | null;\n tradeTxFees: IndividualTxFees | null;\n};\n\nexport type SmartTransactionsControllerState = {\n smartTransactionsState: {\n smartTransactions: Record<Hex, SmartTransaction[]>;\n userOptIn: boolean | null;\n userOptInV2: boolean | null;\n liveness: boolean | null;\n fees: FeeEstimates;\n feesByChainId: Record<Hex, FeeEstimates>;\n livenessByChainId: Record<Hex, boolean>;\n };\n};\n\n/**\n * Get the default {@link SmartTransactionsController} state.\n *\n * @returns The default {@link SmartTransactionsController} state.\n */\nexport function getDefaultSmartTransactionsControllerState(): SmartTransactionsControllerState {\n return {\n smartTransactionsState: {\n smartTransactions: {},\n userOptIn: null,\n userOptInV2: null,\n fees: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n\n // TODO: set this to false once the clients are all refreshing the liveness state.\n liveness: true,\n livenessByChainId: {\n [ChainId.mainnet]: true,\n [ChainId.sepolia]: true,\n },\n feesByChainId: {\n [ChainId.mainnet]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n [ChainId.sepolia]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n },\n },\n };\n}\n\nexport type SmartTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\n/**\n * The actions that can be performed using the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerActions =\n SmartTransactionsControllerGetStateAction;\n\ntype AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | RemoteFeatureFlagControllerGetStateAction\n | TransactionControllerGetNonceLockAction\n | TransactionControllerGetTransactionsAction\n | TransactionControllerUpdateTransactionAction\n | ErrorReportingServiceCaptureExceptionAction;\n\nexport type SmartTransactionsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\nexport type SmartTransactionsControllerSmartTransactionEvent = {\n type: 'SmartTransactionsController:smartTransaction';\n payload: [SmartTransaction];\n};\n\nexport type SmartTransactionsControllerSmartTransactionConfirmationDoneEvent = {\n type: 'SmartTransactionsController:smartTransactionConfirmationDone';\n payload: [SmartTransaction];\n};\n\n/**\n * The events that {@link SmartTransactionsController} can emit.\n */\nexport type SmartTransactionsControllerEvents =\n | SmartTransactionsControllerStateChangeEvent\n | SmartTransactionsControllerSmartTransactionEvent\n | SmartTransactionsControllerSmartTransactionConfirmationDoneEvent;\n\ntype AllowedEvents =\n | NetworkControllerStateChangeEvent\n | RemoteFeatureFlagControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n SmartTransactionsControllerActions | AllowedActions,\n SmartTransactionsControllerEvents | AllowedEvents\n>;\n\ntype SmartTransactionsControllerOptions = {\n interval?: number;\n clientId: ClientId;\n chainId?: Hex;\n supportedChainIds?: Hex[];\n trackMetaMetricsEvent: (\n event: {\n event: MetaMetricsEventName;\n category: MetaMetricsEventCategory;\n properties?: ReturnType<typeof getSmartTransactionMetricsProperties>;\n sensitiveProperties?: ReturnType<\n typeof getSmartTransactionMetricsSensitiveProperties\n >;\n },\n options?: { metaMetricsId?: string } & Record<string, boolean>,\n ) => void;\n state?: Partial<SmartTransactionsControllerState>;\n messenger: SmartTransactionsControllerMessenger;\n getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n /**\n * @deprecated This option is ignored. Feature flags are now read directly\n * from RemoteFeatureFlagController via the messenger. This option will be\n * removed in a future version.\n */\n getFeatureFlags?: () => FeatureFlags;\n trace?: TraceCallback;\n};\n\nexport type SmartTransactionsControllerPollingInput = {\n chainIds: Hex[];\n};\n\nexport class SmartTransactionsController extends StaticIntervalPollingController<SmartTransactionsControllerPollingInput>()<\n typeof controllerName,\n SmartTransactionsControllerState,\n SmartTransactionsControllerMessenger\n> {\n #interval: number;\n\n #clientId: ClientId;\n\n #chainId: Hex;\n\n #supportedChainIds: Hex[];\n\n timeoutHandle?: NodeJS.Timeout;\n\n #ethQuery: EthQuery | undefined;\n\n readonly #trackMetaMetricsEvent: SmartTransactionsControllerOptions['trackMetaMetricsEvent'];\n\n readonly #getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n\n #trace: TraceCallback;\n\n /**\n * Validates the smart transactions feature flags from the remote feature flag controller\n * and reports any validation errors to Sentry via ErrorReportingService.\n * Does not report errors when flags are undefined (not yet fetched).\n */\n #validateAndReportFeatureFlags(): void {\n const remoteFeatureFlagControllerState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const rawFlags =\n remoteFeatureFlagControllerState?.remoteFeatureFlags\n ?.smartTransactionsNetworks;\n\n const { errors } = validateSmartTransactionsFeatureFlags(rawFlags);\n\n // Report each validation error to Sentry\n for (const error of errors) {\n this.messenger.call(\n 'ErrorReportingService:captureException',\n new Error(\n `[SmartTransactionsController] Feature flag validation failed: ${\n error.message\n }. Please check the SmartTransactionNetworks feature flag in Remote Config. Smart transactions are disabled for this network. Default disabled config: ${JSON.stringify(\n DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default,\n )}`,\n ),\n );\n }\n }\n\n /* istanbul ignore next */\n async #fetch(request: string, options?: RequestInit) {\n const fetchOptions = {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.#clientId && { 'X-Client-Id': this.#clientId }),\n },\n };\n\n return handleFetch(request, fetchOptions);\n }\n\n constructor({\n interval = DEFAULT_INTERVAL,\n clientId,\n chainId: InitialChainId = ChainId.mainnet,\n supportedChainIds = [ChainId.mainnet, ChainId.sepolia],\n trackMetaMetricsEvent,\n state = {},\n messenger,\n getMetaMetricsProps,\n trace,\n }: SmartTransactionsControllerOptions) {\n super({\n name: controllerName,\n metadata: controllerMetadata,\n messenger,\n state: {\n ...getDefaultSmartTransactionsControllerState(),\n ...state,\n },\n });\n this.#interval = interval;\n this.#clientId = clientId;\n this.#chainId = InitialChainId;\n this.#supportedChainIds = supportedChainIds;\n this.setIntervalLength(interval);\n this.#ethQuery = undefined;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.#getMetaMetricsProps = getMetaMetricsProps;\n this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n this.initializeSmartTransactionsForChainId();\n\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId },\n provider,\n } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n this.#chainId = chainId;\n this.#ethQuery = new EthQuery(provider);\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n },\n );\n\n this.messenger.subscribe(`${controllerName}:stateChange`, (currentState) =>\n this.checkPoll(currentState),\n );\n\n // Validate feature flags on changes\n this.messenger.subscribe('RemoteFeatureFlagController:stateChange', () => {\n this.#validateAndReportFeatureFlags();\n });\n }\n\n async _executePoll({\n chainIds,\n }: SmartTransactionsControllerPollingInput): Promise<void> {\n // if this is going to be truly UI driven polling we shouldn't really reach here\n // with a networkClientId that is not supported, but for now I'll add a check in case\n // wondering if we should add some kind of predicate to the polling controller to check whether\n // we should poll or not\n const filteredChainIds = (chainIds ?? []).filter((chainId) =>\n this.#supportedChainIds.includes(chainId),\n );\n\n if (filteredChainIds.length === 0) {\n return Promise.resolve();\n }\n return this.updateSmartTransactions({ chainIds: filteredChainIds });\n }\n\n checkPoll({\n smartTransactionsState: { smartTransactions },\n }: SmartTransactionsControllerState) {\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n\n const pendingTransactions = smartTransactionsForAllChains?.filter(\n isSmartTransactionPending,\n );\n if (!this.timeoutHandle && pendingTransactions?.length > 0) {\n this.poll();\n } else if (this.timeoutHandle && pendingTransactions?.length === 0) {\n this.stop();\n }\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.#supportedChainIds.includes(this.#chainId)) {\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[this.#chainId] =\n state.smartTransactionsState.smartTransactions[this.#chainId] ?? [];\n });\n }\n }\n\n async poll(interval?: number): Promise<void> {\n if (interval) {\n this.#interval = interval;\n }\n\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n\n if (!this.#supportedChainIds.includes(this.#chainId)) {\n return;\n }\n\n this.timeoutHandle = setInterval(() => {\n safelyExecute(async () => this.updateSmartTransactions());\n }, this.#interval);\n await safelyExecute(async () => this.updateSmartTransactions());\n }\n\n async stop() {\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n\n setOptInState(optInState: boolean | null): void {\n this.update((state) => {\n state.smartTransactionsState.userOptInV2 = optInState;\n });\n }\n\n trackStxStatusChange(\n smartTransaction: SmartTransaction,\n prevSmartTransaction?: SmartTransaction,\n ) {\n let updatedSmartTransaction = cloneDeep(smartTransaction);\n updatedSmartTransaction = {\n ...cloneDeep(prevSmartTransaction),\n ...updatedSmartTransaction,\n };\n\n if (updatedSmartTransaction.status === prevSmartTransaction?.status) {\n return; // If status hasn't changed, don't track it again.\n }\n\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxStatusUpdated,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(updatedSmartTransaction),\n sensitiveProperties: getSmartTransactionMetricsSensitiveProperties(\n updatedSmartTransaction,\n ),\n });\n }\n\n isNewSmartTransaction(smartTransactionUuid: string, chainId?: Hex): boolean {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions =\n smartTransactions[chainId ?? this.#chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransactionUuid,\n );\n return currentIndex === -1 || currentIndex === undefined;\n }\n\n updateSmartTransaction(\n smartTransaction: SmartTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ) {\n let ethQuery = this.#ethQuery;\n let chainId = this.#chainId;\n if (networkClientId) {\n const { configuration, provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n chainId = configuration.chainId;\n ethQuery = new EthQuery(provider);\n }\n\n this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n #updateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n }: {\n chainId: Hex;\n },\n ) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n\n if (currentIndex === -1) {\n return; // Smart transaction not found, don't update anything.\n }\n\n if (!isSafeDynamicKey(chainId)) {\n return;\n }\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId][currentIndex] = {\n ...state.smartTransactionsState.smartTransactions[chainId][\n currentIndex\n ],\n ...smartTransaction,\n };\n });\n }\n\n async #addMetaMetricsPropsToNewSmartTransaction(\n smartTransaction: SmartTransaction,\n ) {\n const metaMetricsProps = await this.#getMetaMetricsProps();\n smartTransaction.accountHardwareType =\n metaMetricsProps?.accountHardwareType;\n smartTransaction.accountType = metaMetricsProps?.accountType;\n smartTransaction.deviceModel = metaMetricsProps?.deviceModel;\n }\n\n async #createOrUpdateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction = this.isNewSmartTransaction(\n smartTransaction.uuid,\n chainId,\n );\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n if (isNewSmartTransaction) {\n try {\n await this.#addMetaMetricsPropsToNewSmartTransaction(smartTransaction);\n } catch (error) {\n console.error(\n 'Failed to add metrics props to smart transaction:',\n error,\n );\n // Continue without metrics props\n }\n }\n\n this.trackStxStatusChange(\n smartTransaction,\n isNewSmartTransaction\n ? undefined\n : currentSmartTransactions[currentIndex],\n );\n\n if (isNewSmartTransaction) {\n // add smart transaction\n const cancelledNonceIndex = currentSmartTransactions?.findIndex(\n (stx: SmartTransaction) =>\n stx.txParams?.nonce === smartTransaction.txParams?.nonce &&\n stx.status?.startsWith('cancelled'),\n );\n const snapshot = cloneDeep(smartTransaction);\n const history = [snapshot];\n const historifiedSmartTransaction = { ...smartTransaction, history };\n const nextSmartTransactions =\n cancelledNonceIndex > -1\n ? currentSmartTransactions\n .slice(0, cancelledNonceIndex)\n .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))\n .concat(historifiedSmartTransaction)\n : currentSmartTransactions.concat(historifiedSmartTransaction);\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n nextSmartTransactions;\n });\n return;\n }\n\n const currentSmartTransaction = currentSmartTransactions[currentIndex];\n const nextSmartTransaction = {\n ...currentSmartTransaction,\n ...smartTransaction,\n };\n\n // We have to emit this event here, so a txHash is returned to the TransactionController once it's available.\n this.messenger.publish(\n `SmartTransactionsController:smartTransaction`,\n nextSmartTransaction,\n );\n\n const featureFlags = getSmartTransactionsFeatureFlagsForChain(\n getSmartTransactionsFeatureFlags(this.messenger),\n chainId,\n );\n\n if (\n shouldMarkRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n clientId: this.#clientId,\n featureFlags,\n })\n ) {\n markRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n getRegularTransactions: () =>\n this.messenger.call('TransactionController:getTransactions'),\n updateTransaction: (transactionMeta: TransactionMeta, note: string) =>\n this.messenger.call(\n 'TransactionController:updateTransaction',\n transactionMeta,\n note,\n ),\n });\n }\n\n if (\n (smartTransaction.status === SmartTransactionStatuses.SUCCESS ||\n smartTransaction.status === SmartTransactionStatuses.REVERTED) &&\n !smartTransaction.confirmed\n ) {\n await this.#confirmSmartTransaction(nextSmartTransaction, {\n chainId,\n ethQuery,\n });\n } else {\n this.#updateSmartTransaction(smartTransaction, {\n chainId,\n });\n }\n }\n\n async updateSmartTransactions(\n {\n chainIds,\n }: {\n chainIds: Hex[];\n } = {\n chainIds: this.#getChainIds(),\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n\n // Iterate over each chain group directly\n for (const [chainId, transactions] of Object.entries(smartTransactions)) {\n if (chainIds && !chainIds.includes(chainId as Hex)) {\n continue;\n }\n // Filter pending transactions and map them to the desired shape\n const pendingTransactions = transactions\n .filter(isSmartTransactionPending)\n .map((pendingSmartTransaction) => {\n // Use the transaction's chainId (from the key) to derive a networkClientId\n const networkClientIdToUse = this.#getNetworkClientId({\n chainId: chainId as Hex,\n });\n return {\n uuid: pendingSmartTransaction.uuid,\n networkClientId: networkClientIdToUse,\n chainId: pendingSmartTransaction.chainId as Hex, // same as the key, but explicit on the transaction\n };\n });\n\n if (pendingTransactions.length > 0) {\n // Since each group is per chain, all transactions share the same chainId.\n await this.fetchSmartTransactionsStatus(pendingTransactions);\n }\n }\n }\n\n async #confirmSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ) {\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n const txHash = smartTransaction.statusMetadata?.minedHash;\n try {\n const transactionReceipt: {\n blockNumber: string;\n } | null = await query(ethQuery, 'getTransactionReceipt', [txHash]);\n\n if (transactionReceipt?.blockNumber) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmed,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(smartTransaction),\n sensitiveProperties:\n getSmartTransactionMetricsSensitiveProperties(smartTransaction),\n });\n this.#updateSmartTransaction(\n { ...smartTransaction, confirmed: true },\n {\n chainId,\n },\n );\n }\n } catch (error) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmationFailed,\n category: MetaMetricsEventCategory.Transactions,\n });\n console.error('confirm error', error);\n } finally {\n this.messenger.publish(\n `SmartTransactionsController:smartTransactionConfirmationDone`,\n smartTransaction,\n );\n }\n }\n\n // ! Ask backend API to accept list of uuids as params\n async fetchSmartTransactionsStatus(\n transactions: {\n uuid: string;\n networkClientId?: NetworkClientId;\n chainId: Hex;\n }[],\n ): Promise<Record<string, SmartTransactionsStatus>> {\n // Since transactions come from the same chain group, take the chainId from the first one.\n const { chainId } = transactions[0];\n\n // Build query parameters with all UUIDs\n const uuids = transactions.map((tx) => tx.uuid);\n const params = new URLSearchParams({ uuids: uuids.join(',') });\n\n // Get the ethQuery for the first transaction's networkClientId\n const ethQuery = this.#getEthQuery({\n networkClientId: transactions[0].networkClientId,\n });\n\n // Construct the URL and fetch the data\n const url = `${getAPIRequestURL(\n APIType.BATCH_STATUS,\n chainId,\n )}?${params.toString()}`;\n const data = (await this.#fetch(url)) as Record<\n string,\n SmartTransactionsStatus\n >;\n\n // Process each returned status\n for (const [uuid, stxStatus] of Object.entries(data)) {\n const matchingTx = transactions.find((tx) => tx.uuid === uuid);\n if (!matchingTx) {\n console.error(`No matching transaction found for uuid: ${uuid}`);\n continue;\n }\n\n const smartTransaction: SmartTransaction = {\n statusMetadata: stxStatus,\n status: calculateStatus(stxStatus),\n cancellable: isSmartTransactionCancellable(stxStatus),\n uuid,\n networkClientId: matchingTx.networkClientId,\n };\n\n await this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n return data;\n }\n\n async #addNonceToTransaction(\n transaction: UnsignedTransaction,\n networkClientId: NetworkClientId,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n transaction.from,\n networkClientId,\n );\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce: `0x${nonce.toString(16)}`,\n };\n }\n\n clearFees(): Fees {\n const fees = {\n approvalTxFees: null,\n tradeTxFees: null,\n };\n this.update((state) => {\n state.smartTransactionsState.fees = fees;\n });\n\n return fees;\n }\n\n async getFees(\n tradeTx: UnsignedTransaction,\n approvalTx?: UnsignedTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ): Promise<Fees> {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const transactions: UnsignedTransaction[] = [];\n let unsignedTradeTransactionWithNonce;\n if (approvalTx) {\n const unsignedApprovalTransactionWithNonce =\n await this.#addNonceToTransaction(approvalTx, selectedNetworkClientId);\n transactions.push(unsignedApprovalTransactionWithNonce);\n unsignedTradeTransactionWithNonce = {\n ...tradeTx,\n // If there is an approval tx, the trade tx's nonce is increased by 1.\n nonce: incrementNonceInHex(unsignedApprovalTransactionWithNonce.nonce),\n };\n } else if (tradeTx.nonce) {\n unsignedTradeTransactionWithNonce = tradeTx;\n } else {\n unsignedTradeTransactionWithNonce = await this.#addNonceToTransaction(\n tradeTx,\n selectedNetworkClientId,\n );\n }\n transactions.push(unsignedTradeTransactionWithNonce);\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.GetFees },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({\n txs: transactions,\n }),\n }),\n );\n let approvalTxFees: IndividualTxFees | null;\n let tradeTxFees: IndividualTxFees | null;\n if (approvalTx) {\n approvalTxFees = data?.txs[0];\n tradeTxFees = data?.txs[1];\n } else {\n approvalTxFees = null;\n tradeTxFees = data?.txs[0];\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.fees = {\n approvalTxFees,\n tradeTxFees,\n };\n }\n state.smartTransactionsState.feesByChainId[chainId] = {\n approvalTxFees,\n tradeTxFees,\n };\n });\n\n return {\n approvalTxFees,\n tradeTxFees,\n };\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n transactionMeta,\n txParams,\n signedTransactions,\n signedCanceledTransactions = [],\n networkClientId,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions?: SignedCanceledTransaction[];\n transactionMeta?: TransactionMeta;\n txParams?: TransactionParams;\n networkClientId?: NetworkClientId;\n }) {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const ethQuery = this.#getEthQuery({\n networkClientId: selectedNetworkClientId,\n });\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.SubmitTransactions },\n async () =>\n await this.#fetch(\n getAPIRequestURL(APIType.SUBMIT_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({\n rawTxs: signedTransactions,\n rawCancelTxs: signedCanceledTransactions,\n }),\n },\n ),\n );\n const time = Date.now();\n let preTxBalance;\n try {\n if (txParams?.from) {\n const preTxBalanceBN = await query(ethQuery, 'getBalance', [\n txParams.from,\n ]);\n preTxBalance = new BigNumber(preTxBalanceBN).toString(16);\n }\n } catch (error) {\n console.error('ethQuery.getBalance error:', error);\n }\n\n const requiresNonce = txParams && !txParams.nonce;\n let nonce;\n let nonceLock;\n let nonceDetails = {};\n\n // This should only happen for Swaps. Non-swaps transactions should already have a nonce\n if (requiresNonce) {\n try {\n nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n txParams.from,\n selectedNetworkClientId,\n );\n nonce = hexlify(nonceLock.nextNonce);\n nonceDetails = nonceLock.nonceDetails;\n txParams.nonce ??= nonce;\n } catch (error) {\n console.error('Failed to acquire nonce lock:', error);\n throw error;\n }\n }\n\n const txHashes = signedTransactions.map((tx) => getTxHash(tx));\n const submitTransactionResponse = {\n ...data,\n txHash: txHashes[txHashes.length - 1], // For backward compatibility - use the last tx hash\n txHashes,\n };\n\n try {\n await this.#createOrUpdateSmartTransaction(\n {\n chainId,\n nonceDetails,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: submitTransactionResponse.uuid,\n txHash: submitTransactionResponse.txHash,\n cancellable: true,\n type: transactionMeta?.type ?? 'swap',\n transactionId: transactionMeta?.id,\n networkClientId: selectedNetworkClientId,\n txHashes, // Add support for multiple transaction hashes\n },\n { chainId, ethQuery },\n );\n } catch (error) {\n console.error('Failed to create a smart transaction:', error);\n throw error;\n } finally {\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n }\n\n return submitTransactionResponse;\n }\n\n #getChainId({\n networkClientId,\n }: { networkClientId?: NetworkClientId } = {}): Hex {\n if (networkClientId) {\n return this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n ).configuration.chainId;\n }\n\n return this.#chainId;\n }\n\n #getChainIds(): Hex[] {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return Object.keys(networkConfigurationsByChainId).filter(\n (chainId): chainId is Hex =>\n this.#supportedChainIds.includes(chainId as Hex),\n );\n }\n\n #getNetworkClientId({ chainId }: { chainId: string }): string {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return networkConfigurationsByChainId[chainId as Hex].rpcEndpoints[\n networkConfigurationsByChainId[chainId as Hex].defaultRpcEndpointIndex\n ].networkClientId;\n }\n\n #getEthQuery({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): EthQuery {\n if (networkClientId) {\n const { provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n return new EthQuery(provider);\n }\n\n if (this.#ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n return this.#ethQuery;\n }\n\n // TODO: This should return if the cancellation was on chain or not (for nonce management)\n // After this successful call client must update nonce representative\n // in transaction controller external transactions list\n async cancelSmartTransaction(\n uuid: string,\n {\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<void> {\n const chainId = this.#getChainId({ networkClientId });\n await this.#trace(\n { name: SmartTransactionsTraceName.CancelTransaction },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.CANCEL, chainId), {\n method: 'POST',\n body: JSON.stringify({ uuid }),\n }),\n );\n }\n\n /**\n * Fetches the liveness status of Smart Transactions for a given chain.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID to fetch liveness for. Preferred over networkClientId.\n * @param options.networkClientId - The network client ID to derive chain ID from.\n * @returns A promise that resolves to the liveness status.\n */\n async fetchLiveness({\n networkClientId,\n chainId: chainIdArg,\n }: {\n /** @deprecated Use `chainId` instead. */\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): Promise<boolean> {\n // Use chainId directly if provided, otherwise derive from networkClientId\n const chainId = chainIdArg ?? this.#getChainId({ networkClientId });\n let liveness = false;\n try {\n const response = await this.#trace(\n { name: SmartTransactionsTraceName.FetchLiveness },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.LIVENESS, chainId)),\n );\n liveness = Boolean(response.smartTransactions);\n } catch (error) {\n console.log('\"fetchLiveness\" API call failed');\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.liveness = liveness;\n }\n state.smartTransactionsState.livenessByChainId[chainId] = liveness;\n });\n\n return liveness;\n }\n\n async setStatusRefreshInterval(interval: number): Promise<void> {\n if (interval !== this.#interval) {\n this.#interval = interval;\n }\n }\n\n #getCurrentSmartTransactions(): SmartTransaction[] {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n if (\n !smartTransactionsForAllChains ||\n smartTransactionsForAllChains.length === 0\n ) {\n return [];\n }\n return smartTransactionsForAllChains;\n }\n\n getTransactions({\n addressFrom,\n status,\n }: {\n addressFrom: string;\n status: SmartTransactionStatuses;\n }): SmartTransaction[] {\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.filter((stx) => {\n return stx.status === status && stx.txParams?.from === addressFrom;\n });\n }\n\n getSmartTransactionByMinedTxHash(\n txHash: string | undefined,\n ): SmartTransaction | undefined {\n if (!txHash) {\n return undefined;\n }\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.find((smartTransaction) => {\n return (\n smartTransaction.statusMetadata?.minedHash?.toLowerCase() ===\n txHash.toLowerCase()\n );\n });\n }\n\n wipeSmartTransactions({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork?: boolean;\n }): void {\n if (!address) {\n return;\n }\n const addressLowerCase = address.toLowerCase();\n if (ignoreNetwork) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n (Object.keys(smartTransactions) as Hex[]).forEach((chainId) => {\n this.#wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n });\n });\n } else {\n this.#wipeSmartTransactionsPerChainId({\n chainId: this.#chainId,\n addressLowerCase,\n });\n }\n }\n\n #wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n }: {\n chainId: Hex;\n addressLowerCase: string;\n }): void {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForSelectedChain: SmartTransaction[] =\n smartTransactions?.[chainId];\n if (\n !smartTransactionsForSelectedChain ||\n smartTransactionsForSelectedChain.length === 0\n ) {\n return;\n }\n const newSmartTransactionsForSelectedChain =\n smartTransactionsForSelectedChain.filter(\n (smartTransaction: SmartTransaction) =>\n smartTransaction.txParams?.from !== addressLowerCase,\n );\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n newSmartTransactionsForSelectedChain;\n });\n }\n}\n"]}
@@ -1,11 +1,14 @@
1
1
  /// <reference types="node" />
2
2
  import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
3
3
  import { type TraceCallback } from "@metamask/controller-utils";
4
+ import type { ErrorReportingServiceCaptureExceptionAction } from "@metamask/error-reporting-service";
4
5
  import type { Messenger } from "@metamask/messenger";
5
6
  import type { NetworkClientId, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetStateAction, NetworkControllerStateChangeEvent } from "@metamask/network-controller";
7
+ import type { RemoteFeatureFlagControllerGetStateAction, RemoteFeatureFlagControllerStateChangeEvent } from "@metamask/remote-feature-flag-controller";
6
8
  import type { TransactionControllerGetNonceLockAction, TransactionControllerGetTransactionsAction, TransactionControllerUpdateTransactionAction, TransactionMeta, TransactionParams } from "@metamask/transaction-controller";
9
+ import type { Hex } from "@metamask/utils";
7
10
  import { MetaMetricsEventCategory, MetaMetricsEventName } from "./constants.cjs";
8
- import type { Fees, Hex, IndividualTxFees, SignedCanceledTransaction, SignedTransaction, SmartTransaction, SmartTransactionsStatus, UnsignedTransaction, MetaMetricsProps, FeatureFlags, ClientId } from "./types.cjs";
11
+ import type { Fees, IndividualTxFees, SignedCanceledTransaction, SignedTransaction, SmartTransaction, SmartTransactionsStatus, UnsignedTransaction, MetaMetricsProps, FeatureFlags, ClientId } from "./types.cjs";
9
12
  import { SmartTransactionStatuses } from "./types.cjs";
10
13
  import { getSmartTransactionMetricsProperties, getSmartTransactionMetricsSensitiveProperties } from "./utils.cjs";
11
14
  export declare const DEFAULT_INTERVAL: number;
@@ -39,7 +42,7 @@ export declare type SmartTransactionsControllerGetStateAction = ControllerGetSta
39
42
  * The actions that can be performed using the {@link SmartTransactionsController}.
40
43
  */
41
44
  export declare type SmartTransactionsControllerActions = SmartTransactionsControllerGetStateAction;
42
- declare type AllowedActions = NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetStateAction | TransactionControllerGetNonceLockAction | TransactionControllerGetTransactionsAction | TransactionControllerUpdateTransactionAction;
45
+ declare type AllowedActions = NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetStateAction | RemoteFeatureFlagControllerGetStateAction | TransactionControllerGetNonceLockAction | TransactionControllerGetTransactionsAction | TransactionControllerUpdateTransactionAction | ErrorReportingServiceCaptureExceptionAction;
43
46
  export declare type SmartTransactionsControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, SmartTransactionsControllerState>;
44
47
  export declare type SmartTransactionsControllerSmartTransactionEvent = {
45
48
  type: 'SmartTransactionsController:smartTransaction';
@@ -53,7 +56,7 @@ export declare type SmartTransactionsControllerSmartTransactionConfirmationDoneE
53
56
  * The events that {@link SmartTransactionsController} can emit.
54
57
  */
55
58
  export declare type SmartTransactionsControllerEvents = SmartTransactionsControllerStateChangeEvent | SmartTransactionsControllerSmartTransactionEvent | SmartTransactionsControllerSmartTransactionConfirmationDoneEvent;
56
- declare type AllowedEvents = NetworkControllerStateChangeEvent;
59
+ declare type AllowedEvents = NetworkControllerStateChangeEvent | RemoteFeatureFlagControllerStateChangeEvent;
57
60
  /**
58
61
  * The messenger of the {@link SmartTransactionsController}.
59
62
  */
@@ -74,7 +77,12 @@ declare type SmartTransactionsControllerOptions = {
74
77
  state?: Partial<SmartTransactionsControllerState>;
75
78
  messenger: SmartTransactionsControllerMessenger;
76
79
  getMetaMetricsProps: () => Promise<MetaMetricsProps>;
77
- getFeatureFlags: () => FeatureFlags;
80
+ /**
81
+ * @deprecated This option is ignored. Feature flags are now read directly
82
+ * from RemoteFeatureFlagController via the messenger. This option will be
83
+ * removed in a future version.
84
+ */
85
+ getFeatureFlags?: () => FeatureFlags;
78
86
  trace?: TraceCallback;
79
87
  };
80
88
  export declare type SmartTransactionsControllerPollingInput = {
@@ -98,7 +106,7 @@ declare const SmartTransactionsController_base: (abstract new (...args: any[]) =
98
106
  export declare class SmartTransactionsController extends SmartTransactionsController_base<typeof controllerName, SmartTransactionsControllerState, SmartTransactionsControllerMessenger> {
99
107
  #private;
100
108
  timeoutHandle?: NodeJS.Timeout;
101
- constructor({ interval, clientId, chainId: InitialChainId, supportedChainIds, trackMetaMetricsEvent, state, messenger, getMetaMetricsProps, getFeatureFlags, trace, }: SmartTransactionsControllerOptions);
109
+ constructor({ interval, clientId, chainId: InitialChainId, supportedChainIds, trackMetaMetricsEvent, state, messenger, getMetaMetricsProps, trace, }: SmartTransactionsControllerOptions);
102
110
  _executePoll({ chainIds, }: SmartTransactionsControllerPollingInput): Promise<void>;
103
111
  checkPoll({ smartTransactionsState: { smartTransactions }, }: SmartTransactionsControllerState): void;
104
112
  initializeSmartTransactionsForChainId(): void;
@@ -132,8 +140,18 @@ export declare class SmartTransactionsController extends SmartTransactionsContro
132
140
  cancelSmartTransaction(uuid: string, { networkClientId, }?: {
133
141
  networkClientId?: NetworkClientId;
134
142
  }): Promise<void>;
135
- fetchLiveness({ networkClientId, }?: {
143
+ /**
144
+ * Fetches the liveness status of Smart Transactions for a given chain.
145
+ *
146
+ * @param options - The options object.
147
+ * @param options.chainId - The chain ID to fetch liveness for. Preferred over networkClientId.
148
+ * @param options.networkClientId - The network client ID to derive chain ID from.
149
+ * @returns A promise that resolves to the liveness status.
150
+ */
151
+ fetchLiveness({ networkClientId, chainId: chainIdArg, }?: {
152
+ /** @deprecated Use `chainId` instead. */
136
153
  networkClientId?: NetworkClientId;
154
+ chainId?: Hex;
137
155
  }): Promise<boolean>;
138
156
  setStatusRefreshInterval(interval: number): Promise<void>;
139
157
  getTransactions({ addressFrom, status, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"SmartTransactionsController.d.cts","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SmartTransactionsController.d.cts","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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"}