@metamask-previews/user-operation-controller 41.2.7-preview-0d2cbf546 → 41.2.7-preview-ec4680201

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 (55) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/UserOperationController-method-action-types.cjs.map +1 -1
  3. package/dist/UserOperationController-method-action-types.d.cts.map +1 -1
  4. package/dist/UserOperationController-method-action-types.d.mts.map +1 -1
  5. package/dist/UserOperationController-method-action-types.mjs.map +1 -1
  6. package/dist/UserOperationController.cjs +68 -68
  7. package/dist/UserOperationController.cjs.map +1 -1
  8. package/dist/UserOperationController.d.cts +1 -1
  9. package/dist/UserOperationController.d.cts.map +1 -1
  10. package/dist/UserOperationController.d.mts +1 -1
  11. package/dist/UserOperationController.d.mts.map +1 -1
  12. package/dist/UserOperationController.mjs +1 -1
  13. package/dist/UserOperationController.mjs.map +1 -1
  14. package/dist/helpers/Bundler.cjs +2 -2
  15. package/dist/helpers/Bundler.cjs.map +1 -1
  16. package/dist/helpers/Bundler.d.cts.map +1 -1
  17. package/dist/helpers/Bundler.d.mts.map +1 -1
  18. package/dist/helpers/Bundler.mjs.map +1 -1
  19. package/dist/helpers/PendingUserOperationTracker.cjs +8 -8
  20. package/dist/helpers/PendingUserOperationTracker.cjs.map +1 -1
  21. package/dist/helpers/PendingUserOperationTracker.d.cts +2 -2
  22. package/dist/helpers/PendingUserOperationTracker.d.cts.map +1 -1
  23. package/dist/helpers/PendingUserOperationTracker.d.mts +2 -2
  24. package/dist/helpers/PendingUserOperationTracker.d.mts.map +1 -1
  25. package/dist/helpers/PendingUserOperationTracker.mjs.map +1 -1
  26. package/dist/helpers/SnapSmartContractAccount.cjs +9 -9
  27. package/dist/helpers/SnapSmartContractAccount.cjs.map +1 -1
  28. package/dist/helpers/SnapSmartContractAccount.d.cts.map +1 -1
  29. package/dist/helpers/SnapSmartContractAccount.d.mts.map +1 -1
  30. package/dist/helpers/SnapSmartContractAccount.mjs.map +1 -1
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts.map +1 -1
  33. package/dist/index.d.mts.map +1 -1
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/utils/gas-fees.cjs +4 -4
  36. package/dist/utils/gas-fees.cjs.map +1 -1
  37. package/dist/utils/gas-fees.d.cts.map +1 -1
  38. package/dist/utils/gas-fees.d.mts.map +1 -1
  39. package/dist/utils/gas-fees.mjs.map +1 -1
  40. package/dist/utils/gas.cjs +9 -9
  41. package/dist/utils/gas.cjs.map +1 -1
  42. package/dist/utils/gas.d.cts.map +1 -1
  43. package/dist/utils/gas.d.mts.map +1 -1
  44. package/dist/utils/gas.mjs.map +1 -1
  45. package/dist/utils/transaction.cjs +12 -12
  46. package/dist/utils/transaction.cjs.map +1 -1
  47. package/dist/utils/transaction.d.cts.map +1 -1
  48. package/dist/utils/transaction.d.mts.map +1 -1
  49. package/dist/utils/transaction.mjs.map +1 -1
  50. package/dist/utils/validation.cjs +3 -3
  51. package/dist/utils/validation.cjs.map +1 -1
  52. package/dist/utils/validation.d.cts.map +1 -1
  53. package/dist/utils/validation.d.mts.map +1 -1
  54. package/dist/utils/validation.mjs.map +1 -1
  55. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10
10
  ### Changed
11
11
 
