@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.
Files changed (288) hide show
  1. package/CHANGELOG.md +129 -1
  2. package/dist/TransactionController.js +39 -1816
  3. package/dist/TransactionController.js.map +1 -1
  4. package/dist/TransactionController.mjs +40 -0
  5. package/dist/TransactionController.mjs.map +1 -0
  6. package/dist/chunk-2YXA3K67.mjs +62 -0
  7. package/dist/chunk-2YXA3K67.mjs.map +1 -0
  8. package/dist/chunk-3D3SA6PY.mjs +211 -0
  9. package/dist/chunk-3D3SA6PY.mjs.map +1 -0
  10. package/dist/chunk-4S25HUCL.js +46 -0
  11. package/dist/chunk-4S25HUCL.js.map +1 -0
  12. package/dist/chunk-5OQ373JS.js +211 -0
  13. package/dist/chunk-5OQ373JS.js.map +1 -0
  14. package/dist/chunk-5XBULBP2.js +399 -0
  15. package/dist/chunk-5XBULBP2.js.map +1 -0
  16. package/dist/chunk-72OTU5ZW.mjs +2332 -0
  17. package/dist/chunk-72OTU5ZW.mjs.map +1 -0
  18. package/dist/chunk-7LXE4KHV.js +40 -0
  19. package/dist/chunk-7LXE4KHV.js.map +1 -0
  20. package/dist/chunk-7XPI7KU5.mjs +46 -0
  21. package/dist/chunk-7XPI7KU5.mjs.map +1 -0
  22. package/dist/chunk-BILEZLAT.js +182 -0
  23. package/dist/chunk-BILEZLAT.js.map +1 -0
  24. package/dist/chunk-CQBXHAYR.js +121 -0
  25. package/dist/chunk-CQBXHAYR.js.map +1 -0
  26. package/dist/chunk-CXXGL43K.js +85 -0
  27. package/dist/chunk-CXXGL43K.js.map +1 -0
  28. package/dist/chunk-DTDTOMTB.js +238 -0
  29. package/dist/chunk-DTDTOMTB.js.map +1 -0
  30. package/dist/chunk-DTONMSFW.mjs +208 -0
  31. package/dist/chunk-DTONMSFW.mjs.map +1 -0
  32. package/dist/chunk-EEMJC7S7.mjs +182 -0
  33. package/dist/chunk-EEMJC7S7.mjs.map +1 -0
  34. package/dist/chunk-F3CMU2DM.js +170 -0
  35. package/dist/chunk-F3CMU2DM.js.map +1 -0
  36. package/dist/chunk-FRKQ3Z2L.mjs +40 -0
  37. package/dist/chunk-FRKQ3Z2L.mjs.map +1 -0
  38. package/dist/chunk-HS277C77.js +75 -0
  39. package/dist/chunk-HS277C77.js.map +1 -0
  40. package/dist/chunk-ITDY6AIZ.js +127 -0
  41. package/dist/chunk-ITDY6AIZ.js.map +1 -0
  42. package/dist/chunk-IZI7FQIN.mjs +170 -0
  43. package/dist/chunk-IZI7FQIN.mjs.map +1 -0
  44. package/dist/chunk-J56A7UCK.mjs +123 -0
  45. package/dist/chunk-J56A7UCK.mjs.map +1 -0
  46. package/dist/chunk-JRBREX22.mjs +75 -0
  47. package/dist/chunk-JRBREX22.mjs.map +1 -0
  48. package/dist/chunk-JRQHIBG5.mjs +399 -0
  49. package/dist/chunk-JRQHIBG5.mjs.map +1 -0
  50. package/dist/chunk-K26EBMGI.mjs +121 -0
  51. package/dist/chunk-K26EBMGI.mjs.map +1 -0
  52. package/dist/chunk-KFL2GGZC.mjs +48 -0
  53. package/dist/chunk-KFL2GGZC.mjs.map +1 -0
  54. package/dist/chunk-NHRBO3LU.mjs +50 -0
  55. package/dist/chunk-NHRBO3LU.mjs.map +1 -0
  56. package/dist/chunk-NM4LTWRU.mjs +76 -0
  57. package/dist/chunk-NM4LTWRU.mjs.map +1 -0
  58. package/dist/chunk-NM6OYEPP.mjs +182 -0
  59. package/dist/chunk-NM6OYEPP.mjs.map +1 -0
  60. package/dist/chunk-NRWEI43Q.js +320 -0
  61. package/dist/chunk-NRWEI43Q.js.map +1 -0
  62. package/dist/chunk-O7H2MC7R.js +62 -0
  63. package/dist/chunk-O7H2MC7R.js.map +1 -0
  64. package/dist/chunk-OF6NSLXF.mjs +90 -0
  65. package/dist/chunk-OF6NSLXF.mjs.map +1 -0
  66. package/dist/chunk-QDIYZX5V.js +2332 -0
  67. package/dist/chunk-QDIYZX5V.js.map +1 -0
  68. package/dist/chunk-QP75SWIQ.js +53 -0
  69. package/dist/chunk-QP75SWIQ.js.map +1 -0
  70. package/dist/chunk-QPNEFZB3.js +208 -0
  71. package/dist/chunk-QPNEFZB3.js.map +1 -0
  72. package/dist/chunk-QSBIXUMB.mjs +242 -0
  73. package/dist/chunk-QSBIXUMB.mjs.map +1 -0
  74. package/dist/chunk-R7NJVDWN.js +48 -0
  75. package/dist/chunk-R7NJVDWN.js.map +1 -0
  76. package/dist/chunk-RQKICZYP.js +137 -0
  77. package/dist/chunk-RQKICZYP.js.map +1 -0
  78. package/dist/chunk-S6VGOPUY.js +14 -0
  79. package/dist/chunk-S6VGOPUY.js.map +1 -0
  80. package/dist/chunk-TXVH44HM.js +90 -0
  81. package/dist/chunk-TXVH44HM.js.map +1 -0
  82. package/dist/chunk-UGFBA4GV.js +123 -0
  83. package/dist/chunk-UGFBA4GV.js.map +1 -0
  84. package/dist/chunk-UQQWZT6C.mjs +14 -0
  85. package/dist/chunk-UQQWZT6C.mjs.map +1 -0
  86. package/dist/chunk-VEREDMI2.mjs +85 -0
  87. package/dist/chunk-VEREDMI2.mjs.map +1 -0
  88. package/dist/chunk-VH47Q6TS.js +182 -0
  89. package/dist/chunk-VH47Q6TS.js.map +1 -0
  90. package/dist/chunk-W3GAOR7Y.js +76 -0
  91. package/dist/chunk-W3GAOR7Y.js.map +1 -0
  92. package/dist/chunk-WXQZIUNW.js +242 -0
  93. package/dist/chunk-WXQZIUNW.js.map +1 -0
  94. package/dist/chunk-XGRAHX6T.mjs +53 -0
  95. package/dist/chunk-XGRAHX6T.mjs.map +1 -0
  96. package/dist/chunk-XKNFL657.mjs +137 -0
  97. package/dist/chunk-XKNFL657.mjs.map +1 -0
  98. package/dist/chunk-XUI43LEZ.mjs +30 -0
  99. package/dist/chunk-XUI43LEZ.mjs.map +1 -0
  100. package/dist/chunk-Y7ENNK7L.mjs +238 -0
  101. package/dist/chunk-Y7ENNK7L.mjs.map +1 -0
  102. package/dist/chunk-Z3HHSD5I.mjs +127 -0
  103. package/dist/chunk-Z3HHSD5I.mjs.map +1 -0
  104. package/dist/chunk-Z4BLTVTB.js +30 -0
  105. package/dist/chunk-Z4BLTVTB.js.map +1 -0
  106. package/dist/chunk-ZNZEJDOE.js +50 -0
  107. package/dist/chunk-ZNZEJDOE.js.map +1 -0
  108. package/dist/chunk-ZQFMTLZJ.mjs +320 -0
  109. package/dist/chunk-ZQFMTLZJ.mjs.map +1 -0
  110. package/dist/constants.js +15 -110
  111. package/dist/constants.js.map +1 -1
  112. package/dist/constants.mjs +16 -0
  113. package/dist/constants.mjs.map +1 -0
  114. package/dist/gas-flows/DefaultGasFeeFlow.js +14 -77
  115. package/dist/gas-flows/DefaultGasFeeFlow.js.map +1 -1
  116. package/dist/gas-flows/DefaultGasFeeFlow.mjs +15 -0
  117. package/dist/gas-flows/DefaultGasFeeFlow.mjs.map +1 -0
  118. package/dist/gas-flows/LineaGasFeeFlow.js +15 -110
  119. package/dist/gas-flows/LineaGasFeeFlow.js.map +1 -1
  120. package/dist/gas-flows/LineaGasFeeFlow.mjs +16 -0
  121. package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -0
  122. package/dist/helpers/EtherscanRemoteTransactionSource.js +11 -145
  123. package/dist/helpers/EtherscanRemoteTransactionSource.js.map +1 -1
  124. package/dist/helpers/EtherscanRemoteTransactionSource.mjs +12 -0
  125. package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +1 -0
  126. package/dist/helpers/GasFeePoller.js +11 -143
  127. package/dist/helpers/GasFeePoller.js.map +1 -1
  128. package/dist/helpers/GasFeePoller.mjs +12 -0
  129. package/dist/helpers/GasFeePoller.mjs.map +1 -0
  130. package/dist/helpers/IncomingTransactionHelper.js +8 -205
  131. package/dist/helpers/IncomingTransactionHelper.js.map +1 -1
  132. package/dist/helpers/IncomingTransactionHelper.mjs +9 -0
  133. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -0
  134. package/dist/helpers/MultichainTrackingHelper.js +12 -291
  135. package/dist/helpers/MultichainTrackingHelper.js.map +1 -1
  136. package/dist/helpers/MultichainTrackingHelper.mjs +13 -0
  137. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -0
  138. package/dist/helpers/PendingTransactionTracker.js +9 -360
  139. package/dist/helpers/PendingTransactionTracker.js.map +1 -1
  140. package/dist/helpers/PendingTransactionTracker.mjs +10 -0
  141. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -0
  142. package/dist/index.js +57 -26
  143. package/dist/index.js.map +1 -1
  144. package/dist/index.mjs +58 -0
  145. package/dist/index.mjs.map +1 -0
  146. package/dist/logger.js +11 -8
  147. package/dist/logger.js.map +1 -1
  148. package/dist/logger.mjs +12 -0
  149. package/dist/logger.mjs.map +1 -0
  150. package/dist/tsconfig.build.tsbuildinfo +1 -0
  151. package/dist/{TransactionController.d.ts → types/TransactionController.d.ts} +236 -46
  152. package/dist/types/TransactionController.d.ts.map +1 -0
  153. package/dist/{constants.d.ts → types/constants.d.ts} +10 -0
  154. package/dist/types/constants.d.ts.map +1 -0
  155. package/dist/types/gas-flows/DefaultGasFeeFlow.d.ts.map +1 -0
  156. package/dist/types/gas-flows/LineaGasFeeFlow.d.ts.map +1 -0
  157. package/dist/types/helpers/EtherscanRemoteTransactionSource.d.ts.map +1 -0
  158. package/dist/{helpers → types/helpers}/GasFeePoller.d.ts +5 -3
  159. package/dist/types/helpers/GasFeePoller.d.ts.map +1 -0
  160. package/dist/types/helpers/IncomingTransactionHelper.d.ts.map +1 -0
  161. package/dist/types/helpers/MultichainTrackingHelper.d.ts.map +1 -0
  162. package/dist/types/helpers/PendingTransactionTracker.d.ts.map +1 -0
  163. package/dist/types/index.d.ts +9 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/logger.d.ts.map +1 -0
  166. package/dist/{types.d.ts → types/types.d.ts} +94 -65
  167. package/dist/types/types.d.ts.map +1 -0
  168. package/dist/types/utils/etherscan.d.ts.map +1 -0
  169. package/dist/types/utils/external-transactions.d.ts.map +1 -0
  170. package/dist/types/utils/gas-fees.d.ts.map +1 -0
  171. package/dist/types/utils/gas-flow.d.ts.map +1 -0
  172. package/dist/types/utils/gas.d.ts.map +1 -0
  173. package/dist/types/utils/history.d.ts +20 -0
  174. package/dist/types/utils/history.d.ts.map +1 -0
  175. package/dist/types/utils/layer1-gas-fee-flow.d.ts +16 -0
  176. package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +1 -0
  177. package/dist/types/utils/nonce.d.ts.map +1 -0
  178. package/dist/types/utils/simulation-api.d.ts +99 -0
  179. package/dist/types/utils/simulation-api.d.ts.map +1 -0
  180. package/dist/types/utils/simulation.d.ts +21 -0
  181. package/dist/types/utils/simulation.d.ts.map +1 -0
  182. package/dist/{utils → types/utils}/swaps.d.ts +8 -5
  183. package/dist/types/utils/swaps.d.ts.map +1 -0
  184. package/dist/types/utils/transaction-type.d.ts.map +1 -0
  185. package/dist/types/utils/utils.d.ts.map +1 -0
  186. package/dist/types/utils/validation.d.ts.map +1 -0
  187. package/dist/types.js +19 -170
  188. package/dist/types.js.map +1 -1
  189. package/dist/types.mjs +20 -0
  190. package/dist/types.mjs.map +1 -0
  191. package/dist/utils/etherscan.js +13 -118
  192. package/dist/utils/etherscan.js.map +1 -1
  193. package/dist/utils/etherscan.mjs +14 -0
  194. package/dist/utils/etherscan.mjs.map +1 -0
  195. package/dist/utils/external-transactions.js +8 -35
  196. package/dist/utils/external-transactions.js.map +1 -1
  197. package/dist/utils/external-transactions.mjs +9 -0
  198. package/dist/utils/external-transactions.mjs.map +1 -0
  199. package/dist/utils/gas-fees.js +15 -200
  200. package/dist/utils/gas-fees.js.map +1 -1
  201. package/dist/utils/gas-fees.mjs +16 -0
  202. package/dist/utils/gas-fees.mjs.map +1 -0
  203. package/dist/utils/gas-flow.js +10 -52
  204. package/dist/utils/gas-flow.js.map +1 -1
  205. package/dist/utils/gas-flow.mjs +11 -0
  206. package/dist/utils/gas-flow.mjs.map +1 -0
  207. package/dist/utils/gas.js +19 -133
  208. package/dist/utils/gas.js.map +1 -1
  209. package/dist/utils/gas.mjs +20 -0
  210. package/dist/utils/gas.mjs.map +1 -0
  211. package/dist/utils/history.js +9 -83
  212. package/dist/utils/history.js.map +1 -1
  213. package/dist/utils/history.mjs +10 -0
  214. package/dist/utils/history.mjs.map +1 -0
  215. package/dist/utils/layer1-gas-fee-flow.js +9 -0
  216. package/dist/utils/layer1-gas-fee-flow.js.map +1 -0
  217. package/dist/utils/layer1-gas-fee-flow.mjs +9 -0
  218. package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -0
  219. package/dist/utils/nonce.js +10 -76
  220. package/dist/utils/nonce.js.map +1 -1
  221. package/dist/utils/nonce.mjs +11 -0
  222. package/dist/utils/nonce.mjs.map +1 -0
  223. package/dist/utils/simulation-api.js +10 -0
  224. package/dist/utils/simulation-api.js.map +1 -0
  225. package/dist/utils/simulation-api.mjs +10 -0
  226. package/dist/utils/simulation-api.mjs.map +1 -0
  227. package/dist/utils/simulation.js +12 -0
  228. package/dist/utils/simulation.js.map +1 -0
  229. package/dist/utils/simulation.mjs +12 -0
  230. package/dist/utils/simulation.mjs.map +1 -0
  231. package/dist/utils/swaps.js +23 -256
  232. package/dist/utils/swaps.js.map +1 -1
  233. package/dist/utils/swaps.mjs +24 -0
  234. package/dist/utils/swaps.mjs.map +1 -0
  235. package/dist/utils/transaction-type.js +10 -120
  236. package/dist/utils/transaction-type.js.map +1 -1
  237. package/dist/utils/transaction-type.mjs +11 -0
  238. package/dist/utils/transaction-type.mjs.map +1 -0
  239. package/dist/utils/utils.js +32 -160
  240. package/dist/utils/utils.js.map +1 -1
  241. package/dist/utils/utils.mjs +33 -0
  242. package/dist/utils/utils.mjs.map +1 -0
  243. package/dist/utils/validation.js +11 -258
  244. package/dist/utils/validation.js.map +1 -1
  245. package/dist/utils/validation.mjs +12 -0
  246. package/dist/utils/validation.mjs.map +1 -0
  247. package/package.json +22 -10
  248. package/dist/TransactionController.d.ts.map +0 -1
  249. package/dist/constants.d.ts.map +0 -1
  250. package/dist/gas-flows/DefaultGasFeeFlow.d.ts.map +0 -1
  251. package/dist/gas-flows/LineaGasFeeFlow.d.ts.map +0 -1
  252. package/dist/helpers/EtherscanRemoteTransactionSource.d.ts.map +0 -1
  253. package/dist/helpers/GasFeePoller.d.ts.map +0 -1
  254. package/dist/helpers/IncomingTransactionHelper.d.ts.map +0 -1
  255. package/dist/helpers/MultichainTrackingHelper.d.ts.map +0 -1
  256. package/dist/helpers/PendingTransactionTracker.d.ts.map +0 -1
  257. package/dist/index.d.ts +0 -7
  258. package/dist/index.d.ts.map +0 -1
  259. package/dist/logger.d.ts.map +0 -1
  260. package/dist/types.d.ts.map +0 -1
  261. package/dist/utils/etherscan.d.ts.map +0 -1
  262. package/dist/utils/external-transactions.d.ts.map +0 -1
  263. package/dist/utils/gas-fees.d.ts.map +0 -1
  264. package/dist/utils/gas-flow.d.ts.map +0 -1
  265. package/dist/utils/gas.d.ts.map +0 -1
  266. package/dist/utils/history.d.ts +0 -15
  267. package/dist/utils/history.d.ts.map +0 -1
  268. package/dist/utils/nonce.d.ts.map +0 -1
  269. package/dist/utils/swaps.d.ts.map +0 -1
  270. package/dist/utils/transaction-type.d.ts.map +0 -1
  271. package/dist/utils/utils.d.ts.map +0 -1
  272. package/dist/utils/validation.d.ts.map +0 -1
  273. /package/dist/{gas-flows → types/gas-flows}/DefaultGasFeeFlow.d.ts +0 -0
  274. /package/dist/{gas-flows → types/gas-flows}/LineaGasFeeFlow.d.ts +0 -0
  275. /package/dist/{helpers → types/helpers}/EtherscanRemoteTransactionSource.d.ts +0 -0
  276. /package/dist/{helpers → types/helpers}/IncomingTransactionHelper.d.ts +0 -0
  277. /package/dist/{helpers → types/helpers}/MultichainTrackingHelper.d.ts +0 -0
  278. /package/dist/{helpers → types/helpers}/PendingTransactionTracker.d.ts +0 -0
  279. /package/dist/{logger.d.ts → types/logger.d.ts} +0 -0
  280. /package/dist/{utils → types/utils}/etherscan.d.ts +0 -0
  281. /package/dist/{utils → types/utils}/external-transactions.d.ts +0 -0
  282. /package/dist/{utils → types/utils}/gas-fees.d.ts +0 -0
  283. /package/dist/{utils → types/utils}/gas-flow.d.ts +0 -0
  284. /package/dist/{utils → types/utils}/gas.d.ts +0 -0
  285. /package/dist/{utils → types/utils}/nonce.d.ts +0 -0
  286. /package/dist/{utils → types/utils}/transaction-type.d.ts +0 -0
  287. /package/dist/{utils → types/utils}/utils.d.ts +0 -0
  288. /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":";;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,OAAO,0BAA0B;AAanC,IAAM,MAAM,mBAAmB,eAAe,KAAK;AAEnD,IAAM,YAAY;AAClB,IAAM,yBAAyB;AAEtC,eAAsB,UAAU,SAA2B;AACzD,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,gBAAgB,EAAE,GAAG,OAAO,SAAS;AAE3C,QAAM,CAAC,KAAK,eAAe,IAAI,MAAM,OAAO,OAAO;AAEnD,SAAO,SAAS,MAAM;AACtB,SAAO,kBAAkB;AAEzB,MAAI,CAAC,cAAc,KAAK;AACtB,WAAO,sBAAsB,OAAO,SAAS;AAAA,EAC/C;AAEA,MAAI,CAAC,OAAO,qBAAqB;AAC/B,WAAO,sBAAsB,CAAC;AAAA,EAChC;AAEA,SAAO,oBAAoB,MAAM,OAAO,SAAS;AACnD;AAEA,eAAsB,YACpB,UACA,UACA;AACA,QAAM,UAAU,EAAE,GAAG,SAAS;AAC9B,QAAM,EAAE,MAAM,MAAM,IAAI;AAExB,QAAM,EAAE,UAAU,aAAa,QAAQ,YAAY,IAAI,MAAM;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,aAAa,QAAQ,WAAW;AAEtC,UAAQ,OAAO,OAAO,MAAM,IAAI,IAAI;AACpC,UAAQ,MAAM,QAAQ,WAAW,YAAY,IAAI,EAAE,CAAC;AACpD,UAAQ,QAAQ,SAAS;AAEzB,MAAI,eAAe,QAAQ;AAC3B,MAAI;AAEJ,MAAI;AACF,mBAAe,MAAM,MAAM,UAAU,eAAe,CAAC,OAAO,CAAC;AAAA,EAG/D,SAAS,OAAY;AACnB,sBAAkB;AAAA,MAChB,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM;AAAA,MAChB,OAAO;AAAA,QACL;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,qBAAqB,EAAE,GAAG,iBAAiB,UAAU,YAAY,CAAC;AAAA,EACxE;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,aACd,cACA,eACA,YACA;AACA,QAAM,iBAAiB,QAAQ,YAAY;AAC3C,QAAM,WAAW,QAAQ,aAAa,EAAE,KAAK,GAAG;AAChD,QAAM,cAAc,eAAe,KAAK,UAAU;AAElD,MAAI,eAAe,GAAG,QAAQ,GAAG;AAC/B,UAAM,kBAAkB,MAAM,YAAY;AAC1C,QAAI,yBAAyB,eAAe;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,GAAG,QAAQ,GAAG;AAC5B,UAAM,YAAY,MAAM,QAAQ,WAAW,CAAC;AAC5C,QAAI,yBAAyB,WAAW,UAAU;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,QAAQ,QAAQ,CAAC;AACtC,MAAI,gCAAgC,MAAM;AAC1C,SAAO;AACT;AAEA,eAAe,OACb,SACwD;AACxD,QAAM,EAAE,iBAAiB,SAAS,OAAO,IAAI;AAE7C,MAAI,OAAO,SAAS,KAAK;AACvB,QAAI,4BAA4B,OAAO,SAAS,GAAG;AACnD,WAAO,CAAC,OAAO,SAAS,GAAG;AAAA,EAC7B;AAEA,MAAI,MAAM,iBAAiB,OAAO,GAAG;AACnC,QAAI,qBAAqB,SAAS;AAClC,WAAO,CAAC,SAAS;AAAA,EACnB;AAEA,QAAM,EAAE,eAAe,cAAc,gBAAgB,IAAI,MAAM;AAAA,IAC7D,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAEA,MAAI,iBAAiB;AACnB,QAAI,2CAA2C;AAC/C,WAAO,CAAC,cAAc,eAAe;AAAA,EACvC;AAEA,QAAM,mBACJ,2BACE,OACF,KAAK;AAEP,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,CAAC,aAAa,eAAe;AACtC;AAEA,eAAe,iBAAiB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM;AAAA,IACJ,UAAU,EAAE,IAAI,KAAK;AAAA,EACvB,IAAI;AAEJ,MAAI,mBAAmB,CAAC,MAAM,MAAM;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM,QAAQ,UAAU,EAAE;AAEvC,SAAO,CAAC,QAAQ,SAAS;AAC3B;AAEA,eAAe,QACb,UACA,SAC6B;AAC7B,SAAO,MAAM,MAAM,UAAU,WAAW,CAAC,OAAO,CAAC;AACnD;AAEA,eAAe,eACb,UAC+C;AAC/C,SAAO,MAAM,MAAM,UAAU,oBAAoB,CAAC,UAAU,KAAK,CAAC;AACpE;","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":[]}