@relayprotocol/relay-sdk 7.0.2 → 7.0.3

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.
@@ -40,6 +40,8 @@ async function executeSteps(chainId, request = {}, wallet, setState, newJson, st
40
40
  };
41
41
  let terminalStatusPromise = null;
42
42
  let rejectTerminalStatus = null;
43
+ let successStatusPromise = null;
44
+ let resolveSuccessStatus = null;
43
45
  let websocketFailedPromise = null;
44
46
  let resolveWebsocketFailed = null;
45
47
  const onWebsocketFailed = () => {
@@ -119,6 +121,9 @@ async function executeSteps(chainId, request = {}, wallet, setState, newJson, st
119
121
  terminalStatusPromise = new Promise((_, reject) => {
120
122
  rejectTerminalStatus = reject;
121
123
  });
124
+ successStatusPromise = new Promise((resolve) => {
125
+ resolveSuccessStatus = resolve;
126
+ });
122
127
  statusControl.closeWebSocket = (0, websocket_js_1.trackRequestStatus)({
123
128
  event: 'request.status.updated',
124
129
  requestId: requestId,
@@ -139,6 +144,9 @@ async function executeSteps(chainId, request = {}, wallet, setState, newJson, st
139
144
  statusControl,
140
145
  onTerminalError: (error) => {
141
146
  rejectTerminalStatus?.(error);
147
+ },
148
+ onTerminalSuccess: () => {
149
+ resolveSuccessStatus?.();
142
150
  }
143
151
  });
144
152
  },
@@ -214,7 +222,11 @@ async function executeSteps(chainId, request = {}, wallet, setState, newJson, st
214
222
  }
215
223
  })();
216
224
  if (statusControl.websocketActive && terminalStatusPromise) {
217
- await Promise.race([stepExecutionPromise, terminalStatusPromise]);
225
+ await Promise.race([
226
+ stepExecutionPromise,
227
+ terminalStatusPromise,
228
+ ...(successStatusPromise ? [successStatusPromise] : [])
229
+ ]);
218
230
  }
