@metamask-previews/transaction-pay-controller 26.3.0-preview-e81fe8853 → 26.3.0-preview-6b4bcdab3
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 +10 -4
- package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
- package/dist/TransactionPayController-method-action-types.d.cts +31 -1
- package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
- package/dist/TransactionPayController-method-action-types.d.mts +31 -1
- package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
- package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
- package/dist/TransactionPayController.cjs +74 -2
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.d.cts +29 -0
- package/dist/TransactionPayController.d.cts.map +1 -1
- package/dist/TransactionPayController.d.mts +29 -0
- package/dist/TransactionPayController.d.mts.map +1 -1
- package/dist/TransactionPayController.mjs +74 -2
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.cjs +3 -0
- package/dist/strategy/fiat/FiatStrategy.cjs.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.d.cts.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.d.mts.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.mjs +3 -0
- package/dist/strategy/fiat/FiatStrategy.mjs.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.cjs.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.cts +2 -3
- package/dist/strategy/fiat/fiat-direct-musd.d.cts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.mts +2 -3
- package/dist/strategy/fiat/fiat-direct-musd.d.mts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.mjs.map +1 -1
- package/dist/strategy/fiat/fiat-submit.cjs +3 -0
- package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
- package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
- package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
- package/dist/strategy/fiat/fiat-submit.mjs +3 -0
- package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
- package/dist/tests/messenger-mock.cjs +3 -0
- package/dist/tests/messenger-mock.cjs.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/tests/messenger-mock.mjs +3 -0
- package/dist/tests/messenger-mock.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +11 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +11 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/chomp.cjs +37 -5
- package/dist/utils/chomp.cjs.map +1 -1
- package/dist/utils/chomp.d.cts +15 -1
- package/dist/utils/chomp.d.cts.map +1 -1
- package/dist/utils/chomp.d.mts +15 -1
- package/dist/utils/chomp.d.mts.map +1 -1
- package/dist/utils/chomp.mjs +37 -5
- package/dist/utils/chomp.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +2 -2
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +1 -1
- package/dist/utils/feature-flags.d.mts +1 -1
- package/dist/utils/feature-flags.mjs +2 -2
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/ma-vault-deposit.cjs +58 -16
- package/dist/utils/ma-vault-deposit.cjs.map +1 -1
- package/dist/utils/ma-vault-deposit.d.cts +33 -5
- package/dist/utils/ma-vault-deposit.d.cts.map +1 -1
- package/dist/utils/ma-vault-deposit.d.mts +33 -5
- package/dist/utils/ma-vault-deposit.d.mts.map +1 -1
- package/dist/utils/ma-vault-deposit.mjs +55 -14
- package/dist/utils/ma-vault-deposit.mjs.map +1 -1
- package/dist/utils/ma-vault-payout.cjs +57 -0
- package/dist/utils/ma-vault-payout.cjs.map +1 -0
- package/dist/utils/ma-vault-payout.d.cts +18 -0
- package/dist/utils/ma-vault-payout.d.cts.map +1 -0
- package/dist/utils/ma-vault-payout.d.mts +18 -0
- package/dist/utils/ma-vault-payout.d.mts.map +1 -0
- package/dist/utils/ma-vault-payout.mjs +53 -0
- package/dist/utils/ma-vault-payout.mjs.map +1 -0
- package/dist/utils/ma-vault-withdraw.cjs +80 -0
- package/dist/utils/ma-vault-withdraw.cjs.map +1 -0
- package/dist/utils/ma-vault-withdraw.d.cts +22 -0
- package/dist/utils/ma-vault-withdraw.d.cts.map +1 -0
- package/dist/utils/ma-vault-withdraw.d.mts +22 -0
- package/dist/utils/ma-vault-withdraw.d.mts.map +1 -0
- package/dist/utils/ma-vault-withdraw.mjs +76 -0
- package/dist/utils/ma-vault-withdraw.mjs.map +1 -0
- package/dist/utils/money-account-vault-config.cjs +62 -0
- package/dist/utils/money-account-vault-config.cjs.map +1 -0
- package/dist/utils/money-account-vault-config.d.cts +27 -0
- package/dist/utils/money-account-vault-config.d.cts.map +1 -0
- package/dist/utils/money-account-vault-config.d.mts +27 -0
- package/dist/utils/money-account-vault-config.d.mts.map +1 -0
- package/dist/utils/money-account-vault-config.mjs +57 -0
- package/dist/utils/money-account-vault-config.mjs.map +1 -0
- package/package.json +4 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.submitMoneyAccountVaultDeposit = exports.VAULT_ERROR_PREFIX = void 0;
|
|
3
|
+
exports.submitMoneyAccountVaultDepositBatch = exports.submitMoneyAccountVaultDeposit = exports.VAULT_ERROR_PREFIX = void 0;
|
|
4
4
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
5
|
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
6
6
|
const utils_1 = require("@metamask/utils");
|
|
@@ -8,6 +8,7 @@ const logger_js_1 = require("../logger.cjs");
|
|
|
8
8
|
const constants_js_1 = require("../strategy/fiat/constants.cjs");
|
|
9
9
|
const chomp_js_1 = require("./chomp.cjs");
|
|
10
10
|
const error_prefix_js_1 = require("./error-prefix.cjs");
|
|
11
|
+
const money_account_vault_config_js_1 = require("./money-account-vault-config.cjs");
|
|
11
12
|
const provider_js_1 = require("./provider.cjs");
|
|
12
13
|
const transaction_js_1 = require("./transaction.cjs");
|
|
13
14
|
const log = (0, utils_1.createModuleLogger)(logger_js_1.projectLogger, 'ma-vault-deposit');
|
|
@@ -34,7 +35,8 @@ exports.VAULT_ERROR_PREFIX = 'Vault: ';
|
|
|
34
35
|
* @param options.transaction - Original Money Account transaction meta.
|
|
35
36
|
* @param options.vaultDisabled - When `true`, skip the vault batch and leave
|
|
36
37
|
* the settled mUSD in the Money Account. Caller-evaluated kill-switch.
|
|
37
|
-
* @returns Hash of the final submitted child transaction,
|
|
38
|
+
* @returns Hash of the final submitted child transaction, or `{ skipped: true }`
|
|
39
|
+
* when vaulting is disabled.
|
|
38
40
|
*/
|
|
39
41
|
async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccountAddress: moneyAccountAddressOverride, depositCalls, sourceAmountRaw, transaction, vaultDisabled, }) {
|
|
40
42
|
const transactionId = transaction.id;
|
|
@@ -49,7 +51,7 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
49
51
|
sourceAmountRaw,
|
|
50
52
|
transactionId,
|
|
51
53
|
});
|
|
52
|
-
return {
|
|
54
|
+
return { skipped: true };
|
|
53
55
|
}
|
|
54
56
|
const nestedTransactions = await resolveVaultDepositBatch({
|
|
55
57
|
depositCalls,
|
|
@@ -58,6 +60,42 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
58
60
|
transaction,
|
|
59
61
|
transactionId,
|
|
60
62
|
});
|
|
63
|
+
return await submitMoneyAccountVaultDepositBatch({
|
|
64
|
+
depositCalls: nestedTransactions,
|
|
65
|
+
fromBlock,
|
|
66
|
+
messenger,
|
|
67
|
+
moneyAccountAddress,
|
|
68
|
+
sourceAmountRaw,
|
|
69
|
+
transactionId,
|
|
70
|
+
vaultDisabled: false,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
exports.submitMoneyAccountVaultDeposit = submitMoneyAccountVaultDeposit;
|
|
74
|
+
/**
|
|
75
|
+
* Submits pre-built Money Account vault calls without requiring a parent
|
|
76
|
+
* transaction. When `transactionId` is supplied, submitted child IDs are also
|
|
77
|
+
* linked to that parent for the existing Fiat and Relay flows.
|
|
78
|
+
*
|
|
79
|
+
* @param options - Submission options.
|
|
80
|
+
* @param options.depositCalls - Pre-built approve and deposit calls.
|
|
81
|
+
* @param options.fromBlock - Block at which to begin the CHOMP race check.
|
|
82
|
+
* @param options.messenger - Transaction Pay controller messenger.
|
|
83
|
+
* @param options.moneyAccountAddress - Money Account that owns the mUSD.
|
|
84
|
+
* @param options.sourceAmountRaw - Raw mUSD amount to deposit.
|
|
85
|
+
* @param options.transactionId - Optional parent transaction to link children.
|
|
86
|
+
* @param options.vaultDisabled - Whether vault submission is disabled.
|
|
87
|
+
* @returns Hash of the final confirmed vault transaction, or `{ skipped: true }`
|
|
88
|
+
* when vaulting is disabled.
|
|
89
|
+
*/
|
|
90
|
+
async function submitMoneyAccountVaultDepositBatch({ depositCalls, fromBlock, messenger, moneyAccountAddress, sourceAmountRaw, transactionId, vaultDisabled, }) {
|
|
91
|
+
if (vaultDisabled) {
|
|
92
|
+
log('Skipping vault deposit because vaultDisabled is true', {
|
|
93
|
+
moneyAccountAddress,
|
|
94
|
+
sourceAmountRaw,
|
|
95
|
+
transactionId,
|
|
96
|
+
});
|
|
97
|
+
return { skipped: true };
|
|
98
|
+
}
|
|
61
99
|
// CHOMP pre-check: skip addTransactionBatch entirely if CHOMP has already
|
|
62
100
|
// auto-vaulted the funds during or before the checkout window.
|
|
63
101
|
const preChompHash = await tryFindChompDeposit({
|
|
@@ -74,18 +112,20 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
74
112
|
const transactionIds = [];
|
|
75
113
|
const { end } = (0, transaction_js_1.collectTransactionIds)(constants_js_1.MUSD_MONAD_FIAT_ASSET.chainId, moneyAccountAddress, messenger, (id) => {
|
|
76
114
|
transactionIds.push(id);
|
|
77
|
-
(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
115
|
+
if (transactionId) {
|
|
116
|
+
(0, transaction_js_1.updateTransaction)({
|
|
117
|
+
transactionId,
|
|
118
|
+
messenger,
|
|
119
|
+
note: 'Add required transaction ID from Money Account vault submission',
|
|
120
|
+
}, (tx) => {
|
|
121
|
+
tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
|
|
122
|
+
tx.requiredTransactionIds.push(id);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
85
125
|
});
|
|
86
126
|
log('Submitting Money Account vault deposit', {
|
|
87
127
|
moneyAccountAddress,
|
|
88
|
-
nestedTransactionCount:
|
|
128
|
+
nestedTransactionCount: depositCalls.length,
|
|
89
129
|
networkClientId,
|
|
90
130
|
sourceAmountRaw,
|
|
91
131
|
transactionId,
|
|
@@ -102,7 +142,7 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
102
142
|
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
103
143
|
requireApproval: false,
|
|
104
144
|
skipInitialGasEstimate: true,
|
|
105
|
-
transactions:
|
|
145
|
+
transactions: depositCalls.map((nestedTransaction, index) => ({
|
|
106
146
|
params: {
|
|
107
147
|
data: nestedTransaction.data,
|
|
108
148
|
to: nestedTransaction.to,
|
|
@@ -134,7 +174,7 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
134
174
|
}
|
|
135
175
|
log('Submitted Money Account vault deposit', {
|
|
136
176
|
moneyAccountAddress,
|
|
137
|
-
nestedTransactionCount:
|
|
177
|
+
nestedTransactionCount: depositCalls.length,
|
|
138
178
|
networkClientId,
|
|
139
179
|
sourceAmountRaw,
|
|
140
180
|
transactionId,
|
|
@@ -151,7 +191,7 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
151
191
|
log('Confirmed Money Account vault deposit', {
|
|
152
192
|
hash,
|
|
153
193
|
moneyAccountAddress,
|
|
154
|
-
nestedTransactionCount:
|
|
194
|
+
nestedTransactionCount: depositCalls.length,
|
|
155
195
|
networkClientId,
|
|
156
196
|
sourceAmountRaw,
|
|
157
197
|
transactionId,
|
|
@@ -159,7 +199,7 @@ async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccou
|
|
|
159
199
|
});
|
|
160
200
|
return { transactionHash: hash };
|
|
161
201
|
}
|
|
162
|
-
exports.
|
|
202
|
+
exports.submitMoneyAccountVaultDepositBatch = submitMoneyAccountVaultDepositBatch;
|
|
163
203
|
/**
|
|
164
204
|
* Resolves the vault-deposit batch (approve + teller deposit) to submit.
|
|
165
205
|
*
|
|
@@ -219,11 +259,13 @@ async function tryFindChompDeposit({ fromBlock, messenger, moneyAccountAddress,
|
|
|
219
259
|
return undefined;
|
|
220
260
|
}
|
|
221
261
|
try {
|
|
262
|
+
const { boringVault } = (0, money_account_vault_config_js_1.getMoneyAccountVaultConfig)(messenger);
|
|
222
263
|
return await (0, chomp_js_1.findRecentChompVaultDeposit)({
|
|
223
264
|
fromBlock,
|
|
224
265
|
messenger,
|
|
225
266
|
moneyAccountAddress,
|
|
226
267
|
sourceAmountRaw,
|
|
268
|
+
vaultAddress: boringVault,
|
|
227
269
|
});
|
|
228
270
|
}
|
|
229
271
|
catch (chompError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ma-vault-deposit.cjs","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type {\n BatchTransactionParams,\n NestedTransactionMetadata,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport { MUSD_MONAD_FIAT_ASSET } from '../strategy/fiat/constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport { findRecentChompVaultDeposit } from './chomp.js';\nimport { prefixError } from './error-prefix.js';\nimport { getNetworkClientId } from './provider.js';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from './transaction.js';\n\nconst log = createModuleLogger(projectLogger, 'ma-vault-deposit');\n\nexport const VAULT_ERROR_PREFIX = 'Vault: ';\n\n/**\n * Submits a Money Account mUSD vault deposit batch on Monad once the source\n * mUSD has settled in the Money Account (fiat on-ramp, Relay bridge, or any\n * other path). Re-encodes the original nested vault calldata with the\n * settled `sourceAmountRaw` via `getAmountData` and submits as a sponsored,\n * internal EIP-7702 batch. Callers decide whether to honour any vault\n * kill-switch by passing `vaultDisabled`.\n *\n * @param options - Submit options.\n * @param options.fromBlock - Block number to start searching for CHOMP deposits.\n * @param options.messenger - Controller messenger.\n * @param options.moneyAccountAddress - Money Account address sending the vault\n * deposit. Defaults to `transaction.txParams.from` (the deposit-flow sender);\n * withdraw flows pass it explicitly since their `from` is the funding EOA.\n * @param options.depositCalls - Pre-built vault-deposit batch for withdraw\n * flows, whose parent transaction carries no vault calls. When omitted the\n * batch is derived from the transaction's own nested calls re-encoded via\n * `getAmountData`.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.vaultDisabled - When `true`, skip the vault batch and leave\n * the settled mUSD in the Money Account. Caller-evaluated kill-switch.\n * @returns Hash of the final submitted child transaction, if available.\n */\nexport async function submitMoneyAccountVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress: moneyAccountAddressOverride,\n depositCalls,\n sourceAmountRaw,\n transaction,\n vaultDisabled,\n}: {\n fromBlock?: Hex;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress?: Hex;\n depositCalls?: BatchTransactionParams[];\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n vaultDisabled: boolean;\n}): Promise<{ transactionHash?: Hex }> {\n const transactionId = transaction.id;\n const moneyAccountAddress = (moneyAccountAddressOverride ??\n transaction.txParams.from) as Hex | undefined;\n\n if (!moneyAccountAddress) {\n throw new Error('Missing Money Account address');\n }\n\n if (vaultDisabled) {\n log('Skipping vault deposit because vaultDisabled is true', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { transactionHash: '0x' };\n }\n\n const nestedTransactions = await resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\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 Money Account vault submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(id);\n },\n );\n },\n );\n\n log('Submitting Money Account 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 Money Account 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 Money Account 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\n/**\n * Resolves the vault-deposit batch (approve + teller deposit) to submit.\n *\n * Withdraw flows have no vault calls on their own nested transactions, so the\n * caller supplies a freshly built `depositCalls` batch. Deposit flows re-encode\n * their existing nested vault calldata with the settled amount via\n * `getAmountData` and also mutate the parent transaction so its stored calls\n * and `requiredAssets` reflect the settled amount.\n *\n * @param options - Resolution options.\n * @param options.depositCalls - Pre-built deposit batch for withdraw flows.\n * @param options.messenger - Controller messenger.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.transactionId - ID of the original transaction.\n * @returns Nested transactions to submit as the vault deposit batch.\n */\nasync function resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\n}: {\n depositCalls?: BatchTransactionParams[];\n messenger: TransactionPayControllerMessenger;\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n transactionId: string;\n}): Promise<NestedTransactionMetadata[]> {\n if (depositCalls?.length) {\n return depositCalls;\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: 'Money Account vault deposit: 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 return nestedTransactions;\n}\n\nasync function tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n}: {\n fromBlock: Hex | undefined;\n messenger: TransactionPayControllerMessenger;\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":"ma-vault-deposit.cjs","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type {\n BatchTransactionParams,\n NestedTransactionMetadata,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport { MUSD_MONAD_FIAT_ASSET } from '../strategy/fiat/constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport { findRecentChompVaultDeposit } from './chomp.js';\nimport { prefixError } from './error-prefix.js';\nimport { getMoneyAccountVaultConfig } from './money-account-vault-config.js';\nimport { getNetworkClientId } from './provider.js';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from './transaction.js';\n\nconst log = createModuleLogger(projectLogger, 'ma-vault-deposit');\n\nexport const VAULT_ERROR_PREFIX = 'Vault: ';\n\nexport type SubmitMoneyAccountVaultDepositResult = {\n skipped?: true;\n transactionHash?: Hex;\n};\n\n/**\n * Submits a Money Account mUSD vault deposit batch on Monad once the source\n * mUSD has settled in the Money Account (fiat on-ramp, Relay bridge, or any\n * other path). Re-encodes the original nested vault calldata with the\n * settled `sourceAmountRaw` via `getAmountData` and submits as a sponsored,\n * internal EIP-7702 batch. Callers decide whether to honour any vault\n * kill-switch by passing `vaultDisabled`.\n *\n * @param options - Submit options.\n * @param options.fromBlock - Block number to start searching for CHOMP deposits.\n * @param options.messenger - Controller messenger.\n * @param options.moneyAccountAddress - Money Account address sending the vault\n * deposit. Defaults to `transaction.txParams.from` (the deposit-flow sender);\n * withdraw flows pass it explicitly since their `from` is the funding EOA.\n * @param options.depositCalls - Pre-built vault-deposit batch for withdraw\n * flows, whose parent transaction carries no vault calls. When omitted the\n * batch is derived from the transaction's own nested calls re-encoded via\n * `getAmountData`.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.vaultDisabled - When `true`, skip the vault batch and leave\n * the settled mUSD in the Money Account. Caller-evaluated kill-switch.\n * @returns Hash of the final submitted child transaction, or `{ skipped: true }`\n * when vaulting is disabled.\n */\nexport async function submitMoneyAccountVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress: moneyAccountAddressOverride,\n depositCalls,\n sourceAmountRaw,\n transaction,\n vaultDisabled,\n}: {\n fromBlock?: Hex;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress?: Hex;\n depositCalls?: BatchTransactionParams[];\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n vaultDisabled: boolean;\n}): Promise<SubmitMoneyAccountVaultDepositResult> {\n const transactionId = transaction.id;\n const moneyAccountAddress = (moneyAccountAddressOverride ??\n transaction.txParams.from) as Hex | undefined;\n\n if (!moneyAccountAddress) {\n throw new Error('Missing Money Account address');\n }\n\n if (vaultDisabled) {\n log('Skipping vault deposit because vaultDisabled is true', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { skipped: true };\n }\n\n const nestedTransactions = await resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\n });\n\n return await submitMoneyAccountVaultDepositBatch({\n depositCalls: nestedTransactions,\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n vaultDisabled: false,\n });\n}\n\n/**\n * Submits pre-built Money Account vault calls without requiring a parent\n * transaction. When `transactionId` is supplied, submitted child IDs are also\n * linked to that parent for the existing Fiat and Relay flows.\n *\n * @param options - Submission options.\n * @param options.depositCalls - Pre-built approve and deposit calls.\n * @param options.fromBlock - Block at which to begin the CHOMP race check.\n * @param options.messenger - Transaction Pay controller messenger.\n * @param options.moneyAccountAddress - Money Account that owns the mUSD.\n * @param options.sourceAmountRaw - Raw mUSD amount to deposit.\n * @param options.transactionId - Optional parent transaction to link children.\n * @param options.vaultDisabled - Whether vault submission is disabled.\n * @returns Hash of the final confirmed vault transaction, or `{ skipped: true }`\n * when vaulting is disabled.\n */\nexport async function submitMoneyAccountVaultDepositBatch({\n depositCalls,\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n vaultDisabled,\n}: {\n depositCalls: NestedTransactionMetadata[];\n fromBlock?: Hex;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress: Hex;\n sourceAmountRaw: string;\n transactionId?: string;\n vaultDisabled: boolean;\n}): Promise<SubmitMoneyAccountVaultDepositResult> {\n if (vaultDisabled) {\n log('Skipping vault deposit because vaultDisabled is true', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { skipped: true };\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 if (transactionId) {\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Add required transaction ID from Money Account vault submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(id);\n },\n );\n }\n },\n );\n\n log('Submitting Money Account vault deposit', {\n moneyAccountAddress,\n nestedTransactionCount: depositCalls.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: depositCalls.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 Money Account vault deposit', {\n moneyAccountAddress,\n nestedTransactionCount: depositCalls.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 Money Account vault deposit', {\n hash,\n moneyAccountAddress,\n nestedTransactionCount: depositCalls.length,\n networkClientId,\n sourceAmountRaw,\n transactionId,\n transactionIds,\n });\n\n return { transactionHash: hash as Hex };\n}\n\n/**\n * Resolves the vault-deposit batch (approve + teller deposit) to submit.\n *\n * Withdraw flows have no vault calls on their own nested transactions, so the\n * caller supplies a freshly built `depositCalls` batch. Deposit flows re-encode\n * their existing nested vault calldata with the settled amount via\n * `getAmountData` and also mutate the parent transaction so its stored calls\n * and `requiredAssets` reflect the settled amount.\n *\n * @param options - Resolution options.\n * @param options.depositCalls - Pre-built deposit batch for withdraw flows.\n * @param options.messenger - Controller messenger.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.transactionId - ID of the original transaction.\n * @returns Nested transactions to submit as the vault deposit batch.\n */\nasync function resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\n}: {\n depositCalls?: BatchTransactionParams[];\n messenger: TransactionPayControllerMessenger;\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n transactionId: string;\n}): Promise<NestedTransactionMetadata[]> {\n if (depositCalls?.length) {\n return depositCalls;\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: 'Money Account vault deposit: 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 return nestedTransactions;\n}\n\nasync function tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n}: {\n fromBlock: Hex | undefined;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress: Hex;\n sourceAmountRaw: string;\n transactionId?: string;\n}): Promise<Hex | undefined> {\n if (!fromBlock) {\n return undefined;\n }\n\n try {\n const { boringVault } = getMoneyAccountVaultConfig(messenger);\n return await findRecentChompVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n vaultAddress: boringVault,\n });\n } catch (chompError) {\n log('CHOMP check failed', { chompError, transactionId });\n return undefined;\n }\n}\n"]}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import type { BatchTransactionParams, TransactionMeta } from "@metamask/transaction-controller";
|
|
1
|
+
import type { BatchTransactionParams, NestedTransactionMetadata, TransactionMeta } from "@metamask/transaction-controller";
|
|
2
2
|
import type { Hex } from "@metamask/utils";
|
|
3
3
|
import type { TransactionPayControllerMessenger } from "../types.cjs";
|
|
4
4
|
export declare const VAULT_ERROR_PREFIX = "Vault: ";
|
|
5
|
+
export type SubmitMoneyAccountVaultDepositResult = {
|
|
6
|
+
skipped?: true;
|
|
7
|
+
transactionHash?: Hex;
|
|
8
|
+
};
|
|
5
9
|
/**
|
|
6
10
|
* Submits a Money Account mUSD vault deposit batch on Monad once the source
|
|
7
11
|
* mUSD has settled in the Money Account (fiat on-ramp, Relay bridge, or any
|
|
@@ -24,7 +28,8 @@ export declare const VAULT_ERROR_PREFIX = "Vault: ";
|
|
|
24
28
|
* @param options.transaction - Original Money Account transaction meta.
|
|
25
29
|
* @param options.vaultDisabled - When `true`, skip the vault batch and leave
|
|
26
30
|
* the settled mUSD in the Money Account. Caller-evaluated kill-switch.
|
|
27
|
-
* @returns Hash of the final submitted child transaction,
|
|
31
|
+
* @returns Hash of the final submitted child transaction, or `{ skipped: true }`
|
|
32
|
+
* when vaulting is disabled.
|
|
28
33
|
*/
|
|
29
34
|
export declare function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccountAddress: moneyAccountAddressOverride, depositCalls, sourceAmountRaw, transaction, vaultDisabled, }: {
|
|
30
35
|
fromBlock?: Hex;
|
|
@@ -34,7 +39,30 @@ export declare function submitMoneyAccountVaultDeposit({ fromBlock, messenger, m
|
|
|
34
39
|
sourceAmountRaw: string;
|
|
35
40
|
transaction: TransactionMeta;
|
|
36
41
|
vaultDisabled: boolean;
|
|
37
|
-
}): Promise<
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
}): Promise<SubmitMoneyAccountVaultDepositResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Submits pre-built Money Account vault calls without requiring a parent
|
|
45
|
+
* transaction. When `transactionId` is supplied, submitted child IDs are also
|
|
46
|
+
* linked to that parent for the existing Fiat and Relay flows.
|
|
47
|
+
*
|
|
48
|
+
* @param options - Submission options.
|
|
49
|
+
* @param options.depositCalls - Pre-built approve and deposit calls.
|
|
50
|
+
* @param options.fromBlock - Block at which to begin the CHOMP race check.
|
|
51
|
+
* @param options.messenger - Transaction Pay controller messenger.
|
|
52
|
+
* @param options.moneyAccountAddress - Money Account that owns the mUSD.
|
|
53
|
+
* @param options.sourceAmountRaw - Raw mUSD amount to deposit.
|
|
54
|
+
* @param options.transactionId - Optional parent transaction to link children.
|
|
55
|
+
* @param options.vaultDisabled - Whether vault submission is disabled.
|
|
56
|
+
* @returns Hash of the final confirmed vault transaction, or `{ skipped: true }`
|
|
57
|
+
* when vaulting is disabled.
|
|
58
|
+
*/
|
|
59
|
+
export declare function submitMoneyAccountVaultDepositBatch({ depositCalls, fromBlock, messenger, moneyAccountAddress, sourceAmountRaw, transactionId, vaultDisabled, }: {
|
|
60
|
+
depositCalls: NestedTransactionMetadata[];
|
|
61
|
+
fromBlock?: Hex;
|
|
62
|
+
messenger: TransactionPayControllerMessenger;
|
|
63
|
+
moneyAccountAddress: Hex;
|
|
64
|
+
sourceAmountRaw: string;
|
|
65
|
+
transactionId?: string;
|
|
66
|
+
vaultDisabled: boolean;
|
|
67
|
+
}): Promise<SubmitMoneyAccountVaultDepositResult>;
|
|
40
68
|
//# sourceMappingURL=ma-vault-deposit.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ma-vault-deposit.d.cts","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,
|
|
1
|
+
{"version":3,"file":"ma-vault-deposit.d.cts","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EAChB,yCAAyC;AAE1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAcrE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,GAAG,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,8BAA8B,CAAC,EACnD,SAAS,EACT,SAAS,EACT,mBAAmB,EAAE,2BAA2B,EAChD,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,GACd,EAAE;IACD,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,mBAAmB,CAAC,EAAE,GAAG,CAAC;IAC1B,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,eAAe,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,oCAAoC,CAAC,CAoChD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mCAAmC,CAAC,EACxD,YAAY,EACZ,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,aAAa,GACd,EAAE;IACD,YAAY,EAAE,yBAAyB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,mBAAmB,EAAE,GAAG,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,oCAAoC,CAAC,CA0IhD"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import type { BatchTransactionParams, TransactionMeta } from "@metamask/transaction-controller";
|
|
1
|
+
import type { BatchTransactionParams, NestedTransactionMetadata, TransactionMeta } from "@metamask/transaction-controller";
|
|
2
2
|
import type { Hex } from "@metamask/utils";
|
|
3
3
|
import type { TransactionPayControllerMessenger } from "../types.mjs";
|
|
4
4
|
export declare const VAULT_ERROR_PREFIX = "Vault: ";
|
|
5
|
+
export type SubmitMoneyAccountVaultDepositResult = {
|
|
6
|
+
skipped?: true;
|
|
7
|
+
transactionHash?: Hex;
|
|
8
|
+
};
|
|
5
9
|
/**
|
|
6
10
|
* Submits a Money Account mUSD vault deposit batch on Monad once the source
|
|
7
11
|
* mUSD has settled in the Money Account (fiat on-ramp, Relay bridge, or any
|
|
@@ -24,7 +28,8 @@ export declare const VAULT_ERROR_PREFIX = "Vault: ";
|
|
|
24
28
|
* @param options.transaction - Original Money Account transaction meta.
|
|
25
29
|
* @param options.vaultDisabled - When `true`, skip the vault batch and leave
|
|
26
30
|
* the settled mUSD in the Money Account. Caller-evaluated kill-switch.
|
|
27
|
-
* @returns Hash of the final submitted child transaction,
|
|
31
|
+
* @returns Hash of the final submitted child transaction, or `{ skipped: true }`
|
|
32
|
+
* when vaulting is disabled.
|
|
28
33
|
*/
|
|
29
34
|
export declare function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccountAddress: moneyAccountAddressOverride, depositCalls, sourceAmountRaw, transaction, vaultDisabled, }: {
|
|
30
35
|
fromBlock?: Hex;
|
|
@@ -34,7 +39,30 @@ export declare function submitMoneyAccountVaultDeposit({ fromBlock, messenger, m
|
|
|
34
39
|
sourceAmountRaw: string;
|
|
35
40
|
transaction: TransactionMeta;
|
|
36
41
|
vaultDisabled: boolean;
|
|
37
|
-
}): Promise<
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
}): Promise<SubmitMoneyAccountVaultDepositResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Submits pre-built Money Account vault calls without requiring a parent
|
|
45
|
+
* transaction. When `transactionId` is supplied, submitted child IDs are also
|
|
46
|
+
* linked to that parent for the existing Fiat and Relay flows.
|
|
47
|
+
*
|
|
48
|
+
* @param options - Submission options.
|
|
49
|
+
* @param options.depositCalls - Pre-built approve and deposit calls.
|
|
50
|
+
* @param options.fromBlock - Block at which to begin the CHOMP race check.
|
|
51
|
+
* @param options.messenger - Transaction Pay controller messenger.
|
|
52
|
+
* @param options.moneyAccountAddress - Money Account that owns the mUSD.
|
|
53
|
+
* @param options.sourceAmountRaw - Raw mUSD amount to deposit.
|
|
54
|
+
* @param options.transactionId - Optional parent transaction to link children.
|
|
55
|
+
* @param options.vaultDisabled - Whether vault submission is disabled.
|
|
56
|
+
* @returns Hash of the final confirmed vault transaction, or `{ skipped: true }`
|
|
57
|
+
* when vaulting is disabled.
|
|
58
|
+
*/
|
|
59
|
+
export declare function submitMoneyAccountVaultDepositBatch({ depositCalls, fromBlock, messenger, moneyAccountAddress, sourceAmountRaw, transactionId, vaultDisabled, }: {
|
|
60
|
+
depositCalls: NestedTransactionMetadata[];
|
|
61
|
+
fromBlock?: Hex;
|
|
62
|
+
messenger: TransactionPayControllerMessenger;
|
|
63
|
+
moneyAccountAddress: Hex;
|
|
64
|
+
sourceAmountRaw: string;
|
|
65
|
+
transactionId?: string;
|
|
66
|
+
vaultDisabled: boolean;
|
|
67
|
+
}): Promise<SubmitMoneyAccountVaultDepositResult>;
|
|
40
68
|
//# sourceMappingURL=ma-vault-deposit.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ma-vault-deposit.d.mts","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,
|
|
1
|
+
{"version":3,"file":"ma-vault-deposit.d.mts","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EAChB,yCAAyC;AAE1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAcrE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,GAAG,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,8BAA8B,CAAC,EACnD,SAAS,EACT,SAAS,EACT,mBAAmB,EAAE,2BAA2B,EAChD,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,GACd,EAAE;IACD,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,mBAAmB,CAAC,EAAE,GAAG,CAAC;IAC1B,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,eAAe,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,oCAAoC,CAAC,CAoChD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mCAAmC,CAAC,EACxD,YAAY,EACZ,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,aAAa,GACd,EAAE;IACD,YAAY,EAAE,yBAAyB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,mBAAmB,EAAE,GAAG,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,oCAAoC,CAAC,CA0IhD"}
|
|
@@ -5,6 +5,7 @@ import { projectLogger } from "../logger.mjs";
|
|
|
5
5
|
import { MUSD_MONAD_FIAT_ASSET } from "../strategy/fiat/constants.mjs";
|
|
6
6
|
import { findRecentChompVaultDeposit } from "./chomp.mjs";
|
|
7
7
|
import { prefixError } from "./error-prefix.mjs";
|
|
8
|
+
import { getMoneyAccountVaultConfig } from "./money-account-vault-config.mjs";
|
|
8
9
|
import { getNetworkClientId } from "./provider.mjs";
|
|
9
10
|
import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed } from "./transaction.mjs";
|
|
10
11
|
const log = createModuleLogger(projectLogger, 'ma-vault-deposit');
|
|
@@ -31,7 +32,8 @@ export const VAULT_ERROR_PREFIX = 'Vault: ';
|
|
|
31
32
|
* @param options.transaction - Original Money Account transaction meta.
|
|
32
33
|
* @param options.vaultDisabled - When `true`, skip the vault batch and leave
|
|
33
34
|
* the settled mUSD in the Money Account. Caller-evaluated kill-switch.
|
|
34
|
-
* @returns Hash of the final submitted child transaction,
|
|
35
|
+
* @returns Hash of the final submitted child transaction, or `{ skipped: true }`
|
|
36
|
+
* when vaulting is disabled.
|
|
35
37
|
*/
|
|
36
38
|
export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, moneyAccountAddress: moneyAccountAddressOverride, depositCalls, sourceAmountRaw, transaction, vaultDisabled, }) {
|
|
37
39
|
const transactionId = transaction.id;
|
|
@@ -46,7 +48,7 @@ export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, mon
|
|
|
46
48
|
sourceAmountRaw,
|
|
47
49
|
transactionId,
|
|
48
50
|
});
|
|
49
|
-
return {
|
|
51
|
+
return { skipped: true };
|
|
50
52
|
}
|
|
51
53
|
const nestedTransactions = await resolveVaultDepositBatch({
|
|
52
54
|
depositCalls,
|
|
@@ -55,6 +57,41 @@ export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, mon
|
|
|
55
57
|
transaction,
|
|
56
58
|
transactionId,
|
|
57
59
|
});
|
|
60
|
+
return await submitMoneyAccountVaultDepositBatch({
|
|
61
|
+
depositCalls: nestedTransactions,
|
|
62
|
+
fromBlock,
|
|
63
|
+
messenger,
|
|
64
|
+
moneyAccountAddress,
|
|
65
|
+
sourceAmountRaw,
|
|
66
|
+
transactionId,
|
|
67
|
+
vaultDisabled: false,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Submits pre-built Money Account vault calls without requiring a parent
|
|
72
|
+
* transaction. When `transactionId` is supplied, submitted child IDs are also
|
|
73
|
+
* linked to that parent for the existing Fiat and Relay flows.
|
|
74
|
+
*
|
|
75
|
+
* @param options - Submission options.
|
|
76
|
+
* @param options.depositCalls - Pre-built approve and deposit calls.
|
|
77
|
+
* @param options.fromBlock - Block at which to begin the CHOMP race check.
|
|
78
|
+
* @param options.messenger - Transaction Pay controller messenger.
|
|
79
|
+
* @param options.moneyAccountAddress - Money Account that owns the mUSD.
|
|
80
|
+
* @param options.sourceAmountRaw - Raw mUSD amount to deposit.
|
|
81
|
+
* @param options.transactionId - Optional parent transaction to link children.
|
|
82
|
+
* @param options.vaultDisabled - Whether vault submission is disabled.
|
|
83
|
+
* @returns Hash of the final confirmed vault transaction, or `{ skipped: true }`
|
|
84
|
+
* when vaulting is disabled.
|
|
85
|
+
*/
|
|
86
|
+
export async function submitMoneyAccountVaultDepositBatch({ depositCalls, fromBlock, messenger, moneyAccountAddress, sourceAmountRaw, transactionId, vaultDisabled, }) {
|
|
87
|
+
if (vaultDisabled) {
|
|
88
|
+
log('Skipping vault deposit because vaultDisabled is true', {
|
|
89
|
+
moneyAccountAddress,
|
|
90
|
+
sourceAmountRaw,
|
|
91
|
+
transactionId,
|
|
92
|
+
});
|
|
93
|
+
return { skipped: true };
|
|
94
|
+
}
|
|
58
95
|
// CHOMP pre-check: skip addTransactionBatch entirely if CHOMP has already
|
|
59
96
|
// auto-vaulted the funds during or before the checkout window.
|
|
60
97
|
const preChompHash = await tryFindChompDeposit({
|
|
@@ -71,18 +108,20 @@ export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, mon
|
|
|
71
108
|
const transactionIds = [];
|
|
72
109
|
const { end } = collectTransactionIds(MUSD_MONAD_FIAT_ASSET.chainId, moneyAccountAddress, messenger, (id) => {
|
|
73
110
|
transactionIds.push(id);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
111
|
+
if (transactionId) {
|
|
112
|
+
updateTransaction({
|
|
113
|
+
transactionId,
|
|
114
|
+
messenger,
|
|
115
|
+
note: 'Add required transaction ID from Money Account vault submission',
|
|
116
|
+
}, (tx) => {
|
|
117
|
+
tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
|
|
118
|
+
tx.requiredTransactionIds.push(id);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
82
121
|
});
|
|
83
122
|
log('Submitting Money Account vault deposit', {
|
|
84
123
|
moneyAccountAddress,
|
|
85
|
-
nestedTransactionCount:
|
|
124
|
+
nestedTransactionCount: depositCalls.length,
|
|
86
125
|
networkClientId,
|
|
87
126
|
sourceAmountRaw,
|
|
88
127
|
transactionId,
|
|
@@ -99,7 +138,7 @@ export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, mon
|
|
|
99
138
|
origin: ORIGIN_METAMASK,
|
|
100
139
|
requireApproval: false,
|
|
101
140
|
skipInitialGasEstimate: true,
|
|
102
|
-
transactions:
|
|
141
|
+
transactions: depositCalls.map((nestedTransaction, index) => ({
|
|
103
142
|
params: {
|
|
104
143
|
data: nestedTransaction.data,
|
|
105
144
|
to: nestedTransaction.to,
|
|
@@ -131,7 +170,7 @@ export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, mon
|
|
|
131
170
|
}
|
|
132
171
|
log('Submitted Money Account vault deposit', {
|
|
133
172
|
moneyAccountAddress,
|
|
134
|
-
nestedTransactionCount:
|
|
173
|
+
nestedTransactionCount: depositCalls.length,
|
|
135
174
|
networkClientId,
|
|
136
175
|
sourceAmountRaw,
|
|
137
176
|
transactionId,
|
|
@@ -148,7 +187,7 @@ export async function submitMoneyAccountVaultDeposit({ fromBlock, messenger, mon
|
|
|
148
187
|
log('Confirmed Money Account vault deposit', {
|
|
149
188
|
hash,
|
|
150
189
|
moneyAccountAddress,
|
|
151
|
-
nestedTransactionCount:
|
|
190
|
+
nestedTransactionCount: depositCalls.length,
|
|
152
191
|
networkClientId,
|
|
153
192
|
sourceAmountRaw,
|
|
154
193
|
transactionId,
|
|
@@ -215,11 +254,13 @@ async function tryFindChompDeposit({ fromBlock, messenger, moneyAccountAddress,
|
|
|
215
254
|
return undefined;
|
|
216
255
|
}
|
|
217
256
|
try {
|
|
257
|
+
const { boringVault } = getMoneyAccountVaultConfig(messenger);
|
|
218
258
|
return await findRecentChompVaultDeposit({
|
|
219
259
|
fromBlock,
|
|
220
260
|
messenger,
|
|
221
261
|
moneyAccountAddress,
|
|
222
262
|
sourceAmountRaw,
|
|
263
|
+
vaultAddress: boringVault,
|
|
223
264
|
});
|
|
224
265
|
}
|
|
225
266
|
catch (chompError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ma-vault-deposit.mjs","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type {\n BatchTransactionParams,\n NestedTransactionMetadata,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport { MUSD_MONAD_FIAT_ASSET } from '../strategy/fiat/constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport { findRecentChompVaultDeposit } from './chomp.js';\nimport { prefixError } from './error-prefix.js';\nimport { getNetworkClientId } from './provider.js';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from './transaction.js';\n\nconst log = createModuleLogger(projectLogger, 'ma-vault-deposit');\n\nexport const VAULT_ERROR_PREFIX = 'Vault: ';\n\n/**\n * Submits a Money Account mUSD vault deposit batch on Monad once the source\n * mUSD has settled in the Money Account (fiat on-ramp, Relay bridge, or any\n * other path). Re-encodes the original nested vault calldata with the\n * settled `sourceAmountRaw` via `getAmountData` and submits as a sponsored,\n * internal EIP-7702 batch. Callers decide whether to honour any vault\n * kill-switch by passing `vaultDisabled`.\n *\n * @param options - Submit options.\n * @param options.fromBlock - Block number to start searching for CHOMP deposits.\n * @param options.messenger - Controller messenger.\n * @param options.moneyAccountAddress - Money Account address sending the vault\n * deposit. Defaults to `transaction.txParams.from` (the deposit-flow sender);\n * withdraw flows pass it explicitly since their `from` is the funding EOA.\n * @param options.depositCalls - Pre-built vault-deposit batch for withdraw\n * flows, whose parent transaction carries no vault calls. When omitted the\n * batch is derived from the transaction's own nested calls re-encoded via\n * `getAmountData`.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.vaultDisabled - When `true`, skip the vault batch and leave\n * the settled mUSD in the Money Account. Caller-evaluated kill-switch.\n * @returns Hash of the final submitted child transaction, if available.\n */\nexport async function submitMoneyAccountVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress: moneyAccountAddressOverride,\n depositCalls,\n sourceAmountRaw,\n transaction,\n vaultDisabled,\n}: {\n fromBlock?: Hex;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress?: Hex;\n depositCalls?: BatchTransactionParams[];\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n vaultDisabled: boolean;\n}): Promise<{ transactionHash?: Hex }> {\n const transactionId = transaction.id;\n const moneyAccountAddress = (moneyAccountAddressOverride ??\n transaction.txParams.from) as Hex | undefined;\n\n if (!moneyAccountAddress) {\n throw new Error('Missing Money Account address');\n }\n\n if (vaultDisabled) {\n log('Skipping vault deposit because vaultDisabled is true', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { transactionHash: '0x' };\n }\n\n const nestedTransactions = await resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\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 Money Account vault submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(id);\n },\n );\n },\n );\n\n log('Submitting Money Account 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 Money Account 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 Money Account 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\n/**\n * Resolves the vault-deposit batch (approve + teller deposit) to submit.\n *\n * Withdraw flows have no vault calls on their own nested transactions, so the\n * caller supplies a freshly built `depositCalls` batch. Deposit flows re-encode\n * their existing nested vault calldata with the settled amount via\n * `getAmountData` and also mutate the parent transaction so its stored calls\n * and `requiredAssets` reflect the settled amount.\n *\n * @param options - Resolution options.\n * @param options.depositCalls - Pre-built deposit batch for withdraw flows.\n * @param options.messenger - Controller messenger.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.transactionId - ID of the original transaction.\n * @returns Nested transactions to submit as the vault deposit batch.\n */\nasync function resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\n}: {\n depositCalls?: BatchTransactionParams[];\n messenger: TransactionPayControllerMessenger;\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n transactionId: string;\n}): Promise<NestedTransactionMetadata[]> {\n if (depositCalls?.length) {\n return depositCalls;\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: 'Money Account vault deposit: 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 return nestedTransactions;\n}\n\nasync function tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n}: {\n fromBlock: Hex | undefined;\n messenger: TransactionPayControllerMessenger;\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":"ma-vault-deposit.mjs","sourceRoot":"","sources":["../../src/utils/ma-vault-deposit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type {\n BatchTransactionParams,\n NestedTransactionMetadata,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger.js';\nimport { MUSD_MONAD_FIAT_ASSET } from '../strategy/fiat/constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport { findRecentChompVaultDeposit } from './chomp.js';\nimport { prefixError } from './error-prefix.js';\nimport { getMoneyAccountVaultConfig } from './money-account-vault-config.js';\nimport { getNetworkClientId } from './provider.js';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from './transaction.js';\n\nconst log = createModuleLogger(projectLogger, 'ma-vault-deposit');\n\nexport const VAULT_ERROR_PREFIX = 'Vault: ';\n\nexport type SubmitMoneyAccountVaultDepositResult = {\n skipped?: true;\n transactionHash?: Hex;\n};\n\n/**\n * Submits a Money Account mUSD vault deposit batch on Monad once the source\n * mUSD has settled in the Money Account (fiat on-ramp, Relay bridge, or any\n * other path). Re-encodes the original nested vault calldata with the\n * settled `sourceAmountRaw` via `getAmountData` and submits as a sponsored,\n * internal EIP-7702 batch. Callers decide whether to honour any vault\n * kill-switch by passing `vaultDisabled`.\n *\n * @param options - Submit options.\n * @param options.fromBlock - Block number to start searching for CHOMP deposits.\n * @param options.messenger - Controller messenger.\n * @param options.moneyAccountAddress - Money Account address sending the vault\n * deposit. Defaults to `transaction.txParams.from` (the deposit-flow sender);\n * withdraw flows pass it explicitly since their `from` is the funding EOA.\n * @param options.depositCalls - Pre-built vault-deposit batch for withdraw\n * flows, whose parent transaction carries no vault calls. When omitted the\n * batch is derived from the transaction's own nested calls re-encoded via\n * `getAmountData`.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.vaultDisabled - When `true`, skip the vault batch and leave\n * the settled mUSD in the Money Account. Caller-evaluated kill-switch.\n * @returns Hash of the final submitted child transaction, or `{ skipped: true }`\n * when vaulting is disabled.\n */\nexport async function submitMoneyAccountVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress: moneyAccountAddressOverride,\n depositCalls,\n sourceAmountRaw,\n transaction,\n vaultDisabled,\n}: {\n fromBlock?: Hex;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress?: Hex;\n depositCalls?: BatchTransactionParams[];\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n vaultDisabled: boolean;\n}): Promise<SubmitMoneyAccountVaultDepositResult> {\n const transactionId = transaction.id;\n const moneyAccountAddress = (moneyAccountAddressOverride ??\n transaction.txParams.from) as Hex | undefined;\n\n if (!moneyAccountAddress) {\n throw new Error('Missing Money Account address');\n }\n\n if (vaultDisabled) {\n log('Skipping vault deposit because vaultDisabled is true', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { skipped: true };\n }\n\n const nestedTransactions = await resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\n });\n\n return await submitMoneyAccountVaultDepositBatch({\n depositCalls: nestedTransactions,\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n vaultDisabled: false,\n });\n}\n\n/**\n * Submits pre-built Money Account vault calls without requiring a parent\n * transaction. When `transactionId` is supplied, submitted child IDs are also\n * linked to that parent for the existing Fiat and Relay flows.\n *\n * @param options - Submission options.\n * @param options.depositCalls - Pre-built approve and deposit calls.\n * @param options.fromBlock - Block at which to begin the CHOMP race check.\n * @param options.messenger - Transaction Pay controller messenger.\n * @param options.moneyAccountAddress - Money Account that owns the mUSD.\n * @param options.sourceAmountRaw - Raw mUSD amount to deposit.\n * @param options.transactionId - Optional parent transaction to link children.\n * @param options.vaultDisabled - Whether vault submission is disabled.\n * @returns Hash of the final confirmed vault transaction, or `{ skipped: true }`\n * when vaulting is disabled.\n */\nexport async function submitMoneyAccountVaultDepositBatch({\n depositCalls,\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n vaultDisabled,\n}: {\n depositCalls: NestedTransactionMetadata[];\n fromBlock?: Hex;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress: Hex;\n sourceAmountRaw: string;\n transactionId?: string;\n vaultDisabled: boolean;\n}): Promise<SubmitMoneyAccountVaultDepositResult> {\n if (vaultDisabled) {\n log('Skipping vault deposit because vaultDisabled is true', {\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n });\n\n return { skipped: true };\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 if (transactionId) {\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Add required transaction ID from Money Account vault submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(id);\n },\n );\n }\n },\n );\n\n log('Submitting Money Account vault deposit', {\n moneyAccountAddress,\n nestedTransactionCount: depositCalls.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: depositCalls.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 Money Account vault deposit', {\n moneyAccountAddress,\n nestedTransactionCount: depositCalls.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 Money Account vault deposit', {\n hash,\n moneyAccountAddress,\n nestedTransactionCount: depositCalls.length,\n networkClientId,\n sourceAmountRaw,\n transactionId,\n transactionIds,\n });\n\n return { transactionHash: hash as Hex };\n}\n\n/**\n * Resolves the vault-deposit batch (approve + teller deposit) to submit.\n *\n * Withdraw flows have no vault calls on their own nested transactions, so the\n * caller supplies a freshly built `depositCalls` batch. Deposit flows re-encode\n * their existing nested vault calldata with the settled amount via\n * `getAmountData` and also mutate the parent transaction so its stored calls\n * and `requiredAssets` reflect the settled amount.\n *\n * @param options - Resolution options.\n * @param options.depositCalls - Pre-built deposit batch for withdraw flows.\n * @param options.messenger - Controller messenger.\n * @param options.sourceAmountRaw - Settled mUSD amount in raw units.\n * @param options.transaction - Original Money Account transaction meta.\n * @param options.transactionId - ID of the original transaction.\n * @returns Nested transactions to submit as the vault deposit batch.\n */\nasync function resolveVaultDepositBatch({\n depositCalls,\n messenger,\n sourceAmountRaw,\n transaction,\n transactionId,\n}: {\n depositCalls?: BatchTransactionParams[];\n messenger: TransactionPayControllerMessenger;\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n transactionId: string;\n}): Promise<NestedTransactionMetadata[]> {\n if (depositCalls?.length) {\n return depositCalls;\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: 'Money Account vault deposit: 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 return nestedTransactions;\n}\n\nasync function tryFindChompDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n transactionId,\n}: {\n fromBlock: Hex | undefined;\n messenger: TransactionPayControllerMessenger;\n moneyAccountAddress: Hex;\n sourceAmountRaw: string;\n transactionId?: string;\n}): Promise<Hex | undefined> {\n if (!fromBlock) {\n return undefined;\n }\n\n try {\n const { boringVault } = getMoneyAccountVaultConfig(messenger);\n return await findRecentChompVaultDeposit({\n fromBlock,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw,\n vaultAddress: boringVault,\n });\n } catch (chompError) {\n log('CHOMP check failed', { chompError, transactionId });\n return undefined;\n }\n}\n"]}
|