@metamask-previews/transaction-pay-controller 23.1.0-preview-a65eb72 → 23.1.0-preview-e37aff3

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 (80) hide show
  1. package/CHANGELOG.md +0 -5
  2. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionPayController-method-action-types.d.cts +1 -5
  4. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +1 -5
  6. package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionPayController.cjs +3 -9
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts +2 -3
  11. package/dist/TransactionPayController.d.cts.map +1 -1
  12. package/dist/TransactionPayController.d.mts +2 -3
  13. package/dist/TransactionPayController.d.mts.map +1 -1
  14. package/dist/TransactionPayController.mjs +3 -9
  15. package/dist/TransactionPayController.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +2 -2
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/strategy/fiat/fiat-submit.cjs +101 -27
  23. package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
  24. package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
  25. package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
  26. package/dist/strategy/fiat/fiat-submit.mjs +101 -27
  27. package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
  28. package/dist/strategy/fiat/utils.cjs +1 -66
  29. package/dist/strategy/fiat/utils.cjs.map +1 -1
  30. package/dist/strategy/fiat/utils.d.cts +0 -32
  31. package/dist/strategy/fiat/utils.d.cts.map +1 -1
  32. package/dist/strategy/fiat/utils.d.mts +0 -32
  33. package/dist/strategy/fiat/utils.d.mts.map +1 -1
  34. package/dist/strategy/fiat/utils.mjs +0 -63
  35. package/dist/strategy/fiat/utils.mjs.map +1 -1
  36. package/dist/types.cjs.map +1 -1
  37. package/dist/types.d.cts +0 -22
  38. package/dist/types.d.cts.map +1 -1
  39. package/dist/types.d.mts +0 -22
  40. package/dist/types.d.mts.map +1 -1
  41. package/dist/types.mjs.map +1 -1
  42. package/dist/utils/feature-flags.cjs +1 -41
  43. package/dist/utils/feature-flags.cjs.map +1 -1
  44. package/dist/utils/feature-flags.d.cts +0 -22
  45. package/dist/utils/feature-flags.d.cts.map +1 -1
  46. package/dist/utils/feature-flags.d.mts +0 -22
  47. package/dist/utils/feature-flags.d.mts.map +1 -1
  48. package/dist/utils/feature-flags.mjs +0 -38
  49. package/dist/utils/feature-flags.mjs.map +1 -1
  50. package/dist/utils/quotes.cjs +2 -3
  51. package/dist/utils/quotes.cjs.map +1 -1
  52. package/dist/utils/quotes.d.cts.map +1 -1
  53. package/dist/utils/quotes.d.mts.map +1 -1
  54. package/dist/utils/quotes.mjs +2 -3
  55. package/dist/utils/quotes.mjs.map +1 -1
  56. package/dist/utils/totals.cjs +7 -41
  57. package/dist/utils/totals.cjs.map +1 -1
  58. package/dist/utils/totals.d.cts +1 -3
  59. package/dist/utils/totals.d.cts.map +1 -1
  60. package/dist/utils/totals.d.mts +1 -3
  61. package/dist/utils/totals.d.mts.map +1 -1
  62. package/dist/utils/totals.mjs +7 -41
  63. package/dist/utils/totals.mjs.map +1 -1
  64. package/package.json +1 -1
  65. package/dist/strategy/fiat/fiat-submit-simple.cjs +0 -61
  66. package/dist/strategy/fiat/fiat-submit-simple.cjs.map +0 -1
  67. package/dist/strategy/fiat/fiat-submit-simple.d.cts +0 -23
  68. package/dist/strategy/fiat/fiat-submit-simple.d.cts.map +0 -1
  69. package/dist/strategy/fiat/fiat-submit-simple.d.mts +0 -23
  70. package/dist/strategy/fiat/fiat-submit-simple.d.mts.map +0 -1
  71. package/dist/strategy/fiat/fiat-submit-simple.mjs +0 -57
  72. package/dist/strategy/fiat/fiat-submit-simple.mjs.map +0 -1
  73. package/dist/strategy/fiat/fiat-submit-with-calldata.cjs +0 -185
  74. package/dist/strategy/fiat/fiat-submit-with-calldata.cjs.map +0 -1
  75. package/dist/strategy/fiat/fiat-submit-with-calldata.d.cts +0 -27
  76. package/dist/strategy/fiat/fiat-submit-with-calldata.d.cts.map +0 -1
  77. package/dist/strategy/fiat/fiat-submit-with-calldata.d.mts +0 -27
  78. package/dist/strategy/fiat/fiat-submit-with-calldata.d.mts.map +0 -1
  79. package/dist/strategy/fiat/fiat-submit-with-calldata.mjs +0 -181
  80. package/dist/strategy/fiat/fiat-submit-with-calldata.mjs.map +0 -1
