@metamask/transaction-pay-controller 3.1.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/dist/TransactionPayController.cjs +6 -3
  3. package/dist/TransactionPayController.cjs.map +1 -1
  4. package/dist/TransactionPayController.d.cts +1 -1
  5. package/dist/TransactionPayController.d.cts.map +1 -1
  6. package/dist/TransactionPayController.d.mts +1 -1
  7. package/dist/TransactionPayController.d.mts.map +1 -1
  8. package/dist/TransactionPayController.mjs +6 -3
  9. package/dist/TransactionPayController.mjs.map +1 -1
  10. package/dist/actions/update-payment-token.cjs.map +1 -1
  11. package/dist/actions/update-payment-token.mjs.map +1 -1
  12. package/dist/helpers/QuoteRefresher.cjs.map +1 -1
  13. package/dist/helpers/QuoteRefresher.mjs.map +1 -1
  14. package/dist/helpers/TransactionPayPublishHook.cjs.map +1 -1
  15. package/dist/helpers/TransactionPayPublishHook.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +1 -1
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +1 -1
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
  23. package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
  24. package/dist/strategy/bridge/bridge-submit.cjs +1 -24
  25. package/dist/strategy/bridge/bridge-submit.cjs.map +1 -1
  26. package/dist/strategy/bridge/bridge-submit.d.cts.map +1 -1
  27. package/dist/strategy/bridge/bridge-submit.d.mts.map +1 -1
  28. package/dist/strategy/bridge/bridge-submit.mjs +1 -24
  29. package/dist/strategy/bridge/bridge-submit.mjs.map +1 -1
  30. package/dist/strategy/relay/constants.cjs +4 -1
  31. package/dist/strategy/relay/constants.cjs.map +1 -1
  32. package/dist/strategy/relay/constants.d.cts +3 -0
  33. package/dist/strategy/relay/constants.d.cts.map +1 -1
  34. package/dist/strategy/relay/constants.d.mts +3 -0
  35. package/dist/strategy/relay/constants.d.mts.map +1 -1
  36. package/dist/strategy/relay/constants.mjs +3 -0
  37. package/dist/strategy/relay/constants.mjs.map +1 -1
  38. package/dist/strategy/relay/relay-quotes.cjs +87 -42
  39. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  40. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  41. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  42. package/dist/strategy/relay/relay-quotes.mjs +90 -45
  43. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  44. package/dist/strategy/relay/relay-submit.cjs +99 -55
  45. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  46. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  47. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  48. package/dist/strategy/relay/relay-submit.mjs +101 -57
  49. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  50. package/dist/strategy/relay/types.cjs.map +1 -1
  51. package/dist/strategy/relay/types.d.cts +8 -3
  52. package/dist/strategy/relay/types.d.cts.map +1 -1
  53. package/dist/strategy/relay/types.d.mts +8 -3
  54. package/dist/strategy/relay/types.d.mts.map +1 -1
  55. package/dist/strategy/relay/types.mjs.map +1 -1
  56. package/dist/tests/messenger-mock.cjs +6 -0
  57. package/dist/tests/messenger-mock.cjs.map +1 -1
  58. package/dist/tests/messenger-mock.d.cts +21 -22
  59. package/dist/tests/messenger-mock.d.cts.map +1 -1
  60. package/dist/tests/messenger-mock.d.mts +21 -22
  61. package/dist/tests/messenger-mock.d.mts.map +1 -1
  62. package/dist/tests/messenger-mock.mjs +6 -0
  63. package/dist/tests/messenger-mock.mjs.map +1 -1
  64. package/dist/types.cjs.map +1 -1
  65. package/dist/types.d.cts +18 -3
  66. package/dist/types.d.cts.map +1 -1
  67. package/dist/types.d.mts +18 -3
  68. package/dist/types.d.mts.map +1 -1
  69. package/dist/types.mjs.map +1 -1
  70. package/dist/utils/gas.cjs.map +1 -1
  71. package/dist/utils/gas.mjs.map +1 -1
  72. package/dist/utils/quotes.cjs.map +1 -1
  73. package/dist/utils/quotes.mjs.map +1 -1
  74. package/dist/utils/required-tokens.cjs.map +1 -1
  75. package/dist/utils/required-tokens.mjs.map +1 -1
  76. package/dist/utils/source-amounts.cjs.map +1 -1
  77. package/dist/utils/source-amounts.mjs.map +1 -1
  78. package/dist/utils/strategy.cjs.map +1 -1
  79. package/dist/utils/strategy.mjs.map +1 -1
  80. package/dist/utils/token.cjs.map +1 -1
  81. package/dist/utils/token.mjs.map +1 -1
  82. package/dist/utils/totals.cjs +1 -1
  83. package/dist/utils/totals.cjs.map +1 -1
  84. package/dist/utils/totals.d.cts.map +1 -1
  85. package/dist/utils/totals.d.mts.map +1 -1
  86. package/dist/utils/totals.mjs +1 -1
  87. package/dist/utils/totals.mjs.map +1 -1
  88. package/dist/utils/transaction.cjs +25 -1
  89. package/dist/utils/transaction.cjs.map +1 -1
  90. package/dist/utils/transaction.d.cts +13 -0
  91. package/dist/utils/transaction.d.cts.map +1 -1
  92. package/dist/utils/transaction.d.mts +13 -0
  93. package/dist/utils/transaction.d.mts.map +1 -1
  94. package/dist/utils/transaction.mjs +23 -0
  95. package/dist/utils/transaction.mjs.map +1 -1
  96. package/package.json +9 -9
