@metamask/transaction-pay-controller 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -1
- package/dist/strategy/bridge/bridge-quotes.cjs +13 -5
- package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.mjs +13 -5
- package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
- package/dist/strategy/bridge/bridge-submit.cjs +9 -3
- package/dist/strategy/bridge/bridge-submit.cjs.map +1 -1
- package/dist/strategy/bridge/bridge-submit.d.cts.map +1 -1
- package/dist/strategy/bridge/bridge-submit.d.mts.map +1 -1
- package/dist/strategy/bridge/bridge-submit.mjs +9 -3
- package/dist/strategy/bridge/bridge-submit.mjs.map +1 -1
- package/dist/utils/quotes.cjs +97 -49
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.d.cts +2 -1
- package/dist/utils/quotes.d.cts.map +1 -1
- package/dist/utils/quotes.d.mts +2 -1
- package/dist/utils/quotes.d.mts.map +1 -1
- package/dist/utils/quotes.mjs +97 -49
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/totals.cjs +14 -6
- package/dist/utils/totals.cjs.map +1 -1
- package/dist/utils/totals.d.cts +12 -4
- package/dist/utils/totals.d.cts.map +1 -1
- package/dist/utils/totals.d.mts +12 -4
- package/dist/utils/totals.d.mts.map +1 -1
- package/dist/utils/totals.mjs +14 -6
- package/dist/utils/totals.mjs.map +1 -1
- package/package.json +2 -2
package/dist/utils/quotes.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.refreshQuotes = exports.updateQuotes = void 0;
|
|
4
|
+
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
4
5
|
const utils_1 = require("@metamask/utils");
|
|
5
6
|
const strategy_1 = require("./strategy.cjs");
|
|
6
7
|
const totals_1 = require("./totals.cjs");
|
|
@@ -12,61 +13,37 @@ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'quotes');
|
|
|
12
13
|
* Update the quotes for a specific transaction.
|
|
13
14
|
*
|
|
14
15
|
* @param request - Request parameters.
|
|
16
|
+
* @returns Boolean indicating if the quotes were updated.
|
|
15
17
|
*/
|
|
16
18
|
async function updateQuotes(request) {
|
|
17
19
|
const { messenger, transactionData, transactionId, updateTransactionData } = request;
|
|
18
20
|
const transaction = (0, transaction_1.getTransaction)(transactionId, messenger);
|
|
19
|
-
log('Updating quotes', { transactionId });
|
|
20
21
|
if (!transaction || !transactionData) {
|
|
21
22
|
throw new Error('Transaction not found');
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return;
|
|
24
|
+
if (transaction?.status !== transaction_controller_1.TransactionStatus.unapproved) {
|
|
25
|
+
return false;
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,
|
|
36
|
-
targetChainId: token.chainId,
|
|
37
|
-
targetTokenAddress: token.address,
|
|
38
|
-
};
|
|
27
|
+
log('Updating quotes', { transactionId });
|
|
28
|
+
const { paymentToken, sourceAmounts, tokens } = transactionData;
|
|
29
|
+
const requests = buildQuoteRequests({
|
|
30
|
+
from: transaction.txParams.from,
|
|
31
|
+
paymentToken,
|
|
32
|
+
sourceAmounts,
|
|
33
|
+
tokens,
|
|
34
|
+
transactionId,
|
|
39
35
|
});
|
|
40
|
-
if (!requests?.length) {
|
|
41
|
-
log('No quote requests', { transactionId });
|
|
42
|
-
}
|
|
43
|
-
let quotes = [];
|
|
44
36
|
updateTransactionData(transactionId, (data) => {
|
|
45
37
|
data.isLoading = true;
|
|
46
38
|
});
|
|
47
39
|
try {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
quotes
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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({
|
|
64
|
-
messenger,
|
|
65
|
-
quotes,
|
|
66
|
-
})
|
|
67
|
-
: [];
|
|
68
|
-
log('Batch transactions', { transactionId, batchTransactions });
|
|
69
|
-
const totals = (0, totals_1.calculateTotals)(quotes, tokens, messenger);
|
|
40
|
+
const { batchTransactions, quotes } = await getQuotes(transaction, requests, messenger);
|
|
41
|
+
const totals = (0, totals_1.calculateTotals)({
|
|
42
|
+
quotes: quotes,
|
|
43
|
+
messenger,
|
|
44
|
+
tokens,
|
|
45
|
+
transaction,
|
|
46
|
+
});
|
|
70
47
|
log('Calculated totals', { transactionId, totals });
|
|
71
48
|
syncTransaction({
|
|
72
49
|
batchTransactions,
|
|
@@ -86,6 +63,7 @@ async function updateQuotes(request) {
|
|
|
86
63
|
data.isLoading = false;
|
|
87
64
|
});
|
|
88
65
|
}
|
|
66
|
+
return true;
|
|
89
67
|
}
|
|
90
68
|
exports.updateQuotes = updateQuotes;
|
|
91
69
|
/**
|
|
@@ -99,6 +77,9 @@ exports.updateQuotes = updateQuotes;
|
|
|
99
77
|
* @param request.transactionId - ID of the transaction to sync.
|
|
100
78
|
*/
|
|
101
79
|
function syncTransaction({ batchTransactions, messenger, paymentToken, totals, transactionId, }) {
|
|
80
|
+
if (!paymentToken) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
102
83
|
(0, transaction_1.updateTransaction)({
|
|
103
84
|
transactionId,
|
|
104
85
|
messenger: messenger,
|
|
@@ -140,19 +121,86 @@ async function refreshQuotes(messenger, updateTransactionData) {
|
|
|
140
121
|
if (!isExpired) {
|
|
141
122
|
continue;
|
|
142
123
|
}
|
|
143
|
-
|
|
144
|
-
transactionId,
|
|
145
|
-
strategy: strategyName,
|
|
146
|
-
refreshInterval,
|
|
147
|
-
});
|
|
148
|
-
await updateQuotes({
|
|
124
|
+
const isUpdated = await updateQuotes({
|
|
149
125
|
messenger,
|
|
150
126
|
transactionData,
|
|
151
127
|
transactionId,
|
|
152
128
|
updateTransactionData,
|
|
153
129
|
});
|
|
154
|
-
|
|
130
|
+
if (isUpdated) {
|
|
131
|
+
log('Refreshed quotes', { transactionId, strategy: strategyName });
|
|
132
|
+
}
|
|
155
133
|
}
|
|
156
134
|
}
|
|
157
135
|
exports.refreshQuotes = refreshQuotes;
|
|
136
|
+
/**
|
|
137
|
+
* Build quote requests required to retrieve quotes.
|
|
138
|
+
*
|
|
139
|
+
* @param request - Request parameters.
|
|
140
|
+
* @param request.from - Address from which the transaction is sent.
|
|
141
|
+
* @param request.paymentToken - Payment token used for the transaction.
|
|
142
|
+
* @param request.sourceAmounts - Source amounts for the transaction.
|
|
143
|
+
* @param request.tokens - Required tokens for the transaction.
|
|
144
|
+
* @param request.transactionId - ID of the transaction.
|
|
145
|
+
* @returns Array of quote requests.
|
|
146
|
+
*/
|
|
147
|
+
function buildQuoteRequests({ from, paymentToken, sourceAmounts, tokens, transactionId, }) {
|
|
148
|
+
if (!paymentToken) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
const requests = (sourceAmounts ?? []).map((sourceAmount) => {
|
|
152
|
+
const token = tokens.find((t) => t.address === sourceAmount.targetTokenAddress);
|
|
153
|
+
return {
|
|
154
|
+
from,
|
|
155
|
+
sourceBalanceRaw: paymentToken.balanceRaw,
|
|
156
|
+
sourceTokenAmount: sourceAmount.sourceAmountRaw,
|
|
157
|
+
sourceChainId: paymentToken.chainId,
|
|
158
|
+
sourceTokenAddress: paymentToken.address,
|
|
159
|
+
targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,
|
|
160
|
+
targetChainId: token.chainId,
|
|
161
|
+
targetTokenAddress: token.address,
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
if (!requests.length) {
|
|
165
|
+
log('No quote requests', { transactionId });
|
|
166
|
+
}
|
|
167
|
+
return requests;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Retrieve quotes for a transaction.
|
|
171
|
+
*
|
|
172
|
+
* @param transaction - Transaction metadata.
|
|
173
|
+
* @param requests - Quote requests.
|
|
174
|
+
* @param messenger - Controller messenger.
|
|
175
|
+
* @returns An object containing batch transactions and quotes.
|
|
176
|
+
*/
|
|
177
|
+
async function getQuotes(transaction, requests, messenger) {
|
|
178
|
+
const { id: transactionId } = transaction;
|
|
179
|
+
const strategy = await (0, strategy_1.getStrategy)(messenger, transaction);
|
|
180
|
+
let quotes = [];
|
|
181
|
+
try {
|
|
182
|
+
quotes = requests?.length
|
|
183
|
+
? (await strategy.getQuotes({
|
|
184
|
+
messenger,
|
|
185
|
+
requests,
|
|
186
|
+
transaction,
|
|
187
|
+
}))
|
|
188
|
+
: [];
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
log('Error fetching quotes', { error, transactionId });
|
|
192
|
+
}
|
|
193
|
+
log('Updated', { transactionId, quotes });
|
|
194
|
+
const batchTransactions = quotes?.length && strategy.getBatchTransactions
|
|
195
|
+
? await strategy.getBatchTransactions({
|
|
196
|
+
messenger,
|
|
197
|
+
quotes,
|
|
198
|
+
})
|
|
199
|
+
: [];
|
|
200
|
+
log('Batch transactions', { transactionId, batchTransactions });
|
|
201
|
+
return {
|
|
202
|
+
batchTransactions,
|
|
203
|
+
quotes,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
158
206
|
//# 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 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"]}
|
|
1
|
+
{"version":3,"file":"quotes.cjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStatus,\n type BatchTransaction,\n} 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 TransactionPaySourceAmount,\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 * @returns Boolean indicating if the quotes were updated.\n */\nexport async function updateQuotes(\n request: UpdateQuotesRequest,\n): Promise<boolean> {\n const { messenger, transactionData, transactionId, updateTransactionData } =\n request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n if (transaction?.status !== TransactionStatus.unapproved) {\n return false;\n }\n\n log('Updating quotes', { transactionId });\n\n const { paymentToken, sourceAmounts, tokens } = transactionData;\n\n const requests = buildQuoteRequests({\n from: transaction.txParams.from as Hex,\n paymentToken,\n sourceAmounts,\n tokens,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n try {\n const { batchTransactions, quotes } = await getQuotes(\n transaction,\n requests,\n messenger,\n );\n\n const totals = calculateTotals({\n quotes: quotes as TransactionPayQuote<unknown>[],\n messenger,\n tokens,\n transaction,\n });\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 return true;\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 | undefined;\n totals: TransactionPayTotals;\n transactionId: string;\n}) {\n if (!paymentToken) {\n return;\n }\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 const isUpdated = await updateQuotes({\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n if (isUpdated) {\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n }\n}\n\n/**\n * Build quote requests required to retrieve quotes.\n *\n * @param request - Request parameters.\n * @param request.from - Address from which the transaction is sent.\n * @param request.paymentToken - Payment token used for the transaction.\n * @param request.sourceAmounts - Source amounts for the transaction.\n * @param request.tokens - Required tokens for the transaction.\n * @param request.transactionId - ID of the transaction.\n * @returns Array of quote requests.\n */\nfunction buildQuoteRequests({\n from,\n paymentToken,\n sourceAmounts,\n tokens,\n transactionId,\n}: {\n from: Hex;\n paymentToken: TransactionPaymentToken | undefined;\n sourceAmounts: TransactionPaySourceAmount[] | undefined;\n tokens: TransactionPayRequiredToken[];\n transactionId: string;\n}): QuoteRequest[] {\n if (!paymentToken) {\n return [];\n }\n\n const requests = (sourceAmounts ?? []).map((sourceAmount) => {\n const token = tokens.find(\n (t) => t.address === sourceAmount.targetTokenAddress,\n ) as TransactionPayRequiredToken;\n\n return {\n from,\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 return requests;\n}\n\n/**\n * Retrieve quotes for a transaction.\n *\n * @param transaction - Transaction metadata.\n * @param requests - Quote requests.\n * @param messenger - Controller messenger.\n * @returns An object containing batch transactions and quotes.\n */\nasync function getQuotes(\n transaction: TransactionMeta,\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n) {\n const { id: transactionId } = transaction;\n const strategy = await getStrategy(messenger as never, transaction);\n let quotes: TransactionPayQuote<Json>[] | undefined = [];\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 return {\n batchTransactions,\n quotes,\n };\n}\n"]}
|
package/dist/utils/quotes.d.cts
CHANGED
|
@@ -9,8 +9,9 @@ export type UpdateQuotesRequest = {
|
|
|
9
9
|
* Update the quotes for a specific transaction.
|
|
10
10
|
*
|
|
11
11
|
* @param request - Request parameters.
|
|
12
|
+
* @returns Boolean indicating if the quotes were updated.
|
|
12
13
|
*/
|
|
13
|
-
export declare function updateQuotes(request: UpdateQuotesRequest): Promise<
|
|
14
|
+
export declare function updateQuotes(request: UpdateQuotesRequest): Promise<boolean>;
|
|
14
15
|
/**
|
|
15
16
|
* Refresh quotes for all transactions if expired.
|
|
16
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.d.cts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quotes.d.cts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAMjC,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;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAkElB;AAkDD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,iBAuCrD"}
|
package/dist/utils/quotes.d.mts
CHANGED
|
@@ -9,8 +9,9 @@ export type UpdateQuotesRequest = {
|
|
|
9
9
|
* Update the quotes for a specific transaction.
|
|
10
10
|
*
|
|
11
11
|
* @param request - Request parameters.
|
|
12
|
+
* @returns Boolean indicating if the quotes were updated.
|
|
12
13
|
*/
|
|
13
|
-
export declare function updateQuotes(request: UpdateQuotesRequest): Promise<
|
|
14
|
+
export declare function updateQuotes(request: UpdateQuotesRequest): Promise<boolean>;
|
|
14
15
|
/**
|
|
15
16
|
* Refresh quotes for all transactions if expired.
|
|
16
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.d.mts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quotes.d.mts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAMjC,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;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAkElB;AAkDD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,iBAuCrD"}
|
package/dist/utils/quotes.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TransactionStatus } from "@metamask/transaction-controller";
|
|
1
2
|
import { createModuleLogger } from "@metamask/utils";
|
|
2
3
|
import { getStrategy, getStrategyByName } from "./strategy.mjs";
|
|
3
4
|
import { calculateTotals } from "./totals.mjs";
|
|
@@ -9,61 +10,37 @@ const log = createModuleLogger(projectLogger, 'quotes');
|
|
|
9
10
|
* Update the quotes for a specific transaction.
|
|
10
11
|
*
|
|
11
12
|
* @param request - Request parameters.
|
|
13
|
+
* @returns Boolean indicating if the quotes were updated.
|
|
12
14
|
*/
|
|
13
15
|
export async function updateQuotes(request) {
|
|
14
16
|
const { messenger, transactionData, transactionId, updateTransactionData } = request;
|
|
15
17
|
const transaction = getTransaction(transactionId, messenger);
|
|
16
|
-
log('Updating quotes', { transactionId });
|
|
17
18
|
if (!transaction || !transactionData) {
|
|
18
19
|
throw new Error('Transaction not found');
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return;
|
|
21
|
+
if (transaction?.status !== TransactionStatus.unapproved) {
|
|
22
|
+
return false;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,
|
|
33
|
-
targetChainId: token.chainId,
|
|
34
|
-
targetTokenAddress: token.address,
|
|
35
|
-
};
|
|
24
|
+
log('Updating quotes', { transactionId });
|
|
25
|
+
const { paymentToken, sourceAmounts, tokens } = transactionData;
|
|
26
|
+
const requests = buildQuoteRequests({
|
|
27
|
+
from: transaction.txParams.from,
|
|
28
|
+
paymentToken,
|
|
29
|
+
sourceAmounts,
|
|
30
|
+
tokens,
|
|
31
|
+
transactionId,
|
|
36
32
|
});
|
|
37
|
-
if (!requests?.length) {
|
|
38
|
-
log('No quote requests', { transactionId });
|
|
39
|
-
}
|
|
40
|
-
let quotes = [];
|
|
41
33
|
updateTransactionData(transactionId, (data) => {
|
|
42
34
|
data.isLoading = true;
|
|
43
35
|
});
|
|
44
36
|
try {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
quotes
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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({
|
|
61
|
-
messenger,
|
|
62
|
-
quotes,
|
|
63
|
-
})
|
|
64
|
-
: [];
|
|
65
|
-
log('Batch transactions', { transactionId, batchTransactions });
|
|
66
|
-
const totals = calculateTotals(quotes, tokens, messenger);
|
|
37
|
+
const { batchTransactions, quotes } = await getQuotes(transaction, requests, messenger);
|
|
38
|
+
const totals = calculateTotals({
|
|
39
|
+
quotes: quotes,
|
|
40
|
+
messenger,
|
|
41
|
+
tokens,
|
|
42
|
+
transaction,
|
|
43
|
+
});
|
|
67
44
|
log('Calculated totals', { transactionId, totals });
|
|
68
45
|
syncTransaction({
|
|
69
46
|
batchTransactions,
|
|
@@ -83,6 +60,7 @@ export async function updateQuotes(request) {
|
|
|
83
60
|
data.isLoading = false;
|
|
84
61
|
});
|
|
85
62
|
}
|
|
63
|
+
return true;
|
|
86
64
|
}
|
|
87
65
|
/**
|
|
88
66
|
* Sync batch transactions to the transaction meta.
|
|
@@ -95,6 +73,9 @@ export async function updateQuotes(request) {
|
|
|
95
73
|
* @param request.transactionId - ID of the transaction to sync.
|
|
96
74
|
*/
|
|
97
75
|
function syncTransaction({ batchTransactions, messenger, paymentToken, totals, transactionId, }) {
|
|
76
|
+
if (!paymentToken) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
98
79
|
updateTransaction({
|
|
99
80
|
transactionId,
|
|
100
81
|
messenger: messenger,
|
|
@@ -136,18 +117,85 @@ export async function refreshQuotes(messenger, updateTransactionData) {
|
|
|
136
117
|
if (!isExpired) {
|
|
137
118
|
continue;
|
|
138
119
|
}
|
|
139
|
-
|
|
140
|
-
transactionId,
|
|
141
|
-
strategy: strategyName,
|
|
142
|
-
refreshInterval,
|
|
143
|
-
});
|
|
144
|
-
await updateQuotes({
|
|
120
|
+
const isUpdated = await updateQuotes({
|
|
145
121
|
messenger,
|
|
146
122
|
transactionData,
|
|
147
123
|
transactionId,
|
|
148
124
|
updateTransactionData,
|
|
149
125
|
});
|
|
150
|
-
|
|
126
|
+
if (isUpdated) {
|
|
127
|
+
log('Refreshed quotes', { transactionId, strategy: strategyName });
|
|
128
|
+
}
|
|
151
129
|
}
|
|
152
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Build quote requests required to retrieve quotes.
|
|
133
|
+
*
|
|
134
|
+
* @param request - Request parameters.
|
|
135
|
+
* @param request.from - Address from which the transaction is sent.
|
|
136
|
+
* @param request.paymentToken - Payment token used for the transaction.
|
|
137
|
+
* @param request.sourceAmounts - Source amounts for the transaction.
|
|
138
|
+
* @param request.tokens - Required tokens for the transaction.
|
|
139
|
+
* @param request.transactionId - ID of the transaction.
|
|
140
|
+
* @returns Array of quote requests.
|
|
141
|
+
*/
|
|
142
|
+
function buildQuoteRequests({ from, paymentToken, sourceAmounts, tokens, transactionId, }) {
|
|
143
|
+
if (!paymentToken) {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
const requests = (sourceAmounts ?? []).map((sourceAmount) => {
|
|
147
|
+
const token = tokens.find((t) => t.address === sourceAmount.targetTokenAddress);
|
|
148
|
+
return {
|
|
149
|
+
from,
|
|
150
|
+
sourceBalanceRaw: paymentToken.balanceRaw,
|
|
151
|
+
sourceTokenAmount: sourceAmount.sourceAmountRaw,
|
|
152
|
+
sourceChainId: paymentToken.chainId,
|
|
153
|
+
sourceTokenAddress: paymentToken.address,
|
|
154
|
+
targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,
|
|
155
|
+
targetChainId: token.chainId,
|
|
156
|
+
targetTokenAddress: token.address,
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
if (!requests.length) {
|
|
160
|
+
log('No quote requests', { transactionId });
|
|
161
|
+
}
|
|
162
|
+
return requests;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Retrieve quotes for a transaction.
|
|
166
|
+
*
|
|
167
|
+
* @param transaction - Transaction metadata.
|
|
168
|
+
* @param requests - Quote requests.
|
|
169
|
+
* @param messenger - Controller messenger.
|
|
170
|
+
* @returns An object containing batch transactions and quotes.
|
|
171
|
+
*/
|
|
172
|
+
async function getQuotes(transaction, requests, messenger) {
|
|
173
|
+
const { id: transactionId } = transaction;
|
|
174
|
+
const strategy = await getStrategy(messenger, transaction);
|
|
175
|
+
let quotes = [];
|
|
176
|
+
try {
|
|
177
|
+
quotes = requests?.length
|
|
178
|
+
? (await strategy.getQuotes({
|
|
179
|
+
messenger,
|
|
180
|
+
requests,
|
|
181
|
+
transaction,
|
|
182
|
+
}))
|
|
183
|
+
: [];
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
log('Error fetching quotes', { error, transactionId });
|
|
187
|
+
}
|
|
188
|
+
log('Updated', { transactionId, quotes });
|
|
189
|
+
const batchTransactions = quotes?.length && strategy.getBatchTransactions
|
|
190
|
+
? await strategy.getBatchTransactions({
|
|
191
|
+
messenger,
|
|
192
|
+
quotes,
|
|
193
|
+
})
|
|
194
|
+
: [];
|
|
195
|
+
log('Batch transactions', { transactionId, batchTransactions });
|
|
196
|
+
return {
|
|
197
|
+
batchTransactions,
|
|
198
|
+
quotes,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
153
201
|
//# sourceMappingURL=quotes.mjs.map
|
|
@@ -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 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"]}
|
|
1
|
+
{"version":3,"file":"quotes.mjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionStatus,\n type BatchTransaction,\n} 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 TransactionPaySourceAmount,\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 * @returns Boolean indicating if the quotes were updated.\n */\nexport async function updateQuotes(\n request: UpdateQuotesRequest,\n): Promise<boolean> {\n const { messenger, transactionData, transactionId, updateTransactionData } =\n request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n if (transaction?.status !== TransactionStatus.unapproved) {\n return false;\n }\n\n log('Updating quotes', { transactionId });\n\n const { paymentToken, sourceAmounts, tokens } = transactionData;\n\n const requests = buildQuoteRequests({\n from: transaction.txParams.from as Hex,\n paymentToken,\n sourceAmounts,\n tokens,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n try {\n const { batchTransactions, quotes } = await getQuotes(\n transaction,\n requests,\n messenger,\n );\n\n const totals = calculateTotals({\n quotes: quotes as TransactionPayQuote<unknown>[],\n messenger,\n tokens,\n transaction,\n });\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 return true;\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 | undefined;\n totals: TransactionPayTotals;\n transactionId: string;\n}) {\n if (!paymentToken) {\n return;\n }\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 const isUpdated = await updateQuotes({\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n if (isUpdated) {\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n }\n}\n\n/**\n * Build quote requests required to retrieve quotes.\n *\n * @param request - Request parameters.\n * @param request.from - Address from which the transaction is sent.\n * @param request.paymentToken - Payment token used for the transaction.\n * @param request.sourceAmounts - Source amounts for the transaction.\n * @param request.tokens - Required tokens for the transaction.\n * @param request.transactionId - ID of the transaction.\n * @returns Array of quote requests.\n */\nfunction buildQuoteRequests({\n from,\n paymentToken,\n sourceAmounts,\n tokens,\n transactionId,\n}: {\n from: Hex;\n paymentToken: TransactionPaymentToken | undefined;\n sourceAmounts: TransactionPaySourceAmount[] | undefined;\n tokens: TransactionPayRequiredToken[];\n transactionId: string;\n}): QuoteRequest[] {\n if (!paymentToken) {\n return [];\n }\n\n const requests = (sourceAmounts ?? []).map((sourceAmount) => {\n const token = tokens.find(\n (t) => t.address === sourceAmount.targetTokenAddress,\n ) as TransactionPayRequiredToken;\n\n return {\n from,\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 return requests;\n}\n\n/**\n * Retrieve quotes for a transaction.\n *\n * @param transaction - Transaction metadata.\n * @param requests - Quote requests.\n * @param messenger - Controller messenger.\n * @returns An object containing batch transactions and quotes.\n */\nasync function getQuotes(\n transaction: TransactionMeta,\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n) {\n const { id: transactionId } = transaction;\n const strategy = await getStrategy(messenger as never, transaction);\n let quotes: TransactionPayQuote<Json>[] | undefined = [];\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 return {\n batchTransactions,\n quotes,\n };\n}\n"]}
|
package/dist/utils/totals.cjs
CHANGED
|
@@ -2,21 +2,29 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.calculateTotals = void 0;
|
|
4
4
|
const bignumber_js_1 = require("bignumber.js");
|
|
5
|
+
const gas_1 = require("./gas.cjs");
|
|
5
6
|
/**
|
|
6
7
|
* Calculate totals for a list of quotes and tokens.
|
|
7
8
|
*
|
|
8
|
-
* @param
|
|
9
|
-
* @param
|
|
10
|
-
* @param
|
|
9
|
+
* @param request - Request parameters.
|
|
10
|
+
* @param request.quotes - List of bridge quotes.
|
|
11
|
+
* @param request.messenger - Controller messenger.
|
|
12
|
+
* @param request.tokens - List of required tokens.
|
|
13
|
+
* @param request.transaction - Transaction metadata.
|
|
11
14
|
* @returns The calculated totals in USD and fiat currency.
|
|
12
15
|
*/
|
|
13
|
-
function calculateTotals(quotes, tokens,
|
|
16
|
+
function calculateTotals({ quotes, messenger, tokens, transaction, }) {
|
|
14
17
|
const providerFeeFiat = sumProperty(quotes, (quote) => quote.fees.provider.fiat);
|
|
15
18
|
const providerFeeUsd = sumProperty(quotes, (quote) => quote.fees.provider.usd);
|
|
16
19
|
const sourceNetworkFeeFiat = sumProperty(quotes, (quote) => quote.fees.sourceNetwork.fiat);
|
|
17
20
|
const sourceNetworkFeeUsd = sumProperty(quotes, (quote) => quote.fees.sourceNetwork.usd);
|
|
18
|
-
const
|
|
19
|
-
const
|
|
21
|
+
const transactionNetworkFee = (0, gas_1.calculateTransactionGasCost)(transaction, messenger);
|
|
22
|
+
const targetNetworkFeeFiat = quotes?.length
|
|
23
|
+
? sumProperty(quotes, (quote) => quote.fees.targetNetwork.fiat)
|
|
24
|
+
: transactionNetworkFee.fiat;
|
|
25
|
+
const targetNetworkFeeUsd = quotes.length
|
|
26
|
+
? sumProperty(quotes, (quote) => quote.fees.targetNetwork.usd)
|
|
27
|
+
: transactionNetworkFee.usd;
|
|
20
28
|
const quoteTokens = tokens.filter((t) => !t.skipIfBalance || new bignumber_js_1.BigNumber(t.balanceRaw).isLessThan(t.amountRaw));
|
|
21
29
|
const amountFiat = sumProperty(quoteTokens, (token) => token.amountFiat);
|
|
22
30
|
const amountUsd = sumProperty(quoteTokens, (token) => token.amountUsd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totals.cjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"totals.cjs","sourceRoot":"","sources":["../../src/utils/totals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport { calculateTransactionGasCost } from './gas';\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 request - Request parameters.\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 quotes,\n messenger,\n tokens,\n transaction,\n}: {\n quotes: TransactionPayQuote<unknown>[];\n messenger: TransactionPayControllerMessenger;\n tokens: TransactionPayRequiredToken[];\n transaction: TransactionMeta;\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 transactionNetworkFee = calculateTransactionGasCost(\n transaction,\n messenger,\n );\n\n const targetNetworkFeeFiat = quotes?.length\n ? sumProperty(quotes, (quote) => quote.fees.targetNetwork.fiat)\n : transactionNetworkFee.fiat;\n\n const targetNetworkFeeUsd = quotes.length\n ? sumProperty(quotes, (quote) => quote.fees.targetNetwork.usd)\n : transactionNetworkFee.usd;\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"]}
|
package/dist/utils/totals.d.cts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
|
+
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
1
2
|
import type { TransactionPayControllerMessenger, TransactionPayQuote, TransactionPayRequiredToken, TransactionPayTotals } from "../types.cjs";
|
|
2
3
|
/**
|
|
3
4
|
* Calculate totals for a list of quotes and tokens.
|
|
4
5
|
*
|
|
5
|
-
* @param
|
|
6
|
-
* @param
|
|
7
|
-
* @param
|
|
6
|
+
* @param request - Request parameters.
|
|
7
|
+
* @param request.quotes - List of bridge quotes.
|
|
8
|
+
* @param request.messenger - Controller messenger.
|
|
9
|
+
* @param request.tokens - List of required tokens.
|
|
10
|
+
* @param request.transaction - Transaction metadata.
|
|
8
11
|
* @returns The calculated totals in USD and fiat currency.
|
|
9
12
|
*/
|
|
10
|
-
export declare function calculateTotals(quotes
|
|
13
|
+
export declare function calculateTotals({ quotes, messenger, tokens, transaction, }: {
|
|
14
|
+
quotes: TransactionPayQuote<unknown>[];
|
|
15
|
+
messenger: TransactionPayControllerMessenger;
|
|
16
|
+
tokens: TransactionPayRequiredToken[];
|
|
17
|
+
transaction: TransactionMeta;
|
|
18
|
+
}): TransactionPayTotals;
|
|
11
19
|
//# sourceMappingURL=totals.d.cts.map
|