@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,182 @@
1
+ import {
2
+ updateTransactionLayer1GasFee
3
+ } from "./chunk-KFL2GGZC.mjs";
4
+ import {
5
+ getGasFeeFlow
6
+ } from "./chunk-2YXA3K67.mjs";
7
+ import {
8
+ projectLogger
9
+ } from "./chunk-UQQWZT6C.mjs";
10
+ import {
11
+ __privateAdd,
12
+ __privateGet,
13
+ __privateMethod,
14
+ __privateSet
15
+ } from "./chunk-XUI43LEZ.mjs";
16
+
17
+ // src/helpers/GasFeePoller.ts
18
+ import { createModuleLogger } from "@metamask/utils";
19
+ import EventEmitter from "events";
20
+ var log = createModuleLogger(projectLogger, "gas-fee-poller");
21
+ var INTERVAL_MILLISECONDS = 1e4;
22
+ var _gasFeeFlows, _getEthQuery, _getGasFeeControllerEstimates, _getTransactions, _layer1GasFeeFlows, _timeout, _running, _start, start_fn, _stop, stop_fn, _onTimeout, onTimeout_fn, _updateTransactionGasFeeEstimates, updateTransactionGasFeeEstimates_fn, _updateTransactionSuggestedFees, updateTransactionSuggestedFees_fn, _updateTransactionLayer1GasFee, updateTransactionLayer1GasFee_fn, _getUnapprovedTransactions, getUnapprovedTransactions_fn;
23
+ var GasFeePoller = class {
24
+ /**
25
+ * Constructs a new instance of the GasFeePoller.
26
+ * @param options - The options for this instance.
27
+ * @param options.gasFeeFlows - The gas fee flows to use to obtain suitable gas fees.
28
+ * @param options.getEthQuery - Callback to obtain an EthQuery instance.
29
+ * @param options.getGasFeeControllerEstimates - Callback to obtain the default fee estimates.
30
+ * @param options.getTransactions - Callback to obtain the transaction data.
31
+ * @param options.layer1GasFeeFlows - The layer 1 gas fee flows to use to obtain suitable layer 1 gas fees.
32
+ * @param options.onStateChange - Callback to register a listener for controller state changes.
33
+ */
34
+ constructor({
35
+ gasFeeFlows,
36
+ getEthQuery,
37
+ getGasFeeControllerEstimates,
38
+ getTransactions,
39
+ layer1GasFeeFlows,
40
+ onStateChange
41
+ }) {
42
+ __privateAdd(this, _start);
43
+ __privateAdd(this, _stop);
44
+ __privateAdd(this, _onTimeout);
45
+ __privateAdd(this, _updateTransactionGasFeeEstimates);
46
+ __privateAdd(this, _updateTransactionSuggestedFees);
47
+ __privateAdd(this, _updateTransactionLayer1GasFee);
48
+ __privateAdd(this, _getUnapprovedTransactions);
49
+ this.hub = new EventEmitter();
50
+ __privateAdd(this, _gasFeeFlows, void 0);
51
+ __privateAdd(this, _getEthQuery, void 0);
52
+ __privateAdd(this, _getGasFeeControllerEstimates, void 0);
53
+ __privateAdd(this, _getTransactions, void 0);
54
+ __privateAdd(this, _layer1GasFeeFlows, void 0);
55
+ __privateAdd(this, _timeout, void 0);
56
+ __privateAdd(this, _running, false);
57
+ __privateSet(this, _gasFeeFlows, gasFeeFlows);
58
+ __privateSet(this, _layer1GasFeeFlows, layer1GasFeeFlows);
59
+ __privateSet(this, _getEthQuery, getEthQuery);
60
+ __privateSet(this, _getGasFeeControllerEstimates, getGasFeeControllerEstimates);
61
+ __privateSet(this, _getTransactions, getTransactions);
62
+ onStateChange(() => {
63
+ const unapprovedTransactions = __privateMethod(this, _getUnapprovedTransactions, getUnapprovedTransactions_fn).call(this);
64
+ if (unapprovedTransactions.length) {
65
+ __privateMethod(this, _start, start_fn).call(this);
66
+ } else {
67
+ __privateMethod(this, _stop, stop_fn).call(this);
68
+ }
69
+ });
70
+ }
71
+ };
72
+ _gasFeeFlows = new WeakMap();
73
+ _getEthQuery = new WeakMap();
74
+ _getGasFeeControllerEstimates = new WeakMap();
75
+ _getTransactions = new WeakMap();
76
+ _layer1GasFeeFlows = new WeakMap();
77
+ _timeout = new WeakMap();
78
+ _running = new WeakMap();
79
+ _start = new WeakSet();
80
+ start_fn = function() {
81
+ if (__privateGet(this, _running)) {
82
+ return;
83
+ }
84
+ __privateMethod(this, _onTimeout, onTimeout_fn).call(this);
85
+ __privateSet(this, _running, true);
86
+ log("Started polling");
87
+ };
88
+ _stop = new WeakSet();
89
+ stop_fn = function() {
90
+ if (!__privateGet(this, _running)) {
91
+ return;
92
+ }
93
+ clearTimeout(__privateGet(this, _timeout));
94
+ __privateSet(this, _timeout, void 0);
95
+ __privateSet(this, _running, false);
96
+ log("Stopped polling");
97
+ };
98
+ _onTimeout = new WeakSet();
99
+ onTimeout_fn = async function() {
100
+ await __privateMethod(this, _updateTransactionGasFeeEstimates, updateTransactionGasFeeEstimates_fn).call(this);
101
+ __privateSet(this, _timeout, setTimeout(() => __privateMethod(this, _onTimeout, onTimeout_fn).call(this), INTERVAL_MILLISECONDS));
102
+ };
103
+ _updateTransactionGasFeeEstimates = new WeakSet();
104
+ updateTransactionGasFeeEstimates_fn = async function() {
105
+ const unapprovedTransactions = __privateMethod(this, _getUnapprovedTransactions, getUnapprovedTransactions_fn).call(this);
106
+ log("Found unapproved transactions", {
107
+ count: unapprovedTransactions.length
108
+ });
109
+ await Promise.all(
110
+ unapprovedTransactions.flatMap((tx) => [
111
+ __privateMethod(this, _updateTransactionSuggestedFees, updateTransactionSuggestedFees_fn).call(this, tx),
112
+ __privateMethod(this, _updateTransactionLayer1GasFee, updateTransactionLayer1GasFee_fn).call(this, tx)
113
+ ])
114
+ );
115
+ };
116
+ _updateTransactionSuggestedFees = new WeakSet();
117
+ updateTransactionSuggestedFees_fn = async function(transactionMeta) {
118
+ const { chainId, networkClientId } = transactionMeta;
119
+ const ethQuery = __privateGet(this, _getEthQuery).call(this, chainId, networkClientId);
120
+ const gasFeeFlow = getGasFeeFlow(transactionMeta, __privateGet(this, _gasFeeFlows));
121
+ if (!gasFeeFlow) {
122
+ log("No gas fee flow found", transactionMeta.id);
123
+ } else {
124
+ log(
125
+ "Found gas fee flow",
126
+ gasFeeFlow.constructor.name,
127
+ transactionMeta.id
128
+ );
129
+ }
130
+ const request = {
131
+ ethQuery,
132
+ getGasFeeControllerEstimates: __privateGet(this, _getGasFeeControllerEstimates),
133
+ transactionMeta
134
+ };
135
+ let gasFeeEstimates;
136
+ if (gasFeeFlow) {
137
+ try {
138
+ const response = await gasFeeFlow.getGasFees(request);
139
+ gasFeeEstimates = response.estimates;
140
+ } catch (error) {
141
+ log("Failed to get suggested gas fees", transactionMeta.id, error);
142
+ }
143
+ }
144
+ if (!gasFeeEstimates && transactionMeta.gasFeeEstimatesLoaded) {
145
+ return;
146
+ }
147
+ const updatedTransactionMeta = {
148
+ ...transactionMeta,
149
+ gasFeeEstimates,
150
+ gasFeeEstimatesLoaded: true
151
+ };
152
+ this.hub.emit("transaction-updated", updatedTransactionMeta);
153
+ log("Updated suggested gas fees", {
154
+ gasFeeEstimates: updatedTransactionMeta.gasFeeEstimates,
155
+ transaction: updatedTransactionMeta.id
156
+ });
157
+ };
158
+ _updateTransactionLayer1GasFee = new WeakSet();
159
+ updateTransactionLayer1GasFee_fn = async function(transactionMeta) {
160
+ const { chainId, networkClientId } = transactionMeta;
161
+ const ethQuery = __privateGet(this, _getEthQuery).call(this, chainId, networkClientId);
162
+ await updateTransactionLayer1GasFee({
163
+ ethQuery,
164
+ layer1GasFeeFlows: __privateGet(this, _layer1GasFeeFlows),
165
+ transactionMeta
166
+ });
167
+ if (transactionMeta.layer1GasFee === void 0) {
168
+ return;
169
+ }
170
+ this.hub.emit("transaction-updated", transactionMeta);
171
+ };
172
+ _getUnapprovedTransactions = new WeakSet();
173
+ getUnapprovedTransactions_fn = function() {
174
+ return __privateGet(this, _getTransactions).call(this).filter(
175
+ (tx) => tx.status === "unapproved" /* unapproved */
176
+ );
177
+ };
178
+
179
+ export {
180
+ GasFeePoller
181
+ };
182
+ //# sourceMappingURL=chunk-EEMJC7S7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/GasFeePoller.ts"],"sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type {\n GasFeeEstimates,\n GasFeeFlow,\n GasFeeFlowRequest,\n Layer1GasFeeFlow,\n} from '../types';\nimport { TransactionStatus, type TransactionMeta } from '../types';\nimport { getGasFeeFlow } from '../utils/gas-flow';\nimport { updateTransactionLayer1GasFee } from '../utils/layer1-gas-fee-flow';\n\nconst log = createModuleLogger(projectLogger, 'gas-fee-poller');\n\nconst INTERVAL_MILLISECONDS = 10000;\n\n/**\n * Automatically polls and updates suggested gas fees on unapproved transactions.\n */\nexport class GasFeePoller {\n hub: EventEmitter = new EventEmitter();\n\n #gasFeeFlows: GasFeeFlow[];\n\n #getEthQuery: (chainId: Hex, networkClientId?: NetworkClientId) => EthQuery;\n\n #getGasFeeControllerEstimates: () => Promise<GasFeeState>;\n\n #getTransactions: () => TransactionMeta[];\n\n #layer1GasFeeFlows: Layer1GasFeeFlow[];\n\n #timeout: ReturnType<typeof setTimeout> | undefined;\n\n #running = false;\n\n /**\n * Constructs a new instance of the GasFeePoller.\n * @param options - The options for this instance.\n * @param options.gasFeeFlows - The gas fee flows to use to obtain suitable gas fees.\n * @param options.getEthQuery - Callback to obtain an EthQuery instance.\n * @param options.getGasFeeControllerEstimates - Callback to obtain the default fee estimates.\n * @param options.getTransactions - Callback to obtain the transaction data.\n * @param options.layer1GasFeeFlows - The layer 1 gas fee flows to use to obtain suitable layer 1 gas fees.\n * @param options.onStateChange - Callback to register a listener for controller state changes.\n */\n constructor({\n gasFeeFlows,\n getEthQuery,\n getGasFeeControllerEstimates,\n getTransactions,\n layer1GasFeeFlows,\n onStateChange,\n }: {\n gasFeeFlows: GasFeeFlow[];\n getEthQuery: (chainId: Hex, networkClientId?: NetworkClientId) => EthQuery;\n getGasFeeControllerEstimates: () => Promise<GasFeeState>;\n getTransactions: () => TransactionMeta[];\n layer1GasFeeFlows: Layer1GasFeeFlow[];\n onStateChange: (listener: () => void) => void;\n }) {\n this.#gasFeeFlows = gasFeeFlows;\n this.#layer1GasFeeFlows = layer1GasFeeFlows;\n this.#getEthQuery = getEthQuery;\n this.#getGasFeeControllerEstimates = getGasFeeControllerEstimates;\n this.#getTransactions = getTransactions;\n\n onStateChange(() => {\n const unapprovedTransactions = this.#getUnapprovedTransactions();\n\n if (unapprovedTransactions.length) {\n this.#start();\n } else {\n this.#stop();\n }\n });\n }\n\n #start() {\n if (this.#running) {\n return;\n }\n\n // Intentionally not awaiting since this starts the timeout chain.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#onTimeout();\n\n this.#running = true;\n\n log('Started polling');\n }\n\n #stop() {\n if (!this.#running) {\n return;\n }\n\n clearTimeout(this.#timeout);\n\n this.#timeout = undefined;\n this.#running = false;\n\n log('Stopped polling');\n }\n\n async #onTimeout() {\n await this.#updateTransactionGasFeeEstimates();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(() => this.#onTimeout(), INTERVAL_MILLISECONDS);\n }\n\n async #updateTransactionGasFeeEstimates() {\n const unapprovedTransactions = this.#getUnapprovedTransactions();\n\n log('Found unapproved transactions', {\n count: unapprovedTransactions.length,\n });\n\n await Promise.all(\n unapprovedTransactions.flatMap((tx) => [\n this.#updateTransactionSuggestedFees(tx),\n this.#updateTransactionLayer1GasFee(tx),\n ]),\n );\n }\n\n async #updateTransactionSuggestedFees(transactionMeta: TransactionMeta) {\n const { chainId, networkClientId } = transactionMeta;\n\n const ethQuery = this.#getEthQuery(chainId, networkClientId);\n const gasFeeFlow = getGasFeeFlow(transactionMeta, this.#gasFeeFlows);\n\n if (!gasFeeFlow) {\n log('No gas fee flow found', transactionMeta.id);\n } else {\n log(\n 'Found gas fee flow',\n gasFeeFlow.constructor.name,\n transactionMeta.id,\n );\n }\n\n const request: GasFeeFlowRequest = {\n ethQuery,\n getGasFeeControllerEstimates: this.#getGasFeeControllerEstimates,\n transactionMeta,\n };\n\n let gasFeeEstimates: GasFeeEstimates | undefined;\n\n if (gasFeeFlow) {\n try {\n const response = await gasFeeFlow.getGasFees(request);\n gasFeeEstimates = response.estimates;\n } catch (error) {\n log('Failed to get suggested gas fees', transactionMeta.id, error);\n }\n }\n\n if (!gasFeeEstimates && transactionMeta.gasFeeEstimatesLoaded) {\n return;\n }\n\n const updatedTransactionMeta: TransactionMeta = {\n ...transactionMeta,\n gasFeeEstimates,\n gasFeeEstimatesLoaded: true,\n };\n\n this.hub.emit('transaction-updated', updatedTransactionMeta);\n\n log('Updated suggested gas fees', {\n gasFeeEstimates: updatedTransactionMeta.gasFeeEstimates,\n transaction: updatedTransactionMeta.id,\n });\n }\n\n async #updateTransactionLayer1GasFee(transactionMeta: TransactionMeta) {\n const { chainId, networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery(chainId, networkClientId);\n\n await updateTransactionLayer1GasFee({\n ethQuery,\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n transactionMeta,\n });\n\n if (transactionMeta.layer1GasFee === undefined) {\n return;\n }\n\n this.hub.emit('transaction-updated', transactionMeta);\n }\n\n #getUnapprovedTransactions() {\n return this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,170 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
+
3
+
4
+ var _chunkCXXGL43Kjs = require('./chunk-CXXGL43K.js');
5
+
6
+
7
+ var _chunkITDY6AIZjs = require('./chunk-ITDY6AIZ.js');
8
+
9
+
10
+ var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
11
+
12
+
13
+
14
+
15
+
16
+ var _chunkZ4BLTVTBjs = require('./chunk-Z4BLTVTB.js');
17
+
18
+ // src/helpers/EtherscanRemoteTransactionSource.ts
19
+ var _controllerutils = require('@metamask/controller-utils');
20
+ var _asyncmutex = require('async-mutex');
21
+ var _bnjs = require('bn.js'); var _bnjs2 = _interopRequireDefault(_bnjs);
22
+ var _uuid = require('uuid');
23
+ var ETHERSCAN_RATE_LIMIT_INTERVAL = 5e3;
24
+ var _includeTokenTransfers, _isTokenRequestPending, _mutex, _releaseLockAfterInterval, releaseLockAfterInterval_fn, _fetchNormalTransactions, _fetchTokenTransactions, _getResponseTransactions, getResponseTransactions_fn, _normalizeTransaction, normalizeTransaction_fn, _normalizeTokenTransaction, normalizeTokenTransaction_fn, _normalizeTransactionBase, normalizeTransactionBase_fn;
25
+ var EtherscanRemoteTransactionSource = class {
26
+ constructor({
27
+ includeTokenTransfers
28
+ } = {}) {
29
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _releaseLockAfterInterval);
30
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _getResponseTransactions);
31
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _normalizeTransaction);
32
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _normalizeTokenTransaction);
33
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _normalizeTransactionBase);
34
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _includeTokenTransfers, void 0);
35
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _isTokenRequestPending, void 0);
36
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _mutex, new (0, _asyncmutex.Mutex)());
37
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _fetchNormalTransactions, async (request, etherscanRequest) => {
38
+ const { currentChainId } = request;
39
+ const etherscanTransactions = await _chunkCXXGL43Kjs.fetchEtherscanTransactions.call(void 0,
40
+ etherscanRequest
41
+ );
42
+ return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getResponseTransactions, getResponseTransactions_fn).call(this, etherscanTransactions).map(
43
+ (tx) => _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _normalizeTransaction, normalizeTransaction_fn).call(this, tx, currentChainId)
44
+ );
45
+ });
46
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _fetchTokenTransactions, async (request, etherscanRequest) => {
47
+ const { currentChainId } = request;
48
+ const etherscanTransactions = await _chunkCXXGL43Kjs.fetchEtherscanTokenTransactions.call(void 0,
49
+ etherscanRequest
50
+ );
51
+ return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getResponseTransactions, getResponseTransactions_fn).call(this, etherscanTransactions).map(
52
+ (tx) => _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _normalizeTokenTransaction, normalizeTokenTransaction_fn).call(this, tx, currentChainId)
53
+ );
54
+ });
55
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _includeTokenTransfers, includeTokenTransfers ?? true);
56
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isTokenRequestPending, false);
57
+ }
58
+ isSupportedNetwork(chainId) {
59
+ return Object.keys(_chunkITDY6AIZjs.ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);
60
+ }
61
+ getLastBlockVariations() {
62
+ return [_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isTokenRequestPending) ? "token" : "normal"];
63
+ }
64
+ async fetchTransactions(request) {
65
+ const releaseLock = await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _mutex).acquire();
66
+ const acquiredTime = Date.now();
67
+ const etherscanRequest = {
68
+ ...request,
69
+ chainId: request.currentChainId
70
+ };
71
+ try {
72
+ const transactions = _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isTokenRequestPending) ? await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _fetchTokenTransactions).call(this, request, etherscanRequest) : await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _fetchNormalTransactions).call(this, request, etherscanRequest);
73
+ if (_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _includeTokenTransfers)) {
74
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isTokenRequestPending, !_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isTokenRequestPending));
75
+ }
76
+ return transactions;
77
+ } finally {
78
+ _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _releaseLockAfterInterval, releaseLockAfterInterval_fn).call(this, acquiredTime, releaseLock);
79
+ }
80
+ }
81
+ };
82
+ _includeTokenTransfers = new WeakMap();
83
+ _isTokenRequestPending = new WeakMap();
84
+ _mutex = new WeakMap();
85
+ _releaseLockAfterInterval = new WeakSet();
86
+ releaseLockAfterInterval_fn = function(acquireTime, releaseLock) {
87
+ const elapsedTime = Date.now() - acquireTime;
88
+ const remainingTime = Math.max(
89
+ 0,
90
+ ETHERSCAN_RATE_LIMIT_INTERVAL - elapsedTime
91
+ );
92
+ if (remainingTime > 0) {
93
+ setTimeout(releaseLock, remainingTime);
94
+ } else {
95
+ releaseLock();
96
+ }
97
+ };
98
+ _fetchNormalTransactions = new WeakMap();
99
+ _fetchTokenTransactions = new WeakMap();
100
+ _getResponseTransactions = new WeakSet();
101
+ getResponseTransactions_fn = function(response) {
102
+ let result = response.result;
103
+ if (response.status === "0") {
104
+ result = [];
105
+ if (response.result.length) {
106
+ _chunkS6VGOPUYjs.incomingTransactionsLogger.call(void 0, "Ignored Etherscan request error", {
107
+ message: response.result,
108
+ type: _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isTokenRequestPending) ? "token" : "normal"
109
+ });
110
+ }
111
+ }
112
+ return result;
113
+ };
114
+ _normalizeTransaction = new WeakSet();
115
+ normalizeTransaction_fn = function(txMeta, currentChainId) {
116
+ const base = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _normalizeTransactionBase, normalizeTransactionBase_fn).call(this, txMeta, currentChainId);
117
+ return {
118
+ ...base,
119
+ txParams: {
120
+ ...base.txParams,
121
+ data: txMeta.input
122
+ },
123
+ ...txMeta.isError === "0" ? { status: "confirmed" /* confirmed */ } : {
124
+ error: new Error("Transaction failed"),
125
+ status: "failed" /* failed */
126
+ }
127
+ };
128
+ };
129
+ _normalizeTokenTransaction = new WeakSet();
130
+ normalizeTokenTransaction_fn = function(txMeta, currentChainId) {
131
+ const base = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _normalizeTransactionBase, normalizeTransactionBase_fn).call(this, txMeta, currentChainId);
132
+ return {
133
+ ...base,
134
+ isTransfer: true,
135
+ transferInformation: {
136
+ contractAddress: txMeta.contractAddress,
137
+ decimals: Number(txMeta.tokenDecimal),
138
+ symbol: txMeta.tokenSymbol
139
+ }
140
+ };
141
+ };
142
+ _normalizeTransactionBase = new WeakSet();
143
+ normalizeTransactionBase_fn = function(txMeta, currentChainId) {
144
+ const time = parseInt(txMeta.timeStamp, 10) * 1e3;
145
+ return {
146
+ blockNumber: txMeta.blockNumber,
147
+ chainId: currentChainId,
148
+ hash: txMeta.hash,
149
+ id: _uuid.v1.call(void 0, { msecs: time }),
150
+ status: "confirmed" /* confirmed */,
151
+ time,
152
+ txParams: {
153
+ chainId: currentChainId,
154
+ from: txMeta.from,
155
+ gas: _controllerutils.BNToHex.call(void 0, new (0, _bnjs2.default)(txMeta.gas)),
156
+ gasPrice: _controllerutils.BNToHex.call(void 0, new (0, _bnjs2.default)(txMeta.gasPrice)),
157
+ gasUsed: _controllerutils.BNToHex.call(void 0, new (0, _bnjs2.default)(txMeta.gasUsed)),
158
+ nonce: _controllerutils.BNToHex.call(void 0, new (0, _bnjs2.default)(txMeta.nonce)),
159
+ to: txMeta.to,
160
+ value: _controllerutils.BNToHex.call(void 0, new (0, _bnjs2.default)(txMeta.value))
161
+ },
162
+ type: "incoming" /* incoming */,
163
+ verifiedOnBlockchain: false
164
+ };
165
+ };
166
+
167
+
168
+
169
+ exports.EtherscanRemoteTransactionSource = EtherscanRemoteTransactionSource;
170
+ //# sourceMappingURL=chunk-F3CMU2DM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/EtherscanRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport {\n fetchEtherscanTokenTransactions,\n fetchEtherscanTransactions,\n} from '../utils/etherscan';\nimport type {\n EtherscanTokenTransactionMeta,\n EtherscanTransactionMeta,\n EtherscanTransactionMetaBase,\n EtherscanTransactionRequest,\n EtherscanTransactionResponse,\n} from '../utils/etherscan';\n\nconst ETHERSCAN_RATE_LIMIT_INTERVAL = 5000;\n/**\n * A RemoteTransactionSource that fetches transaction data from Etherscan.\n */\nexport class EtherscanRemoteTransactionSource\n implements RemoteTransactionSource\n{\n #includeTokenTransfers: boolean;\n\n #isTokenRequestPending: boolean;\n\n #mutex = new Mutex();\n\n constructor({\n includeTokenTransfers,\n }: { includeTokenTransfers?: boolean } = {}) {\n this.#includeTokenTransfers = includeTokenTransfers ?? true;\n this.#isTokenRequestPending = false;\n }\n\n isSupportedNetwork(chainId: Hex): boolean {\n return Object.keys(ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);\n }\n\n getLastBlockVariations(): string[] {\n return [this.#isTokenRequestPending ? 'token' : 'normal'];\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const releaseLock = await this.#mutex.acquire();\n const acquiredTime = Date.now();\n\n const etherscanRequest: EtherscanTransactionRequest = {\n ...request,\n chainId: request.currentChainId,\n };\n\n try {\n const transactions = this.#isTokenRequestPending\n ? await this.#fetchTokenTransactions(request, etherscanRequest)\n : await this.#fetchNormalTransactions(request, etherscanRequest);\n\n if (this.#includeTokenTransfers) {\n this.#isTokenRequestPending = !this.#isTokenRequestPending;\n }\n\n return transactions;\n } finally {\n this.#releaseLockAfterInterval(acquiredTime, releaseLock);\n }\n }\n\n #releaseLockAfterInterval(acquireTime: number, releaseLock: () => void) {\n const elapsedTime = Date.now() - acquireTime;\n const remainingTime = Math.max(\n 0,\n ETHERSCAN_RATE_LIMIT_INTERVAL - elapsedTime,\n );\n // Wait for the remaining time if it hasn't been 5 seconds yet\n if (remainingTime > 0) {\n setTimeout(releaseLock, remainingTime);\n } else {\n releaseLock();\n }\n }\n\n #fetchNormalTransactions = async (\n request: RemoteTransactionSourceRequest,\n etherscanRequest: EtherscanTransactionRequest,\n ) => {\n const { currentChainId } = request;\n\n const etherscanTransactions = await fetchEtherscanTransactions(\n etherscanRequest,\n );\n\n return this.#getResponseTransactions(etherscanTransactions).map((tx) =>\n this.#normalizeTransaction(tx, currentChainId),\n );\n };\n\n #fetchTokenTransactions = async (\n request: RemoteTransactionSourceRequest,\n etherscanRequest: EtherscanTransactionRequest,\n ) => {\n const { currentChainId } = request;\n\n const etherscanTransactions = await fetchEtherscanTokenTransactions(\n etherscanRequest,\n );\n\n return this.#getResponseTransactions(etherscanTransactions).map((tx) =>\n this.#normalizeTokenTransaction(tx, currentChainId),\n );\n };\n\n #getResponseTransactions<T extends EtherscanTransactionMetaBase>(\n response: EtherscanTransactionResponse<T>,\n ): T[] {\n let result = response.result as T[];\n\n if (response.status === '0') {\n result = [];\n\n if (response.result.length) {\n log('Ignored Etherscan request error', {\n message: response.result,\n type: this.#isTokenRequestPending ? 'token' : 'normal',\n });\n }\n }\n\n return result;\n }\n\n #normalizeTransaction(\n txMeta: EtherscanTransactionMeta,\n currentChainId: Hex,\n ): TransactionMeta {\n const base = this.#normalizeTransactionBase(txMeta, currentChainId);\n\n return {\n ...base,\n txParams: {\n ...base.txParams,\n data: txMeta.input,\n },\n ...(txMeta.isError === '0'\n ? { status: TransactionStatus.confirmed }\n : {\n error: new Error('Transaction failed'),\n status: TransactionStatus.failed,\n }),\n };\n }\n\n #normalizeTokenTransaction(\n txMeta: EtherscanTokenTransactionMeta,\n currentChainId: Hex,\n ): TransactionMeta {\n const base = this.#normalizeTransactionBase(txMeta, currentChainId);\n\n return {\n ...base,\n isTransfer: true,\n transferInformation: {\n contractAddress: txMeta.contractAddress,\n decimals: Number(txMeta.tokenDecimal),\n symbol: txMeta.tokenSymbol,\n },\n };\n }\n\n #normalizeTransactionBase(\n txMeta: EtherscanTransactionMetaBase,\n currentChainId: Hex,\n ): TransactionMeta {\n const time = parseInt(txMeta.timeStamp, 10) * 1000;\n\n return {\n blockNumber: txMeta.blockNumber,\n chainId: currentChainId,\n hash: txMeta.hash,\n id: random({ msecs: time }),\n status: TransactionStatus.confirmed,\n time,\n txParams: {\n chainId: currentChainId,\n from: txMeta.from,\n gas: BNToHex(new BN(txMeta.gas)),\n gasPrice: BNToHex(new BN(txMeta.gasPrice)),\n gasUsed: BNToHex(new BN(txMeta.gasUsed)),\n nonce: BNToHex(new BN(txMeta.nonce)),\n to: txMeta.to,\n value: BNToHex(new BN(txMeta.value)),\n },\n type: TransactionType.incoming,\n verifiedOnBlockchain: false,\n };\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ // src/utils/external-transactions.ts
2
+ import { rpcErrors } from "@metamask/rpc-errors";
3
+ function validateConfirmedExternalTransaction(transactionMeta, confirmedTxs, pendingTxs) {
4
+ if (!transactionMeta || !transactionMeta.txParams) {
5
+ throw rpcErrors.invalidParams(
6
+ '"transactionMeta" or "transactionMeta.txParams" is missing'
7
+ );
8
+ }
9
+ if (transactionMeta.status !== "confirmed" /* confirmed */) {
10
+ throw rpcErrors.invalidParams(
11
+ 'External transaction status should be "confirmed"'
12
+ );
13
+ }
14
+ const externalTxNonce = transactionMeta.txParams.nonce;
15
+ if (pendingTxs && pendingTxs.length > 0) {
16
+ const foundPendingTxByNonce = pendingTxs.find(
17
+ (tx) => tx.txParams?.nonce === externalTxNonce
18
+ );
19
+ if (foundPendingTxByNonce) {
20
+ throw rpcErrors.invalidParams(
21
+ "External transaction nonce should not be in pending txs"
22
+ );
23
+ }
24
+ }
25
+ if (confirmedTxs && confirmedTxs.length > 0) {
26
+ const foundConfirmedTxByNonce = confirmedTxs.find(
27
+ (tx) => tx.txParams?.nonce === externalTxNonce
28
+ );
29
+ if (foundConfirmedTxByNonce) {
30
+ throw rpcErrors.invalidParams(
31
+ "External transaction nonce should not be in confirmed txs"
32
+ );
33
+ }
34
+ }
35
+ }
36
+
37
+ export {
38
+ validateConfirmedExternalTransaction
39
+ };
40
+ //# sourceMappingURL=chunk-FRKQ3Z2L.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/external-transactions.ts"],"sourcesContent":["// These utility functions are exclusively used by `confirmExternalTransaction` method in controller\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { TransactionStatus } from '../types';\nimport type { TransactionMeta } from '../types';\n\n/**\n * Validates the external provided transaction meta.\n *\n * @param transactionMeta - The transaction meta to validate.\n * @param confirmedTxs - The confirmed transactions in controller state.\n * @param pendingTxs - The submitted transactions in controller state.\n */\nexport function validateConfirmedExternalTransaction(\n transactionMeta?: TransactionMeta,\n confirmedTxs?: TransactionMeta[],\n pendingTxs?: TransactionMeta[],\n) {\n if (!transactionMeta || !transactionMeta.txParams) {\n throw rpcErrors.invalidParams(\n '\"transactionMeta\" or \"transactionMeta.txParams\" is missing',\n );\n }\n\n if (transactionMeta.status !== TransactionStatus.confirmed) {\n throw rpcErrors.invalidParams(\n 'External transaction status should be \"confirmed\"',\n );\n }\n\n const externalTxNonce = transactionMeta.txParams.nonce;\n if (pendingTxs && pendingTxs.length > 0) {\n const foundPendingTxByNonce = pendingTxs.find(\n (tx) => tx.txParams?.nonce === externalTxNonce,\n );\n if (foundPendingTxByNonce) {\n throw rpcErrors.invalidParams(\n 'External transaction nonce should not be in pending txs',\n );\n }\n }\n\n if (confirmedTxs && confirmedTxs.length > 0) {\n const foundConfirmedTxByNonce = confirmedTxs.find(\n (tx) => tx.txParams?.nonce === externalTxNonce,\n );\n if (foundConfirmedTxByNonce) {\n throw rpcErrors.invalidParams(\n 'External transaction nonce should not be in confirmed txs',\n );\n }\n }\n}\n"],"mappings":";AACA,SAAS,iBAAiB;AAYnB,SAAS,qCACd,iBACA,cACA,YACA;AACA,MAAI,CAAC,mBAAmB,CAAC,gBAAgB,UAAU;AACjD,UAAM,UAAU;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,wCAAwC;AAC1D,UAAM,UAAU;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,gBAAgB,SAAS;AACjD,MAAI,cAAc,WAAW,SAAS,GAAG;AACvC,UAAM,wBAAwB,WAAW;AAAA,MACvC,CAAC,OAAO,GAAG,UAAU,UAAU;AAAA,IACjC;AACA,QAAI,uBAAuB;AACzB,YAAM,UAAU;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,aAAa,SAAS,GAAG;AAC3C,UAAM,0BAA0B,aAAa;AAAA,MAC3C,CAAC,OAAO,GAAG,UAAU,UAAU;AAAA,IACjC;AACA,QAAI,yBAAyB;AAC3B,YAAM,UAAU;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,75 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/transaction-type.ts
2
+ var _abi = require('@ethersproject/abi');
3
+ var _controllerutils = require('@metamask/controller-utils');
4
+ var _metamaskethabis = require('@metamask/metamask-eth-abis');
5
+ var ESTIMATE_GAS_ERROR = "eth_estimateGas rpc method error";
6
+ var ERC20Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC20);
7
+ var ERC721Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC721);
8
+ var ERC1155Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC1155);
9
+ async function determineTransactionType(txParams, ethQuery) {
10
+ const { data, to } = txParams;
11
+ if (data && !to) {
12
+ return { type: "contractDeployment" /* deployContract */, getCodeResponse: void 0 };
13
+ }
14
+ const { contractCode: getCodeResponse, isContractAddress } = await readAddressAsContract(ethQuery, to);
15
+ if (!isContractAddress) {
16
+ return { type: "simpleSend" /* simpleSend */, getCodeResponse };
17
+ }
18
+ const hasValue = Number(txParams.value ?? "0") !== 0;
19
+ const contractInteractionResult = {
20
+ type: "contractInteraction" /* contractInteraction */,
21
+ getCodeResponse
22
+ };
23
+ if (!data || hasValue) {
24
+ return contractInteractionResult;
25
+ }
26
+ const name = parseStandardTokenTransactionData(data)?.name;
27
+ if (!name) {
28
+ return contractInteractionResult;
29
+ }
30
+ const tokenMethodName = [
31
+ "approve" /* tokenMethodApprove */,
32
+ "setapprovalforall" /* tokenMethodSetApprovalForAll */,
33
+ "transfer" /* tokenMethodTransfer */,
34
+ "transferfrom" /* tokenMethodTransferFrom */,
35
+ "safetransferfrom" /* tokenMethodSafeTransferFrom */
36
+ ].find((methodName) => methodName.toLowerCase() === name.toLowerCase());
37
+ if (tokenMethodName) {
38
+ return { type: tokenMethodName, getCodeResponse };
39
+ }
40
+ return contractInteractionResult;
41
+ }
42
+ function parseStandardTokenTransactionData(data) {
43
+ if (!data) {
44
+ return void 0;
45
+ }
46
+ try {
47
+ return ERC20Interface.parseTransaction({ data });
48
+ } catch {
49
+ }
50
+ try {
51
+ return ERC721Interface.parseTransaction({ data });
52
+ } catch {
53
+ }
54
+ try {
55
+ return ERC1155Interface.parseTransaction({ data });
56
+ } catch {
57
+ }
58
+ return void 0;
59
+ }
60
+ async function readAddressAsContract(ethQuery, address) {
61
+ let contractCode;
62
+ try {
63
+ contractCode = await _controllerutils.query.call(void 0, ethQuery, "getCode", [address]);
64
+ } catch (e) {
65
+ contractCode = null;
66
+ }
67
+ const isContractAddress = contractCode ? contractCode !== "0x" && contractCode !== "0x0" : false;
68
+ return { contractCode, isContractAddress };
69
+ }
70
+
71
+
72
+
73
+
74
+ exports.ESTIMATE_GAS_ERROR = ESTIMATE_GAS_ERROR; exports.determineTransactionType = determineTransactionType;
75
+ //# sourceMappingURL=chunk-HS277C77.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/transaction-type.ts"],"names":[],"mappings":";AACA,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAEtB,SAAS,WAAW,UAAU,kBAAkB;AAKzC,IAAM,qBAAqB;AAElC,IAAM,iBAAiB,IAAI,UAAU,QAAQ;AAC7C,IAAM,kBAAkB,IAAI,UAAU,SAAS;AAC/C,IAAM,mBAAmB,IAAI,UAAU,UAAU;AAWjD,eAAsB,yBACpB,UACA,UACqC;AACrC,QAAM,EAAE,MAAM,GAAG,IAAI;AAErB,MAAI,QAAQ,CAAC,IAAI;AACf,WAAO,EAAE,iDAAsC,iBAAiB,OAAU;AAAA,EAC5E;AAEA,QAAM,EAAE,cAAc,iBAAiB,kBAAkB,IACvD,MAAM,sBAAsB,UAAU,EAAE;AAE1C,MAAI,CAAC,mBAAmB;AACtB,WAAO,EAAE,qCAAkC,gBAAgB;AAAA,EAC7D;AAEA,QAAM,WAAW,OAAO,SAAS,SAAS,GAAG,MAAM;AAEnD,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,UAAU;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,kCAAkC,IAAI,GAAG;AAEtD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,EAAE,KAAK,CAAC,eAAe,WAAW,YAAY,MAAM,KAAK,YAAY,CAAC;AAEtE,MAAI,iBAAiB;AACnB,WAAO,EAAE,MAAM,iBAAiB,gBAAgB;AAAA,EAClD;AAEA,SAAO;AACT;AAUA,SAAS,kCACP,MACoC;AACpC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,eAAe,iBAAiB,EAAE,KAAK,CAAC;AAAA,EACjD,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,WAAO,gBAAgB,iBAAiB,EAAE,KAAK,CAAC;AAAA,EAClD,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,WAAO,iBAAiB,iBAAiB,EAAE,KAAK,CAAC;AAAA,EACnD,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AASA,eAAe,sBACb,UACA,SAIC;AACD,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,MAAM,UAAU,WAAW,CAAC,OAAO,CAAC;AAAA,EAC3D,SAAS,GAAG;AACV,mBAAe;AAAA,EACjB;AAEA,QAAM,oBAAoB,eACtB,iBAAiB,QAAQ,iBAAiB,QAC1C;AACJ,SAAO,EAAE,cAAc,kBAAkB;AAC3C","sourcesContent":["import type { TransactionDescription } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport { abiERC721, abiERC20, abiERC1155 } from '@metamask/metamask-eth-abis';\n\nimport type { InferTransactionTypeResult, TransactionParams } from '../types';\nimport { TransactionType } from '../types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\nconst ERC20Interface = new Interface(abiERC20);\nconst ERC721Interface = new Interface(abiERC721);\nconst ERC1155Interface = new Interface(abiERC1155);\n\n/**\n * Determines the type of the transaction by analyzing the txParams.\n * It will never return TRANSACTION_TYPE_CANCEL or TRANSACTION_TYPE_RETRY as these\n * represent specific events that we specify manually at transaction creation.\n *\n * @param txParams - Parameters for the transaction.\n * @param ethQuery - EthQuery instance.\n * @returns A object with the transaction type and the contract code response in Hex.\n */\nexport async function determineTransactionType(\n txParams: TransactionParams,\n ethQuery: EthQuery,\n): Promise<InferTransactionTypeResult> {\n const { data, to } = txParams;\n\n if (data && !to) {\n return { type: TransactionType.deployContract, getCodeResponse: undefined };\n }\n\n const { contractCode: getCodeResponse, isContractAddress } =\n await readAddressAsContract(ethQuery, to);\n\n if (!isContractAddress) {\n return { type: TransactionType.simpleSend, getCodeResponse };\n }\n\n const hasValue = Number(txParams.value ?? '0') !== 0;\n\n const contractInteractionResult = {\n type: TransactionType.contractInteraction,\n getCodeResponse,\n };\n\n if (!data || hasValue) {\n return contractInteractionResult;\n }\n\n const name = parseStandardTokenTransactionData(data)?.name;\n\n if (!name) {\n return contractInteractionResult;\n }\n\n const tokenMethodName = [\n TransactionType.tokenMethodApprove,\n TransactionType.tokenMethodSetApprovalForAll,\n TransactionType.tokenMethodTransfer,\n TransactionType.tokenMethodTransferFrom,\n TransactionType.tokenMethodSafeTransferFrom,\n ].find((methodName) => methodName.toLowerCase() === name.toLowerCase());\n\n if (tokenMethodName) {\n return { type: tokenMethodName, getCodeResponse };\n }\n\n return contractInteractionResult;\n}\n\n/**\n * Attempts to decode transaction data using ABIs for three different token standards: ERC20, ERC721, ERC1155.\n * The data will decode correctly if the transaction is an interaction with a contract that matches one of these\n * contract standards\n *\n * @param data - Encoded transaction data.\n * @returns A representation of an ethereum contract call.\n */\nfunction parseStandardTokenTransactionData(\n data?: string,\n): TransactionDescription | undefined {\n if (!data) {\n return undefined;\n }\n\n try {\n return ERC20Interface.parseTransaction({ data });\n } catch {\n // ignore and next try to parse with erc721 ABI\n }\n\n try {\n return ERC721Interface.parseTransaction({ data });\n } catch {\n // ignore and next try to parse with erc1155 ABI\n }\n\n try {\n return ERC1155Interface.parseTransaction({ data });\n } catch {\n // ignore and return undefined\n }\n\n return undefined;\n}\n\n/**\n * Reads an Ethereum address and determines if it is a contract address.\n *\n * @param ethQuery - The Ethereum query object used to interact with the Ethereum blockchain.\n * @param address - The Ethereum address.\n * @returns An object containing the contract code and a boolean indicating if it is a contract address.\n */\nasync function readAddressAsContract(\n ethQuery: EthQuery,\n address?: string,\n): Promise<{\n contractCode: string | null;\n isContractAddress: boolean;\n}> {\n let contractCode;\n try {\n contractCode = await query(ethQuery, 'getCode', [address]);\n } catch (e) {\n contractCode = null;\n }\n\n const isContractAddress = contractCode\n ? contractCode !== '0x' && contractCode !== '0x0'\n : false;\n return { contractCode, isContractAddress };\n}\n"]}
@@ -0,0 +1,127 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// 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
+
121
+
122
+
123
+
124
+
125
+
126
+ exports.CHAIN_IDS = CHAIN_IDS; exports.DEFAULT_ETHERSCAN_DOMAIN = DEFAULT_ETHERSCAN_DOMAIN; exports.DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX; exports.ETHERSCAN_SUPPORTED_NETWORKS = ETHERSCAN_SUPPORTED_NETWORKS; exports.GAS_BUFFER_CHAIN_OVERRIDES = GAS_BUFFER_CHAIN_OVERRIDES;
127
+ //# sourceMappingURL=chunk-ITDY6AIZ.js.map