@@ -2,10 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.submitRelayQuotes = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
+ const transaction_controller_1 = require("@metamask/transaction-controller");
5
6
  const utils_1 = require("@metamask/utils");
6
7
  const constants_1 = require("./constants.cjs");
7
8
  const logger_1 = require("../../logger.cjs");
8
9
  const transaction_1 = require("../../utils/transaction.cjs");
10
+ const FALLBACK_HASH = '0x0';
9
11
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'relay-strategy');
10
12
  /**
11
13
  * Submits Relay quotes.
@@ -20,12 +22,7 @@ async function submitRelayQuotes(request) {
20
22
  for (const quote of quotes) {
21
23
  ({ transactionHash } = await executeSingleQuote(quote.original, messenger, transaction));
22
24
  }
23
- const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);
24
- if (isSkipTransaction) {
25
- log('Skipping original transaction', transactionHash);
26
- return { transactionHash };
27
- }
28
- return { transactionHash: undefined };
25
+ return { transactionHash };
29
26
  }
30
27
  exports.submitRelayQuotes = submitRelayQuotes;
31
28
  /**
@@ -44,56 +41,25 @@ async function executeSingleQuote(quote, messenger, transaction) {
44
41
  }
45
42
  const transactionParams = quote.steps[0].items[0].data;
46
43
  const chainId = (0, controller_utils_1.toHex)(transactionParams.chainId);
47
- const normalizedParams = normalizeParams(transactionParams);
48
- const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
49
- log('Adding transaction', {
50
- chainId,
51
- normalizedParams,
52
- networkClientId,
53
- });
54
- if (quote.skipTransaction) {
55
- (0, transaction_1.updateTransaction)({
56
- transactionId: transaction.id,
57
- messenger,
58
- note: 'Remove nonce from skipped transaction',
59
- }, (tx) => {
60
- tx.txParams.nonce = undefined;
61
- });
62
- }
63
- const result = await messenger.call('TransactionController:addTransaction', normalizedParams, {
64
- networkClientId,
65
- origin: controller_utils_1.ORIGIN_METAMASK,
66
- requireApproval: false,
44
+ const from = transactionParams.from;
45
+ (0, transaction_1.updateTransaction)({
46
+ transactionId: transaction.id,
47
+ messenger,
48
+ note: 'Remove nonce from skipped transaction',
49
+ }, (tx) => {
50
+ tx.txParams.nonce = undefined;
67
51
  });
68
- const { transactionMeta, result: transactionHashPromise } = result;
52
+ await submitTransactions(quote, chainId, from, transaction.id, messenger);
53
+ const targetHash = await waitForRelayCompletion(quote);
54
+ log('Relay request completed', targetHash);
69
55
  (0, transaction_1.updateTransaction)({
70
56
  transactionId: transaction.id,
71
57
  messenger,
72
- note: 'Add required transaction ID',
58
+ note: 'Intent complete after Relay completion',
73
59
  }, (tx) => {
74
- if (!tx.requiredTransactionIds) {
75
- tx.requiredTransactionIds = [];
76
- }
77
- tx.requiredTransactionIds.push(transactionMeta.id);
60
+ tx.isIntentComplete = true;
78
61
  });
79
- log('Added transaction', transactionMeta);
80
- const transactionHash = (await transactionHashPromise);
81
- log('Submitted transaction', transactionHash);
82
- await (0, transaction_1.waitForTransactionConfirmed)(transactionMeta.id, messenger);
83
- log('Transaction confirmed', transactionMeta.id);
84
- await waitForRelayCompletion(quote);
85
- log('Relay request completed');
86
- if (quote.skipTransaction) {
87
- log('Updating intent complete flag on transaction', transaction.id);
88
- (0, transaction_1.updateTransaction)({
89
- transactionId: transaction.id,
90
- messenger,
91
- note: 'Intent complete after Relay completion',
92
- }, (tx) => {
93
- tx.isIntentComplete = true;
94
- });
95
- }
96
- return { transactionHash };
62
+ return { transactionHash: targetHash };
97
63
  }
98
64
  /**
99
65
  * Wait for a Relay request to complete.
@@ -102,19 +68,27 @@ async function executeSingleQuote(quote, messenger, transaction) {
102
68
  * @returns A promise that resolves when the Relay request is complete.
103
69
  */
