@metamask-previews/transaction-controller 69.6.1-preview-4f4c98e → 69.6.1-preview-eb263b0ee

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 (492) hide show
  1. package/CHANGELOG.md +0 -5
  2. package/dist/TransactionController-method-action-types.cjs +7 -0
  3. package/dist/TransactionController-method-action-types.cjs.map +1 -0
  4. package/dist/{TransactionController-method-action-types.d.ts → TransactionController-method-action-types.d.cts} +2 -2
  5. package/dist/TransactionController-method-action-types.d.cts.map +1 -0
  6. package/dist/TransactionController-method-action-types.d.mts +413 -0
  7. package/dist/TransactionController-method-action-types.d.mts.map +1 -0
  8. package/dist/{TransactionController-method-action-types.js → TransactionController-method-action-types.mjs} +1 -1
  9. package/dist/TransactionController-method-action-types.mjs.map +1 -0
  10. package/dist/TransactionController.cjs +2444 -0
  11. package/dist/TransactionController.cjs.map +1 -0
  12. package/dist/{TransactionController.d.ts → TransactionController.d.cts} +18 -18
  13. package/dist/TransactionController.d.cts.map +1 -0
  14. package/dist/TransactionController.d.mts +751 -0
  15. package/dist/TransactionController.d.mts.map +1 -0
  16. package/dist/{TransactionController.js → TransactionController.mjs} +50 -49
  17. package/dist/TransactionController.mjs.map +1 -0
  18. package/dist/api/accounts-api.cjs +57 -0
  19. package/dist/api/accounts-api.cjs.map +1 -0
  20. package/dist/api/{accounts-api.d.ts → accounts-api.d.cts} +1 -1
  21. package/dist/api/accounts-api.d.cts.map +1 -0
  22. package/dist/api/accounts-api.d.mts +44 -0
  23. package/dist/api/accounts-api.d.mts.map +1 -0
  24. package/dist/api/{accounts-api.js → accounts-api.mjs} +5 -5
  25. package/dist/api/accounts-api.mjs.map +1 -0
  26. package/dist/api/simulation-api.cjs +116 -0
  27. package/dist/api/simulation-api.cjs.map +1 -0
  28. package/dist/api/{simulation-api.d.ts → simulation-api.d.cts} +3 -3
  29. package/dist/api/simulation-api.d.cts.map +1 -0
  30. package/dist/api/simulation-api.d.mts +196 -0
  31. package/dist/api/simulation-api.d.mts.map +1 -0
  32. package/dist/api/{simulation-api.js → simulation-api.mjs} +8 -7
  33. package/dist/api/simulation-api.mjs.map +1 -0
  34. package/dist/constants.cjs +111 -0
  35. package/dist/constants.cjs.map +1 -0
  36. package/dist/{constants.d.ts → constants.d.cts} +37 -37
  37. package/dist/constants.d.cts.map +1 -0
  38. package/dist/constants.d.mts +78 -0
  39. package/dist/constants.d.mts.map +1 -0
  40. package/dist/{constants.js → constants.mjs} +1 -1
  41. package/dist/constants.mjs.map +1 -0
  42. package/dist/errors.cjs +37 -0
  43. package/dist/errors.cjs.map +1 -0
  44. package/dist/{errors.d.ts → errors.d.cts} +2 -2
  45. package/dist/errors.d.cts.map +1 -0
  46. package/dist/errors.d.mts +19 -0
  47. package/dist/errors.d.mts.map +1 -0
  48. package/dist/{errors.js → errors.mjs} +2 -2
  49. package/dist/errors.mjs.map +1 -0
  50. package/dist/gas-flows/DefaultGasFeeFlow.cjs +85 -0
  51. package/dist/gas-flows/{DefaultGasFeeFlow.js.map → DefaultGasFeeFlow.cjs.map} +1 -1
  52. package/dist/gas-flows/{DefaultGasFeeFlow.d.ts → DefaultGasFeeFlow.d.cts} +2 -2
  53. package/dist/gas-flows/DefaultGasFeeFlow.d.cts.map +1 -0
  54. package/dist/gas-flows/DefaultGasFeeFlow.d.mts +10 -0
  55. package/dist/gas-flows/DefaultGasFeeFlow.d.mts.map +1 -0
  56. package/dist/gas-flows/{DefaultGasFeeFlow.js → DefaultGasFeeFlow.mjs} +6 -6
  57. package/dist/gas-flows/DefaultGasFeeFlow.mjs.map +1 -0
  58. package/dist/gas-flows/LineaGasFeeFlow.cjs +111 -0
  59. package/dist/gas-flows/LineaGasFeeFlow.cjs.map +1 -0
  60. package/dist/gas-flows/{LineaGasFeeFlow.d.ts → LineaGasFeeFlow.d.cts} +3 -3
  61. package/dist/gas-flows/LineaGasFeeFlow.d.cts.map +1 -0
  62. package/dist/gas-flows/LineaGasFeeFlow.d.mts +16 -0
  63. package/dist/gas-flows/LineaGasFeeFlow.d.mts.map +1 -0
  64. package/dist/gas-flows/{LineaGasFeeFlow.js → LineaGasFeeFlow.mjs} +7 -7
  65. package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -0
  66. package/dist/gas-flows/MantleLayer1GasFeeFlow.cjs +66 -0
  67. package/dist/gas-flows/MantleLayer1GasFeeFlow.cjs.map +1 -0
  68. package/dist/gas-flows/{MantleLayer1GasFeeFlow.d.ts → MantleLayer1GasFeeFlow.d.cts} +5 -5
  69. package/dist/gas-flows/MantleLayer1GasFeeFlow.d.cts.map +1 -0
  70. package/dist/gas-flows/MantleLayer1GasFeeFlow.d.mts +21 -0
  71. package/dist/gas-flows/MantleLayer1GasFeeFlow.d.mts.map +1 -0
  72. package/dist/gas-flows/{MantleLayer1GasFeeFlow.js → MantleLayer1GasFeeFlow.mjs} +6 -6
  73. package/dist/gas-flows/MantleLayer1GasFeeFlow.mjs.map +1 -0
  74. package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs +59 -0
  75. package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs.map +1 -0
  76. package/dist/gas-flows/{OptimismLayer1GasFeeFlow.d.ts → OptimismLayer1GasFeeFlow.d.cts} +4 -4
  77. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts.map +1 -0
  78. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts +14 -0
  79. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts.map +1 -0
  80. package/dist/gas-flows/{OptimismLayer1GasFeeFlow.js → OptimismLayer1GasFeeFlow.mjs} +5 -5
  81. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -0
  82. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +201 -0
  83. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -0
  84. package/dist/gas-flows/{OracleLayer1GasFeeFlow.d.ts → OracleLayer1GasFeeFlow.d.cts} +5 -5
  85. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -0
  86. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts +57 -0
  87. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -0
  88. package/dist/gas-flows/{OracleLayer1GasFeeFlow.js → OracleLayer1GasFeeFlow.mjs} +15 -8
  89. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -0
  90. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.cjs +123 -0
  91. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.cjs.map +1 -0
  92. package/dist/gas-flows/{RandomisedEstimationsGasFeeFlow.d.ts → RandomisedEstimationsGasFeeFlow.d.cts} +4 -4
  93. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.d.cts.map +1 -0
  94. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.d.mts +28 -0
  95. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.d.mts.map +1 -0
  96. package/dist/gas-flows/{RandomisedEstimationsGasFeeFlow.js → RandomisedEstimationsGasFeeFlow.mjs} +8 -8
  97. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.mjs.map +1 -0
  98. package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs +24 -0
  99. package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs.map +1 -0
  100. package/dist/gas-flows/{ScrollLayer1GasFeeFlow.d.ts → ScrollLayer1GasFeeFlow.d.cts} +5 -5
  101. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.cts.map +1 -0
  102. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts +16 -0
  103. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts.map +1 -0
  104. package/dist/gas-flows/{ScrollLayer1GasFeeFlow.js → ScrollLayer1GasFeeFlow.mjs} +3 -3
  105. package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs.map +1 -0
  106. package/dist/gas-flows/TestGasFeeFlow.cjs +73 -0
  107. package/dist/gas-flows/TestGasFeeFlow.cjs.map +1 -0
  108. package/dist/gas-flows/{TestGasFeeFlow.d.ts → TestGasFeeFlow.d.cts} +2 -2
  109. package/dist/gas-flows/TestGasFeeFlow.d.cts.map +1 -0
  110. package/dist/gas-flows/TestGasFeeFlow.d.mts +12 -0
  111. package/dist/gas-flows/TestGasFeeFlow.d.mts.map +1 -0
  112. package/dist/gas-flows/{TestGasFeeFlow.js → TestGasFeeFlow.mjs} +3 -3
  113. package/dist/gas-flows/TestGasFeeFlow.mjs.map +1 -0
  114. package/dist/helpers/GasFeePoller.cjs +334 -0
  115. package/dist/helpers/GasFeePoller.cjs.map +1 -0
  116. package/dist/helpers/{GasFeePoller.d.ts → GasFeePoller.d.cts} +10 -7
  117. package/dist/helpers/GasFeePoller.d.cts.map +1 -0
  118. package/dist/helpers/GasFeePoller.d.mts +66 -0
  119. package/dist/helpers/GasFeePoller.d.mts.map +1 -0
  120. package/dist/helpers/{GasFeePoller.js → GasFeePoller.mjs} +9 -9
  121. package/dist/helpers/GasFeePoller.mjs.map +1 -0
  122. package/dist/helpers/MethodDataHelper.cjs +84 -0
  123. package/dist/helpers/MethodDataHelper.cjs.map +1 -0
  124. package/dist/helpers/{MethodDataHelper.d.ts → MethodDataHelper.d.cts} +7 -4
  125. package/dist/helpers/MethodDataHelper.d.cts.map +1 -0
  126. package/dist/helpers/MethodDataHelper.d.mts +16 -0
  127. package/dist/helpers/MethodDataHelper.d.mts.map +1 -0
  128. package/dist/helpers/{MethodDataHelper.js → MethodDataHelper.mjs} +7 -7
  129. package/dist/helpers/MethodDataHelper.mjs.map +1 -0
  130. package/dist/helpers/MultichainTrackingHelper.cjs +231 -0
  131. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -0
  132. package/dist/helpers/{MultichainTrackingHelper.d.ts → MultichainTrackingHelper.d.cts} +5 -5
  133. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -0
  134. package/dist/helpers/MultichainTrackingHelper.d.mts +56 -0
  135. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -0
  136. package/dist/helpers/{MultichainTrackingHelper.js → MultichainTrackingHelper.mjs} +8 -8
  137. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -0
  138. package/dist/helpers/PendingTransactionTracker.cjs +407 -0
  139. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -0
  140. package/dist/helpers/{PendingTransactionTracker.d.ts → PendingTransactionTracker.d.cts} +8 -5
  141. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -0
  142. package/dist/helpers/PendingTransactionTracker.d.mts +54 -0
  143. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -0
  144. package/dist/helpers/{PendingTransactionTracker.js → PendingTransactionTracker.mjs} +15 -14
  145. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -0
  146. package/dist/helpers/ResimulateHelper.cjs +274 -0
  147. package/dist/helpers/ResimulateHelper.cjs.map +1 -0
  148. package/dist/helpers/{ResimulateHelper.d.ts → ResimulateHelper.d.cts} +3 -3
  149. package/dist/helpers/ResimulateHelper.d.cts.map +1 -0
  150. package/dist/helpers/ResimulateHelper.d.mts +36 -0
  151. package/dist/helpers/ResimulateHelper.d.mts.map +1 -0
  152. package/dist/helpers/{ResimulateHelper.js → ResimulateHelper.mjs} +8 -7
  153. package/dist/helpers/ResimulateHelper.mjs.map +1 -0
  154. package/dist/helpers/TransactionPoller.cjs +175 -0
  155. package/dist/helpers/TransactionPoller.cjs.map +1 -0
  156. package/dist/helpers/{TransactionPoller.d.ts → TransactionPoller.d.cts} +5 -5
  157. package/dist/helpers/TransactionPoller.d.cts.map +1 -0
  158. package/dist/helpers/TransactionPoller.d.mts +37 -0
  159. package/dist/helpers/TransactionPoller.d.mts.map +1 -0
  160. package/dist/helpers/{TransactionPoller.js → TransactionPoller.mjs} +11 -10
  161. package/dist/helpers/TransactionPoller.mjs.map +1 -0
  162. package/dist/hooks/CollectPublishHook.cjs +94 -0
  163. package/dist/hooks/CollectPublishHook.cjs.map +1 -0
  164. package/dist/hooks/{CollectPublishHook.d.ts → CollectPublishHook.d.cts} +3 -3
  165. package/dist/hooks/CollectPublishHook.d.cts.map +1 -0
  166. package/dist/hooks/CollectPublishHook.d.mts +29 -0
  167. package/dist/hooks/CollectPublishHook.d.mts.map +1 -0
  168. package/dist/hooks/{CollectPublishHook.js → CollectPublishHook.mjs} +5 -4
  169. package/dist/hooks/CollectPublishHook.mjs.map +1 -0
  170. package/dist/hooks/ExtraTransactionsPublishHook.cjs +126 -0
  171. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -0
  172. package/dist/hooks/{ExtraTransactionsPublishHook.d.ts → ExtraTransactionsPublishHook.d.cts} +3 -3
  173. package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +1 -0
  174. package/dist/hooks/ExtraTransactionsPublishHook.d.mts +19 -0
  175. package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +1 -0
  176. package/dist/hooks/{ExtraTransactionsPublishHook.js → ExtraTransactionsPublishHook.mjs} +3 -3
  177. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -0
  178. package/dist/hooks/SequentialPublishBatchHook.cjs +112 -0
  179. package/dist/hooks/SequentialPublishBatchHook.cjs.map +1 -0
  180. package/dist/hooks/{SequentialPublishBatchHook.d.ts → SequentialPublishBatchHook.d.cts} +4 -4
  181. package/dist/hooks/SequentialPublishBatchHook.d.cts.map +1 -0
  182. package/dist/hooks/SequentialPublishBatchHook.d.mts +22 -0
  183. package/dist/hooks/SequentialPublishBatchHook.d.mts.map +1 -0
  184. package/dist/hooks/{SequentialPublishBatchHook.js → SequentialPublishBatchHook.mjs} +4 -4
  185. package/dist/hooks/SequentialPublishBatchHook.mjs.map +1 -0
  186. package/dist/index.cjs +40 -0
  187. package/dist/index.cjs.map +1 -0
  188. package/dist/{index.d.ts → index.d.cts} +16 -16
  189. package/dist/index.d.cts.map +1 -0
  190. package/dist/index.d.mts +16 -0
  191. package/dist/index.d.mts.map +1 -0
  192. package/dist/index.mjs +12 -0
  193. package/dist/index.mjs.map +1 -0
  194. package/dist/logger.cjs +9 -0
  195. package/dist/logger.cjs.map +1 -0
  196. package/dist/{logger.d.ts → logger.d.cts} +3 -2
  197. package/dist/logger.d.cts.map +1 -0
  198. package/dist/logger.d.mts +6 -0
  199. package/dist/logger.d.mts.map +1 -0
  200. package/dist/{logger.js → logger.mjs} +2 -2
  201. package/dist/logger.mjs.map +1 -0
  202. package/dist/types.cjs +382 -0
  203. package/dist/types.cjs.map +1 -0
  204. package/dist/{types.d.ts → types.d.cts} +8 -8
  205. package/dist/types.d.cts.map +1 -0
  206. package/dist/types.d.mts +1887 -0
  207. package/dist/types.d.mts.map +1 -0
  208. package/dist/{types.js → types.mjs} +1 -1
  209. package/dist/types.mjs.map +1 -0
  210. package/dist/utils/balance-changes.cjs +592 -0
  211. package/dist/utils/balance-changes.cjs.map +1 -0
  212. package/dist/utils/{balance-changes.d.ts → balance-changes.d.cts} +5 -5
  213. package/dist/utils/balance-changes.d.cts.map +1 -0
  214. package/dist/utils/balance-changes.d.mts +38 -0
  215. package/dist/utils/balance-changes.d.mts.map +1 -0
  216. package/dist/utils/{balance-changes.js → balance-changes.mjs} +20 -13
  217. package/dist/utils/balance-changes.mjs.map +1 -0
  218. package/dist/utils/balance.cjs +44 -0
  219. package/dist/utils/balance.cjs.map +1 -0
  220. package/dist/utils/{balance.d.ts → balance.d.cts} +5 -5
  221. package/dist/utils/balance.d.cts.map +1 -0
  222. package/dist/utils/balance.d.mts +26 -0
  223. package/dist/utils/balance.d.mts.map +1 -0
  224. package/dist/utils/{balance.js → balance.mjs} +3 -3
  225. package/dist/utils/balance.mjs.map +1 -0
  226. package/dist/utils/batch.cjs +712 -0
  227. package/dist/utils/batch.cjs.map +1 -0
  228. package/dist/utils/{batch.d.ts → batch.d.cts} +8 -8
  229. package/dist/utils/batch.d.cts.map +1 -0
  230. package/dist/utils/batch.d.mts +58 -0
  231. package/dist/utils/batch.d.mts.map +1 -0
  232. package/dist/utils/{batch.js → batch.mjs} +18 -18
  233. package/dist/utils/batch.mjs.map +1 -0
  234. package/dist/utils/eip7702.cjs +354 -0
  235. package/dist/utils/eip7702.cjs.map +1 -0
  236. package/dist/utils/{eip7702.d.ts → eip7702.d.cts} +5 -5
  237. package/dist/utils/eip7702.d.cts.map +1 -0
  238. package/dist/utils/eip7702.d.mts +137 -0
  239. package/dist/utils/eip7702.d.mts.map +1 -0
  240. package/dist/utils/{eip7702.js → eip7702.mjs} +12 -12
  241. package/dist/utils/eip7702.mjs.map +1 -0
  242. package/dist/utils/external-transactions.cjs +36 -0
  243. package/dist/utils/external-transactions.cjs.map +1 -0
  244. package/dist/utils/{external-transactions.d.ts → external-transactions.d.cts} +2 -2
  245. package/dist/utils/external-transactions.d.cts.map +1 -0
  246. package/dist/utils/external-transactions.d.mts +10 -0
  247. package/dist/utils/external-transactions.d.mts.map +1 -0
  248. package/dist/utils/{external-transactions.js → external-transactions.mjs} +3 -3
  249. package/dist/utils/external-transactions.mjs.map +1 -0
  250. package/dist/utils/feature-flags.cjs +255 -0
  251. package/dist/utils/feature-flags.cjs.map +1 -0
  252. package/dist/utils/{feature-flags.d.ts → feature-flags.d.cts} +3 -3
  253. package/dist/utils/feature-flags.d.cts.map +1 -0
  254. package/dist/utils/feature-flags.d.mts +313 -0
  255. package/dist/utils/feature-flags.d.mts.map +1 -0
  256. package/dist/utils/{feature-flags.js → feature-flags.mjs} +5 -5
  257. package/dist/utils/feature-flags.mjs.map +1 -0
  258. package/dist/utils/first-time-interaction.cjs +69 -0
  259. package/dist/utils/first-time-interaction.cjs.map +1 -0
  260. package/dist/utils/{first-time-interaction.d.ts → first-time-interaction.d.cts} +3 -3
  261. package/dist/utils/first-time-interaction.d.cts.map +1 -0
  262. package/dist/utils/first-time-interaction.d.mts +30 -0
  263. package/dist/utils/first-time-interaction.d.mts.map +1 -0
  264. package/dist/utils/{first-time-interaction.js → first-time-interaction.mjs} +6 -6
  265. package/dist/utils/first-time-interaction.mjs.map +1 -0
  266. package/dist/utils/gas-fee-tokens.cjs +174 -0
  267. package/dist/utils/gas-fee-tokens.cjs.map +1 -0
  268. package/dist/utils/{gas-fee-tokens.d.ts → gas-fee-tokens.d.cts} +5 -5
  269. package/dist/utils/gas-fee-tokens.d.cts.map +1 -0
  270. package/dist/utils/gas-fee-tokens.d.mts +46 -0
  271. package/dist/utils/gas-fee-tokens.d.mts.map +1 -0
  272. package/dist/utils/{gas-fee-tokens.js → gas-fee-tokens.mjs} +9 -9
  273. package/dist/utils/gas-fee-tokens.mjs.map +1 -0
  274. package/dist/utils/gas-fees.cjs +424 -0
  275. package/dist/utils/gas-fees.cjs.map +1 -0
  276. package/dist/utils/{gas-fees.d.ts → gas-fees.d.cts} +5 -5
  277. package/dist/utils/gas-fees.d.cts.map +1 -0
  278. package/dist/utils/gas-fees.d.mts +57 -0
  279. package/dist/utils/gas-fees.d.mts.map +1 -0
  280. package/dist/utils/{gas-fees.js → gas-fees.mjs} +9 -9
  281. package/dist/utils/gas-fees.mjs.map +1 -0
  282. package/dist/utils/gas-flow.cjs +81 -0
  283. package/dist/utils/gas-flow.cjs.map +1 -0
  284. package/dist/utils/{gas-flow.d.ts → gas-flow.d.cts} +6 -6
  285. package/dist/utils/gas-flow.d.cts.map +1 -0
  286. package/dist/utils/gas-flow.d.mts +29 -0
  287. package/dist/utils/gas-flow.d.mts.map +1 -0
  288. package/dist/utils/{gas-flow.js → gas-flow.mjs} +3 -3
  289. package/dist/utils/gas-flow.mjs.map +1 -0
  290. package/dist/utils/gas.cjs +545 -0
  291. package/dist/utils/gas.cjs.map +1 -0
  292. package/dist/utils/{gas.d.ts → gas.d.cts} +6 -5
  293. package/dist/utils/gas.d.cts.map +1 -0
  294. package/dist/utils/gas.d.mts +116 -0
  295. package/dist/utils/gas.d.mts.map +1 -0
  296. package/dist/utils/{gas.js → gas.mjs} +11 -11
  297. package/dist/utils/gas.mjs.map +1 -0
  298. package/dist/utils/layer1-gas-fee-flow.cjs +73 -0
  299. package/dist/utils/layer1-gas-fee-flow.cjs.map +1 -0
  300. package/dist/utils/{layer1-gas-fee-flow.d.ts → layer1-gas-fee-flow.d.cts} +4 -4
  301. package/dist/utils/layer1-gas-fee-flow.d.cts.map +1 -0
  302. package/dist/utils/layer1-gas-fee-flow.d.mts +28 -0
  303. package/dist/utils/layer1-gas-fee-flow.d.mts.map +1 -0
  304. package/dist/utils/{layer1-gas-fee-flow.js → layer1-gas-fee-flow.mjs} +3 -3
  305. package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -0
  306. package/dist/utils/nonce.cjs +93 -0
  307. package/dist/utils/nonce.cjs.map +1 -0
  308. package/dist/utils/{nonce.d.ts → nonce.d.cts} +3 -3
  309. package/dist/utils/nonce.d.cts.map +1 -0
  310. package/dist/utils/nonce.d.mts +26 -0
  311. package/dist/utils/nonce.d.mts.map +1 -0
  312. package/dist/utils/{nonce.js → nonce.mjs} +4 -4
  313. package/dist/utils/nonce.mjs.map +1 -0
  314. package/dist/utils/prepare.cjs +97 -0
  315. package/dist/utils/prepare.cjs.map +1 -0
  316. package/dist/utils/{prepare.d.ts → prepare.d.cts} +5 -5
  317. package/dist/utils/prepare.d.cts.map +1 -0
  318. package/dist/utils/prepare.d.mts +22 -0
  319. package/dist/utils/prepare.d.mts.map +1 -0
  320. package/dist/utils/{prepare.js → prepare.mjs} +6 -5
  321. package/dist/utils/prepare.mjs.map +1 -0
  322. package/dist/utils/provider.cjs +106 -0
  323. package/dist/utils/provider.cjs.map +1 -0
  324. package/dist/utils/{provider.d.ts → provider.d.cts} +4 -4
  325. package/dist/utils/provider.d.cts.map +1 -0
  326. package/dist/utils/provider.d.mts +65 -0
  327. package/dist/utils/provider.d.mts.map +1 -0
  328. package/dist/utils/{provider.js → provider.mjs} +3 -3
  329. package/dist/utils/provider.mjs.map +1 -0
  330. package/dist/utils/recipient.cjs +31 -0
  331. package/dist/utils/recipient.cjs.map +1 -0
  332. package/dist/utils/{recipient.d.ts → recipient.d.cts} +2 -2
  333. package/dist/utils/recipient.d.cts.map +1 -0
  334. package/dist/utils/recipient.d.mts +13 -0
  335. package/dist/utils/recipient.d.mts.map +1 -0
  336. package/dist/utils/{recipient.js → recipient.mjs} +3 -3
  337. package/dist/utils/recipient.mjs.map +1 -0
  338. package/dist/utils/retry.cjs +93 -0
  339. package/dist/utils/retry.cjs.map +1 -0
  340. package/dist/utils/{retry.d.ts → retry.d.cts} +2 -2
  341. package/dist/utils/retry.d.cts.map +1 -0
  342. package/dist/utils/retry.d.mts +11 -0
  343. package/dist/utils/retry.d.mts.map +1 -0
  344. package/dist/utils/{retry.js → retry.mjs} +3 -3
  345. package/dist/utils/retry.mjs.map +1 -0
  346. package/dist/utils/revert-reason.cjs +192 -0
  347. package/dist/utils/revert-reason.cjs.map +1 -0
  348. package/dist/utils/{revert-reason.d.ts → revert-reason.d.cts} +5 -5
  349. package/dist/utils/revert-reason.d.cts.map +1 -0
  350. package/dist/utils/revert-reason.d.mts +57 -0
  351. package/dist/utils/revert-reason.d.mts.map +1 -0
  352. package/dist/utils/{revert-reason.js → revert-reason.mjs} +4 -4
  353. package/dist/utils/revert-reason.mjs.map +1 -0
  354. package/dist/utils/signature.cjs +26 -0
  355. package/dist/utils/signature.cjs.map +1 -0
  356. package/dist/utils/{signature.d.ts → signature.d.cts} +2 -2
  357. package/dist/utils/signature.d.cts.map +1 -0
  358. package/dist/utils/signature.d.mts +11 -0
  359. package/dist/utils/signature.d.mts.map +1 -0
  360. package/dist/utils/{signature.js → signature.mjs} +3 -3
  361. package/dist/utils/signature.mjs.map +1 -0
  362. package/dist/utils/swaps.cjs +332 -0
  363. package/dist/utils/swaps.cjs.map +1 -0
  364. package/dist/utils/{swaps.d.ts → swaps.d.cts} +5 -5
  365. package/dist/utils/swaps.d.cts.map +1 -0
  366. package/dist/utils/swaps.d.mts +90 -0
  367. package/dist/utils/swaps.d.mts.map +1 -0
  368. package/dist/utils/{swaps.js → swaps.mjs} +8 -7
  369. package/dist/utils/swaps.mjs.map +1 -0
  370. package/dist/utils/transaction-type.cjs +159 -0
  371. package/dist/utils/transaction-type.cjs.map +1 -0
  372. package/dist/utils/{transaction-type.d.ts → transaction-type.d.cts} +6 -6
  373. package/dist/utils/transaction-type.d.cts.map +1 -0
  374. package/dist/utils/transaction-type.d.mts +44 -0
  375. package/dist/utils/transaction-type.d.mts.map +1 -0
  376. package/dist/utils/{transaction-type.js → transaction-type.mjs} +6 -6
  377. package/dist/utils/transaction-type.mjs.map +1 -0
  378. package/dist/utils/utils.cjs +287 -0
  379. package/dist/utils/utils.cjs.map +1 -0
  380. package/dist/utils/{utils.d.ts → utils.d.cts} +4 -4
  381. package/dist/utils/utils.d.cts.map +1 -0
  382. package/dist/utils/utils.d.mts +101 -0
  383. package/dist/utils/utils.d.mts.map +1 -0
  384. package/dist/utils/{utils.js → utils.mjs} +12 -5
  385. package/dist/utils/utils.mjs.map +1 -0
  386. package/dist/utils/validation.cjs +389 -0
  387. package/dist/utils/validation.cjs.map +1 -0
  388. package/dist/utils/{validation.d.ts → validation.d.cts} +4 -4
  389. package/dist/utils/validation.d.cts.map +1 -0
  390. package/dist/utils/validation.d.mts +66 -0
  391. package/dist/utils/validation.d.mts.map +1 -0
  392. package/dist/utils/{validation.js → validation.mjs} +8 -8
  393. package/dist/utils/validation.mjs.map +1 -0
  394. package/package.json +19 -15
  395. package/dist/TransactionController-method-action-types.d.ts.map +0 -1
  396. package/dist/TransactionController-method-action-types.js.map +0 -1
  397. package/dist/TransactionController.d.ts.map +0 -1
  398. package/dist/TransactionController.js.map +0 -1
  399. package/dist/api/accounts-api.d.ts.map +0 -1
  400. package/dist/api/accounts-api.js.map +0 -1
  401. package/dist/api/simulation-api.d.ts.map +0 -1
  402. package/dist/api/simulation-api.js.map +0 -1
  403. package/dist/constants.d.ts.map +0 -1
  404. package/dist/constants.js.map +0 -1
  405. package/dist/errors.d.ts.map +0 -1
  406. package/dist/errors.js.map +0 -1
  407. package/dist/gas-flows/DefaultGasFeeFlow.d.ts.map +0 -1
  408. package/dist/gas-flows/LineaGasFeeFlow.d.ts.map +0 -1
  409. package/dist/gas-flows/LineaGasFeeFlow.js.map +0 -1
  410. package/dist/gas-flows/MantleLayer1GasFeeFlow.d.ts.map +0 -1
  411. package/dist/gas-flows/MantleLayer1GasFeeFlow.js.map +0 -1
  412. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.ts.map +0 -1
  413. package/dist/gas-flows/OptimismLayer1GasFeeFlow.js.map +0 -1
  414. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.ts.map +0 -1
  415. package/dist/gas-flows/OracleLayer1GasFeeFlow.js.map +0 -1
  416. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.d.ts.map +0 -1
  417. package/dist/gas-flows/RandomisedEstimationsGasFeeFlow.js.map +0 -1
  418. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.ts.map +0 -1
  419. package/dist/gas-flows/ScrollLayer1GasFeeFlow.js.map +0 -1
  420. package/dist/gas-flows/TestGasFeeFlow.d.ts.map +0 -1
  421. package/dist/gas-flows/TestGasFeeFlow.js.map +0 -1
  422. package/dist/helpers/GasFeePoller.d.ts.map +0 -1
  423. package/dist/helpers/GasFeePoller.js.map +0 -1
  424. package/dist/helpers/MethodDataHelper.d.ts.map +0 -1
  425. package/dist/helpers/MethodDataHelper.js.map +0 -1
  426. package/dist/helpers/MultichainTrackingHelper.d.ts.map +0 -1
  427. package/dist/helpers/MultichainTrackingHelper.js.map +0 -1
  428. package/dist/helpers/PendingTransactionTracker.d.ts.map +0 -1
  429. package/dist/helpers/PendingTransactionTracker.js.map +0 -1
  430. package/dist/helpers/ResimulateHelper.d.ts.map +0 -1
  431. package/dist/helpers/ResimulateHelper.js.map +0 -1
  432. package/dist/helpers/TransactionPoller.d.ts.map +0 -1
  433. package/dist/helpers/TransactionPoller.js.map +0 -1
  434. package/dist/hooks/CollectPublishHook.d.ts.map +0 -1
  435. package/dist/hooks/CollectPublishHook.js.map +0 -1
  436. package/dist/hooks/ExtraTransactionsPublishHook.d.ts.map +0 -1
  437. package/dist/hooks/ExtraTransactionsPublishHook.js.map +0 -1
  438. package/dist/hooks/SequentialPublishBatchHook.d.ts.map +0 -1
  439. package/dist/hooks/SequentialPublishBatchHook.js.map +0 -1
  440. package/dist/index.d.ts.map +0 -1
  441. package/dist/index.js +0 -12
  442. package/dist/index.js.map +0 -1
  443. package/dist/logger.d.ts.map +0 -1
  444. package/dist/logger.js.map +0 -1
  445. package/dist/types.d.ts.map +0 -1
  446. package/dist/types.js.map +0 -1
  447. package/dist/utils/balance-changes.d.ts.map +0 -1
  448. package/dist/utils/balance-changes.js.map +0 -1
  449. package/dist/utils/balance.d.ts.map +0 -1
  450. package/dist/utils/balance.js.map +0 -1
  451. package/dist/utils/batch.d.ts.map +0 -1
  452. package/dist/utils/batch.js.map +0 -1
  453. package/dist/utils/eip7702.d.ts.map +0 -1
  454. package/dist/utils/eip7702.js.map +0 -1
  455. package/dist/utils/external-transactions.d.ts.map +0 -1
  456. package/dist/utils/external-transactions.js.map +0 -1
  457. package/dist/utils/feature-flags.d.ts.map +0 -1
  458. package/dist/utils/feature-flags.js.map +0 -1
  459. package/dist/utils/first-time-interaction.d.ts.map +0 -1
  460. package/dist/utils/first-time-interaction.js.map +0 -1
  461. package/dist/utils/gas-fee-tokens.d.ts.map +0 -1
  462. package/dist/utils/gas-fee-tokens.js.map +0 -1
  463. package/dist/utils/gas-fees.d.ts.map +0 -1
  464. package/dist/utils/gas-fees.js.map +0 -1
  465. package/dist/utils/gas-flow.d.ts.map +0 -1
  466. package/dist/utils/gas-flow.js.map +0 -1
  467. package/dist/utils/gas.d.ts.map +0 -1
  468. package/dist/utils/gas.js.map +0 -1
  469. package/dist/utils/layer1-gas-fee-flow.d.ts.map +0 -1
  470. package/dist/utils/layer1-gas-fee-flow.js.map +0 -1
  471. package/dist/utils/nonce.d.ts.map +0 -1
  472. package/dist/utils/nonce.js.map +0 -1
  473. package/dist/utils/prepare.d.ts.map +0 -1
  474. package/dist/utils/prepare.js.map +0 -1
  475. package/dist/utils/provider.d.ts.map +0 -1
  476. package/dist/utils/provider.js.map +0 -1
  477. package/dist/utils/recipient.d.ts.map +0 -1
  478. package/dist/utils/recipient.js.map +0 -1
  479. package/dist/utils/retry.d.ts.map +0 -1
  480. package/dist/utils/retry.js.map +0 -1
  481. package/dist/utils/revert-reason.d.ts.map +0 -1
  482. package/dist/utils/revert-reason.js.map +0 -1
  483. package/dist/utils/signature.d.ts.map +0 -1
  484. package/dist/utils/signature.js.map +0 -1
  485. package/dist/utils/swaps.d.ts.map +0 -1
  486. package/dist/utils/swaps.js.map +0 -1
  487. package/dist/utils/transaction-type.d.ts.map +0 -1
  488. package/dist/utils/transaction-type.js.map +0 -1
  489. package/dist/utils/utils.d.ts.map +0 -1
  490. package/dist/utils/utils.js.map +0 -1
  491. package/dist/utils/validation.d.ts.map +0 -1
  492. package/dist/utils/validation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n ApprovalType,\n ORIGIN_METAMASK,\n toHex,\n} from '@metamask/controller-utils';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { parse, v4 } from 'uuid';\n\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow.js';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller.js';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker.js';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook.js';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook.js';\nimport { GasFeeEstimateLevel, TransactionStatus } from '../index.js';\nimport type {\n BatchTransactionParams,\n GetSimulationConfig,\n PublishBatchHookRequest,\n TransactionController,\n TransactionControllerMessenger,\n TransactionControllerState,\n TransactionMeta,\n} from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport { TransactionEnvelopeType, TransactionType } from '../types.js';\nimport type {\n AuthorizationList,\n NestedTransactionMetadata,\n SecurityAlertResponse,\n TransactionBatchSingleRequest,\n PublishBatchHook,\n PublishBatchHookTransaction,\n PublishHook,\n TransactionBatchRequest,\n ValidateSecurityRequest,\n IsAtomicBatchSupportedResult,\n IsAtomicBatchSupportedResultEntry,\n TransactionBatchMeta,\n} from '../types.js';\nimport type { TransactionBatchResult, TransactionParams } from '../types.js';\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesAccountSupportEIP7702,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702.js';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags.js';\nimport { simulateGasBatch } from './gas.js';\nimport { getChainId } from './provider.js';\nimport { determineTransactionType } from './transaction-type.js';\nimport { validateBatchRequest } from './validation.js';\n\ntype UpdateStateCallback = (\n callback: (\n state: WritableDraft<TransactionControllerState>,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getGasFeeEstimates: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n getInternalAccounts: () => Hex[];\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n getSimulationConfig: GetSimulationConfig;\n getTransaction: (id: string) => TransactionMeta;\n isSimulationEnabled: (transactionMeta?: TransactionMeta) => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (transactionMeta: TransactionMeta) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\n requestId?: string;\n signTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<string | undefined>;\n update: UpdateStateCallback;\n updateTransaction: (\n options: { transactionId: string },\n callback: (transactionMeta: TransactionMeta) => void,\n ) => void;\n};\n\ntype IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n};\n\nconst log = createModuleLogger(projectLogger, 'batch');\n\nexport const ERROR_MESSAGE_NO_UPGRADE_CONTRACT =\n 'Upgrade contract address not found';\n\n/**\n * Add a batch transaction.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nexport async function addTransactionBatch(\n request: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n getInternalAccounts,\n messenger,\n request: transactionBatchRequest,\n } = request;\n\n const { disableHook, disable7702, disableSequential } =\n transactionBatchRequest;\n\n const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n isInternal: transactionBatchRequest.isInternal,\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n const accountCanUse7702 = doesAccountSupportEIP7702(\n messenger,\n transactionBatchRequest.from,\n );\n\n if (disableHook && disableSequential && !disable7702 && !accountCanUse7702) {\n throw rpcErrors.internal('Account does not support EIP-7702');\n }\n\n if (!disable7702 && accountCanUse7702) {\n try {\n return await addTransactionBatchWith7702(request);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError || (disableHook && disableSequential)) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(request);\n}\n\n/**\n * Determine which chains support atomic batch transactions for the given account.\n *\n * @param request - The request object including the account address and necessary callbacks.\n * @returns The chain IDs that support atomic batch transactions.\n */\nexport async function isAtomicBatchSupported(\n request: IsAtomicBatchSupportedRequestInternal,\n): Promise<IsAtomicBatchSupportedResult> {\n const { address, chainIds, messenger, publicKeyEIP7702: publicKey } = request;\n\n if (!publicKey) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n const chainIds7702 = getEIP7702SupportedChains(messenger);\n\n const filteredChainIds = chainIds7702.filter(\n (chainId) => !chainIds || chainIds.includes(chainId),\n );\n\n const resultsRaw: (IsAtomicBatchSupportedResultEntry | undefined)[] =\n await Promise.all(\n filteredChainIds.map(async (chainId) => {\n try {\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n networkClientId,\n );\n\n const upgradeContractAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKey,\n );\n\n return {\n chainId,\n delegationAddress,\n isSupported,\n upgradeContractAddress,\n };\n } catch (error) {\n log('Error checking atomic batch support', chainId, error);\n return undefined;\n }\n }),\n );\n\n const results = resultsRaw.filter(\n (result): result is IsAtomicBatchSupportedResultEntry => Boolean(result),\n );\n\n log('Atomic batch supported results', results);\n\n return results;\n}\n\n/**\n * Generate a transaction batch ID.\n *\n * @returns A unique batch ID as a hexadecimal string.\n */\nexport function generateBatchId(): Hex {\n const idString = v4();\n const idBytes = new Uint8Array(parse(idString));\n return bytesToHex(idBytes);\n}\n\n/**\n * Generate the metadata for a nested transaction.\n *\n * @param request - The batch request.\n * @param singleRequest - The request for a single transaction.\n * @param messenger - The transaction controller messenger.\n * @param networkClientId - The network client ID.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n if (requestedType) {\n return {\n ...params,\n type: requestedType,\n };\n }\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n { messenger, networkClientId },\n );\n\n return {\n ...params,\n type: determinedType,\n };\n}\n\n/**\n * Build the authorization list for an EIP-7702 batch transaction.\n *\n * When the batch payer (`from`) requires an upgrade, an unsigned upgrade\n * authorization for that account is included first. Any caller-provided\n * authorizations (e.g. a pre-signed Money Account upgrade) are appended so\n * both can be submitted on the same type-4 transaction.\n *\n * @param options - Options bag.\n * @param options.chainId - Chain ID of the batch.\n * @param options.messenger - Controller messenger.\n * @param options.providedAuthorizationList - Optional authorizations from the batch request.\n * @param options.publicKeyEIP7702 - Public key used to resolve the upgrade contract.\n * @param options.requiresUpgrade - Whether the batch payer requires an EIP-7702 upgrade.\n * @returns The combined authorization list, or undefined when none are needed.\n */\nfunction buildBatchAuthorizationList({\n chainId,\n messenger,\n providedAuthorizationList,\n publicKeyEIP7702,\n requiresUpgrade,\n}: {\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n providedAuthorizationList?: AuthorizationList;\n publicKeyEIP7702: Hex;\n requiresUpgrade: boolean;\n}): AuthorizationList | undefined {\n const authorizationList: AuthorizationList = [];\n\n if (requiresUpgrade) {\n const upgradeContractAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKeyEIP7702,\n );\n\n if (!upgradeContractAddress) {\n throw rpcErrors.internal(ERROR_MESSAGE_NO_UPGRADE_CONTRACT);\n }\n\n authorizationList.push({ address: upgradeContractAddress });\n }\n\n if (providedAuthorizationList?.length) {\n authorizationList.push(...providedAuthorizationList);\n }\n\n return authorizationList.length ? authorizationList : undefined;\n}\n\n/**\n * Process a batch transaction using an EIP-7702 transaction.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nasync function addTransactionBatchWith7702(\n request: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n addTransaction,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n atomic,\n authorizationList: providedAuthorizationList,\n batchId: batchIdOverride,\n disableUpgrade,\n from,\n gasFeeToken,\n gasLimit7702,\n isInternal,\n networkClientId,\n origin,\n overwriteUpgrade,\n requestId,\n requiredAssets,\n requireApproval,\n securityAlertId,\n skipInitialGasEstimate,\n transactions,\n excludeNativeTokenForFee,\n isGasFeeIncluded,\n isGasFeeSponsored,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId({ messenger, networkClientId });\n const isChainSupported = doesChainSupportEIP7702(chainId, messenger);\n\n if (!isChainSupported) {\n log('Chain does not support EIP-7702', chainId);\n throw rpcErrors.internal('Chain does not support EIP-7702');\n }\n\n if (!publicKeyEIP7702) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n let requiresUpgrade = false;\n\n if (!disableUpgrade) {\n const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n networkClientId,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress && !overwriteUpgrade) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n requiresUpgrade = !isSupported;\n\n if (requiresUpgrade && delegationAddress) {\n log('Overwriting authorization as already upgraded', {\n current: delegationAddress,\n });\n }\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, messenger, networkClientId),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(\n from,\n nestedTransactions,\n {\n atomic,\n },\n );\n\n const txParams: TransactionParams = {\n ...batchParams,\n from,\n gas: gasLimit7702,\n maxFeePerGas: nestedTransactions[0]?.maxFeePerGas,\n maxPriorityFeePerGas: nestedTransactions[0]?.maxPriorityFeePerGas,\n };\n\n const authorizationList = buildBatchAuthorizationList({\n chainId,\n messenger,\n providedAuthorizationList,\n publicKeyEIP7702,\n requiresUpgrade,\n });\n\n if (authorizationList?.length) {\n txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = authorizationList;\n }\n\n if (validateSecurity) {\n // `delegationMock` applies to the batch payer (`from`) only. When\n // `requiresUpgrade` is true, that upgrade authorization is always first in\n // the list. Caller-provided auths for other accounts must not be used here.\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: requiresUpgrade\n ? authorizationList?.[0]?.address\n : undefined,\n origin,\n };\n\n log('Security request', securityRequest);\n\n validateSecurity(securityRequest, chainId).catch((error) => {\n log('Security validation failed', error);\n });\n }\n\n log('Adding batch transaction', txParams, networkClientId);\n\n const batchId = batchIdOverride ?? generateBatchId();\n\n const securityAlertResponse = securityAlertId\n ? ({ securityAlertId } as SecurityAlertResponse)\n : undefined;\n\n const existingTransaction = transactions.find(\n (tx) => tx.existingTransaction,\n )?.existingTransaction;\n\n if (existingTransaction) {\n await convertTransactionToEIP7702({\n batchId,\n existingTransaction,\n nestedTransactions,\n request,\n txParams,\n });\n\n return { batchId };\n }\n\n const { result } = await addTransaction(txParams, {\n batchId,\n gasFeeToken,\n excludeNativeTokenForFee,\n isGasFeeIncluded,\n isGasFeeSponsored,\n isInternal,\n nestedTransactions,\n networkClientId,\n origin,\n requestId,\n requireApproval,\n requiredAssets,\n securityAlertResponse,\n skipInitialGasEstimate,\n type: TransactionType.batch,\n });\n\n const transactionHash = await result;\n\n log('Batch transaction added', { batchId, transactionHash });\n\n return {\n batchId,\n };\n}\n\n/**\n * Wait for a transaction to reach one of the specified statuses.\n * Checks the current state first to avoid race conditions, then subscribes to\n * state changes for ongoing updates.\n *\n * @param transactionId - The ID of the transaction to monitor.\n * @param targetStatuses - The statuses that indicate success.\n * @param request - The batch request containing messenger and getTransaction.\n */\nfunction waitForTransactionStatus(\n transactionId: string,\n targetStatuses: TransactionStatus[],\n request: Pick<AddTransactionBatchRequest, 'getTransaction' | 'messenger'>,\n): Promise<void> {\n const { getTransaction, messenger } = request;\n const failureStatuses = [\n TransactionStatus.failed,\n TransactionStatus.rejected,\n ];\n\n return new Promise<void>((resolve, reject) => {\n const checkStatus = (\n tx?: TransactionMeta,\n unsubscribe?: () => void,\n ): boolean => {\n if (targetStatuses.includes(tx?.status as TransactionStatus)) {\n unsubscribe?.();\n resolve();\n return true;\n }\n\n if (failureStatuses.includes(tx?.status as TransactionStatus)) {\n unsubscribe?.();\n reject(\n new Error(\n tx?.error?.message ?? `Transaction ${transactionId} ${tx?.status}`,\n ),\n );\n return true;\n }\n\n return false;\n };\n\n const initialTx = getTransaction(transactionId);\n\n if (checkStatus(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta): void => {\n const unsubscribe = (): void =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n checkStatus(tx, unsubscribe);\n };\n\n messenger.subscribe(\n 'TransactionController:stateChange', // eslint-disable-line no-restricted-syntax\n handler,\n (state: TransactionControllerState) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Process a batch transaction using a publish batch hook.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nasync function addTransactionBatchWithHook(\n request: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\n batchId: batchIdOverride,\n from,\n networkClientId,\n origin,\n requireApproval,\n transactions: requestedTransactions,\n } = userRequest;\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\n let isSequentialBatchHook = false;\n\n log('Adding transaction batch using hook', userRequest);\n\n const sequentialPublishBatchHook = new SequentialPublishBatchHook({\n publishTransaction: request.publishTransaction,\n getTransaction: request.getTransaction,\n getPendingTransactionTracker: request.getPendingTransactionTracker,\n });\n\n let { disable7702, disableSequential } = userRequest;\n const { disableHook, useHook } = userRequest;\n\n // use hook is a temporary alias for disable7702 and disableSequential\n if (useHook) {\n disable7702 = true;\n disableSequential = true;\n }\n\n let publishBatchHook = null;\n\n if (!disableHook && requestPublishBatchHook) {\n publishBatchHook = requestPublishBatchHook;\n } else if (!disableSequential) {\n publishBatchHook = sequentialPublishBatchHook.getHook();\n isSequentialBatchHook = true;\n }\n\n if (!publishBatchHook) {\n log(`No supported batch methods found`, {\n disable7702,\n disableHook,\n disableSequential,\n });\n throw rpcErrors.internal(`Can't process batch`);\n }\n\n let txBatchMeta: TransactionBatchMeta | undefined;\n const batchId = batchIdOverride ?? generateBatchId();\n\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\n const collectHook = new CollectPublishHook(transactionCount);\n\n try {\n if (requireApproval) {\n txBatchMeta = await prepareApprovalData({\n batchId,\n request,\n });\n\n resultCallbacks = (await requestApproval(txBatchMeta, messenger))\n .resultCallbacks;\n }\n\n const publishHook = collectHook.getHook();\n const hookTransactions: Omit<PublishBatchHookTransaction, 'signedTx'>[] =\n [];\n\n let index = 0;\n\n for (const nestedTransaction of nestedTransactions) {\n const hookTransaction = await processTransactionWithHook(\n batchId,\n nestedTransaction,\n publishHook,\n request,\n txBatchMeta,\n index,\n );\n\n hookTransactions.push(hookTransaction);\n index += 1;\n\n await waitForTransactionStatus(\n String(hookTransaction.id),\n [\n TransactionStatus.signed,\n TransactionStatus.submitted,\n TransactionStatus.confirmed,\n ],\n request,\n );\n }\n\n const { signedTransactions } = await collectHook.ready();\n\n const transactions = hookTransactions.map((transaction, i) => ({\n ...transaction,\n signedTx: signedTransactions[i],\n }));\n\n const hookParams: PublishBatchHookRequest = {\n from,\n networkClientId,\n transactions,\n };\n\n log('Calling publish batch hook', hookParams);\n\n let result = await publishBatchHook(hookParams);\n\n log('Publish batch hook result', result);\n\n if (!result && !isSequentialBatchHook && !disableSequential) {\n log('Fallback to sequential publish batch hook due to empty results');\n const sequentialBatchHook = sequentialPublishBatchHook.getHook();\n result = await sequentialBatchHook(hookParams);\n }\n\n if (!result?.results?.length) {\n throw new Error('Publish batch hook did not return a result');\n }\n\n const transactionHashes = result.results.map(\n ({ transactionHash }) => transactionHash,\n );\n\n collectHook.success(transactionHashes);\n resultCallbacks?.success();\n\n log('Completed batch transaction with hook', transactionHashes);\n\n return {\n batchId,\n };\n } catch (error) {\n log('Publish batch hook failed', error);\n\n collectHook.error(error);\n resultCallbacks?.error(error as Error);\n\n throw error;\n } finally {\n log('Cleaning up publish batch hook', batchId);\n wipeTransactionBatchById(update, batchId);\n }\n}\n\n/**\n * Process a single transaction with a publish batch hook.\n *\n * @param batchId - ID of the transaction batch.\n * @param nestedTransaction - The nested transaction request.\n * @param publishHook - The publish hook to use for each transaction.\n * @param request - The request object including the user request and necessary callbacks.\n * @param txBatchMeta - Metadata for the transaction batch.\n * @param index - The index of the transaction in the batch.\n * @returns The single transaction request to be processed by the publish batch hook.\n */\nasync function processTransactionWithHook(\n batchId: Hex,\n nestedTransaction: TransactionBatchSingleRequest,\n publishHook: PublishHook,\n request: AddTransactionBatchRequest,\n txBatchMeta: TransactionBatchMeta | undefined,\n index: number,\n): Promise<\n Omit<PublishBatchHookTransaction, 'signedTx'> & { type?: TransactionType }\n> {\n const { assetsFiatValues, existingTransaction, params, type } =\n nestedTransaction;\n\n const {\n addTransaction,\n getTransaction,\n request: userRequest,\n updateTransaction,\n } = request;\n\n const { from, isInternal, networkClientId, origin } = userRequest;\n\n if (existingTransaction) {\n const { id, onPublish } = existingTransaction;\n let transactionMeta = getTransaction(id);\n const currentNonceHex = transactionMeta.txParams.nonce;\n let { signedTransaction } = existingTransaction;\n\n const currentNonceNum = currentNonceHex\n ? parseInt(currentNonceHex, 16)\n : undefined;\n\n const newNonce =\n index > 0 && currentNonceNum !== undefined\n ? currentNonceNum + index\n : undefined;\n\n updateTransaction({ transactionId: id }, (_transactionMeta) => {\n _transactionMeta.batchId = batchId;\n\n if (newNonce) {\n _transactionMeta.txParams.nonce = toHex(newNonce);\n }\n });\n\n if (newNonce) {\n const signResult = await updateTransactionSignature({\n transactionId: id,\n request,\n });\n\n signedTransaction = signResult.newSignature;\n transactionMeta = signResult.transactionMeta;\n }\n\n publishHook(transactionMeta, signedTransaction)\n .then((hookResult) => {\n onPublish?.(hookResult);\n return undefined;\n })\n .catch(() => {\n // Intentionally empty\n });\n\n log('Processed existing transaction with hook', {\n id,\n params,\n });\n\n return {\n id,\n params,\n };\n }\n\n const transactionMetaForGasEstimates = {\n ...txBatchMeta,\n txParams: { ...params, from, gas: txBatchMeta?.gas ?? params.gas },\n };\n\n if (txBatchMeta) {\n updateTransactionGasEstimates({\n txMeta: transactionMetaForGasEstimates as TransactionMeta,\n userFeeLevel: GasFeeEstimateLevel.Medium,\n });\n }\n\n const { transactionMeta } = await addTransaction(\n transactionMetaForGasEstimates.txParams,\n {\n assetsFiatValues,\n batchId,\n disableGasBuffer: true,\n isInternal,\n networkClientId,\n origin,\n publishHook,\n requireApproval: false,\n type,\n },\n );\n\n const { id, txParams } = transactionMeta;\n const data = txParams.data as Hex | undefined;\n const gas = txParams.gas as Hex | undefined;\n const maxFeePerGas = txParams.maxFeePerGas as Hex | undefined;\n const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas as Hex | undefined;\n const to = txParams.to as Hex | undefined;\n const value = txParams.value as Hex | undefined;\n\n const newParams: BatchTransactionParams = {\n data,\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n log('Processed new transaction with hook', {\n id,\n params: newParams,\n type,\n });\n\n return {\n id,\n params: newParams,\n type,\n };\n}\n\n/**\n * Requests approval for a transaction batch by interacting with the ApprovalController.\n *\n * @param txBatchMeta - Metadata for the transaction batch, including its ID and origin.\n * @param messenger - The messenger instance used to communicate with the ApprovalController.\n * @returns A promise that resolves to the result of adding the approval request.\n */\nasync function requestApproval(\n txBatchMeta: TransactionBatchMeta,\n messenger: TransactionControllerMessenger,\n): Promise<AddResult> {\n const id = String(txBatchMeta.id);\n const { origin } = txBatchMeta;\n const type = ApprovalType.TransactionBatch;\n const requestData = { txBatchId: id };\n\n log('Requesting approval for transaction batch', id);\n return (await messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin ?? ORIGIN_METAMASK,\n requestData,\n expectsResult: true,\n type,\n },\n true,\n )) as Promise<AddResult>;\n}\n\n/**\n * Adds batch metadata to the transaction controller state.\n *\n * @param transactionBatchMeta - The transaction batch metadata to be added.\n * @param update - The update function to modify the transaction controller state.\n */\nfunction addBatchMetadata(\n transactionBatchMeta: TransactionBatchMeta,\n update: UpdateStateCallback,\n): void {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\n });\n}\n\n/**\n * Wipes a specific transaction batch from the transaction controller state by its ID.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch to be wiped.\n */\nfunction wipeTransactionBatchById(\n update: UpdateStateCallback,\n id: string,\n): void {\n update((state) => {\n state.transactionBatches = state.transactionBatches.filter(\n (batch) => batch.id !== id,\n );\n });\n}\n\n/**\n * Create a new batch metadata object.\n *\n * @param transactionBatchMeta - The transaction batch metadata object to be created.\n * @returns A new TransactionBatchMeta object.\n */\nfunction newBatchMetadata(\n transactionBatchMeta: Omit<TransactionBatchMeta, 'status'>,\n): TransactionBatchMeta {\n return {\n ...transactionBatchMeta,\n status: TransactionStatus.unapproved,\n };\n}\n\n/**\n * Prepares the approval data for a transaction batch.\n *\n * @param options - The options object containing necessary parameters.\n * @param options.batchId - The batch ID for the transaction batch.\n * @param options.request - The request object including the user request and necessary callbacks.\n * @returns The prepared transaction batch metadata.\n */\nasync function prepareApprovalData({\n batchId,\n request,\n}: {\n batchId: Hex;\n request: AddTransactionBatchRequest;\n}): Promise<TransactionBatchMeta> {\n const {\n messenger,\n request: userRequest,\n isSimulationEnabled,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n isInternal,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n if (!isSimulationEnabled()) {\n throw new Error(\n 'Cannot create transaction batch as simulation not supported',\n );\n }\n log('Preparing approval data for batch');\n const chainId = getChainId({ messenger, networkClientId });\n\n const { totalGasLimit: gasLimit } = await simulateGasBatch({\n chainId,\n from,\n getSimulationConfig,\n transactions: nestedTransactions,\n });\n\n const txBatchMeta: TransactionBatchMeta = newBatchMetadata({\n chainId,\n from,\n gas: gasLimit,\n id: batchId,\n isInternal,\n networkClientId,\n origin,\n transactions: nestedTransactions,\n });\n\n const defaultGasFeeFlow = new DefaultGasFeeFlow();\n const gasFeeControllerData = await getGasFeeEstimates({\n networkClientId,\n });\n\n const gasFeeResponse = await defaultGasFeeFlow.getGasFees({\n gasFeeControllerData,\n messenger,\n transactionMeta: {\n ...txBatchMeta,\n txParams: {\n from,\n gas: gasLimit,\n },\n time: Date.now(),\n },\n });\n\n txBatchMeta.gasFeeEstimates = gasFeeResponse.estimates;\n\n log('Saving transaction batch metadata', txBatchMeta);\n addBatchMetadata(txBatchMeta, update);\n\n return txBatchMeta;\n}\n\n/**\n * Convert an existing transaction to an EIP-7702 batch transaction.\n *\n * @param options - Options object.\n * @param options.batchId - Batch ID for the transaction batch.\n * @param options.existingTransaction - Existing transaction to be converted.\n * @param options.nestedTransactions - Nested transactions to be included in the batch.\n * @param options.request - Request object including the user request and necessary callbacks.\n * @param options.txParams - Transaction parameters for the new EIP-7702 transaction.\n * @param options.existingTransaction.id - ID of the existing transaction.\n * @param options.existingTransaction.onPublish - Callback for when the transaction is published.\n * @returns Promise that resolves after the publish callback has been invoked.\n */\nasync function convertTransactionToEIP7702({\n batchId,\n existingTransaction,\n nestedTransactions,\n request,\n txParams,\n}: {\n batchId: Hex;\n request: AddTransactionBatchRequest;\n existingTransaction: {\n id: string;\n onPublish?: ({\n transactionHash,\n newSignature,\n }: {\n transactionHash: string | undefined;\n newSignature: Hex;\n }) => void;\n };\n nestedTransactions: NestedTransactionMetadata[];\n txParams: TransactionParams;\n}): Promise<void> {\n const { getTransaction, estimateGas, updateTransaction } = request;\n const existingTransactionMeta = getTransaction(existingTransaction.id);\n\n if (!existingTransactionMeta) {\n throw new Error('Existing transaction not found');\n }\n\n log('Converting existing transaction to 7702', { batchId, txParams });\n\n const { networkClientId } = existingTransactionMeta;\n const newGasResult = await estimateGas(txParams, networkClientId);\n\n log('Estimated gas for converted EIP-7702 transaction', newGasResult);\n\n updateTransaction(\n { transactionId: existingTransactionMeta.id },\n (transactionMeta) => {\n transactionMeta.batchId = batchId;\n transactionMeta.nestedTransactions = nestedTransactions;\n transactionMeta.txParams = txParams;\n transactionMeta.txParams.gas = newGasResult.gas;\n transactionMeta.txParams.gasLimit = newGasResult.gas;\n transactionMeta.txParams.maxFeePerGas =\n existingTransactionMeta.txParams.maxFeePerGas;\n transactionMeta.txParams.maxPriorityFeePerGas =\n existingTransactionMeta.txParams.maxPriorityFeePerGas;\n transactionMeta.txParams.nonce = existingTransactionMeta.txParams.nonce;\n transactionMeta.txParams.type ??= TransactionEnvelopeType.feeMarket;\n },\n );\n\n const { newSignature } = await updateTransactionSignature({\n request,\n transactionId: existingTransactionMeta.id,\n });\n\n existingTransaction.onPublish?.({\n transactionHash: undefined,\n newSignature,\n });\n\n log('Transaction updated to EIP-7702', { batchId, txParams, newSignature });\n}\n\n/**\n * Update the signature of an existing transaction.\n *\n * @param options - Options object.\n * @param options.request - The request object including the user request and necessary callbacks.\n * @param options.transactionId - The ID of the transaction to update.\n * @returns An object containing the new signature and updated transaction metadata.\n */\nasync function updateTransactionSignature({\n request,\n transactionId,\n}: {\n request: AddTransactionBatchRequest;\n transactionId: string;\n}): Promise<{\n newSignature: Hex;\n transactionMeta: TransactionMeta;\n}> {\n const { getTransaction, signTransaction } = request;\n const metadataToSign = getTransaction(transactionId);\n\n log('Re-signing existing transaction', {\n transactionId,\n txParams: metadataToSign.txParams,\n });\n\n const newSignature = (await signTransaction(metadataToSign)) as\n | Hex\n | undefined;\n\n if (!newSignature) {\n throw new Error('Failed to re-sign transaction');\n }\n\n const transactionMeta = getTransaction(transactionId);\n\n log('New signature', newSignature);\n\n return { newSignature, transactionMeta };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"eip7702.d.ts","sourceRoot":"","sources":["../../src/utils/eip7702.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"eip7702.js","sourceRoot":"","sources":["../../src/utils/eip7702.ts"],"names":[],"mappings":"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","sourcesContent":["import { RLP } from '@ethereumjs/rlp';\nimport {\n bigIntToUnpaddedBytes,\n bytesToHex,\n ecrecover,\n hexToBytes,\n pubToAddress,\n} from '@ethereumjs/util';\nimport { defaultAbiCoder } from '@ethersproject/abi';\nimport { Contract } from '@ethersproject/contracts';\nimport { toHex } from '@metamask/controller-utils';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { createModuleLogger, add0x } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { keccak256 } from 'ethereum-cryptography/keccak';\n\nimport { ABI_IERC7821 } from '../constants.js';\nimport { projectLogger } from '../logger.js';\nimport type { TransactionControllerMessenger } from '../TransactionController.js';\nimport type {\n BatchTransactionParams,\n NestedTransactionUpdate,\n Authorization,\n AuthorizationList,\n TransactionMeta,\n} from '../types.js';\nimport {\n getEIP7702ContractAddresses,\n getEIP7702SupportedChains,\n} from './feature-flags.js';\nimport { rpcRequest } from './provider.js';\n\nexport const DELEGATION_PREFIX = '0xef0100';\nexport const BATCH_FUNCTION_NAME = 'execute';\nexport const CALLS_SIGNATURE = '(address,uint256,bytes)[]';\nexport const ERROR_MESSGE_PUBLIC_KEY = 'EIP-7702 public key not specified';\n\n/** EIP-7702 authorization signature magic prefix. */\nconst EIP7702_AUTHORIZATION_MAGIC = 0x05;\n\n/**\n * ERC-7579 ModeCode encoding for the ERC-7821 `execute` function.\n *\n * Layout: | CallType (1 byte) | ExecType (1 byte) | Unused (4 bytes) | ModeSelector (4 bytes) | ModePayload (22 bytes) |\n *\n * - CallType 0x01 = batch\n * - ExecType 0x00 = default (revert on failure)\n * - ExecType 0x01 = try (skip on failure)\n */\nconst ERC7579_CALL_TYPE_BATCH = '01';\nconst ERC7579_EXEC_TYPE_DEFAULT = '00';\nconst ERC7579_EXEC_TYPE_TRY = '01';\n\nconst log = createModuleLogger(projectLogger, 'eip-7702');\n\nconst KEYRING_TYPES_SUPPORTING_7702 = [\n 'HD Key Tree',\n 'Simple Key Pair',\n 'Money Keyring',\n];\n\n/**\n * Check whether a given account's keyring supports EIP-7702 authorization\n * signing.\n *\n * Looks up the account's keyring via `KeyringController:getState` and returns\n * `true` only when the keyring type is in the supported list.\n * Returns `false` when the keyring cannot be resolved.\n *\n * @param messenger - Controller messenger.\n * @param account - The account address to check.\n * @returns Whether the account supports EIP-7702.\n */\nexport function doesAccountSupportEIP7702(\n messenger: TransactionControllerMessenger,\n account: string,\n): boolean {\n const { keyrings } = messenger.call('KeyringController:getState');\n\n return keyrings.some(\n (k: { type: string; accounts: string[] }) =>\n KEYRING_TYPES_SUPPORTING_7702.includes(k.type) &&\n k.accounts.some((a: string) => a.toLowerCase() === account.toLowerCase()),\n );\n}\n\n/**\n * Determine if a chain supports EIP-7702 using LaunchDarkly feature flag.\n *\n * @param chainId - Hexadecimal ID of the chain.\n * @param messenger - Messenger instance.\n * @returns True if the chain supports EIP-7702.\n */\nexport function doesChainSupportEIP7702(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): boolean {\n const supportedChains = getEIP7702SupportedChains(messenger);\n\n return supportedChains.some(\n (supportedChainId) =>\n supportedChainId.toLowerCase() === chainId.toLowerCase(),\n );\n}\n\n/**\n * Retrieve the delegation address for an account.\n *\n * @param address - The address to check.\n * @param messenger - The TransactionController messenger.\n * @param networkClientId - The network client ID to use.\n * @returns The delegation address if it exists.\n */\nexport async function getDelegationAddress(\n address: Hex,\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n): Promise<Hex | undefined> {\n const code = (await rpcRequest({\n messenger,\n networkClientId,\n method: 'eth_getCode',\n params: [address, 'latest'],\n })) as string;\n const normalizedCode = add0x(code?.toLowerCase?.() ?? '');\n\n const hasDelegation =\n code?.length === 48 && normalizedCode.startsWith(DELEGATION_PREFIX);\n\n return hasDelegation\n ? add0x(normalizedCode.slice(DELEGATION_PREFIX.length))\n : undefined;\n}\n\n/**\n * Determine if an account has been upgraded to a supported EIP-7702 contract.\n *\n * @param address - The EOA address to check.\n * @param chainId - The chain ID.\n * @param publicKey - Public key used to validate EIP-7702 contract signatures in feature flags.\n * @param messenger - The messenger instance.\n * @param networkClientId - The network client ID to use.\n * @returns An object with the results of the check.\n */\nexport async function isAccountUpgradedToEIP7702(\n address: Hex,\n chainId: Hex,\n publicKey: Hex,\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n): Promise<{\n delegationAddress: Hex | undefined;\n isSupported: boolean;\n}> {\n const contractAddresses = getEIP7702ContractAddresses(\n chainId,\n messenger,\n publicKey,\n );\n\n const delegationAddress = await getDelegationAddress(\n address,\n messenger,\n networkClientId,\n );\n\n const isSupported = Boolean(\n delegationAddress &&\n contractAddresses.some(\n (contract) => contract.toLowerCase() === delegationAddress.toLowerCase(),\n ),\n );\n\n return {\n delegationAddress,\n isSupported,\n };\n}\n\n/**\n * Update indexed transactions in an EIP-7702 batch and regenerate its calldata.\n *\n * @param options - Update options.\n * @param options.from - The sender address.\n * @param options.transactions - The existing nested transactions.\n * @param options.updates - Indexed calldata updates.\n * @returns Updated nested transactions and regenerated batch calldata.\n */\nexport function updateEIP7702BatchData({\n from,\n transactions,\n updates,\n}: {\n from: Hex;\n transactions: BatchTransactionParams[];\n updates: NestedTransactionUpdate[];\n}): {\n nestedTransactions: BatchTransactionParams[];\n transactionData: Hex;\n} {\n const updatesByIndex = new Map<number, Hex>();\n\n for (const { transactionIndex, transactionData } of updates) {\n if (updatesByIndex.has(transactionIndex)) {\n throw new Error(\n `Duplicate nested transaction index - ${transactionIndex}`,\n );\n }\n\n if (!transactions[transactionIndex]) {\n throw new Error(\n `Nested transaction not found with index - ${transactionIndex}`,\n );\n }\n\n updatesByIndex.set(transactionIndex, transactionData);\n }\n\n const nestedTransactions = transactions.map((transaction, index) => {\n const transactionData = updatesByIndex.get(index);\n\n return {\n ...transaction,\n ...(transactionData === undefined ? {} : { data: transactionData }),\n };\n });\n const batchTransaction = generateEIP7702BatchTransaction(\n from,\n nestedTransactions,\n );\n\n return {\n nestedTransactions,\n transactionData: batchTransaction.data as Hex,\n };\n}\n\n/**\n * Generate an EIP-7702 batch transaction.\n *\n * @param from - The sender address.\n * @param transactions - The transactions to batch.\n * @param options - Options bag.\n * @param options.atomic - Whether the batch should be atomic. Defaults to `true`.\n * When `true`, uses ERC-7579 ExecType `default` and all calls revert together.\n * When `false`, uses ERC-7579 ExecType `try` and individual calls can fail independently.\n * @returns The batch transaction.\n */\nexport function generateEIP7702BatchTransaction(\n from: Hex,\n transactions: BatchTransactionParams[],\n options?: { atomic?: boolean },\n): BatchTransactionParams {\n const atomic = options?.atomic ?? true;\n const erc7821Contract = Contract.getInterface(ABI_IERC7821);\n\n const calls = transactions.map((transaction) => {\n const { data, to, value } = transaction;\n\n return [\n to ?? '0x0000000000000000000000000000000000000000',\n value ?? '0x0',\n data ?? '0x',\n ];\n });\n\n const execType = atomic ? ERC7579_EXEC_TYPE_DEFAULT : ERC7579_EXEC_TYPE_TRY;\n const mode = `0x${ERC7579_CALL_TYPE_BATCH}${execType}`.padEnd(66, '0');\n\n const callData = defaultAbiCoder.encode([CALLS_SIGNATURE], [calls]);\n\n const data = erc7821Contract.encodeFunctionData(BATCH_FUNCTION_NAME, [\n mode,\n callData,\n ]) as Hex;\n\n log('Transaction data', data);\n\n return {\n data,\n to: from,\n };\n}\n\n/**\n * Sign an authorization list.\n *\n * @param options - Options bag.\n * @param options.authorizationList - The authorization list to sign.\n * @param options.messenger - The controller messenger.\n * @param options.transactionMeta - The transaction metadata.\n * @returns The signed authorization list.\n */\nexport async function signAuthorizationList({\n authorizationList,\n messenger,\n transactionMeta,\n}: {\n authorizationList?: AuthorizationList;\n messenger: TransactionControllerMessenger;\n transactionMeta: TransactionMeta;\n}): Promise<Required<AuthorizationList | undefined>> {\n if (!authorizationList) {\n return undefined;\n }\n\n const signedAuthorizationList: Required<AuthorizationList> = [];\n let index = 0;\n\n for (const authorization of authorizationList) {\n const signedAuthorization = await signAuthorization(\n authorization,\n transactionMeta,\n messenger,\n index,\n );\n\n signedAuthorizationList.push(signedAuthorization);\n index += 1;\n }\n\n return signedAuthorizationList;\n}\n\n/**\n * Decode a 65-byte EIP-7702 authorization signature into RLP-canonical\n * `r`, `s`, and `yParity` (no leading zero nibbles, `0x0` for zero).\n *\n * @param signature - The 65-byte signature.\n * @returns The decoded authorization fields.\n */\nexport function decodeAuthorizationSignature(signature: Hex): {\n r: Hex;\n s: Hex;\n yParity: Hex;\n} {\n // eslint-disable-next-line id-length\n const r = toCanonicalHex(signature.slice(0, 66));\n // eslint-disable-next-line id-length\n const s = toCanonicalHex(signature.slice(66, 130));\n // eslint-disable-next-line id-length\n const v = parseInt(signature.slice(130, 132), 16);\n const yParity = toCanonicalHex(toHex(v - 27 === 0 ? 0 : 1));\n\n return { r, s, yParity };\n}\n\n/**\n * Strip leading zero nibbles from a hex string to produce its RLP-canonical\n * form. Accepts input with or without a `0x` prefix; always returns\n * `0x`-prefixed. An all-zero input is preserved as `0x0`.\n *\n * @param value - Hex string with or without a `0x` prefix.\n * @returns The canonical `0x`-prefixed hex string.\n */\nfunction toCanonicalHex(value: string): Hex {\n const raw = value.startsWith('0x') ? value.slice(2) : value;\n const stripped = raw.replace(/^0+/u, '');\n return stripped.length === 0 ? '0x0' : `0x${stripped}`;\n}\n\n/**\n * Signs an authorization.\n *\n * @param authorization - The authorization to sign.\n * @param transactionMeta - The associated transaction metadata.\n * @param messenger - The messenger to use for signing.\n * @param index - The index of the authorization in the list.\n * @returns The signed authorization.\n */\nasync function signAuthorization(\n authorization: Authorization,\n transactionMeta: TransactionMeta,\n messenger: TransactionControllerMessenger,\n index: number,\n): Promise<Required<Authorization>> {\n // Retain pre-signed authorizations (e.g. Money Account upgrades signed by an\n // account other than `txParams.from`) instead of re-signing with `from`.\n if (isAuthorizationSigned(authorization)) {\n log('Retaining pre-signed authorization', authorization);\n return authorization;\n }\n\n const finalAuthorization = prepareAuthorization(\n authorization,\n transactionMeta,\n index,\n );\n\n const { txParams } = transactionMeta;\n const { from } = txParams;\n const { address, chainId, nonce } = finalAuthorization;\n const chainIdDecimal = parseInt(chainId, 16);\n const nonceDecimal = parseInt(nonce, 16);\n\n const signature = await messenger.call(\n 'KeyringController:signEip7702Authorization',\n {\n chainId: chainIdDecimal,\n contractAddress: address,\n from,\n nonce: nonceDecimal,\n },\n );\n\n const { r, s, yParity } = decodeAuthorizationSignature(signature as Hex);\n\n const result: Required<Authorization> = {\n address,\n chainId,\n nonce,\n r,\n s,\n yParity,\n };\n\n log('Signed authorization', result);\n\n return result;\n}\n\n/**\n * Whether an authorization already includes a complete EIP-7702 signature.\n *\n * @param authorization - Authorization to check.\n * @returns True when chainId, nonce, and signature components are all present.\n */\nexport function isAuthorizationSigned(\n authorization: Authorization,\n): authorization is Required<Authorization> {\n return Boolean(\n authorization.chainId &&\n authorization.nonce !== undefined &&\n authorization.r &&\n authorization.s &&\n authorization.yParity !== undefined,\n );\n}\n\n/**\n * Recover the authority (signer) of a fully signed EIP-7702 authorization.\n *\n * Per EIP-7702: `authority = ecrecover(keccak(MAGIC || rlp([chain_id, address, nonce])), y_parity, r, s)`.\n *\n * @param authorization - Fully signed authorization.\n * @returns The recovered authority address, or undefined if recovery fails.\n */\nexport function recoverAuthorizationAuthority(\n authorization: Required<Authorization>,\n): Hex | undefined {\n try {\n const chainIdBytes = bigIntToUnpaddedBytes(BigInt(authorization.chainId));\n const addressBytes = hexToBytes(authorization.address);\n const nonceBytes = bigIntToUnpaddedBytes(BigInt(authorization.nonce));\n const rlpEncoded = RLP.encode([chainIdBytes, addressBytes, nonceBytes]);\n const messageHash = keccak256(\n Uint8Array.from([EIP7702_AUTHORIZATION_MAGIC, ...rlpEncoded]),\n );\n const publicKey = ecrecover(\n messageHash,\n BigInt(authorization.yParity),\n bigIntToUnpaddedBytes(BigInt(authorization.r)),\n bigIntToUnpaddedBytes(BigInt(authorization.s)),\n );\n\n return bytesToHex(pubToAddress(publicKey));\n } catch (error) {\n log('Failed to recover authorization authority', { authorization, error });\n return undefined;\n }\n}\n\n/**\n * Resolve which account an authorization nonce belongs to for nonce tracking.\n *\n * Unsigned authorizations are signed by the outer transaction sender (`from`).\n * Signed authorizations recover their authority independently per EIP-7702.\n *\n * @param authorization - Authorization entry.\n * @param transactionFrom - Outer transaction sender.\n * @returns Authority address, or undefined when a signed auth cannot be recovered.\n */\nexport function getAuthorizationAuthority(\n authorization: Authorization,\n transactionFrom: string,\n): Hex | undefined {\n if (!isAuthorizationSigned(authorization)) {\n return transactionFrom as Hex;\n }\n\n return recoverAuthorizationAuthority(authorization);\n}\n\n/**\n * Prepares an authorization for signing by populating the chainId and nonce.\n *\n * @param authorization - The authorization to prepare.\n * @param transactionMeta - The associated transaction metadata.\n * @param index - The index of the authorization in the list.\n * @returns The prepared authorization.\n */\nfunction prepareAuthorization(\n authorization: Authorization,\n transactionMeta: TransactionMeta,\n index: number,\n): Authorization & { chainId: Hex; nonce: Hex } {\n const { chainId: existingChainId, nonce: existingNonce } = authorization;\n const { txParams, chainId: transactionChainId } = transactionMeta;\n const { nonce: transactionNonce } = txParams;\n\n const chainId = existingChainId ?? transactionChainId;\n let nonce = existingNonce;\n\n nonce ??= toHex(parseInt(transactionNonce as string, 16) + 1 + index);\n\n const result = {\n ...authorization,\n chainId,\n nonce,\n };\n\n log('Prepared authorization', result);\n\n return result;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"external-transactions.d.ts","sourceRoot":"","sources":["../../src/utils/external-transactions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,eAAe,CAAC,EAAE,eAAe,EACjC,YAAY,CAAC,EAAE,eAAe,EAAE,EAChC,UAAU,CAAC,EAAE,eAAe,EAAE,GAC7B,IAAI,CAmCN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"external-transactions.js","sourceRoot":"","sources":["../../src/utils/external-transactions.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;GAMG;AACH,MAAM,UAAU,oCAAoC,CAClD,eAAiC,EACjC,YAAgC,EAChC,UAA8B;IAE9B,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,CAAC,aAAa,CAC3B,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAC3D,MAAM,SAAS,CAAC,aAAa,CAC3B,mDAAmD,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;IACvD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAC3C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,eAAe,CAC/C,CAAC;QACF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,SAAS,CAAC,aAAa,CAC3B,yDAAyD,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,uBAAuB,GAAG,YAAY,CAAC,IAAI,CAC/C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,eAAe,CAC/C,CAAC;QACF,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,SAAS,CAAC,aAAa,CAC3B,2DAA2D,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["// These utility functions are exclusively used by `confirmExternalTransaction` method in controller\nimport { rpcErrors } from '@metamask/rpc-errors';\n\nimport { TransactionStatus } from '../types.js';\nimport type { TransactionMeta } from '../types.js';\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): void {\n if (!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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport type { TransactionControllerMessenger } from '../TransactionController.js';\nimport { isValidSignature } from './signature.js';\nimport { padHexToEvenLength } from './utils.js';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;\nconst DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;\nconst DEFAULT_BLOCK_TIME = 12 * 1000;\nconst DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\nconst DEFAULT_GAS_ESTIMATE_BUFFER = 1;\nconst DEFAULT_SUBMIT_HISTORY_LIMIT = 100;\nconst DEFAULT_TRANSACTION_HISTORY_LIMIT = 40;\n\n/**\n * Feature flags supporting the transaction controller.\n */\nexport enum FeatureFlag {\n EIP7702 = 'confirmations_eip_7702',\n GasBuffer = 'confirmations_gas_buffer',\n Transactions = 'confirmations_transactions',\n}\n\ntype GasEstimateFallback = {\n /**\n * The fixed gas estimate fallback for a transaction.\n */\n fixed?: number;\n\n /**\n * The percentage multiplier gas estimate fallback for a transaction.\n */\n percentage?: number;\n\n /**\n * The maximum gas limit the fallback can resolve to, representing the chain's\n * per-transaction gas cap. Clamps the `fixed` or `percentage`-derived fallback\n * so it can never exceed the gas limit the RPC will accept (e.g. ~33.5M on\n * Polygon, whereas 35% of its ~140M block gas limit would otherwise be ~49M).\n */\n maxGasLimit?: number;\n};\n\nexport type TransactionControllerFeatureFlags = {\n /** Feature flags to support EIP-7702 / type-4 transactions. */\n [FeatureFlag.EIP7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n /**\n * Buffers added to gas limit estimations.\n * Values are multipliers such as `1.5` meaning 150% of the original gas limit.\n */\n [FeatureFlag.GasBuffer]?: {\n /** Fallback buffer for all chains and transactions. */\n default?: number;\n\n /**\n * Buffer for included network RPCs only and not those added by user.\n * Takes priority over `default`.\n */\n included?: number;\n\n /** Buffers for specific chains. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Buffer for the chain for all transactions.\n * Takes priority over non-chain `included`.\n */\n base?: number;\n\n /**\n * Buffer if network RPC is included and not added by user.\n * Takes priority over `base`.\n */\n included?: number;\n\n /**\n * Buffer for the chain for EIP-7702 / type 4 transactions only.\n * Only if `data` included and `to` matches `from`.\n * Takes priority over `included` and `base`.\n */\n eip7702?: number;\n };\n };\n };\n\n /** Miscellaneous feature flags to support the transaction controller. */\n [FeatureFlag.Transactions]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n /** Maximum number of entries in the submit history. */\n submitHistoryLimit?: number;\n\n /** Maximum number of transactions stored in state. */\n transactionHistoryLimit?: number;\n\n /**\n * Accelerated polling is used to speed up the polling process for\n * transactions that are not yet confirmed.\n */\n acceleratedPolling?: {\n /** Accelerated polling parameters on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Block time in milliseconds.\n */\n blockTime?: number;\n\n /**\n * Maximum number of polling requests that can be made in a row, before\n * the normal polling resumes.\n */\n countMax?: number;\n\n /** Interval between polling requests in milliseconds. */\n intervalMs?: number;\n };\n };\n\n /** Default `countMax` in case no chain-specific parameter is set. */\n defaultCountMax?: number;\n\n /** Default `intervalMs` in case no chain-specific parameter is set. */\n defaultIntervalMs?: number;\n };\n\n gasFeeRandomisation?: {\n /** Randomised gas fee digits per chainId. */\n randomisedGasFeeDigits?: Record<Hex, number>;\n\n /** Number of digits to preserve for randomised gas fee digits. */\n preservedNumberOfDigits?: number;\n };\n\n /** Gas estimate fallback is used as a fallback in case of failure to obtain the gas estimate values. */\n gasEstimateFallback?: {\n /** Gas estimate fallback per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: GasEstimateFallback;\n };\n\n /**\n * Default gas estimate fallback.\n * This value is used when no specific gas estimate fallback is found for a chain ID.\n */\n default?: GasEstimateFallback;\n };\n\n /**\n * Number of attempts to wait before automatically marking a transaction as failed\n * if it has no receipt status and hash is not found on the network.\n */\n timeoutAttempts?: {\n /** Automatic fail threshold on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: number;\n };\n\n /**\n * Default automatic fail threshold.\n * This value is used when no specific threshold is found for a chain ID.\n */\n default?: number;\n };\n\n /**\n * Replacement of underpriced dapp-suggested gas fees.\n * If enabled, dapp-suggested EIP-1559 fees with a `maxFeePerGas` below the\n * current low estimate are replaced with the wallet's suggested fees, as\n * they are unlikely to be included in a block before fee values change.\n */\n replaceUnderpricedDappGasFees?: {\n /** Enablement on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: boolean;\n };\n\n /**\n * Default enablement.\n * This value is used when no specific value is found for a chain ID.\n */\n default?: boolean;\n };\n\n /**\n * Replacement of underpriced saved (advanced) gas fee preferences.\n * If enabled, saved custom fees with a `maxBaseFee` below the current low\n * estimate are ignored in favour of the wallet's suggested fees, as they\n * are unlikely to be included in a block before fee values change.\n * Level-based saved preferences track current estimates and are never\n * ignored.\n */\n replaceUnderpricedSavedGasFees?: {\n /** Enablement on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: boolean;\n };\n\n /**\n * Default enablement.\n * This value is used when no specific value is found for a chain ID.\n */\n default?: boolean;\n };\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FeatureFlag.EIP7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FeatureFlag.EIP7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, padHexToEvenLength(chainId) as Hex],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the submit history limit.\n * Defaults to 100 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The submit history limit.\n */\nexport function getSubmitHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.submitHistoryLimit ??\n DEFAULT_SUBMIT_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the transaction history limit.\n * Defaults to 40 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The transaction history limit.\n */\nexport function getTransactionHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlags(messenger);\n\n if (!featureFlags) {\n return undefined;\n }\n\n return (\n featureFlags[FeatureFlag.Transactions]?.transactionHistoryLimit ??\n DEFAULT_TRANSACTION_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the accelerated polling parameters for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The accelerated polling parameters: `countMax` and `intervalMs`.\n */\nexport function getAcceleratedPollingParams(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): { blockTime: number; countMax: number; intervalMs: number } {\n const featureFlags = getFeatureFlags(messenger);\n\n const acceleratedPollingParams =\n featureFlags?.[FeatureFlag.Transactions]?.acceleratedPolling;\n\n const countMax =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ??\n acceleratedPollingParams?.defaultCountMax ??\n DEFAULT_ACCELERATED_POLLING_COUNT_MAX;\n\n const intervalMs =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ??\n acceleratedPollingParams?.defaultIntervalMs ??\n DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;\n\n const blockTime =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.blockTime ??\n DEFAULT_BLOCK_TIME;\n\n return { blockTime, countMax, intervalMs };\n}\n\n/**\n * Retrieves the gas fee randomisation parameters.\n *\n * @param messenger - The controller messenger instance.\n * @returns The gas fee randomisation parameters.\n */\nexport function getGasFeeRandomisation(\n messenger: TransactionControllerMessenger,\n): {\n randomisedGasFeeDigits: Record<Hex, number>;\n preservedNumberOfDigits: number | undefined;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasFeeRandomisation =\n featureFlags?.[FeatureFlag.Transactions]?.gasFeeRandomisation ?? {};\n\n return {\n randomisedGasFeeDigits: gasFeeRandomisation.randomisedGasFeeDigits ?? {},\n preservedNumberOfDigits: gasFeeRandomisation.preservedNumberOfDigits,\n };\n}\n\n/**\n * Retrieves the gas estimate fallback for a given chain ID.\n * Defaults to the default gas estimate fallback if not set.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The gas estimate fallback.\n */\nexport function getGasEstimateFallback(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): {\n fixed?: number;\n percentage: number;\n maxGasLimit?: number;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasEstimateFallbackFlags =\n featureFlags?.[FeatureFlag.Transactions]?.gasEstimateFallback;\n\n const chainFlags = gasEstimateFallbackFlags?.perChainConfig?.[chainId];\n\n const percentage =\n chainFlags?.percentage ??\n gasEstimateFallbackFlags?.default?.percentage ??\n DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT;\n\n const fixed = chainFlags?.fixed ?? gasEstimateFallbackFlags?.default?.fixed;\n\n const maxGasLimit =\n chainFlags?.maxGasLimit ?? gasEstimateFallbackFlags?.default?.maxGasLimit;\n\n return { fixed, percentage, maxGasLimit };\n}\n\n/**\n * Retrieves the gas buffers for a given chain ID.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.isCustomRPC - Whether the network RPC is added by the user.\n * @param request.isUpgradeWithData - Whether the transaction is an EIP-7702 upgrade combined with a call.\n * @param request.messenger - The controller messenger instance.\n * @returns The gas buffers.\n */\nexport function getGasEstimateBuffer({\n chainId,\n isCustomRPC,\n isUpgradeWithData,\n messenger,\n}: {\n chainId: Hex;\n isCustomRPC: boolean;\n isUpgradeWithData: boolean;\n messenger: TransactionControllerMessenger;\n}): number {\n const featureFlags = getFeatureFlags(messenger);\n const gasBufferFlags = featureFlags?.[FeatureFlag.GasBuffer];\n const chainFlags = gasBufferFlags?.perChainConfig?.[chainId];\n const chainIncludedRPCBuffer = isCustomRPC ? undefined : chainFlags?.included;\n\n const defaultIncludedRPCBuffer = isCustomRPC\n ? undefined\n : gasBufferFlags?.included;\n\n const upgradeBuffer = isUpgradeWithData ? chainFlags?.eip7702 : undefined;\n\n return (\n upgradeBuffer ??\n chainIncludedRPCBuffer ??\n chainFlags?.base ??\n defaultIncludedRPCBuffer ??\n gasBufferFlags?.default ??\n DEFAULT_GAS_ESTIMATE_BUFFER\n );\n}\n\n/**\n * Retrieves the incoming transactions polling interval.\n * Retrieves the number of attempts to wait before automatically marking a transaction as dropped\n * if it has no receipt status.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The threshold number of attempts, or undefined if the feature is disabled.\n */\nexport function getTimeoutAttempts(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlags(messenger);\n\n const timeoutAttemptsFlags =\n featureFlags?.[FeatureFlag.Transactions]?.timeoutAttempts;\n\n return (\n timeoutAttemptsFlags?.perChainConfig?.[chainId] ??\n timeoutAttemptsFlags?.default\n );\n}\n\n/**\n * Retrieves whether underpriced dapp-suggested gas fees should be replaced\n * with the wallet's suggested fees.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns Whether the replacement is enabled.\n */\nexport function getReplaceUnderpricedDappGasFeesEnabled(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlags(messenger);\n\n const replaceUnderpricedDappGasFeesFlags =\n featureFlags?.[FeatureFlag.Transactions]?.replaceUnderpricedDappGasFees;\n\n return (\n replaceUnderpricedDappGasFeesFlags?.perChainConfig?.[chainId] ??\n replaceUnderpricedDappGasFeesFlags?.default ??\n false\n );\n}\n\n/**\n * Retrieves whether underpriced saved (advanced) gas fee preferences should be\n * ignored in favour of the wallet's suggested fees.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns Whether the replacement is enabled.\n */\nexport function getReplaceUnderpricedSavedGasFeesEnabled(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlags(messenger);\n\n const replaceUnderpricedSavedGasFeesFlags =\n featureFlags?.[FeatureFlag.Transactions]?.replaceUnderpricedSavedGasFees;\n\n return (\n replaceUnderpricedSavedGasFeesFlags?.perChainConfig?.[chainId] ??\n replaceUnderpricedSavedGasFeesFlags?.default ??\n false\n );\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags | undefined {\n try {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n } catch {\n log('RemoteFeatureFlagController not available');\n return undefined;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"first-time-interaction.d.ts","sourceRoot":"","sources":["../../src/utils/first-time-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAM9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,KAAK,iCAAiC,GAAG;IACvC,oBAAoB,EAAE,eAAe,EAAE,CAAC;IACxC,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IACvE,6BAA6B,EAAE,MAAM,OAAO,CAAC;IAC7C,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CACjB,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;KACd,EACD,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,KACvC,IAAI,CAAC;CACX,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAAC,EAC/C,oBAAoB,EACpB,cAAc,EACd,6BAA6B,EAC7B,KAAK,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,GAClB,EAAE,iCAAiC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EnD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"first-time-interaction.js","sourceRoot":"","sources":["../../src/utils/first-time-interaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,aAAa,IAAI,GAAG,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAkBlD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,oBAAoB,EACpB,cAAc,EACd,6BAA6B,EAC7B,KAAK,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,GACiB;IAClC,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,EACJ,OAAO,EACP,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,GACnB,GAAG,eAAe,CAAC;IAEpB,MAAM,SAAS,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAyC;QACpD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;QAC7B,EAAE,EAAE,SAAmB;QACvB,IAAI;KACL,CAAC;IAEF,eAAe,CAAC,SAAS,CAAC,CAAC;IAE3B,MAAM,cAAc,GAAG,SAAS,EAAE,WAAW,EAAE,CAAC;IAChD,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,IAAI,CACnD,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,EAAE,KAAK,aAAa;QACvB,EAAE,CAAC,OAAO,KAAK,OAAO;QACtB,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,WAAW,EAAE;QACxD,qBAAqB,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,cAAc,CAC9D,CAAC;IAEF,sHAAsH;IACtH,0GAA0G;IAC1G,2DAA2D;IAC3D,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAC3B,EAAE,IAAI,EAAE,8BAA8B,EAAE,aAAa,EAAE,YAAY,EAAE,EACrE,GAAG,EAAE,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAC7C,CAAC;QAEF,MAAM,sBAAsB,GAC1B,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAEhD,MAAM,oBAAoB,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAE3D,wBAAwB;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,GAAG,CACD,+DAA+D,EAC/D,aAAa,CACd,CAAC;YACF,OAAO;QACT,CAAC;QAED,iBAAiB,CACf;YACE,aAAa;YACb,IAAI,EAAE,8EAA8E;SACrF,EACD,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;QACzD,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,gCAAgC,EAAE,aAAa,EAAE;YACnD,sBAAsB;SACvB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CACD,qFAAqF,EACrF,KAAK,CACN,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import type { TraceContext, TraceCallback } from '@metamask/controller-utils';\nimport { hexToNumber } from '@metamask/utils';\n\nimport { getAccountAddressRelationship } from '../api/accounts-api.js';\nimport type { GetAccountAddressRelationshipRequest } from '../api/accounts-api.js';\nimport { projectLogger as log } from '../logger.js';\nimport type { TransactionMeta } from '../types.js';\nimport { getEffectiveRecipient } from './recipient.js';\nimport { validateParamTo } from './validation.js';\n\ntype UpdateFirstTimeInteractionRequest = {\n existingTransactions: TransactionMeta[];\n getTransaction: (transactionId: string) => TransactionMeta | undefined;\n isFirstTimeInteractionEnabled: () => boolean;\n trace: TraceCallback;\n traceContext?: TraceContext;\n transactionMeta: TransactionMeta;\n updateTransaction: (\n updateParams: {\n transactionId: string;\n note: string;\n },\n updater: (txMeta: TransactionMeta) => void,\n ) => void;\n};\n\n/**\n * Updates the first-time interaction status for a transaction.\n *\n * @param params - The parameters for updating first time interaction.\n * @param params.existingTransactions - The existing transactions.\n * @param params.getTransaction - Function to get a transaction by ID.\n * @param params.isFirstTimeInteractionEnabled - The function to check if first time interaction is enabled.\n * @param params.trace - The trace callback.\n * @param params.traceContext - The trace context.\n * @param params.transactionMeta - The transaction meta object.\n * @param params.updateTransaction - Function to update transaction internal state.\n * @returns Promise that resolves when the update is complete.\n */\nexport async function updateFirstTimeInteraction({\n existingTransactions,\n getTransaction,\n isFirstTimeInteractionEnabled,\n trace,\n traceContext,\n transactionMeta,\n updateTransaction,\n}: UpdateFirstTimeInteractionRequest): Promise<void> {\n if (!isFirstTimeInteractionEnabled()) {\n return;\n }\n\n const {\n chainId,\n id: transactionId,\n txParams: { from },\n } = transactionMeta;\n\n const recipient = getEffectiveRecipient(transactionMeta);\n\n const request: GetAccountAddressRelationshipRequest = {\n chainId: hexToNumber(chainId),\n to: recipient as string,\n from,\n };\n\n validateParamTo(recipient);\n\n const recipientLower = recipient?.toLowerCase();\n const existingTransaction = existingTransactions.find(\n (tx) =>\n tx.id !== transactionId &&\n tx.chainId === chainId &&\n tx.txParams?.from?.toLowerCase() === from?.toLowerCase() &&\n getEffectiveRecipient(tx)?.toLowerCase() === recipientLower,\n );\n\n // Skip API call only if we already have a tx with same from and same effective recipient (e.g. duplicate or pending).\n // For token transfers (ERC20/ERC721/ERC1155), effective recipient is decoded from data; using txParams.to\n // would wrongly match any send of the same token contract.\n if (existingTransaction) {\n return;\n }\n\n try {\n const { count } = await trace(\n { name: 'Account Address Relationship', parentContext: traceContext },\n () => getAccountAddressRelationship(request),\n );\n\n const isFirstTimeInteraction =\n count === undefined ? undefined : count === 0;\n\n const finalTransactionMeta = getTransaction(transactionId);\n\n /* istanbul ignore if */\n if (!finalTransactionMeta) {\n log(\n 'Cannot update first time interaction as transaction not found',\n transactionId,\n );\n return;\n }\n\n updateTransaction(\n {\n transactionId,\n note: 'TransactionController#updateFirstInteraction - Update first time interaction',\n },\n (txMeta) => {\n txMeta.isFirstTimeInteraction = isFirstTimeInteraction;\n },\n );\n\n log('Updated first time interaction', transactionId, {\n isFirstTimeInteraction,\n });\n } catch (error) {\n log(\n 'Error fetching account address relationship, skipping first time interaction update',\n error,\n );\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-fee-tokens.d.ts","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAS3C,OAAO,KAAK,EACV,WAAW,EACX,8BAA8B,EAC9B,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvD,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,GAAG,CAAC;IACb,4BAA4B,EAAE,CAC5B,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,4BAA4B,EAC5B,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC,CA8DD;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,GAClB,EAAE;IACD,SAAS,EAAE,8BAA8B,CAAC;IAC1C,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,WAAW,EAAE,eAAe,CAAC;IAC7B,iBAAiB,EAAE,CACjB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,IAAI,KAC9B,IAAI,CAAC;CACX,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-fee-tokens.js","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { simulateTransactions } from '../api/simulation-api.js';\nimport type { SimulationRequestTransaction } from '../api/simulation-api.js';\nimport type {\n SimulationResponse,\n SimulationResponseTransaction,\n} from '../api/simulation-api.js';\nimport type {\n GasFeeToken,\n TransactionControllerMessenger,\n TransactionMeta,\n} from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport type { GetSimulationConfig } from '../types.js';\nimport { isNativeBalanceSufficientForGas } from './balance.js';\nimport { ERROR_MESSAGE_NO_UPGRADE_CONTRACT } from './batch.js';\nimport { ERROR_MESSGE_PUBLIC_KEY, doesChainSupportEIP7702 } from './eip7702.js';\nimport { getEIP7702UpgradeContractAddress } from './feature-flags.js';\n\nconst log = createModuleLogger(projectLogger, 'gas-fee-tokens');\n\nexport type GetGasFeeTokensRequest = {\n chainId: Hex;\n isEIP7702GasFeeTokensEnabled: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n getSimulationConfig: GetSimulationConfig;\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n transactionMeta: TransactionMeta;\n};\n\n/**\n * Get gas fee tokens for a transaction.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.isEIP7702GasFeeTokensEnabled - Callback to check if EIP-7702 gas fee tokens are enabled.\n * @param request.messenger - The messenger instance.\n * @param request.publicKeyEIP7702 - Public key to validate EIP-7702 contract signatures.\n * @param request.transactionMeta - The transaction metadata.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns An array of gas fee tokens.\n */\nexport async function getGasFeeTokens({\n chainId,\n isEIP7702GasFeeTokensEnabled,\n messenger,\n publicKeyEIP7702,\n transactionMeta,\n getSimulationConfig,\n}: GetGasFeeTokensRequest): Promise<{\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsored: boolean;\n}> {\n const { delegationAddress, txParams } = transactionMeta;\n const { authorizationList: authorizationListRequest } = txParams;\n const data = txParams.data as Hex;\n const from = txParams.from as Hex;\n const to = txParams.to as Hex;\n const value = txParams.value as Hex;\n\n log('Request', { chainId, txParams });\n\n const is7702GasFeeTokensEnabled =\n await isEIP7702GasFeeTokensEnabled(transactionMeta);\n\n const with7702 =\n is7702GasFeeTokensEnabled && doesChainSupportEIP7702(chainId, messenger);\n\n let authorizationList:\n | SimulationRequestTransaction['authorizationList']\n | undefined = authorizationListRequest?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n if (with7702 && !delegationAddress && !authorizationList) {\n authorizationList = buildAuthorizationList({\n chainId,\n from,\n messenger,\n publicKeyEIP7702,\n });\n }\n\n try {\n const response = await simulateTransactions(chainId, {\n getSimulationConfig,\n transactions: [\n {\n authorizationList,\n data,\n from,\n to,\n value,\n },\n ],\n suggestFees: {\n withTransfer: true,\n withFeeTransfer: true,\n with7702,\n },\n });\n\n log('Response', response);\n\n const result = parseGasFeeTokens(response);\n\n log('Gas fee tokens', result);\n\n return result;\n } catch (error) {\n log('Failed to gas fee tokens', error);\n return { gasFeeTokens: [], isGasFeeSponsored: false };\n }\n}\n\n/**\n * Check and update gas fee token selection before publishing a transaction.\n *\n * @param request - Request object.\n * @param request.messenger - The transaction controller messenger.\n * @param request.networkClientId - The network client ID.\n * @param request.fetchGasFeeTokens - Function to fetch gas fee tokens.\n * @param request.transaction - Transaction metadata.\n * @param request.updateTransaction - Function to update the transaction.\n */\nexport async function checkGasFeeTokenBeforePublish({\n messenger,\n networkClientId,\n fetchGasFeeTokens,\n transaction,\n updateTransaction,\n}: {\n messenger: TransactionControllerMessenger;\n networkClientId: NetworkClientId;\n fetchGasFeeTokens: (transaction: TransactionMeta) => Promise<GasFeeToken[]>;\n transaction: TransactionMeta;\n updateTransaction: (\n transactionId: string,\n fn: (tx: TransactionMeta) => void,\n ) => void;\n}): Promise<void> {\n const {\n excludeNativeTokenForFee,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !selectedGasFeeToken ||\n (!isGasFeeTokenIgnoredIfBalance && !excludeNativeTokenForFee)\n ) {\n return;\n }\n\n log('Checking gas fee token before publish', { selectedGasFeeToken });\n\n if (!excludeNativeTokenForFee) {\n const hasNativeBalance = await isNativeBalanceSufficientForGas(\n transaction,\n messenger,\n networkClientId,\n );\n\n if (hasNativeBalance) {\n log(\n 'Ignoring gas fee token before publish due to sufficient native balance',\n );\n\n updateTransaction(transaction.id, (tx) => {\n tx.isExternalSign = false;\n tx.selectedGasFeeToken = undefined;\n });\n\n return;\n }\n }\n\n const gasFeeTokens = await fetchGasFeeTokens({\n ...transaction,\n isExternalSign: true,\n });\n\n updateTransaction(transaction.id, (tx) => {\n tx.gasFeeTokens = gasFeeTokens;\n tx.isExternalSign = true;\n tx.txParams.nonce = undefined;\n });\n\n log('Updated gas fee tokens before publish', gasFeeTokens);\n\n if (\n !gasFeeTokens?.some(\n (token) =>\n token.tokenAddress.toLowerCase() === selectedGasFeeToken.toLowerCase(),\n )\n ) {\n throw new Error('Gas fee token not found and insufficient native balance');\n }\n\n log('Publishing with selected gas fee token', { selectedGasFeeToken });\n}\n\n/**\n * Extract gas fee tokens from a simulation response.\n *\n * @param response - The simulation response.\n * @returns gasFeeTokens: An array of gas fee tokens. isGasFeeSponsored: Whether the transaction is sponsored\n */\nfunction parseGasFeeTokens(response: SimulationResponse): {\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsored: boolean;\n} {\n const feeLevel = response.transactions?.[0]\n ?.fees?.[0] as Required<SimulationResponseTransaction>['fees'][0];\n\n const isGasFeeSponsored = response.sponsorship?.isSponsored ?? false;\n\n const tokenFees = feeLevel?.tokenFees ?? [];\n\n return {\n gasFeeTokens: tokenFees.map((tokenFee) => ({\n amount: tokenFee.balanceNeededToken,\n balance: tokenFee.currentBalanceToken,\n decimals: tokenFee.token.decimals,\n fee: tokenFee.serviceFee,\n gas: feeLevel.gas,\n gasTransfer: tokenFee.transferEstimate,\n maxFeePerGas: feeLevel.maxFeePerGas,\n maxPriorityFeePerGas: feeLevel.maxPriorityFeePerGas,\n rateWei: tokenFee.rateWei,\n recipient: tokenFee.feeRecipient,\n symbol: tokenFee.token.symbol,\n tokenAddress: tokenFee.token.address,\n })),\n isGasFeeSponsored,\n };\n}\n\n/**\n * Generate the authorization list for the request.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.from - The sender's address.\n * @param request.messenger - The messenger instance.\n * @param request.publicKeyEIP7702 - The public key for EIP-7702.\n * @returns The authorization list.\n */\nfunction buildAuthorizationList({\n chainId,\n from,\n messenger,\n publicKeyEIP7702,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n}): SimulationRequestTransaction['authorizationList'] | undefined {\n if (!publicKeyEIP7702) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n const upgradeAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKeyEIP7702,\n );\n\n if (!upgradeAddress) {\n throw rpcErrors.internal(ERROR_MESSAGE_NO_UPGRADE_CONTRACT);\n }\n\n return [\n {\n address: upgradeAddress,\n from,\n },\n ];\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-fees.d.ts","sourceRoot":"","sources":["../../src/utils/gas-fees.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,WAAW,EACZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EACV,+BAA+B,EAC/B,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACX,MAAM,aAAa,CAAC;AAerB,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,kBAAkB,EAAE,CAClB,OAAO,EAAE,0BAA0B,KAChC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,eAAe,EAAE,CACf,eAAe,EAAE,eAAe,KAC7B,YAAY,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,8BAA8B,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG;IACpD,aAAa,EAAE,iBAAiB,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,GAAG,CAAC,EAAE,+BAA+B,CAAC;CACvC,CAAC;AAUF;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA+Df;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAEtD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAI5E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-fees.js","sourceRoot":"","sources":["../../src/utils/gas-fees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAS7C,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uCAAuC,EACvC,wCAAwC,GACzC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAqCpD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;AAE1D,MAAM,wCAAwC,GAAG;IAC/C,GAAG,sBAAsB;IACzB,eAAe,CAAC,MAAM;IACtB,eAAe,CAAC,cAAc;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B;IAE7B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAE7C,MAAM,wBAAwB,GAC5B,wCAAwC,CAAC,QAAQ,CAC/C,MAAM,CAAC,IAAuB,CAC/B,CAAC;IAEJ,IAAI,YAAY,GACd,wBAAwB,IAAI,sBAAsB,CAAC,aAAa,CAAC;QAC/D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC;QACjD,GAAG,OAAO;QACV,YAAY;KACb,CAAC,CAAC;IAEH,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;IAE5C,IACE,mCAAmC,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAC5E,CAAC;QACD,GAAG,CACD,mDAAmD,EACnD,YAAY,EAAE,UAAU,EACxB,gBAAgB,CAAC,GAAG,EAAE,YAAY,CACnC,CAAC;QACF,YAAY,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED,MAAM,gBAAgB,GAAqB;QACzC,GAAG,OAAO;QACV,aAAa;QACb,YAAY;QACZ,gBAAgB;KACjB,CAAC;IAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAEjE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;QAClC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAE5C,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,CAAC,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAExD,GAAG,CAAC,4BAA4B,EAAE;QAChC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY;QAC1C,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;QAC1D,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;KACnC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QACzE,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC9C,CAAC;IAED,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAA4B;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;IAE3C,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,mCAAmC,CAC1C,YAAsC,EACtC,gBAAkC,EAClC,OAA6B;IAE7B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE/C,IACE,CAAC,OAAO;QACR,CAAC,YAAY,EAAE,UAAU;QACzB,CAAC,wCAAwC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EACpE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC;IAE3D,MAAM,cAAc,GAClB,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC;QACtC,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAEjD,IAAI,CAAC,eAAe,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,qBAAqB,CAC1B,mBAAmB,CAAC,YAAY,CAAC,UAAU,CAAC,EAC5C,eAAe,CAChB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,kBAA0B;IAE1B,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,OAAyB;IACxD,MAAM,EACJ,OAAO,EACP,aAAa,EACb,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,MAAM,GACP,GAAG,OAAO,CAAC;IAEZ,IACE,CAAC,OAAO;QACR,YAAY;QACZ,MAAM,CAAC,UAAU;QACjB,CAAC,uCAAuC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EACnE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,gBAAgB,GACpB,aAAa,CAAC,YAAY;QAC1B,CAAC,aAAa,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,oBAAoB;YAC5D,CAAC,CAAC,aAAa,CAAC,QAAQ;YACxB,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjB,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC;IAE3D,MAAM,cAAc,GAClB,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC;QACtC,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAEjD,IAAI,CAAC,gBAAgB,IAAI,CAAC,eAAe,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,qBAAqB,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,OAAyB;IAChD,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAE3E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,EAAE,UAAU,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,mBAAmB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAClE,GAAG,CAAC,sCAAsC,EAAE,YAAY,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,aAAa,CAAC,YAAY,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrD,GAAG,CAAC,iCAAiC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACnE,OAAO,aAAa,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,IACE,aAAa,CAAC,QAAQ;QACtB,CAAC,aAAa,CAAC,oBAAoB;QACnC,CAAC,iBAAiB,EAClB,CAAC;QACD,GAAG,CACD,+CAA+C,EAC/C,aAAa,CAAC,QAAQ,CACvB,CAAC;QACF,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,GAAG,CACD,yDAAyD,EACzD,aAAa,CAAC,YAAY,IAAI,aAAa,CAAC,QAAQ,EACpD,gBAAgB,CAAC,GAAG,EAAE,YAAY,CACnC,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB,CAAC,YAAY,EAAE,CAAC;QAClC,GAAG,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACnE,OAAO,gBAAgB,CAAC,YAAY,CAAC;IACvC,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC9B,GAAG,CACD,4CAA4C,EAC5C,gBAAgB,CAAC,QAAQ,CAC1B,CAAC;QACF,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,OAAyB;IAEzB,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,GACtE,OAAO,CAAC;IAEV,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,EAAE,WAAW,EAAE,CAAC;QAC9B,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC3E,GAAG,CACD,0DAA0D,EAC1D,oBAAoB,CACrB,CAAC;QACF,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,aAAa,CAAC,oBAAoB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7D,GAAG,CACD,yCAAyC,EACzC,aAAa,CAAC,oBAAoB,CACnC,CAAC;QACF,OAAO,aAAa,CAAC,oBAAoB,CAAC;IAC5C,CAAC;IAED,IACE,aAAa,CAAC,QAAQ;QACtB,CAAC,aAAa,CAAC,YAAY;QAC3B,CAAC,iBAAiB,EAClB,CAAC;QACD,GAAG,CACD,uDAAuD,EACvD,aAAa,CAAC,QAAQ,CACvB,CAAC;QACF,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;QAC1C,GAAG,CACD,sCAAsC,EACtC,gBAAgB,CAAC,oBAAoB,CACtC,CAAC;QACF,OAAO,gBAAgB,CAAC,oBAAoB,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACjC,GAAG,CACD,8CAA8C,EAC9C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAC7B,CAAC;QACF,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACpC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,OAAyB;IAC5C,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAE3E,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5D,GAAG,CAAC,2CAA2C,EAAE,QAAQ,CAAC,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3B,GAAG,CAAC,6BAA6B,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC3D,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,IAAI,gBAAgB,CAAC,YAAY,EAAE,CAAC;QAClC,GAAG,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACnE,OAAO,gBAAgB,CAAC,YAAY,CAAC;IACvC,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC9B,GAAG,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3D,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,OAAyB;IAChD,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE1E,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,iBAAiB,GACrB,YAAY,CAAC,UAAU,KAAK,SAAS;YACrC,YAAY,CAAC,WAAW,KAAK,SAAS;YACtC,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAC;QAEtC,MAAM,gBAAgB,GACpB,CAAC,iBAAiB;YAClB,YAAY,CAAC,KAAK,KAAK,SAAS;YAChC,gBAAgB,CAAC,sBAAsB,CAAC;QAE1C,oEAAoE;QACpE,wEAAwE;QACxE,wEAAwE;QACxE,mEAAmE;QACnE,wEAAwE;QACxE,OAAO,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;IACrE,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,iCAAiC;IACjC,IAAI,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IACE,CAAC,aAAa,CAAC,YAAY;QAC3B,CAAC,aAAa,CAAC,oBAAoB;QACnC,aAAa,CAAC,QAAQ,EACtB,CAAC;QACD,OAAO,MAAM,CAAC,UAAU;YACtB,CAAC,CAAC,YAAY,CAAC,MAAM;YACrB,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC;IAClC,CAAC;IAED,IACE,CAAC,aAAa,CAAC,YAAY;QAC3B,CAAC,aAAa,CAAC,oBAAoB;QACnC,gBAAgB,CAAC,YAAY;QAC7B,gBAAgB,CAAC,oBAAoB,EACrC,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IACE,CAAC,aAAa,CAAC,YAAY;QAC3B,CAAC,aAAa,CAAC,oBAAoB;QACnC,gBAAgB,CAAC,QAAQ,EACzB,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,OAAO,YAAY,CAAC,cAAc,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,MAAuB;IACxD,MAAM,CAAC,mBAAmB,KAA1B,MAAM,CAAC,mBAAmB,GAAK,EAAE,EAAC;IAClC,MAAM,CAAC,mBAAmB,CAAC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;IAEvE,MAAM,CAAC,mBAAmB,CAAC,oBAAoB;QAC7C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAEvC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/D,MAAM,CAAC,mBAAmB,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,mBAAmB,CAChC,OAA+D;IAE/D,MAAM,EACJ,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,MAAM,GACP,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAEnC,MAAM,mBAAmB,GACvB,OAAO;QACP,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAEhD,6EAA6E;IAC7E,yDAAyD;IACzD,MAAM,6BAA6B,GACjC,mBAAmB;QACnB,CAAC,MAAM,CAAC,UAAU;QAClB,uCAAuC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAErE,IACE,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtC,CAAC,mBAAmB,IAAI,CAAC,6BAA6B,CAAC,EACvD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAC9B,MAAM,EACN,WAAW,EACX,SAAS,CACI,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,oBAAoB,GAAG,MAAM,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;QAE3E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC;YAC3C,oBAAoB;YACpB,SAAS;YACT,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;QACpD,MAAM,wBAAwB,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAE3E,QAAQ,kBAAkB,EAAE,CAAC;YAC3B,KAAK,kBAAkB,CAAC,SAAS;gBAC/B,OAAO;oBACL,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,wBAAwB,CAAC;wBAC9C,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;oBAC5B,sBAAsB,EAAE,IAAI;oBAC5B,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG;iBAC5B,CAAC;YACJ,KAAK,kBAAkB,CAAC,MAAM;gBAC5B,OAAO;oBACL,QAAQ,EACN,QAAQ,CAAC,SAAS,CAAC,wBAAwB,CAAC;wBAC5C,QAAQ,CAAC,SAAS,CAAC,MAAM;oBAC3B,sBAAsB,EAAE,IAAI;iBAC7B,CAAC;YACJ,KAAK,kBAAkB,CAAC,QAAQ;gBAC9B,OAAO;oBACL,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ;oBACrC,sBAAsB,EAAE,KAAK;iBAC9B,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK;gBACb,gFAAgF;gBAChF,4EAA4E;gBAC5E,yDAAyD,kBAAkB,EAAE,CAC9E,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,0EAA0E;IAC1E,kEAAkE;IAClE,wBAAwB;IACxB,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,MAAM,UAAU,CAAC;QACpC,SAAS;QACT,eAAe;QACf,MAAM,EAAE,cAAc;KACvB,CAAC,CAAoB,CAAC;IAEvB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,sBAAsB,CAAC,aAAgC;IAC9D,OAAO;QACL,aAAa,CAAC,YAAY;QAC1B,aAAa,CAAC,oBAAoB;QAClC,aAAa,CAAC,QAAQ;KACvB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,2BAA2B,CAClC,YAAsC;IAEtC,OAAO,qBAAqB,CAAC,YAAY,EAAE,KAAK,CAAC;QAC/C,CAAC,CAAC,YAAY,CAAC,KAAK;QACpB,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC;AACjC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAChD,KAA4B,CAC7B,CAAC;AACJ,CAAC","sourcesContent":["import { gweiDecToWEIBN, toHex } from '@metamask/controller-utils';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport type { TransactionControllerMessenger } from '../TransactionController.js';\nimport type {\n FeeMarketGasFeeEstimateForLevel,\n SavedGasFees,\n TransactionParams,\n TransactionMeta,\n GasFeeFlow,\n} from '../types.js';\nimport {\n GasFeeEstimateLevel,\n GasFeeEstimateType,\n TransactionType,\n UserFeeLevel,\n} from '../types.js';\nimport {\n getReplaceUnderpricedDappGasFeesEnabled,\n getReplaceUnderpricedSavedGasFeesEnabled,\n} from './feature-flags.js';\nimport { getGasFeeFlow } from './gas-flow.js';\nimport { rpcRequest } from './provider.js';\nimport { SWAP_TRANSACTION_TYPES } from './swaps.js';\n\nexport type UpdateGasFeesRequest = {\n eip1559: boolean;\n gasFeeFlows: GasFeeFlow[];\n getGasFeeEstimates: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n getSavedGasFees: (\n transactionMeta: TransactionMeta,\n ) => SavedGasFees | undefined;\n messenger: TransactionControllerMessenger;\n txMeta: TransactionMeta;\n};\n\nexport type GetGasFeeRequest = UpdateGasFeesRequest & {\n initialParams: TransactionParams;\n savedGasFees?: SavedGasFees;\n suggestedGasFees: SuggestedGasFees;\n};\n\ntype SuggestedGasFees = {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n gasPrice?: string;\n\n /**\n * Whether the suggested fee was derived from a specific estimate level,\n * such as `low`/`medium`/`high`. This is `false` for estimate types that\n * do not support per-level pricing, such as a flat `eth_gasPrice` value,\n * or when the gas fee flow failed and a raw RPC fallback was used.\n */\n isEstimateLevelApplied?: boolean;\n\n low?: FeeMarketGasFeeEstimateForLevel;\n};\n\nconst log = createModuleLogger(projectLogger, 'gas-fees');\n\nconst SAVED_GAS_FEES_IGNORED_TRANSACTION_TYPES = [\n ...SWAP_TRANSACTION_TYPES,\n TransactionType.bridge,\n TransactionType.bridgeApproval,\n];\n\n/**\n * Update the gas fee properties of the provided transaction meta.\n *\n * @param request - The request object.\n */\nexport async function updateGasFees(\n request: UpdateGasFeesRequest,\n): Promise<void> {\n const { txMeta } = request;\n const initialParams = { ...txMeta.txParams };\n\n const shouldIgnoreSavedGasFees =\n SAVED_GAS_FEES_IGNORED_TRANSACTION_TYPES.includes(\n txMeta.type as TransactionType,\n );\n\n let savedGasFees =\n shouldIgnoreSavedGasFees || hasInitialGasFeeParams(initialParams)\n ? undefined\n : request.getSavedGasFees(txMeta);\n\n const suggestedGasFees = await getSuggestedGasFees({\n ...request,\n savedGasFees,\n });\n\n log('Suggested gas fees', suggestedGasFees);\n\n if (\n shouldIgnoreUnderpricedSavedGasFees(savedGasFees, suggestedGasFees, request)\n ) {\n log(\n 'Ignoring saved custom gas fees below low estimate',\n savedGasFees?.maxBaseFee,\n suggestedGasFees.low?.maxFeePerGas,\n );\n savedGasFees = undefined;\n }\n\n const getGasFeeRequest: GetGasFeeRequest = {\n ...request,\n initialParams,\n savedGasFees,\n suggestedGasFees,\n };\n\n txMeta.txParams.maxFeePerGas = getMaxFeePerGas(getGasFeeRequest);\n\n txMeta.txParams.maxPriorityFeePerGas =\n getMaxPriorityFeePerGas(getGasFeeRequest);\n\n txMeta.txParams.gasPrice = getGasPrice(getGasFeeRequest);\n txMeta.userFeeLevel = getUserFeeLevel(getGasFeeRequest);\n\n log('Updated gas fee properties', {\n maxFeePerGas: txMeta.txParams.maxFeePerGas,\n maxPriorityFeePerGas: txMeta.txParams.maxPriorityFeePerGas,\n gasPrice: txMeta.txParams.gasPrice,\n });\n\n if (txMeta.txParams.maxFeePerGas || txMeta.txParams.maxPriorityFeePerGas) {\n delete txMeta.txParams.gasPrice;\n }\n\n if (txMeta.txParams.gasPrice) {\n delete txMeta.txParams.maxFeePerGas;\n delete txMeta.txParams.maxPriorityFeePerGas;\n }\n\n updateDefaultGasEstimates(txMeta);\n}\n\n/**\n * Convert GWEI from decimal string to WEI as hex string.\n *\n * @param value - The GWEI value as a decimal string.\n * @returns The WEI value in hex.\n */\nexport function gweiDecimalToWeiHex(value: string): Hex {\n return toHex(gweiDecToWEIBN(value));\n}\n\n/**\n * Converts a value from Gwei decimal representation to Wei decimal representation\n *\n * @param gweiDecimal - The value in Gwei as a string or number\n * @returns The value in Wei as a string\n *\n * @example\n * // Convert 1.5 Gwei to Wei\n * gweiDecimalToWeiDecimal(\"1.5\")\n * // Returns \"1500000000\"\n */\nexport function gweiDecimalToWeiDecimal(gweiDecimal: string | number): string {\n const weiValue = Number(gweiDecimal) * 1e9;\n\n return weiValue.toString().split('.')[0];\n}\n\n/**\n * Determine whether saved (advanced) gas fee preferences should be ignored in\n * favour of the suggested gas fees, as the saved custom `maxBaseFee` is below\n * the current low estimate and hence unlikely to result in timely inclusion in\n * a block. Level-based saved preferences track current estimates and are never\n * ignored.\n *\n * @param savedGasFees - The saved gas fee preferences.\n * @param suggestedGasFees - The suggested gas fees.\n * @param request - The request object.\n * @returns Whether the saved gas fee preferences should be ignored.\n */\nfunction shouldIgnoreUnderpricedSavedGasFees(\n savedGasFees: SavedGasFees | undefined,\n suggestedGasFees: SuggestedGasFees,\n request: UpdateGasFeesRequest,\n): boolean {\n const { eip1559, messenger, txMeta } = request;\n\n if (\n !eip1559 ||\n !savedGasFees?.maxBaseFee ||\n !getReplaceUnderpricedSavedGasFeesEnabled(txMeta.chainId, messenger)\n ) {\n return false;\n }\n\n const lowMaxFeePerGas = suggestedGasFees.low?.maxFeePerGas;\n\n const hasReplacement =\n Boolean(suggestedGasFees.maxFeePerGas) &&\n Boolean(suggestedGasFees.maxPriorityFeePerGas);\n\n if (!lowMaxFeePerGas || !hasReplacement) {\n return false;\n }\n\n return isFeeBelowLowEstimate(\n gweiDecimalToWeiHex(savedGasFees.maxBaseFee),\n lowMaxFeePerGas,\n );\n}\n\n/**\n * Determine whether a fee value is below the low estimate.\n *\n * @param valueHex - The fee value as a hex string.\n * @param lowMaxFeePerGasHex - The low estimate `maxFeePerGas` as a hex string.\n * @returns Whether the fee value is below the low estimate.\n */\nfunction isFeeBelowLowEstimate(\n valueHex: string,\n lowMaxFeePerGasHex: string,\n): boolean {\n try {\n return BigInt(valueHex) < BigInt(lowMaxFeePerGasHex);\n } catch {\n return false;\n }\n}\n\n/**\n * Determine whether dapp-suggested gas fees should be ignored in favour of the\n * suggested gas fees, as the dapp-suggested `maxFeePerGas` is below the current\n * low estimate and hence unlikely to result in timely inclusion in a block.\n *\n * @param request - The request object.\n * @returns Whether the dapp-suggested gas fees should be ignored.\n */\nfunction shouldIgnoreDappGasFees(request: GetGasFeeRequest): boolean {\n const {\n eip1559,\n initialParams,\n messenger,\n savedGasFees,\n suggestedGasFees,\n txMeta,\n } = request;\n\n if (\n !eip1559 ||\n savedGasFees ||\n txMeta.isInternal ||\n !getReplaceUnderpricedDappGasFeesEnabled(txMeta.chainId, messenger)\n ) {\n return false;\n }\n\n const dappMaxFeePerGas =\n initialParams.maxFeePerGas ??\n (initialParams.gasPrice && !initialParams.maxPriorityFeePerGas\n ? initialParams.gasPrice\n : undefined);\n\n const lowMaxFeePerGas = suggestedGasFees.low?.maxFeePerGas;\n\n const hasReplacement =\n Boolean(suggestedGasFees.maxFeePerGas) &&\n Boolean(suggestedGasFees.maxPriorityFeePerGas);\n\n if (!dappMaxFeePerGas || !lowMaxFeePerGas || !hasReplacement) {\n return false;\n }\n\n return isFeeBelowLowEstimate(dappMaxFeePerGas, lowMaxFeePerGas);\n}\n\n/**\n * Determine the maxFeePerGas value for the transaction.\n *\n * @param request - The request object.\n * @returns The maxFeePerGas value.\n */\nfunction getMaxFeePerGas(request: GetGasFeeRequest): string | undefined {\n const { savedGasFees, eip1559, initialParams, suggestedGasFees } = request;\n\n if (!eip1559) {\n return undefined;\n }\n\n if (savedGasFees?.maxBaseFee) {\n const maxFeePerGas = gweiDecimalToWeiHex(savedGasFees.maxBaseFee);\n log('Using maxFeePerGas from savedGasFees', maxFeePerGas);\n return maxFeePerGas;\n }\n\n const ignoreDappGasFees = shouldIgnoreDappGasFees(request);\n\n if (initialParams.maxFeePerGas && !ignoreDappGasFees) {\n log('Using maxFeePerGas from request', initialParams.maxFeePerGas);\n return initialParams.maxFeePerGas;\n }\n\n if (\n initialParams.gasPrice &&\n !initialParams.maxPriorityFeePerGas &&\n !ignoreDappGasFees\n ) {\n log(\n 'Setting maxFeePerGas to gasPrice from request',\n initialParams.gasPrice,\n );\n return initialParams.gasPrice;\n }\n\n if (ignoreDappGasFees) {\n log(\n 'Ignoring dapp-suggested maxFeePerGas below low estimate',\n initialParams.maxFeePerGas ?? initialParams.gasPrice,\n suggestedGasFees.low?.maxFeePerGas,\n );\n }\n\n if (suggestedGasFees.maxFeePerGas) {\n log('Using suggested maxFeePerGas', suggestedGasFees.maxFeePerGas);\n return suggestedGasFees.maxFeePerGas;\n }\n\n if (suggestedGasFees.gasPrice) {\n log(\n 'Setting maxFeePerGas to suggested gasPrice',\n suggestedGasFees.gasPrice,\n );\n return suggestedGasFees.gasPrice;\n }\n\n log('maxFeePerGas not set');\n return undefined;\n}\n\n/**\n * Determine the maxPriorityFeePerGas value for the transaction.\n *\n * @param request - The request object.\n * @returns The maxPriorityFeePerGas value.\n */\nfunction getMaxPriorityFeePerGas(\n request: GetGasFeeRequest,\n): string | undefined {\n const { eip1559, initialParams, savedGasFees, suggestedGasFees, txMeta } =\n request;\n\n if (!eip1559) {\n return undefined;\n }\n\n if (savedGasFees?.priorityFee) {\n const maxPriorityFeePerGas = gweiDecimalToWeiHex(savedGasFees.priorityFee);\n log(\n 'Using maxPriorityFeePerGas from savedGasFees.priorityFee',\n maxPriorityFeePerGas,\n );\n return maxPriorityFeePerGas;\n }\n\n const ignoreDappGasFees = shouldIgnoreDappGasFees(request);\n\n if (initialParams.maxPriorityFeePerGas && !ignoreDappGasFees) {\n log(\n 'Using maxPriorityFeePerGas from request',\n initialParams.maxPriorityFeePerGas,\n );\n return initialParams.maxPriorityFeePerGas;\n }\n\n if (\n initialParams.gasPrice &&\n !initialParams.maxFeePerGas &&\n !ignoreDappGasFees\n ) {\n log(\n 'Setting maxPriorityFeePerGas to gasPrice from request',\n initialParams.gasPrice,\n );\n return initialParams.gasPrice;\n }\n\n if (suggestedGasFees.maxPriorityFeePerGas) {\n log(\n 'Using suggested maxPriorityFeePerGas',\n suggestedGasFees.maxPriorityFeePerGas,\n );\n return suggestedGasFees.maxPriorityFeePerGas;\n }\n\n if (txMeta.txParams.maxFeePerGas) {\n log(\n 'Setting maxPriorityFeePerGas to maxFeePerGas',\n txMeta.txParams.maxFeePerGas,\n );\n return txMeta.txParams.maxFeePerGas;\n }\n\n log('maxPriorityFeePerGas not set');\n return undefined;\n}\n\n/**\n * Determine the gasPrice value for the transaction.\n *\n * @param request - The request object.\n * @returns The gasPrice value.\n */\nfunction getGasPrice(request: GetGasFeeRequest): string | undefined {\n const { eip1559, initialParams, savedGasFees, suggestedGasFees } = request;\n\n if (eip1559) {\n return undefined;\n }\n\n if (savedGasFees?.gasPrice) {\n const gasPrice = gweiDecimalToWeiHex(savedGasFees.gasPrice);\n log('Using gasPrice from savedGasFees.gasPrice', gasPrice);\n return gasPrice;\n }\n\n if (initialParams.gasPrice) {\n log('Using gasPrice from request', initialParams.gasPrice);\n return initialParams.gasPrice;\n }\n\n if (suggestedGasFees.maxFeePerGas) {\n log('Using suggested maxFeePerGas', suggestedGasFees.maxFeePerGas);\n return suggestedGasFees.maxFeePerGas;\n }\n\n if (suggestedGasFees.gasPrice) {\n log('Using suggested gasPrice', suggestedGasFees.gasPrice);\n return suggestedGasFees.gasPrice;\n }\n\n log('gasPrice not set');\n return undefined;\n}\n\n/**\n * Determine the user fee level.\n *\n * @param request - The request object.\n * @returns The user fee level.\n */\nfunction getUserFeeLevel(request: GetGasFeeRequest): string | undefined {\n const { initialParams, savedGasFees, suggestedGasFees, txMeta } = request;\n\n if (savedGasFees) {\n const hasCustomOverride =\n savedGasFees.maxBaseFee !== undefined ||\n savedGasFees.priorityFee !== undefined ||\n savedGasFees.gasPrice !== undefined;\n\n const canUseSavedLevel =\n !hasCustomOverride &&\n savedGasFees.level !== undefined &&\n suggestedGasFees.isEstimateLevelApplied;\n\n // A custom override on any field, or an estimate type that does not\n // support per-level pricing (e.g. a flat eth_gasPrice value), means the\n // fee is no longer purely level-derived, so it must not be tracked as a\n // live estimate level by the gas fee poller, which would otherwise\n // overwrite the override or misrepresent the fee as matching the level.\n return canUseSavedLevel ? savedGasFees.level : UserFeeLevel.CUSTOM;\n }\n\n // Underpriced dapp-suggested fees are replaced with the suggested medium\n // values, so also use the medium fee level to keep the values updated while\n // the transaction is unapproved.\n if (shouldIgnoreDappGasFees(request)) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (\n !initialParams.maxFeePerGas &&\n !initialParams.maxPriorityFeePerGas &&\n initialParams.gasPrice\n ) {\n return txMeta.isInternal\n ? UserFeeLevel.CUSTOM\n : UserFeeLevel.DAPP_SUGGESTED;\n }\n\n if (\n !initialParams.maxFeePerGas &&\n !initialParams.maxPriorityFeePerGas &&\n suggestedGasFees.maxFeePerGas &&\n suggestedGasFees.maxPriorityFeePerGas\n ) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (\n !initialParams.maxFeePerGas &&\n !initialParams.maxPriorityFeePerGas &&\n suggestedGasFees.gasPrice\n ) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (txMeta.isInternal) {\n return UserFeeLevel.MEDIUM;\n }\n\n return UserFeeLevel.DAPP_SUGGESTED;\n}\n\n/**\n * Update the default gas estimates for the provided transaction.\n *\n * @param txMeta - The transaction metadata.\n */\nfunction updateDefaultGasEstimates(txMeta: TransactionMeta): void {\n txMeta.defaultGasEstimates ??= {};\n txMeta.defaultGasEstimates.maxFeePerGas = txMeta.txParams.maxFeePerGas;\n\n txMeta.defaultGasEstimates.maxPriorityFeePerGas =\n txMeta.txParams.maxPriorityFeePerGas;\n\n txMeta.defaultGasEstimates.gasPrice = txMeta.txParams.gasPrice;\n txMeta.defaultGasEstimates.estimateType = txMeta.userFeeLevel;\n}\n\n/**\n * Retrieve the suggested gas fees using the gas fee flows.\n *\n * @param request - The request object.\n * @returns The suggested gas fees.\n */\nasync function getSuggestedGasFees(\n request: UpdateGasFeesRequest & { savedGasFees?: SavedGasFees },\n): Promise<SuggestedGasFees> {\n const {\n eip1559,\n gasFeeFlows,\n getGasFeeEstimates,\n messenger,\n savedGasFees,\n txMeta,\n } = request;\n const { networkClientId } = txMeta;\n\n const hasCompleteDappFees =\n eip1559 &&\n Boolean(txMeta.txParams.maxFeePerGas) &&\n Boolean(txMeta.txParams.maxPriorityFeePerGas);\n\n // Estimates are still required for transactions with complete dapp-suggested\n // fees if they may be replaced due to being underpriced.\n const isEstimateRequiredForDappFees =\n hasCompleteDappFees &&\n !txMeta.isInternal &&\n getReplaceUnderpricedDappGasFeesEnabled(txMeta.chainId, messenger);\n\n if (\n (!eip1559 && txMeta.txParams.gasPrice) ||\n (hasCompleteDappFees && !isEstimateRequiredForDappFees)\n ) {\n return {};\n }\n\n const gasFeeFlow = getGasFeeFlow(\n txMeta,\n gasFeeFlows,\n messenger,\n ) as GasFeeFlow;\n\n try {\n const gasFeeControllerData = await getGasFeeEstimates({ networkClientId });\n\n const response = await gasFeeFlow.getGasFees({\n gasFeeControllerData,\n messenger,\n transactionMeta: txMeta,\n });\n\n const gasFeeEstimateType = response.estimates?.type;\n const savedGasFeeEstimateLevel = getSavedGasFeeEstimateLevel(savedGasFees);\n\n switch (gasFeeEstimateType) {\n case GasFeeEstimateType.FeeMarket:\n return {\n ...(response.estimates[savedGasFeeEstimateLevel] ??\n response.estimates.medium),\n isEstimateLevelApplied: true,\n low: response.estimates.low,\n };\n case GasFeeEstimateType.Legacy:\n return {\n gasPrice:\n response.estimates[savedGasFeeEstimateLevel] ??\n response.estimates.medium,\n isEstimateLevelApplied: true,\n };\n case GasFeeEstimateType.GasPrice:\n return {\n gasPrice: response.estimates.gasPrice,\n isEstimateLevelApplied: false,\n };\n default:\n throw new Error(\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Unsupported gas fee estimate type returned from flow: ${gasFeeEstimateType}`,\n );\n }\n } catch (error) {\n log('Failed to get suggested gas fees', error);\n }\n\n // Estimates on this path are only needed to check complete dapp-suggested\n // fees, so no fallback is required and any failure must not block\n // transaction creation.\n if (hasCompleteDappFees) {\n return {};\n }\n\n const gasPriceHex = (await rpcRequest({\n messenger,\n networkClientId,\n method: 'eth_gasPrice',\n })) as Hex | undefined;\n\n const gasPrice = gasPriceHex ? add0x(gasPriceHex) : undefined;\n\n return { gasPrice };\n}\n\nfunction hasInitialGasFeeParams(initialParams: TransactionParams): boolean {\n return [\n initialParams.maxFeePerGas,\n initialParams.maxPriorityFeePerGas,\n initialParams.gasPrice,\n ].some(Boolean);\n}\n\nfunction getSavedGasFeeEstimateLevel(\n savedGasFees: SavedGasFees | undefined,\n): GasFeeEstimateLevel {\n return isGasFeeEstimateLevel(savedGasFees?.level)\n ? savedGasFees.level\n : GasFeeEstimateLevel.Medium;\n}\n\nfunction isGasFeeEstimateLevel(level: unknown): level is GasFeeEstimateLevel {\n return Object.values(GasFeeEstimateLevel).includes(\n level as GasFeeEstimateLevel,\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-flow.d.ts","sourceRoot":"","sources":["../../src/utils/gas-flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAElF,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAEhB,MAAM,aAAa,CAAC;AAErB,KAAK,2BAA2B,GAAG;IACjC,yBAAyB,EACrB,eAAe,GACf,sBAAsB,GACtB,mBAAmB,CAAC;IACxB,0BAA0B,EACtB,wBAAwB,GACxB,qBAAqB,GACrB,uBAAuB,CAAC;CAC7B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,8BAA8B,GACxC,UAAU,GAAG,SAAS,CAIxB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,yBAAyB,EACzB,0BAA0B,GAC3B,EAAE,2BAA2B,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAiC9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-flow.js","sourceRoot":"","sources":["../../src/utils/gas-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAU7D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAuBtE;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,eAAgC,EAChC,WAAyB,EACzB,SAAyC;IAEzC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CACrC,UAAU,CAAC,kBAAkB,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,yBAAyB,EACzB,0BAA0B,GACE;IAC5B,MAAM,uBAAuB,GAAG,0BAA0B,CAAC,IAAI,CAAC;IAEhE,IAAI,uBAAuB,KAAK,kBAAkB,CAAC,SAAS,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAC9C,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAClB,GAAG,MAAM;YACT,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAC5B,yBAA6C,EAAE,CAAC,KAAK,CAAC,EACvD,0BAA0B,CAAC,KAAK,CAAC,CAClC;SACF,CAAC,EACF,EAAE,GAAG,yBAAyB,EAAqB,CACpD,CAAC;IACJ,CAAC;IAED,IAAI,uBAAuB,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAC9C,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAClB,GAAG,MAAM;YACT,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,CAAC;SAC9D,CAAC,EACF,EAA4B,CAC7B,CAAC;IACJ,CAAC;IAED,IAAI,uBAAuB,KAAK,kBAAkB,CAAC,QAAQ,EAAE,CAAC;QAC5D,OAAO;YACL,QAAQ,EAAE,mBAAmB,CAAC,0BAA0B,CAAC;SAC1D,CAAC;IACJ,CAAC;IAED,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,wBAAmD,EACnD,yBAA0D;IAE1D,OAAO;QACL,GAAG,wBAAwB;QAC3B,qBAAqB,EAAE,eAAe,CACpC,yBAAyB,CAAC,YAAY,CACvC;QACD,6BAA6B,EAAE,eAAe,CAC5C,yBAAyB,CAAC,oBAAoB,CAC/C;KACe,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,yBAAgD,EAChD,KAA0B;IAE1B,OAAO,eAAe,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,yBAAkD;IAElD,OAAO,eAAe,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import { weiHexToGweiDec } from '@metamask/controller-utils';\nimport type {\n Eip1559GasFee,\n EthGasPriceEstimate,\n GasFeeEstimates,\n LegacyGasPriceEstimate,\n} from '@metamask/gas-fee-controller';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\n\nimport type { TransactionControllerMessenger } from '../TransactionController.js';\nimport { GasFeeEstimateLevel, GasFeeEstimateType } from '../types.js';\nimport type {\n FeeMarketGasFeeEstimates,\n GasPriceGasFeeEstimates,\n LegacyGasFeeEstimates,\n} from '../types.js';\nimport type {\n GasFeeFlow,\n TransactionMeta,\n FeeMarketGasFeeEstimateForLevel,\n} from '../types.js';\n\ntype MergeGasFeeEstimatesRequest = {\n gasFeeControllerEstimates:\n | GasFeeEstimates\n | LegacyGasPriceEstimate\n | EthGasPriceEstimate;\n transactionGasFeeEstimates:\n | FeeMarketGasFeeEstimates\n | LegacyGasFeeEstimates\n | GasPriceGasFeeEstimates;\n};\n\n/**\n * Returns the first gas fee flow that matches the transaction.\n *\n * @param transactionMeta - The transaction metadata to find a gas fee flow for.\n * @param gasFeeFlows - The gas fee flows to search.\n * @param messenger - The messenger instance.\n * @returns The first gas fee flow that matches the transaction, or undefined if none match.\n */\nexport function getGasFeeFlow(\n transactionMeta: TransactionMeta,\n gasFeeFlows: GasFeeFlow[],\n messenger: TransactionControllerMessenger,\n): GasFeeFlow | undefined {\n return gasFeeFlows.find((gasFeeFlow) =>\n gasFeeFlow.matchesTransaction({ transactionMeta, messenger }),\n );\n}\n\n/**\n * Merge the gas fee estimates from the gas fee controller with the gas fee estimates from a transaction.\n *\n * @param request - Data required to merge gas fee estimates.\n * @param request.gasFeeControllerEstimates - Gas fee estimates from the GasFeeController.\n * @param request.transactionGasFeeEstimates - Gas fee estimates from the transaction.\n * @returns The merged gas fee estimates.\n */\nexport function mergeGasFeeEstimates({\n gasFeeControllerEstimates,\n transactionGasFeeEstimates,\n}: MergeGasFeeEstimatesRequest): GasFeeState['gasFeeEstimates'] {\n const transactionEstimateType = transactionGasFeeEstimates.type;\n\n if (transactionEstimateType === GasFeeEstimateType.FeeMarket) {\n return Object.values(GasFeeEstimateLevel).reduce(\n (result, level) => ({\n ...result,\n [level]: mergeFeeMarketEstimate(\n (gasFeeControllerEstimates as GasFeeEstimates)?.[level],\n transactionGasFeeEstimates[level],\n ),\n }),\n { ...gasFeeControllerEstimates } as GasFeeEstimates,\n );\n }\n\n if (transactionEstimateType === GasFeeEstimateType.Legacy) {\n return Object.values(GasFeeEstimateLevel).reduce(\n (result, level) => ({\n ...result,\n [level]: getLegacyEstimate(transactionGasFeeEstimates, level),\n }),\n {} as LegacyGasPriceEstimate,\n );\n }\n\n if (transactionEstimateType === GasFeeEstimateType.GasPrice) {\n return {\n gasPrice: getGasPriceEstimate(transactionGasFeeEstimates),\n };\n }\n\n return gasFeeControllerEstimates;\n}\n\n/**\n * Merge a specific priority level of EIP-1559 gas fee estimates.\n *\n * @param gasFeeControllerEstimate - The gas fee estimate from the gas fee controller.\n * @param transactionGasFeeEstimate - The gas fee estimate from the transaction.\n * @returns The merged gas fee estimate.\n */\nfunction mergeFeeMarketEstimate(\n gasFeeControllerEstimate: Eip1559GasFee | undefined,\n transactionGasFeeEstimate: FeeMarketGasFeeEstimateForLevel,\n): Eip1559GasFee {\n return {\n ...gasFeeControllerEstimate,\n suggestedMaxFeePerGas: weiHexToGweiDec(\n transactionGasFeeEstimate.maxFeePerGas,\n ),\n suggestedMaxPriorityFeePerGas: weiHexToGweiDec(\n transactionGasFeeEstimate.maxPriorityFeePerGas,\n ),\n } as Eip1559GasFee;\n}\n\n/**\n * Generate a specific priority level for a legacy gas fee estimate.\n *\n * @param transactionGasFeeEstimate - The gas fee estimate from the transaction.\n * @param level - The gas fee estimate level.\n * @returns The legacy gas fee estimate.\n */\nfunction getLegacyEstimate(\n transactionGasFeeEstimate: LegacyGasFeeEstimates,\n level: GasFeeEstimateLevel,\n): string {\n return weiHexToGweiDec(transactionGasFeeEstimate[level]);\n}\n\n/**\n * Generate the value for a gas price gas fee estimate.\n *\n * @param transactionGasFeeEstimate - The gas fee estimate from the transaction.\n * @returns The legacy gas fee estimate.\n */\nfunction getGasPriceEstimate(\n transactionGasFeeEstimate: GasPriceGasFeeEstimates,\n): string {\n return weiHexToGweiDec(transactionGasFeeEstimate.gasPrice);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas.js","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BNToHex,\n fractionBN,\n hexToBN,\n toHex,\n} from '@metamask/controller-utils';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport {\n add0x,\n createModuleLogger,\n isStrictHexString,\n remove0x,\n} from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { simulateTransactions } from '../api/simulation-api.js';\nimport { projectLogger } from '../logger.js';\nimport type { TransactionControllerMessenger } from '../TransactionController.js';\nimport { TransactionEnvelopeType } from '../types.js';\nimport type {\n AuthorizationList,\n BatchTransactionParams,\n GetSimulationConfig,\n IsAtomicBatchSupportedRequest,\n IsAtomicBatchSupportedResult,\n Revert,\n TransactionBatchSingleRequest,\n TransactionMeta,\n TransactionParams,\n} from '../types.js';\nimport {\n DELEGATION_PREFIX,\n doesAccountSupportEIP7702,\n generateEIP7702BatchTransaction,\n} from './eip7702.js';\nimport {\n getGasEstimateBuffer,\n getGasEstimateFallback,\n} from './feature-flags.js';\nimport { getChainId, rpcRequest } from './provider.js';\nimport { decodeRevert } from './revert-reason.js';\n\nexport type UpdateGasRequest = {\n isCustomNetwork: boolean;\n isSimulationEnabled: boolean;\n getSimulationConfig: GetSimulationConfig;\n messenger: TransactionControllerMessenger;\n txMeta: TransactionMeta;\n};\n\nexport type EstimateGasBatchResult = {\n gasLimits: number[];\n requiresAuthorizationList?: true;\n totalGasLimit: number;\n};\n\nexport const log = createModuleLogger(projectLogger, 'gas');\n\nexport const FIXED_GAS = '0x5208';\nexport const DEFAULT_GAS_MULTIPLIER = 1.5;\nexport const MAX_GAS_BLOCK_PERCENT = 90;\nexport const INTRINSIC_GAS = 21000;\n\nexport const DUMMY_AUTHORIZATION_SIGNATURE =\n '0x1111111111111111111111111111111111111111111111111111111111111111';\n\n/**\n * Populate the gas properties of the provided transaction meta.\n *\n * @param request - The request object including the necessary parameters.\n */\nexport async function updateGas(request: UpdateGasRequest): Promise<void> {\n const { txMeta } = request;\n const initialParams = { ...txMeta.txParams };\n\n const [gas, simulationFails, gasLimitNoBuffer, gasRevert] =\n await getGas(request);\n\n txMeta.txParams.gas = gas;\n txMeta.simulationFails = simulationFails;\n txMeta.gasLimitNoBuffer = gasLimitNoBuffer;\n\n if (gasRevert) {\n txMeta.revert = { ...txMeta.revert, gas: gasRevert };\n }\n\n if (!initialParams.gas) {\n txMeta.originalGasEstimate = txMeta.txParams.gas;\n }\n\n txMeta.defaultGasEstimates ??= {};\n txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;\n}\n\n/**\n * Estimate the gas for the provided transaction parameters.\n * If the gas estimate fails, the fallback value is returned.\n *\n * @param options - The options object.\n * @param options.ignoreDelegationSignatures - Ignore signature errors if submitting delegations to the DelegationManager.\n * @param options.isSimulationEnabled - Whether the simulation is enabled.\n * @param options.getSimulationConfig - The function to get the simulation configuration.\n * @param options.messenger - The messenger instance for communication.\n * @param options.networkClientId - The network client ID.\n * @param options.txParams - The transaction parameters.\n * @returns The estimated gas and related info.\n */\nexport async function estimateGas({\n ignoreDelegationSignatures,\n isSimulationEnabled,\n getSimulationConfig,\n messenger,\n networkClientId,\n txParams,\n}: {\n ignoreDelegationSignatures?: boolean;\n isSimulationEnabled: boolean;\n getSimulationConfig: GetSimulationConfig;\n messenger: TransactionControllerMessenger;\n networkClientId: NetworkClientId;\n txParams: TransactionParams;\n}): Promise<{\n blockGasLimit: string;\n estimatedGas: string;\n gasRevert?: Revert;\n isUpgradeWithData: boolean;\n simulationFails: TransactionMeta['simulationFails'];\n}> {\n const request = { ...txParams };\n const { authorizationList, data, value } = request;\n const chainId = getChainId({ messenger, networkClientId });\n\n if (ignoreDelegationSignatures && !isSimulationEnabled) {\n throw new Error(\n 'Gas estimation with ignored delegation signatures is not supported as simulation disabled',\n );\n }\n\n const { gasLimit: blockGasLimit, number: blockNumber } = await getLatestBlock(\n messenger,\n networkClientId,\n );\n\n const blockGasLimitBN = hexToBN(blockGasLimit);\n const { percentage, fixed, maxGasLimit } = getGasEstimateFallback(\n chainId,\n messenger,\n );\n\n const uncappedFallback = fixed\n ? toHex(fixed)\n : BNToHex(fractionBN(blockGasLimitBN, percentage, 100));\n\n // Clamp the fallback to the chain's per-transaction gas cap so it can never\n // exceed the gas limit the RPC will accept. Without this, a percentage of a\n // high block gas limit can overshoot the cap (e.g. 35% of Polygon's ~140M\n // block limit is ~49M, but the node caps a tx at ~33.5M and rejects it with\n // \"transaction gas limit too high\").\n const fallback =\n maxGasLimit !== undefined &&\n hexToBN(uncappedFallback).gt(hexToBN(toHex(maxGasLimit)))\n ? toHex(maxGasLimit)\n : uncappedFallback;\n\n log('Estimation fallback values', fallback);\n\n request.data = data ? add0x(data) : data;\n request.value = normalizeValue(value);\n\n request.authorizationList = normalizeAuthorizationList(\n request.authorizationList,\n chainId,\n );\n\n delete request.gasPrice;\n delete request.maxFeePerGas;\n delete request.maxPriorityFeePerGas;\n\n let estimatedGas = fallback;\n let simulationFails: TransactionMeta['simulationFails'];\n let gasRevert: Revert | undefined;\n\n const isUpgradeWithData =\n txParams.type === TransactionEnvelopeType.setCode &&\n Boolean(authorizationList?.length) &&\n Boolean(data) &&\n data !== '0x';\n\n try {\n if (isSimulationEnabled && isUpgradeWithData) {\n estimatedGas = await estimateGasUpgradeWithDataToSelf(\n request,\n messenger,\n networkClientId,\n chainId,\n getSimulationConfig,\n );\n } else if (ignoreDelegationSignatures && isSimulationEnabled) {\n estimatedGas = await simulateGas({\n chainId,\n getSimulationConfig,\n transaction: request,\n });\n } else {\n estimatedGas = await estimateGasNode(messenger, networkClientId, request);\n }\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,\n },\n };\n\n gasRevert = decodeRevert(error, 'gas');\n\n log('Estimation failed', { ...simulationFails, fallback, gasRevert });\n }\n\n return {\n blockGasLimit,\n estimatedGas,\n gasRevert,\n isUpgradeWithData,\n simulationFails,\n };\n}\n\n/**\n * Sum caller-provided gas limits across a batch.\n *\n * If every transaction in the batch already has a `gas` value, returns the\n * parsed per-tx limits and their sum. Otherwise returns `undefined`.\n *\n * Used by `estimateGasBatch`:\n * - non-7702 path: short-circuits simulation entirely when present.\n * - EIP-7702 path: used as a fallback when simulation fails — required for\n * callers that submit batches whose individual sub-calls cannot be simulated\n * standalone (e.g. predict-withdraw, where the batch's first sub-call\n * provides source-token balance to subsequent sub-calls). When 7702\n * simulation succeeds it is preferred since the bundled call has no per-tx\n * intrinsic gas cost and produces a tighter estimate.\n *\n * @param transactions - Batch transactions to inspect.\n * @returns Parsed gas limits and total when every transaction has gas; otherwise `undefined`.\n */\nexport function getProvidedBatchGasLimits(\n transactions: BatchTransactionParams[],\n): { gasLimits: number[]; totalGasLimit: number } | undefined {\n if (!transactions.every((transaction) => transaction.gas !== undefined)) {\n return undefined;\n }\n\n const gasLimits = transactions.map((transaction) =>\n new BigNumber(transaction.gas as Hex).toNumber(),\n );\n const totalGasLimit = gasLimits.reduce((acc, gasLimit) => acc + gasLimit, 0);\n\n return { gasLimits, totalGasLimit };\n}\n\nexport async function estimateGasBatch({\n from,\n getSimulationConfig,\n isAtomicBatchSupported,\n messenger,\n networkClientId,\n transactions,\n}: {\n from: Hex;\n getSimulationConfig: GetSimulationConfig;\n isAtomicBatchSupported: (\n request: IsAtomicBatchSupportedRequest,\n ) => Promise<IsAtomicBatchSupportedResult>;\n messenger: TransactionControllerMessenger;\n networkClientId: NetworkClientId;\n transactions: BatchTransactionParams[];\n}): Promise<EstimateGasBatchResult> {\n const chainId = getChainId({ messenger, networkClientId });\n\n const is7702Result = await isAtomicBatchSupported({\n address: from,\n chainIds: [chainId],\n });\n\n const accountSupports7702 = doesAccountSupportEIP7702(messenger, from);\n\n const chainResult = accountSupports7702\n ? is7702Result.find((result) => result.chainId === chainId)\n : undefined;\n\n const isUpgradeRequired = Boolean(chainResult && !chainResult.isSupported);\n\n if (isUpgradeRequired && !chainResult?.upgradeContractAddress) {\n throw new Error('Upgrade contract address not found');\n }\n\n if (chainResult) {\n const providedBatchGasLimits = getProvidedBatchGasLimits(transactions);\n\n const authorizationList = isUpgradeRequired\n ? [{ address: chainResult.upgradeContractAddress as Hex }]\n : undefined;\n\n const type = isUpgradeRequired\n ? TransactionEnvelopeType.setCode\n : undefined;\n\n const params: TransactionParams = {\n ...generateEIP7702BatchTransaction(from, transactions),\n authorizationList,\n from,\n type,\n };\n\n // Prefer real EIP-7702 simulation when it succeeds — the bundled call has\n // no per-tx intrinsic gas cost so the estimate is typically lower than\n // summing per-tx provided limits. Fall back to the provided sum when the\n // node-level simulation fails (e.g. predict-withdraw, where the batch's\n // first sub-call provides source-token balance to subsequent sub-calls).\n const { estimatedGas: gasLimitHex, simulationFails } = await estimateGas({\n isSimulationEnabled: true,\n getSimulationConfig,\n messenger,\n networkClientId,\n txParams: params,\n });\n\n if (simulationFails && providedBatchGasLimits) {\n log(\n 'EIP-7702 estimation failed, using batch parameter gas limits',\n providedBatchGasLimits,\n simulationFails,\n );\n return {\n gasLimits: [providedBatchGasLimits.totalGasLimit],\n ...(isUpgradeRequired ? { requiresAuthorizationList: true } : {}),\n totalGasLimit: providedBatchGasLimits.totalGasLimit,\n };\n }\n\n const totalGasLimit = new BigNumber(gasLimitHex).toNumber();\n\n log('Estimated EIP-7702 gas limit', totalGasLimit);\n\n return {\n gasLimits: [totalGasLimit],\n ...(isUpgradeRequired ? { requiresAuthorizationList: true } : {}),\n totalGasLimit,\n };\n }\n\n const providedBatchGasLimits = getProvidedBatchGasLimits(transactions);\n if (providedBatchGasLimits) {\n log('Using batch parameter gas limits', providedBatchGasLimits);\n return providedBatchGasLimits;\n }\n\n const { gasLimits: gasLimitsHex } = await simulateGasBatch({\n chainId,\n from,\n getSimulationConfig,\n transactions: transactions.map((transaction) => ({\n params: transaction,\n })),\n });\n\n const gasLimits = transactions.map((transaction, index) =>\n transaction.gas\n ? new BigNumber(transaction.gas).toNumber()\n : new BigNumber(gasLimitsHex[index]).toNumber(),\n );\n\n const totalGasLimit = gasLimits.reduce((acc, gasLimit) => acc + gasLimit, 0);\n\n log('Simulated batch gas limits', { totalGasLimit, gasLimits });\n\n return { totalGasLimit, gasLimits };\n}\n\n/**\n * Add a buffer to the provided estimated gas.\n * The buffer is calculated based on the block gas limit and a multiplier.\n *\n * @param estimatedGas - The estimated gas.\n * @param blockGasLimit - The block gas limit.\n * @param multiplier - The multiplier to apply to the estimated gas.\n * @returns The gas with the buffer applied.\n */\nexport function addGasBuffer(\n estimatedGas: string,\n blockGasLimit: string,\n multiplier: number,\n): string {\n const estimatedGasBN = hexToBN(estimatedGas);\n\n const maxGasBN = fractionBN(\n hexToBN(blockGasLimit),\n MAX_GAS_BLOCK_PERCENT,\n 100,\n );\n\n const paddedGasBN = fractionBN(estimatedGasBN, multiplier * 100, 100);\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\n/**\n * Simulate the required gas for a batch of transactions using the simulation API.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID of the transactions.\n * @param options.from - The address of the sender.\n * @param options.getSimulationConfig - The function to get the simulation configuration.\n * @param options.transactions - The array of transactions within a batch request.\n * @returns An object containing the transactions with their gas limits and the total gas limit.\n */\nexport async function simulateGasBatch({\n chainId,\n from,\n getSimulationConfig,\n transactions,\n}: {\n chainId: Hex;\n from: Hex;\n getSimulationConfig: GetSimulationConfig;\n transactions: TransactionBatchSingleRequest[];\n}): Promise<{ totalGasLimit: Hex; gasLimits: Hex[] }> {\n try {\n const response = await simulateTransactions(chainId, {\n getSimulationConfig,\n transactions: transactions.map((transaction) => ({\n ...transaction.params,\n from,\n })),\n });\n\n if (response?.transactions?.length !== transactions.length) {\n throw new Error('Simulation response does not match transaction count');\n }\n\n return response.transactions.reduce<{\n totalGasLimit: Hex;\n gasLimits: Hex[];\n }>(\n (acc, transaction) => {\n const gasLimit = transaction?.gasLimit;\n\n if (!gasLimit) {\n throw new Error(\n 'No simulated gas returned for one of the transactions',\n );\n }\n\n acc.gasLimits.push(gasLimit);\n\n acc.totalGasLimit = BNToHex(\n hexToBN(acc.totalGasLimit).add(hexToBN(gasLimit)),\n );\n\n return acc;\n },\n {\n totalGasLimit: '0x0',\n gasLimits: [],\n },\n );\n } catch (error: unknown) {\n log('Error while simulating gas batch', error);\n throw new Error(\n 'Cannot estimate transaction batch total gas as simulation failed',\n );\n }\n}\n\n/**\n * Determine the gas for the provided request.\n *\n * @param request - The request object including the necessary parameters.\n * @returns The final gas value and the estimate used.\n */\nasync function getGas(\n request: UpdateGasRequest,\n): Promise<[string, TransactionMeta['simulationFails']?, string?, Revert?]> {\n const {\n isCustomNetwork,\n isSimulationEnabled,\n getSimulationConfig,\n messenger,\n txMeta,\n } = request;\n const { networkClientId } = txMeta;\n const chainId = getChainId({ messenger, networkClientId });\n const { disableGasBuffer } = txMeta;\n\n if (txMeta.txParams.gas) {\n log('Using value from request', txMeta.txParams.gas);\n return [txMeta.txParams.gas, undefined, txMeta.txParams.gas];\n }\n\n if (await requiresFixedGas(request)) {\n log('Using fixed value', FIXED_GAS);\n return [FIXED_GAS, undefined, FIXED_GAS];\n }\n\n const {\n blockGasLimit,\n estimatedGas,\n gasRevert,\n isUpgradeWithData,\n simulationFails,\n } = await estimateGas({\n isSimulationEnabled,\n getSimulationConfig,\n messenger,\n networkClientId,\n txParams: txMeta.txParams,\n });\n\n log('Original estimated gas', estimatedGas);\n\n if (simulationFails) {\n log('Using original fallback estimate as simulation failed');\n }\n\n if (disableGasBuffer) {\n log('Gas buffer disabled');\n }\n\n if (simulationFails || disableGasBuffer) {\n return [estimatedGas, simulationFails, estimatedGas, gasRevert];\n }\n\n const bufferMultiplier = getGasEstimateBuffer({\n chainId,\n isCustomRPC: isCustomNetwork,\n isUpgradeWithData,\n messenger,\n });\n\n log('Buffer', bufferMultiplier);\n\n const bufferedGas = addGasBuffer(\n estimatedGas,\n blockGasLimit,\n bufferMultiplier,\n );\n\n log('Buffered gas', bufferedGas);\n\n return [bufferedGas, simulationFails, estimatedGas, gasRevert];\n}\n\n/**\n * Determine if the gas for the provided request should be fixed.\n *\n * @param options - The options object.\n * @param options.messenger - The messenger instance for communication.\n * @param options.txMeta - The transaction meta object.\n * @param options.isCustomNetwork - Whether the network is a custom network.\n * @returns Whether the gas should be fixed.\n */\nasync function requiresFixedGas({\n messenger,\n txMeta,\n isCustomNetwork,\n}: UpdateGasRequest): Promise<boolean> {\n const {\n networkClientId,\n txParams: { to, data, type },\n } = txMeta;\n\n if (\n isCustomNetwork ||\n !to ||\n data ||\n type === TransactionEnvelopeType.setCode\n ) {\n return false;\n }\n\n const code = await getCode(messenger, networkClientId, to);\n\n return !code || code === '0x';\n}\n\n/**\n * Get the contract code for the provided address.\n *\n * @param messenger - The messenger instance for communication.\n * @param networkClientId - The network client ID.\n * @param address - The address to get the code for.\n * @returns The contract code.\n */\nasync function getCode(\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n address: string,\n): Promise<string | undefined> {\n return (await rpcRequest({\n messenger,\n networkClientId,\n method: 'eth_getCode',\n params: [address, 'latest'],\n })) as string | undefined;\n}\n\n/**\n * Get the latest block from the network.\n *\n * @param messenger - The messenger instance for communication.\n * @param networkClientId - The network client ID.\n * @returns The latest block number.\n */\nasync function getLatestBlock(\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n): Promise<{ gasLimit: string; number: string }> {\n return (await rpcRequest({\n messenger,\n networkClientId,\n method: 'eth_getBlockByNumber',\n params: ['latest', false],\n })) as { gasLimit: string; number: string };\n}\n\n/**\n * Estimate the gas for a type 4 transaction.\n *\n * @param txParams - The transaction parameters.\n * @param messenger - The messenger instance for communication.\n * @param networkClientId - The network client ID.\n * @param chainId - The chain ID of the transaction.\n * @param getSimulationConfig - The function to get the simulation configuration.\n * @returns The estimated gas.\n */\nasync function estimateGasUpgradeWithDataToSelf(\n txParams: TransactionParams,\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n chainId: Hex,\n getSimulationConfig: GetSimulationConfig,\n): Promise<Hex> {\n const upgradeGas = (await rpcRequest({\n messenger,\n networkClientId,\n method: 'eth_estimateGas',\n params: [\n {\n ...txParams,\n to: txParams.from,\n data: '0x',\n },\n ],\n })) as Hex;\n\n log('Upgrade only gas', upgradeGas);\n\n const delegationAddress = txParams.authorizationList?.[0].address as Hex;\n\n let executeGas: Hex | undefined;\n\n try {\n executeGas = await simulateGas({\n chainId,\n delegationAddress,\n getSimulationConfig,\n transaction: txParams,\n });\n } catch (error: unknown) {\n log('Error while simulating data portion of upgrade', error);\n }\n\n if (executeGas === undefined) {\n try {\n executeGas = await estimateGasNode(\n messenger,\n networkClientId,\n { ...txParams, authorizationList: undefined, type: undefined },\n delegationAddress,\n );\n } catch (error: unknown) {\n log('Error while estimating data portion of upgrade', error);\n throw error;\n }\n\n log('Success estimating data portion of upgrade', executeGas);\n }\n\n log('Execute gas', executeGas);\n\n const total = BNToHex(\n hexToBN(upgradeGas).add(hexToBN(executeGas)).subn(INTRINSIC_GAS),\n );\n\n log('Total type 4 gas', total);\n\n return total;\n}\n\n/**\n * Simulate the required gas using the simulation API.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID of the transaction.\n * @param options.delegationAddress - The delegation address of the sender to mock.\n * @param options.getSimulationConfig - The function to get the simulation configuration.\n * @param options.transaction - The transaction parameters.\n * @returns The simulated gas.\n */\nasync function simulateGas({\n chainId,\n delegationAddress,\n getSimulationConfig,\n transaction,\n}: {\n chainId: Hex;\n delegationAddress?: Hex;\n getSimulationConfig: GetSimulationConfig;\n transaction: TransactionParams;\n}): Promise<Hex> {\n const response = await simulateTransactions(chainId, {\n getSimulationConfig,\n transactions: [\n {\n to: transaction.to as Hex,\n from: transaction.from as Hex,\n data: transaction.data as Hex,\n value: transaction.value as Hex,\n },\n ],\n overrides: {\n [transaction.from]: {\n code:\n delegationAddress &&\n ((DELEGATION_PREFIX + remove0x(delegationAddress)) as Hex),\n },\n },\n });\n\n const gasLimit = response?.transactions?.[0].gasLimit;\n\n if (!gasLimit) {\n throw new Error('No simulated gas returned');\n }\n\n return gasLimit;\n}\n\n/**\n * Populate the authorization list with dummy values.\n *\n * @param authorizationList - The authorization list to prepare.\n * @param chainId - The chain ID to use.\n * @returns The authorization list with dummy values.\n */\nfunction normalizeAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n chainId: Hex,\n): AuthorizationList | undefined {\n return authorizationList?.map((authorization) => ({\n ...authorization,\n chainId: authorization.chainId ?? chainId,\n nonce: authorization.nonce ?? '0x1',\n r: authorization.r ?? DUMMY_AUTHORIZATION_SIGNATURE,\n s: authorization.s ?? DUMMY_AUTHORIZATION_SIGNATURE,\n yParity: authorization.yParity ?? '0x1',\n }));\n}\n\n/**\n * Normalize the value to a canonical hex quantity with no leading zero digits.\n * Some RPC nodes (e.g. Go's `hexutil`) reject quantities such as `0x00` or\n * `0x0de0b6b3a7640000`, failing gas estimation entirely.\n *\n * @param value - The transaction value to normalize.\n * @returns The normalized transaction value.\n */\nfunction normalizeValue(value: string | undefined): string {\n const valueOrDefault = value ?? '0x0';\n\n if (!isStrictHexString(valueOrDefault)) {\n return valueOrDefault;\n }\n\n const stripped = remove0x(valueOrDefault).replace(/^0+/u, '');\n\n return stripped.length === 0 ? '0x0' : add0x(stripped);\n}\n\n/**\n * Estimate the gas for a transaction using the `eth_estimateGas` method.\n *\n * @param messenger - The messenger instance for communication.\n * @param networkClientId - The network client ID.\n * @param txParams - The transaction parameters.\n * @param delegationAddress - The delegation address of the sender to mock.\n * @returns The estimated gas as a hex string.\n */\nasync function estimateGasNode(\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n txParams: TransactionParams,\n delegationAddress?: Hex,\n): Promise<Hex> {\n const { from } = txParams;\n const params = [txParams] as Json[];\n\n if (delegationAddress) {\n params.push('latest');\n\n params.push({\n [from]: {\n code: DELEGATION_PREFIX + remove0x(delegationAddress),\n },\n });\n }\n\n return (await rpcRequest({\n messenger,\n networkClientId,\n method: 'eth_estimateGas',\n params,\n })) as Hex;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"layer1-gas-fee-flow.d.ts","sourceRoot":"","sources":["../../src/utils/layer1-gas-fee-flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIrE,MAAM,MAAM,yBAAyB,GAAG;IACtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAYf;AA6BD;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAAC,EAC/C,iBAAiB,EACjB,SAAS,EACT,eAAe,GAChB,EAAE,yBAAyB,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CA2BtD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"layer1-gas-fee-flow.js","sourceRoot":"","sources":["../../src/utils/layer1-gas-fee-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAQtE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAkC;IAElC,MAAM,YAAY,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAE/D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAEpC,eAAe,CAAC,YAAY,GAAG,YAAY,CAAC;IAE5C,GAAG,CAAC,yBAAyB,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAChC,eAAgC,EAChC,iBAAqC,EACrC,SAAyC;IAEzC,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CAAC;YACxD,eAAe;YACf,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,gBAAgB,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,iBAAiB,EACjB,SAAS,EACT,eAAe,GACW;IAC1B,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAChD,eAAe,EACf,iBAAiB,EACjB,SAAS,CACV,CAAC;IAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,GAAG,CACD,4BAA4B,EAC5B,gBAAgB,CAAC,WAAW,CAAC,IAAI,EACjC,eAAe,CAAC,EAAE,CACnB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC;YACxD,SAAS;YACT,eAAe;SAChB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,+BAA+B,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport type { TransactionControllerMessenger } from '../TransactionController.js';\nimport type { Layer1GasFeeFlow, TransactionMeta } from '../types.js';\n\nconst log = createModuleLogger(projectLogger, 'layer-1-gas-fee-flow');\n\nexport type UpdateLayer1GasFeeRequest = {\n layer1GasFeeFlows: Layer1GasFeeFlow[];\n messenger: TransactionControllerMessenger;\n transactionMeta: TransactionMeta;\n};\n\n/**\n * Updates the given transactionMeta with the layer 1 gas fee.\n *\n * @param request - The request to use when getting the layer 1 gas fee.\n * @param request.transactionMeta - The transaction to get the layer 1 gas fee for.\n * @param request.layer1GasFeeFlows - The layer 1 gas fee flows to search.\n * @param request.messenger - The messenger instance.\n */\nexport async function updateTransactionLayer1GasFee(\n request: UpdateLayer1GasFeeRequest,\n): Promise<void> {\n const layer1GasFee = await getTransactionLayer1GasFee(request);\n\n if (!layer1GasFee) {\n return;\n }\n\n const { transactionMeta } = request;\n\n transactionMeta.layer1GasFee = layer1GasFee;\n\n log('Updated layer 1 gas fee', layer1GasFee, transactionMeta.id);\n}\n\n/**\n * Get the layer 1 gas fee flow for a transaction.\n *\n * @param transactionMeta - The transaction to get the layer 1 gas fee flow for.\n * @param layer1GasFeeFlows - The layer 1 gas fee flows to search.\n * @param messenger - The messenger instance.\n * @returns The layer 1 gas fee flow for the transaction, or undefined if none match.\n */\nasync function getLayer1GasFeeFlow(\n transactionMeta: TransactionMeta,\n layer1GasFeeFlows: Layer1GasFeeFlow[],\n messenger: TransactionControllerMessenger,\n): Promise<Layer1GasFeeFlow | undefined> {\n for (const layer1GasFeeFlow of layer1GasFeeFlows) {\n const matches = await layer1GasFeeFlow.matchesTransaction({\n transactionMeta,\n messenger,\n });\n\n if (matches) {\n return layer1GasFeeFlow;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get the layer 1 gas fee for a transaction.\n *\n * @param request - The request to use when getting the layer 1 gas fee.\n * @param request.layer1GasFeeFlows - The layer 1 gas fee flows to search.\n * @param request.transactionMeta - The transaction to get the layer 1 gas fee for.\n * @param request.messenger - The messenger instance.\n * @returns The layer 1 gas fee.\n */\nexport async function getTransactionLayer1GasFee({\n layer1GasFeeFlows,\n messenger,\n transactionMeta,\n}: UpdateLayer1GasFeeRequest): Promise<Hex | undefined> {\n const layer1GasFeeFlow = await getLayer1GasFeeFlow(\n transactionMeta,\n layer1GasFeeFlows,\n messenger,\n );\n\n if (!layer1GasFeeFlow) {\n return undefined;\n }\n\n log(\n 'Found layer 1 gas fee flow',\n layer1GasFeeFlow.constructor.name,\n transactionMeta.id,\n );\n\n try {\n const { layer1Fee } = await layer1GasFeeFlow.getLayer1Fee({\n messenger,\n transactionMeta,\n });\n return layer1Fee;\n } catch (error) {\n log('Failed to get layer 1 gas fee', transactionMeta.id, error);\n return undefined;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nonce.d.ts","sourceRoot":"","sources":["../../src/utils/nonce.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,IAAI,uBAAuB,EACvC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKtE;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,GACpD,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CA+BzD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uCAAuC,CACrD,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,iBAAiB,EAAE,EACxC,YAAY,EAAE,eAAe,EAAE,GAC9B,uBAAuB,EAAE,CAwD3B"}