@metamask/transaction-pay-controller 23.2.0 → 23.3.1

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 (102) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionPayController-method-action-types.d.cts +5 -1
  4. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +5 -1
  6. package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionPayController.cjs +9 -3
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts +3 -2
  11. package/dist/TransactionPayController.d.cts.map +1 -1
  12. package/dist/TransactionPayController.d.mts +3 -2
  13. package/dist/TransactionPayController.d.mts.map +1 -1
  14. package/dist/TransactionPayController.mjs +9 -3
  15. package/dist/TransactionPayController.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +2 -2
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/strategy/fiat/fiat-quotes.cjs +2 -2
  23. package/dist/strategy/fiat/fiat-quotes.cjs.map +1 -1
  24. package/dist/strategy/fiat/fiat-quotes.d.cts.map +1 -1
  25. package/dist/strategy/fiat/fiat-quotes.d.mts.map +1 -1
  26. package/dist/strategy/fiat/fiat-quotes.mjs +2 -2
  27. package/dist/strategy/fiat/fiat-quotes.mjs.map +1 -1
  28. package/dist/strategy/fiat/fiat-submit-simple.cjs +63 -0
  29. package/dist/strategy/fiat/fiat-submit-simple.cjs.map +1 -0
  30. package/dist/strategy/fiat/fiat-submit-simple.d.cts +23 -0
  31. package/dist/strategy/fiat/fiat-submit-simple.d.cts.map +1 -0
  32. package/dist/strategy/fiat/fiat-submit-simple.d.mts +23 -0
  33. package/dist/strategy/fiat/fiat-submit-simple.d.mts.map +1 -0
  34. package/dist/strategy/fiat/fiat-submit-simple.mjs +59 -0
  35. package/dist/strategy/fiat/fiat-submit-simple.mjs.map +1 -0
  36. package/dist/strategy/fiat/fiat-submit-with-transaction-data.cjs +182 -0
  37. package/dist/strategy/fiat/fiat-submit-with-transaction-data.cjs.map +1 -0
  38. package/dist/strategy/fiat/fiat-submit-with-transaction-data.d.cts +27 -0
  39. package/dist/strategy/fiat/fiat-submit-with-transaction-data.d.cts.map +1 -0
  40. package/dist/strategy/fiat/fiat-submit-with-transaction-data.d.mts +27 -0
  41. package/dist/strategy/fiat/fiat-submit-with-transaction-data.d.mts.map +1 -0
  42. package/dist/strategy/fiat/fiat-submit-with-transaction-data.mjs +178 -0
  43. package/dist/strategy/fiat/fiat-submit-with-transaction-data.mjs.map +1 -0
  44. package/dist/strategy/fiat/fiat-submit.cjs +27 -101
  45. package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
  46. package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
  47. package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
  48. package/dist/strategy/fiat/fiat-submit.mjs +27 -101
  49. package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
  50. package/dist/strategy/fiat/utils.cjs +66 -1
  51. package/dist/strategy/fiat/utils.cjs.map +1 -1
  52. package/dist/strategy/fiat/utils.d.cts +32 -0
  53. package/dist/strategy/fiat/utils.d.cts.map +1 -1
  54. package/dist/strategy/fiat/utils.d.mts +32 -0
  55. package/dist/strategy/fiat/utils.d.mts.map +1 -1
  56. package/dist/strategy/fiat/utils.mjs +63 -0
  57. package/dist/strategy/fiat/utils.mjs.map +1 -1
  58. package/dist/strategy/relay/relay-max-gas-station.cjs +3 -0
  59. package/dist/strategy/relay/relay-max-gas-station.cjs.map +1 -1
  60. package/dist/strategy/relay/relay-max-gas-station.d.cts.map +1 -1
  61. package/dist/strategy/relay/relay-max-gas-station.d.mts.map +1 -1
  62. package/dist/strategy/relay/relay-max-gas-station.mjs +3 -0
  63. package/dist/strategy/relay/relay-max-gas-station.mjs.map +1 -1
  64. package/dist/strategy/relay/relay-quotes.cjs +78 -8
  65. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  66. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  67. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  68. package/dist/strategy/relay/relay-quotes.mjs +78 -8
  69. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  70. package/dist/strategy/relay/relay-submit.cjs +7 -2
  71. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  72. package/dist/strategy/relay/relay-submit.mjs +7 -2
  73. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  74. package/dist/types.cjs.map +1 -1
  75. package/dist/types.d.cts +30 -0
  76. package/dist/types.d.cts.map +1 -1
  77. package/dist/types.d.mts +30 -0
  78. package/dist/types.d.mts.map +1 -1
  79. package/dist/types.mjs.map +1 -1
  80. package/dist/utils/feature-flags.cjs +40 -1
  81. package/dist/utils/feature-flags.cjs.map +1 -1
  82. package/dist/utils/feature-flags.d.cts +23 -0
  83. package/dist/utils/feature-flags.d.cts.map +1 -1
  84. package/dist/utils/feature-flags.d.mts +23 -0
  85. package/dist/utils/feature-flags.d.mts.map +1 -1
  86. package/dist/utils/feature-flags.mjs +37 -0
  87. package/dist/utils/feature-flags.mjs.map +1 -1
  88. package/dist/utils/quotes.cjs +6 -3
  89. package/dist/utils/quotes.cjs.map +1 -1
  90. package/dist/utils/quotes.d.cts.map +1 -1
  91. package/dist/utils/quotes.d.mts.map +1 -1
  92. package/dist/utils/quotes.mjs +6 -3
  93. package/dist/utils/quotes.mjs.map +1 -1
  94. package/dist/utils/totals.cjs +41 -7
  95. package/dist/utils/totals.cjs.map +1 -1
  96. package/dist/utils/totals.d.cts +3 -1
  97. package/dist/utils/totals.d.cts.map +1 -1
  98. package/dist/utils/totals.d.mts +3 -1
  99. package/dist/utils/totals.d.mts.map +1 -1
  100. package/dist/utils/totals.mjs +41 -7
  101. package/dist/utils/totals.mjs.map +1 -1
  102. package/package.json +7 -7