104
70
  async function waitForRelayCompletion(quote) {
105
- const { endpoint, method } = quote.steps[0].items[0].check;
71
+ if (quote.details.currencyIn.currency.chainId ===
72
+ quote.details.currencyOut.currency.chainId) {
73
+ log('Skipping polling as same chain');
74
+ return FALLBACK_HASH;
75
+ }
76
+ const { endpoint, method } = quote.steps
77
+ .slice(-1)[0]
78
+ .items.slice(-1)[0].check;
106
79
  const url = `${constants_1.RELAY_URL_BASE}${endpoint}`;
107
80
  while (true) {
108
81
  const response = await (0, controller_utils_1.successfulFetch)(url, { method });
109
82
  const status = (await response.json());
110
83
  log('Polled status', status.status, status);
111
84
  if (status.status === 'success') {
112
- return;
85
+ const targetHash = status.txHashes?.slice(-1)[0];
86
+ return targetHash ?? FALLBACK_HASH;
113
87
  }
114
- if (['failure', 'refund'].includes(status.status)) {
88
+ if (['failure', 'refund', 'fallback'].includes(status.status)) {
115
89
  throw new Error(`Relay request failed with status: ${status.status}`);
116
90
  }
117
- await new Promise((resolve) => setTimeout(resolve, 1000));
91
+ await new Promise((resolve) => setTimeout(resolve, constants_1.RELAY_POLLING_INTERVAL));
118
92
  }
119
93
  }
120
94
  /**
@@ -127,11 +101,81 @@ function normalizeParams(params) {
127
101
  return {
128
102
  data: params.data,
129
103
  from: params.from,
130
- gas: (0, controller_utils_1.toHex)(params.gas),
104
+ gas: (0, controller_utils_1.toHex)(params.gas ?? constants_1.RELAY_FALLBACK_GAS_LIMIT),
131
105
  maxFeePerGas: (0, controller_utils_1.toHex)(params.maxFeePerGas),
132
106
  maxPriorityFeePerGas: (0, controller_utils_1.toHex)(params.maxPriorityFeePerGas),
133
107
  to: params.to,
134
108
  value: (0, controller_utils_1.toHex)(params.value ?? '0'),
135
109
  };
136
110
  }
111
+ /**
112
+ * Submit transactions for a relay quote.
113
+ *
114
+ * @param quote - Relay quote.
115
+ * @param chainId - ID of the chain.
116
+ * @param from - Address of the sender.
117
+ * @param parentTransactionId - ID of the parent transaction.
118
+ * @param messenger - Controller messenger.
119
+ * @returns Hash of the last submitted transaction.
120
+ */
121
+ async function submitTransactions(quote, chainId, from, parentTransactionId, messenger) {
122
+ const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);
123
+ const normalizedParams = params.map(normalizeParams);
124
+ const transactionIds = [];
125
+ const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
126
+ log('Adding transactions', {
127
+ normalizedParams,
128
+ chainId,
129
+ from,
130
+ networkClientId,
131
+ });
132
+ const { end } = (0, transaction_1.collectTransactionIds)(chainId, from, messenger, (transactionId) => {
133
+ transactionIds.push(transactionId);
134
+ (0, transaction_1.updateTransaction)({
135
+ transactionId: parentTransactionId,
136
+ messenger,
137
+ note: 'Add required transaction ID from Relay submission',
138
+ }, (tx) => {
139
+ if (!tx.requiredTransactionIds) {
140
+ tx.requiredTransactionIds = [];
141
+ }
142
+ tx.requiredTransactionIds.push(transactionId);
143
+ });
144
+ });
145
+ let result;
146
+ if (params.length === 1) {
147
+ result = await messenger.call('TransactionController:addTransaction', normalizedParams[0], {
148
+ networkClientId,
149
+ origin: controller_utils_1.ORIGIN_METAMASK,
150
+ requireApproval: false,
151
+ });
152
+ }
153
+ else {
154
+ await messenger.call('TransactionController:addTransactionBatch', {
155
+ from,
156
+ networkClientId,
157
+ origin: controller_utils_1.ORIGIN_METAMASK,
158
+ requireApproval: false,
159
+ transactions: normalizedParams.map((p, i) => ({
160
+ params: {
161
+ data: p.data,
162
+ gas: p.gas,
163
+ to: p.to,
164
+ value: p.value,
165
+ },
166
+ type: i === 0 ? transaction_controller_1.TransactionType.tokenMethodApprove : undefined,
167
+ })),
168
+ });
169
+ }
170
+ end();
171
+ log('Added transactions', transactionIds);
172
+ if (result) {
173
+ const txHash = await result.result;
174
+ log('Submitted transaction', txHash);
175
+ }
176
+ await Promise.all(transactionIds.map((txId) => (0, transaction_1.waitForTransactionConfirmed)(txId, messenger)));
177
+ log('All transactions confirmed', transactionIds);
178
+ const hash = (0, transaction_1.getTransaction)(transactionIds.slice(-1)[0], messenger)?.hash;
179
+ return hash;
180
+ }
137
181
  //# sourceMappingURL=relay-submit.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_URL_BASE } from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing 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 executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);\n\n if (isSkipTransaction) {\n log('Skipping original transaction', transactionHash);\n return { transactionHash };\n }\n\n return { transactionHash: undefined };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const normalizedParams = normalizeParams(transactionParams);\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transaction', {\n chainId,\n normalizedParams,\n networkClientId,\n });\n\n if (quote.skipTransaction) {\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\n const result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams,\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n\n const { transactionMeta, result: transactionHashPromise } = result;\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionMeta.id);\n },\n );\n\n log('Added transaction', transactionMeta);\n\n const transactionHash = (await transactionHashPromise) as Hex;\n\n log('Submitted transaction', transactionHash);\n\n await waitForTransactionConfirmed(transactionMeta.id, messenger);\n\n log('Transaction confirmed', transactionMeta.id);\n\n await waitForRelayCompletion(quote);\n\n log('Relay request completed');\n\n if (quote.skipTransaction) {\n log('Updating intent complete flag on transaction', transaction.id);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n }\n\n return { transactionHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote) {\n const { endpoint, method } = quote.steps[0].items[0].check;\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n return;\n }\n\n if (['failure', 'refund'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n"]}
