@metamask/transaction-pay-controller 23.17.3 → 24.0.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 +30 -1
- package/dist/actions/update-payment-token.cjs +19 -4
- package/dist/actions/update-payment-token.cjs.map +1 -1
- package/dist/actions/update-payment-token.d.cts.map +1 -1
- package/dist/actions/update-payment-token.d.mts.map +1 -1
- package/dist/actions/update-payment-token.mjs +19 -4
- package/dist/actions/update-payment-token.mjs.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.cjs +5 -187
- package/dist/strategy/fiat/fiat-direct-musd.cjs.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.cts +0 -21
- package/dist/strategy/fiat/fiat-direct-musd.d.cts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.mts +0 -21
- package/dist/strategy/fiat/fiat-direct-musd.d.mts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.mjs +4 -185
- package/dist/strategy/fiat/fiat-direct-musd.mjs.map +1 -1
- package/dist/strategy/relay/constants.cjs +2 -1
- package/dist/strategy/relay/constants.cjs.map +1 -1
- package/dist/strategy/relay/constants.d.cts +1 -0
- package/dist/strategy/relay/constants.d.cts.map +1 -1
- package/dist/strategy/relay/constants.d.mts +1 -0
- package/dist/strategy/relay/constants.d.mts.map +1 -1
- package/dist/strategy/relay/constants.mjs +1 -0
- package/dist/strategy/relay/constants.mjs.map +1 -1
- package/dist/strategy/relay/relay-post-ma-vault.cjs +96 -0
- package/dist/strategy/relay/relay-post-ma-vault.cjs.map +1 -0
- package/dist/strategy/relay/relay-post-ma-vault.d.cts +25 -0
- package/dist/strategy/relay/relay-post-ma-vault.d.cts.map +1 -0
- package/dist/strategy/relay/relay-post-ma-vault.d.mts +25 -0
- package/dist/strategy/relay/relay-post-ma-vault.d.mts.map +1 -0
- package/dist/strategy/relay/relay-post-ma-vault.mjs +92 -0
- package/dist/strategy/relay/relay-post-ma-vault.mjs.map +1 -0
- package/dist/strategy/relay/relay-quotes.cjs +4 -1
- package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.mjs +4 -1
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/relay-submit-execute.cjs +132 -0
- package/dist/strategy/relay/relay-submit-execute.cjs.map +1 -0
- package/dist/strategy/relay/relay-submit-execute.d.cts +7 -0
- package/dist/strategy/relay/relay-submit-execute.d.cts.map +1 -0
- package/dist/strategy/relay/relay-submit-execute.d.mts +7 -0
- package/dist/strategy/relay/relay-submit-execute.d.mts.map +1 -0
- package/dist/strategy/relay/relay-submit-execute.mjs +128 -0
- package/dist/strategy/relay/relay-submit-execute.mjs.map +1 -0
- package/dist/strategy/relay/relay-submit.cjs +14 -79
- package/dist/strategy/relay/relay-submit.cjs.map +1 -1
- package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
- package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
- package/dist/strategy/relay/relay-submit.mjs +13 -78
- package/dist/strategy/relay/relay-submit.mjs.map +1 -1
- package/dist/strategy/relay/types.cjs.map +1 -1
- package/dist/strategy/relay/types.d.cts +15 -0
- package/dist/strategy/relay/types.d.cts.map +1 -1
- package/dist/strategy/relay/types.d.mts +15 -0
- package/dist/strategy/relay/types.d.mts.map +1 -1
- package/dist/strategy/relay/types.mjs.map +1 -1
- package/dist/tests/messenger-mock.d.cts +1 -0
- package/dist/tests/messenger-mock.d.cts.map +1 -1
- package/dist/tests/messenger-mock.d.mts +1 -0
- package/dist/tests/messenger-mock.d.mts.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +2 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +2 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/{strategy/fiat → utils}/chomp.cjs +3 -3
- package/dist/utils/chomp.cjs.map +1 -0
- package/dist/{strategy/fiat → utils}/chomp.d.cts +1 -1
- package/dist/utils/chomp.d.cts.map +1 -0
- package/dist/{strategy/fiat → utils}/chomp.d.mts +1 -1
- package/dist/utils/chomp.d.mts.map +1 -0
- package/dist/{strategy/fiat → utils}/chomp.mjs +3 -3
- package/dist/utils/chomp.mjs.map +1 -0
- package/dist/utils/ma-vault-deposit.cjs +196 -0
- package/dist/utils/ma-vault-deposit.cjs.map +1 -0
- package/dist/utils/ma-vault-deposit.d.cts +31 -0
- package/dist/utils/ma-vault-deposit.d.cts.map +1 -0
- package/dist/utils/ma-vault-deposit.d.mts +31 -0
- package/dist/utils/ma-vault-deposit.d.mts.map +1 -0
- package/dist/utils/ma-vault-deposit.mjs +192 -0
- package/dist/utils/ma-vault-deposit.mjs.map +1 -0
- package/dist/utils/transaction.cjs +9 -5
- package/dist/utils/transaction.cjs.map +1 -1
- package/dist/utils/transaction.d.cts +8 -0
- package/dist/utils/transaction.d.cts.map +1 -1
- package/dist/utils/transaction.d.mts +8 -0
- package/dist/utils/transaction.d.mts.map +1 -1
- package/dist/utils/transaction.mjs +9 -5
- package/dist/utils/transaction.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/strategy/fiat/chomp.cjs.map +0 -1
- package/dist/strategy/fiat/chomp.d.cts.map +0 -1
- package/dist/strategy/fiat/chomp.d.mts.map +0 -1
- package/dist/strategy/fiat/chomp.mjs.map +0 -1
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
import { ORIGIN_METAMASK } from "@metamask/controller-utils";
|
|
2
|
-
import { TransactionType } from "@metamask/transaction-controller";
|
|
3
1
|
import { createModuleLogger } from "@metamask/utils";
|
|
4
2
|
import { BigNumber } from "bignumber.js";
|
|
5
3
|
import { TransactionPayStrategy } from "../../constants.mjs";
|
|
6
4
|
import { projectLogger } from "../../logger.mjs";
|
|
7
5
|
import { prefixError } from "../../utils/error-prefix.mjs";
|
|
8
6
|
import { getFiatVaultDisabled } from "../../utils/feature-flags.mjs";
|
|
9
|
-
import {
|
|
7
|
+
import { submitMoneyAccountVaultDeposit } from "../../utils/ma-vault-deposit.mjs";
|
|
10
8
|
import { buildCaipAssetType, getTokenInfo } from "../../utils/token.mjs";
|
|
11
|
-
import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
|
|
12
|
-
import { findRecentChompVaultDeposit } from "./chomp.mjs";
|
|
13
9
|
import { MUSD_MONAD_FIAT_ASSET } from "./constants.mjs";
|
|
14
10
|
import { getRampsQuote, getRawSourceAmountFromOrderCryptoAmount, resolveSourceAmountRaw, validateOrderAsset } from "./utils.mjs";
|
|
15
11
|
const log = createModuleLogger(projectLogger, 'fiat-direct-musd');
|
|
16
12
|
const DIRECT_MUSD_ERROR_PREFIX = 'Direct mUSD: ';
|
|
17
|
-
const VAULT_ERROR_PREFIX = 'Vault: ';
|
|
18
13
|
/**
|
|
19
14
|
* Returns a direct mUSD fiat quote to the Money Account.
|
|
20
15
|
*
|
|
@@ -97,177 +92,18 @@ export async function submitDirectMusdAfterFiatCompletion({ order, request, }) {
|
|
|
97
92
|
fiatAsset: MUSD_MONAD_FIAT_ASSET,
|
|
98
93
|
walletAddress: transaction.txParams.from,
|
|
99
94
|
});
|
|
100
|
-
return await
|
|
95
|
+
return await submitMoneyAccountVaultDeposit({
|
|
101
96
|
fromBlock,
|
|
102
|
-
|
|
97
|
+
messenger,
|
|
103
98
|
sourceAmountRaw,
|
|
104
99
|
transaction,
|
|
100
|
+
vaultDisabled: getFiatVaultDisabled(messenger),
|
|
105
101
|
});
|
|
106
102
|
}
|
|
107
103
|
catch (error) {
|
|
108
104
|
throw prefixError(error, DIRECT_MUSD_ERROR_PREFIX);
|
|
109
105
|
}
|
|
110
106
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Submits the direct mUSD Money Account vault batch after fiat settlement.
|
|
113
|
-
*
|
|
114
|
-
* @param options - Submit options.
|
|
115
|
-
* @param options.fromBlock - Optional Monad block baseline for CHOMP
|
|
116
|
-
* idempotency scanning; sourced from the ramps settlement tx receipt via
|
|
117
|
-
* {@link resolveSourceAmountRaw}. When omitted the CHOMP checks are skipped.
|
|
118
|
-
* @param options.request - Strategy execute request.
|
|
119
|
-
* @param options.sourceAmountRaw - Settled source amount in raw mUSD units.
|
|
120
|
-
* @param options.transaction - Original Money Account transaction.
|
|
121
|
-
* @returns Hash of the final submitted child transaction (or the CHOMP deposit
|
|
122
|
-
* hash), if available.
|
|
123
|
-
*/
|
|
124
|
-
export async function submitDirectMusdVaultDeposit({ fromBlock, request, sourceAmountRaw, transaction, }) {
|
|
125
|
-
const { messenger } = request;
|
|
126
|
-
const transactionId = transaction.id;
|
|
127
|
-
const moneyAccountAddress = transaction.txParams.from;
|
|
128
|
-
if (!moneyAccountAddress) {
|
|
129
|
-
throw new Error('Missing Money Account address');
|
|
130
|
-
}
|
|
131
|
-
if (getFiatVaultDisabled(messenger)) {
|
|
132
|
-
log('Skipping direct mUSD vault deposit because vaultDisabled is enabled', {
|
|
133
|
-
moneyAccountAddress,
|
|
134
|
-
sourceAmountRaw,
|
|
135
|
-
transactionId,
|
|
136
|
-
});
|
|
137
|
-
return { transactionHash: '0x' };
|
|
138
|
-
}
|
|
139
|
-
const updatedTransaction = getTransaction(transactionId, messenger) ?? transaction;
|
|
140
|
-
const { updates } = await messenger.call('TransactionPayController:getAmountData', {
|
|
141
|
-
amount: sourceAmountRaw,
|
|
142
|
-
transaction: updatedTransaction,
|
|
143
|
-
});
|
|
144
|
-
if (!updates.length) {
|
|
145
|
-
throw new Error('No amount updates');
|
|
146
|
-
}
|
|
147
|
-
const nestedTransactions = updatedTransaction.nestedTransactions?.map((nestedTransaction) => ({ ...nestedTransaction }));
|
|
148
|
-
if (!nestedTransactions?.length) {
|
|
149
|
-
throw new Error('Missing nested transactions');
|
|
150
|
-
}
|
|
151
|
-
for (const { nestedTransactionIndex, data } of updates) {
|
|
152
|
-
if (nestedTransactions[nestedTransactionIndex]) {
|
|
153
|
-
nestedTransactions[nestedTransactionIndex].data = data;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
updateTransaction({
|
|
157
|
-
transactionId,
|
|
158
|
-
messenger,
|
|
159
|
-
note: 'Direct mUSD fiat: update vault amount',
|
|
160
|
-
}, (tx) => {
|
|
161
|
-
for (const { nestedTransactionIndex, data } of updates) {
|
|
162
|
-
if (tx.nestedTransactions?.[nestedTransactionIndex]) {
|
|
163
|
-
tx.nestedTransactions[nestedTransactionIndex].data = data;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
if (tx.requiredAssets?.[0]) {
|
|
167
|
-
tx.requiredAssets[0].amount = `0x${BigInt(sourceAmountRaw).toString(16)}`;
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
// CHOMP pre-check: skip addTransactionBatch entirely if CHOMP has already
|
|
171
|
-
// auto-vaulted the funds during or before the checkout window.
|
|
172
|
-
const preChompHash = await tryFindChompDeposit({
|
|
173
|
-
fromBlock,
|
|
174
|
-
messenger,
|
|
175
|
-
moneyAccountAddress,
|
|
176
|
-
sourceAmountRaw,
|
|
177
|
-
transactionId,
|
|
178
|
-
});
|
|
179
|
-
if (preChompHash) {
|
|
180
|
-
return { transactionHash: preChompHash };
|
|
181
|
-
}
|
|
182
|
-
const networkClientId = getNetworkClientId(messenger, MUSD_MONAD_FIAT_ASSET.chainId);
|
|
183
|
-
const transactionIds = [];
|
|
184
|
-
const { end } = collectTransactionIds(MUSD_MONAD_FIAT_ASSET.chainId, moneyAccountAddress, messenger, (id) => {
|
|
185
|
-
transactionIds.push(id);
|
|
186
|
-
updateTransaction({
|
|
187
|
-
transactionId,
|
|
188
|
-
messenger,
|
|
189
|
-
note: 'Add required transaction ID from direct mUSD vault submission',
|
|
190
|
-
}, (tx) => {
|
|
191
|
-
tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
|
|
192
|
-
tx.requiredTransactionIds.push(id);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
log('Submitting direct mUSD vault deposit', {
|
|
196
|
-
moneyAccountAddress,
|
|
197
|
-
nestedTransactionCount: nestedTransactions.length,
|
|
198
|
-
networkClientId,
|
|
199
|
-
sourceAmountRaw,
|
|
200
|
-
transactionId,
|
|
201
|
-
});
|
|
202
|
-
try {
|
|
203
|
-
await messenger.call('TransactionController:addTransactionBatch', {
|
|
204
|
-
disableHook: true,
|
|
205
|
-
disableSequential: true,
|
|
206
|
-
disableUpgrade: true,
|
|
207
|
-
from: moneyAccountAddress,
|
|
208
|
-
isGasFeeSponsored: true,
|
|
209
|
-
isInternal: true,
|
|
210
|
-
networkClientId,
|
|
211
|
-
origin: ORIGIN_METAMASK,
|
|
212
|
-
requireApproval: false,
|
|
213
|
-
skipInitialGasEstimate: true,
|
|
214
|
-
transactions: nestedTransactions.map((nestedTransaction, index) => ({
|
|
215
|
-
params: {
|
|
216
|
-
data: nestedTransaction.data,
|
|
217
|
-
to: nestedTransaction.to,
|
|
218
|
-
value: nestedTransaction.value ?? '0x0',
|
|
219
|
-
},
|
|
220
|
-
type: index === 0
|
|
221
|
-
? (nestedTransaction.type ?? TransactionType.tokenMethodApprove)
|
|
222
|
-
: TransactionType.contractInteraction,
|
|
223
|
-
})),
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
// CHOMP post-check: CHOMP may have won the race between pre-check and
|
|
228
|
-
// submit. Return the CHOMP hash instead of surfacing a Vault-prefixed error.
|
|
229
|
-
const postChompHash = await tryFindChompDeposit({
|
|
230
|
-
fromBlock,
|
|
231
|
-
messenger,
|
|
232
|
-
moneyAccountAddress,
|
|
233
|
-
sourceAmountRaw,
|
|
234
|
-
transactionId,
|
|
235
|
-
});
|
|
236
|
-
if (postChompHash) {
|
|
237
|
-
return { transactionHash: postChompHash };
|
|
238
|
-
}
|
|
239
|
-
throw prefixError(error, VAULT_ERROR_PREFIX);
|
|
240
|
-
}
|
|
241
|
-
finally {
|
|
242
|
-
end();
|
|
243
|
-
}
|
|
244
|
-
log('Submitted direct mUSD vault deposit', {
|
|
245
|
-
moneyAccountAddress,
|
|
246
|
-
nestedTransactionCount: nestedTransactions.length,
|
|
247
|
-
networkClientId,
|
|
248
|
-
sourceAmountRaw,
|
|
249
|
-
transactionId,
|
|
250
|
-
transactionIds,
|
|
251
|
-
});
|
|
252
|
-
if (!transactionIds.length) {
|
|
253
|
-
throw new Error('No transactions submitted');
|
|
254
|
-
}
|
|
255
|
-
await Promise.all(transactionIds.map((id) => waitForTransactionConfirmed(id, messenger)));
|
|
256
|
-
const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;
|
|
257
|
-
if (!hash) {
|
|
258
|
-
throw new Error('Missing transaction hash');
|
|
259
|
-
}
|
|
260
|
-
log('Confirmed direct mUSD vault deposit', {
|
|
261
|
-
hash,
|
|
262
|
-
moneyAccountAddress,
|
|
263
|
-
nestedTransactionCount: nestedTransactions.length,
|
|
264
|
-
networkClientId,
|
|
265
|
-
sourceAmountRaw,
|
|
266
|
-
transactionId,
|
|
267
|
-
transactionIds,
|
|
268
|
-
});
|
|
269
|
-
return { transactionHash: hash };
|
|
270
|
-
}
|
|
271
107
|
function combineDirectMusdFiatQuote({ amountFiat, fiatQuote, messenger, moneyAccountAddress, requiredToken, }) {
|
|
272
108
|
const tokenInfo = getTokenInfo(messenger, MUSD_MONAD_FIAT_ASSET.address, MUSD_MONAD_FIAT_ASSET.chainId);
|
|
273
109
|
if (!tokenInfo) {
|
|
@@ -323,21 +159,4 @@ function combineDirectMusdFiatQuote({ amountFiat, fiatQuote, messenger, moneyAcc
|
|
|
323
159
|
function getRampsProviderFee(fiatQuote) {
|
|
324
160
|
return new BigNumber(fiatQuote.quote.providerFee ?? 0).plus(fiatQuote.quote.networkFee ?? 0);
|
|
325
161
|
}
|
|
326
|
-
async function tryFindChompDeposit({ fromBlock, messenger, moneyAccountAddress, sourceAmountRaw, transactionId, }) {
|
|
327
|
-
if (!fromBlock) {
|
|
328
|
-
return undefined;
|
|
329
|
-
}
|
|
330
|
-
try {
|
|
331
|
-
return await findRecentChompVaultDeposit({
|
|
332
|
-
fromBlock,
|
|
333
|
-
messenger,
|
|
334
|
-
moneyAccountAddress,
|
|
335
|
-
sourceAmountRaw,
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
catch (chompError) {
|
|
339
|
-
log('CHOMP check failed', { chompError, transactionId });
|
|
340
|
-
return undefined;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
162
|
//# sourceMappingURL=fiat-direct-musd.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fiat-direct-musd.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-direct-musd.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type {\n Quote as RampsQuote,\n RampsOrder,\n} from '@metamask/ramps-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionFiatPayment,\n TransactionPayRequiredToken,\n TransactionPayQuote,\n} from '../../types';\nimport { prefixError } from '../../utils/error-prefix';\nimport { getFiatVaultDisabled } from '../../utils/feature-flags';\nimport { getNetworkClientId } from '../../utils/provider';\nimport { buildCaipAssetType, getTokenInfo } from '../../utils/token';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\nimport { findRecentChompVaultDeposit } from './chomp';\nimport { MUSD_MONAD_FIAT_ASSET } from './constants';\nimport type { FiatQuote } from './types';\nimport {\n getRampsQuote,\n getRawSourceAmountFromOrderCryptoAmount,\n resolveSourceAmountRaw,\n validateOrderAsset,\n} from './utils';\n\nconst log = createModuleLogger(projectLogger, 'fiat-direct-musd');\nconst DIRECT_MUSD_ERROR_PREFIX = 'Direct mUSD: ';\nconst VAULT_ERROR_PREFIX = 'Vault: ';\n\n/**\n * Returns a direct mUSD fiat quote to the Money Account.\n *\n * @param options - Direct quote options.\n * @param options.amountFiat - Fiat amount entered by the user.\n * @param options.fiatPaymentMethod - Selected fiat payment method.\n * @param options.messenger - Controller messenger.\n * @param options.moneyAccountAddress - Money Account receiving the on-ramped mUSD.\n * @param options.requiredToken - Required token from the original Money Account transaction.\n * @param options.transactionId - Transaction ID for state updates and logs.\n * @returns Direct mUSD Fiat quote, or undefined when unavailable.\n */\nexport async function getDirectMusdFiatQuote({\n amountFiat,\n fiatPaymentMethod,\n messenger,\n moneyAccountAddress,\n requiredToken,\n transactionId,\n}: {\n amountFiat: string;\n fiatPaymentMethod: string;\n messenger: PayStrategyGetQuotesRequest['messenger'];\n moneyAccountAddress: Hex;\n requiredToken: TransactionPayRequiredToken;\n transactionId: string;\n}): Promise<TransactionPayQuote<FiatQuote> | undefined> {\n try {\n const adjustedAmount = Number(amountFiat);\n\n if (!Number.isFinite(adjustedAmount) || adjustedAmount <= 0) {\n throw new Error('Invalid fiat amount for direct mUSD quote');\n }\n\n const fiatQuote = await getRampsQuote({\n adjustedAmount,\n errorMessage: 'No matching ramps quote found for direct mUSD provider',\n fiatAsset: MUSD_MONAD_FIAT_ASSET,\n fiatPaymentMethod,\n messenger,\n walletAddress: moneyAccountAddress,\n });\n\n messenger.call('TransactionPayController:updateFiatPayment', {\n callback: (fiatPayment: TransactionFiatPayment) => {\n fiatPayment.rampsQuote = fiatQuote;\n fiatPayment.caipAssetId = buildCaipAssetType(\n MUSD_MONAD_FIAT_ASSET.chainId,\n MUSD_MONAD_FIAT_ASSET.address,\n );\n },\n transactionId,\n });\n\n log('Direct mUSD fiat quote flow', {\n amountFiat,\n moneyAccountAddress,\n transactionId,\n });\n\n return combineDirectMusdFiatQuote({\n amountFiat,\n fiatQuote,\n messenger,\n moneyAccountAddress,\n requiredToken,\n });\n } catch (error) {\n log('Direct mUSD fiat quote failed', { error, transactionId });\n return undefined;\n }\n}\n\n/**\n * Detects a direct mUSD Money Account quote from its stored request marker.\n *\n * @param quote - Quote to inspect.\n * @returns True when the quote originated from the direct mUSD fiat path.\n */\nexport function isDirectMusdMoneyAccountQuote(\n quote: Pick<TransactionPayQuote<unknown>, 'request'> | undefined,\n): boolean {\n return quote?.request.isDirectMusdMoneyAccount === true;\n}\n\n/**\n * Submits the direct mUSD post-Ramp path after fiat settlement.\n *\n * @param options - Submit options.\n * @param options.order - Completed fiat order.\n * @param options.request - Strategy execute request.\n * @returns Hash of the submitted direct mUSD transaction, if available.\n */\nexport async function submitDirectMusdAfterFiatCompletion({\n order,\n request,\n}: {\n order: RampsOrder;\n request: PayStrategyExecuteRequest<FiatQuote>;\n}): Promise<{ transactionHash?: Hex }> {\n const { messenger, transaction } = request;\n\n try {\n validateOrderAsset({\n expectedAsset: MUSD_MONAD_FIAT_ASSET,\n orderCrypto: order.cryptoCurrency,\n transactionId: transaction.id,\n });\n\n const { amountRaw: sourceAmountRaw, fromBlock } =\n await resolveSourceAmountRaw({\n messenger,\n order,\n fiatAsset: MUSD_MONAD_FIAT_ASSET,\n walletAddress: transaction.txParams.from as Hex,\n });\n\n return await submitDirectMusdVaultDeposit({\n fromBlock,\n request,\n sourceAmountRaw,\n transaction,\n });\n } catch (error) {\n throw prefixError(error, DIRECT_MUSD_ERROR_PREFIX);\n }\n}\n\n/**\n * Submits the direct mUSD Money Account vault batch after fiat settlement.\n *\n * @param options - Submit options.\n * @param options.fromBlock - Optional Monad block baseline for CHOMP\n * idempotency scanning; sourced from the ramps settlement tx receipt via\n * {@link resolveSourceAmountRaw}. When omitted the CHOMP checks are skipped.\n * @param options.request - Strategy execute request.\n * @param options.sourceAmountRaw - Settled source amount in raw mUSD units.\n * @param options.transaction - Original Money Account transaction.\n * @returns Hash of the final submitted child transaction (or the CHOMP deposit\n * hash), if available.\n */\nexport async function submitDirectMusdVaultDeposit({\n fromBlock,\n request,\n sourceAmountRaw,\n transaction,\n}: {\n fromBlock?: Hex;\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 const moneyAccountAddress = transaction.txParams.from as Hex | undefined;\n\n if (!moneyAccountAddress) {\n throw new Error('Missing Money Account address');\n }\n\n if (getFiatVaultDisabled(messenger)) {\n log('Skipping direct mUSD vault deposit because vaultDisabled is enabled', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { transactionHash: '0x' };\n }\n\n const updatedTransaction =\n getTransaction(transactionId, messenger) ?? transaction;\n const { updates } = await messenger.call(\n 'TransactionPayController:getAmountData',\n {\n amount: sourceAmountRaw,\n transaction: updatedTransaction,\n },\n );\n\n if (!updates.length) {\n throw new Error('No amount updates');\n }\n\n const nestedTransactions = updatedTransaction.nestedTransactions?.map(\n (nestedTransaction) => ({ ...nestedTransaction }),\n );\n\n if (!nestedTransactions?.length) {\n throw new Error('Missing nested transactions');\n }\n\n for (const { nestedTransactionIndex, data } of updates) {\n if (nestedTransactions[nestedTransactionIndex]) {\n nestedTransactions[nestedTransactionIndex].data = data;\n }\n }\n\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Direct mUSD fiat: update vault amount',\n },\n (tx) => {\n for (const { nestedTransactionIndex, data } of updates) {\n if (tx.nestedTransactions?.[nestedTransactionIndex]) {\n tx.nestedTransactions[nestedTransactionIndex].data = data;\n }\n }\n\n if (tx.requiredAssets?.[0]) {\n tx.requiredAssets[0].amount = `0x${BigInt(sourceAmountRaw).toString(\n 16,\n )}`;\n }\n },\n );\n\n // CHOMP pre-check: skip addTransactionBatch entirely if CHOMP has already\n // auto-vaulted the funds during or before the checkout window.\n const preChompHash = await tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n if (preChompHash) {\n return { transactionHash: preChompHash };\n }\n\n const networkClientId = getNetworkClientId(\n messenger,\n MUSD_MONAD_FIAT_ASSET.chainId,\n );\n const transactionIds: string[] = [];\n const { end } = collectTransactionIds(\n MUSD_MONAD_FIAT_ASSET.chainId,\n moneyAccountAddress,\n messenger,\n (id) => {\n transactionIds.push(id);\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Add required transaction ID from direct mUSD vault submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(id);\n },\n );\n },\n );\n\n log('Submitting direct mUSD vault deposit', {\n moneyAccountAddress,\n nestedTransactionCount: nestedTransactions.length,\n networkClientId,\n sourceAmountRaw,\n transactionId,\n });\n\n try {\n await messenger.call('TransactionController:addTransactionBatch', {\n disableHook: true,\n disableSequential: true,\n disableUpgrade: true,\n from: moneyAccountAddress,\n isGasFeeSponsored: true,\n isInternal: true,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n skipInitialGasEstimate: true,\n transactions: nestedTransactions.map((nestedTransaction, index) => ({\n params: {\n data: nestedTransaction.data,\n to: nestedTransaction.to,\n value: nestedTransaction.value ?? '0x0',\n },\n type:\n index === 0\n ? (nestedTransaction.type ?? TransactionType.tokenMethodApprove)\n : TransactionType.contractInteraction,\n })),\n });\n } catch (error) {\n // CHOMP post-check: CHOMP may have won the race between pre-check and\n // submit. Return the CHOMP hash instead of surfacing a Vault-prefixed error.\n const postChompHash = await tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n if (postChompHash) {\n return { transactionHash: postChompHash };\n }\n\n throw prefixError(error, VAULT_ERROR_PREFIX);\n } finally {\n end();\n }\n\n log('Submitted direct mUSD vault deposit', {\n moneyAccountAddress,\n nestedTransactionCount: nestedTransactions.length,\n networkClientId,\n sourceAmountRaw,\n transactionId,\n transactionIds,\n });\n\n if (!transactionIds.length) {\n throw new Error('No transactions submitted');\n }\n\n await Promise.all(\n transactionIds.map((id) => waitForTransactionConfirmed(id, messenger)),\n );\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n if (!hash) {\n throw new Error('Missing transaction hash');\n }\n\n log('Confirmed direct mUSD vault deposit', {\n hash,\n moneyAccountAddress,\n nestedTransactionCount: nestedTransactions.length,\n networkClientId,\n sourceAmountRaw,\n transactionId,\n transactionIds,\n });\n\n return { transactionHash: hash as Hex };\n}\n\nfunction combineDirectMusdFiatQuote({\n amountFiat,\n fiatQuote,\n messenger,\n moneyAccountAddress,\n requiredToken,\n}: {\n amountFiat: string;\n fiatQuote: RampsQuote;\n messenger: PayStrategyGetQuotesRequest['messenger'];\n moneyAccountAddress: Hex;\n requiredToken: TransactionPayRequiredToken;\n}): TransactionPayQuote<FiatQuote> {\n const tokenInfo = getTokenInfo(\n messenger,\n MUSD_MONAD_FIAT_ASSET.address,\n MUSD_MONAD_FIAT_ASSET.chainId,\n );\n\n if (!tokenInfo) {\n throw new Error('Unable to resolve mUSD token info for direct fiat quote');\n }\n\n const sourceAmountRaw = getRawSourceAmountFromOrderCryptoAmount({\n cryptoAmount: fiatQuote.quote.amountOut,\n decimals: tokenInfo.decimals,\n });\n const rampsProviderFee = getRampsProviderFee(fiatQuote).toString(10);\n const sourceAmountHuman = new BigNumber(sourceAmountRaw)\n .shiftedBy(-tokenInfo.decimals)\n .toString(10);\n\n return {\n dust: { fiat: '0', usd: '0' },\n estimatedDuration: 0,\n fees: {\n metaMask: { fiat: '0', usd: '0' },\n provider: { fiat: rampsProviderFee, usd: rampsProviderFee },\n providerFiat: { fiat: rampsProviderFee, usd: rampsProviderFee },\n sourceNetwork: {\n estimate: { fiat: '0', human: '0', raw: '0', usd: '0' },\n max: { fiat: '0', human: '0', raw: '0', usd: '0' },\n },\n targetNetwork: { fiat: '0', usd: '0' },\n },\n original: {\n rampsQuote: fiatQuote,\n relayQuote: undefined,\n },\n request: {\n from: moneyAccountAddress,\n isDirectMusdMoneyAccount: true,\n recipient: moneyAccountAddress,\n sourceBalanceRaw: sourceAmountRaw,\n sourceChainId: MUSD_MONAD_FIAT_ASSET.chainId,\n sourceTokenAddress: MUSD_MONAD_FIAT_ASSET.address,\n sourceTokenAmount: sourceAmountRaw,\n targetAmountMinimum: sourceAmountRaw,\n targetChainId: requiredToken.chainId,\n targetTokenAddress: requiredToken.address,\n },\n sourceAmount: {\n fiat: amountFiat,\n human: sourceAmountHuman,\n raw: sourceAmountRaw,\n usd: amountFiat,\n },\n strategy: TransactionPayStrategy.Fiat,\n targetAmount: { fiat: amountFiat, usd: amountFiat },\n };\n}\n\nfunction getRampsProviderFee(fiatQuote: RampsQuote): BigNumber {\n return new BigNumber(fiatQuote.quote.providerFee ?? 0).plus(\n fiatQuote.quote.networkFee ?? 0,\n );\n}\n\nasync function tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n}: {\n fromBlock: Hex | undefined;\n messenger: PayStrategyExecuteRequest<FiatQuote>['messenger'];\n moneyAccountAddress: Hex;\n sourceAmountRaw: string;\n transactionId: string;\n}): Promise<Hex | undefined> {\n if (!fromBlock) {\n return undefined;\n }\n\n try {\n return await findRecentChompVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n });\n } catch (chompError) {\n log('CHOMP check failed', { chompError, transactionId });\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fiat-direct-musd.mjs","sourceRoot":"","sources":["../../../src/strategy/fiat/fiat-direct-musd.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AACrD,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,EAAE,sBAAsB,EAAE,4BAAwB;AACzD,OAAO,EAAE,aAAa,EAAE,yBAAqB;AAQ7C,OAAO,EAAE,WAAW,EAAE,qCAAiC;AACvD,OAAO,EAAE,oBAAoB,EAAE,sCAAkC;AACjE,OAAO,EAAE,8BAA8B,EAAE,yCAAqC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,8BAA0B;AACrE,OAAO,EAAE,qBAAqB,EAAE,wBAAoB;AAEpD,OAAO,EACL,aAAa,EACb,uCAAuC,EACvC,sBAAsB,EACtB,kBAAkB,EACnB,oBAAgB;AAEjB,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAClE,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACnB,aAAa,EACb,aAAa,GAQd;IACC,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;YACpC,cAAc;YACd,YAAY,EAAE,wDAAwD;YACtE,SAAS,EAAE,qBAAqB;YAChC,iBAAiB;YACjB,SAAS;YACT,aAAa,EAAE,mBAAmB;SACnC,CAAC,CAAC;QAEH,SAAS,CAAC,IAAI,CAAC,4CAA4C,EAAE;YAC3D,QAAQ,EAAE,CAAC,WAAmC,EAAE,EAAE;gBAChD,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC;gBACnC,WAAW,CAAC,WAAW,GAAG,kBAAkB,CAC1C,qBAAqB,CAAC,OAAO,EAC7B,qBAAqB,CAAC,OAAO,CAC9B,CAAC;YACJ,CAAC;YACD,aAAa;SACd,CAAC,CAAC;QAEH,GAAG,CAAC,6BAA6B,EAAE;YACjC,UAAU;YACV,mBAAmB;YACnB,aAAa;SACd,CAAC,CAAC;QAEH,OAAO,0BAA0B,CAAC;YAChC,UAAU;YACV,SAAS;YACT,SAAS;YACT,mBAAmB;YACnB,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAAgE;IAEhE,OAAO,KAAK,EAAE,OAAO,CAAC,wBAAwB,KAAK,IAAI,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC,CAAC,EACxD,KAAK,EACL,OAAO,GAIR;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,CAAC;QACH,kBAAkB,CAAC;YACjB,aAAa,EAAE,qBAAqB;YACpC,WAAW,EAAE,KAAK,CAAC,cAAc;YACjC,aAAa,EAAE,WAAW,CAAC,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,GAC7C,MAAM,sBAAsB,CAAC;YAC3B,SAAS;YACT,KAAK;YACL,SAAS,EAAE,qBAAqB;YAChC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAW;SAChD,CAAC,CAAC;QAEL,OAAO,MAAM,8BAA8B,CAAC;YAC1C,SAAS;YACT,SAAS;YACT,eAAe;YACf,WAAW;YACX,aAAa,EAAE,oBAAoB,CAAC,SAAS,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,EAClC,UAAU,EACV,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,aAAa,GAOd;IACC,MAAM,SAAS,GAAG,YAAY,CAC5B,SAAS,EACT,qBAAqB,CAAC,OAAO,EAC7B,qBAAqB,CAAC,OAAO,CAC9B,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,eAAe,GAAG,uCAAuC,CAAC;QAC9D,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS;QACvC,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC;SACrD,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC9B,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QAC7B,iBAAiB,EAAE,CAAC;QACpB,IAAI,EAAE;YACJ,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YACjC,QAAQ,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,EAAE;YAC3D,YAAY,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,EAAE;YAC/D,aAAa,EAAE;gBACb,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;gBACvD,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;aACnD;YACD,aAAa,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;SACvC;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;SACtB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,mBAAmB;YACzB,wBAAwB,EAAE,IAAI;YAC9B,SAAS,EAAE,mBAAmB;YAC9B,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,qBAAqB,CAAC,OAAO;YAC5C,kBAAkB,EAAE,qBAAqB,CAAC,OAAO;YACjD,iBAAiB,EAAE,eAAe;YAClC,mBAAmB,EAAE,eAAe;YACpC,aAAa,EAAE,aAAa,CAAC,OAAO;YACpC,kBAAkB,EAAE,aAAa,CAAC,OAAO;SAC1C;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,iBAAiB;YACxB,GAAG,EAAE,eAAe;YACpB,GAAG,EAAE,UAAU;SAChB;QACD,QAAQ,EAAE,sBAAsB,CAAC,IAAI;QACrC,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAqB;IAChD,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,CACzD,SAAS,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAChC,CAAC;AACJ,CAAC","sourcesContent":["import type {\n Quote as RampsQuote,\n RampsOrder,\n} from '@metamask/ramps-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { TransactionPayStrategy } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionFiatPayment,\n TransactionPayRequiredToken,\n TransactionPayQuote,\n} from '../../types';\nimport { prefixError } from '../../utils/error-prefix';\nimport { getFiatVaultDisabled } from '../../utils/feature-flags';\nimport { submitMoneyAccountVaultDeposit } from '../../utils/ma-vault-deposit';\nimport { buildCaipAssetType, getTokenInfo } from '../../utils/token';\nimport { MUSD_MONAD_FIAT_ASSET } from './constants';\nimport type { FiatQuote } from './types';\nimport {\n getRampsQuote,\n getRawSourceAmountFromOrderCryptoAmount,\n resolveSourceAmountRaw,\n validateOrderAsset,\n} from './utils';\n\nconst log = createModuleLogger(projectLogger, 'fiat-direct-musd');\nconst DIRECT_MUSD_ERROR_PREFIX = 'Direct mUSD: ';\n\n/**\n * Returns a direct mUSD fiat quote to the Money Account.\n *\n * @param options - Direct quote options.\n * @param options.amountFiat - Fiat amount entered by the user.\n * @param options.fiatPaymentMethod - Selected fiat payment method.\n * @param options.messenger - Controller messenger.\n * @param options.moneyAccountAddress - Money Account receiving the on-ramped mUSD.\n * @param options.requiredToken - Required token from the original Money Account transaction.\n * @param options.transactionId - Transaction ID for state updates and logs.\n * @returns Direct mUSD Fiat quote, or undefined when unavailable.\n */\nexport async function getDirectMusdFiatQuote({\n amountFiat,\n fiatPaymentMethod,\n messenger,\n moneyAccountAddress,\n requiredToken,\n transactionId,\n}: {\n amountFiat: string;\n fiatPaymentMethod: string;\n messenger: PayStrategyGetQuotesRequest['messenger'];\n moneyAccountAddress: Hex;\n requiredToken: TransactionPayRequiredToken;\n transactionId: string;\n}): Promise<TransactionPayQuote<FiatQuote> | undefined> {\n try {\n const adjustedAmount = Number(amountFiat);\n\n if (!Number.isFinite(adjustedAmount) || adjustedAmount <= 0) {\n throw new Error('Invalid fiat amount for direct mUSD quote');\n }\n\n const fiatQuote = await getRampsQuote({\n adjustedAmount,\n errorMessage: 'No matching ramps quote found for direct mUSD provider',\n fiatAsset: MUSD_MONAD_FIAT_ASSET,\n fiatPaymentMethod,\n messenger,\n walletAddress: moneyAccountAddress,\n });\n\n messenger.call('TransactionPayController:updateFiatPayment', {\n callback: (fiatPayment: TransactionFiatPayment) => {\n fiatPayment.rampsQuote = fiatQuote;\n fiatPayment.caipAssetId = buildCaipAssetType(\n MUSD_MONAD_FIAT_ASSET.chainId,\n MUSD_MONAD_FIAT_ASSET.address,\n );\n },\n transactionId,\n });\n\n log('Direct mUSD fiat quote flow', {\n amountFiat,\n moneyAccountAddress,\n transactionId,\n });\n\n return combineDirectMusdFiatQuote({\n amountFiat,\n fiatQuote,\n messenger,\n moneyAccountAddress,\n requiredToken,\n });\n } catch (error) {\n log('Direct mUSD fiat quote failed', { error, transactionId });\n return undefined;\n }\n}\n\n/**\n * Detects a direct mUSD Money Account quote from its stored request marker.\n *\n * @param quote - Quote to inspect.\n * @returns True when the quote originated from the direct mUSD fiat path.\n */\nexport function isDirectMusdMoneyAccountQuote(\n quote: Pick<TransactionPayQuote<unknown>, 'request'> | undefined,\n): boolean {\n return quote?.request.isDirectMusdMoneyAccount === true;\n}\n\n/**\n * Submits the direct mUSD post-Ramp path after fiat settlement.\n *\n * @param options - Submit options.\n * @param options.order - Completed fiat order.\n * @param options.request - Strategy execute request.\n * @returns Hash of the submitted direct mUSD transaction, if available.\n */\nexport async function submitDirectMusdAfterFiatCompletion({\n order,\n request,\n}: {\n order: RampsOrder;\n request: PayStrategyExecuteRequest<FiatQuote>;\n}): Promise<{ transactionHash?: Hex }> {\n const { messenger, transaction } = request;\n\n try {\n validateOrderAsset({\n expectedAsset: MUSD_MONAD_FIAT_ASSET,\n orderCrypto: order.cryptoCurrency,\n transactionId: transaction.id,\n });\n\n const { amountRaw: sourceAmountRaw, fromBlock } =\n await resolveSourceAmountRaw({\n messenger,\n order,\n fiatAsset: MUSD_MONAD_FIAT_ASSET,\n walletAddress: transaction.txParams.from as Hex,\n });\n\n return await submitMoneyAccountVaultDeposit({\n fromBlock,\n messenger,\n sourceAmountRaw,\n transaction,\n vaultDisabled: getFiatVaultDisabled(messenger),\n });\n } catch (error) {\n throw prefixError(error, DIRECT_MUSD_ERROR_PREFIX);\n }\n}\n\nfunction combineDirectMusdFiatQuote({\n amountFiat,\n fiatQuote,\n messenger,\n moneyAccountAddress,\n requiredToken,\n}: {\n amountFiat: string;\n fiatQuote: RampsQuote;\n messenger: PayStrategyGetQuotesRequest['messenger'];\n moneyAccountAddress: Hex;\n requiredToken: TransactionPayRequiredToken;\n}): TransactionPayQuote<FiatQuote> {\n const tokenInfo = getTokenInfo(\n messenger,\n MUSD_MONAD_FIAT_ASSET.address,\n MUSD_MONAD_FIAT_ASSET.chainId,\n );\n\n if (!tokenInfo) {\n throw new Error('Unable to resolve mUSD token info for direct fiat quote');\n }\n\n const sourceAmountRaw = getRawSourceAmountFromOrderCryptoAmount({\n cryptoAmount: fiatQuote.quote.amountOut,\n decimals: tokenInfo.decimals,\n });\n const rampsProviderFee = getRampsProviderFee(fiatQuote).toString(10);\n const sourceAmountHuman = new BigNumber(sourceAmountRaw)\n .shiftedBy(-tokenInfo.decimals)\n .toString(10);\n\n return {\n dust: { fiat: '0', usd: '0' },\n estimatedDuration: 0,\n fees: {\n metaMask: { fiat: '0', usd: '0' },\n provider: { fiat: rampsProviderFee, usd: rampsProviderFee },\n providerFiat: { fiat: rampsProviderFee, usd: rampsProviderFee },\n sourceNetwork: {\n estimate: { fiat: '0', human: '0', raw: '0', usd: '0' },\n max: { fiat: '0', human: '0', raw: '0', usd: '0' },\n },\n targetNetwork: { fiat: '0', usd: '0' },\n },\n original: {\n rampsQuote: fiatQuote,\n relayQuote: undefined,\n },\n request: {\n from: moneyAccountAddress,\n isDirectMusdMoneyAccount: true,\n recipient: moneyAccountAddress,\n sourceBalanceRaw: sourceAmountRaw,\n sourceChainId: MUSD_MONAD_FIAT_ASSET.chainId,\n sourceTokenAddress: MUSD_MONAD_FIAT_ASSET.address,\n sourceTokenAmount: sourceAmountRaw,\n targetAmountMinimum: sourceAmountRaw,\n targetChainId: requiredToken.chainId,\n targetTokenAddress: requiredToken.address,\n },\n sourceAmount: {\n fiat: amountFiat,\n human: sourceAmountHuman,\n raw: sourceAmountRaw,\n usd: amountFiat,\n },\n strategy: TransactionPayStrategy.Fiat,\n targetAmount: { fiat: amountFiat, usd: amountFiat },\n };\n}\n\nfunction getRampsProviderFee(fiatQuote: RampsQuote): BigNumber {\n return new BigNumber(fiatQuote.quote.providerFee ?? 0).plus(\n fiatQuote.quote.networkFee ?? 0,\n );\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RELAY_DEPOSIT_TYPES = exports.RELAY_PENDING_STATUSES = exports.RELAY_FAILURE_STATUSES = exports.TOKEN_TRANSFER_FOUR_BYTE = exports.RELAY_POLLING_INTERVAL = exports.HYPERLIQUID_EXCHANGE_URL = exports.HYPERLIQUID_INFO_URL = exports.HYPERLIQUID_URL_BASE = exports.RELAY_STATUS_URL = exports.RELAY_QUOTE_URL = exports.RELAY_EXECUTE_URL = exports.RELAY_AUTHORIZE_URL = exports.RELAY_URL_BASE = void 0;
|
|
3
|
+
exports.RELAY_DEPOSIT_TYPES = exports.RELAY_PENDING_STATUSES = exports.RELAY_FAILURE_STATUSES = exports.TOKEN_TRANSFER_FOUR_BYTE = exports.RELAY_POLLING_INTERVAL = exports.HYPERLIQUID_EXCHANGE_URL = exports.HYPERLIQUID_INFO_URL = exports.HYPERLIQUID_URL_BASE = exports.RELAY_STATUS_URL = exports.RELAY_QUOTE_URL = exports.RELAY_EXECUTE_URL = exports.RELAY_AUTHORIZE_URL = exports.RELAY_URL_BASE = exports.FALLBACK_HASH = void 0;
|
|
4
4
|
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
5
5
|
const constants_1 = require("../../constants.cjs");
|
|
6
|
+
exports.FALLBACK_HASH = '0x0';
|
|
6
7
|
exports.RELAY_URL_BASE = 'https://api.relay.link';
|
|
7
8
|
exports.RELAY_AUTHORIZE_URL = `${exports.RELAY_URL_BASE}/authorize`;
|
|
8
9
|
exports.RELAY_EXECUTE_URL = `${exports.RELAY_URL_BASE}/execute`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":";;;AAAA,6EAAmE;
|
|
1
|
+
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":";;;AAAA,6EAAmE;AAGnE,mDAAsD;AAGzC,QAAA,aAAa,GAAG,KAAY,CAAC;AAE7B,QAAA,cAAc,GAAG,wBAAwB,CAAC;AAC1C,QAAA,mBAAmB,GAAG,GAAG,sBAAc,YAAY,CAAC;AACpD,QAAA,iBAAiB,GAAG,GAAG,sBAAc,UAAU,CAAC;AAChD,QAAA,eAAe,GAAG,GAAG,sBAAc,QAAQ,CAAC;AAC5C,QAAA,gBAAgB,GAAG,GAAG,sBAAc,oBAAoB,CAAC;AACzD,QAAA,oBAAoB,GAAG,6BAA6B,CAAC;AACrD,QAAA,oBAAoB,GAAG,GAAG,4BAAoB,OAAO,CAAC;AACtD,QAAA,wBAAwB,GAAG,GAAG,4BAAoB,WAAW,CAAC;AAC9D,QAAA,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW;AAC1C,QAAA,wBAAwB,GAAG,YAAY,CAAC;AAExC,QAAA,sBAAsB,GAAkB;IACnD,SAAS;IACT,QAAQ;IACR,UAAU;CACX,CAAC;AAEW,QAAA,sBAAsB,GAAkB;IACnD,SAAS;IACT,YAAY;IACZ,SAAS;IACT,WAAW;IACX,SAAS;CACV,CAAC;AAEW,QAAA,mBAAmB,GAAoC;IAClE,CAAC,wCAAe,CAAC,cAAc,CAAC,EAAE,wCAAe,CAAC,gBAAgB;IAClE,CAAC,wCAAe,CAAC,cAAc,CAAC,EAAE,wCAAe,CAAC,mBAAmB;IACrE,GAAG,MAAM,CAAC,WAAW,CACnB,+BAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI;QACJ,wCAAe,CAAC,iBAAiB;KAClC,CAAC,CACH;CACF,CAAC","sourcesContent":["import { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport { PERPS_DEPOSIT_TYPES } from '../../constants';\nimport type { RelayStatus } from './types';\n\nexport const FALLBACK_HASH = '0x0' as Hex;\n\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_AUTHORIZE_URL = `${RELAY_URL_BASE}/authorize`;\nexport const RELAY_EXECUTE_URL = `${RELAY_URL_BASE}/execute`;\nexport const RELAY_QUOTE_URL = `${RELAY_URL_BASE}/quote`;\nexport const RELAY_STATUS_URL = `${RELAY_URL_BASE}/intents/status/v3`;\nexport const HYPERLIQUID_URL_BASE = 'https://api.hyperliquid.xyz';\nexport const HYPERLIQUID_INFO_URL = `${HYPERLIQUID_URL_BASE}/info`;\nexport const HYPERLIQUID_EXCHANGE_URL = `${HYPERLIQUID_URL_BASE}/exchange`;\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\nexport const TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';\n\nexport const RELAY_FAILURE_STATUSES: RelayStatus[] = [\n 'failure',\n 'refund',\n 'refunded',\n];\n\nexport const RELAY_PENDING_STATUSES: RelayStatus[] = [\n 'delayed',\n 'depositing',\n 'pending',\n 'submitted',\n 'waiting',\n];\n\nexport const RELAY_DEPOSIT_TYPES: Record<string, TransactionType> = {\n [TransactionType.musdConversion]: TransactionType.musdRelayDeposit,\n [TransactionType.predictDeposit]: TransactionType.predictRelayDeposit,\n ...Object.fromEntries(\n PERPS_DEPOSIT_TYPES.map((type) => [\n type,\n TransactionType.perpsRelayDeposit,\n ]),\n ),\n};\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TransactionType } from "@metamask/transaction-controller";
|
|
2
2
|
import type { RelayStatus } from "./types.cjs";
|
|
3
|
+
export declare const FALLBACK_HASH: `0x${string}`;
|
|
3
4
|
export declare const RELAY_URL_BASE = "https://api.relay.link";
|
|
4
5
|
export declare const RELAY_AUTHORIZE_URL = "https://api.relay.link/authorize";
|
|
5
6
|
export declare const RELAY_EXECUTE_URL = "https://api.relay.link/execute";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yCAAyC;
|
|
1
|
+
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yCAAyC;AAInE,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAE3C,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,mBAAmB,qCAAgC,CAAC;AACjE,eAAO,MAAM,iBAAiB,mCAA8B,CAAC;AAC7D,eAAO,MAAM,eAAe,iCAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,6CAAwC,CAAC;AACtE,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,qCAAiC,CAAC;AACnE,eAAO,MAAM,wBAAwB,yCAAqC,CAAC;AAC3E,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,wBAAwB,eAAe,CAAC;AAErD,eAAO,MAAM,sBAAsB,EAAE,WAAW,EAI/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,WAAW,EAM/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAS/D,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TransactionType } from "@metamask/transaction-controller";
|
|
2
2
|
import type { RelayStatus } from "./types.mjs";
|
|
3
|
+
export declare const FALLBACK_HASH: `0x${string}`;
|
|
3
4
|
export declare const RELAY_URL_BASE = "https://api.relay.link";
|
|
4
5
|
export declare const RELAY_AUTHORIZE_URL = "https://api.relay.link/authorize";
|
|
5
6
|
export declare const RELAY_EXECUTE_URL = "https://api.relay.link/execute";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yCAAyC;
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yCAAyC;AAInE,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAE3C,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,mBAAmB,qCAAgC,CAAC;AACjE,eAAO,MAAM,iBAAiB,mCAA8B,CAAC;AAC7D,eAAO,MAAM,eAAe,iCAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,6CAAwC,CAAC;AACtE,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,qCAAiC,CAAC;AACnE,eAAO,MAAM,wBAAwB,yCAAqC,CAAC;AAC3E,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,wBAAwB,eAAe,CAAC;AAErD,eAAO,MAAM,sBAAsB,EAAE,WAAW,EAI/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,WAAW,EAM/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAS/D,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TransactionType } from "@metamask/transaction-controller";
|
|
2
2
|
import { PERPS_DEPOSIT_TYPES } from "../../constants.mjs";
|
|
3
|
+
export const FALLBACK_HASH = '0x0';
|
|
3
4
|
export const RELAY_URL_BASE = 'https://api.relay.link';
|
|
4
5
|
export const RELAY_AUTHORIZE_URL = `${RELAY_URL_BASE}/authorize`;
|
|
5
6
|
export const RELAY_EXECUTE_URL = `${RELAY_URL_BASE}/execute`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yCAAyC;
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yCAAyC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,4BAAwB;AAGtD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAY,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,cAAc,YAAY,CAAC;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,cAAc,UAAU,CAAC;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,cAAc,QAAQ,CAAC;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,cAAc,oBAAoB,CAAC;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,oBAAoB,OAAO,CAAC;AACnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,oBAAoB,WAAW,CAAC;AAC3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW;AACvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC;AAErD,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,SAAS;IACT,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,SAAS;IACT,YAAY;IACZ,SAAS;IACT,WAAW;IACX,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAoC;IAClE,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB;IAClE,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC,mBAAmB;IACrE,GAAG,MAAM,CAAC,WAAW,CACnB,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI;QACJ,eAAe,CAAC,iBAAiB;KAClC,CAAC,CACH;CACF,CAAC","sourcesContent":["import { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport { PERPS_DEPOSIT_TYPES } from '../../constants';\nimport type { RelayStatus } from './types';\n\nexport const FALLBACK_HASH = '0x0' as Hex;\n\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_AUTHORIZE_URL = `${RELAY_URL_BASE}/authorize`;\nexport const RELAY_EXECUTE_URL = `${RELAY_URL_BASE}/execute`;\nexport const RELAY_QUOTE_URL = `${RELAY_URL_BASE}/quote`;\nexport const RELAY_STATUS_URL = `${RELAY_URL_BASE}/intents/status/v3`;\nexport const HYPERLIQUID_URL_BASE = 'https://api.hyperliquid.xyz';\nexport const HYPERLIQUID_INFO_URL = `${HYPERLIQUID_URL_BASE}/info`;\nexport const HYPERLIQUID_EXCHANGE_URL = `${HYPERLIQUID_URL_BASE}/exchange`;\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\nexport const TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';\n\nexport const RELAY_FAILURE_STATUSES: RelayStatus[] = [\n 'failure',\n 'refund',\n 'refunded',\n];\n\nexport const RELAY_PENDING_STATUSES: RelayStatus[] = [\n 'delayed',\n 'depositing',\n 'pending',\n 'submitted',\n 'waiting',\n];\n\nexport const RELAY_DEPOSIT_TYPES: Record<string, TransactionType> = {\n [TransactionType.musdConversion]: TransactionType.musdRelayDeposit,\n [TransactionType.predictDeposit]: TransactionType.predictRelayDeposit,\n ...Object.fromEntries(\n PERPS_DEPOSIT_TYPES.map((type) => [\n type,\n TransactionType.perpsRelayDeposit,\n ]),\n ),\n};\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.submitPostRelayVaultDeposit = void 0;
|
|
4
|
+
const utils_1 = require("@metamask/utils");
|
|
5
|
+
const logger_1 = require("../../logger.cjs");
|
|
6
|
+
const ma_vault_deposit_1 = require("../../utils/ma-vault-deposit.cjs");
|
|
7
|
+
const transaction_1 = require("../../utils/transaction.cjs");
|
|
8
|
+
const constants_1 = require("../fiat/constants.cjs");
|
|
9
|
+
const constants_2 = require("./constants.cjs");
|
|
10
|
+
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'relay-post-ma-vault');
|
|
11
|
+
/**
|
|
12
|
+
* Runs the Money Account vault deposit after a max-amount Relay bridge has
|
|
13
|
+
* settled mUSD into the Money Account. Resolves the actually-settled amount,
|
|
14
|
+
* then delegates to the shared `submitMoneyAccountVaultDeposit` util.
|
|
15
|
+
*
|
|
16
|
+
* @param options - Submit options.
|
|
17
|
+
* @param options.completion - Outcome of `waitForRelayCompletion`.
|
|
18
|
+
* @param options.messenger - Controller messenger.
|
|
19
|
+
* @param options.quote - The Relay quote that was submitted.
|
|
20
|
+
* @param options.transaction - Original Money Account transaction meta.
|
|
21
|
+
* @returns Hash of the final submitted child transaction, if available.
|
|
22
|
+
*/
|
|
23
|
+
async function submitPostRelayVaultDeposit({ completion, messenger, quote, transaction, }) {
|
|
24
|
+
const sourceAmountRaw = await resolvePostRelayAmount({
|
|
25
|
+
completion,
|
|
26
|
+
messenger,
|
|
27
|
+
quote,
|
|
28
|
+
transaction,
|
|
29
|
+
});
|
|
30
|
+
log('Submitting post-Relay vault deposit', {
|
|
31
|
+
sourceAmountRaw,
|
|
32
|
+
targetHash: completion.targetHash,
|
|
33
|
+
transactionId: transaction.id,
|
|
34
|
+
});
|
|
35
|
+
return (0, ma_vault_deposit_1.submitMoneyAccountVaultDeposit)({
|
|
36
|
+
messenger,
|
|
37
|
+
sourceAmountRaw,
|
|
38
|
+
transaction,
|
|
39
|
+
// This is intentionally set to false, turning this on will leverage
|
|
40
|
+
// CHOMP usage for vault deposits.
|
|
41
|
+
vaultDisabled: false,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
exports.submitPostRelayVaultDeposit = submitPostRelayVaultDeposit;
|
|
45
|
+
/**
|
|
46
|
+
* Resolves the actual mUSD amount that landed in the Money Account after a
|
|
47
|
+
* Relay bridge to Monad. Prefers the on-chain Transfer log on
|
|
48
|
+
* `completion.targetHash`; falls back to the Relay quote's minimum output
|
|
49
|
+
* when the target hash is the same-chain `FALLBACK_HASH` placeholder or the
|
|
50
|
+
* on-chain read fails.
|
|
51
|
+
*
|
|
52
|
+
* @param options - Resolution options.
|
|
53
|
+
* @param options.completion - Outcome of `waitForRelayCompletion`.
|
|
54
|
+
* @param options.messenger - Controller messenger.
|
|
55
|
+
* @param options.quote - The Relay quote that was submitted.
|
|
56
|
+
* @param options.transaction - Original Money Account transaction meta.
|
|
57
|
+
* @returns The raw (atomic) settled mUSD amount as a decimal string.
|
|
58
|
+
*/
|
|
59
|
+
async function resolvePostRelayAmount({ completion, messenger, quote, transaction, }) {
|
|
60
|
+
const moneyAccountAddress = (quote.request.recipient ??
|
|
61
|
+
quote.request.from ??
|
|
62
|
+
transaction.txParams.from);
|
|
63
|
+
if (moneyAccountAddress &&
|
|
64
|
+
completion.targetHash &&
|
|
65
|
+
completion.targetHash !== constants_2.FALLBACK_HASH) {
|
|
66
|
+
try {
|
|
67
|
+
const { amountRaw: onChainAmount } = await (0, transaction_1.getTransferredAmountFromTxHash)({
|
|
68
|
+
messenger,
|
|
69
|
+
txHash: completion.targetHash,
|
|
70
|
+
chainId: constants_1.MUSD_MONAD_FIAT_ASSET.chainId,
|
|
71
|
+
tokenAddress: constants_1.MUSD_MONAD_FIAT_ASSET.address,
|
|
72
|
+
walletAddress: moneyAccountAddress,
|
|
73
|
+
});
|
|
74
|
+
if (onChainAmount) {
|
|
75
|
+
log('Resolved post-Relay amount from on-chain transaction', {
|
|
76
|
+
targetHash: completion.targetHash,
|
|
77
|
+
onChainAmount,
|
|
78
|
+
});
|
|
79
|
+
return onChainAmount;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
log('Failed to read on-chain amount, falling back to quote minimum output', { targetHash: completion.targetHash, error });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const fallback = quote.original.details.currencyOut.minimumAmount;
|
|
87
|
+
if (!fallback) {
|
|
88
|
+
throw new Error('Cannot resolve post-Relay vault deposit amount');
|
|
89
|
+
}
|
|
90
|
+
log('Resolved post-Relay amount from quote minimum output', {
|
|
91
|
+
fallback,
|
|
92
|
+
targetHash: completion.targetHash,
|
|
93
|
+
});
|
|
94
|
+
return fallback;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=relay-post-ma-vault.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-post-ma-vault.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-post-ma-vault.ts"],"names":[],"mappings":";;;AAEA,2CAAqD;AAErD,6CAA6C;AAK7C,uEAA8E;AAC9E,6DAAyE;AACzE,qDAA0D;AAC1D,+CAA4C;AAG5C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,qBAAqB,CAAC,CAAC;AAErE;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,2BAA2B,CAAC,EAChD,UAAU,EACV,SAAS,EACT,KAAK,EACL,WAAW,GAMZ;IACC,MAAM,eAAe,GAAG,MAAM,sBAAsB,CAAC;QACnD,UAAU;QACV,SAAS;QACT,KAAK;QACL,WAAW;KACZ,CAAC,CAAC;IAEH,GAAG,CAAC,qCAAqC,EAAE;QACzC,eAAe;QACf,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,aAAa,EAAE,WAAW,CAAC,EAAE;KAC9B,CAAC,CAAC;IAEH,OAAO,IAAA,iDAA8B,EAAC;QACpC,SAAS;QACT,eAAe;QACf,WAAW;QACX,oEAAoE;QACpE,kCAAkC;QAClC,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;AACL,CAAC;AAhCD,kEAgCC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,sBAAsB,CAAC,EACpC,UAAU,EACV,SAAS,EACT,KAAK,EACL,WAAW,GAMZ;IACC,MAAM,mBAAmB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS;QAClD,KAAK,CAAC,OAAO,CAAC,IAAI;QAClB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAoB,CAAC;IAEhD,IACE,mBAAmB;QACnB,UAAU,CAAC,UAAU;QACrB,UAAU,CAAC,UAAU,KAAK,yBAAa,EACvC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,IAAA,4CAA8B,EACvE;gBACE,SAAS;gBACT,MAAM,EAAE,UAAU,CAAC,UAAU;gBAC7B,OAAO,EAAE,iCAAqB,CAAC,OAAO;gBACtC,YAAY,EAAE,iCAAqB,CAAC,OAAO;gBAC3C,aAAa,EAAE,mBAAmB;aACnC,CACF,CAAC;YAEF,IAAI,aAAa,EAAE,CAAC;gBAClB,GAAG,CAAC,sDAAsD,EAAE;oBAC1D,UAAU,EAAE,UAAU,CAAC,UAAU;oBACjC,aAAa;iBACd,CAAC,CAAC;gBACH,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CACD,sEAAsE,EACtE,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,CAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC;IAElE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,GAAG,CAAC,sDAAsD,EAAE;QAC1D,QAAQ;QACR,UAAU,EAAE,UAAU,CAAC,UAAU;KAClC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { submitMoneyAccountVaultDeposit } from '../../utils/ma-vault-deposit';\nimport { getTransferredAmountFromTxHash } from '../../utils/transaction';\nimport { MUSD_MONAD_FIAT_ASSET } from '../fiat/constants';\nimport { FALLBACK_HASH } from './constants';\nimport type { RelayCompletionOutcome, RelayQuote } from './types';\n\nconst log = createModuleLogger(projectLogger, 'relay-post-ma-vault');\n\n/**\n * Runs the Money Account vault deposit after a max-amount Relay bridge has\n * settled mUSD into the Money Account. Resolves the actually-settled amount,\n * then delegates to the shared `submitMoneyAccountVaultDeposit` util.\n *\n * @param options - Submit options.\n * @param options.completion - Outcome of `waitForRelayCompletion`.\n * @param options.messenger - Controller messenger.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.transaction - Original Money Account transaction meta.\n * @returns Hash of the final submitted child transaction, if available.\n */\nexport async function submitPostRelayVaultDeposit({\n completion,\n messenger,\n quote,\n transaction,\n}: {\n completion: RelayCompletionOutcome;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): Promise<{ transactionHash?: Hex }> {\n const sourceAmountRaw = await resolvePostRelayAmount({\n completion,\n messenger,\n quote,\n transaction,\n });\n\n log('Submitting post-Relay vault deposit', {\n sourceAmountRaw,\n targetHash: completion.targetHash,\n transactionId: transaction.id,\n });\n\n return submitMoneyAccountVaultDeposit({\n messenger,\n sourceAmountRaw,\n transaction,\n // This is intentionally set to false, turning this on will leverage\n // CHOMP usage for vault deposits.\n vaultDisabled: false,\n });\n}\n\n/**\n * Resolves the actual mUSD amount that landed in the Money Account after a\n * Relay bridge to Monad. Prefers the on-chain Transfer log on\n * `completion.targetHash`; falls back to the Relay quote's minimum output\n * when the target hash is the same-chain `FALLBACK_HASH` placeholder or the\n * on-chain read fails.\n *\n * @param options - Resolution options.\n * @param options.completion - Outcome of `waitForRelayCompletion`.\n * @param options.messenger - Controller messenger.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.transaction - Original Money Account transaction meta.\n * @returns The raw (atomic) settled mUSD amount as a decimal string.\n */\nasync function resolvePostRelayAmount({\n completion,\n messenger,\n quote,\n transaction,\n}: {\n completion: RelayCompletionOutcome;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): Promise<string> {\n const moneyAccountAddress = (quote.request.recipient ??\n quote.request.from ??\n transaction.txParams.from) as Hex | undefined;\n\n if (\n moneyAccountAddress &&\n completion.targetHash &&\n completion.targetHash !== FALLBACK_HASH\n ) {\n try {\n const { amountRaw: onChainAmount } = await getTransferredAmountFromTxHash(\n {\n messenger,\n txHash: completion.targetHash,\n chainId: MUSD_MONAD_FIAT_ASSET.chainId,\n tokenAddress: MUSD_MONAD_FIAT_ASSET.address,\n walletAddress: moneyAccountAddress,\n },\n );\n\n if (onChainAmount) {\n log('Resolved post-Relay amount from on-chain transaction', {\n targetHash: completion.targetHash,\n onChainAmount,\n });\n return onChainAmount;\n }\n } catch (error) {\n log(\n 'Failed to read on-chain amount, falling back to quote minimum output',\n { targetHash: completion.targetHash, error },\n );\n }\n }\n\n const fallback = quote.original.details.currencyOut.minimumAmount;\n\n if (!fallback) {\n throw new Error('Cannot resolve post-Relay vault deposit amount');\n }\n\n log('Resolved post-Relay amount from quote minimum output', {\n fallback,\n targetHash: completion.targetHash,\n });\n\n return fallback;\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
2
|
+
import type { Hex } from "@metamask/utils";
|
|
3
|
+
import type { TransactionPayControllerMessenger, TransactionPayQuote } from "../../types.cjs";
|
|
4
|
+
import type { RelayCompletionOutcome, RelayQuote } from "./types.cjs";
|
|
5
|
+
/**
|
|
6
|
+
* Runs the Money Account vault deposit after a max-amount Relay bridge has
|
|
7
|
+
* settled mUSD into the Money Account. Resolves the actually-settled amount,
|
|
8
|
+
* then delegates to the shared `submitMoneyAccountVaultDeposit` util.
|
|
9
|
+
*
|
|
10
|
+
* @param options - Submit options.
|
|
11
|
+
* @param options.completion - Outcome of `waitForRelayCompletion`.
|
|
12
|
+
* @param options.messenger - Controller messenger.
|
|
13
|
+
* @param options.quote - The Relay quote that was submitted.
|
|
14
|
+
* @param options.transaction - Original Money Account transaction meta.
|
|
15
|
+
* @returns Hash of the final submitted child transaction, if available.
|
|
16
|
+
*/
|
|
17
|
+
export declare function submitPostRelayVaultDeposit({ completion, messenger, quote, transaction, }: {
|
|
18
|
+
completion: RelayCompletionOutcome;
|
|
19
|
+
messenger: TransactionPayControllerMessenger;
|
|
20
|
+
quote: TransactionPayQuote<RelayQuote>;
|
|
21
|
+
transaction: TransactionMeta;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
transactionHash?: Hex;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=relay-post-ma-vault.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-post-ma-vault.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-post-ma-vault.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAKrB,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,oBAAgB;AAIlE;;;;;;;;;;;GAWG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,UAAU,EACV,SAAS,EACT,KAAK,EACL,WAAW,GACZ,EAAE;IACD,UAAU,EAAE,sBAAsB,CAAC;IACnC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAsBrC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TransactionMeta } from "@metamask/transaction-controller";
|
|
2
|
+
import type { Hex } from "@metamask/utils";
|
|
3
|
+
import type { TransactionPayControllerMessenger, TransactionPayQuote } from "../../types.mjs";
|
|
4
|
+
import type { RelayCompletionOutcome, RelayQuote } from "./types.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* Runs the Money Account vault deposit after a max-amount Relay bridge has
|
|
7
|
+
* settled mUSD into the Money Account. Resolves the actually-settled amount,
|
|
8
|
+
* then delegates to the shared `submitMoneyAccountVaultDeposit` util.
|
|
9
|
+
*
|
|
10
|
+
* @param options - Submit options.
|
|
11
|
+
* @param options.completion - Outcome of `waitForRelayCompletion`.
|
|
12
|
+
* @param options.messenger - Controller messenger.
|
|
13
|
+
* @param options.quote - The Relay quote that was submitted.
|
|
14
|
+
* @param options.transaction - Original Money Account transaction meta.
|
|
15
|
+
* @returns Hash of the final submitted child transaction, if available.
|
|
16
|
+
*/
|
|
17
|
+
export declare function submitPostRelayVaultDeposit({ completion, messenger, quote, transaction, }: {
|
|
18
|
+
completion: RelayCompletionOutcome;
|
|
19
|
+
messenger: TransactionPayControllerMessenger;
|
|
20
|
+
quote: TransactionPayQuote<RelayQuote>;
|
|
21
|
+
transaction: TransactionMeta;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
transactionHash?: Hex;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=relay-post-ma-vault.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-post-ma-vault.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-post-ma-vault.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAKrB,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,oBAAgB;AAIlE;;;;;;;;;;;GAWG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,UAAU,EACV,SAAS,EACT,KAAK,EACL,WAAW,GACZ,EAAE;IACD,UAAU,EAAE,sBAAsB,CAAC;IACnC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAsBrC"}
|