@metamask-previews/transaction-controller 44.1.0-preview-2a6578b3 → 44.1.0-preview-99939da3

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 (61) hide show
  1. package/dist/TransactionController.cjs +64 -41
  2. package/dist/TransactionController.cjs.map +1 -1
  3. package/dist/TransactionController.d.cts +15 -3
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts +15 -3
  6. package/dist/TransactionController.d.mts.map +1 -1
  7. package/dist/TransactionController.mjs +63 -40
  8. package/dist/TransactionController.mjs.map +1 -1
  9. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +13 -4
  10. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -1
  11. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -1
  12. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -1
  13. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs +13 -4
  14. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -1
  15. package/dist/index.cjs +2 -3
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +1 -2
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +1 -2
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs +1 -2
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/types.cjs +37 -6
  24. package/dist/types.cjs.map +1 -1
  25. package/dist/types.d.cts +1 -47
  26. package/dist/types.d.cts.map +1 -1
  27. package/dist/types.d.mts +1 -47
  28. package/dist/types.d.mts.map +1 -1
  29. package/dist/types.mjs +37 -6
  30. package/dist/types.mjs.map +1 -1
  31. package/dist/utils/utils.cjs +8 -3
  32. package/dist/utils/utils.cjs.map +1 -1
  33. package/dist/utils/utils.d.cts.map +1 -1
  34. package/dist/utils/utils.d.mts.map +1 -1
  35. package/dist/utils/utils.mjs +8 -3
  36. package/dist/utils/utils.mjs.map +1 -1
  37. package/dist/utils/validation.cjs +31 -91
  38. package/dist/utils/validation.cjs.map +1 -1
  39. package/dist/utils/validation.d.cts +5 -13
  40. package/dist/utils/validation.d.cts.map +1 -1
  41. package/dist/utils/validation.d.mts +5 -13
  42. package/dist/utils/validation.d.mts.map +1 -1
  43. package/dist/utils/validation.mjs +32 -92
  44. package/dist/utils/validation.mjs.map +1 -1
  45. package/package.json +6 -6
  46. package/dist/utils/eip7702.cjs +0 -87
  47. package/dist/utils/eip7702.cjs.map +0 -1
  48. package/dist/utils/eip7702.d.cts +0 -26
  49. package/dist/utils/eip7702.d.cts.map +0 -1
  50. package/dist/utils/eip7702.d.mts +0 -26
  51. package/dist/utils/eip7702.d.mts.map +0 -1
  52. package/dist/utils/eip7702.mjs +0 -83
  53. package/dist/utils/eip7702.mjs.map +0 -1
  54. package/dist/utils/prepare.cjs +0 -49
  55. package/dist/utils/prepare.cjs.map +0 -1
  56. package/dist/utils/prepare.d.cts +0 -21
  57. package/dist/utils/prepare.d.cts.map +0 -1
  58. package/dist/utils/prepare.d.mts +0 -21
  59. package/dist/utils/prepare.d.mts.map +0 -1
  60. package/dist/utils/prepare.mjs +0 -44
  61. package/dist/utils/prepare.mjs.map +0 -1
@@ -13,9 +13,12 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getSelectedAccount, _TransactionController_updateSubmitHistory;
16
+ var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_removeIncomingTransactionHelperListeners, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getSelectedAccount, _TransactionController_updateSubmitHistory;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = void 0;
18
+ exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = exports.HARDFORK = void 0;
19
+ const common_1 = require("@ethereumjs/common");
20
+ const tx_1 = require("@ethereumjs/tx");
21
+ const util_1 = require("@ethereumjs/util");
19
22
  const base_controller_1 = require("@metamask/base-controller");
20
23
  const controller_utils_1 = require("@metamask/controller-utils");
21
24
  const eth_query_1 = __importDefault(require("@metamask/eth-query"));