1
+ {"version":3,"file":"relay-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport {\n TransactionType,\n type TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport {\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_POLLING_INTERVAL,\n RELAY_URL_BASE,\n} from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst FALLBACK_HASH = '0x0' as Hex;\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing 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 executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n return { transactionHash };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const from = transactionParams.from as Hex;\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 await submitTransactions(quote, chainId, from, transaction.id, messenger);\n\n const targetHash = await waitForRelayCompletion(quote);\n\n log('Relay request completed', targetHash);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash: targetHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote): Promise<Hex> {\n if (\n quote.details.currencyIn.currency.chainId ===\n quote.details.currencyOut.currency.chainId\n ) {\n log('Skipping polling as same chain');\n return FALLBACK_HASH;\n }\n\n const { endpoint, method } = quote.steps\n .slice(-1)[0]\n .items.slice(-1)[0].check;\n\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n const targetHash = status.txHashes?.slice(-1)[0] as Hex;\n return targetHash ?? FALLBACK_HASH;\n }\n\n if (['failure', 'refund', 'fallback'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, RELAY_POLLING_INTERVAL));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas ?? RELAY_FALLBACK_GAS_LIMIT),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n\n/**\n * Submit transactions for a relay quote.\n *\n * @param quote - Relay quote.\n * @param chainId - ID of the chain.\n * @param from - Address of the sender.\n * @param parentTransactionId - ID of the parent transaction.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitTransactions(\n quote: RelayQuote,\n chainId: Hex,\n from: Hex,\n parentTransactionId: string,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex> {\n const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);\n const normalizedParams = params.map(normalizeParams);\n const transactionIds: string[] = [];\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transactions', {\n normalizedParams,\n chainId,\n from,\n networkClientId,\n });\n\n const { end } = collectTransactionIds(\n chainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: parentTransactionId,\n messenger,\n note: 'Add required transaction ID from Relay submission',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n let result: { result: Promise<string> } | undefined;\n\n if (params.length === 1) {\n result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams[0],\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n } else {\n await messenger.call('TransactionController:addTransactionBatch', {\n from,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n transactions: normalizedParams.map((p, i) => ({\n params: {\n data: p.data as Hex,\n gas: p.gas as Hex,\n to: p.to as Hex,\n value: p.value as Hex,\n },\n type: i === 0 ? TransactionType.tokenMethodApprove : undefined,\n })),\n });\n }\n\n end();\n\n log('Added transactions', transactionIds);\n\n if (result) {\n const txHash = await result.result;\n log('Submitted transaction', txHash);\n }\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n log('All transactions confirmed', transactionIds);\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n return hash as Hex;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAgB;AAEvD,OAAO,KAAK,EACV,yBAAyB,EAE1B,wBAAoB;AAQrB;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAuBpC"}
1
+ {"version":3,"file":"relay-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAQ3C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAgB;AAEvD,OAAO,KAAK,EACV,yBAAyB,EAE1B,wBAAoB;AAYrB;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAgBpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAgB;AAEvD,OAAO,KAAK,EACV,yBAAyB,EAE1B,wBAAoB;AAQrB;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAuBpC"}
1
+ {"version":3,"file":"relay-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAQ3C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAgB;AAEvD,OAAO,KAAK,EACV,yBAAyB,EAE1B,wBAAoB;AAYrB;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAgBpC"}
@@ -1,8 +1,10 @@
1
1
  import { ORIGIN_METAMASK, successfulFetch, toHex } from "@metamask/controller-utils";