219
231
  else {
220
232
  await stepExecutionPromise;
@@ -231,6 +243,24 @@ async function executeSteps(chainId, request = {}, wallet, setState, newJson, st
231
243
  resolve(stepItem);
232
244
  }
233
245
  catch (e) {
246
+ if (stepItem.status === 'complete' ||
247
+ statusControl.lastKnownStatus === 'success') {
248
+ client.log([
249
+ 'Execute Steps: Ignoring error for step item already confirmed complete',
250
+ e
251
+ ], logger_js_1.LogLevel.Warn);
252
+ stepItem.status = 'complete';
253
+ stepItem.progressState = 'complete';
254
+ stepItem.isValidatingSignature = false;
255
+ setState({
256
+ steps: [...json?.steps],
257
+ fees: { ...json?.fees },
258
+ breakdown: json?.breakdown,
259
+ details: json?.details
260
+ });
261
+ resolve(stepItem);
262
+ return;
263
+ }
234
264
  const error = e;
235
265
  const errorMessage = error
236
266
  ? error.message
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/executeSteps/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Execute,\n AdaptedWallet,\n TransactionStepItem\n} from '../../types/index.js'\nimport type { AxiosRequestConfig } from 'axios'\nimport { getClient, RelayClient } from '../../client.js'\nimport { LogLevel } from '../logger.js'\nimport { prepareHyperliquidSteps } from '../../utils/index.js'\nimport {\n canBatchTransactions,\n prepareBatchTransaction\n} from '../prepareBatchTransaction.js'\nimport { handleSignatureStepItem } from './signatureStep.js'\nimport { handleTransactionStepItem } from './transactionStep.js'\nimport { trackRequestStatus, extractDepositRequestId } from '../websocket.js'\nimport { handleWebSocketUpdate } from './websocketHandlers.js'\n\nexport type SetStateData = Pick<\n Execute,\n 'steps' | 'fees' | 'breakdown' | 'details' | 'error' | 'refunded'\n>\n\n/**\n * Controls the coordination between WebSocket and polling mechanisms\n * to prevent duplicate status monitoring for a single execution flow\n */\nexport type ExecutionStatusControl = {\n websocketActive: boolean\n websocketConnected: boolean\n closeWebSocket: undefined | (() => void)\n lastKnownStatus: undefined | string\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n}\n\n/**\n * This function orchestrates the execution of multi-step operations returned from the Relay Quote API,\n * such as bridging, swapping tokens, or performing cross-chain calls. It handles transaction\n * signing, submission, and validation while providing real-time progress updates through the setState callback.\n *\n * @param chainId - The origin chain ID for execution\n * @param request - AxiosRequestConfig for API requests\n * @param wallet - Wallet adapter implementing the {@link AdaptedWallet} interface\n * @param setState - Callback function to update UI state during execution progress\n * @param newJson - Execute object containing the steps, fees, and details from Relay Quote API\n * @param stepOptions - Optional configuration for specific steps (e.g., gas limits)\n * @param sharedStatusControl - Optional shared status control object for coordinating WebSocket/polling across recursive calls\n * @returns Promise<Execute> - The final execution result with updated status\n */\n\nexport async function executeSteps(\n chainId: number,\n request: AxiosRequestConfig = {},\n wallet: AdaptedWallet,\n setState: (data: SetStateData) => any,\n newJson: Execute,\n stepOptions?: {\n [stepId: string]: {\n gasLimit?: string\n }\n },\n sharedStatusControl?: ExecutionStatusControl\n): Promise<Execute> {\n const client = getClient()\n\n if (client?.baseApiUrl) {\n request.baseURL = client.baseApiUrl\n }\n if (request.headers) {\n request.headers['relay-sdk-version'] = client.version ?? 'unknown'\n } else {\n request.headers = {\n 'relay-sdk-version': client.version ?? 'unknown'\n }\n }\n\n const pollingInterval = client.pollingInterval ?? 5000\n\n const maximumAttempts =\n client.maxPollingAttemptsBeforeTimeout ??\n (2.5 * 60 * 1000) / pollingInterval\n\n const chain = client.chains.find((chain) => chain.id === chainId)\n if (!chain) {\n throw `Unable to find chain: Chain id ${chainId}`\n }\n\n let json = newJson\n let isAtomicBatchSupported = false\n\n // Manage WebSocket and polling coordination\n const statusControl: ExecutionStatusControl = sharedStatusControl || {\n websocketActive: false,\n websocketConnected: false,\n closeWebSocket: undefined,\n lastKnownStatus: undefined,\n websocketFailureTimeoutId: null\n }\n\n // WebSocket terminal status promise - rejects when failure/refund status received\n let terminalStatusPromise: Promise<never> | null = null\n let rejectTerminalStatus: ((error: Error) => void) | null = null\n\n // Promise-based approach for WebSocket failure handling\n let websocketFailedPromise: Promise<void> | null = null\n let resolveWebsocketFailed: (() => void) | null = null\n\n const onWebsocketFailed = (): Promise<void> => {\n if (!websocketFailedPromise) {\n websocketFailedPromise = new Promise<void>((resolve) => {\n resolveWebsocketFailed = resolve\n })\n }\n return websocketFailedPromise\n }\n\n try {\n // Handle errors\n if (json.error || !json.steps) throw json\n\n // Check if step's transactions can be batched and if wallet supports atomic batch (EIP-5792)\n // If so, manipulate steps to batch transactions\n if (canBatchTransactions(json.steps)) {\n isAtomicBatchSupported = Boolean(\n wallet?.supportsAtomicBatch &&\n (await wallet?.supportsAtomicBatch(chainId))\n )\n if (isAtomicBatchSupported) {\n const batchedStep = prepareBatchTransaction(json.steps)\n json.steps = [batchedStep]\n }\n }\n\n // Check if Hyperliquid and if so, prepare the steps for Hyperliquid signing\n if (chainId === 1337) {\n const activeWalletChainId = await wallet?.getChainId()\n json.steps = prepareHyperliquidSteps(json.steps, activeWalletChainId)\n }\n\n // Update state on first call or recursion\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n let incompleteStepIndex = -1\n let incompleteStepItemIndex = -1\n json.steps.find((step, i) => {\n if (!step.items) {\n return false\n }\n\n incompleteStepItemIndex = step.items.findIndex(\n (item) => item.status == 'incomplete'\n )\n if (incompleteStepItemIndex !== -1) {\n incompleteStepIndex = i\n return true\n }\n })\n\n // There are no more incomplete steps\n if (incompleteStepIndex === -1) {\n client.log(['Execute Steps: all steps complete'], LogLevel.Verbose)\n // Clean up WebSocket and failure timeout if execution is complete\n statusControl.closeWebSocket?.()\n clearFailureTimeout(statusControl, client)\n return json\n }\n\n const step = json.steps[incompleteStepIndex]\n\n if (stepOptions && stepOptions[step.id]) {\n const currentStepOptions = stepOptions[step.id]\n step.items?.forEach((stepItem) => {\n if (currentStepOptions.gasLimit) {\n stepItem.data.gas = currentStepOptions.gasLimit\n }\n })\n }\n\n let stepItems = json.steps[incompleteStepIndex].items\n\n if (!stepItems) {\n client.log(\n ['Execute Steps: skipping step, no items in step'],\n LogLevel.Verbose\n )\n return json\n }\n\n // =============================================\n // WebSocket Setup for Real-Time Status Updates\n // =============================================\n // We initialize the WebSocket connection before awaiting the step execution promises.\n //\n // The WebSocket is only used when all of these conditions are met:\n // - WebSocket is enabled in the client configuration\n // - We have a valid requestId\n // - We're on the last step of execution\n // - The step has incomplete items\n // - WebSocket isn't already active\n // - The origin and destination chain is not bitcoin\n const isLastStep = incompleteStepIndex === json.steps.length - 1\n const isStepIncomplete = stepItems.some(\n (item) => item.status === 'incomplete'\n )\n const requestId = extractDepositRequestId(json.steps)\n\n if (\n client.websocketEnabled &&\n requestId &&\n isLastStep &&\n isStepIncomplete &&\n !statusControl.websocketActive &&\n chainId !== 8253038\n ) {\n statusControl.websocketActive = true\n\n // Create the promises immediately so they're available for early failures\n websocketFailedPromise = new Promise<void>((resolve) => {\n resolveWebsocketFailed = resolve\n })\n\n terminalStatusPromise = new Promise<never>((_, reject) => {\n rejectTerminalStatus = reject\n })\n\n statusControl.closeWebSocket = trackRequestStatus({\n event: 'request.status.updated',\n requestId: requestId,\n enabled: true,\n url: client.websocketUrl,\n onOpen: () => {\n client.log(['Websocket open'], LogLevel.Verbose)\n statusControl.websocketConnected = true\n },\n onUpdate: (data) => {\n handleWebSocketUpdate({\n data,\n stepItems,\n chainId,\n setState,\n json,\n client,\n statusControl,\n onTerminalError: (error: Error) => {\n // Immediately reject when terminal status received\n rejectTerminalStatus?.(error)\n }\n })\n },\n onError: (err) => {\n // Handle WebSocket connection/network errors by falling back to polling\n if (\n !['success', 'refund'].includes(statusControl.lastKnownStatus || '')\n ) {\n client.log(\n ['Websocket connection error, falling back to polling', err],\n LogLevel.Verbose\n )\n statusControl.websocketActive = false\n statusControl.websocketConnected = false\n\n // Clean up any pending failure timeout when WebSocket errors\n clearFailureTimeout(statusControl, client)\n\n // Trigger the websocket failed promise to start polling fallback\n resolveWebsocketFailed?.()\n }\n },\n onClose: () => {\n client.log(['Websocket closed'], LogLevel.Verbose)\n\n // Clean up any pending failure timeout when WebSocket closes\n clearFailureTimeout(statusControl, client)\n\n // Only re-enable polling if we haven't reached a terminal state\n if (\n !['success', 'refund'].includes(\n statusControl.lastKnownStatus || ''\n ) &&\n !stepItems[0].error\n ) {\n client.log(\n ['Re-enabling polling due to unexpected WebSocket closure'],\n LogLevel.Verbose\n )\n // Trigger the websocket failed promise to start polling\n resolveWebsocketFailed?.()\n }\n }\n }).close\n }\n\n let { kind } = step\n\n client.log(\n [`Execute Steps: Begin processing step items for: ${step.action}`],\n LogLevel.Verbose\n )\n\n const promises = stepItems\n .filter((stepItem) => stepItem.status === 'incomplete')\n .map((stepItem) => {\n return new Promise(async (resolve, reject) => {\n try {\n // Create step execution promise\n const stepExecutionPromise = (async () => {\n // Handle each step based on it's kind\n switch (kind) {\n // Make an on-chain transaction\n case 'transaction': {\n await handleTransactionStepItem({\n stepItem: stepItem as TransactionStepItem,\n step,\n wallet,\n setState,\n request,\n client,\n json,\n chainId,\n isAtomicBatchSupported,\n incompleteStepItemIndex,\n stepItems,\n onWebsocketFailed: statusControl.websocketActive\n ? onWebsocketFailed\n : null,\n statusControl\n })\n break\n }\n\n // Sign a message\n case 'signature': {\n await handleSignatureStepItem({\n stepItem,\n step,\n wallet,\n setState,\n request,\n client,\n json,\n maximumAttempts,\n pollingInterval,\n chain,\n onWebsocketFailed: statusControl.websocketActive\n ? onWebsocketFailed\n : null\n })\n break\n }\n\n default:\n throw new Error(\n `Unknown step kind: ${kind}. Expected 'signature' or 'transaction'`\n )\n }\n })()\n\n // Allow WebSocket terminal status (failure/refund) to immediately interrupt and stop step execution\n if (statusControl.websocketActive && terminalStatusPromise) {\n await Promise.race([stepExecutionPromise, terminalStatusPromise])\n } else {\n await stepExecutionPromise\n }\n\n // Mark step item as complete\n stepItem.status = 'complete'\n stepItem.progressState = 'complete'\n stepItem.isValidatingSignature = false\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n resolve(stepItem)\n } catch (e) {\n const error = e as Error\n const errorMessage = error\n ? error.message\n : 'Error: something went wrong'\n\n if (error && json?.steps) {\n json.steps[incompleteStepIndex].error = errorMessage\n stepItem.error = errorMessage\n stepItem.errorData = (e as any)?.response?.data || e\n stepItem.isValidatingSignature = false\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n }\n reject(error)\n }\n })\n })\n\n await Promise.all(promises)\n\n // Recursively call executeSteps()\n const result = await executeSteps(\n chainId,\n request,\n wallet,\n setState,\n json,\n stepOptions,\n statusControl\n )\n\n // Clean up WebSocket and failure timeout if execution completes\n statusControl.closeWebSocket?.()\n clearFailureTimeout(statusControl, client)\n\n return result\n } catch (err: any) {\n client.log(['Execute Steps: An error occurred', err], LogLevel.Error)\n\n // Clean up WebSocket and failure timeout on error\n statusControl.closeWebSocket?.()\n clearFailureTimeout(statusControl, client)\n\n const error = err && err?.response?.data ? err.response.data : err\n let refunded = false\n if (error && error.message) {\n refunded = error.message.includes('Refunded')\n } else if (error && error.includes) {\n refunded = error.includes('Refunded')\n }\n\n if (json) {\n json.error = error\n setState({\n steps: json.steps ? [...json.steps] : ([{}] as any),\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details,\n refunded: refunded,\n error\n })\n } else {\n json = {\n error,\n steps: [],\n refunded\n }\n setState(json)\n }\n throw err\n }\n}\n\nfunction clearFailureTimeout(\n statusControl: ExecutionStatusControl,\n client: RelayClient\n): void {\n if (statusControl.websocketFailureTimeoutId) {\n clearTimeout(statusControl.websocketFailureTimeoutId)\n statusControl.websocketFailureTimeoutId = null\n client.log(['Cleared failure timeout during cleanup'], LogLevel.Verbose)\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/executeSteps/index.ts"],"names":[],"mappings":";;;AAMA,+CAAwD;AACxD,4CAAuC;AACvC,mDAA8D;AAC9D,8EAGsC;AACtC,yDAA4D;AAC5D,6DAAgE;AAChE,kDAA6E;AAC7E,iEAA8D;AAkCvD,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAA8B,EAAE,EAChC,MAAqB,EACrB,QAAqC,EACrC,OAAgB,EAChB,WAIC,EACD,mBAA4C;IAE5C,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAA;IAE1B,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAA;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,CAAA;IACpE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,OAAO,GAAG;YAChB,mBAAmB,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;SACjD,CAAA;IACH,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,CAAA;IAEtD,MAAM,eAAe,GACnB,MAAM,CAAC,+BAA+B;QACtC,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,eAAe,CAAA;IAErC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,kCAAkC,OAAO,EAAE,CAAA;IACnD,CAAC;IAED,IAAI,IAAI,GAAG,OAAO,CAAA;IAClB,IAAI,sBAAsB,GAAG,KAAK,CAAA;IAGlC,MAAM,aAAa,GAA2B,mBAAmB,IAAI;QACnE,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,SAAS;QAC1B,yBAAyB,EAAE,IAAI;KAChC,CAAA;IAGD,IAAI,qBAAqB,GAA0B,IAAI,CAAA;IACvD,IAAI,oBAAoB,GAAoC,IAAI,CAAA;IAIhE,IAAI,oBAAoB,GAAyB,IAAI,CAAA;IACrD,IAAI,oBAAoB,GAAwB,IAAI,CAAA;IAGpD,IAAI,sBAAsB,GAAyB,IAAI,CAAA;IACvD,IAAI,sBAAsB,GAAwB,IAAI,CAAA;IAEtD,MAAM,iBAAiB,GAAG,GAAkB,EAAE;QAC5C,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,sBAAsB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACrD,sBAAsB,GAAG,OAAO,CAAA;YAClC,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,sBAAsB,CAAA;IAC/B,CAAC,CAAA;IAED,IAAI,CAAC;QAEH,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,CAAA;QAIzC,IAAI,IAAA,iDAAoB,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,sBAAsB,GAAG,OAAO,CAC9B,MAAM,EAAE,mBAAmB;gBACzB,CAAC,MAAM,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAC/C,CAAA;YACD,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,IAAA,oDAAuB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACvD,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QAGD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,mBAAmB,GAAG,MAAM,MAAM,EAAE,UAAU,EAAE,CAAA;YACtD,IAAI,CAAC,KAAK,GAAG,IAAA,kCAAuB,EAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;QACvE,CAAC;QAGD,QAAQ,CAAC;YACP,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC;YACvB,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE;YACvB,SAAS,EAAE,IAAI,EAAE,SAAS;YAC1B,OAAO,EAAE,IAAI,EAAE,OAAO;SACvB,CAAC,CAAA;QAEF,IAAI,mBAAmB,GAAG,CAAC,CAAC,CAAA;QAC5B,IAAI,uBAAuB,GAAG,CAAC,CAAC,CAAA;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAA;YACd,CAAC;YAED,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAC5C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,YAAY,CACtC,CAAA;YACD,IAAI,uBAAuB,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnC,mBAAmB,GAAG,CAAC,CAAA;gBACvB,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;QAGF,IAAI,mBAAmB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,mCAAmC,CAAC,EAAE,oBAAQ,CAAC,OAAO,CAAC,CAAA;YAEnE,aAAa,CAAC,cAAc,EAAE,EAAE,CAAA;YAChC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAE5C,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,kBAAkB,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC/B,IAAI,kBAAkB,CAAC,QAAQ,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAA;gBACjD,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAA;QAErD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CACR,CAAC,gDAAgD,CAAC,EAClD,oBAAQ,CAAC,OAAO,CACjB,CAAA;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAcD,MAAM,UAAU,GAAG,mBAAmB,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;QAChE,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,CACvC,CAAA;QACD,MAAM,SAAS,GAAG,IAAA,sCAAuB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAErD,IACE,MAAM,CAAC,gBAAgB;YACvB,SAAS;YACT,UAAU;YACV,gBAAgB;YAChB,CAAC,aAAa,CAAC,eAAe;YAC9B,OAAO,KAAK,OAAO,EACnB,CAAC;YACD,aAAa,CAAC,eAAe,GAAG,IAAI,CAAA;YAGpC,sBAAsB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACrD,sBAAsB,GAAG,OAAO,CAAA;YAClC,CAAC,CAAC,CAAA;YAEF,qBAAqB,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBACvD,oBAAoB,GAAG,MAAM,CAAA;YAC/B,CAAC,CAAC,CAAA;YAEF,oBAAoB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnD,oBAAoB,GAAG,OAAO,CAAA;YAChC,CAAC,CAAC,CAAA;YAEF,aAAa,CAAC,cAAc,GAAG,IAAA,iCAAkB,EAAC;gBAChD,KAAK,EAAE,wBAAwB;gBAC/B,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,MAAM,CAAC,YAAY;gBACxB,MAAM,EAAE,GAAG,EAAE;oBACX,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,EAAE,oBAAQ,CAAC,OAAO,CAAC,CAAA;oBAChD,aAAa,CAAC,kBAAkB,GAAG,IAAI,CAAA;gBACzC,CAAC;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;oBACjB,IAAA,4CAAqB,EAAC;wBACpB,IAAI;wBACJ,SAAS;wBACT,OAAO;wBACP,QAAQ;wBACR,IAAI;wBACJ,MAAM;wBACN,aAAa;wBACb,eAAe,EAAE,CAAC,KAAY,EAAE,EAAE;4BAEhC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAA;wBAC/B,CAAC;wBACD,iBAAiB,EAAE,GAAG,EAAE;4BAEtB,oBAAoB,EAAE,EAAE,CAAA;wBAC1B,CAAC;qBACF,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAEf,IACE,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,eAAe,IAAI,EAAE,CAAC,EACpE,CAAC;wBACD,MAAM,CAAC,GAAG,CACR,CAAC,qDAAqD,EAAE,GAAG,CAAC,EAC5D,oBAAQ,CAAC,OAAO,CACjB,CAAA;wBACD,aAAa,CAAC,eAAe,GAAG,KAAK,CAAA;wBACrC,aAAa,CAAC,kBAAkB,GAAG,KAAK,CAAA;wBAGxC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;wBAG1C,sBAAsB,EAAE,EAAE,CAAA;oBAC5B,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,EAAE,oBAAQ,CAAC,OAAO,CAAC,CAAA;oBAGlD,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;oBAG1C,IACE,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAC7B,aAAa,CAAC,eAAe,IAAI,EAAE,CACpC;wBACD,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EACnB,CAAC;wBACD,MAAM,CAAC,GAAG,CACR,CAAC,yDAAyD,CAAC,EAC3D,oBAAQ,CAAC,OAAO,CACjB,CAAA;wBAED,sBAAsB,EAAE,EAAE,CAAA;oBAC5B,CAAC;gBACH,CAAC;aACF,CAAC,CAAC,KAAK,CAAA;QACV,CAAC;QAED,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QAEnB,MAAM,CAAC,GAAG,CACR,CAAC,mDAAmD,IAAI,CAAC,MAAM,EAAE,CAAC,EAClE,oBAAQ,CAAC,OAAO,CACjB,CAAA;QAED,MAAM,QAAQ,GAAG,SAAS;aACvB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC;aACtD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,CAAC;oBAEH,MAAM,oBAAoB,GAAG,CAAC,KAAK,IAAI,EAAE;wBAEvC,QAAQ,IAAI,EAAE,CAAC;4BAEb,KAAK,aAAa,CAAC,CAAC,CAAC;gCACnB,MAAM,IAAA,8CAAyB,EAAC;oCAC9B,QAAQ,EAAE,QAA+B;oCACzC,IAAI;oCACJ,MAAM;oCACN,QAAQ;oCACR,OAAO;oCACP,MAAM;oCACN,IAAI;oCACJ,OAAO;oCACP,sBAAsB;oCACtB,uBAAuB;oCACvB,SAAS;oCACT,iBAAiB,EAAE,aAAa,CAAC,eAAe;wCAC9C,CAAC,CAAC,iBAAiB;wCACnB,CAAC,CAAC,IAAI;oCACR,aAAa;iCACd,CAAC,CAAA;gCACF,MAAK;4BACP,CAAC;4BAGD,KAAK,WAAW,CAAC,CAAC,CAAC;gCACjB,MAAM,IAAA,0CAAuB,EAAC;oCAC5B,QAAQ;oCACR,IAAI;oCACJ,MAAM;oCACN,QAAQ;oCACR,OAAO;oCACP,MAAM;oCACN,IAAI;oCACJ,eAAe;oCACf,eAAe;oCACf,KAAK;oCACL,iBAAiB,EAAE,aAAa,CAAC,eAAe;wCAC9C,CAAC,CAAC,iBAAiB;wCACnB,CAAC,CAAC,IAAI;iCACT,CAAC,CAAA;gCACF,MAAK;4BACP,CAAC;4BAED;gCACE,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,yCAAyC,CACpE,CAAA;wBACL,CAAC;oBACH,CAAC,CAAC,EAAE,CAAA;oBAIJ,IAAI,aAAa,CAAC,eAAe,IAAI,qBAAqB,EAAE,CAAC;wBAC3D,MAAM,OAAO,CAAC,IAAI,CAAC;4BACjB,oBAAoB;4BACpB,qBAAqB;4BACrB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;yBACxD,CAAC,CAAA;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,oBAAoB,CAAA;oBAC5B,CAAC;oBAGD,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAA;oBAC5B,QAAQ,CAAC,aAAa,GAAG,UAAU,CAAA;oBACnC,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAA;oBACtC,QAAQ,CAAC;wBACP,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC;wBACvB,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE;wBACvB,SAAS,EAAE,IAAI,EAAE,SAAS;wBAC1B,OAAO,EAAE,IAAI,EAAE,OAAO;qBACvB,CAAC,CAAA;oBACF,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBAGX,IACE,QAAQ,CAAC,MAAM,KAAK,UAAU;wBAC9B,aAAa,CAAC,eAAe,KAAK,SAAS,EAC3C,CAAC;wBACD,MAAM,CAAC,GAAG,CACR;4BACE,wEAAwE;4BACxE,CAAC;yBACF,EACD,oBAAQ,CAAC,IAAI,CACd,CAAA;wBACD,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAA;wBAC5B,QAAQ,CAAC,aAAa,GAAG,UAAU,CAAA;wBACnC,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAA;wBACtC,QAAQ,CAAC;4BACP,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC;4BACvB,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE;4BACvB,SAAS,EAAE,IAAI,EAAE,SAAS;4BAC1B,OAAO,EAAE,IAAI,EAAE,OAAO;yBACvB,CAAC,CAAA;wBACF,OAAO,CAAC,QAAQ,CAAC,CAAA;wBACjB,OAAM;oBACR,CAAC;oBAED,MAAM,KAAK,GAAG,CAAU,CAAA;oBACxB,MAAM,YAAY,GAAG,KAAK;wBACxB,CAAC,CAAC,KAAK,CAAC,OAAO;wBACf,CAAC,CAAC,6BAA6B,CAAA;oBAEjC,IAAI,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;wBACzB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,GAAG,YAAY,CAAA;wBACpD,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAA;wBAC7B,QAAQ,CAAC,SAAS,GAAI,CAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAA;wBACpD,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAA;wBACtC,QAAQ,CAAC;4BACP,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC;4BACvB,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE;4BACvB,SAAS,EAAE,IAAI,EAAE,SAAS;4BAC1B,OAAO,EAAE,IAAI,EAAE,OAAO;yBACvB,CAAC,CAAA;oBACJ,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,CAAA;gBACf,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEJ,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAG3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,aAAa,CACd,CAAA;QAGD,aAAa,CAAC,cAAc,EAAE,EAAE,CAAA;QAChC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QAE1C,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,CAAC,kCAAkC,EAAE,GAAG,CAAC,EAAE,oBAAQ,CAAC,KAAK,CAAC,CAAA;QAGrE,aAAa,CAAC,cAAc,EAAE,EAAE,CAAA;QAChC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QAE1C,MAAM,KAAK,GAAG,GAAG,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;QAClE,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC3B,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC/C,CAAC;aAAM,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;YAClB,QAAQ,CAAC;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAS;gBACnD,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE;gBACvB,SAAS,EAAE,IAAI,EAAE,SAAS;gBAC1B,OAAO,EAAE,IAAI,EAAE,OAAO;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,KAAK;aACN,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,GAAG;gBACL,KAAK;gBACL,KAAK,EAAE,EAAE;gBACT,QAAQ;aACT,CAAA;YACD,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAlcD,oCAkcC;AAED,SAAS,mBAAmB,CAC1B,aAAqC,EACrC,MAAmB;IAEnB,IAAI,aAAa,CAAC,yBAAyB,EAAE,CAAC;QAC5C,YAAY,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAA;QACrD,aAAa,CAAC,yBAAyB,GAAG,IAAI,CAAA;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,wCAAwC,CAAC,EAAE,oBAAQ,CAAC,OAAO,CAAC,CAAA;IAC1E,CAAC;AACH,CAAC","sourcesContent":["import type {\n Execute,\n AdaptedWallet,\n TransactionStepItem\n} from '../../types/index.js'\nimport type { AxiosRequestConfig } from 'axios'\nimport { getClient, RelayClient } from '../../client.js'\nimport { LogLevel } from '../logger.js'\nimport { prepareHyperliquidSteps } from '../../utils/index.js'\nimport {\n canBatchTransactions,\n prepareBatchTransaction\n} from '../prepareBatchTransaction.js'\nimport { handleSignatureStepItem } from './signatureStep.js'\nimport { handleTransactionStepItem } from './transactionStep.js'\nimport { trackRequestStatus, extractDepositRequestId } from '../websocket.js'\nimport { handleWebSocketUpdate } from './websocketHandlers.js'\n\nexport type SetStateData = Pick<\n Execute,\n 'steps' | 'fees' | 'breakdown' | 'details' | 'error' | 'refunded'\n>\n\n/**\n * Controls the coordination between WebSocket and polling mechanisms\n * to prevent duplicate status monitoring for a single execution flow\n */\nexport type ExecutionStatusControl = {\n websocketActive: boolean\n websocketConnected: boolean\n closeWebSocket: undefined | (() => void)\n lastKnownStatus: undefined | string\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n}\n\n/**\n * This function orchestrates the execution of multi-step operations returned from the Relay Quote API,\n * such as bridging, swapping tokens, or performing cross-chain calls. It handles transaction\n * signing, submission, and validation while providing real-time progress updates through the setState callback.\n *\n * @param chainId - The origin chain ID for execution\n * @param request - AxiosRequestConfig for API requests\n * @param wallet - Wallet adapter implementing the {@link AdaptedWallet} interface\n * @param setState - Callback function to update UI state during execution progress\n * @param newJson - Execute object containing the steps, fees, and details from Relay Quote API\n * @param stepOptions - Optional configuration for specific steps (e.g., gas limits)\n * @param sharedStatusControl - Optional shared status control object for coordinating WebSocket/polling across recursive calls\n * @returns Promise<Execute> - The final execution result with updated status\n */\n\nexport async function executeSteps(\n chainId: number,\n request: AxiosRequestConfig = {},\n wallet: AdaptedWallet,\n setState: (data: SetStateData) => any,\n newJson: Execute,\n stepOptions?: {\n [stepId: string]: {\n gasLimit?: string\n }\n },\n sharedStatusControl?: ExecutionStatusControl\n): Promise<Execute> {\n const client = getClient()\n\n if (client?.baseApiUrl) {\n request.baseURL = client.baseApiUrl\n }\n if (request.headers) {\n request.headers['relay-sdk-version'] = client.version ?? 'unknown'\n } else {\n request.headers = {\n 'relay-sdk-version': client.version ?? 'unknown'\n }\n }\n\n const pollingInterval = client.pollingInterval ?? 5000\n\n const maximumAttempts =\n client.maxPollingAttemptsBeforeTimeout ??\n (2.5 * 60 * 1000) / pollingInterval\n\n const chain = client.chains.find((chain) => chain.id === chainId)\n if (!chain) {\n throw `Unable to find chain: Chain id ${chainId}`\n }\n\n let json = newJson\n let isAtomicBatchSupported = false\n\n // Manage WebSocket and polling coordination\n const statusControl: ExecutionStatusControl = sharedStatusControl || {\n websocketActive: false,\n websocketConnected: false,\n closeWebSocket: undefined,\n lastKnownStatus: undefined,\n websocketFailureTimeoutId: null\n }\n\n // WebSocket terminal status promise - rejects when failure/refund status received\n let terminalStatusPromise: Promise<never> | null = null\n let rejectTerminalStatus: ((error: Error) => void) | null = null\n\n // Resolves when the websocket reports a terminal success, so step execution\n // doesn't stay blocked on (or fail because of) the RPC receipt lookup\n let successStatusPromise: Promise<void> | null = null\n let resolveSuccessStatus: (() => void) | null = null\n\n // Promise-based approach for WebSocket failure handling\n let websocketFailedPromise: Promise<void> | null = null\n let resolveWebsocketFailed: (() => void) | null = null\n\n const onWebsocketFailed = (): Promise<void> => {\n if (!websocketFailedPromise) {\n websocketFailedPromise = new Promise<void>((resolve) => {\n resolveWebsocketFailed = resolve\n })\n }\n return websocketFailedPromise\n }\n\n try {\n // Handle errors\n if (json.error || !json.steps) throw json\n\n // Check if step's transactions can be batched and if wallet supports atomic batch (EIP-5792)\n // If so, manipulate steps to batch transactions\n if (canBatchTransactions(json.steps)) {\n isAtomicBatchSupported = Boolean(\n wallet?.supportsAtomicBatch &&\n (await wallet?.supportsAtomicBatch(chainId))\n )\n if (isAtomicBatchSupported) {\n const batchedStep = prepareBatchTransaction(json.steps)\n json.steps = [batchedStep]\n }\n }\n\n // Check if Hyperliquid and if so, prepare the steps for Hyperliquid signing\n if (chainId === 1337) {\n const activeWalletChainId = await wallet?.getChainId()\n json.steps = prepareHyperliquidSteps(json.steps, activeWalletChainId)\n }\n\n // Update state on first call or recursion\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n let incompleteStepIndex = -1\n let incompleteStepItemIndex = -1\n json.steps.find((step, i) => {\n if (!step.items) {\n return false\n }\n\n incompleteStepItemIndex = step.items.findIndex(\n (item) => item.status == 'incomplete'\n )\n if (incompleteStepItemIndex !== -1) {\n incompleteStepIndex = i\n return true\n }\n })\n\n // There are no more incomplete steps\n if (incompleteStepIndex === -1) {\n client.log(['Execute Steps: all steps complete'], LogLevel.Verbose)\n // Clean up WebSocket and failure timeout if execution is complete\n statusControl.closeWebSocket?.()\n clearFailureTimeout(statusControl, client)\n return json\n }\n\n const step = json.steps[incompleteStepIndex]\n\n if (stepOptions && stepOptions[step.id]) {\n const currentStepOptions = stepOptions[step.id]\n step.items?.forEach((stepItem) => {\n if (currentStepOptions.gasLimit) {\n stepItem.data.gas = currentStepOptions.gasLimit\n }\n })\n }\n\n let stepItems = json.steps[incompleteStepIndex].items\n\n if (!stepItems) {\n client.log(\n ['Execute Steps: skipping step, no items in step'],\n LogLevel.Verbose\n )\n return json\n }\n\n // =============================================\n // WebSocket Setup for Real-Time Status Updates\n // =============================================\n // We initialize the WebSocket connection before awaiting the step execution promises.\n //\n // The WebSocket is only used when all of these conditions are met:\n // - WebSocket is enabled in the client configuration\n // - We have a valid requestId\n // - We're on the last step of execution\n // - The step has incomplete items\n // - WebSocket isn't already active\n // - The origin and destination chain is not bitcoin\n const isLastStep = incompleteStepIndex === json.steps.length - 1\n const isStepIncomplete = stepItems.some(\n (item) => item.status === 'incomplete'\n )\n const requestId = extractDepositRequestId(json.steps)\n\n if (\n client.websocketEnabled &&\n requestId &&\n isLastStep &&\n isStepIncomplete &&\n !statusControl.websocketActive &&\n chainId !== 8253038\n ) {\n statusControl.websocketActive = true\n\n // Create the promises immediately so they're available for early failures\n websocketFailedPromise = new Promise<void>((resolve) => {\n resolveWebsocketFailed = resolve\n })\n\n terminalStatusPromise = new Promise<never>((_, reject) => {\n rejectTerminalStatus = reject\n })\n\n successStatusPromise = new Promise<void>((resolve) => {\n resolveSuccessStatus = resolve\n })\n\n statusControl.closeWebSocket = trackRequestStatus({\n event: 'request.status.updated',\n requestId: requestId,\n enabled: true,\n url: client.websocketUrl,\n onOpen: () => {\n client.log(['Websocket open'], LogLevel.Verbose)\n statusControl.websocketConnected = true\n },\n onUpdate: (data) => {\n handleWebSocketUpdate({\n data,\n stepItems,\n chainId,\n setState,\n json,\n client,\n statusControl,\n onTerminalError: (error: Error) => {\n // Immediately reject when terminal status received\n rejectTerminalStatus?.(error)\n },\n onTerminalSuccess: () => {\n // Immediately resolve when the backend confirms success\n resolveSuccessStatus?.()\n }\n })\n },\n onError: (err) => {\n // Handle WebSocket connection/network errors by falling back to polling\n if (\n !['success', 'refund'].includes(statusControl.lastKnownStatus || '')\n ) {\n client.log(\n ['Websocket connection error, falling back to polling', err],\n LogLevel.Verbose\n )\n statusControl.websocketActive = false\n statusControl.websocketConnected = false\n\n // Clean up any pending failure timeout when WebSocket errors\n clearFailureTimeout(statusControl, client)\n\n // Trigger the websocket failed promise to start polling fallback\n resolveWebsocketFailed?.()\n }\n },\n onClose: () => {\n client.log(['Websocket closed'], LogLevel.Verbose)\n\n // Clean up any pending failure timeout when WebSocket closes\n clearFailureTimeout(statusControl, client)\n\n // Only re-enable polling if we haven't reached a terminal state\n if (\n !['success', 'refund'].includes(\n statusControl.lastKnownStatus || ''\n ) &&\n !stepItems[0].error\n ) {\n client.log(\n ['Re-enabling polling due to unexpected WebSocket closure'],\n LogLevel.Verbose\n )\n // Trigger the websocket failed promise to start polling\n resolveWebsocketFailed?.()\n }\n }\n }).close\n }\n\n let { kind } = step\n\n client.log(\n [`Execute Steps: Begin processing step items for: ${step.action}`],\n LogLevel.Verbose\n )\n\n const promises = stepItems\n .filter((stepItem) => stepItem.status === 'incomplete')\n .map((stepItem) => {\n return new Promise(async (resolve, reject) => {\n try {\n // Create step execution promise\n const stepExecutionPromise = (async () => {\n // Handle each step based on it's kind\n switch (kind) {\n // Make an on-chain transaction\n case 'transaction': {\n await handleTransactionStepItem({\n stepItem: stepItem as TransactionStepItem,\n step,\n wallet,\n setState,\n request,\n client,\n json,\n chainId,\n isAtomicBatchSupported,\n incompleteStepItemIndex,\n stepItems,\n onWebsocketFailed: statusControl.websocketActive\n ? onWebsocketFailed\n : null,\n statusControl\n })\n break\n }\n\n // Sign a message\n case 'signature': {\n await handleSignatureStepItem({\n stepItem,\n step,\n wallet,\n setState,\n request,\n client,\n json,\n maximumAttempts,\n pollingInterval,\n chain,\n onWebsocketFailed: statusControl.websocketActive\n ? onWebsocketFailed\n : null\n })\n break\n }\n\n default:\n throw new Error(\n `Unknown step kind: ${kind}. Expected 'signature' or 'transaction'`\n )\n }\n })()\n\n // Allow WebSocket terminal status to immediately settle step execution:\n // failure/refund rejects, success resolves without waiting on the RPC receipt\n if (statusControl.websocketActive && terminalStatusPromise) {\n await Promise.race([\n stepExecutionPromise,\n terminalStatusPromise,\n ...(successStatusPromise ? [successStatusPromise] : [])\n ])\n } else {\n await stepExecutionPromise\n }\n\n // Mark step item as complete\n stepItem.status = 'complete'\n stepItem.progressState = 'complete'\n stepItem.isValidatingSignature = false\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n resolve(stepItem)\n } catch (e) {\n // If the backend already marked this item complete (e.g. via websocket),\n // a late error from the execution promise must not flip it to a failure\n if (\n stepItem.status === 'complete' ||\n statusControl.lastKnownStatus === 'success'\n ) {\n client.log(\n [\n 'Execute Steps: Ignoring error for step item already confirmed complete',\n e\n ],\n LogLevel.Warn\n )\n stepItem.status = 'complete'\n stepItem.progressState = 'complete'\n stepItem.isValidatingSignature = false\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n resolve(stepItem)\n return\n }\n\n const error = e as Error\n const errorMessage = error\n ? error.message\n : 'Error: something went wrong'\n\n if (error && json?.steps) {\n json.steps[incompleteStepIndex].error = errorMessage\n stepItem.error = errorMessage\n stepItem.errorData = (e as any)?.response?.data || e\n stepItem.isValidatingSignature = false\n setState({\n steps: [...json?.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n }\n reject(error)\n }\n })\n })\n\n await Promise.all(promises)\n\n // Recursively call executeSteps()\n const result = await executeSteps(\n chainId,\n request,\n wallet,\n setState,\n json,\n stepOptions,\n statusControl\n )\n\n // Clean up WebSocket and failure timeout if execution completes\n statusControl.closeWebSocket?.()\n clearFailureTimeout(statusControl, client)\n\n return result\n } catch (err: any) {\n client.log(['Execute Steps: An error occurred', err], LogLevel.Error)\n\n // Clean up WebSocket and failure timeout on error\n statusControl.closeWebSocket?.()\n clearFailureTimeout(statusControl, client)\n\n const error = err && err?.response?.data ? err.response.data : err\n let refunded = false\n if (error && error.message) {\n refunded = error.message.includes('Refunded')\n } else if (error && error.includes) {\n refunded = error.includes('Refunded')\n }\n\n if (json) {\n json.error = error\n setState({\n steps: json.steps ? [...json.steps] : ([{}] as any),\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details,\n refunded: refunded,\n error\n })\n } else {\n json = {\n error,\n steps: [],\n refunded\n }\n setState(json)\n }\n throw err\n }\n}\n\nfunction clearFailureTimeout(\n statusControl: ExecutionStatusControl,\n client: RelayClient\n): void {\n if (statusControl.websocketFailureTimeoutId) {\n clearTimeout(statusControl.websocketFailureTimeoutId)\n statusControl.websocketFailureTimeoutId = null\n client.log(['Cleared failure timeout during cleanup'], LogLevel.Verbose)\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleWebSocketUpdate = void 0;
4
4
  const logger_js_1 = require("../logger.js");
5
- function handleWebSocketUpdate({ data, stepItems, chainId, setState, json, client, statusControl, onTerminalError }) {
5
+ function handleWebSocketUpdate({ data, stepItems, chainId, setState, json, client, statusControl, onTerminalError, onTerminalSuccess }) {
6
6
  statusControl.lastKnownStatus = data.status;
7
7
  if (data.status !== 'failure') {
8
8
  clearFailureTimeout(statusControl, client, `status changed to ${data.status}`);
@@ -13,6 +13,7 @@ function handleWebSocketUpdate({ data, stepItems, chainId, setState, json, clien
13
13
  switch (data.status) {
14
14
  case 'success':
15
15
  handleSuccessStatus(data, stepItems, chainId, setState, json, client);
16
+ onTerminalSuccess?.();
16
17
  break;
17
18
  case 'refund':
18
19
  handleRefundStatus(client, stepItems, onTerminalError);
@@ -1 +1 @@
1
- {"version":3,"file":"websocketHandlers.js","sourceRoot":"","sources":["../../../../src/utils/executeSteps/websocketHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Execute } from '../../types/index.js'\nimport type { RequestStatusUpdatedPayload } from '../websocket.js'\nimport type { SetStateData } from './index.js'\nimport { LogLevel } from '../logger.js'\nimport type { RelayClient } from '../../client.js'\n\ninterface WebSocketUpdateHandlerParams {\n data: RequestStatusUpdatedPayload\n stepItems: Execute['steps'][0]['items']\n chainId: number\n setState: (data: SetStateData) => void\n json: Execute\n client: RelayClient\n statusControl: {\n closeWebSocket?: () => void\n lastKnownStatus?: string\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n }\n onTerminalError?: (error: Error) => void\n}\n\nexport function handleWebSocketUpdate({\n data,\n stepItems,\n chainId,\n setState,\n json,\n client,\n statusControl,\n onTerminalError\n}: WebSocketUpdateHandlerParams): void {\n statusControl.lastKnownStatus = data.status\n\n // Clear any existing failure timeout if we receive a non-failure status\n // This handles the case where failure -> pending -> refund flow occurs\n if (data.status !== 'failure') {\n clearFailureTimeout(\n statusControl,\n client,\n `status changed to ${data.status}`\n )\n }\n\n // Handle terminal states (success, refund)\n if (isTerminalStatus(data.status)) {\n client.log(\n ['WebSocket received terminal status: ', data.status],\n LogLevel.Verbose\n )\n statusControl.closeWebSocket?.()\n\n switch (data.status) {\n case 'success':\n handleSuccessStatus(data, stepItems, chainId, setState, json, client)\n break\n case 'refund':\n handleRefundStatus(client, stepItems, onTerminalError)\n break\n }\n }\n // Handle pending status\n else if (data.status === 'pending') {\n client.log(['WebSocket received pending status'], LogLevel.Verbose)\n handlePendingStatus(data, stepItems, setState, json, client)\n }\n // Handle submitted status\n else if (data.status === 'submitted') {\n client.log(['WebSocket received submitted status'], LogLevel.Verbose)\n handleSubmittedStatus(data, stepItems, setState, json, client)\n }\n // Handle failure status with delay (refund flow: pending -> failure -> pending -> refund)\n else if (data.status === 'failure') {\n handleFailureStatusWithDelay(\n stepItems,\n client,\n statusControl,\n onTerminalError\n )\n }\n}\n\nfunction isTerminalStatus(status: string): boolean {\n // Note: 'failure' is not immediately terminal due to the refund flow:\n // pending -> failure -> pending -> refund\n // 'pending' and 'submitted' are intermediate states before 'success'\n return ['success', 'refund'].includes(status)\n}\n\nfunction handlePendingStatus(\n data: RequestStatusUpdatedPayload,\n stepItems: Execute['steps'][0]['items'],\n setState: (data: SetStateData) => void,\n json: Execute,\n client: RelayClient\n): void {\n // Update internalTxHashes if provided\n if (data.inTxHashes && data.inTxHashes.length > 0) {\n const internalTxHashes = data.inTxHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.originChainId ?? data.destinationChainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.internalTxHashes = internalTxHashes\n })\n }\n\n // Mark step items as pending\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'pending'\n item.progressState = undefined\n item.isValidatingSignature = false\n })\n\n // Update state with pending status\n setState({\n steps: [...json.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n client.log(\n ['WebSocket: Origin tx confirmed, backend processing', data],\n LogLevel.Verbose\n )\n}\n\nfunction handleSubmittedStatus(\n data: RequestStatusUpdatedPayload,\n stepItems: Execute['steps'][0]['items'],\n setState: (data: SetStateData) => void,\n json: Execute,\n client: RelayClient\n): void {\n // Update txHashes if provided (partial updates during submitted state)\n if (data.txHashes && data.txHashes.length > 0) {\n const txHashes = data.txHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.destinationChainId ?? data.originChainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.txHashes = txHashes\n })\n }\n\n // Update internalTxHashes if provided\n if (data.inTxHashes && data.inTxHashes.length > 0) {\n const internalTxHashes = data.inTxHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.originChainId ?? data.destinationChainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.internalTxHashes = internalTxHashes\n })\n }\n\n // Mark step items as submitted (intermediate state, not complete)\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'submitted'\n item.progressState = undefined\n item.isValidatingSignature = false\n })\n\n // Update state with submitted status\n setState({\n steps: [...json.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n client.log(\n ['WebSocket: Step submitted to relay, waiting for completion', data],\n LogLevel.Verbose\n )\n}\n\nfunction handleSuccessStatus(\n data: RequestStatusUpdatedPayload,\n stepItems: Execute['steps'][0]['items'],\n chainId: number,\n setState: (data: SetStateData) => void,\n json: Execute,\n client: RelayClient\n): void {\n // Update txHashes if provided\n if (data.txHashes && data.txHashes.length > 0) {\n const txHashes = data.txHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.destinationChainId ?? chainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.txHashes = txHashes\n })\n }\n\n // Update internalTxHashes if provided\n if (data.inTxHashes && data.inTxHashes.length > 0) {\n const internalTxHashes = data.inTxHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.originChainId ?? chainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.internalTxHashes = internalTxHashes\n })\n }\n\n // Mark step items as complete\n updateIncompleteItems(stepItems, (item) => {\n item.status = 'complete'\n item.progressState = 'complete'\n item.checkStatus = 'success'\n })\n\n // Update state with completed steps\n setState({\n steps: [...json.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n client.log(['WebSocket: Step completed successfully', data], LogLevel.Verbose)\n}\n\nfunction handleFailureStatus(\n client: RelayClient,\n stepItems: Execute['steps'][0]['items'],\n onTerminalError?: (error: Error) => void\n): void {\n client.log(['WebSocket: transaction failed'], LogLevel.Error)\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'failure'\n })\n\n const error = new Error('Transaction failed')\n onTerminalError?.(error)\n}\n\nfunction handleRefundStatus(\n client: RelayClient,\n stepItems: Execute['steps'][0]['items'],\n onTerminalError?: (error: Error) => void\n): void {\n client.log(['WebSocket: transaction refunded'], LogLevel.Verbose)\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'refund'\n })\n const error = new Error('Transaction failed: Refunded')\n onTerminalError?.(error)\n}\n\nfunction handleFailureStatusWithDelay(\n stepItems: Execute['steps'][0]['items'],\n client: RelayClient,\n statusControl: {\n closeWebSocket?: () => void\n lastKnownStatus?: string\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n },\n onTerminalError?: (error: Error) => void\n): void {\n // Clear any existing failure timeout to handle multiple failure statuses\n clearFailureTimeout(statusControl, client, 'new failure status received')\n\n client.log(\n [\n 'WebSocket received failure status, waiting 2 seconds for potential status change'\n ],\n LogLevel.Verbose\n )\n\n // Set a 2-second timeout to handle the case where failure is truly terminal\n statusControl.websocketFailureTimeoutId = setTimeout(() => {\n // Only proceed with failure handling if timeout still exists and status is still failure\n if (\n statusControl.websocketFailureTimeoutId &&\n statusControl.lastKnownStatus === 'failure'\n ) {\n client.log(\n ['WebSocket: 2-second timeout expired, treating failure as terminal'],\n LogLevel.Error\n )\n\n // Clear the timeout state\n statusControl.websocketFailureTimeoutId = null\n\n // Handle as terminal failure\n handleFailureStatus(client, stepItems, onTerminalError)\n } else {\n client.log(\n ['WebSocket: Failure timeout cancelled due to status change'],\n LogLevel.Verbose\n )\n }\n }, 2000) // 2 seconds\n}\n\nfunction updateIncompleteItems(\n stepItems: Execute['steps'][0]['items'],\n updateFn: (item: any) => void\n): void {\n stepItems.forEach((item) => {\n if (item.status === 'incomplete') {\n updateFn(item)\n }\n })\n}\n\nfunction clearFailureTimeout(\n statusControl: {\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n },\n client: RelayClient,\n reason: string\n): void {\n if (statusControl.websocketFailureTimeoutId) {\n clearTimeout(statusControl.websocketFailureTimeoutId)\n statusControl.websocketFailureTimeoutId = null\n client.log([`Cleared failure timeout: ${reason}`], LogLevel.Verbose)\n }\n}\n"]}
1
+ {"version":3,"file":"websocketHandlers.js","sourceRoot":"","sources":["../../../../src/utils/executeSteps/websocketHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Execute } from '../../types/index.js'\nimport type { RequestStatusUpdatedPayload } from '../websocket.js'\nimport type { SetStateData } from './index.js'\nimport { LogLevel } from '../logger.js'\nimport type { RelayClient } from '../../client.js'\n\ninterface WebSocketUpdateHandlerParams {\n data: RequestStatusUpdatedPayload\n stepItems: Execute['steps'][0]['items']\n chainId: number\n setState: (data: SetStateData) => void\n json: Execute\n client: RelayClient\n statusControl: {\n closeWebSocket?: () => void\n lastKnownStatus?: string\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n }\n onTerminalError?: (error: Error) => void\n onTerminalSuccess?: () => void\n}\n\nexport function handleWebSocketUpdate({\n data,\n stepItems,\n chainId,\n setState,\n json,\n client,\n statusControl,\n onTerminalError,\n onTerminalSuccess\n}: WebSocketUpdateHandlerParams): void {\n statusControl.lastKnownStatus = data.status\n\n // Clear any existing failure timeout if we receive a non-failure status\n // This handles the case where failure -> pending -> refund flow occurs\n if (data.status !== 'failure') {\n clearFailureTimeout(\n statusControl,\n client,\n `status changed to ${data.status}`\n )\n }\n\n // Handle terminal states (success, refund)\n if (isTerminalStatus(data.status)) {\n client.log(\n ['WebSocket received terminal status: ', data.status],\n LogLevel.Verbose\n )\n statusControl.closeWebSocket?.()\n\n switch (data.status) {\n case 'success':\n handleSuccessStatus(data, stepItems, chainId, setState, json, client)\n onTerminalSuccess?.()\n break\n case 'refund':\n handleRefundStatus(client, stepItems, onTerminalError)\n break\n }\n }\n // Handle pending status\n else if (data.status === 'pending') {\n client.log(['WebSocket received pending status'], LogLevel.Verbose)\n handlePendingStatus(data, stepItems, setState, json, client)\n }\n // Handle submitted status\n else if (data.status === 'submitted') {\n client.log(['WebSocket received submitted status'], LogLevel.Verbose)\n handleSubmittedStatus(data, stepItems, setState, json, client)\n }\n // Handle failure status with delay (refund flow: pending -> failure -> pending -> refund)\n else if (data.status === 'failure') {\n handleFailureStatusWithDelay(\n stepItems,\n client,\n statusControl,\n onTerminalError\n )\n }\n}\n\nfunction isTerminalStatus(status: string): boolean {\n // Note: 'failure' is not immediately terminal due to the refund flow:\n // pending -> failure -> pending -> refund\n // 'pending' and 'submitted' are intermediate states before 'success'\n return ['success', 'refund'].includes(status)\n}\n\nfunction handlePendingStatus(\n data: RequestStatusUpdatedPayload,\n stepItems: Execute['steps'][0]['items'],\n setState: (data: SetStateData) => void,\n json: Execute,\n client: RelayClient\n): void {\n // Update internalTxHashes if provided\n if (data.inTxHashes && data.inTxHashes.length > 0) {\n const internalTxHashes = data.inTxHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.originChainId ?? data.destinationChainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.internalTxHashes = internalTxHashes\n })\n }\n\n // Mark step items as pending\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'pending'\n item.progressState = undefined\n item.isValidatingSignature = false\n })\n\n // Update state with pending status\n setState({\n steps: [...json.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n client.log(\n ['WebSocket: Origin tx confirmed, backend processing', data],\n LogLevel.Verbose\n )\n}\n\nfunction handleSubmittedStatus(\n data: RequestStatusUpdatedPayload,\n stepItems: Execute['steps'][0]['items'],\n setState: (data: SetStateData) => void,\n json: Execute,\n client: RelayClient\n): void {\n // Update txHashes if provided (partial updates during submitted state)\n if (data.txHashes && data.txHashes.length > 0) {\n const txHashes = data.txHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.destinationChainId ?? data.originChainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.txHashes = txHashes\n })\n }\n\n // Update internalTxHashes if provided\n if (data.inTxHashes && data.inTxHashes.length > 0) {\n const internalTxHashes = data.inTxHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.originChainId ?? data.destinationChainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.internalTxHashes = internalTxHashes\n })\n }\n\n // Mark step items as submitted (intermediate state, not complete)\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'submitted'\n item.progressState = undefined\n item.isValidatingSignature = false\n })\n\n // Update state with submitted status\n setState({\n steps: [...json.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n client.log(\n ['WebSocket: Step submitted to relay, waiting for completion', data],\n LogLevel.Verbose\n )\n}\n\nfunction handleSuccessStatus(\n data: RequestStatusUpdatedPayload,\n stepItems: Execute['steps'][0]['items'],\n chainId: number,\n setState: (data: SetStateData) => void,\n json: Execute,\n client: RelayClient\n): void {\n // Update txHashes if provided\n if (data.txHashes && data.txHashes.length > 0) {\n const txHashes = data.txHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.destinationChainId ?? chainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.txHashes = txHashes\n })\n }\n\n // Update internalTxHashes if provided\n if (data.inTxHashes && data.inTxHashes.length > 0) {\n const internalTxHashes = data.inTxHashes.map((hash: string) => ({\n txHash: hash,\n chainId: data.originChainId ?? chainId\n }))\n updateIncompleteItems(stepItems, (item) => {\n item.internalTxHashes = internalTxHashes\n })\n }\n\n // Mark step items as complete\n updateIncompleteItems(stepItems, (item) => {\n item.status = 'complete'\n item.progressState = 'complete'\n item.checkStatus = 'success'\n })\n\n // Update state with completed steps\n setState({\n steps: [...json.steps],\n fees: { ...json?.fees },\n breakdown: json?.breakdown,\n details: json?.details\n })\n\n client.log(['WebSocket: Step completed successfully', data], LogLevel.Verbose)\n}\n\nfunction handleFailureStatus(\n client: RelayClient,\n stepItems: Execute['steps'][0]['items'],\n onTerminalError?: (error: Error) => void\n): void {\n client.log(['WebSocket: transaction failed'], LogLevel.Error)\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'failure'\n })\n\n const error = new Error('Transaction failed')\n onTerminalError?.(error)\n}\n\nfunction handleRefundStatus(\n client: RelayClient,\n stepItems: Execute['steps'][0]['items'],\n onTerminalError?: (error: Error) => void\n): void {\n client.log(['WebSocket: transaction refunded'], LogLevel.Verbose)\n updateIncompleteItems(stepItems, (item) => {\n item.checkStatus = 'refund'\n })\n const error = new Error('Transaction failed: Refunded')\n onTerminalError?.(error)\n}\n\nfunction handleFailureStatusWithDelay(\n stepItems: Execute['steps'][0]['items'],\n client: RelayClient,\n statusControl: {\n closeWebSocket?: () => void\n lastKnownStatus?: string\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n },\n onTerminalError?: (error: Error) => void\n): void {\n // Clear any existing failure timeout to handle multiple failure statuses\n clearFailureTimeout(statusControl, client, 'new failure status received')\n\n client.log(\n [\n 'WebSocket received failure status, waiting 2 seconds for potential status change'\n ],\n LogLevel.Verbose\n )\n\n // Set a 2-second timeout to handle the case where failure is truly terminal\n statusControl.websocketFailureTimeoutId = setTimeout(() => {\n // Only proceed with failure handling if timeout still exists and status is still failure\n if (\n statusControl.websocketFailureTimeoutId &&\n statusControl.lastKnownStatus === 'failure'\n ) {\n client.log(\n ['WebSocket: 2-second timeout expired, treating failure as terminal'],\n LogLevel.Error\n )\n\n // Clear the timeout state\n statusControl.websocketFailureTimeoutId = null\n\n // Handle as terminal failure\n handleFailureStatus(client, stepItems, onTerminalError)\n } else {\n client.log(\n ['WebSocket: Failure timeout cancelled due to status change'],\n LogLevel.Verbose\n )\n }\n }, 2000) // 2 seconds\n}\n\nfunction updateIncompleteItems(\n stepItems: Execute['steps'][0]['items'],\n updateFn: (item: any) => void\n): void {\n stepItems.forEach((item) => {\n if (item.status === 'incomplete') {\n updateFn(item)\n }\n })\n}\n\nfunction clearFailureTimeout(\n statusControl: {\n websocketFailureTimeoutId?: ReturnType<typeof setTimeout> | null\n },\n client: RelayClient,\n reason: string\n): void {\n if (statusControl.websocketFailureTimeoutId) {\n clearTimeout(statusControl.websocketFailureTimeoutId)\n statusControl.websocketFailureTimeoutId = null\n client.log([`Cleared failure timeout: ${reason}`], LogLevel.Verbose)\n }\n}\n"]}
@@ -284,6 +284,14 @@ async function sendTransactionSafely(chainId, items, step, wallet, setTxHashes,
284
284
  if (signal.aborted) {
285
285
  return;
286
286
  }
287
+ if (statusControl?.lastKnownStatus === 'success') {
288
+ waitingForConfirmation = false;
289
+ (0, client_js_1.getClient)()?.log([
290
+ 'Ignoring receipt error, request already confirmed successful by backend',
291
+ error
292
+ ], logger_js_1.LogLevel.Warn);
293
+ return;
294
+ }
287
295
  let tenderlyError = null;
288
296
  if (receipt && receipt.transactionHash) {
289
297
  tenderlyError = await (0, getTenderlyDetails_js_1.getTenderlyDetails)(chainId, receipt.transactionHash);
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Address, type TransactionReceipt } from 'viem'\nimport { LogLevel } from './logger.js'\nimport type {\n Execute,\n AdaptedWallet,\n TransactionStepItem,\n paths,\n SvmReceipt,\n TronReceipt,\n TonReceipt,\n LvmReceipt\n} from '../types/index.js'\nimport { axios } from '../utils/axios.js'\nimport type {\n AxiosRequestConfig,\n AxiosRequestHeaders,\n AxiosResponse\n} from 'axios'\nimport { getClient } from '../client.js'\nimport {\n DepositTransactionTimeoutError,\n SolverStatusTimeoutError,\n TransactionConfirmationError\n} from '../errors/index.js'\nimport { getApiKeyHeader } from './apiKey.js'\nimport { repeatUntilOk } from '../utils/repeatUntilOk.js'\nimport {\n getTenderlyDetails,\n type TenderlyErrorInfo\n} from '../utils/getTenderlyDetails.js'\n\n/**\n * Safe txhash.wait which handles replacements when users speed up the transaction\n * @param url an URL object\n * @returns A Promise to wait on\n */\nexport async function sendTransactionSafely(\n chainId: number,\n items: TransactionStepItem | TransactionStepItem[],\n step: Execute['steps'][0],\n wallet: AdaptedWallet,\n setTxHashes: (\n tx: NonNullable<Execute['steps'][0]['items']>[0]['txHashes']\n ) => void,\n setInternalTxHashes: (\n tx: NonNullable<Execute['steps'][0]['items']>[0]['internalTxHashes']\n ) => void,\n onWebsocketFailed: (() => Promise<void>) | null,\n request: AxiosRequestConfig,\n headers?: AxiosRequestHeaders,\n crossChainIntentChainId?: number,\n isValidating?: (res?: AxiosResponse<any, any>) => void,\n details?: Execute['details'],\n setReceipt?: (\n receipt:\n | TransactionReceipt\n | SvmReceipt\n | TronReceipt\n | TonReceipt\n | LvmReceipt\n ) => void,\n setCheckStatus?: (\n checkStatus: NonNullable<Execute['steps'][0]['items']>[0]['checkStatus']\n ) => void,\n statusControl?: { lastKnownStatus?: string }\n) {\n const client = getClient()\n try {\n //In some cases wallets can be delayed when switching chains, causing this check to fail.\n //To work around this we check the chain id of the active wallet a few times before declaring it a failure\n await repeatUntilOk(\n async () => {\n const walletChainId = await wallet.getChainId()\n return walletChainId === chainId\n },\n 10,\n undefined,\n 250\n )\n } catch (e) {\n const walletChainId = await wallet.getChainId()\n throw `Current chain id: ${walletChainId} does not match expected chain id: ${chainId} `\n }\n let receipt:\n | TransactionReceipt\n | SvmReceipt\n | TronReceipt\n | TonReceipt\n | LvmReceipt\n | undefined\n let transactionCancelled = false\n let confirmationError = false\n const pollingInterval = client.pollingInterval ?? 5000\n const maximumAttempts =\n client.maxPollingAttemptsBeforeTimeout ??\n (2.5 * 60 * 1000) / pollingInterval // default to 2 minutes and 30 seconds worth of attempts\n let waitingForConfirmation = true\n let attemptCount = 0\n let txHash: string | undefined\n\n // Check if batching txs is supported and if there are multiple items to batch\n const isBatchTransaction = Boolean(\n Array.isArray(items) &&\n items.length > 1 &&\n wallet.handleBatchTransactionStep\n )\n\n if (isBatchTransaction) {\n txHash = await wallet.handleBatchTransactionStep?.(\n chainId,\n items as TransactionStepItem[],\n step\n )\n } else {\n txHash = await wallet.handleSendTransactionStep(\n chainId,\n Array.isArray(items) ? items[0] : items,\n step\n )\n }\n\n if ((txHash as any) === 'null') {\n throw 'User rejected the request'\n }\n\n // Find the first item with a check endpoint\n const check = Array.isArray(items)\n ? items.find((item) => item.check)?.check\n : items.check\n\n // Post transaction to solver\n postTransactionToSolver({\n txHash,\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n\n if (\n txHash &&\n !isBatchTransaction &&\n !Array.isArray(items) &&\n chainId === details?.currencyOut?.currency?.chainId\n ) {\n postSameChainTransactionToSolver({\n calldata: JSON.stringify({ ...items.data, txHash }),\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n }\n\n if (!txHash) {\n throw Error(\n 'Transaction hash not returned from handleSendTransactionStep method'\n )\n }\n\n setTxHashes([\n { txHash: txHash, chainId: chainId, isBatchTx: isBatchTransaction }\n ])\n\n //Set up internal functions\n const validate = (res: AxiosResponse<any, any>) => {\n getClient()?.log(\n [\n 'Execute Steps: Polling for confirmation',\n JSON.stringify(res.data, null, 2)\n ],\n LogLevel.Verbose\n )\n\n setCheckStatus?.(res.data?.status)\n\n if (res.status === 200 && res.data && res.data.status === 'failure') {\n throw Error('Transaction failed')\n }\n if (res.status === 200 && res.data && res.data.status === 'fallback') {\n throw Error('Transaction failed: Refunded')\n }\n if (res.status === 200 && res.data && res.data.status === 'refund') {\n throw Error('Transaction failed: Refunded')\n }\n if (res.status === 200 && res.data && res.data.status === 'pending') {\n // Extract origin txHashes if provided\n if (res.data.inTxHashes && res.data.inTxHashes.length > 0) {\n const depositTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.inTxHashes.map((hash: Address) => ({\n txHash: hash,\n chainId: res.data.originChainId ?? chainId,\n isBatchTx: isBatchTransaction\n }))\n setInternalTxHashes(depositTxHashes)\n }\n return false\n }\n if (res.status === 200 && res.data && res.data.status === 'submitted') {\n // Extract destination txHashes if provided\n if (res.data.txHashes && res.data.txHashes.length > 0) {\n const fillTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.txHashes.map((hash: Address) => ({\n txHash: hash,\n chainId: res.data.destinationChainId ?? crossChainIntentChainId\n }))\n setTxHashes(fillTxHashes)\n }\n\n // Extract origin txHashes if provided\n if (res.data.inTxHashes && res.data.inTxHashes.length > 0) {\n const depositTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.inTxHashes.map((hash: Address) => ({\n txHash: hash,\n chainId: res.data.originChainId ?? chainId,\n isBatchTx: isBatchTransaction\n }))\n setInternalTxHashes(depositTxHashes)\n }\n\n // For Bitcoin destinations, stop polling at 'submitted' since Bitcoin confirmations take 10+ minutes\n // For other chains, continue polling until 'success'\n const isBitcoinDestination =\n details?.currencyOut?.currency?.chainId === 8253038\n return isBitcoinDestination\n }\n if (res.status === 200 && res.data && res.data.status === 'success') {\n if (txHash) {\n setInternalTxHashes([\n { txHash: txHash, chainId: chainId, isBatchTx: isBatchTransaction }\n ])\n } else if (res?.data?.inTxHashes) {\n const depositTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data?.inTxHashes?.map((hash: Address) => {\n return {\n txHash: hash,\n chainId: res?.data?.originChainId ?? chainId,\n isBatchTx: isBatchTransaction\n }\n })\n setInternalTxHashes(depositTxHashes)\n }\n if (res.data?.txHashes && res.data.txHashes.length > 0) {\n const fillTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.txHashes.map((hash: Address) => {\n return {\n txHash: hash,\n chainId: res?.data?.destinationChainId ?? crossChainIntentChainId\n }\n })\n setTxHashes(fillTxHashes)\n }\n\n setCheckStatus?.('success')\n\n return true\n }\n return false\n }\n\n // Poll the confirmation url to confirm the transaction went through\n const pollForConfirmation = async (receiptController?: AbortController) => {\n isValidating?.()\n\n // If websocket is enabled, wait for it to fail before falling back to polling\n if (onWebsocketFailed) {\n try {\n await onWebsocketFailed()\n client.log(['WebSocket failed, starting polling'], LogLevel.Verbose)\n } catch (e) {\n client.log(\n ['WebSocket failed promise rejected, skipping polling'],\n LogLevel.Verbose\n )\n return\n }\n }\n\n // Start polling\n while (\n waitingForConfirmation &&\n attemptCount < maximumAttempts &&\n !transactionCancelled &&\n !confirmationError\n ) {\n client.log(['Polling for confirmation'], LogLevel.Verbose)\n\n let res: AxiosResponse<any, any> | undefined\n if (check?.endpoint && !request?.data?.useExternalLiquidity) {\n let endpoint = check?.endpoint\n\n // Override v2 status endpoint to v3 to get 'submitted' status\n if (endpoint.includes('/intents/status') && !endpoint.includes('/v3')) {\n endpoint = endpoint.replace('/intents/status', '/intents/status/v3')\n }\n\n if (\n client.source &&\n !endpoint.includes('referrer') &&\n check?.method === 'GET'\n ) {\n endpoint = endpoint.includes('?')\n ? `${endpoint}&referrer=${client.source}`\n : `${endpoint}?referrer=${client.source}`\n }\n try {\n res = await axios.request({\n url: `${request.baseURL}${endpoint}`,\n method: check?.method,\n headers: {\n ...getApiKeyHeader(client, request.baseURL),\n ...headers\n }\n })\n } catch (e) {\n getClient()?.log(\n ['Execute Steps: Polling for confirmation api error', e],\n LogLevel.Verbose\n )\n res = {\n data: {},\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {\n headers: {} as AxiosRequestHeaders\n }\n }\n }\n }\n\n if (res?.data?.status === 'pending' && waitingForConfirmation) {\n //we can now abort checking for the receipt as we know it's complete by the backend\n receiptController?.abort()\n }\n\n if (!res || validate(res)) {\n waitingForConfirmation = false // transaction confirmed\n } else if (res) {\n if (res.data.status !== 'pending') {\n isValidating?.(res)\n attemptCount++\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingInterval))\n }\n }\n\n if (attemptCount >= maximumAttempts) {\n if (receipt) {\n throw new SolverStatusTimeoutError(\n txHash as Address,\n step.requestId ?? '',\n attemptCount\n )\n } else {\n throw new DepositTransactionTimeoutError(\n txHash as Address,\n step.requestId ?? '',\n attemptCount\n )\n }\n }\n\n if (transactionCancelled) {\n throw Error('Transaction was cancelled')\n }\n\n return true\n }\n\n const waitForTransaction = () => {\n const controller = new AbortController()\n const signal = controller.signal\n\n return {\n promise: wallet\n .handleConfirmTransactionStep(\n txHash as string,\n chainId,\n (replacementTxHash) => {\n if (signal.aborted) {\n return\n }\n setTxHashes([{ txHash: replacementTxHash, chainId: chainId }])\n txHash = replacementTxHash\n attemptCount = 0 // reset attempt count\n getClient()?.log(\n ['Transaction replaced', replacementTxHash],\n LogLevel.Verbose\n )\n postTransactionToSolver({\n txHash: replacementTxHash,\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n\n if (\n !isBatchTransaction &&\n !Array.isArray(items) &&\n chainId === details?.currencyOut?.currency?.chainId\n ) {\n postSameChainTransactionToSolver({\n calldata: JSON.stringify({ ...items.data, replacementTxHash }),\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n }\n },\n () => {\n if (signal.aborted) {\n return\n }\n transactionCancelled = true\n getClient()?.log(['Transaction cancelled'], LogLevel.Verbose)\n }\n )\n .then((data) => {\n if (signal.aborted) {\n return\n }\n receipt = data\n setReceipt?.(receipt)\n if (\n receipt &&\n typeof receipt === 'object' &&\n 'status' in receipt &&\n receipt.status === 'reverted'\n ) {\n throw 'Transaction Reverted'\n }\n getClient()?.log(\n ['Transaction Receipt obtained', receipt],\n LogLevel.Verbose\n )\n })\n .catch(async (error) => {\n if (signal.aborted) {\n return\n }\n\n let tenderlyError: TenderlyErrorInfo | null = null\n\n if (receipt && (receipt as TransactionReceipt).transactionHash) {\n tenderlyError = await getTenderlyDetails(\n chainId,\n (receipt as TransactionReceipt).transactionHash\n )\n }\n getClient()?.log(\n ['Error in handleConfirmTransactionStep', error],\n LogLevel.Error\n )\n if (error.message === 'Transaction cancelled') {\n transactionCancelled = true\n } else {\n confirmationError = true\n throw new TransactionConfirmationError(\n error,\n receipt,\n tenderlyError\n )\n }\n }),\n controller\n }\n }\n\n //If the origin chain is bitcoin, skip polling for confirmation, because the deposit will take too long\n if (chainId === 8253038) {\n return true\n }\n\n if (isBatchTransaction) {\n await pollForConfirmation() // Rely on the solver to confirm batch transactions\n } else if (\n //Sequence internal functions\n // We want synchronous execution in the following cases:\n // - Approval Signature step required first\n // - Bitcoin is the destination (need to poll status API for backend updates)\n // - Canonical route used\n step.id === 'approve' ||\n details?.currencyOut?.currency?.chainId === 8253038 ||\n request?.data?.useExternalLiquidity\n ) {\n await waitForTransaction().promise\n //In the following cases we want to skip polling for confirmation:\n // - Canonical route, lengthy fill time (skip polling)\n // Note: Bitcoin destination now polls status API to get 'submitted' status\n if (!request?.data?.useExternalLiquidity) {\n await pollForConfirmation()\n }\n } else {\n const { promise: receiptPromise, controller: receiptController } =\n waitForTransaction()\n const confirmationPromise = pollForConfirmation(receiptController)\n\n await Promise.race([receiptPromise, confirmationPromise])\n const isSameChain = details?.currencyOut?.currency?.chainId === chainId\n\n if (waitingForConfirmation) {\n if (!isSameChain) {\n await confirmationPromise\n } else {\n waitingForConfirmation = false\n // For same chain transactions, mark as complete to prevent WebSocket polling fallback\n if (statusControl) {\n statusControl.lastKnownStatus = 'success'\n }\n }\n }\n\n if (!receipt) {\n if (!check) {\n await receiptPromise\n } else {\n receiptController.abort()\n }\n }\n }\n\n return true\n}\n\nconst postSameChainTransactionToSolver = async ({\n calldata,\n chainId,\n request,\n headers,\n step,\n source\n}: {\n calldata: string\n chainId: number\n step: Execute['steps'][0]\n request: AxiosRequestConfig\n headers?: AxiosRequestHeaders\n source?: string\n}) => {\n if (calldata && step.requestId && chainId) {\n getClient()?.log(\n ['Posting same chain transaction to notify the solver'],\n LogLevel.Verbose\n )\n try {\n const triggerData: paths['/transactions/single']['post']['requestBody']['content']['application/json'] & {\n referrer?: string\n } = {\n tx: calldata,\n chainId: chainId.toString(),\n requestId: step.requestId,\n referrer: source\n }\n\n axios\n .request({\n url: `${request.baseURL}/transactions/single`,\n method: 'POST',\n headers: {\n ...getApiKeyHeader(getClient(), request.baseURL),\n ...headers\n },\n data: triggerData\n })\n .then(() => {\n getClient()?.log(\n ['Same chain transaction notified to the solver'],\n LogLevel.Verbose\n )\n })\n .catch((e) => {\n getClient()?.log(\n ['Failed to post same chain transaction to solver', e],\n LogLevel.Warn\n )\n })\n } catch (e) {\n getClient()?.log(\n ['Failed to post same chain transaction to solver', e],\n LogLevel.Warn\n )\n }\n }\n}\n\nconst postTransactionToSolver = async ({\n txHash,\n chainId,\n request,\n headers,\n step,\n source\n}: {\n txHash: string | undefined\n chainId: number\n step: Execute['steps'][0]\n request: AxiosRequestConfig\n headers?: AxiosRequestHeaders\n source?: string\n}) => {\n if (step.id === 'deposit' && txHash) {\n getClient()?.log(\n ['Posting transaction to notify the solver'],\n LogLevel.Verbose\n )\n try {\n const triggerData: NonNullable<\n paths['/transactions/index']['post']['requestBody']\n >['content']['application/json'] & { referrer?: string } = {\n txHash,\n chainId: chainId.toString(),\n referrer: source\n }\n\n axios\n .request({\n url: `${request.baseURL}/transactions/index`,\n method: 'POST',\n headers: {\n ...getApiKeyHeader(getClient(), request.baseURL),\n ...headers\n },\n data: triggerData\n })\n .then(() => {\n getClient()?.log(\n ['Transaction notified to the solver'],\n LogLevel.Verbose\n )\n })\n .catch((e) => {\n getClient()?.log(\n ['Failed to post transaction to solver', e],\n LogLevel.Warn\n )\n })\n } catch (e) {\n getClient()?.log(\n ['Failed to post transaction to solver', e],\n LogLevel.Warn\n )\n }\n }\n}\n"]}
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Address, type TransactionReceipt } from 'viem'\nimport { LogLevel } from './logger.js'\nimport type {\n Execute,\n AdaptedWallet,\n TransactionStepItem,\n paths,\n SvmReceipt,\n TronReceipt,\n TonReceipt,\n LvmReceipt\n} from '../types/index.js'\nimport { axios } from '../utils/axios.js'\nimport type {\n AxiosRequestConfig,\n AxiosRequestHeaders,\n AxiosResponse\n} from 'axios'\nimport { getClient } from '../client.js'\nimport {\n DepositTransactionTimeoutError,\n SolverStatusTimeoutError,\n TransactionConfirmationError\n} from '../errors/index.js'\nimport { getApiKeyHeader } from './apiKey.js'\nimport { repeatUntilOk } from '../utils/repeatUntilOk.js'\nimport {\n getTenderlyDetails,\n type TenderlyErrorInfo\n} from '../utils/getTenderlyDetails.js'\n\n/**\n * Safe txhash.wait which handles replacements when users speed up the transaction\n * @param url an URL object\n * @returns A Promise to wait on\n */\nexport async function sendTransactionSafely(\n chainId: number,\n items: TransactionStepItem | TransactionStepItem[],\n step: Execute['steps'][0],\n wallet: AdaptedWallet,\n setTxHashes: (\n tx: NonNullable<Execute['steps'][0]['items']>[0]['txHashes']\n ) => void,\n setInternalTxHashes: (\n tx: NonNullable<Execute['steps'][0]['items']>[0]['internalTxHashes']\n ) => void,\n onWebsocketFailed: (() => Promise<void>) | null,\n request: AxiosRequestConfig,\n headers?: AxiosRequestHeaders,\n crossChainIntentChainId?: number,\n isValidating?: (res?: AxiosResponse<any, any>) => void,\n details?: Execute['details'],\n setReceipt?: (\n receipt:\n | TransactionReceipt\n | SvmReceipt\n | TronReceipt\n | TonReceipt\n | LvmReceipt\n ) => void,\n setCheckStatus?: (\n checkStatus: NonNullable<Execute['steps'][0]['items']>[0]['checkStatus']\n ) => void,\n statusControl?: { lastKnownStatus?: string }\n) {\n const client = getClient()\n try {\n //In some cases wallets can be delayed when switching chains, causing this check to fail.\n //To work around this we check the chain id of the active wallet a few times before declaring it a failure\n await repeatUntilOk(\n async () => {\n const walletChainId = await wallet.getChainId()\n return walletChainId === chainId\n },\n 10,\n undefined,\n 250\n )\n } catch (e) {\n const walletChainId = await wallet.getChainId()\n throw `Current chain id: ${walletChainId} does not match expected chain id: ${chainId} `\n }\n let receipt:\n | TransactionReceipt\n | SvmReceipt\n | TronReceipt\n | TonReceipt\n | LvmReceipt\n | undefined\n let transactionCancelled = false\n let confirmationError = false\n const pollingInterval = client.pollingInterval ?? 5000\n const maximumAttempts =\n client.maxPollingAttemptsBeforeTimeout ??\n (2.5 * 60 * 1000) / pollingInterval // default to 2 minutes and 30 seconds worth of attempts\n let waitingForConfirmation = true\n let attemptCount = 0\n let txHash: string | undefined\n\n // Check if batching txs is supported and if there are multiple items to batch\n const isBatchTransaction = Boolean(\n Array.isArray(items) &&\n items.length > 1 &&\n wallet.handleBatchTransactionStep\n )\n\n if (isBatchTransaction) {\n txHash = await wallet.handleBatchTransactionStep?.(\n chainId,\n items as TransactionStepItem[],\n step\n )\n } else {\n txHash = await wallet.handleSendTransactionStep(\n chainId,\n Array.isArray(items) ? items[0] : items,\n step\n )\n }\n\n if ((txHash as any) === 'null') {\n throw 'User rejected the request'\n }\n\n // Find the first item with a check endpoint\n const check = Array.isArray(items)\n ? items.find((item) => item.check)?.check\n : items.check\n\n // Post transaction to solver\n postTransactionToSolver({\n txHash,\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n\n if (\n txHash &&\n !isBatchTransaction &&\n !Array.isArray(items) &&\n chainId === details?.currencyOut?.currency?.chainId\n ) {\n postSameChainTransactionToSolver({\n calldata: JSON.stringify({ ...items.data, txHash }),\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n }\n\n if (!txHash) {\n throw Error(\n 'Transaction hash not returned from handleSendTransactionStep method'\n )\n }\n\n setTxHashes([\n { txHash: txHash, chainId: chainId, isBatchTx: isBatchTransaction }\n ])\n\n //Set up internal functions\n const validate = (res: AxiosResponse<any, any>) => {\n getClient()?.log(\n [\n 'Execute Steps: Polling for confirmation',\n JSON.stringify(res.data, null, 2)\n ],\n LogLevel.Verbose\n )\n\n setCheckStatus?.(res.data?.status)\n\n if (res.status === 200 && res.data && res.data.status === 'failure') {\n throw Error('Transaction failed')\n }\n if (res.status === 200 && res.data && res.data.status === 'fallback') {\n throw Error('Transaction failed: Refunded')\n }\n if (res.status === 200 && res.data && res.data.status === 'refund') {\n throw Error('Transaction failed: Refunded')\n }\n if (res.status === 200 && res.data && res.data.status === 'pending') {\n // Extract origin txHashes if provided\n if (res.data.inTxHashes && res.data.inTxHashes.length > 0) {\n const depositTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.inTxHashes.map((hash: Address) => ({\n txHash: hash,\n chainId: res.data.originChainId ?? chainId,\n isBatchTx: isBatchTransaction\n }))\n setInternalTxHashes(depositTxHashes)\n }\n return false\n }\n if (res.status === 200 && res.data && res.data.status === 'submitted') {\n // Extract destination txHashes if provided\n if (res.data.txHashes && res.data.txHashes.length > 0) {\n const fillTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.txHashes.map((hash: Address) => ({\n txHash: hash,\n chainId: res.data.destinationChainId ?? crossChainIntentChainId\n }))\n setTxHashes(fillTxHashes)\n }\n\n // Extract origin txHashes if provided\n if (res.data.inTxHashes && res.data.inTxHashes.length > 0) {\n const depositTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.inTxHashes.map((hash: Address) => ({\n txHash: hash,\n chainId: res.data.originChainId ?? chainId,\n isBatchTx: isBatchTransaction\n }))\n setInternalTxHashes(depositTxHashes)\n }\n\n // For Bitcoin destinations, stop polling at 'submitted' since Bitcoin confirmations take 10+ minutes\n // For other chains, continue polling until 'success'\n const isBitcoinDestination =\n details?.currencyOut?.currency?.chainId === 8253038\n return isBitcoinDestination\n }\n if (res.status === 200 && res.data && res.data.status === 'success') {\n if (txHash) {\n setInternalTxHashes([\n { txHash: txHash, chainId: chainId, isBatchTx: isBatchTransaction }\n ])\n } else if (res?.data?.inTxHashes) {\n const depositTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data?.inTxHashes?.map((hash: Address) => {\n return {\n txHash: hash,\n chainId: res?.data?.originChainId ?? chainId,\n isBatchTx: isBatchTransaction\n }\n })\n setInternalTxHashes(depositTxHashes)\n }\n if (res.data?.txHashes && res.data.txHashes.length > 0) {\n const fillTxHashes: NonNullable<\n Execute['steps'][0]['items']\n >[0]['txHashes'] = res.data.txHashes.map((hash: Address) => {\n return {\n txHash: hash,\n chainId: res?.data?.destinationChainId ?? crossChainIntentChainId\n }\n })\n setTxHashes(fillTxHashes)\n }\n\n setCheckStatus?.('success')\n\n return true\n }\n return false\n }\n\n // Poll the confirmation url to confirm the transaction went through\n const pollForConfirmation = async (receiptController?: AbortController) => {\n isValidating?.()\n\n // If websocket is enabled, wait for it to fail before falling back to polling\n if (onWebsocketFailed) {\n try {\n await onWebsocketFailed()\n client.log(['WebSocket failed, starting polling'], LogLevel.Verbose)\n } catch (e) {\n client.log(\n ['WebSocket failed promise rejected, skipping polling'],\n LogLevel.Verbose\n )\n return\n }\n }\n\n // Start polling\n while (\n waitingForConfirmation &&\n attemptCount < maximumAttempts &&\n !transactionCancelled &&\n !confirmationError\n ) {\n client.log(['Polling for confirmation'], LogLevel.Verbose)\n\n let res: AxiosResponse<any, any> | undefined\n if (check?.endpoint && !request?.data?.useExternalLiquidity) {\n let endpoint = check?.endpoint\n\n // Override v2 status endpoint to v3 to get 'submitted' status\n if (endpoint.includes('/intents/status') && !endpoint.includes('/v3')) {\n endpoint = endpoint.replace('/intents/status', '/intents/status/v3')\n }\n\n if (\n client.source &&\n !endpoint.includes('referrer') &&\n check?.method === 'GET'\n ) {\n endpoint = endpoint.includes('?')\n ? `${endpoint}&referrer=${client.source}`\n : `${endpoint}?referrer=${client.source}`\n }\n try {\n res = await axios.request({\n url: `${request.baseURL}${endpoint}`,\n method: check?.method,\n headers: {\n ...getApiKeyHeader(client, request.baseURL),\n ...headers\n }\n })\n } catch (e) {\n getClient()?.log(\n ['Execute Steps: Polling for confirmation api error', e],\n LogLevel.Verbose\n )\n res = {\n data: {},\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {\n headers: {} as AxiosRequestHeaders\n }\n }\n }\n }\n\n if (res?.data?.status === 'pending' && waitingForConfirmation) {\n //we can now abort checking for the receipt as we know it's complete by the backend\n receiptController?.abort()\n }\n\n if (!res || validate(res)) {\n waitingForConfirmation = false // transaction confirmed\n } else if (res) {\n if (res.data.status !== 'pending') {\n isValidating?.(res)\n attemptCount++\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingInterval))\n }\n }\n\n if (attemptCount >= maximumAttempts) {\n if (receipt) {\n throw new SolverStatusTimeoutError(\n txHash as Address,\n step.requestId ?? '',\n attemptCount\n )\n } else {\n throw new DepositTransactionTimeoutError(\n txHash as Address,\n step.requestId ?? '',\n attemptCount\n )\n }\n }\n\n if (transactionCancelled) {\n throw Error('Transaction was cancelled')\n }\n\n return true\n }\n\n const waitForTransaction = () => {\n const controller = new AbortController()\n const signal = controller.signal\n\n return {\n promise: wallet\n .handleConfirmTransactionStep(\n txHash as string,\n chainId,\n (replacementTxHash) => {\n if (signal.aborted) {\n return\n }\n setTxHashes([{ txHash: replacementTxHash, chainId: chainId }])\n txHash = replacementTxHash\n attemptCount = 0 // reset attempt count\n getClient()?.log(\n ['Transaction replaced', replacementTxHash],\n LogLevel.Verbose\n )\n postTransactionToSolver({\n txHash: replacementTxHash,\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n\n if (\n !isBatchTransaction &&\n !Array.isArray(items) &&\n chainId === details?.currencyOut?.currency?.chainId\n ) {\n postSameChainTransactionToSolver({\n calldata: JSON.stringify({ ...items.data, replacementTxHash }),\n chainId,\n step,\n request,\n headers,\n source: client.source\n })\n }\n },\n () => {\n if (signal.aborted) {\n return\n }\n transactionCancelled = true\n getClient()?.log(['Transaction cancelled'], LogLevel.Verbose)\n }\n )\n .then((data) => {\n if (signal.aborted) {\n return\n }\n receipt = data\n setReceipt?.(receipt)\n if (\n receipt &&\n typeof receipt === 'object' &&\n 'status' in receipt &&\n receipt.status === 'reverted'\n ) {\n throw 'Transaction Reverted'\n }\n getClient()?.log(\n ['Transaction Receipt obtained', receipt],\n LogLevel.Verbose\n )\n })\n .catch(async (error) => {\n if (signal.aborted) {\n return\n }\n\n // The backend (via websocket) has already confirmed the request succeeded.\n // A late RPC receipt error at this point is a node/RPC issue, not a failed\n // transaction, so don't surface it as a TransactionConfirmationError.\n if (statusControl?.lastKnownStatus === 'success') {\n waitingForConfirmation = false\n getClient()?.log(\n [\n 'Ignoring receipt error, request already confirmed successful by backend',\n error\n ],\n LogLevel.Warn\n )\n return\n }\n\n let tenderlyError: TenderlyErrorInfo | null = null\n\n if (receipt && (receipt as TransactionReceipt).transactionHash) {\n tenderlyError = await getTenderlyDetails(\n chainId,\n (receipt as TransactionReceipt).transactionHash\n )\n }\n getClient()?.log(\n ['Error in handleConfirmTransactionStep', error],\n LogLevel.Error\n )\n if (error.message === 'Transaction cancelled') {\n transactionCancelled = true\n } else {\n confirmationError = true\n throw new TransactionConfirmationError(\n error,\n receipt,\n tenderlyError\n )\n }\n }),\n controller\n }\n }\n\n //If the origin chain is bitcoin, skip polling for confirmation, because the deposit will take too long\n if (chainId === 8253038) {\n return true\n }\n\n if (isBatchTransaction) {\n await pollForConfirmation() // Rely on the solver to confirm batch transactions\n } else if (\n //Sequence internal functions\n // We want synchronous execution in the following cases:\n // - Approval Signature step required first\n // - Bitcoin is the destination (need to poll status API for backend updates)\n // - Canonical route used\n step.id === 'approve' ||\n details?.currencyOut?.currency?.chainId === 8253038 ||\n request?.data?.useExternalLiquidity\n ) {\n await waitForTransaction().promise\n //In the following cases we want to skip polling for confirmation:\n // - Canonical route, lengthy fill time (skip polling)\n // Note: Bitcoin destination now polls status API to get 'submitted' status\n if (!request?.data?.useExternalLiquidity) {\n await pollForConfirmation()\n }\n } else {\n const { promise: receiptPromise, controller: receiptController } =\n waitForTransaction()\n const confirmationPromise = pollForConfirmation(receiptController)\n\n await Promise.race([receiptPromise, confirmationPromise])\n const isSameChain = details?.currencyOut?.currency?.chainId === chainId\n\n if (waitingForConfirmation) {\n if (!isSameChain) {\n await confirmationPromise\n } else {\n waitingForConfirmation = false\n // For same chain transactions, mark as complete to prevent WebSocket polling fallback\n if (statusControl) {\n statusControl.lastKnownStatus = 'success'\n }\n }\n }\n\n if (!receipt) {\n if (!check) {\n await receiptPromise\n } else {\n receiptController.abort()\n }\n }\n }\n\n return true\n}\n\nconst postSameChainTransactionToSolver = async ({\n calldata,\n chainId,\n request,\n headers,\n step,\n source\n}: {\n calldata: string\n chainId: number\n step: Execute['steps'][0]\n request: AxiosRequestConfig\n headers?: AxiosRequestHeaders\n source?: string\n}) => {\n if (calldata && step.requestId && chainId) {\n getClient()?.log(\n ['Posting same chain transaction to notify the solver'],\n LogLevel.Verbose\n )\n try {\n const triggerData: paths['/transactions/single']['post']['requestBody']['content']['application/json'] & {\n referrer?: string\n } = {\n tx: calldata,\n chainId: chainId.toString(),\n requestId: step.requestId,\n referrer: source\n }\n\n axios\n .request({\n url: `${request.baseURL}/transactions/single`,\n method: 'POST',\n headers: {\n ...getApiKeyHeader(getClient(), request.baseURL),\n ...headers\n },\n data: triggerData\n })\n .then(() => {\n getClient()?.log(\n ['Same chain transaction notified to the solver'],\n LogLevel.Verbose\n )\n })\n .catch((e) => {\n getClient()?.log(\n ['Failed to post same chain transaction to solver', e],\n LogLevel.Warn\n )\n })\n } catch (e) {\n getClient()?.log(\n ['Failed to post same chain transaction to solver', e],\n LogLevel.Warn\n )\n }\n }\n}\n\nconst postTransactionToSolver = async ({\n txHash,\n chainId,\n request,\n headers,\n step,\n source\n}: {\n txHash: string | undefined\n chainId: number\n step: Execute['steps'][0]\n request: AxiosRequestConfig\n headers?: AxiosRequestHeaders\n source?: string\n}) => {\n if (step.id === 'deposit' && txHash) {\n getClient()?.log(\n ['Posting transaction to notify the solver'],\n LogLevel.Verbose\n )\n try {\n const triggerData: NonNullable<\n paths['/transactions/index']['post']['requestBody']\n >['content']['application/json'] & { referrer?: string } = {\n txHash,\n chainId: chainId.toString(),\n referrer: source\n }\n\n axios\n .request({\n url: `${request.baseURL}/transactions/index`,\n method: 'POST',\n headers: {\n ...getApiKeyHeader(getClient(), request.baseURL),\n ...headers\n },\n data: triggerData\n })\n .then(() => {\n getClient()?.log(\n ['Transaction notified to the solver'],\n LogLevel.Verbose\n )\n })\n .catch((e) => {\n getClient()?.log(\n ['Failed to post transaction to solver', e],\n LogLevel.Warn\n )\n })\n } catch (e) {\n getClient()?.log(\n ['Failed to post transaction to solver', e],\n LogLevel.Warn\n )\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SDK_VERSION = void 0;
4
- exports.SDK_VERSION = '7.0.2';
4
+ exports.SDK_VERSION = '7.0.3';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_VERSION = '7.0.2';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_VERSION = '7.0.3';\n"]}