@@ -43,7 +46,6 @@ const MultichainTrackingHelper_1 = require("./helpers/MultichainTrackingHelper.c
43
46
  const PendingTransactionTracker_1 = require("./helpers/PendingTransactionTracker.cjs");
44
47
  const logger_1 = require("./logger.cjs");
45
48
  const types_1 = require("./types.cjs");
46
- const eip7702_1 = require("./utils/eip7702.cjs");
47
49
  const external_transactions_1 = require("./utils/external-transactions.cjs");
48
50
  const gas_1 = require("./utils/gas.cjs");
49
51
  const gas_fees_1 = require("./utils/gas-fees.cjs");
@@ -51,7 +53,6 @@ const gas_flow_1 = require("./utils/gas-flow.cjs");
51
53
  const history_1 = require("./utils/history.cjs");
52
54
  const layer1_gas_fee_flow_1 = require("./utils/layer1-gas-fee-flow.cjs");
53
55
  const nonce_1 = require("./utils/nonce.cjs");
54
- const prepare_1 = require("./utils/prepare.cjs");
55
56
  const resimulate_1 = require("./utils/resimulate.cjs");
56
57
  const retry_1 = require("./utils/retry.cjs");
57
58
  const simulation_1 = require("./utils/simulation.cjs");
@@ -81,6 +82,7 @@ const metadata = {
81
82
  anonymous: false,
82
83
  },
83
84
  };
85
+ exports.HARDFORK = common_1.Hardfork.London;
84
86
  const SUBMIT_HISTORY_LIMIT = 100;
85
87
  /**
86
88
  * Multiplier used to determine a transaction's increased gas fee during cancellation
@@ -350,19 +352,11 @@ class TransactionController extends base_controller_1.BaseController {
350
352
  if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
351
353
  throw new Error(`Network client not found - ${networkClientId}`);
352
354
  }
353
- const permittedAddresses = origin === undefined
354
- ? undefined
355
- : await this.getPermittedAccounts?.(origin);
356
- const selectedAddress = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getSelectedAccount).call(this).address;
357
- await (0, validation_1.validateTransactionOrigin)({
358
- from: txParams.from,
359
- origin,
360
- permittedAddresses,
361
- selectedAddress,
362
- txParams,
363
- });
364
355
  const isEIP1559Compatible = await this.getEIP1559Compatibility(networkClientId);
365
356
  (0, validation_1.validateTxParams)(txParams, isEIP1559Compatible);
357
+ if (origin && this.getPermittedAccounts) {
358
+ await (0, validation_1.validateTransactionOrigin)(await this.getPermittedAccounts(origin), __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getSelectedAccount).call(this).address, txParams.from, origin);
359
+ }
366
360
  const dappSuggestedGasFees = this.generateDappSuggestedGasFees(txParams, origin);
367
361
  const chainId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).call(this, networkClientId);
368
362
  const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, {
@@ -812,9 +806,12 @@ class TransactionController extends base_controller_1.BaseController {
812
806
  }
813
807
  const initialTx = listOfTxParams[0];
814
808
  const { chainId } = initialTx;
809
+ const common = this.getCommonConfiguration(chainId);
815
810
  const networkClientId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNetworkClientId).call(this, { chainId });
816
- const initialTxAsEthTx = (0, prepare_1.prepareTransaction)(chainId, initialTx);
817
- const initialTxAsSerializedHex = (0, prepare_1.serializeTransaction)(initialTxAsEthTx);
811
+ const initialTxAsEthTx = tx_1.TransactionFactory.fromTxData(initialTx, {
812
+ common,
813
+ });
814
+ const initialTxAsSerializedHex = (0, util_1.bufferToHex)(initialTxAsEthTx.serialize());
818
815
  if (this.approvingTransactionIds.has(initialTxAsSerializedHex)) {
819
816
  return '';
820
817
  }
@@ -1028,9 +1025,10 @@ class TransactionController extends base_controller_1.BaseController {
1028
1025
  chainId,
1029
1026
  };
1030
1027
  const { from } = updatedTransactionParams;
1031
- const unsignedTransaction = (0, prepare_1.prepareTransaction)(chainId, updatedTransactionParams);
1028
+ const common = this.getCommonConfiguration(chainId);
1029
+ const unsignedTransaction = tx_1.TransactionFactory.fromTxData(updatedTransactionParams, { common });
1032
1030
  const signedTransaction = await this.sign(unsignedTransaction, from);
1033
- const rawTransaction = (0, prepare_1.serializeTransaction)(signedTransaction);
1031
+ const rawTransaction = (0, util_1.bufferToHex)(signedTransaction.serialize());
1034
1032
  return rawTransaction;
1035
1033
  }
1036
1034
  /**
@@ -1045,7 +1043,6 @@ class TransactionController extends base_controller_1.BaseController {
1045
1043
  /**
1046
1044
  * Stop the signing process for a specific transaction.
1047
1045
  * Throws an error causing the transaction status to be set to failed.
1048
- *
1049
1046
  * @param transactionId - The ID of the transaction to stop signing.
1050
1047
  */