2
+ import { TransactionType } from "@metamask/transaction-controller";
2
3
  import { createModuleLogger } from "@metamask/utils";
3
- import { RELAY_URL_BASE } from "./constants.mjs";
4
+ import { RELAY_FALLBACK_GAS_LIMIT, RELAY_POLLING_INTERVAL, RELAY_URL_BASE } from "./constants.mjs";
4
5
  import { projectLogger } from "../../logger.mjs";
5
- import { updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
6
+ import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
7
+ const FALLBACK_HASH = '0x0';
6
8
  const log = createModuleLogger(projectLogger, 'relay-strategy');
7
9
  /**
8
10
  * Submits Relay quotes.
@@ -17,12 +19,7 @@ export async function submitRelayQuotes(request) {
17
19
  for (const quote of quotes) {
18
20
  ({ transactionHash } = await executeSingleQuote(quote.original, messenger, transaction));
19
21
  }
20
- const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);
21
- if (isSkipTransaction) {
22
- log('Skipping original transaction', transactionHash);
23
- return { transactionHash };
24
- }
25
- return { transactionHash: undefined };
22
+ return { transactionHash };
26
23
  }
27
24
  /**
28
25
  * Executes a single Relay quote.
@@ -40,56 +37,25 @@ async function executeSingleQuote(quote, messenger, transaction) {
40
37
  }
41
38
  const transactionParams = quote.steps[0].items[0].data;
42
39
  const chainId = toHex(transactionParams.chainId);
43
- const normalizedParams = normalizeParams(transactionParams);
44
- const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
45
- log('Adding transaction', {
46
- chainId,
47
- normalizedParams,
48
- networkClientId,
49
- });
50
- if (quote.skipTransaction) {
51
- updateTransaction({
52
- transactionId: transaction.id,
53
- messenger,
54
- note: 'Remove nonce from skipped transaction',
55
- }, (tx) => {
56
- tx.txParams.nonce = undefined;
57
- });
58
- }
59
- const result = await messenger.call('TransactionController:addTransaction', normalizedParams, {
60
- networkClientId,
61
- origin: ORIGIN_METAMASK,
62
- requireApproval: false,
40
+ const from = transactionParams.from;
41
+ updateTransaction({
42
+ transactionId: transaction.id,
43
+ messenger,
44
+ note: 'Remove nonce from skipped transaction',
45
+ }, (tx) => {
46
+ tx.txParams.nonce = undefined;
63
47
  });
64
- const { transactionMeta, result: transactionHashPromise } = result;
48
+ await submitTransactions(quote, chainId, from, transaction.id, messenger);
49
+ const targetHash = await waitForRelayCompletion(quote);
50
+ log('Relay request completed', targetHash);
65
51
  updateTransaction({
66
52
  transactionId: transaction.id,
67
53
  messenger,
68
- note: 'Add required transaction ID',
54
+ note: 'Intent complete after Relay completion',
69
55
  }, (tx) => {
70
- if (!tx.requiredTransactionIds) {
71
- tx.requiredTransactionIds = [];
72
- }
73
- tx.requiredTransactionIds.push(transactionMeta.id);
56
+ tx.isIntentComplete = true;
74
57
  });
75
- log('Added transaction', transactionMeta);
76
- const transactionHash = (await transactionHashPromise);
77
- log('Submitted transaction', transactionHash);
78
- await waitForTransactionConfirmed(transactionMeta.id, messenger);
79
- log('Transaction confirmed', transactionMeta.id);
80
- await waitForRelayCompletion(quote);
81
- log('Relay request completed');
82
- if (quote.skipTransaction) {
83
- log('Updating intent complete flag on transaction', transaction.id);
84
- updateTransaction({
85
- transactionId: transaction.id,
86
- messenger,
87
- note: 'Intent complete after Relay completion',
88
- }, (tx) => {
89
- tx.isIntentComplete = true;
90
- });
91
- }
92
- return { transactionHash };
58
+ return { transactionHash: targetHash };
93
59
  }
94
60
  /**
95
61
  * Wait for a Relay request to complete.
@@ -98,19 +64,27 @@ async function executeSingleQuote(quote, messenger, transaction) {
98
64
  * @returns A promise that resolves when the Relay request is complete.
99
65
  */
100
66
  async function waitForRelayCompletion(quote) {
101
- const { endpoint, method } = quote.steps[0].items[0].check;
67
+ if (quote.details.currencyIn.currency.chainId ===
68
+ quote.details.currencyOut.currency.chainId) {
69
+ log('Skipping polling as same chain');
70
+ return FALLBACK_HASH;
71
+ }
72
+ const { endpoint, method } = quote.steps
73
+ .slice(-1)[0]
74
+ .items.slice(-1)[0].check;
102
75
  const url = `${RELAY_URL_BASE}${endpoint}`;
103
76
  while (true) {
104
77
  const response = await successfulFetch(url, { method });
105
78
  const status = (await response.json());
106
79
  log('Polled status', status.status, status);
107
80
  if (status.status === 'success') {
108
- return;
81
+ const targetHash = status.txHashes?.slice(-1)[0];
82
+ return targetHash ?? FALLBACK_HASH;
109
83
  }
110
- if (['failure', 'refund'].includes(status.status)) {
84
+ if (['failure', 'refund', 'fallback'].includes(status.status)) {
111
85
  throw new Error(`Relay request failed with status: ${status.status}`);
112
86
  }
113
- await new Promise((resolve) => setTimeout(resolve, 1000));
87
+ await new Promise((resolve) => setTimeout(resolve, RELAY_POLLING_INTERVAL));
114
88
  }
115
89
  }
116
90
  /**
@@ -123,11 +97,81 @@ function normalizeParams(params) {
123
97
  return {
124
98
  data: params.data,
125
99
  from: params.from,
126
- gas: toHex(params.gas),
100
+ gas: toHex(params.gas ?? RELAY_FALLBACK_GAS_LIMIT),
127
101
  maxFeePerGas: toHex(params.maxFeePerGas),
128
102
  maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),
129
103
  to: params.to,
130
104
  value: toHex(params.value ?? '0'),
131
105
  };
132
106
  }
107
+ /**
108
+ * Submit transactions for a relay quote.
109
+ *
110
+ * @param quote - Relay quote.
111
+ * @param chainId - ID of the chain.
112
+ * @param from - Address of the sender.
113
+ * @param parentTransactionId - ID of the parent transaction.
114
+ * @param messenger - Controller messenger.
115
+ * @returns Hash of the last submitted transaction.
116
+ */
117
+ async function submitTransactions(quote, chainId, from, parentTransactionId, messenger) {
118
+ const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);
119
+ const normalizedParams = params.map(normalizeParams);
120
+ const transactionIds = [];
121
+ const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
122
+ log('Adding transactions', {
123
+ normalizedParams,
124
+ chainId,
125
+ from,
126
+ networkClientId,
127
+ });
128
+ const { end } = collectTransactionIds(chainId, from, messenger, (transactionId) => {
129
+ transactionIds.push(transactionId);
130
+ updateTransaction({
131
+ transactionId: parentTransactionId,
132
+ messenger,
133
+ note: 'Add required transaction ID from Relay submission',
134
+ }, (tx) => {
135
+ if (!tx.requiredTransactionIds) {
136
+ tx.requiredTransactionIds = [];
137
+ }
138
+ tx.requiredTransactionIds.push(transactionId);
139
+ });
140
+ });
141
+ let result;
142
+ if (params.length === 1) {
143
+ result = await messenger.call('TransactionController:addTransaction', normalizedParams[0], {
144
+ networkClientId,
145
+ origin: ORIGIN_METAMASK,
146
+ requireApproval: false,
147
+ });
148
+ }
149
+ else {
150
+ await messenger.call('TransactionController:addTransactionBatch', {
151
+ from,
152
+ networkClientId,
153
+ origin: ORIGIN_METAMASK,
154
+ requireApproval: false,
155
+ transactions: normalizedParams.map((p, i) => ({
156
+ params: {
157
+ data: p.data,
158
+ gas: p.gas,
159
+ to: p.to,
160
+ value: p.value,
161
+ },
162
+ type: i === 0 ? TransactionType.tokenMethodApprove : undefined,
163
+ })),
164
+ });
165
+ }
166
+ end();
167
+ log('Added transactions', transactionIds);
168
+ if (result) {
169
+ const txHash = await result.result;
170
+ log('Submitted transaction', txHash);
171
+ }
172
+ await Promise.all(transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)));
173
+ log('All transactions confirmed', transactionIds);
174
+ const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;
175
+ return hash;
176
+ }
133
177
  //# sourceMappingURL=relay-submit.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_URL_BASE } from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing 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 executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);\n\n if (isSkipTransaction) {\n log('Skipping original transaction', transactionHash);\n return { transactionHash };\n }\n\n return { transactionHash: undefined };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const normalizedParams = normalizeParams(transactionParams);\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transaction', {\n chainId,\n normalizedParams,\n networkClientId,\n });\n\n if (quote.skipTransaction) {\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\n const result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams,\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n\n const { transactionMeta, result: transactionHashPromise } = result;\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionMeta.id);\n },\n );\n\n log('Added transaction', transactionMeta);\n\n const transactionHash = (await transactionHashPromise) as Hex;\n\n log('Submitted transaction', transactionHash);\n\n await waitForTransactionConfirmed(transactionMeta.id, messenger);\n\n log('Transaction confirmed', transactionMeta.id);\n\n await waitForRelayCompletion(quote);\n\n log('Relay request completed');\n\n if (quote.skipTransaction) {\n log('Updating intent complete flag on transaction', transaction.id);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n }\n\n return { transactionHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote) {\n const { endpoint, method } = quote.steps[0].items[0].check;\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n return;\n }\n\n if (['failure', 'refund'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n"]}
