@metamask/transaction-pay-controller 2.0.0 → 2.0.2

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 (48) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/dist/TransactionPayController.cjs +5 -2
  3. package/dist/TransactionPayController.cjs.map +1 -1
  4. package/dist/TransactionPayController.d.cts.map +1 -1
  5. package/dist/TransactionPayController.d.mts.map +1 -1
  6. package/dist/TransactionPayController.mjs +6 -3
  7. package/dist/TransactionPayController.mjs.map +1 -1
  8. package/dist/helpers/QuoteRefresher.cjs +82 -0
  9. package/dist/helpers/QuoteRefresher.cjs.map +1 -0
  10. package/dist/helpers/QuoteRefresher.d.cts +10 -0
  11. package/dist/helpers/QuoteRefresher.d.cts.map +1 -0
  12. package/dist/helpers/QuoteRefresher.d.mts +10 -0
  13. package/dist/helpers/QuoteRefresher.d.mts.map +1 -0
  14. package/dist/helpers/QuoteRefresher.mjs +79 -0
  15. package/dist/helpers/QuoteRefresher.mjs.map +1 -0
  16. package/dist/strategy/bridge/bridge-quotes.cjs +11 -5
  17. package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
  18. package/dist/strategy/bridge/bridge-quotes.d.cts.map +1 -1
  19. package/dist/strategy/bridge/bridge-quotes.d.mts.map +1 -1
  20. package/dist/strategy/bridge/bridge-quotes.mjs +11 -5
  21. package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
  22. package/dist/strategy/relay/relay-quotes.cjs +43 -16
  23. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  24. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  25. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  26. package/dist/strategy/relay/relay-quotes.mjs +43 -16
  27. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  28. package/dist/utils/quotes.cjs +44 -54
  29. package/dist/utils/quotes.cjs.map +1 -1
  30. package/dist/utils/quotes.d.cts +2 -2
  31. package/dist/utils/quotes.d.cts.map +1 -1
  32. package/dist/utils/quotes.d.mts +2 -2
  33. package/dist/utils/quotes.d.mts.map +1 -1
  34. package/dist/utils/quotes.mjs +43 -53
  35. package/dist/utils/quotes.mjs.map +1 -1
  36. package/dist/utils/totals.cjs +3 -2
  37. package/dist/utils/totals.cjs.map +1 -1
  38. package/dist/utils/totals.d.cts.map +1 -1
  39. package/dist/utils/totals.d.mts.map +1 -1
  40. package/dist/utils/totals.mjs +3 -2
  41. package/dist/utils/totals.mjs.map +1 -1
  42. package/dist/utils/transaction.cjs +2 -1
  43. package/dist/utils/transaction.cjs.map +1 -1
  44. package/dist/utils/transaction.d.cts.map +1 -1
  45. package/dist/utils/transaction.d.mts.map +1 -1
  46. package/dist/utils/transaction.mjs +2 -1
  47. package/dist/utils/transaction.mjs.map +1 -1
  48. package/package.json +1 -1
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.queueRefreshQuotes = exports.updateQuotes = void 0;
3
+ exports.refreshQuotes = exports.updateQuotes = void 0;
4
4
  const utils_1 = require("@metamask/utils");
5
5
  const strategy_1 = require("./strategy.cjs");
6
6
  const totals_1 = require("./totals.cjs");
7
7
  const transaction_1 = require("./transaction.cjs");
8
8
  const logger_1 = require("../logger.cjs");
9
- const QUOTES_CHECK_INTERVAL = 1 * 1000; // 1 Second
10
9
  const DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds
