@metamask/transaction-controller 12.0.0 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -1
- package/dist/TransactionController.d.ts +8 -1
- package/dist/TransactionController.d.ts.map +1 -1
- package/dist/TransactionController.js +23 -8
- package/dist/TransactionController.js.map +1 -1
- package/dist/external-transactions.js +5 -5
- package/dist/external-transactions.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +5 -4
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +15 -9
- package/dist/utils.js.map +1 -1
- package/package.json +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [13.0.0]
|
|
10
|
+
### Changed
|
|
11
|
+
- **BREAKING**: Add required `getCurrentAccountEIP1559Compatibility` and `getCurrentNetworkEIP1559Compatibility` callback arguments to constructor ([#1693](https://github.com/MetaMask/core/pull/1693))
|
|
12
|
+
- Update `validateTxParams` to throw standardised errors using the `@metamask/rpc-errors` package ([#1690](https://github.com/MetaMask/core/pull/1690))
|
|
13
|
+
- The dependency `eth-rpc-errors` has been replaced by `@metamask/rpc-errors`
|
|
14
|
+
- Preserve `type` transaction parameter for legacy transactions ([#1713](https://github.com/MetaMask/core/pull/1713))
|
|
15
|
+
- Update TypeScript to v4.8.x ([#1718](https://github.com/MetaMask/core/pull/1718))
|
|
16
|
+
|
|
9
17
|
## [12.0.0]
|
|
10
18
|
### Changed
|
|
11
19
|
- **BREAKING**: Use only `chainId` to determine if a transaction belongs to the current network ([#1633](https://github.com/MetaMask/core/pull/1633))
|
|
@@ -203,7 +211,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
203
211
|
|
|
204
212
|
All changes listed after this point were applied to this package following the monorepo conversion.
|
|
205
213
|
|
|
206
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@
|
|
214
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@13.0.0...HEAD
|
|
215
|
+
[13.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@12.0.0...@metamask/transaction-controller@13.0.0
|
|
207
216
|
[12.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@11.1.0...@metamask/transaction-controller@12.0.0
|
|
208
217
|
[11.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@11.0.0...@metamask/transaction-controller@11.1.0
|
|
209
218
|
[11.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@10.0.0...@metamask/transaction-controller@11.0.0
|
|
@@ -99,6 +99,8 @@ export declare class TransactionController extends BaseController<TransactionCon
|
|
|
99
99
|
private handle?;
|
|
100
100
|
private readonly mutex;
|
|
101
101
|
private readonly getNetworkState;
|
|
102
|
+
private readonly getCurrentAccountEIP1559Compatibility;
|
|
103
|
+
private readonly getCurrentNetworkEIP1559Compatibility;
|
|
102
104
|
private readonly messagingSystem;
|
|
103
105
|
private readonly incomingTransactionHelper;
|
|
104
106
|
private failTransaction;
|
|
@@ -122,6 +124,8 @@ export declare class TransactionController extends BaseController<TransactionCon
|
|
|
122
124
|
* @param options.blockTracker - The block tracker used to poll for new blocks data.
|
|
123
125
|
* @param options.disableHistory - Whether to disable storing history in transaction metadata.
|
|
124
126
|
* @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.
|
|
127
|
+
* @param options.getCurrentAccountEIP1559Compatibility - Whether or not the account supports EIP-1559.
|
|
128
|
+
* @param options.getCurrentNetworkEIP1559Compatibility - Whether or not the network supports EIP-1559.
|
|
125
129
|
* @param options.getNetworkState - Gets the state of the network controller.
|
|
126
130
|
* @param options.getSelectedAddress - Gets the address of the currently selected account.
|
|
127
131
|
* @param options.incomingTransactions - Configuration options for incoming transaction support.
|
|
@@ -135,10 +139,12 @@ export declare class TransactionController extends BaseController<TransactionCon
|
|
|
135
139
|
* @param config - Initial options used to configure this controller.
|
|
136
140
|
* @param state - Initial state to set on this controller.
|
|
137
141
|
*/
|
|
138
|
-
constructor({ blockTracker, disableHistory, disableSendFlowHistory, getNetworkState, getSelectedAddress, incomingTransactions, messenger, onNetworkStateChange, provider, }: {
|
|
142
|
+
constructor({ blockTracker, disableHistory, disableSendFlowHistory, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getNetworkState, getSelectedAddress, incomingTransactions, messenger, onNetworkStateChange, provider, }: {
|
|
139
143
|
blockTracker: BlockTracker;
|
|
140
144
|
disableHistory: boolean;
|
|
141
145
|
disableSendFlowHistory: boolean;
|
|
146
|
+
getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;
|
|
147
|
+
getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;
|
|
142
148
|
getNetworkState: () => NetworkState;
|
|
143
149
|
getSelectedAddress: () => string;
|
|
144
150
|
incomingTransactions: {
|
|
@@ -424,6 +430,7 @@ export declare class TransactionController extends BaseController<TransactionCon
|
|
|
424
430
|
* @param signedTx - The encompassing type for all transaction types containing r, s, and v values.
|
|
425
431
|
*/
|
|
426
432
|
private updateTransactionMetaRSV;
|
|
433
|
+
private getEIP1559Compatibility;
|
|
427
434
|
}
|
|
428
435
|
export default TransactionController;
|
|
429
436
|
//# sourceMappingURL=TransactionController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionController.d.ts","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAA4B,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,6BAA6B,EAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAc3D,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACT,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionController.d.ts","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAA4B,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,6BAA6B,EAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAc3D,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACT,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAUtC,OAAO,KAAK,EAEV,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAqB,MAAM,SAAS,CAAC;AAe7D,eAAO,MAAM,QAAQ,kBAAkB,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,CAAC;IAC1C,uBAAuB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpD;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B;;GAEG;AACH,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC;;GAEG;AACH,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAE/C;;GAEG;AACH,aAAK,cAAc,GAAG,kBAAkB,CAAC;AAEzC;;GAEG;AACH,oBAAY,8BAA8B,GAAG,6BAA6B,CACxE,OAAO,cAAc,EACrB,cAAc,EACd,KAAK,EACL,cAAc,CAAC,MAAM,CAAC,EACtB,KAAK,CACN,CAAC;AAEF;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,cAAc,CACvD,iBAAiB,EACjB,gBAAgB,CACjB;IACC,OAAO,CAAC,QAAQ,CAAW;IAE3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAU;IAEpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,QAAQ,CAAM;IAEtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,OAAO,CAAC,MAAM,CAAC,CAAgC;IAE/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IAErD,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAAyB;IAE/E,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAAyB;IAE/E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IAEjE,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAA4B;IAEtE,OAAO,CAAC,eAAe;YAaT,cAAc;IAM5B;;OAEG;IACH,GAAG,eAAsB;IAEzB;;OAEG;IACM,IAAI,SAA2B;IAExC;;OAEG;IACH,IAAI,CAAC,EAAE,CACL,WAAW,EAAE,gBAAgB,EAC7B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE/B;;;;;;;;;;;;;;;;;;;;;OAqBG;gBAED,EACE,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,qCAAqC,EACrC,qCAAqC,EACrC,eAAe,EACf,kBAAkB,EAClB,oBAAyB,EACzB,SAAS,EACT,oBAAoB,EACpB,QAAQ,GACT,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,cAAc,EAAE,OAAO,CAAC;QACxB,sBAAsB,EAAE,OAAO,CAAC;QAChC,qCAAqC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,qCAAqC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,eAAe,EAAE,MAAM,YAAY,CAAC;QACpC,kBAAkB,EAAE,MAAM,MAAM,CAAC;QACjC,oBAAoB,EAAE;YACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;YAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;YAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;YAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;SAC9B,CAAC;QACF,SAAS,EAAE,8BAA8B,CAAC;QAC1C,oBAAoB,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,KAAK,IAAI,CAAC;QACxE,QAAQ,EAAE,QAAQ,CAAC;KACpB,EACD,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,KAAK,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IA8EnC;;;;OAIG;IACG,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C;;;;;OAKG;IACG,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoBnE;;;;;;;;;;;;;;;OAeG;IACG,cAAc,CAClB,QAAQ,EAAE,iBAAiB,EAC3B,EACE,QAAQ,EACR,iBAAiB,EACjB,MAAM,EACN,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,IAAI,GACL,GAAE;QACD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iBAAiB,CAAC,EAAE,YAAY,CAAC;QACjC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAC;QACzC,IAAI,CAAC,EAAE,eAAe,CAAC;KACnB,GACL,OAAO,CAAC,MAAM,CAAC;IAqElB,+BAA+B;IAI/B,8BAA8B;IAIxB,0BAA0B;IAIhC;;OAEG;IACH,aAAa;IAkBb;;;;;;;;OAQG;IACG,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,aAAa,GAAG,sBAAsB,EAClD,EAAE,gBAAgB,EAAE,GAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO;IA8F1D;;;;;;;;OAQG;IACG,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,aAAa,GAAG,sBAAsB,EAClD,EACE,QAAQ,EACR,gBAAgB,GACjB,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO;IA4H1D;;;;;OAKG;IACG,WAAW,CAAC,WAAW,EAAE,iBAAiB;;;;;;;;;IA6EhD;;;OAGG;IACG,wBAAwB;IA2B9B;;;;;OAKG;IACH,iBAAiB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM;IAYhE;;;;;;;OAOG;IACH,gBAAgB,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;IA2B1D,kCAAkC;IAIlC,iCAAiC;IAIjC;;;;;;OAMG;IACG,0BAA0B,CAC9B,eAAe,EAAE,eAAe,EAChC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,GAAG;IA4BpB;;;;;;;OAOG;IACH,gCAAgC,CAC9B,aAAa,EAAE,MAAM,EACrB,4BAA4B,EAAE,MAAM,EACpC,oBAAoB,EAAE,oBAAoB,EAAE,GAC3C,eAAe;IAqClB;;;;;;;;;;;;;;;;;OAiBG;IACH,wBAAwB,CACtB,aAAa,EAAE,MAAM,EACrB,EACE,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GACb,EAAE;QACD,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACA,eAAe;YA6CJ,eAAe;IAkF7B;;;;;;;OAOG;YACW,kBAAkB;IA+FhC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,wBAAwB;IAiChC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IASpB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;OAKG;YACW,oCAAoC;IAmElD;;;;;;;;OAQG;YACW,4BAA4B;YAa5B,eAAe;IAsB7B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,sBAAsB;IAyB9B,OAAO,CAAC,gCAAgC;IAaxC,OAAO,CAAC,4BAA4B;IAsCpC;;;;OAIG;YACW,sBAAsB;IAmCpC;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IA8BlC;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAQnC;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;YAMpB,0BAA0B;IAUxC;;;;;;OAMG;YACW,wBAAwB;YAiBxB,uBAAuB;CAUtC;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -18,9 +18,9 @@ const tx_1 = require("@ethereumjs/tx");
|
|
|
18
18
|
const base_controller_1 = require("@metamask/base-controller");
|
|
19
19
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
20
20
|
const eth_query_1 = __importDefault(require("@metamask/eth-query"));
|
|
21
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
21
22
|
const async_mutex_1 = require("async-mutex");
|
|
22
23
|
const eth_method_registry_1 = __importDefault(require("eth-method-registry"));
|
|
23
|
-
const eth_rpc_errors_1 = require("eth-rpc-errors");
|
|
24
24
|
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
25
25
|
const events_1 = require("events");
|
|
26
26
|
const lodash_1 = require("lodash");
|
|
@@ -57,6 +57,8 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
57
57
|
* @param options.blockTracker - The block tracker used to poll for new blocks data.
|
|
58
58
|
* @param options.disableHistory - Whether to disable storing history in transaction metadata.
|
|
59
59
|
* @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.
|
|
60
|
+
* @param options.getCurrentAccountEIP1559Compatibility - Whether or not the account supports EIP-1559.
|
|
61
|
+
* @param options.getCurrentNetworkEIP1559Compatibility - Whether or not the network supports EIP-1559.
|
|
60
62
|
* @param options.getNetworkState - Gets the state of the network controller.
|
|
61
63
|
* @param options.getSelectedAddress - Gets the address of the currently selected account.
|
|
62
64
|
* @param options.incomingTransactions - Configuration options for incoming transaction support.
|
|
@@ -70,7 +72,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
70
72
|
* @param config - Initial options used to configure this controller.
|
|
71
73
|
* @param state - Initial state to set on this controller.
|
|
72
74
|
*/
|
|
73
|
-
constructor({ blockTracker, disableHistory, disableSendFlowHistory, getNetworkState, getSelectedAddress, incomingTransactions = {}, messenger, onNetworkStateChange, provider, }, config, state) {
|
|
75
|
+
constructor({ blockTracker, disableHistory, disableSendFlowHistory, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getNetworkState, getSelectedAddress, incomingTransactions = {}, messenger, onNetworkStateChange, provider, }, config, state) {
|
|
74
76
|
super(config, state);
|
|
75
77
|
this.mutex = new async_mutex_1.Mutex();
|
|
76
78
|
/**
|
|
@@ -98,6 +100,10 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
98
100
|
this.isSendFlowHistoryDisabled = disableSendFlowHistory !== null && disableSendFlowHistory !== void 0 ? disableSendFlowHistory : false;
|
|
99
101
|
this.isHistoryDisabled = disableHistory !== null && disableHistory !== void 0 ? disableHistory : false;
|
|
100
102
|
this.registry = new eth_method_registry_1.default({ provider });
|
|
103
|
+
this.getCurrentAccountEIP1559Compatibility =
|
|
104
|
+
getCurrentAccountEIP1559Compatibility;
|
|
105
|
+
this.getCurrentNetworkEIP1559Compatibility =
|
|
106
|
+
getCurrentNetworkEIP1559Compatibility;
|
|
101
107
|
this.nonceTracker = new nonce_tracker_1.default({
|
|
102
108
|
provider,
|
|
103
109
|
blockTracker,
|
|
@@ -199,7 +205,8 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
199
205
|
const chainId = this.getChainId();
|
|
200
206
|
const { transactions } = this.state;
|
|
201
207
|
txParams = (0, utils_1.normalizeTxParams)(txParams);
|
|
202
|
-
|
|
208
|
+
const isEIP1559Compatible = yield this.getEIP1559Compatibility();
|
|
209
|
+
(0, utils_1.validateTxParams)(txParams, isEIP1559Compatible);
|
|
203
210
|
const dappSuggestedGasFees = this.generateDappSuggestedGasFees(txParams, origin);
|
|
204
211
|
const transactionType = type !== null && type !== void 0 ? type : (yield (0, transaction_type_1.determineTransactionType)(txParams, this.ethQuery)).type;
|
|
205
212
|
const existingTransactionMeta = this.getTransactionWithActionId(actionId);
|
|
@@ -693,9 +700,9 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
693
700
|
catch (error) {
|
|
694
701
|
const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
|
|
695
702
|
if (!isTxCompleted) {
|
|
696
|
-
if (error.code ===
|
|
703
|
+
if (error.code === rpc_errors_1.errorCodes.provider.userRejectedRequest) {
|
|
697
704
|
this.cancelTransaction(transactionId);
|
|
698
|
-
throw
|
|
705
|
+
throw rpc_errors_1.providerErrors.userRejectedRequest('User rejected the transaction');
|
|
699
706
|
}
|
|
700
707
|
else {
|
|
701
708
|
this.failTransaction(meta, error);
|
|
@@ -707,16 +714,16 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
707
714
|
switch (finalMeta === null || finalMeta === void 0 ? void 0 : finalMeta.status) {
|
|
708
715
|
case types_1.TransactionStatus.failed:
|
|
709
716
|
resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.error(finalMeta.error);
|
|
710
|
-
throw
|
|
717
|
+
throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
|
|
711
718
|
case types_1.TransactionStatus.cancelled:
|
|
712
|
-
const cancelError =
|
|
719
|
+
const cancelError = rpc_errors_1.rpcErrors.internal('User cancelled the transaction');
|
|
713
720
|
resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.error(cancelError);
|
|
714
721
|
throw cancelError;
|
|
715
722
|
case types_1.TransactionStatus.submitted:
|
|
716
723
|
resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.success();
|
|
717
724
|
return finalMeta.hash;
|
|
718
725
|
default:
|
|
719
|
-
const internalError =
|
|
726
|
+
const internalError = rpc_errors_1.rpcErrors.internal(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finalMeta || transactionId)}`);
|
|
720
727
|
resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.error(internalError);
|
|
721
728
|
throw internalError;
|
|
722
729
|
}
|
|
@@ -1167,6 +1174,14 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1167
1174
|
}
|
|
1168
1175
|
});
|
|
1169
1176
|
}
|
|
1177
|
+
getEIP1559Compatibility() {
|
|
1178
|
+
var _a, _b;
|
|
1179
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1180
|
+
const currentNetworkIsEIP1559Compatible = yield this.getCurrentNetworkEIP1559Compatibility();
|
|
1181
|
+
const currentAccountIsEIP1559Compatible = (_b = (_a = this.getCurrentAccountEIP1559Compatibility) === null || _a === void 0 ? void 0 : _a.call(this)) !== null && _b !== void 0 ? _b : true;
|
|
1182
|
+
return (currentNetworkIsEIP1559Compatible && currentAccountIsEIP1559Compatible);
|
|
1183
|
+
});
|
|
1184
|
+
}
|
|
1170
1185
|
}
|
|
1171
1186
|
exports.TransactionController = TransactionController;
|
|
1172
1187
|
exports.default = TransactionController;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionController.js","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hardfork, Common, type ChainConfig } from '@ethereumjs/common';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport type {\n BaseConfig,\n BaseState,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n BNToHex,\n fractionBN,\n hexToBN,\n safelyExecute,\n query,\n NetworkType,\n RPC,\n ApprovalType,\n ORIGIN_METAMASK,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkState,\n Provider,\n} from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport MethodRegistry from 'eth-method-registry';\nimport { errorCodes, ethErrors } from 'eth-rpc-errors';\nimport { addHexPrefix, bufferToHex } from 'ethereumjs-util';\nimport { EventEmitter } from 'events';\nimport { merge, pickBy } from 'lodash';\nimport NonceTracker from 'nonce-tracker';\nimport { v1 as random } from 'uuid';\n\nimport { EtherscanRemoteTransactionSource } from './EtherscanRemoteTransactionSource';\nimport { validateConfirmedExternalTransaction } from './external-transactions';\nimport { addInitialHistorySnapshot, updateTransactionHistory } from './history';\nimport { IncomingTransactionHelper } from './IncomingTransactionHelper';\nimport { determineTransactionType } from './transaction-type';\nimport type {\n DappSuggestedGasFees,\n TransactionParams,\n TransactionMeta,\n TransactionReceipt,\n SendFlowHistoryEntry,\n WalletDevice,\n} from './types';\nimport { TransactionType, TransactionStatus } from './types';\nimport {\n getAndFormatTransactionsForNonceTracker,\n getIncreasedPriceFromExisting,\n normalizeTxParams,\n isEIP1559Transaction,\n isFeeMarketEIP1559Values,\n isGasPriceValue,\n validateGasValues,\n validateIfTransactionUnapproved,\n validateMinimumIncrease,\n validateTxParams,\n ESTIMATE_GAS_ERROR,\n} from './utils';\n\nexport const HARDFORK = Hardfork.London;\n\n/**\n * @type Result\n * @property result - Promise resolving to a new transaction hash\n * @property transactionMeta - Meta information about this new transaction\n */\nexport interface Result {\n result: Promise<string>;\n transactionMeta: TransactionMeta;\n}\n\nexport interface GasPriceValue {\n gasPrice: string;\n}\n\nexport interface FeeMarketEIP1559Values {\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n}\n\n/**\n * @type TransactionConfig\n *\n * Transaction controller configuration\n * @property interval - Polling interval used to fetch new currency rate\n * @property provider - Provider used to create a new underlying EthQuery instance\n * @property sign - Method used to sign transactions\n */\nexport interface TransactionConfig extends BaseConfig {\n interval: number;\n sign?: (txParams: TransactionParams, from: string) => Promise<any>;\n txHistoryLimit: number;\n}\n\n/**\n * @type MethodData\n *\n * Method data registry object\n * @property registryMethod - Registry method raw string\n * @property parsedRegistryMethod - Registry method object, containing name and method arguments\n */\nexport interface MethodData {\n registryMethod: string;\n parsedRegistryMethod: Record<string, unknown>;\n}\n\n/**\n * @type TransactionState\n *\n * Transaction controller state\n * @property transactions - A list of TransactionMeta objects\n * @property methodData - Object containing all known method data information\n */\nexport interface TransactionState extends BaseState {\n transactions: TransactionMeta[];\n methodData: { [key: string]: MethodData };\n lastFetchedBlockNumbers: { [key: string]: number };\n}\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during cancellation\n */\nexport const CANCEL_RATE = 1.5;\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during speed up\n */\nexport const SPEED_UP_RATE = 1.1;\n\n/**\n * The name of the {@link TransactionController}.\n */\nconst controllerName = 'TransactionController';\n\n/**\n * The external actions available to the {@link TransactionController}.\n */\ntype AllowedActions = AddApprovalRequest;\n\n/**\n * The messenger of the {@link TransactionController}.\n */\nexport type TransactionControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AllowedActions,\n never,\n AllowedActions['type'],\n never\n>;\n\n/**\n * Controller responsible for submitting and managing transactions.\n */\nexport class TransactionController extends BaseController<\n TransactionConfig,\n TransactionState\n> {\n private ethQuery: EthQuery;\n\n private readonly isHistoryDisabled: boolean;\n\n private readonly isSendFlowHistoryDisabled: boolean;\n\n private readonly nonceTracker: NonceTracker;\n\n private registry: any;\n\n private readonly provider: Provider;\n\n private handle?: ReturnType<typeof setTimeout>;\n\n private readonly mutex = new Mutex();\n\n private readonly getNetworkState: () => NetworkState;\n\n private readonly messagingSystem: TransactionControllerMessenger;\n\n private readonly incomingTransactionHelper: IncomingTransactionHelper;\n\n private failTransaction(transactionMeta: TransactionMeta, error: Error) {\n const newTransactionMeta = {\n ...transactionMeta,\n error,\n status: TransactionStatus.failed,\n };\n this.updateTransaction(\n newTransactionMeta,\n 'TransactionController#failTransaction - Add error message and set status to failed',\n );\n this.hub.emit(`${transactionMeta.id}:finished`, newTransactionMeta);\n }\n\n private async registryLookup(fourBytePrefix: string): Promise<MethodData> {\n const registryMethod = await this.registry.lookup(fourBytePrefix);\n const parsedRegistryMethod = this.registry.parse(registryMethod);\n return { registryMethod, parsedRegistryMethod };\n }\n\n /**\n * EventEmitter instance used to listen to specific transactional events\n */\n hub = new EventEmitter();\n\n /**\n * Name of this controller used during composition\n */\n override name = 'TransactionController';\n\n /**\n * Method used to sign transactions\n */\n sign?: (\n transaction: TypedTransaction,\n from: string,\n ) => Promise<TypedTransaction>;\n\n /**\n * Creates a TransactionController instance.\n *\n * @param options - The controller options.\n * @param options.blockTracker - The block tracker used to poll for new blocks data.\n * @param options.disableHistory - Whether to disable storing history in transaction metadata.\n * @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.\n * @param options.getNetworkState - Gets the state of the network controller.\n * @param options.getSelectedAddress - Gets the address of the currently selected account.\n * @param options.incomingTransactions - Configuration options for incoming transaction support.\n * @param options.incomingTransactions.includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @param options.incomingTransactions.isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @param options.incomingTransactions.queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @param options.incomingTransactions.updateTransactions - Whether to update local transactions using remote transaction data.\n * @param options.messenger - The controller messenger.\n * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.\n * @param options.provider - The provider used to create the underlying EthQuery instance.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n blockTracker,\n disableHistory,\n disableSendFlowHistory,\n getNetworkState,\n getSelectedAddress,\n incomingTransactions = {},\n messenger,\n onNetworkStateChange,\n provider,\n }: {\n blockTracker: BlockTracker;\n disableHistory: boolean;\n disableSendFlowHistory: boolean;\n getNetworkState: () => NetworkState;\n getSelectedAddress: () => string;\n incomingTransactions: {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n };\n messenger: TransactionControllerMessenger;\n onNetworkStateChange: (listener: (state: NetworkState) => void) => void;\n provider: Provider;\n },\n config?: Partial<TransactionConfig>,\n state?: Partial<TransactionState>,\n ) {\n super(config, state);\n\n this.defaultConfig = {\n interval: 15000,\n txHistoryLimit: 40,\n };\n\n this.defaultState = {\n methodData: {},\n transactions: [],\n lastFetchedBlockNumbers: {},\n };\n\n this.initialize();\n\n this.provider = provider;\n this.messagingSystem = messenger;\n this.getNetworkState = getNetworkState;\n this.ethQuery = new EthQuery(provider);\n this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;\n this.isHistoryDisabled = disableHistory ?? false;\n this.registry = new MethodRegistry({ provider });\n\n this.nonceTracker = new NonceTracker({\n provider,\n blockTracker,\n getPendingTransactions: (address) =>\n getAndFormatTransactionsForNonceTracker(\n address,\n TransactionStatus.submitted,\n this.state.transactions,\n ),\n getConfirmedTransactions: (address) =>\n getAndFormatTransactionsForNonceTracker(\n address,\n TransactionStatus.confirmed,\n this.state.transactions,\n ),\n });\n\n this.incomingTransactionHelper = new IncomingTransactionHelper({\n blockTracker,\n getCurrentAccount: getSelectedAddress,\n getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,\n getNetworkState,\n isEnabled: incomingTransactions.isEnabled,\n queryEntireHistory: incomingTransactions.queryEntireHistory,\n remoteTransactionSource: new EtherscanRemoteTransactionSource({\n includeTokenTransfers: incomingTransactions.includeTokenTransfers,\n }),\n transactionLimit: this.config.txHistoryLimit,\n updateTransactions: incomingTransactions.updateTransactions,\n });\n\n this.incomingTransactionHelper.hub.on(\n 'transactions',\n this.onIncomingTransactions.bind(this),\n );\n\n this.incomingTransactionHelper.hub.on(\n 'updatedLastFetchedBlockNumbers',\n this.onUpdatedLastFetchedBlockNumbers.bind(this),\n );\n\n onNetworkStateChange(() => {\n this.ethQuery = new EthQuery(this.provider);\n this.registry = new MethodRegistry({ provider: this.provider });\n });\n\n this.poll();\n }\n\n /**\n * Starts a new polling interval.\n *\n * @param interval - The polling interval used to fetch new transaction statuses.\n */\n async poll(interval?: number): Promise<void> {\n interval && this.configure({ interval }, false, false);\n this.handle && clearTimeout(this.handle);\n await safelyExecute(() => this.queryTransactionStatuses());\n this.handle = setTimeout(() => {\n this.poll(this.config.interval);\n }, this.config.interval);\n }\n\n /**\n * Handle new method data request.\n *\n * @param fourBytePrefix - The method prefix.\n * @returns The method data object corresponding to the given signature prefix.\n */\n async handleMethodData(fourBytePrefix: string): Promise<MethodData> {\n const releaseLock = await this.mutex.acquire();\n try {\n const { methodData } = this.state;\n const knownMethod = Object.keys(methodData).find(\n (knownFourBytePrefix) => fourBytePrefix === knownFourBytePrefix,\n );\n if (knownMethod) {\n return methodData[fourBytePrefix];\n }\n const registry = await this.registryLookup(fourBytePrefix);\n this.update({\n methodData: { ...methodData, ...{ [fourBytePrefix]: registry } },\n });\n return registry;\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Add a new unapproved transaction to state. Parameters will be validated, a\n * unique transaction id will be generated, and gas and gasPrice will be calculated\n * if not provided. If A `<tx.id>:unapproved` hub event will be emitted once added.\n *\n * @param txParams - Standard parameters for an Ethereum transaction.\n * @param opts - Additional options to control how the transaction is added.\n * @param opts.actionId - Unique ID to prevent duplicate requests.\n * @param opts.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.\n * @param opts.origin - The origin of the transaction request, such as a dApp hostname.\n * @param opts.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.\n * @param opts.securityAlertResponse - Response from security validator.\n * @param opts.sendFlowHistory - The sendFlowHistory entries to add.\n * @param opts.type - Type of transaction to add, such as 'cancel' or 'swap'.\n * @returns Object containing a promise resolving to the transaction hash if approved.\n */\n async addTransaction(\n txParams: TransactionParams,\n {\n actionId,\n deviceConfirmedOn,\n origin,\n requireApproval,\n securityAlertResponse,\n sendFlowHistory,\n type,\n }: {\n actionId?: string;\n deviceConfirmedOn?: WalletDevice;\n origin?: string;\n requireApproval?: boolean | undefined;\n securityAlertResponse?: Record<string, unknown>;\n sendFlowHistory?: SendFlowHistoryEntry[];\n type?: TransactionType;\n } = {},\n ): Promise<Result> {\n const chainId = this.getChainId();\n const { transactions } = this.state;\n txParams = normalizeTxParams(txParams);\n validateTxParams(txParams);\n\n const dappSuggestedGasFees = this.generateDappSuggestedGasFees(\n txParams,\n origin,\n );\n\n const transactionType =\n type ?? (await determineTransactionType(txParams, this.ethQuery)).type;\n\n const existingTransactionMeta = this.getTransactionWithActionId(actionId);\n // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.\n const transactionMeta: TransactionMeta = existingTransactionMeta || {\n // Add actionId to txMeta to check if same actionId is seen again\n actionId,\n chainId,\n dappSuggestedGasFees,\n deviceConfirmedOn,\n id: random(),\n origin,\n securityAlertResponse,\n status: TransactionStatus.unapproved as TransactionStatus.unapproved,\n time: Date.now(),\n txParams,\n userEditedGasLimit: false,\n verifiedOnBlockchain: false,\n type: transactionType,\n };\n\n try {\n const { gas, estimateGasError } = await this.estimateGas(txParams);\n txParams.gas = gas;\n txParams.estimateGasError = estimateGasError;\n transactionMeta.originalGasEstimate = gas;\n } catch (error: any) {\n this.failTransaction(transactionMeta, error);\n return Promise.reject(error);\n }\n\n // Checks if a transaction already exists with a given actionId\n if (!existingTransactionMeta) {\n if (!this.isSendFlowHistoryDisabled) {\n transactionMeta.sendFlowHistory = sendFlowHistory ?? [];\n }\n // Initial history push\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n transactions.push(transactionMeta);\n this.update({\n transactions: this.trimTransactionsForState(transactions),\n });\n this.hub.emit(`unapprovedTransaction`, transactionMeta);\n }\n\n return {\n result: this.processApproval(transactionMeta, {\n isExisting: Boolean(existingTransactionMeta),\n requireApproval,\n }),\n transactionMeta,\n };\n }\n\n startIncomingTransactionPolling() {\n this.incomingTransactionHelper.start();\n }\n\n stopIncomingTransactionPolling() {\n this.incomingTransactionHelper.stop();\n }\n\n async updateIncomingTransactions() {\n await this.incomingTransactionHelper.update();\n }\n\n /**\n * Creates approvals for all unapproved transactions persisted.\n */\n initApprovals() {\n const chainId = this.getChainId();\n const unapprovedTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.status === TransactionStatus.unapproved &&\n transaction.chainId === chainId,\n );\n\n for (const txMeta of unapprovedTxs) {\n this.processApproval(txMeta, {\n shouldShowRequest: false,\n }).catch((error) => {\n /* istanbul ignore next */\n console.error('Error during persisted transaction approval', error);\n });\n }\n }\n\n /**\n * Attempts to cancel a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n * @param gasValues - The gas values to use for the cancellation transaction.\n * @param options - The options for the cancellation transaction.\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async stopTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n { estimatedBaseFee }: { estimatedBaseFee?: string } = {},\n ) {\n if (gasValues) {\n validateGasValues(gasValues);\n }\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n if (!transactionMeta) {\n return;\n }\n\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n CANCEL_RATE,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n CANCEL_RATE,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n CANCEL_RATE,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const txParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: 2,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n }\n : {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(txParams);\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n const rawTx = bufferToHex(signedTx.serialize());\n await query(this.ethQuery, 'sendRawTransaction', [rawTx]);\n transactionMeta.estimatedBaseFee = estimatedBaseFee;\n transactionMeta.status = TransactionStatus.cancelled;\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n }\n\n /**\n * Attempts to speed up a transaction increasing transaction gasPrice by ten percent.\n *\n * @param transactionId - The ID of the transaction to speed up.\n * @param gasValues - The gas values to use for the speed up transaction.\n * @param options - The options for the speed up transaction.\n * @param options.actionId - Unique ID to prevent duplicate requests\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async speedUpTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n {\n actionId,\n estimatedBaseFee,\n }: { actionId?: string; estimatedBaseFee?: string } = {},\n ) {\n // If transaction is found for same action id, do not create a new speed up transaction.\n if (this.getTransactionWithActionId(actionId)) {\n return;\n }\n\n if (gasValues) {\n validateGasValues(gasValues);\n }\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n /* istanbul ignore next */\n if (!transactionMeta) {\n return;\n }\n\n /* istanbul ignore next */\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n const { transactions } = this.state;\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n SPEED_UP_RATE,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n SPEED_UP_RATE,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n SPEED_UP_RATE,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const txParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: 2,\n }\n : {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(txParams);\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n const rawTx = bufferToHex(signedTx.serialize());\n const hash = await query(this.ethQuery, 'sendRawTransaction', [rawTx]);\n const baseTransactionMeta = {\n ...transactionMeta,\n estimatedBaseFee,\n id: random(),\n time: Date.now(),\n hash,\n actionId,\n originalGasEstimate: transactionMeta.txParams.gas,\n type: TransactionType.retry,\n };\n const newTransactionMeta =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n },\n }\n : {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n gasPrice: newGasPrice,\n },\n };\n transactions.push(newTransactionMeta);\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n this.hub.emit(`${transactionMeta.id}:speedup`, newTransactionMeta);\n }\n\n /**\n * Estimates required gas for a given transaction.\n *\n * @param transaction - The transaction to estimate gas for.\n * @returns The gas and gas price.\n */\n async estimateGas(transaction: TransactionParams) {\n const estimatedTransaction = { ...transaction };\n const {\n gas,\n gasPrice: providedGasPrice,\n to,\n value,\n data,\n } = estimatedTransaction;\n const gasPrice =\n typeof providedGasPrice === 'undefined'\n ? await query(this.ethQuery, 'gasPrice')\n : providedGasPrice;\n const { providerConfig } = this.getNetworkState();\n const isCustomNetwork = providerConfig.type === NetworkType.rpc;\n // 1. If gas is already defined on the transaction, use it\n if (typeof gas !== 'undefined') {\n return { gas, gasPrice };\n }\n const { gasLimit } = await query(this.ethQuery, 'getBlockByNumber', [\n 'latest',\n false,\n ]);\n\n // 2. If to is not defined or this is not a contract address, and there is no data use 0x5208 / 21000.\n // If the network is a custom network then bypass this check and fetch 'estimateGas'.\n /* istanbul ignore next */\n const code = to ? await query(this.ethQuery, 'getCode', [to]) : undefined;\n /* istanbul ignore next */\n if (\n !isCustomNetwork &&\n (!to || (to && !data && (!code || code === '0x')))\n ) {\n return { gas: '0x5208', gasPrice };\n }\n\n // if data, should be hex string format\n estimatedTransaction.data = !data\n ? data\n : /* istanbul ignore next */ addHexPrefix(data);\n\n // 3. If this is a contract address, safely estimate gas using RPC\n estimatedTransaction.value =\n typeof value === 'undefined' ? '0x0' : /* istanbul ignore next */ value;\n const gasLimitBN = hexToBN(gasLimit);\n estimatedTransaction.gas = BNToHex(fractionBN(gasLimitBN, 19, 20));\n\n let gasHex;\n let estimateGasError;\n try {\n gasHex = await query(this.ethQuery, 'estimateGas', [\n estimatedTransaction,\n ]);\n } catch (error) {\n estimateGasError = ESTIMATE_GAS_ERROR;\n }\n // 4. Pad estimated gas without exceeding the most recent block gasLimit. If the network is a\n // a custom network then return the eth_estimateGas value.\n const gasBN = hexToBN(gasHex);\n const maxGasBN = gasLimitBN.muln(0.9);\n const paddedGasBN = gasBN.muln(1.5);\n /* istanbul ignore next */\n if (gasBN.gt(maxGasBN) || isCustomNetwork) {\n return { gas: addHexPrefix(gasHex), gasPrice, estimateGasError };\n }\n\n /* istanbul ignore next */\n if (paddedGasBN.lt(maxGasBN)) {\n return {\n gas: addHexPrefix(BNToHex(paddedGasBN)),\n gasPrice,\n estimateGasError,\n };\n }\n return { gas: addHexPrefix(BNToHex(maxGasBN)), gasPrice, estimateGasError };\n }\n\n /**\n * Check the status of submitted transactions on the network to determine whether they have\n * been included in a block. Any that have been included in a block are marked as confirmed.\n */\n async queryTransactionStatuses() {\n const { transactions } = this.state;\n const currentChainId = this.getChainId();\n let gotUpdates = false;\n await safelyExecute(() =>\n Promise.all(\n transactions.map(async (meta, index) => {\n if (!meta.verifiedOnBlockchain && meta.chainId === currentChainId) {\n const [reconciledTx, updateRequired] =\n await this.blockchainTransactionStateReconciler(meta);\n if (updateRequired) {\n transactions[index] = reconciledTx;\n gotUpdates = updateRequired;\n }\n }\n }),\n ),\n );\n\n /* istanbul ignore else */\n if (gotUpdates) {\n this.update({\n transactions: this.trimTransactionsForState(transactions),\n });\n }\n }\n\n /**\n * Updates an existing transaction in state.\n *\n * @param transactionMeta - The new transaction to store in state.\n * @param note - A note or update reason to include in the transaction history.\n */\n updateTransaction(transactionMeta: TransactionMeta, note: string) {\n const { transactions } = this.state;\n transactionMeta.txParams = normalizeTxParams(transactionMeta.txParams);\n validateTxParams(transactionMeta.txParams);\n if (!this.isHistoryDisabled) {\n updateTransactionHistory(transactionMeta, note);\n }\n const index = transactions.findIndex(({ id }) => transactionMeta.id === id);\n transactions[index] = transactionMeta;\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Removes all transactions from state, optionally based on the current network.\n *\n * @param ignoreNetwork - Determines whether to wipe all transactions, or just those on the\n * current network. If `true`, all transactions are wiped.\n * @param address - If specified, only transactions originating from this address will be\n * wiped on current network.\n */\n wipeTransactions(ignoreNetwork?: boolean, address?: string) {\n /* istanbul ignore next */\n if (ignoreNetwork && !address) {\n this.update({ transactions: [] });\n return;\n }\n const currentChainId = this.getChainId();\n const newTransactions = this.state.transactions.filter(\n ({ chainId, txParams }) => {\n const isMatchingNetwork = ignoreNetwork || chainId === currentChainId;\n\n if (!isMatchingNetwork) {\n return true;\n }\n\n const isMatchingAddress =\n !address || txParams.from?.toLowerCase() === address.toLowerCase();\n\n return !isMatchingAddress;\n },\n );\n\n this.update({\n transactions: this.trimTransactionsForState(newTransactions),\n });\n }\n\n startIncomingTransactionProcessing() {\n this.incomingTransactionHelper.start();\n }\n\n stopIncomingTransactionProcessing() {\n this.incomingTransactionHelper.stop();\n }\n\n /**\n * Adds external provided transaction to state as confirmed transaction.\n *\n * @param transactionMeta - TransactionMeta to add transactions.\n * @param transactionReceipt - TransactionReceipt of the external transaction.\n * @param baseFeePerGas - Base fee per gas of the external transaction.\n */\n async confirmExternalTransaction(\n transactionMeta: TransactionMeta,\n transactionReceipt: TransactionReceipt,\n baseFeePerGas: Hex,\n ) {\n // Run validation and add external transaction to state.\n this.addExternalTransaction(transactionMeta);\n\n try {\n const transactionId = transactionMeta.id;\n\n // Make sure status is confirmed and define gasUsed as in receipt.\n transactionMeta.status = TransactionStatus.confirmed;\n transactionMeta.txReceipt = transactionReceipt;\n if (baseFeePerGas) {\n transactionMeta.baseFeePerGas = baseFeePerGas;\n }\n\n // Update same nonce local transactions as dropped and define replacedBy properties.\n this.markNonceDuplicatesDropped(transactionId);\n\n // Update external provided transaction with updated gas values and confirmed status.\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:confirmExternalTransaction - Add external transaction',\n );\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * Append new send flow history to a transaction.\n *\n * @param transactionID - The ID of the transaction to update.\n * @param currentSendFlowHistoryLength - The length of the current sendFlowHistory array.\n * @param sendFlowHistoryToAdd - The sendFlowHistory entries to add.\n * @returns The updated transactionMeta.\n */\n updateTransactionSendFlowHistory(\n transactionID: string,\n currentSendFlowHistoryLength: number,\n sendFlowHistoryToAdd: SendFlowHistoryEntry[],\n ): TransactionMeta {\n if (this.isSendFlowHistoryDisabled) {\n throw new Error(\n 'Send flow history is disabled for the current transaction controller',\n );\n }\n\n const transactionMeta = this.getTransaction(transactionID);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update send flow history as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionSendFlowHistory',\n );\n\n if (\n currentSendFlowHistoryLength ===\n (transactionMeta?.sendFlowHistory?.length || 0)\n ) {\n transactionMeta.sendFlowHistory = [\n ...(transactionMeta?.sendFlowHistory ?? []),\n ...sendFlowHistoryToAdd,\n ];\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:updateTransactionSendFlowHistory - sendFlowHistory updated',\n );\n }\n\n return this.getTransaction(transactionID) as TransactionMeta;\n }\n\n /**\n * Update the gas values of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param gasValues - Gas values to update.\n * @param gasValues.gas - Same as transaction.gasLimit.\n * @param gasValues.gasLimit - Maxmimum number of units of gas to use for this transaction.\n * @param gasValues.gasPrice - Price per gas for legacy transactions.\n * @param gasValues.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @param gasValues.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param gasValues.estimateUsed - Which estimate level was used.\n * @param gasValues.estimateSuggested - Which estimate level that the API suggested.\n * @param gasValues.defaultGasEstimates - The default estimate for gas.\n * @param gasValues.originalGasEstimate - Original estimate for gas.\n * @param gasValues.userEditedGasLimit - The gas limit supplied by user.\n * @param gasValues.userFeeLevel - Estimate level user selected.\n * @returns The updated transactionMeta.\n */\n updateTransactionGasFees(\n transactionId: string,\n {\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n }: {\n defaultGasEstimates?: string;\n estimateUsed?: string;\n estimateSuggested?: string;\n gas?: string;\n gasLimit?: string;\n gasPrice?: string;\n maxPriorityFeePerGas?: string;\n maxFeePerGas?: string;\n originalGasEstimate?: string;\n userEditedGasLimit?: boolean;\n userFeeLevel?: string;\n },\n ): TransactionMeta {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update transaction as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionGasFees',\n );\n\n let transactionGasFees = {\n txParams: {\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n },\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n } as any;\n\n // only update what is defined\n transactionGasFees.txParams = pickBy(transactionGasFees.txParams);\n transactionGasFees = pickBy(transactionGasFees);\n\n // merge updated gas values with existing transaction meta\n const updatedMeta = merge(transactionMeta, transactionGasFees);\n\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updateTransactionGasFees - gas values updated',\n );\n\n return this.getTransaction(transactionId) as TransactionMeta;\n }\n\n private async processApproval(\n transactionMeta: TransactionMeta,\n {\n isExisting = false,\n requireApproval,\n shouldShowRequest = true,\n }: {\n isExisting?: boolean;\n requireApproval?: boolean | undefined;\n shouldShowRequest?: boolean;\n },\n ): Promise<string> {\n const transactionId = transactionMeta.id;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n const { meta, isCompleted } = this.isTransactionCompleted(transactionId);\n const finishedPromise = isCompleted\n ? Promise.resolve(meta)\n : this.waitForTransactionFinished(transactionId);\n\n if (meta && !isExisting && !isCompleted) {\n try {\n if (requireApproval !== false) {\n const acceptResult = await this.requestApproval(transactionMeta, {\n shouldShowRequest,\n });\n resultCallbacks = acceptResult.resultCallbacks;\n }\n\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n\n if (!isTxCompleted) {\n await this.approveTransaction(transactionId);\n }\n } catch (error: any) {\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n if (!isTxCompleted) {\n if (error.code === errorCodes.provider.userRejectedRequest) {\n this.cancelTransaction(transactionId);\n\n throw ethErrors.provider.userRejectedRequest(\n 'User rejected the transaction',\n );\n } else {\n this.failTransaction(meta, error);\n }\n }\n }\n }\n\n const finalMeta = await finishedPromise;\n\n switch (finalMeta?.status) {\n case TransactionStatus.failed:\n resultCallbacks?.error(finalMeta.error);\n throw ethErrors.rpc.internal(finalMeta.error.message);\n\n case TransactionStatus.cancelled:\n const cancelError = ethErrors.rpc.internal(\n 'User cancelled the transaction',\n );\n\n resultCallbacks?.error(cancelError);\n throw cancelError;\n\n case TransactionStatus.submitted:\n resultCallbacks?.success();\n return finalMeta.hash as string;\n\n default:\n const internalError = ethErrors.rpc.internal(\n `MetaMask Tx Signature: Unknown problem: ${JSON.stringify(\n finalMeta || transactionId,\n )}`,\n );\n\n resultCallbacks?.error(internalError);\n throw internalError;\n }\n }\n\n /**\n * Approves a transaction and updates it's status in state. If this is not a\n * retry transaction, a nonce will be generated. The transaction is signed\n * using the sign configuration property, then published to the blockchain.\n * A `<tx.id>:finished` hub event is fired after success or failure.\n *\n * @param transactionId - The ID of the transaction to approve.\n */\n private async approveTransaction(transactionId: string) {\n const { transactions } = this.state;\n const releaseLock = await this.mutex.acquire();\n const chainId = this.getChainId();\n const index = transactions.findIndex(({ id }) => transactionId === id);\n const transactionMeta = transactions[index];\n const {\n txParams: { nonce, from },\n } = transactionMeta;\n let nonceLock;\n try {\n if (!this.sign) {\n releaseLock();\n this.failTransaction(\n transactionMeta,\n new Error('No sign method defined.'),\n );\n return;\n } else if (!chainId) {\n releaseLock();\n this.failTransaction(transactionMeta, new Error('No chainId defined.'));\n return;\n }\n\n const { approved: status } = TransactionStatus;\n let nonceToUse = nonce;\n // if a nonce already exists on the transactionMeta it means this is a speedup or cancel transaction\n // so we want to reuse that nonce and hope that it beats the previous attempt to chain. Otherwise use a new locked nonce\n if (!nonceToUse) {\n nonceLock = await this.nonceTracker.getNonceLock(from);\n nonceToUse = addHexPrefix(nonceLock.nextNonce.toString(16));\n }\n\n transactionMeta.status = status;\n transactionMeta.txParams.nonce = nonceToUse;\n transactionMeta.txParams.chainId = chainId;\n\n const baseTxParams = {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n };\n\n const isEIP1559 = isEIP1559Transaction(transactionMeta.txParams);\n\n const txParams = isEIP1559\n ? {\n ...baseTxParams,\n maxFeePerGas: transactionMeta.txParams.maxFeePerGas,\n maxPriorityFeePerGas: transactionMeta.txParams.maxPriorityFeePerGas,\n estimatedBaseFee: transactionMeta.txParams.estimatedBaseFee,\n // specify type 2 if maxFeePerGas and maxPriorityFeePerGas are set\n type: 2,\n }\n : baseTxParams;\n\n // delete gasPrice if maxFeePerGas and maxPriorityFeePerGas are set\n if (isEIP1559) {\n delete txParams.gasPrice;\n }\n\n const unsignedEthTx = this.prepareUnsignedEthTx(txParams);\n const signedTx = await this.sign(unsignedEthTx, from);\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n transactionMeta.status = TransactionStatus.signed;\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction signed',\n );\n\n const rawTx = bufferToHex(signedTx.serialize());\n transactionMeta.rawTx = rawTx;\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - RawTransaction added',\n );\n const hash = await query(this.ethQuery, 'sendRawTransaction', [rawTx]);\n transactionMeta.hash = hash;\n transactionMeta.status = TransactionStatus.submitted;\n transactionMeta.submittedTime = new Date().getTime();\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction submitted',\n );\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n } catch (error: any) {\n this.failTransaction(transactionMeta, error);\n } finally {\n // must set transaction to submitted/failed before releasing lock\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n releaseLock();\n }\n }\n\n /**\n * Cancels a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n */\n private cancelTransaction(transactionId: string) {\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n if (!transactionMeta) {\n return;\n }\n transactionMeta.status = TransactionStatus.rejected;\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n const transactions = this.state.transactions.filter(\n ({ id }) => id !== transactionId,\n );\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Trim the amount of transactions that are set on the state. Checks\n * if the length of the tx history is longer then desired persistence\n * limit and then if it is removes the oldest confirmed or rejected tx.\n * Pending or unapproved transactions will not be removed by this\n * operation. For safety of presenting a fully functional transaction UI\n * representation, this function will not break apart transactions with the\n * same nonce, created on the same day, per network. Not accounting for transactions of the same\n * nonce, same day and network combo can result in confusing or broken experiences\n * in the UI. The transactions are then updated using the BaseController update.\n *\n * @param transactions - The transactions to be applied to the state.\n * @returns The trimmed list of transactions.\n */\n private trimTransactionsForState(\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const nonceNetworkSet = new Set();\n\n const txsToKeep = transactions\n .sort((a, b) => (a.time > b.time ? -1 : 1)) // Descending time order\n .filter((tx) => {\n const { chainId, status, txParams, time } = tx;\n\n if (txParams) {\n const key = `${txParams.nonce}-${convertHexToDecimal(\n chainId,\n )}-${new Date(time).toDateString()}`;\n\n if (nonceNetworkSet.has(key)) {\n return true;\n } else if (\n nonceNetworkSet.size < this.config.txHistoryLimit ||\n !this.isFinalState(status)\n ) {\n nonceNetworkSet.add(key);\n return true;\n }\n }\n\n return false;\n });\n\n txsToKeep.reverse(); // Ascending time order\n return txsToKeep;\n }\n\n /**\n * Determines if the transaction is in a final state.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isFinalState(status: TransactionStatus): boolean {\n return (\n status === TransactionStatus.rejected ||\n status === TransactionStatus.confirmed ||\n status === TransactionStatus.failed ||\n status === TransactionStatus.cancelled\n );\n }\n\n /**\n * Whether the transaction has at least completed all local processing.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isLocalFinalState(status: TransactionStatus): boolean {\n return [\n TransactionStatus.cancelled,\n TransactionStatus.confirmed,\n TransactionStatus.failed,\n TransactionStatus.rejected,\n TransactionStatus.submitted,\n ].includes(status);\n }\n\n /**\n * Method to verify the state of a transaction using the Blockchain as a source of truth.\n *\n * @param meta - The local transaction to verify on the blockchain.\n * @returns A tuple containing the updated transaction, and whether or not an update was required.\n */\n private async blockchainTransactionStateReconciler(\n meta: TransactionMeta,\n ): Promise<[TransactionMeta, boolean]> {\n const { status, hash } = meta;\n switch (status) {\n case TransactionStatus.confirmed:\n const txReceipt = await query(this.ethQuery, 'getTransactionReceipt', [\n hash,\n ]);\n\n if (!txReceipt) {\n return [meta, false];\n }\n\n const txBlock = await query(this.ethQuery, 'getBlockByHash', [\n txReceipt.blockHash,\n ]);\n\n meta.verifiedOnBlockchain = true;\n meta.txParams.gasUsed = txReceipt.gasUsed;\n meta.txReceipt = txReceipt;\n meta.baseFeePerGas = txBlock?.baseFeePerGas;\n meta.blockTimestamp = txBlock?.timestamp;\n\n // According to the Web3 docs:\n // TRUE if the transaction was successful, FALSE if the EVM reverted the transaction.\n if (Number(txReceipt.status) === 0) {\n const error: Error = new Error(\n 'Transaction failed. The transaction was reversed',\n );\n this.failTransaction(meta, error);\n return [meta, false];\n }\n\n return [meta, true];\n case TransactionStatus.submitted:\n const txObj = await query(this.ethQuery, 'getTransactionByHash', [\n hash,\n ]);\n\n if (!txObj) {\n const receiptShowsFailedStatus =\n await this.checkTxReceiptStatusIsFailed(hash);\n\n // Case the txObj is evaluated as false, a second check will\n // determine if the tx failed or it is pending or confirmed\n if (receiptShowsFailedStatus) {\n const error: Error = new Error(\n 'Transaction failed. The transaction was dropped or replaced by a new one',\n );\n this.failTransaction(meta, error);\n }\n }\n\n /* istanbul ignore next */\n if (txObj?.blockNumber) {\n meta.status = TransactionStatus.confirmed;\n this.hub.emit(`${meta.id}:confirmed`, meta);\n return [meta, true];\n }\n\n return [meta, false];\n default:\n return [meta, false];\n }\n }\n\n /**\n * Method to check if a tx has failed according to their receipt\n * According to the Web3 docs:\n * TRUE if the transaction was successful, FALSE if the EVM reverted the transaction.\n * The receipt is not available for pending transactions and returns null.\n *\n * @param txHash - The transaction hash.\n * @returns Whether the transaction has failed.\n */\n private async checkTxReceiptStatusIsFailed(\n txHash: string | undefined,\n ): Promise<boolean> {\n const txReceipt = await query(this.ethQuery, 'getTransactionReceipt', [\n txHash,\n ]);\n if (!txReceipt) {\n // Transaction is pending\n return false;\n }\n return Number(txReceipt.status) === 0;\n }\n\n private async requestApproval(\n txMeta: TransactionMeta,\n { shouldShowRequest }: { shouldShowRequest: boolean },\n ): Promise<AddResult> {\n const id = this.getApprovalId(txMeta);\n const { origin } = txMeta;\n const type = ApprovalType.Transaction;\n const requestData = { txId: txMeta.id };\n\n return (await this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin || ORIGIN_METAMASK,\n type,\n requestData,\n expectsResult: true,\n },\n shouldShowRequest,\n )) as Promise<AddResult>;\n }\n\n private getTransaction(transactionId: string): TransactionMeta | undefined {\n const { transactions } = this.state;\n return transactions.find(({ id }) => id === transactionId);\n }\n\n private getApprovalId(txMeta: TransactionMeta) {\n return String(txMeta.id);\n }\n\n private isTransactionCompleted(transactionId: string): {\n meta?: TransactionMeta;\n isCompleted: boolean;\n } {\n const transaction = this.getTransaction(transactionId);\n\n if (!transaction) {\n return { meta: undefined, isCompleted: false };\n }\n\n const isCompleted = this.isLocalFinalState(transaction.status);\n\n return { meta: transaction, isCompleted };\n }\n\n private getChainId(): Hex {\n const { providerConfig } = this.getNetworkState();\n return providerConfig.chainId;\n }\n\n private prepareUnsignedEthTx(\n txParams: Record<string, unknown>,\n ): TypedTransaction {\n return TransactionFactory.fromTxData(txParams, {\n common: this.getCommonConfiguration(),\n freeze: false,\n });\n }\n\n /**\n * `@ethereumjs/tx` uses `@ethereumjs/common` as a configuration tool for\n * specifying which chain, network, hardfork and EIPs to support for\n * a transaction. By referencing this configuration, and analyzing the fields\n * specified in txParams, @ethereumjs/tx is able to determine which EIP-2718\n * transaction type to use.\n *\n * @returns common configuration object\n */\n private getCommonConfiguration(): Common {\n const {\n providerConfig: { type: chain, chainId, nickname: name },\n } = this.getNetworkState();\n\n if (\n chain !== RPC &&\n chain !== NetworkType['linea-goerli'] &&\n chain !== NetworkType['linea-mainnet']\n ) {\n return new Common({ chain, hardfork: HARDFORK });\n }\n\n const customChainParams: Partial<ChainConfig> = {\n name,\n chainId: parseInt(chainId, 16),\n defaultHardfork: HARDFORK,\n };\n\n return Common.custom(customChainParams);\n }\n\n private onIncomingTransactions({\n added,\n updated,\n }: {\n added: TransactionMeta[];\n updated: TransactionMeta[];\n }) {\n const { transactions: currentTransactions } = this.state;\n\n const updatedTransactions = [\n ...added,\n ...currentTransactions.map((originalTransaction) => {\n const updatedTransaction = updated.find(\n ({ hash }) => hash === originalTransaction.hash,\n );\n\n return updatedTransaction ?? originalTransaction;\n }),\n ];\n\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n private onUpdatedLastFetchedBlockNumbers({\n lastFetchedBlockNumbers,\n blockNumber,\n }: {\n lastFetchedBlockNumbers: {\n [key: string]: number;\n };\n blockNumber: number;\n }) {\n this.update({ lastFetchedBlockNumbers });\n this.hub.emit('incomingTransactionBlock', blockNumber);\n }\n\n private generateDappSuggestedGasFees(\n txParams: TransactionParams,\n origin?: string,\n ): DappSuggestedGasFees | undefined {\n if (!origin || origin === ORIGIN_METAMASK) {\n return undefined;\n }\n\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas, gas } = txParams;\n\n if (\n gasPrice === undefined &&\n maxFeePerGas === undefined &&\n maxPriorityFeePerGas === undefined &&\n gas === undefined\n ) {\n return undefined;\n }\n\n const dappSuggestedGasFees: DappSuggestedGasFees = {};\n\n if (gasPrice !== undefined) {\n dappSuggestedGasFees.gasPrice = gasPrice;\n } else if (\n maxFeePerGas !== undefined ||\n maxPriorityFeePerGas !== undefined\n ) {\n dappSuggestedGasFees.maxFeePerGas = maxFeePerGas;\n dappSuggestedGasFees.maxPriorityFeePerGas = maxPriorityFeePerGas;\n }\n\n if (gas !== undefined) {\n dappSuggestedGasFees.gas = gas;\n }\n\n return dappSuggestedGasFees;\n }\n\n /**\n * Validates and adds external provided transaction to state.\n *\n * @param transactionMeta - Nominated external transaction to be added to state.\n */\n private async addExternalTransaction(transactionMeta: TransactionMeta) {\n const chainId = this.getChainId();\n const { transactions } = this.state;\n const fromAddress = transactionMeta?.txParams?.from;\n const sameFromAndNetworkTransactions = transactions.filter(\n (transaction) =>\n transaction.txParams.from === fromAddress &&\n transaction.chainId === chainId,\n );\n const confirmedTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.confirmed,\n );\n const pendingTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.submitted,\n );\n\n validateConfirmedExternalTransaction(\n transactionMeta,\n confirmedTxs,\n pendingTxs,\n );\n\n // Make sure provided external transaction has non empty history array\n if (!(transactionMeta.history ?? []).length) {\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n }\n\n const updatedTransactions = [...transactions, transactionMeta];\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n /**\n * Sets other txMeta statuses to dropped if the txMeta that has been confirmed has other transactions\n * in the transactions have the same nonce.\n *\n * @param transactionId - Used to identify original transaction.\n */\n private markNonceDuplicatesDropped(transactionId: string) {\n const chainId = this.getChainId();\n const transactionMeta = this.getTransaction(transactionId);\n const nonce = transactionMeta?.txParams?.nonce;\n const from = transactionMeta?.txParams?.from;\n const sameNonceTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.txParams.from === from &&\n transaction.txParams.nonce === nonce &&\n transaction.chainId === chainId,\n );\n\n if (!sameNonceTxs.length) {\n return;\n }\n\n // Mark all same nonce transactions as dropped and give it a replacedBy hash\n for (const transaction of sameNonceTxs) {\n if (transaction.id === transactionId) {\n continue;\n }\n transaction.replacedBy = transactionMeta?.hash;\n transaction.replacedById = transactionMeta?.id;\n // Drop any transaction that wasn't previously failed (off chain failure)\n if (transaction.status !== TransactionStatus.failed) {\n this.setTransactionStatusDropped(transaction);\n }\n }\n }\n\n /**\n * Method to set transaction status to dropped.\n *\n * @param transactionMeta - TransactionMeta of transaction to be marked as dropped.\n */\n private setTransactionStatusDropped(transactionMeta: TransactionMeta) {\n transactionMeta.status = TransactionStatus.dropped;\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#setTransactionStatusDropped - Transaction dropped',\n );\n }\n\n /**\n * Get transaction with provided actionId.\n *\n * @param actionId - Unique ID to prevent duplicate requests\n * @returns the filtered transaction\n */\n private getTransactionWithActionId(actionId?: string) {\n return this.state.transactions.find(\n (transaction) => actionId && transaction.actionId === actionId,\n );\n }\n\n private async waitForTransactionFinished(\n transactionId: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve) => {\n this.hub.once(`${transactionId}:finished`, (txMeta) => {\n resolve(txMeta);\n });\n });\n }\n\n /**\n * Updates the r, s, and v properties of a TransactionMeta object\n * with values from a signed transaction.\n *\n * @param transactionMeta - The TransactionMeta object to update.\n * @param signedTx - The encompassing type for all transaction types containing r, s, and v values.\n */\n private async updateTransactionMetaRSV(\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ): Promise<void> {\n if (signedTx.r) {\n transactionMeta.r = addHexPrefix(signedTx.r.toString(16));\n }\n\n if (signedTx.s) {\n transactionMeta.s = addHexPrefix(signedTx.s.toString(16));\n }\n\n if (signedTx.v) {\n transactionMeta.v = addHexPrefix(signedTx.v.toString(16));\n }\n }\n}\n\nexport default TransactionController;\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionController.js","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hardfork, Common, type ChainConfig } from '@ethereumjs/common';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport type {\n BaseConfig,\n BaseState,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n BNToHex,\n fractionBN,\n hexToBN,\n safelyExecute,\n query,\n NetworkType,\n RPC,\n ApprovalType,\n ORIGIN_METAMASK,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkState,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes, rpcErrors, providerErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport MethodRegistry from 'eth-method-registry';\nimport { addHexPrefix, bufferToHex } from 'ethereumjs-util';\nimport { EventEmitter } from 'events';\nimport { merge, pickBy } from 'lodash';\nimport NonceTracker from 'nonce-tracker';\nimport { v1 as random } from 'uuid';\n\nimport { EtherscanRemoteTransactionSource } from './EtherscanRemoteTransactionSource';\nimport { validateConfirmedExternalTransaction } from './external-transactions';\nimport { addInitialHistorySnapshot, updateTransactionHistory } from './history';\nimport { IncomingTransactionHelper } from './IncomingTransactionHelper';\nimport { determineTransactionType } from './transaction-type';\nimport type {\n DappSuggestedGasFees,\n TransactionParams,\n TransactionMeta,\n TransactionReceipt,\n SendFlowHistoryEntry,\n WalletDevice,\n} from './types';\nimport { TransactionType, TransactionStatus } from './types';\nimport {\n getAndFormatTransactionsForNonceTracker,\n getIncreasedPriceFromExisting,\n normalizeTxParams,\n isEIP1559Transaction,\n isFeeMarketEIP1559Values,\n isGasPriceValue,\n validateGasValues,\n validateIfTransactionUnapproved,\n validateMinimumIncrease,\n validateTxParams,\n ESTIMATE_GAS_ERROR,\n} from './utils';\n\nexport const HARDFORK = Hardfork.London;\n\n/**\n * @type Result\n * @property result - Promise resolving to a new transaction hash\n * @property transactionMeta - Meta information about this new transaction\n */\nexport interface Result {\n result: Promise<string>;\n transactionMeta: TransactionMeta;\n}\n\nexport interface GasPriceValue {\n gasPrice: string;\n}\n\nexport interface FeeMarketEIP1559Values {\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n}\n\n/**\n * @type TransactionConfig\n *\n * Transaction controller configuration\n * @property interval - Polling interval used to fetch new currency rate\n * @property provider - Provider used to create a new underlying EthQuery instance\n * @property sign - Method used to sign transactions\n */\nexport interface TransactionConfig extends BaseConfig {\n interval: number;\n sign?: (txParams: TransactionParams, from: string) => Promise<any>;\n txHistoryLimit: number;\n}\n\n/**\n * @type MethodData\n *\n * Method data registry object\n * @property registryMethod - Registry method raw string\n * @property parsedRegistryMethod - Registry method object, containing name and method arguments\n */\nexport interface MethodData {\n registryMethod: string;\n parsedRegistryMethod: Record<string, unknown>;\n}\n\n/**\n * @type TransactionState\n *\n * Transaction controller state\n * @property transactions - A list of TransactionMeta objects\n * @property methodData - Object containing all known method data information\n */\nexport interface TransactionState extends BaseState {\n transactions: TransactionMeta[];\n methodData: { [key: string]: MethodData };\n lastFetchedBlockNumbers: { [key: string]: number };\n}\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during cancellation\n */\nexport const CANCEL_RATE = 1.5;\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during speed up\n */\nexport const SPEED_UP_RATE = 1.1;\n\n/**\n * The name of the {@link TransactionController}.\n */\nconst controllerName = 'TransactionController';\n\n/**\n * The external actions available to the {@link TransactionController}.\n */\ntype AllowedActions = AddApprovalRequest;\n\n/**\n * The messenger of the {@link TransactionController}.\n */\nexport type TransactionControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AllowedActions,\n never,\n AllowedActions['type'],\n never\n>;\n\n/**\n * Controller responsible for submitting and managing transactions.\n */\nexport class TransactionController extends BaseController<\n TransactionConfig,\n TransactionState\n> {\n private ethQuery: EthQuery;\n\n private readonly isHistoryDisabled: boolean;\n\n private readonly isSendFlowHistoryDisabled: boolean;\n\n private readonly nonceTracker: NonceTracker;\n\n private registry: any;\n\n private readonly provider: Provider;\n\n private handle?: ReturnType<typeof setTimeout>;\n\n private readonly mutex = new Mutex();\n\n private readonly getNetworkState: () => NetworkState;\n\n private readonly getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;\n\n private readonly getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;\n\n private readonly messagingSystem: TransactionControllerMessenger;\n\n private readonly incomingTransactionHelper: IncomingTransactionHelper;\n\n private failTransaction(transactionMeta: TransactionMeta, error: Error) {\n const newTransactionMeta = {\n ...transactionMeta,\n error,\n status: TransactionStatus.failed,\n };\n this.updateTransaction(\n newTransactionMeta,\n 'TransactionController#failTransaction - Add error message and set status to failed',\n );\n this.hub.emit(`${transactionMeta.id}:finished`, newTransactionMeta);\n }\n\n private async registryLookup(fourBytePrefix: string): Promise<MethodData> {\n const registryMethod = await this.registry.lookup(fourBytePrefix);\n const parsedRegistryMethod = this.registry.parse(registryMethod);\n return { registryMethod, parsedRegistryMethod };\n }\n\n /**\n * EventEmitter instance used to listen to specific transactional events\n */\n hub = new EventEmitter();\n\n /**\n * Name of this controller used during composition\n */\n override name = 'TransactionController';\n\n /**\n * Method used to sign transactions\n */\n sign?: (\n transaction: TypedTransaction,\n from: string,\n ) => Promise<TypedTransaction>;\n\n /**\n * Creates a TransactionController instance.\n *\n * @param options - The controller options.\n * @param options.blockTracker - The block tracker used to poll for new blocks data.\n * @param options.disableHistory - Whether to disable storing history in transaction metadata.\n * @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.\n * @param options.getCurrentAccountEIP1559Compatibility - Whether or not the account supports EIP-1559.\n * @param options.getCurrentNetworkEIP1559Compatibility - Whether or not the network supports EIP-1559.\n * @param options.getNetworkState - Gets the state of the network controller.\n * @param options.getSelectedAddress - Gets the address of the currently selected account.\n * @param options.incomingTransactions - Configuration options for incoming transaction support.\n * @param options.incomingTransactions.includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @param options.incomingTransactions.isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @param options.incomingTransactions.queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @param options.incomingTransactions.updateTransactions - Whether to update local transactions using remote transaction data.\n * @param options.messenger - The controller messenger.\n * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.\n * @param options.provider - The provider used to create the underlying EthQuery instance.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n blockTracker,\n disableHistory,\n disableSendFlowHistory,\n getCurrentAccountEIP1559Compatibility,\n getCurrentNetworkEIP1559Compatibility,\n getNetworkState,\n getSelectedAddress,\n incomingTransactions = {},\n messenger,\n onNetworkStateChange,\n provider,\n }: {\n blockTracker: BlockTracker;\n disableHistory: boolean;\n disableSendFlowHistory: boolean;\n getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;\n getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;\n getNetworkState: () => NetworkState;\n getSelectedAddress: () => string;\n incomingTransactions: {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n };\n messenger: TransactionControllerMessenger;\n onNetworkStateChange: (listener: (state: NetworkState) => void) => void;\n provider: Provider;\n },\n config?: Partial<TransactionConfig>,\n state?: Partial<TransactionState>,\n ) {\n super(config, state);\n\n this.defaultConfig = {\n interval: 15000,\n txHistoryLimit: 40,\n };\n\n this.defaultState = {\n methodData: {},\n transactions: [],\n lastFetchedBlockNumbers: {},\n };\n\n this.initialize();\n\n this.provider = provider;\n this.messagingSystem = messenger;\n this.getNetworkState = getNetworkState;\n this.ethQuery = new EthQuery(provider);\n this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;\n this.isHistoryDisabled = disableHistory ?? false;\n this.registry = new MethodRegistry({ provider });\n this.getCurrentAccountEIP1559Compatibility =\n getCurrentAccountEIP1559Compatibility;\n this.getCurrentNetworkEIP1559Compatibility =\n getCurrentNetworkEIP1559Compatibility;\n\n this.nonceTracker = new NonceTracker({\n provider,\n blockTracker,\n getPendingTransactions: (address) =>\n getAndFormatTransactionsForNonceTracker(\n address,\n TransactionStatus.submitted,\n this.state.transactions,\n ),\n getConfirmedTransactions: (address) =>\n getAndFormatTransactionsForNonceTracker(\n address,\n TransactionStatus.confirmed,\n this.state.transactions,\n ),\n });\n\n this.incomingTransactionHelper = new IncomingTransactionHelper({\n blockTracker,\n getCurrentAccount: getSelectedAddress,\n getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,\n getNetworkState,\n isEnabled: incomingTransactions.isEnabled,\n queryEntireHistory: incomingTransactions.queryEntireHistory,\n remoteTransactionSource: new EtherscanRemoteTransactionSource({\n includeTokenTransfers: incomingTransactions.includeTokenTransfers,\n }),\n transactionLimit: this.config.txHistoryLimit,\n updateTransactions: incomingTransactions.updateTransactions,\n });\n\n this.incomingTransactionHelper.hub.on(\n 'transactions',\n this.onIncomingTransactions.bind(this),\n );\n\n this.incomingTransactionHelper.hub.on(\n 'updatedLastFetchedBlockNumbers',\n this.onUpdatedLastFetchedBlockNumbers.bind(this),\n );\n\n onNetworkStateChange(() => {\n this.ethQuery = new EthQuery(this.provider);\n this.registry = new MethodRegistry({ provider: this.provider });\n });\n\n this.poll();\n }\n\n /**\n * Starts a new polling interval.\n *\n * @param interval - The polling interval used to fetch new transaction statuses.\n */\n async poll(interval?: number): Promise<void> {\n interval && this.configure({ interval }, false, false);\n this.handle && clearTimeout(this.handle);\n await safelyExecute(() => this.queryTransactionStatuses());\n this.handle = setTimeout(() => {\n this.poll(this.config.interval);\n }, this.config.interval);\n }\n\n /**\n * Handle new method data request.\n *\n * @param fourBytePrefix - The method prefix.\n * @returns The method data object corresponding to the given signature prefix.\n */\n async handleMethodData(fourBytePrefix: string): Promise<MethodData> {\n const releaseLock = await this.mutex.acquire();\n try {\n const { methodData } = this.state;\n const knownMethod = Object.keys(methodData).find(\n (knownFourBytePrefix) => fourBytePrefix === knownFourBytePrefix,\n );\n if (knownMethod) {\n return methodData[fourBytePrefix];\n }\n const registry = await this.registryLookup(fourBytePrefix);\n this.update({\n methodData: { ...methodData, ...{ [fourBytePrefix]: registry } },\n });\n return registry;\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Add a new unapproved transaction to state. Parameters will be validated, a\n * unique transaction id will be generated, and gas and gasPrice will be calculated\n * if not provided. If A `<tx.id>:unapproved` hub event will be emitted once added.\n *\n * @param txParams - Standard parameters for an Ethereum transaction.\n * @param opts - Additional options to control how the transaction is added.\n * @param opts.actionId - Unique ID to prevent duplicate requests.\n * @param opts.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.\n * @param opts.origin - The origin of the transaction request, such as a dApp hostname.\n * @param opts.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.\n * @param opts.securityAlertResponse - Response from security validator.\n * @param opts.sendFlowHistory - The sendFlowHistory entries to add.\n * @param opts.type - Type of transaction to add, such as 'cancel' or 'swap'.\n * @returns Object containing a promise resolving to the transaction hash if approved.\n */\n async addTransaction(\n txParams: TransactionParams,\n {\n actionId,\n deviceConfirmedOn,\n origin,\n requireApproval,\n securityAlertResponse,\n sendFlowHistory,\n type,\n }: {\n actionId?: string;\n deviceConfirmedOn?: WalletDevice;\n origin?: string;\n requireApproval?: boolean | undefined;\n securityAlertResponse?: Record<string, unknown>;\n sendFlowHistory?: SendFlowHistoryEntry[];\n type?: TransactionType;\n } = {},\n ): Promise<Result> {\n const chainId = this.getChainId();\n const { transactions } = this.state;\n txParams = normalizeTxParams(txParams);\n const isEIP1559Compatible = await this.getEIP1559Compatibility();\n validateTxParams(txParams, isEIP1559Compatible);\n\n const dappSuggestedGasFees = this.generateDappSuggestedGasFees(\n txParams,\n origin,\n );\n\n const transactionType =\n type ?? (await determineTransactionType(txParams, this.ethQuery)).type;\n\n const existingTransactionMeta = this.getTransactionWithActionId(actionId);\n // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.\n const transactionMeta: TransactionMeta = existingTransactionMeta || {\n // Add actionId to txMeta to check if same actionId is seen again\n actionId,\n chainId,\n dappSuggestedGasFees,\n deviceConfirmedOn,\n id: random(),\n origin,\n securityAlertResponse,\n status: TransactionStatus.unapproved as TransactionStatus.unapproved,\n time: Date.now(),\n txParams,\n userEditedGasLimit: false,\n verifiedOnBlockchain: false,\n type: transactionType,\n };\n\n try {\n const { gas, estimateGasError } = await this.estimateGas(txParams);\n txParams.gas = gas;\n txParams.estimateGasError = estimateGasError;\n transactionMeta.originalGasEstimate = gas;\n } catch (error: any) {\n this.failTransaction(transactionMeta, error);\n return Promise.reject(error);\n }\n\n // Checks if a transaction already exists with a given actionId\n if (!existingTransactionMeta) {\n if (!this.isSendFlowHistoryDisabled) {\n transactionMeta.sendFlowHistory = sendFlowHistory ?? [];\n }\n // Initial history push\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n transactions.push(transactionMeta);\n this.update({\n transactions: this.trimTransactionsForState(transactions),\n });\n this.hub.emit(`unapprovedTransaction`, transactionMeta);\n }\n\n return {\n result: this.processApproval(transactionMeta, {\n isExisting: Boolean(existingTransactionMeta),\n requireApproval,\n }),\n transactionMeta,\n };\n }\n\n startIncomingTransactionPolling() {\n this.incomingTransactionHelper.start();\n }\n\n stopIncomingTransactionPolling() {\n this.incomingTransactionHelper.stop();\n }\n\n async updateIncomingTransactions() {\n await this.incomingTransactionHelper.update();\n }\n\n /**\n * Creates approvals for all unapproved transactions persisted.\n */\n initApprovals() {\n const chainId = this.getChainId();\n const unapprovedTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.status === TransactionStatus.unapproved &&\n transaction.chainId === chainId,\n );\n\n for (const txMeta of unapprovedTxs) {\n this.processApproval(txMeta, {\n shouldShowRequest: false,\n }).catch((error) => {\n /* istanbul ignore next */\n console.error('Error during persisted transaction approval', error);\n });\n }\n }\n\n /**\n * Attempts to cancel a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n * @param gasValues - The gas values to use for the cancellation transaction.\n * @param options - The options for the cancellation transaction.\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async stopTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n { estimatedBaseFee }: { estimatedBaseFee?: string } = {},\n ) {\n if (gasValues) {\n validateGasValues(gasValues);\n }\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n if (!transactionMeta) {\n return;\n }\n\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n CANCEL_RATE,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n CANCEL_RATE,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n CANCEL_RATE,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const txParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: 2,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n }\n : {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(txParams);\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n const rawTx = bufferToHex(signedTx.serialize());\n await query(this.ethQuery, 'sendRawTransaction', [rawTx]);\n transactionMeta.estimatedBaseFee = estimatedBaseFee;\n transactionMeta.status = TransactionStatus.cancelled;\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n }\n\n /**\n * Attempts to speed up a transaction increasing transaction gasPrice by ten percent.\n *\n * @param transactionId - The ID of the transaction to speed up.\n * @param gasValues - The gas values to use for the speed up transaction.\n * @param options - The options for the speed up transaction.\n * @param options.actionId - Unique ID to prevent duplicate requests\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async speedUpTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n {\n actionId,\n estimatedBaseFee,\n }: { actionId?: string; estimatedBaseFee?: string } = {},\n ) {\n // If transaction is found for same action id, do not create a new speed up transaction.\n if (this.getTransactionWithActionId(actionId)) {\n return;\n }\n\n if (gasValues) {\n validateGasValues(gasValues);\n }\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n /* istanbul ignore next */\n if (!transactionMeta) {\n return;\n }\n\n /* istanbul ignore next */\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n const { transactions } = this.state;\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n SPEED_UP_RATE,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n SPEED_UP_RATE,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n SPEED_UP_RATE,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const txParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: 2,\n }\n : {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(txParams);\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n const rawTx = bufferToHex(signedTx.serialize());\n const hash = await query(this.ethQuery, 'sendRawTransaction', [rawTx]);\n const baseTransactionMeta = {\n ...transactionMeta,\n estimatedBaseFee,\n id: random(),\n time: Date.now(),\n hash,\n actionId,\n originalGasEstimate: transactionMeta.txParams.gas,\n type: TransactionType.retry,\n };\n const newTransactionMeta =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n },\n }\n : {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n gasPrice: newGasPrice,\n },\n };\n transactions.push(newTransactionMeta);\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n this.hub.emit(`${transactionMeta.id}:speedup`, newTransactionMeta);\n }\n\n /**\n * Estimates required gas for a given transaction.\n *\n * @param transaction - The transaction to estimate gas for.\n * @returns The gas and gas price.\n */\n async estimateGas(transaction: TransactionParams) {\n const estimatedTransaction = { ...transaction };\n const {\n gas,\n gasPrice: providedGasPrice,\n to,\n value,\n data,\n } = estimatedTransaction;\n const gasPrice =\n typeof providedGasPrice === 'undefined'\n ? await query(this.ethQuery, 'gasPrice')\n : providedGasPrice;\n const { providerConfig } = this.getNetworkState();\n const isCustomNetwork = providerConfig.type === NetworkType.rpc;\n // 1. If gas is already defined on the transaction, use it\n if (typeof gas !== 'undefined') {\n return { gas, gasPrice };\n }\n const { gasLimit } = await query(this.ethQuery, 'getBlockByNumber', [\n 'latest',\n false,\n ]);\n\n // 2. If to is not defined or this is not a contract address, and there is no data use 0x5208 / 21000.\n // If the network is a custom network then bypass this check and fetch 'estimateGas'.\n /* istanbul ignore next */\n const code = to ? await query(this.ethQuery, 'getCode', [to]) : undefined;\n /* istanbul ignore next */\n if (\n !isCustomNetwork &&\n (!to || (to && !data && (!code || code === '0x')))\n ) {\n return { gas: '0x5208', gasPrice };\n }\n\n // if data, should be hex string format\n estimatedTransaction.data = !data\n ? data\n : /* istanbul ignore next */ addHexPrefix(data);\n\n // 3. If this is a contract address, safely estimate gas using RPC\n estimatedTransaction.value =\n typeof value === 'undefined' ? '0x0' : /* istanbul ignore next */ value;\n const gasLimitBN = hexToBN(gasLimit);\n estimatedTransaction.gas = BNToHex(fractionBN(gasLimitBN, 19, 20));\n\n let gasHex;\n let estimateGasError;\n try {\n gasHex = await query(this.ethQuery, 'estimateGas', [\n estimatedTransaction,\n ]);\n } catch (error) {\n estimateGasError = ESTIMATE_GAS_ERROR;\n }\n // 4. Pad estimated gas without exceeding the most recent block gasLimit. If the network is a\n // a custom network then return the eth_estimateGas value.\n const gasBN = hexToBN(gasHex);\n const maxGasBN = gasLimitBN.muln(0.9);\n const paddedGasBN = gasBN.muln(1.5);\n /* istanbul ignore next */\n if (gasBN.gt(maxGasBN) || isCustomNetwork) {\n return { gas: addHexPrefix(gasHex), gasPrice, estimateGasError };\n }\n\n /* istanbul ignore next */\n if (paddedGasBN.lt(maxGasBN)) {\n return {\n gas: addHexPrefix(BNToHex(paddedGasBN)),\n gasPrice,\n estimateGasError,\n };\n }\n return { gas: addHexPrefix(BNToHex(maxGasBN)), gasPrice, estimateGasError };\n }\n\n /**\n * Check the status of submitted transactions on the network to determine whether they have\n * been included in a block. Any that have been included in a block are marked as confirmed.\n */\n async queryTransactionStatuses() {\n const { transactions } = this.state;\n const currentChainId = this.getChainId();\n let gotUpdates = false;\n await safelyExecute(() =>\n Promise.all(\n transactions.map(async (meta, index) => {\n if (!meta.verifiedOnBlockchain && meta.chainId === currentChainId) {\n const [reconciledTx, updateRequired] =\n await this.blockchainTransactionStateReconciler(meta);\n if (updateRequired) {\n transactions[index] = reconciledTx;\n gotUpdates = updateRequired;\n }\n }\n }),\n ),\n );\n\n /* istanbul ignore else */\n if (gotUpdates) {\n this.update({\n transactions: this.trimTransactionsForState(transactions),\n });\n }\n }\n\n /**\n * Updates an existing transaction in state.\n *\n * @param transactionMeta - The new transaction to store in state.\n * @param note - A note or update reason to include in the transaction history.\n */\n updateTransaction(transactionMeta: TransactionMeta, note: string) {\n const { transactions } = this.state;\n transactionMeta.txParams = normalizeTxParams(transactionMeta.txParams);\n validateTxParams(transactionMeta.txParams);\n if (!this.isHistoryDisabled) {\n updateTransactionHistory(transactionMeta, note);\n }\n const index = transactions.findIndex(({ id }) => transactionMeta.id === id);\n transactions[index] = transactionMeta;\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Removes all transactions from state, optionally based on the current network.\n *\n * @param ignoreNetwork - Determines whether to wipe all transactions, or just those on the\n * current network. If `true`, all transactions are wiped.\n * @param address - If specified, only transactions originating from this address will be\n * wiped on current network.\n */\n wipeTransactions(ignoreNetwork?: boolean, address?: string) {\n /* istanbul ignore next */\n if (ignoreNetwork && !address) {\n this.update({ transactions: [] });\n return;\n }\n const currentChainId = this.getChainId();\n const newTransactions = this.state.transactions.filter(\n ({ chainId, txParams }) => {\n const isMatchingNetwork = ignoreNetwork || chainId === currentChainId;\n\n if (!isMatchingNetwork) {\n return true;\n }\n\n const isMatchingAddress =\n !address || txParams.from?.toLowerCase() === address.toLowerCase();\n\n return !isMatchingAddress;\n },\n );\n\n this.update({\n transactions: this.trimTransactionsForState(newTransactions),\n });\n }\n\n startIncomingTransactionProcessing() {\n this.incomingTransactionHelper.start();\n }\n\n stopIncomingTransactionProcessing() {\n this.incomingTransactionHelper.stop();\n }\n\n /**\n * Adds external provided transaction to state as confirmed transaction.\n *\n * @param transactionMeta - TransactionMeta to add transactions.\n * @param transactionReceipt - TransactionReceipt of the external transaction.\n * @param baseFeePerGas - Base fee per gas of the external transaction.\n */\n async confirmExternalTransaction(\n transactionMeta: TransactionMeta,\n transactionReceipt: TransactionReceipt,\n baseFeePerGas: Hex,\n ) {\n // Run validation and add external transaction to state.\n this.addExternalTransaction(transactionMeta);\n\n try {\n const transactionId = transactionMeta.id;\n\n // Make sure status is confirmed and define gasUsed as in receipt.\n transactionMeta.status = TransactionStatus.confirmed;\n transactionMeta.txReceipt = transactionReceipt;\n if (baseFeePerGas) {\n transactionMeta.baseFeePerGas = baseFeePerGas;\n }\n\n // Update same nonce local transactions as dropped and define replacedBy properties.\n this.markNonceDuplicatesDropped(transactionId);\n\n // Update external provided transaction with updated gas values and confirmed status.\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:confirmExternalTransaction - Add external transaction',\n );\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * Append new send flow history to a transaction.\n *\n * @param transactionID - The ID of the transaction to update.\n * @param currentSendFlowHistoryLength - The length of the current sendFlowHistory array.\n * @param sendFlowHistoryToAdd - The sendFlowHistory entries to add.\n * @returns The updated transactionMeta.\n */\n updateTransactionSendFlowHistory(\n transactionID: string,\n currentSendFlowHistoryLength: number,\n sendFlowHistoryToAdd: SendFlowHistoryEntry[],\n ): TransactionMeta {\n if (this.isSendFlowHistoryDisabled) {\n throw new Error(\n 'Send flow history is disabled for the current transaction controller',\n );\n }\n\n const transactionMeta = this.getTransaction(transactionID);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update send flow history as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionSendFlowHistory',\n );\n\n if (\n currentSendFlowHistoryLength ===\n (transactionMeta?.sendFlowHistory?.length || 0)\n ) {\n transactionMeta.sendFlowHistory = [\n ...(transactionMeta?.sendFlowHistory ?? []),\n ...sendFlowHistoryToAdd,\n ];\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:updateTransactionSendFlowHistory - sendFlowHistory updated',\n );\n }\n\n return this.getTransaction(transactionID) as TransactionMeta;\n }\n\n /**\n * Update the gas values of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param gasValues - Gas values to update.\n * @param gasValues.gas - Same as transaction.gasLimit.\n * @param gasValues.gasLimit - Maxmimum number of units of gas to use for this transaction.\n * @param gasValues.gasPrice - Price per gas for legacy transactions.\n * @param gasValues.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @param gasValues.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param gasValues.estimateUsed - Which estimate level was used.\n * @param gasValues.estimateSuggested - Which estimate level that the API suggested.\n * @param gasValues.defaultGasEstimates - The default estimate for gas.\n * @param gasValues.originalGasEstimate - Original estimate for gas.\n * @param gasValues.userEditedGasLimit - The gas limit supplied by user.\n * @param gasValues.userFeeLevel - Estimate level user selected.\n * @returns The updated transactionMeta.\n */\n updateTransactionGasFees(\n transactionId: string,\n {\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n }: {\n defaultGasEstimates?: string;\n estimateUsed?: string;\n estimateSuggested?: string;\n gas?: string;\n gasLimit?: string;\n gasPrice?: string;\n maxPriorityFeePerGas?: string;\n maxFeePerGas?: string;\n originalGasEstimate?: string;\n userEditedGasLimit?: boolean;\n userFeeLevel?: string;\n },\n ): TransactionMeta {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update transaction as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionGasFees',\n );\n\n let transactionGasFees = {\n txParams: {\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n },\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n } as any;\n\n // only update what is defined\n transactionGasFees.txParams = pickBy(transactionGasFees.txParams);\n transactionGasFees = pickBy(transactionGasFees);\n\n // merge updated gas values with existing transaction meta\n const updatedMeta = merge(transactionMeta, transactionGasFees);\n\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updateTransactionGasFees - gas values updated',\n );\n\n return this.getTransaction(transactionId) as TransactionMeta;\n }\n\n private async processApproval(\n transactionMeta: TransactionMeta,\n {\n isExisting = false,\n requireApproval,\n shouldShowRequest = true,\n }: {\n isExisting?: boolean;\n requireApproval?: boolean | undefined;\n shouldShowRequest?: boolean;\n },\n ): Promise<string> {\n const transactionId = transactionMeta.id;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n const { meta, isCompleted } = this.isTransactionCompleted(transactionId);\n const finishedPromise = isCompleted\n ? Promise.resolve(meta)\n : this.waitForTransactionFinished(transactionId);\n\n if (meta && !isExisting && !isCompleted) {\n try {\n if (requireApproval !== false) {\n const acceptResult = await this.requestApproval(transactionMeta, {\n shouldShowRequest,\n });\n resultCallbacks = acceptResult.resultCallbacks;\n }\n\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n\n if (!isTxCompleted) {\n await this.approveTransaction(transactionId);\n }\n } catch (error: any) {\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n if (!isTxCompleted) {\n if (error.code === errorCodes.provider.userRejectedRequest) {\n this.cancelTransaction(transactionId);\n\n throw providerErrors.userRejectedRequest(\n 'User rejected the transaction',\n );\n } else {\n this.failTransaction(meta, error);\n }\n }\n }\n }\n\n const finalMeta = await finishedPromise;\n\n switch (finalMeta?.status) {\n case TransactionStatus.failed:\n resultCallbacks?.error(finalMeta.error);\n throw rpcErrors.internal(finalMeta.error.message);\n\n case TransactionStatus.cancelled:\n const cancelError = rpcErrors.internal(\n 'User cancelled the transaction',\n );\n\n resultCallbacks?.error(cancelError);\n throw cancelError;\n\n case TransactionStatus.submitted:\n resultCallbacks?.success();\n return finalMeta.hash as string;\n\n default:\n const internalError = rpcErrors.internal(\n `MetaMask Tx Signature: Unknown problem: ${JSON.stringify(\n finalMeta || transactionId,\n )}`,\n );\n\n resultCallbacks?.error(internalError);\n throw internalError;\n }\n }\n\n /**\n * Approves a transaction and updates it's status in state. If this is not a\n * retry transaction, a nonce will be generated. The transaction is signed\n * using the sign configuration property, then published to the blockchain.\n * A `<tx.id>:finished` hub event is fired after success or failure.\n *\n * @param transactionId - The ID of the transaction to approve.\n */\n private async approveTransaction(transactionId: string) {\n const { transactions } = this.state;\n const releaseLock = await this.mutex.acquire();\n const chainId = this.getChainId();\n const index = transactions.findIndex(({ id }) => transactionId === id);\n const transactionMeta = transactions[index];\n const {\n txParams: { nonce, from },\n } = transactionMeta;\n let nonceLock;\n try {\n if (!this.sign) {\n releaseLock();\n this.failTransaction(\n transactionMeta,\n new Error('No sign method defined.'),\n );\n return;\n } else if (!chainId) {\n releaseLock();\n this.failTransaction(transactionMeta, new Error('No chainId defined.'));\n return;\n }\n\n const { approved: status } = TransactionStatus;\n let nonceToUse = nonce;\n // if a nonce already exists on the transactionMeta it means this is a speedup or cancel transaction\n // so we want to reuse that nonce and hope that it beats the previous attempt to chain. Otherwise use a new locked nonce\n if (!nonceToUse) {\n nonceLock = await this.nonceTracker.getNonceLock(from);\n nonceToUse = addHexPrefix(nonceLock.nextNonce.toString(16));\n }\n\n transactionMeta.status = status;\n transactionMeta.txParams.nonce = nonceToUse;\n transactionMeta.txParams.chainId = chainId;\n\n const baseTxParams = {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n };\n\n const isEIP1559 = isEIP1559Transaction(transactionMeta.txParams);\n\n const txParams = isEIP1559\n ? {\n ...baseTxParams,\n maxFeePerGas: transactionMeta.txParams.maxFeePerGas,\n maxPriorityFeePerGas: transactionMeta.txParams.maxPriorityFeePerGas,\n estimatedBaseFee: transactionMeta.txParams.estimatedBaseFee,\n // specify type 2 if maxFeePerGas and maxPriorityFeePerGas are set\n type: 2,\n }\n : baseTxParams;\n\n // delete gasPrice if maxFeePerGas and maxPriorityFeePerGas are set\n if (isEIP1559) {\n delete txParams.gasPrice;\n }\n\n const unsignedEthTx = this.prepareUnsignedEthTx(txParams);\n const signedTx = await this.sign(unsignedEthTx, from);\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n transactionMeta.status = TransactionStatus.signed;\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction signed',\n );\n\n const rawTx = bufferToHex(signedTx.serialize());\n transactionMeta.rawTx = rawTx;\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - RawTransaction added',\n );\n const hash = await query(this.ethQuery, 'sendRawTransaction', [rawTx]);\n transactionMeta.hash = hash;\n transactionMeta.status = TransactionStatus.submitted;\n transactionMeta.submittedTime = new Date().getTime();\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction submitted',\n );\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n } catch (error: any) {\n this.failTransaction(transactionMeta, error);\n } finally {\n // must set transaction to submitted/failed before releasing lock\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n releaseLock();\n }\n }\n\n /**\n * Cancels a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n */\n private cancelTransaction(transactionId: string) {\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n if (!transactionMeta) {\n return;\n }\n transactionMeta.status = TransactionStatus.rejected;\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n const transactions = this.state.transactions.filter(\n ({ id }) => id !== transactionId,\n );\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Trim the amount of transactions that are set on the state. Checks\n * if the length of the tx history is longer then desired persistence\n * limit and then if it is removes the oldest confirmed or rejected tx.\n * Pending or unapproved transactions will not be removed by this\n * operation. For safety of presenting a fully functional transaction UI\n * representation, this function will not break apart transactions with the\n * same nonce, created on the same day, per network. Not accounting for transactions of the same\n * nonce, same day and network combo can result in confusing or broken experiences\n * in the UI. The transactions are then updated using the BaseController update.\n *\n * @param transactions - The transactions to be applied to the state.\n * @returns The trimmed list of transactions.\n */\n private trimTransactionsForState(\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const nonceNetworkSet = new Set();\n\n const txsToKeep = transactions\n .sort((a, b) => (a.time > b.time ? -1 : 1)) // Descending time order\n .filter((tx) => {\n const { chainId, status, txParams, time } = tx;\n\n if (txParams) {\n const key = `${txParams.nonce}-${convertHexToDecimal(\n chainId,\n )}-${new Date(time).toDateString()}`;\n\n if (nonceNetworkSet.has(key)) {\n return true;\n } else if (\n nonceNetworkSet.size < this.config.txHistoryLimit ||\n !this.isFinalState(status)\n ) {\n nonceNetworkSet.add(key);\n return true;\n }\n }\n\n return false;\n });\n\n txsToKeep.reverse(); // Ascending time order\n return txsToKeep;\n }\n\n /**\n * Determines if the transaction is in a final state.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isFinalState(status: TransactionStatus): boolean {\n return (\n status === TransactionStatus.rejected ||\n status === TransactionStatus.confirmed ||\n status === TransactionStatus.failed ||\n status === TransactionStatus.cancelled\n );\n }\n\n /**\n * Whether the transaction has at least completed all local processing.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isLocalFinalState(status: TransactionStatus): boolean {\n return [\n TransactionStatus.cancelled,\n TransactionStatus.confirmed,\n TransactionStatus.failed,\n TransactionStatus.rejected,\n TransactionStatus.submitted,\n ].includes(status);\n }\n\n /**\n * Method to verify the state of a transaction using the Blockchain as a source of truth.\n *\n * @param meta - The local transaction to verify on the blockchain.\n * @returns A tuple containing the updated transaction, and whether or not an update was required.\n */\n private async blockchainTransactionStateReconciler(\n meta: TransactionMeta,\n ): Promise<[TransactionMeta, boolean]> {\n const { status, hash } = meta;\n switch (status) {\n case TransactionStatus.confirmed:\n const txReceipt = await query(this.ethQuery, 'getTransactionReceipt', [\n hash,\n ]);\n\n if (!txReceipt) {\n return [meta, false];\n }\n\n const txBlock = await query(this.ethQuery, 'getBlockByHash', [\n txReceipt.blockHash,\n ]);\n\n meta.verifiedOnBlockchain = true;\n meta.txParams.gasUsed = txReceipt.gasUsed;\n meta.txReceipt = txReceipt;\n meta.baseFeePerGas = txBlock?.baseFeePerGas;\n meta.blockTimestamp = txBlock?.timestamp;\n\n // According to the Web3 docs:\n // TRUE if the transaction was successful, FALSE if the EVM reverted the transaction.\n if (Number(txReceipt.status) === 0) {\n const error: Error = new Error(\n 'Transaction failed. The transaction was reversed',\n );\n this.failTransaction(meta, error);\n return [meta, false];\n }\n\n return [meta, true];\n case TransactionStatus.submitted:\n const txObj = await query(this.ethQuery, 'getTransactionByHash', [\n hash,\n ]);\n\n if (!txObj) {\n const receiptShowsFailedStatus =\n await this.checkTxReceiptStatusIsFailed(hash);\n\n // Case the txObj is evaluated as false, a second check will\n // determine if the tx failed or it is pending or confirmed\n if (receiptShowsFailedStatus) {\n const error: Error = new Error(\n 'Transaction failed. The transaction was dropped or replaced by a new one',\n );\n this.failTransaction(meta, error);\n }\n }\n\n /* istanbul ignore next */\n if (txObj?.blockNumber) {\n meta.status = TransactionStatus.confirmed;\n this.hub.emit(`${meta.id}:confirmed`, meta);\n return [meta, true];\n }\n\n return [meta, false];\n default:\n return [meta, false];\n }\n }\n\n /**\n * Method to check if a tx has failed according to their receipt\n * According to the Web3 docs:\n * TRUE if the transaction was successful, FALSE if the EVM reverted the transaction.\n * The receipt is not available for pending transactions and returns null.\n *\n * @param txHash - The transaction hash.\n * @returns Whether the transaction has failed.\n */\n private async checkTxReceiptStatusIsFailed(\n txHash: string | undefined,\n ): Promise<boolean> {\n const txReceipt = await query(this.ethQuery, 'getTransactionReceipt', [\n txHash,\n ]);\n if (!txReceipt) {\n // Transaction is pending\n return false;\n }\n return Number(txReceipt.status) === 0;\n }\n\n private async requestApproval(\n txMeta: TransactionMeta,\n { shouldShowRequest }: { shouldShowRequest: boolean },\n ): Promise<AddResult> {\n const id = this.getApprovalId(txMeta);\n const { origin } = txMeta;\n const type = ApprovalType.Transaction;\n const requestData = { txId: txMeta.id };\n\n return (await this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin || ORIGIN_METAMASK,\n type,\n requestData,\n expectsResult: true,\n },\n shouldShowRequest,\n )) as Promise<AddResult>;\n }\n\n private getTransaction(transactionId: string): TransactionMeta | undefined {\n const { transactions } = this.state;\n return transactions.find(({ id }) => id === transactionId);\n }\n\n private getApprovalId(txMeta: TransactionMeta) {\n return String(txMeta.id);\n }\n\n private isTransactionCompleted(transactionId: string): {\n meta?: TransactionMeta;\n isCompleted: boolean;\n } {\n const transaction = this.getTransaction(transactionId);\n\n if (!transaction) {\n return { meta: undefined, isCompleted: false };\n }\n\n const isCompleted = this.isLocalFinalState(transaction.status);\n\n return { meta: transaction, isCompleted };\n }\n\n private getChainId(): Hex {\n const { providerConfig } = this.getNetworkState();\n return providerConfig.chainId;\n }\n\n private prepareUnsignedEthTx(\n txParams: Record<string, unknown>,\n ): TypedTransaction {\n return TransactionFactory.fromTxData(txParams, {\n common: this.getCommonConfiguration(),\n freeze: false,\n });\n }\n\n /**\n * `@ethereumjs/tx` uses `@ethereumjs/common` as a configuration tool for\n * specifying which chain, network, hardfork and EIPs to support for\n * a transaction. By referencing this configuration, and analyzing the fields\n * specified in txParams, @ethereumjs/tx is able to determine which EIP-2718\n * transaction type to use.\n *\n * @returns common configuration object\n */\n private getCommonConfiguration(): Common {\n const {\n providerConfig: { type: chain, chainId, nickname: name },\n } = this.getNetworkState();\n\n if (\n chain !== RPC &&\n chain !== NetworkType['linea-goerli'] &&\n chain !== NetworkType['linea-mainnet']\n ) {\n return new Common({ chain, hardfork: HARDFORK });\n }\n\n const customChainParams: Partial<ChainConfig> = {\n name,\n chainId: parseInt(chainId, 16),\n defaultHardfork: HARDFORK,\n };\n\n return Common.custom(customChainParams);\n }\n\n private onIncomingTransactions({\n added,\n updated,\n }: {\n added: TransactionMeta[];\n updated: TransactionMeta[];\n }) {\n const { transactions: currentTransactions } = this.state;\n\n const updatedTransactions = [\n ...added,\n ...currentTransactions.map((originalTransaction) => {\n const updatedTransaction = updated.find(\n ({ hash }) => hash === originalTransaction.hash,\n );\n\n return updatedTransaction ?? originalTransaction;\n }),\n ];\n\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n private onUpdatedLastFetchedBlockNumbers({\n lastFetchedBlockNumbers,\n blockNumber,\n }: {\n lastFetchedBlockNumbers: {\n [key: string]: number;\n };\n blockNumber: number;\n }) {\n this.update({ lastFetchedBlockNumbers });\n this.hub.emit('incomingTransactionBlock', blockNumber);\n }\n\n private generateDappSuggestedGasFees(\n txParams: TransactionParams,\n origin?: string,\n ): DappSuggestedGasFees | undefined {\n if (!origin || origin === ORIGIN_METAMASK) {\n return undefined;\n }\n\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas, gas } = txParams;\n\n if (\n gasPrice === undefined &&\n maxFeePerGas === undefined &&\n maxPriorityFeePerGas === undefined &&\n gas === undefined\n ) {\n return undefined;\n }\n\n const dappSuggestedGasFees: DappSuggestedGasFees = {};\n\n if (gasPrice !== undefined) {\n dappSuggestedGasFees.gasPrice = gasPrice;\n } else if (\n maxFeePerGas !== undefined ||\n maxPriorityFeePerGas !== undefined\n ) {\n dappSuggestedGasFees.maxFeePerGas = maxFeePerGas;\n dappSuggestedGasFees.maxPriorityFeePerGas = maxPriorityFeePerGas;\n }\n\n if (gas !== undefined) {\n dappSuggestedGasFees.gas = gas;\n }\n\n return dappSuggestedGasFees;\n }\n\n /**\n * Validates and adds external provided transaction to state.\n *\n * @param transactionMeta - Nominated external transaction to be added to state.\n */\n private async addExternalTransaction(transactionMeta: TransactionMeta) {\n const chainId = this.getChainId();\n const { transactions } = this.state;\n const fromAddress = transactionMeta?.txParams?.from;\n const sameFromAndNetworkTransactions = transactions.filter(\n (transaction) =>\n transaction.txParams.from === fromAddress &&\n transaction.chainId === chainId,\n );\n const confirmedTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.confirmed,\n );\n const pendingTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.submitted,\n );\n\n validateConfirmedExternalTransaction(\n transactionMeta,\n confirmedTxs,\n pendingTxs,\n );\n\n // Make sure provided external transaction has non empty history array\n if (!(transactionMeta.history ?? []).length) {\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n }\n\n const updatedTransactions = [...transactions, transactionMeta];\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n /**\n * Sets other txMeta statuses to dropped if the txMeta that has been confirmed has other transactions\n * in the transactions have the same nonce.\n *\n * @param transactionId - Used to identify original transaction.\n */\n private markNonceDuplicatesDropped(transactionId: string) {\n const chainId = this.getChainId();\n const transactionMeta = this.getTransaction(transactionId);\n const nonce = transactionMeta?.txParams?.nonce;\n const from = transactionMeta?.txParams?.from;\n const sameNonceTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.txParams.from === from &&\n transaction.txParams.nonce === nonce &&\n transaction.chainId === chainId,\n );\n\n if (!sameNonceTxs.length) {\n return;\n }\n\n // Mark all same nonce transactions as dropped and give it a replacedBy hash\n for (const transaction of sameNonceTxs) {\n if (transaction.id === transactionId) {\n continue;\n }\n transaction.replacedBy = transactionMeta?.hash;\n transaction.replacedById = transactionMeta?.id;\n // Drop any transaction that wasn't previously failed (off chain failure)\n if (transaction.status !== TransactionStatus.failed) {\n this.setTransactionStatusDropped(transaction);\n }\n }\n }\n\n /**\n * Method to set transaction status to dropped.\n *\n * @param transactionMeta - TransactionMeta of transaction to be marked as dropped.\n */\n private setTransactionStatusDropped(transactionMeta: TransactionMeta) {\n transactionMeta.status = TransactionStatus.dropped;\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#setTransactionStatusDropped - Transaction dropped',\n );\n }\n\n /**\n * Get transaction with provided actionId.\n *\n * @param actionId - Unique ID to prevent duplicate requests\n * @returns the filtered transaction\n */\n private getTransactionWithActionId(actionId?: string) {\n return this.state.transactions.find(\n (transaction) => actionId && transaction.actionId === actionId,\n );\n }\n\n private async waitForTransactionFinished(\n transactionId: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve) => {\n this.hub.once(`${transactionId}:finished`, (txMeta) => {\n resolve(txMeta);\n });\n });\n }\n\n /**\n * Updates the r, s, and v properties of a TransactionMeta object\n * with values from a signed transaction.\n *\n * @param transactionMeta - The TransactionMeta object to update.\n * @param signedTx - The encompassing type for all transaction types containing r, s, and v values.\n */\n private async updateTransactionMetaRSV(\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ): Promise<void> {\n if (signedTx.r) {\n transactionMeta.r = addHexPrefix(signedTx.r.toString(16));\n }\n\n if (signedTx.s) {\n transactionMeta.s = addHexPrefix(signedTx.s.toString(16));\n }\n\n if (signedTx.v) {\n transactionMeta.v = addHexPrefix(signedTx.v.toString(16));\n }\n }\n\n private async getEIP1559Compatibility() {\n const currentNetworkIsEIP1559Compatible =\n await this.getCurrentNetworkEIP1559Compatibility();\n const currentAccountIsEIP1559Compatible =\n this.getCurrentAccountEIP1559Compatibility?.() ?? true;\n\n return (\n currentNetworkIsEIP1559Compatible && currentAccountIsEIP1559Compatible\n );\n }\n}\n\nexport default TransactionController;\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateConfirmedExternalTransaction = void 0;
|
|
4
4
|
// These utility functions are exclusively used by `confirmExternalTransaction` method in controller
|
|
5
|
-
const
|
|
5
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
6
6
|
const types_1 = require("./types");
|
|
7
7
|
/**
|
|
8
8
|
* Validates the external provided transaction meta.
|
|
@@ -13,22 +13,22 @@ const types_1 = require("./types");
|
|
|
13
13
|
*/
|
|
14
14
|
function validateConfirmedExternalTransaction(transactionMeta, confirmedTxs, pendingTxs) {
|
|
15
15
|
if (!transactionMeta || !transactionMeta.txParams) {
|
|
16
|
-
throw
|
|
16
|
+
throw rpc_errors_1.rpcErrors.invalidParams('"transactionMeta" or "transactionMeta.txParams" is missing');
|
|
17
17
|
}
|
|
18
18
|
if (transactionMeta.status !== types_1.TransactionStatus.confirmed) {
|
|
19
|
-
throw
|
|
19
|
+
throw rpc_errors_1.rpcErrors.invalidParams('External transaction status should be "confirmed"');
|
|
20
20
|
}
|
|
21
21
|
const externalTxNonce = transactionMeta.txParams.nonce;
|
|
22
22
|
if (pendingTxs && pendingTxs.length > 0) {
|
|
23
23
|
const foundPendingTxByNonce = pendingTxs.find((tx) => { var _a; return ((_a = tx.txParams) === null || _a === void 0 ? void 0 : _a.nonce) === externalTxNonce; });
|
|
24
24
|
if (foundPendingTxByNonce) {
|
|
25
|
-
throw
|
|
25
|
+
throw rpc_errors_1.rpcErrors.invalidParams('External transaction nonce should not be in pending txs');
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
if (confirmedTxs && confirmedTxs.length > 0) {
|
|
29
29
|
const foundConfirmedTxByNonce = confirmedTxs.find((tx) => { var _a; return ((_a = tx.txParams) === null || _a === void 0 ? void 0 : _a.nonce) === externalTxNonce; });
|
|
30
30
|
if (foundConfirmedTxByNonce) {
|
|
31
|
-
throw
|
|
31
|
+
throw rpc_errors_1.rpcErrors.invalidParams('External transaction nonce should not be in confirmed txs');
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-transactions.js","sourceRoot":"","sources":["../src/external-transactions.ts"],"names":[],"mappings":";;;AAAA,oGAAoG;AACpG,
|
|
1
|
+
{"version":3,"file":"external-transactions.js","sourceRoot":"","sources":["../src/external-transactions.ts"],"names":[],"mappings":";;;AAAA,oGAAoG;AACpG,qDAAiD;AAEjD,mCAA4C;AAG5C;;;;;;GAMG;AACH,SAAgB,oCAAoC,CAClD,eAAiC,EACjC,YAAgC,EAChC,UAA8B;IAE9B,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;QACjD,MAAM,sBAAS,CAAC,aAAa,CAC3B,4DAA4D,CAC7D,CAAC;KACH;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,yBAAiB,CAAC,SAAS,EAAE;QAC1D,MAAM,sBAAS,CAAC,aAAa,CAC3B,mDAAmD,CACpD,CAAC;KACH;IAED,MAAM,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;IACvD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;QACvC,MAAM,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAC3C,CAAC,EAAE,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,EAAE,CAAC,QAAQ,0CAAE,KAAK,MAAK,eAAe,CAAA,EAAA,CAC/C,CAAC;QACF,IAAI,qBAAqB,EAAE;YACzB,MAAM,sBAAS,CAAC,aAAa,CAC3B,yDAAyD,CAC1D,CAAC;SACH;KACF;IAED,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3C,MAAM,uBAAuB,GAAG,YAAY,CAAC,IAAI,CAC/C,CAAC,EAAE,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,EAAE,CAAC,QAAQ,0CAAE,KAAK,MAAK,eAAe,CAAA,EAAA,CAC/C,CAAC;QACF,IAAI,uBAAuB,EAAE;YAC3B,MAAM,sBAAS,CAAC,aAAa,CAC3B,2DAA2D,CAC5D,CAAC;SACH;KACF;AACH,CAAC;AAvCD,oFAuCC","sourcesContent":["// These utility functions are exclusively used by `confirmExternalTransaction` method in controller\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { TransactionStatus } from './types';\nimport type { TransactionMeta } from './types';\n\n/**\n * Validates the external provided transaction meta.\n *\n * @param transactionMeta - The transaction meta to validate.\n * @param confirmedTxs - The confirmed transactions in controller state.\n * @param pendingTxs - The submitted transactions in controller state.\n */\nexport function validateConfirmedExternalTransaction(\n transactionMeta?: TransactionMeta,\n confirmedTxs?: TransactionMeta[],\n pendingTxs?: TransactionMeta[],\n) {\n if (!transactionMeta || !transactionMeta.txParams) {\n throw rpcErrors.invalidParams(\n '\"transactionMeta\" or \"transactionMeta.txParams\" is missing',\n );\n }\n\n if (transactionMeta.status !== TransactionStatus.confirmed) {\n throw rpcErrors.invalidParams(\n 'External transaction status should be \"confirmed\"',\n );\n }\n\n const externalTxNonce = transactionMeta.txParams.nonce;\n if (pendingTxs && pendingTxs.length > 0) {\n const foundPendingTxByNonce = pendingTxs.find(\n (tx) => tx.txParams?.nonce === externalTxNonce,\n );\n if (foundPendingTxByNonce) {\n throw rpcErrors.invalidParams(\n 'External transaction nonce should not be in pending txs',\n );\n }\n }\n\n if (confirmedTxs && confirmedTxs.length > 0) {\n const foundConfirmedTxByNonce = confirmedTxs.find(\n (tx) => tx.txParams?.nonce === externalTxNonce,\n );\n if (foundConfirmedTxByNonce) {\n throw rpcErrors.invalidParams(\n 'External transaction nonce should not be in confirmed txs',\n );\n }\n }\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -357,6 +357,11 @@ export interface TransactionParams {
|
|
|
357
357
|
* Value associated with this transaction.
|
|
358
358
|
*/
|
|
359
359
|
value?: string;
|
|
360
|
+
/**
|
|
361
|
+
* Type of transaction.
|
|
362
|
+
* 0x0 indicates a legacy transaction.
|
|
363
|
+
*/
|
|
364
|
+
type?: string;
|
|
360
365
|
}
|
|
361
366
|
/**
|
|
362
367
|
* Standard data concerning a transaction processed by the blockchain.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;GAEG;AACH,oBAAY,eAAe,GACvB,CAAC;IACC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAC9D,GAAG,mBAAmB,CAAC,GACxB,CAAC;IAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,mBAAmB,CAAC,CAAC;AAE/E;;GAEG;AACH,aAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,EAAE,GAAG,CAAC;IAEb;;OAEG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,iBAAiB,CAAC,EAAE,YAAY,CAAC;IAEjC;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhD;;;OAGG;IACH,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAEzC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,mBAAmB,CAAC,EAAE;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B;;OAEG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IAEvB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,oBAAY,iBAAiB;IAC3B,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,UAAU,eAAe;CAC1B;AAED;;GAEG;AACH,oBAAY,YAAY;IACtB,SAAS,oBAAoB;IAC7B,YAAY,uBAAuB;IACnC,KAAK,iBAAiB;CACvB;AAED;;GAEG;AACH,oBAAY,eAAe;IACzB;;OAEG;IACH,MAAM,WAAW;IAEjB;;;;OAIG;IACH,mBAAmB,wBAAwB;IAE3C;;OAEG;IACH,cAAc,uBAAuB;IAErC;;OAEG;IACH,UAAU,gBAAgB;IAE1B;;OAEG;IACH,yBAAyB,+BAA+B;IAExD;;OAEG;IACH,QAAQ,aAAa;IAErB;;OAEG;IACH,YAAY,kBAAkB;IAE9B;;;;;OAKG;IACH,KAAK,UAAU;IAEf;;OAEG;IACH,UAAU,eAAe;IAEzB;;OAEG;IACH,IAAI,aAAa;IAEjB;;OAEG;IACH,aAAa,sBAAsB;IAEnC;;OAEG;IACH,KAAK,UAAU;IAEf;;OAEG;IACH,IAAI,SAAS;IAEb;;;;;OAKG;IACH,YAAY,iBAAiB;IAE7B;;;OAGG;IACH,kBAAkB,YAAY;IAE9B;;;;;OAKG;IACH,2BAA2B,qBAAqB;IAEhD;;;OAGG;IACH,mBAAmB,aAAa;IAEhC;;;;OAIG;IACH,uBAAuB,iBAAiB;IAExC;;;OAGG;IACH,4BAA4B,sBAAsB;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAwNA;;;;GAIG;AACH,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IAC3B,0CAAqB,CAAA;IACrB,4CAAuB,CAAA;IACvB,4CAAuB,CAAA;IACvB,wCAAmB,CAAA;IACnB,sCAAiB,CAAA;IACjB,0CAAqB,CAAA;IACrB,sCAAiB,CAAA;IACjB,4CAAuB,CAAA;IACvB,8CAAyB,CAAA;AAC3B,CAAC,EAVW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAU5B;AAED;;GAEG;AACH,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,6CAA6B,CAAA;IAC7B,mDAAmC,CAAA;IACnC,sCAAsB,CAAA;AACxB,CAAC,EAJW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAIvB;AAED;;GAEG;AACH,IAAY,eA+GX;AA/GD,WAAY,eAAe;IACzB;;OAEG;IACH,oCAAiB,CAAA;IAEjB;;;;OAIG;IACH,8DAA2C,CAAA;IAE3C;;OAEG;IACH,wDAAqC,CAAA;IAErC;;OAEG;IACH,6CAA0B,CAAA;IAE1B;;OAEG;IACH,2EAAwD,CAAA;IAExD;;OAEG;IACH,wCAAqB,CAAA;IAErB;;OAEG;IACH,iDAA8B,CAAA;IAE9B;;;;;OAKG;IACH,kCAAe,CAAA;IAEf;;OAEG;IACH,4CAAyB,CAAA;IAEzB;;OAEG;IACH,oCAAiB,CAAA;IAEjB;;OAEG;IACH,sDAAmC,CAAA;IAEnC;;OAEG;IACH,kCAAe,CAAA;IAEf;;OAEG;IACH,gCAAa,CAAA;IAEb;;;;;OAKG;IACH,gDAA6B,CAAA;IAE7B;;;OAGG;IACH,iDAA8B,CAAA;IAE9B;;;;;OAKG;IACH,mEAAgD,CAAA;IAEhD;;;OAGG;IACH,mDAAgC,CAAA;IAEhC;;;;OAIG;IACH,2DAAwC,CAAA;IAExC;;;OAGG;IACH,qEAAkD,CAAA;AACpD,CAAC,EA/GW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QA+G1B","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport type { Operation } from 'fast-json-patch';\n\n/**\n * Representation of transaction metadata.\n */\nexport type TransactionMeta =\n | ({\n status: Exclude<TransactionStatus, TransactionStatus.failed>;\n } & TransactionMetaBase)\n | ({ status: TransactionStatus.failed; error: Error } & TransactionMetaBase);\n\n/**\n * Information about a single transaction such as status and block number.\n */\ntype TransactionMetaBase = {\n /**\n * Unique ID to prevent duplicate requests.\n */\n actionId?: string;\n\n /**\n * Base fee of the block as a hex value, introduced in EIP-1559.\n */\n baseFeePerGas?: Hex;\n\n /**\n * Number of the block where the transaction has been included.\n */\n blockNumber?: string;\n\n /**\n * The timestamp for when the block was collated.\n */\n blockTimestamp?: string;\n\n /**\n * Network code as per EIP-155 for this transaction.\n */\n chainId: Hex;\n\n /**\n * Gas values provided by the dApp.\n */\n dappSuggestedGasFees?: DappSuggestedGasFees;\n\n /**\n * The default estimate for gas.\n */\n defaultGasEstimates?: string;\n\n /**\n * String to indicate what device the transaction was confirmed on.\n */\n deviceConfirmedOn?: WalletDevice;\n\n /**\n * The estimated base fee of the transaction.\n */\n estimatedBaseFee?: string;\n\n /**\n * Which estimate level that the API suggested.\n */\n estimateSuggested?: string;\n\n /**\n * Which estimate level was used\n */\n estimateUsed?: string;\n\n /**\n * A hex string of the transaction hash, used to identify the transaction on the network.\n */\n hash?: string;\n\n /**\n * A history of mutations to TransactionMeta.\n */\n history?: TransactionHistory;\n\n /**\n * Generated UUID associated with this transaction.\n */\n id: string;\n\n /**\n * Whether the transaction is a transfer.\n */\n isTransfer?: boolean;\n\n /**\n * Network code as per EIP-155 for this transaction\n *\n * @deprecated Use `chainId` instead.\n */\n readonly networkID?: string;\n\n /**\n * Origin this transaction was sent from.\n */\n origin?: string;\n\n /**\n * The original gas estimation of the transaction.\n */\n originalGasEstimate?: string;\n\n /**\n * The transaction's 'r' value as a hex string.\n */\n r?: string;\n\n /**\n * Hex representation of the underlying transaction.\n */\n rawTx?: string;\n\n /**\n * When the transaction is dropped, this is the replacement transaction hash.\n */\n replacedBy?: string;\n\n /**\n * When the transaction is dropped, this is the replacement transaction ID.\n */\n replacedById?: string;\n\n /**\n * The transaction's 's' value as a hex string.\n */\n s?: string;\n\n /**\n * Response from security validator.\n */\n securityAlertResponse?: Record<string, unknown>;\n\n /**\n * An array of entries that describe the user's journey through the send flow.\n * This is purely attached to state logs for troubleshooting and support.\n */\n sendFlowHistory?: SendFlowHistoryEntry[];\n\n /**\n * The time the transaction was submitted to the network, in Unix epoch time (ms).\n */\n submittedTime?: number;\n\n /**\n * Timestamp associated with this transaction.\n */\n time: number;\n\n /**\n * Whether transaction recipient is a smart contract.\n */\n toSmartContract?: boolean;\n\n /**\n * Additional transfer information.\n */\n transferInformation?: {\n contractAddress: string;\n decimals: number;\n symbol: string;\n };\n\n /**\n * Underlying Transaction object.\n */\n txParams: TransactionParams;\n\n /**\n * Transaction receipt.\n */\n txReceipt?: TransactionReceipt;\n\n /**\n * The type of transaction such as `cancel` or `swap`.\n */\n type?: TransactionType;\n\n /**\n * The gas limit supplied by user.\n */\n userEditedGasLimit?: boolean;\n\n /**\n * Estimate level user selected.\n */\n userFeeLevel?: string;\n\n /**\n * The transaction's 'v' value as a hex string.\n */\n v?: string;\n\n /**\n * Whether the transaction is verified on the blockchain.\n */\n verifiedOnBlockchain?: boolean;\n};\n\nexport type SendFlowHistoryEntry = {\n /**\n * String to indicate user interaction information.\n */\n entry: string;\n\n /**\n * Timestamp associated with this entry.\n */\n timestamp: number;\n};\n\n/**\n * The status of the transaction. Each status represents the state of the transaction internally\n * in the wallet. Some of these correspond with the state of the transaction on the network, but\n * some are wallet-specific.\n */\nexport enum TransactionStatus {\n approved = 'approved',\n cancelled = 'cancelled',\n confirmed = 'confirmed',\n dropped = 'dropped',\n failed = 'failed',\n rejected = 'rejected',\n signed = 'signed',\n submitted = 'submitted',\n unapproved = 'unapproved',\n}\n\n/**\n * Options for wallet device.\n */\nexport enum WalletDevice {\n MM_MOBILE = 'metamask_mobile',\n MM_EXTENSION = 'metamask_extension',\n OTHER = 'other_device',\n}\n\n/**\n * The type of the transaction.\n */\nexport enum TransactionType {\n /**\n * A transaction sending a network's native asset to a recipient.\n */\n cancel = 'cancel',\n\n /**\n * A transaction that is interacting with a smart contract's methods that we\n * have not treated as a special case, such as approve, transfer, and\n * transferfrom.\n */\n contractInteraction = 'contractInteraction',\n\n /**\n * A transaction that deployed a smart contract.\n */\n deployContract = 'contractDeployment',\n\n /**\n * A transaction for Ethereum decryption.\n */\n ethDecrypt = 'eth_decrypt',\n\n /**\n * A transaction for getting an encryption public key.\n */\n ethGetEncryptionPublicKey = 'eth_getEncryptionPublicKey',\n\n /**\n * An incoming (deposit) transaction.\n */\n incoming = 'incoming',\n\n /**\n * A transaction for personal sign.\n */\n personalSign = 'personal_sign',\n\n /**\n * When a transaction is failed it can be retried by\n * resubmitting the same transaction with a higher gas fee. This type is also used\n * to speed up pending transactions. This is accomplished by creating a new tx with\n * the same nonce and higher gas fees.\n */\n retry = 'retry',\n\n /**\n * A transaction sending a network's native asset to a recipient.\n */\n simpleSend = 'simpleSend',\n\n /**\n * A transaction that is signing a message.\n */\n sign = 'eth_sign',\n\n /**\n * A transaction that is signing typed data.\n */\n signTypedData = 'eth_signTypedData',\n\n /**\n * A transaction sending a network's native asset to a recipient.\n */\n smart = 'smart',\n\n /**\n * A transaction swapping one token for another through MetaMask Swaps.\n */\n swap = 'swap',\n\n /**\n * Similar to the approve type, a swap approval is a special case of ERC20\n * approve method that requests an allowance of the token to spend on behalf\n * of the user for the MetaMask Swaps contract. The first swap for any token\n * will have an accompanying swapApproval transaction.\n */\n swapApproval = 'swapApproval',\n\n /**\n * A token transaction requesting an allowance of the token to spend on\n * behalf of the user.\n */\n tokenMethodApprove = 'approve',\n\n /**\n * A token transaction transferring tokens from an account that the sender\n * has an allowance of. The method is prefixed with safe because when calling\n * this method the contract checks to ensure that the receiver is an address\n * capable of handling the token being sent.\n */\n tokenMethodSafeTransferFrom = 'safetransferfrom',\n\n /**\n * A token transaction where the user is sending tokens that they own to\n * another address.\n */\n tokenMethodTransfer = 'transfer',\n\n /**\n * A token transaction transferring tokens from an account that the sender\n * has an allowance of. For more information on allowances, see the approve\n * type.\n */\n tokenMethodTransferFrom = 'transferfrom',\n\n /**\n * A token transaction requesting an allowance of all of a user's tokens to\n * spend on behalf of the user.\n */\n tokenMethodSetApprovalForAll = 'setapprovalforall',\n}\n\n/**\n * Standard data concerning a transaction to be processed by the blockchain.\n */\nexport interface TransactionParams {\n /**\n * Network ID as per EIP-155.\n */\n chainId?: Hex;\n\n /**\n * Data to pass with this transaction.\n */\n data?: string;\n\n /**\n * Error message for gas estimation failure.\n */\n estimateGasError?: string;\n\n /**\n * Estimated base fee for this transaction.\n */\n estimatedBaseFee?: string;\n\n /**\n * Address to send this transaction from.\n */\n from: string;\n\n /**\n * same as gasLimit?\n */\n gas?: string;\n\n /**\n * Maxmimum number of units of gas to use for this transaction.\n */\n gasLimit?: string;\n\n /**\n * Price per gas for legacy txs\n */\n gasPrice?: string;\n\n /**\n * Gas used in the transaction.\n */\n gasUsed?: string;\n\n /**\n * Maximum amount per gas to pay for the transaction, including the priority\n * fee.\n */\n maxFeePerGas?: string;\n\n /**\n * Maximum amount per gas to give to validator as incentive.\n */\n maxPriorityFeePerGas?: string;\n\n /**\n * Unique number to prevent replay attacks.\n */\n nonce?: string;\n\n /**\n * Address to send this transaction to.\n */\n to?: string;\n\n /**\n * Value associated with this transaction.\n */\n value?: string;\n}\n\n/**\n * Standard data concerning a transaction processed by the blockchain.\n */\nexport interface TransactionReceipt {\n /**\n * The block hash of the block that this transaction was included in.\n */\n blockHash?: string;\n\n /**\n * The block number of the block that this transaction was included in.\n */\n blockNumber?: string;\n\n /**\n * Effective gas price the transaction was charged at.\n */\n effectiveGasPrice?: string;\n\n /**\n * Gas used in the transaction.\n */\n gasUsed?: string;\n\n /**\n * Total used gas in hex.\n */\n l1Fee?: string;\n\n /**\n * All the logs emitted by this transaction.\n */\n logs?: Log[];\n\n /**\n * The status of the transaction.\n */\n status?: string;\n\n /**\n * The index of this transaction in the list of transactions included in the block this transaction was mined in.\n */\n transactionIndex?: number;\n}\n\n/**\n * Represents an event that has been included in a transaction using the EVM `LOG` opcode.\n */\nexport interface Log {\n /**\n * Address of the contract that generated log.\n */\n address?: string;\n /**\n * List of topics for log.\n */\n topics?: string;\n}\n\n/**\n * The configuration required to fetch transaction data from a RemoteTransactionSource.\n */\nexport interface RemoteTransactionSourceRequest {\n /**\n * The address of the account to fetch transactions for.\n */\n address: string;\n\n /**\n * The chainId of the current network.\n */\n currentChainId: Hex;\n\n /**\n * Block number to start fetching transactions from.\n */\n fromBlock?: number;\n\n /**\n * Maximum number of transactions to retrieve.\n */\n limit?: number;\n}\n\n/**\n * An object capable of fetching transaction data from a remote source.\n * Used by the IncomingTransactionHelper to retrieve remote transaction data.\n */\nexport interface RemoteTransactionSource {\n /**\n * @param chainId - The chainId of the current network.\n * @returns Whether the remote transaction source supports the specified network.\n */\n isSupportedNetwork: (chainId: Hex) => boolean;\n\n /**\n * @returns An array of additional keys to use when caching the last fetched block number.\n */\n getLastBlockVariations?: () => string[];\n\n /**\n * @param request - A request object containing data such as the address and chain ID.\n * @returns An array of transaction metadata for the retrieved transactions.\n */\n fetchTransactions: (\n request: RemoteTransactionSourceRequest,\n ) => Promise<TransactionMeta[]>;\n}\n\n/**\n * Gas values initially suggested by the dApp.\n */\nexport interface DappSuggestedGasFees {\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n}\n\n/**\n * A transaction history operation that includes a note and timestamp.\n */\ntype ExtendedHistoryOperation = Operation & {\n note?: string;\n timestamp?: number;\n};\n\n/**\n * A transaction history entry that includes the ExtendedHistoryOperation as the first element.\n */\nexport type TransactionHistoryEntry = [\n ExtendedHistoryOperation,\n ...Operation[],\n];\n\n/**\n * A transaction history that includes the transaction meta as the first element.\n * And the rest of the elements are the operation arrays that were applied to the transaction meta.\n */\nexport type TransactionHistory = [\n TransactionMeta,\n ...TransactionHistoryEntry[],\n];\n\n/**\n * Result of inferring the transaction type.\n */\nexport type InferTransactionTypeResult = {\n /**\n * The contract code, in hex format if it exists. '0x0' or\n * '0x' are also indicators of non-existent contract code.\n */\n getCodeResponse?: string | null;\n\n /**\n * The type of transaction\n */\n type: TransactionType;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAwNA;;;;GAIG;AACH,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IAC3B,0CAAqB,CAAA;IACrB,4CAAuB,CAAA;IACvB,4CAAuB,CAAA;IACvB,wCAAmB,CAAA;IACnB,sCAAiB,CAAA;IACjB,0CAAqB,CAAA;IACrB,sCAAiB,CAAA;IACjB,4CAAuB,CAAA;IACvB,8CAAyB,CAAA;AAC3B,CAAC,EAVW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAU5B;AAED;;GAEG;AACH,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,6CAA6B,CAAA;IAC7B,mDAAmC,CAAA;IACnC,sCAAsB,CAAA;AACxB,CAAC,EAJW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAIvB;AAED;;GAEG;AACH,IAAY,eA+GX;AA/GD,WAAY,eAAe;IACzB;;OAEG;IACH,oCAAiB,CAAA;IAEjB;;;;OAIG;IACH,8DAA2C,CAAA;IAE3C;;OAEG;IACH,wDAAqC,CAAA;IAErC;;OAEG;IACH,6CAA0B,CAAA;IAE1B;;OAEG;IACH,2EAAwD,CAAA;IAExD;;OAEG;IACH,wCAAqB,CAAA;IAErB;;OAEG;IACH,iDAA8B,CAAA;IAE9B;;;;;OAKG;IACH,kCAAe,CAAA;IAEf;;OAEG;IACH,4CAAyB,CAAA;IAEzB;;OAEG;IACH,oCAAiB,CAAA;IAEjB;;OAEG;IACH,sDAAmC,CAAA;IAEnC;;OAEG;IACH,kCAAe,CAAA;IAEf;;OAEG;IACH,gCAAa,CAAA;IAEb;;;;;OAKG;IACH,gDAA6B,CAAA;IAE7B;;;OAGG;IACH,iDAA8B,CAAA;IAE9B;;;;;OAKG;IACH,mEAAgD,CAAA;IAEhD;;;OAGG;IACH,mDAAgC,CAAA;IAEhC;;;;OAIG;IACH,2DAAwC,CAAA;IAExC;;;OAGG;IACH,qEAAkD,CAAA;AACpD,CAAC,EA/GW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QA+G1B","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport type { Operation } from 'fast-json-patch';\n\n/**\n * Representation of transaction metadata.\n */\nexport type TransactionMeta =\n | ({\n status: Exclude<TransactionStatus, TransactionStatus.failed>;\n } & TransactionMetaBase)\n | ({ status: TransactionStatus.failed; error: Error } & TransactionMetaBase);\n\n/**\n * Information about a single transaction such as status and block number.\n */\ntype TransactionMetaBase = {\n /**\n * Unique ID to prevent duplicate requests.\n */\n actionId?: string;\n\n /**\n * Base fee of the block as a hex value, introduced in EIP-1559.\n */\n baseFeePerGas?: Hex;\n\n /**\n * Number of the block where the transaction has been included.\n */\n blockNumber?: string;\n\n /**\n * The timestamp for when the block was collated.\n */\n blockTimestamp?: string;\n\n /**\n * Network code as per EIP-155 for this transaction.\n */\n chainId: Hex;\n\n /**\n * Gas values provided by the dApp.\n */\n dappSuggestedGasFees?: DappSuggestedGasFees;\n\n /**\n * The default estimate for gas.\n */\n defaultGasEstimates?: string;\n\n /**\n * String to indicate what device the transaction was confirmed on.\n */\n deviceConfirmedOn?: WalletDevice;\n\n /**\n * The estimated base fee of the transaction.\n */\n estimatedBaseFee?: string;\n\n /**\n * Which estimate level that the API suggested.\n */\n estimateSuggested?: string;\n\n /**\n * Which estimate level was used\n */\n estimateUsed?: string;\n\n /**\n * A hex string of the transaction hash, used to identify the transaction on the network.\n */\n hash?: string;\n\n /**\n * A history of mutations to TransactionMeta.\n */\n history?: TransactionHistory;\n\n /**\n * Generated UUID associated with this transaction.\n */\n id: string;\n\n /**\n * Whether the transaction is a transfer.\n */\n isTransfer?: boolean;\n\n /**\n * Network code as per EIP-155 for this transaction\n *\n * @deprecated Use `chainId` instead.\n */\n readonly networkID?: string;\n\n /**\n * Origin this transaction was sent from.\n */\n origin?: string;\n\n /**\n * The original gas estimation of the transaction.\n */\n originalGasEstimate?: string;\n\n /**\n * The transaction's 'r' value as a hex string.\n */\n r?: string;\n\n /**\n * Hex representation of the underlying transaction.\n */\n rawTx?: string;\n\n /**\n * When the transaction is dropped, this is the replacement transaction hash.\n */\n replacedBy?: string;\n\n /**\n * When the transaction is dropped, this is the replacement transaction ID.\n */\n replacedById?: string;\n\n /**\n * The transaction's 's' value as a hex string.\n */\n s?: string;\n\n /**\n * Response from security validator.\n */\n securityAlertResponse?: Record<string, unknown>;\n\n /**\n * An array of entries that describe the user's journey through the send flow.\n * This is purely attached to state logs for troubleshooting and support.\n */\n sendFlowHistory?: SendFlowHistoryEntry[];\n\n /**\n * The time the transaction was submitted to the network, in Unix epoch time (ms).\n */\n submittedTime?: number;\n\n /**\n * Timestamp associated with this transaction.\n */\n time: number;\n\n /**\n * Whether transaction recipient is a smart contract.\n */\n toSmartContract?: boolean;\n\n /**\n * Additional transfer information.\n */\n transferInformation?: {\n contractAddress: string;\n decimals: number;\n symbol: string;\n };\n\n /**\n * Underlying Transaction object.\n */\n txParams: TransactionParams;\n\n /**\n * Transaction receipt.\n */\n txReceipt?: TransactionReceipt;\n\n /**\n * The type of transaction such as `cancel` or `swap`.\n */\n type?: TransactionType;\n\n /**\n * The gas limit supplied by user.\n */\n userEditedGasLimit?: boolean;\n\n /**\n * Estimate level user selected.\n */\n userFeeLevel?: string;\n\n /**\n * The transaction's 'v' value as a hex string.\n */\n v?: string;\n\n /**\n * Whether the transaction is verified on the blockchain.\n */\n verifiedOnBlockchain?: boolean;\n};\n\nexport type SendFlowHistoryEntry = {\n /**\n * String to indicate user interaction information.\n */\n entry: string;\n\n /**\n * Timestamp associated with this entry.\n */\n timestamp: number;\n};\n\n/**\n * The status of the transaction. Each status represents the state of the transaction internally\n * in the wallet. Some of these correspond with the state of the transaction on the network, but\n * some are wallet-specific.\n */\nexport enum TransactionStatus {\n approved = 'approved',\n cancelled = 'cancelled',\n confirmed = 'confirmed',\n dropped = 'dropped',\n failed = 'failed',\n rejected = 'rejected',\n signed = 'signed',\n submitted = 'submitted',\n unapproved = 'unapproved',\n}\n\n/**\n * Options for wallet device.\n */\nexport enum WalletDevice {\n MM_MOBILE = 'metamask_mobile',\n MM_EXTENSION = 'metamask_extension',\n OTHER = 'other_device',\n}\n\n/**\n * The type of the transaction.\n */\nexport enum TransactionType {\n /**\n * A transaction sending a network's native asset to a recipient.\n */\n cancel = 'cancel',\n\n /**\n * A transaction that is interacting with a smart contract's methods that we\n * have not treated as a special case, such as approve, transfer, and\n * transferfrom.\n */\n contractInteraction = 'contractInteraction',\n\n /**\n * A transaction that deployed a smart contract.\n */\n deployContract = 'contractDeployment',\n\n /**\n * A transaction for Ethereum decryption.\n */\n ethDecrypt = 'eth_decrypt',\n\n /**\n * A transaction for getting an encryption public key.\n */\n ethGetEncryptionPublicKey = 'eth_getEncryptionPublicKey',\n\n /**\n * An incoming (deposit) transaction.\n */\n incoming = 'incoming',\n\n /**\n * A transaction for personal sign.\n */\n personalSign = 'personal_sign',\n\n /**\n * When a transaction is failed it can be retried by\n * resubmitting the same transaction with a higher gas fee. This type is also used\n * to speed up pending transactions. This is accomplished by creating a new tx with\n * the same nonce and higher gas fees.\n */\n retry = 'retry',\n\n /**\n * A transaction sending a network's native asset to a recipient.\n */\n simpleSend = 'simpleSend',\n\n /**\n * A transaction that is signing a message.\n */\n sign = 'eth_sign',\n\n /**\n * A transaction that is signing typed data.\n */\n signTypedData = 'eth_signTypedData',\n\n /**\n * A transaction sending a network's native asset to a recipient.\n */\n smart = 'smart',\n\n /**\n * A transaction swapping one token for another through MetaMask Swaps.\n */\n swap = 'swap',\n\n /**\n * Similar to the approve type, a swap approval is a special case of ERC20\n * approve method that requests an allowance of the token to spend on behalf\n * of the user for the MetaMask Swaps contract. The first swap for any token\n * will have an accompanying swapApproval transaction.\n */\n swapApproval = 'swapApproval',\n\n /**\n * A token transaction requesting an allowance of the token to spend on\n * behalf of the user.\n */\n tokenMethodApprove = 'approve',\n\n /**\n * A token transaction transferring tokens from an account that the sender\n * has an allowance of. The method is prefixed with safe because when calling\n * this method the contract checks to ensure that the receiver is an address\n * capable of handling the token being sent.\n */\n tokenMethodSafeTransferFrom = 'safetransferfrom',\n\n /**\n * A token transaction where the user is sending tokens that they own to\n * another address.\n */\n tokenMethodTransfer = 'transfer',\n\n /**\n * A token transaction transferring tokens from an account that the sender\n * has an allowance of. For more information on allowances, see the approve\n * type.\n */\n tokenMethodTransferFrom = 'transferfrom',\n\n /**\n * A token transaction requesting an allowance of all of a user's tokens to\n * spend on behalf of the user.\n */\n tokenMethodSetApprovalForAll = 'setapprovalforall',\n}\n\n/**\n * Standard data concerning a transaction to be processed by the blockchain.\n */\nexport interface TransactionParams {\n /**\n * Network ID as per EIP-155.\n */\n chainId?: Hex;\n\n /**\n * Data to pass with this transaction.\n */\n data?: string;\n\n /**\n * Error message for gas estimation failure.\n */\n estimateGasError?: string;\n\n /**\n * Estimated base fee for this transaction.\n */\n estimatedBaseFee?: string;\n\n /**\n * Address to send this transaction from.\n */\n from: string;\n\n /**\n * same as gasLimit?\n */\n gas?: string;\n\n /**\n * Maxmimum number of units of gas to use for this transaction.\n */\n gasLimit?: string;\n\n /**\n * Price per gas for legacy txs\n */\n gasPrice?: string;\n\n /**\n * Gas used in the transaction.\n */\n gasUsed?: string;\n\n /**\n * Maximum amount per gas to pay for the transaction, including the priority\n * fee.\n */\n maxFeePerGas?: string;\n\n /**\n * Maximum amount per gas to give to validator as incentive.\n */\n maxPriorityFeePerGas?: string;\n\n /**\n * Unique number to prevent replay attacks.\n */\n nonce?: string;\n\n /**\n * Address to send this transaction to.\n */\n to?: string;\n\n /**\n * Value associated with this transaction.\n */\n value?: string;\n\n /**\n * Type of transaction.\n * 0x0 indicates a legacy transaction.\n */\n type?: string;\n}\n\n/**\n * Standard data concerning a transaction processed by the blockchain.\n */\nexport interface TransactionReceipt {\n /**\n * The block hash of the block that this transaction was included in.\n */\n blockHash?: string;\n\n /**\n * The block number of the block that this transaction was included in.\n */\n blockNumber?: string;\n\n /**\n * Effective gas price the transaction was charged at.\n */\n effectiveGasPrice?: string;\n\n /**\n * Gas used in the transaction.\n */\n gasUsed?: string;\n\n /**\n * Total used gas in hex.\n */\n l1Fee?: string;\n\n /**\n * All the logs emitted by this transaction.\n */\n logs?: Log[];\n\n /**\n * The status of the transaction.\n */\n status?: string;\n\n /**\n * The index of this transaction in the list of transactions included in the block this transaction was mined in.\n */\n transactionIndex?: number;\n}\n\n/**\n * Represents an event that has been included in a transaction using the EVM `LOG` opcode.\n */\nexport interface Log {\n /**\n * Address of the contract that generated log.\n */\n address?: string;\n /**\n * List of topics for log.\n */\n topics?: string;\n}\n\n/**\n * The configuration required to fetch transaction data from a RemoteTransactionSource.\n */\nexport interface RemoteTransactionSourceRequest {\n /**\n * The address of the account to fetch transactions for.\n */\n address: string;\n\n /**\n * The chainId of the current network.\n */\n currentChainId: Hex;\n\n /**\n * Block number to start fetching transactions from.\n */\n fromBlock?: number;\n\n /**\n * Maximum number of transactions to retrieve.\n */\n limit?: number;\n}\n\n/**\n * An object capable of fetching transaction data from a remote source.\n * Used by the IncomingTransactionHelper to retrieve remote transaction data.\n */\nexport interface RemoteTransactionSource {\n /**\n * @param chainId - The chainId of the current network.\n * @returns Whether the remote transaction source supports the specified network.\n */\n isSupportedNetwork: (chainId: Hex) => boolean;\n\n /**\n * @returns An array of additional keys to use when caching the last fetched block number.\n */\n getLastBlockVariations?: () => string[];\n\n /**\n * @param request - A request object containing data such as the address and chain ID.\n * @returns An array of transaction metadata for the retrieved transactions.\n */\n fetchTransactions: (\n request: RemoteTransactionSourceRequest,\n ) => Promise<TransactionMeta[]>;\n}\n\n/**\n * Gas values initially suggested by the dApp.\n */\nexport interface DappSuggestedGasFees {\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n}\n\n/**\n * A transaction history operation that includes a note and timestamp.\n */\ntype ExtendedHistoryOperation = Operation & {\n note?: string;\n timestamp?: number;\n};\n\n/**\n * A transaction history entry that includes the ExtendedHistoryOperation as the first element.\n */\nexport type TransactionHistoryEntry = [\n ExtendedHistoryOperation,\n ...Operation[],\n];\n\n/**\n * A transaction history that includes the transaction meta as the first element.\n * And the rest of the elements are the operation arrays that were applied to the transaction meta.\n */\nexport type TransactionHistory = [\n TransactionMeta,\n ...TransactionHistoryEntry[],\n];\n\n/**\n * Result of inferring the transaction type.\n */\nexport type InferTransactionTypeResult = {\n /**\n * The contract code, in hex format if it exists. '0x0' or\n * '0x' are also indicators of non-existent contract code.\n */\n getCodeResponse?: string | null;\n\n /**\n * The type of transaction\n */\n type: TransactionType;\n};\n"]}
|
package/dist/utils.d.ts
CHANGED
|
@@ -15,8 +15,9 @@ export declare function normalizeTxParams(txParams: TransactionParams): Transact
|
|
|
15
15
|
* the event of any validation error.
|
|
16
16
|
*
|
|
17
17
|
* @param txParams - Transaction params object to validate.
|
|
18
|
+
* @param isEIP1559Compatible - whether or not the current network supports EIP-1559 transactions.
|
|
18
19
|
*/
|
|
19
|
-
export declare function validateTxParams(txParams: TransactionParams): void;
|
|
20
|
+
export declare function validateTxParams(txParams: TransactionParams, isEIP1559Compatible?: boolean): void;
|
|
20
21
|
/**
|
|
21
22
|
* Checks if a transaction is EIP-1559 by checking for the existence of
|
|
22
23
|
* maxFeePerGas and maxPriorityFeePerGas within its parameters.
|
|
@@ -24,10 +25,10 @@ export declare function validateTxParams(txParams: TransactionParams): void;
|
|
|
24
25
|
* @param txParams - Transaction params object to add.
|
|
25
26
|
* @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.
|
|
26
27
|
*/
|
|
27
|
-
export declare
|
|
28
|
+
export declare function isEIP1559Transaction(txParams: TransactionParams): boolean;
|
|
28
29
|
export declare const validateGasValues: (gasValues: GasPriceValue | FeeMarketEIP1559Values) => void;
|
|
29
|
-
export declare const isFeeMarketEIP1559Values: (gasValues?: GasPriceValue | FeeMarketEIP1559Values
|
|
30
|
-
export declare const isGasPriceValue: (gasValues?: GasPriceValue | FeeMarketEIP1559Values
|
|
30
|
+
export declare const isFeeMarketEIP1559Values: (gasValues?: GasPriceValue | FeeMarketEIP1559Values) => gasValues is FeeMarketEIP1559Values;
|
|
31
|
+
export declare const isGasPriceValue: (gasValues?: GasPriceValue | FeeMarketEIP1559Values) => gasValues is GasPriceValue;
|
|
31
32
|
export declare const getIncreasedPriceHex: (value: number, rate: number) => string;
|
|
32
33
|
export declare const getIncreasedPriceFromExisting: (value: string | undefined, rate: number) => string;
|
|
33
34
|
/**
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,IAAI,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE9F,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAmBrE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,qBAS5D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAC3B,mBAAmB,UAAO,QAyD3B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAOzE;AAED,eAAO,MAAM,iBAAiB,cACjB,aAAa,GAAG,sBAAsB,SAUlD,CAAC;AAEF,eAAO,MAAM,wBAAwB,eACvB,aAAa,GAAG,sBAAsB,wCAGuB,CAAC;AAE5E,eAAO,MAAM,eAAe,eACd,aAAa,GAAG,sBAAsB,+BAEE,CAAC;AAEvD,eAAO,MAAM,oBAAoB,UAAW,MAAM,QAAQ,MAAM,KAAG,MACF,CAAC;AAElE,eAAO,MAAM,6BAA6B,UACjC,MAAM,GAAG,SAAS,QACnB,MAAM,KACX,MAEF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAQpE;AAED;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CACrD,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,EAAE,eAAe,EAAE,GAC9B,uBAAuB,EAAE,CAsB3B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,QAQf"}
|
package/dist/utils.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateIfTransactionUnapproved = exports.getAndFormatTransactionsForNonceTracker = exports.validateMinimumIncrease = exports.getIncreasedPriceFromExisting = exports.getIncreasedPriceHex = exports.isGasPriceValue = exports.isFeeMarketEIP1559Values = exports.validateGasValues = exports.isEIP1559Transaction = exports.validateTxParams = exports.normalizeTxParams = exports.ESTIMATE_GAS_ERROR = void 0;
|
|
4
4
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
|
+
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
5
6
|
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
6
7
|
const types_1 = require("./types");
|
|
7
8
|
exports.ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';
|
|
@@ -17,6 +18,7 @@ const NORMALIZERS = {
|
|
|
17
18
|
maxFeePerGas: (maxFeePerGas) => (0, ethereumjs_util_1.addHexPrefix)(maxFeePerGas),
|
|
18
19
|
maxPriorityFeePerGas: (maxPriorityFeePerGas) => (0, ethereumjs_util_1.addHexPrefix)(maxPriorityFeePerGas),
|
|
19
20
|
estimatedBaseFee: (maxPriorityFeePerGas) => (0, ethereumjs_util_1.addHexPrefix)(maxPriorityFeePerGas),
|
|
21
|
+
type: (type) => (type === '0x0' ? '0x0' : undefined),
|
|
20
22
|
};
|
|
21
23
|
/**
|
|
22
24
|
* Normalizes properties on transaction params.
|
|
@@ -40,31 +42,35 @@ exports.normalizeTxParams = normalizeTxParams;
|
|
|
40
42
|
* the event of any validation error.
|
|
41
43
|
*
|
|
42
44
|
* @param txParams - Transaction params object to validate.
|
|
45
|
+
* @param isEIP1559Compatible - whether or not the current network supports EIP-1559 transactions.
|
|
43
46
|
*/
|
|
44
|
-
function validateTxParams(txParams) {
|
|
47
|
+
function validateTxParams(txParams, isEIP1559Compatible = true) {
|
|
45
48
|
if (!txParams.from ||
|
|
46
49
|
typeof txParams.from !== 'string' ||
|
|
47
50
|
!(0, controller_utils_1.isValidHexAddress)(txParams.from)) {
|
|
48
|
-
throw
|
|
51
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Invalid "from" address: ${txParams.from} must be a valid string.`);
|
|
52
|
+
}
|
|
53
|
+
if (isEIP1559Transaction(txParams) && !isEIP1559Compatible) {
|
|
54
|
+
throw rpc_errors_1.rpcErrors.invalidParams('Invalid transaction params: params specify an EIP-1559 transaction but the current network does not support EIP-1559');
|
|
49
55
|
}
|
|
50
56
|
if (txParams.to === '0x' || txParams.to === undefined) {
|
|
51
57
|
if (txParams.data) {
|
|
52
58
|
delete txParams.to;
|
|
53
59
|
}
|
|
54
60
|
else {
|
|
55
|
-
throw
|
|
61
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Invalid "to" address: ${txParams.to} must be a valid string.`);
|
|
56
62
|
}
|
|
57
63
|
}
|
|
58
64
|
else if (txParams.to !== undefined && !(0, controller_utils_1.isValidHexAddress)(txParams.to)) {
|
|
59
|
-
throw
|
|
65
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Invalid "to" address: ${txParams.to} must be a valid string.`);
|
|
60
66
|
}
|
|
61
67
|
if (txParams.value !== undefined) {
|
|
62
68
|
const value = txParams.value.toString();
|
|
63
69
|
if (value.includes('-')) {
|
|
64
|
-
throw
|
|
70
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Invalid "value": ${value} is not a positive number.`);
|
|
65
71
|
}
|
|
66
72
|
if (value.includes('.')) {
|
|
67
|
-
throw
|
|
73
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Invalid "value": ${value} number must be denominated in wei.`);
|
|
68
74
|
}
|
|
69
75
|
const intValue = parseInt(txParams.value, 10);
|
|
70
76
|
const isValid = Number.isFinite(intValue) &&
|
|
@@ -72,7 +78,7 @@ function validateTxParams(txParams) {
|
|
|
72
78
|
!isNaN(Number(value)) &&
|
|
73
79
|
Number.isSafeInteger(intValue);
|
|
74
80
|
if (!isValid) {
|
|
75
|
-
throw
|
|
81
|
+
throw rpc_errors_1.rpcErrors.invalidParams(`Invalid "value": ${value} number must be a valid number.`);
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
84
|
}
|
|
@@ -84,11 +90,11 @@ exports.validateTxParams = validateTxParams;
|
|
|
84
90
|
* @param txParams - Transaction params object to add.
|
|
85
91
|
* @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.
|
|
86
92
|
*/
|
|
87
|
-
|
|
93
|
+
function isEIP1559Transaction(txParams) {
|
|
88
94
|
const hasOwnProp = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);
|
|
89
95
|
return (hasOwnProp(txParams, 'maxFeePerGas') &&
|
|
90
96
|
hasOwnProp(txParams, 'maxPriorityFeePerGas'));
|
|
91
|
-
}
|
|
97
|
+
}
|
|
92
98
|
exports.isEIP1559Transaction = isEIP1559Transaction;
|
|
93
99
|
const validateGasValues = (gasValues) => {
|
|
94
100
|
Object.keys(gasValues).forEach((key) => {
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,iEAGoC;AACpC,qDAA4D;AAO5D,mCAA4C;AAG/B,QAAA,kBAAkB,GAAG,kCAAkC,CAAC;AAErE,MAAM,WAAW,GAAgD;IAC/D,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,IAAI,CAAC;IAC1C,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE;IACxD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,GAAG,CAAC;IACvC,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,GAAG,CAAC;IAC5C,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,QAAQ,CAAC;IACtD,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,KAAK,CAAC;IAC7C,EAAE,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,EAAE,CAAC,CAAC,WAAW,EAAE;IAClD,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,KAAK,CAAC;IAC7C,YAAY,EAAE,CAAC,YAAoB,EAAE,EAAE,CAAC,IAAA,8BAAY,EAAC,YAAY,CAAC;IAClE,oBAAoB,EAAE,CAAC,oBAA4B,EAAE,EAAE,CACrD,IAAA,8BAAY,EAAC,oBAAoB,CAAC;IACpC,gBAAgB,EAAE,CAAC,oBAA4B,EAAE,EAAE,CACjD,IAAA,8BAAY,EAAC,oBAAoB,CAAC;CACrC,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,QAA2B;IAC3D,MAAM,kBAAkB,GAAsB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC3D,IAAI,GAA4B,CAAC;IACjC,KAAK,GAAG,IAAI,WAAW,EAAE;QACvB,IAAI,QAAQ,CAAC,GAA8B,CAAC,EAAE;YAC5C,kBAAkB,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAU,CAAC;SACpE;KACF;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AATD,8CASC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,QAA2B;IAC1D,IACE,CAAC,QAAQ,CAAC,IAAI;QACd,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;QACjC,CAAC,IAAA,oCAAiB,EAAC,QAAQ,CAAC,IAAI,CAAC,EACjC;QACA,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,IAAI,0BAA0B,CACnE,CAAC;KACH;IAED,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE;QACrD,IAAI,QAAQ,CAAC,IAAI,EAAE;YACjB,OAAO,QAAQ,CAAC,EAAE,CAAC;SACpB;aAAM;YACL,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,EAAE,0BAA0B,CAC/D,CAAC;SACH;KACF;SAAM,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,IAAA,oCAAiB,EAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACvE,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,EAAE,0BAA0B,CAC/D,CAAC;KACH;IAED,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,4BAA4B,CAAC,CAAC;SACxE;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,IAAI,KAAK,CACb,oBAAoB,KAAK,qCAAqC,CAC/D,CAAC;SACH;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GACX,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;YACvB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CACb,oBAAoB,KAAK,iCAAiC,CAC3D,CAAC;SACH;KACF;AACH,CAAC;AAhDD,4CAgDC;AAED;;;;;;GAMG;AACI,MAAM,oBAAoB,GAAG,CAAC,QAA2B,EAAW,EAAE;IAC3E,MAAM,UAAU,GAAG,CAAC,GAAsB,EAAE,GAAW,EAAE,EAAE,CACzD,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,CACL,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC;QACpC,UAAU,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC7C,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,oBAAoB,wBAO/B;AAEK,MAAM,iBAAiB,GAAG,CAC/B,SAAiD,EACjD,EAAE;IACF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACrC,MAAM,KAAK,GAAI,SAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE;YACpD,MAAM,IAAI,SAAS,CACjB,2BAA2B,GAAG,kBAAkB,KAAK,EAAE,CACxD,CAAC;SACH;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,iBAAiB,qBAW5B;AAEK,MAAM,wBAAwB,GAAG,CACtC,SAAkD,EACb,EAAE,CACvC,CAAC,SAAoC,aAApC,SAAS,uBAAT,SAAS,CAA6B,YAAY,MAAK,SAAS;IACjE,CAAC,SAAoC,aAApC,SAAS,uBAAT,SAAS,CAA6B,oBAAoB,MAAK,SAAS,CAAC;AAJ/D,QAAA,wBAAwB,4BAIuC;AAErE,MAAM,eAAe,GAAG,CAC7B,SAAkD,EACtB,EAAE,CAC9B,CAAC,SAA2B,aAA3B,SAAS,uBAAT,SAAS,CAAoB,QAAQ,MAAK,SAAS,CAAC;AAH1C,QAAA,eAAe,mBAG2B;AAEhD,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE,CAC1E,IAAA,8BAAY,EAAC,GAAG,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AADrD,QAAA,oBAAoB,wBACiC;AAE3D,MAAM,6BAA6B,GAAG,CAC3C,KAAyB,EACzB,IAAY,EACJ,EAAE;IACV,OAAO,IAAA,4BAAoB,EAAC,IAAA,sCAAmB,EAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC,CAAC;AALW,QAAA,6BAA6B,iCAKxC;AAEF;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CAAC,QAAgB,EAAE,GAAW;IACnE,MAAM,eAAe,GAAG,IAAA,sCAAmB,EAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,IAAA,sCAAmB,EAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,eAAe,IAAI,UAAU,EAAE;QACjC,OAAO,QAAQ,CAAC;KACjB;IACD,MAAM,QAAQ,GAAG,uBAAuB,eAAe,6CAA6C,UAAU,EAAE,CAAC;IACjH,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AARD,0DAQC;AAED;;;;;;;GAOG;AACH,SAAgB,uCAAuC,CACrD,WAAmB,EACnB,iBAAoC,EACpC,YAA+B;IAE/B,OAAO,YAAY;SAChB,MAAM,CACL,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CACjC,MAAM,KAAK,iBAAiB;QAC5B,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,CACnD;SACA,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QACzD,4CAA4C;QAC5C,6DAA6D;QAC7D,kDAAkD;QAClD,OAAO;YACL,MAAM;YACN,OAAO,EAAE,CAAC,EAAE,CAAC;YACb,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE;gBAChB,GAAG,EAAE,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE;gBACd,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE;gBAClB,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE;aACnB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AA1BD,0FA0BC;AAED;;;;;;GAMG;AACH,SAAgB,+BAA+B,CAC7C,eAA4C,EAC5C,MAAc;IAEd,IAAI,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,MAAM,MAAK,yBAAiB,CAAC,UAAU,EAAE;QAC5D,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM;2BACF,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,MAAM,EAAE,CAC/C,CAAC;KACH;AACH,CAAC;AAVD,0EAUC","sourcesContent":["import {\n convertHexToDecimal,\n isValidHexAddress,\n} from '@metamask/controller-utils';\nimport { addHexPrefix, isHexString } from 'ethereumjs-util';\nimport type { Transaction as NonceTrackerTransaction } from 'nonce-tracker/dist/NonceTracker';\n\nimport type {\n GasPriceValue,\n FeeMarketEIP1559Values,\n} from './TransactionController';\nimport { TransactionStatus } from './types';\nimport type { TransactionParams, TransactionMeta } from './types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\nconst NORMALIZERS: { [param in keyof TransactionParams]: any } = {\n data: (data: string) => addHexPrefix(data),\n from: (from: string) => addHexPrefix(from).toLowerCase(),\n gas: (gas: string) => addHexPrefix(gas),\n gasLimit: (gas: string) => addHexPrefix(gas),\n gasPrice: (gasPrice: string) => addHexPrefix(gasPrice),\n nonce: (nonce: string) => addHexPrefix(nonce),\n to: (to: string) => addHexPrefix(to).toLowerCase(),\n value: (value: string) => addHexPrefix(value),\n maxFeePerGas: (maxFeePerGas: string) => addHexPrefix(maxFeePerGas),\n maxPriorityFeePerGas: (maxPriorityFeePerGas: string) =>\n addHexPrefix(maxPriorityFeePerGas),\n estimatedBaseFee: (maxPriorityFeePerGas: string) =>\n addHexPrefix(maxPriorityFeePerGas),\n};\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param txParams - The transaction params to normalize.\n * @returns Normalized transaction params.\n */\nexport function normalizeTxParams(txParams: TransactionParams) {\n const normalizedTxParams: TransactionParams = { from: '' };\n let key: keyof TransactionParams;\n for (key in NORMALIZERS) {\n if (txParams[key as keyof TransactionParams]) {\n normalizedTxParams[key] = NORMALIZERS[key](txParams[key]) as never;\n }\n }\n return normalizedTxParams;\n}\n\n/**\n * Validates the transaction params for required properties and throws in\n * the event of any validation error.\n *\n * @param txParams - Transaction params object to validate.\n */\nexport function validateTxParams(txParams: TransactionParams) {\n if (\n !txParams.from ||\n typeof txParams.from !== 'string' ||\n !isValidHexAddress(txParams.from)\n ) {\n throw new Error(\n `Invalid \"from\" address: ${txParams.from} must be a valid string.`,\n );\n }\n\n if (txParams.to === '0x' || txParams.to === undefined) {\n if (txParams.data) {\n delete txParams.to;\n } else {\n throw new Error(\n `Invalid \"to\" address: ${txParams.to} must be a valid string.`,\n );\n }\n } else if (txParams.to !== undefined && !isValidHexAddress(txParams.to)) {\n throw new Error(\n `Invalid \"to\" address: ${txParams.to} must be a valid string.`,\n );\n }\n\n if (txParams.value !== undefined) {\n const value = txParams.value.toString();\n if (value.includes('-')) {\n throw new Error(`Invalid \"value\": ${value} is not a positive number.`);\n }\n\n if (value.includes('.')) {\n throw new Error(\n `Invalid \"value\": ${value} number must be denominated in wei.`,\n );\n }\n const intValue = parseInt(txParams.value, 10);\n const isValid =\n Number.isFinite(intValue) &&\n !Number.isNaN(intValue) &&\n !isNaN(Number(value)) &&\n Number.isSafeInteger(intValue);\n if (!isValid) {\n throw new Error(\n `Invalid \"value\": ${value} number must be a valid number.`,\n );\n }\n }\n}\n\n/**\n * Checks if a transaction is EIP-1559 by checking for the existence of\n * maxFeePerGas and maxPriorityFeePerGas within its parameters.\n *\n * @param txParams - Transaction params object to add.\n * @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.\n */\nexport const isEIP1559Transaction = (txParams: TransactionParams): boolean => {\n const hasOwnProp = (obj: TransactionParams, key: string) =>\n Object.prototype.hasOwnProperty.call(obj, key);\n return (\n hasOwnProp(txParams, 'maxFeePerGas') &&\n hasOwnProp(txParams, 'maxPriorityFeePerGas')\n );\n};\n\nexport const validateGasValues = (\n gasValues: GasPriceValue | FeeMarketEIP1559Values,\n) => {\n Object.keys(gasValues).forEach((key) => {\n const value = (gasValues as any)[key];\n if (typeof value !== 'string' || !isHexString(value)) {\n throw new TypeError(\n `expected hex string for ${key} but received: ${value}`,\n );\n }\n });\n};\n\nexport const isFeeMarketEIP1559Values = (\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n): gasValues is FeeMarketEIP1559Values =>\n (gasValues as FeeMarketEIP1559Values)?.maxFeePerGas !== undefined ||\n (gasValues as FeeMarketEIP1559Values)?.maxPriorityFeePerGas !== undefined;\n\nexport const isGasPriceValue = (\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n): gasValues is GasPriceValue =>\n (gasValues as GasPriceValue)?.gasPrice !== undefined;\n\nexport const getIncreasedPriceHex = (value: number, rate: number): string =>\n addHexPrefix(`${parseInt(`${value * rate}`, 10).toString(16)}`);\n\nexport const getIncreasedPriceFromExisting = (\n value: string | undefined,\n rate: number,\n): string => {\n return getIncreasedPriceHex(convertHexToDecimal(value), rate);\n};\n\n/**\n * Validates that the proposed value is greater than or equal to the minimum value.\n *\n * @param proposed - The proposed value.\n * @param min - The minimum value.\n * @returns The proposed value.\n * @throws Will throw if the proposed value is too low.\n */\nexport function validateMinimumIncrease(proposed: string, min: string) {\n const proposedDecimal = convertHexToDecimal(proposed);\n const minDecimal = convertHexToDecimal(min);\n if (proposedDecimal >= minDecimal) {\n return proposed;\n }\n const errorMsg = `The proposed value: ${proposedDecimal} should meet or exceed the minimum value: ${minDecimal}`;\n throw new Error(errorMsg);\n}\n\n/**\n * Helper function to filter and format transactions for the nonce tracker.\n *\n * @param fromAddress - Address of the account from which the transactions to filter from are sent.\n * @param transactionStatus - Status of the transactions for which to filter.\n * @param transactions - Array of transactionMeta objects that have been prefiltered.\n * @returns Array of transactions formatted for the nonce tracker.\n */\nexport function getAndFormatTransactionsForNonceTracker(\n fromAddress: string,\n transactionStatus: TransactionStatus,\n transactions: TransactionMeta[],\n): NonceTrackerTransaction[] {\n return transactions\n .filter(\n ({ status, txParams: { from } }) =>\n status === transactionStatus &&\n from.toLowerCase() === fromAddress.toLowerCase(),\n )\n .map(({ status, txParams: { from, gas, value, nonce } }) => {\n // the only value we care about is the nonce\n // but we need to return the other values to satisfy the type\n // TODO: refactor nonceTracker to not require this\n return {\n status,\n history: [{}],\n txParams: {\n from: from ?? '',\n gas: gas ?? '',\n value: value ?? '',\n nonce: nonce ?? '',\n },\n };\n });\n}\n\n/**\n * Validates that a transaction is unapproved.\n * Throws if the transaction is not unapproved.\n *\n * @param transactionMeta - The transaction metadata to check.\n * @param fnName - The name of the function calling this helper.\n */\nexport function validateIfTransactionUnapproved(\n transactionMeta: TransactionMeta | undefined,\n fnName: string,\n) {\n if (transactionMeta?.status !== TransactionStatus.unapproved) {\n throw new Error(\n `Can only call ${fnName} on an unapproved transaction.\n Current tx status: ${transactionMeta?.status}`,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n convertHexToDecimal,\n isValidHexAddress,\n} from '@metamask/controller-utils';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { addHexPrefix, isHexString } from 'ethereumjs-util';\nimport type { Transaction as NonceTrackerTransaction } from 'nonce-tracker/dist/NonceTracker';\n\nimport type {\n GasPriceValue,\n FeeMarketEIP1559Values,\n} from './TransactionController';\nimport { TransactionStatus } from './types';\nimport type { TransactionParams, TransactionMeta } from './types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\nconst NORMALIZERS: { [param in keyof TransactionParams]: any } = {\n data: (data: string) => addHexPrefix(data),\n from: (from: string) => addHexPrefix(from).toLowerCase(),\n gas: (gas: string) => addHexPrefix(gas),\n gasLimit: (gas: string) => addHexPrefix(gas),\n gasPrice: (gasPrice: string) => addHexPrefix(gasPrice),\n nonce: (nonce: string) => addHexPrefix(nonce),\n to: (to: string) => addHexPrefix(to).toLowerCase(),\n value: (value: string) => addHexPrefix(value),\n maxFeePerGas: (maxFeePerGas: string) => addHexPrefix(maxFeePerGas),\n maxPriorityFeePerGas: (maxPriorityFeePerGas: string) =>\n addHexPrefix(maxPriorityFeePerGas),\n estimatedBaseFee: (maxPriorityFeePerGas: string) =>\n addHexPrefix(maxPriorityFeePerGas),\n type: (type: string) => (type === '0x0' ? '0x0' : undefined),\n};\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param txParams - The transaction params to normalize.\n * @returns Normalized transaction params.\n */\nexport function normalizeTxParams(txParams: TransactionParams) {\n const normalizedTxParams: TransactionParams = { from: '' };\n let key: keyof TransactionParams;\n for (key in NORMALIZERS) {\n if (txParams[key as keyof TransactionParams]) {\n normalizedTxParams[key] = NORMALIZERS[key](txParams[key]) as never;\n }\n }\n return normalizedTxParams;\n}\n\n/**\n * Validates the transaction params for required properties and throws in\n * the event of any validation error.\n *\n * @param txParams - Transaction params object to validate.\n * @param isEIP1559Compatible - whether or not the current network supports EIP-1559 transactions.\n */\nexport function validateTxParams(\n txParams: TransactionParams,\n isEIP1559Compatible = true,\n) {\n if (\n !txParams.from ||\n typeof txParams.from !== 'string' ||\n !isValidHexAddress(txParams.from)\n ) {\n throw rpcErrors.invalidParams(\n `Invalid \"from\" address: ${txParams.from} must be a valid string.`,\n );\n }\n\n if (isEIP1559Transaction(txParams) && !isEIP1559Compatible) {\n throw rpcErrors.invalidParams(\n 'Invalid transaction params: params specify an EIP-1559 transaction but the current network does not support EIP-1559',\n );\n }\n\n if (txParams.to === '0x' || txParams.to === undefined) {\n if (txParams.data) {\n delete txParams.to;\n } else {\n throw rpcErrors.invalidParams(\n `Invalid \"to\" address: ${txParams.to} must be a valid string.`,\n );\n }\n } else if (txParams.to !== undefined && !isValidHexAddress(txParams.to)) {\n throw rpcErrors.invalidParams(\n `Invalid \"to\" address: ${txParams.to} must be a valid string.`,\n );\n }\n\n if (txParams.value !== undefined) {\n const value = txParams.value.toString();\n if (value.includes('-')) {\n throw rpcErrors.invalidParams(\n `Invalid \"value\": ${value} is not a positive number.`,\n );\n }\n\n if (value.includes('.')) {\n throw rpcErrors.invalidParams(\n `Invalid \"value\": ${value} number must be denominated in wei.`,\n );\n }\n const intValue = parseInt(txParams.value, 10);\n const isValid =\n Number.isFinite(intValue) &&\n !Number.isNaN(intValue) &&\n !isNaN(Number(value)) &&\n Number.isSafeInteger(intValue);\n if (!isValid) {\n throw rpcErrors.invalidParams(\n `Invalid \"value\": ${value} number must be a valid number.`,\n );\n }\n }\n}\n\n/**\n * Checks if a transaction is EIP-1559 by checking for the existence of\n * maxFeePerGas and maxPriorityFeePerGas within its parameters.\n *\n * @param txParams - Transaction params object to add.\n * @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.\n */\nexport function isEIP1559Transaction(txParams: TransactionParams): boolean {\n const hasOwnProp = (obj: TransactionParams, key: string) =>\n Object.prototype.hasOwnProperty.call(obj, key);\n return (\n hasOwnProp(txParams, 'maxFeePerGas') &&\n hasOwnProp(txParams, 'maxPriorityFeePerGas')\n );\n}\n\nexport const validateGasValues = (\n gasValues: GasPriceValue | FeeMarketEIP1559Values,\n) => {\n Object.keys(gasValues).forEach((key) => {\n const value = (gasValues as any)[key];\n if (typeof value !== 'string' || !isHexString(value)) {\n throw new TypeError(\n `expected hex string for ${key} but received: ${value}`,\n );\n }\n });\n};\n\nexport const isFeeMarketEIP1559Values = (\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n): gasValues is FeeMarketEIP1559Values =>\n (gasValues as FeeMarketEIP1559Values)?.maxFeePerGas !== undefined ||\n (gasValues as FeeMarketEIP1559Values)?.maxPriorityFeePerGas !== undefined;\n\nexport const isGasPriceValue = (\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n): gasValues is GasPriceValue =>\n (gasValues as GasPriceValue)?.gasPrice !== undefined;\n\nexport const getIncreasedPriceHex = (value: number, rate: number): string =>\n addHexPrefix(`${parseInt(`${value * rate}`, 10).toString(16)}`);\n\nexport const getIncreasedPriceFromExisting = (\n value: string | undefined,\n rate: number,\n): string => {\n return getIncreasedPriceHex(convertHexToDecimal(value), rate);\n};\n\n/**\n * Validates that the proposed value is greater than or equal to the minimum value.\n *\n * @param proposed - The proposed value.\n * @param min - The minimum value.\n * @returns The proposed value.\n * @throws Will throw if the proposed value is too low.\n */\nexport function validateMinimumIncrease(proposed: string, min: string) {\n const proposedDecimal = convertHexToDecimal(proposed);\n const minDecimal = convertHexToDecimal(min);\n if (proposedDecimal >= minDecimal) {\n return proposed;\n }\n const errorMsg = `The proposed value: ${proposedDecimal} should meet or exceed the minimum value: ${minDecimal}`;\n throw new Error(errorMsg);\n}\n\n/**\n * Helper function to filter and format transactions for the nonce tracker.\n *\n * @param fromAddress - Address of the account from which the transactions to filter from are sent.\n * @param transactionStatus - Status of the transactions for which to filter.\n * @param transactions - Array of transactionMeta objects that have been prefiltered.\n * @returns Array of transactions formatted for the nonce tracker.\n */\nexport function getAndFormatTransactionsForNonceTracker(\n fromAddress: string,\n transactionStatus: TransactionStatus,\n transactions: TransactionMeta[],\n): NonceTrackerTransaction[] {\n return transactions\n .filter(\n ({ status, txParams: { from } }) =>\n status === transactionStatus &&\n from.toLowerCase() === fromAddress.toLowerCase(),\n )\n .map(({ status, txParams: { from, gas, value, nonce } }) => {\n // the only value we care about is the nonce\n // but we need to return the other values to satisfy the type\n // TODO: refactor nonceTracker to not require this\n return {\n status,\n history: [{}],\n txParams: {\n from: from ?? '',\n gas: gas ?? '',\n value: value ?? '',\n nonce: nonce ?? '',\n },\n };\n });\n}\n\n/**\n * Validates that a transaction is unapproved.\n * Throws if the transaction is not unapproved.\n *\n * @param transactionMeta - The transaction metadata to check.\n * @param fnName - The name of the function calling this helper.\n */\nexport function validateIfTransactionUnapproved(\n transactionMeta: TransactionMeta | undefined,\n fnName: string,\n) {\n if (transactionMeta?.status !== TransactionStatus.unapproved) {\n throw new Error(\n `Can only call ${fnName} on an unapproved transaction.\n Current tx status: ${transactionMeta?.status}`,\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/transaction-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "Stores transactions alongside their periodically updated statuses and manages interactions such as approval and cancellation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -31,16 +31,16 @@
|
|
|
31
31
|
"@ethereumjs/common": "^3.2.0",
|
|
32
32
|
"@ethereumjs/tx": "^4.2.0",
|
|
33
33
|
"@ethersproject/abi": "^5.7.0",
|
|
34
|
-
"@metamask/approval-controller": "^3.5.
|
|
35
|
-
"@metamask/base-controller": "^3.2.
|
|
36
|
-
"@metamask/controller-utils": "^5.0.
|
|
34
|
+
"@metamask/approval-controller": "^3.5.2",
|
|
35
|
+
"@metamask/base-controller": "^3.2.2",
|
|
36
|
+
"@metamask/controller-utils": "^5.0.1",
|
|
37
37
|
"@metamask/eth-query": "^3.0.1",
|
|
38
38
|
"@metamask/metamask-eth-abis": "^3.0.0",
|
|
39
|
-
"@metamask/network-controller": "^13.0.
|
|
39
|
+
"@metamask/network-controller": "^13.0.1",
|
|
40
|
+
"@metamask/rpc-errors": "^6.0.0",
|
|
40
41
|
"@metamask/utils": "^6.2.0",
|
|
41
42
|
"async-mutex": "^0.2.6",
|
|
42
43
|
"eth-method-registry": "1.1.0",
|
|
43
|
-
"eth-rpc-errors": "^4.0.2",
|
|
44
44
|
"ethereumjs-util": "^7.0.10",
|
|
45
45
|
"fast-json-patch": "^3.1.1",
|
|
46
46
|
"lodash": "^4.17.21",
|
|
@@ -57,13 +57,13 @@
|
|
|
57
57
|
"jest": "^27.5.1",
|
|
58
58
|
"sinon": "^9.2.4",
|
|
59
59
|
"ts-jest": "^27.1.4",
|
|
60
|
-
"typedoc": "^0.
|
|
61
|
-
"typedoc-plugin-missing-exports": "^0.
|
|
62
|
-
"typescript": "~4.
|
|
60
|
+
"typedoc": "^0.23.15",
|
|
61
|
+
"typedoc-plugin-missing-exports": "^0.23.0",
|
|
62
|
+
"typescript": "~4.8.4"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
|
-
"@metamask/approval-controller": "^3.5.
|
|
66
|
-
"@metamask/network-controller": "^13.0.
|
|
65
|
+
"@metamask/approval-controller": "^3.5.2",
|
|
66
|
+
"@metamask/network-controller": "^13.0.1",
|
|
67
67
|
"babel-runtime": "^6.26.0"
|
|
68
68
|
},
|
|
69
69
|
"engines": {
|