@metamask/transaction-controller 24.0.0 → 25.1.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 +129 -1
- package/dist/TransactionController.js +39 -1816
- package/dist/TransactionController.js.map +1 -1
- package/dist/TransactionController.mjs +40 -0
- package/dist/TransactionController.mjs.map +1 -0
- package/dist/chunk-2YXA3K67.mjs +62 -0
- package/dist/chunk-2YXA3K67.mjs.map +1 -0
- package/dist/chunk-3D3SA6PY.mjs +211 -0
- package/dist/chunk-3D3SA6PY.mjs.map +1 -0
- package/dist/chunk-4S25HUCL.js +46 -0
- package/dist/chunk-4S25HUCL.js.map +1 -0
- package/dist/chunk-5OQ373JS.js +211 -0
- package/dist/chunk-5OQ373JS.js.map +1 -0
- package/dist/chunk-5XBULBP2.js +399 -0
- package/dist/chunk-5XBULBP2.js.map +1 -0
- package/dist/chunk-72OTU5ZW.mjs +2332 -0
- package/dist/chunk-72OTU5ZW.mjs.map +1 -0
- package/dist/chunk-7LXE4KHV.js +40 -0
- package/dist/chunk-7LXE4KHV.js.map +1 -0
- package/dist/chunk-7XPI7KU5.mjs +46 -0
- package/dist/chunk-7XPI7KU5.mjs.map +1 -0
- package/dist/chunk-BILEZLAT.js +182 -0
- package/dist/chunk-BILEZLAT.js.map +1 -0
- package/dist/chunk-CQBXHAYR.js +121 -0
- package/dist/chunk-CQBXHAYR.js.map +1 -0
- package/dist/chunk-CXXGL43K.js +85 -0
- package/dist/chunk-CXXGL43K.js.map +1 -0
- package/dist/chunk-DTDTOMTB.js +238 -0
- package/dist/chunk-DTDTOMTB.js.map +1 -0
- package/dist/chunk-DTONMSFW.mjs +208 -0
- package/dist/chunk-DTONMSFW.mjs.map +1 -0
- package/dist/chunk-EEMJC7S7.mjs +182 -0
- package/dist/chunk-EEMJC7S7.mjs.map +1 -0
- package/dist/chunk-F3CMU2DM.js +170 -0
- package/dist/chunk-F3CMU2DM.js.map +1 -0
- package/dist/chunk-FRKQ3Z2L.mjs +40 -0
- package/dist/chunk-FRKQ3Z2L.mjs.map +1 -0
- package/dist/chunk-HS277C77.js +75 -0
- package/dist/chunk-HS277C77.js.map +1 -0
- package/dist/chunk-ITDY6AIZ.js +127 -0
- package/dist/chunk-ITDY6AIZ.js.map +1 -0
- package/dist/chunk-IZI7FQIN.mjs +170 -0
- package/dist/chunk-IZI7FQIN.mjs.map +1 -0
- package/dist/chunk-J56A7UCK.mjs +123 -0
- package/dist/chunk-J56A7UCK.mjs.map +1 -0
- package/dist/chunk-JRBREX22.mjs +75 -0
- package/dist/chunk-JRBREX22.mjs.map +1 -0
- package/dist/chunk-JRQHIBG5.mjs +399 -0
- package/dist/chunk-JRQHIBG5.mjs.map +1 -0
- package/dist/chunk-K26EBMGI.mjs +121 -0
- package/dist/chunk-K26EBMGI.mjs.map +1 -0
- package/dist/chunk-KFL2GGZC.mjs +48 -0
- package/dist/chunk-KFL2GGZC.mjs.map +1 -0
- package/dist/chunk-NHRBO3LU.mjs +50 -0
- package/dist/chunk-NHRBO3LU.mjs.map +1 -0
- package/dist/chunk-NM4LTWRU.mjs +76 -0
- package/dist/chunk-NM4LTWRU.mjs.map +1 -0
- package/dist/chunk-NM6OYEPP.mjs +182 -0
- package/dist/chunk-NM6OYEPP.mjs.map +1 -0
- package/dist/chunk-NRWEI43Q.js +320 -0
- package/dist/chunk-NRWEI43Q.js.map +1 -0
- package/dist/chunk-O7H2MC7R.js +62 -0
- package/dist/chunk-O7H2MC7R.js.map +1 -0
- package/dist/chunk-OF6NSLXF.mjs +90 -0
- package/dist/chunk-OF6NSLXF.mjs.map +1 -0
- package/dist/chunk-QDIYZX5V.js +2332 -0
- package/dist/chunk-QDIYZX5V.js.map +1 -0
- package/dist/chunk-QP75SWIQ.js +53 -0
- package/dist/chunk-QP75SWIQ.js.map +1 -0
- package/dist/chunk-QPNEFZB3.js +208 -0
- package/dist/chunk-QPNEFZB3.js.map +1 -0
- package/dist/chunk-QSBIXUMB.mjs +242 -0
- package/dist/chunk-QSBIXUMB.mjs.map +1 -0
- package/dist/chunk-R7NJVDWN.js +48 -0
- package/dist/chunk-R7NJVDWN.js.map +1 -0
- package/dist/chunk-RQKICZYP.js +137 -0
- package/dist/chunk-RQKICZYP.js.map +1 -0
- package/dist/chunk-S6VGOPUY.js +14 -0
- package/dist/chunk-S6VGOPUY.js.map +1 -0
- package/dist/chunk-TXVH44HM.js +90 -0
- package/dist/chunk-TXVH44HM.js.map +1 -0
- package/dist/chunk-UGFBA4GV.js +123 -0
- package/dist/chunk-UGFBA4GV.js.map +1 -0
- package/dist/chunk-UQQWZT6C.mjs +14 -0
- package/dist/chunk-UQQWZT6C.mjs.map +1 -0
- package/dist/chunk-VEREDMI2.mjs +85 -0
- package/dist/chunk-VEREDMI2.mjs.map +1 -0
- package/dist/chunk-VH47Q6TS.js +182 -0
- package/dist/chunk-VH47Q6TS.js.map +1 -0
- package/dist/chunk-W3GAOR7Y.js +76 -0
- package/dist/chunk-W3GAOR7Y.js.map +1 -0
- package/dist/chunk-WXQZIUNW.js +242 -0
- package/dist/chunk-WXQZIUNW.js.map +1 -0
- package/dist/chunk-XGRAHX6T.mjs +53 -0
- package/dist/chunk-XGRAHX6T.mjs.map +1 -0
- package/dist/chunk-XKNFL657.mjs +137 -0
- package/dist/chunk-XKNFL657.mjs.map +1 -0
- package/dist/chunk-XUI43LEZ.mjs +30 -0
- package/dist/chunk-XUI43LEZ.mjs.map +1 -0
- package/dist/chunk-Y7ENNK7L.mjs +238 -0
- package/dist/chunk-Y7ENNK7L.mjs.map +1 -0
- package/dist/chunk-Z3HHSD5I.mjs +127 -0
- package/dist/chunk-Z3HHSD5I.mjs.map +1 -0
- package/dist/chunk-Z4BLTVTB.js +30 -0
- package/dist/chunk-Z4BLTVTB.js.map +1 -0
- package/dist/chunk-ZNZEJDOE.js +50 -0
- package/dist/chunk-ZNZEJDOE.js.map +1 -0
- package/dist/chunk-ZQFMTLZJ.mjs +320 -0
- package/dist/chunk-ZQFMTLZJ.mjs.map +1 -0
- package/dist/constants.js +15 -110
- package/dist/constants.js.map +1 -1
- package/dist/constants.mjs +16 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/gas-flows/DefaultGasFeeFlow.js +14 -77
- package/dist/gas-flows/DefaultGasFeeFlow.js.map +1 -1
- package/dist/gas-flows/DefaultGasFeeFlow.mjs +15 -0
- package/dist/gas-flows/DefaultGasFeeFlow.mjs.map +1 -0
- package/dist/gas-flows/LineaGasFeeFlow.js +15 -110
- package/dist/gas-flows/LineaGasFeeFlow.js.map +1 -1
- package/dist/gas-flows/LineaGasFeeFlow.mjs +16 -0
- package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.js +11 -145
- package/dist/helpers/EtherscanRemoteTransactionSource.js.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs +12 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +1 -0
- package/dist/helpers/GasFeePoller.js +11 -143
- package/dist/helpers/GasFeePoller.js.map +1 -1
- package/dist/helpers/GasFeePoller.mjs +12 -0
- package/dist/helpers/GasFeePoller.mjs.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.js +8 -205
- package/dist/helpers/IncomingTransactionHelper.js.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.mjs +9 -0
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -0
- package/dist/helpers/MultichainTrackingHelper.js +12 -291
- package/dist/helpers/MultichainTrackingHelper.js.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +13 -0
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -0
- package/dist/helpers/PendingTransactionTracker.js +9 -360
- package/dist/helpers/PendingTransactionTracker.js.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +10 -0
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -0
- package/dist/index.js +57 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +58 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger.js +11 -8
- package/dist/logger.js.map +1 -1
- package/dist/logger.mjs +12 -0
- package/dist/logger.mjs.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/{TransactionController.d.ts → types/TransactionController.d.ts} +236 -46
- package/dist/types/TransactionController.d.ts.map +1 -0
- package/dist/{constants.d.ts → types/constants.d.ts} +10 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/gas-flows/DefaultGasFeeFlow.d.ts.map +1 -0
- package/dist/types/gas-flows/LineaGasFeeFlow.d.ts.map +1 -0
- package/dist/types/helpers/EtherscanRemoteTransactionSource.d.ts.map +1 -0
- package/dist/{helpers → types/helpers}/GasFeePoller.d.ts +5 -3
- package/dist/types/helpers/GasFeePoller.d.ts.map +1 -0
- package/dist/types/helpers/IncomingTransactionHelper.d.ts.map +1 -0
- package/dist/types/helpers/MultichainTrackingHelper.d.ts.map +1 -0
- package/dist/types/helpers/PendingTransactionTracker.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +94 -65
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils/etherscan.d.ts.map +1 -0
- package/dist/types/utils/external-transactions.d.ts.map +1 -0
- package/dist/types/utils/gas-fees.d.ts.map +1 -0
- package/dist/types/utils/gas-flow.d.ts.map +1 -0
- package/dist/types/utils/gas.d.ts.map +1 -0
- package/dist/types/utils/history.d.ts +20 -0
- package/dist/types/utils/history.d.ts.map +1 -0
- package/dist/types/utils/layer1-gas-fee-flow.d.ts +16 -0
- package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +1 -0
- package/dist/types/utils/nonce.d.ts.map +1 -0
- package/dist/types/utils/simulation-api.d.ts +99 -0
- package/dist/types/utils/simulation-api.d.ts.map +1 -0
- package/dist/types/utils/simulation.d.ts +21 -0
- package/dist/types/utils/simulation.d.ts.map +1 -0
- package/dist/{utils → types/utils}/swaps.d.ts +8 -5
- package/dist/types/utils/swaps.d.ts.map +1 -0
- package/dist/types/utils/transaction-type.d.ts.map +1 -0
- package/dist/types/utils/utils.d.ts.map +1 -0
- package/dist/types/utils/validation.d.ts.map +1 -0
- package/dist/types.js +19 -170
- package/dist/types.js.map +1 -1
- package/dist/types.mjs +20 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils/etherscan.js +13 -118
- package/dist/utils/etherscan.js.map +1 -1
- package/dist/utils/etherscan.mjs +14 -0
- package/dist/utils/etherscan.mjs.map +1 -0
- package/dist/utils/external-transactions.js +8 -35
- package/dist/utils/external-transactions.js.map +1 -1
- package/dist/utils/external-transactions.mjs +9 -0
- package/dist/utils/external-transactions.mjs.map +1 -0
- package/dist/utils/gas-fees.js +15 -200
- package/dist/utils/gas-fees.js.map +1 -1
- package/dist/utils/gas-fees.mjs +16 -0
- package/dist/utils/gas-fees.mjs.map +1 -0
- package/dist/utils/gas-flow.js +10 -52
- package/dist/utils/gas-flow.js.map +1 -1
- package/dist/utils/gas-flow.mjs +11 -0
- package/dist/utils/gas-flow.mjs.map +1 -0
- package/dist/utils/gas.js +19 -133
- package/dist/utils/gas.js.map +1 -1
- package/dist/utils/gas.mjs +20 -0
- package/dist/utils/gas.mjs.map +1 -0
- package/dist/utils/history.js +9 -83
- package/dist/utils/history.js.map +1 -1
- package/dist/utils/history.mjs +10 -0
- package/dist/utils/history.mjs.map +1 -0
- package/dist/utils/layer1-gas-fee-flow.js +9 -0
- package/dist/utils/layer1-gas-fee-flow.js.map +1 -0
- package/dist/utils/layer1-gas-fee-flow.mjs +9 -0
- package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -0
- package/dist/utils/nonce.js +10 -76
- package/dist/utils/nonce.js.map +1 -1
- package/dist/utils/nonce.mjs +11 -0
- package/dist/utils/nonce.mjs.map +1 -0
- package/dist/utils/simulation-api.js +10 -0
- package/dist/utils/simulation-api.js.map +1 -0
- package/dist/utils/simulation-api.mjs +10 -0
- package/dist/utils/simulation-api.mjs.map +1 -0
- package/dist/utils/simulation.js +12 -0
- package/dist/utils/simulation.js.map +1 -0
- package/dist/utils/simulation.mjs +12 -0
- package/dist/utils/simulation.mjs.map +1 -0
- package/dist/utils/swaps.js +23 -256
- package/dist/utils/swaps.js.map +1 -1
- package/dist/utils/swaps.mjs +24 -0
- package/dist/utils/swaps.mjs.map +1 -0
- package/dist/utils/transaction-type.js +10 -120
- package/dist/utils/transaction-type.js.map +1 -1
- package/dist/utils/transaction-type.mjs +11 -0
- package/dist/utils/transaction-type.mjs.map +1 -0
- package/dist/utils/utils.js +32 -160
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/utils.mjs +33 -0
- package/dist/utils/utils.mjs.map +1 -0
- package/dist/utils/validation.js +11 -258
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/validation.mjs +12 -0
- package/dist/utils/validation.mjs.map +1 -0
- package/package.json +22 -10
- package/dist/TransactionController.d.ts.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/gas-flows/DefaultGasFeeFlow.d.ts.map +0 -1
- package/dist/gas-flows/LineaGasFeeFlow.d.ts.map +0 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.d.ts.map +0 -1
- package/dist/helpers/GasFeePoller.d.ts.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.d.ts.map +0 -1
- package/dist/helpers/MultichainTrackingHelper.d.ts.map +0 -1
- package/dist/helpers/PendingTransactionTracker.d.ts.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/etherscan.d.ts.map +0 -1
- package/dist/utils/external-transactions.d.ts.map +0 -1
- package/dist/utils/gas-fees.d.ts.map +0 -1
- package/dist/utils/gas-flow.d.ts.map +0 -1
- package/dist/utils/gas.d.ts.map +0 -1
- package/dist/utils/history.d.ts +0 -15
- package/dist/utils/history.d.ts.map +0 -1
- package/dist/utils/nonce.d.ts.map +0 -1
- package/dist/utils/swaps.d.ts.map +0 -1
- package/dist/utils/transaction-type.d.ts.map +0 -1
- package/dist/utils/utils.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- /package/dist/{gas-flows → types/gas-flows}/DefaultGasFeeFlow.d.ts +0 -0
- /package/dist/{gas-flows → types/gas-flows}/LineaGasFeeFlow.d.ts +0 -0
- /package/dist/{helpers → types/helpers}/EtherscanRemoteTransactionSource.d.ts +0 -0
- /package/dist/{helpers → types/helpers}/IncomingTransactionHelper.d.ts +0 -0
- /package/dist/{helpers → types/helpers}/MultichainTrackingHelper.d.ts +0 -0
- /package/dist/{helpers → types/helpers}/PendingTransactionTracker.d.ts +0 -0
- /package/dist/{logger.d.ts → types/logger.d.ts} +0 -0
- /package/dist/{utils → types/utils}/etherscan.d.ts +0 -0
- /package/dist/{utils → types/utils}/external-transactions.d.ts +0 -0
- /package/dist/{utils → types/utils}/gas-fees.d.ts +0 -0
- /package/dist/{utils → types/utils}/gas-flow.d.ts +0 -0
- /package/dist/{utils → types/utils}/gas.d.ts +0 -0
- /package/dist/{utils → types/utils}/nonce.d.ts +0 -0
- /package/dist/{utils → types/utils}/transaction-type.d.ts +0 -0
- /package/dist/{utils → types/utils}/utils.d.ts +0 -0
- /package/dist/{utils → types/utils}/validation.d.ts +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/utils/history.ts
|
|
2
|
+
import jsonDiffer from "fast-json-patch";
|
|
3
|
+
import { cloneDeep, merge } from "lodash";
|
|
4
|
+
function addInitialHistorySnapshot(transactionMeta) {
|
|
5
|
+
const snapshot = snapshotFromTransactionMeta(transactionMeta);
|
|
6
|
+
return merge({}, transactionMeta, { history: [snapshot] });
|
|
7
|
+
}
|
|
8
|
+
function updateTransactionHistory(transactionMeta, note) {
|
|
9
|
+
if (!transactionMeta.history) {
|
|
10
|
+
return transactionMeta;
|
|
11
|
+
}
|
|
12
|
+
const currentState = snapshotFromTransactionMeta(transactionMeta);
|
|
13
|
+
const previousState = replayHistory(transactionMeta.history);
|
|
14
|
+
const historyEntry = generateHistoryEntry(previousState, currentState, note);
|
|
15
|
+
if (historyEntry.length > 0) {
|
|
16
|
+
return merge({}, transactionMeta, {
|
|
17
|
+
history: [...transactionMeta.history, historyEntry]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return transactionMeta;
|
|
21
|
+
}
|
|
22
|
+
function generateHistoryEntry(previousState, currentState, note) {
|
|
23
|
+
const historyOperationsEntry = jsonDiffer.compare(
|
|
24
|
+
previousState,
|
|
25
|
+
currentState
|
|
26
|
+
);
|
|
27
|
+
if (historyOperationsEntry[0]) {
|
|
28
|
+
if (note) {
|
|
29
|
+
historyOperationsEntry[0].note = note;
|
|
30
|
+
}
|
|
31
|
+
historyOperationsEntry[0].timestamp = Date.now();
|
|
32
|
+
}
|
|
33
|
+
return historyOperationsEntry;
|
|
34
|
+
}
|
|
35
|
+
function replayHistory(transactionHistory) {
|
|
36
|
+
const shortHistory = cloneDeep(transactionHistory);
|
|
37
|
+
return shortHistory.reduce(
|
|
38
|
+
// TODO: Replace `any` with type
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
(val, entry) => jsonDiffer.applyPatch(val, entry).newDocument
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
function snapshotFromTransactionMeta(transactionMeta) {
|
|
44
|
+
const snapshot = { ...transactionMeta };
|
|
45
|
+
delete snapshot.history;
|
|
46
|
+
return cloneDeep(snapshot);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export {
|
|
50
|
+
addInitialHistorySnapshot,
|
|
51
|
+
updateTransactionHistory
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=chunk-XGRAHX6T.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/history.ts"],"sourcesContent":["import jsonDiffer from 'fast-json-patch';\nimport { cloneDeep, merge } from 'lodash';\n\nimport type {\n TransactionHistory,\n TransactionHistoryEntry,\n TransactionMeta,\n} from '../types';\n\n/**\n * Build a new version of the provided transaction with an initial history\n * entry, which is just a snapshot of the transaction.\n *\n * @param transactionMeta - TransactionMeta to add initial history snapshot to.\n * @returns A copy of `transactionMeta` with a new `history` property.\n */\nexport function addInitialHistorySnapshot(\n transactionMeta: TransactionMeta,\n): TransactionMeta {\n const snapshot = snapshotFromTransactionMeta(transactionMeta);\n return merge({}, transactionMeta, { history: [snapshot] });\n}\n\n/**\n * Builds a new version of the transaction with a new history entry if\n * it has a `history` property, or just returns the transaction.\n *\n * @param transactionMeta - TransactionMeta to add history entry to.\n * @param note - Note to add to history entry.\n * @returns A copy of `transactionMeta` with a new `history` entry if it has an\n * existing non-empty `history` array.\n */\nexport function updateTransactionHistory(\n transactionMeta: TransactionMeta,\n note: string,\n): TransactionMeta {\n if (!transactionMeta.history) {\n return transactionMeta;\n }\n\n const currentState = snapshotFromTransactionMeta(transactionMeta);\n const previousState = replayHistory(transactionMeta.history);\n const historyEntry = generateHistoryEntry(previousState, currentState, note);\n\n if (historyEntry.length > 0) {\n return merge({}, transactionMeta, {\n history: [...transactionMeta.history, historyEntry],\n });\n }\n return transactionMeta;\n}\n\n/**\n * Generates a history entry from the previous and new transaction metadata.\n *\n * @param previousState - The previous transaction metadata.\n * @param currentState - The new transaction metadata.\n * @param note - A note for the transaction metada update.\n * @returns An array of history operation.\n */\nfunction generateHistoryEntry(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n previousState: any,\n currentState: TransactionMeta,\n note: string,\n): TransactionHistoryEntry {\n const historyOperationsEntry = jsonDiffer.compare(\n previousState,\n currentState,\n ) as TransactionHistoryEntry;\n // Add a note to the first operation, since it breaks if we append it to the entry\n if (historyOperationsEntry[0]) {\n if (note) {\n historyOperationsEntry[0].note = note;\n }\n historyOperationsEntry[0].timestamp = Date.now();\n }\n return historyOperationsEntry;\n}\n\n/**\n * Recovers previous transactionMeta from passed history array.\n *\n * @param transactionHistory - The transaction metadata to replay.\n * @returns The transaction metadata.\n */\nfunction replayHistory(\n transactionHistory: TransactionHistory,\n): TransactionMeta {\n const shortHistory = cloneDeep(transactionHistory);\n return shortHistory.reduce(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (val, entry: any) => jsonDiffer.applyPatch(val, entry).newDocument,\n ) as TransactionMeta;\n}\n\n/**\n * Clone the transaction meta data without the history property.\n *\n * @param transactionMeta - The transaction metadata to snapshot.\n * @returns A deep clone of transaction metadata without history property.\n */\nfunction snapshotFromTransactionMeta(\n transactionMeta: TransactionMeta,\n): TransactionMeta {\n const snapshot = { ...transactionMeta };\n delete snapshot.history;\n return cloneDeep(snapshot);\n}\n"],"mappings":";AAAA,OAAO,gBAAgB;AACvB,SAAS,WAAW,aAAa;AAe1B,SAAS,0BACd,iBACiB;AACjB,QAAM,WAAW,4BAA4B,eAAe;AAC5D,SAAO,MAAM,CAAC,GAAG,iBAAiB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC3D;AAWO,SAAS,yBACd,iBACA,MACiB;AACjB,MAAI,CAAC,gBAAgB,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,4BAA4B,eAAe;AAChE,QAAM,gBAAgB,cAAc,gBAAgB,OAAO;AAC3D,QAAM,eAAe,qBAAqB,eAAe,cAAc,IAAI;AAE3E,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,MAAM,CAAC,GAAG,iBAAiB;AAAA,MAChC,SAAS,CAAC,GAAG,gBAAgB,SAAS,YAAY;AAAA,IACpD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAUA,SAAS,qBAGP,eACA,cACA,MACyB;AACzB,QAAM,yBAAyB,WAAW;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AAEA,MAAI,uBAAuB,CAAC,GAAG;AAC7B,QAAI,MAAM;AACR,6BAAuB,CAAC,EAAE,OAAO;AAAA,IACnC;AACA,2BAAuB,CAAC,EAAE,YAAY,KAAK,IAAI;AAAA,EACjD;AACA,SAAO;AACT;AAQA,SAAS,cACP,oBACiB;AACjB,QAAM,eAAe,UAAU,kBAAkB;AACjD,SAAO,aAAa;AAAA;AAAA;AAAA,IAGlB,CAAC,KAAK,UAAe,WAAW,WAAW,KAAK,KAAK,EAAE;AAAA,EACzD;AACF;AAQA,SAAS,4BACP,iBACiB;AACjB,QAAM,WAAW,EAAE,GAAG,gBAAgB;AACtC,SAAO,SAAS;AAChB,SAAO,UAAU,QAAQ;AAC3B;","names":[]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GAS_BUFFER_CHAIN_OVERRIDES
|
|
3
|
+
} from "./chunk-Z3HHSD5I.mjs";
|
|
4
|
+
import {
|
|
5
|
+
projectLogger
|
|
6
|
+
} from "./chunk-UQQWZT6C.mjs";
|
|
7
|
+
|
|
8
|
+
// src/utils/gas.ts
|
|
9
|
+
import {
|
|
10
|
+
BNToHex,
|
|
11
|
+
fractionBN,
|
|
12
|
+
hexToBN,
|
|
13
|
+
query
|
|
14
|
+
} from "@metamask/controller-utils";
|
|
15
|
+
import { add0x, createModuleLogger } from "@metamask/utils";
|
|
16
|
+
var log = createModuleLogger(projectLogger, "gas");
|
|
17
|
+
var FIXED_GAS = "0x5208";
|
|
18
|
+
var DEFAULT_GAS_MULTIPLIER = 1.5;
|
|
19
|
+
async function updateGas(request) {
|
|
20
|
+
const { txMeta } = request;
|
|
21
|
+
const initialParams = { ...txMeta.txParams };
|
|
22
|
+
const [gas, simulationFails] = await getGas(request);
|
|
23
|
+
txMeta.txParams.gas = gas;
|
|
24
|
+
txMeta.simulationFails = simulationFails;
|
|
25
|
+
if (!initialParams.gas) {
|
|
26
|
+
txMeta.originalGasEstimate = txMeta.txParams.gas;
|
|
27
|
+
}
|
|
28
|
+
if (!txMeta.defaultGasEstimates) {
|
|
29
|
+
txMeta.defaultGasEstimates = {};
|
|
30
|
+
}
|
|
31
|
+
txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;
|
|
32
|
+
}
|
|
33
|
+
async function estimateGas(txParams, ethQuery) {
|
|
34
|
+
const request = { ...txParams };
|
|
35
|
+
const { data, value } = request;
|
|
36
|
+
const { gasLimit: gasLimitHex, number: blockNumber } = await getLatestBlock(
|
|
37
|
+
ethQuery
|
|
38
|
+
);
|
|
39
|
+
const gasLimitBN = hexToBN(gasLimitHex);
|
|
40
|
+
request.data = data ? add0x(data) : data;
|
|
41
|
+
request.gas = BNToHex(fractionBN(gasLimitBN, 19, 20));
|
|
42
|
+
request.value = value || "0x0";
|
|
43
|
+
let estimatedGas = request.gas;
|
|
44
|
+
let simulationFails;
|
|
45
|
+
try {
|
|
46
|
+
estimatedGas = await query(ethQuery, "estimateGas", [request]);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
simulationFails = {
|
|
49
|
+
reason: error.message,
|
|
50
|
+
errorKey: error.errorKey,
|
|
51
|
+
debug: {
|
|
52
|
+
blockNumber,
|
|
53
|
+
blockGasLimit: gasLimitHex
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
log("Estimation failed", { ...simulationFails, fallback: estimateGas });
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
blockGasLimit: gasLimitHex,
|
|
60
|
+
estimatedGas,
|
|
61
|
+
simulationFails
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function addGasBuffer(estimatedGas, blockGasLimit, multiplier) {
|
|
65
|
+
const estimatedGasBN = hexToBN(estimatedGas);
|
|
66
|
+
const maxGasBN = hexToBN(blockGasLimit).muln(0.9);
|
|
67
|
+
const paddedGasBN = estimatedGasBN.muln(multiplier);
|
|
68
|
+
if (estimatedGasBN.gt(maxGasBN)) {
|
|
69
|
+
const estimatedGasHex = add0x(estimatedGas);
|
|
70
|
+
log("Using estimated value", estimatedGasHex);
|
|
71
|
+
return estimatedGasHex;
|
|
72
|
+
}
|
|
73
|
+
if (paddedGasBN.lt(maxGasBN)) {
|
|
74
|
+
const paddedHex = add0x(BNToHex(paddedGasBN));
|
|
75
|
+
log("Using padded estimate", paddedHex, multiplier);
|
|
76
|
+
return paddedHex;
|
|
77
|
+
}
|
|
78
|
+
const maxHex = add0x(BNToHex(maxGasBN));
|
|
79
|
+
log("Using 90% of block gas limit", maxHex);
|
|
80
|
+
return maxHex;
|
|
81
|
+
}
|
|
82
|
+
async function getGas(request) {
|
|
83
|
+
const { isCustomNetwork, chainId, txMeta } = request;
|
|
84
|
+
if (txMeta.txParams.gas) {
|
|
85
|
+
log("Using value from request", txMeta.txParams.gas);
|
|
86
|
+
return [txMeta.txParams.gas];
|
|
87
|
+
}
|
|
88
|
+
if (await requiresFixedGas(request)) {
|
|
89
|
+
log("Using fixed value", FIXED_GAS);
|
|
90
|
+
return [FIXED_GAS];
|
|
91
|
+
}
|
|
92
|
+
const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas(
|
|
93
|
+
txMeta.txParams,
|
|
94
|
+
request.ethQuery
|
|
95
|
+
);
|
|
96
|
+
if (isCustomNetwork) {
|
|
97
|
+
log("Using original estimate as custom network");
|
|
98
|
+
return [estimatedGas, simulationFails];
|
|
99
|
+
}
|
|
100
|
+
const bufferMultiplier = GAS_BUFFER_CHAIN_OVERRIDES[chainId] ?? DEFAULT_GAS_MULTIPLIER;
|
|
101
|
+
const bufferedGas = addGasBuffer(
|
|
102
|
+
estimatedGas,
|
|
103
|
+
blockGasLimit,
|
|
104
|
+
bufferMultiplier
|
|
105
|
+
);
|
|
106
|
+
return [bufferedGas, simulationFails];
|
|
107
|
+
}
|
|
108
|
+
async function requiresFixedGas({
|
|
109
|
+
ethQuery,
|
|
110
|
+
txMeta,
|
|
111
|
+
isCustomNetwork
|
|
112
|
+
}) {
|
|
113
|
+
const {
|
|
114
|
+
txParams: { to, data }
|
|
115
|
+
} = txMeta;
|
|
116
|
+
if (isCustomNetwork || !to || data) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const code = await getCode(ethQuery, to);
|
|
120
|
+
return !code || code === "0x";
|
|
121
|
+
}
|
|
122
|
+
async function getCode(ethQuery, address) {
|
|
123
|
+
return await query(ethQuery, "getCode", [address]);
|
|
124
|
+
}
|
|
125
|
+
async function getLatestBlock(ethQuery) {
|
|
126
|
+
return await query(ethQuery, "getBlockByNumber", ["latest", false]);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export {
|
|
130
|
+
log,
|
|
131
|
+
FIXED_GAS,
|
|
132
|
+
DEFAULT_GAS_MULTIPLIER,
|
|
133
|
+
updateGas,
|
|
134
|
+
estimateGas,
|
|
135
|
+
addGasBuffer
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=chunk-XKNFL657.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/gas.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n\nimport {\n BNToHex,\n fractionBN,\n hexToBN,\n query,\n} from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, createModuleLogger } from '@metamask/utils';\n\nimport { GAS_BUFFER_CHAIN_OVERRIDES } from '../constants';\nimport { projectLogger } from '../logger';\nimport type { TransactionMeta, TransactionParams } from '../types';\n\nexport type UpdateGasRequest = {\n ethQuery: EthQuery;\n isCustomNetwork: boolean;\n chainId: Hex;\n txMeta: TransactionMeta;\n};\n\nexport const log = createModuleLogger(projectLogger, 'gas');\n\nexport const FIXED_GAS = '0x5208';\nexport const DEFAULT_GAS_MULTIPLIER = 1.5;\n\nexport async function updateGas(request: UpdateGasRequest) {\n const { txMeta } = request;\n const initialParams = { ...txMeta.txParams };\n\n const [gas, simulationFails] = await getGas(request);\n\n txMeta.txParams.gas = gas;\n txMeta.simulationFails = simulationFails;\n\n if (!initialParams.gas) {\n txMeta.originalGasEstimate = txMeta.txParams.gas;\n }\n\n if (!txMeta.defaultGasEstimates) {\n txMeta.defaultGasEstimates = {};\n }\n\n txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;\n}\n\nexport async function estimateGas(\n txParams: TransactionParams,\n ethQuery: EthQuery,\n) {\n const request = { ...txParams };\n const { data, value } = request;\n\n const { gasLimit: gasLimitHex, number: blockNumber } = await getLatestBlock(\n ethQuery,\n );\n\n const gasLimitBN = hexToBN(gasLimitHex);\n\n request.data = data ? add0x(data) : data;\n request.gas = BNToHex(fractionBN(gasLimitBN, 19, 20));\n request.value = value || '0x0';\n\n let estimatedGas = request.gas;\n let simulationFails;\n\n try {\n estimatedGas = await query(ethQuery, 'estimateGas', [request]);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n simulationFails = {\n reason: error.message,\n errorKey: error.errorKey,\n debug: {\n blockNumber,\n blockGasLimit: gasLimitHex,\n },\n };\n\n log('Estimation failed', { ...simulationFails, fallback: estimateGas });\n }\n\n return {\n blockGasLimit: gasLimitHex,\n estimatedGas,\n simulationFails,\n };\n}\n\nexport function addGasBuffer(\n estimatedGas: string,\n blockGasLimit: string,\n multiplier: number,\n) {\n const estimatedGasBN = hexToBN(estimatedGas);\n const maxGasBN = hexToBN(blockGasLimit).muln(0.9);\n const paddedGasBN = estimatedGasBN.muln(multiplier);\n\n if (estimatedGasBN.gt(maxGasBN)) {\n const estimatedGasHex = add0x(estimatedGas);\n log('Using estimated value', estimatedGasHex);\n return estimatedGasHex;\n }\n\n if (paddedGasBN.lt(maxGasBN)) {\n const paddedHex = add0x(BNToHex(paddedGasBN));\n log('Using padded estimate', paddedHex, multiplier);\n return paddedHex;\n }\n\n const maxHex = add0x(BNToHex(maxGasBN));\n log('Using 90% of block gas limit', maxHex);\n return maxHex;\n}\n\nasync function getGas(\n request: UpdateGasRequest,\n): Promise<[string, TransactionMeta['simulationFails']?]> {\n const { isCustomNetwork, chainId, txMeta } = request;\n\n if (txMeta.txParams.gas) {\n log('Using value from request', txMeta.txParams.gas);\n return [txMeta.txParams.gas];\n }\n\n if (await requiresFixedGas(request)) {\n log('Using fixed value', FIXED_GAS);\n return [FIXED_GAS];\n }\n\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas(\n txMeta.txParams,\n request.ethQuery,\n );\n\n if (isCustomNetwork) {\n log('Using original estimate as custom network');\n return [estimatedGas, simulationFails];\n }\n\n const bufferMultiplier =\n GAS_BUFFER_CHAIN_OVERRIDES[\n chainId as keyof typeof GAS_BUFFER_CHAIN_OVERRIDES\n ] ?? DEFAULT_GAS_MULTIPLIER;\n\n const bufferedGas = addGasBuffer(\n estimatedGas,\n blockGasLimit,\n bufferMultiplier,\n );\n\n return [bufferedGas, simulationFails];\n}\n\nasync function requiresFixedGas({\n ethQuery,\n txMeta,\n isCustomNetwork,\n}: UpdateGasRequest): Promise<boolean> {\n const {\n txParams: { to, data },\n } = txMeta;\n\n if (isCustomNetwork || !to || data) {\n return false;\n }\n\n const code = await getCode(ethQuery, to);\n\n return !code || code === '0x';\n}\n\nasync function getCode(\n ethQuery: EthQuery,\n address: string,\n): Promise<string | undefined> {\n return await query(ethQuery, 'getCode', [address]);\n}\n\nasync function getLatestBlock(\n ethQuery: EthQuery,\n): Promise<{ gasLimit: string; number: string }> {\n return await query(ethQuery, 'getBlockByNumber', ['latest', false]);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
var __accessCheck = (obj, member, msg) => {
|
|
2
|
+
if (!member.has(obj))
|
|
3
|
+
throw TypeError("Cannot " + msg);
|
|
4
|
+
};
|
|
5
|
+
var __privateGet = (obj, member, getter) => {
|
|
6
|
+
__accessCheck(obj, member, "read from private field");
|
|
7
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
+
};
|
|
9
|
+
var __privateAdd = (obj, member, value) => {
|
|
10
|
+
if (member.has(obj))
|
|
11
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
+
};
|
|
14
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
+
__accessCheck(obj, member, "write to private field");
|
|
16
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
var __privateMethod = (obj, member, method) => {
|
|
20
|
+
__accessCheck(obj, member, "access private method");
|
|
21
|
+
return method;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
__privateGet,
|
|
26
|
+
__privateAdd,
|
|
27
|
+
__privateSet,
|
|
28
|
+
__privateMethod
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=chunk-XUI43LEZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import {
|
|
2
|
+
incomingTransactionsLogger
|
|
3
|
+
} from "./chunk-UQQWZT6C.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__privateAdd,
|
|
6
|
+
__privateGet,
|
|
7
|
+
__privateMethod,
|
|
8
|
+
__privateSet
|
|
9
|
+
} from "./chunk-XUI43LEZ.mjs";
|
|
10
|
+
|
|
11
|
+
// src/helpers/IncomingTransactionHelper.ts
|
|
12
|
+
import { Mutex } from "async-mutex";
|
|
13
|
+
import EventEmitter from "events";
|
|
14
|
+
var RECENT_HISTORY_BLOCK_RANGE = 10;
|
|
15
|
+
var UPDATE_CHECKS = [
|
|
16
|
+
(txMeta) => txMeta.status,
|
|
17
|
+
(txMeta) => txMeta.txParams.gasUsed
|
|
18
|
+
];
|
|
19
|
+
var _blockTracker, _getCurrentAccount, _getLastFetchedBlockNumbers, _getLocalTransactions, _getChainId, _isEnabled, _isRunning, _mutex, _onLatestBlock, _queryEntireHistory, _remoteTransactionSource, _transactionLimit, _updateTransactions, _sortTransactionsByTime, sortTransactionsByTime_fn, _getNewTransactions, getNewTransactions_fn, _getUpdatedTransactions, getUpdatedTransactions_fn, _isTransactionOutdated, isTransactionOutdated_fn, _getLastFetchedBlockNumberDec, getLastFetchedBlockNumberDec_fn, _getFromBlock, getFromBlock_fn, _updateLastFetchedBlockNumber, updateLastFetchedBlockNumber_fn, _getBlockNumberKey, getBlockNumberKey_fn, _canStart, canStart_fn;
|
|
20
|
+
var IncomingTransactionHelper = class {
|
|
21
|
+
constructor({
|
|
22
|
+
blockTracker,
|
|
23
|
+
getCurrentAccount,
|
|
24
|
+
getLastFetchedBlockNumbers,
|
|
25
|
+
getLocalTransactions,
|
|
26
|
+
getChainId,
|
|
27
|
+
isEnabled,
|
|
28
|
+
queryEntireHistory,
|
|
29
|
+
remoteTransactionSource,
|
|
30
|
+
transactionLimit,
|
|
31
|
+
updateTransactions
|
|
32
|
+
}) {
|
|
33
|
+
__privateAdd(this, _sortTransactionsByTime);
|
|
34
|
+
__privateAdd(this, _getNewTransactions);
|
|
35
|
+
__privateAdd(this, _getUpdatedTransactions);
|
|
36
|
+
__privateAdd(this, _isTransactionOutdated);
|
|
37
|
+
__privateAdd(this, _getLastFetchedBlockNumberDec);
|
|
38
|
+
__privateAdd(this, _getFromBlock);
|
|
39
|
+
__privateAdd(this, _updateLastFetchedBlockNumber);
|
|
40
|
+
__privateAdd(this, _getBlockNumberKey);
|
|
41
|
+
__privateAdd(this, _canStart);
|
|
42
|
+
__privateAdd(this, _blockTracker, void 0);
|
|
43
|
+
__privateAdd(this, _getCurrentAccount, void 0);
|
|
44
|
+
__privateAdd(this, _getLastFetchedBlockNumbers, void 0);
|
|
45
|
+
__privateAdd(this, _getLocalTransactions, void 0);
|
|
46
|
+
__privateAdd(this, _getChainId, void 0);
|
|
47
|
+
__privateAdd(this, _isEnabled, void 0);
|
|
48
|
+
__privateAdd(this, _isRunning, void 0);
|
|
49
|
+
__privateAdd(this, _mutex, new Mutex());
|
|
50
|
+
__privateAdd(this, _onLatestBlock, void 0);
|
|
51
|
+
__privateAdd(this, _queryEntireHistory, void 0);
|
|
52
|
+
__privateAdd(this, _remoteTransactionSource, void 0);
|
|
53
|
+
__privateAdd(this, _transactionLimit, void 0);
|
|
54
|
+
__privateAdd(this, _updateTransactions, void 0);
|
|
55
|
+
this.hub = new EventEmitter();
|
|
56
|
+
__privateSet(this, _blockTracker, blockTracker);
|
|
57
|
+
__privateSet(this, _getCurrentAccount, getCurrentAccount);
|
|
58
|
+
__privateSet(this, _getLastFetchedBlockNumbers, getLastFetchedBlockNumbers);
|
|
59
|
+
__privateSet(this, _getLocalTransactions, getLocalTransactions || (() => []));
|
|
60
|
+
__privateSet(this, _getChainId, getChainId);
|
|
61
|
+
__privateSet(this, _isEnabled, isEnabled ?? (() => true));
|
|
62
|
+
__privateSet(this, _isRunning, false);
|
|
63
|
+
__privateSet(this, _queryEntireHistory, queryEntireHistory ?? true);
|
|
64
|
+
__privateSet(this, _remoteTransactionSource, remoteTransactionSource);
|
|
65
|
+
__privateSet(this, _transactionLimit, transactionLimit);
|
|
66
|
+
__privateSet(this, _updateTransactions, updateTransactions ?? false);
|
|
67
|
+
__privateSet(this, _onLatestBlock, async (blockNumberHex) => {
|
|
68
|
+
try {
|
|
69
|
+
await this.update(blockNumberHex);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.error("Error while checking incoming transactions", error);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
start() {
|
|
76
|
+
if (__privateGet(this, _isRunning)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!__privateMethod(this, _canStart, canStart_fn).call(this)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
__privateGet(this, _blockTracker).addListener("latest", __privateGet(this, _onLatestBlock));
|
|
83
|
+
__privateSet(this, _isRunning, true);
|
|
84
|
+
}
|
|
85
|
+
stop() {
|
|
86
|
+
__privateGet(this, _blockTracker).removeListener("latest", __privateGet(this, _onLatestBlock));
|
|
87
|
+
__privateSet(this, _isRunning, false);
|
|
88
|
+
}
|
|
89
|
+
async update(latestBlockNumberHex) {
|
|
90
|
+
const releaseLock = await __privateGet(this, _mutex).acquire();
|
|
91
|
+
incomingTransactionsLogger("Checking for incoming transactions");
|
|
92
|
+
try {
|
|
93
|
+
if (!__privateMethod(this, _canStart, canStart_fn).call(this)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const latestBlockNumber = parseInt(
|
|
97
|
+
latestBlockNumberHex || await __privateGet(this, _blockTracker).getLatestBlock(),
|
|
98
|
+
16
|
|
99
|
+
);
|
|
100
|
+
const additionalLastFetchedKeys = __privateGet(this, _remoteTransactionSource).getLastBlockVariations?.() ?? [];
|
|
101
|
+
const fromBlock = __privateMethod(this, _getFromBlock, getFromBlock_fn).call(this, latestBlockNumber);
|
|
102
|
+
const address = __privateGet(this, _getCurrentAccount).call(this);
|
|
103
|
+
const currentChainId = __privateGet(this, _getChainId).call(this);
|
|
104
|
+
let remoteTransactions = [];
|
|
105
|
+
try {
|
|
106
|
+
remoteTransactions = await __privateGet(this, _remoteTransactionSource).fetchTransactions({
|
|
107
|
+
address,
|
|
108
|
+
currentChainId,
|
|
109
|
+
fromBlock,
|
|
110
|
+
limit: __privateGet(this, _transactionLimit)
|
|
111
|
+
});
|
|
112
|
+
} catch (error) {
|
|
113
|
+
incomingTransactionsLogger("Error while fetching remote transactions", error);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!__privateGet(this, _updateTransactions)) {
|
|
117
|
+
remoteTransactions = remoteTransactions.filter(
|
|
118
|
+
(tx) => tx.txParams.to?.toLowerCase() === address.toLowerCase()
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const localTransactions = !__privateGet(this, _updateTransactions) ? [] : __privateGet(this, _getLocalTransactions).call(this);
|
|
122
|
+
const newTransactions = __privateMethod(this, _getNewTransactions, getNewTransactions_fn).call(this, remoteTransactions, localTransactions);
|
|
123
|
+
const updatedTransactions = __privateMethod(this, _getUpdatedTransactions, getUpdatedTransactions_fn).call(this, remoteTransactions, localTransactions);
|
|
124
|
+
if (newTransactions.length > 0 || updatedTransactions.length > 0) {
|
|
125
|
+
__privateMethod(this, _sortTransactionsByTime, sortTransactionsByTime_fn).call(this, newTransactions);
|
|
126
|
+
__privateMethod(this, _sortTransactionsByTime, sortTransactionsByTime_fn).call(this, updatedTransactions);
|
|
127
|
+
incomingTransactionsLogger("Found incoming transactions", {
|
|
128
|
+
new: newTransactions,
|
|
129
|
+
updated: updatedTransactions
|
|
130
|
+
});
|
|
131
|
+
this.hub.emit("transactions", {
|
|
132
|
+
added: newTransactions,
|
|
133
|
+
updated: updatedTransactions
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
__privateMethod(this, _updateLastFetchedBlockNumber, updateLastFetchedBlockNumber_fn).call(this, remoteTransactions, additionalLastFetchedKeys);
|
|
137
|
+
} finally {
|
|
138
|
+
releaseLock();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
_blockTracker = new WeakMap();
|
|
143
|
+
_getCurrentAccount = new WeakMap();
|
|
144
|
+
_getLastFetchedBlockNumbers = new WeakMap();
|
|
145
|
+
_getLocalTransactions = new WeakMap();
|
|
146
|
+
_getChainId = new WeakMap();
|
|
147
|
+
_isEnabled = new WeakMap();
|
|
148
|
+
_isRunning = new WeakMap();
|
|
149
|
+
_mutex = new WeakMap();
|
|
150
|
+
_onLatestBlock = new WeakMap();
|
|
151
|
+
_queryEntireHistory = new WeakMap();
|
|
152
|
+
_remoteTransactionSource = new WeakMap();
|
|
153
|
+
_transactionLimit = new WeakMap();
|
|
154
|
+
_updateTransactions = new WeakMap();
|
|
155
|
+
_sortTransactionsByTime = new WeakSet();
|
|
156
|
+
sortTransactionsByTime_fn = function(transactions) {
|
|
157
|
+
transactions.sort((a, b) => a.time < b.time ? -1 : 1);
|
|
158
|
+
};
|
|
159
|
+
_getNewTransactions = new WeakSet();
|
|
160
|
+
getNewTransactions_fn = function(remoteTxs, localTxs) {
|
|
161
|
+
return remoteTxs.filter(
|
|
162
|
+
(tx) => !localTxs.some(({ hash }) => hash === tx.hash)
|
|
163
|
+
);
|
|
164
|
+
};
|
|
165
|
+
_getUpdatedTransactions = new WeakSet();
|
|
166
|
+
getUpdatedTransactions_fn = function(remoteTxs, localTxs) {
|
|
167
|
+
return remoteTxs.filter(
|
|
168
|
+
(remoteTx) => localTxs.some(
|
|
169
|
+
(localTx) => remoteTx.hash === localTx.hash && __privateMethod(this, _isTransactionOutdated, isTransactionOutdated_fn).call(this, remoteTx, localTx)
|
|
170
|
+
)
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
_isTransactionOutdated = new WeakSet();
|
|
174
|
+
isTransactionOutdated_fn = function(remoteTx, localTx) {
|
|
175
|
+
return UPDATE_CHECKS.some(
|
|
176
|
+
(getValue) => getValue(remoteTx) !== getValue(localTx)
|
|
177
|
+
);
|
|
178
|
+
};
|
|
179
|
+
_getLastFetchedBlockNumberDec = new WeakSet();
|
|
180
|
+
getLastFetchedBlockNumberDec_fn = function() {
|
|
181
|
+
const additionalLastFetchedKeys = __privateGet(this, _remoteTransactionSource).getLastBlockVariations?.() ?? [];
|
|
182
|
+
const lastFetchedKey = __privateMethod(this, _getBlockNumberKey, getBlockNumberKey_fn).call(this, additionalLastFetchedKeys);
|
|
183
|
+
const lastFetchedBlockNumbers = __privateGet(this, _getLastFetchedBlockNumbers).call(this);
|
|
184
|
+
return lastFetchedBlockNumbers[lastFetchedKey];
|
|
185
|
+
};
|
|
186
|
+
_getFromBlock = new WeakSet();
|
|
187
|
+
getFromBlock_fn = function(latestBlockNumber) {
|
|
188
|
+
const lastFetchedBlockNumber = __privateMethod(this, _getLastFetchedBlockNumberDec, getLastFetchedBlockNumberDec_fn).call(this);
|
|
189
|
+
if (lastFetchedBlockNumber) {
|
|
190
|
+
return lastFetchedBlockNumber + 1;
|
|
191
|
+
}
|
|
192
|
+
return __privateGet(this, _queryEntireHistory) ? void 0 : latestBlockNumber - RECENT_HISTORY_BLOCK_RANGE;
|
|
193
|
+
};
|
|
194
|
+
_updateLastFetchedBlockNumber = new WeakSet();
|
|
195
|
+
updateLastFetchedBlockNumber_fn = function(remoteTxs, additionalKeys) {
|
|
196
|
+
let lastFetchedBlockNumber = -1;
|
|
197
|
+
for (const tx of remoteTxs) {
|
|
198
|
+
const currentBlockNumberValue = tx.blockNumber ? parseInt(tx.blockNumber, 10) : -1;
|
|
199
|
+
lastFetchedBlockNumber = Math.max(
|
|
200
|
+
lastFetchedBlockNumber,
|
|
201
|
+
currentBlockNumberValue
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
if (lastFetchedBlockNumber === -1) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const lastFetchedKey = __privateMethod(this, _getBlockNumberKey, getBlockNumberKey_fn).call(this, additionalKeys);
|
|
208
|
+
const lastFetchedBlockNumbers = __privateGet(this, _getLastFetchedBlockNumbers).call(this);
|
|
209
|
+
const previousValue = lastFetchedBlockNumbers[lastFetchedKey];
|
|
210
|
+
if (previousValue >= lastFetchedBlockNumber) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.hub.emit("updatedLastFetchedBlockNumbers", {
|
|
214
|
+
lastFetchedBlockNumbers: {
|
|
215
|
+
...lastFetchedBlockNumbers,
|
|
216
|
+
[lastFetchedKey]: lastFetchedBlockNumber
|
|
217
|
+
},
|
|
218
|
+
blockNumber: lastFetchedBlockNumber
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
_getBlockNumberKey = new WeakSet();
|
|
222
|
+
getBlockNumberKey_fn = function(additionalKeys) {
|
|
223
|
+
const currentChainId = __privateGet(this, _getChainId).call(this);
|
|
224
|
+
const currentAccount = __privateGet(this, _getCurrentAccount).call(this)?.toLowerCase();
|
|
225
|
+
return [currentChainId, currentAccount, ...additionalKeys].join("#");
|
|
226
|
+
};
|
|
227
|
+
_canStart = new WeakSet();
|
|
228
|
+
canStart_fn = function() {
|
|
229
|
+
const isEnabled = __privateGet(this, _isEnabled).call(this);
|
|
230
|
+
const currentChainId = __privateGet(this, _getChainId).call(this);
|
|
231
|
+
const isSupportedNetwork = __privateGet(this, _remoteTransactionSource).isSupportedNetwork(currentChainId);
|
|
232
|
+
return isEnabled && isSupportedNetwork;
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
export {
|
|
236
|
+
IncomingTransactionHelper
|
|
237
|
+
};
|
|
238
|
+
//# sourceMappingURL=chunk-Y7ENNK7L.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/helpers/IncomingTransactionHelper.ts"],"sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport EventEmitter from 'events';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\n\nconst RECENT_HISTORY_BLOCK_RANGE = 10;\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst UPDATE_CHECKS: ((txMeta: TransactionMeta) => any)[] = [\n (txMeta) => txMeta.status,\n (txMeta) => txMeta.txParams.gasUsed,\n];\n\n/**\n * Configuration options for the IncomingTransactionHelper\n *\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @property updateTransactions - Whether to update local transactions using remote transaction data.\n */\nexport type IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n #blockTracker: BlockTracker;\n\n #getCurrentAccount: () => string;\n\n #getLastFetchedBlockNumbers: () => Record<string, number>;\n\n #getLocalTransactions: () => TransactionMeta[];\n\n #getChainId: () => Hex;\n\n #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #mutex = new Mutex();\n\n #onLatestBlock: (blockNumberHex: Hex) => Promise<void>;\n\n #queryEntireHistory: boolean;\n\n #remoteTransactionSource: RemoteTransactionSource;\n\n #transactionLimit?: number;\n\n #updateTransactions: boolean;\n\n constructor({\n blockTracker,\n getCurrentAccount,\n getLastFetchedBlockNumbers,\n getLocalTransactions,\n getChainId,\n isEnabled,\n queryEntireHistory,\n remoteTransactionSource,\n transactionLimit,\n updateTransactions,\n }: {\n blockTracker: BlockTracker;\n getCurrentAccount: () => string;\n getLastFetchedBlockNumbers: () => Record<string, number>;\n getLocalTransactions?: () => TransactionMeta[];\n getChainId: () => Hex;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n transactionLimit?: number;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#blockTracker = blockTracker;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLastFetchedBlockNumbers = getLastFetchedBlockNumbers;\n this.#getLocalTransactions = getLocalTransactions || (() => []);\n this.#getChainId = getChainId;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#queryEntireHistory = queryEntireHistory ?? true;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#transactionLimit = transactionLimit;\n this.#updateTransactions = updateTransactions ?? false;\n\n // Using a property instead of a method to provide a listener reference\n // with the correct scope that we can remove later if stopped.\n this.#onLatestBlock = async (blockNumberHex: Hex) => {\n try {\n await this.update(blockNumberHex);\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n };\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n this.#blockTracker.addListener('latest', this.#onLatestBlock);\n this.#isRunning = true;\n }\n\n stop() {\n this.#blockTracker.removeListener('latest', this.#onLatestBlock);\n this.#isRunning = false;\n }\n\n async update(latestBlockNumberHex?: Hex): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n log('Checking for incoming transactions');\n\n try {\n if (!this.#canStart()) {\n return;\n }\n\n const latestBlockNumber = parseInt(\n latestBlockNumberHex || (await this.#blockTracker.getLatestBlock()),\n 16,\n );\n\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n\n const fromBlock = this.#getFromBlock(latestBlockNumber);\n const address = this.#getCurrentAccount();\n const currentChainId = this.#getChainId();\n\n let remoteTransactions = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address,\n currentChainId,\n fromBlock,\n limit: this.#transactionLimit,\n });\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n log('Error while fetching remote transactions', error);\n return;\n }\n if (!this.#updateTransactions) {\n remoteTransactions = remoteTransactions.filter(\n (tx) => tx.txParams.to?.toLowerCase() === address.toLowerCase(),\n );\n }\n\n const localTransactions = !this.#updateTransactions\n ? []\n : this.#getLocalTransactions();\n\n const newTransactions = this.#getNewTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n const updatedTransactions = this.#getUpdatedTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n if (newTransactions.length > 0 || updatedTransactions.length > 0) {\n this.#sortTransactionsByTime(newTransactions);\n this.#sortTransactionsByTime(updatedTransactions);\n\n log('Found incoming transactions', {\n new: newTransactions,\n updated: updatedTransactions,\n });\n\n this.hub.emit('transactions', {\n added: newTransactions,\n updated: updatedTransactions,\n });\n }\n this.#updateLastFetchedBlockNumber(\n remoteTransactions,\n additionalLastFetchedKeys,\n );\n } finally {\n releaseLock();\n }\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #getNewTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter(\n (tx) => !localTxs.some(({ hash }) => hash === tx.hash),\n );\n }\n\n #getUpdatedTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter((remoteTx) =>\n localTxs.some(\n (localTx) =>\n remoteTx.hash === localTx.hash &&\n this.#isTransactionOutdated(remoteTx, localTx),\n ),\n );\n }\n\n #isTransactionOutdated(\n remoteTx: TransactionMeta,\n localTx: TransactionMeta,\n ): boolean {\n return UPDATE_CHECKS.some(\n (getValue) => getValue(remoteTx) !== getValue(localTx),\n );\n }\n\n #getLastFetchedBlockNumberDec(): number {\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n const lastFetchedKey = this.#getBlockNumberKey(additionalLastFetchedKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n return lastFetchedBlockNumbers[lastFetchedKey];\n }\n\n #getFromBlock(latestBlockNumber: number): number | undefined {\n const lastFetchedBlockNumber = this.#getLastFetchedBlockNumberDec();\n\n if (lastFetchedBlockNumber) {\n return lastFetchedBlockNumber + 1;\n }\n\n return this.#queryEntireHistory\n ? undefined\n : latestBlockNumber - RECENT_HISTORY_BLOCK_RANGE;\n }\n\n #updateLastFetchedBlockNumber(\n remoteTxs: TransactionMeta[],\n additionalKeys: string[],\n ) {\n let lastFetchedBlockNumber = -1;\n\n for (const tx of remoteTxs) {\n const currentBlockNumberValue = tx.blockNumber\n ? parseInt(tx.blockNumber, 10)\n : -1;\n\n lastFetchedBlockNumber = Math.max(\n lastFetchedBlockNumber,\n currentBlockNumberValue,\n );\n }\n\n if (lastFetchedBlockNumber === -1) {\n return;\n }\n\n const lastFetchedKey = this.#getBlockNumberKey(additionalKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n const previousValue = lastFetchedBlockNumbers[lastFetchedKey];\n\n if (previousValue >= lastFetchedBlockNumber) {\n return;\n }\n\n this.hub.emit('updatedLastFetchedBlockNumbers', {\n lastFetchedBlockNumbers: {\n ...lastFetchedBlockNumbers,\n [lastFetchedKey]: lastFetchedBlockNumber,\n },\n blockNumber: lastFetchedBlockNumber,\n });\n }\n\n #getBlockNumberKey(additionalKeys: string[]): string {\n const currentChainId = this.#getChainId();\n const currentAccount = this.#getCurrentAccount()?.toLowerCase();\n\n return [currentChainId, currentAccount, ...additionalKeys].join('#');\n }\n\n #canStart(): boolean {\n const isEnabled = this.#isEnabled();\n const currentChainId = this.#getChainId();\n\n const isSupportedNetwork =\n this.#remoteTransactionSource.isSupportedNetwork(currentChainId);\n\n return isEnabled && isSupportedNetwork;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// src/constants.ts
|
|
2
|
+
var CHAIN_IDS = {
|
|
3
|
+
MAINNET: "0x1",
|
|
4
|
+
GOERLI: "0x5",
|
|
5
|
+
BASE: "0x2105",
|
|
6
|
+
BASE_TESTNET: "0x14a33",
|
|
7
|
+
BSC: "0x38",
|
|
8
|
+
BSC_TESTNET: "0x61",
|
|
9
|
+
OPTIMISM: "0xa",
|
|
10
|
+
OPTIMISM_TESTNET: "0x1a4",
|
|
11
|
+
OPBNB: "0xcc",
|
|
12
|
+
OPBNB_TESTNET: "0x15eb",
|
|
13
|
+
OPTIMISM_SEPOLIA: "0xaa37dc",
|
|
14
|
+
POLYGON: "0x89",
|
|
15
|
+
POLYGON_TESTNET: "0x13881",
|
|
16
|
+
AVALANCHE: "0xa86a",
|
|
17
|
+
AVALANCHE_TESTNET: "0xa869",
|
|
18
|
+
FANTOM: "0xfa",
|
|
19
|
+
FANTOM_TESTNET: "0xfa2",
|
|
20
|
+
SEPOLIA: "0xaa36a7",
|
|
21
|
+
LINEA_GOERLI: "0xe704",
|
|
22
|
+
LINEA_SEPOLIA: "0xe705",
|
|
23
|
+
LINEA_MAINNET: "0xe708",
|
|
24
|
+
MOONBEAM: "0x504",
|
|
25
|
+
MOONBEAM_TESTNET: "0x507",
|
|
26
|
+
MOONRIVER: "0x505",
|
|
27
|
+
GNOSIS: "0x64",
|
|
28
|
+
ARBITRUM: "0xa4b1",
|
|
29
|
+
ZKSYNC_ERA: "0x144"
|
|
30
|
+
};
|
|
31
|
+
var DEFAULT_ETHERSCAN_DOMAIN = "etherscan.io";
|
|
32
|
+
var DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = "api";
|
|
33
|
+
var ETHERSCAN_SUPPORTED_NETWORKS = {
|
|
34
|
+
[CHAIN_IDS.GOERLI]: {
|
|
35
|
+
domain: DEFAULT_ETHERSCAN_DOMAIN,
|
|
36
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`
|
|
37
|
+
},
|
|
38
|
+
[CHAIN_IDS.MAINNET]: {
|
|
39
|
+
domain: DEFAULT_ETHERSCAN_DOMAIN,
|
|
40
|
+
subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
|
|
41
|
+
},
|
|
42
|
+
[CHAIN_IDS.SEPOLIA]: {
|
|
43
|
+
domain: DEFAULT_ETHERSCAN_DOMAIN,
|
|
44
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`
|
|
45
|
+
},
|
|
46
|
+
[CHAIN_IDS.LINEA_GOERLI]: {
|
|
47
|
+
domain: "lineascan.build",
|
|
48
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`
|
|
49
|
+
},
|
|
50
|
+
[CHAIN_IDS.LINEA_SEPOLIA]: {
|
|
51
|
+
domain: "lineascan.build",
|
|
52
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`
|
|
53
|
+
},
|
|
54
|
+
[CHAIN_IDS.LINEA_MAINNET]: {
|
|
55
|
+
domain: "lineascan.build",
|
|
56
|
+
subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
|
|
57
|
+
},
|
|
58
|
+
[CHAIN_IDS.BSC]: {
|
|
59
|
+
domain: "bscscan.com",
|
|
60
|
+
subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
|
|
61
|
+
},
|
|
62
|
+
[CHAIN_IDS.BSC_TESTNET]: {
|
|
63
|
+
domain: "bscscan.com",
|
|
64
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`
|
|
65
|
+
},
|
|
66
|
+
[CHAIN_IDS.OPTIMISM]: {
|
|
67
|
+
domain: DEFAULT_ETHERSCAN_DOMAIN,
|
|
68
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-optimistic`
|
|
69
|
+
},
|
|
70
|
+
[CHAIN_IDS.OPTIMISM_SEPOLIA]: {
|
|
71
|
+
domain: DEFAULT_ETHERSCAN_DOMAIN,
|
|
72
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia-optimistic`
|
|
73
|
+
},
|
|
74
|
+
[CHAIN_IDS.POLYGON]: {
|
|
75
|
+
domain: "polygonscan.com",
|
|
76
|
+
subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
|
|
77
|
+
},
|
|
78
|
+
[CHAIN_IDS.POLYGON_TESTNET]: {
|
|
79
|
+
domain: "polygonscan.com",
|
|
80
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-mumbai`
|
|
81
|
+
},
|
|
82
|
+
[CHAIN_IDS.AVALANCHE]: {
|
|
83
|
+
domain: "snowtrace.io",
|
|
84
|
+
subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
|
|
85
|
+
},
|
|
86
|
+
[CHAIN_IDS.AVALANCHE_TESTNET]: {
|
|
87
|
+
domain: "snowtrace.io",
|
|
88
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`
|
|
89
|
+
},
|
|
90
|
+
[CHAIN_IDS.FANTOM]: {
|
|
91
|
+
domain: "ftmscan.com",
|
|
92
|
+
subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
|
|
93
|
+
},
|
|
94
|
+
[CHAIN_IDS.FANTOM_TESTNET]: {
|
|
95
|
+
domain: "ftmscan.com",
|
|
96
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`
|
|
97
|
+
},
|
|
98
|
+
[CHAIN_IDS.MOONBEAM]: {
|
|
99
|
+
domain: "moonscan.io",
|
|
100
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbeam`
|
|
101
|
+
},
|
|
102
|
+
[CHAIN_IDS.MOONBEAM_TESTNET]: {
|
|
103
|
+
domain: "moonscan.io",
|
|
104
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbase`
|
|
105
|
+
},
|
|
106
|
+
[CHAIN_IDS.MOONRIVER]: {
|
|
107
|
+
domain: "moonscan.io",
|
|
108
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonriver`
|
|
109
|
+
},
|
|
110
|
+
[CHAIN_IDS.GNOSIS]: {
|
|
111
|
+
domain: "gnosisscan.io",
|
|
112
|
+
subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-gnosis`
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
var GAS_BUFFER_CHAIN_OVERRIDES = {
|
|
116
|
+
[CHAIN_IDS.OPTIMISM]: 1,
|
|
117
|
+
[CHAIN_IDS.OPTIMISM_SEPOLIA]: 1
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export {
|
|
121
|
+
CHAIN_IDS,
|
|
122
|
+
DEFAULT_ETHERSCAN_DOMAIN,
|
|
123
|
+
DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,
|
|
124
|
+
ETHERSCAN_SUPPORTED_NETWORKS,
|
|
125
|
+
GAS_BUFFER_CHAIN_OVERRIDES
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=chunk-Z3HHSD5I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["export const CHAIN_IDS = {\n MAINNET: '0x1',\n GOERLI: '0x5',\n BASE: '0x2105',\n BASE_TESTNET: '0x14a33',\n BSC: '0x38',\n BSC_TESTNET: '0x61',\n OPTIMISM: '0xa',\n OPTIMISM_TESTNET: '0x1a4',\n OPBNB: '0xcc',\n OPBNB_TESTNET: '0x15eb',\n OPTIMISM_SEPOLIA: '0xaa37dc',\n POLYGON: '0x89',\n POLYGON_TESTNET: '0x13881',\n AVALANCHE: '0xa86a',\n AVALANCHE_TESTNET: '0xa869',\n FANTOM: '0xfa',\n FANTOM_TESTNET: '0xfa2',\n SEPOLIA: '0xaa36a7',\n LINEA_GOERLI: '0xe704',\n LINEA_SEPOLIA: '0xe705',\n LINEA_MAINNET: '0xe708',\n MOONBEAM: '0x504',\n MOONBEAM_TESTNET: '0x507',\n MOONRIVER: '0x505',\n GNOSIS: '0x64',\n ARBITRUM: '0xa4b1',\n ZKSYNC_ERA: '0x144',\n} as const;\n\nexport const DEFAULT_ETHERSCAN_DOMAIN = 'etherscan.io';\nexport const DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = 'api';\n\nexport const ETHERSCAN_SUPPORTED_NETWORKS = {\n [CHAIN_IDS.GOERLI]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`,\n },\n [CHAIN_IDS.MAINNET]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`,\n },\n [CHAIN_IDS.LINEA_GOERLI]: {\n domain: 'lineascan.build',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`,\n },\n [CHAIN_IDS.LINEA_SEPOLIA]: {\n domain: 'lineascan.build',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`,\n },\n [CHAIN_IDS.LINEA_MAINNET]: {\n domain: 'lineascan.build',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC]: {\n domain: 'bscscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC_TESTNET]: {\n domain: 'bscscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.OPTIMISM]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-optimistic`,\n },\n [CHAIN_IDS.OPTIMISM_SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia-optimistic`,\n },\n [CHAIN_IDS.POLYGON]: {\n domain: 'polygonscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.POLYGON_TESTNET]: {\n domain: 'polygonscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-mumbai`,\n },\n [CHAIN_IDS.AVALANCHE]: {\n domain: 'snowtrace.io',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.AVALANCHE_TESTNET]: {\n domain: 'snowtrace.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.FANTOM]: {\n domain: 'ftmscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.FANTOM_TESTNET]: {\n domain: 'ftmscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.MOONBEAM]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbeam`,\n },\n [CHAIN_IDS.MOONBEAM_TESTNET]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbase`,\n },\n [CHAIN_IDS.MOONRIVER]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonriver`,\n },\n [CHAIN_IDS.GNOSIS]: {\n domain: 'gnosisscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-gnosis`,\n },\n};\n\nexport const GAS_BUFFER_CHAIN_OVERRIDES = {\n [CHAIN_IDS.OPTIMISM]: 1,\n [CHAIN_IDS.OPTIMISM_SEPOLIA]: 1,\n};\n"],"mappings":";AAAO,IAAM,YAAY;AAAA,EACvB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,KAAK;AAAA,EACL,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AACd;AAEO,IAAM,2BAA2B;AACjC,IAAM,qCAAqC;AAE3C,IAAM,+BAA+B;AAAA,EAC1C,CAAC,UAAU,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,OAAO,GAAG;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,OAAO,GAAG;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,YAAY,GAAG;AAAA,IACxB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,aAAa,GAAG;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,aAAa,GAAG;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,GAAG,GAAG;AAAA,IACf,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,WAAW,GAAG;AAAA,IACvB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,QAAQ,GAAG;AAAA,IACpB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,gBAAgB,GAAG;AAAA,IAC5B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,OAAO,GAAG;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,eAAe,GAAG;AAAA,IAC3B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,SAAS,GAAG;AAAA,IACrB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,iBAAiB,GAAG;AAAA,IAC7B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,cAAc,GAAG;AAAA,IAC1B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,QAAQ,GAAG;AAAA,IACpB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,gBAAgB,GAAG;AAAA,IAC5B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,SAAS,GAAG;AAAA,IACrB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,CAAC,UAAU,QAAQ,GAAG;AAAA,EACtB,CAAC,UAAU,gBAAgB,GAAG;AAChC;","names":[]}
|