@metamask-previews/transaction-pay-controller 0.0.0-preview-6bf4b220

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 +14 -0
  2. package/LICENSE +20 -0
  3. package/README.md +19 -0
  4. package/dist/TransactionPayController.cjs +90 -0
  5. package/dist/TransactionPayController.cjs.map +1 -0
  6. package/dist/TransactionPayController.d.cts +14 -0
  7. package/dist/TransactionPayController.d.cts.map +1 -0
  8. package/dist/TransactionPayController.d.mts +14 -0
  9. package/dist/TransactionPayController.d.mts.map +1 -0
  10. package/dist/TransactionPayController.mjs +87 -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 +20 -0
  15. package/dist/actions/update-payment-token.d.cts.map +1 -0
  16. package/dist/actions/update-payment-token.d.mts +20 -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 +396 -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 +390 -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 +8 -0
  93. package/dist/strategy/relay/constants.cjs.map +1 -0
  94. package/dist/strategy/relay/constants.d.cts +5 -0
  95. package/dist/strategy/relay/constants.d.cts.map +1 -0
  96. package/dist/strategy/relay/constants.d.mts +5 -0
  97. package/dist/strategy/relay/constants.d.mts.map +1 -0
  98. package/dist/strategy/relay/constants.mjs +5 -0
  99. package/dist/strategy/relay/constants.mjs.map +1 -0
  100. package/dist/strategy/relay/relay-quotes.cjs +193 -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 +189 -0
  107. package/dist/strategy/relay/relay-quotes.mjs.map +1 -0
  108. package/dist/strategy/relay/relay-submit.cjs +129 -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 +125 -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 +71 -0
  133. package/dist/tests/messenger-mock.cjs.map +1 -0
  134. package/dist/tests/messenger-mock.d.cts +211 -0
  135. package/dist/tests/messenger-mock.d.cts.map +1 -0
  136. package/dist/tests/messenger-mock.d.mts +211 -0
  137. package/dist/tests/messenger-mock.d.mts.map +1 -0
  138. package/dist/tests/messenger-mock.mjs +67 -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 +149 -0
  143. package/dist/types.d.cts.map +1 -0
  144. package/dist/types.d.mts +149 -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 +69 -0
  149. package/dist/utils/gas.cjs.map +1 -0
  150. package/dist/utils/gas.d.cts +26 -0
  151. package/dist/utils/gas.d.cts.map +1 -0
  152. package/dist/utils/gas.d.mts +26 -0
  153. package/dist/utils/gas.d.mts.map +1 -0
  154. package/dist/utils/gas.mjs +64 -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 +96 -0
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateSourceAmounts = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const bignumber_js_1 = require("bignumber.js");
6
+ const token_1 = require("./token.cjs");
7
+ const logger_1 = require("../logger.cjs");
8
+ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'source-amounts');
9
+ /**
10
+ * Update the source amounts for a transaction.
11
+ *
12
+ * @param transactionId - ID of the transaction to update.
13
+ * @param transactionData - Existing transaction data.
14
+ * @param messenger - Controller messenger.
15
+ */
16
+ function updateSourceAmounts(transactionId, transactionData, messenger) {
17
+ if (!transactionData) {
18
+ return;
19
+ }
20
+ const { paymentToken, tokens } = transactionData;
21
+ if (!tokens.length || !paymentToken) {
22
+ return;
23
+ }
24
+ const sourceAmounts = tokens
25
+ .map((t) => calculateSourceAmount(paymentToken, t, messenger))
26
+ .filter(Boolean);
27
+ log('Updated source amounts', { transactionId, sourceAmounts });
28
+ transactionData.sourceAmounts = sourceAmounts;
29
+ }
30
+ exports.updateSourceAmounts = updateSourceAmounts;
31
+ /**
32
+ * Calculate the required source amount for a payment token to cover a target token.
33
+ *
34
+ * @param paymentToken - Selected payment token.
35
+ * @param token - Target token to cover.
36
+ * @param messenger - Controller messenger.
37
+ * @returns The source amount or undefined if calculation failed.
38
+ */
39
+ function calculateSourceAmount(paymentToken, token, messenger) {
40
+ const paymentTokenFiatRate = (0, token_1.getTokenFiatRate)(messenger, paymentToken.address, paymentToken.chainId);
41
+ if (!paymentTokenFiatRate) {
42
+ return undefined;
43
+ }
44
+ const hasBalance = new bignumber_js_1.BigNumber(token.balanceRaw).gte(token.amountRaw);
45
+ const isSameTokenSelected = token.address.toLowerCase() === paymentToken.address.toLowerCase() &&
46
+ token.chainId === paymentToken.chainId;
47
+ if (token.skipIfBalance && hasBalance) {
48
+ log('Skipping token as sufficient balance', {
49
+ tokenAddress: token.address,
50
+ });
51
+ return undefined;
52
+ }
53
+ if (isSameTokenSelected) {
54
+ log('Skipping token as same as payment token');
55
+ return undefined;
56
+ }
57
+ const sourceAmountHumanValue = new bignumber_js_1.BigNumber(token.amountUsd).div(paymentTokenFiatRate.usdRate);
58
+ const sourceAmountHuman = sourceAmountHumanValue.toString(10);
59
+ const sourceAmountRaw = sourceAmountHumanValue
60
+ .shiftedBy(paymentToken.decimals)
61
+ .toFixed(0);
62
+ if (token.amountRaw === '0') {
63
+ log('Skipping token as zero amount', { tokenAddress: token.address });
64
+ return undefined;
65
+ }
66
+ return {
67
+ sourceAmountHuman,
68
+ sourceAmountRaw,
69
+ targetTokenAddress: token.address,
70
+ };
71
+ }
72
+ //# sourceMappingURL=source-amounts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-amounts.cjs","sourceRoot":"","sources":["../../src/utils/source-amounts.ts"],"names":[],"mappings":";;;AAAA,2CAAqD;AACrD,+CAAyC;AAEzC,uCAA2C;AAK3C,0CAA0C;AAO1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,aAAqB,EACrB,eAA4C,EAC5C,SAA4C;IAE5C,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO;KACR;IAED,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;IAEjD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE;QACnC,OAAO;KACR;IAED,MAAM,aAAa,GAAG,MAAM;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;SAC7D,MAAM,CAAC,OAAO,CAAiC,CAAC;IAEnD,GAAG,CAAC,wBAAwB,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;IAEhE,eAAe,CAAC,aAAa,GAAG,aAAa,CAAC;AAChD,CAAC;AAtBD,kDAsBC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC5B,YAAqC,EACrC,KAAkC,EAClC,SAA4C;IAE5C,MAAM,oBAAoB,GAAG,IAAA,wBAAgB,EAC3C,SAAS,EACT,YAAY,CAAC,OAAO,EACpB,YAAY,CAAC,OAAO,CACrB,CAAC;IAEF,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,UAAU,GAAG,IAAI,wBAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,mBAAmB,GACvB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE;QAClE,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC;IAEzC,IAAI,KAAK,CAAC,aAAa,IAAI,UAAU,EAAE;QACrC,GAAG,CAAC,sCAAsC,EAAE;YAC1C,YAAY,EAAE,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,mBAAmB,EAAE;QACvB,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/C,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,sBAAsB,GAAG,IAAI,wBAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAC/D,oBAAoB,CAAC,OAAO,CAC7B,CAAC;IAEF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,sBAAsB;SAC3C,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;SAChC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,EAAE;QAC3B,GAAG,CAAC,+BAA+B,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,iBAAiB;QACjB,eAAe;QACf,kBAAkB,EAAE,KAAK,CAAC,OAAO;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getTokenFiatRate } from './token';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPaymentToken,\n} from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaySourceAmount,\n TransactionData,\n TransactionPayRequiredToken,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'source-amounts');\n\n/**\n * Update the source amounts for a transaction.\n *\n * @param transactionId - ID of the transaction to update.\n * @param transactionData - Existing transaction data.\n * @param messenger - Controller messenger.\n */\nexport function updateSourceAmounts(\n transactionId: string,\n transactionData: TransactionData | undefined,\n messenger: TransactionPayControllerMessenger,\n) {\n if (!transactionData) {\n return;\n }\n\n const { paymentToken, tokens } = transactionData;\n\n if (!tokens.length || !paymentToken) {\n return;\n }\n\n const sourceAmounts = tokens\n .map((t) => calculateSourceAmount(paymentToken, t, messenger))\n .filter(Boolean) as TransactionPaySourceAmount[];\n\n log('Updated source amounts', { transactionId, sourceAmounts });\n\n transactionData.sourceAmounts = sourceAmounts;\n}\n\n/**\n * Calculate the required source amount for a payment token to cover a target token.\n *\n * @param paymentToken - Selected payment token.\n * @param token - Target token to cover.\n * @param messenger - Controller messenger.\n * @returns The source amount or undefined if calculation failed.\n */\nfunction calculateSourceAmount(\n paymentToken: TransactionPaymentToken,\n token: TransactionPayRequiredToken,\n messenger: TransactionPayControllerMessenger,\n): TransactionPaySourceAmount | undefined {\n const paymentTokenFiatRate = getTokenFiatRate(\n messenger,\n paymentToken.address,\n paymentToken.chainId,\n );\n\n if (!paymentTokenFiatRate) {\n return undefined;\n }\n\n const hasBalance = new BigNumber(token.balanceRaw).gte(token.amountRaw);\n\n const isSameTokenSelected =\n token.address.toLowerCase() === paymentToken.address.toLowerCase() &&\n token.chainId === paymentToken.chainId;\n\n if (token.skipIfBalance && hasBalance) {\n log('Skipping token as sufficient balance', {\n tokenAddress: token.address,\n });\n return undefined;\n }\n\n if (isSameTokenSelected) {\n log('Skipping token as same as payment token');\n return undefined;\n }\n\n const sourceAmountHumanValue = new BigNumber(token.amountUsd).div(\n paymentTokenFiatRate.usdRate,\n );\n\n const sourceAmountHuman = sourceAmountHumanValue.toString(10);\n\n const sourceAmountRaw = sourceAmountHumanValue\n .shiftedBy(paymentToken.decimals)\n .toFixed(0);\n\n if (token.amountRaw === '0') {\n log('Skipping token as zero amount', { tokenAddress: token.address });\n return undefined;\n }\n\n return {\n sourceAmountHuman,\n sourceAmountRaw,\n targetTokenAddress: token.address,\n };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { TransactionPayControllerMessenger } from "../index.cjs";
2
+ import type { TransactionData } from "../types.cjs";
3
+ /**
4
+ * Update the source amounts for a transaction.
5
+ *
6
+ * @param transactionId - ID of the transaction to update.
7
+ * @param transactionData - Existing transaction data.
8
+ * @param messenger - Controller messenger.
9
+ */
10
+ export declare function updateSourceAmounts(transactionId: string, transactionData: TransactionData | undefined, messenger: TransactionPayControllerMessenger): void;
11
+ //# sourceMappingURL=source-amounts.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-amounts.d.cts","sourceRoot":"","sources":["../../src/utils/source-amounts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iCAAiC,EAElC,qBAAW;AAEZ,OAAO,KAAK,EAEV,eAAe,EAEhB,qBAAiB;AAIlB;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,SAAS,EAAE,iCAAiC,QAmB7C"}
@@ -0,0 +1,11 @@
1
+ import type { TransactionPayControllerMessenger } from "../index.mjs";
2
+ import type { TransactionData } from "../types.mjs";
3
+ /**
4
+ * Update the source amounts for a transaction.
5
+ *
6
+ * @param transactionId - ID of the transaction to update.
7
+ * @param transactionData - Existing transaction data.
8
+ * @param messenger - Controller messenger.
9
+ */
10
+ export declare function updateSourceAmounts(transactionId: string, transactionData: TransactionData | undefined, messenger: TransactionPayControllerMessenger): void;
11
+ //# sourceMappingURL=source-amounts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-amounts.d.mts","sourceRoot":"","sources":["../../src/utils/source-amounts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iCAAiC,EAElC,qBAAW;AAEZ,OAAO,KAAK,EAEV,eAAe,EAEhB,qBAAiB;AAIlB;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,SAAS,EAAE,iCAAiC,QAmB7C"}
@@ -0,0 +1,68 @@
1
+ import { createModuleLogger } from "@metamask/utils";
2
+ import { BigNumber } from "bignumber.js";
3
+ import { getTokenFiatRate } from "./token.mjs";
4
+ import { projectLogger } from "../logger.mjs";
5
+ const log = createModuleLogger(projectLogger, 'source-amounts');
6
+ /**
7
+ * Update the source amounts for a transaction.
8
+ *
9
+ * @param transactionId - ID of the transaction to update.
10
+ * @param transactionData - Existing transaction data.
11
+ * @param messenger - Controller messenger.
12
+ */
13
+ export function updateSourceAmounts(transactionId, transactionData, messenger) {
14
+ if (!transactionData) {
15
+ return;
16
+ }
17
+ const { paymentToken, tokens } = transactionData;
18
+ if (!tokens.length || !paymentToken) {
19
+ return;
20
+ }
21
+ const sourceAmounts = tokens
22
+ .map((t) => calculateSourceAmount(paymentToken, t, messenger))
23
+ .filter(Boolean);
24
+ log('Updated source amounts', { transactionId, sourceAmounts });
25
+ transactionData.sourceAmounts = sourceAmounts;
26
+ }
27
+ /**
28
+ * Calculate the required source amount for a payment token to cover a target token.
29
+ *
30
+ * @param paymentToken - Selected payment token.
31
+ * @param token - Target token to cover.
32
+ * @param messenger - Controller messenger.
33
+ * @returns The source amount or undefined if calculation failed.
34
+ */
35
+ function calculateSourceAmount(paymentToken, token, messenger) {
36
+ const paymentTokenFiatRate = getTokenFiatRate(messenger, paymentToken.address, paymentToken.chainId);
37
+ if (!paymentTokenFiatRate) {
38
+ return undefined;
39
+ }
40
+ const hasBalance = new BigNumber(token.balanceRaw).gte(token.amountRaw);
41
+ const isSameTokenSelected = token.address.toLowerCase() === paymentToken.address.toLowerCase() &&
42
+ token.chainId === paymentToken.chainId;
43
+ if (token.skipIfBalance && hasBalance) {
44
+ log('Skipping token as sufficient balance', {
45
+ tokenAddress: token.address,
46
+ });
47
+ return undefined;
48
+ }
49
+ if (isSameTokenSelected) {
50
+ log('Skipping token as same as payment token');
51
+ return undefined;
52
+ }
53
+ const sourceAmountHumanValue = new BigNumber(token.amountUsd).div(paymentTokenFiatRate.usdRate);
54
+ const sourceAmountHuman = sourceAmountHumanValue.toString(10);
55
+ const sourceAmountRaw = sourceAmountHumanValue
56
+ .shiftedBy(paymentToken.decimals)
57
+ .toFixed(0);
58
+ if (token.amountRaw === '0') {
59
+ log('Skipping token as zero amount', { tokenAddress: token.address });
60
+ return undefined;
61
+ }
62
+ return {
63
+ sourceAmountHuman,
64
+ sourceAmountRaw,
65
+ targetTokenAddress: token.address,
66
+ };
67
+ }
68
+ //# sourceMappingURL=source-amounts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-amounts.mjs","sourceRoot":"","sources":["../../src/utils/source-amounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AACrD,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,EAAE,gBAAgB,EAAE,oBAAgB;AAK3C,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAO1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAAqB,EACrB,eAA4C,EAC5C,SAA4C;IAE5C,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO;KACR;IAED,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;IAEjD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE;QACnC,OAAO;KACR;IAED,MAAM,aAAa,GAAG,MAAM;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;SAC7D,MAAM,CAAC,OAAO,CAAiC,CAAC;IAEnD,GAAG,CAAC,wBAAwB,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;IAEhE,eAAe,CAAC,aAAa,GAAG,aAAa,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC5B,YAAqC,EACrC,KAAkC,EAClC,SAA4C;IAE5C,MAAM,oBAAoB,GAAG,gBAAgB,CAC3C,SAAS,EACT,YAAY,CAAC,OAAO,EACpB,YAAY,CAAC,OAAO,CACrB,CAAC;IAEF,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,mBAAmB,GACvB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE;QAClE,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC;IAEzC,IAAI,KAAK,CAAC,aAAa,IAAI,UAAU,EAAE;QACrC,GAAG,CAAC,sCAAsC,EAAE;YAC1C,YAAY,EAAE,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,mBAAmB,EAAE;QACvB,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/C,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,sBAAsB,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAC/D,oBAAoB,CAAC,OAAO,CAC7B,CAAC;IAEF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,sBAAsB;SAC3C,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;SAChC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,EAAE;QAC3B,GAAG,CAAC,+BAA+B,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,iBAAiB;QACjB,eAAe;QACf,kBAAkB,EAAE,KAAK,CAAC,OAAO;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getTokenFiatRate } from './token';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPaymentToken,\n} from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaySourceAmount,\n TransactionData,\n TransactionPayRequiredToken,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'source-amounts');\n\n/**\n * Update the source amounts for a transaction.\n *\n * @param transactionId - ID of the transaction to update.\n * @param transactionData - Existing transaction data.\n * @param messenger - Controller messenger.\n */\nexport function updateSourceAmounts(\n transactionId: string,\n transactionData: TransactionData | undefined,\n messenger: TransactionPayControllerMessenger,\n) {\n if (!transactionData) {\n return;\n }\n\n const { paymentToken, tokens } = transactionData;\n\n if (!tokens.length || !paymentToken) {\n return;\n }\n\n const sourceAmounts = tokens\n .map((t) => calculateSourceAmount(paymentToken, t, messenger))\n .filter(Boolean) as TransactionPaySourceAmount[];\n\n log('Updated source amounts', { transactionId, sourceAmounts });\n\n transactionData.sourceAmounts = sourceAmounts;\n}\n\n/**\n * Calculate the required source amount for a payment token to cover a target token.\n *\n * @param paymentToken - Selected payment token.\n * @param token - Target token to cover.\n * @param messenger - Controller messenger.\n * @returns The source amount or undefined if calculation failed.\n */\nfunction calculateSourceAmount(\n paymentToken: TransactionPaymentToken,\n token: TransactionPayRequiredToken,\n messenger: TransactionPayControllerMessenger,\n): TransactionPaySourceAmount | undefined {\n const paymentTokenFiatRate = getTokenFiatRate(\n messenger,\n paymentToken.address,\n paymentToken.chainId,\n );\n\n if (!paymentTokenFiatRate) {\n return undefined;\n }\n\n const hasBalance = new BigNumber(token.balanceRaw).gte(token.amountRaw);\n\n const isSameTokenSelected =\n token.address.toLowerCase() === paymentToken.address.toLowerCase() &&\n token.chainId === paymentToken.chainId;\n\n if (token.skipIfBalance && hasBalance) {\n log('Skipping token as sufficient balance', {\n tokenAddress: token.address,\n });\n return undefined;\n }\n\n if (isSameTokenSelected) {\n log('Skipping token as same as payment token');\n return undefined;\n }\n\n const sourceAmountHumanValue = new BigNumber(token.amountUsd).div(\n paymentTokenFiatRate.usdRate,\n );\n\n const sourceAmountHuman = sourceAmountHumanValue.toString(10);\n\n const sourceAmountRaw = sourceAmountHumanValue\n .shiftedBy(paymentToken.decimals)\n .toFixed(0);\n\n if (token.amountRaw === '0') {\n log('Skipping token as zero amount', { tokenAddress: token.address });\n return undefined;\n }\n\n return {\n sourceAmountHuman,\n sourceAmountRaw,\n targetTokenAddress: token.address,\n };\n}\n"]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getStrategyByName = exports.getStrategy = void 0;
4
+ const constants_1 = require("../constants.cjs");
5
+ const BridgeStrategy_1 = require("../strategy/bridge/BridgeStrategy.cjs");
6
+ const RelayStrategy_1 = require("../strategy/relay/RelayStrategy.cjs");
7
+ const TestStrategy_1 = require("../strategy/test/TestStrategy.cjs");
8
+ /**
9
+ * Get the payment strategy instance.
10
+ *
11
+ * @param messenger - Controller messenger
12
+ * @param transaction - Transaction to get the strategy for.
13
+ * @returns The payment strategy instance.
14
+ */
15
+ async function getStrategy(messenger, transaction) {
16
+ const strategyName = await messenger.call('TransactionPayController:getStrategy', transaction);
17
+ return getStrategyByName(strategyName);
18
+ }
19
+ exports.getStrategy = getStrategy;
20
+ /**
21
+ * Get strategy instance by name.
22
+ *
23
+ * @param strategyName - Strategy name.
24
+ * @returns - Strategy instance.
25
+ */
26
+ function getStrategyByName(strategyName) {
27
+ switch (strategyName) {
28
+ case constants_1.TransactionPayStrategy.Bridge:
29
+ return new BridgeStrategy_1.BridgeStrategy();
30
+ case constants_1.TransactionPayStrategy.Relay:
31
+ return new RelayStrategy_1.RelayStrategy();
32
+ case constants_1.TransactionPayStrategy.Test:
33
+ return new TestStrategy_1.TestStrategy();
34
+ default:
35
+ throw new Error(`Unknown strategy: ${strategyName}`);
36
+ }
37
+ }
38
+ exports.getStrategyByName = getStrategyByName;
39
+ //# sourceMappingURL=strategy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.cjs","sourceRoot":"","sources":["../../src/utils/strategy.ts"],"names":[],"mappings":";;;AAEA,gDAAsD;AACtD,0EAAmE;AACnE,uEAAgE;AAChE,oEAA6D;AAG7D;;;;;;GAMG;AACI,KAAK,UAAU,WAAW,CAC/B,SAA4C,EAC5C,WAA4B;IAE5B,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,IAAI,CACvC,sCAAsC,EACtC,WAAW,CACZ,CAAC;IAEF,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC;AAVD,kCAUC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,YAAoC;IAEpC,QAAQ,YAAY,EAAE;QACpB,KAAK,kCAAsB,CAAC,MAAM;YAChC,OAAO,IAAI,+BAAc,EAAW,CAAC;QAEvC,KAAK,kCAAsB,CAAC,KAAK;YAC/B,OAAO,IAAI,6BAAa,EAAW,CAAC;QAEtC,KAAK,kCAAsB,CAAC,IAAI;YAC9B,OAAO,IAAI,2BAAY,EAAW,CAAC;QAErC;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAsB,EAAE,CAAC,CAAC;KAClE;AACH,CAAC;AAhBD,8CAgBC","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\n\nimport { TransactionPayStrategy } from '../constants';\nimport { BridgeStrategy } from '../strategy/bridge/BridgeStrategy';\nimport { RelayStrategy } from '../strategy/relay/RelayStrategy';\nimport { TestStrategy } from '../strategy/test/TestStrategy';\nimport type { PayStrategy, TransactionPayControllerMessenger } from '../types';\n\n/**\n * Get the payment strategy instance.\n *\n * @param messenger - Controller messenger\n * @param transaction - Transaction to get the strategy for.\n * @returns The payment strategy instance.\n */\nexport async function getStrategy(\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<PayStrategy<unknown>> {\n const strategyName = await messenger.call(\n 'TransactionPayController:getStrategy',\n transaction,\n );\n\n return getStrategyByName(strategyName);\n}\n\n/**\n * Get strategy instance by name.\n *\n * @param strategyName - Strategy name.\n * @returns - Strategy instance.\n */\nexport function getStrategyByName(\n strategyName: TransactionPayStrategy,\n): PayStrategy<unknown> {\n switch (strategyName) {\n case TransactionPayStrategy.Bridge:\n return new BridgeStrategy() as never;\n\n case TransactionPayStrategy.Relay:\n return new RelayStrategy() as never;\n\n case TransactionPayStrategy.Test:\n return new TestStrategy() as never;\n\n default:\n throw new Error(`Unknown strategy: ${strategyName as string}`);\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { TransactionMeta } from "@metamask/transaction-controller";
2
+ import { TransactionPayStrategy } from "../constants.cjs";
3
+ import type { PayStrategy, TransactionPayControllerMessenger } from "../types.cjs";
4
+ /**
5
+ * Get the payment strategy instance.
6
+ *
7
+ * @param messenger - Controller messenger
8
+ * @param transaction - Transaction to get the strategy for.
9
+ * @returns The payment strategy instance.
10
+ */
11
+ export declare function getStrategy(messenger: TransactionPayControllerMessenger, transaction: TransactionMeta): Promise<PayStrategy<unknown>>;
12
+ /**
13
+ * Get strategy instance by name.
14
+ *
15
+ * @param strategyName - Strategy name.
16
+ * @returns - Strategy instance.
17
+ */
18
+ export declare function getStrategyByName(strategyName: TransactionPayStrategy): PayStrategy<unknown>;
19
+ //# sourceMappingURL=strategy.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.cts","sourceRoot":"","sources":["../../src/utils/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAExE,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AAItD,OAAO,KAAK,EAAE,WAAW,EAAE,iCAAiC,EAAE,qBAAiB;AAE/E;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,iCAAiC,EAC5C,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAO/B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,sBAAsB,GACnC,WAAW,CAAC,OAAO,CAAC,CActB"}
@@ -0,0 +1,19 @@
1
+ import type { TransactionMeta } from "@metamask/transaction-controller";
2
+ import { TransactionPayStrategy } from "../constants.mjs";
3
+ import type { PayStrategy, TransactionPayControllerMessenger } from "../types.mjs";
4
+ /**
5
+ * Get the payment strategy instance.
6
+ *
7
+ * @param messenger - Controller messenger
8
+ * @param transaction - Transaction to get the strategy for.
9
+ * @returns The payment strategy instance.
10
+ */
11
+ export declare function getStrategy(messenger: TransactionPayControllerMessenger, transaction: TransactionMeta): Promise<PayStrategy<unknown>>;
12
+ /**
13
+ * Get strategy instance by name.
14
+ *
15
+ * @param strategyName - Strategy name.
16
+ * @returns - Strategy instance.
17
+ */
18
+ export declare function getStrategyByName(strategyName: TransactionPayStrategy): PayStrategy<unknown>;
19
+ //# sourceMappingURL=strategy.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.mts","sourceRoot":"","sources":["../../src/utils/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAExE,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AAItD,OAAO,KAAK,EAAE,WAAW,EAAE,iCAAiC,EAAE,qBAAiB;AAE/E;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,iCAAiC,EAC5C,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAO/B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,sBAAsB,GACnC,WAAW,CAAC,OAAO,CAAC,CActB"}
@@ -0,0 +1,34 @@
1
+ import { TransactionPayStrategy } from "../constants.mjs";
2
+ import { BridgeStrategy } from "../strategy/bridge/BridgeStrategy.mjs";
3
+ import { RelayStrategy } from "../strategy/relay/RelayStrategy.mjs";
4
+ import { TestStrategy } from "../strategy/test/TestStrategy.mjs";
5
+ /**
6
+ * Get the payment strategy instance.
7
+ *
8
+ * @param messenger - Controller messenger
9
+ * @param transaction - Transaction to get the strategy for.
10
+ * @returns The payment strategy instance.
11
+ */
12
+ export async function getStrategy(messenger, transaction) {
13
+ const strategyName = await messenger.call('TransactionPayController:getStrategy', transaction);
14
+ return getStrategyByName(strategyName);
15
+ }
16
+ /**
17
+ * Get strategy instance by name.
18
+ *
19
+ * @param strategyName - Strategy name.
20
+ * @returns - Strategy instance.
21
+ */
22
+ export function getStrategyByName(strategyName) {
23
+ switch (strategyName) {
24
+ case TransactionPayStrategy.Bridge:
25
+ return new BridgeStrategy();
26
+ case TransactionPayStrategy.Relay:
27
+ return new RelayStrategy();
28
+ case TransactionPayStrategy.Test:
29
+ return new TestStrategy();
30
+ default:
31
+ throw new Error(`Unknown strategy: ${strategyName}`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=strategy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.mjs","sourceRoot":"","sources":["../../src/utils/strategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AACtD,OAAO,EAAE,cAAc,EAAE,8CAA0C;AACnE,OAAO,EAAE,aAAa,EAAE,4CAAwC;AAChE,OAAO,EAAE,YAAY,EAAE,0CAAsC;AAG7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAA4C,EAC5C,WAA4B;IAE5B,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,IAAI,CACvC,sCAAsC,EACtC,WAAW,CACZ,CAAC;IAEF,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoC;IAEpC,QAAQ,YAAY,EAAE;QACpB,KAAK,sBAAsB,CAAC,MAAM;YAChC,OAAO,IAAI,cAAc,EAAW,CAAC;QAEvC,KAAK,sBAAsB,CAAC,KAAK;YAC/B,OAAO,IAAI,aAAa,EAAW,CAAC;QAEtC,KAAK,sBAAsB,CAAC,IAAI;YAC9B,OAAO,IAAI,YAAY,EAAW,CAAC;QAErC;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAsB,EAAE,CAAC,CAAC;KAClE;AACH,CAAC","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\n\nimport { TransactionPayStrategy } from '../constants';\nimport { BridgeStrategy } from '../strategy/bridge/BridgeStrategy';\nimport { RelayStrategy } from '../strategy/relay/RelayStrategy';\nimport { TestStrategy } from '../strategy/test/TestStrategy';\nimport type { PayStrategy, TransactionPayControllerMessenger } from '../types';\n\n/**\n * Get the payment strategy instance.\n *\n * @param messenger - Controller messenger\n * @param transaction - Transaction to get the strategy for.\n * @returns The payment strategy instance.\n */\nexport async function getStrategy(\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<PayStrategy<unknown>> {\n const strategyName = await messenger.call(\n 'TransactionPayController:getStrategy',\n transaction,\n );\n\n return getStrategyByName(strategyName);\n}\n\n/**\n * Get strategy instance by name.\n *\n * @param strategyName - Strategy name.\n * @returns - Strategy instance.\n */\nexport function getStrategyByName(\n strategyName: TransactionPayStrategy,\n): PayStrategy<unknown> {\n switch (strategyName) {\n case TransactionPayStrategy.Bridge:\n return new BridgeStrategy() as never;\n\n case TransactionPayStrategy.Relay:\n return new RelayStrategy() as never;\n\n case TransactionPayStrategy.Test:\n return new TestStrategy() as never;\n\n default:\n throw new Error(`Unknown strategy: ${strategyName as string}`);\n }\n}\n"]}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNativeToken = exports.getTokenFiatRate = exports.getTokenInfo = exports.getAllTokenBalances = exports.getTokenBalance = void 0;
4
+ const controller_utils_1 = require("@metamask/controller-utils");
5
+ const bignumber_js_1 = require("bignumber.js");
6
+ const lodash_1 = require("lodash");
7
+ const constants_1 = require("../constants.cjs");
8
+ /**
9
+ * Get the token balance for a specific account and token.
10
+ *
11
+ * @param messenger - Controller messenger.
12
+ * @param account - Address of the account.
13
+ * @param chainId - Id of the chain.
14
+ * @param tokenAddress - Address of the token contract.
15
+ * @returns The token balance as a BigNumber.
16
+ */
17
+ function getTokenBalance(messenger, account, chainId, tokenAddress) {
18
+ const tokenBalanceControllerState = messenger.call('TokenBalancesController:getState');
19
+ const normalizedAccount = account.toLowerCase();
20
+ const normalizedTokenAddress = (0, controller_utils_1.toChecksumHexAddress)(tokenAddress);
21
+ const isNative = normalizedTokenAddress === getNativeToken(chainId);
22
+ const balanceHex = tokenBalanceControllerState.tokenBalances?.[normalizedAccount]?.[chainId]?.[normalizedTokenAddress];
23
+ if (!isNative && balanceHex === undefined) {
24
+ return '0';
25
+ }
26
+ if (!isNative && balanceHex) {
27
+ return new bignumber_js_1.BigNumber(balanceHex, 16).toString(10);
28
+ }
29
+ const accountTrackerControllerState = messenger.call('AccountTrackerController:getState');
30
+ const chainAccounts = accountTrackerControllerState.accountsByChainId?.[chainId];
31
+ const checksumAccount = (0, controller_utils_1.toChecksumHexAddress)(normalizedAccount);
32
+ const nativeBalanceHex = chainAccounts?.[checksumAccount]?.balance;
33
+ return new bignumber_js_1.BigNumber(nativeBalanceHex ?? '0x0', 16).toString(10);
34
+ }
35
+ exports.getTokenBalance = getTokenBalance;
36
+ /**
37
+ * Get the token balance for a specific account and token.
38
+ *
39
+ * @param messenger - Controller messenger.
40
+ * @param account - Address of the account.
41
+ * @returns The token balance as a BigNumber.
42
+ */
43
+ function getAllTokenBalances(messenger, account) {
44
+ const tokenBalanceControllerState = messenger.call('TokenBalancesController:getState');
45
+ const accountTrackerControllerState = messenger.call('AccountTrackerController:getState');
46
+ const nativeChainIds = Object.keys(accountTrackerControllerState.accountsByChainId);
47
+ const normalizedAccount = account.toLowerCase();
48
+ const balancesByTokenByChain = tokenBalanceControllerState.tokenBalances?.[normalizedAccount];
49
+ const tokenChainIds = Object.keys(balancesByTokenByChain);
50
+ const chainIds = (0, lodash_1.uniq)([...tokenChainIds, ...nativeChainIds]);
51
+ return chainIds.flatMap((chainId) => {
52
+ const tokenAddresses = [
53
+ ...Object.keys(balancesByTokenByChain[chainId] ?? {}),
54
+ getNativeToken(chainId),
55
+ ];
56
+ return tokenAddresses.map((tokenAddress) => ({
57
+ chainId,
58
+ tokenAddress,
59
+ balance: getTokenBalance(messenger, account, chainId, tokenAddress),
60
+ }));
61
+ });
62
+ }
63
+ exports.getAllTokenBalances = getAllTokenBalances;
64
+ /**
65
+ * Get the token decimals for a specific token.
66
+ *
67
+ * @param messenger - Controller messenger.
68
+ * @param tokenAddress - Address of the token contract.
69
+ * @param chainId - Id of the chain.
70
+ * @returns The token decimals or undefined if the token is not found.
71
+ */
72
+ function getTokenInfo(messenger, tokenAddress, chainId) {
73
+ const controllerState = messenger.call('TokensController:getState');
74
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
75
+ const isNative = normalizedTokenAddress === getNativeToken(chainId).toLowerCase();
76
+ const token = Object.values(controllerState.allTokens?.[chainId] ?? {})
77
+ .flat()
78
+ .find((t) => t.address.toLowerCase() === normalizedTokenAddress);
79
+ if (!token && !isNative) {
80
+ return undefined;
81
+ }
82
+ if (token && !isNative) {
83
+ return { decimals: token.decimals, symbol: token.symbol };
84
+ }
85
+ const ticker = getTicker(chainId, messenger);
86
+ if (!ticker) {
87
+ return undefined;
88
+ }
89
+ return { decimals: 18, symbol: ticker };
90
+ }
91
+ exports.getTokenInfo = getTokenInfo;
92
+ /**
93
+ * Calculate fiat rates for a specific token.
94
+ *
95
+ * @param messenger - Controller messenger.
96
+ * @param tokenAddress - Address of the token contract.
97
+ * @param chainId - Id of the chain.
98
+ * @returns An object containing the USD and fiat rates, or undefined if rates are not available.
99
+ */
100
+ function getTokenFiatRate(messenger, tokenAddress, chainId) {
101
+ const ticker = getTicker(chainId, messenger);
102
+ if (!ticker) {
103
+ return undefined;
104
+ }
105
+ const rateControllerState = messenger.call('TokenRatesController:getState');
106
+ const currencyRateControllerState = messenger.call('CurrencyRateController:getState');
107
+ const normalizedTokenAddress = (0, controller_utils_1.toChecksumHexAddress)(tokenAddress);
108
+ const isNative = normalizedTokenAddress === getNativeToken(chainId);
109
+ const tokenToNativeRate = rateControllerState.marketData?.[chainId]?.[normalizedTokenAddress]?.price;
110
+ if (tokenToNativeRate === undefined && !isNative) {
111
+ return undefined;
112
+ }
113
+ const { conversionRate: nativeToFiatRate, usdConversionRate: nativeToUsdRate, } = currencyRateControllerState.currencyRates?.[ticker] ?? {
114
+ conversionRate: null,
115
+ usdConversionRate: null,
116
+ };
117
+ if (nativeToFiatRate === null || nativeToUsdRate === null) {
118
+ return undefined;
119
+ }
120
+ const usdRate = new bignumber_js_1.BigNumber(tokenToNativeRate ?? 1)
121
+ .multipliedBy(nativeToUsdRate)
122
+ .toString(10);
123
+ const fiatRate = new bignumber_js_1.BigNumber(tokenToNativeRate ?? 1)
124
+ .multipliedBy(nativeToFiatRate)
125
+ .toString(10);
126
+ return { usdRate, fiatRate };
127
+ }
128
+ exports.getTokenFiatRate = getTokenFiatRate;
129
+ /**
130
+ * Get the native token address for a given chain ID.
131
+ *
132
+ * @param chainId - Chain ID.
133
+ * @returns - Native token address for the given chain ID.
134
+ */
135
+ function getNativeToken(chainId) {
136
+ switch (chainId) {
137
+ case '0x89':
138
+ return '0x0000000000000000000000000000000000001010';
139
+ default:
140
+ return constants_1.NATIVE_TOKEN_ADDRESS;
141
+ }
142
+ }
143
+ exports.getNativeToken = getNativeToken;
144
+ /**
145
+ * Get the ticker for a given chain ID.
146
+ *
147
+ * @param chainId - Chain ID.
148
+ * @param messenger - Messenger instance.
149
+ * @returns Ticker symbol for the given chain ID or undefined if not found.
150
+ */
151
+ function getTicker(chainId, messenger) {
152
+ try {
153
+ const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
154
+ const networkConfiguration = messenger.call('NetworkController:getNetworkClientById', networkClientId);
155
+ return networkConfiguration.configuration.ticker;
156
+ }
157
+ catch {
158
+ return undefined;
159
+ }
160
+ }
161
+ //# sourceMappingURL=token.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.cjs","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"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","sourcesContent":["import { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { uniq } from 'lodash';\n\nimport { NATIVE_TOKEN_ADDRESS } from '../constants';\nimport type { FiatRates, TransactionPayControllerMessenger } from '../types';\n\n/**\n * Get the token balance for a specific account and token.\n *\n * @param messenger - Controller messenger.\n * @param account - Address of the account.\n * @param chainId - Id of the chain.\n * @param tokenAddress - Address of the token contract.\n * @returns The token balance as a BigNumber.\n */\nexport function getTokenBalance(\n messenger: TransactionPayControllerMessenger,\n account: Hex,\n chainId: Hex,\n tokenAddress: Hex,\n): string {\n const tokenBalanceControllerState = messenger.call(\n 'TokenBalancesController:getState',\n );\n\n const normalizedAccount = account.toLowerCase() as Hex;\n const normalizedTokenAddress = toChecksumHexAddress(tokenAddress) as Hex;\n const isNative = normalizedTokenAddress === getNativeToken(chainId);\n\n const balanceHex =\n tokenBalanceControllerState.tokenBalances?.[normalizedAccount]?.[chainId]?.[\n normalizedTokenAddress\n ];\n\n if (!isNative && balanceHex === undefined) {\n return '0';\n }\n\n if (!isNative && balanceHex) {\n return new BigNumber(balanceHex, 16).toString(10);\n }\n\n const accountTrackerControllerState = messenger.call(\n 'AccountTrackerController:getState',\n );\n\n const chainAccounts =\n accountTrackerControllerState.accountsByChainId?.[chainId];\n\n const checksumAccount = toChecksumHexAddress(normalizedAccount) as Hex;\n const nativeBalanceHex = chainAccounts?.[checksumAccount]?.balance as Hex;\n\n return new BigNumber(nativeBalanceHex ?? '0x0', 16).toString(10);\n}\n\n/**\n * Get the token balance for a specific account and token.\n *\n * @param messenger - Controller messenger.\n * @param account - Address of the account.\n * @returns The token balance as a BigNumber.\n */\nexport function getAllTokenBalances(\n messenger: TransactionPayControllerMessenger,\n account: Hex,\n) {\n const tokenBalanceControllerState = messenger.call(\n 'TokenBalancesController:getState',\n );\n\n const accountTrackerControllerState = messenger.call(\n 'AccountTrackerController:getState',\n );\n\n const nativeChainIds = Object.keys(\n accountTrackerControllerState.accountsByChainId,\n ) as Hex[];\n\n const normalizedAccount = account.toLowerCase() as Hex;\n\n const balancesByTokenByChain =\n tokenBalanceControllerState.tokenBalances?.[normalizedAccount];\n\n const tokenChainIds = Object.keys(balancesByTokenByChain) as Hex[];\n const chainIds = uniq([...tokenChainIds, ...nativeChainIds]);\n\n return chainIds.flatMap((chainId) => {\n const tokenAddresses = [\n ...(Object.keys(balancesByTokenByChain[chainId] ?? {}) as Hex[]),\n getNativeToken(chainId),\n ];\n\n return tokenAddresses.map((tokenAddress) => ({\n chainId,\n tokenAddress,\n balance: getTokenBalance(messenger, account, chainId, tokenAddress),\n }));\n });\n}\n\n/**\n * Get the token decimals for a specific token.\n *\n * @param messenger - Controller messenger.\n * @param tokenAddress - Address of the token contract.\n * @param chainId - Id of the chain.\n * @returns The token decimals or undefined if the token is not found.\n */\nexport function getTokenInfo(\n messenger: TransactionPayControllerMessenger,\n tokenAddress: Hex,\n chainId: Hex,\n): { decimals: number; symbol: string } | undefined {\n const controllerState = messenger.call('TokensController:getState');\n const normalizedTokenAddress = tokenAddress.toLowerCase() as Hex;\n\n const isNative =\n normalizedTokenAddress === getNativeToken(chainId).toLowerCase();\n\n const token = Object.values(controllerState.allTokens?.[chainId] ?? {})\n .flat()\n .find((t) => t.address.toLowerCase() === normalizedTokenAddress);\n\n if (!token && !isNative) {\n return undefined;\n }\n\n if (token && !isNative) {\n return { decimals: token.decimals, symbol: token.symbol };\n }\n\n const ticker = getTicker(chainId, messenger);\n\n if (!ticker) {\n return undefined;\n }\n\n return { decimals: 18, symbol: ticker };\n}\n\n/**\n * Calculate fiat rates for a specific token.\n *\n * @param messenger - Controller messenger.\n * @param tokenAddress - Address of the token contract.\n * @param chainId - Id of the chain.\n * @returns An object containing the USD and fiat rates, or undefined if rates are not available.\n */\nexport function getTokenFiatRate(\n messenger: TransactionPayControllerMessenger,\n tokenAddress: Hex,\n chainId: Hex,\n): FiatRates | undefined {\n const ticker = getTicker(chainId, messenger);\n\n if (!ticker) {\n return undefined;\n }\n\n const rateControllerState = messenger.call('TokenRatesController:getState');\n\n const currencyRateControllerState = messenger.call(\n 'CurrencyRateController:getState',\n );\n\n const normalizedTokenAddress = toChecksumHexAddress(tokenAddress) as Hex;\n const isNative = normalizedTokenAddress === getNativeToken(chainId);\n\n const tokenToNativeRate =\n rateControllerState.marketData?.[chainId]?.[normalizedTokenAddress]?.price;\n\n if (tokenToNativeRate === undefined && !isNative) {\n return undefined;\n }\n\n const {\n conversionRate: nativeToFiatRate,\n usdConversionRate: nativeToUsdRate,\n } = currencyRateControllerState.currencyRates?.[ticker] ?? {\n conversionRate: null,\n usdConversionRate: null,\n };\n\n if (nativeToFiatRate === null || nativeToUsdRate === null) {\n return undefined;\n }\n\n const usdRate = new BigNumber(tokenToNativeRate ?? 1)\n .multipliedBy(nativeToUsdRate)\n .toString(10);\n\n const fiatRate = new BigNumber(tokenToNativeRate ?? 1)\n .multipliedBy(nativeToFiatRate)\n .toString(10);\n\n return { usdRate, fiatRate };\n}\n\n/**\n * Get the native token address for a given chain ID.\n *\n * @param chainId - Chain ID.\n * @returns - Native token address for the given chain ID.\n */\nexport function getNativeToken(chainId: Hex) {\n switch (chainId) {\n case '0x89':\n return '0x0000000000000000000000000000000000001010';\n default:\n return NATIVE_TOKEN_ADDRESS;\n }\n}\n\n/**\n * Get the ticker for a given chain ID.\n *\n * @param chainId - Chain ID.\n * @param messenger - Messenger instance.\n * @returns Ticker symbol for the given chain ID or undefined if not found.\n */\nfunction getTicker(\n chainId: Hex,\n messenger: TransactionPayControllerMessenger,\n): string | undefined {\n try {\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n const networkConfiguration = messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n return networkConfiguration.configuration.ticker;\n } catch {\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { FiatRates, TransactionPayControllerMessenger } from "../types.cjs";
3
+ /**
4
+ * Get the token balance for a specific account and token.
5
+ *
6
+ * @param messenger - Controller messenger.
7
+ * @param account - Address of the account.
8
+ * @param chainId - Id of the chain.
9
+ * @param tokenAddress - Address of the token contract.
10
+ * @returns The token balance as a BigNumber.
11
+ */
12
+ export declare function getTokenBalance(messenger: TransactionPayControllerMessenger, account: Hex, chainId: Hex, tokenAddress: Hex): string;
13
+ /**
14
+ * Get the token balance for a specific account and token.
15
+ *
16
+ * @param messenger - Controller messenger.
17
+ * @param account - Address of the account.
18
+ * @returns The token balance as a BigNumber.
19
+ */
20
+ export declare function getAllTokenBalances(messenger: TransactionPayControllerMessenger, account: Hex): {
21
+ chainId: `0x${string}`;
22
+ tokenAddress: `0x${string}`;
23
+ balance: string;
24
+ }[];
25
+ /**
26
+ * Get the token decimals for a specific token.
27
+ *
28
+ * @param messenger - Controller messenger.
29
+ * @param tokenAddress - Address of the token contract.
30
+ * @param chainId - Id of the chain.
31
+ * @returns The token decimals or undefined if the token is not found.
32
+ */
33
+ export declare function getTokenInfo(messenger: TransactionPayControllerMessenger, tokenAddress: Hex, chainId: Hex): {
34
+ decimals: number;
35
+ symbol: string;
36
+ } | undefined;
37
+ /**
38
+ * Calculate fiat rates for a specific token.
39
+ *
40
+ * @param messenger - Controller messenger.
41
+ * @param tokenAddress - Address of the token contract.
42
+ * @param chainId - Id of the chain.
43
+ * @returns An object containing the USD and fiat rates, or undefined if rates are not available.
44
+ */
45
+ export declare function getTokenFiatRate(messenger: TransactionPayControllerMessenger, tokenAddress: Hex, chainId: Hex): FiatRates | undefined;
46
+ /**
47
+ * Get the native token address for a given chain ID.
48
+ *
49
+ * @param chainId - Chain ID.
50
+ * @returns - Native token address for the given chain ID.
51
+ */
52
+ export declare function getNativeToken(chainId: Hex): `0x${string}`;
53
+ //# sourceMappingURL=token.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.cts","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,SAAS,EAAE,iCAAiC,EAAE,qBAAiB;AAE7E;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iCAAiC,EAC5C,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE,GAAG,GAChB,MAAM,CAiCR;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iCAAiC,EAC5C,OAAO,EAAE,GAAG;;;;IAkCb;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,iCAAiC,EAC5C,YAAY,EAAE,GAAG,EACjB,OAAO,EAAE,GAAG,GACX;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA0BlD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,iCAAiC,EAC5C,YAAY,EAAE,GAAG,EACjB,OAAO,EAAE,GAAG,GACX,SAAS,GAAG,SAAS,CA4CvB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,iBAO1C"}
@@ -0,0 +1,53 @@
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { FiatRates, TransactionPayControllerMessenger } from "../types.mjs";
3
+ /**
4
+ * Get the token balance for a specific account and token.
5
+ *
6
+ * @param messenger - Controller messenger.
7
+ * @param account - Address of the account.
8
+ * @param chainId - Id of the chain.
9
+ * @param tokenAddress - Address of the token contract.
10
+ * @returns The token balance as a BigNumber.
11
+ */
12
+ export declare function getTokenBalance(messenger: TransactionPayControllerMessenger, account: Hex, chainId: Hex, tokenAddress: Hex): string;
13
+ /**
14
+ * Get the token balance for a specific account and token.
15
+ *
16
+ * @param messenger - Controller messenger.
17
+ * @param account - Address of the account.
18
+ * @returns The token balance as a BigNumber.
19
+ */
20
+ export declare function getAllTokenBalances(messenger: TransactionPayControllerMessenger, account: Hex): {
21
+ chainId: `0x${string}`;
22
+ tokenAddress: `0x${string}`;
23
+ balance: string;
24
+ }[];
25
+ /**
26
+ * Get the token decimals for a specific token.
27
+ *
28
+ * @param messenger - Controller messenger.
29
+ * @param tokenAddress - Address of the token contract.
30
+ * @param chainId - Id of the chain.
31
+ * @returns The token decimals or undefined if the token is not found.
32
+ */
33
+ export declare function getTokenInfo(messenger: TransactionPayControllerMessenger, tokenAddress: Hex, chainId: Hex): {
34
+ decimals: number;
35
+ symbol: string;
36
+ } | undefined;
37
+ /**
38
+ * Calculate fiat rates for a specific token.
39
+ *
40
+ * @param messenger - Controller messenger.
41
+ * @param tokenAddress - Address of the token contract.
42
+ * @param chainId - Id of the chain.
43
+ * @returns An object containing the USD and fiat rates, or undefined if rates are not available.
44
+ */
45
+ export declare function getTokenFiatRate(messenger: TransactionPayControllerMessenger, tokenAddress: Hex, chainId: Hex): FiatRates | undefined;
46
+ /**
47
+ * Get the native token address for a given chain ID.
48
+ *
49
+ * @param chainId - Chain ID.
50
+ * @returns - Native token address for the given chain ID.
51
+ */
52
+ export declare function getNativeToken(chainId: Hex): `0x${string}`;
53
+ //# sourceMappingURL=token.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.mts","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,SAAS,EAAE,iCAAiC,EAAE,qBAAiB;AAE7E;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,iCAAiC,EAC5C,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE,GAAG,GAChB,MAAM,CAiCR;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iCAAiC,EAC5C,OAAO,EAAE,GAAG;;;;IAkCb;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,iCAAiC,EAC5C,YAAY,EAAE,GAAG,EACjB,OAAO,EAAE,GAAG,GACX;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA0BlD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,iCAAiC,EAC5C,YAAY,EAAE,GAAG,EACjB,OAAO,EAAE,GAAG,GACX,SAAS,GAAG,SAAS,CA4CvB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,iBAO1C"}