12
12
  - Bump `@metamask/transaction-controller` from `^69.0.0` to `^69.2.1` ([#9568](https://github.com/MetaMask/core/pull/9568), [#9589](https://github.com/MetaMask/core/pull/9589), [#9593](https://github.com/MetaMask/core/pull/9593))
13
+ - Bump `@metamask/gas-fee-controller` from `^26.2.4` to `^26.3.0` ([#9629](https://github.com/MetaMask/core/pull/9629))
13
14
 
14
15
  ## [41.2.7]
15
16
 
@@ -1 +1 @@
1
- {"version":3,"file":"UserOperationController-method-action-types.cjs","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { UserOperationController } from './UserOperationController';\n\n/**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationAction = {\n type: `UserOperationController:addUserOperation`;\n handler: UserOperationController['addUserOperation'];\n};\n\n/**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationFromTransactionAction = {\n type: `UserOperationController:addUserOperationFromTransaction`;\n handler: UserOperationController['addUserOperationFromTransaction'];\n};\n\n/**\n * Starts polling for pending user operations on the given network.\n *\n * @param networkClientId - The ID of the network client to poll.\n * @returns The polling token that can be used to stop polling.\n */\nexport type UserOperationControllerStartPollingByNetworkClientIdAction = {\n type: `UserOperationController:startPollingByNetworkClientId`;\n handler: UserOperationController['startPollingByNetworkClientId'];\n};\n\n/**\n * Union of all UserOperationController action types.\n */\nexport type UserOperationControllerMethodActions =\n | UserOperationControllerAddUserOperationAction\n | UserOperationControllerAddUserOperationFromTransactionAction\n | UserOperationControllerStartPollingByNetworkClientIdAction;\n"]}
1
+ {"version":3,"file":"UserOperationController-method-action-types.cjs","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { UserOperationController } from './UserOperationController.js';\n\n/**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationAction = {\n type: `UserOperationController:addUserOperation`;\n handler: UserOperationController['addUserOperation'];\n};\n\n/**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationFromTransactionAction = {\n type: `UserOperationController:addUserOperationFromTransaction`;\n handler: UserOperationController['addUserOperationFromTransaction'];\n};\n\n/**\n * Starts polling for pending user operations on the given network.\n *\n * @param networkClientId - The ID of the network client to poll.\n * @returns The polling token that can be used to stop polling.\n */\nexport type UserOperationControllerStartPollingByNetworkClientIdAction = {\n type: `UserOperationController:startPollingByNetworkClientId`;\n handler: UserOperationController['startPollingByNetworkClientId'];\n};\n\n/**\n * Union of all UserOperationController action types.\n */\nexport type UserOperationControllerMethodActions =\n | UserOperationControllerAddUserOperationAction\n | UserOperationControllerAddUserOperationFromTransactionAction\n | UserOperationControllerStartPollingByNetworkClientIdAction;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"UserOperationController-method-action-types.d.cts","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAkC;AAEzE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,0CAA0C,CAAC;IACjD,OAAO,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,uBAAuB,CAAC,iCAAiC,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,uBAAuB,CAAC,+BAA+B,CAAC,CAAC;CACnE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAC5C,6CAA6C,GAC7C,4DAA4D,GAC5D,0DAA0D,CAAC"}
1
+ {"version":3,"file":"UserOperationController-method-action-types.d.cts","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAqC;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,0CAA0C,CAAC;IACjD,OAAO,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,uBAAuB,CAAC,iCAAiC,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,uBAAuB,CAAC,+BAA+B,CAAC,CAAC;CACnE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAC5C,6CAA6C,GAC7C,4DAA4D,GAC5D,0DAA0D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserOperationController-method-action-types.d.mts","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAkC;AAEzE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,0CAA0C,CAAC;IACjD,OAAO,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,uBAAuB,CAAC,iCAAiC,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,uBAAuB,CAAC,+BAA+B,CAAC,CAAC;CACnE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAC5C,6CAA6C,GAC7C,4DAA4D,GAC5D,0DAA0D,CAAC"}
1
+ {"version":3,"file":"UserOperationController-method-action-types.d.mts","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAqC;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,0CAA0C,CAAC;IACjD,OAAO,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,uBAAuB,CAAC,iCAAiC,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,uDAAuD,CAAC;IAC9D,OAAO,EAAE,uBAAuB,CAAC,+BAA+B,CAAC,CAAC;CACnE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAC5C,6CAA6C,GAC7C,4DAA4D,GAC5D,0DAA0D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserOperationController-method-action-types.mjs","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { UserOperationController } from './UserOperationController';\n\n/**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationAction = {\n type: `UserOperationController:addUserOperation`;\n handler: UserOperationController['addUserOperation'];\n};\n\n/**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationFromTransactionAction = {\n type: `UserOperationController:addUserOperationFromTransaction`;\n handler: UserOperationController['addUserOperationFromTransaction'];\n};\n\n/**\n * Starts polling for pending user operations on the given network.\n *\n * @param networkClientId - The ID of the network client to poll.\n * @returns The polling token that can be used to stop polling.\n */\nexport type UserOperationControllerStartPollingByNetworkClientIdAction = {\n type: `UserOperationController:startPollingByNetworkClientId`;\n handler: UserOperationController['startPollingByNetworkClientId'];\n};\n\n/**\n * Union of all UserOperationController action types.\n */\nexport type UserOperationControllerMethodActions =\n | UserOperationControllerAddUserOperationAction\n | UserOperationControllerAddUserOperationFromTransactionAction\n | UserOperationControllerStartPollingByNetworkClientIdAction;\n"]}
1
+ {"version":3,"file":"UserOperationController-method-action-types.mjs","sourceRoot":"","sources":["../src/UserOperationController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { UserOperationController } from './UserOperationController.js';\n\n/**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationAction = {\n type: `UserOperationController:addUserOperation`;\n handler: UserOperationController['addUserOperation'];\n};\n\n/**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\nexport type UserOperationControllerAddUserOperationFromTransactionAction = {\n type: `UserOperationController:addUserOperationFromTransaction`;\n handler: UserOperationController['addUserOperationFromTransaction'];\n};\n\n/**\n * Starts polling for pending user operations on the given network.\n *\n * @param networkClientId - The ID of the network client to poll.\n * @returns The polling token that can be used to stop polling.\n */\nexport type UserOperationControllerStartPollingByNetworkClientIdAction = {\n type: `UserOperationController:startPollingByNetworkClientId`;\n handler: UserOperationController['startPollingByNetworkClientId'];\n};\n\n/**\n * Union of all UserOperationController action types.\n */\nexport type UserOperationControllerMethodActions =\n | UserOperationControllerAddUserOperationAction\n | UserOperationControllerAddUserOperationFromTransactionAction\n | UserOperationControllerStartPollingByNetworkClientIdAction;\n"]}
@@ -26,16 +26,16 @@ const utils_1 = require("@metamask/utils");
26
26
  const events_1 = __importDefault(require("events"));
27
27
  const lodash_1 = require("lodash");
28
28
  const uuid_1 = require("uuid");
29
- const constants_1 = require("./constants.cjs");
30
- const Bundler_1 = require("./helpers/Bundler.cjs");
31
- const PendingUserOperationTracker_1 = require("./helpers/PendingUserOperationTracker.cjs");
32
- const SnapSmartContractAccount_1 = require("./helpers/SnapSmartContractAccount.cjs");
33
- const logger_1 = require("./logger.cjs");
34
- const types_1 = require("./types.cjs");
35
- const gas_1 = require("./utils/gas.cjs");
36
- const gas_fees_1 = require("./utils/gas-fees.cjs");
37
- const transaction_1 = require("./utils/transaction.cjs");
38
- const validation_1 = require("./utils/validation.cjs");
29
+ const constants_js_1 = require("./constants.cjs");
30
+ const Bundler_js_1 = require("./helpers/Bundler.cjs");
31
+ const PendingUserOperationTracker_js_1 = require("./helpers/PendingUserOperationTracker.cjs");
32
+ const SnapSmartContractAccount_js_1 = require("./helpers/SnapSmartContractAccount.cjs");
33
+ const logger_js_1 = require("./logger.cjs");
34
+ const types_js_1 = require("./types.cjs");
35
+ const gas_fees_js_1 = require("./utils/gas-fees.cjs");
36
+ const gas_js_1 = require("./utils/gas.cjs");
37
+ const transaction_js_1 = require("./utils/transaction.cjs");
38
+ const validation_js_1 = require("./utils/validation.cjs");
39
39
  const controllerName = 'UserOperationController';
40
40
  const MESSENGER_EXPOSED_METHODS = [
41
41
  'addUserOperation',
@@ -81,7 +81,7 @@ class UserOperationController extends base_controller_1.BaseController {
81
81
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
82
82
  __classPrivateFieldSet(this, _UserOperationController_entrypoint, entrypoint, "f");
83
83
  __classPrivateFieldSet(this, _UserOperationController_getGasFeeEstimates, getGasFeeEstimates, "f");
84
- __classPrivateFieldSet(this, _UserOperationController_pendingUserOperationTracker, new PendingUserOperationTracker_1.PendingUserOperationTracker({
84
+ __classPrivateFieldSet(this, _UserOperationController_pendingUserOperationTracker, new PendingUserOperationTracker_js_1.PendingUserOperationTracker({
85
85
  getUserOperations: () => (0, lodash_1.cloneDeep)(Object.values(this.state.userOperations)),
86
86
  messenger,
87
87
  }), "f");
@@ -105,8 +105,8 @@ class UserOperationController extends base_controller_1.BaseController {
105
105
  * @param options.type - Type of the transaction.
106
106
  */
107
107
  async addUserOperation(request, options) {
108
- (0, validation_1.validateAddUserOperationRequest)(request);
109
- (0, validation_1.validateAddUserOperationOptions)(options);
108
+ (0, validation_js_1.validateAddUserOperationRequest)(request);
109
+ (0, validation_js_1.validateAddUserOperationOptions)(options);
110
110
  return await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_addUserOperation).call(this, request, options);
111
111
  }
112
112
  /**
@@ -122,7 +122,7 @@ class UserOperationController extends base_controller_1.BaseController {
122
122
  * @param options.type - Type of the transaction.
123
123
  */
124
124
  async addUserOperationFromTransaction(transaction, options) {
125
- (0, validation_1.validateAddUserOperationOptions)(options);
125
+ (0, validation_js_1.validateAddUserOperationOptions)(options);
126
126
  const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } = transaction;
127
127
  const request = {
128
128
  data: data === '' ? undefined : data,
@@ -132,7 +132,7 @@ class UserOperationController extends base_controller_1.BaseController {
132
132
  to,
133
133
  value,
134
134
  };
135
- (0, validation_1.validateAddUserOperationRequest)(request);
135
+ (0, validation_js_1.validateAddUserOperationRequest)(request);
136
136
  return await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_addUserOperation).call(this, request, { ...options, transaction });
137
137
  }
138
138
  /**
@@ -149,12 +149,12 @@ class UserOperationController extends base_controller_1.BaseController {
149
149
  }
150
150
  exports.UserOperationController = UserOperationController;
151
151
  _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_getGasFeeEstimates = new WeakMap(), _UserOperationController_pendingUserOperationTracker = new WeakMap(), _UserOperationController_instances = new WeakSet(), _UserOperationController_addUserOperation = async function _UserOperationController_addUserOperation(request, options) {
152
- (0, logger_1.projectLogger)('Adding user operation', { request, options });
152
+ (0, logger_js_1.projectLogger)('Adding user operation', { request, options });
153
153
  const { networkClientId, origin, smartContractAccount: requestSmartContractAccount, swaps, transaction, } = options;
154
154
  const { chainId, provider } = await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_getProvider).call(this, networkClientId);
155
155
  const metadata = await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_createMetadata).call(this, chainId, origin, transaction, swaps);
156
156
  const smartContractAccount = requestSmartContractAccount ??
157
- new SnapSmartContractAccount_1.SnapSmartContractAccount(this.messenger);
157
+ new SnapSmartContractAccount_js_1.SnapSmartContractAccount(this.messenger);
158
158
  const cache = {
159
159
  chainId,
160
160
  metadata,
@@ -214,7 +214,7 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
214
214
  }
215
215
  }, _UserOperationController_waitForConfirmation = async function _UserOperationController_waitForConfirmation(metadata) {
216
216
  const { id, hash } = metadata;
217
- (0, logger_1.projectLogger)('Waiting for confirmation', id, hash);
217
+ (0, logger_js_1.projectLogger)('Waiting for confirmation', id, hash);
218
218
  return new Promise((resolve, reject) => {
219
219
  this.hub.once(`${id}:confirmed`, (finalMetadata) => {
220
220
  resolve(finalMetadata);
@@ -234,7 +234,7 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
234
234
  hash: null,
235
235
  id: (0, uuid_1.v1)(),
236
236
  origin,
237
- status: types_1.UserOperationStatus.Unapproved,
237
+ status: types_js_1.UserOperationStatus.Unapproved,
238
238
  swapsMetadata: swaps
239
239
  ? {
240
240
  approvalTxId: swaps.approvalTxId ?? null,
@@ -260,18 +260,18 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
260
260
  userOperation: __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_createEmptyUserOperation).call(this, transaction),
261
261
  };
262
262
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
263
- (0, logger_1.projectLogger)('Added user operation', metadata.id);
263
+ (0, logger_js_1.projectLogger)('Added user operation', metadata.id);
264
264
  return metadata;
265
265
  }, _UserOperationController_prepareUserOperation = async function _UserOperationController_prepareUserOperation(cache) {
266
266
  const { chainId, metadata, options, provider, request, transaction } = cache;
267
267
  const { data, from, to, value } = request;
268
268
  const { id, transactionParams, userOperation } = metadata;
269
269
  const { smartContractAccount } = options;
270
- (0, logger_1.projectLogger)('Preparing user operation', { id });
270
+ (0, logger_js_1.projectLogger)('Preparing user operation', { id });
271
271
  const transactionType = await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_getTransactionType).call(this, transaction, options);
272
272
  metadata.transactionType = transactionType ?? null;
273
- (0, logger_1.projectLogger)('Determined transaction type', transactionType);
274
- await (0, gas_fees_1.updateGasFees)({
273
+ (0, logger_js_1.projectLogger)('Determined transaction type', transactionType);
274
+ await (0, gas_fees_js_1.updateGasFees)({
275
275
  getGasFeeEstimates: __classPrivateFieldGet(this, _UserOperationController_getGasFeeEstimates, "f"),
276
276
  metadata,
277
277
  originalRequest: request,
@@ -285,26 +285,26 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
285
285
  to,
286
286
  value,
287
287
  });
288
- (0, validation_1.validatePrepareUserOperationResponse)(response);
288
+ (0, validation_js_1.validatePrepareUserOperationResponse)(response);
289
289
  const { bundler: bundlerUrl, callData, dummyPaymasterAndData, dummySignature, initCode, nonce, sender, } = response;
290
290
  userOperation.callData = callData;
291
- userOperation.initCode = initCode ?? constants_1.EMPTY_BYTES;
291
+ userOperation.initCode = initCode ?? constants_js_1.EMPTY_BYTES;
292
292
  userOperation.nonce = nonce;
293
- userOperation.paymasterAndData = dummyPaymasterAndData ?? constants_1.EMPTY_BYTES;
293
+ userOperation.paymasterAndData = dummyPaymasterAndData ?? constants_js_1.EMPTY_BYTES;
294
294
  userOperation.sender = sender;
295
- userOperation.signature = dummySignature ?? constants_1.EMPTY_BYTES;
295
+ userOperation.signature = dummySignature ?? constants_js_1.EMPTY_BYTES;
296
296
  metadata.bundlerUrl = bundlerUrl;
297
- await (0, gas_1.updateGas)(metadata, response, __classPrivateFieldGet(this, _UserOperationController_entrypoint, "f"));
297
+ await (0, gas_js_1.updateGas)(metadata, response, __classPrivateFieldGet(this, _UserOperationController_entrypoint, "f"));
298
298
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
299
299
  }, _UserOperationController_addPaymasterData = async function _UserOperationController_addPaymasterData(metadata, smartContractAccount) {
300
300
  const { id, userOperation, chainId } = metadata;
301
- (0, logger_1.projectLogger)('Requesting paymaster data', { id });
301
+ (0, logger_js_1.projectLogger)('Requesting paymaster data', { id });
302
302
  const response = await smartContractAccount.updateUserOperation({
303
303
  userOperation,
304
304
  chainId,
305
305
  });
306
- (0, validation_1.validateUpdateUserOperationResponse)(response);
307
- userOperation.paymasterAndData = response.paymasterAndData ?? constants_1.EMPTY_BYTES;
306
+ (0, validation_js_1.validateUpdateUserOperationResponse)(response);
307
+ userOperation.paymasterAndData = response.paymasterAndData ?? constants_js_1.EMPTY_BYTES;
308
308
  if (response.callGasLimit) {
309
309
  userOperation.callGasLimit = response.callGasLimit;
310
310
  }
@@ -316,41 +316,41 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
316
316
  }
317
317
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
318
318
  }, _UserOperationController_approveUserOperation = async function _UserOperationController_approveUserOperation(cache) {
319
- (0, logger_1.projectLogger)('Requesting approval');
319
+ (0, logger_js_1.projectLogger)('Requesting approval');
320
320
  const { metadata } = cache;
321
321
  const { resultCallbacks, value } = await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_requestApproval).call(this, metadata);
322
322
  const updatedTransaction = value?.txMeta;
323
323
  if (updatedTransaction) {
324
324
  await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateUserOperationAfterApproval).call(this, cache, updatedTransaction);
325
325
  }
326
- metadata.status = types_1.UserOperationStatus.Approved;
326
+ metadata.status = types_js_1.UserOperationStatus.Approved;
327
327
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
328
328
  return resultCallbacks;
329
329
  }, _UserOperationController_signUserOperation = async function _UserOperationController_signUserOperation(metadata, smartContractAccount) {
330
330
  const { id, chainId, userOperation } = metadata;
331
- (0, logger_1.projectLogger)('Signing user operation', id, userOperation);
331
+ (0, logger_js_1.projectLogger)('Signing user operation', id, userOperation);
332
332
  const response = await smartContractAccount.signUserOperation({
333
333
  userOperation,
334
334
  chainId,
335
335
  });
336
- (0, validation_1.validateSignUserOperationResponse)(response);
336
+ (0, validation_js_1.validateSignUserOperationResponse)(response);
337
337
  const { signature } = response;
338
338
  userOperation.signature = signature;
339
- (0, logger_1.projectLogger)('Signed user operation', signature);
340
- metadata.status = types_1.UserOperationStatus.Signed;
339
+ (0, logger_js_1.projectLogger)('Signed user operation', signature);
340
+ metadata.status = types_js_1.UserOperationStatus.Signed;
341
341
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
342
342
  }, _UserOperationController_submitUserOperation = async function _UserOperationController_submitUserOperation(metadata) {
343
343
  const { userOperation } = metadata;
344
- (0, logger_1.projectLogger)('Submitting user operation', userOperation);
345
- const bundler = new Bundler_1.Bundler(metadata.bundlerUrl);
344
+ (0, logger_js_1.projectLogger)('Submitting user operation', userOperation);
345
+ const bundler = new Bundler_js_1.Bundler(metadata.bundlerUrl);
346
346
  const hash = await bundler.sendUserOperation(userOperation, __classPrivateFieldGet(this, _UserOperationController_entrypoint, "f"));
347
347
  metadata.hash = hash;
348
- metadata.status = types_1.UserOperationStatus.Submitted;
348
+ metadata.status = types_js_1.UserOperationStatus.Submitted;
349
349
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
350
350
  }, _UserOperationController_failUserOperation = function _UserOperationController_failUserOperation(metadata, error) {
351
351
  const { id } = metadata;
352
352
  const rawError = error;
353
- (0, logger_1.projectLogger)('User operation failed', id, error);
353
+ (0, logger_js_1.projectLogger)('User operation failed', id, error);
354
354
  metadata.error = {
355
355
  name: rawError.name,
356
356
  message: rawError.message,
@@ -358,24 +358,24 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
358
358
  code: rawError.code,
359
359
  rpc: rawError.value,
360
360
  };
361
- metadata.status = types_1.UserOperationStatus.Failed;
361
+ metadata.status = types_js_1.UserOperationStatus.Failed;
362
362
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_updateMetadata).call(this, metadata);
363
363
  if (String(rawError.code) === String(rpc_errors_1.errorCodes.provider.userRejectedRequest)) {
364
364
  __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_deleteMetadata).call(this, id);
365
365
  }
366
366
  }, _UserOperationController_createEmptyUserOperation = function _UserOperationController_createEmptyUserOperation(transaction) {
367
367
  return {
368
- callData: constants_1.EMPTY_BYTES,
369
- callGasLimit: constants_1.EMPTY_BYTES,
370
- initCode: constants_1.EMPTY_BYTES,
371
- maxFeePerGas: transaction?.maxFeePerGas ?? constants_1.EMPTY_BYTES,
372
- maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? constants_1.EMPTY_BYTES,
373
- nonce: constants_1.EMPTY_BYTES,
374
- paymasterAndData: constants_1.EMPTY_BYTES,
375
- preVerificationGas: constants_1.EMPTY_BYTES,
376
- sender: constants_1.ADDRESS_ZERO,
377
- signature: constants_1.EMPTY_BYTES,
378
- verificationGasLimit: constants_1.EMPTY_BYTES,
368
+ callData: constants_js_1.EMPTY_BYTES,
369
+ callGasLimit: constants_js_1.EMPTY_BYTES,
370
+ initCode: constants_js_1.EMPTY_BYTES,
371
+ maxFeePerGas: transaction?.maxFeePerGas ?? constants_js_1.EMPTY_BYTES,
372
+ maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? constants_js_1.EMPTY_BYTES,
373
+ nonce: constants_js_1.EMPTY_BYTES,
374
+ paymasterAndData: constants_js_1.EMPTY_BYTES,
375
+ preVerificationGas: constants_js_1.EMPTY_BYTES,
376
+ sender: constants_js_1.ADDRESS_ZERO,
377
+ signature: constants_js_1.EMPTY_BYTES,
378
+ verificationGasLimit: constants_js_1.EMPTY_BYTES,
379
379
  };
380
380
  }, _UserOperationController_updateMetadata = function _UserOperationController_updateMetadata(metadata) {
381
381
  const { id } = metadata;
@@ -391,11 +391,11 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
391
391
  if (!metadata.transactionParams) {
392
392
  return;
393
393
  }
394
- const transactionMetadata = (0, transaction_1.getTransactionMetadata)(metadata);
394
+ const transactionMetadata = (0, transaction_js_1.getTransactionMetadata)(metadata);
395
395
  this.hub.emit('transaction-updated', transactionMetadata);
396
396
  }, _UserOperationController_addPendingUserOperationTrackerListeners = function _UserOperationController_addPendingUserOperationTrackerListeners() {
397
397
  __classPrivateFieldGet(this, _UserOperationController_pendingUserOperationTracker, "f").hub.on('user-operation-confirmed', (metadata) => {
398
- (0, logger_1.projectLogger)('In listener...');
398
+ (0, logger_js_1.projectLogger)('In listener...');
399
399
  this.hub.emit('user-operation-confirmed', metadata);
400
400
  this.hub.emit(`${metadata.id}:confirmed`, metadata);
401
401
  });
@@ -430,10 +430,10 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
430
430
  const { chainId } = configuration;
431
431
  return { provider, chainId };
432
432
  }, _UserOperationController_updateUserOperationAfterApproval = async function _UserOperationController_updateUserOperationAfterApproval(cache, updatedTransaction) {
433
- (0, logger_1.projectLogger)('Found updated transaction in approval', { updatedTransaction });
433
+ (0, logger_js_1.projectLogger)('Found updated transaction in approval', { updatedTransaction });
434
434
  const { metadata, request } = cache;
435
435
  const { userOperation } = metadata;
436
- const usingPaymaster = userOperation.paymasterAndData !== constants_1.EMPTY_BYTES;
436
+ const usingPaymaster = userOperation.paymasterAndData !== constants_js_1.EMPTY_BYTES;
437
437
  const updatedMaxFeePerGas = (0, utils_1.add0x)(updatedTransaction.txParams.maxFeePerGas);
438
438
  const updatedMaxPriorityFeePerGas = (0, utils_1.add0x)(updatedTransaction.txParams.maxPriorityFeePerGas);
439
439
  let regenerateUserOperation = false;
@@ -447,10 +447,10 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
447
447
  * fees being updated during the approval process.
448
448
  */
449
449
  const areGasFeesZeroBecauseOfPaymaster = usingPaymaster &&
450
- updatedMaxFeePerGas === constants_1.VALUE_ZERO &&
451
- updatedMaxPriorityFeePerGas === constants_1.VALUE_ZERO;
450
+ updatedMaxFeePerGas === constants_js_1.VALUE_ZERO &&
451
+ updatedMaxPriorityFeePerGas === constants_js_1.VALUE_ZERO;
452
452
  if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {
453
- (0, logger_1.projectLogger)('Gas fees updated during approval', {
453
+ (0, logger_js_1.projectLogger)('Gas fees updated during approval', {
454
454
  previousMaxFeePerGas,
455
455
  previousMaxPriorityFeePerGas,
456
456
  updatedMaxFeePerGas,
@@ -460,16 +460,16 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
460
460
  userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;
461
461
  regenerateUserOperation = usingPaymaster;
462
462
  }
463
- const previousData = request.data ?? constants_1.EMPTY_BYTES;
464
- const updatedData = updatedTransaction.txParams.data ?? constants_1.EMPTY_BYTES;
463
+ const previousData = request.data ?? constants_js_1.EMPTY_BYTES;
464
+ const updatedData = updatedTransaction.txParams.data ?? constants_js_1.EMPTY_BYTES;
465
465
  if (previousData !== updatedData) {
466
- (0, logger_1.projectLogger)('Data updated during approval', { previousData, updatedData });
466
+ (0, logger_js_1.projectLogger)('Data updated during approval', { previousData, updatedData });
467
467
  regenerateUserOperation = true;
468
468
  }
469
- const previousValue = request.value ?? constants_1.VALUE_ZERO;
470
- const updatedValue = updatedTransaction.txParams.value ?? constants_1.VALUE_ZERO;
469
+ const previousValue = request.value ?? constants_js_1.VALUE_ZERO;
470
+ const updatedValue = updatedTransaction.txParams.value ?? constants_js_1.VALUE_ZERO;
471
471
  if (previousValue !== updatedValue) {
472
- (0, logger_1.projectLogger)('Value updated during approval', { previousValue, updatedValue });
472
+ (0, logger_js_1.projectLogger)('Value updated during approval', { previousValue, updatedValue });
473
473
  regenerateUserOperation = true;
474
474
  }
475
475
  if (regenerateUserOperation) {
@@ -486,10 +486,10 @@ _UserOperationController_entrypoint = new WeakMap(), _UserOperationController_ge
486
486
  });
487
487
  }
488
488
  }, _UserOperationController_regenerateUserOperation = async function _UserOperationController_regenerateUserOperation(cache) {
489
- (0, logger_1.projectLogger)('Regenerating user operation as parameters were updated during approval');
489
+ (0, logger_js_1.projectLogger)('Regenerating user operation as parameters were updated during approval');
490
490
  const { options: { smartContractAccount }, metadata, } = cache;
491
491
  await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_prepareUserOperation).call(this, cache);
492
492
  await __classPrivateFieldGet(this, _UserOperationController_instances, "m", _UserOperationController_addPaymasterData).call(this, metadata, smartContractAccount);
493
- (0, logger_1.projectLogger)('Regenerated user operation', metadata.userOperation);
493
+ (0, logger_js_1.projectLogger)('Regenerated user operation', metadata.userOperation);
494
494
  };
495
495
  //# sourceMappingURL=UserOperationController.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserOperationController.cjs","sourceRoot":"","sources":["../src/UserOperationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n ApprovalControllerAddRequestAction,\n AddResult,\n} from '@metamask/approval-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerPrepareUserOperationAction,\n KeyringControllerPatchUserOperationAction,\n KeyringControllerSignUserOperationAction,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type {\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\nimport { cloneDeep } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { ADDRESS_ZERO, EMPTY_BYTES, VALUE_ZERO } from './constants';\nimport { Bundler } from './helpers/Bundler';\nimport { PendingUserOperationTracker } from './helpers/PendingUserOperationTracker';\nimport { SnapSmartContractAccount } from './helpers/SnapSmartContractAccount';\nimport { projectLogger as log } from './logger';\nimport type {\n SmartContractAccount,\n UserOperation,\n UserOperationMetadata,\n} from './types';\nimport { UserOperationStatus } from './types';\nimport type { UserOperationControllerMethodActions } from './UserOperationController-method-action-types';\nimport { updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getTransactionMetadata } from './utils/transaction';\nimport {\n validateAddUserOperationOptions,\n validateAddUserOperationRequest,\n validatePrepareUserOperationResponse,\n validateSignUserOperationResponse,\n validateUpdateUserOperationResponse,\n} from './utils/validation';\n\nconst controllerName = 'UserOperationController';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'addUserOperation',\n 'addUserOperationFromTransaction',\n 'startPollingByNetworkClientId',\n] as const;\n\nconst stateMetadata = {\n userOperations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = () => ({\n userOperations: {},\n});\n\ntype Events = {\n 'transaction-updated': [metadata: TransactionMeta];\n 'user-operation-added': [metadata: UserOperationMetadata];\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [metadata: UserOperationMetadata, error: Error];\n [key: `${string}:confirmed`]: [metadata: UserOperationMetadata];\n [key: `${string}:failed`]: [metadata: UserOperationMetadata, error: Error];\n};\n\nexport type UserOperationControllerEventEmitter = EventEmitter & {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\nexport type UserOperationControllerState = {\n userOperations: Record<string, UserOperationMetadata>;\n};\n\nexport type GetUserOperationState = ControllerGetStateAction<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationControllerActions =\n | GetUserOperationState\n | UserOperationControllerMethodActions\n | NetworkControllerGetNetworkClientByIdAction\n | ApprovalControllerAddRequestAction\n | KeyringControllerPrepareUserOperationAction\n | KeyringControllerPatchUserOperationAction\n | KeyringControllerSignUserOperationAction;\n\nexport type UserOperationControllerEvents = UserOperationStateChange;\n\nexport type UserOperationControllerMessenger = Messenger<\n typeof controllerName,\n UserOperationControllerActions,\n UserOperationControllerEvents\n>;\n\nexport type UserOperationControllerOptions = {\n entrypoint: string;\n getGasFeeEstimates: () => Promise<GasFeeState>;\n interval?: number;\n messenger: UserOperationControllerMessenger;\n state?: Partial<UserOperationControllerState>;\n};\n\nexport type AddUserOperationRequest = {\n data?: string;\n from: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n value?: string;\n};\n\nexport type AddUserOperationSwapOptions = {\n approvalTxId?: string;\n destinationTokenAddress?: string;\n destinationTokenAmount?: string;\n destinationTokenDecimals?: number;\n destinationTokenSymbol?: string;\n estimatedBaseFee?: string;\n sourceTokenAddress?: string;\n sourceTokenAmount?: string;\n sourceTokenDecimals?: number;\n sourceTokenSymbol?: string;\n swapAndSendRecipient?: string;\n swapMetaData?: Record<string, unknown>;\n swapTokenValue?: string;\n};\n\nexport type AddUserOperationOptions = {\n networkClientId: string;\n origin: string;\n requireApproval?: boolean;\n smartContractAccount?: SmartContractAccount;\n swaps?: AddUserOperationSwapOptions;\n type?: TransactionType;\n};\n\nexport type AddUserOperationResponse = {\n id: string;\n hash: () => Promise<string | undefined>;\n transactionHash: () => Promise<string | undefined>;\n};\n\n/**\n * All the objects related to a pending user operation in order to:\n * - Avoid duplicated effort to derive the same properties.\n * - Minimise duplicate arguments in private methods.\n */\ntype UserOperationCache = {\n chainId: string;\n metadata: UserOperationMetadata;\n options: AddUserOperationOptions & {\n smartContractAccount: SmartContractAccount;\n };\n provider: Provider;\n request: AddUserOperationRequest;\n transaction?: TransactionParams;\n};\n\n/**\n * Controller for creating and managing the life cycle of user operations.\n */\nexport class UserOperationController extends BaseController<\n typeof controllerName,\n UserOperationControllerState,\n UserOperationControllerMessenger\n> {\n hub: UserOperationControllerEventEmitter;\n\n readonly #entrypoint: string;\n\n readonly #getGasFeeEstimates: () => Promise<GasFeeState>;\n\n readonly #pendingUserOperationTracker: PendingUserOperationTracker;\n\n /**\n * Construct a UserOperationController instance.\n *\n * @param options - Controller options.\n * @param options.entrypoint - Address of the entrypoint contract.\n * @param options.getGasFeeEstimates - Callback to get gas fee estimates.\n * @param options.messenger - Restricted messenger for the user operation controller.\n * @param options.state - Initial state to set on the controller.\n */\n constructor({\n entrypoint,\n getGasFeeEstimates,\n messenger,\n state,\n }: UserOperationControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.hub = new EventEmitter() as UserOperationControllerEventEmitter;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n this.#entrypoint = entrypoint;\n this.#getGasFeeEstimates = getGasFeeEstimates;\n\n this.#pendingUserOperationTracker = new PendingUserOperationTracker({\n getUserOperations: () =>\n cloneDeep(Object.values(this.state.userOperations)),\n messenger,\n });\n\n this.#addPendingUserOperationTrackerListeners();\n }\n\n /**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationRequest(request);\n validateAddUserOperationOptions(options);\n\n return await this.#addUserOperation(request, options);\n }\n\n /**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperationFromTransaction(\n transaction: TransactionParams,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationOptions(options);\n\n const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n transaction;\n\n const request: AddUserOperationRequest = {\n data: data === '' ? undefined : data,\n from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n validateAddUserOperationRequest(request);\n\n return await this.#addUserOperation(request, { ...options, transaction });\n }\n\n /**\n * Starts polling for pending user operations on the given network.\n *\n * @param networkClientId - The ID of the network client to poll.\n * @returns The polling token that can be used to stop polling.\n */\n startPollingByNetworkClientId(networkClientId: string): string {\n return this.#pendingUserOperationTracker.startPolling({\n networkClientId,\n });\n }\n\n async #addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions & { transaction?: TransactionParams },\n ): Promise<AddUserOperationResponse> {\n log('Adding user operation', { request, options });\n\n const {\n networkClientId,\n origin,\n smartContractAccount: requestSmartContractAccount,\n swaps,\n transaction,\n } = options;\n\n const { chainId, provider } = await this.#getProvider(networkClientId);\n\n const metadata = await this.#createMetadata(\n chainId,\n origin,\n transaction,\n swaps,\n );\n\n const smartContractAccount =\n requestSmartContractAccount ??\n new SnapSmartContractAccount(this.messenger);\n\n const cache: UserOperationCache = {\n chainId,\n metadata,\n options: { ...options, smartContractAccount },\n provider,\n request,\n transaction,\n };\n\n const { id } = metadata;\n let throwError = false;\n\n const hashValue = (async () => {\n try {\n return await this.#prepareAndSubmitUserOperation(cache);\n } catch (error) {\n this.#failUserOperation(metadata, error);\n\n if (throwError) {\n throw error;\n }\n\n return undefined;\n }\n })();\n\n const hash = async () => {\n throwError = true;\n return await hashValue;\n };\n\n const transactionHash = async () => {\n await hash();\n\n const { transactionHash: finalTransactionHash } =\n await this.#waitForConfirmation(metadata);\n\n return finalTransactionHash as string;\n };\n\n return {\n id,\n hash,\n transactionHash,\n };\n }\n\n async #prepareAndSubmitUserOperation(cache: UserOperationCache) {\n const { metadata, options } = cache;\n const { requireApproval, smartContractAccount } = options;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n\n try {\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n this.hub.emit('user-operation-added', metadata);\n\n if (requireApproval !== false) {\n resultCallbacks = await this.#approveUserOperation(cache);\n }\n\n await this.#signUserOperation(metadata, smartContractAccount);\n await this.#submitUserOperation(metadata);\n\n resultCallbacks?.success();\n\n return metadata.hash as string;\n } catch (error) {\n /* istanbul ignore next */\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n async #waitForConfirmation(\n metadata: UserOperationMetadata,\n ): Promise<UserOperationMetadata> {\n const { id, hash } = metadata;\n\n log('Waiting for confirmation', id, hash);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${id}:confirmed`, (finalMetadata) => {\n resolve(finalMetadata);\n });\n\n this.hub.once(`${id}:failed`, (_finalMetadata, error) => {\n reject(error);\n });\n });\n }\n\n async #createMetadata(\n chainId: string,\n origin: string,\n transaction?: TransactionParams,\n swaps?: AddUserOperationSwapOptions,\n ): Promise<UserOperationMetadata> {\n const metadata: UserOperationMetadata = {\n actualGasCost: null,\n actualGasUsed: null,\n baseFeePerGas: null,\n bundlerUrl: null,\n chainId,\n error: null,\n hash: null,\n id: random(),\n origin,\n status: UserOperationStatus.Unapproved,\n swapsMetadata: swaps\n ? {\n approvalTxId: swaps.approvalTxId ?? null,\n destinationTokenAddress: swaps.destinationTokenAddress ?? null,\n destinationTokenAmount: swaps.destinationTokenAmount ?? null,\n destinationTokenDecimals: swaps.destinationTokenDecimals ?? null,\n destinationTokenSymbol: swaps.destinationTokenSymbol ?? null,\n estimatedBaseFee: swaps.estimatedBaseFee ?? null,\n sourceTokenAddress: swaps.sourceTokenAddress ?? null,\n sourceTokenAmount: swaps.sourceTokenAmount ?? null,\n sourceTokenDecimals: swaps.sourceTokenDecimals ?? null,\n sourceTokenSymbol: swaps.sourceTokenSymbol ?? null,\n swapAndSendRecipient: swaps.swapAndSendRecipient ?? null,\n swapMetaData: (swaps.swapMetaData as Record<string, never>) ?? null,\n swapTokenValue: swaps.swapTokenValue ?? null,\n }\n : null,\n time: Date.now(),\n transactionHash: null,\n transactionParams: (transaction as Required<TransactionParams>) ?? null,\n transactionType: null,\n userFeeLevel: null,\n userOperation: this.#createEmptyUserOperation(transaction),\n };\n\n this.#updateMetadata(metadata);\n\n log('Added user operation', metadata.id);\n\n return metadata;\n }\n\n async #prepareUserOperation(cache: UserOperationCache) {\n const { chainId, metadata, options, provider, request, transaction } =\n cache;\n\n const { data, from, to, value } = request;\n const { id, transactionParams, userOperation } = metadata;\n const { smartContractAccount } = options;\n\n log('Preparing user operation', { id });\n\n const transactionType = await this.#getTransactionType(\n transaction,\n options,\n );\n\n metadata.transactionType = transactionType ?? null;\n\n log('Determined transaction type', transactionType);\n\n await updateGasFees({\n getGasFeeEstimates: this.#getGasFeeEstimates,\n metadata,\n originalRequest: request,\n provider,\n transaction: transactionParams ?? undefined,\n });\n\n const response = await smartContractAccount.prepareUserOperation({\n chainId,\n data,\n from,\n to,\n value,\n });\n\n validatePrepareUserOperationResponse(response);\n\n const {\n bundler: bundlerUrl,\n callData,\n dummyPaymasterAndData,\n dummySignature,\n initCode,\n nonce,\n sender,\n } = response;\n\n userOperation.callData = callData;\n userOperation.initCode = initCode ?? EMPTY_BYTES;\n userOperation.nonce = nonce;\n userOperation.paymasterAndData = dummyPaymasterAndData ?? EMPTY_BYTES;\n userOperation.sender = sender;\n userOperation.signature = dummySignature ?? EMPTY_BYTES;\n\n metadata.bundlerUrl = bundlerUrl;\n\n await updateGas(metadata, response, this.#entrypoint);\n\n this.#updateMetadata(metadata);\n }\n\n async #addPaymasterData(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, userOperation, chainId } = metadata;\n\n log('Requesting paymaster data', { id });\n\n const response = await smartContractAccount.updateUserOperation({\n userOperation,\n chainId,\n });\n\n validateUpdateUserOperationResponse(response);\n\n userOperation.paymasterAndData = response.paymasterAndData ?? EMPTY_BYTES;\n if (response.callGasLimit) {\n userOperation.callGasLimit = response.callGasLimit;\n }\n if (response.preVerificationGas) {\n userOperation.preVerificationGas = response.preVerificationGas;\n }\n if (response.verificationGasLimit) {\n userOperation.verificationGasLimit = response.verificationGasLimit;\n }\n\n this.#updateMetadata(metadata);\n }\n\n async #approveUserOperation(cache: UserOperationCache) {\n log('Requesting approval');\n\n const { metadata } = cache;\n\n const { resultCallbacks, value } = await this.#requestApproval(metadata);\n const updatedTransaction = value?.txMeta;\n\n if (updatedTransaction) {\n await this.#updateUserOperationAfterApproval(cache, updatedTransaction);\n }\n\n metadata.status = UserOperationStatus.Approved;\n\n this.#updateMetadata(metadata);\n\n return resultCallbacks;\n }\n\n async #signUserOperation(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, chainId, userOperation } = metadata;\n\n log('Signing user operation', id, userOperation);\n\n const response = await smartContractAccount.signUserOperation({\n userOperation,\n chainId,\n });\n\n validateSignUserOperationResponse(response);\n\n const { signature } = response;\n\n userOperation.signature = signature;\n\n log('Signed user operation', signature);\n\n metadata.status = UserOperationStatus.Signed;\n\n this.#updateMetadata(metadata);\n }\n\n async #submitUserOperation(metadata: UserOperationMetadata) {\n const { userOperation } = metadata;\n\n log('Submitting user operation', userOperation);\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n\n const hash = await bundler.sendUserOperation(\n userOperation,\n this.#entrypoint,\n );\n\n metadata.hash = hash;\n metadata.status = UserOperationStatus.Submitted;\n\n this.#updateMetadata(metadata);\n }\n\n #failUserOperation(metadata: UserOperationMetadata, error: unknown) {\n const { id } = metadata;\n const rawError = error as Record<string, string>;\n\n log('User operation failed', id, error);\n\n metadata.error = {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.value,\n };\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateMetadata(metadata);\n\n if (\n String(rawError.code) === String(errorCodes.provider.userRejectedRequest)\n ) {\n this.#deleteMetadata(id);\n }\n }\n\n #createEmptyUserOperation(transaction?: TransactionParams): UserOperation {\n return {\n callData: EMPTY_BYTES,\n callGasLimit: EMPTY_BYTES,\n initCode: EMPTY_BYTES,\n maxFeePerGas: transaction?.maxFeePerGas ?? EMPTY_BYTES,\n maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? EMPTY_BYTES,\n nonce: EMPTY_BYTES,\n paymasterAndData: EMPTY_BYTES,\n preVerificationGas: EMPTY_BYTES,\n sender: ADDRESS_ZERO,\n signature: EMPTY_BYTES,\n verificationGasLimit: EMPTY_BYTES,\n };\n }\n\n #updateMetadata(metadata: UserOperationMetadata) {\n const { id } = metadata;\n\n this.update((state) => {\n state.userOperations[id] = cloneDeep(metadata);\n });\n\n this.#updateTransaction(metadata);\n }\n\n #deleteMetadata(id: string) {\n this.update((state) => {\n delete state.userOperations[id];\n });\n }\n\n #updateTransaction(metadata: UserOperationMetadata) {\n if (!metadata.transactionParams) {\n return;\n }\n\n const transactionMetadata = getTransactionMetadata(metadata);\n\n this.hub.emit('transaction-updated', transactionMetadata);\n }\n\n #addPendingUserOperationTrackerListeners() {\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-confirmed',\n (metadata) => {\n log('In listener...');\n this.hub.emit('user-operation-confirmed', metadata);\n this.hub.emit(`${metadata.id}:confirmed`, metadata);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-failed',\n (metadata, error) => {\n this.hub.emit('user-operation-failed', metadata, error);\n this.hub.emit(`${metadata.id}:failed`, metadata, error);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-updated',\n (metadata) => {\n this.#updateMetadata(metadata);\n },\n );\n }\n\n async #requestApproval(metadata: UserOperationMetadata) {\n const { id, origin } = metadata;\n const type = ApprovalType.Transaction;\n const requestData = { txId: id };\n\n return (await this.messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData,\n expectsResult: true,\n },\n true, // Should display approval request to user\n )) as AddResult & { value?: { txMeta?: TransactionMeta } };\n }\n\n async #getTransactionType(\n transaction: TransactionParams | undefined,\n options: AddUserOperationOptions,\n ): Promise<TransactionType | undefined> {\n if (!transaction) {\n return undefined;\n }\n\n if (options.type) {\n return options.type;\n }\n\n return TransactionType.contractInteraction;\n }\n\n async #getProvider(\n networkClientId: string,\n ): Promise<{ provider: Provider; chainId: string }> {\n const { provider, configuration } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n const { chainId } = configuration;\n\n return { provider, chainId };\n }\n\n async #updateUserOperationAfterApproval(\n cache: UserOperationCache,\n updatedTransaction: TransactionMeta,\n ) {\n log('Found updated transaction in approval', { updatedTransaction });\n\n const { metadata, request } = cache;\n\n const { userOperation } = metadata;\n const usingPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const updatedMaxFeePerGas = add0x(\n updatedTransaction.txParams.maxFeePerGas as string,\n );\n\n const updatedMaxPriorityFeePerGas = add0x(\n updatedTransaction.txParams.maxPriorityFeePerGas as string,\n );\n\n let regenerateUserOperation = false;\n const previousMaxFeePerGas = userOperation.maxFeePerGas;\n const previousMaxPriorityFeePerGas = userOperation.maxPriorityFeePerGas;\n\n const gasFeesUpdated =\n previousMaxFeePerGas !== updatedMaxFeePerGas ||\n previousMaxPriorityFeePerGas !== updatedMaxPriorityFeePerGas;\n\n /**\n * true when we detect {@link getTransactionMetadata} has set the gas fees to zero\n * because the userOperation has a paymaster. This should not be mistaken for gas\n * fees being updated during the approval process.\n */\n const areGasFeesZeroBecauseOfPaymaster =\n usingPaymaster &&\n updatedMaxFeePerGas === VALUE_ZERO &&\n updatedMaxPriorityFeePerGas === VALUE_ZERO;\n\n if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {\n log('Gas fees updated during approval', {\n previousMaxFeePerGas,\n previousMaxPriorityFeePerGas,\n updatedMaxFeePerGas,\n updatedMaxPriorityFeePerGas,\n });\n\n userOperation.maxFeePerGas = updatedMaxFeePerGas;\n userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;\n\n regenerateUserOperation = usingPaymaster;\n }\n\n const previousData = request.data ?? EMPTY_BYTES;\n const updatedData = updatedTransaction.txParams.data ?? EMPTY_BYTES;\n\n if (previousData !== updatedData) {\n log('Data updated during approval', { previousData, updatedData });\n regenerateUserOperation = true;\n }\n\n const previousValue = request.value ?? VALUE_ZERO;\n const updatedValue = updatedTransaction.txParams.value ?? VALUE_ZERO;\n\n if (previousValue !== updatedValue) {\n log('Value updated during approval', { previousValue, updatedValue });\n regenerateUserOperation = true;\n }\n\n if (regenerateUserOperation) {\n const updatedRequest = {\n ...request,\n data: updatedData,\n maxFeePerGas: updatedMaxFeePerGas,\n maxPriorityFeePerGas: updatedMaxPriorityFeePerGas,\n value: updatedValue,\n };\n\n await this.#regenerateUserOperation({\n ...cache,\n request: updatedRequest,\n });\n }\n }\n\n async #regenerateUserOperation(cache: UserOperationCache) {\n log(\n 'Regenerating user operation as parameters were updated during approval',\n );\n\n const {\n options: { smartContractAccount },\n metadata,\n } = cache;\n\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n log('Regenerated user operation', metadata.userOperation);\n }\n}\n"]}
1
+ {"version":3,"file":"UserOperationController.cjs","sourceRoot":"","sources":["../src/UserOperationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n ApprovalControllerAddRequestAction,\n AddResult,\n} from '@metamask/approval-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerPrepareUserOperationAction,\n KeyringControllerPatchUserOperationAction,\n KeyringControllerSignUserOperationAction,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type {\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\nimport { cloneDeep } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { ADDRESS_ZERO, EMPTY_BYTES, VALUE_ZERO } from './constants.js';\nimport { Bundler } from './helpers/Bundler.js';\nimport { PendingUserOperationTracker } from './helpers/PendingUserOperationTracker.js';\nimport { SnapSmartContractAccount } from './helpers/SnapSmartContractAccount.js';\nimport { projectLogger as log } from './logger.js';\nimport type {\n SmartContractAccount,\n UserOperation,\n UserOperationMetadata,\n} from './types.js';\nimport { UserOperationStatus } from './types.js';\nimport type { UserOperationControllerMethodActions } from './UserOperationController-method-action-types.js';\nimport { updateGasFees } from './utils/gas-fees.js';\nimport { updateGas } from './utils/gas.js';\nimport { getTransactionMetadata } from './utils/transaction.js';\nimport {\n validateAddUserOperationOptions,\n validateAddUserOperationRequest,\n validatePrepareUserOperationResponse,\n validateSignUserOperationResponse,\n validateUpdateUserOperationResponse,\n} from './utils/validation.js';\n\nconst controllerName = 'UserOperationController';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'addUserOperation',\n 'addUserOperationFromTransaction',\n 'startPollingByNetworkClientId',\n] as const;\n\nconst stateMetadata = {\n userOperations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = () => ({\n userOperations: {},\n});\n\ntype Events = {\n 'transaction-updated': [metadata: TransactionMeta];\n 'user-operation-added': [metadata: UserOperationMetadata];\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [metadata: UserOperationMetadata, error: Error];\n [key: `${string}:confirmed`]: [metadata: UserOperationMetadata];\n [key: `${string}:failed`]: [metadata: UserOperationMetadata, error: Error];\n};\n\nexport type UserOperationControllerEventEmitter = EventEmitter & {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\nexport type UserOperationControllerState = {\n userOperations: Record<string, UserOperationMetadata>;\n};\n\nexport type GetUserOperationState = ControllerGetStateAction<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationControllerActions =\n | GetUserOperationState\n | UserOperationControllerMethodActions\n | NetworkControllerGetNetworkClientByIdAction\n | ApprovalControllerAddRequestAction\n | KeyringControllerPrepareUserOperationAction\n | KeyringControllerPatchUserOperationAction\n | KeyringControllerSignUserOperationAction;\n\nexport type UserOperationControllerEvents = UserOperationStateChange;\n\nexport type UserOperationControllerMessenger = Messenger<\n typeof controllerName,\n UserOperationControllerActions,\n UserOperationControllerEvents\n>;\n\nexport type UserOperationControllerOptions = {\n entrypoint: string;\n getGasFeeEstimates: () => Promise<GasFeeState>;\n interval?: number;\n messenger: UserOperationControllerMessenger;\n state?: Partial<UserOperationControllerState>;\n};\n\nexport type AddUserOperationRequest = {\n data?: string;\n from: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n value?: string;\n};\n\nexport type AddUserOperationSwapOptions = {\n approvalTxId?: string;\n destinationTokenAddress?: string;\n destinationTokenAmount?: string;\n destinationTokenDecimals?: number;\n destinationTokenSymbol?: string;\n estimatedBaseFee?: string;\n sourceTokenAddress?: string;\n sourceTokenAmount?: string;\n sourceTokenDecimals?: number;\n sourceTokenSymbol?: string;\n swapAndSendRecipient?: string;\n swapMetaData?: Record<string, unknown>;\n swapTokenValue?: string;\n};\n\nexport type AddUserOperationOptions = {\n networkClientId: string;\n origin: string;\n requireApproval?: boolean;\n smartContractAccount?: SmartContractAccount;\n swaps?: AddUserOperationSwapOptions;\n type?: TransactionType;\n};\n\nexport type AddUserOperationResponse = {\n id: string;\n hash: () => Promise<string | undefined>;\n transactionHash: () => Promise<string | undefined>;\n};\n\n/**\n * All the objects related to a pending user operation in order to:\n * - Avoid duplicated effort to derive the same properties.\n * - Minimise duplicate arguments in private methods.\n */\ntype UserOperationCache = {\n chainId: string;\n metadata: UserOperationMetadata;\n options: AddUserOperationOptions & {\n smartContractAccount: SmartContractAccount;\n };\n provider: Provider;\n request: AddUserOperationRequest;\n transaction?: TransactionParams;\n};\n\n/**\n * Controller for creating and managing the life cycle of user operations.\n */\nexport class UserOperationController extends BaseController<\n typeof controllerName,\n UserOperationControllerState,\n UserOperationControllerMessenger\n> {\n hub: UserOperationControllerEventEmitter;\n\n readonly #entrypoint: string;\n\n readonly #getGasFeeEstimates: () => Promise<GasFeeState>;\n\n readonly #pendingUserOperationTracker: PendingUserOperationTracker;\n\n /**\n * Construct a UserOperationController instance.\n *\n * @param options - Controller options.\n * @param options.entrypoint - Address of the entrypoint contract.\n * @param options.getGasFeeEstimates - Callback to get gas fee estimates.\n * @param options.messenger - Restricted messenger for the user operation controller.\n * @param options.state - Initial state to set on the controller.\n */\n constructor({\n entrypoint,\n getGasFeeEstimates,\n messenger,\n state,\n }: UserOperationControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.hub = new EventEmitter() as UserOperationControllerEventEmitter;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n this.#entrypoint = entrypoint;\n this.#getGasFeeEstimates = getGasFeeEstimates;\n\n this.#pendingUserOperationTracker = new PendingUserOperationTracker({\n getUserOperations: () =>\n cloneDeep(Object.values(this.state.userOperations)),\n messenger,\n });\n\n this.#addPendingUserOperationTrackerListeners();\n }\n\n /**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationRequest(request);\n validateAddUserOperationOptions(options);\n\n return await this.#addUserOperation(request, options);\n }\n\n /**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperationFromTransaction(\n transaction: TransactionParams,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationOptions(options);\n\n const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n transaction;\n\n const request: AddUserOperationRequest = {\n data: data === '' ? undefined : data,\n from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n validateAddUserOperationRequest(request);\n\n return await this.#addUserOperation(request, { ...options, transaction });\n }\n\n /**\n * Starts polling for pending user operations on the given network.\n *\n * @param networkClientId - The ID of the network client to poll.\n * @returns The polling token that can be used to stop polling.\n */\n startPollingByNetworkClientId(networkClientId: string): string {\n return this.#pendingUserOperationTracker.startPolling({\n networkClientId,\n });\n }\n\n async #addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions & { transaction?: TransactionParams },\n ): Promise<AddUserOperationResponse> {\n log('Adding user operation', { request, options });\n\n const {\n networkClientId,\n origin,\n smartContractAccount: requestSmartContractAccount,\n swaps,\n transaction,\n } = options;\n\n const { chainId, provider } = await this.#getProvider(networkClientId);\n\n const metadata = await this.#createMetadata(\n chainId,\n origin,\n transaction,\n swaps,\n );\n\n const smartContractAccount =\n requestSmartContractAccount ??\n new SnapSmartContractAccount(this.messenger);\n\n const cache: UserOperationCache = {\n chainId,\n metadata,\n options: { ...options, smartContractAccount },\n provider,\n request,\n transaction,\n };\n\n const { id } = metadata;\n let throwError = false;\n\n const hashValue = (async () => {\n try {\n return await this.#prepareAndSubmitUserOperation(cache);\n } catch (error) {\n this.#failUserOperation(metadata, error);\n\n if (throwError) {\n throw error;\n }\n\n return undefined;\n }\n })();\n\n const hash = async () => {\n throwError = true;\n return await hashValue;\n };\n\n const transactionHash = async () => {\n await hash();\n\n const { transactionHash: finalTransactionHash } =\n await this.#waitForConfirmation(metadata);\n\n return finalTransactionHash as string;\n };\n\n return {\n id,\n hash,\n transactionHash,\n };\n }\n\n async #prepareAndSubmitUserOperation(cache: UserOperationCache) {\n const { metadata, options } = cache;\n const { requireApproval, smartContractAccount } = options;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n\n try {\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n this.hub.emit('user-operation-added', metadata);\n\n if (requireApproval !== false) {\n resultCallbacks = await this.#approveUserOperation(cache);\n }\n\n await this.#signUserOperation(metadata, smartContractAccount);\n await this.#submitUserOperation(metadata);\n\n resultCallbacks?.success();\n\n return metadata.hash as string;\n } catch (error) {\n /* istanbul ignore next */\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n async #waitForConfirmation(\n metadata: UserOperationMetadata,\n ): Promise<UserOperationMetadata> {\n const { id, hash } = metadata;\n\n log('Waiting for confirmation', id, hash);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${id}:confirmed`, (finalMetadata) => {\n resolve(finalMetadata);\n });\n\n this.hub.once(`${id}:failed`, (_finalMetadata, error) => {\n reject(error);\n });\n });\n }\n\n async #createMetadata(\n chainId: string,\n origin: string,\n transaction?: TransactionParams,\n swaps?: AddUserOperationSwapOptions,\n ): Promise<UserOperationMetadata> {\n const metadata: UserOperationMetadata = {\n actualGasCost: null,\n actualGasUsed: null,\n baseFeePerGas: null,\n bundlerUrl: null,\n chainId,\n error: null,\n hash: null,\n id: random(),\n origin,\n status: UserOperationStatus.Unapproved,\n swapsMetadata: swaps\n ? {\n approvalTxId: swaps.approvalTxId ?? null,\n destinationTokenAddress: swaps.destinationTokenAddress ?? null,\n destinationTokenAmount: swaps.destinationTokenAmount ?? null,\n destinationTokenDecimals: swaps.destinationTokenDecimals ?? null,\n destinationTokenSymbol: swaps.destinationTokenSymbol ?? null,\n estimatedBaseFee: swaps.estimatedBaseFee ?? null,\n sourceTokenAddress: swaps.sourceTokenAddress ?? null,\n sourceTokenAmount: swaps.sourceTokenAmount ?? null,\n sourceTokenDecimals: swaps.sourceTokenDecimals ?? null,\n sourceTokenSymbol: swaps.sourceTokenSymbol ?? null,\n swapAndSendRecipient: swaps.swapAndSendRecipient ?? null,\n swapMetaData: (swaps.swapMetaData as Record<string, never>) ?? null,\n swapTokenValue: swaps.swapTokenValue ?? null,\n }\n : null,\n time: Date.now(),\n transactionHash: null,\n transactionParams: (transaction as Required<TransactionParams>) ?? null,\n transactionType: null,\n userFeeLevel: null,\n userOperation: this.#createEmptyUserOperation(transaction),\n };\n\n this.#updateMetadata(metadata);\n\n log('Added user operation', metadata.id);\n\n return metadata;\n }\n\n async #prepareUserOperation(cache: UserOperationCache) {\n const { chainId, metadata, options, provider, request, transaction } =\n cache;\n\n const { data, from, to, value } = request;\n const { id, transactionParams, userOperation } = metadata;\n const { smartContractAccount } = options;\n\n log('Preparing user operation', { id });\n\n const transactionType = await this.#getTransactionType(\n transaction,\n options,\n );\n\n metadata.transactionType = transactionType ?? null;\n\n log('Determined transaction type', transactionType);\n\n await updateGasFees({\n getGasFeeEstimates: this.#getGasFeeEstimates,\n metadata,\n originalRequest: request,\n provider,\n transaction: transactionParams ?? undefined,\n });\n\n const response = await smartContractAccount.prepareUserOperation({\n chainId,\n data,\n from,\n to,\n value,\n });\n\n validatePrepareUserOperationResponse(response);\n\n const {\n bundler: bundlerUrl,\n callData,\n dummyPaymasterAndData,\n dummySignature,\n initCode,\n nonce,\n sender,\n } = response;\n\n userOperation.callData = callData;\n userOperation.initCode = initCode ?? EMPTY_BYTES;\n userOperation.nonce = nonce;\n userOperation.paymasterAndData = dummyPaymasterAndData ?? EMPTY_BYTES;\n userOperation.sender = sender;\n userOperation.signature = dummySignature ?? EMPTY_BYTES;\n\n metadata.bundlerUrl = bundlerUrl;\n\n await updateGas(metadata, response, this.#entrypoint);\n\n this.#updateMetadata(metadata);\n }\n\n async #addPaymasterData(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, userOperation, chainId } = metadata;\n\n log('Requesting paymaster data', { id });\n\n const response = await smartContractAccount.updateUserOperation({\n userOperation,\n chainId,\n });\n\n validateUpdateUserOperationResponse(response);\n\n userOperation.paymasterAndData = response.paymasterAndData ?? EMPTY_BYTES;\n if (response.callGasLimit) {\n userOperation.callGasLimit = response.callGasLimit;\n }\n if (response.preVerificationGas) {\n userOperation.preVerificationGas = response.preVerificationGas;\n }\n if (response.verificationGasLimit) {\n userOperation.verificationGasLimit = response.verificationGasLimit;\n }\n\n this.#updateMetadata(metadata);\n }\n\n async #approveUserOperation(cache: UserOperationCache) {\n log('Requesting approval');\n\n const { metadata } = cache;\n\n const { resultCallbacks, value } = await this.#requestApproval(metadata);\n const updatedTransaction = value?.txMeta;\n\n if (updatedTransaction) {\n await this.#updateUserOperationAfterApproval(cache, updatedTransaction);\n }\n\n metadata.status = UserOperationStatus.Approved;\n\n this.#updateMetadata(metadata);\n\n return resultCallbacks;\n }\n\n async #signUserOperation(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, chainId, userOperation } = metadata;\n\n log('Signing user operation', id, userOperation);\n\n const response = await smartContractAccount.signUserOperation({\n userOperation,\n chainId,\n });\n\n validateSignUserOperationResponse(response);\n\n const { signature } = response;\n\n userOperation.signature = signature;\n\n log('Signed user operation', signature);\n\n metadata.status = UserOperationStatus.Signed;\n\n this.#updateMetadata(metadata);\n }\n\n async #submitUserOperation(metadata: UserOperationMetadata) {\n const { userOperation } = metadata;\n\n log('Submitting user operation', userOperation);\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n\n const hash = await bundler.sendUserOperation(\n userOperation,\n this.#entrypoint,\n );\n\n metadata.hash = hash;\n metadata.status = UserOperationStatus.Submitted;\n\n this.#updateMetadata(metadata);\n }\n\n #failUserOperation(metadata: UserOperationMetadata, error: unknown) {\n const { id } = metadata;\n const rawError = error as Record<string, string>;\n\n log('User operation failed', id, error);\n\n metadata.error = {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.value,\n };\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateMetadata(metadata);\n\n if (\n String(rawError.code) === String(errorCodes.provider.userRejectedRequest)\n ) {\n this.#deleteMetadata(id);\n }\n }\n\n #createEmptyUserOperation(transaction?: TransactionParams): UserOperation {\n return {\n callData: EMPTY_BYTES,\n callGasLimit: EMPTY_BYTES,\n initCode: EMPTY_BYTES,\n maxFeePerGas: transaction?.maxFeePerGas ?? EMPTY_BYTES,\n maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? EMPTY_BYTES,\n nonce: EMPTY_BYTES,\n paymasterAndData: EMPTY_BYTES,\n preVerificationGas: EMPTY_BYTES,\n sender: ADDRESS_ZERO,\n signature: EMPTY_BYTES,\n verificationGasLimit: EMPTY_BYTES,\n };\n }\n\n #updateMetadata(metadata: UserOperationMetadata) {\n const { id } = metadata;\n\n this.update((state) => {\n state.userOperations[id] = cloneDeep(metadata);\n });\n\n this.#updateTransaction(metadata);\n }\n\n #deleteMetadata(id: string) {\n this.update((state) => {\n delete state.userOperations[id];\n });\n }\n\n #updateTransaction(metadata: UserOperationMetadata) {\n if (!metadata.transactionParams) {\n return;\n }\n\n const transactionMetadata = getTransactionMetadata(metadata);\n\n this.hub.emit('transaction-updated', transactionMetadata);\n }\n\n #addPendingUserOperationTrackerListeners() {\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-confirmed',\n (metadata) => {\n log('In listener...');\n this.hub.emit('user-operation-confirmed', metadata);\n this.hub.emit(`${metadata.id}:confirmed`, metadata);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-failed',\n (metadata, error) => {\n this.hub.emit('user-operation-failed', metadata, error);\n this.hub.emit(`${metadata.id}:failed`, metadata, error);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-updated',\n (metadata) => {\n this.#updateMetadata(metadata);\n },\n );\n }\n\n async #requestApproval(metadata: UserOperationMetadata) {\n const { id, origin } = metadata;\n const type = ApprovalType.Transaction;\n const requestData = { txId: id };\n\n return (await this.messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData,\n expectsResult: true,\n },\n true, // Should display approval request to user\n )) as AddResult & { value?: { txMeta?: TransactionMeta } };\n }\n\n async #getTransactionType(\n transaction: TransactionParams | undefined,\n options: AddUserOperationOptions,\n ): Promise<TransactionType | undefined> {\n if (!transaction) {\n return undefined;\n }\n\n if (options.type) {\n return options.type;\n }\n\n return TransactionType.contractInteraction;\n }\n\n async #getProvider(\n networkClientId: string,\n ): Promise<{ provider: Provider; chainId: string }> {\n const { provider, configuration } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n const { chainId } = configuration;\n\n return { provider, chainId };\n }\n\n async #updateUserOperationAfterApproval(\n cache: UserOperationCache,\n updatedTransaction: TransactionMeta,\n ) {\n log('Found updated transaction in approval', { updatedTransaction });\n\n const { metadata, request } = cache;\n\n const { userOperation } = metadata;\n const usingPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const updatedMaxFeePerGas = add0x(\n updatedTransaction.txParams.maxFeePerGas as string,\n );\n\n const updatedMaxPriorityFeePerGas = add0x(\n updatedTransaction.txParams.maxPriorityFeePerGas as string,\n );\n\n let regenerateUserOperation = false;\n const previousMaxFeePerGas = userOperation.maxFeePerGas;\n const previousMaxPriorityFeePerGas = userOperation.maxPriorityFeePerGas;\n\n const gasFeesUpdated =\n previousMaxFeePerGas !== updatedMaxFeePerGas ||\n previousMaxPriorityFeePerGas !== updatedMaxPriorityFeePerGas;\n\n /**\n * true when we detect {@link getTransactionMetadata} has set the gas fees to zero\n * because the userOperation has a paymaster. This should not be mistaken for gas\n * fees being updated during the approval process.\n */\n const areGasFeesZeroBecauseOfPaymaster =\n usingPaymaster &&\n updatedMaxFeePerGas === VALUE_ZERO &&\n updatedMaxPriorityFeePerGas === VALUE_ZERO;\n\n if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {\n log('Gas fees updated during approval', {\n previousMaxFeePerGas,\n previousMaxPriorityFeePerGas,\n updatedMaxFeePerGas,\n updatedMaxPriorityFeePerGas,\n });\n\n userOperation.maxFeePerGas = updatedMaxFeePerGas;\n userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;\n\n regenerateUserOperation = usingPaymaster;\n }\n\n const previousData = request.data ?? EMPTY_BYTES;\n const updatedData = updatedTransaction.txParams.data ?? EMPTY_BYTES;\n\n if (previousData !== updatedData) {\n log('Data updated during approval', { previousData, updatedData });\n regenerateUserOperation = true;\n }\n\n const previousValue = request.value ?? VALUE_ZERO;\n const updatedValue = updatedTransaction.txParams.value ?? VALUE_ZERO;\n\n if (previousValue !== updatedValue) {\n log('Value updated during approval', { previousValue, updatedValue });\n regenerateUserOperation = true;\n }\n\n if (regenerateUserOperation) {\n const updatedRequest = {\n ...request,\n data: updatedData,\n maxFeePerGas: updatedMaxFeePerGas,\n maxPriorityFeePerGas: updatedMaxPriorityFeePerGas,\n value: updatedValue,\n };\n\n await this.#regenerateUserOperation({\n ...cache,\n request: updatedRequest,\n });\n }\n }\n\n async #regenerateUserOperation(cache: UserOperationCache) {\n log(\n 'Regenerating user operation as parameters were updated during approval',\n );\n\n const {\n options: { smartContractAccount },\n metadata,\n } = cache;\n\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n log('Regenerated user operation', metadata.userOperation);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="npm-which/node_modules/@types/node/events" />
2
+ /// <reference types="npm-which/node_modules/@types/node/events.js" />
3
3
  import type { ApprovalControllerAddRequestAction } from "@metamask/approval-controller";
4
4
  import { BaseController } from "@metamask/base-controller";
5
5
  import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";