@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.
Files changed (100) hide show
  1. package/CHANGELOG.md +10 -4
  2. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionPayController-method-action-types.d.cts +31 -1
  4. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +31 -1
  6. package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionPayController.cjs +74 -2
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts +29 -0
  11. package/dist/TransactionPayController.d.cts.map +1 -1
  12. package/dist/TransactionPayController.d.mts +29 -0
  13. package/dist/TransactionPayController.d.mts.map +1 -1
  14. package/dist/TransactionPayController.mjs +74 -2
  15. package/dist/TransactionPayController.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +4 -1
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +4 -1
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/strategy/fiat/FiatStrategy.cjs +3 -0
  23. package/dist/strategy/fiat/FiatStrategy.cjs.map +1 -1
  24. package/dist/strategy/fiat/FiatStrategy.d.cts.map +1 -1
  25. package/dist/strategy/fiat/FiatStrategy.d.mts.map +1 -1
  26. package/dist/strategy/fiat/FiatStrategy.mjs +3 -0
  27. package/dist/strategy/fiat/FiatStrategy.mjs.map +1 -1
  28. package/dist/strategy/fiat/fiat-direct-musd.cjs.map +1 -1
  29. package/dist/strategy/fiat/fiat-direct-musd.d.cts +2 -3
  30. package/dist/strategy/fiat/fiat-direct-musd.d.cts.map +1 -1
  31. package/dist/strategy/fiat/fiat-direct-musd.d.mts +2 -3
  32. package/dist/strategy/fiat/fiat-direct-musd.d.mts.map +1 -1
  33. package/dist/strategy/fiat/fiat-direct-musd.mjs.map +1 -1
  34. package/dist/strategy/fiat/fiat-submit.cjs +3 -0
  35. package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
  36. package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
  37. package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
  38. package/dist/strategy/fiat/fiat-submit.mjs +3 -0
  39. package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
  40. package/dist/tests/messenger-mock.cjs +3 -0
  41. package/dist/tests/messenger-mock.cjs.map +1 -1
  42. package/dist/tests/messenger-mock.d.cts +1 -0
  43. package/dist/tests/messenger-mock.d.cts.map +1 -1
  44. package/dist/tests/messenger-mock.d.mts +1 -0
  45. package/dist/tests/messenger-mock.d.mts.map +1 -1
  46. package/dist/tests/messenger-mock.mjs +3 -0
  47. package/dist/tests/messenger-mock.mjs.map +1 -1
  48. package/dist/types.cjs.map +1 -1
  49. package/dist/types.d.cts +11 -1
  50. package/dist/types.d.cts.map +1 -1
  51. package/dist/types.d.mts +11 -1
  52. package/dist/types.d.mts.map +1 -1
  53. package/dist/types.mjs.map +1 -1
  54. package/dist/utils/chomp.cjs +37 -5
  55. package/dist/utils/chomp.cjs.map +1 -1
  56. package/dist/utils/chomp.d.cts +15 -1
  57. package/dist/utils/chomp.d.cts.map +1 -1
  58. package/dist/utils/chomp.d.mts +15 -1
  59. package/dist/utils/chomp.d.mts.map +1 -1
  60. package/dist/utils/chomp.mjs +37 -5
  61. package/dist/utils/chomp.mjs.map +1 -1
  62. package/dist/utils/feature-flags.cjs +2 -2
  63. package/dist/utils/feature-flags.cjs.map +1 -1
  64. package/dist/utils/feature-flags.d.cts +1 -1
  65. package/dist/utils/feature-flags.d.mts +1 -1
  66. package/dist/utils/feature-flags.mjs +2 -2
  67. package/dist/utils/feature-flags.mjs.map +1 -1
  68. package/dist/utils/ma-vault-deposit.cjs +58 -16
  69. package/dist/utils/ma-vault-deposit.cjs.map +1 -1
  70. package/dist/utils/ma-vault-deposit.d.cts +33 -5
  71. package/dist/utils/ma-vault-deposit.d.cts.map +1 -1
  72. package/dist/utils/ma-vault-deposit.d.mts +33 -5
  73. package/dist/utils/ma-vault-deposit.d.mts.map +1 -1
  74. package/dist/utils/ma-vault-deposit.mjs +55 -14
  75. package/dist/utils/ma-vault-deposit.mjs.map +1 -1
  76. package/dist/utils/ma-vault-payout.cjs +57 -0
  77. package/dist/utils/ma-vault-payout.cjs.map +1 -0
  78. package/dist/utils/ma-vault-payout.d.cts +18 -0
  79. package/dist/utils/ma-vault-payout.d.cts.map +1 -0
  80. package/dist/utils/ma-vault-payout.d.mts +18 -0
  81. package/dist/utils/ma-vault-payout.d.mts.map +1 -0
  82. package/dist/utils/ma-vault-payout.mjs +53 -0
  83. package/dist/utils/ma-vault-payout.mjs.map +1 -0
  84. package/dist/utils/ma-vault-withdraw.cjs +80 -0
  85. package/dist/utils/ma-vault-withdraw.cjs.map +1 -0
  86. package/dist/utils/ma-vault-withdraw.d.cts +22 -0
  87. package/dist/utils/ma-vault-withdraw.d.cts.map +1 -0
  88. package/dist/utils/ma-vault-withdraw.d.mts +22 -0
  89. package/dist/utils/ma-vault-withdraw.d.mts.map +1 -0
  90. package/dist/utils/ma-vault-withdraw.mjs +76 -0
  91. package/dist/utils/ma-vault-withdraw.mjs.map +1 -0
  92. package/dist/utils/money-account-vault-config.cjs +62 -0
  93. package/dist/utils/money-account-vault-config.cjs.map +1 -0
  94. package/dist/utils/money-account-vault-config.d.cts +27 -0
  95. package/dist/utils/money-account-vault-config.d.cts.map +1 -0
  96. package/dist/utils/money-account-vault-config.d.mts +27 -0
  97. package/dist/utils/money-account-vault-config.d.mts.map +1 -0
  98. package/dist/utils/money-account-vault-config.mjs +57 -0
  99. package/dist/utils/money-account-vault-config.mjs.map +1 -0
  100. 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, if available.
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 { transactionHash: '0x' };
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
- (0, transaction_js_1.updateTransaction)({
78
- transactionId,
79
- messenger,
80
- note: 'Add required transaction ID from Money Account vault submission',
81
- }, (tx) => {
82
- tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
83
- tx.requiredTransactionIds.push(id);
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: nestedTransactions.length,
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: nestedTransactions.map((nestedTransaction, index) => ({
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: nestedTransactions.length,
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: nestedTransactions.length,
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.submitMoneyAccountVaultDeposit = submitMoneyAccountVaultDeposit;
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":";;;AAAA,iEAA6D;AAM7D,6EAAmE;AAEnE,2CAAqD;AAErD,6CAA6C;AAC7C,iEAAsE;AAEtE,0CAAyD;AACzD,wDAAgD;AAChD,gDAAmD;AACnD,sDAK0B;AAE1B,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,yBAAa,EAAE,kBAAkB,CAAC,CAAC;AAErD,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACI,KAAK,UAAU,8BAA8B,CAAC,EACnD,SAAS,EACT,SAAS,EACT,mBAAmB,EAAE,2BAA2B,EAChD,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,GASd;IACC,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE,CAAC;IACrC,MAAM,mBAAmB,GAAG,CAAC,2BAA2B;QACtD,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAoB,CAAC;IAEhD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,sDAAsD,EAAE;YAC1D,mBAAmB;YACnB,eAAe;YACf,aAAa;SACd,CAAC,CAAC;QAEH,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,wBAAwB,CAAC;QACxD,YAAY;QACZ,SAAS;QACT,eAAe;QACf,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,0EAA0E;IAC1E,+DAA+D;IAC/D,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC;QAC7C,SAAS;QACT,SAAS;QACT,mBAAmB;QACnB,eAAe;QACf,aAAa;KACd,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,eAAe,GAAG,IAAA,gCAAkB,EACxC,SAAS,EACT,oCAAqB,CAAC,OAAO,CAC9B,CAAC;IACF,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAA,sCAAqB,EACnC,oCAAqB,CAAC,OAAO,EAC7B,mBAAmB,EACnB,SAAS,EACT,CAAC,EAAE,EAAE,EAAE;QACL,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAA,kCAAiB,EACf;YACE,aAAa;YACb,SAAS;YACT,IAAI,EAAE,iEAAiE;SACxE,EACD,CAAC,EAAE,EAAE,EAAE;YACL,EAAE,CAAC,sBAAsB,KAAzB,EAAE,CAAC,sBAAsB,GAAK,EAAE,EAAC;YACjC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,wCAAwC,EAAE;QAC5C,mBAAmB;QACnB,sBAAsB,EAAE,kBAAkB,CAAC,MAAM;QACjD,eAAe;QACf,eAAe;QACf,aAAa;KACd,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE;YAChE,WAAW,EAAE,IAAI;YACjB,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,IAAI;YACpB,IAAI,EAAE,mBAAmB;YACzB,iBAAiB,EAAE,IAAI;YACvB,UAAU,EAAE,IAAI;YAChB,eAAe;YACf,MAAM,EAAE,kCAAe;YACvB,eAAe,EAAE,KAAK;YACtB,sBAAsB,EAAE,IAAI;YAC5B,YAAY,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM,EAAE;oBACN,IAAI,EAAE,iBAAiB,CAAC,IAAI;oBAC5B,EAAE,EAAE,iBAAiB,CAAC,EAAE;oBACxB,KAAK,EAAE,iBAAiB,CAAC,KAAK,IAAI,KAAK;iBACxC;gBACD,IAAI,EACF,KAAK,KAAK,CAAC;oBACT,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,IAAI,wCAAe,CAAC,kBAAkB,CAAC;oBAChE,CAAC,CAAC,wCAAe,CAAC,mBAAmB;aAC1C,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sEAAsE;QACtE,6EAA6E;QAC7E,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC;YAC9C,SAAS;YACT,SAAS;YACT,mBAAmB;YACnB,eAAe;YACf,aAAa;SACd,CAAC,CAAC;QAEH,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,IAAA,6BAAW,EAAC,KAAK,EAAE,0BAAkB,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,GAAG,EAAE,CAAC;IACR,CAAC;IAED,GAAG,CAAC,uCAAuC,EAAE;QAC3C,mBAAmB;QACnB,sBAAsB,EAAE,kBAAkB,CAAC,MAAM;QACjD,eAAe;QACf,eAAe;QACf,aAAa;QACb,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,4CAA2B,EAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CACvE,CAAC;IAEF,MAAM,IAAI,GAAG,IAAA,+BAAc,EAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC;IAE1E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,GAAG,CAAC,uCAAuC,EAAE;QAC3C,IAAI;QACJ,mBAAmB;QACnB,sBAAsB,EAAE,kBAAkB,CAAC,MAAM;QACjD,eAAe;QACf,eAAe;QACf,aAAa;QACb,cAAc;KACf,CAAC,CAAC;IAEH,OAAO,EAAE,eAAe,EAAE,IAAW,EAAE,CAAC;AAC1C,CAAC;AAxKD,wEAwKC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,UAAU,wBAAwB,CAAC,EACtC,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,GAOd;IACC,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,kBAAkB,GACtB,IAAA,+BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,IAAI,WAAW,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CACtC,wCAAwC,EACxC;QACE,MAAM,EAAE,eAAe;QACvB,WAAW,EAAE,kBAAkB;KAChC,CACF,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,kBAAkB,EAAE,GAAG,CACnE,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAClD,CAAC;IAEF,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QACvD,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC/C,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAA,kCAAiB,EACf;QACE,aAAa;QACb,SAAS;QACT,IAAI,EAAE,kDAAkD;KACzD,EACD,CAAC,EAAE,EAAE,EAAE;QACL,KAAK,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACvD,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBACpD,EAAE,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,CACjE,EAAE,CACH,EAAE,CAAC;QACN,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,EACjC,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,aAAa,GAOd;IACC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,sCAA2B,EAAC;YACvC,SAAS;YACT,SAAS;YACT,mBAAmB;YACnB,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,GAAG,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC","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, if available.
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
- transactionHash?: Hex;
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,EAEtB,eAAe,EAChB,yCAAyC;AAE1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAarE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;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;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAwJrC"}
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, if available.
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
- transactionHash?: Hex;
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,EAEtB,eAAe,EAChB,yCAAyC;AAE1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAarE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;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;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAwJrC"}
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, if available.
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 { transactionHash: '0x' };
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
- updateTransaction({
75
- transactionId,
76
- messenger,
77
- note: 'Add required transaction ID from Money Account vault submission',
78
- }, (tx) => {
79
- tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
80
- tx.requiredTransactionIds.push(id);
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: nestedTransactions.length,
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: nestedTransactions.map((nestedTransaction, index) => ({
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: nestedTransactions.length,
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: nestedTransactions.length,
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"]}