@@ -1,185 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.submitWithCalldataReEncoding = void 0;
4
- const utils_1 = require("@metamask/utils");
5
- const bignumber_js_1 = require("bignumber.js");
6
- const logger_1 = require("../../logger.cjs");
7
- const feature_flags_1 = require("../../utils/feature-flags.cjs");
8
- const transaction_1 = require("../../utils/transaction.cjs");
9
- const relay_quotes_1 = require("../relay/relay-quotes.cjs");
10
- const relay_submit_1 = require("../relay/relay-submit.cjs");
11
- const utils_2 = require("./utils.cjs");
12
- const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'fiat-submit-calldata');
13
- /**
14
- * Submits relay quotes using the three-phase flow for transactions with nested
15
- * calldata that needs re-encoding (e.g. moneyAccountDeposit with approve + deposit).
16
- *
17
- * Phase 1: Discovery quote (EXACT_INPUT) to learn the target token output.
18
- * Phase 2: Delegate calldata re-encoding to the client via getAmountData.
19
- * Phase 3: Delegation quote (EXACT_OUTPUT) with updated nested transaction data.
20
- *
21
- * @param options - The submission options.
22
- * @param options.baseRequest - The base quote request from the original fiat quote.
23
- * @param options.request - The original fiat strategy execute request.
24
- * @param options.sourceAmountRaw - The settled source amount in atomic units.
25
- * @param options.transaction - The transaction metadata.
26
- * @returns An object containing the relay transaction hash if available.
27
- */
28
- async function submitWithCalldataReEncoding({ baseRequest, request, sourceAmountRaw, transaction, }) {
29
- const { messenger } = request;
30
- const transactionId = transaction.id;
31
- const feeReserveRaw = calculateFeeReserve({
32
- feeQuote: request.quotes[0].original.relayQuote,
33
- multiplier: (0, feature_flags_1.getFiatFeeReserveMultiplier)(messenger),
34
- });
35
- const discoverySourceAmount = bignumber_js_1.BigNumber.max(new bignumber_js_1.BigNumber(sourceAmountRaw).minus(feeReserveRaw), 1).toFixed(0);
36
- log('Fee reserve for discovery', {
37
- feeReserveRaw: feeReserveRaw.toFixed(0),
38
- discoverySourceAmount,
39
- sourceAmountRaw,
40
- transactionId,
41
- });
42
- const discoveryRequest = {
43
- ...baseRequest,
44
- isMaxAmount: false,
45
- isPostQuote: true,
46
- sourceBalanceRaw: sourceAmountRaw,
47
- sourceTokenAmount: discoverySourceAmount,
48
- };
49
- const discoveryQuotes = await (0, relay_quotes_1.getRelayQuotes)({
50
- accountSupports7702: request.accountSupports7702,
51
- messenger,
52
- requests: [discoveryRequest],
53
- transaction,
54
- });
55
- if (!discoveryQuotes.length) {
56
- throw new Error('No relay quotes returned for fiat discovery');
57
- }
58
- const discoveryRelay = discoveryQuotes[0].original;
59
- const originalRelayQuote = request.quotes[0].original.relayQuote;
60
- (0, utils_2.validateRelayRateDrift)({
61
- originalQuote: originalRelayQuote,
62
- discoveryQuote: discoveryRelay,
63
- maxRateDriftPercent: (0, feature_flags_1.getFiatMaxRateDriftPercent)(messenger),
64
- transactionId,
65
- });
66
- const adjustedTargetRaw = calculateAdjustedTarget(discoveryRelay);
67
- log('Adjusted target for final quote', {
68
- discoveryMinimum: discoveryRelay.details.currencyOut.minimumAmount,
69
- adjustedTargetRaw,
70
- transactionId,
71
- });
72
- const { updates } = await messenger.call('TransactionPayController:getAmountData', { amount: adjustedTargetRaw, transaction });
73
- if (!updates.length) {
74
- throw new Error('getAmountData returned no updates for transaction with nested calldata');
75
- }
76
- (0, transaction_1.updateTransaction)({ transactionId, messenger, note: 'Fiat deposit: update settled amount' }, (tx) => {
77
- for (const { nestedTransactionIndex, data } of updates) {
78
- if (tx.nestedTransactions?.[nestedTransactionIndex]) {
79
- tx.nestedTransactions[nestedTransactionIndex].data = data;
80
- }
81
- }
82
- if (tx.requiredAssets?.[0]) {
83
- tx.requiredAssets[0].amount = `0x${new bignumber_js_1.BigNumber(adjustedTargetRaw).toString(16)}`;
84
- }
85
- });
86
- const updatedTransaction = (0, transaction_1.getTransaction)(transactionId, messenger) ?? transaction;
87
- const relayRequest = {
88
- ...baseRequest,
89
- isMaxAmount: false,
90
- isPostQuote: false,
91
- sourceBalanceRaw: sourceAmountRaw,
92
- sourceTokenAmount: sourceAmountRaw,
93
- targetAmountMinimum: adjustedTargetRaw,
94
- };
95
- const relayQuotes = await (0, relay_quotes_1.getRelayQuotes)({
96
- accountSupports7702: request.accountSupports7702,
97
- messenger,
98
- requests: [relayRequest],
99
- transaction: updatedTransaction,
100
- });
101
- if (!relayQuotes.length) {
102
- throw new Error('No relay quotes returned for completed fiat order');
103
- }
104
- log('Received relay quotes for completed fiat order', {
105
- relayQuoteCount: relayQuotes.length,
106
- transactionId,
107
- });
108
- return await (0, relay_submit_1.submitRelayQuotes)({
109
- accountSupports7702: request.accountSupports7702,
110
- isSmartTransaction: request.isSmartTransaction,
111
- messenger,
112
- quotes: relayQuotes,
113
- transaction: updatedTransaction,
114
- });
115
- }
116
- exports.submitWithCalldataReEncoding = submitWithCalldataReEncoding;
117
- /**
118
- * Calculates the fee reserve in raw source token units from the original
119
- * relay fee quote. This reserve is subtracted from the discovery quote's
120
- * source amount so the final EXACT_OUTPUT quote stays within the settled
121
- * balance.
122
- *
123
- * @param options - Calculation options.
124
- * @param options.feeQuote - The original relay quote from the fee/quoting phase.
125
- * @param options.multiplier - Multiplier applied to the fee reserve (default 1).
126
- * @returns The fee reserve in raw source token units.
127
- */
128
- function calculateFeeReserve({ feeQuote, multiplier, }) {
129
- const sourceRaw = new bignumber_js_1.BigNumber(feeQuote.details.currencyIn.amount);
130
- const sourceUsd = new bignumber_js_1.BigNumber(feeQuote.details.currencyIn.amountUsd);
131
- const targetUsd = new bignumber_js_1.BigNumber(feeQuote.details.currencyOut.amountUsd);
132
- if (!sourceUsd.gt(0) || !sourceRaw.gt(0)) {
133
- return new bignumber_js_1.BigNumber(0);
134
- }
135
- // Fee in USD = what the relay consumed beyond the target value
136
- const feeUsd = sourceUsd.minus(targetUsd);
137
- if (!feeUsd.gt(0)) {
138
- return new bignumber_js_1.BigNumber(0);
139
- }
140
- // Convert USD fee to raw source token units using the quote's own rate
141
- const usdPerSourceRaw = sourceUsd.dividedBy(sourceRaw);
142
- return feeUsd
143
- .dividedBy(usdPerSourceRaw)
144
- .multipliedBy(multiplier)
145
- .decimalPlaces(0, bignumber_js_1.BigNumber.ROUND_UP);
146
- }
147
- /**
148
- * Calculates the adjusted target amount for the final EXACT_OUTPUT quote
149
- * by adding the discovery quote's fee back to its minimum output.
150
- *
151
- * The discovery quote (EXACT_INPUT) reports a smaller fee than the final
152
- * EXACT_OUTPUT quote will charge. Adding the discovery fee back to the
153
- * minimum output compensates for this differential, ensuring the final
154
- * quote targets a realistic amount.
155
- *
156
- * @param discoveryQuote - The relay quote from the discovery phase.
157
- * @returns The adjusted target amount in raw target token units.
158
- */
159
- function calculateAdjustedTarget(discoveryQuote) {
160
- const targetMinRaw = new bignumber_js_1.BigNumber(discoveryQuote.details.currencyOut.minimumAmount);
161
- const targetUsd = new bignumber_js_1.BigNumber(discoveryQuote.details.currencyOut.amountUsd);
162
- const sourceUsd = new bignumber_js_1.BigNumber(discoveryQuote.details.currencyIn.amountUsd);
163
- if (!targetUsd.gt(0) || !targetMinRaw.gt(0)) {
164
- return targetMinRaw.toFixed(0);
165
- }
166
- // Discovery fee in USD
167
- const discoveryFeeUsd = sourceUsd.minus(targetUsd);
168
- if (!discoveryFeeUsd.gt(0)) {
169
- return targetMinRaw.toFixed(0);
170
- }
171
- // Convert fee from USD to raw target token units
172
- const usdPerTargetRaw = targetUsd.dividedBy(targetMinRaw);
173
- const discoveryFeeInTargetRaw = discoveryFeeUsd
174
- .dividedBy(usdPerTargetRaw)
175
- .decimalPlaces(0, bignumber_js_1.BigNumber.ROUND_DOWN);
176
- const adjusted = targetMinRaw.plus(discoveryFeeInTargetRaw);
177
- log('calculateAdjustedTarget', {
178
- targetMinRaw: targetMinRaw.toFixed(0),
179
- discoveryFeeUsd: discoveryFeeUsd.toFixed(6),
180
- discoveryFeeInTargetRaw: discoveryFeeInTargetRaw.toFixed(0),
181
- adjustedTargetRaw: adjusted.toFixed(0),
182
- });
183
- return adjusted.toFixed(0);
184
- }
185
- //# sourceMappingURL=fiat-submit-with-calldata.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fiat-submit-with-calldata.cjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit-with-calldata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger';\nimport type { PayStrategyExecuteRequest, QuoteRequest } from '../../types';\nimport {\n getFiatFeeReserveMultiplier,\n getFiatMaxRateDriftPercent,\n} from '../../utils/feature-flags';\nimport { getTransaction, updateTransaction } from '../../utils/transaction';\nimport { getRelayQuotes } from '../relay/relay-quotes';\nimport { submitRelayQuotes } from '../relay/relay-submit';\nimport type { RelayQuote } from '../relay/types';\nimport type { FiatQuote } from './types';\nimport { validateRelayRateDrift } from './utils';\n\nconst log = createModuleLogger(projectLogger, 'fiat-submit-calldata');\n\n/**\n * Submits relay quotes using the three-phase flow for transactions with nested\n * calldata that needs re-encoding (e.g. moneyAccountDeposit with approve + deposit).\n *\n * Phase 1: Discovery quote (EXACT_INPUT) to learn the target token output.\n * Phase 2: Delegate calldata re-encoding to the client via getAmountData.\n * Phase 3: Delegation quote (EXACT_OUTPUT) with updated nested transaction data.\n *\n * @param options - The submission options.\n * @param options.baseRequest - The base quote request from the original fiat quote.\n * @param options.request - The original fiat strategy execute request.\n * @param options.sourceAmountRaw - The settled source amount in atomic units.\n * @param options.transaction - The transaction metadata.\n * @returns An object containing the relay transaction hash if available.\n */\nexport async function submitWithCalldataReEncoding({\n baseRequest,\n request,\n sourceAmountRaw,\n transaction,\n}: {\n baseRequest: QuoteRequest;\n request: PayStrategyExecuteRequest<FiatQuote>;\n sourceAmountRaw: string;\n transaction: PayStrategyExecuteRequest<FiatQuote>['transaction'];\n}): Promise<{ transactionHash?: Hex }> {\n const { messenger } = request;\n const transactionId = transaction.id;\n\n const feeReserveRaw = calculateFeeReserve({\n feeQuote: request.quotes[0].original.relayQuote,\n multiplier: getFiatFeeReserveMultiplier(messenger),\n });\n\n const discoverySourceAmount = BigNumber.max(\n new BigNumber(sourceAmountRaw).minus(feeReserveRaw),\n 1,\n ).toFixed(0);\n\n log('Fee reserve for discovery', {\n feeReserveRaw: feeReserveRaw.toFixed(0),\n discoverySourceAmount,\n sourceAmountRaw,\n transactionId,\n });\n\n const discoveryRequest: QuoteRequest = {\n ...baseRequest,\n isMaxAmount: false,\n isPostQuote: true,\n sourceBalanceRaw: sourceAmountRaw,\n sourceTokenAmount: discoverySourceAmount,\n };\n\n const discoveryQuotes = await getRelayQuotes({\n accountSupports7702: request.accountSupports7702,\n messenger,\n requests: [discoveryRequest],\n transaction,\n });\n\n if (!discoveryQuotes.length) {\n throw new Error('No relay quotes returned for fiat discovery');\n }\n\n const discoveryRelay = discoveryQuotes[0].original;\n\n const originalRelayQuote = request.quotes[0].original.relayQuote;\n validateRelayRateDrift({\n originalQuote: originalRelayQuote,\n discoveryQuote: discoveryRelay,\n maxRateDriftPercent: getFiatMaxRateDriftPercent(messenger),\n transactionId,\n });\n\n const adjustedTargetRaw = calculateAdjustedTarget(discoveryRelay);\n\n log('Adjusted target for final quote', {\n discoveryMinimum: discoveryRelay.details.currencyOut.minimumAmount,\n adjustedTargetRaw,\n transactionId,\n });\n\n const { updates } = await messenger.call(\n 'TransactionPayController:getAmountData',\n { amount: adjustedTargetRaw, transaction },\n );\n\n if (!updates.length) {\n throw new Error(\n 'getAmountData returned no updates for transaction with nested calldata',\n );\n }\n\n updateTransaction(\n { transactionId, messenger, note: 'Fiat deposit: update settled amount' },\n (tx) => {\n for (const { nestedTransactionIndex, data } of updates) {\n if (tx.nestedTransactions?.[nestedTransactionIndex]) {\n tx.nestedTransactions[nestedTransactionIndex].data = data;\n }\n }\n if (tx.requiredAssets?.[0]) {\n tx.requiredAssets[0].amount = `0x${new BigNumber(adjustedTargetRaw).toString(16)}`;\n }\n },\n );\n\n const updatedTransaction =\n getTransaction(transactionId, messenger) ?? transaction;\n\n const relayRequest: QuoteRequest = {\n ...baseRequest,\n isMaxAmount: false,\n isPostQuote: false,\n sourceBalanceRaw: sourceAmountRaw,\n sourceTokenAmount: sourceAmountRaw,\n targetAmountMinimum: adjustedTargetRaw,\n };\n\n const relayQuotes = await getRelayQuotes({\n accountSupports7702: request.accountSupports7702,\n messenger,\n requests: [relayRequest],\n transaction: updatedTransaction,\n });\n\n if (!relayQuotes.length) {\n throw new Error('No relay quotes returned for completed fiat order');\n }\n\n log('Received relay quotes for completed fiat order', {\n relayQuoteCount: relayQuotes.length,\n transactionId,\n });\n\n return await submitRelayQuotes({\n accountSupports7702: request.accountSupports7702,\n isSmartTransaction: request.isSmartTransaction,\n messenger,\n quotes: relayQuotes,\n transaction: updatedTransaction,\n });\n}\n\n/**\n * Calculates the fee reserve in raw source token units from the original\n * relay fee quote. This reserve is subtracted from the discovery quote's\n * source amount so the final EXACT_OUTPUT quote stays within the settled\n * balance.\n *\n * @param options - Calculation options.\n * @param options.feeQuote - The original relay quote from the fee/quoting phase.\n * @param options.multiplier - Multiplier applied to the fee reserve (default 1).\n * @returns The fee reserve in raw source token units.\n */\nfunction calculateFeeReserve({\n feeQuote,\n multiplier,\n}: {\n feeQuote: RelayQuote;\n multiplier: number;\n}): BigNumber {\n const sourceRaw = new BigNumber(feeQuote.details.currencyIn.amount);\n const sourceUsd = new BigNumber(feeQuote.details.currencyIn.amountUsd);\n const targetUsd = new BigNumber(feeQuote.details.currencyOut.amountUsd);\n\n if (!sourceUsd.gt(0) || !sourceRaw.gt(0)) {\n return new BigNumber(0);\n }\n\n // Fee in USD = what the relay consumed beyond the target value\n const feeUsd = sourceUsd.minus(targetUsd);\n\n if (!feeUsd.gt(0)) {\n return new BigNumber(0);\n }\n\n // Convert USD fee to raw source token units using the quote's own rate\n const usdPerSourceRaw = sourceUsd.dividedBy(sourceRaw);\n\n return feeUsd\n .dividedBy(usdPerSourceRaw)\n .multipliedBy(multiplier)\n .decimalPlaces(0, BigNumber.ROUND_UP);\n}\n\n/**\n * Calculates the adjusted target amount for the final EXACT_OUTPUT quote\n * by adding the discovery quote's fee back to its minimum output.\n *\n * The discovery quote (EXACT_INPUT) reports a smaller fee than the final\n * EXACT_OUTPUT quote will charge. Adding the discovery fee back to the\n * minimum output compensates for this differential, ensuring the final\n * quote targets a realistic amount.\n *\n * @param discoveryQuote - The relay quote from the discovery phase.\n * @returns The adjusted target amount in raw target token units.\n */\nfunction calculateAdjustedTarget(discoveryQuote: RelayQuote): string {\n const targetMinRaw = new BigNumber(\n discoveryQuote.details.currencyOut.minimumAmount,\n );\n const targetUsd = new BigNumber(discoveryQuote.details.currencyOut.amountUsd);\n const sourceUsd = new BigNumber(discoveryQuote.details.currencyIn.amountUsd);\n\n if (!targetUsd.gt(0) || !targetMinRaw.gt(0)) {\n return targetMinRaw.toFixed(0);\n }\n\n // Discovery fee in USD\n const discoveryFeeUsd = sourceUsd.minus(targetUsd);\n\n if (!discoveryFeeUsd.gt(0)) {\n return targetMinRaw.toFixed(0);\n }\n\n // Convert fee from USD to raw target token units\n const usdPerTargetRaw = targetUsd.dividedBy(targetMinRaw);\n const discoveryFeeInTargetRaw = discoveryFeeUsd\n .dividedBy(usdPerTargetRaw)\n .decimalPlaces(0, BigNumber.ROUND_DOWN);\n\n const adjusted = targetMinRaw.plus(discoveryFeeInTargetRaw);\n\n log('calculateAdjustedTarget', {\n targetMinRaw: targetMinRaw.toFixed(0),\n discoveryFeeUsd: discoveryFeeUsd.toFixed(6),\n discoveryFeeInTargetRaw: discoveryFeeInTargetRaw.toFixed(0),\n adjustedTargetRaw: adjusted.toFixed(0),\n });\n\n return adjusted.toFixed(0);\n}\n"]}
@@ -1,27 +0,0 @@
1
- import type { Hex } from "@metamask/utils";
2
- import type { PayStrategyExecuteRequest, QuoteRequest } from "../../types.cjs";
3
- import type { FiatQuote } from "./types.cjs";
4
- /**
5
- * Submits relay quotes using the three-phase flow for transactions with nested
6
- * calldata that needs re-encoding (e.g. moneyAccountDeposit with approve + deposit).
7
- *
8
- * Phase 1: Discovery quote (EXACT_INPUT) to learn the target token output.
9
- * Phase 2: Delegate calldata re-encoding to the client via getAmountData.
10
- * Phase 3: Delegation quote (EXACT_OUTPUT) with updated nested transaction data.
11
- *
12
- * @param options - The submission options.
13
- * @param options.baseRequest - The base quote request from the original fiat quote.
14
- * @param options.request - The original fiat strategy execute request.
15
- * @param options.sourceAmountRaw - The settled source amount in atomic units.
16
- * @param options.transaction - The transaction metadata.
17
- * @returns An object containing the relay transaction hash if available.
18
- */
19
- export declare function submitWithCalldataReEncoding({ baseRequest, request, sourceAmountRaw, transaction, }: {
20
- baseRequest: QuoteRequest;
21
- request: PayStrategyExecuteRequest<FiatQuote>;
22
- sourceAmountRaw: string;
23
- transaction: PayStrategyExecuteRequest<FiatQuote>['transaction'];
24
- }): Promise<{
25
- transactionHash?: Hex;
26
- }>;
27
- //# sourceMappingURL=fiat-submit-with-calldata.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fiat-submit-with-calldata.d.cts","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit-with-calldata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,wBAAoB;AAS3E,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAgB;AAKzC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,WAAW,EACX,OAAO,EACP,eAAe,EACf,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC;CAClE,GAAG,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAsHrC"}
@@ -1,27 +0,0 @@
1
- import type { Hex } from "@metamask/utils";
2
- import type { PayStrategyExecuteRequest, QuoteRequest } from "../../types.mjs";
3
- import type { FiatQuote } from "./types.mjs";
4
- /**
5
- * Submits relay quotes using the three-phase flow for transactions with nested
6
- * calldata that needs re-encoding (e.g. moneyAccountDeposit with approve + deposit).
7
- *
8
- * Phase 1: Discovery quote (EXACT_INPUT) to learn the target token output.
9
- * Phase 2: Delegate calldata re-encoding to the client via getAmountData.
10
- * Phase 3: Delegation quote (EXACT_OUTPUT) with updated nested transaction data.
11
- *
12
- * @param options - The submission options.
13
- * @param options.baseRequest - The base quote request from the original fiat quote.
14
- * @param options.request - The original fiat strategy execute request.
15
- * @param options.sourceAmountRaw - The settled source amount in atomic units.
16
- * @param options.transaction - The transaction metadata.
17
- * @returns An object containing the relay transaction hash if available.
18
- */
19
- export declare function submitWithCalldataReEncoding({ baseRequest, request, sourceAmountRaw, transaction, }: {
20
- baseRequest: QuoteRequest;
21
- request: PayStrategyExecuteRequest<FiatQuote>;
22
- sourceAmountRaw: string;
23
- transaction: PayStrategyExecuteRequest<FiatQuote>['transaction'];
24
- }): Promise<{
25
- transactionHash?: Hex;
26
- }>;
27
- //# sourceMappingURL=fiat-submit-with-calldata.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fiat-submit-with-calldata.d.mts","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit-with-calldata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,wBAAoB;AAS3E,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAgB;AAKzC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,WAAW,EACX,OAAO,EACP,eAAe,EACf,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC;CAClE,GAAG,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAsHrC"}
@@ -1,181 +0,0 @@
1
- import { createModuleLogger } from "@metamask/utils";
2
- import { BigNumber } from "bignumber.js";
3
- import { projectLogger } from "../../logger.mjs";
4
- import { getFiatFeeReserveMultiplier, getFiatMaxRateDriftPercent } from "../../utils/feature-flags.mjs";
5
- import { getTransaction, updateTransaction } from "../../utils/transaction.mjs";
6
- import { getRelayQuotes } from "../relay/relay-quotes.mjs";
7
- import { submitRelayQuotes } from "../relay/relay-submit.mjs";
8
- import { validateRelayRateDrift } from "./utils.mjs";
9
- const log = createModuleLogger(projectLogger, 'fiat-submit-calldata');
10
- /**
11
- * Submits relay quotes using the three-phase flow for transactions with nested
12
- * calldata that needs re-encoding (e.g. moneyAccountDeposit with approve + deposit).
13
- *
14
- * Phase 1: Discovery quote (EXACT_INPUT) to learn the target token output.
15
- * Phase 2: Delegate calldata re-encoding to the client via getAmountData.
16
- * Phase 3: Delegation quote (EXACT_OUTPUT) with updated nested transaction data.
17
- *
18
- * @param options - The submission options.
19
- * @param options.baseRequest - The base quote request from the original fiat quote.
20
- * @param options.request - The original fiat strategy execute request.
21
- * @param options.sourceAmountRaw - The settled source amount in atomic units.
22
- * @param options.transaction - The transaction metadata.
23
- * @returns An object containing the relay transaction hash if available.
24
- */
25
- export async function submitWithCalldataReEncoding({ baseRequest, request, sourceAmountRaw, transaction, }) {
26
- const { messenger } = request;
27
- const transactionId = transaction.id;
28
- const feeReserveRaw = calculateFeeReserve({
29
- feeQuote: request.quotes[0].original.relayQuote,
30
- multiplier: getFiatFeeReserveMultiplier(messenger),
31
- });
32
- const discoverySourceAmount = BigNumber.max(new BigNumber(sourceAmountRaw).minus(feeReserveRaw), 1).toFixed(0);
33
- log('Fee reserve for discovery', {
34
- feeReserveRaw: feeReserveRaw.toFixed(0),
35
- discoverySourceAmount,
36
- sourceAmountRaw,
37
- transactionId,
38
- });
39
- const discoveryRequest = {
40
- ...baseRequest,
41
- isMaxAmount: false,
42
- isPostQuote: true,
43
- sourceBalanceRaw: sourceAmountRaw,
44
- sourceTokenAmount: discoverySourceAmount,
45
- };
46
- const discoveryQuotes = await getRelayQuotes({
47
- accountSupports7702: request.accountSupports7702,
48
- messenger,
49
- requests: [discoveryRequest],
50
- transaction,
51
- });
52
- if (!discoveryQuotes.length) {
53
- throw new Error('No relay quotes returned for fiat discovery');
54
- }
55
- const discoveryRelay = discoveryQuotes[0].original;
56
- const originalRelayQuote = request.quotes[0].original.relayQuote;
57
- validateRelayRateDrift({
58
- originalQuote: originalRelayQuote,
59
- discoveryQuote: discoveryRelay,
60
- maxRateDriftPercent: getFiatMaxRateDriftPercent(messenger),
61
- transactionId,
62
- });
63
- const adjustedTargetRaw = calculateAdjustedTarget(discoveryRelay);
64
- log('Adjusted target for final quote', {
65
- discoveryMinimum: discoveryRelay.details.currencyOut.minimumAmount,
66
- adjustedTargetRaw,
67
- transactionId,
68
- });
69
- const { updates } = await messenger.call('TransactionPayController:getAmountData', { amount: adjustedTargetRaw, transaction });
70
- if (!updates.length) {
71
- throw new Error('getAmountData returned no updates for transaction with nested calldata');
72
- }
73
- updateTransaction({ transactionId, messenger, note: 'Fiat deposit: update settled amount' }, (tx) => {
74
- for (const { nestedTransactionIndex, data } of updates) {
75
- if (tx.nestedTransactions?.[nestedTransactionIndex]) {
76
- tx.nestedTransactions[nestedTransactionIndex].data = data;
77
- }
78
- }
79
- if (tx.requiredAssets?.[0]) {
80
- tx.requiredAssets[0].amount = `0x${new BigNumber(adjustedTargetRaw).toString(16)}`;
81
- }
82
- });
83
- const updatedTransaction = getTransaction(transactionId, messenger) ?? transaction;
84
- const relayRequest = {
85
- ...baseRequest,
86
- isMaxAmount: false,
87
- isPostQuote: false,
88
- sourceBalanceRaw: sourceAmountRaw,
89
- sourceTokenAmount: sourceAmountRaw,
90
- targetAmountMinimum: adjustedTargetRaw,
91
- };
92
- const relayQuotes = await getRelayQuotes({
93
- accountSupports7702: request.accountSupports7702,
94
- messenger,
95
- requests: [relayRequest],
96
- transaction: updatedTransaction,
97
- });
98
- if (!relayQuotes.length) {
99
- throw new Error('No relay quotes returned for completed fiat order');
100
- }
101
- log('Received relay quotes for completed fiat order', {
102
- relayQuoteCount: relayQuotes.length,
103
- transactionId,
104
- });
105
- return await submitRelayQuotes({
106
- accountSupports7702: request.accountSupports7702,
107
- isSmartTransaction: request.isSmartTransaction,
108
- messenger,
109
- quotes: relayQuotes,
110
- transaction: updatedTransaction,
111
- });
112
- }
113
- /**
114
- * Calculates the fee reserve in raw source token units from the original
115
- * relay fee quote. This reserve is subtracted from the discovery quote's
116
- * source amount so the final EXACT_OUTPUT quote stays within the settled
117
- * balance.
118
- *
119
- * @param options - Calculation options.
120
- * @param options.feeQuote - The original relay quote from the fee/quoting phase.
121
- * @param options.multiplier - Multiplier applied to the fee reserve (default 1).
122
- * @returns The fee reserve in raw source token units.
123
- */
124
- function calculateFeeReserve({ feeQuote, multiplier, }) {
125
- const sourceRaw = new BigNumber(feeQuote.details.currencyIn.amount);
126
- const sourceUsd = new BigNumber(feeQuote.details.currencyIn.amountUsd);
127
- const targetUsd = new BigNumber(feeQuote.details.currencyOut.amountUsd);
128
- if (!sourceUsd.gt(0) || !sourceRaw.gt(0)) {
129
- return new BigNumber(0);
130
- }
131
- // Fee in USD = what the relay consumed beyond the target value
132
- const feeUsd = sourceUsd.minus(targetUsd);
133
- if (!feeUsd.gt(0)) {
134
- return new BigNumber(0);
135
- }
136
- // Convert USD fee to raw source token units using the quote's own rate
137
- const usdPerSourceRaw = sourceUsd.dividedBy(sourceRaw);
138
- return feeUsd
139
- .dividedBy(usdPerSourceRaw)
140
- .multipliedBy(multiplier)
141
- .decimalPlaces(0, BigNumber.ROUND_UP);
142
- }
143
- /**
144
- * Calculates the adjusted target amount for the final EXACT_OUTPUT quote
145
- * by adding the discovery quote's fee back to its minimum output.
146
- *
147
- * The discovery quote (EXACT_INPUT) reports a smaller fee than the final
148
- * EXACT_OUTPUT quote will charge. Adding the discovery fee back to the
149
- * minimum output compensates for this differential, ensuring the final
150
- * quote targets a realistic amount.
151
- *
152
- * @param discoveryQuote - The relay quote from the discovery phase.
153
- * @returns The adjusted target amount in raw target token units.
154
- */
155
- function calculateAdjustedTarget(discoveryQuote) {
156
- const targetMinRaw = new BigNumber(discoveryQuote.details.currencyOut.minimumAmount);
157
- const targetUsd = new BigNumber(discoveryQuote.details.currencyOut.amountUsd);
158
- const sourceUsd = new BigNumber(discoveryQuote.details.currencyIn.amountUsd);
159
- if (!targetUsd.gt(0) || !targetMinRaw.gt(0)) {
160
- return targetMinRaw.toFixed(0);
161
- }
162
- // Discovery fee in USD
163
- const discoveryFeeUsd = sourceUsd.minus(targetUsd);
164
- if (!discoveryFeeUsd.gt(0)) {
165
- return targetMinRaw.toFixed(0);
166
- }
167
- // Convert fee from USD to raw target token units
168
- const usdPerTargetRaw = targetUsd.dividedBy(targetMinRaw);
169
- const discoveryFeeInTargetRaw = discoveryFeeUsd
170
- .dividedBy(usdPerTargetRaw)
171
- .decimalPlaces(0, BigNumber.ROUND_DOWN);
172
- const adjusted = targetMinRaw.plus(discoveryFeeInTargetRaw);
173
- log('calculateAdjustedTarget', {
174
- targetMinRaw: targetMinRaw.toFixed(0),
175
- discoveryFeeUsd: discoveryFeeUsd.toFixed(6),
176
- discoveryFeeInTargetRaw: discoveryFeeInTargetRaw.toFixed(0),
177
- adjustedTargetRaw: adjusted.toFixed(0),
178
- });
179
- return adjusted.toFixed(0);
180
- }
181
- //# sourceMappingURL=fiat-submit-with-calldata.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fiat-submit-with-calldata.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-submit-with-calldata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger';\nimport type { PayStrategyExecuteRequest, QuoteRequest } from '../../types';\nimport {\n getFiatFeeReserveMultiplier,\n getFiatMaxRateDriftPercent,\n} from '../../utils/feature-flags';\nimport { getTransaction, updateTransaction } from '../../utils/transaction';\nimport { getRelayQuotes } from '../relay/relay-quotes';\nimport { submitRelayQuotes } from '../relay/relay-submit';\nimport type { RelayQuote } from '../relay/types';\nimport type { FiatQuote } from './types';\nimport { validateRelayRateDrift } from './utils';\n\nconst log = createModuleLogger(projectLogger, 'fiat-submit-calldata');\n\n/**\n * Submits relay quotes using the three-phase flow for transactions with nested\n * calldata that needs re-encoding (e.g. moneyAccountDeposit with approve + deposit).\n *\n * Phase 1: Discovery quote (EXACT_INPUT) to learn the target token output.\n * Phase 2: Delegate calldata re-encoding to the client via getAmountData.\n * Phase 3: Delegation quote (EXACT_OUTPUT) with updated nested transaction data.\n *\n * @param options - The submission options.\n * @param options.baseRequest - The base quote request from the original fiat quote.\n * @param options.request - The original fiat strategy execute request.\n * @param options.sourceAmountRaw - The settled source amount in atomic units.\n * @param options.transaction - The transaction metadata.\n * @returns An object containing the relay transaction hash if available.\n */\nexport async function submitWithCalldataReEncoding({\n baseRequest,\n request,\n sourceAmountRaw,\n transaction,\n}: {\n baseRequest: QuoteRequest;\n request: PayStrategyExecuteRequest<FiatQuote>;\n sourceAmountRaw: string;\n transaction: PayStrategyExecuteRequest<FiatQuote>['transaction'];\n}): Promise<{ transactionHash?: Hex }> {\n const { messenger } = request;\n const transactionId = transaction.id;\n\n const feeReserveRaw = calculateFeeReserve({\n feeQuote: request.quotes[0].original.relayQuote,\n multiplier: getFiatFeeReserveMultiplier(messenger),\n });\n\n const discoverySourceAmount = BigNumber.max(\n new BigNumber(sourceAmountRaw).minus(feeReserveRaw),\n 1,\n ).toFixed(0);\n\n log('Fee reserve for discovery', {\n feeReserveRaw: feeReserveRaw.toFixed(0),\n discoverySourceAmount,\n sourceAmountRaw,\n transactionId,\n });\n\n const discoveryRequest: QuoteRequest = {\n ...baseRequest,\n isMaxAmount: false,\n isPostQuote: true,\n sourceBalanceRaw: sourceAmountRaw,\n sourceTokenAmount: discoverySourceAmount,\n };\n\n const discoveryQuotes = await getRelayQuotes({\n accountSupports7702: request.accountSupports7702,\n messenger,\n requests: [discoveryRequest],\n transaction,\n });\n\n if (!discoveryQuotes.length) {\n throw new Error('No relay quotes returned for fiat discovery');\n }\n\n const discoveryRelay = discoveryQuotes[0].original;\n\n const originalRelayQuote = request.quotes[0].original.relayQuote;\n validateRelayRateDrift({\n originalQuote: originalRelayQuote,\n discoveryQuote: discoveryRelay,\n maxRateDriftPercent: getFiatMaxRateDriftPercent(messenger),\n transactionId,\n });\n\n const adjustedTargetRaw = calculateAdjustedTarget(discoveryRelay);\n\n log('Adjusted target for final quote', {\n discoveryMinimum: discoveryRelay.details.currencyOut.minimumAmount,\n adjustedTargetRaw,\n transactionId,\n });\n\n const { updates } = await messenger.call(\n 'TransactionPayController:getAmountData',\n { amount: adjustedTargetRaw, transaction },\n );\n\n if (!updates.length) {\n throw new Error(\n 'getAmountData returned no updates for transaction with nested calldata',\n );\n }\n\n updateTransaction(\n { transactionId, messenger, note: 'Fiat deposit: update settled amount' },\n (tx) => {\n for (const { nestedTransactionIndex, data } of updates) {\n if (tx.nestedTransactions?.[nestedTransactionIndex]) {\n tx.nestedTransactions[nestedTransactionIndex].data = data;\n }\n }\n if (tx.requiredAssets?.[0]) {\n tx.requiredAssets[0].amount = `0x${new BigNumber(adjustedTargetRaw).toString(16)}`;\n }\n },\n );\n\n const updatedTransaction =\n getTransaction(transactionId, messenger) ?? transaction;\n\n const relayRequest: QuoteRequest = {\n ...baseRequest,\n isMaxAmount: false,\n isPostQuote: false,\n sourceBalanceRaw: sourceAmountRaw,\n sourceTokenAmount: sourceAmountRaw,\n targetAmountMinimum: adjustedTargetRaw,\n };\n\n const relayQuotes = await getRelayQuotes({\n accountSupports7702: request.accountSupports7702,\n messenger,\n requests: [relayRequest],\n transaction: updatedTransaction,\n });\n\n if (!relayQuotes.length) {\n throw new Error('No relay quotes returned for completed fiat order');\n }\n\n log('Received relay quotes for completed fiat order', {\n relayQuoteCount: relayQuotes.length,\n transactionId,\n });\n\n return await submitRelayQuotes({\n accountSupports7702: request.accountSupports7702,\n isSmartTransaction: request.isSmartTransaction,\n messenger,\n quotes: relayQuotes,\n transaction: updatedTransaction,\n });\n}\n\n/**\n * Calculates the fee reserve in raw source token units from the original\n * relay fee quote. This reserve is subtracted from the discovery quote's\n * source amount so the final EXACT_OUTPUT quote stays within the settled\n * balance.\n *\n * @param options - Calculation options.\n * @param options.feeQuote - The original relay quote from the fee/quoting phase.\n * @param options.multiplier - Multiplier applied to the fee reserve (default 1).\n * @returns The fee reserve in raw source token units.\n */\nfunction calculateFeeReserve({\n feeQuote,\n multiplier,\n}: {\n feeQuote: RelayQuote;\n multiplier: number;\n}): BigNumber {\n const sourceRaw = new BigNumber(feeQuote.details.currencyIn.amount);\n const sourceUsd = new BigNumber(feeQuote.details.currencyIn.amountUsd);\n const targetUsd = new BigNumber(feeQuote.details.currencyOut.amountUsd);\n\n if (!sourceUsd.gt(0) || !sourceRaw.gt(0)) {\n return new BigNumber(0);\n }\n\n // Fee in USD = what the relay consumed beyond the target value\n const feeUsd = sourceUsd.minus(targetUsd);\n\n if (!feeUsd.gt(0)) {\n return new BigNumber(0);\n }\n\n // Convert USD fee to raw source token units using the quote's own rate\n const usdPerSourceRaw = sourceUsd.dividedBy(sourceRaw);\n\n return feeUsd\n .dividedBy(usdPerSourceRaw)\n .multipliedBy(multiplier)\n .decimalPlaces(0, BigNumber.ROUND_UP);\n}\n\n/**\n * Calculates the adjusted target amount for the final EXACT_OUTPUT quote\n * by adding the discovery quote's fee back to its minimum output.\n *\n * The discovery quote (EXACT_INPUT) reports a smaller fee than the final\n * EXACT_OUTPUT quote will charge. Adding the discovery fee back to the\n * minimum output compensates for this differential, ensuring the final\n * quote targets a realistic amount.\n *\n * @param discoveryQuote - The relay quote from the discovery phase.\n * @returns The adjusted target amount in raw target token units.\n */\nfunction calculateAdjustedTarget(discoveryQuote: RelayQuote): string {\n const targetMinRaw = new BigNumber(\n discoveryQuote.details.currencyOut.minimumAmount,\n );\n const targetUsd = new BigNumber(discoveryQuote.details.currencyOut.amountUsd);\n const sourceUsd = new BigNumber(discoveryQuote.details.currencyIn.amountUsd);\n\n if (!targetUsd.gt(0) || !targetMinRaw.gt(0)) {\n return targetMinRaw.toFixed(0);\n }\n\n // Discovery fee in USD\n const discoveryFeeUsd = sourceUsd.minus(targetUsd);\n\n if (!discoveryFeeUsd.gt(0)) {\n return targetMinRaw.toFixed(0);\n }\n\n // Convert fee from USD to raw target token units\n const usdPerTargetRaw = targetUsd.dividedBy(targetMinRaw);\n const discoveryFeeInTargetRaw = discoveryFeeUsd\n .dividedBy(usdPerTargetRaw)\n .decimalPlaces(0, BigNumber.ROUND_DOWN);\n\n const adjusted = targetMinRaw.plus(discoveryFeeInTargetRaw);\n\n log('calculateAdjustedTarget', {\n targetMinRaw: targetMinRaw.toFixed(0),\n discoveryFeeUsd: discoveryFeeUsd.toFixed(6),\n discoveryFeeInTargetRaw: discoveryFeeInTargetRaw.toFixed(0),\n adjustedTargetRaw: adjusted.toFixed(0),\n });\n\n return adjusted.toFixed(0);\n}\n"]}