@metamask/transaction-pay-controller 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +20 -0
  3. package/README.md +19 -0
  4. package/dist/TransactionPayController.cjs +96 -0
  5. package/dist/TransactionPayController.cjs.map +1 -0
  6. package/dist/TransactionPayController.d.cts +9 -0
  7. package/dist/TransactionPayController.d.cts.map +1 -0
  8. package/dist/TransactionPayController.d.mts +9 -0
  9. package/dist/TransactionPayController.d.mts.map +1 -0
  10. package/dist/TransactionPayController.mjs +93 -0
  11. package/dist/TransactionPayController.mjs.map +1 -0
  12. package/dist/actions/update-payment-token.cjs +79 -0
  13. package/dist/actions/update-payment-token.cjs.map +1 -0
  14. package/dist/actions/update-payment-token.d.cts +14 -0
  15. package/dist/actions/update-payment-token.d.cts.map +1 -0
  16. package/dist/actions/update-payment-token.d.mts +14 -0
  17. package/dist/actions/update-payment-token.d.mts.map +1 -0
  18. package/dist/actions/update-payment-token.mjs +75 -0
  19. package/dist/actions/update-payment-token.mjs.map +1 -0
  20. package/dist/constants.cjs +12 -0
  21. package/dist/constants.cjs.map +1 -0
  22. package/dist/constants.d.cts +8 -0
  23. package/dist/constants.d.cts.map +1 -0
  24. package/dist/constants.d.mts +8 -0
  25. package/dist/constants.d.mts.map +1 -0
  26. package/dist/constants.mjs +9 -0
  27. package/dist/constants.mjs.map +1 -0
  28. package/dist/helpers/TransactionPayPublishHook.cjs +61 -0
  29. package/dist/helpers/TransactionPayPublishHook.cjs.map +1 -0
  30. package/dist/helpers/TransactionPayPublishHook.d.cts +12 -0
  31. package/dist/helpers/TransactionPayPublishHook.d.cts.map +1 -0
  32. package/dist/helpers/TransactionPayPublishHook.d.mts +12 -0
  33. package/dist/helpers/TransactionPayPublishHook.d.mts.map +1 -0
  34. package/dist/helpers/TransactionPayPublishHook.mjs +57 -0
  35. package/dist/helpers/TransactionPayPublishHook.mjs.map +1 -0
  36. package/dist/index.cjs +10 -0
  37. package/dist/index.cjs.map +1 -0
  38. package/dist/index.d.cts +6 -0
  39. package/dist/index.d.cts.map +1 -0
  40. package/dist/index.d.mts +6 -0
  41. package/dist/index.d.mts.map +1 -0
  42. package/dist/index.mjs +4 -0
  43. package/dist/index.mjs.map +1 -0
  44. package/dist/logger.cjs +8 -0
  45. package/dist/logger.cjs.map +1 -0
  46. package/dist/logger.d.cts +5 -0
  47. package/dist/logger.d.cts.map +1 -0
  48. package/dist/logger.d.mts +5 -0
  49. package/dist/logger.d.mts.map +1 -0
  50. package/dist/logger.mjs +5 -0
  51. package/dist/logger.mjs.map +1 -0
  52. package/dist/strategy/bridge/BridgeStrategy.cjs +30 -0
  53. package/dist/strategy/bridge/BridgeStrategy.cjs.map +1 -0
  54. package/dist/strategy/bridge/BridgeStrategy.d.cts +11 -0
  55. package/dist/strategy/bridge/BridgeStrategy.d.cts.map +1 -0
  56. package/dist/strategy/bridge/BridgeStrategy.d.mts +11 -0
  57. package/dist/strategy/bridge/BridgeStrategy.d.mts.map +1 -0
  58. package/dist/strategy/bridge/BridgeStrategy.mjs +26 -0
  59. package/dist/strategy/bridge/BridgeStrategy.mjs.map +1 -0
  60. package/dist/strategy/bridge/bridge-quotes.cjs +386 -0
  61. package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -0
  62. package/dist/strategy/bridge/bridge-quotes.d.cts +35 -0
  63. package/dist/strategy/bridge/bridge-quotes.d.cts.map +1 -0
  64. package/dist/strategy/bridge/bridge-quotes.d.mts +35 -0
  65. package/dist/strategy/bridge/bridge-quotes.d.mts.map +1 -0
  66. package/dist/strategy/bridge/bridge-quotes.mjs +380 -0
  67. package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -0
  68. package/dist/strategy/bridge/bridge-submit.cjs +155 -0
  69. package/dist/strategy/bridge/bridge-submit.cjs.map +1 -0
  70. package/dist/strategy/bridge/bridge-submit.d.cts +19 -0
  71. package/dist/strategy/bridge/bridge-submit.d.cts.map +1 -0
  72. package/dist/strategy/bridge/bridge-submit.d.mts +19 -0
  73. package/dist/strategy/bridge/bridge-submit.d.mts.map +1 -0
  74. package/dist/strategy/bridge/bridge-submit.mjs +152 -0
  75. package/dist/strategy/bridge/bridge-submit.mjs.map +1 -0
  76. package/dist/strategy/bridge/types.cjs +3 -0
  77. package/dist/strategy/bridge/types.cjs.map +1 -0
  78. package/dist/strategy/bridge/types.d.cts +27 -0
  79. package/dist/strategy/bridge/types.d.cts.map +1 -0
  80. package/dist/strategy/bridge/types.d.mts +27 -0
  81. package/dist/strategy/bridge/types.d.mts.map +1 -0
  82. package/dist/strategy/bridge/types.mjs +2 -0
  83. package/dist/strategy/bridge/types.mjs.map +1 -0
  84. package/dist/strategy/relay/RelayStrategy.cjs +15 -0
  85. package/dist/strategy/relay/RelayStrategy.cjs.map +1 -0
  86. package/dist/strategy/relay/RelayStrategy.d.cts +9 -0
  87. package/dist/strategy/relay/RelayStrategy.d.cts.map +1 -0
  88. package/dist/strategy/relay/RelayStrategy.d.mts +9 -0
  89. package/dist/strategy/relay/RelayStrategy.d.mts.map +1 -0
  90. package/dist/strategy/relay/RelayStrategy.mjs +11 -0
  91. package/dist/strategy/relay/RelayStrategy.mjs.map +1 -0
  92. package/dist/strategy/relay/constants.cjs +9 -0
  93. package/dist/strategy/relay/constants.cjs.map +1 -0
  94. package/dist/strategy/relay/constants.d.cts +6 -0
  95. package/dist/strategy/relay/constants.d.cts.map +1 -0
  96. package/dist/strategy/relay/constants.d.mts +6 -0
  97. package/dist/strategy/relay/constants.d.mts.map +1 -0
  98. package/dist/strategy/relay/constants.mjs +6 -0
  99. package/dist/strategy/relay/constants.mjs.map +1 -0
  100. package/dist/strategy/relay/relay-quotes.cjs +210 -0
  101. package/dist/strategy/relay/relay-quotes.cjs.map +1 -0
  102. package/dist/strategy/relay/relay-quotes.d.cts +10 -0
  103. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -0
  104. package/dist/strategy/relay/relay-quotes.d.mts +10 -0
  105. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -0
  106. package/dist/strategy/relay/relay-quotes.mjs +206 -0
  107. package/dist/strategy/relay/relay-quotes.mjs.map +1 -0
  108. package/dist/strategy/relay/relay-submit.cjs +137 -0
  109. package/dist/strategy/relay/relay-submit.cjs.map +1 -0
  110. package/dist/strategy/relay/relay-submit.d.cts +13 -0
  111. package/dist/strategy/relay/relay-submit.d.cts.map +1 -0
  112. package/dist/strategy/relay/relay-submit.d.mts +13 -0
  113. package/dist/strategy/relay/relay-submit.d.mts.map +1 -0
  114. package/dist/strategy/relay/relay-submit.mjs +133 -0
  115. package/dist/strategy/relay/relay-submit.mjs.map +1 -0
  116. package/dist/strategy/relay/types.cjs +3 -0
  117. package/dist/strategy/relay/types.cjs.map +1 -0
  118. package/dist/strategy/relay/types.d.cts +52 -0
  119. package/dist/strategy/relay/types.d.cts.map +1 -0
  120. package/dist/strategy/relay/types.d.mts +52 -0
  121. package/dist/strategy/relay/types.d.mts.map +1 -0
  122. package/dist/strategy/relay/types.mjs +2 -0
  123. package/dist/strategy/relay/types.mjs.map +1 -0
  124. package/dist/strategy/test/TestStrategy.cjs +48 -0
  125. package/dist/strategy/test/TestStrategy.cjs.map +1 -0
  126. package/dist/strategy/test/TestStrategy.d.cts +9 -0
  127. package/dist/strategy/test/TestStrategy.d.cts.map +1 -0
  128. package/dist/strategy/test/TestStrategy.d.mts +9 -0
  129. package/dist/strategy/test/TestStrategy.d.mts.map +1 -0
  130. package/dist/strategy/test/TestStrategy.mjs +44 -0
  131. package/dist/strategy/test/TestStrategy.mjs.map +1 -0
  132. package/dist/tests/messenger-mock.cjs +76 -0
  133. package/dist/tests/messenger-mock.cjs.map +1 -0
  134. package/dist/tests/messenger-mock.d.cts +215 -0
  135. package/dist/tests/messenger-mock.d.cts.map +1 -0
  136. package/dist/tests/messenger-mock.d.mts +215 -0
  137. package/dist/tests/messenger-mock.d.mts.map +1 -0
  138. package/dist/tests/messenger-mock.mjs +72 -0
  139. package/dist/tests/messenger-mock.mjs.map +1 -0
  140. package/dist/types.cjs +3 -0
  141. package/dist/types.cjs.map +1 -0
  142. package/dist/types.d.cts +264 -0
  143. package/dist/types.d.cts.map +1 -0
  144. package/dist/types.d.mts +264 -0
  145. package/dist/types.d.mts.map +1 -0
  146. package/dist/types.mjs +2 -0
  147. package/dist/types.mjs.map +1 -0
  148. package/dist/utils/gas.cjs +87 -0
  149. package/dist/utils/gas.cjs.map +1 -0
  150. package/dist/utils/gas.d.cts +33 -0
  151. package/dist/utils/gas.d.cts.map +1 -0
  152. package/dist/utils/gas.d.mts +33 -0
  153. package/dist/utils/gas.d.mts.map +1 -0
  154. package/dist/utils/gas.mjs +82 -0
  155. package/dist/utils/gas.mjs.map +1 -0
  156. package/dist/utils/quotes.cjs +168 -0
  157. package/dist/utils/quotes.cjs.map +1 -0
  158. package/dist/utils/quotes.d.cts +21 -0
  159. package/dist/utils/quotes.d.cts.map +1 -0
  160. package/dist/utils/quotes.d.mts +21 -0
  161. package/dist/utils/quotes.d.mts.map +1 -0
  162. package/dist/utils/quotes.mjs +163 -0
  163. package/dist/utils/quotes.mjs.map +1 -0
  164. package/dist/utils/required-tokens.cjs +179 -0
  165. package/dist/utils/required-tokens.cjs.map +1 -0
  166. package/dist/utils/required-tokens.d.cts +11 -0
  167. package/dist/utils/required-tokens.d.cts.map +1 -0
  168. package/dist/utils/required-tokens.d.mts +11 -0
  169. package/dist/utils/required-tokens.d.mts.map +1 -0
  170. package/dist/utils/required-tokens.mjs +175 -0
  171. package/dist/utils/required-tokens.mjs.map +1 -0
  172. package/dist/utils/source-amounts.cjs +72 -0
  173. package/dist/utils/source-amounts.cjs.map +1 -0
  174. package/dist/utils/source-amounts.d.cts +11 -0
  175. package/dist/utils/source-amounts.d.cts.map +1 -0
  176. package/dist/utils/source-amounts.d.mts +11 -0
  177. package/dist/utils/source-amounts.d.mts.map +1 -0
  178. package/dist/utils/source-amounts.mjs +68 -0
  179. package/dist/utils/source-amounts.mjs.map +1 -0
  180. package/dist/utils/strategy.cjs +39 -0
  181. package/dist/utils/strategy.cjs.map +1 -0
  182. package/dist/utils/strategy.d.cts +19 -0
  183. package/dist/utils/strategy.d.cts.map +1 -0
  184. package/dist/utils/strategy.d.mts +19 -0
  185. package/dist/utils/strategy.d.mts.map +1 -0
  186. package/dist/utils/strategy.mjs +34 -0
  187. package/dist/utils/strategy.mjs.map +1 -0
  188. package/dist/utils/token.cjs +161 -0
  189. package/dist/utils/token.cjs.map +1 -0
  190. package/dist/utils/token.d.cts +53 -0
  191. package/dist/utils/token.d.cts.map +1 -0
  192. package/dist/utils/token.d.mts +53 -0
  193. package/dist/utils/token.d.mts.map +1 -0
  194. package/dist/utils/token.mjs +154 -0
  195. package/dist/utils/token.mjs.map +1 -0
  196. package/dist/utils/totals.cjs +69 -0
  197. package/dist/utils/totals.cjs.map +1 -0
  198. package/dist/utils/totals.d.cts +11 -0
  199. package/dist/utils/totals.d.cts.map +1 -0
  200. package/dist/utils/totals.d.mts +11 -0
  201. package/dist/utils/totals.d.mts.map +1 -0
  202. package/dist/utils/totals.mjs +65 -0
  203. package/dist/utils/totals.mjs.map +1 -0
  204. package/dist/utils/transaction.cjs +132 -0
  205. package/dist/utils/transaction.cjs.map +1 -0
  206. package/dist/utils/transaction.d.cts +42 -0
  207. package/dist/utils/transaction.d.cts.map +1 -0
  208. package/dist/utils/transaction.d.mts +42 -0
  209. package/dist/utils/transaction.d.mts.map +1 -0
  210. package/dist/utils/transaction.mjs +126 -0
  211. package/dist/utils/transaction.mjs.map +1 -0
  212. package/package.json +97 -0