1
+ {"version":3,"file":"relay-submit.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport {\n TransactionType,\n type TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport {\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_POLLING_INTERVAL,\n RELAY_URL_BASE,\n} from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst FALLBACK_HASH = '0x0' as Hex;\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing 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 executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n return { transactionHash };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const from = transactionParams.from as Hex;\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 await submitTransactions(quote, chainId, from, transaction.id, messenger);\n\n const targetHash = await waitForRelayCompletion(quote);\n\n log('Relay request completed', targetHash);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash: targetHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote): Promise<Hex> {\n if (\n quote.details.currencyIn.currency.chainId ===\n quote.details.currencyOut.currency.chainId\n ) {\n log('Skipping polling as same chain');\n return FALLBACK_HASH;\n }\n\n const { endpoint, method } = quote.steps\n .slice(-1)[0]\n .items.slice(-1)[0].check;\n\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n const targetHash = status.txHashes?.slice(-1)[0] as Hex;\n return targetHash ?? FALLBACK_HASH;\n }\n\n if (['failure', 'refund', 'fallback'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, RELAY_POLLING_INTERVAL));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas ?? RELAY_FALLBACK_GAS_LIMIT),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n\n/**\n * Submit transactions for a relay quote.\n *\n * @param quote - Relay quote.\n * @param chainId - ID of the chain.\n * @param from - Address of the sender.\n * @param parentTransactionId - ID of the parent transaction.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitTransactions(\n quote: RelayQuote,\n chainId: Hex,\n from: Hex,\n parentTransactionId: string,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex> {\n const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);\n const normalizedParams = params.map(normalizeParams);\n const transactionIds: string[] = [];\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transactions', {\n normalizedParams,\n chainId,\n from,\n networkClientId,\n });\n\n const { end } = collectTransactionIds(\n chainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: parentTransactionId,\n messenger,\n note: 'Add required transaction ID from Relay submission',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n let result: { result: Promise<string> } | undefined;\n\n if (params.length === 1) {\n result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams[0],\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n } else {\n await messenger.call('TransactionController:addTransactionBatch', {\n from,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n transactions: normalizedParams.map((p, i) => ({\n params: {\n data: p.data as Hex,\n gas: p.gas as Hex,\n to: p.to as Hex,\n value: p.value as Hex,\n },\n type: i === 0 ? TransactionType.tokenMethodApprove : undefined,\n })),\n });\n }\n\n end();\n\n log('Added transactions', transactionIds);\n\n if (result) {\n const txHash = await result.result;\n log('Submitted transaction', txHash);\n }\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n log('All transactions confirmed', transactionIds);\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n return hash as Hex;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountUsd: string;\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n gas: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n to: Hex;\n value: string;\n };\n status: 'complete' | 'incomplete';\n }[];\n kind: 'transaction';\n }[];\n skipTransaction?: boolean;\n};\n\nexport type RelayStatus = {\n status:\n | 'refund'\n | 'waiting'\n | 'failure'\n | 'pending'\n | 'submitted'\n | 'success';\n inTxHashes: string[];\n txHashes: string[];\n updatedAt: number;\n originChainId: number;\n destinationChainId: number;\n};\n"]}
1
+ {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n chainId: number;\n decimals: number;\n };\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n chainId: number;\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n relayer: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas?: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n to: Hex;\n value: string;\n };\n status: 'complete' | 'incomplete';\n }[];\n kind: 'transaction';\n }[];\n};\n\nexport type RelayStatus = {\n status:\n | 'refund'\n | 'waiting'\n | 'failure'\n | 'pending'\n | 'submitted'\n | 'success';\n inTxHashes: string[];\n txHashes: string[];\n updatedAt: number;\n originChainId: number;\n destinationChainId: number;\n};\n"]}
@@ -2,12 +2,18 @@ import type { Hex } from "@metamask/utils";
2
2
  export type RelayQuote = {
3
3
  details: {
4
4
  currencyIn: {
5
+ amountFormatted: string;
5
6
  amountUsd: string;
7
+ currency: {
8
+ chainId: number;
9
+ decimals: number;
10
+ };
6
11
  };
7
12
  currencyOut: {
8
13
  amountFormatted: string;
9
14
  amountUsd: string;
10
15
  currency: {
16
+ chainId: number;
11
17
  decimals: number;
12
18
  };
13
19
  minimumAmount: string;
@@ -15,7 +21,7 @@ export type RelayQuote = {
15
21
  timeEstimate: number;
16
22
  };
17
23
  fees: {
18
- gas: {
24
+ relayer: {
19
25
  amountUsd: string;
20
26
  };
21
27
  };
@@ -29,7 +35,7 @@ export type RelayQuote = {
29
35
  chainId: number;
30
36
  data: Hex;
31
37
  from: Hex;
32
- gas: string;
38
+ gas?: string;
33
39
  maxFeePerGas: string;
34
40
  maxPriorityFeePerGas: string;
35
41
  to: Hex;
@@ -39,7 +45,6 @@ export type RelayQuote = {
39
45
  }[];
40
46
  kind: 'transaction';
41
47
  }[];
42
- skipTransaction?: boolean;
43
48
  };
44
49
  export type RelayStatus = {
45
50
  status: 'refund' | 'waiting' | 'failure' | 'pending' | 'submitted' | 'success';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE;QACP,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE;YACX,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;aACxB,CAAC;YACF,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC;gBACV,GAAG,EAAE,MAAM,CAAC;gBACZ,YAAY,EAAE,MAAM,CAAC;gBACrB,oBAAoB,EAAE,MAAM,CAAC;gBAC7B,EAAE,EAAE,GAAG,CAAC;gBACR,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;SACnC,EAAE,CAAC;QACJ,IAAI,EAAE,aAAa,CAAC;KACrB,EAAE,CAAC;IACJ,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EACF,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE;QACP,UAAU,EAAE;YACV,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM,CAAC;gBAChB,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;SACH,CAAC;QACF,WAAW,EAAE;YACX,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM,CAAC;gBAChB,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE;YACP,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;aACxB,CAAC;YACF,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC;gBACV,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,YAAY,EAAE,MAAM,CAAC;gBACrB,oBAAoB,EAAE,MAAM,CAAC;gBAC7B,EAAE,EAAE,GAAG,CAAC;gBACR,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;SACnC,EAAE,CAAC;QACJ,IAAI,EAAE,aAAa,CAAC;KACrB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EACF,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC"}