11
10
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'quotes');
12
11
  /**
@@ -25,8 +24,8 @@ async function updateQuotes(request) {
25
24
  if (!paymentToken) {
26
25
  return;
27
26
  }
28
- const requests = (sourceAmounts ?? []).map((sourceAmount, i) => {
29
- const token = tokens[i];
27
+ const requests = (sourceAmounts ?? []).map((sourceAmount) => {
28
+ const token = tokens.find((t) => t.address === sourceAmount.targetTokenAddress);
30
29
  return {
31
30
  from: transaction.txParams.from,
32
31
  sourceBalanceRaw: paymentToken.balanceRaw,
@@ -42,60 +41,53 @@ async function updateQuotes(request) {
42
41
  log('No quote requests', { transactionId });
43
42
  }
44
43
  let quotes = [];
45
- const strategy = await (0, strategy_1.getStrategy)(messenger, transaction);
44
+ updateTransactionData(transactionId, (data) => {
45
+ data.isLoading = true;
46
+ });
46
47
  try {
47
- quotes = requests?.length
48
- ? (await strategy.getQuotes({
48
+ const strategy = await (0, strategy_1.getStrategy)(messenger, transaction);
49
+ try {
50
+ quotes = requests?.length
51
+ ? (await strategy.getQuotes({
52
+ messenger,
53
+ requests,
54
+ transaction,
55
+ }))
56
+ : [];
57
+ }
58
+ catch (error) {
59
+ log('Error fetching quotes', { error, transactionId });
60
+ }
61
+ log('Updated', { transactionId, quotes });
62
+ const batchTransactions = quotes?.length && strategy.getBatchTransactions
63
+ ? await strategy.getBatchTransactions({
49
64
  messenger,
50
- requests,
51
- transaction,
52
- }))
65
+ quotes,
66
+ })
53
67
  : [];
68
+ log('Batch transactions', { transactionId, batchTransactions });
69
+ const totals = (0, totals_1.calculateTotals)(quotes, tokens, messenger);
70
+ log('Calculated totals', { transactionId, totals });
71
+ syncTransaction({
72
+ batchTransactions,
73
+ messenger: messenger,
74
+ paymentToken,
75
+ totals,
76
+ transactionId,
77
+ });
78
+ updateTransactionData(transactionId, (data) => {
79
+ data.quotes = quotes;
80
+ data.quotesLastUpdated = Date.now();
81
+ data.totals = totals;
82
+ });
54
83
  }
55
- catch (error) {
56
- log('Error fetching quotes', { error, transactionId });
84
+ finally {
85
+ updateTransactionData(transactionId, (data) => {
86
+ data.isLoading = false;
87
+ });
57
88
  }
58
- log('Updated', { transactionId, quotes });
59
- const batchTransactions = quotes?.length && strategy.getBatchTransactions
60
- ? await strategy.getBatchTransactions({
61
- messenger,
62
- quotes,
63
- })
64
- : [];
65
- log('Batch transactions', { transactionId, batchTransactions });
66
- const totals = (0, totals_1.calculateTotals)(quotes, tokens, messenger);
67
- log('Calculated totals', { transactionId, totals });
68
- syncTransaction({
69
- batchTransactions,
70
- messenger: messenger,
71
- paymentToken,
72
- totals,
73
- transactionId,
74
- });
75
- updateTransactionData(transactionId, (data) => {
76
- data.quotes = quotes;
77
- data.quotesLastUpdated = Date.now();
78
- data.totals = totals;
79
- data.isLoading = false;
80
- });
81
89
  }
82
90
  exports.updateQuotes = updateQuotes;
83
- /**
84
- * Poll quotes at regular intervals.
85
- *
86
- * @param messenger - Messenger instance.
87
- * @param updateTransactionData - Callback to update transaction data.
88
- */
89
- function queueRefreshQuotes(messenger, updateTransactionData) {
90
- setTimeout(() => {
91
- refreshQuotes(messenger, updateTransactionData)
92
- .finally(() => queueRefreshQuotes(messenger, updateTransactionData))
93
- .catch((error) => {
94
- log('Error polling quotes', { messenger, error });
95
- });
96
- }, QUOTES_CHECK_INTERVAL);
97
- }
98
- exports.queueRefreshQuotes = queueRefreshQuotes;
99
91
  /**
100
92
  * Sync batch transactions to the transaction meta.
101
93
  *
@@ -153,9 +145,6 @@ async function refreshQuotes(messenger, updateTransactionData) {
153
145
  strategy: strategyName,
154
146
  refreshInterval,
155
147
  });
156
- updateTransactionData(transactionId, (data) => {
157
- data.isLoading = true;
158
- });
159
148
  await updateQuotes({
160
149
  messenger,
161
150
  transactionData,
@@ -165,4 +154,5 @@ async function refreshQuotes(messenger, updateTransactionData) {
165
154
  log('Refreshed quotes', { transactionId, strategy: strategyName });
166
155
  }
167
156
  }
157
+ exports.refreshQuotes = refreshQuotes;
168
158
  //# sourceMappingURL=quotes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"quotes.cjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { getStrategy, getStrategyByName } from './strategy';\nimport { calculateTotals } from './totals';\nimport { getTransaction, updateTransaction } from './transaction';\nimport { projectLogger } from '../logger';\nimport type {\n QuoteRequest,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayTotals,\n TransactionPaymentToken,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst QUOTES_CHECK_INTERVAL = 1 * 1000; // 1 Second\nconst DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds\n\nconst log = createModuleLogger(projectLogger, 'quotes');\n\nexport type UpdateQuotesRequest = {\n messenger: TransactionPayControllerMessenger;\n transactionData: TransactionData | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the quotes for a specific transaction.\n *\n * @param request - Request parameters.\n */\nexport async function updateQuotes(request: UpdateQuotesRequest) {\n const { messenger, transactionData, transactionId, updateTransactionData } =\n request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n log('Updating quotes', { transactionId });\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n const { paymentToken, sourceAmounts, tokens } = transactionData;\n\n if (!paymentToken) {\n return;\n }\n\n const requests: QuoteRequest[] = (sourceAmounts ?? []).map(\n (sourceAmount, i) => {\n const token = tokens[i];\n\n return {\n from: transaction.txParams.from as Hex,\n sourceBalanceRaw: paymentToken.balanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: paymentToken.chainId,\n sourceTokenAddress: paymentToken.address,\n targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,\n targetChainId: token.chainId,\n targetTokenAddress: token.address,\n };\n },\n );\n\n if (!requests?.length) {\n log('No quote requests', { transactionId });\n }\n\n let quotes: TransactionPayQuote<Json>[] | undefined = [];\n\n const strategy = await getStrategy(messenger as never, transaction);\n\n try {\n quotes = requests?.length\n ? ((await strategy.getQuotes({\n messenger,\n requests,\n transaction,\n })) as TransactionPayQuote<Json>[])\n : [];\n } catch (error) {\n log('Error fetching quotes', { error, transactionId });\n }\n\n log('Updated', { transactionId, quotes });\n\n const batchTransactions =\n quotes?.length && strategy.getBatchTransactions\n ? await strategy.getBatchTransactions({\n messenger,\n quotes,\n })\n : [];\n\n log('Batch transactions', { transactionId, batchTransactions });\n\n const totals = calculateTotals(quotes as never, tokens, messenger);\n\n log('Calculated totals', { transactionId, totals });\n\n syncTransaction({\n batchTransactions,\n messenger: messenger as never,\n paymentToken,\n totals,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.quotes = quotes as never;\n data.quotesLastUpdated = Date.now();\n data.totals = totals;\n data.isLoading = false;\n });\n}\n\n/**\n * Poll quotes at regular intervals.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n */\nexport function queueRefreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n setTimeout(() => {\n refreshQuotes(messenger, updateTransactionData)\n .finally(() => queueRefreshQuotes(messenger, updateTransactionData))\n .catch((error) => {\n log('Error polling quotes', { messenger, error });\n });\n }, QUOTES_CHECK_INTERVAL);\n}\n\n/**\n * Sync batch transactions to the transaction meta.\n *\n * @param request - Request object.\n * @param request.batchTransactions - Batch transactions to sync.\n * @param request.messenger - Messenger instance.\n * @param request.paymentToken - Payment token used.\n * @param request.totals - Calculated totals.\n * @param request.transactionId - ID of the transaction to sync.\n */\nfunction syncTransaction({\n batchTransactions,\n messenger,\n paymentToken,\n totals,\n transactionId,\n}: {\n batchTransactions: BatchTransaction[];\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken;\n totals: TransactionPayTotals;\n transactionId: string;\n}) {\n updateTransaction(\n {\n transactionId,\n messenger: messenger as never,\n note: 'Update transaction pay data',\n },\n (tx: TransactionMeta) => {\n tx.batchTransactions = batchTransactions;\n tx.batchTransactionsOptions = {};\n\n tx.metamaskPay = {\n bridgeFeeFiat: totals.fees.provider.usd,\n chainId: paymentToken.chainId,\n networkFeeFiat: totals.fees.sourceNetwork.usd,\n tokenAddress: paymentToken.address,\n totalFiat: totals.total.usd,\n };\n },\n );\n}\n\n/**\n * Refresh quotes for all transactions if expired.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n */\nasync function refreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const state = messenger.call('TransactionPayController:getState');\n const transactionIds = Object.keys(state.transactionData);\n\n for (const transactionId of transactionIds) {\n const transactionData = state.transactionData[transactionId];\n const { isLoading, quotes, quotesLastUpdated } = transactionData;\n\n if (isLoading || !quotes?.length) {\n continue;\n }\n\n const strategyName = quotes[0].strategy;\n const strategy = getStrategyByName(strategyName);\n\n const refreshInterval =\n (await strategy.getRefreshInterval?.({\n chainId: quotes[0].request.sourceChainId,\n messenger,\n })) ?? DEFAULT_REFRESH_INTERVAL;\n\n const isExpired = Date.now() - (quotesLastUpdated ?? 0) > refreshInterval;\n\n if (!isExpired) {\n continue;\n }\n\n log('Refreshing expired quotes', {\n transactionId,\n strategy: strategyName,\n refreshInterval,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n await updateQuotes({\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n}\n"]}
1
+ {"version":3,"file":"quotes.cjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { getStrategy, getStrategyByName } from './strategy';\nimport { calculateTotals } from './totals';\nimport { getTransaction, updateTransaction } from './transaction';\nimport { projectLogger } from '../logger';\nimport type {\n QuoteRequest,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n TransactionPaymentToken,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds\n\nconst log = createModuleLogger(projectLogger, 'quotes');\n\nexport type UpdateQuotesRequest = {\n messenger: TransactionPayControllerMessenger;\n transactionData: TransactionData | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the quotes for a specific transaction.\n *\n * @param request - Request parameters.\n */\nexport async function updateQuotes(request: UpdateQuotesRequest) {\n const { messenger, transactionData, transactionId, updateTransactionData } =\n request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n log('Updating quotes', { transactionId });\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n const { paymentToken, sourceAmounts, tokens } = transactionData;\n\n if (!paymentToken) {\n return;\n }\n\n const requests: QuoteRequest[] = (sourceAmounts ?? []).map((sourceAmount) => {\n const token = tokens.find(\n (t) => t.address === sourceAmount.targetTokenAddress,\n ) as TransactionPayRequiredToken;\n\n return {\n from: transaction.txParams.from as Hex,\n sourceBalanceRaw: paymentToken.balanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: paymentToken.chainId,\n sourceTokenAddress: paymentToken.address,\n targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,\n targetChainId: token.chainId,\n targetTokenAddress: token.address,\n };\n });\n\n if (!requests?.length) {\n log('No quote requests', { transactionId });\n }\n\n let quotes: TransactionPayQuote<Json>[] | undefined = [];\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n try {\n const strategy = await getStrategy(messenger as never, transaction);\n\n try {\n quotes = requests?.length\n ? ((await strategy.getQuotes({\n messenger,\n requests,\n transaction,\n })) as TransactionPayQuote<Json>[])\n : [];\n } catch (error) {\n log('Error fetching quotes', { error, transactionId });\n }\n\n log('Updated', { transactionId, quotes });\n\n const batchTransactions =\n quotes?.length && strategy.getBatchTransactions\n ? await strategy.getBatchTransactions({\n messenger,\n quotes,\n })\n : [];\n\n log('Batch transactions', { transactionId, batchTransactions });\n\n const totals = calculateTotals(quotes as never, tokens, messenger);\n\n log('Calculated totals', { transactionId, totals });\n\n syncTransaction({\n batchTransactions,\n messenger: messenger as never,\n paymentToken,\n totals,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.quotes = quotes as never;\n data.quotesLastUpdated = Date.now();\n data.totals = totals;\n });\n } finally {\n updateTransactionData(transactionId, (data) => {\n data.isLoading = false;\n });\n }\n}\n\n/**\n * Sync batch transactions to the transaction meta.\n *\n * @param request - Request object.\n * @param request.batchTransactions - Batch transactions to sync.\n * @param request.messenger - Messenger instance.\n * @param request.paymentToken - Payment token used.\n * @param request.totals - Calculated totals.\n * @param request.transactionId - ID of the transaction to sync.\n */\nfunction syncTransaction({\n batchTransactions,\n messenger,\n paymentToken,\n totals,\n transactionId,\n}: {\n batchTransactions: BatchTransaction[];\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken;\n totals: TransactionPayTotals;\n transactionId: string;\n}) {\n updateTransaction(\n {\n transactionId,\n messenger: messenger as never,\n note: 'Update transaction pay data',\n },\n (tx: TransactionMeta) => {\n tx.batchTransactions = batchTransactions;\n tx.batchTransactionsOptions = {};\n\n tx.metamaskPay = {\n bridgeFeeFiat: totals.fees.provider.usd,\n chainId: paymentToken.chainId,\n networkFeeFiat: totals.fees.sourceNetwork.usd,\n tokenAddress: paymentToken.address,\n totalFiat: totals.total.usd,\n };\n },\n );\n}\n\n/**\n * Refresh quotes for all transactions if expired.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n */\nexport async function refreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const state = messenger.call('TransactionPayController:getState');\n const transactionIds = Object.keys(state.transactionData);\n\n for (const transactionId of transactionIds) {\n const transactionData = state.transactionData[transactionId];\n const { isLoading, quotes, quotesLastUpdated } = transactionData;\n\n if (isLoading || !quotes?.length) {\n continue;\n }\n\n const strategyName = quotes[0].strategy;\n const strategy = getStrategyByName(strategyName);\n\n const refreshInterval =\n (await strategy.getRefreshInterval?.({\n chainId: quotes[0].request.sourceChainId,\n messenger,\n })) ?? DEFAULT_REFRESH_INTERVAL;\n\n const isExpired = Date.now() - (quotesLastUpdated ?? 0) > refreshInterval;\n\n if (!isExpired) {\n continue;\n }\n\n log('Refreshing expired quotes', {\n transactionId,\n strategy: strategyName,\n refreshInterval,\n });\n\n await updateQuotes({\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n}\n"]}
@@ -12,10 +12,10 @@ export type UpdateQuotesRequest = {
12
12
  */
13
13
  export declare function updateQuotes(request: UpdateQuotesRequest): Promise<void>;
14
14
  /**
15
- * Poll quotes at regular intervals.
15
+ * Refresh quotes for all transactions if expired.
16
16
  *
17
17
  * @param messenger - Messenger instance.
18
18
  * @param updateTransactionData - Callback to update transaction data.
19
19
  */
20
- export declare function queueRefreshQuotes(messenger: TransactionPayControllerMessenger, updateTransactionData: UpdateTransactionDataCallback): void;
20
+ export declare function refreshQuotes(messenger: TransactionPayControllerMessenger, updateTransactionData: UpdateTransactionDataCallback): Promise<void>;
21
21
  //# sourceMappingURL=quotes.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quotes.d.cts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAIjC,6BAA6B,EAC9B,qBAAiB;AAOlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,iBAqF9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,QASrD"}
1
+ {"version":3,"file":"quotes.d.cts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAKjC,6BAA6B,EAC9B,qBAAiB;AAMlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,iBA8F9D;AA8CD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,iBA2CrD"}
@@ -12,10 +12,10 @@ export type UpdateQuotesRequest = {
12
12
  */
13
13
  export declare function updateQuotes(request: UpdateQuotesRequest): Promise<void>;
14
14
  /**
15
- * Poll quotes at regular intervals.
15
+ * Refresh quotes for all transactions if expired.
16
16
  *
17
17
  * @param messenger - Messenger instance.
18
18
  * @param updateTransactionData - Callback to update transaction data.
19
19
  */
20
- export declare function queueRefreshQuotes(messenger: TransactionPayControllerMessenger, updateTransactionData: UpdateTransactionDataCallback): void;
20
+ export declare function refreshQuotes(messenger: TransactionPayControllerMessenger, updateTransactionData: UpdateTransactionDataCallback): Promise<void>;
21
21
  //# sourceMappingURL=quotes.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quotes.d.mts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAIjC,6BAA6B,EAC9B,qBAAiB;AAOlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,iBAqF9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,QASrD"}
1
+ {"version":3,"file":"quotes.d.mts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAKjC,6BAA6B,EAC9B,qBAAiB;AAMlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,iBA8F9D;AA8CD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,iBA2CrD"}
@@ -3,7 +3,6 @@ import { getStrategy, getStrategyByName } from "./strategy.mjs";
3
3
  import { calculateTotals } from "./totals.mjs";
4
4
  import { getTransaction, updateTransaction } from "./transaction.mjs";
5
5
  import { projectLogger } from "../logger.mjs";
6
- const QUOTES_CHECK_INTERVAL = 1 * 1000; // 1 Second
7
6
  const DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds
8
7
  const log = createModuleLogger(projectLogger, 'quotes');
9
8
  /**
@@ -22,8 +21,8 @@ export async function updateQuotes(request) {
22
21
  if (!paymentToken) {
23
22
  return;
24
23
  }
25
- const requests = (sourceAmounts ?? []).map((sourceAmount, i) => {
26
- const token = tokens[i];
24
+ const requests = (sourceAmounts ?? []).map((sourceAmount) => {
25
+ const token = tokens.find((t) => t.address === sourceAmount.targetTokenAddress);
27
26
  return {
28
27
  from: transaction.txParams.from,
29
28
  sourceBalanceRaw: paymentToken.balanceRaw,
@@ -39,57 +38,51 @@ export async function updateQuotes(request) {
39
38
  log('No quote requests', { transactionId });
40
39
  }
41
40
  let quotes = [];
42
- const strategy = await getStrategy(messenger, transaction);
41
+ updateTransactionData(transactionId, (data) => {
42
+ data.isLoading = true;
43
+ });
43
44
  try {
44
- quotes = requests?.length
45
- ? (await strategy.getQuotes({
45
+ const strategy = await getStrategy(messenger, transaction);
46
+ try {
47
+ quotes = requests?.length
48
+ ? (await strategy.getQuotes({
49
+ messenger,
50
+ requests,
51
+ transaction,
52
+ }))
53
+ : [];
54
+ }
55
+ catch (error) {
56
+ log('Error fetching quotes', { error, transactionId });
57
+ }
58
+ log('Updated', { transactionId, quotes });
59
+ const batchTransactions = quotes?.length && strategy.getBatchTransactions
60
+ ? await strategy.getBatchTransactions({
46
61
  messenger,
47
- requests,
48
- transaction,
49
- }))
62
+ quotes,
63
+ })
50
64
  : [];
65
+ log('Batch transactions', { transactionId, batchTransactions });
66
+ const totals = calculateTotals(quotes, tokens, messenger);
67
+ log('Calculated totals', { transactionId, totals });
68
+ syncTransaction({
69
+ batchTransactions,
70
+ messenger: messenger,
71
+ paymentToken,
72
+ totals,
73
+ transactionId,
74
+ });
75
+ updateTransactionData(transactionId, (data) => {
76
+ data.quotes = quotes;
77
+ data.quotesLastUpdated = Date.now();
78
+ data.totals = totals;
79
+ });
51
80
  }
52
- catch (error) {
53
- log('Error fetching quotes', { error, transactionId });
54
- }
55
- log('Updated', { transactionId, quotes });
56
- const batchTransactions = quotes?.length && strategy.getBatchTransactions
57
- ? await strategy.getBatchTransactions({
58
- messenger,
59
- quotes,
60
- })
61
- : [];
62
- log('Batch transactions', { transactionId, batchTransactions });
63
- const totals = calculateTotals(quotes, tokens, messenger);
64
- log('Calculated totals', { transactionId, totals });
65
- syncTransaction({
66
- batchTransactions,
67
- messenger: messenger,
68
- paymentToken,
69
- totals,
70
- transactionId,
71
- });
72
- updateTransactionData(transactionId, (data) => {
73
- data.quotes = quotes;
74
- data.quotesLastUpdated = Date.now();
75
- data.totals = totals;
76
- data.isLoading = false;
77
- });
78
- }
79
- /**
80
- * Poll quotes at regular intervals.
81
- *
82
- * @param messenger - Messenger instance.
83
- * @param updateTransactionData - Callback to update transaction data.
84
- */
85
- export function queueRefreshQuotes(messenger, updateTransactionData) {
86
- setTimeout(() => {
87
- refreshQuotes(messenger, updateTransactionData)
88
- .finally(() => queueRefreshQuotes(messenger, updateTransactionData))
89
- .catch((error) => {
90
- log('Error polling quotes', { messenger, error });
81
+ finally {
82
+ updateTransactionData(transactionId, (data) => {
83
+ data.isLoading = false;
91
84
  });
92
- }, QUOTES_CHECK_INTERVAL);
85
+ }
93
86
  }
94
87
  /**
95
88
  * Sync batch transactions to the transaction meta.
@@ -124,7 +117,7 @@ function syncTransaction({ batchTransactions, messenger, paymentToken, totals, t
124
117
  * @param messenger - Messenger instance.
125
118
  * @param updateTransactionData - Callback to update transaction data.
126
119
  */
127
- async function refreshQuotes(messenger, updateTransactionData) {
120
+ export async function refreshQuotes(messenger, updateTransactionData) {
128
121
  const state = messenger.call('TransactionPayController:getState');
129
122
  const transactionIds = Object.keys(state.transactionData);
130
123
  for (const transactionId of transactionIds) {
@@ -148,9 +141,6 @@ async function refreshQuotes(messenger, updateTransactionData) {
148
141
  strategy: strategyName,
149
142
  refreshInterval,
150
143
  });
151
- updateTransactionData(transactionId, (data) => {
152
- data.isLoading = true;
153
- });
154
144
  await updateQuotes({
155
145
  messenger,
156
146
  transactionData,
@@ -1 +1 @@
1
- {"version":3,"file":"quotes.mjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { getStrategy, getStrategyByName } from './strategy';\nimport { calculateTotals } from './totals';\nimport { getTransaction, updateTransaction } from './transaction';\nimport { projectLogger } from '../logger';\nimport type {\n QuoteRequest,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayTotals,\n TransactionPaymentToken,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst QUOTES_CHECK_INTERVAL = 1 * 1000; // 1 Second\nconst DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds\n\nconst log = createModuleLogger(projectLogger, 'quotes');\n\nexport type UpdateQuotesRequest = {\n messenger: TransactionPayControllerMessenger;\n transactionData: TransactionData | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the quotes for a specific transaction.\n *\n * @param request - Request parameters.\n */\nexport async function updateQuotes(request: UpdateQuotesRequest) {\n const { messenger, transactionData, transactionId, updateTransactionData } =\n request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n log('Updating quotes', { transactionId });\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n const { paymentToken, sourceAmounts, tokens } = transactionData;\n\n if (!paymentToken) {\n return;\n }\n\n const requests: QuoteRequest[] = (sourceAmounts ?? []).map(\n (sourceAmount, i) => {\n const token = tokens[i];\n\n return {\n from: transaction.txParams.from as Hex,\n sourceBalanceRaw: paymentToken.balanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: paymentToken.chainId,\n sourceTokenAddress: paymentToken.address,\n targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,\n targetChainId: token.chainId,\n targetTokenAddress: token.address,\n };\n },\n );\n\n if (!requests?.length) {\n log('No quote requests', { transactionId });\n }\n\n let quotes: TransactionPayQuote<Json>[] | undefined = [];\n\n const strategy = await getStrategy(messenger as never, transaction);\n\n try {\n quotes = requests?.length\n ? ((await strategy.getQuotes({\n messenger,\n requests,\n transaction,\n })) as TransactionPayQuote<Json>[])\n : [];\n } catch (error) {\n log('Error fetching quotes', { error, transactionId });\n }\n\n log('Updated', { transactionId, quotes });\n\n const batchTransactions =\n quotes?.length && strategy.getBatchTransactions\n ? await strategy.getBatchTransactions({\n messenger,\n quotes,\n })\n : [];\n\n log('Batch transactions', { transactionId, batchTransactions });\n\n const totals = calculateTotals(quotes as never, tokens, messenger);\n\n log('Calculated totals', { transactionId, totals });\n\n syncTransaction({\n batchTransactions,\n messenger: messenger as never,\n paymentToken,\n totals,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.quotes = quotes as never;\n data.quotesLastUpdated = Date.now();\n data.totals = totals;\n data.isLoading = false;\n });\n}\n\n/**\n * Poll quotes at regular intervals.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n */\nexport function queueRefreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n setTimeout(() => {\n refreshQuotes(messenger, updateTransactionData)\n .finally(() => queueRefreshQuotes(messenger, updateTransactionData))\n .catch((error) => {\n log('Error polling quotes', { messenger, error });\n });\n }, QUOTES_CHECK_INTERVAL);\n}\n\n/**\n * Sync batch transactions to the transaction meta.\n *\n * @param request - Request object.\n * @param request.batchTransactions - Batch transactions to sync.\n * @param request.messenger - Messenger instance.\n * @param request.paymentToken - Payment token used.\n * @param request.totals - Calculated totals.\n * @param request.transactionId - ID of the transaction to sync.\n */\nfunction syncTransaction({\n batchTransactions,\n messenger,\n paymentToken,\n totals,\n transactionId,\n}: {\n batchTransactions: BatchTransaction[];\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken;\n totals: TransactionPayTotals;\n transactionId: string;\n}) {\n updateTransaction(\n {\n transactionId,\n messenger: messenger as never,\n note: 'Update transaction pay data',\n },\n (tx: TransactionMeta) => {\n tx.batchTransactions = batchTransactions;\n tx.batchTransactionsOptions = {};\n\n tx.metamaskPay = {\n bridgeFeeFiat: totals.fees.provider.usd,\n chainId: paymentToken.chainId,\n networkFeeFiat: totals.fees.sourceNetwork.usd,\n tokenAddress: paymentToken.address,\n totalFiat: totals.total.usd,\n };\n },\n );\n}\n\n/**\n * Refresh quotes for all transactions if expired.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n */\nasync function refreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const state = messenger.call('TransactionPayController:getState');\n const transactionIds = Object.keys(state.transactionData);\n\n for (const transactionId of transactionIds) {\n const transactionData = state.transactionData[transactionId];\n const { isLoading, quotes, quotesLastUpdated } = transactionData;\n\n if (isLoading || !quotes?.length) {\n continue;\n }\n\n const strategyName = quotes[0].strategy;\n const strategy = getStrategyByName(strategyName);\n\n const refreshInterval =\n (await strategy.getRefreshInterval?.({\n chainId: quotes[0].request.sourceChainId,\n messenger,\n })) ?? DEFAULT_REFRESH_INTERVAL;\n\n const isExpired = Date.now() - (quotesLastUpdated ?? 0) > refreshInterval;\n\n if (!isExpired) {\n continue;\n }\n\n log('Refreshing expired quotes', {\n transactionId,\n strategy: strategyName,\n refreshInterval,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n await updateQuotes({\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n}\n"]}
1
+ {"version":3,"file":"quotes.mjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { getStrategy, getStrategyByName } from './strategy';\nimport { calculateTotals } from './totals';\nimport { getTransaction, updateTransaction } from './transaction';\nimport { projectLogger } from '../logger';\nimport type {\n QuoteRequest,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n TransactionPaymentToken,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds\n\nconst log = createModuleLogger(projectLogger, 'quotes');\n\nexport type UpdateQuotesRequest = {\n messenger: TransactionPayControllerMessenger;\n transactionData: TransactionData | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the quotes for a specific transaction.\n *\n * @param request - Request parameters.\n */\nexport async function updateQuotes(request: UpdateQuotesRequest) {\n const { messenger, transactionData, transactionId, updateTransactionData } =\n request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n log('Updating quotes', { transactionId });\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n const { paymentToken, sourceAmounts, tokens } = transactionData;\n\n if (!paymentToken) {\n return;\n }\n\n const requests: QuoteRequest[] = (sourceAmounts ?? []).map((sourceAmount) => {\n const token = tokens.find(\n (t) => t.address === sourceAmount.targetTokenAddress,\n ) as TransactionPayRequiredToken;\n\n return {\n from: transaction.txParams.from as Hex,\n sourceBalanceRaw: paymentToken.balanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: paymentToken.chainId,\n sourceTokenAddress: paymentToken.address,\n targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,\n targetChainId: token.chainId,\n targetTokenAddress: token.address,\n };\n });\n\n if (!requests?.length) {\n log('No quote requests', { transactionId });\n }\n\n let quotes: TransactionPayQuote<Json>[] | undefined = [];\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n try {\n const strategy = await getStrategy(messenger as never, transaction);\n\n try {\n quotes = requests?.length\n ? ((await strategy.getQuotes({\n messenger,\n requests,\n transaction,\n })) as TransactionPayQuote<Json>[])\n : [];\n } catch (error) {\n log('Error fetching quotes', { error, transactionId });\n }\n\n log('Updated', { transactionId, quotes });\n\n const batchTransactions =\n quotes?.length && strategy.getBatchTransactions\n ? await strategy.getBatchTransactions({\n messenger,\n quotes,\n })\n : [];\n\n log('Batch transactions', { transactionId, batchTransactions });\n\n const totals = calculateTotals(quotes as never, tokens, messenger);\n\n log('Calculated totals', { transactionId, totals });\n\n syncTransaction({\n batchTransactions,\n messenger: messenger as never,\n paymentToken,\n totals,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.quotes = quotes as never;\n data.quotesLastUpdated = Date.now();\n data.totals = totals;\n });\n } finally {\n updateTransactionData(transactionId, (data) => {\n data.isLoading = false;\n });\n }\n}\n\n/**\n * Sync batch transactions to the transaction meta.\n *\n * @param request - Request object.\n * @param request.batchTransactions - Batch transactions to sync.\n * @param request.messenger - Messenger instance.\n * @param request.paymentToken - Payment token used.\n * @param request.totals - Calculated totals.\n * @param request.transactionId - ID of the transaction to sync.\n */\nfunction syncTransaction({\n batchTransactions,\n messenger,\n paymentToken,\n totals,\n transactionId,\n}: {\n batchTransactions: BatchTransaction[];\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken;\n totals: TransactionPayTotals;\n transactionId: string;\n}) {\n updateTransaction(\n {\n transactionId,\n messenger: messenger as never,\n note: 'Update transaction pay data',\n },\n (tx: TransactionMeta) => {\n tx.batchTransactions = batchTransactions;\n tx.batchTransactionsOptions = {};\n\n tx.metamaskPay = {\n bridgeFeeFiat: totals.fees.provider.usd,\n chainId: paymentToken.chainId,\n networkFeeFiat: totals.fees.sourceNetwork.usd,\n tokenAddress: paymentToken.address,\n totalFiat: totals.total.usd,\n };\n },\n );\n}\n\n/**\n * Refresh quotes for all transactions if expired.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n */\nexport async function refreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const state = messenger.call('TransactionPayController:getState');\n const transactionIds = Object.keys(state.transactionData);\n\n for (const transactionId of transactionIds) {\n const transactionData = state.transactionData[transactionId];\n const { isLoading, quotes, quotesLastUpdated } = transactionData;\n\n if (isLoading || !quotes?.length) {\n continue;\n }\n\n const strategyName = quotes[0].strategy;\n const strategy = getStrategyByName(strategyName);\n\n const refreshInterval =\n (await strategy.getRefreshInterval?.({\n chainId: quotes[0].request.sourceChainId,\n messenger,\n })) ?? DEFAULT_REFRESH_INTERVAL;\n\n const isExpired = Date.now() - (quotesLastUpdated ?? 0) > refreshInterval;\n\n if (!isExpired) {\n continue;\n }\n\n log('Refreshing expired quotes', {\n transactionId,\n strategy: strategyName,\n refreshInterval,\n });\n\n await updateQuotes({\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n}\n"]}
@@ -17,8 +17,9 @@ function calculateTotals(quotes, tokens, _messenger) {
17
17
  const sourceNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.sourceNetwork.usd);
18
18
  const targetNetworkFeeFiat = sumProperty(quotes, (quote) => quote.fees.targetNetwork.fiat);
19
19
  const targetNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.targetNetwork.usd);
20
- const amountFiat = sumProperty(tokens, (token) => token.amountFiat);
21
- const amountUsd = sumProperty(tokens, (token) => token.amountUsd);
20
+ const quoteTokens = tokens.filter((t) => !t.skipIfBalance || new bignumber_js_1.BigNumber(t.balanceRaw).isLessThan(t.amountRaw));
21
+ const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);
22
+ const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);
22
23
  const totalFiat = new bignumber_js_1.BigNumber(providerFeeFiat)
23
24
  .plus(sourceNetworkFeeFiat)
24
25
  .plus(targetNetworkFeeFiat)
@@ -1 +1 @@
1
- {"version":3,"file":"totals.cjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":";;;AAAA,+CAAyC;AASzC;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,MAAsC,EACtC,MAAqC,EACrC,UAA6C;IAE7C,MAAM,eAAe,GAAG,WAAW,CACjC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,IAAI,wBAAS,CAAC,eAAe,CAAC;SAC7C,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,IAAI,wBAAS,CAAC,cAAc,CAAC;SAC3C,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,SAAS,CAAC;SACf,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,MAAM,CAC9B,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CACxD,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,cAAc;aACpB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;SACF;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC;AA3ED,0CA2EC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAClB,IAAS,EACT,WAAyC;IAEzC,OAAO,IAAI;SACR,GAAG,CAAC,WAAW,CAAC;SAChB,MAAM,CAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,wBAAS,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param quotes - List of bridge quotes.\n * @param tokens - List of required transaction tokens.\n * @param _messenger - Controller messenger.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals(\n quotes: TransactionPayQuote<unknown>[],\n tokens: TransactionPayRequiredToken[],\n _messenger: TransactionPayControllerMessenger,\n): TransactionPayTotals {\n const providerFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.provider.fiat,\n );\n\n const providerFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.provider.usd,\n );\n\n const sourceNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.fiat,\n );\n\n const sourceNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.usd,\n );\n\n const targetNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.fiat,\n );\n\n const targetNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.usd,\n );\n\n const amountFiat = sumProperty(tokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(tokens, (token) => token.amountUsd);\n\n const totalFiat = new BigNumber(providerFeeFiat)\n .plus(sourceNetworkFeeFiat)\n .plus(targetNetworkFeeFiat)\n .plus(amountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFeeUsd)\n .plus(sourceNetworkFeeUsd)\n .plus(targetNetworkFeeUsd)\n .plus(amountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n return {\n estimatedDuration,\n fees: {\n provider: {\n fiat: providerFeeFiat,\n usd: providerFeeUsd,\n },\n sourceNetwork: {\n fiat: sourceNetworkFeeFiat,\n usd: sourceNetworkFeeUsd,\n },\n targetNetwork: {\n fiat: targetNetworkFeeFiat,\n usd: targetNetworkFeeUsd,\n },\n },\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a specific property from a list of items.\n *\n * @param data - List of items.\n * @param getProperty - Function to extract the property to sum from each item.\n * @returns The summed value as a string.\n */\nfunction sumProperty<T>(\n data: T[],\n getProperty: (item: T) => BigNumber.Value,\n): string {\n return data\n .map(getProperty)\n .reduce<BigNumber>((total, value) => total.plus(value), new BigNumber(0))\n .toString(10);\n}\n"]}
1
+ {"version":3,"file":"totals.cjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":";;;AAAA,+CAAyC;AASzC;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,MAAsC,EACtC,MAAqC,EACrC,UAA6C;IAE7C,MAAM,eAAe,GAAG,WAAW,CACjC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,wBAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAC1E,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;IAEvE,MAAM,SAAS,GAAG,IAAI,wBAAS,CAAC,eAAe,CAAC;SAC7C,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,IAAI,wBAAS,CAAC,cAAc,CAAC;SAC3C,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,SAAS,CAAC;SACf,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,MAAM,CAC9B,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CACxD,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,cAAc;aACpB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;SACF;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC;AAhFD,0CAgFC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAClB,IAAS,EACT,WAAyC;IAEzC,OAAO,IAAI;SACR,GAAG,CAAC,WAAW,CAAC;SAChB,MAAM,CAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,wBAAS,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param quotes - List of bridge quotes.\n * @param tokens - List of required transaction tokens.\n * @param _messenger - Controller messenger.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals(\n quotes: TransactionPayQuote<unknown>[],\n tokens: TransactionPayRequiredToken[],\n _messenger: TransactionPayControllerMessenger,\n): TransactionPayTotals {\n const providerFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.provider.fiat,\n );\n\n const providerFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.provider.usd,\n );\n\n const sourceNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.fiat,\n );\n\n const sourceNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.usd,\n );\n\n const targetNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.fiat,\n );\n\n const targetNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.usd,\n );\n\n const quoteTokens = tokens.filter(\n (t) =>\n !t.skipIfBalance || new BigNumber(t.balanceRaw).isLessThan(t.amountRaw),\n );\n\n const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);\n\n const totalFiat = new BigNumber(providerFeeFiat)\n .plus(sourceNetworkFeeFiat)\n .plus(targetNetworkFeeFiat)\n .plus(amountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFeeUsd)\n .plus(sourceNetworkFeeUsd)\n .plus(targetNetworkFeeUsd)\n .plus(amountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n return {\n estimatedDuration,\n fees: {\n provider: {\n fiat: providerFeeFiat,\n usd: providerFeeUsd,\n },\n sourceNetwork: {\n fiat: sourceNetworkFeeFiat,\n usd: sourceNetworkFeeUsd,\n },\n targetNetwork: {\n fiat: targetNetworkFeeFiat,\n usd: targetNetworkFeeUsd,\n },\n },\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a specific property from a list of items.\n *\n * @param data - List of items.\n * @param getProperty - Function to extract the property to sum from each item.\n * @returns The summed value as a string.\n */\nfunction sumProperty<T>(\n data: T[],\n getProperty: (item: T) => BigNumber.Value,\n): string {\n return data\n .map(getProperty)\n .reduce<BigNumber>((total, value) => total.plus(value), new BigNumber(0))\n .toString(10);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"totals.d.cts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAElB;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACtC,MAAM,EAAE,2BAA2B,EAAE,EACrC,UAAU,EAAE,iCAAiC,GAC5C,oBAAoB,CAuEtB"}
1
+ {"version":3,"file":"totals.d.cts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAElB;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACtC,MAAM,EAAE,2BAA2B,EAAE,EACrC,UAAU,EAAE,iCAAiC,GAC5C,oBAAoB,CA4EtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"totals.d.mts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAElB;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACtC,MAAM,EAAE,2BAA2B,EAAE,EACrC,UAAU,EAAE,iCAAiC,GAC5C,oBAAoB,CAuEtB"}
1
+ {"version":3,"file":"totals.d.mts","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACnB,2BAA2B,EAC3B,oBAAoB,EACrB,qBAAiB;AAElB;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACtC,MAAM,EAAE,2BAA2B,EAAE,EACrC,UAAU,EAAE,iCAAiC,GAC5C,oBAAoB,CA4EtB"}
@@ -14,8 +14,9 @@ export function calculateTotals(quotes, tokens, _messenger) {
14
14
  const sourceNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.sourceNetwork.usd);
15
15
  const targetNetworkFeeFiat = sumProperty(quotes, (quote) => quote.fees.targetNetwork.fiat);
16
16
  const targetNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.targetNetwork.usd);
17
- const amountFiat = sumProperty(tokens, (token) => token.amountFiat);
18
- const amountUsd = sumProperty(tokens, (token) => token.amountUsd);
17
+ const quoteTokens = tokens.filter((t) => !t.skipIfBalance || new BigNumber(t.balanceRaw).isLessThan(t.amountRaw));
18
+ const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);
19
+ const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);
19
20
  const totalFiat = new BigNumber(providerFeeFiat)
20
21
  .plus(sourceNetworkFeeFiat)
21
22
  .plus(targetNetworkFeeFiat)
@@ -1 +1 @@
1
- {"version":3,"file":"totals.mjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AASzC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAsC,EACtC,MAAqC,EACrC,UAA6C;IAE7C,MAAM,eAAe,GAAG,WAAW,CACjC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CACtC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC;SAC7C,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,oBAAoB,CAAC;SAC1B,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC;SAC3C,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,mBAAmB,CAAC;SACzB,IAAI,CAAC,SAAS,CAAC;SACf,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,MAAM,CAC9B,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CACxD,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,cAAc;aACpB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,EAAE,mBAAmB;aACzB;SACF;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAClB,IAAS,EACT,WAAyC;IAEzC,OAAO,IAAI;SACR,GAAG,CAAC,WAAW,CAAC;SAChB,MAAM,CAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param quotes - List of bridge quotes.\n * @param tokens - List of required transaction tokens.\n * @param _messenger - Controller messenger.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals(\n quotes: TransactionPayQuote<unknown>[],\n tokens: TransactionPayRequiredToken[],\n _messenger: TransactionPayControllerMessenger,\n): TransactionPayTotals {\n const providerFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.provider.fiat,\n );\n\n const providerFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.provider.usd,\n );\n\n const sourceNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.fiat,\n );\n\n const sourceNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.usd,\n );\n\n const targetNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.fiat,\n );\n\n const targetNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.usd,\n );\n\n const amountFiat = sumProperty(tokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(tokens, (token) => token.amountUsd);\n\n const totalFiat = new BigNumber(providerFeeFiat)\n .plus(sourceNetworkFeeFiat)\n .plus(targetNetworkFeeFiat)\n .plus(amountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFeeUsd)\n .plus(sourceNetworkFeeUsd)\n .plus(targetNetworkFeeUsd)\n .plus(amountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n return {\n estimatedDuration,\n fees: {\n provider: {\n fiat: providerFeeFiat,\n usd: providerFeeUsd,\n },\n sourceNetwork: {\n fiat: sourceNetworkFeeFiat,\n usd: sourceNetworkFeeUsd,\n },\n targetNetwork: {\n fiat: targetNetworkFeeFiat,\n usd: targetNetworkFeeUsd,\n },\n },\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a specific property from a list of items.\n *\n * @param data - List of items.\n * @param getProperty - Function to extract the property to sum from each item.\n * @returns The summed value as a string.\n */\nfunction sumProperty<T>(\n data: T[],\n getProperty: (item: T) => BigNumber.Value,\n): string {\n return data\n .map(getProperty)\n .reduce<BigNumber>((total, value) => total.plus(value), new BigNumber(0))\n .toString(10);\n}\n"]}
1
+ {"version":3,"file":"totals.mjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from 'bignumber.js';\n\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPayTotals,\n} from '../types';\n\n/**\n * Calculate totals for a list of quotes and tokens.\n *\n * @param quotes - List of bridge quotes.\n * @param tokens - List of required transaction tokens.\n * @param _messenger - Controller messenger.\n * @returns The calculated totals in USD and fiat currency.\n */\nexport function calculateTotals(\n quotes: TransactionPayQuote<unknown>[],\n tokens: TransactionPayRequiredToken[],\n _messenger: TransactionPayControllerMessenger,\n): TransactionPayTotals {\n const providerFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.provider.fiat,\n );\n\n const providerFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.provider.usd,\n );\n\n const sourceNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.fiat,\n );\n\n const sourceNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.sourceNetwork.usd,\n );\n\n const targetNetworkFeeFiat = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.fiat,\n );\n\n const targetNetworkFeeUsd = sumProperty(\n quotes,\n (quote) => quote.fees.targetNetwork.usd,\n );\n\n const quoteTokens = tokens.filter(\n (t) =>\n !t.skipIfBalance || new BigNumber(t.balanceRaw).isLessThan(t.amountRaw),\n );\n\n const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);\n const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);\n\n const totalFiat = new BigNumber(providerFeeFiat)\n .plus(sourceNetworkFeeFiat)\n .plus(targetNetworkFeeFiat)\n .plus(amountFiat)\n .toString(10);\n\n const totalUsd = new BigNumber(providerFeeUsd)\n .plus(sourceNetworkFeeUsd)\n .plus(targetNetworkFeeUsd)\n .plus(amountUsd)\n .toString(10);\n\n const estimatedDuration = Number(\n sumProperty(quotes, (quote) => quote.estimatedDuration),\n );\n\n return {\n estimatedDuration,\n fees: {\n provider: {\n fiat: providerFeeFiat,\n usd: providerFeeUsd,\n },\n sourceNetwork: {\n fiat: sourceNetworkFeeFiat,\n usd: sourceNetworkFeeUsd,\n },\n targetNetwork: {\n fiat: targetNetworkFeeFiat,\n usd: targetNetworkFeeUsd,\n },\n },\n total: {\n fiat: totalFiat,\n usd: totalUsd,\n },\n };\n}\n\n/**\n * Sum a specific property from a list of items.\n *\n * @param data - List of items.\n * @param getProperty - Function to extract the property to sum from each item.\n * @returns The summed value as a string.\n */\nfunction sumProperty<T>(\n data: T[],\n getProperty: (item: T) => BigNumber.Value,\n): string {\n return data\n .map(getProperty)\n .reduce<BigNumber>((total, value) => total.plus(value), new BigNumber(0))\n .toString(10);\n}\n"]}
@@ -45,7 +45,8 @@ function pollTransactionChanges(messenger, updateTransactionData, removeTransact
45
45
  !exports.FINALIZED_STATUSES.includes(previousTransaction.status) &&
46
46
  exports.FINALIZED_STATUSES.includes(tx.status));
47
47
  });