@@ -9,6 +9,7 @@ const gas_1 = require("./gas.cjs");
9
9
  * Calculate totals for a list of quotes and tokens.
10
10
  *
11
11
  * @param request - Request parameters.
12
+ * @param request.fiatPaymentAmount - The amount of the transaction in fiat.
12
13
  * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
13
14
  * @param request.quotes - List of bridge quotes.
14
15
  * @param request.messenger - Controller messenger.
@@ -16,7 +17,7 @@ const gas_1 = require("./gas.cjs");
16
17
  * @param request.transaction - Transaction metadata.
17
18
  * @returns The calculated totals in USD and fiat currency.
18
19
  */
19
- function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transaction, }) {
20
+ function calculateTotals({ fiatPaymentAmount, isMaxAmount, quotes, messenger, tokens, transaction, }) {
20
21
  const metaMaskFee = sumFiat(quotes.map((quote) => quote.fees.metaMask));
21
22
  const providerFee = sumFiat(quotes.map((quote) => quote.fees.provider));
22
23
  const providerFiatFee = sumFiat(quotes.map((quote) => quote.fees.providerFiat ?? { fiat: '0', usd: '0' }));
@@ -36,21 +37,33 @@ function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transaction,
36
37
  const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);
37
38
  const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);
38
39
  const hasQuotes = quotes.length > 0;
40
+ const sourceAmountFiat = getSourceAmount({
41
+ hasFiatStrategy,
42
+ fiatPaymentAmount,
43
+ isMaxAmount,
44
+ hasQuotes,
45
+ targetAmount: targetAmount.fiat,
46
+ tokenAmount: amountFiat,
47
+ });
48
+ const sourceAmountUsd = getSourceAmount({
49
+ hasFiatStrategy,
50
+ fiatPaymentAmount,
51
+ isMaxAmount,
52
+ hasQuotes,
53
+ targetAmount: targetAmount.usd,
54
+ tokenAmount: amountUsd,
55
+ });
39
56
  const totalFiat = new bignumber_js_1.BigNumber(providerFee.fiat)
40
57
  .plus(metaMaskFee.fiat)
41
58
  .plus(sourceNetworkFeeEstimate.fiat)
42
59
  .plus(targetNetworkFee.fiat)
43
- .plus((hasFiatStrategy || isMaxAmount) && hasQuotes
44
- ? targetAmount.fiat
45
- : amountFiat)
60
+ .plus(sourceAmountFiat)
46
61
  .toString(10);
47
62
  const totalUsd = new bignumber_js_1.BigNumber(providerFee.usd)
48
63
  .plus(metaMaskFee.usd)
49
64
  .plus(sourceNetworkFeeEstimate.usd)
50
65
  .plus(targetNetworkFee.usd)
51
- .plus((hasFiatStrategy || isMaxAmount) && hasQuotes
52
- ? targetAmount.usd
53
- : amountUsd)
66
+ .plus(sourceAmountUsd)
54
67
  .toString(10);
55
68
  const estimatedDuration = Number(sumProperty(quotes, (quote) => quote.estimatedDuration));
56
69
  const isSourceGasFeeToken = quotes.some((quote) => quote.fees.isSourceGasFeeToken);
@@ -79,6 +92,27 @@ function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transaction,
79
92
  };
80
93
  }
81
94
  exports.calculateTotals = calculateTotals;
