@metamask-previews/transaction-pay-controller 28.0.2-preview-0a8ce9948 → 28.0.2-preview-95a403d7b

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.
@@ -50,17 +50,25 @@ export function calculateTotals({ fiatPaymentAmount, quotes, messenger, tokens,
50
50
  tokenAmount: amountUsd,
51
51
  useTargetAmount: isInputBased,
52
52
  });
53
+ const includedFees = sumFiat(quotes
54
+ .filter((quote) => quote.areFeesIncludedInSourceAmount)
55
+ .map((quote) => ({
56
+ fiat: getQuoteFeeTotal(quote, 'fiat'),
57
+ usd: getQuoteFeeTotal(quote, 'usd'),
58
+ })));
53
59
  const totalFiat = new BigNumber(providerFee.fiat)
54
60
  .plus(metaMaskFee.fiat)
55
61
  .plus(sourceNetworkFeeEstimate.fiat)
56
62
  .plus(targetNetworkFee.fiat)
57
63
  .plus(sourceAmountFiat)
64
+ .minus(includedFees.fiat)
58
65
  .toString(10);
59
66
  const totalUsd = new BigNumber(providerFee.usd)
60
67
  .plus(metaMaskFee.usd)
61
68
  .plus(sourceNetworkFeeEstimate.usd)
62
69
  .plus(targetNetworkFee.usd)
63
70
  .plus(sourceAmountUsd)
71
+ .minus(includedFees.usd)
64
72
  .toString(10);
65
73
  const estimatedDuration = Number(sumProperty(quotes, (quote) => quote.estimatedDuration));
66
74
  const isSourceGasFeeToken = quotes.some((quote) => quote.fees.isSourceGasFeeToken);
@@ -89,6 +97,13 @@ export function calculateTotals({ fiatPaymentAmount, quotes, messenger, tokens,
89
97
  },
90
98
  };
91
99
  }
100
+ function getQuoteFeeTotal(quote, currency) {
101
+ return new BigNumber(quote.fees.provider[currency])
102
+ .plus(quote.fees.metaMask[currency])
103
+ .plus(quote.fees.sourceNetwork.estimate[currency])
104
+ .plus(quote.fees.targetNetwork[currency])
105
+ .toString(10);
106
+ }
92
107
  /**
93
108
  * Get the source amount to include in totals.
94
109
  *
@@ -1 +1 @@
1
- {"version":3,"file":"totals.js","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.js';\nimport type {\n FiatValue,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types.js';\nimport { sumAmounts } from './amounts.js';\nimport { calculateTransactionGasCost } from './gas.js';\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.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 quotes,\n messenger,\n tokens,\n transaction,\n}: {\n fiatPaymentAmount?: string;\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 const isInputBased =\n hasQuotes && quotes.every((quote) => quote.isInputBased === true);\n\n const sourceAmountFiat = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n hasQuotes,\n targetAmount: targetAmount.fiat,\n tokenAmount: amountFiat,\n useTargetAmount: isInputBased,\n });\n\n const sourceAmountUsd = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n hasQuotes,\n targetAmount: targetAmount.usd,\n tokenAmount: amountUsd,\n useTargetAmount: isInputBased,\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 isInputBased,\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.hasQuotes - Whether any quotes are present.\n * @param request.targetAmount - The target amount from quotes.\n * @param request.tokenAmount - The summed token amount.\n * @param request.useTargetAmount - Whether fees are already included in the source amount.\n * @returns The payment amount to include in totals.\n */\nfunction getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n hasQuotes,\n targetAmount,\n tokenAmount,\n useTargetAmount,\n}: {\n hasFiatStrategy: boolean;\n fiatPaymentAmount?: string;\n hasQuotes: boolean;\n targetAmount: string;\n tokenAmount: string;\n useTargetAmount: boolean;\n}): string {\n if (hasFiatStrategy) {\n return fiatPaymentAmount ?? '0';\n }\n\n if (useTargetAmount && 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"]}
1
+ {"version":3,"file":"totals.js","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.js';\nimport type {\n FiatValue,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types.js';\nimport { sumAmounts } from './amounts.js';\nimport { calculateTransactionGasCost } from './gas.js';\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.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 quotes,\n messenger,\n tokens,\n transaction,\n}: {\n fiatPaymentAmount?: string;\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 const isInputBased =\n hasQuotes && quotes.every((quote) => quote.isInputBased === true);\n\n const sourceAmountFiat = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n hasQuotes,\n targetAmount: targetAmount.fiat,\n tokenAmount: amountFiat,\n useTargetAmount: isInputBased,\n });\n\n const sourceAmountUsd = getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n hasQuotes,\n targetAmount: targetAmount.usd,\n tokenAmount: amountUsd,\n useTargetAmount: isInputBased,\n });\n\n const includedFees = sumFiat(\n quotes\n .filter((quote) => quote.areFeesIncludedInSourceAmount)\n .map((quote) => ({\n fiat: getQuoteFeeTotal(quote, 'fiat'),\n usd: getQuoteFeeTotal(quote, 'usd'),\n })),\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 .minus(includedFees.fiat)\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 .minus(includedFees.usd)\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 isInputBased,\n sourceAmount,\n targetAmount,\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\nfunction getQuoteFeeTotal(\n quote: TransactionPayQuote<unknown>,\n currency: keyof FiatValue,\n): string {\n return new BigNumber(quote.fees.provider[currency])\n .plus(quote.fees.metaMask[currency])\n .plus(quote.fees.sourceNetwork.estimate[currency])\n .plus(quote.fees.targetNetwork[currency])\n .toString(10);\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.hasQuotes - Whether any quotes are present.\n * @param request.targetAmount - The target amount from quotes.\n * @param request.tokenAmount - The summed token amount.\n * @param request.useTargetAmount - Whether fees are already included in the source amount.\n * @returns The payment amount to include in totals.\n */\nfunction getSourceAmount({\n hasFiatStrategy,\n fiatPaymentAmount,\n hasQuotes,\n targetAmount,\n tokenAmount,\n useTargetAmount,\n}: {\n hasFiatStrategy: boolean;\n fiatPaymentAmount?: string;\n hasQuotes: boolean;\n targetAmount: string;\n tokenAmount: string;\n useTargetAmount: boolean;\n}): string {\n if (hasFiatStrategy) {\n return fiatPaymentAmount ?? '0';\n }\n\n if (useTargetAmount && 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-previews/transaction-pay-controller",
3
- "version": "28.0.2-preview-0a8ce9948",
3
+ "version": "28.0.2-preview-95a403d7b",
4
4
  "description": "Manages alternate payment strategies to provide required funds for transactions in MetaMask",
5
5
  "keywords": [
6
6
  "Ethereum",