48
- finalizedTransactions.forEach((tx) => onTransactionFinalized(tx, removeTransactionData));
48
+ const deletedTransactions = (previousTransactions ?? []).filter((prevTx) => !transactions.find((tx) => tx.id === prevTx.id));
49
+ [...finalizedTransactions, ...deletedTransactions].forEach((tx) => onTransactionFinalized(tx, removeTransactionData));
49
50
  [...newTransactions, ...updatedTransactions].forEach((tx) => onTransactionChange(tx, messenger, updateTransactionData));
50
51
  }, (state) => state.transactions);
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStatus,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\n\nimport { parseRequiredTokens } from './required-tokens';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPayControllerMessenger,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'transaction');\n\nexport const FINALIZED_STATUSES = [\n TransactionStatus.confirmed,\n TransactionStatus.dropped,\n TransactionStatus.failed,\n];\n\n/**\n * Retrieve transaction metadata by ID.\n *\n * @param transactionId - ID of the transaction to retrieve.\n * @param messenger - Controller messenger.\n * @returns The transaction metadata or undefined if not found.\n */\nexport function getTransaction(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n): TransactionMeta | undefined {\n const transactionControllerState = messenger.call(\n 'TransactionController:getState',\n );\n\n return transactionControllerState.transactions.find(\n (tx) => tx.id === transactionId,\n );\n}\n\n/**\n * Poll for transaction changes and update the transaction data accordingly.\n *\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nexport function pollTransactionChanges(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n removeTransactionData: (transactionId: string) => void,\n) {\n messenger.subscribe(\n 'TransactionController:stateChange',\n (\n transactions: TransactionMeta[],\n previousTransactions: TransactionMeta[] | undefined,\n ) => {\n const newTransactions = transactions.filter(\n (tx) => !previousTransactions?.find((prevTx) => prevTx.id === tx.id),\n );\n\n const updatedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n previousTransaction?.txParams.data !== tx.txParams.data\n );\n });\n\n const finalizedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n !FINALIZED_STATUSES.includes(previousTransaction.status) &&\n FINALIZED_STATUSES.includes(tx.status)\n );\n });\n\n finalizedTransactions.forEach((tx) =>\n onTransactionFinalized(tx, removeTransactionData),\n );\n\n [...newTransactions, ...updatedTransactions].forEach((tx) =>\n onTransactionChange(tx, messenger, updateTransactionData),\n );\n },\n (state) => state.transactions,\n );\n}\n\n/**\n * Wait for a transaction to be confirmed or fail.\n *\n * @param transactionId - ID of the transaction to wait for.\n * @param messenger - Controller messenger.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.\n */\nexport function waitForTransactionConfirmed(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n) {\n return new Promise<void>((resolve, reject) => {\n const isConfirmed = (tx?: TransactionMeta, fn?: () => void) => {\n log('Checking transaction status', tx?.status, tx?.type);\n\n if (tx?.status === TransactionStatus.confirmed) {\n fn?.();\n resolve();\n return true;\n }\n\n if (\n [TransactionStatus.dropped, TransactionStatus.failed].includes(\n tx?.status as TransactionStatus,\n )\n ) {\n fn?.();\n reject(\n new Error(`Transaction failed - ${tx?.type} - ${tx?.error?.message}`),\n );\n return true;\n }\n\n return false;\n };\n\n const initialState = messenger.call('TransactionController:getState');\n\n const initialTx = initialState.transactions.find(\n (t) => t.id === transactionId,\n );\n\n if (isConfirmed(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta) => {\n const unsubscribe = () =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n isConfirmed(tx, unsubscribe);\n };\n\n messenger.subscribe('TransactionController:stateChange', handler, (state) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Update a transaction by applying a function to its draft.\n *\n * @param request - Request object.\n * @param request.transactionId - ID of the transaction to update.\n * @param request.messenger - Controller messenger.\n * @param request.note - Note describing the update.\n * @param fn - Function that applies updates to the transaction draft.\n */\nexport function updateTransaction(\n {\n transactionId,\n messenger,\n note,\n }: {\n transactionId: string;\n messenger: TransactionPayControllerMessenger;\n note: string;\n },\n fn: (draft: TransactionMeta) => void,\n) {\n const transaction = getTransaction(transactionId, messenger as never);\n\n if (!transaction) {\n throw new Error(`Transaction not found: ${transactionId}`);\n }\n\n const newTransaction = cloneDeep(transaction);\n\n fn(newTransaction);\n\n messenger.call(\n 'TransactionController:updateTransaction',\n newTransaction,\n note,\n );\n}\n\n/**\n * Handle a transaction change by updating its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n */\nfunction onTransactionChange(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const tokens = parseRequiredTokens(transaction, messenger);\n\n log('Transaction changed', { transaction, tokens });\n\n updateTransactionData(transaction.id, (data) => {\n data.tokens = tokens;\n });\n}\n\n/**\n * Handle a finalized transaction by removing its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nfunction onTransactionFinalized(\n transaction: TransactionMeta,\n removeTransactionData: (transactionId: string) => void,\n) {\n log('Transaction finalized', { transaction });\n removeTransactionData(transaction.id);\n}\n"]}
1
+ {"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStatus,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\n\nimport { parseRequiredTokens } from './required-tokens';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPayControllerMessenger,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'transaction');\n\nexport const FINALIZED_STATUSES = [\n TransactionStatus.confirmed,\n TransactionStatus.dropped,\n TransactionStatus.failed,\n];\n\n/**\n * Retrieve transaction metadata by ID.\n *\n * @param transactionId - ID of the transaction to retrieve.\n * @param messenger - Controller messenger.\n * @returns The transaction metadata or undefined if not found.\n */\nexport function getTransaction(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n): TransactionMeta | undefined {\n const transactionControllerState = messenger.call(\n 'TransactionController:getState',\n );\n\n return transactionControllerState.transactions.find(\n (tx) => tx.id === transactionId,\n );\n}\n\n/**\n * Poll for transaction changes and update the transaction data accordingly.\n *\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nexport function pollTransactionChanges(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n removeTransactionData: (transactionId: string) => void,\n) {\n messenger.subscribe(\n 'TransactionController:stateChange',\n (\n transactions: TransactionMeta[],\n previousTransactions: TransactionMeta[] | undefined,\n ) => {\n const newTransactions = transactions.filter(\n (tx) => !previousTransactions?.find((prevTx) => prevTx.id === tx.id),\n );\n\n const updatedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n previousTransaction?.txParams.data !== tx.txParams.data\n );\n });\n\n const finalizedTransactions = transactions.filter((tx) => {\n const previousTransaction = previousTransactions?.find(\n (prevTx) => prevTx.id === tx.id,\n );\n\n return (\n previousTransaction &&\n !FINALIZED_STATUSES.includes(previousTransaction.status) &&\n FINALIZED_STATUSES.includes(tx.status)\n );\n });\n\n const deletedTransactions = (previousTransactions ?? []).filter(\n (prevTx) => !transactions.find((tx) => tx.id === prevTx.id),\n );\n\n [...finalizedTransactions, ...deletedTransactions].forEach((tx) =>\n onTransactionFinalized(tx, removeTransactionData),\n );\n\n [...newTransactions, ...updatedTransactions].forEach((tx) =>\n onTransactionChange(tx, messenger, updateTransactionData),\n );\n },\n (state) => state.transactions,\n );\n}\n\n/**\n * Wait for a transaction to be confirmed or fail.\n *\n * @param transactionId - ID of the transaction to wait for.\n * @param messenger - Controller messenger.\n * @returns A promise that resolves when the transaction is confirmed or rejects if it fails.\n */\nexport function waitForTransactionConfirmed(\n transactionId: string,\n messenger: TransactionPayControllerMessenger,\n) {\n return new Promise<void>((resolve, reject) => {\n const isConfirmed = (tx?: TransactionMeta, fn?: () => void) => {\n log('Checking transaction status', tx?.status, tx?.type);\n\n if (tx?.status === TransactionStatus.confirmed) {\n fn?.();\n resolve();\n return true;\n }\n\n if (\n [TransactionStatus.dropped, TransactionStatus.failed].includes(\n tx?.status as TransactionStatus,\n )\n ) {\n fn?.();\n reject(\n new Error(`Transaction failed - ${tx?.type} - ${tx?.error?.message}`),\n );\n return true;\n }\n\n return false;\n };\n\n const initialState = messenger.call('TransactionController:getState');\n\n const initialTx = initialState.transactions.find(\n (t) => t.id === transactionId,\n );\n\n if (isConfirmed(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta) => {\n const unsubscribe = () =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n isConfirmed(tx, unsubscribe);\n };\n\n messenger.subscribe('TransactionController:stateChange', handler, (state) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Update a transaction by applying a function to its draft.\n *\n * @param request - Request object.\n * @param request.transactionId - ID of the transaction to update.\n * @param request.messenger - Controller messenger.\n * @param request.note - Note describing the update.\n * @param fn - Function that applies updates to the transaction draft.\n */\nexport function updateTransaction(\n {\n transactionId,\n messenger,\n note,\n }: {\n transactionId: string;\n messenger: TransactionPayControllerMessenger;\n note: string;\n },\n fn: (draft: TransactionMeta) => void,\n) {\n const transaction = getTransaction(transactionId, messenger as never);\n\n if (!transaction) {\n throw new Error(`Transaction not found: ${transactionId}`);\n }\n\n const newTransaction = cloneDeep(transaction);\n\n fn(newTransaction);\n\n messenger.call(\n 'TransactionController:updateTransaction',\n newTransaction,\n note,\n );\n}\n\n/**\n * Handle a transaction change by updating its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param messenger - Controller messenger.\n * @param updateTransactionData - Callback to update transaction data.\n */\nfunction onTransactionChange(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n) {\n const tokens = parseRequiredTokens(transaction, messenger);\n\n log('Transaction changed', { transaction, tokens });\n\n updateTransactionData(transaction.id, (data) => {\n data.tokens = tokens;\n });\n}\n\n/**\n * Handle a finalized transaction by removing its associated data.\n *\n * @param transaction - Transaction metadata.\n * @param removeTransactionData - Callback to remove transaction data.\n */\nfunction onTransactionFinalized(\n transaction: TransactionMeta,\n removeTransactionData: (transactionId: string) => void,\n) {\n log('Transaction finalized', { transaction });\n removeTransactionData(transaction.id);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACrB,yCAAyC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,6BAA6B,EAC9B,qBAAiB;AAIlB,eAAO,MAAM,kBAAkB,qBAI9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,GAC3C,eAAe,GAAG,SAAS,CAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,QA6CvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,iBAgD7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EACE,aAAa,EACb,SAAS,EACT,IAAI,GACL,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,EACD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,QAiBrC"}
1
+ {"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACrB,yCAAyC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,6BAA6B,EAC9B,qBAAiB;AAIlB,eAAO,MAAM,kBAAkB,qBAI9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,GAC3C,eAAe,GAAG,SAAS,CAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,QAiDvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,iBAgD7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EACE,aAAa,EACb,SAAS,EACT,IAAI,GACL,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,EACD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,QAiBrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACrB,yCAAyC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,6BAA6B,EAC9B,qBAAiB;AAIlB,eAAO,MAAM,kBAAkB,qBAI9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,GAC3C,eAAe,GAAG,SAAS,CAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,QA6CvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,iBAgD7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EACE,aAAa,EACb,SAAS,EACT,IAAI,GACL,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,EACD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,QAiBrC"}
1
+ {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACrB,yCAAyC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,6BAA6B,EAC9B,qBAAiB;AAIlB,eAAO,MAAM,kBAAkB,qBAI9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,GAC3C,eAAe,GAAG,SAAS,CAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,qBAAqB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,QAiDvD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,iCAAiC,iBAgD7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EACE,aAAa,EACb,SAAS,EACT,IAAI,GACL,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,EACD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,QAiBrC"}
@@ -42,7 +42,8 @@ export function pollTransactionChanges(messenger, updateTransactionData, removeT
42
42
  !FINALIZED_STATUSES.includes(previousTransaction.status) &&
43
43
  FINALIZED_STATUSES.includes(tx.status));
44
44
  });
45
- finalizedTransactions.forEach((tx) => onTransactionFinalized(tx, removeTransactionData));
45
+ const deletedTransactions = (previousTransactions ?? []).filter((prevTx) => !transactions.find((tx) => tx.id === prevTx.id));
46
+ [...finalizedTransactions, ...deletedTransactions].forEach((tx) => onTransactionFinalized(tx, removeTransactionData));
46
47
  [...newTransactions, ...updatedTransactions].forEach((tx) => onTransactionChange(tx, messenger, updateTransactionData));
47
48
  }, (state) => state.transactions);
48
49
  }