1051
1048
  abortTransactionSigning(transactionId) {
@@ -1212,15 +1209,17 @@ class TransactionController extends base_controller_1.BaseController {
1212
1209
  transactionId,
1213
1210
  note: 'TransactionController#approveTransaction - Transaction approved',
1214
1211
  }, (draftTxMeta) => {
1215
- const { chainId, txParams } = draftTxMeta;
1216
- const { gas, type } = txParams;
1212
+ const { txParams, chainId } = draftTxMeta;
1217
1213
  draftTxMeta.status = types_1.TransactionStatus.approved;
1218
- draftTxMeta.txParams.chainId = chainId;
1219
- draftTxMeta.txParams.gasLimit = gas;
1220
- draftTxMeta.txParams.nonce = nonce;
1221
- if (!type && (0, utils_2.isEIP1559Transaction)(txParams)) {
1222
- draftTxMeta.txParams.type = types_1.TransactionEnvelopeType.feeMarket;
1223
- }
1214
+ draftTxMeta.txParams = {
1215
+ ...txParams,
1216
+ nonce,
1217
+ chainId,
1218
+ gasLimit: txParams.gas,
1219
+ ...((0, utils_2.isEIP1559Transaction)(txParams) && {
1220
+ type: types_1.TransactionEnvelopeType.feeMarket,
1221
+ }),
1222
+ };
1224
1223
  });
1225
1224
  this.onTransactionStatusChange(transactionMeta);
1226
1225
  const rawTx = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Sign', parentContext: traceContext }, () => this.signTransaction(transactionMeta, transactionMeta.txParams));
@@ -1314,7 +1313,10 @@ class TransactionController extends base_controller_1.BaseController {
1314
1313
  status: types_1.TransactionStatus.rejected,
1315
1314
  };
1316
1315
  this.messagingSystem.publish(`${controllerName}:transactionFinished`, updatedTransactionMeta);
