@metamask-previews/transaction-pay-controller 23.17.4-preview-8980fa5 → 23.17.4-preview-9a5366037

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 (32) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/dist/strategy/relay/relay-submit-execute.cjs +117 -0
  3. package/dist/strategy/relay/relay-submit-execute.cjs.map +1 -0
  4. package/dist/strategy/relay/relay-submit-execute.d.cts +7 -0
  5. package/dist/strategy/relay/relay-submit-execute.d.cts.map +1 -0
  6. package/dist/strategy/relay/relay-submit-execute.d.mts +7 -0
  7. package/dist/strategy/relay/relay-submit-execute.d.mts.map +1 -0
  8. package/dist/strategy/relay/relay-submit-execute.mjs +113 -0
  9. package/dist/strategy/relay/relay-submit-execute.mjs.map +1 -0
  10. package/dist/strategy/relay/relay-submit.cjs +12 -76
  11. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  12. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  13. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  14. package/dist/strategy/relay/relay-submit.mjs +12 -76
  15. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  16. package/dist/strategy/relay/types.cjs.map +1 -1
  17. package/dist/strategy/relay/types.d.cts +11 -0
  18. package/dist/strategy/relay/types.d.cts.map +1 -1
  19. package/dist/strategy/relay/types.d.mts +11 -0
  20. package/dist/strategy/relay/types.d.mts.map +1 -1
  21. package/dist/strategy/relay/types.mjs.map +1 -1
  22. package/dist/tests/messenger-mock.d.cts +1 -0
  23. package/dist/tests/messenger-mock.d.cts.map +1 -1
  24. package/dist/tests/messenger-mock.d.mts +1 -0
  25. package/dist/tests/messenger-mock.d.mts.map +1 -1
  26. package/dist/types.cjs.map +1 -1
  27. package/dist/types.d.cts +2 -1
  28. package/dist/types.d.cts.map +1 -1
  29. package/dist/types.d.mts +2 -1
  30. package/dist/types.d.mts.map +1 -1
  31. package/dist/types.mjs.map +1 -1
  32. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,10 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - Add an optional `isSubsidized` flag to `GetDelegationTransactionCallback` and send a signed `metamask` envelope with `executeVersion: 2` for Relay executes ([#9298](https://github.com/MetaMask/core/pull/9298))
13
+
10
14
  ### Changed
11
15
 
12
16
  - Refactor vault deposit utilities into shared `utils/` modules (`chomp`, `ma-vault-deposit`, `relay-post-ma-vault`) to prepare for the Relay Money Account deposit path ([#9303](https://github.com/MetaMask/core/pull/9303))
13
- - Bump `@metamask/messenger` from `^1.2.0` to `^2.0.0` ([#9392](https://github.com/MetaMask/core/pull/9392))
14
17
 
15
18
  ## [23.17.4]
16
19
 
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.submitViaRelayExecute = void 0;
4
+ const utils_1 = require("@metamask/utils");
5
+ const bignumber_js_1 = require("bignumber.js");
6
+ const logger_1 = require("../../logger.cjs");
7
+ const error_prefix_1 = require("../../utils/error-prefix.cjs");
8
+ const provider_1 = require("../../utils/provider.cjs");
9
+ const constants_1 = require("./constants.cjs");
10
+ const relay_api_1 = require("./relay-api.cjs");
11
+ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'relay-strategy');
12
+ const RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';
13
+ async function submitViaRelayExecute(quote, transaction, messenger, allParams) {
14
+ const isSubsidized = isSubsidizedRelayQuote(quote.original);
15
+ const requestId = getRelayExecuteRequestId(quote.original);
16
+ const metamask = getRelayExecuteMetamask(quote.original, isSubsidized);
17
+ const { from, sourceChainId } = quote.request;
18
+ const networkClientId = (0, provider_1.getNetworkClientId)(messenger, sourceChainId);
19
+ const executionTransaction = {
20
+ ...transaction,
21
+ chainId: sourceChainId,
22
+ networkClientId,
23
+ nestedTransactions: allParams.map((param) => ({
24
+ data: (param.data ?? '0x'),
25
+ to: param.to,
26
+ value: (param.value ?? '0x0'),
27
+ })),
28
+ txParams: {
29
+ ...transaction.txParams,
30
+ from,
31
+ },
32
+ };
33
+ const delegation = await messenger.call('TransactionPayController:getDelegationTransaction', { transaction: executionTransaction, isSubsidized });
34
+ log('Delegation result for execute', delegation);
35
+ const executeBody = {
36
+ executionKind: 'rawCalls',
37
+ data: {
38
+ chainId: Number(quote.request.sourceChainId),
39
+ to: delegation.to,
40
+ data: delegation.data,
41
+ value: new bignumber_js_1.BigNumber(delegation.value).toFixed(),
42
+ ...mapAuthorizationList(delegation.authorizationList),
43
+ },
44
+ executionOptions: {
45
+ subsidizeFees: false,
46
+ },
47
+ requestId,
48
+ metamask,
49
+ };
50
+ log('Submitting to Relay execute', { executeBody, from: quote.request.from });
51
+ let result;
52
+ try {
53
+ result = await (0, relay_api_1.submitRelayExecute)(messenger, executeBody);
54
+ }
55
+ catch (error) {
56
+ throw (0, error_prefix_1.prefixError)(error, RELAY_EXECUTE_ERROR_PREFIX);
57
+ }
58
+ log('Relay execute response', result);
59
+ // Server may return a different requestId (e.g. after JIT quote for subsidized).
60
+ // Replace the original quote requestId so waitForRelayCompletion polls the correct request.
61
+ replaceFirstStepRequestId(quote.original, result.requestId);
62
+ return constants_1.FALLBACK_HASH;
63
+ }
64
+ exports.submitViaRelayExecute = submitViaRelayExecute;
65
+ function isSubsidizedRelayQuote(quote) {
66
+ return Number(quote.fees?.subsidized?.amountUsd ?? '0') > 0;
67
+ }
68
+ function stripRelayExecuteMarker(requestId) {
69
+ return requestId.includes('#mm')
70
+ ? requestId.slice(0, requestId.indexOf('#mm'))
71
+ : requestId;
72
+ }
73
+ function getRelayExecuteRequestId(quote) {
74
+ const requestId = quote.steps?.[0]?.requestId;
75
+ if (!requestId) {
76
+ throw new Error('Relay: Execute: Missing requestId in quote step');
77
+ }
78
+ return stripRelayExecuteMarker(requestId);
79
+ }
80
+ function getRelayExecuteMetamask(quote, isSubsidized) {
81
+ const signature = quote.metamask?.signature;
82
+ if (!signature) {
83
+ throw new Error('Relay: Execute: Missing metamask.signature — cannot submit to /relay/execute without the HMAC token');
84
+ }
85
+ return {
86
+ isSubsidized,
87
+ quoteRequest: quote.request,
88
+ signature,
89
+ };
90
+ }
91
+ function mapAuthorizationList(authorizationList) {
92
+ if (!authorizationList?.length) {
93
+ return {};
94
+ }
95
+ return {
96
+ authorizationList: authorizationList.map((auth) => ({
97
+ chainId: Number(auth.chainId),
98
+ address: auth.address,
99
+ nonce: Number(auth.nonce),
100
+ yParity: Number(auth.yParity),
101
+ r: auth.r,
102
+ s: auth.s,
103
+ })),
104
+ };
105
+ }
106
+ function replaceFirstStepRequestId(quote, requestId) {
107
+ /* istanbul ignore next: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */
108
+ const steps = quote.steps ?? [];
109
+ /* istanbul ignore if: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */
110
+ if (steps.length === 0) {
111
+ throw new Error('Relay: Execute: Cannot update requestId — quote has no steps');
112
+ }
113
+ const existingStep = steps[0];
114
+ const remainingSteps = steps.slice(1);
115
+ quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];
116
+ }
117
+ //# sourceMappingURL=relay-submit-execute.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-submit-execute.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransactionParams } from '@metamask/transaction-controller';\nimport type {\n AuthorizationList,\n TransactionMeta,\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 TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { prefixError } from '../../utils/error-prefix';\nimport { getNetworkClientId } from '../../utils/provider';\nimport { FALLBACK_HASH } from './constants';\nimport { submitRelayExecute } from './relay-api';\nimport type { RelayExecuteRequest, RelayQuote } from './types';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\nconst RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';\n\nexport async function submitViaRelayExecute(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n allParams: TransactionParams[],\n): Promise<Hex> {\n const isSubsidized = isSubsidizedRelayQuote(quote.original);\n const requestId = getRelayExecuteRequestId(quote.original);\n const metamask = getRelayExecuteMetamask(quote.original, isSubsidized);\n\n const { from, sourceChainId } = quote.request;\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n\n const executionTransaction: TransactionMeta = {\n ...transaction,\n chainId: sourceChainId,\n networkClientId,\n nestedTransactions: allParams.map((param) => ({\n data: (param.data ?? '0x') as Hex,\n to: param.to as Hex,\n value: (param.value ?? '0x0') as Hex,\n })),\n txParams: {\n ...transaction.txParams,\n from,\n },\n } as TransactionMeta;\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction: executionTransaction, isSubsidized },\n );\n\n log('Delegation result for execute', delegation);\n\n const executeBody: RelayExecuteRequest = {\n executionKind: 'rawCalls',\n data: {\n chainId: Number(quote.request.sourceChainId),\n to: delegation.to,\n data: delegation.data,\n value: new BigNumber(delegation.value).toFixed(),\n ...mapAuthorizationList(delegation.authorizationList),\n },\n executionOptions: {\n subsidizeFees: false,\n },\n requestId,\n metamask,\n };\n\n log('Submitting to Relay execute', { executeBody, from: quote.request.from });\n\n let result;\n try {\n result = await submitRelayExecute(messenger, executeBody);\n } catch (error) {\n throw prefixError(error, RELAY_EXECUTE_ERROR_PREFIX);\n }\n\n log('Relay execute response', result);\n\n // Server may return a different requestId (e.g. after JIT quote for subsidized).\n // Replace the original quote requestId so waitForRelayCompletion polls the correct request.\n replaceFirstStepRequestId(quote.original, result.requestId);\n\n return FALLBACK_HASH;\n}\n\nfunction isSubsidizedRelayQuote(quote: RelayQuote): boolean {\n return Number(quote.fees?.subsidized?.amountUsd ?? '0') > 0;\n}\n\nfunction stripRelayExecuteMarker(requestId: string): string {\n return requestId.includes('#mm')\n ? requestId.slice(0, requestId.indexOf('#mm'))\n : requestId;\n}\n\nfunction getRelayExecuteRequestId(quote: RelayQuote): string {\n const requestId = quote.steps?.[0]?.requestId;\n if (!requestId) {\n throw new Error('Relay: Execute: Missing requestId in quote step');\n }\n return stripRelayExecuteMarker(requestId);\n}\n\nfunction getRelayExecuteMetamask(\n quote: RelayQuote,\n isSubsidized: boolean,\n): {\n isSubsidized: boolean;\n quoteRequest: RelayQuote['request'];\n signature: string;\n} {\n const signature = quote.metamask?.signature;\n if (!signature) {\n throw new Error(\n 'Relay: Execute: Missing metamask.signature — cannot submit to /relay/execute without the HMAC token',\n );\n }\n return {\n isSubsidized,\n quoteRequest: quote.request,\n signature,\n };\n}\n\nfunction mapAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n): {\n authorizationList?: {\n chainId: number;\n address: Hex;\n nonce: number;\n yParity: number;\n r: Hex;\n s: Hex;\n }[];\n} {\n if (!authorizationList?.length) {\n return {};\n }\n return {\n authorizationList: 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\nfunction replaceFirstStepRequestId(quote: RelayQuote, requestId: string): void {\n /* istanbul ignore next: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n const steps = quote.steps ?? [];\n /* istanbul ignore if: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n if (steps.length === 0) {\n throw new Error(\n 'Relay: Execute: Cannot update requestId — quote has no steps',\n );\n }\n\n const existingStep = steps[0];\n const remainingSteps = steps.slice(1);\n\n quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { TransactionParams } from "@metamask/transaction-controller";
2
+ import type { TransactionMeta } from "@metamask/transaction-controller";
3
+ import type { Hex } from "@metamask/utils";
4
+ import type { TransactionPayControllerMessenger, TransactionPayQuote } from "../../types.cjs";
5
+ import type { RelayQuote } from "./types.cjs";
6
+ export declare function submitViaRelayExecute(quote: TransactionPayQuote<RelayQuote>, transaction: TransactionMeta, messenger: TransactionPayControllerMessenger, allParams: TransactionParams[]): Promise<Hex>;
7
+ //# sourceMappingURL=relay-submit-execute.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-submit-execute.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAC1E,OAAO,KAAK,EAEV,eAAe,EAChB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAKrB,OAAO,KAAK,EAAuB,UAAU,EAAE,oBAAgB;AAK/D,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iBAAiB,EAAE,GAC7B,OAAO,CAAC,GAAG,CAAC,CA8Dd"}
@@ -0,0 +1,7 @@
1
+ import type { TransactionParams } from "@metamask/transaction-controller";
2
+ import type { TransactionMeta } from "@metamask/transaction-controller";
3
+ import type { Hex } from "@metamask/utils";
4
+ import type { TransactionPayControllerMessenger, TransactionPayQuote } from "../../types.mjs";
5
+ import type { RelayQuote } from "./types.mjs";
6
+ export declare function submitViaRelayExecute(quote: TransactionPayQuote<RelayQuote>, transaction: TransactionMeta, messenger: TransactionPayControllerMessenger, allParams: TransactionParams[]): Promise<Hex>;
7
+ //# sourceMappingURL=relay-submit-execute.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-submit-execute.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAC1E,OAAO,KAAK,EAEV,eAAe,EAChB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,wBAAoB;AAKrB,OAAO,KAAK,EAAuB,UAAU,EAAE,oBAAgB;AAK/D,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iBAAiB,EAAE,GAC7B,OAAO,CAAC,GAAG,CAAC,CA8Dd"}
@@ -0,0 +1,113 @@
1
+ import { createModuleLogger } from "@metamask/utils";
2
+ import { BigNumber } from "bignumber.js";
3
+ import { projectLogger } from "../../logger.mjs";
4
+ import { prefixError } from "../../utils/error-prefix.mjs";
5
+ import { getNetworkClientId } from "../../utils/provider.mjs";
6
+ import { FALLBACK_HASH } from "./constants.mjs";
7
+ import { submitRelayExecute } from "./relay-api.mjs";
8
+ const log = createModuleLogger(projectLogger, 'relay-strategy');
9
+ const RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';
10
+ export async function submitViaRelayExecute(quote, transaction, messenger, allParams) {
11
+ const isSubsidized = isSubsidizedRelayQuote(quote.original);
12
+ const requestId = getRelayExecuteRequestId(quote.original);
13
+ const metamask = getRelayExecuteMetamask(quote.original, isSubsidized);
14
+ const { from, sourceChainId } = quote.request;
15
+ const networkClientId = getNetworkClientId(messenger, sourceChainId);
16
+ const executionTransaction = {
17
+ ...transaction,
18
+ chainId: sourceChainId,
19
+ networkClientId,
20
+ nestedTransactions: allParams.map((param) => ({
21
+ data: (param.data ?? '0x'),
22
+ to: param.to,
23
+ value: (param.value ?? '0x0'),
24
+ })),
25
+ txParams: {
26
+ ...transaction.txParams,
27
+ from,
28
+ },
29
+ };
30
+ const delegation = await messenger.call('TransactionPayController:getDelegationTransaction', { transaction: executionTransaction, isSubsidized });
31
+ log('Delegation result for execute', delegation);
32
+ const executeBody = {
33
+ executionKind: 'rawCalls',
34
+ data: {
35
+ chainId: Number(quote.request.sourceChainId),
36
+ to: delegation.to,
37
+ data: delegation.data,
38
+ value: new BigNumber(delegation.value).toFixed(),
39
+ ...mapAuthorizationList(delegation.authorizationList),
40
+ },
41
+ executionOptions: {
42
+ subsidizeFees: false,
43
+ },
44
+ requestId,
45
+ metamask,
46
+ };
47
+ log('Submitting to Relay execute', { executeBody, from: quote.request.from });
48
+ let result;
49
+ try {
50
+ result = await submitRelayExecute(messenger, executeBody);
51
+ }
52
+ catch (error) {
53
+ throw prefixError(error, RELAY_EXECUTE_ERROR_PREFIX);
54
+ }
55
+ log('Relay execute response', result);
56
+ // Server may return a different requestId (e.g. after JIT quote for subsidized).
57
+ // Replace the original quote requestId so waitForRelayCompletion polls the correct request.
58
+ replaceFirstStepRequestId(quote.original, result.requestId);
59
+ return FALLBACK_HASH;
60
+ }
61
+ function isSubsidizedRelayQuote(quote) {
62
+ return Number(quote.fees?.subsidized?.amountUsd ?? '0') > 0;
63
+ }
64
+ function stripRelayExecuteMarker(requestId) {
65
+ return requestId.includes('#mm')
66
+ ? requestId.slice(0, requestId.indexOf('#mm'))
67
+ : requestId;
68
+ }
69
+ function getRelayExecuteRequestId(quote) {
70
+ const requestId = quote.steps?.[0]?.requestId;
71
+ if (!requestId) {
72
+ throw new Error('Relay: Execute: Missing requestId in quote step');
73
+ }
74
+ return stripRelayExecuteMarker(requestId);
75
+ }
76
+ function getRelayExecuteMetamask(quote, isSubsidized) {
77
+ const signature = quote.metamask?.signature;
78
+ if (!signature) {
79
+ throw new Error('Relay: Execute: Missing metamask.signature — cannot submit to /relay/execute without the HMAC token');
80
+ }
81
+ return {
82
+ isSubsidized,
83
+ quoteRequest: quote.request,
84
+ signature,
85
+ };
86
+ }
87
+ function mapAuthorizationList(authorizationList) {
88
+ if (!authorizationList?.length) {
89
+ return {};
90
+ }
91
+ return {
92
+ authorizationList: authorizationList.map((auth) => ({
93
+ chainId: Number(auth.chainId),
94
+ address: auth.address,
95
+ nonce: Number(auth.nonce),
96
+ yParity: Number(auth.yParity),
97
+ r: auth.r,
98
+ s: auth.s,
99
+ })),
100
+ };
101
+ }
102
+ function replaceFirstStepRequestId(quote, requestId) {
103
+ /* istanbul ignore next: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */
104
+ const steps = quote.steps ?? [];
105
+ /* istanbul ignore if: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */
106
+ if (steps.length === 0) {
107
+ throw new Error('Relay: Execute: Cannot update requestId — quote has no steps');
108
+ }
109
+ const existingStep = steps[0];
110
+ const remainingSteps = steps.slice(1);
111
+ quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];
112
+ }
113
+ //# sourceMappingURL=relay-submit-execute.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-submit-execute.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransactionParams } from '@metamask/transaction-controller';\nimport type {\n AuthorizationList,\n TransactionMeta,\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 TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { prefixError } from '../../utils/error-prefix';\nimport { getNetworkClientId } from '../../utils/provider';\nimport { FALLBACK_HASH } from './constants';\nimport { submitRelayExecute } from './relay-api';\nimport type { RelayExecuteRequest, RelayQuote } from './types';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\nconst RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';\n\nexport async function submitViaRelayExecute(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n allParams: TransactionParams[],\n): Promise<Hex> {\n const isSubsidized = isSubsidizedRelayQuote(quote.original);\n const requestId = getRelayExecuteRequestId(quote.original);\n const metamask = getRelayExecuteMetamask(quote.original, isSubsidized);\n\n const { from, sourceChainId } = quote.request;\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n\n const executionTransaction: TransactionMeta = {\n ...transaction,\n chainId: sourceChainId,\n networkClientId,\n nestedTransactions: allParams.map((param) => ({\n data: (param.data ?? '0x') as Hex,\n to: param.to as Hex,\n value: (param.value ?? '0x0') as Hex,\n })),\n txParams: {\n ...transaction.txParams,\n from,\n },\n } as TransactionMeta;\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction: executionTransaction, isSubsidized },\n );\n\n log('Delegation result for execute', delegation);\n\n const executeBody: RelayExecuteRequest = {\n executionKind: 'rawCalls',\n data: {\n chainId: Number(quote.request.sourceChainId),\n to: delegation.to,\n data: delegation.data,\n value: new BigNumber(delegation.value).toFixed(),\n ...mapAuthorizationList(delegation.authorizationList),\n },\n executionOptions: {\n subsidizeFees: false,\n },\n requestId,\n metamask,\n };\n\n log('Submitting to Relay execute', { executeBody, from: quote.request.from });\n\n let result;\n try {\n result = await submitRelayExecute(messenger, executeBody);\n } catch (error) {\n throw prefixError(error, RELAY_EXECUTE_ERROR_PREFIX);\n }\n\n log('Relay execute response', result);\n\n // Server may return a different requestId (e.g. after JIT quote for subsidized).\n // Replace the original quote requestId so waitForRelayCompletion polls the correct request.\n replaceFirstStepRequestId(quote.original, result.requestId);\n\n return FALLBACK_HASH;\n}\n\nfunction isSubsidizedRelayQuote(quote: RelayQuote): boolean {\n return Number(quote.fees?.subsidized?.amountUsd ?? '0') > 0;\n}\n\nfunction stripRelayExecuteMarker(requestId: string): string {\n return requestId.includes('#mm')\n ? requestId.slice(0, requestId.indexOf('#mm'))\n : requestId;\n}\n\nfunction getRelayExecuteRequestId(quote: RelayQuote): string {\n const requestId = quote.steps?.[0]?.requestId;\n if (!requestId) {\n throw new Error('Relay: Execute: Missing requestId in quote step');\n }\n return stripRelayExecuteMarker(requestId);\n}\n\nfunction getRelayExecuteMetamask(\n quote: RelayQuote,\n isSubsidized: boolean,\n): {\n isSubsidized: boolean;\n quoteRequest: RelayQuote['request'];\n signature: string;\n} {\n const signature = quote.metamask?.signature;\n if (!signature) {\n throw new Error(\n 'Relay: Execute: Missing metamask.signature — cannot submit to /relay/execute without the HMAC token',\n );\n }\n return {\n isSubsidized,\n quoteRequest: quote.request,\n signature,\n };\n}\n\nfunction mapAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n): {\n authorizationList?: {\n chainId: number;\n address: Hex;\n nonce: number;\n yParity: number;\n r: Hex;\n s: Hex;\n }[];\n} {\n if (!authorizationList?.length) {\n return {};\n }\n return {\n authorizationList: 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\nfunction replaceFirstStepRequestId(quote: RelayQuote, requestId: string): void {\n /* istanbul ignore next: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n const steps = quote.steps ?? [];\n /* istanbul ignore if: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n if (steps.length === 0) {\n throw new Error(\n 'Relay: Execute: Cannot update requestId — quote has no steps',\n );\n }\n\n const existingStep = steps[0];\n const remainingSteps = steps.slice(1);\n\n quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];\n}\n"]}
@@ -15,9 +15,9 @@ const constants_1 = require("./constants.cjs");
15
15
  const hyperliquid_withdraw_1 = require("./hyperliquid-withdraw.cjs");
16
16
  const withdraw_1 = require("./polymarket/withdraw.cjs");
17
17
  const relay_api_1 = require("./relay-api.cjs");
18
+ const relay_submit_execute_1 = require("./relay-submit-execute.cjs");
18
19
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'relay-strategy');
19
20
  const RELAY_ERROR_PREFIX = 'Relay: ';
20
- const RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';
21
21
  /**
22
22
  * Submits Relay quotes.
23
23
  *
@@ -68,6 +68,8 @@ async function executeSingleQuote(quote, messenger, transaction) {
68
68
  tx.txParams.nonce = undefined;
69
69
  });
70
70
  let polymarketPreSubmitUsdceBalance = 0n;
71
+ // Shallow clone so the server-returned requestId can be written back (state is frozen by Immer).
72
+ const mutableOriginal = { ...quote.original };
71
73
  if (quote.request.isHyperliquidSource) {
72
74
  await (0, hyperliquid_withdraw_1.submitHyperliquidWithdraw)(quote, quote.request.from, messenger);
73
75
  }
@@ -77,9 +79,9 @@ async function executeSingleQuote(quote, messenger, transaction) {
77
79
  setRelaySourceHash(transaction, messenger, sourceHash);
78
80
  }
79
81
  else {
80
- await submitTransactions(quote, transaction, messenger);
82
+ await submitTransactions({ ...quote, original: mutableOriginal }, transaction, messenger);
81
83
  }
82
- const completion = await waitForRelayCompletion(quote.original, messenger, {
84
+ const completion = await waitForRelayCompletion(mutableOriginal, messenger, {
83
85
  onSourceHash: (hash) => {
84
86
  log('Source hash received', hash);
85
87
  setRelaySourceHash(transaction, messenger, hash);
@@ -186,8 +188,12 @@ function normalizeParams(params, messenger) {
186
188
  data: params.data,
187
189
  from: params.from,
188
190
  gas: (0, controller_utils_1.toHex)(params.gas ?? featureFlags.relayFallbackGas.max),
189
- maxFeePerGas: (0, controller_utils_1.toHex)(params.maxFeePerGas),
190
- maxPriorityFeePerGas: (0, controller_utils_1.toHex)(params.maxPriorityFeePerGas),
191
+ maxFeePerGas: params.maxFeePerGas === undefined
192
+ ? undefined
193
+ : (0, controller_utils_1.toHex)(params.maxFeePerGas),
194
+ maxPriorityFeePerGas: params.maxPriorityFeePerGas === undefined
195
+ ? undefined
196
+ : (0, controller_utils_1.toHex)(params.maxPriorityFeePerGas),
191
197
  to: params.to,
192
198
  value: (0, controller_utils_1.toHex)(params.value ?? '0'),
193
199
  };
@@ -297,7 +303,7 @@ async function submitTransactions(quote, transaction, messenger) {
297
303
  allParams = [prependedParams, ...normalizedParams];
298
304
  }
299
305
  if (quote.original.metamask.isExecute) {
300
- return await submitViaRelayExecute(quote, transaction, messenger, allParams);
306
+ return await (0, relay_submit_execute_1.submitViaRelayExecute)(quote, transaction, messenger, allParams);
301
307
  }
302
308
  return await submitViaTransactionController(quote, transaction, messenger, normalizedParams, allParams);
303
309
  }
@@ -327,76 +333,6 @@ async function buildDelegatedOriginalParams(transaction, messenger, relayParams)
327
333
  value: delegation.value,
328
334
  };
329
335
  }
330
- /**
331
- * Submit source transactions via Relay's /execute endpoint.
332
- *
333
- * Combines all source calls (approve + deposit, and optionally the
334
- * original transaction for post-quote flows) into a single EIP-7702
335
- * delegation transaction using getDelegationTransaction, then submits
336
- * it to Relay's /execute endpoint for gasless execution.
337
- *
338
- * @param quote - Relay quote.
339
- * @param transaction - Original transaction meta.
340
- * @param messenger - Controller messenger.
341
- * @param allParams - All source transaction params to combine.
342
- * @returns Fallback hash (actual hash comes from relay status polling).
343
- */
344
- async function submitViaRelayExecute(quote, transaction, messenger, allParams) {
345
- const { from, sourceChainId } = quote.request;
346
- const { requestId } = quote.original.steps[0];
347
- const networkClientId = (0, provider_1.getNetworkClientId)(messenger, sourceChainId);
348
- const sourceCallTransaction = {
349
- ...transaction,
350
- chainId: sourceChainId,
351
- networkClientId,
352
- nestedTransactions: allParams.map((params) => ({
353
- data: (params.data ?? '0x'),
354
- to: params.to,
355
- value: (params.value ?? '0x0'),
356
- })),
357
- txParams: {
358
- ...transaction.txParams,
359
- from,
360
- },
361
- };
362
- const delegation = await messenger.call('TransactionPayController:getDelegationTransaction', { transaction: sourceCallTransaction });
363
- log('Delegation result for source calls', delegation);
364
- const executeBody = {
365
- executionKind: 'rawCalls',
366
- data: {
367
- chainId: Number(sourceChainId),
368
- to: delegation.to,
369
- data: delegation.data,
370
- value: new bignumber_js_1.BigNumber(delegation.value).toFixed(),
371
- ...(delegation.authorizationList?.length
372
- ? {
373
- authorizationList: delegation.authorizationList.map((auth) => ({
374
- chainId: Number(auth.chainId),
375
- address: auth.address,
376
- nonce: Number(auth.nonce),
377
- yParity: Number(auth.yParity),
378
- r: auth.r,
379
- s: auth.s,
380
- })),
381
- }
382
- : {}),
383
- },
384
- executionOptions: {
385
- subsidizeFees: false,
386
- },
387
- requestId,
388
- };
389
- log('Submitting via Relay execute', { executeBody, from });
390
- let result;
391
- try {
392
- result = await (0, relay_api_1.submitRelayExecute)(messenger, executeBody);
393
- }
394
- catch (error) {
395
- throw (0, error_prefix_1.prefixError)(error, RELAY_EXECUTE_ERROR_PREFIX);
396
- }
397
- log('Relay execute response', result);
398
- return constants_1.FALLBACK_HASH;
399
- }
400
336
  /**
401
337
  * Submit source transactions via the TransactionController.
402
338
  *