@metamask/transaction-pay-controller 22.7.0 → 22.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
- package/dist/TransactionPayController-method-action-types.d.cts +15 -1
- package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
- package/dist/TransactionPayController-method-action-types.d.mts +15 -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 +19 -3
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.d.cts +13 -2
- package/dist/TransactionPayController.d.cts.map +1 -1
- package/dist/TransactionPayController.d.mts +13 -2
- package/dist/TransactionPayController.d.mts.map +1 -1
- package/dist/TransactionPayController.mjs +19 -3
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/constants.cjs +1 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +1 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +1 -0
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +1 -0
- package/dist/constants.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.cjs +20 -3
- package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
- package/dist/strategy/relay/relay-quotes.mjs +20 -3
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/relay-submit.cjs +24 -11
- package/dist/strategy/relay/relay-submit.cjs.map +1 -1
- package/dist/strategy/relay/relay-submit.mjs +24 -11
- package/dist/strategy/relay/relay-submit.mjs.map +1 -1
- package/dist/strategy/server/ServerStrategy.cjs +35 -0
- package/dist/strategy/server/ServerStrategy.cjs.map +1 -0
- package/dist/strategy/server/ServerStrategy.d.cts +15 -0
- package/dist/strategy/server/ServerStrategy.d.cts.map +1 -0
- package/dist/strategy/server/ServerStrategy.d.mts +15 -0
- package/dist/strategy/server/ServerStrategy.d.mts.map +1 -0
- package/dist/strategy/server/ServerStrategy.mjs +31 -0
- package/dist/strategy/server/ServerStrategy.mjs.map +1 -0
- package/dist/strategy/server/constants.cjs +11 -0
- package/dist/strategy/server/constants.cjs.map +1 -0
- package/dist/strategy/server/constants.d.cts +8 -0
- package/dist/strategy/server/constants.d.cts.map +1 -0
- package/dist/strategy/server/constants.d.mts +8 -0
- package/dist/strategy/server/constants.d.mts.map +1 -0
- package/dist/strategy/server/constants.mjs +8 -0
- package/dist/strategy/server/constants.mjs.map +1 -0
- package/dist/strategy/server/perps.cjs +71 -0
- package/dist/strategy/server/perps.cjs.map +1 -0
- package/dist/strategy/server/perps.d.cts +36 -0
- package/dist/strategy/server/perps.d.cts.map +1 -0
- package/dist/strategy/server/perps.d.mts +36 -0
- package/dist/strategy/server/perps.d.mts.map +1 -0
- package/dist/strategy/server/perps.mjs +66 -0
- package/dist/strategy/server/perps.mjs.map +1 -0
- package/dist/strategy/server/server-api.cjs +98 -0
- package/dist/strategy/server/server-api.cjs.map +1 -0
- package/dist/strategy/server/server-api.d.cts +35 -0
- package/dist/strategy/server/server-api.d.cts.map +1 -0
- package/dist/strategy/server/server-api.d.mts +35 -0
- package/dist/strategy/server/server-api.d.mts.map +1 -0
- package/dist/strategy/server/server-api.mjs +92 -0
- package/dist/strategy/server/server-api.mjs.map +1 -0
- package/dist/strategy/server/server-quotes.cjs +315 -0
- package/dist/strategy/server/server-quotes.cjs.map +1 -0
- package/dist/strategy/server/server-quotes.d.cts +10 -0
- package/dist/strategy/server/server-quotes.d.cts.map +1 -0
- package/dist/strategy/server/server-quotes.d.mts +10 -0
- package/dist/strategy/server/server-quotes.d.mts.map +1 -0
- package/dist/strategy/server/server-quotes.mjs +311 -0
- package/dist/strategy/server/server-quotes.mjs.map +1 -0
- package/dist/strategy/server/server-submit.cjs +296 -0
- package/dist/strategy/server/server-submit.cjs.map +1 -0
- package/dist/strategy/server/server-submit.d.cts +13 -0
- package/dist/strategy/server/server-submit.d.cts.map +1 -0
- package/dist/strategy/server/server-submit.d.mts +13 -0
- package/dist/strategy/server/server-submit.d.mts.map +1 -0
- package/dist/strategy/server/server-submit.mjs +292 -0
- package/dist/strategy/server/server-submit.mjs.map +1 -0
- package/dist/strategy/server/types.cjs +26 -0
- package/dist/strategy/server/types.cjs.map +1 -0
- package/dist/strategy/server/types.d.cts +153 -0
- package/dist/strategy/server/types.d.cts.map +1 -0
- package/dist/strategy/server/types.d.mts +153 -0
- package/dist/strategy/server/types.d.mts.map +1 -0
- package/dist/strategy/server/types.mjs +23 -0
- package/dist/strategy/server/types.mjs.map +1 -0
- package/dist/tests/messenger-mock.cjs +3 -0
- package/dist/tests/messenger-mock.cjs.map +1 -1
- package/dist/tests/messenger-mock.d.cts +255 -3
- package/dist/tests/messenger-mock.d.cts.map +1 -1
- package/dist/tests/messenger-mock.d.mts +255 -3
- 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 +43 -17
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +43 -17
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +43 -3
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +21 -0
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +21 -0
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +40 -2
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/gas.cjs +11 -10
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.d.cts +12 -0
- package/dist/utils/gas.d.cts.map +1 -1
- package/dist/utils/gas.d.mts +12 -0
- package/dist/utils/gas.d.mts.map +1 -1
- package/dist/utils/gas.mjs +10 -10
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/quotes.cjs +9 -3
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.d.cts.map +1 -1
- package/dist/utils/quotes.d.mts.map +1 -1
- package/dist/utils/quotes.mjs +10 -4
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/strategy.cjs +3 -0
- package/dist/utils/strategy.cjs.map +1 -1
- package/dist/utils/strategy.d.cts.map +1 -1
- package/dist/utils/strategy.d.mts.map +1 -1
- package/dist/utils/strategy.mjs +3 -0
- package/dist/utils/strategy.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.submitServerQuotes = void 0;
|
|
4
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
|
+
const utils_1 = require("@metamask/utils");
|
|
6
|
+
const bignumber_js_1 = require("bignumber.js");
|
|
7
|
+
const logger_1 = require("../../logger.cjs");
|
|
8
|
+
const feature_flags_1 = require("../../utils/feature-flags.cjs");
|
|
9
|
+
const transaction_1 = require("../../utils/transaction.cjs");
|
|
10
|
+
const server_api_1 = require("./server-api.cjs");
|
|
11
|
+
const types_1 = require("./types.cjs");
|
|
12
|
+
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'server-strategy');
|
|
13
|
+
/**
|
|
14
|
+
* Submits server intent quotes.
|
|
15
|
+
*
|
|
16
|
+
* @param request - Request object.
|
|
17
|
+
* @returns An object containing the transaction hash if available.
|
|
18
|
+
*/
|
|
19
|
+
async function submitServerQuotes(request) {
|
|
20
|
+
log('Executing server quotes', request);
|
|
21
|
+
const { quotes, messenger, transaction } = request;
|
|
22
|
+
let transactionHash;
|
|
23
|
+
for (const quote of quotes) {
|
|
24
|
+
({ transactionHash } = await executeSingleServerQuote(quote, messenger, transaction));
|
|
25
|
+
}
|
|
26
|
+
return { transactionHash };
|
|
27
|
+
}
|
|
28
|
+
exports.submitServerQuotes = submitServerQuotes;
|
|
29
|
+
async function executeSingleServerQuote(quote, messenger, transaction) {
|
|
30
|
+
log('Executing single server quote', quote);
|
|
31
|
+
(0, transaction_1.updateTransaction)({
|
|
32
|
+
transactionId: transaction.id,
|
|
33
|
+
messenger,
|
|
34
|
+
note: 'Remove nonce from skipped transaction',
|
|
35
|
+
}, (tx) => {
|
|
36
|
+
tx.txParams.nonce = undefined;
|
|
37
|
+
});
|
|
38
|
+
if (quote.original.gasless) {
|
|
39
|
+
await submitViaServerExecute(quote, messenger, transaction);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await submitViaTransactionController(quote, messenger, transaction);
|
|
43
|
+
}
|
|
44
|
+
const targetHash = await waitForServerCompletion(quote.original, messenger, transaction.id);
|
|
45
|
+
log('Server request completed', targetHash);
|
|
46
|
+
(0, transaction_1.updateTransaction)({
|
|
47
|
+
transactionId: transaction.id,
|
|
48
|
+
messenger,
|
|
49
|
+
note: 'Intent complete after Server completion',
|
|
50
|
+
}, (tx) => {
|
|
51
|
+
tx.isIntentComplete = true;
|
|
52
|
+
});
|
|
53
|
+
return { transactionHash: targetHash };
|
|
54
|
+
}
|
|
55
|
+
async function submitViaServerExecute(quote, messenger, transaction) {
|
|
56
|
+
const { from, sourceChainId } = quote.request;
|
|
57
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', sourceChainId);
|
|
58
|
+
const nestedTransactions = quote.original.steps.map((step) => ({
|
|
59
|
+
data: step.data,
|
|
60
|
+
to: step.to,
|
|
61
|
+
value: step.value,
|
|
62
|
+
}));
|
|
63
|
+
const sourceCallTransaction = {
|
|
64
|
+
...transaction,
|
|
65
|
+
chainId: sourceChainId,
|
|
66
|
+
networkClientId,
|
|
67
|
+
nestedTransactions,
|
|
68
|
+
txParams: {
|
|
69
|
+
...transaction.txParams,
|
|
70
|
+
from,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
const delegation = await messenger.call('TransactionPayController:getDelegationTransaction', { transaction: sourceCallTransaction });
|
|
74
|
+
log('Delegation result for server source calls', delegation);
|
|
75
|
+
const submitBody = {
|
|
76
|
+
provider: quote.original.provider,
|
|
77
|
+
id: quote.original.id,
|
|
78
|
+
chainId: Number(sourceChainId),
|
|
79
|
+
to: delegation.to,
|
|
80
|
+
data: delegation.data,
|
|
81
|
+
value: new bignumber_js_1.BigNumber(delegation.value).toFixed(),
|
|
82
|
+
...(delegation.authorizationList?.length
|
|
83
|
+
? {
|
|
84
|
+
authorizationList: delegation.authorizationList.map((auth) => ({
|
|
85
|
+
chainId: Number(auth.chainId),
|
|
86
|
+
address: auth.address,
|
|
87
|
+
nonce: Number(auth.nonce),
|
|
88
|
+
yParity: Number(auth.yParity),
|
|
89
|
+
r: auth.r,
|
|
90
|
+
s: auth.s,
|
|
91
|
+
})),
|
|
92
|
+
}
|
|
93
|
+
: {}),
|
|
94
|
+
};
|
|
95
|
+
const submitResponse = await (0, server_api_1.submitServerIntent)(messenger, submitBody);
|
|
96
|
+
if (!submitResponse.success) {
|
|
97
|
+
throw new Error(`Server submit failed: ${submitResponse.error ?? 'unknown'}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function submitViaTransactionController(quote, messenger, transaction) {
|
|
101
|
+
const { from, sourceChainId, sourceTokenAddress } = quote.request;
|
|
102
|
+
const { steps } = quote.original;
|
|
103
|
+
if (steps.length === 0) {
|
|
104
|
+
throw new Error('Server quote has no steps to submit');
|
|
105
|
+
}
|
|
106
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', sourceChainId);
|
|
107
|
+
const { gasLimits, is7702, maxFeePerGas, maxPriorityFeePerGas } = quote.original.client;
|
|
108
|
+
const transactionParams = steps.map((step, i) => stepToParams(step, from, gasLimits[i], maxFeePerGas, maxPriorityFeePerGas));
|
|
109
|
+
const gasFeeToken = quote.fees.isSourceGasFeeToken
|
|
110
|
+
? sourceTokenAddress
|
|
111
|
+
: undefined;
|
|
112
|
+
log('Submitting via TransactionController', {
|
|
113
|
+
from,
|
|
114
|
+
gasFeeToken,
|
|
115
|
+
is7702,
|
|
116
|
+
networkClientId,
|
|
117
|
+
sourceChainId,
|
|
118
|
+
stepCount: steps.length,
|
|
119
|
+
});
|
|
120
|
+
const transactionIds = [];
|
|
121
|
+
const { end } = (0, transaction_1.collectTransactionIds)(sourceChainId, from, messenger, (transactionId) => {
|
|
122
|
+
transactionIds.push(transactionId);
|
|
123
|
+
(0, transaction_1.updateTransaction)({
|
|
124
|
+
transactionId: transaction.id,
|
|
125
|
+
messenger,
|
|
126
|
+
note: 'Add required transaction ID from server submission',
|
|
127
|
+
}, (tx) => {
|
|
128
|
+
tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
|
|
129
|
+
tx.requiredTransactionIds.push(transactionId);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
try {
|
|
133
|
+
if (transactionParams.length === 1) {
|
|
134
|
+
const addTransactionOptions = {
|
|
135
|
+
gasFeeToken,
|
|
136
|
+
isInternal: true,
|
|
137
|
+
networkClientId,
|
|
138
|
+
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
139
|
+
requireApproval: false,
|
|
140
|
+
};
|
|
141
|
+
log('Calling addTransaction', {
|
|
142
|
+
params: transactionParams[0],
|
|
143
|
+
options: addTransactionOptions,
|
|
144
|
+
});
|
|
145
|
+
await messenger.call('TransactionController:addTransaction', transactionParams[0], addTransactionOptions);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const gasLimit7702 = is7702 ? (0, controller_utils_1.toHex)(gasLimits[0]) : undefined;
|
|
149
|
+
const batchTransactions = transactionParams.map((params, i) => {
|
|
150
|
+
const gas = (gasLimit7702 ??
|
|
151
|
+
(gasLimits[i] === undefined ? undefined : params.gas));
|
|
152
|
+
return {
|
|
153
|
+
params: {
|
|
154
|
+
data: params.data,
|
|
155
|
+
gas,
|
|
156
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
157
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
158
|
+
to: params.to,
|
|
159
|
+
value: params.value,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
const addTransactionBatchOptions = {
|
|
164
|
+
from,
|
|
165
|
+
...(gasLimit7702 === undefined
|
|
166
|
+
? { disable7702: true }
|
|
167
|
+
: {
|
|
168
|
+
disable7702: false,
|
|
169
|
+
disableHook: true,
|
|
170
|
+
disableSequential: true,
|
|
171
|
+
gasLimit7702,
|
|
172
|
+
}),
|
|
173
|
+
gasFeeToken,
|
|
174
|
+
isInternal: true,
|
|
175
|
+
networkClientId,
|
|
176
|
+
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
177
|
+
overwriteUpgrade: true,
|
|
178
|
+
requireApproval: false,
|
|
179
|
+
transactions: batchTransactions,
|
|
180
|
+
};
|
|
181
|
+
log('Calling addTransactionBatch', addTransactionBatchOptions);
|
|
182
|
+
await messenger.call('TransactionController:addTransactionBatch', addTransactionBatchOptions);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
end();
|
|
187
|
+
}
|
|
188
|
+
log('Server transactions added', transactionIds);
|
|
189
|
+
await Promise.all(transactionIds.map((txId) => (0, transaction_1.waitForTransactionConfirmed)(txId, messenger)));
|
|
190
|
+
log('Server transactions confirmed', transactionIds);
|
|
191
|
+
const lastId = transactionIds.at(-1);
|
|
192
|
+
const sourceHash = lastId
|
|
193
|
+
? (0, transaction_1.getTransaction)(lastId, messenger)?.hash
|
|
194
|
+
: undefined;
|
|
195
|
+
if (sourceHash) {
|
|
196
|
+
(0, transaction_1.updateTransaction)({
|
|
197
|
+
transactionId: transaction.id,
|
|
198
|
+
messenger,
|
|
199
|
+
note: 'Add source hash from server transaction submission',
|
|
200
|
+
}, (tx) => {
|
|
201
|
+
tx.metamaskPay ?? (tx.metamaskPay = {});
|
|
202
|
+
tx.metamaskPay.sourceHash = sourceHash;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function stepToParams(step, from, gasLimit, clientMaxFeePerGas, clientMaxPriorityFeePerGas) {
|
|
207
|
+
let gas;
|
|
208
|
+
if (gasLimit) {
|
|
209
|
+
gas = (0, controller_utils_1.toHex)(gasLimit);
|
|
210
|
+
}
|
|
211
|
+
else if (step.gasLimit) {
|
|
212
|
+
gas = (0, controller_utils_1.toHex)(step.gasLimit);
|
|
213
|
+
}
|
|
214
|
+
const resolvedMaxFeePerGas = step.maxFeePerGas ?? clientMaxFeePerGas;
|
|
215
|
+
const resolvedMaxPriorityFeePerGas = step.maxPriorityFeePerGas ?? clientMaxPriorityFeePerGas;
|
|
216
|
+
const params = {
|
|
217
|
+
data: step.data,
|
|
218
|
+
from,
|
|
219
|
+
gas,
|
|
220
|
+
maxFeePerGas: resolvedMaxFeePerGas
|
|
221
|
+
? (0, controller_utils_1.toHex)(resolvedMaxFeePerGas)
|
|
222
|
+
: undefined,
|
|
223
|
+
maxPriorityFeePerGas: resolvedMaxPriorityFeePerGas
|
|
224
|
+
? (0, controller_utils_1.toHex)(resolvedMaxPriorityFeePerGas)
|
|
225
|
+
: undefined,
|
|
226
|
+
to: step.to,
|
|
227
|
+
value: (0, controller_utils_1.toHex)(step.value),
|
|
228
|
+
};
|
|
229
|
+
log('Step to params', {
|
|
230
|
+
step: {
|
|
231
|
+
gasLimit: step.gasLimit,
|
|
232
|
+
maxFeePerGas: step.maxFeePerGas,
|
|
233
|
+
maxPriorityFeePerGas: step.maxPriorityFeePerGas,
|
|
234
|
+
value: step.value,
|
|
235
|
+
},
|
|
236
|
+
params: {
|
|
237
|
+
gas: params.gas,
|
|
238
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
239
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
240
|
+
value: params.value,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
return params;
|
|
244
|
+
}
|
|
245
|
+
async function waitForServerCompletion(quote, messenger, transactionId) {
|
|
246
|
+
const pollingInterval = (0, feature_flags_1.getServerPollingInterval)(messenger);
|
|
247
|
+
const pollingTimeout = (0, feature_flags_1.getServerPollingTimeout)(messenger);
|
|
248
|
+
const hasTimeout = pollingTimeout !== undefined && pollingTimeout > 0;
|
|
249
|
+
log('Server polling config', { pollingInterval, pollingTimeout });
|
|
250
|
+
const startTime = Date.now();
|
|
251
|
+
let lastStatus;
|
|
252
|
+
let sourceHashEmitted = false;
|
|
253
|
+
while (true) {
|
|
254
|
+
let statusResponse;
|
|
255
|
+
try {
|
|
256
|
+
const tx = (0, transaction_1.getTransaction)(transactionId, messenger);
|
|
257
|
+
statusResponse = await (0, server_api_1.getServerStatus)(messenger, {
|
|
258
|
+
provider: quote.provider,
|
|
259
|
+
id: quote.id,
|
|
260
|
+
hash: tx?.metamaskPay?.sourceHash ?? tx?.hash,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
log('Polling network error', error);
|
|
265
|
+
}
|
|
266
|
+
if (statusResponse) {
|
|
267
|
+
lastStatus = statusResponse.status;
|
|
268
|
+
log('Polled status', statusResponse.status, statusResponse);
|
|
269
|
+
if (!sourceHashEmitted && statusResponse.sourceHash) {
|
|
270
|
+
sourceHashEmitted = true;
|
|
271
|
+
const { sourceHash } = statusResponse;
|
|
272
|
+
(0, transaction_1.updateTransaction)({
|
|
273
|
+
transactionId,
|
|
274
|
+
messenger,
|
|
275
|
+
note: 'Add source hash from server status',
|
|
276
|
+
}, (tx) => {
|
|
277
|
+
tx.metamaskPay ?? (tx.metamaskPay = {});
|
|
278
|
+
tx.metamaskPay.sourceHash = sourceHash;
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
if (statusResponse.status === types_1.ServerStatus.Confirmed) {
|
|
282
|
+
return statusResponse.targetHash ?? '0x';
|
|
283
|
+
}
|
|
284
|
+
if (statusResponse.status === types_1.ServerStatus.Failed ||
|
|
285
|
+
statusResponse.status === types_1.ServerStatus.Refunded) {
|
|
286
|
+
throw new Error(`Server intent ${statusResponse.status.toLowerCase()}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (hasTimeout && Date.now() - startTime >= pollingTimeout) {
|
|
290
|
+
const statusDetail = lastStatus ? ` (last status: ${lastStatus})` : '';
|
|
291
|
+
throw new Error(`Server polling timed out${statusDetail}`);
|
|
292
|
+
}
|
|
293
|
+
await new Promise((resolve) => setTimeout(resolve, pollingInterval));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=server-submit.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/server/server-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK, toHex } from '@metamask/controller-utils';\nimport type {\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport {\n getServerPollingInterval,\n getServerPollingTimeout,\n} from '../../utils/feature-flags';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\nimport { getServerStatus, submitServerIntent } from './server-api';\nimport type {\n ServerQuote,\n ServerQuoteStep,\n ServerStatusResponse,\n ServerSubmitRequest,\n} from './types';\nimport { ServerStatus } from './types';\n\nconst log = createModuleLogger(projectLogger, 'server-strategy');\n\n/**\n * Submits server intent quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitServerQuotes(\n request: PayStrategyExecuteRequest<ServerQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing server quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleServerQuote(\n quote,\n messenger,\n transaction,\n ));\n }\n\n return { transactionHash };\n}\n\nasync function executeSingleServerQuote(\n quote: TransactionPayQuote<ServerQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing single server quote', quote);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n\n if (quote.original.gasless) {\n await submitViaServerExecute(quote, messenger, transaction);\n } else {\n await submitViaTransactionController(quote, messenger, transaction);\n }\n\n const targetHash = await waitForServerCompletion(\n quote.original,\n messenger,\n transaction.id,\n );\n\n log('Server request completed', targetHash);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Server completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash: targetHash };\n}\n\nasync function submitViaServerExecute(\n quote: TransactionPayQuote<ServerQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<void> {\n const { from, sourceChainId } = quote.request;\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n sourceChainId,\n );\n\n const nestedTransactions = quote.original.steps.map((step) => ({\n data: step.data,\n to: step.to,\n value: step.value as Hex,\n }));\n\n const sourceCallTransaction = {\n ...transaction,\n chainId: sourceChainId,\n networkClientId,\n nestedTransactions,\n txParams: {\n ...transaction.txParams,\n from,\n },\n } as TransactionMeta;\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction: sourceCallTransaction },\n );\n\n log('Delegation result for server source calls', delegation);\n\n const submitBody: ServerSubmitRequest = {\n provider: quote.original.provider,\n id: quote.original.id,\n chainId: Number(sourceChainId),\n to: delegation.to,\n data: delegation.data,\n value: new BigNumber(delegation.value).toFixed(),\n ...(delegation.authorizationList?.length\n ? {\n authorizationList: delegation.authorizationList.map((auth) => ({\n chainId: Number(auth.chainId),\n address: auth.address,\n nonce: Number(auth.nonce),\n yParity: Number(auth.yParity),\n r: auth.r as Hex,\n s: auth.s as Hex,\n })),\n }\n : {}),\n };\n\n const submitResponse = await submitServerIntent(messenger, submitBody);\n\n if (!submitResponse.success) {\n throw new Error(\n `Server submit failed: ${submitResponse.error ?? 'unknown'}`,\n );\n }\n}\n\nasync function submitViaTransactionController(\n quote: TransactionPayQuote<ServerQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<void> {\n const { from, sourceChainId, sourceTokenAddress } = quote.request;\n const { steps } = quote.original;\n\n if (steps.length === 0) {\n throw new Error('Server quote has no steps to submit');\n }\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n sourceChainId,\n );\n\n const { gasLimits, is7702, maxFeePerGas, maxPriorityFeePerGas } =\n quote.original.client;\n const transactionParams = steps.map((step, i) =>\n stepToParams(step, from, gasLimits[i], maxFeePerGas, maxPriorityFeePerGas),\n );\n const gasFeeToken = quote.fees.isSourceGasFeeToken\n ? sourceTokenAddress\n : undefined;\n\n log('Submitting via TransactionController', {\n from,\n gasFeeToken,\n is7702,\n networkClientId,\n sourceChainId,\n stepCount: steps.length,\n });\n\n const transactionIds: string[] = [];\n const { end } = collectTransactionIds(\n sourceChainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID from server submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n try {\n if (transactionParams.length === 1) {\n const addTransactionOptions = {\n gasFeeToken,\n isInternal: true,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n };\n\n log('Calling addTransaction', {\n params: transactionParams[0],\n options: addTransactionOptions,\n });\n\n await messenger.call(\n 'TransactionController:addTransaction',\n transactionParams[0],\n addTransactionOptions,\n );\n } else {\n const gasLimit7702 = is7702 ? toHex(gasLimits[0]) : undefined;\n\n const batchTransactions = transactionParams.map((params, i) => {\n const gas = (gasLimit7702 ??\n (gasLimits[i] === undefined ? undefined : params.gas)) as\n | Hex\n | undefined;\n\n return {\n params: {\n data: params.data as Hex,\n gas,\n maxFeePerGas: params.maxFeePerGas as Hex,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas as Hex,\n to: params.to as Hex,\n value: params.value as Hex,\n },\n };\n });\n\n const addTransactionBatchOptions = {\n from,\n ...(gasLimit7702 === undefined\n ? { disable7702: true }\n : {\n disable7702: false,\n disableHook: true,\n disableSequential: true,\n gasLimit7702,\n }),\n gasFeeToken,\n isInternal: true,\n networkClientId,\n origin: ORIGIN_METAMASK,\n overwriteUpgrade: true,\n requireApproval: false,\n transactions: batchTransactions,\n };\n\n log('Calling addTransactionBatch', addTransactionBatchOptions);\n\n await messenger.call(\n 'TransactionController:addTransactionBatch',\n addTransactionBatchOptions,\n );\n }\n } finally {\n end();\n }\n\n log('Server transactions added', transactionIds);\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n log('Server transactions confirmed', transactionIds);\n\n const lastId = transactionIds.at(-1);\n const sourceHash = lastId\n ? getTransaction(lastId, messenger)?.hash\n : undefined;\n\n if (sourceHash) {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add source hash from server transaction submission',\n },\n (tx) => {\n tx.metamaskPay ??= {};\n tx.metamaskPay.sourceHash = sourceHash as Hex;\n },\n );\n }\n}\n\nfunction stepToParams(\n step: ServerQuoteStep,\n from: Hex,\n gasLimit?: number,\n clientMaxFeePerGas?: string,\n clientMaxPriorityFeePerGas?: string,\n): TransactionParams {\n let gas: Hex | undefined;\n if (gasLimit) {\n gas = toHex(gasLimit);\n } else if (step.gasLimit) {\n gas = toHex(step.gasLimit);\n }\n\n const resolvedMaxFeePerGas = step.maxFeePerGas ?? clientMaxFeePerGas;\n const resolvedMaxPriorityFeePerGas =\n step.maxPriorityFeePerGas ?? clientMaxPriorityFeePerGas;\n\n const params = {\n data: step.data,\n from,\n gas,\n maxFeePerGas: resolvedMaxFeePerGas\n ? toHex(resolvedMaxFeePerGas)\n : undefined,\n maxPriorityFeePerGas: resolvedMaxPriorityFeePerGas\n ? toHex(resolvedMaxPriorityFeePerGas)\n : undefined,\n to: step.to,\n value: toHex(step.value),\n };\n\n log('Step to params', {\n step: {\n gasLimit: step.gasLimit,\n maxFeePerGas: step.maxFeePerGas,\n maxPriorityFeePerGas: step.maxPriorityFeePerGas,\n value: step.value,\n },\n params: {\n gas: params.gas,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n value: params.value,\n },\n });\n\n return params;\n}\n\nasync function waitForServerCompletion(\n quote: ServerQuote,\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n): Promise<Hex | undefined> {\n const pollingInterval = getServerPollingInterval(messenger);\n const pollingTimeout = getServerPollingTimeout(messenger);\n const hasTimeout = pollingTimeout !== undefined && pollingTimeout > 0;\n\n log('Server polling config', { pollingInterval, pollingTimeout });\n\n const startTime = Date.now();\n\n let lastStatus: string | undefined;\n let sourceHashEmitted = false;\n\n while (true) {\n let statusResponse: ServerStatusResponse | undefined;\n\n try {\n const tx = getTransaction(transactionId, messenger);\n\n statusResponse = await getServerStatus(messenger, {\n provider: quote.provider,\n id: quote.id,\n hash: tx?.metamaskPay?.sourceHash ?? tx?.hash,\n });\n } catch (error) {\n log('Polling network error', error);\n }\n\n if (statusResponse) {\n lastStatus = statusResponse.status;\n log('Polled status', statusResponse.status, statusResponse);\n\n if (!sourceHashEmitted && statusResponse.sourceHash) {\n sourceHashEmitted = true;\n const { sourceHash } = statusResponse;\n\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Add source hash from server status',\n },\n (tx) => {\n tx.metamaskPay ??= {};\n tx.metamaskPay.sourceHash = sourceHash;\n },\n );\n }\n\n if (statusResponse.status === ServerStatus.Confirmed) {\n return statusResponse.targetHash ?? '0x';\n }\n\n if (\n statusResponse.status === ServerStatus.Failed ||\n statusResponse.status === ServerStatus.Refunded\n ) {\n throw new Error(`Server intent ${statusResponse.status.toLowerCase()}`);\n }\n }\n\n if (hasTimeout && Date.now() - startTime >= pollingTimeout) {\n const statusDetail = lastStatus ? ` (last status: ${lastStatus})` : '';\n throw new Error(`Server polling timed out${statusDetail}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingInterval));\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { PayStrategyExecuteRequest } from "../../types.cjs";
|
|
3
|
+
import type { ServerQuote } from "./types.cjs";
|
|
4
|
+
/**
|
|
5
|
+
* Submits server intent quotes.
|
|
6
|
+
*
|
|
7
|
+
* @param request - Request object.
|
|
8
|
+
* @returns An object containing the transaction hash if available.
|
|
9
|
+
*/
|
|
10
|
+
export declare function submitServerQuotes(request: PayStrategyExecuteRequest<ServerQuote>): Promise<{
|
|
11
|
+
transactionHash?: Hex;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=server-submit.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/server/server-submit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,yBAAyB,EAG1B,wBAAoB;AAYrB,OAAO,KAAK,EACV,WAAW,EAIZ,oBAAgB;AAKjB;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAgBpC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { PayStrategyExecuteRequest } from "../../types.mjs";
|
|
3
|
+
import type { ServerQuote } from "./types.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Submits server intent quotes.
|
|
6
|
+
*
|
|
7
|
+
* @param request - Request object.
|
|
8
|
+
* @returns An object containing the transaction hash if available.
|
|
9
|
+
*/
|
|
10
|
+
export declare function submitServerQuotes(request: PayStrategyExecuteRequest<ServerQuote>): Promise<{
|
|
11
|
+
transactionHash?: Hex;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=server-submit.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/server/server-submit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,yBAAyB,EAG1B,wBAAoB;AAYrB,OAAO,KAAK,EACV,WAAW,EAIZ,oBAAgB;AAKjB;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAgBpC"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { ORIGIN_METAMASK, toHex } from "@metamask/controller-utils";
|
|
2
|
+
import { createModuleLogger } from "@metamask/utils";
|
|
3
|
+
import { BigNumber } from "bignumber.js";
|
|
4
|
+
import { projectLogger } from "../../logger.mjs";
|
|
5
|
+
import { getServerPollingInterval, getServerPollingTimeout } from "../../utils/feature-flags.mjs";
|
|
6
|
+
import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
|
|
7
|
+
import { getServerStatus, submitServerIntent } from "./server-api.mjs";
|
|
8
|
+
import { ServerStatus } from "./types.mjs";
|
|
9
|
+
const log = createModuleLogger(projectLogger, 'server-strategy');
|
|
10
|
+
/**
|
|
11
|
+
* Submits server intent quotes.
|
|
12
|
+
*
|
|
13
|
+
* @param request - Request object.
|
|
14
|
+
* @returns An object containing the transaction hash if available.
|
|
15
|
+
*/
|
|
16
|
+
export async function submitServerQuotes(request) {
|
|
17
|
+
log('Executing server quotes', request);
|
|
18
|
+
const { quotes, messenger, transaction } = request;
|
|
19
|
+
let transactionHash;
|
|
20
|
+
for (const quote of quotes) {
|
|
21
|
+
({ transactionHash } = await executeSingleServerQuote(quote, messenger, transaction));
|
|
22
|
+
}
|
|
23
|
+
return { transactionHash };
|
|
24
|
+
}
|
|
25
|
+
async function executeSingleServerQuote(quote, messenger, transaction) {
|
|
26
|
+
log('Executing single server quote', quote);
|
|
27
|
+
updateTransaction({
|
|
28
|
+
transactionId: transaction.id,
|
|
29
|
+
messenger,
|
|
30
|
+
note: 'Remove nonce from skipped transaction',
|
|
31
|
+
}, (tx) => {
|
|
32
|
+
tx.txParams.nonce = undefined;
|
|
33
|
+
});
|
|
34
|
+
if (quote.original.gasless) {
|
|
35
|
+
await submitViaServerExecute(quote, messenger, transaction);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
await submitViaTransactionController(quote, messenger, transaction);
|
|
39
|
+
}
|
|
40
|
+
const targetHash = await waitForServerCompletion(quote.original, messenger, transaction.id);
|
|
41
|
+
log('Server request completed', targetHash);
|
|
42
|
+
updateTransaction({
|
|
43
|
+
transactionId: transaction.id,
|
|
44
|
+
messenger,
|
|
45
|
+
note: 'Intent complete after Server completion',
|
|
46
|
+
}, (tx) => {
|
|
47
|
+
tx.isIntentComplete = true;
|
|
48
|
+
});
|
|
49
|
+
return { transactionHash: targetHash };
|
|
50
|
+
}
|
|
51
|
+
async function submitViaServerExecute(quote, messenger, transaction) {
|
|
52
|
+
const { from, sourceChainId } = quote.request;
|
|
53
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', sourceChainId);
|
|
54
|
+
const nestedTransactions = quote.original.steps.map((step) => ({
|
|
55
|
+
data: step.data,
|
|
56
|
+
to: step.to,
|
|
57
|
+
value: step.value,
|
|
58
|
+
}));
|
|
59
|
+
const sourceCallTransaction = {
|
|
60
|
+
...transaction,
|
|
61
|
+
chainId: sourceChainId,
|
|
62
|
+
networkClientId,
|
|
63
|
+
nestedTransactions,
|
|
64
|
+
txParams: {
|
|
65
|
+
...transaction.txParams,
|
|
66
|
+
from,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
const delegation = await messenger.call('TransactionPayController:getDelegationTransaction', { transaction: sourceCallTransaction });
|
|
70
|
+
log('Delegation result for server source calls', delegation);
|
|
71
|
+
const submitBody = {
|
|
72
|
+
provider: quote.original.provider,
|
|
73
|
+
id: quote.original.id,
|
|
74
|
+
chainId: Number(sourceChainId),
|
|
75
|
+
to: delegation.to,
|
|
76
|
+
data: delegation.data,
|
|
77
|
+
value: new BigNumber(delegation.value).toFixed(),
|
|
78
|
+
...(delegation.authorizationList?.length
|
|
79
|
+
? {
|
|
80
|
+
authorizationList: delegation.authorizationList.map((auth) => ({
|
|
81
|
+
chainId: Number(auth.chainId),
|
|
82
|
+
address: auth.address,
|
|
83
|
+
nonce: Number(auth.nonce),
|
|
84
|
+
yParity: Number(auth.yParity),
|
|
85
|
+
r: auth.r,
|
|
86
|
+
s: auth.s,
|
|
87
|
+
})),
|
|
88
|
+
}
|
|
89
|
+
: {}),
|
|
90
|
+
};
|
|
91
|
+
const submitResponse = await submitServerIntent(messenger, submitBody);
|
|
92
|
+
if (!submitResponse.success) {
|
|
93
|
+
throw new Error(`Server submit failed: ${submitResponse.error ?? 'unknown'}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function submitViaTransactionController(quote, messenger, transaction) {
|
|
97
|
+
const { from, sourceChainId, sourceTokenAddress } = quote.request;
|
|
98
|
+
const { steps } = quote.original;
|
|
99
|
+
if (steps.length === 0) {
|
|
100
|
+
throw new Error('Server quote has no steps to submit');
|
|
101
|
+
}
|
|
102
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', sourceChainId);
|
|
103
|
+
const { gasLimits, is7702, maxFeePerGas, maxPriorityFeePerGas } = quote.original.client;
|
|
104
|
+
const transactionParams = steps.map((step, i) => stepToParams(step, from, gasLimits[i], maxFeePerGas, maxPriorityFeePerGas));
|
|
105
|
+
const gasFeeToken = quote.fees.isSourceGasFeeToken
|
|
106
|
+
? sourceTokenAddress
|
|
107
|
+
: undefined;
|
|
108
|
+
log('Submitting via TransactionController', {
|
|
109
|
+
from,
|
|
110
|
+
gasFeeToken,
|
|
111
|
+
is7702,
|
|
112
|
+
networkClientId,
|
|
113
|
+
sourceChainId,
|
|
114
|
+
stepCount: steps.length,
|
|
115
|
+
});
|
|
116
|
+
const transactionIds = [];
|
|
117
|
+
const { end } = collectTransactionIds(sourceChainId, from, messenger, (transactionId) => {
|
|
118
|
+
transactionIds.push(transactionId);
|
|
119
|
+
updateTransaction({
|
|
120
|
+
transactionId: transaction.id,
|
|
121
|
+
messenger,
|
|
122
|
+
note: 'Add required transaction ID from server submission',
|
|
123
|
+
}, (tx) => {
|
|
124
|
+
tx.requiredTransactionIds ?? (tx.requiredTransactionIds = []);
|
|
125
|
+
tx.requiredTransactionIds.push(transactionId);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
try {
|
|
129
|
+
if (transactionParams.length === 1) {
|
|
130
|
+
const addTransactionOptions = {
|
|
131
|
+
gasFeeToken,
|
|
132
|
+
isInternal: true,
|
|
133
|
+
networkClientId,
|
|
134
|
+
origin: ORIGIN_METAMASK,
|
|
135
|
+
requireApproval: false,
|
|
136
|
+
};
|
|
137
|
+
log('Calling addTransaction', {
|
|
138
|
+
params: transactionParams[0],
|
|
139
|
+
options: addTransactionOptions,
|
|
140
|
+
});
|
|
141
|
+
await messenger.call('TransactionController:addTransaction', transactionParams[0], addTransactionOptions);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const gasLimit7702 = is7702 ? toHex(gasLimits[0]) : undefined;
|
|
145
|
+
const batchTransactions = transactionParams.map((params, i) => {
|
|
146
|
+
const gas = (gasLimit7702 ??
|
|
147
|
+
(gasLimits[i] === undefined ? undefined : params.gas));
|
|
148
|
+
return {
|
|
149
|
+
params: {
|
|
150
|
+
data: params.data,
|
|
151
|
+
gas,
|
|
152
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
153
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
154
|
+
to: params.to,
|
|
155
|
+
value: params.value,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
const addTransactionBatchOptions = {
|
|
160
|
+
from,
|
|
161
|
+
...(gasLimit7702 === undefined
|
|
162
|
+
? { disable7702: true }
|
|
163
|
+
: {
|
|
164
|
+
disable7702: false,
|
|
165
|
+
disableHook: true,
|
|
166
|
+
disableSequential: true,
|
|
167
|
+
gasLimit7702,
|
|
168
|
+
}),
|
|
169
|
+
gasFeeToken,
|
|
170
|
+
isInternal: true,
|
|
171
|
+
networkClientId,
|
|
172
|
+
origin: ORIGIN_METAMASK,
|
|
173
|
+
overwriteUpgrade: true,
|
|
174
|
+
requireApproval: false,
|
|
175
|
+
transactions: batchTransactions,
|
|
176
|
+
};
|
|
177
|
+
log('Calling addTransactionBatch', addTransactionBatchOptions);
|
|
178
|
+
await messenger.call('TransactionController:addTransactionBatch', addTransactionBatchOptions);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
end();
|
|
183
|
+
}
|
|
184
|
+
log('Server transactions added', transactionIds);
|
|
185
|
+
await Promise.all(transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)));
|
|
186
|
+
log('Server transactions confirmed', transactionIds);
|
|
187
|
+
const lastId = transactionIds.at(-1);
|
|
188
|
+
const sourceHash = lastId
|
|
189
|
+
? getTransaction(lastId, messenger)?.hash
|
|
190
|
+
: undefined;
|
|
191
|
+
if (sourceHash) {
|
|
192
|
+
updateTransaction({
|
|
193
|
+
transactionId: transaction.id,
|
|
194
|
+
messenger,
|
|
195
|
+
note: 'Add source hash from server transaction submission',
|
|
196
|
+
}, (tx) => {
|
|
197
|
+
tx.metamaskPay ?? (tx.metamaskPay = {});
|
|
198
|
+
tx.metamaskPay.sourceHash = sourceHash;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function stepToParams(step, from, gasLimit, clientMaxFeePerGas, clientMaxPriorityFeePerGas) {
|
|
203
|
+
let gas;
|
|
204
|
+
if (gasLimit) {
|
|
205
|
+
gas = toHex(gasLimit);
|
|
206
|
+
}
|
|
207
|
+
else if (step.gasLimit) {
|
|
208
|
+
gas = toHex(step.gasLimit);
|
|
209
|
+
}
|
|
210
|
+
const resolvedMaxFeePerGas = step.maxFeePerGas ?? clientMaxFeePerGas;
|
|
211
|
+
const resolvedMaxPriorityFeePerGas = step.maxPriorityFeePerGas ?? clientMaxPriorityFeePerGas;
|
|
212
|
+
const params = {
|
|
213
|
+
data: step.data,
|
|
214
|
+
from,
|
|
215
|
+
gas,
|
|
216
|
+
maxFeePerGas: resolvedMaxFeePerGas
|
|
217
|
+
? toHex(resolvedMaxFeePerGas)
|
|
218
|
+
: undefined,
|
|
219
|
+
maxPriorityFeePerGas: resolvedMaxPriorityFeePerGas
|
|
220
|
+
? toHex(resolvedMaxPriorityFeePerGas)
|
|
221
|
+
: undefined,
|
|
222
|
+
to: step.to,
|
|
223
|
+
value: toHex(step.value),
|
|
224
|
+
};
|
|
225
|
+
log('Step to params', {
|
|
226
|
+
step: {
|
|
227
|
+
gasLimit: step.gasLimit,
|
|
228
|
+
maxFeePerGas: step.maxFeePerGas,
|
|
229
|
+
maxPriorityFeePerGas: step.maxPriorityFeePerGas,
|
|
230
|
+
value: step.value,
|
|
231
|
+
},
|
|
232
|
+
params: {
|
|
233
|
+
gas: params.gas,
|
|
234
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
235
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
236
|
+
value: params.value,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
return params;
|
|
240
|
+
}
|
|
241
|
+
async function waitForServerCompletion(quote, messenger, transactionId) {
|
|
242
|
+
const pollingInterval = getServerPollingInterval(messenger);
|
|
243
|
+
const pollingTimeout = getServerPollingTimeout(messenger);
|
|
244
|
+
const hasTimeout = pollingTimeout !== undefined && pollingTimeout > 0;
|
|
245
|
+
log('Server polling config', { pollingInterval, pollingTimeout });
|
|
246
|
+
const startTime = Date.now();
|
|
247
|
+
let lastStatus;
|
|
248
|
+
let sourceHashEmitted = false;
|
|
249
|
+
while (true) {
|
|
250
|
+
let statusResponse;
|
|
251
|
+
try {
|
|
252
|
+
const tx = getTransaction(transactionId, messenger);
|
|
253
|
+
statusResponse = await getServerStatus(messenger, {
|
|
254
|
+
provider: quote.provider,
|
|
255
|
+
id: quote.id,
|
|
256
|
+
hash: tx?.metamaskPay?.sourceHash ?? tx?.hash,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
log('Polling network error', error);
|
|
261
|
+
}
|
|
262
|
+
if (statusResponse) {
|
|
263
|
+
lastStatus = statusResponse.status;
|
|
264
|
+
log('Polled status', statusResponse.status, statusResponse);
|
|
265
|
+
if (!sourceHashEmitted && statusResponse.sourceHash) {
|
|
266
|
+
sourceHashEmitted = true;
|
|
267
|
+
const { sourceHash } = statusResponse;
|
|
268
|
+
updateTransaction({
|
|
269
|
+
transactionId,
|
|
270
|
+
messenger,
|
|
271
|
+
note: 'Add source hash from server status',
|
|
272
|
+
}, (tx) => {
|
|
273
|
+
tx.metamaskPay ?? (tx.metamaskPay = {});
|
|
274
|
+
tx.metamaskPay.sourceHash = sourceHash;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
if (statusResponse.status === ServerStatus.Confirmed) {
|
|
278
|
+
return statusResponse.targetHash ?? '0x';
|
|
279
|
+
}
|
|
280
|
+
if (statusResponse.status === ServerStatus.Failed ||
|
|
281
|
+
statusResponse.status === ServerStatus.Refunded) {
|
|
282
|
+
throw new Error(`Server intent ${statusResponse.status.toLowerCase()}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (hasTimeout && Date.now() - startTime >= pollingTimeout) {
|
|
286
|
+
const statusDetail = lastStatus ? ` (last status: ${lastStatus})` : '';
|
|
287
|
+
throw new Error(`Server polling timed out${statusDetail}`);
|
|
288
|
+
}
|
|
289
|
+
await new Promise((resolve) => setTimeout(resolve, pollingInterval));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=server-submit.mjs.map
|