95
+ /**
96
+ * Get the source amount to include in totals.
97
+ *
98
+ * @param request - Request parameters.
99
+ * @param request.hasFiatStrategy - Whether a fiat strategy quote is present.
100
+ * @param request.fiatPaymentAmount - The fiat payment amount, if applicable.
101
+ * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
102
+ * @param request.hasQuotes - Whether any quotes are present.
103
+ * @param request.targetAmount - The target amount from quotes.
104
+ * @param request.tokenAmount - The summed token amount.
105
+ * @returns The payment amount to include in totals.
106
+ */
107
+ function getSourceAmount({ hasFiatStrategy, fiatPaymentAmount, isMaxAmount, hasQuotes, targetAmount, tokenAmount, }) {
108
+ if (hasFiatStrategy) {
109
+ return fiatPaymentAmount ?? '0';
110
+ }
111
+ if (isMaxAmount && hasQuotes) {
112
+ return targetAmount;
113
+ }
114
+ return tokenAmount;
115
+ }
82
116
  /**
83
117
  * Sum a list of fiat value.
84
118
  *
@@ -1 +1 @@
1
- {"version":3,"file":"totals.cjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":";;;AACA,+CAAyC;AAEzC,gDAAsD;AAQtD,2CAAuC;AACvC,mCAAoD;AAEpD;;;;;;;;;;GAUG;AACH,SAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,GAOZ;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,OAAO,CAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC1E,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CACjC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,kCAAsB,CAAC,IAAI,CAC1D,CAAC;IAEF,MAAM,mBAAmB,GAAG,IAAA,oBAAU,EACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CACpD,CAAC;IAEF,MAAM,wBAAwB,GAAG,IAAA,oBAAU,EACzC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CACzD,CAAC;IAEF,MAAM,qBAAqB,GAAG,IAAA,iCAA2B,EACvD,WAAW,EACX,SAAS,CACV,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAM,EAAE,MAAM;QACrC,CAAC,CAAC;YACE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3D,aAAa,EAAE,KAAK;SACrB;QACH,CAAC,CAAC,qBAAqB,CAAC;IAE1B,MAAM,YAAY,GAAG,IAAA,oBAAU,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAExE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,aAAa,CAC5C,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAG,IAAI,wBAAS,CAAC,WAAW,CAAC,IAAI,CAAC;SAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;SACtB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;SACnC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;SAC3B,IAAI,CACH,CAAC,eAAe,IAAI,WAAW,CAAC,IAAI,SAAS;QAC3C,CAAC,CAAC,YAAY,CAAC,IAAI;QACnB,CAAC,CAAC,UAAU,CACf;SACA,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,IAAI,wBAAS,CAAC,WAAW,CAAC,GAAG,CAAC;SAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;SACrB,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;SAClC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;SAC1B,IAAI,CACH,CAAC,eAAe,IAAI,WAAW,CAAC,IAAI,SAAS;QAC3C,CAAC,CAAC,YAAY,CAAC,GAAG;QAClB,CAAC,CAAC,SAAS,CACd;SACA,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,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAC1C,CAAC;IAEF,MAAM,mBAAmB,GACvB,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAEzD,OAAO;QACL,iBAAiB;QACjB,IAAI,EAAE;YACJ,mBAAmB;YACnB,mBAAmB;YACnB,YAAY,EAAE,eAAe;YAC7B,QAAQ,EAAE,WAAW;YACrB,QAAQ,EAAE,WAAW;YACrB,aAAa,EAAE;gBACb,QAAQ,EAAE,wBAAwB;gBAClC,GAAG,EAAE,mBAAmB;aACzB;YACD,aAAa,EAAE,gBAAgB;SAChC;QACD,YAAY;QACZ,YAAY;QACZ,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC;AA5GD,0CA4GC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,IAAiB;IAChC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAClB,IAAgB,EAChB,WAAgD;IAEhD,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,wBAAS,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../constants';\nimport type {\n FiatValue,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\nimport { sumAmounts } from './amounts';\nimport { calculateTransactionGasCost } from './gas';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param request - Request parameters.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.quotes - List of bridge quotes.\n * @param request.messenger - Controller messenger.\n * @param request.tokens - List of required tokens.\n * @param request.transaction - Transaction metadata.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals({\n isMaxAmount,\n quotes,\n messenger,\n tokens,\n transaction,\n}: {\n isMaxAmount?: boolean;\n quotes: TransactionPayQuote<unknown>[];\n messenger: TransactionPayControllerMessenger;\n tokens: TransactionPayRequiredToken[];\n transaction: TransactionMeta;\n}): TransactionPayTotals {\n const metaMaskFee = sumFiat(quotes.map((quote) => quote.fees.metaMask));\n const providerFee = sumFiat(quotes.map((quote) => quote.fees.provider));\n const providerFiatFee = sumFiat(\n quotes.map((quote) => quote.fees.providerFiat ?? { fiat: '0', usd: '0' }),\n );\n const hasFiatStrategy = quotes.some(\n (quote) => quote.strategy === TransactionPayStrategy.Fiat,\n );\n\n const sourceNetworkFeeMax = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.max),\n );\n\n const sourceNetworkFeeEstimate = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.estimate),\n );\n\n const transactionNetworkFee = calculateTransactionGasCost(\n transaction,\n messenger,\n );\n\n const targetNetworkFee = quotes?.length\n ? {\n ...sumFiat(quotes.map((quote) => quote.fees.targetNetwork)),\n isGasFeeToken: false,\n }\n : transactionNetworkFee;\n\n const sourceAmount = sumAmounts(quotes.map((quote) => quote.sourceAmount));\n const targetAmount = sumFiat(quotes.map((quote) => quote.targetAmount));\n\n const quoteTokens = tokens.filter(\n (singleToken) => !singleToken.skipIfBalance,\n );\n\n const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);\n const hasQuotes = quotes.length > 0;\n\n const totalFiat = new BigNumber(providerFee.fiat)\n .plus(metaMaskFee.fiat)\n .plus(sourceNetworkFeeEstimate.fiat)\n .plus(targetNetworkFee.fiat)\n .plus(\n (hasFiatStrategy || isMaxAmount) && hasQuotes\n ? targetAmount.fiat\n : amountFiat,\n )\n .toString(10);\n\n const totalUsd = new BigNumber(providerFee.usd)\n .plus(metaMaskFee.usd)\n .plus(sourceNetworkFeeEstimate.usd)\n .plus(targetNetworkFee.usd)\n .plus(\n (hasFiatStrategy || isMaxAmount) && hasQuotes\n ? targetAmount.usd\n : amountUsd,\n )\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n const isSourceGasFeeToken = quotes.some(\n (quote) => quote.fees.isSourceGasFeeToken,\n );\n\n const isTargetGasFeeToken =\n Boolean(targetNetworkFee.isGasFeeToken) ||\n quotes.some((quote) => quote.fees.isTargetGasFeeToken);\n\n return {\n estimatedDuration,\n fees: {\n isSourceGasFeeToken,\n isTargetGasFeeToken,\n providerFiat: providerFiatFee,\n metaMask: metaMaskFee,\n provider: providerFee,\n sourceNetwork: {\n estimate: sourceNetworkFeeEstimate,\n max: sourceNetworkFeeMax,\n },\n targetNetwork: targetNetworkFee,\n },\n sourceAmount,\n targetAmount,\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a list of fiat value.\n *\n * @param data - List of fiat values.\n * @returns Total fiat value.\n */\nfunction sumFiat(data: FiatValue[]): FiatValue {\n const fiat = sumProperty(data, (item) => item.fiat);\n const usd = sumProperty(data, (item) => item.usd);\n return { fiat, usd };\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<DataType>(\n data: DataType[],\n getProperty: (item: DataType) => 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"]}
1
+ {"version":3,"file":"totals.cjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../constants';\nimport type {\n FiatValue,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\nimport { sumAmounts } from './amounts';\nimport { calculateTransactionGasCost } from './gas';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param request - Request parameters.\n * @param request.fiatPaymentAmount - The amount of the transaction in fiat.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.quotes - List of bridge quotes.\n * @param request.messenger - Controller messenger.\n * @param request.tokens - List of required tokens.\n * @param request.transaction - Transaction metadata.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals({\n fiatPaymentAmount,\n isMaxAmount,\n quotes,\n messenger,\n tokens,\n transaction,\n}: {\n fiatPaymentAmount?: string;\n isMaxAmount?: boolean;\n quotes: TransactionPayQuote<unknown>[];\n messenger: TransactionPayControllerMessenger;\n tokens: TransactionPayRequiredToken[];\n transaction: TransactionMeta;\n}): TransactionPayTotals {\n const metaMaskFee = sumFiat(quotes.map((quote) => quote.fees.metaMask));\n const providerFee = sumFiat(quotes.map((quote) => quote.fees.provider));\n const providerFiatFee = sumFiat(\n quotes.map((quote) => quote.fees.providerFiat ?? { fiat: '0', usd: '0' }),\n );\n const hasFiatStrategy = quotes.some(\n (quote) => quote.strategy === TransactionPayStrategy.Fiat,\n );\n\n const sourceNetworkFeeMax = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.max),\n );\n\n const sourceNetworkFeeEstimate = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.estimate),\n );\n\n const transactionNetworkFee = calculateTransactionGasCost(\n transaction,\n messenger,\n );\n\n const targetNetworkFee = quotes?.length\n ? {\n ...sumFiat(quotes.map((quote) => quote.fees.targetNetwork)),\n isGasFeeToken: false,\n }\n : transactionNetworkFee;\n\n const sourceAmount = sumAmounts(quotes.map((quote) => quote.sourceAmount));\n const targetAmount = sumFiat(quotes.map((quote) => quote.targetAmount));\n\n const quoteTokens = tokens.filter(\n (singleToken) => !singleToken.skipIfBalance,\n );\n\n const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);\n const hasQuotes = quotes.length > 0;\n\n const sourceAmountFiat = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n isMaxAmount,\n hasQuotes,\n targetAmount: targetAmount.fiat,\n tokenAmount: amountFiat,\n });\n\n const sourceAmountUsd = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n isMaxAmount,\n hasQuotes,\n targetAmount: targetAmount.usd,\n tokenAmount: amountUsd,\n });\n\n const totalFiat = new BigNumber(providerFee.fiat)\n .plus(metaMaskFee.fiat)\n .plus(sourceNetworkFeeEstimate.fiat)\n .plus(targetNetworkFee.fiat)\n .plus(sourceAmountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFee.usd)\n .plus(metaMaskFee.usd)\n .plus(sourceNetworkFeeEstimate.usd)\n .plus(targetNetworkFee.usd)\n .plus(sourceAmountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n const isSourceGasFeeToken = quotes.some(\n (quote) => quote.fees.isSourceGasFeeToken,\n );\n\n const isTargetGasFeeToken =\n Boolean(targetNetworkFee.isGasFeeToken) ||\n quotes.some((quote) => quote.fees.isTargetGasFeeToken);\n\n return {\n estimatedDuration,\n fees: {\n isSourceGasFeeToken,\n isTargetGasFeeToken,\n providerFiat: providerFiatFee,\n metaMask: metaMaskFee,\n provider: providerFee,\n sourceNetwork: {\n estimate: sourceNetworkFeeEstimate,\n max: sourceNetworkFeeMax,\n },\n targetNetwork: targetNetworkFee,\n },\n sourceAmount,\n targetAmount,\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Get the source amount to include in totals.\n *\n * @param request - Request parameters.\n * @param request.hasFiatStrategy - Whether a fiat strategy quote is present.\n * @param request.fiatPaymentAmount - The fiat payment amount, if applicable.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.hasQuotes - Whether any quotes are present.\n * @param request.targetAmount - The target amount from quotes.\n * @param request.tokenAmount - The summed token amount.\n * @returns The payment amount to include in totals.\n */\nfunction getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n isMaxAmount,\n hasQuotes,\n targetAmount,\n tokenAmount,\n}: {\n hasFiatStrategy: boolean;\n fiatPaymentAmount?: string;\n isMaxAmount?: boolean;\n hasQuotes: boolean;\n targetAmount: string;\n tokenAmount: string;\n}): string {\n if (hasFiatStrategy) {\n return fiatPaymentAmount ?? '0';\n }\n\n if (isMaxAmount && hasQuotes) {\n return targetAmount;\n }\n\n return tokenAmount;\n}\n\n/**\n * Sum a list of fiat value.\n *\n * @param data - List of fiat values.\n * @returns Total fiat value.\n */\nfunction sumFiat(data: FiatValue[]): FiatValue {\n const fiat = sumProperty(data, (item) => item.fiat);\n const usd = sumProperty(data, (item) => item.usd);\n return { fiat, usd };\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<DataType>(\n data: DataType[],\n getProperty: (item: DataType) => 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"]}
@@ -4,6 +4,7 @@ import type { TransactionPayControllerMessenger, TransactionPayQuote, Transactio
4
4
  * Calculate totals for a list of quotes and tokens.
5
5
  *
6
6
  * @param request - Request parameters.
7
+ * @param request.fiatPaymentAmount - The amount of the transaction in fiat.
7
8
  * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
8
9
  * @param request.quotes - List of bridge quotes.
9
10
  * @param request.messenger - Controller messenger.
@@ -11,7 +12,8 @@ import type { TransactionPayControllerMessenger, TransactionPayQuote, Transactio
11
12
  * @param request.transaction - Transaction metadata.
12
13
  * @returns The calculated totals in USD and fiat currency.
13
14
  */
14
- export declare function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transaction, }: {
15
+ export declare function calculateTotals({ fiatPaymentAmount, isMaxAmount, quotes, messenger, tokens, transaction, }: {
16
+ fiatPaymentAmount?: string;
15
17
  isMaxAmount?: boolean;
16
18
  quotes: TransactionPayQuote<unknown>[];
17
19
  messenger: TransactionPayControllerMessenger;
@@ -1 +1 @@
1
- {"version":3,"file":"totals.d.cts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAIxE,OAAO,KAAK,EAEV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAIlB;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,GACZ,EAAE;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACvC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,oBAAoB,CAgGvB"}
1
+ {"version":3,"file":"totals.d.cts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAIxE,OAAO,KAAK,EAEV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAIlB;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,iBAAiB,EACjB,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,GACZ,EAAE;IACD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACvC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,oBAAoB,CA0GvB"}
@@ -4,6 +4,7 @@ import type { TransactionPayControllerMessenger, TransactionPayQuote, Transactio
4
4
  * Calculate totals for a list of quotes and tokens.
5
5
  *
6
6
  * @param request - Request parameters.
7
+ * @param request.fiatPaymentAmount - The amount of the transaction in fiat.
7
8
  * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
8
9
  * @param request.quotes - List of bridge quotes.
9
10
  * @param request.messenger - Controller messenger.
@@ -11,7 +12,8 @@ import type { TransactionPayControllerMessenger, TransactionPayQuote, Transactio
11
12
  * @param request.transaction - Transaction metadata.
12
13
  * @returns The calculated totals in USD and fiat currency.
13
14
  */
14
- export declare function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transaction, }: {
15
+ export declare function calculateTotals({ fiatPaymentAmount, isMaxAmount, quotes, messenger, tokens, transaction, }: {
16
+ fiatPaymentAmount?: string;
15
17
  isMaxAmount?: boolean;
16
18
  quotes: TransactionPayQuote<unknown>[];
17
19
  messenger: TransactionPayControllerMessenger;
@@ -1 +1 @@
1
- {"version":3,"file":"totals.d.mts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAIxE,OAAO,KAAK,EAEV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAIlB;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,GACZ,EAAE;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACvC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,oBAAoB,CAgGvB"}
1
+ {"version":3,"file":"totals.d.mts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAIxE,OAAO,KAAK,EAEV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAIlB;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,iBAAiB,EACjB,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,GACZ,EAAE;IACD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACvC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,oBAAoB,CA0GvB"}
@@ -6,6 +6,7 @@ import { calculateTransactionGasCost } from "./gas.mjs";
6
6
  * Calculate totals for a list of quotes and tokens.
7
7
  *
8
8
  * @param request - Request parameters.
9
+ * @param request.fiatPaymentAmount - The amount of the transaction in fiat.
9
10
  * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
10
11
  * @param request.quotes - List of bridge quotes.
11
12
  * @param request.messenger - Controller messenger.
@@ -13,7 +14,7 @@ import { calculateTransactionGasCost } from "./gas.mjs";
13
14
  * @param request.transaction - Transaction metadata.
14
15
  * @returns The calculated totals in USD and fiat currency.
15
16
  */
16
- export function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transaction, }) {
17
+ export function calculateTotals({ fiatPaymentAmount, isMaxAmount, quotes, messenger, tokens, transaction, }) {
17
18
  const metaMaskFee = sumFiat(quotes.map((quote) => quote.fees.metaMask));
18
19
  const providerFee = sumFiat(quotes.map((quote) => quote.fees.provider));
19
20
  const providerFiatFee = sumFiat(quotes.map((quote) => quote.fees.providerFiat ?? { fiat: '0', usd: '0' }));
@@ -33,21 +34,33 @@ export function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transa
33
34
  const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);
34
35
  const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);
35
36
  const hasQuotes = quotes.length > 0;
37
+ const sourceAmountFiat = getSourceAmount({
38
+ hasFiatStrategy,
39
+ fiatPaymentAmount,
40
+ isMaxAmount,
41
+ hasQuotes,
42
+ targetAmount: targetAmount.fiat,
43
+ tokenAmount: amountFiat,
44
+ });
45
+ const sourceAmountUsd = getSourceAmount({
46
+ hasFiatStrategy,
47
+ fiatPaymentAmount,
48
+ isMaxAmount,
49
+ hasQuotes,
50
+ targetAmount: targetAmount.usd,
51
+ tokenAmount: amountUsd,
52
+ });
36
53
  const totalFiat = new BigNumber(providerFee.fiat)
37
54
  .plus(metaMaskFee.fiat)
38
55
  .plus(sourceNetworkFeeEstimate.fiat)
39
56
  .plus(targetNetworkFee.fiat)
40
- .plus((hasFiatStrategy || isMaxAmount) && hasQuotes
41
- ? targetAmount.fiat
42
- : amountFiat)
57
+ .plus(sourceAmountFiat)
43
58
  .toString(10);
44
59
  const totalUsd = new BigNumber(providerFee.usd)
45
60
  .plus(metaMaskFee.usd)
46
61
  .plus(sourceNetworkFeeEstimate.usd)
47
62
  .plus(targetNetworkFee.usd)
48
- .plus((hasFiatStrategy || isMaxAmount) && hasQuotes
49
- ? targetAmount.usd
50
- : amountUsd)
63
+ .plus(sourceAmountUsd)
51
64
  .toString(10);
52
65
  const estimatedDuration = Number(sumProperty(quotes, (quote) => quote.estimatedDuration));
53
66
  const isSourceGasFeeToken = quotes.some((quote) => quote.fees.isSourceGasFeeToken);
@@ -75,6 +88,27 @@ export function calculateTotals({ isMaxAmount, quotes, messenger, tokens, transa
75
88
  },
76
89
  };
77
90
  }
91
+ /**
92
+ * Get the source amount to include in totals.
93
+ *
94
+ * @param request - Request parameters.
95
+ * @param request.hasFiatStrategy - Whether a fiat strategy quote is present.
96
+ * @param request.fiatPaymentAmount - The fiat payment amount, if applicable.
97
+ * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
98
+ * @param request.hasQuotes - Whether any quotes are present.
99
+ * @param request.targetAmount - The target amount from quotes.
100
+ * @param request.tokenAmount - The summed token amount.
101
+ * @returns The payment amount to include in totals.
102
+ */
103
+ function getSourceAmount({ hasFiatStrategy, fiatPaymentAmount, isMaxAmount, hasQuotes, targetAmount, tokenAmount, }) {
104
+ if (hasFiatStrategy) {
105
+ return fiatPaymentAmount ?? '0';
106
+ }
107
+ if (isMaxAmount && hasQuotes) {
108
+ return targetAmount;
109
+ }
110
+ return tokenAmount;
111
+ }
78
112
  /**
79
113
  * Sum a list of fiat value.
80
114
  *
@@ -1 +1 @@
1
- {"version":3,"file":"totals.mjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../constants';\nimport type {\n FiatValue,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\nimport { sumAmounts } from './amounts';\nimport { calculateTransactionGasCost } from './gas';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param request - Request parameters.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.quotes - List of bridge quotes.\n * @param request.messenger - Controller messenger.\n * @param request.tokens - List of required tokens.\n * @param request.transaction - Transaction metadata.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals({\n isMaxAmount,\n quotes,\n messenger,\n tokens,\n transaction,\n}: {\n isMaxAmount?: boolean;\n quotes: TransactionPayQuote<unknown>[];\n messenger: TransactionPayControllerMessenger;\n tokens: TransactionPayRequiredToken[];\n transaction: TransactionMeta;\n}): TransactionPayTotals {\n const metaMaskFee = sumFiat(quotes.map((quote) => quote.fees.metaMask));\n const providerFee = sumFiat(quotes.map((quote) => quote.fees.provider));\n const providerFiatFee = sumFiat(\n quotes.map((quote) => quote.fees.providerFiat ?? { fiat: '0', usd: '0' }),\n );\n const hasFiatStrategy = quotes.some(\n (quote) => quote.strategy === TransactionPayStrategy.Fiat,\n );\n\n const sourceNetworkFeeMax = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.max),\n );\n\n const sourceNetworkFeeEstimate = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.estimate),\n );\n\n const transactionNetworkFee = calculateTransactionGasCost(\n transaction,\n messenger,\n );\n\n const targetNetworkFee = quotes?.length\n ? {\n ...sumFiat(quotes.map((quote) => quote.fees.targetNetwork)),\n isGasFeeToken: false,\n }\n : transactionNetworkFee;\n\n const sourceAmount = sumAmounts(quotes.map((quote) => quote.sourceAmount));\n const targetAmount = sumFiat(quotes.map((quote) => quote.targetAmount));\n\n const quoteTokens = tokens.filter(\n (singleToken) => !singleToken.skipIfBalance,\n );\n\n const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);\n const hasQuotes = quotes.length > 0;\n\n const totalFiat = new BigNumber(providerFee.fiat)\n .plus(metaMaskFee.fiat)\n .plus(sourceNetworkFeeEstimate.fiat)\n .plus(targetNetworkFee.fiat)\n .plus(\n (hasFiatStrategy || isMaxAmount) && hasQuotes\n ? targetAmount.fiat\n : amountFiat,\n )\n .toString(10);\n\n const totalUsd = new BigNumber(providerFee.usd)\n .plus(metaMaskFee.usd)\n .plus(sourceNetworkFeeEstimate.usd)\n .plus(targetNetworkFee.usd)\n .plus(\n (hasFiatStrategy || isMaxAmount) && hasQuotes\n ? targetAmount.usd\n : amountUsd,\n )\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n const isSourceGasFeeToken = quotes.some(\n (quote) => quote.fees.isSourceGasFeeToken,\n );\n\n const isTargetGasFeeToken =\n Boolean(targetNetworkFee.isGasFeeToken) ||\n quotes.some((quote) => quote.fees.isTargetGasFeeToken);\n\n return {\n estimatedDuration,\n fees: {\n isSourceGasFeeToken,\n isTargetGasFeeToken,\n providerFiat: providerFiatFee,\n metaMask: metaMaskFee,\n provider: providerFee,\n sourceNetwork: {\n estimate: sourceNetworkFeeEstimate,\n max: sourceNetworkFeeMax,\n },\n targetNetwork: targetNetworkFee,\n },\n sourceAmount,\n targetAmount,\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a list of fiat value.\n *\n * @param data - List of fiat values.\n * @returns Total fiat value.\n */\nfunction sumFiat(data: FiatValue[]): FiatValue {\n const fiat = sumProperty(data, (item) => item.fiat);\n const usd = sumProperty(data, (item) => item.usd);\n return { fiat, usd };\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<DataType>(\n data: DataType[],\n getProperty: (item: DataType) => 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"]}
1
+ {"version":3,"file":"totals.mjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../constants';\nimport type {\n FiatValue,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\nimport { sumAmounts } from './amounts';\nimport { calculateTransactionGasCost } from './gas';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param request - Request parameters.\n * @param request.fiatPaymentAmount - The amount of the transaction in fiat.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.quotes - List of bridge quotes.\n * @param request.messenger - Controller messenger.\n * @param request.tokens - List of required tokens.\n * @param request.transaction - Transaction metadata.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals({\n fiatPaymentAmount,\n isMaxAmount,\n quotes,\n messenger,\n tokens,\n transaction,\n}: {\n fiatPaymentAmount?: string;\n isMaxAmount?: boolean;\n quotes: TransactionPayQuote<unknown>[];\n messenger: TransactionPayControllerMessenger;\n tokens: TransactionPayRequiredToken[];\n transaction: TransactionMeta;\n}): TransactionPayTotals {\n const metaMaskFee = sumFiat(quotes.map((quote) => quote.fees.metaMask));\n const providerFee = sumFiat(quotes.map((quote) => quote.fees.provider));\n const providerFiatFee = sumFiat(\n quotes.map((quote) => quote.fees.providerFiat ?? { fiat: '0', usd: '0' }),\n );\n const hasFiatStrategy = quotes.some(\n (quote) => quote.strategy === TransactionPayStrategy.Fiat,\n );\n\n const sourceNetworkFeeMax = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.max),\n );\n\n const sourceNetworkFeeEstimate = sumAmounts(\n quotes.map((quote) => quote.fees.sourceNetwork.estimate),\n );\n\n const transactionNetworkFee = calculateTransactionGasCost(\n transaction,\n messenger,\n );\n\n const targetNetworkFee = quotes?.length\n ? {\n ...sumFiat(quotes.map((quote) => quote.fees.targetNetwork)),\n isGasFeeToken: false,\n }\n : transactionNetworkFee;\n\n const sourceAmount = sumAmounts(quotes.map((quote) => quote.sourceAmount));\n const targetAmount = sumFiat(quotes.map((quote) => quote.targetAmount));\n\n const quoteTokens = tokens.filter(\n (singleToken) => !singleToken.skipIfBalance,\n );\n\n const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);\n const hasQuotes = quotes.length > 0;\n\n const sourceAmountFiat = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n isMaxAmount,\n hasQuotes,\n targetAmount: targetAmount.fiat,\n tokenAmount: amountFiat,\n });\n\n const sourceAmountUsd = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n isMaxAmount,\n hasQuotes,\n targetAmount: targetAmount.usd,\n tokenAmount: amountUsd,\n });\n\n const totalFiat = new BigNumber(providerFee.fiat)\n .plus(metaMaskFee.fiat)\n .plus(sourceNetworkFeeEstimate.fiat)\n .plus(targetNetworkFee.fiat)\n .plus(sourceAmountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFee.usd)\n .plus(metaMaskFee.usd)\n .plus(sourceNetworkFeeEstimate.usd)\n .plus(targetNetworkFee.usd)\n .plus(sourceAmountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n const isSourceGasFeeToken = quotes.some(\n (quote) => quote.fees.isSourceGasFeeToken,\n );\n\n const isTargetGasFeeToken =\n Boolean(targetNetworkFee.isGasFeeToken) ||\n quotes.some((quote) => quote.fees.isTargetGasFeeToken);\n\n return {\n estimatedDuration,\n fees: {\n isSourceGasFeeToken,\n isTargetGasFeeToken,\n providerFiat: providerFiatFee,\n metaMask: metaMaskFee,\n provider: providerFee,\n sourceNetwork: {\n estimate: sourceNetworkFeeEstimate,\n max: sourceNetworkFeeMax,\n },\n targetNetwork: targetNetworkFee,\n },\n sourceAmount,\n targetAmount,\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Get the source amount to include in totals.\n *\n * @param request - Request parameters.\n * @param request.hasFiatStrategy - Whether a fiat strategy quote is present.\n * @param request.fiatPaymentAmount - The fiat payment amount, if applicable.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.hasQuotes - Whether any quotes are present.\n * @param request.targetAmount - The target amount from quotes.\n * @param request.tokenAmount - The summed token amount.\n * @returns The payment amount to include in totals.\n */\nfunction getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n isMaxAmount,\n hasQuotes,\n targetAmount,\n tokenAmount,\n}: {\n hasFiatStrategy: boolean;\n fiatPaymentAmount?: string;\n isMaxAmount?: boolean;\n hasQuotes: boolean;\n targetAmount: string;\n tokenAmount: string;\n}): string {\n if (hasFiatStrategy) {\n return fiatPaymentAmount ?? '0';\n }\n\n if (isMaxAmount && hasQuotes) {\n return targetAmount;\n }\n\n return tokenAmount;\n}\n\n/**\n * Sum a list of fiat value.\n *\n * @param data - List of fiat values.\n * @returns Total fiat value.\n */\nfunction sumFiat(data: FiatValue[]): FiatValue {\n const fiat = sumProperty(data, (item) => item.fiat);\n const usd = sumProperty(data, (item) => item.usd);\n return { fiat, usd };\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<DataType>(\n data: DataType[],\n getProperty: (item: DataType) => 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/transaction-pay-controller",
3
- "version": "23.2.0",
3
+ "version": "23.3.1",
4
4
  "description": "Manages alternate payment strategies to provide required funds for transactions in MetaMask",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -57,14 +57,14 @@
57
57
  "@ethersproject/abi": "^5.7.0",
58
58
  "@ethersproject/contracts": "^5.7.0",
59
59
  "@ethersproject/providers": "^5.7.0",
60
- "@metamask/assets-controller": "^8.3.2",
61
- "@metamask/assets-controllers": "^108.5.0",
60
+ "@metamask/assets-controller": "^8.3.3",
61
+ "@metamask/assets-controllers": "^108.6.0",
62
62
  "@metamask/base-controller": "^9.1.0",
63
- "@metamask/bridge-controller": "^73.2.1",
64
- "@metamask/bridge-status-controller": "^72.0.2",
65
- "@metamask/controller-utils": "^12.1.0",
63
+ "@metamask/bridge-controller": "^74.0.0",
64
+ "@metamask/bridge-status-controller": "^72.0.3",
65
+ "@metamask/controller-utils": "^12.1.1",
66
66
  "@metamask/gas-fee-controller": "^26.2.2",
67
- "@metamask/keyring-controller": "^26.0.0",
67
+ "@metamask/keyring-controller": "^27.0.0",
68
68
  "@metamask/messenger": "^1.2.0",
69
69
  "@metamask/metamask-eth-abis": "^3.1.1",
70
70
  "@metamask/network-controller": "^32.0.0",