@@ -0,0 +1,65 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ /**
3
+ * Calculate totals for a list of quotes and tokens.
4
+ *
5
+ * @param quotes - List of bridge quotes.
6
+ * @param tokens - List of required transaction tokens.
7
+ * @param _messenger - Controller messenger.
8
+ * @returns The calculated totals in USD and fiat currency.
9
+ */
10
+ export function calculateTotals(quotes, tokens, _messenger) {
11
+ const providerFeeFiat = sumProperty(quotes, (quote) => quote.fees.provider.fiat);
12
+ const providerFeeUsd = sumProperty(quotes, (quote) => quote.fees.provider.usd);
13
+ const sourceNetworkFeeFiat = sumProperty(quotes, (quote) => quote.fees.sourceNetwork.fiat);
14
+ const sourceNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.sourceNetwork.usd);
15
+ const targetNetworkFeeFiat = sumProperty(quotes, (quote) => quote.fees.targetNetwork.fiat);
16
+ const targetNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.targetNetwork.usd);
17
+ const amountFiat = sumProperty(tokens, (token) => token.amountFiat);
18
+ const amountUsd = sumProperty(tokens, (token) => token.amountUsd);
19
+ const totalFiat = new BigNumber(providerFeeFiat)
20
+ .plus(sourceNetworkFeeFiat)
21
+ .plus(targetNetworkFeeFiat)
22
+ .plus(amountFiat)
23
+ .toString(10);
24
+ const totalUsd = new BigNumber(providerFeeUsd)
25
+ .plus(sourceNetworkFeeUsd)
26
+ .plus(targetNetworkFeeUsd)
27
+ .plus(amountUsd)
28
+ .toString(10);
29
+ const estimatedDuration = Number(sumProperty(quotes, (quote) => quote.estimatedDuration));
30
+ return {
31
+ estimatedDuration,
32
+ fees: {
33
+ provider: {
34
+ fiat: providerFeeFiat,
35
+ usd: providerFeeUsd,
36
+ },
37
+ sourceNetwork: {
38
+ fiat: sourceNetworkFeeFiat,
39
+ usd: sourceNetworkFeeUsd,
40
+ },
41
+ targetNetwork: {
42
+ fiat: targetNetworkFeeFiat,
43
+ usd: targetNetworkFeeUsd,
44
+ },
45
+ },
46
+ total: {
47
+ fiat: totalFiat,
48
+ usd: totalUsd,
49
+ },
50
+ };
51
+ }
52
+ /**
53
+ * Sum a specific property from a list of items.
54
+ *
55
+ * @param data - List of items.
56
+ * @param getProperty - Function to extract the property to sum from each item.
57
+ * @returns The summed value as a string.
58
+ */
59
+ function sumProperty(data, getProperty) {
60
+ return data
61
+ .map(getProperty)
62
+ .reduce((total, value) => total.plus(value), new BigNumber(0))
63
+ .toString(10);
64
+ }
65
+ //# sourceMappingURL=totals.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totals.mjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AASzC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAsC,EACtC,MAAqC,EACrC,UAA6C;IAE7C,MAAM,eAAe,GAAG,WAAW,CACjC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC;SAC7C,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC;SAC3C,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,SAAS,CAAC;SACf,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,MAAM,CAC9B,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CACxD,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,cAAc;aACpB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;SACF;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAClB,IAAS,EACT,WAAyC;IAEzC,OAAO,IAAI;SACR,GAAG,CAAC,WAAW,CAAC;SAChB,MAAM,CAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param quotes - List of bridge quotes.\n * @param tokens - List of required transaction tokens.\n * @param _messenger - Controller messenger.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals(\n quotes: TransactionPayQuote<unknown>[],\n tokens: TransactionPayRequiredToken[],\n _messenger: TransactionPayControllerMessenger,\n): TransactionPayTotals {\n const providerFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.provider.fiat,\n );\n\n const providerFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.provider.usd,\n );\n\n const sourceNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.fiat,\n );\n\n const sourceNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.usd,\n );\n\n const targetNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.fiat,\n );\n\n const targetNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.usd,\n );\n\n const amountFiat = sumProperty(tokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(tokens, (token) => token.amountUsd);\n\n const totalFiat = new BigNumber(providerFeeFiat)\n .plus(sourceNetworkFeeFiat)\n .plus(targetNetworkFeeFiat)\n .plus(amountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFeeUsd)\n .plus(sourceNetworkFeeUsd)\n .plus(targetNetworkFeeUsd)\n .plus(amountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n return {\n estimatedDuration,\n fees: {\n provider: {\n fiat: providerFeeFiat,\n usd: providerFeeUsd,\n },\n sourceNetwork: {\n fiat: sourceNetworkFeeFiat,\n usd: sourceNetworkFeeUsd,\n },\n targetNetwork: {\n fiat: targetNetworkFeeFiat,\n usd: targetNetworkFeeUsd,\n },\n },\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a specific property from a list of items.\n *\n * @param data - List of items.\n * @param getProperty - Function to extract the property to sum from each item.\n * @returns The summed value as a string.\n */\nfunction sumProperty<T>(\n data: T[],\n getProperty: (item: T) => BigNumber.Value,\n): string {\n return data\n .map(getProperty)\n .reduce<BigNumber>((total, value) => total.plus(value), new BigNumber(0))\n .toString(10);\n}\n"]}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateTransaction = exports.waitForTransactionConfirmed = exports.pollTransactionChanges = exports.getTransaction = exports.FINALIZED_STATUSES = void 0;
4
+ const transaction_controller_1 = require("@metamask/transaction-controller");
5
+ const utils_1 = require("@metamask/utils");
6
+ const lodash_1 = require("lodash");
7
+ const required_tokens_1 = require("./required-tokens.cjs");
8
+ const logger_1 = require("../logger.cjs");
9
+ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'transaction');
10
+ exports.FINALIZED_STATUSES = [
11
+ transaction_controller_1.TransactionStatus.confirmed,
12
+ transaction_controller_1.TransactionStatus.dropped,
13
+ transaction_controller_1.TransactionStatus.failed,
14
+ ];
15
+ /**
16
+ * Retrieve transaction metadata by ID.
17
+ *
18
+ * @param transactionId - ID of the transaction to retrieve.
19
+ * @param messenger - Controller messenger.
20
+ * @returns The transaction metadata or undefined if not found.
21
+ */
22
+ function getTransaction(transactionId, messenger) {
23
+ const transactionControllerState = messenger.call('TransactionController:getState');
24
+ return transactionControllerState.transactions.find((tx) => tx.id === transactionId);
25
+ }
26
+ exports.getTransaction = getTransaction;
27
+ /**
28
+ * Poll for transaction changes and update the transaction data accordingly.
29
+ *
30
+ * @param messenger - Controller messenger.
31
+ * @param updateTransactionData - Callback to update transaction data.
32
+ * @param removeTransactionData - Callback to remove transaction data.
33
+ */
34
+ function pollTransactionChanges(messenger, updateTransactionData, removeTransactionData) {
35
+ messenger.subscribe('TransactionController:stateChange', (transactions, previousTransactions) => {
36
+ const newTransactions = transactions.filter((tx) => !previousTransactions?.find((prevTx) => prevTx.id === tx.id));
37
+ const updatedTransactions = transactions.filter((tx) => {
38
+ const previousTransaction = previousTransactions?.find((prevTx) => prevTx.id === tx.id);
39
+ return (previousTransaction &&
40
+ previousTransaction?.txParams.data !== tx.txParams.data);
41
+ });
42
+ const finalizedTransactions = transactions.filter((tx) => {
43
+ const previousTransaction = previousTransactions?.find((prevTx) => prevTx.id === tx.id);
44
+ return (previousTransaction &&
45
+ !exports.FINALIZED_STATUSES.includes(previousTransaction.status) &&
46
+ exports.FINALIZED_STATUSES.includes(tx.status));
47
+ });
48
+ finalizedTransactions.forEach((tx) => onTransactionFinalized(tx, removeTransactionData));
49
+ [...newTransactions, ...updatedTransactions].forEach((tx) => onTransactionChange(tx, messenger, updateTransactionData));
50
+ }, (state) => state.transactions);
51
+ }
52
+ exports.pollTransactionChanges = pollTransactionChanges;
53
+ /**
54
+ * Wait for a transaction to be confirmed or fail.
55
+ *
56
+ * @param transactionId - ID of the transaction to wait for.
57
+ * @param messenger - Controller messenger.
58
+ * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.
59
+ */
60
+ function waitForTransactionConfirmed(transactionId, messenger) {
61
+ return new Promise((resolve, reject) => {
62
+ const isConfirmed = (tx, fn) => {
63
+ log('Checking transaction status', tx?.status, tx?.type);
64
+ if (tx?.status === transaction_controller_1.TransactionStatus.confirmed) {
65
+ fn?.();
66
+ resolve();
67
+ return true;
68
+ }
69
+ if ([transaction_controller_1.TransactionStatus.dropped, transaction_controller_1.TransactionStatus.failed].includes(tx?.status)) {
70
+ fn?.();
71
+ reject(new Error(`Transaction failed - ${tx?.type} - ${tx?.error?.message}`));
72
+ return true;
73
+ }
74
+ return false;
75
+ };
76
+ const initialState = messenger.call('TransactionController:getState');
77
+ const initialTx = initialState.transactions.find((t) => t.id === transactionId);
78
+ if (isConfirmed(initialTx)) {
79
+ return;
80
+ }
81
+ const handler = (tx) => {
82
+ const unsubscribe = () => messenger.unsubscribe('TransactionController:stateChange', handler);
83
+ isConfirmed(tx, unsubscribe);
84
+ };
85
+ messenger.subscribe('TransactionController:stateChange', handler, (state) => state.transactions.find((tx) => tx.id === transactionId));
86
+ });
87
+ }
88
+ exports.waitForTransactionConfirmed = waitForTransactionConfirmed;
89
+ /**
90
+ * Update a transaction by applying a function to its draft.
91
+ *
92
+ * @param request - Request object.
93
+ * @param request.transactionId - ID of the transaction to update.
94
+ * @param request.messenger - Controller messenger.
95
+ * @param request.note - Note describing the update.
96
+ * @param fn - Function that applies updates to the transaction draft.
97
+ */
98
+ function updateTransaction({ transactionId, messenger, note, }, fn) {
99
+ const transaction = getTransaction(transactionId, messenger);
100
+ if (!transaction) {
101
+ throw new Error(`Transaction not found: ${transactionId}`);
102
+ }
103
+ const newTransaction = (0, lodash_1.cloneDeep)(transaction);
104
+ fn(newTransaction);
105
+ messenger.call('TransactionController:updateTransaction', newTransaction, note);
106
+ }
107
+ exports.updateTransaction = updateTransaction;
108
+ /**
109
+ * Handle a transaction change by updating its associated data.
110
+ *
111
+ * @param transaction - Transaction metadata.
112
+ * @param messenger - Controller messenger.
113
+ * @param updateTransactionData - Callback to update transaction data.
114
+ */
115
+ function onTransactionChange(transaction, messenger, updateTransactionData) {
116
+ const tokens = (0, required_tokens_1.parseRequiredTokens)(transaction, messenger);
117
+ log('Transaction changed', { transaction, tokens });
118
+ updateTransactionData(transaction.id, (data) => {
119
+ data.tokens = tokens;
120
+ });
121
+ }
122
+ /**
123
+ * Handle a finalized transaction by removing its associated data.
124
+ *
125
+ * @param transaction - Transaction metadata.
126
+ * @param removeTransactionData - Callback to remove transaction data.
127
+ */
128
+ function onTransactionFinalized(transaction, removeTransactionData) {
129
+ log('Transaction finalized', { transaction });
130
+ removeTransactionData(transaction.id);
131
+ }
132
+ //# sourceMappingURL=transaction.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStatus,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\n\nimport { parseRequiredTokens } from './required-tokens';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPayControllerMessenger,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'transaction');\n\nexport const FINALIZED_STATUSES = [\n TransactionStatus.confirmed,\n TransactionStatus.dropped,\n TransactionStatus.failed,\n];\n\n/**\n * Retrieve transaction metadata by ID.\n *\n * @param transactionId - ID of the transaction to retrieve.\n * @param messenger - Controller messenger.\n * @returns The transaction metadata or undefined if not found.\n */\nexport function getTransaction(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n): TransactionMeta | undefined {\n const transactionControllerState = messenger.call(\n 'TransactionController:getState',\n );\n\n return transactionControllerState.transactions.find(\n (tx) => tx.id === transactionId,\n );\n}\n\n/**\n * Poll for transaction changes and update the transaction data accordingly.\n *\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nexport function pollTransactionChanges(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n removeTransactionData: (transactionId: string) => void,\n) {\n messenger.subscribe(\n 'TransactionController:stateChange',\n (\n transactions: TransactionMeta[],\n previousTransactions: TransactionMeta[] | undefined,\n ) => {\n const newTransactions = transactions.filter(\n (tx) => !previousTransactions?.find((prevTx) => prevTx.id === tx.id),\n );\n\n const updatedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n previousTransaction?.txParams.data !== tx.txParams.data\n );\n });\n\n const finalizedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n !FINALIZED_STATUSES.includes(previousTransaction.status) &&\n FINALIZED_STATUSES.includes(tx.status)\n );\n });\n\n finalizedTransactions.forEach((tx) =>\n onTransactionFinalized(tx, removeTransactionData),\n );\n\n [...newTransactions, ...updatedTransactions].forEach((tx) =>\n onTransactionChange(tx, messenger, updateTransactionData),\n );\n },\n (state) => state.transactions,\n );\n}\n\n/**\n * Wait for a transaction to be confirmed or fail.\n *\n * @param transactionId - ID of the transaction to wait for.\n * @param messenger - Controller messenger.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.\n */\nexport function waitForTransactionConfirmed(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n) {\n return new Promise<void>((resolve, reject) => {\n const isConfirmed = (tx?: TransactionMeta, fn?: () => void) => {\n log('Checking transaction status', tx?.status, tx?.type);\n\n if (tx?.status === TransactionStatus.confirmed) {\n fn?.();\n resolve();\n return true;\n }\n\n if (\n [TransactionStatus.dropped, TransactionStatus.failed].includes(\n tx?.status as TransactionStatus,\n )\n ) {\n fn?.();\n reject(\n new Error(`Transaction failed - ${tx?.type} - ${tx?.error?.message}`),\n );\n return true;\n }\n\n return false;\n };\n\n const initialState = messenger.call('TransactionController:getState');\n\n const initialTx = initialState.transactions.find(\n (t) => t.id === transactionId,\n );\n\n if (isConfirmed(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta) => {\n const unsubscribe = () =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n isConfirmed(tx, unsubscribe);\n };\n\n messenger.subscribe('TransactionController:stateChange', handler, (state) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Update a transaction by applying a function to its draft.\n *\n * @param request - Request object.\n * @param request.transactionId - ID of the transaction to update.\n * @param request.messenger - Controller messenger.\n * @param request.note - Note describing the update.\n * @param fn - Function that applies updates to the transaction draft.\n */\nexport function updateTransaction(\n {\n transactionId,\n messenger,\n note,\n }: {\n transactionId: string;\n messenger: TransactionPayControllerMessenger;\n note: string;\n },\n fn: (draft: TransactionMeta) => void,\n) {\n const transaction = getTransaction(transactionId, messenger as never);\n\n if (!transaction) {\n throw new Error(`Transaction not found: ${transactionId}`);\n }\n\n const newTransaction = cloneDeep(transaction);\n\n fn(newTransaction);\n\n messenger.call(\n 'TransactionController:updateTransaction',\n newTransaction,\n note,\n );\n}\n\n/**\n * Handle a transaction change by updating its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n */\nfunction onTransactionChange(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const tokens = parseRequiredTokens(transaction, messenger);\n\n log('Transaction changed', { transaction, tokens });\n\n updateTransactionData(transaction.id, (data) => {\n data.tokens = tokens;\n });\n}\n\n/**\n * Handle a finalized transaction by removing its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nfunction onTransactionFinalized(\n transaction: TransactionMeta,\n removeTransactionData: (transactionId: string) => void,\n) {\n log('Transaction finalized', { transaction });\n removeTransactionData(transaction.id);\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { TransactionStatus, type TransactionMeta } from "@metamask/transaction-controller";
2
+ import type { TransactionPayControllerMessenger, UpdateTransactionDataCallback } from "../types.cjs";
3
+ export declare const FINALIZED_STATUSES: TransactionStatus[];
4
+ /**
5
+ * Retrieve transaction metadata by ID.
6
+ *
7
+ * @param transactionId - ID of the transaction to retrieve.
8
+ * @param messenger - Controller messenger.
9
+ * @returns The transaction metadata or undefined if not found.
10
+ */
11
+ export declare function getTransaction(transactionId: string, messenger: TransactionPayControllerMessenger): TransactionMeta | undefined;
12
+ /**
13
+ * Poll for transaction changes and update the transaction data accordingly.
14
+ *
15
+ * @param messenger - Controller messenger.
16
+ * @param updateTransactionData - Callback to update transaction data.
17
+ * @param removeTransactionData - Callback to remove transaction data.
18
+ */
19
+ export declare function pollTransactionChanges(messenger: TransactionPayControllerMessenger, updateTransactionData: UpdateTransactionDataCallback, removeTransactionData: (transactionId: string) => void): void;
20
+ /**
21
+ * Wait for a transaction to be confirmed or fail.
22
+ *
23
+ * @param transactionId - ID of the transaction to wait for.
24
+ * @param messenger - Controller messenger.
25
+ * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.
26
+ */
27
+ export declare function waitForTransactionConfirmed(transactionId: string, messenger: TransactionPayControllerMessenger): Promise<void>;
28
+ /**
29
+ * Update a transaction by applying a function to its draft.
30
+ *
31
+ * @param request - Request object.
32
+ * @param request.transactionId - ID of the transaction to update.
33
+ * @param request.messenger - Controller messenger.
34
+ * @param request.note - Note describing the update.
35
+ * @param fn - Function that applies updates to the transaction draft.
36
+ */
37
+ export declare function updateTransaction({ transactionId, messenger, note, }: {
38
+ transactionId: string;
39
+ messenger: TransactionPayControllerMessenger;
40
+ note: string;
41
+ }, fn: (draft: TransactionMeta) => void): void;
42
+ //# sourceMappingURL=transaction.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACrB,yCAAyC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,6BAA6B,EAC9B,qBAAiB;AAIlB,eAAO,MAAM,kBAAkB,qBAI9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,GAC3C,eAAe,GAAG,SAAS,CAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,QA6CvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,iBAgD7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EACE,aAAa,EACb,SAAS,EACT,IAAI,GACL,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,EACD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,QAiBrC"}
@@ -0,0 +1,42 @@
1
+ import { TransactionStatus, type TransactionMeta } from "@metamask/transaction-controller";
2
+ import type { TransactionPayControllerMessenger, UpdateTransactionDataCallback } from "../types.mjs";
3
+ export declare const FINALIZED_STATUSES: TransactionStatus[];
4
+ /**
5
+ * Retrieve transaction metadata by ID.
6
+ *
7
+ * @param transactionId - ID of the transaction to retrieve.
8
+ * @param messenger - Controller messenger.
9
+ * @returns The transaction metadata or undefined if not found.
10
+ */
11
+ export declare function getTransaction(transactionId: string, messenger: TransactionPayControllerMessenger): TransactionMeta | undefined;
12
+ /**
13
+ * Poll for transaction changes and update the transaction data accordingly.
14
+ *
15
+ * @param messenger - Controller messenger.
16
+ * @param updateTransactionData - Callback to update transaction data.
17
+ * @param removeTransactionData - Callback to remove transaction data.
18
+ */
19
+ export declare function pollTransactionChanges(messenger: TransactionPayControllerMessenger, updateTransactionData: UpdateTransactionDataCallback, removeTransactionData: (transactionId: string) => void): void;
20
+ /**
21
+ * Wait for a transaction to be confirmed or fail.
22
+ *
23
+ * @param transactionId - ID of the transaction to wait for.
24
+ * @param messenger - Controller messenger.
25
+ * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.
26
+ */
27
+ export declare function waitForTransactionConfirmed(transactionId: string, messenger: TransactionPayControllerMessenger): Promise<void>;
28
+ /**
29
+ * Update a transaction by applying a function to its draft.
30
+ *
31
+ * @param request - Request object.
32
+ * @param request.transactionId - ID of the transaction to update.
33
+ * @param request.messenger - Controller messenger.
34
+ * @param request.note - Note describing the update.
35
+ * @param fn - Function that applies updates to the transaction draft.
36
+ */
37
+ export declare function updateTransaction({ transactionId, messenger, note, }: {
38
+ transactionId: string;
39
+ messenger: TransactionPayControllerMessenger;
40
+ note: string;
41
+ }, fn: (draft: TransactionMeta) => void): void;
42
+ //# sourceMappingURL=transaction.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACrB,yCAAyC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,6BAA6B,EAC9B,qBAAiB;AAIlB,eAAO,MAAM,kBAAkB,qBAI9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,GAC3C,eAAe,GAAG,SAAS,CAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,QA6CvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,iBAgD7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EACE,aAAa,EACb,SAAS,EACT,IAAI,GACL,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,EACD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,QAiBrC"}
@@ -0,0 +1,126 @@
1
+ import { TransactionStatus } from "@metamask/transaction-controller";
2
+ import { createModuleLogger } from "@metamask/utils";
3
+ import $lodash from "lodash";
4
+ const { cloneDeep } = $lodash;
5
+ import { parseRequiredTokens } from "./required-tokens.mjs";
6
+ import { projectLogger } from "../logger.mjs";
7
+ const log = createModuleLogger(projectLogger, 'transaction');
8
+ export const FINALIZED_STATUSES = [
9
+ TransactionStatus.confirmed,
10
+ TransactionStatus.dropped,
11
+ TransactionStatus.failed,
12
+ ];
13
+ /**
14
+ * Retrieve transaction metadata by ID.
15
+ *
16
+ * @param transactionId - ID of the transaction to retrieve.
17
+ * @param messenger - Controller messenger.
18
+ * @returns The transaction metadata or undefined if not found.
19
+ */
20
+ export function getTransaction(transactionId, messenger) {
21
+ const transactionControllerState = messenger.call('TransactionController:getState');
22
+ return transactionControllerState.transactions.find((tx) => tx.id === transactionId);
23
+ }
24
+ /**
25
+ * Poll for transaction changes and update the transaction data accordingly.
26
+ *
27
+ * @param messenger - Controller messenger.
28
+ * @param updateTransactionData - Callback to update transaction data.
29
+ * @param removeTransactionData - Callback to remove transaction data.
30
+ */
31
+ export function pollTransactionChanges(messenger, updateTransactionData, removeTransactionData) {
32
+ messenger.subscribe('TransactionController:stateChange', (transactions, previousTransactions) => {
33
+ const newTransactions = transactions.filter((tx) => !previousTransactions?.find((prevTx) => prevTx.id === tx.id));
34
+ const updatedTransactions = transactions.filter((tx) => {
35
+ const previousTransaction = previousTransactions?.find((prevTx) => prevTx.id === tx.id);
36
+ return (previousTransaction &&
37
+ previousTransaction?.txParams.data !== tx.txParams.data);
38
+ });
39
+ const finalizedTransactions = transactions.filter((tx) => {
40
+ const previousTransaction = previousTransactions?.find((prevTx) => prevTx.id === tx.id);
41
+ return (previousTransaction &&
42
+ !FINALIZED_STATUSES.includes(previousTransaction.status) &&
43
+ FINALIZED_STATUSES.includes(tx.status));
44
+ });
45
+ finalizedTransactions.forEach((tx) => onTransactionFinalized(tx, removeTransactionData));
46
+ [...newTransactions, ...updatedTransactions].forEach((tx) => onTransactionChange(tx, messenger, updateTransactionData));
47
+ }, (state) => state.transactions);
48
+ }
49
+ /**
50
+ * Wait for a transaction to be confirmed or fail.
51
+ *
52
+ * @param transactionId - ID of the transaction to wait for.
53
+ * @param messenger - Controller messenger.
54
+ * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.
55
+ */
56
+ export function waitForTransactionConfirmed(transactionId, messenger) {
57
+ return new Promise((resolve, reject) => {
58
+ const isConfirmed = (tx, fn) => {
59
+ log('Checking transaction status', tx?.status, tx?.type);
60
+ if (tx?.status === TransactionStatus.confirmed) {
61
+ fn?.();
62
+ resolve();
63
+ return true;
64
+ }
65
+ if ([TransactionStatus.dropped, TransactionStatus.failed].includes(tx?.status)) {
66
+ fn?.();
67
+ reject(new Error(`Transaction failed - ${tx?.type} - ${tx?.error?.message}`));
68
+ return true;
69
+ }
70
+ return false;
71
+ };
72
+ const initialState = messenger.call('TransactionController:getState');
73
+ const initialTx = initialState.transactions.find((t) => t.id === transactionId);
74
+ if (isConfirmed(initialTx)) {
75
+ return;
76
+ }
77
+ const handler = (tx) => {
78
+ const unsubscribe = () => messenger.unsubscribe('TransactionController:stateChange', handler);
79
+ isConfirmed(tx, unsubscribe);
80
+ };
81
+ messenger.subscribe('TransactionController:stateChange', handler, (state) => state.transactions.find((tx) => tx.id === transactionId));
82
+ });
83
+ }
84
+ /**
85
+ * Update a transaction by applying a function to its draft.
86
+ *
87
+ * @param request - Request object.
88
+ * @param request.transactionId - ID of the transaction to update.
89
+ * @param request.messenger - Controller messenger.
90
+ * @param request.note - Note describing the update.
91
+ * @param fn - Function that applies updates to the transaction draft.
92
+ */
93
+ export function updateTransaction({ transactionId, messenger, note, }, fn) {
94
+ const transaction = getTransaction(transactionId, messenger);
95
+ if (!transaction) {
96
+ throw new Error(`Transaction not found: ${transactionId}`);
97
+ }
98
+ const newTransaction = cloneDeep(transaction);
99
+ fn(newTransaction);
100
+ messenger.call('TransactionController:updateTransaction', newTransaction, note);
101
+ }
102
+ /**
103
+ * Handle a transaction change by updating its associated data.
104
+ *
105
+ * @param transaction - Transaction metadata.
106
+ * @param messenger - Controller messenger.
107
+ * @param updateTransactionData - Callback to update transaction data.
108
+ */
109
+ function onTransactionChange(transaction, messenger, updateTransactionData) {
110
+ const tokens = parseRequiredTokens(transaction, messenger);
111
+ log('Transaction changed', { transaction, tokens });
112
+ updateTransactionData(transaction.id, (data) => {
113
+ data.tokens = tokens;
114
+ });
115
+ }
116
+ /**
117
+ * Handle a finalized transaction by removing its associated data.
118
+ *
119
+ * @param transaction - Transaction metadata.
120
+ * @param removeTransactionData - Callback to remove transaction data.
121
+ */
122
+ function onTransactionFinalized(transaction, removeTransactionData) {
123
+ log('Transaction finalized', { transaction });
124
+ removeTransactionData(transaction.id);
125
+ }
126
+ //# sourceMappingURL=transaction.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStatus,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\n\nimport { parseRequiredTokens } from './required-tokens';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPayControllerMessenger,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'transaction');\n\nexport const FINALIZED_STATUSES = [\n TransactionStatus.confirmed,\n TransactionStatus.dropped,\n TransactionStatus.failed,\n];\n\n/**\n * Retrieve transaction metadata by ID.\n *\n * @param transactionId - ID of the transaction to retrieve.\n * @param messenger - Controller messenger.\n * @returns The transaction metadata or undefined if not found.\n */\nexport function getTransaction(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n): TransactionMeta | undefined {\n const transactionControllerState = messenger.call(\n 'TransactionController:getState',\n );\n\n return transactionControllerState.transactions.find(\n (tx) => tx.id === transactionId,\n );\n}\n\n/**\n * Poll for transaction changes and update the transaction data accordingly.\n *\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nexport function pollTransactionChanges(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n removeTransactionData: (transactionId: string) => void,\n) {\n messenger.subscribe(\n 'TransactionController:stateChange',\n (\n transactions: TransactionMeta[],\n previousTransactions: TransactionMeta[] | undefined,\n ) => {\n const newTransactions = transactions.filter(\n (tx) => !previousTransactions?.find((prevTx) => prevTx.id === tx.id),\n );\n\n const updatedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n previousTransaction?.txParams.data !== tx.txParams.data\n );\n });\n\n const finalizedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n !FINALIZED_STATUSES.includes(previousTransaction.status) &&\n FINALIZED_STATUSES.includes(tx.status)\n );\n });\n\n finalizedTransactions.forEach((tx) =>\n onTransactionFinalized(tx, removeTransactionData),\n );\n\n [...newTransactions, ...updatedTransactions].forEach((tx) =>\n onTransactionChange(tx, messenger, updateTransactionData),\n );\n },\n (state) => state.transactions,\n );\n}\n\n/**\n * Wait for a transaction to be confirmed or fail.\n *\n * @param transactionId - ID of the transaction to wait for.\n * @param messenger - Controller messenger.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.\n */\nexport function waitForTransactionConfirmed(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n) {\n return new Promise<void>((resolve, reject) => {\n const isConfirmed = (tx?: TransactionMeta, fn?: () => void) => {\n log('Checking transaction status', tx?.status, tx?.type);\n\n if (tx?.status === TransactionStatus.confirmed) {\n fn?.();\n resolve();\n return true;\n }\n\n if (\n [TransactionStatus.dropped, TransactionStatus.failed].includes(\n tx?.status as TransactionStatus,\n )\n ) {\n fn?.();\n reject(\n new Error(`Transaction failed - ${tx?.type} - ${tx?.error?.message}`),\n );\n return true;\n }\n\n return false;\n };\n\n const initialState = messenger.call('TransactionController:getState');\n\n const initialTx = initialState.transactions.find(\n (t) => t.id === transactionId,\n );\n\n if (isConfirmed(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta) => {\n const unsubscribe = () =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n isConfirmed(tx, unsubscribe);\n };\n\n messenger.subscribe('TransactionController:stateChange', handler, (state) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Update a transaction by applying a function to its draft.\n *\n * @param request - Request object.\n * @param request.transactionId - ID of the transaction to update.\n * @param request.messenger - Controller messenger.\n * @param request.note - Note describing the update.\n * @param fn - Function that applies updates to the transaction draft.\n */\nexport function updateTransaction(\n {\n transactionId,\n messenger,\n note,\n }: {\n transactionId: string;\n messenger: TransactionPayControllerMessenger;\n note: string;\n },\n fn: (draft: TransactionMeta) => void,\n) {\n const transaction = getTransaction(transactionId, messenger as never);\n\n if (!transaction) {\n throw new Error(`Transaction not found: ${transactionId}`);\n }\n\n const newTransaction = cloneDeep(transaction);\n\n fn(newTransaction);\n\n messenger.call(\n 'TransactionController:updateTransaction',\n newTransaction,\n note,\n );\n}\n\n/**\n * Handle a transaction change by updating its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n */\nfunction onTransactionChange(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const tokens = parseRequiredTokens(transaction, messenger);\n\n log('Transaction changed', { transaction, tokens });\n\n updateTransactionData(transaction.id, (data) => {\n data.tokens = tokens;\n });\n}\n\n/**\n * Handle a finalized transaction by removing its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nfunction onTransactionFinalized(\n transaction: TransactionMeta,\n removeTransactionData: (transactionId: string) => void,\n) {\n log('Transaction finalized', { transaction });\n removeTransactionData(transaction.id);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@metamask/transaction-pay-controller",
3
+ "version": "1.0.0",
4
+ "description": "Manages alternate payment strategies to provide required funds for transactions in MetaMask",
5
+ "keywords": [
6
+ "MetaMask",
7
+ "Ethereum"
8
+ ],
9
+ "homepage": "https://github.com/MetaMask/core/tree/main/packages/transaction-pay-controller#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/MetaMask/core/issues"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/MetaMask/core.git"
16
+ },
17
+ "license": "MIT",
18
+ "sideEffects": false,
19
+ "exports": {
20
+ ".": {
21
+ "import": {
22
+ "types": "./dist/index.d.mts",
23
+ "default": "./dist/index.mjs"
24
+ },
25
+ "require": {
26
+ "types": "./dist/index.d.cts",
27
+ "default": "./dist/index.cjs"
28
+ }
29
+ },
30
+ "./package.json": "./package.json"
31
+ },
32
+ "main": "./dist/index.cjs",
33
+ "types": "./dist/index.d.cts",
34
+ "files": [
35
+ "dist/"
36
+ ],
37
+ "scripts": {
38
+ "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references",
39
+ "build:docs": "typedoc",
40
+ "changelog:update": "../../scripts/update-changelog.sh @metamask/transaction-pay-controller",
41
+ "changelog:validate": "../../scripts/validate-changelog.sh @metamask/transaction-pay-controller",
42
+ "prepare-manifest:preview": "../../scripts/prepare-preview-manifest.sh",
43
+ "publish:preview": "yarn npm publish --tag preview",
44
+ "since-latest-release": "../../scripts/since-latest-release.sh",
45
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
46
+ "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache",
47
+ "test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose",
48
+ "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
49
+ },
50
+ "dependencies": {
51
+ "@ethersproject/abi": "^5.7.0",
52
+ "@ethersproject/contracts": "^5.7.0",
53
+ "@metamask/base-controller": "^9.0.0",
54
+ "@metamask/controller-utils": "^11.15.0",
55
+ "@metamask/messenger": "^0.3.0",
56
+ "@metamask/metamask-eth-abis": "^3.1.1",
57
+ "@metamask/utils": "^11.8.1",
58
+ "bignumber.js": "^9.1.2",
59
+ "bn.js": "^5.2.1",
60
+ "immer": "^9.0.6",
61
+ "lodash": "^4.17.21"
62
+ },
63
+ "devDependencies": {
64
+ "@metamask/assets-controllers": "^85.0.0",
65
+ "@metamask/auto-changelog": "^3.4.4",
66
+ "@metamask/bridge-controller": "^57.0.0",
67
+ "@metamask/bridge-status-controller": "^57.0.0",
68
+ "@metamask/gas-fee-controller": "^25.0.0",
69
+ "@metamask/network-controller": "^25.0.0",
70
+ "@metamask/remote-feature-flag-controller": "^2.0.0",
71
+ "@metamask/transaction-controller": "^61.1.0",
72
+ "@ts-bridge/cli": "^0.6.1",
73
+ "@types/jest": "^27.4.1",
74
+ "deepmerge": "^4.2.2",
75
+ "jest": "^27.5.1",
76
+ "ts-jest": "^27.1.4",
77
+ "typedoc": "^0.24.8",
78
+ "typedoc-plugin-missing-exports": "^2.0.0",
79
+ "typescript": "~5.2.2"
80
+ },
81
+ "peerDependencies": {
82
+ "@metamask/assets-controllers": "^85.0.0",
83
+ "@metamask/bridge-controller": "^57.0.0",
84
+ "@metamask/bridge-status-controller": "^57.0.0",
85
+ "@metamask/gas-fee-controller": "^25.0.0",
86
+ "@metamask/network-controller": "^25.0.0",
87
+ "@metamask/remote-feature-flag-controller": "^2.0.0",
88
+ "@metamask/transaction-controller": "^61.0.0"
89
+ },
90
+ "engines": {
91
+ "node": "^18.18 || >=20"
92
+ },
93
+ "publishConfig": {
94
+ "access": "public",
95
+ "registry": "https://registry.npmjs.org/"
96
+ }
97
+ }