1317
- __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);
1316
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(
1317
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
1318
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1319
+ `${transactionMeta.id}:finished`, updatedTransactionMeta);
1318
1320
  this.messagingSystem.publish(`${controllerName}:transactionRejected`, {
1319
1321
  transactionMeta: updatedTransactionMeta,
1320
1322
  actionId,
@@ -1342,6 +1344,8 @@ class TransactionController extends base_controller_1.BaseController {
1342
1344
  .filter((tx) => {
1343
1345
  const { chainId, status, txParams, time } = tx;
1344
1346
  if (txParams) {
1347
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
1348
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1345
1349
  const key = `${String(txParams.nonce)}-${(0, controller_utils_1.convertHexToDecimal)(chainId)}-${new Date(time).toDateString()}`;
1346
1350
  if (nonceNetworkSet.has(key)) {
1347
1351
  return true;
@@ -1422,6 +1426,29 @@ class TransactionController extends base_controller_1.BaseController {
1422
1426
  const isCompleted = this.isLocalFinalState(transaction.status);
1423
1427
  return { meta: transaction, isCompleted };
1424
1428
  }
1429
+ prepareUnsignedEthTx(chainId, txParams) {
1430
+ return tx_1.TransactionFactory.fromTxData(txParams, {
1431
+ freeze: false,
1432
+ common: this.getCommonConfiguration(chainId),
1433
+ });
1434
+ }
1435
+ /**
1436
+ * `@ethereumjs/tx` uses `@ethereumjs/common` as a configuration tool for
1437
+ * specifying which chain, network, hardfork and EIPs to support for
1438
+ * a transaction. By referencing this configuration, and analyzing the fields
1439
+ * specified in txParams, @ethereumjs/tx is able to determine which EIP-2718
1440
+ * transaction type to use.
1441
+ *
1442
+ * @param chainId - The chainId to use for the configuration.
1443
+ * @returns common configuration object
1444
+ */
1445
+ getCommonConfiguration(chainId) {
1446
+ const customChainParams = {
1447
+ chainId: parseInt(chainId, 16),
1448
+ defaultHardfork: exports.HARDFORK,
1449
+ };
1450
+ return common_1.Common.custom(customChainParams);
1451
+ }
1425
1452
  onIncomingTransactions(transactions) {
1426
1453
  if (!transactions.length) {
1427
1454
  return;
@@ -1592,17 +1619,10 @@ class TransactionController extends base_controller_1.BaseController {
1592
1619
  }
1593
1620
  async signTransaction(transactionMeta, txParams) {
1594
1621
  (0, logger_1.projectLogger)('Signing transaction', txParams);
1595
- const { authorizationList, from } = txParams;
1596
- const finalTxParams = { ...txParams };
1597
- finalTxParams.authorizationList = await (0, eip7702_1.signAuthorizationList)({
1598
- authorizationList,
1599
- messenger: this.messagingSystem,
1600
- transactionMeta,
1601
- });
1602
- const unsignedEthTx = (0, prepare_1.prepareTransaction)(transactionMeta.chainId, finalTxParams);
1622
+ const unsignedEthTx = this.prepareUnsignedEthTx(transactionMeta.chainId, txParams);
1603
1623
  this.approvingTransactionIds.add(transactionMeta.id);
1604
1624
  const signedTx = await new Promise((resolve, reject) => {
1605
- this.sign?.(unsignedEthTx, from, ...this.getAdditionalSignArguments(transactionMeta)).then(resolve, reject);
1625
+ this.sign?.(unsignedEthTx, txParams.from, ...this.getAdditionalSignArguments(transactionMeta)).then(resolve, reject);
1606
1626
  this.signAbortCallbacks.set(transactionMeta.id, () => reject(new Error('Signing aborted by user')));
1607
1627
  });
1608
1628
  this.signAbortCallbacks.delete(transactionMeta.id);
@@ -1622,7 +1642,7 @@ class TransactionController extends base_controller_1.BaseController {
1622
1642
  };
1623
1643
  this.updateTransaction(transactionMetaWithRsv, 'TransactionController#approveTransaction - Transaction signed');
1624
1644
  this.onTransactionStatusChange(transactionMetaWithRsv);
1625
- const rawTx = (0, prepare_1.serializeTransaction)(signedTx);
1645
+ const rawTx = (0, util_1.bufferToHex)(signedTx.serialize());
1626
1646
  const transactionMetaWithRawTx = (0, lodash_1.merge)({}, transactionMetaWithRsv, {
1627
1647
  rawTx,
1628
1648
  });
@@ -1718,10 +1738,10 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1718
1738
  }
1719
1739
  const newTxParams = (0, retry_1.getTransactionParamsWithIncreasedGasFee)(transactionMeta.txParams, rate, gasValues);
1720
1740
  prepareTransactionParams?.(newTxParams);
1721
- const unsignedEthTx = (0, prepare_1.prepareTransaction)(transactionMeta.chainId, newTxParams);
1741
+ const unsignedEthTx = this.prepareUnsignedEthTx(transactionMeta.chainId, newTxParams);
1722
1742
  const signedTx = await this.sign(unsignedEthTx, transactionMeta.txParams.from);
1723
1743
  const transactionMetaWithRsv = this.updateTransactionMetaRSV(transactionMeta, signedTx);
1724
- const rawTx = (0, prepare_1.serializeTransaction)(signedTx);
1744
+ const rawTx = (0, util_1.bufferToHex)(signedTx.serialize());
1725
1745
  const newFee = newTxParams.maxFeePerGas ?? newTxParams.gasPrice;
1726
1746
  const oldFee = newTxParams.maxFeePerGas
1727
1747
  ? transactionMetaWithRsv.txParams.maxFeePerGas
@@ -1812,6 +1832,9 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1812
1832
  return pendingTransactionTracker;
1813
1833
  }, _TransactionController_stopAllTracking = function _TransactionController_stopAllTracking() {
1814
1834
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").stopAllTracking();
1835
+ }, _TransactionController_removeIncomingTransactionHelperListeners = function _TransactionController_removeIncomingTransactionHelperListeners(incomingTransactionHelper) {
1836
+ incomingTransactionHelper.hub.removeAllListeners('transactions');
1837
+ incomingTransactionHelper.hub.removeAllListeners('updated-last-fetched-timestamp');
1815
1838
  }, _TransactionController_addIncomingTransactionHelperListeners = function _TransactionController_addIncomingTransactionHelperListeners(incomingTransactionHelper) {
1816
1839
  incomingTransactionHelper.hub.on('transactions', this.onIncomingTransactions.bind(this));
1817
1840
  }, _TransactionController_removePendingTransactionTrackerListeners = function _TransactionController_removePendingTransactionTrackerListeners(pendingTransactionTracker) {