@metamask-previews/transaction-controller 25.1.0-preview-68beceb0 → 25.2.0-preview-59bf6d5d
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 +20 -1
- package/dist/TransactionController.js +18 -19
- package/dist/TransactionController.mjs +17 -18
- package/dist/{chunk-TJXPMOA6.mjs → chunk-3D3SA6PY.mjs} +2 -2
- package/dist/{chunk-G4743H5H.js → chunk-5IHLDAOF.js} +5 -5
- package/dist/{chunk-QTQSCTQA.js → chunk-5OQ373JS.js} +10 -10
- package/dist/{chunk-WBE2B3XJ.mjs → chunk-5UL3VDFT.mjs} +8 -13
- package/dist/chunk-5UL3VDFT.mjs.map +1 -0
- package/dist/chunk-6XMG522E.mjs +56 -0
- package/dist/chunk-6XMG522E.mjs.map +1 -0
- package/dist/{chunk-BTYBFMZN.js → chunk-7BG5XOXJ.js} +107 -89
- package/dist/chunk-7BG5XOXJ.js.map +1 -0
- package/dist/{chunk-N6STPA6E.mjs → chunk-BYBPZUHS.mjs} +30 -7
- package/dist/chunk-BYBPZUHS.mjs.map +1 -0
- package/dist/{chunk-VP2DBWOT.js → chunk-CXXGL43K.js} +3 -3
- package/dist/{chunk-6KYPLIXG.mjs → chunk-DWHMMJOW.mjs} +2 -2
- package/dist/{chunk-C3UHJPYJ.js → chunk-F3CMU2DM.js} +6 -6
- package/dist/{chunk-2YQGET5U.js → chunk-FHG5GY6F.js} +7 -7
- package/dist/{chunk-NT3WVB4P.js → chunk-GC77BSQZ.js} +32 -9
- package/dist/chunk-GC77BSQZ.js.map +1 -0
- package/dist/chunk-GE57YNGX.js +56 -0
- package/dist/chunk-GE57YNGX.js.map +1 -0
- package/dist/{chunk-TVDU7LVX.mjs → chunk-I6RY3XOG.mjs} +97 -79
- package/dist/chunk-I6RY3XOG.mjs.map +1 -0
- package/dist/{chunk-JZFJUM6S.mjs → chunk-IK55QTGO.mjs} +3 -3
- package/dist/{chunk-WIZVJM2B.js → chunk-ITDY6AIZ.js} +2 -3
- package/dist/chunk-ITDY6AIZ.js.map +1 -0
- package/dist/{chunk-RU6NJIUD.mjs → chunk-IZI7FQIN.mjs} +3 -3
- package/dist/chunk-KFL2GGZC.mjs +48 -0
- package/dist/chunk-KFL2GGZC.mjs.map +1 -0
- package/dist/{chunk-PJV3XYKW.js → chunk-NRWEI43Q.js} +20 -45
- package/dist/chunk-NRWEI43Q.js.map +1 -0
- package/dist/{chunk-I6HCML4F.js → chunk-PF3UOCRW.js} +8 -8
- package/dist/{chunk-2MSXAOTK.mjs → chunk-PGTV7236.mjs} +5 -5
- package/dist/{chunk-JCGCPGGI.js → chunk-QEX3QMSL.js} +8 -13
- package/dist/chunk-QEX3QMSL.js.map +1 -0
- package/dist/{chunk-3HE3FT67.mjs → chunk-QRSTF45Q.mjs} +5 -5
- package/dist/chunk-R7NJVDWN.js +48 -0
- package/dist/chunk-R7NJVDWN.js.map +1 -0
- package/dist/{chunk-GRQB2ARK.js → chunk-RQKICZYP.js} +3 -3
- package/dist/{chunk-2MMWLJXS.js → chunk-TZTP4JVA.js} +4 -4
- package/dist/{chunk-TUW3M44L.js → chunk-VEJ3MIZG.js} +1 -1
- package/dist/chunk-VEJ3MIZG.js.map +1 -0
- package/dist/{chunk-RIYIJTEU.mjs → chunk-VEREDMI2.mjs} +2 -2
- package/dist/{chunk-XOIPXDGX.mjs → chunk-W57BD6NX.mjs} +1 -1
- package/dist/chunk-W57BD6NX.mjs.map +1 -0
- package/dist/{chunk-HLG525BC.mjs → chunk-XKNFL657.mjs} +2 -2
- package/dist/{chunk-DTMKGTYC.mjs → chunk-Z3HHSD5I.mjs} +2 -3
- package/dist/chunk-Z3HHSD5I.mjs.map +1 -0
- package/dist/{chunk-ZM6E4LZJ.mjs → chunk-ZQFMTLZJ.mjs} +19 -44
- package/dist/chunk-ZQFMTLZJ.mjs.map +1 -0
- package/dist/constants.js +2 -2
- package/dist/constants.mjs +1 -1
- package/dist/gas-flows/DefaultGasFeeFlow.js +7 -7
- package/dist/gas-flows/DefaultGasFeeFlow.mjs +6 -6
- package/dist/gas-flows/LineaGasFeeFlow.js +8 -8
- package/dist/gas-flows/LineaGasFeeFlow.mjs +7 -7
- package/dist/helpers/EtherscanRemoteTransactionSource.js +5 -5
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs +4 -4
- package/dist/helpers/GasFeePoller.js +5 -5
- package/dist/helpers/GasFeePoller.mjs +4 -4
- package/dist/helpers/MultichainTrackingHelper.js +6 -6
- package/dist/helpers/MultichainTrackingHelper.mjs +5 -5
- package/dist/helpers/PendingTransactionTracker.js +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +1 -1
- package/dist/index.js +23 -22
- package/dist/index.mjs +22 -21
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/TransactionController.d.ts +26 -34
- package/dist/types/TransactionController.d.ts.map +1 -1
- package/dist/types/constants.d.ts +0 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/helpers/GasFeePoller.d.ts +2 -4
- package/dist/types/helpers/GasFeePoller.d.ts.map +1 -1
- package/dist/types/helpers/IncomingTransactionHelper.d.ts +1 -1
- package/dist/types/helpers/IncomingTransactionHelper.d.ts.map +1 -1
- package/dist/types/helpers/MultichainTrackingHelper.d.ts +1 -5
- package/dist/types/helpers/MultichainTrackingHelper.d.ts.map +1 -1
- package/dist/types/helpers/PendingTransactionTracker.d.ts +1 -1
- package/dist/types/helpers/PendingTransactionTracker.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +43 -32
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/gas-fees.d.ts +3 -3
- package/dist/types/utils/gas-fees.d.ts.map +1 -1
- package/dist/types/utils/gas-flow.d.ts +2 -2
- package/dist/types/utils/gas-flow.d.ts.map +1 -1
- package/dist/types/utils/gas.d.ts +1 -1
- package/dist/types/utils/gas.d.ts.map +1 -1
- package/dist/types/utils/layer1-gas-fee-flow.d.ts +3 -19
- package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +1 -1
- package/dist/types/utils/simulation-api.d.ts +21 -13
- package/dist/types/utils/simulation-api.d.ts.map +1 -1
- package/dist/types/utils/simulation.d.ts +2 -2
- package/dist/types/utils/simulation.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.mjs +1 -1
- package/dist/utils/etherscan.js +3 -3
- package/dist/utils/etherscan.mjs +2 -2
- package/dist/utils/external-transactions.js +1 -1
- package/dist/utils/external-transactions.mjs +1 -1
- package/dist/utils/gas-fees.js +6 -6
- package/dist/utils/gas-fees.mjs +5 -5
- package/dist/utils/gas-flow.js +3 -3
- package/dist/utils/gas-flow.mjs +2 -2
- package/dist/utils/gas.js +3 -3
- package/dist/utils/gas.mjs +2 -2
- package/dist/utils/layer1-gas-fee-flow.js +2 -6
- package/dist/utils/layer1-gas-fee-flow.mjs +1 -5
- package/dist/utils/simulation-api.js +2 -3
- package/dist/utils/simulation-api.mjs +1 -2
- package/dist/utils/simulation.js +4 -5
- package/dist/utils/simulation.mjs +3 -4
- package/dist/utils/swaps.js +4 -4
- package/dist/utils/swaps.mjs +3 -3
- package/dist/utils/transaction-type.js +1 -1
- package/dist/utils/transaction-type.mjs +1 -1
- package/dist/utils/utils.js +1 -1
- package/dist/utils/utils.mjs +1 -1
- package/dist/utils/validation.js +1 -1
- package/dist/utils/validation.mjs +1 -1
- package/package.json +2 -4
- package/dist/chunk-BTYBFMZN.js.map +0 -1
- package/dist/chunk-DTMKGTYC.mjs.map +0 -1
- package/dist/chunk-IFNKPDIB.js +0 -46
- package/dist/chunk-IFNKPDIB.js.map +0 -1
- package/dist/chunk-JCGCPGGI.js.map +0 -1
- package/dist/chunk-N6STPA6E.mjs.map +0 -1
- package/dist/chunk-NT3WVB4P.js.map +0 -1
- package/dist/chunk-OXRUL7JF.mjs +0 -74
- package/dist/chunk-OXRUL7JF.mjs.map +0 -1
- package/dist/chunk-PJV3XYKW.js.map +0 -1
- package/dist/chunk-PM22KPVX.mjs +0 -75
- package/dist/chunk-PM22KPVX.mjs.map +0 -1
- package/dist/chunk-R5LEPJW3.js +0 -75
- package/dist/chunk-R5LEPJW3.js.map +0 -1
- package/dist/chunk-S222HWGT.js +0 -74
- package/dist/chunk-S222HWGT.js.map +0 -1
- package/dist/chunk-T6W4OUJD.mjs +0 -46
- package/dist/chunk-T6W4OUJD.mjs.map +0 -1
- package/dist/chunk-TUW3M44L.js.map +0 -1
- package/dist/chunk-TVDU7LVX.mjs.map +0 -1
- package/dist/chunk-WBE2B3XJ.mjs.map +0 -1
- package/dist/chunk-WIZVJM2B.js.map +0 -1
- package/dist/chunk-XOIPXDGX.mjs.map +0 -1
- package/dist/chunk-ZM6E4LZJ.mjs.map +0 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.js +0 -11
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.js.map +0 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +0 -11
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +0 -1
- package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts +0 -10
- package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts.map +0 -1
- /package/dist/{chunk-TJXPMOA6.mjs.map → chunk-3D3SA6PY.mjs.map} +0 -0
- /package/dist/{chunk-G4743H5H.js.map → chunk-5IHLDAOF.js.map} +0 -0
- /package/dist/{chunk-QTQSCTQA.js.map → chunk-5OQ373JS.js.map} +0 -0
- /package/dist/{chunk-VP2DBWOT.js.map → chunk-CXXGL43K.js.map} +0 -0
- /package/dist/{chunk-6KYPLIXG.mjs.map → chunk-DWHMMJOW.mjs.map} +0 -0
- /package/dist/{chunk-C3UHJPYJ.js.map → chunk-F3CMU2DM.js.map} +0 -0
- /package/dist/{chunk-2YQGET5U.js.map → chunk-FHG5GY6F.js.map} +0 -0
- /package/dist/{chunk-JZFJUM6S.mjs.map → chunk-IK55QTGO.mjs.map} +0 -0
- /package/dist/{chunk-RU6NJIUD.mjs.map → chunk-IZI7FQIN.mjs.map} +0 -0
- /package/dist/{chunk-I6HCML4F.js.map → chunk-PF3UOCRW.js.map} +0 -0
- /package/dist/{chunk-2MSXAOTK.mjs.map → chunk-PGTV7236.mjs.map} +0 -0
- /package/dist/{chunk-3HE3FT67.mjs.map → chunk-QRSTF45Q.mjs.map} +0 -0
- /package/dist/{chunk-GRQB2ARK.js.map → chunk-RQKICZYP.js.map} +0 -0
- /package/dist/{chunk-2MMWLJXS.js.map → chunk-TZTP4JVA.js.map} +0 -0
- /package/dist/{chunk-RIYIJTEU.mjs.map → chunk-VEREDMI2.mjs.map} +0 -0
- /package/dist/{chunk-HLG525BC.mjs.map → chunk-XKNFL657.mjs.map} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkPF3UOCRWjs = require('./chunk-PF3UOCRW.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkVEJ3MIZGjs = require('./chunk-VEJ3MIZG.js');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
@@ -48,7 +48,7 @@ var LineaGasFeeFlow = class {
|
|
|
48
48
|
return await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getLineaGasFees, getLineaGasFees_fn).call(this, request);
|
|
49
49
|
} catch (error) {
|
|
50
50
|
log("Using default flow as fallback due to error", error);
|
|
51
|
-
return new (0,
|
|
51
|
+
return new (0, _chunkPF3UOCRWjs.DefaultGasFeeFlow)().getGasFees(request);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
};
|
|
@@ -63,7 +63,7 @@ getLineaGasFees_fn = async function(request) {
|
|
|
63
63
|
log("Generated priority fees", _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _feesToString, feesToString_fn).call(this, priorityFees));
|
|
64
64
|
const maxFees = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getMaxFees, getMaxFees_fn).call(this, baseFees, priorityFees);
|
|
65
65
|
log("Generated max fees", _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _feesToString, feesToString_fn).call(this, maxFees));
|
|
66
|
-
const estimates = Object.values(
|
|
66
|
+
const estimates = Object.values(_chunkVEJ3MIZGjs.GasFeeEstimateLevel).reduce(
|
|
67
67
|
(result, level) => ({
|
|
68
68
|
...result,
|
|
69
69
|
[level]: {
|
|
@@ -110,7 +110,7 @@ getMaxFees_fn = function(baseFees, priorityFees) {
|
|
|
110
110
|
};
|
|
111
111
|
_feesToString = new WeakSet();
|
|
112
112
|
feesToString_fn = function(fees) {
|
|
113
|
-
return Object.values(
|
|
113
|
+
return Object.values(_chunkVEJ3MIZGjs.GasFeeEstimateLevel).map(
|
|
114
114
|
(level) => fees[level].toString(10)
|
|
115
115
|
);
|
|
116
116
|
};
|
|
@@ -118,4 +118,4 @@ feesToString_fn = function(fees) {
|
|
|
118
118
|
|
|
119
119
|
|
|
120
120
|
exports.LineaGasFeeFlow = LineaGasFeeFlow;
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
//# sourceMappingURL=chunk-FHG5GY6F.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkGE57YNGXjs = require('./chunk-GE57YNGX.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
|
|
@@ -15,11 +15,24 @@ async function getSimulationData(request) {
|
|
|
15
15
|
const { chainId, from, to, value, data } = request;
|
|
16
16
|
log("Getting simulation data", request);
|
|
17
17
|
try {
|
|
18
|
-
const response = await
|
|
19
|
-
transactions: [
|
|
18
|
+
const response = await _chunkGE57YNGXjs.simulateTransactions.call(void 0, chainId, {
|
|
19
|
+
transactions: [
|
|
20
|
+
{
|
|
21
|
+
data,
|
|
22
|
+
from,
|
|
23
|
+
maxFeePerGas: "0x0",
|
|
24
|
+
maxPriorityFeePerGas: "0x0",
|
|
25
|
+
to,
|
|
26
|
+
value
|
|
27
|
+
}
|
|
28
|
+
],
|
|
20
29
|
withCallTrace: true,
|
|
21
30
|
withLogs: true
|
|
22
31
|
});
|
|
32
|
+
const transactionError = response.transactions?.[0]?.error;
|
|
33
|
+
if (transactionError) {
|
|
34
|
+
throw { message: transactionError };
|
|
35
|
+
}
|
|
23
36
|
const nativeBalanceChange = getNativeBalanceChange(request.from, response);
|
|
24
37
|
const events = getEvents(response);
|
|
25
38
|
log("Parsed events", events);
|
|
@@ -30,7 +43,15 @@ async function getSimulationData(request) {
|
|
|
30
43
|
};
|
|
31
44
|
} catch (error) {
|
|
32
45
|
log("Failed to get simulation data", error, request);
|
|
33
|
-
|
|
46
|
+
const rawError = error;
|
|
47
|
+
return {
|
|
48
|
+
tokenBalanceChanges: [],
|
|
49
|
+
error: {
|
|
50
|
+
code: rawError.code,
|
|
51
|
+
message: rawError.message,
|
|
52
|
+
isReverted: rawError.message?.includes("execution reverted") ?? false
|
|
53
|
+
}
|
|
54
|
+
};
|
|
34
55
|
}
|
|
35
56
|
}
|
|
36
57
|
function getNativeBalanceChange(userAddress, response) {
|
|
@@ -39,15 +60,17 @@ function getNativeBalanceChange(userAddress, response) {
|
|
|
39
60
|
return void 0;
|
|
40
61
|
}
|
|
41
62
|
const { stateDiff } = transactionResponse;
|
|
42
|
-
const previousBalance = stateDiff
|
|
43
|
-
const newBalance = stateDiff
|
|
63
|
+
const previousBalance = stateDiff?.pre?.[userAddress]?.balance;
|
|
64
|
+
const newBalance = stateDiff?.post?.[userAddress]?.balance;
|
|
44
65
|
if (!previousBalance || !newBalance) {
|
|
45
66
|
return void 0;
|
|
46
67
|
}
|
|
47
68
|
return getSimulationBalanceChange(previousBalance, newBalance);
|
|
48
69
|
}
|
|
49
70
|
function getEvents(response) {
|
|
50
|
-
const logs = extractLogs(
|
|
71
|
+
const logs = extractLogs(
|
|
72
|
+
response.transactions[0]?.callTrace ?? {}
|
|
73
|
+
);
|
|
51
74
|
log("Extracted logs", logs);
|
|
52
75
|
const erc20Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC20);
|
|
53
76
|
const erc721Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC721);
|
|
@@ -102,7 +125,7 @@ async function getTokenBalanceChanges(request, events) {
|
|
|
102
125
|
if (!balanceTransactions.length) {
|
|
103
126
|
return [];
|
|
104
127
|
}
|
|
105
|
-
const response = await
|
|
128
|
+
const response = await _chunkGE57YNGXjs.simulateTransactions.call(void 0, request.chainId, {
|
|
106
129
|
transactions: [...balanceTransactions, request, ...balanceTransactions]
|
|
107
130
|
});
|
|
108
131
|
log("Balance simulation response", response);
|
|
@@ -239,4 +262,4 @@ function normalizeReturnValue(value) {
|
|
|
239
262
|
|
|
240
263
|
|
|
241
264
|
exports.getSimulationData = getSimulationData;
|
|
242
|
-
//# sourceMappingURL=chunk-
|
|
265
|
+
//# sourceMappingURL=chunk-GC77BSQZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/simulation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { projectLogger } from '../logger';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n SimulationTokenBalanceChange,\n SimulationToken,\n} from '../types';\nimport { SimulationTokenStandard } from '../types';\nimport { simulateTransactions } from './simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n} from './simulation-api';\n\nconst log = createModuleLogger(projectLogger, 'simulation');\n\ntype ABI = Fragment[];\n\nexport type GetSimulationDataRequest = {\n chainId: Hex;\n from: Hex;\n to?: Hex;\n value?: Hex;\n data?: Hex;\n};\n\ntype ParsedEvent = {\n contractAddress: Hex;\n tokenStandard: SimulationTokenStandard;\n name: string;\n args: Record<string, Hex | Hex[]>;\n abi: ABI;\n};\n\n/**\n * Generate simulation data for a transaction.\n * @param request - The transaction to simulate.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.from - The sender of the transaction.\n * @param request.to - The recipient of the transaction.\n * @param request.value - The value of the transaction.\n * @param request.data - The data of the transaction.\n * @returns The simulation data.\n */\nexport async function getSimulationData(\n request: GetSimulationDataRequest,\n): Promise<SimulationData> {\n const { chainId, from, to, value, data } = request;\n\n log('Getting simulation data', request);\n\n try {\n const response = await simulateTransactions(chainId, {\n transactions: [\n {\n data,\n from,\n maxFeePerGas: '0x0',\n maxPriorityFeePerGas: '0x0',\n to,\n value,\n },\n ],\n withCallTrace: true,\n withLogs: true,\n });\n\n const transactionError = response.transactions?.[0]?.error;\n\n if (transactionError) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw { message: transactionError };\n }\n\n const nativeBalanceChange = getNativeBalanceChange(request.from, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n return {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n } catch (error) {\n log('Failed to get simulation data', error, request);\n\n const rawError = error as { code?: number; message?: string };\n\n return {\n tokenBalanceChanges: [],\n error: {\n code: rawError.code,\n message: rawError.message,\n isReverted: rawError.message?.includes('execution reverted') ?? false,\n },\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n * @param userAddress - The user's account address.\n * @param response - The simulation response.\n * @returns The native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n userAddress: Hex,\n response: SimulationResponse,\n): SimulationBalanceChange | undefined {\n const transactionResponse = response.transactions[0];\n\n /* istanbul ignore next */\n if (!transactionResponse) {\n return undefined;\n }\n\n const { stateDiff } = transactionResponse;\n const previousBalance = stateDiff?.pre?.[userAddress]?.balance;\n const newBalance = stateDiff?.post?.[userAddress]?.balance;\n\n if (!previousBalance || !newBalance) {\n return undefined;\n }\n\n return getSimulationBalanceChange(previousBalance, newBalance);\n}\n\n/**\n * Extract events from a simulation response.\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nfunction getEvents(response: SimulationResponse): ParsedEvent[] {\n /* istanbul ignore next */\n const logs = extractLogs(\n response.transactions[0]?.callTrace ?? ({} as SimulationResponseCallTrace),\n );\n\n log('Extracted logs', logs);\n\n const erc20Interface = new Interface(abiERC20);\n const erc721Interface = new Interface(abiERC721);\n const erc1155Interface = new Interface(abiERC1155);\n\n return logs\n .map((currentLog) => {\n const event = parseLog(\n currentLog,\n erc20Interface,\n erc721Interface,\n erc1155Interface,\n );\n\n if (!event) {\n log('Failed to parse log', currentLog);\n return undefined;\n }\n\n /* istanbul ignore next */\n const inputs = event.abi.find((e) => e.name === event.name)?.inputs;\n\n /* istanbul ignore if */\n if (!inputs) {\n log('Failed to find inputs for event', event);\n return undefined;\n }\n\n const args = parseEventArgs(event.args, inputs);\n\n return {\n contractAddress: currentLog.address,\n tokenStandard: event.standard,\n name: event.name,\n args,\n abi: event.abi,\n };\n })\n .filter((e) => e !== undefined) as ParsedEvent[];\n}\n\n/**\n * Parse event arguments using ABI input definitions.\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The parsed event arguments.\n */\nfunction parseEventArgs(\n args: Result,\n abiInputs: { name: string }[],\n): Record<string, Hex | Hex[]> {\n return args.reduce((result, arg, index) => {\n const name = abiInputs[index].name.replace('_', '');\n const value = parseEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Parse an event argument value.\n * @param value - The event argument value.\n * @returns The parsed event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseEventArgValue(value: any): Hex | Hex[] {\n if (Array.isArray(value)) {\n return value.map(parseEventArgValue) as Hex[];\n }\n\n return (value.toHexString?.() ?? value).toLowerCase();\n}\n\n/**\n * Generate token balance changes from parsed events.\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns An array of token balance changes.\n */\nasync function getTokenBalanceChanges(\n request: GetSimulationDataRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const balanceTransactionsByToken = getTokenBalanceTransactions(\n request,\n events,\n );\n\n const balanceTransactions = [...balanceTransactionsByToken.values()];\n\n log('Generated balance transactions', balanceTransactions);\n\n if (!balanceTransactions.length) {\n return [];\n }\n\n const response = await simulateTransactions(request.chainId as Hex, {\n transactions: [...balanceTransactions, request, ...balanceTransactions],\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== balanceTransactions.length * 2 + 1) {\n throw new Error('Invalid response from simulation API');\n }\n\n return [...balanceTransactionsByToken.keys()]\n .map((token, index) => {\n const previousBalance = normalizeReturnValue(\n response.transactions[index].return,\n );\n\n const newBalance = normalizeReturnValue(\n response.transactions[index + balanceTransactions.length + 1].return,\n );\n\n const balanceChange = getSimulationBalanceChange(\n previousBalance,\n newBalance,\n );\n\n if (!balanceChange) {\n return undefined;\n }\n\n return {\n ...token,\n ...balanceChange,\n };\n })\n .filter((change) => change !== undefined) as SimulationTokenBalanceChange[];\n}\n\n/**\n * Generate transactions to check token balances.\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns A map of token balance transactions keyed by token.\n */\nfunction getTokenBalanceTransactions(\n request: GetSimulationDataRequest,\n events: ParsedEvent[],\n): Map<SimulationToken, SimulationRequestTransaction> {\n const tokenKeys = new Set();\n\n return events.reduce((result, event) => {\n if (\n !['Transfer', 'TransferSingle', 'TransferBatch'].includes(event.name) ||\n ![event.args.from, event.args.to].includes(request.from)\n ) {\n log('Ignoring event', event);\n return result;\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n let tokenIds: (Hex | undefined)[] = [undefined];\n\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n tokenIds = [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n tokenIds = [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n tokenIds = event.args.ids as Hex[];\n }\n\n log('Extracted token ids', tokenIds);\n\n for (const tokenId of tokenIds) {\n const simulationToken: SimulationToken = {\n address: event.contractAddress,\n standard: event.tokenStandard,\n id: tokenId,\n };\n\n const tokenKey = JSON.stringify(simulationToken);\n\n if (tokenKeys.has(tokenKey)) {\n log(\n 'Ignoring additional event with same contract and token ID',\n simulationToken,\n );\n continue;\n }\n\n tokenKeys.add(tokenKey);\n\n const parameters = [request.from];\n\n if (event.tokenStandard === SimulationTokenStandard.erc1155) {\n parameters.push(tokenId as Hex);\n }\n\n result.set(simulationToken, {\n from: request.from,\n to: event.contractAddress,\n data: new Interface(event.abi).encodeFunctionData(\n 'balanceOf',\n parameters,\n ) as Hex,\n });\n }\n\n return result;\n }, new Map<SimulationToken, SimulationRequestTransaction>());\n}\n\n/**\n * Parse a raw event log using known ABIs.\n * @param eventLog - The raw event log.\n * @param erc20 - The ERC-20 ABI interface.\n * @param erc721 - The ERC-721 ABI interface.\n * @param erc1155 - The ERC-1155 ABI interface.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n erc20: Interface,\n erc721: Interface,\n erc1155: Interface,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const abisByStandard = [\n {\n abi: abiERC20,\n contractInterface: erc20,\n standard: SimulationTokenStandard.erc20,\n },\n {\n abi: abiERC721,\n contractInterface: erc721,\n standard: SimulationTokenStandard.erc721,\n },\n {\n abi: abiERC1155,\n contractInterface: erc1155,\n standard: SimulationTokenStandard.erc1155,\n },\n ];\n\n for (const { abi, contractInterface, standard } of abisByStandard) {\n try {\n return {\n ...contractInterface.parseLog(eventLog),\n abi,\n standard,\n };\n } catch (e) {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\n * @param call - The root call trace.\n * @returns An array of logs.\n */\nfunction extractLogs(\n call: SimulationResponseCallTrace,\n): SimulationResponseLog[] {\n /* istanbul ignore next */\n const logs = call.logs ?? [];\n\n /* istanbul ignore next */\n const nestedCalls = call.calls ?? [];\n\n return [\n ...logs,\n ...nestedCalls.map((nestedCall) => extractLogs(nestedCall)).flat(),\n ];\n}\n\n/**\n * Generate balance change data from previous and new balances.\n * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n): SimulationBalanceChange | undefined {\n const differenceBN = hexToBN(newBalance).sub(hexToBN(previousBalance));\n const isDecrease = differenceBN.isNeg();\n const difference = toHex(differenceBN.abs());\n\n if (differenceBN.isZero()) {\n log('Balance change is zero');\n return undefined;\n }\n\n return {\n previousBalance,\n newBalance,\n difference,\n isDecrease,\n };\n}\n\n/**\n * Normalize a return value.\n * @param value - The return value to normalize.\n * @returns The normalized return value.\n */\nfunction normalizeReturnValue(value: Hex): Hex {\n return toHex(hexToBN(value));\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
|
|
4
|
+
|
|
5
|
+
// src/utils/simulation-api.ts
|
|
6
|
+
var _controllerutils = require('@metamask/controller-utils');
|
|
7
|
+
var _utils = require('@metamask/utils');
|
|
8
|
+
var log = _utils.createModuleLogger.call(void 0, _chunkS6VGOPUYjs.projectLogger, "simulation-api");
|
|
9
|
+
var RPC_METHOD = "infura_simulateTransactions";
|
|
10
|
+
var BASE_URL = "https://tx-sentinel-{0}.api.cx.metamask.io/";
|
|
11
|
+
var ENDPOINT_NETWORKS = "networks";
|
|
12
|
+
var requestIdCounter = 0;
|
|
13
|
+
async function simulateTransactions(chainId, request) {
|
|
14
|
+
const url = await getSimulationUrl(chainId);
|
|
15
|
+
log("Sending request", url, request);
|
|
16
|
+
const requestId = requestIdCounter;
|
|
17
|
+
requestIdCounter += 1;
|
|
18
|
+
const response = await fetch(url, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
body: JSON.stringify({
|
|
21
|
+
id: String(requestId),
|
|
22
|
+
jsonrpc: "2.0",
|
|
23
|
+
method: RPC_METHOD,
|
|
24
|
+
params: [request]
|
|
25
|
+
})
|
|
26
|
+
});
|
|
27
|
+
const responseJson = await response.json();
|
|
28
|
+
log("Received response", responseJson);
|
|
29
|
+
if (responseJson.error) {
|
|
30
|
+
throw responseJson.error;
|
|
31
|
+
}
|
|
32
|
+
return responseJson?.result;
|
|
33
|
+
}
|
|
34
|
+
async function getSimulationUrl(chainId) {
|
|
35
|
+
const networkData = await getNetworkData();
|
|
36
|
+
const chainIdDecimal = _controllerutils.convertHexToDecimal.call(void 0, chainId);
|
|
37
|
+
const network = networkData[chainIdDecimal];
|
|
38
|
+
if (!network?.confirmations) {
|
|
39
|
+
log("Chain is not supported", chainId);
|
|
40
|
+
throw new Error(`Chain is not supported: ${chainId}`);
|
|
41
|
+
}
|
|
42
|
+
return getUrl(network.network);
|
|
43
|
+
}
|
|
44
|
+
async function getNetworkData() {
|
|
45
|
+
const url = `${getUrl("ethereum-mainnet")}${ENDPOINT_NETWORKS}`;
|
|
46
|
+
const response = await fetch(url);
|
|
47
|
+
return response.json();
|
|
48
|
+
}
|
|
49
|
+
function getUrl(subdomain) {
|
|
50
|
+
return BASE_URL.replace("{0}", subdomain);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
exports.simulateTransactions = simulateTransactions;
|
|
56
|
+
//# sourceMappingURL=chunk-GE57YNGX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/simulation-api.ts"],"names":[],"mappings":";;;;;AAAA,SAAS,2BAA2B;AACpC,SAAS,0BAAoC;AAI7C,IAAM,MAAM,mBAAmB,eAAe,gBAAgB;AAE9D,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,oBAAoB;AA4I1B,IAAI,mBAAmB;AAOvB,eAAsB,qBACpB,SACA,SAC6B;AAC7B,QAAM,MAAM,MAAM,iBAAiB,OAAO;AAE1C,MAAI,mBAAmB,KAAK,OAAO;AAEnC,QAAM,YAAY;AAClB,sBAAoB;AAEpB,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU;AAAA,MACnB,IAAI,OAAO,SAAS;AAAA,MACpB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,CAAC,OAAO;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,MAAI,qBAAqB,YAAY;AAErC,MAAI,aAAa,OAAO;AACtB,UAAM,aAAa;AAAA,EACrB;AAEA,SAAO,cAAc;AACvB;AAOA,eAAe,iBAAiB,SAA+B;AAC7D,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,iBAAiB,oBAAoB,OAAO;AAClD,QAAM,UAAU,YAAY,cAAc;AAE1C,MAAI,CAAC,SAAS,eAAe;AAC3B,QAAI,0BAA0B,OAAO;AACrC,UAAM,IAAI,MAAM,2BAA2B,OAAO,EAAE;AAAA,EACtD;AAEA,SAAO,OAAO,QAAQ,OAAO;AAC/B;AAKA,eAAe,iBAAqD;AAClE,QAAM,MAAM,GAAG,OAAO,kBAAkB,CAAC,GAAG,iBAAiB;AAC7D,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,SAAO,SAAS,KAAK;AACvB;AAOA,SAAS,OAAO,WAA2B;AACzC,SAAO,SAAS,QAAQ,OAAO,SAAS;AAC1C","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'simulation-api');\n\nconst RPC_METHOD = 'infura_simulateTransactions';\nconst BASE_URL = 'https://tx-sentinel-{0}.api.cx.metamask.io/';\nconst ENDPOINT_NETWORKS = 'networks';\n\n/** Single transaction to simulate in a simulation API request. */\nexport type SimulationRequestTransaction = {\n /** Data to send with the transaction. */\n data?: Hex;\n\n /** Sender of the transaction. */\n from: Hex;\n\n /** Gas limit for the transaction. */\n gas?: Hex;\n\n /** Maximum fee per gas for the transaction. */\n maxFeePerGas?: Hex;\n\n /** Maximum priority fee per gas for the transaction. */\n maxPriorityFeePerGas?: Hex;\n\n /** Recipient of the transaction. */\n to?: Hex;\n\n /** Value to send with the transaction. */\n value?: Hex;\n};\n\n/** Request to the simulation API to simulate transactions. */\nexport type SimulationRequest = {\n /**\n * Transactions to be sequentially simulated.\n * State changes impact subsequent transactions in the list.\n */\n transactions: SimulationRequestTransaction[];\n\n /**\n * Overrides to the state of the blockchain, keyed by smart contract address.\n */\n overrides?: {\n [address: Hex]: {\n /** Overrides to the storage slots for a smart contract account. */\n stateDiff: {\n [slot: Hex]: Hex;\n };\n };\n };\n\n /**\n * Whether to include call traces in the response.\n * Defaults to false.\n */\n withCallTrace?: boolean;\n\n /**\n * Whether to include event logs in the response.\n * Defaults to false.\n */\n withLogs?: boolean;\n};\n\n/** Raw event log emitted by a simulated transaction. */\nexport type SimulationResponseLog = {\n /** Address of the account that created the event. */\n address: Hex;\n\n /** Raw data in the event that is not indexed. */\n data: Hex;\n\n /** Raw indexed data from the event. */\n topics: Hex[];\n};\n\n/** Call trace of a single simulated transaction. */\nexport type SimulationResponseCallTrace = {\n /** Nested calls. */\n calls: SimulationResponseCallTrace[];\n\n /** Raw event logs created by the call. */\n logs: SimulationResponseLog[];\n};\n\n/**\n * Changes to the blockchain state.\n * Keyed by account address.\n */\nexport type SimulationResponseStateDiff = {\n [address: Hex]: {\n /** Native balance of the account. */\n balance?: Hex;\n\n /** Nonce of the account. */\n nonce?: Hex;\n\n /** Storage values per slot. */\n storage?: {\n [slot: Hex]: Hex;\n };\n };\n};\n\n/** Response from the simulation API for a single transaction. */\nexport type SimulationResponseTransaction = {\n /** An error message indicating the transaction could not be simulated. */\n error?: string;\n\n /** Return value of the transaction, such as the balance if calling balanceOf. */\n return: Hex;\n\n /** Hierarchy of call data including nested calls and logs. */\n callTrace?: SimulationResponseCallTrace;\n\n /** Changes to the blockchain state. */\n stateDiff?: {\n /** Initial blockchain state before the transaction. */\n pre?: SimulationResponseStateDiff;\n\n /** Updated blockchain state after the transaction. */\n post?: SimulationResponseStateDiff;\n };\n};\n\n/** Response from the simulation API. */\nexport type SimulationResponse = {\n /** Simulation data for each transaction in the request. */\n transactions: SimulationResponseTransaction[];\n};\n\n/** Data for a network supported by the Simulation API. */\ntype SimulationNetwork = {\n /** Subdomain of the API for the network. */\n network: string;\n\n /** Whether the network supports confirmation simulations. */\n confirmations: boolean;\n};\n\n/** Response from the simulation API containing supported networks. */\ntype SimulationNetworkResponse = {\n [chainIdDecimal: string]: SimulationNetwork;\n};\n\nlet requestIdCounter = 0;\n\n/**\n * Simulate transactions using the transaction simulation API.\n * @param chainId - The chain ID to simulate transactions on.\n * @param request - The request to simulate transactions.\n */\nexport async function simulateTransactions(\n chainId: Hex,\n request: SimulationRequest,\n): Promise<SimulationResponse> {\n const url = await getSimulationUrl(chainId);\n\n log('Sending request', url, request);\n\n const requestId = requestIdCounter;\n requestIdCounter += 1;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n id: String(requestId),\n jsonrpc: '2.0',\n method: RPC_METHOD,\n params: [request],\n }),\n });\n\n const responseJson = await response.json();\n\n log('Received response', responseJson);\n\n if (responseJson.error) {\n throw responseJson.error;\n }\n\n return responseJson?.result;\n}\n\n/**\n * Get the URL for the transaction simulation API.\n * @param chainId - The chain ID to get the URL for.\n * @returns The URL for the transaction simulation API.\n */\nasync function getSimulationUrl(chainId: Hex): Promise<string> {\n const networkData = await getNetworkData();\n const chainIdDecimal = convertHexToDecimal(chainId);\n const network = networkData[chainIdDecimal];\n\n if (!network?.confirmations) {\n log('Chain is not supported', chainId);\n throw new Error(`Chain is not supported: ${chainId}`);\n }\n\n return getUrl(network.network);\n}\n\n/**\n * Retrieve the supported network data from the simulation API.\n */\nasync function getNetworkData(): Promise<SimulationNetworkResponse> {\n const url = `${getUrl('ethereum-mainnet')}${ENDPOINT_NETWORKS}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Generate the URL for the specified subdomain in the simulation API.\n * @param subdomain - The subdomain to generate the URL for.\n * @returns The URL for the transaction simulation API.\n */\nfunction getUrl(subdomain: string): string {\n return BASE_URL.replace('{0}', subdomain);\n}\n"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
determineTransactionType
|
|
3
|
-
} from "./chunk-JRBREX22.mjs";
|
|
4
1
|
import {
|
|
5
2
|
validateTransactionOrigin,
|
|
6
3
|
validateTxParams
|
|
@@ -9,7 +6,7 @@ import {
|
|
|
9
6
|
addGasBuffer,
|
|
10
7
|
estimateGas,
|
|
11
8
|
updateGas
|
|
12
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-XKNFL657.mjs";
|
|
13
10
|
import {
|
|
14
11
|
addInitialHistorySnapshot,
|
|
15
12
|
updateTransactionHistory
|
|
@@ -20,19 +17,22 @@ import {
|
|
|
20
17
|
} from "./chunk-NHRBO3LU.mjs";
|
|
21
18
|
import {
|
|
22
19
|
getSimulationData
|
|
23
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-BYBPZUHS.mjs";
|
|
21
|
+
import {
|
|
22
|
+
determineTransactionType
|
|
23
|
+
} from "./chunk-JRBREX22.mjs";
|
|
24
24
|
import {
|
|
25
25
|
GasFeePoller
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-5UL3VDFT.mjs";
|
|
27
|
+
import {
|
|
28
|
+
updateTransactionLayer1GasFee
|
|
29
|
+
} from "./chunk-KFL2GGZC.mjs";
|
|
27
30
|
import {
|
|
28
31
|
IncomingTransactionHelper
|
|
29
32
|
} from "./chunk-Y7ENNK7L.mjs";
|
|
30
33
|
import {
|
|
31
34
|
MultichainTrackingHelper
|
|
32
|
-
} from "./chunk-
|
|
33
|
-
import {
|
|
34
|
-
EtherscanRemoteTransactionSource
|
|
35
|
-
} from "./chunk-RU6NJIUD.mjs";
|
|
35
|
+
} from "./chunk-ZQFMTLZJ.mjs";
|
|
36
36
|
import {
|
|
37
37
|
PendingTransactionTracker
|
|
38
38
|
} from "./chunk-JRQHIBG5.mjs";
|
|
@@ -41,17 +41,17 @@ import {
|
|
|
41
41
|
} from "./chunk-FRKQ3Z2L.mjs";
|
|
42
42
|
import {
|
|
43
43
|
LineaGasFeeFlow
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-PGTV7236.mjs";
|
|
45
45
|
import {
|
|
46
46
|
DefaultGasFeeFlow
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-QRSTF45Q.mjs";
|
|
48
48
|
import {
|
|
49
49
|
updateGasFees
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-IK55QTGO.mjs";
|
|
51
51
|
import {
|
|
52
52
|
updatePostTransactionBalance,
|
|
53
53
|
updateSwapsTransaction
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-3D3SA6PY.mjs";
|
|
55
55
|
import {
|
|
56
56
|
getIncreasedPriceFromExisting,
|
|
57
57
|
isEIP1559Transaction,
|
|
@@ -65,12 +65,8 @@ import {
|
|
|
65
65
|
validateMinimumIncrease
|
|
66
66
|
} from "./chunk-J56A7UCK.mjs";
|
|
67
67
|
import {
|
|
68
|
-
|
|
69
|
-
} from "./chunk-
|
|
70
|
-
import {
|
|
71
|
-
getTransactionLayer1GasFee,
|
|
72
|
-
updateTransactionLayer1GasFee
|
|
73
|
-
} from "./chunk-OXRUL7JF.mjs";
|
|
68
|
+
EtherscanRemoteTransactionSource
|
|
69
|
+
} from "./chunk-IZI7FQIN.mjs";
|
|
74
70
|
import {
|
|
75
71
|
projectLogger
|
|
76
72
|
} from "./chunk-UQQWZT6C.mjs";
|
|
@@ -100,7 +96,7 @@ import { add0x } from "@metamask/utils";
|
|
|
100
96
|
import { Mutex } from "async-mutex";
|
|
101
97
|
import { MethodRegistry } from "eth-method-registry";
|
|
102
98
|
import { EventEmitter } from "events";
|
|
103
|
-
import { cloneDeep, mapValues, merge, pickBy, sortBy } from "lodash";
|
|
99
|
+
import { cloneDeep, mapValues, merge, pickBy, sortBy, isEqual } from "lodash";
|
|
104
100
|
import { NonceTracker } from "nonce-tracker";
|
|
105
101
|
import { v1 as random } from "uuid";
|
|
106
102
|
var metadata = {
|
|
@@ -134,7 +130,7 @@ function getDefaultTransactionControllerState() {
|
|
|
134
130
|
lastFetchedBlockNumbers: {}
|
|
135
131
|
};
|
|
136
132
|
}
|
|
137
|
-
var _internalEvents, _incomingTransactionOptions, _pendingTransactionOptions, _transactionHistoryLimit, _isSimulationEnabled, _multichainTrackingHelper, _createNonceTracker, createNonceTracker_fn, _createIncomingTransactionHelper, createIncomingTransactionHelper_fn, _createPendingTransactionTracker, createPendingTransactionTracker_fn, _checkForPendingTransactionAndStartPolling, _stopAllTracking, stopAllTracking_fn, _removeIncomingTransactionHelperListeners, removeIncomingTransactionHelperListeners_fn, _addIncomingTransactionHelperListeners, addIncomingTransactionHelperListeners_fn, _removePendingTransactionTrackerListeners, removePendingTransactionTrackerListeners_fn, _addPendingTransactionTrackerListeners, addPendingTransactionTrackerListeners_fn, _getNonceTrackerPendingTransactions, getNonceTrackerPendingTransactions_fn, _getGasFeeFlows, getGasFeeFlows_fn, _getLayer1GasFeeFlows, getLayer1GasFeeFlows_fn, _updateTransactionInternal, updateTransactionInternal_fn,
|
|
133
|
+
var _internalEvents, _incomingTransactionOptions, _pendingTransactionOptions, _transactionHistoryLimit, _isSimulationEnabled, _multichainTrackingHelper, _createNonceTracker, createNonceTracker_fn, _createIncomingTransactionHelper, createIncomingTransactionHelper_fn, _createPendingTransactionTracker, createPendingTransactionTracker_fn, _checkForPendingTransactionAndStartPolling, _stopAllTracking, stopAllTracking_fn, _removeIncomingTransactionHelperListeners, removeIncomingTransactionHelperListeners_fn, _addIncomingTransactionHelperListeners, addIncomingTransactionHelperListeners_fn, _removePendingTransactionTrackerListeners, removePendingTransactionTrackerListeners_fn, _addPendingTransactionTrackerListeners, addPendingTransactionTrackerListeners_fn, _getNonceTrackerPendingTransactions, getNonceTrackerPendingTransactions_fn, _getGasFeeFlows, getGasFeeFlows_fn, _getLayer1GasFeeFlows, getLayer1GasFeeFlows_fn, _updateTransactionInternal, updateTransactionInternal_fn, _checkIfTransactionParamsUpdated, checkIfTransactionParamsUpdated_fn, _onTransactionParamsUpdated, onTransactionParamsUpdated_fn, _updateSimulationData, updateSimulationData_fn;
|
|
138
134
|
var TransactionController = class extends BaseController {
|
|
139
135
|
/**
|
|
140
136
|
* Constructs a TransactionController.
|
|
@@ -214,7 +210,9 @@ var TransactionController = class extends BaseController {
|
|
|
214
210
|
__privateAdd(this, _getGasFeeFlows);
|
|
215
211
|
__privateAdd(this, _getLayer1GasFeeFlows);
|
|
216
212
|
__privateAdd(this, _updateTransactionInternal);
|
|
217
|
-
__privateAdd(this,
|
|
213
|
+
__privateAdd(this, _checkIfTransactionParamsUpdated);
|
|
214
|
+
__privateAdd(this, _onTransactionParamsUpdated);
|
|
215
|
+
__privateAdd(this, _updateSimulationData);
|
|
218
216
|
__privateAdd(this, _internalEvents, new EventEmitter());
|
|
219
217
|
this.inProcessOfSigning = /* @__PURE__ */ new Set();
|
|
220
218
|
this.mutex = new Mutex();
|
|
@@ -310,10 +308,6 @@ var TransactionController = class extends BaseController {
|
|
|
310
308
|
chainId
|
|
311
309
|
}),
|
|
312
310
|
getGasFeeControllerEstimates: this.getGasFeeEstimates,
|
|
313
|
-
getProvider: (chainId, networkClientId) => __privateGet(this, _multichainTrackingHelper).getProvider({
|
|
314
|
-
networkClientId,
|
|
315
|
-
chainId
|
|
316
|
-
}),
|
|
317
311
|
getTransactions: () => this.state.transactions,
|
|
318
312
|
layer1GasFeeFlows: this.layer1GasFeeFlows,
|
|
319
313
|
onStateChange: (listener) => {
|
|
@@ -484,10 +478,7 @@ var TransactionController = class extends BaseController {
|
|
|
484
478
|
type: transactionType,
|
|
485
479
|
networkClientId
|
|
486
480
|
};
|
|
487
|
-
await
|
|
488
|
-
this.updateGasProperties(addedTransactionMeta),
|
|
489
|
-
__privateMethod(this, _simulateTransaction, simulateTransaction_fn).call(this, addedTransactionMeta)
|
|
490
|
-
]);
|
|
481
|
+
await this.updateGasProperties(addedTransactionMeta);
|
|
491
482
|
if (!existingTransactionMeta) {
|
|
492
483
|
if (method && this.securityProviderRequest) {
|
|
493
484
|
const securityProviderResponse = await this.securityProviderRequest(
|
|
@@ -513,6 +504,7 @@ var TransactionController = class extends BaseController {
|
|
|
513
504
|
}
|
|
514
505
|
);
|
|
515
506
|
this.addMetadata(addedTransactionMeta);
|
|
507
|
+
__privateMethod(this, _updateSimulationData, updateSimulationData_fn).call(this, addedTransactionMeta);
|
|
516
508
|
this.messagingSystem.publish(
|
|
517
509
|
`${controllerName}:unapprovedTransactionAdded`,
|
|
518
510
|
addedTransactionMeta
|
|
@@ -1149,18 +1141,14 @@ var TransactionController = class extends BaseController {
|
|
|
1149
1141
|
networkClientId: transactionMeta.networkClientId,
|
|
1150
1142
|
chainId: transactionMeta.chainId
|
|
1151
1143
|
});
|
|
1152
|
-
const provider = __privateGet(this, _multichainTrackingHelper).getProvider({
|
|
1153
|
-
chainId: transactionMeta.chainId,
|
|
1154
|
-
networkClientId: transactionMeta.networkClientId
|
|
1155
|
-
});
|
|
1156
1144
|
const { type } = await determineTransactionType(
|
|
1157
1145
|
updatedTransaction.txParams,
|
|
1158
1146
|
ethQuery
|
|
1159
1147
|
);
|
|
1160
1148
|
updatedTransaction.type = type;
|
|
1161
1149
|
await updateTransactionLayer1GasFee({
|
|
1150
|
+
ethQuery,
|
|
1162
1151
|
layer1GasFeeFlows: this.layer1GasFeeFlows,
|
|
1163
|
-
provider,
|
|
1164
1152
|
transactionMeta: updatedTransaction
|
|
1165
1153
|
});
|
|
1166
1154
|
this.updateTransaction(
|
|
@@ -1281,6 +1269,10 @@ var TransactionController = class extends BaseController {
|
|
|
1281
1269
|
`${controllerName}:transactionFinished`,
|
|
1282
1270
|
updatedTransactionMeta
|
|
1283
1271
|
);
|
|
1272
|
+
__privateGet(this, _internalEvents).emit(
|
|
1273
|
+
`${updatedTransactionMeta.id}:finished`,
|
|
1274
|
+
updatedTransactionMeta
|
|
1275
|
+
);
|
|
1284
1276
|
}
|
|
1285
1277
|
}
|
|
1286
1278
|
/**
|
|
@@ -1364,28 +1356,6 @@ var TransactionController = class extends BaseController {
|
|
|
1364
1356
|
}
|
|
1365
1357
|
return filteredTransactions;
|
|
1366
1358
|
}
|
|
1367
|
-
/**
|
|
1368
|
-
* Utility method to get the layer 1 gas fee for given transaction params.
|
|
1369
|
-
*
|
|
1370
|
-
* @param chainId - Estimated transaction chainId.
|
|
1371
|
-
* @param networkClientId - Estimated transaction networkClientId.
|
|
1372
|
-
* @param transactionParams - The transaction params to estimate layer 1 gas fee for.
|
|
1373
|
-
*/
|
|
1374
|
-
async getLayer1GasFee(chainId, networkClientId, transactionParams) {
|
|
1375
|
-
const provider = __privateGet(this, _multichainTrackingHelper).getProvider({
|
|
1376
|
-
networkClientId,
|
|
1377
|
-
chainId
|
|
1378
|
-
});
|
|
1379
|
-
const layer1GasFee = await getTransactionLayer1GasFee({
|
|
1380
|
-
layer1GasFeeFlows: this.layer1GasFeeFlows,
|
|
1381
|
-
provider,
|
|
1382
|
-
transactionMeta: {
|
|
1383
|
-
txParams: transactionParams,
|
|
1384
|
-
chainId
|
|
1385
|
-
}
|
|
1386
|
-
});
|
|
1387
|
-
return layer1GasFee;
|
|
1388
|
-
}
|
|
1389
1359
|
async signExternalTransaction(chainId, transactionParams) {
|
|
1390
1360
|
if (!this.sign) {
|
|
1391
1361
|
throw new Error("No sign method defined.");
|
|
@@ -1457,10 +1427,6 @@ var TransactionController = class extends BaseController {
|
|
|
1457
1427
|
networkClientId,
|
|
1458
1428
|
chainId
|
|
1459
1429
|
});
|
|
1460
|
-
const provider = __privateGet(this, _multichainTrackingHelper).getProvider({
|
|
1461
|
-
networkClientId,
|
|
1462
|
-
chainId
|
|
1463
|
-
});
|
|
1464
1430
|
await updateGas({
|
|
1465
1431
|
ethQuery,
|
|
1466
1432
|
chainId,
|
|
@@ -1476,8 +1442,8 @@ var TransactionController = class extends BaseController {
|
|
|
1476
1442
|
txMeta: transactionMeta
|
|
1477
1443
|
});
|
|
1478
1444
|
await updateTransactionLayer1GasFee({
|
|
1445
|
+
ethQuery,
|
|
1479
1446
|
layer1GasFeeFlows: this.layer1GasFeeFlows,
|
|
1480
|
-
provider,
|
|
1481
1447
|
transactionMeta
|
|
1482
1448
|
});
|
|
1483
1449
|
}
|
|
@@ -2322,7 +2288,7 @@ getGasFeeFlows_fn = function() {
|
|
|
2322
2288
|
};
|
|
2323
2289
|
_getLayer1GasFeeFlows = new WeakSet();
|
|
2324
2290
|
getLayer1GasFeeFlows_fn = function() {
|
|
2325
|
-
return [
|
|
2291
|
+
return [];
|
|
2326
2292
|
};
|
|
2327
2293
|
_updateTransactionInternal = new WeakSet();
|
|
2328
2294
|
updateTransactionInternal_fn = function(transactionMeta, { note, skipHistory }) {
|
|
@@ -2331,6 +2297,7 @@ updateTransactionInternal_fn = function(transactionMeta, { note, skipHistory })
|
|
|
2331
2297
|
txParams: normalizeTransactionParams(transactionMeta.txParams)
|
|
2332
2298
|
};
|
|
2333
2299
|
validateTxParams(normalizedTransaction.txParams);
|
|
2300
|
+
const updatedTransactionParams = __privateMethod(this, _checkIfTransactionParamsUpdated, checkIfTransactionParamsUpdated_fn).call(this, normalizedTransaction);
|
|
2334
2301
|
const transactionWithUpdatedHistory = skipHistory === true ? normalizedTransaction : updateTransactionHistory(
|
|
2335
2302
|
normalizedTransaction,
|
|
2336
2303
|
note ?? "Transaction updated"
|
|
@@ -2341,23 +2308,74 @@ updateTransactionInternal_fn = function(transactionMeta, { note, skipHistory })
|
|
|
2341
2308
|
);
|
|
2342
2309
|
state.transactions[index] = transactionWithUpdatedHistory;
|
|
2343
2310
|
});
|
|
2311
|
+
if (updatedTransactionParams.length > 0) {
|
|
2312
|
+
__privateMethod(this, _onTransactionParamsUpdated, onTransactionParamsUpdated_fn).call(this, normalizedTransaction, updatedTransactionParams);
|
|
2313
|
+
}
|
|
2344
2314
|
};
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2315
|
+
_checkIfTransactionParamsUpdated = new WeakSet();
|
|
2316
|
+
checkIfTransactionParamsUpdated_fn = function(newTransactionMeta) {
|
|
2317
|
+
const { id: transactionId, txParams: newParams } = newTransactionMeta;
|
|
2318
|
+
const originalParams = this.getTransaction(transactionId)?.txParams;
|
|
2319
|
+
if (!originalParams || isEqual(originalParams, newParams)) {
|
|
2320
|
+
return [];
|
|
2321
|
+
}
|
|
2322
|
+
const params = Object.keys(newParams);
|
|
2323
|
+
const updatedProperties = params.filter(
|
|
2324
|
+
(param) => newParams[param] !== originalParams[param]
|
|
2325
|
+
);
|
|
2326
|
+
projectLogger(
|
|
2327
|
+
"Transaction parameters have been updated",
|
|
2328
|
+
transactionId,
|
|
2329
|
+
updatedProperties,
|
|
2330
|
+
originalParams,
|
|
2331
|
+
newParams
|
|
2332
|
+
);
|
|
2333
|
+
return updatedProperties;
|
|
2334
|
+
};
|
|
2335
|
+
_onTransactionParamsUpdated = new WeakSet();
|
|
2336
|
+
onTransactionParamsUpdated_fn = function(transactionMeta, updatedParams) {
|
|
2337
|
+
if (["to", "value", "data"].some(
|
|
2338
|
+
(param) => updatedParams.includes(param)
|
|
2339
|
+
)) {
|
|
2340
|
+
projectLogger("Updating simulation data due to transaction parameter update");
|
|
2341
|
+
__privateMethod(this, _updateSimulationData, updateSimulationData_fn).call(this, transactionMeta);
|
|
2350
2342
|
}
|
|
2351
|
-
|
|
2343
|
+
};
|
|
2344
|
+
_updateSimulationData = new WeakSet();
|
|
2345
|
+
updateSimulationData_fn = async function(transactionMeta) {
|
|
2346
|
+
const { id, chainId, txParams } = transactionMeta;
|
|
2352
2347
|
const { from, to, value, data } = txParams;
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
}
|
|
2360
|
-
|
|
2348
|
+
let simulationData = {
|
|
2349
|
+
error: {
|
|
2350
|
+
message: "Simulation disabled",
|
|
2351
|
+
isReverted: false
|
|
2352
|
+
},
|
|
2353
|
+
tokenBalanceChanges: []
|
|
2354
|
+
};
|
|
2355
|
+
if (__privateGet(this, _isSimulationEnabled).call(this)) {
|
|
2356
|
+
__privateMethod(this, _updateTransactionInternal, updateTransactionInternal_fn).call(this, { ...transactionMeta, simulationData: void 0 }, { skipHistory: true });
|
|
2357
|
+
simulationData = await getSimulationData({
|
|
2358
|
+
chainId,
|
|
2359
|
+
from,
|
|
2360
|
+
to,
|
|
2361
|
+
value,
|
|
2362
|
+
data
|
|
2363
|
+
});
|
|
2364
|
+
}
|
|
2365
|
+
const finalTransactionMeta = this.getTransaction(id);
|
|
2366
|
+
if (!finalTransactionMeta) {
|
|
2367
|
+
projectLogger(
|
|
2368
|
+
"Cannot update simulation data as transaction not found",
|
|
2369
|
+
id,
|
|
2370
|
+
simulationData
|
|
2371
|
+
);
|
|
2372
|
+
return;
|
|
2373
|
+
}
|
|
2374
|
+
this.updateTransaction(
|
|
2375
|
+
{ ...finalTransactionMeta, simulationData },
|
|
2376
|
+
"TransactionController#updateSimulationData - Update simulation data"
|
|
2377
|
+
);
|
|
2378
|
+
projectLogger("Updated simulation data", id, simulationData);
|
|
2361
2379
|
};
|
|
2362
2380
|
|
|
2363
2381
|
export {
|
|
@@ -2367,4 +2385,4 @@ export {
|
|
|
2367
2385
|
ApprovalState,
|
|
2368
2386
|
TransactionController
|
|
2369
2387
|
};
|
|
2370
|
-
//# sourceMappingURL=chunk-
|
|
2388
|
+
//# sourceMappingURL=chunk-I6RY3XOG.mjs.map
|