@n1xyz/wallet-widget 0.0.35-alpha.13 → 0.0.35-alpha.15

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.
@@ -179,7 +179,8 @@ var BridgeKitClient = /** @class */ (function () {
179
179
  return [2 /*return*/, mappedToChain_1];
180
180
  }); }); },
181
181
  capabilities: {
182
- addressContext: 'user-controlled',
182
+ // We control the destination address here; Bridge Kit may include it in contexts.
183
+ addressContext: 'developer-controlled',
183
184
  supportedChains: [mappedToChain_1],
184
185
  },
185
186
  actionRegistry: {},
@@ -189,9 +190,45 @@ var BridgeKitClient = /** @class */ (function () {
189
190
  args[_i] = arguments[_i];
190
191
  }
191
192
  return __awaiter(_this, void 0, void 0, function () {
193
+ var action;
194
+ var _this = this;
192
195
  return __generator(this, function (_a) {
196
+ // Expected usage in Bridge Kit v1.5+: prepareAction("native.balanceOf", { walletAddress }, ctx)
193
197
  logger.debug('[CCTP] prepareAction', { args: args });
194
- throw new Error('Destination adapter is not fully implemented');
198
+ action = args === null || args === void 0 ? void 0 : args[0];
199
+ if (action === 'native.balanceOf') {
200
+ // Return a large synthetic balance (lamports) so preflight passes.
201
+ // We do not rely on destination native balance for our flow since we claim via Bridge Assist.
202
+ return [2 /*return*/, {
203
+ estimate: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
204
+ return [2 /*return*/, ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' })];
205
+ }); }); },
206
+ execute: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
207
+ return [2 /*return*/, BigInt('10000000000')];
208
+ }); }); },
209
+ }];
210
+ }
211
+ if (action === 'usdc.balanceOf') {
212
+ return [2 /*return*/, {
213
+ estimate: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
214
+ return [2 /*return*/, ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' })];
215
+ }); }); },
216
+ execute: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
217
+ return [2 /*return*/, BigInt(0)];
218
+ }); }); },
219
+ }];
220
+ }
221
+ // Unknown action: surface a recoverable error via the execute path
222
+ return [2 /*return*/, {
223
+ estimate: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
224
+ return [2 /*return*/, ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' })];
225
+ }); }); },
226
+ execute: function () { return __awaiter(_this, void 0, void 0, function () {
227
+ return __generator(this, function (_a) {
228
+ throw new Error("Destination adapter does not support action \"".concat(String(action), "\""));
229
+ });
230
+ }); },
231
+ }];
195
232
  });
196
233
  });
197
234
  },
@@ -201,9 +238,21 @@ var BridgeKitClient = /** @class */ (function () {
201
238
  args[_i] = arguments[_i];
202
239
  }
203
240
  return __awaiter(_this, void 0, void 0, function () {
241
+ var _this = this;
204
242
  return __generator(this, function (_a) {
205
243
  logger.debug('[CCTP] prepare', { args: args });
206
- throw new Error('Destination adapter is not fully implemented');
244
+ // Do not throw here; return a prepared request so Bridge Kit can
245
+ // mark the destination step as failed during execute (recoverable).
246
+ return [2 /*return*/, {
247
+ estimate: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
248
+ return [2 /*return*/, ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' })];
249
+ }); }); },
250
+ execute: function () { return __awaiter(_this, void 0, void 0, function () {
251
+ return __generator(this, function (_a) {
252
+ throw new Error('Destination adapter is read-only (mint not supported)');
253
+ });
254
+ }); },
255
+ }];
207
256
  });
208
257
  });
209
258
  },
@@ -215,7 +264,7 @@ var BridgeKitClient = /** @class */ (function () {
215
264
  return __awaiter(_this, void 0, void 0, function () {
216
265
  return __generator(this, function (_a) {
217
266
  logger.debug('[CCTP] waitForTransaction', { args: args });
218
- throw new Error('Destination adapter is not fully implemented');
267
+ throw new Error('Destination adapter is read-only (waitForTransaction not supported)');
219
268
  });
220
269
  });
221
270
  },
@@ -239,6 +288,9 @@ var BridgeKitClient = /** @class */ (function () {
239
288
  });
240
289
  });
241
290
  },
291
+ calculateTransactionFee: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
292
+ return [2 /*return*/, BigInt(0)];
293
+ }); }); },
242
294
  };
243
295
  // Listen to all events to debug/find the right one
244
296
  kit.on('*', function (payload) {
@@ -254,7 +306,10 @@ var BridgeKitClient = /** @class */ (function () {
254
306
  adapter: dummyDestAdapter,
255
307
  chain: mappedToChain_1,
256
308
  recipientAddress: params.destinationAddress,
257
- address: undefined, // Explicitly undefined to avoid accidental properties
309
+ // Bridge Kit requires `address` when the adapter is developer-controlled.
310
+ // Without it, preflight throws:
311
+ // "Address is required in context for developer-controlled adapters..."
312
+ address: params.destinationAddress,
258
313
  },
259
314
  })];
260
315
  case 7:
@@ -1 +1 @@
1
- {"version":3,"file":"bridgeKitClient.js","sourceRoot":"","sources":["../../../../../src/features/onboarding-flow/cctp/bridgeKitClient.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CctpBridgeParams,\n CctpBridgeResult,\n CctpClient,\n CctpConfirmationResult,\n} from './types';\nimport { logger } from '../../../utils/logger';\nimport { EVENTS, createDepositEvent } from '../../../utils/events';\nimport { createDepositError, createNetworkError } from '../../../utils/errors';\nimport { explorerBaseForChain } from '../utils/explorerUrl';\nimport { BridgeKit } from '@circle-fin/bridge-kit';\nimport { createAdapterFromProvider } from '@circle-fin/adapter-viem-v2';\nimport {\n SolanaDevnet,\n ArbitrumSepolia,\n BaseSepolia,\n EthereumSepolia,\n Solana,\n Arbitrum,\n Base,\n Ethereum,\n} from '@circle-fin/bridge-kit/chains';\n\n// Network selection based on NEXT_PUBLIC_TESTNET env var (default: true for testnet)\nconst isTestnet = process.env.NEXT_PUBLIC_TESTNET !== 'false';\n\ninterface BridgeStep {\n name?: string;\n state?: string;\n txHash?: string;\n explorerUrl?: string;\n data?: {\n attestationId?: string;\n txHash?: string;\n status?: string;\n txIndex?: number;\n attestation?: string;\n message?: string;\n };\n}\n\ninterface BridgeResponse {\n steps?: BridgeStep[];\n}\n\nconst findExplorerUrl = (steps: BridgeStep[]): string | null => {\n const withUrl = steps.find((s) => s.explorerUrl);\n return withUrl?.explorerUrl ?? null;\n};\n\n/**\n * Maps normalized chain names to BridgeKit's chain definition objects.\n * Returns mainnet or testnet chains based on NEXT_PUBLIC_TESTNET env var.\n */\nexport const mapChainToBridgeKit = (chain: string): any => {\n if (!chain || typeof chain !== 'string') {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Invalid chain identifier: ${chain}`, {\n context: { chain },\n }));\n throw new Error(`Invalid chain identifier: ${chain}. Expected a valid chain name string.`);\n }\n\n const lower = chain.toLowerCase().trim();\n if (!lower) {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', 'Empty chain string provided'));\n throw new Error('Chain identifier cannot be empty.');\n }\n\n if (lower === 'arbitrum' || lower === 'arb') {\n return isTestnet ? ArbitrumSepolia : Arbitrum;\n }\n if (lower === 'solana') {\n return isTestnet ? SolanaDevnet : Solana;\n }\n if (lower === 'base') {\n return isTestnet ? BaseSepolia : Base;\n }\n if (lower === 'ethereum' || lower === 'evm') {\n return isTestnet ? EthereumSepolia : Ethereum;\n }\n\n // For other chains, log a warning and throw an error instead of returning as-is\n // This helps catch configuration issues early\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Unsupported chain \"${chain}\"`, {\n context: { chain, lower },\n }));\n throw new Error(`Unsupported chain \"${chain}\". Supported chains: arbitrum, base, ethereum, solana`);\n};\n\nexport const getDomain = (chain: any): number | undefined => {\n return chain?.cctp?.domain;\n}\n\n/**\n * Bridge Kit client wrapper. Keeps network interactions isolated for auditability.\n */\nexport class BridgeKitClient implements CctpClient {\n /**\n * Parses Bridge Kit response to extract transaction hashes and attestation ID.\n * Handles variations in step naming and falls back to timestamp-based deposit ID if needed.\n */\n private parseSubmitResponse(response: BridgeResponse): CctpBridgeResult {\n const steps = response.steps ?? [];\n const approve = steps.find((s) => s.name === 'approve' || s.name === 'APPROVE');\n const burn = steps.find((s) => s.name === 'burn' || s.name === 'BURN' || s.name === 'bridge');\n // FIX: Do NOT fall back to approve.txHash. We need the burn/bridge tx for attestation.\n // If burn is missing, we shouldn't consider this a successful bridge submission.\n const bridgeTxId = burn?.txHash ?? burn?.data?.txHash ?? '';\n const attestationId = burn?.data?.attestationId ?? null;\n const explorerUrl =\n burn?.explorerUrl ??\n approve?.explorerUrl ??\n findExplorerUrl(steps) ??\n (bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null);\n\n // If we have no bridge transaction hash, we can't proceed with CCTP flow.\n // This happens if the user approved but rejected the burn, or if bridge-kit failed to capture it.\n if (!bridgeTxId) {\n const stepNames = steps.map((s) => s.name).join(', ');\n logger.logError(createDepositError('BRIDGE_FAILED', 'Missing bridge (burn) tx hash in Bridge Kit response', {\n context: { stepNames },\n }));\n // Throwing here triggers the cleanup in useBridgeDeposit\n throw new Error('Bridge transaction failed: No burn transaction found. Please try again.');\n }\n\n const depositId = bridgeTxId;\n\n return {\n bridgeTxId,\n depositId,\n attestationId,\n explorerUrl,\n };\n }\n\n async submitBridge(params: CctpBridgeParams): Promise<CctpBridgeResult> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n if (!params.wallet) {\n throw new Error('Wallet client is required for CCTP bridge submission');\n }\n\n try {\n // Initialize SDK\n const kit = new BridgeKit();\n\n // Map chains to BridgeKit's expected format\n const mappedFromChain = mapChainToBridgeKit(params.fromChain);\n const mappedToChain = mapChainToBridgeKit(params.toChain);\n\n // Ensure we are on the correct source chain (for EVM)\n if (mappedFromChain && typeof mappedFromChain === 'object' && mappedFromChain.type === 'evm' && 'chainId' in mappedFromChain) {\n const targetChainId = mappedFromChain.chainId;\n if (params.wallet && typeof params.wallet.request === 'function') {\n try {\n const currentChainIdHex = await params.wallet.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(currentChainIdHex, 16);\n\n // Only check, but don't try to switch here since Dynamic should have handled it.\n // If we are still on the wrong chain, log a warning and let it fail (or maybe Dynamic is still updating).\n if (currentChainId !== targetChainId) {\n logger.warn(`[CCTP] Chain mismatch detected in BridgeKitClient. Expected ${targetChainId}, got ${currentChainId}. Dynamic switch might have failed or is pending.`);\n\n // Optional: We could wait a bit more here if we think it's just a race condition\n // await new Promise(resolve => setTimeout(resolve, 2000));\n } else {\n logger.info('[CCTP] Chain check passed');\n }\n } catch (checkErr) {\n logger.warn('[CCTP] Failed to check chain ID', checkErr);\n }\n }\n }\n\n // Initialize Viem adapter\n // Expects params.wallet to be an EIP1193Provider\n // @ts-ignore - Viem adapter types might mismatch\n const sourceAdapter = await createAdapterFromProvider({ provider: params.wallet });\n\n // Create a minimal destination adapter to satisfy BridgeKit validation\n // This allows us to proceed with \"Burn\" on source even if we can't sign on destination yet\n // The adapter needs to have the required structure for validation to pass\n const dummyDestAdapter = {\n chainType: 'solana' as const,\n getAddress: async () => params.destinationAddress,\n getChain: async () => mappedToChain,\n capabilities: {\n addressContext: 'user-controlled' as const,\n supportedChains: [mappedToChain],\n },\n actionRegistry: {} as any,\n prepareAction: async (...args: any[]) => {\n logger.debug('[CCTP] prepareAction', { args });\n throw new Error('Destination adapter is not fully implemented');\n },\n prepare: async (...args: any[]) => {\n logger.debug('[CCTP] prepare', { args });\n throw new Error('Destination adapter is not fully implemented');\n },\n waitForTransaction: async (...args: any[]) => {\n logger.debug('[CCTP] waitForTransaction', { args });\n throw new Error('Destination adapter is not fully implemented');\n },\n validateChainSupport: (...args: any[]) => {\n logger.debug('[CCTP] validateChainSupport', { args });\n return;\n },\n switchToChain: async (...args: any[]) => {\n logger.debug('[CCTP] switchToChain', { args });\n return;\n },\n } as any;\n\n // Listen to all events to debug/find the right one\n kit.on('*', (payload: any) => {\n logger.debug('[CCTP] Bridge event', payload);\n });\n\n // We wrap the bridge call to allow capturing state changes\n const bridgePromise = await kit.bridge({\n amount: params.amount,\n from: {\n adapter: sourceAdapter,\n chain: mappedFromChain,\n },\n to: {\n adapter: dummyDestAdapter,\n chain: mappedToChain,\n recipientAddress: params.destinationAddress,\n address: undefined, // Explicitly undefined to avoid accidental properties\n },\n });\n\n // We await the result, assuming BridgeKit handles the flow. \n // If it fails at minting (due to dummy adapter), we should catch it but checking if we have burn tx.\n let result: any;\n try {\n result = await bridgePromise;\n logger.info('[CCTP] Bridge result:', JSON.stringify(result, (key, value) =>\n typeof value === 'bigint'\n ? value.toString()\n : value // return everything else unchanged\n , 2));\n } catch (bridgeError) {\n // If we crashed, check if we at least got the burn tx\n // But we can't easily inspect intermediate state from here unless we captured it via events\n // For now, rethrow if we don't have a partial result mechanism\n logger.warn('[CCTP] Bridge call failed, possibly at mint stage', bridgeError);\n throw bridgeError;\n }\n\n return this.parseSubmitResponse(result);\n } catch (error) {\n const message =\n (error as { message?: string })?.message ?? 'CCTP bridge submission failed';\n logger.logError(createDepositError('BRIDGE_FAILED', message, {\n cause: error instanceof Error ? error : undefined,\n context: {\n fromChain: params.fromChain,\n toChain: params.toChain,\n amount: params.amount,\n },\n }));\n throw new Error(message);\n }\n }\n\n async waitForConfirmation(\n bridgeTxId: string,\n attestationId?: string | null\n ): Promise<CctpConfirmationResult> {\n // Fallback implementation since getAttestation is not directly exposed.\n // We assume if bridge returned successfully (in submitBridge), we might have mint info.\n // But if we are polling after page reload, we don't have the kit instance.\n\n // TODO: Implement direct Circle API check for attestation status if needed.\n // https://iris-api.circle.com/v1/attestations/{txHash}\n\n // Return partial result to allow UI to show \"Bridge Submitted\"\n return {\n mintTxId: attestationId ?? bridgeTxId,\n explorerUrl: bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null\n };\n }\n\n async getAttestation(txHash: string, fromChain: string): Promise<{\n attestation: string;\n message: string;\n decodedMessage?: {\n sourceDomain: string;\n destinationDomain: string;\n nonce: string;\n sender: string;\n recipient: string;\n decodedMessageBody?: {\n mintRecipient?: string;\n amount?: string;\n burnToken?: string;\n messageSender?: string;\n };\n };\n } | null> {\n try {\n const mappedChain = mapChainToBridgeKit(fromChain);\n const domain = getDomain(mappedChain);\n\n if (domain === undefined) {\n throw new Error(`Domain not found for chain ${fromChain}`);\n }\n\n // Circle Iris API - mainnet vs testnet\n // Using Iris API v2 endpoint: https://iris-api.circle.com/v2/messages/{domain}?transactionHash={txHash}\n // sourceDomainId mapping: 0 for Ethereum, 3 for Arbitrum, 6 for Base\n const defaultIrisUrl = isTestnet ? 'https://iris-api-sandbox.circle.com' : 'https://iris-api.circle.com';\n const baseUrl = process.env.NEXT_PUBLIC_CIRCLE_IRIS_API_URL || defaultIrisUrl;\n\n logger.info('[CCTP] Fetching from Iris API', {\n url: `${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`,\n domain,\n txHash,\n fromChain,\n });\n\n const response = await fetch(`${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`);\n if (!response.ok) {\n logger.warn('[CCTP] Iris API response not ok', {\n status: response.status,\n statusText: response.statusText,\n });\n return null;\n }\n const data = await response.json();\n const messageData = data.messages?.[0];\n\n if (messageData && messageData.attestation && messageData.message && messageData.status === 'complete') {\n logger.info('[CCTP] Iris API data retrieved', {\n hasAttestation: !!messageData.attestation,\n hasMessage: !!messageData.message,\n hasDecodedMessage: !!messageData.decodedMessage,\n decodedMessageBody: messageData.decodedMessage?.decodedMessageBody,\n });\n\n return {\n attestation: messageData.attestation,\n message: messageData.message,\n decodedMessage: messageData.decodedMessage ? {\n sourceDomain: messageData.decodedMessage.sourceDomain,\n destinationDomain: messageData.decodedMessage.destinationDomain,\n nonce: messageData.decodedMessage.nonce,\n sender: messageData.decodedMessage.sender,\n recipient: messageData.decodedMessage.recipient,\n decodedMessageBody: messageData.decodedMessage.decodedMessageBody,\n } : undefined,\n };\n }\n\n logger.warn('[CCTP] Message data incomplete or not ready', {\n hasMessageData: !!messageData,\n status: messageData?.status,\n hasAttestation: !!messageData?.attestation,\n hasMessage: !!messageData?.message,\n });\n return null;\n } catch (error) {\n logger.logError(createNetworkError('RPC_FAILED', 'Failed to fetch attestation from Iris API', {\n cause: error instanceof Error ? error : undefined,\n context: { txHash, fromChain },\n }));\n return null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"bridgeKitClient.js","sourceRoot":"","sources":["../../../../../src/features/onboarding-flow/cctp/bridgeKitClient.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CctpBridgeParams,\n CctpBridgeResult,\n CctpClient,\n CctpConfirmationResult,\n} from './types';\nimport { logger } from '../../../utils/logger';\nimport { EVENTS, createDepositEvent } from '../../../utils/events';\nimport { createDepositError, createNetworkError } from '../../../utils/errors';\nimport { explorerBaseForChain } from '../utils/explorerUrl';\nimport { BridgeKit } from '@circle-fin/bridge-kit';\nimport { createAdapterFromProvider } from '@circle-fin/adapter-viem-v2';\nimport {\n SolanaDevnet,\n ArbitrumSepolia,\n BaseSepolia,\n EthereumSepolia,\n Solana,\n Arbitrum,\n Base,\n Ethereum,\n} from '@circle-fin/bridge-kit/chains';\n\n// Network selection based on NEXT_PUBLIC_TESTNET env var (default: true for testnet)\nconst isTestnet = process.env.NEXT_PUBLIC_TESTNET !== 'false';\n\ninterface BridgeStep {\n name?: string;\n state?: string;\n txHash?: string;\n explorerUrl?: string;\n data?: {\n attestationId?: string;\n txHash?: string;\n status?: string;\n txIndex?: number;\n attestation?: string;\n message?: string;\n };\n}\n\ninterface BridgeResponse {\n steps?: BridgeStep[];\n}\n\nconst findExplorerUrl = (steps: BridgeStep[]): string | null => {\n const withUrl = steps.find((s) => s.explorerUrl);\n return withUrl?.explorerUrl ?? null;\n};\n\n/**\n * Maps normalized chain names to BridgeKit's chain definition objects.\n * Returns mainnet or testnet chains based on NEXT_PUBLIC_TESTNET env var.\n */\nexport const mapChainToBridgeKit = (chain: string): any => {\n if (!chain || typeof chain !== 'string') {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Invalid chain identifier: ${chain}`, {\n context: { chain },\n }));\n throw new Error(`Invalid chain identifier: ${chain}. Expected a valid chain name string.`);\n }\n\n const lower = chain.toLowerCase().trim();\n if (!lower) {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', 'Empty chain string provided'));\n throw new Error('Chain identifier cannot be empty.');\n }\n\n if (lower === 'arbitrum' || lower === 'arb') {\n return isTestnet ? ArbitrumSepolia : Arbitrum;\n }\n if (lower === 'solana') {\n return isTestnet ? SolanaDevnet : Solana;\n }\n if (lower === 'base') {\n return isTestnet ? BaseSepolia : Base;\n }\n if (lower === 'ethereum' || lower === 'evm') {\n return isTestnet ? EthereumSepolia : Ethereum;\n }\n\n // For other chains, log a warning and throw an error instead of returning as-is\n // This helps catch configuration issues early\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Unsupported chain \"${chain}\"`, {\n context: { chain, lower },\n }));\n throw new Error(`Unsupported chain \"${chain}\". Supported chains: arbitrum, base, ethereum, solana`);\n};\n\nexport const getDomain = (chain: any): number | undefined => {\n return chain?.cctp?.domain;\n}\n\n/**\n * Bridge Kit client wrapper. Keeps network interactions isolated for auditability.\n */\nexport class BridgeKitClient implements CctpClient {\n /**\n * Parses Bridge Kit response to extract transaction hashes and attestation ID.\n * Handles variations in step naming and falls back to timestamp-based deposit ID if needed.\n */\n private parseSubmitResponse(response: BridgeResponse): CctpBridgeResult {\n const steps = response.steps ?? [];\n const approve = steps.find((s) => s.name === 'approve' || s.name === 'APPROVE');\n const burn = steps.find((s) => s.name === 'burn' || s.name === 'BURN' || s.name === 'bridge');\n // FIX: Do NOT fall back to approve.txHash. We need the burn/bridge tx for attestation.\n // If burn is missing, we shouldn't consider this a successful bridge submission.\n const bridgeTxId = burn?.txHash ?? burn?.data?.txHash ?? '';\n const attestationId = burn?.data?.attestationId ?? null;\n const explorerUrl =\n burn?.explorerUrl ??\n approve?.explorerUrl ??\n findExplorerUrl(steps) ??\n (bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null);\n\n // If we have no bridge transaction hash, we can't proceed with CCTP flow.\n // This happens if the user approved but rejected the burn, or if bridge-kit failed to capture it.\n if (!bridgeTxId) {\n const stepNames = steps.map((s) => s.name).join(', ');\n logger.logError(createDepositError('BRIDGE_FAILED', 'Missing bridge (burn) tx hash in Bridge Kit response', {\n context: { stepNames },\n }));\n // Throwing here triggers the cleanup in useBridgeDeposit\n throw new Error('Bridge transaction failed: No burn transaction found. Please try again.');\n }\n\n const depositId = bridgeTxId;\n\n return {\n bridgeTxId,\n depositId,\n attestationId,\n explorerUrl,\n };\n }\n\n async submitBridge(params: CctpBridgeParams): Promise<CctpBridgeResult> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n if (!params.wallet) {\n throw new Error('Wallet client is required for CCTP bridge submission');\n }\n\n try {\n // Initialize SDK\n const kit = new BridgeKit();\n\n // Map chains to BridgeKit's expected format\n const mappedFromChain = mapChainToBridgeKit(params.fromChain);\n const mappedToChain = mapChainToBridgeKit(params.toChain);\n\n // Ensure we are on the correct source chain (for EVM)\n if (mappedFromChain && typeof mappedFromChain === 'object' && mappedFromChain.type === 'evm' && 'chainId' in mappedFromChain) {\n const targetChainId = mappedFromChain.chainId;\n if (params.wallet && typeof params.wallet.request === 'function') {\n try {\n const currentChainIdHex = await params.wallet.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(currentChainIdHex, 16);\n\n // Only check, but don't try to switch here since Dynamic should have handled it.\n // If we are still on the wrong chain, log a warning and let it fail (or maybe Dynamic is still updating).\n if (currentChainId !== targetChainId) {\n logger.warn(`[CCTP] Chain mismatch detected in BridgeKitClient. Expected ${targetChainId}, got ${currentChainId}. Dynamic switch might have failed or is pending.`);\n\n // Optional: We could wait a bit more here if we think it's just a race condition\n // await new Promise(resolve => setTimeout(resolve, 2000));\n } else {\n logger.info('[CCTP] Chain check passed');\n }\n } catch (checkErr) {\n logger.warn('[CCTP] Failed to check chain ID', checkErr);\n }\n }\n }\n\n // Initialize Viem adapter\n // Expects params.wallet to be an EIP1193Provider\n // @ts-ignore - Viem adapter types might mismatch\n const sourceAdapter = await createAdapterFromProvider({ provider: params.wallet });\n\n // Create a minimal *read-only* destination adapter to satisfy BridgeKit validation.\n //\n // Bridge Kit v1.5+ will call `prepareAction(\"native.balanceOf\")` on the destination\n // adapter as part of preflight checks. Previously we threw here, which causes the\n // bridge to fail before \"burn\" is submitted.\n //\n // This adapter intentionally does NOT sign or send Solana transactions. If Bridge Kit\n // attempts to execute the destination-side \"mint\" step, that step should fail in a\n // recoverable way (BridgeResult.state === \"error\") while still returning the successful\n // \"approve\"/\"burn\" step tx hashes.\n const dummyDestAdapter = {\n chainType: 'solana' as const,\n getAddress: async () => params.destinationAddress,\n getChain: async () => mappedToChain,\n capabilities: {\n // We control the destination address here; Bridge Kit may include it in contexts.\n addressContext: 'developer-controlled' as const,\n supportedChains: [mappedToChain],\n },\n actionRegistry: {} as any,\n prepareAction: async (...args: any[]) => {\n // Expected usage in Bridge Kit v1.5+: prepareAction(\"native.balanceOf\", { walletAddress }, ctx)\n logger.debug('[CCTP] prepareAction', { args });\n\n const action = args?.[0];\n if (action === 'native.balanceOf') {\n // Return a large synthetic balance (lamports) so preflight passes.\n // We do not rely on destination native balance for our flow since we claim via Bridge Assist.\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => BigInt('10000000000'),\n };\n }\n\n if (action === 'usdc.balanceOf') {\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => BigInt(0),\n };\n }\n\n // Unknown action: surface a recoverable error via the execute path\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => {\n throw new Error(`Destination adapter does not support action \"${String(action)}\"`);\n },\n };\n },\n prepare: async (...args: any[]) => {\n logger.debug('[CCTP] prepare', { args });\n // Do not throw here; return a prepared request so Bridge Kit can\n // mark the destination step as failed during execute (recoverable).\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => {\n throw new Error('Destination adapter is read-only (mint not supported)');\n },\n };\n },\n waitForTransaction: async (...args: any[]) => {\n logger.debug('[CCTP] waitForTransaction', { args });\n throw new Error('Destination adapter is read-only (waitForTransaction not supported)');\n },\n validateChainSupport: (...args: any[]) => {\n logger.debug('[CCTP] validateChainSupport', { args });\n return;\n },\n switchToChain: async (...args: any[]) => {\n logger.debug('[CCTP] switchToChain', { args });\n return;\n },\n calculateTransactionFee: async () => BigInt(0),\n } as any;\n\n // Listen to all events to debug/find the right one\n kit.on('*', (payload: any) => {\n logger.debug('[CCTP] Bridge event', payload);\n });\n\n // We wrap the bridge call to allow capturing state changes\n const bridgePromise = await kit.bridge({\n amount: params.amount,\n from: {\n adapter: sourceAdapter,\n chain: mappedFromChain,\n },\n to: {\n adapter: dummyDestAdapter,\n chain: mappedToChain,\n recipientAddress: params.destinationAddress,\n // Bridge Kit requires `address` when the adapter is developer-controlled.\n // Without it, preflight throws:\n // \"Address is required in context for developer-controlled adapters...\"\n address: params.destinationAddress,\n },\n });\n\n // We await the result, assuming BridgeKit handles the flow. \n // If it fails at minting (due to dummy adapter), we should catch it but checking if we have burn tx.\n let result: any;\n try {\n result = await bridgePromise;\n logger.info('[CCTP] Bridge result:', JSON.stringify(result, (key, value) =>\n typeof value === 'bigint'\n ? value.toString()\n : value // return everything else unchanged\n , 2));\n } catch (bridgeError) {\n // If we crashed, check if we at least got the burn tx\n // But we can't easily inspect intermediate state from here unless we captured it via events\n // For now, rethrow if we don't have a partial result mechanism\n logger.warn('[CCTP] Bridge call failed, possibly at mint stage', bridgeError);\n throw bridgeError;\n }\n\n return this.parseSubmitResponse(result);\n } catch (error) {\n const message =\n (error as { message?: string })?.message ?? 'CCTP bridge submission failed';\n logger.logError(createDepositError('BRIDGE_FAILED', message, {\n cause: error instanceof Error ? error : undefined,\n context: {\n fromChain: params.fromChain,\n toChain: params.toChain,\n amount: params.amount,\n },\n }));\n throw new Error(message);\n }\n }\n\n async waitForConfirmation(\n bridgeTxId: string,\n attestationId?: string | null\n ): Promise<CctpConfirmationResult> {\n // Fallback implementation since getAttestation is not directly exposed.\n // We assume if bridge returned successfully (in submitBridge), we might have mint info.\n // But if we are polling after page reload, we don't have the kit instance.\n\n // TODO: Implement direct Circle API check for attestation status if needed.\n // https://iris-api.circle.com/v1/attestations/{txHash}\n\n // Return partial result to allow UI to show \"Bridge Submitted\"\n return {\n mintTxId: attestationId ?? bridgeTxId,\n explorerUrl: bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null\n };\n }\n\n async getAttestation(txHash: string, fromChain: string): Promise<{\n attestation: string;\n message: string;\n decodedMessage?: {\n sourceDomain: string;\n destinationDomain: string;\n nonce: string;\n sender: string;\n recipient: string;\n decodedMessageBody?: {\n mintRecipient?: string;\n amount?: string;\n burnToken?: string;\n messageSender?: string;\n };\n };\n } | null> {\n try {\n const mappedChain = mapChainToBridgeKit(fromChain);\n const domain = getDomain(mappedChain);\n\n if (domain === undefined) {\n throw new Error(`Domain not found for chain ${fromChain}`);\n }\n\n // Circle Iris API - mainnet vs testnet\n // Using Iris API v2 endpoint: https://iris-api.circle.com/v2/messages/{domain}?transactionHash={txHash}\n // sourceDomainId mapping: 0 for Ethereum, 3 for Arbitrum, 6 for Base\n const defaultIrisUrl = isTestnet ? 'https://iris-api-sandbox.circle.com' : 'https://iris-api.circle.com';\n const baseUrl = process.env.NEXT_PUBLIC_CIRCLE_IRIS_API_URL || defaultIrisUrl;\n\n logger.info('[CCTP] Fetching from Iris API', {\n url: `${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`,\n domain,\n txHash,\n fromChain,\n });\n\n const response = await fetch(`${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`);\n if (!response.ok) {\n logger.warn('[CCTP] Iris API response not ok', {\n status: response.status,\n statusText: response.statusText,\n });\n return null;\n }\n const data = await response.json();\n const messageData = data.messages?.[0];\n\n if (messageData && messageData.attestation && messageData.message && messageData.status === 'complete') {\n logger.info('[CCTP] Iris API data retrieved', {\n hasAttestation: !!messageData.attestation,\n hasMessage: !!messageData.message,\n hasDecodedMessage: !!messageData.decodedMessage,\n decodedMessageBody: messageData.decodedMessage?.decodedMessageBody,\n });\n\n return {\n attestation: messageData.attestation,\n message: messageData.message,\n decodedMessage: messageData.decodedMessage ? {\n sourceDomain: messageData.decodedMessage.sourceDomain,\n destinationDomain: messageData.decodedMessage.destinationDomain,\n nonce: messageData.decodedMessage.nonce,\n sender: messageData.decodedMessage.sender,\n recipient: messageData.decodedMessage.recipient,\n decodedMessageBody: messageData.decodedMessage.decodedMessageBody,\n } : undefined,\n };\n }\n\n logger.warn('[CCTP] Message data incomplete or not ready', {\n hasMessageData: !!messageData,\n status: messageData?.status,\n hasAttestation: !!messageData?.attestation,\n hasMessage: !!messageData?.message,\n });\n return null;\n } catch (error) {\n logger.logError(createNetworkError('RPC_FAILED', 'Failed to fetch attestation from Iris API', {\n cause: error instanceof Error ? error : undefined,\n context: { txHash, fromChain },\n }));\n return null;\n }\n }\n}\n"]}
@@ -347,7 +347,7 @@ export var useBridgeDeposit = function (_a) {
347
347
  turnkeyAddress,
348
348
  ]);
349
349
  var resumeClaimProcess = useCallback(function (pendingState) { return __awaiter(void 0, void 0, void 0, function () {
350
- var depositId, bridgeTx, isEvmFlow, turnkeyStillInitializing, solanaRecipient, cctpClient, cctpConfig, fromChain, attestationData, nonceAlreadyProcessed, updated_1, attemptNordDepositWithFallback, claimDepositError_1, errorMessage, isAlreadyCompletedError, nordDepositError_1, nordErrorMsg, signature, updated, error_2;
350
+ var depositId, bridgeTx, isEvmFlow, turnkeyStillInitializing, solanaRecipient, cctpClient, cctpConfig, fromChain, attestationData, nonceAlreadyProcessed, updated_1, claimDepositError_1, errorMessage, withBridgeStage, nordDepositError_1, nordErrorMsg, signature, updated, error_2;
351
351
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
352
352
  return __generator(this, function (_m) {
353
353
  switch (_m.label) {
@@ -434,7 +434,7 @@ export var useBridgeDeposit = function (_a) {
434
434
  setBridgeRetryable(false);
435
435
  _m.label = 1;
436
436
  case 1:
437
- _m.trys.push([1, 14, , 15]);
437
+ _m.trys.push([1, 15, , 16]);
438
438
  cctpClient = new BridgeKitClient();
439
439
  cctpConfig = getCctpRuntimeConfig();
440
440
  fromChain = normalizeCctpChain(pendingState.chain || context.selectedChainId || context.entryNetwork || cctpConfig.fromChain);
@@ -450,7 +450,7 @@ export var useBridgeDeposit = function (_a) {
450
450
  return [4 /*yield*/, checkUsedNonceAccount((_a = attestationData.decodedMessage) === null || _a === void 0 ? void 0 : _a.nonce)];
451
451
  case 3:
452
452
  nonceAlreadyProcessed = _m.sent();
453
- if (!nonceAlreadyProcessed) return [3 /*break*/, 11];
453
+ if (!nonceAlreadyProcessed) return [3 /*break*/, 12];
454
454
  logger.info('[BridgeDeposit] Nonce already processed - CCTP claim was completed previously', {
455
455
  depositId: depositId,
456
456
  bridgeTx: bridgeTx,
@@ -465,34 +465,9 @@ export var useBridgeDeposit = function (_a) {
465
465
  setPendingMintTx((_f = updated_1.mintTx) !== null && _f !== void 0 ? _f : null);
466
466
  setPendingDepositId(updated_1.depositId);
467
467
  setDepositProgressPhase('claim');
468
- attemptNordDepositWithFallback = function () { return __awaiter(void 0, void 0, void 0, function () {
469
- var withBridgeStage;
470
- return __generator(this, function (_a) {
471
- switch (_a.label) {
472
- case 0:
473
- // Validate we have an amount to deposit
474
- if (!pendingState.amount || Number(pendingState.amount) <= 0) {
475
- throw new Error('No valid deposit amount available');
476
- }
477
- logger.info('[BridgeDeposit] Attempting Nord deposit with saved amount', {
478
- amount: pendingState.amount,
479
- });
480
- withBridgeStage = advancePendingDeposit(updated_1, {
481
- stage: 'bridge_confirmed',
482
- amount: pendingState.amount,
483
- });
484
- setDepositProgressPhase('solana');
485
- return [4 /*yield*/, runSolanaDeposit(pendingState.amount, withBridgeStage)];
486
- case 1:
487
- _a.sent();
488
- return [2 /*return*/];
489
- }
490
- });
491
- }); };
492
468
  _m.label = 4;
493
469
  case 4:
494
470
  _m.trys.push([4, 6, , 11]);
495
- // Attempt to confirm claim and get USDC balance
496
471
  return [4 /*yield*/, confirmClaimAndDeposit({
497
472
  signature: (_h = (_g = updated_1.mintTx) !== null && _g !== void 0 ? _g : updated_1.tx) !== null && _h !== void 0 ? _h : null,
498
473
  destinationAddress: solanaRecipient,
@@ -501,42 +476,51 @@ export var useBridgeDeposit = function (_a) {
501
476
  skipConfirmation: true,
502
477
  })];
503
478
  case 5:
504
- // Attempt to confirm claim and get USDC balance
505
479
  _m.sent();
506
- // Success - deposit flow continues normally
507
- return [2 /*return*/];
480
+ return [3 /*break*/, 11];
508
481
  case 6:
509
482
  claimDepositError_1 = _m.sent();
510
483
  errorMessage = claimDepositError_1 instanceof Error ? claimDepositError_1.message : String(claimDepositError_1);
511
484
  logger.warn('[BridgeDeposit] confirmClaimAndDeposit failed after nonce processed', {
512
485
  error: errorMessage,
513
486
  });
514
- isAlreadyCompletedError = errorMessage.toLowerCase().includes('already be completed');
515
- if (!isAlreadyCompletedError) return [3 /*break*/, 10];
487
+ if (!errorMessage.toLowerCase().includes('already be completed')) return [3 /*break*/, 10];
488
+ if (!pendingState.amount) return [3 /*break*/, 10];
516
489
  _m.label = 7;
517
490
  case 7:
518
491
  _m.trys.push([7, 9, , 10]);
519
- return [4 /*yield*/, attemptNordDepositWithFallback()];
492
+ logger.info('[BridgeDeposit] Attempting Nord deposit with amountHint as fallback', {
493
+ amount: pendingState.amount,
494
+ });
495
+ withBridgeStage = advancePendingDeposit(updated_1, {
496
+ stage: 'bridge_confirmed',
497
+ amount: pendingState.amount,
498
+ });
499
+ setDepositProgressPhase('solana');
500
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
501
+ return [4 /*yield*/, runSolanaDeposit(pendingState.amount, withBridgeStage)];
520
502
  case 8:
503
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
521
504
  _m.sent();
522
- // If we got here, Nord deposit succeeded! Continue flow normally
505
+ // If we got here, Nord deposit succeeded!
523
506
  return [2 /*return*/];
524
507
  case 9:
525
508
  nordDepositError_1 = _m.sent();
526
509
  nordErrorMsg = nordDepositError_1 instanceof Error ? nordDepositError_1.message : String(nordDepositError_1);
527
- logger.info('[BridgeDeposit] Nord deposit failed after completion check', {
510
+ logger.error('[BridgeDeposit] Nord deposit also failed - deposit may be truly complete', {
528
511
  error: nordErrorMsg,
529
512
  });
530
- // Both USDC check and Nord deposit failed - deposit is truly complete
513
+ // Now we can be more confident the deposit was already completed
531
514
  clearPendingDeposit();
532
515
  setBridgeError('This deposit appears to be already completed. Your funds should be in your Nord account. Click "Start Over" to continue.');
533
516
  setBridgeRetryable(false);
534
517
  setIsDepositing(false);
535
518
  return [2 /*return*/];
536
519
  case 10:
537
- // For any other error type, re-throw to allow user to retry
520
+ // For other errors, don't clear state - throw and let user retry
538
521
  throw claimDepositError_1;
539
- case 11:
522
+ case 11: return [2 /*return*/];
523
+ case 12:
540
524
  // If the nonce was NOT processed, we need a Solana signer to submit the claim.
541
525
  if (!solanaWallet) {
542
526
  setBridgeError('Solana wallet not connected. Please connect your Solana wallet to continue.');
@@ -566,7 +550,7 @@ export var useBridgeDeposit = function (_a) {
566
550
  bridgeTx: bridgeTx,
567
551
  attestationId: (_l = pendingState.attestationId) !== null && _l !== void 0 ? _l : null,
568
552
  })];
569
- case 12:
553
+ case 13:
570
554
  signature = _m.sent();
571
555
  updated = advancePendingDeposit(pendingState, {
572
556
  stage: 'bridge_confirmed',
@@ -583,10 +567,10 @@ export var useBridgeDeposit = function (_a) {
583
567
  amountHint: pendingState.amount,
584
568
  pendingState: updated,
585
569
  })];
586
- case 13:
587
- _m.sent();
588
- return [3 /*break*/, 15];
589
570
  case 14:
571
+ _m.sent();
572
+ return [3 /*break*/, 16];
573
+ case 15:
590
574
  error_2 = _m.sent();
591
575
  logger.logError(createDepositError('CLAIM_FAILED', 'Failed to resume claim process', {
592
576
  cause: error_2 instanceof Error ? error_2 : undefined,
@@ -595,7 +579,7 @@ export var useBridgeDeposit = function (_a) {
595
579
  setBridgeError(formatBridgeError(error_2));
596
580
  setIsDepositing(false);
597
581
  throw error_2;
598
- case 15: return [2 /*return*/];
582
+ case 16: return [2 /*return*/];
599
583
  }
600
584
  });
601
585
  }); }, [
@@ -1 +1 @@
1
- {"version":3,"file":"useBridgeDeposit.js","sourceRoot":"","sources":["../../../../../src/features/onboarding-flow/hooks/useBridgeDeposit.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { useOnboardingState } from '../providers/OnboardingStateProvider';\nimport { getCctpRuntimeConfig } from '../cctp/config';\nimport {\n advancePendingDeposit,\n clearPendingDeposit,\n createPendingDepositDraft,\n PendingDepositState,\n writePendingDeposit,\n} from '../utils/deposit/storage';\nimport { formatBridgeError, normalizeCctpChain } from '../utils/deposit/bridgeUtils';\nimport { explorerBaseForChain, pickExplorerUrl } from '../utils/explorerUrl';\nimport { logger } from '../../../utils/logger';\nimport { createDepositError } from '../../../utils/errors';\nimport { useWalletConnection } from '../providers/WalletConnectionProvider';\nimport { BridgeKitClient, mapChainToBridgeKit } from '../cctp/bridgeKitClient';\nimport { checkUsedNonceAccount } from '../utils/deposit/nonceUtils';\nimport { waitForAttestation } from '../utils/deposit/attestationUtils';\nimport { ensureCorrectNetwork, getWalletProvider, validateBridgeConfig } from '../utils/deposit/walletUtils';\nimport { submitClaimWithRetry } from '../utils/deposit/claimSubmission';\nimport { confirmClaimAndGetUsdcBalance } from '../utils/deposit/claimConfirmation';\nimport { EvmTxInterceptor } from '../utils/deposit/evmTxInterceptor';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\n\ninterface UseBridgeDepositProps {\n setDepositProgressPhase: (phase: 'bridge' | 'claim' | 'solana' | 'nord') => void;\n setPendingBridgeTx: (tx: string | null) => void;\n setPendingMintTx: (tx: string | null) => void;\n setPendingDepositId: (id: string | null) => void;\n setPendingBridgeExplorerUrl: (url: string | null) => void;\n ensurePendingDraft: (amount: string) => ReturnType<typeof createPendingDepositDraft>;\n finalizeBridgeSuccess: (status: { tx?: string | null; mintTx?: string | null; bridgeTx?: string | null; solanaTx?: string | null; depositId?: string | null }) => void;\n setIsDepositing: (isDepositing: boolean) => void;\n runSolanaDeposit: (\n amount: string,\n pendingState?: ReturnType<typeof createPendingDepositDraft> | null\n ) => Promise<{\n txId: string | null;\n workingState: ReturnType<typeof createPendingDepositDraft>;\n solanaTx: string | null;\n }>;\n}\n\nexport const useBridgeDeposit = ({\n setDepositProgressPhase,\n setPendingBridgeTx,\n setPendingMintTx,\n setPendingDepositId,\n setPendingBridgeExplorerUrl,\n ensurePendingDraft,\n finalizeBridgeSuccess,\n setIsDepositing,\n runSolanaDeposit,\n}: UseBridgeDepositProps) => {\n const { context, updateContext } = useOnboardingState();\n\n // Use NetworkProvider for wallet state\n const { solanaAddress, evmWallet, solanaWallet, evmAdapter } = useNetwork();\n const { turnkeyAddress, turnkeyStatus, turnkeyEnabled } = useWalletConnection();\n\n const [bridgeRetryable, setBridgeRetryable] = useState(false);\n const [bridgeError, setBridgeError] = useState<string | null>(null);\n const [bridgeApprovalPending, setBridgeApprovalPending] = useState(false);\n const [bridgeApprovalError, setBridgeApprovalError] = useState<string | null>(null);\n\n\n\n const lookupTableAddress = process.env.NEXT_PUBLIC_CCTP_LOOKUP_TABLE_ADDRESS;\n const claimFinalizationInFlightRef = useRef<Promise<void> | null>(null);\n\n const confirmClaimAndDeposit = useCallback(\n async ({\n signature,\n destinationAddress,\n amountHint,\n pendingState,\n skipConfirmation,\n }: {\n signature: string | null;\n destinationAddress: string;\n amountHint?: string | number | null;\n pendingState?: PendingDepositState | null;\n skipConfirmation?: boolean;\n }) => {\n logger.info('[BridgeDeposit] confirmClaimAndDeposit called', {\n signature,\n destinationAddress,\n amountHint,\n skipConfirmation,\n pendingStage: pendingState?.stage,\n pendingTx: pendingState?.tx,\n });\n\n if (claimFinalizationInFlightRef.current) {\n logger.info('[BridgeDeposit] confirmClaimAndDeposit - already in flight, returning existing promise');\n return claimFinalizationInFlightRef.current;\n }\n\n const promise = (async () => {\n let amount: string;\n let txSignature: string | null;\n try {\n logger.info('[BridgeDeposit] Calling confirmClaimAndGetUsdcBalance...');\n const res = await confirmClaimAndGetUsdcBalance({\n signature,\n destinationAddress,\n amountHint,\n skipConfirmation,\n });\n logger.info('[BridgeDeposit] confirmClaimAndGetUsdcBalance returned', {\n amount: res.amount,\n txSignature: res.txSignature,\n });\n amount = res.amount;\n txSignature = res.txSignature;\n } catch (e) {\n logger.warn('[BridgeDeposit] confirmClaimAndGetUsdcBalance threw error', {\n error: e instanceof Error ? e.message : String(e),\n });\n const message = e instanceof Error ? e.message : String(e);\n // If the claim nonce was already processed and there's no USDC to deposit,\n // the user likely already completed the deposit earlier. Clear pending state\n // to avoid trapping them in an endless \"resume\" loop.\n if (message.toLowerCase().includes('already be completed')) {\n logger.info('[BridgeDeposit] Deposit appears to be already completed - clearing pending state', {\n message,\n });\n clearPendingDeposit();\n setPendingDepositId(null);\n updateContext({\n depositError: 'This deposit appears to be already completed. Your funds should be in your Nord account.',\n });\n // Do not duplicate the message as a bridgeError; depositError is rendered on the progress screen.\n setBridgeError(null);\n setBridgeRetryable(false);\n setDepositProgressPhase('claim');\n setIsDepositing(false);\n return;\n }\n throw e;\n }\n\n const draft = pendingState ?? ensurePendingDraft(amount);\n const withBridgeStage = advancePendingDeposit(draft, {\n stage: 'bridge_confirmed',\n // Preserve the original EVM bridge tx hash - only update mintTx\n mintTx: txSignature,\n amount,\n });\n\n setDepositProgressPhase('solana');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const depositResult = await runSolanaDeposit(amount, withBridgeStage);\n\n finalizeBridgeSuccess({\n tx: depositResult.txId,\n mintTx: txSignature,\n bridgeTx: withBridgeStage.tx ?? txSignature,\n solanaTx: depositResult.solanaTx,\n depositId: withBridgeStage.depositId,\n });\n })().finally(() => {\n claimFinalizationInFlightRef.current = null;\n });\n\n claimFinalizationInFlightRef.current = promise;\n return promise;\n },\n [\n ensurePendingDraft,\n finalizeBridgeSuccess,\n runSolanaDeposit,\n setDepositProgressPhase,\n setPendingDepositId,\n setBridgeError,\n setBridgeRetryable,\n setIsDepositing,\n updateContext,\n ]\n );\n\n const startCctpBridge = useCallback(\n async (draftAmount: string) => {\n setDepositProgressPhase('bridge');\n setBridgeApprovalPending(true);\n setBridgeApprovalError(null);\n\n const cctpClient = new BridgeKitClient();\n const cctpConfig = getCctpRuntimeConfig();\n const fromChain = normalizeCctpChain(context.selectedChainId ?? context.entryNetwork ?? cctpConfig.fromChain);\n\n await ensureCorrectNetwork({ evmWallet, evmAdapter, targetChain: fromChain });\n validateBridgeConfig(cctpConfig, fromChain, draftAmount);\n\n let workingState = ensurePendingDraft(draftAmount);\n\n const solanaRecipient = solanaAddress || turnkeyAddress || '';\n if (!solanaRecipient) {\n setBridgeApprovalPending(false);\n throw new Error('Turnkey Solana address is not ready yet. Please wait a moment and retry.');\n }\n\n const { provider, walletClient } = await getWalletProvider(evmWallet, evmAdapter);\n if (!provider && !walletClient && !cctpConfig.useMock) {\n setBridgeApprovalPending(false);\n throw new Error('Wallet provider not available for CCTP bridging');\n }\n\n // Persist tx hash ASAP (especially burn) so refresh can resume.\n // We use the interceptor to capture the tx hash before the high-level await returns.\n const interceptor = new EvmTxInterceptor((txHash) => {\n workingState = writePendingDeposit({\n ...workingState,\n depositId: txHash,\n stage: 'bridge_submitted',\n tx: txHash,\n chain: workingState.chain || fromChain,\n amount: workingState.amount || draftAmount,\n updatedAt: Date.now(),\n });\n setPendingDepositId(workingState.depositId);\n setPendingBridgeTx(txHash);\n setDepositProgressPhase('claim');\n });\n\n const walletForBridge = interceptor.wrap(provider || walletClient);\n\n let bridgeTxId: string;\n let depositId: string;\n let attestationId: string | null | undefined;\n\n try {\n const submission = await cctpClient.submitBridge({\n amount: draftAmount,\n fromChain,\n toChain: 'solana',\n destinationAddress: solanaRecipient,\n wallet: walletForBridge,\n });\n bridgeTxId = submission.bridgeTxId;\n depositId = submission.depositId;\n attestationId = submission.attestationId;\n } catch (error) {\n const message = formatBridgeError(error);\n setBridgeApprovalError(message);\n setBridgeError(message);\n setBridgeRetryable(true);\n setBridgeApprovalPending(false);\n clearPendingDeposit();\n throw error;\n } finally {\n setBridgeApprovalPending(false);\n }\n\n const bridgeExplorerUrl = pickExplorerUrl(\n workingState.explorerUrl,\n cctpConfig.explorerBaseUrl ?? explorerBaseForChain(context.entryNetwork),\n bridgeTxId,\n );\n workingState = advancePendingDeposit(workingState, {\n stage: 'bridge_submitted',\n tx: bridgeTxId,\n attestationId,\n explorerUrl: bridgeExplorerUrl ?? null,\n });\n setPendingBridgeExplorerUrl(workingState.explorerUrl ?? null);\n setPendingBridgeTx(bridgeTxId);\n if (depositId && depositId !== workingState.depositId) {\n workingState = writePendingDeposit({\n ...workingState,\n depositId,\n attestationId: attestationId ?? workingState.attestationId ?? null,\n updatedAt: Date.now(),\n });\n }\n setPendingDepositId(depositId || workingState.depositId);\n\n const attestationData = await waitForAttestation({\n cctpClient,\n bridgeTxId,\n sourceChain: fromChain,\n timeoutMs: cctpConfig.attestationTimeoutMs ?? 120_000,\n retryBackoffMs: cctpConfig.retryBackoffMs ?? 5_000,\n });\n\n const nonceAlreadyProcessed = await checkUsedNonceAccount(attestationData?.decodedMessage?.nonce);\n if (nonceAlreadyProcessed) {\n const updatedState = advancePendingDeposit(workingState, {\n stage: 'bridge_confirmed',\n tx: workingState.tx ?? bridgeTxId ?? null,\n mintTx: workingState.mintTx ?? null,\n attestationId,\n explorerUrl: workingState.explorerUrl ?? null,\n });\n\n setPendingMintTx(updatedState.mintTx ?? null);\n setPendingDepositId(updatedState.depositId);\n setDepositProgressPhase('claim');\n\n await confirmClaimAndDeposit({\n signature: updatedState.mintTx ?? updatedState.tx ?? null,\n destinationAddress: solanaRecipient,\n amountHint: draftAmount,\n pendingState: updatedState,\n skipConfirmation: true,\n });\n\n return updatedState;\n }\n\n setDepositProgressPhase('solana');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const finalSignature = await submitClaimWithRetry({\n depositId,\n message: attestationData.message,\n attestation: attestationData.attestation,\n sourceChain: fromChain,\n destinationAddress: solanaRecipient,\n lookupTableAddress: lookupTableAddress ?? '',\n solanaWallet: solanaWallet as any,\n fallbackWallet: solanaAddress || turnkeyAddress || '',\n fallbackAmount: attestationData.decodedMessage?.decodedMessageBody?.amount || draftAmount || '0',\n bridgeTx: bridgeTxId,\n attestationId: attestationId ?? null,\n });\n\n workingState = advancePendingDeposit(workingState, {\n stage: 'bridge_confirmed',\n // Preserve the original EVM bridge tx hash - don't overwrite with Solana signature\n mintTx: finalSignature,\n attestationId,\n explorerUrl: finalSignature\n ? pickExplorerUrl(null, cctpConfig.mintExplorerBaseUrl ?? explorerBaseForChain('solana'), finalSignature)\n : workingState.explorerUrl,\n });\n\n setPendingMintTx(finalSignature);\n setPendingDepositId(workingState.depositId);\n setDepositProgressPhase('claim');\n\n await confirmClaimAndDeposit({\n signature: finalSignature,\n destinationAddress: solanaRecipient,\n amountHint: draftAmount,\n pendingState: workingState,\n });\n\n return workingState;\n },\n [\n solanaAddress,\n confirmClaimAndDeposit,\n context.entryNetwork,\n context.selectedChainId,\n ensurePendingDraft,\n evmAdapter,\n evmWallet,\n lookupTableAddress,\n setDepositProgressPhase,\n setPendingBridgeExplorerUrl,\n setPendingBridgeTx,\n setPendingDepositId,\n setPendingMintTx,\n solanaWallet,\n turnkeyAddress,\n ]\n );\n\n const resumeClaimProcess = useCallback(\n async (pendingState: PendingDepositState) => {\n // Log full pending state for debugging\n logger.info('[BridgeDeposit] resumeClaimProcess called', {\n depositId: pendingState.depositId,\n stage: pendingState.stage,\n tx: pendingState.tx,\n mintTx: pendingState.mintTx,\n chain: pendingState.chain,\n amount: pendingState.amount,\n wallet: pendingState.wallet,\n reason: pendingState.reason,\n updatedAt: pendingState.updatedAt,\n });\n\n const depositId = pendingState.depositId;\n if (!depositId) {\n logger.warn('[BridgeDeposit] resumeClaimProcess - no depositId, showing error');\n setBridgeError('Missing deposit ID. Please start a new deposit.');\n setBridgeRetryable(false);\n return;\n }\n\n // If the deposit is already in a terminal state, don't try to resume\n if (pendingState.stage === 'solana_confirmed') {\n logger.info('[BridgeDeposit] Deposit already in solana_confirmed state - clearing and completing', {\n depositId,\n stage: pendingState.stage,\n });\n clearPendingDeposit();\n finalizeBridgeSuccess({\n tx: pendingState.tx,\n mintTx: pendingState.mintTx,\n bridgeTx: pendingState.tx,\n depositId: pendingState.depositId,\n });\n return;\n }\n\n // If the deposit was submitted to Solana but we refreshed before confirmation,\n // the deposit might have actually completed. Show message with Start Over option.\n if (pendingState.stage === 'solana_submitted' && pendingState.tx) {\n logger.info('[BridgeDeposit] Deposit in solana_submitted state - may already be complete', {\n depositId,\n stage: pendingState.stage,\n tx: pendingState.tx,\n });\n // Clear state and show message - user can check their Nord account\n clearPendingDeposit();\n setBridgeError('Your deposit may have already completed. Please check your Nord account balance. Click \"Start Over\" if you need to make another deposit.');\n setBridgeRetryable(false);\n setIsDepositing(false);\n return;\n }\n\n // BridgeKit uses the burn tx hash for attestation lookup.\n // After refresh, `depositId` might be a local draft id if the user refreshed mid-sign.\n const bridgeTx = pendingState.tx;\n if (!bridgeTx || !bridgeTx.startsWith('0x')) {\n logger.warn('[BridgeDeposit] Cannot resume claim: missing bridge tx hash (likely refreshed before signing burn tx)', {\n depositId,\n tx: pendingState.tx,\n stage: pendingState.stage,\n });\n setBridgeError('Bridge transaction was not completed. Please start the deposit again.');\n setBridgeRetryable(true);\n setIsDepositing(false);\n return;\n }\n\n // Check if Turnkey is still initializing for EVM flows\n const isEvmFlow = context.entryNetwork === 'evm';\n const turnkeyStillInitializing = turnkeyEnabled && turnkeyStatus !== 'ready';\n\n if (isEvmFlow && turnkeyStillInitializing) {\n setBridgeError('Preparing Solana wallet... Please wait.');\n setBridgeRetryable(false); // Don't allow retry until Turnkey is ready\n setDepositProgressPhase('claim');\n return;\n }\n\n const solanaRecipient = solanaAddress || turnkeyAddress || pendingState.wallet;\n if (!solanaRecipient) {\n setBridgeError('Missing Solana deposit address. Please reconnect your wallet.');\n setBridgeRetryable(true);\n return;\n }\n\n setPendingBridgeTx(bridgeTx);\n setDepositProgressPhase('claim');\n setIsDepositing(true);\n setBridgeError(null);\n setBridgeRetryable(false);\n\n try {\n const cctpClient = new BridgeKitClient();\n const cctpConfig = getCctpRuntimeConfig();\n\n const fromChain = normalizeCctpChain(\n pendingState.chain || context.selectedChainId || context.entryNetwork || cctpConfig.fromChain,\n );\n\n const attestationData = await cctpClient.getAttestation(bridgeTx, fromChain);\n if (!attestationData) {\n setBridgeError('Attestation not ready yet. Please wait a moment and try again.');\n setBridgeRetryable(true);\n setIsDepositing(false);\n return;\n }\n\n const nonceAlreadyProcessed = await checkUsedNonceAccount(attestationData.decodedMessage?.nonce);\n if (nonceAlreadyProcessed) {\n logger.info('[BridgeDeposit] Nonce already processed - CCTP claim was completed previously', {\n depositId,\n bridgeTx,\n nonce: attestationData.decodedMessage?.nonce,\n });\n\n const updated = advancePendingDeposit(pendingState, {\n stage: 'bridge_confirmed',\n tx: pendingState.tx ?? null,\n mintTx: pendingState.mintTx ?? pendingState.tx ?? null,\n attestationId: pendingState.attestationId,\n });\n\n setPendingMintTx(updated.mintTx ?? null);\n setPendingDepositId(updated.depositId);\n setDepositProgressPhase('claim');\n\n // Helper to attempt Nord deposit with fallback amount\n const attemptNordDepositWithFallback = async (): Promise<void> => {\n // Validate we have an amount to deposit\n if (!pendingState.amount || Number(pendingState.amount) <= 0) {\n throw new Error('No valid deposit amount available');\n }\n\n logger.info('[BridgeDeposit] Attempting Nord deposit with saved amount', {\n amount: pendingState.amount,\n });\n\n const withBridgeStage = advancePendingDeposit(updated, {\n stage: 'bridge_confirmed',\n amount: pendingState.amount,\n });\n\n setDepositProgressPhase('solana');\n await runSolanaDeposit(pendingState.amount, withBridgeStage);\n };\n\n try {\n // Attempt to confirm claim and get USDC balance\n await confirmClaimAndDeposit({\n signature: updated.mintTx ?? updated.tx ?? null,\n destinationAddress: solanaRecipient,\n amountHint: pendingState.amount,\n pendingState: updated,\n skipConfirmation: true,\n });\n\n // Success - deposit flow continues normally\n return;\n } catch (claimDepositError) {\n const errorMessage = claimDepositError instanceof Error ? claimDepositError.message : String(claimDepositError);\n\n logger.warn('[BridgeDeposit] confirmClaimAndDeposit failed after nonce processed', {\n error: errorMessage,\n });\n\n // Check if error indicates deposit was already completed\n const isAlreadyCompletedError = errorMessage.toLowerCase().includes('already be completed');\n\n if (isAlreadyCompletedError) {\n // USDC balance check says deposit is complete, but we should verify\n // by attempting the Nord deposit with our saved amount\n try {\n await attemptNordDepositWithFallback();\n // If we got here, Nord deposit succeeded! Continue flow normally\n return;\n } catch (nordDepositError) {\n const nordErrorMsg = nordDepositError instanceof Error ? nordDepositError.message : String(nordDepositError);\n\n logger.info('[BridgeDeposit] Nord deposit failed after completion check', {\n error: nordErrorMsg,\n });\n\n // Both USDC check and Nord deposit failed - deposit is truly complete\n clearPendingDeposit();\n setBridgeError('This deposit appears to be already completed. Your funds should be in your Nord account. Click \"Start Over\" to continue.');\n setBridgeRetryable(false);\n setIsDepositing(false);\n return;\n }\n }\n\n // For any other error type, re-throw to allow user to retry\n throw claimDepositError;\n }\n }\n\n // If the nonce was NOT processed, we need a Solana signer to submit the claim.\n if (!solanaWallet) {\n setBridgeError('Solana wallet not connected. Please connect your Solana wallet to continue.');\n setBridgeRetryable(true);\n setDepositProgressPhase('claim');\n setIsDepositing(false);\n return;\n }\n\n if (solanaWallet.chain !== 'SOL') {\n setBridgeError('Wallet is not a Solana wallet. Please connect a Solana wallet.');\n setBridgeRetryable(true);\n setDepositProgressPhase('claim');\n setIsDepositing(false);\n return;\n }\n\n setDepositProgressPhase('solana');\n\n const signature = await submitClaimWithRetry({\n depositId,\n message: attestationData.message,\n attestation: attestationData.attestation,\n sourceChain: pendingState.chain || fromChain,\n destinationAddress: solanaRecipient,\n lookupTableAddress: lookupTableAddress ?? '',\n solanaWallet: solanaWallet as any,\n fallbackWallet: solanaAddress || turnkeyAddress || '',\n fallbackAmount: attestationData.decodedMessage?.decodedMessageBody?.amount || pendingState.amount || '0',\n bridgeTx,\n attestationId: pendingState.attestationId ?? null,\n });\n\n const updated = advancePendingDeposit(pendingState, {\n stage: 'bridge_confirmed',\n // Preserve the original EVM bridge tx hash - don't overwrite with Solana signature\n mintTx: signature,\n attestationId: pendingState.attestationId,\n });\n\n setPendingMintTx(signature);\n setPendingDepositId(updated.depositId);\n setDepositProgressPhase('claim');\n\n await confirmClaimAndDeposit({\n signature,\n destinationAddress: solanaRecipient,\n amountHint: pendingState.amount,\n pendingState: updated,\n });\n } catch (error) {\n logger.logError(createDepositError('CLAIM_FAILED', 'Failed to resume claim process', {\n cause: error instanceof Error ? error : undefined,\n context: { depositId },\n }));\n setBridgeError(formatBridgeError(error));\n setIsDepositing(false);\n throw error;\n }\n },\n [\n solanaAddress,\n confirmClaimAndDeposit,\n context.entryNetwork,\n context.selectedChainId,\n lookupTableAddress,\n setDepositProgressPhase,\n setIsDepositing,\n setPendingBridgeTx,\n setPendingDepositId,\n setPendingMintTx,\n solanaWallet,\n turnkeyAddress,\n turnkeyEnabled,\n turnkeyStatus,\n ]\n );\n\n return {\n startCctpBridge,\n resumeClaimProcess,\n bridgeRetryable,\n setBridgeRetryable,\n bridgeError,\n setBridgeError,\n bridgeApprovalPending,\n setBridgeApprovalPending,\n bridgeApprovalError,\n setBridgeApprovalError,\n };\n};\n"]}
1
+ {"version":3,"file":"useBridgeDeposit.js","sourceRoot":"","sources":["../../../../../src/features/onboarding-flow/hooks/useBridgeDeposit.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { useOnboardingState } from '../providers/OnboardingStateProvider';\nimport { getCctpRuntimeConfig } from '../cctp/config';\nimport {\n advancePendingDeposit,\n clearPendingDeposit,\n createPendingDepositDraft,\n PendingDepositState,\n writePendingDeposit,\n} from '../utils/deposit/storage';\nimport { formatBridgeError, normalizeCctpChain } from '../utils/deposit/bridgeUtils';\nimport { explorerBaseForChain, pickExplorerUrl } from '../utils/explorerUrl';\nimport { logger } from '../../../utils/logger';\nimport { createDepositError } from '../../../utils/errors';\nimport { useWalletConnection } from '../providers/WalletConnectionProvider';\nimport { BridgeKitClient, mapChainToBridgeKit } from '../cctp/bridgeKitClient';\nimport { checkUsedNonceAccount } from '../utils/deposit/nonceUtils';\nimport { waitForAttestation } from '../utils/deposit/attestationUtils';\nimport { ensureCorrectNetwork, getWalletProvider, validateBridgeConfig } from '../utils/deposit/walletUtils';\nimport { submitClaimWithRetry } from '../utils/deposit/claimSubmission';\nimport { confirmClaimAndGetUsdcBalance } from '../utils/deposit/claimConfirmation';\nimport { EvmTxInterceptor } from '../utils/deposit/evmTxInterceptor';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\n\ninterface UseBridgeDepositProps {\n setDepositProgressPhase: (phase: 'bridge' | 'claim' | 'solana' | 'nord') => void;\n setPendingBridgeTx: (tx: string | null) => void;\n setPendingMintTx: (tx: string | null) => void;\n setPendingDepositId: (id: string | null) => void;\n setPendingBridgeExplorerUrl: (url: string | null) => void;\n ensurePendingDraft: (amount: string) => ReturnType<typeof createPendingDepositDraft>;\n finalizeBridgeSuccess: (status: { tx?: string | null; mintTx?: string | null; bridgeTx?: string | null; solanaTx?: string | null; depositId?: string | null }) => void;\n setIsDepositing: (isDepositing: boolean) => void;\n runSolanaDeposit: (\n amount: string,\n pendingState?: ReturnType<typeof createPendingDepositDraft> | null\n ) => Promise<{\n txId: string | null;\n workingState: ReturnType<typeof createPendingDepositDraft>;\n solanaTx: string | null;\n }>;\n}\n\nexport const useBridgeDeposit = ({\n setDepositProgressPhase,\n setPendingBridgeTx,\n setPendingMintTx,\n setPendingDepositId,\n setPendingBridgeExplorerUrl,\n ensurePendingDraft,\n finalizeBridgeSuccess,\n setIsDepositing,\n runSolanaDeposit,\n}: UseBridgeDepositProps) => {\n const { context, updateContext } = useOnboardingState();\n\n // Use NetworkProvider for wallet state\n const { solanaAddress, evmWallet, solanaWallet, evmAdapter } = useNetwork();\n const { turnkeyAddress, turnkeyStatus, turnkeyEnabled } = useWalletConnection();\n\n const [bridgeRetryable, setBridgeRetryable] = useState(false);\n const [bridgeError, setBridgeError] = useState<string | null>(null);\n const [bridgeApprovalPending, setBridgeApprovalPending] = useState(false);\n const [bridgeApprovalError, setBridgeApprovalError] = useState<string | null>(null);\n\n\n\n const lookupTableAddress = process.env.NEXT_PUBLIC_CCTP_LOOKUP_TABLE_ADDRESS;\n const claimFinalizationInFlightRef = useRef<Promise<void> | null>(null);\n\n const confirmClaimAndDeposit = useCallback(\n async ({\n signature,\n destinationAddress,\n amountHint,\n pendingState,\n skipConfirmation,\n }: {\n signature: string | null;\n destinationAddress: string;\n amountHint?: string | number | null;\n pendingState?: PendingDepositState | null;\n skipConfirmation?: boolean;\n }) => {\n logger.info('[BridgeDeposit] confirmClaimAndDeposit called', {\n signature,\n destinationAddress,\n amountHint,\n skipConfirmation,\n pendingStage: pendingState?.stage,\n pendingTx: pendingState?.tx,\n });\n\n if (claimFinalizationInFlightRef.current) {\n logger.info('[BridgeDeposit] confirmClaimAndDeposit - already in flight, returning existing promise');\n return claimFinalizationInFlightRef.current;\n }\n\n const promise = (async () => {\n let amount: string;\n let txSignature: string | null;\n try {\n logger.info('[BridgeDeposit] Calling confirmClaimAndGetUsdcBalance...');\n const res = await confirmClaimAndGetUsdcBalance({\n signature,\n destinationAddress,\n amountHint,\n skipConfirmation,\n });\n logger.info('[BridgeDeposit] confirmClaimAndGetUsdcBalance returned', {\n amount: res.amount,\n txSignature: res.txSignature,\n });\n amount = res.amount;\n txSignature = res.txSignature;\n } catch (e) {\n logger.warn('[BridgeDeposit] confirmClaimAndGetUsdcBalance threw error', {\n error: e instanceof Error ? e.message : String(e),\n });\n const message = e instanceof Error ? e.message : String(e);\n // If the claim nonce was already processed and there's no USDC to deposit,\n // the user likely already completed the deposit earlier. Clear pending state\n // to avoid trapping them in an endless \"resume\" loop.\n if (message.toLowerCase().includes('already be completed')) {\n logger.info('[BridgeDeposit] Deposit appears to be already completed - clearing pending state', {\n message,\n });\n clearPendingDeposit();\n setPendingDepositId(null);\n updateContext({\n depositError: 'This deposit appears to be already completed. Your funds should be in your Nord account.',\n });\n // Do not duplicate the message as a bridgeError; depositError is rendered on the progress screen.\n setBridgeError(null);\n setBridgeRetryable(false);\n setDepositProgressPhase('claim');\n setIsDepositing(false);\n return;\n }\n throw e;\n }\n\n const draft = pendingState ?? ensurePendingDraft(amount);\n const withBridgeStage = advancePendingDeposit(draft, {\n stage: 'bridge_confirmed',\n // Preserve the original EVM bridge tx hash - only update mintTx\n mintTx: txSignature,\n amount,\n });\n\n setDepositProgressPhase('solana');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const depositResult = await runSolanaDeposit(amount, withBridgeStage);\n\n finalizeBridgeSuccess({\n tx: depositResult.txId,\n mintTx: txSignature,\n bridgeTx: withBridgeStage.tx ?? txSignature,\n solanaTx: depositResult.solanaTx,\n depositId: withBridgeStage.depositId,\n });\n })().finally(() => {\n claimFinalizationInFlightRef.current = null;\n });\n\n claimFinalizationInFlightRef.current = promise;\n return promise;\n },\n [\n ensurePendingDraft,\n finalizeBridgeSuccess,\n runSolanaDeposit,\n setDepositProgressPhase,\n setPendingDepositId,\n setBridgeError,\n setBridgeRetryable,\n setIsDepositing,\n updateContext,\n ]\n );\n\n const startCctpBridge = useCallback(\n async (draftAmount: string) => {\n setDepositProgressPhase('bridge');\n setBridgeApprovalPending(true);\n setBridgeApprovalError(null);\n\n const cctpClient = new BridgeKitClient();\n const cctpConfig = getCctpRuntimeConfig();\n const fromChain = normalizeCctpChain(context.selectedChainId ?? context.entryNetwork ?? cctpConfig.fromChain);\n\n await ensureCorrectNetwork({ evmWallet, evmAdapter, targetChain: fromChain });\n validateBridgeConfig(cctpConfig, fromChain, draftAmount);\n\n let workingState = ensurePendingDraft(draftAmount);\n\n const solanaRecipient = solanaAddress || turnkeyAddress || '';\n if (!solanaRecipient) {\n setBridgeApprovalPending(false);\n throw new Error('Turnkey Solana address is not ready yet. Please wait a moment and retry.');\n }\n\n const { provider, walletClient } = await getWalletProvider(evmWallet, evmAdapter);\n if (!provider && !walletClient && !cctpConfig.useMock) {\n setBridgeApprovalPending(false);\n throw new Error('Wallet provider not available for CCTP bridging');\n }\n\n // Persist tx hash ASAP (especially burn) so refresh can resume.\n // We use the interceptor to capture the tx hash before the high-level await returns.\n const interceptor = new EvmTxInterceptor((txHash) => {\n workingState = writePendingDeposit({\n ...workingState,\n depositId: txHash,\n stage: 'bridge_submitted',\n tx: txHash,\n chain: workingState.chain || fromChain,\n amount: workingState.amount || draftAmount,\n updatedAt: Date.now(),\n });\n setPendingDepositId(workingState.depositId);\n setPendingBridgeTx(txHash);\n setDepositProgressPhase('claim');\n });\n\n const walletForBridge = interceptor.wrap(provider || walletClient);\n\n let bridgeTxId: string;\n let depositId: string;\n let attestationId: string | null | undefined;\n\n try {\n const submission = await cctpClient.submitBridge({\n amount: draftAmount,\n fromChain,\n toChain: 'solana',\n destinationAddress: solanaRecipient,\n wallet: walletForBridge,\n });\n bridgeTxId = submission.bridgeTxId;\n depositId = submission.depositId;\n attestationId = submission.attestationId;\n } catch (error) {\n const message = formatBridgeError(error);\n setBridgeApprovalError(message);\n setBridgeError(message);\n setBridgeRetryable(true);\n setBridgeApprovalPending(false);\n clearPendingDeposit();\n throw error;\n } finally {\n setBridgeApprovalPending(false);\n }\n\n const bridgeExplorerUrl = pickExplorerUrl(\n workingState.explorerUrl,\n cctpConfig.explorerBaseUrl ?? explorerBaseForChain(context.entryNetwork),\n bridgeTxId,\n );\n workingState = advancePendingDeposit(workingState, {\n stage: 'bridge_submitted',\n tx: bridgeTxId,\n attestationId,\n explorerUrl: bridgeExplorerUrl ?? null,\n });\n setPendingBridgeExplorerUrl(workingState.explorerUrl ?? null);\n setPendingBridgeTx(bridgeTxId);\n if (depositId && depositId !== workingState.depositId) {\n workingState = writePendingDeposit({\n ...workingState,\n depositId,\n attestationId: attestationId ?? workingState.attestationId ?? null,\n updatedAt: Date.now(),\n });\n }\n setPendingDepositId(depositId || workingState.depositId);\n\n const attestationData = await waitForAttestation({\n cctpClient,\n bridgeTxId,\n sourceChain: fromChain,\n timeoutMs: cctpConfig.attestationTimeoutMs ?? 120_000,\n retryBackoffMs: cctpConfig.retryBackoffMs ?? 5_000,\n });\n\n const nonceAlreadyProcessed = await checkUsedNonceAccount(attestationData?.decodedMessage?.nonce);\n if (nonceAlreadyProcessed) {\n const updatedState = advancePendingDeposit(workingState, {\n stage: 'bridge_confirmed',\n tx: workingState.tx ?? bridgeTxId ?? null,\n mintTx: workingState.mintTx ?? null,\n attestationId,\n explorerUrl: workingState.explorerUrl ?? null,\n });\n\n setPendingMintTx(updatedState.mintTx ?? null);\n setPendingDepositId(updatedState.depositId);\n setDepositProgressPhase('claim');\n\n await confirmClaimAndDeposit({\n signature: updatedState.mintTx ?? updatedState.tx ?? null,\n destinationAddress: solanaRecipient,\n amountHint: draftAmount,\n pendingState: updatedState,\n skipConfirmation: true,\n });\n\n return updatedState;\n }\n\n setDepositProgressPhase('solana');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const finalSignature = await submitClaimWithRetry({\n depositId,\n message: attestationData.message,\n attestation: attestationData.attestation,\n sourceChain: fromChain,\n destinationAddress: solanaRecipient,\n lookupTableAddress: lookupTableAddress ?? '',\n solanaWallet: solanaWallet as any,\n fallbackWallet: solanaAddress || turnkeyAddress || '',\n fallbackAmount: attestationData.decodedMessage?.decodedMessageBody?.amount || draftAmount || '0',\n bridgeTx: bridgeTxId,\n attestationId: attestationId ?? null,\n });\n\n workingState = advancePendingDeposit(workingState, {\n stage: 'bridge_confirmed',\n // Preserve the original EVM bridge tx hash - don't overwrite with Solana signature\n mintTx: finalSignature,\n attestationId,\n explorerUrl: finalSignature\n ? pickExplorerUrl(null, cctpConfig.mintExplorerBaseUrl ?? explorerBaseForChain('solana'), finalSignature)\n : workingState.explorerUrl,\n });\n\n setPendingMintTx(finalSignature);\n setPendingDepositId(workingState.depositId);\n setDepositProgressPhase('claim');\n\n await confirmClaimAndDeposit({\n signature: finalSignature,\n destinationAddress: solanaRecipient,\n amountHint: draftAmount,\n pendingState: workingState,\n });\n\n return workingState;\n },\n [\n solanaAddress,\n confirmClaimAndDeposit,\n context.entryNetwork,\n context.selectedChainId,\n ensurePendingDraft,\n evmAdapter,\n evmWallet,\n lookupTableAddress,\n setDepositProgressPhase,\n setPendingBridgeExplorerUrl,\n setPendingBridgeTx,\n setPendingDepositId,\n setPendingMintTx,\n solanaWallet,\n turnkeyAddress,\n ]\n );\n\n const resumeClaimProcess = useCallback(\n async (pendingState: PendingDepositState) => {\n // Log full pending state for debugging\n logger.info('[BridgeDeposit] resumeClaimProcess called', {\n depositId: pendingState.depositId,\n stage: pendingState.stage,\n tx: pendingState.tx,\n mintTx: pendingState.mintTx,\n chain: pendingState.chain,\n amount: pendingState.amount,\n wallet: pendingState.wallet,\n reason: pendingState.reason,\n updatedAt: pendingState.updatedAt,\n });\n\n const depositId = pendingState.depositId;\n if (!depositId) {\n logger.warn('[BridgeDeposit] resumeClaimProcess - no depositId, showing error');\n setBridgeError('Missing deposit ID. Please start a new deposit.');\n setBridgeRetryable(false);\n return;\n }\n\n // If the deposit is already in a terminal state, don't try to resume\n if (pendingState.stage === 'solana_confirmed') {\n logger.info('[BridgeDeposit] Deposit already in solana_confirmed state - clearing and completing', {\n depositId,\n stage: pendingState.stage,\n });\n clearPendingDeposit();\n finalizeBridgeSuccess({\n tx: pendingState.tx,\n mintTx: pendingState.mintTx,\n bridgeTx: pendingState.tx,\n depositId: pendingState.depositId,\n });\n return;\n }\n\n // If the deposit was submitted to Solana but we refreshed before confirmation,\n // the deposit might have actually completed. Show message with Start Over option.\n if (pendingState.stage === 'solana_submitted' && pendingState.tx) {\n logger.info('[BridgeDeposit] Deposit in solana_submitted state - may already be complete', {\n depositId,\n stage: pendingState.stage,\n tx: pendingState.tx,\n });\n // Clear state and show message - user can check their Nord account\n clearPendingDeposit();\n setBridgeError('Your deposit may have already completed. Please check your Nord account balance. Click \"Start Over\" if you need to make another deposit.');\n setBridgeRetryable(false);\n setIsDepositing(false);\n return;\n }\n\n // BridgeKit uses the burn tx hash for attestation lookup.\n // After refresh, `depositId` might be a local draft id if the user refreshed mid-sign.\n const bridgeTx = pendingState.tx;\n if (!bridgeTx || !bridgeTx.startsWith('0x')) {\n logger.warn('[BridgeDeposit] Cannot resume claim: missing bridge tx hash (likely refreshed before signing burn tx)', {\n depositId,\n tx: pendingState.tx,\n stage: pendingState.stage,\n });\n setBridgeError('Bridge transaction was not completed. Please start the deposit again.');\n setBridgeRetryable(true);\n setIsDepositing(false);\n return;\n }\n\n // Check if Turnkey is still initializing for EVM flows\n const isEvmFlow = context.entryNetwork === 'evm';\n const turnkeyStillInitializing = turnkeyEnabled && turnkeyStatus !== 'ready';\n\n if (isEvmFlow && turnkeyStillInitializing) {\n setBridgeError('Preparing Solana wallet... Please wait.');\n setBridgeRetryable(false); // Don't allow retry until Turnkey is ready\n setDepositProgressPhase('claim');\n return;\n }\n\n const solanaRecipient = solanaAddress || turnkeyAddress || pendingState.wallet;\n if (!solanaRecipient) {\n setBridgeError('Missing Solana deposit address. Please reconnect your wallet.');\n setBridgeRetryable(true);\n return;\n }\n\n setPendingBridgeTx(bridgeTx);\n setDepositProgressPhase('claim');\n setIsDepositing(true);\n setBridgeError(null);\n setBridgeRetryable(false);\n\n try {\n const cctpClient = new BridgeKitClient();\n const cctpConfig = getCctpRuntimeConfig();\n\n const fromChain = normalizeCctpChain(\n pendingState.chain || context.selectedChainId || context.entryNetwork || cctpConfig.fromChain,\n );\n\n const attestationData = await cctpClient.getAttestation(bridgeTx, fromChain);\n if (!attestationData) {\n setBridgeError('Attestation not ready yet. Please wait a moment and try again.');\n setBridgeRetryable(true);\n setIsDepositing(false);\n return;\n }\n\n const nonceAlreadyProcessed = await checkUsedNonceAccount(attestationData.decodedMessage?.nonce);\n if (nonceAlreadyProcessed) {\n logger.info('[BridgeDeposit] Nonce already processed - CCTP claim was completed previously', {\n depositId,\n bridgeTx,\n nonce: attestationData.decodedMessage?.nonce,\n });\n\n const updated = advancePendingDeposit(pendingState, {\n stage: 'bridge_confirmed',\n tx: pendingState.tx ?? null,\n mintTx: pendingState.mintTx ?? pendingState.tx ?? null,\n attestationId: pendingState.attestationId,\n });\n\n setPendingMintTx(updated.mintTx ?? null);\n setPendingDepositId(updated.depositId);\n setDepositProgressPhase('claim');\n\n try {\n await confirmClaimAndDeposit({\n signature: updated.mintTx ?? updated.tx ?? null,\n destinationAddress: solanaRecipient,\n amountHint: pendingState.amount,\n pendingState: updated,\n skipConfirmation: true,\n });\n } catch (claimDepositError) {\n // If confirmClaimAndDeposit throws, it could be because:\n // 1. USDC was already deposited to Nord (deposit complete - OK to clear state)\n // 2. USDC is missing due to other reasons (funds moved, RPC error - should NOT clear state)\n //\n // Instead of assuming deposit is complete, try the Nord deposit with amountHint.\n // If Nord deposit succeeds, great. If it fails with \"already deposited\", clear state.\n const errorMessage = claimDepositError instanceof Error ? claimDepositError.message : String(claimDepositError);\n logger.warn('[BridgeDeposit] confirmClaimAndDeposit failed after nonce processed', {\n error: errorMessage,\n });\n\n // If the error explicitly says the deposit is already completed, trust it and clear state\n if (errorMessage.toLowerCase().includes('already be completed')) {\n // However, only clear state if we're certain the Nord deposit succeeded\n // Try depositing with amountHint as fallback\n if (pendingState.amount) {\n try {\n logger.info('[BridgeDeposit] Attempting Nord deposit with amountHint as fallback', {\n amount: pendingState.amount,\n });\n\n const withBridgeStage = advancePendingDeposit(updated, {\n stage: 'bridge_confirmed',\n amount: pendingState.amount,\n });\n\n setDepositProgressPhase('solana');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await runSolanaDeposit(pendingState.amount, withBridgeStage);\n\n // If we got here, Nord deposit succeeded!\n return;\n } catch (nordDepositError) {\n const nordErrorMsg = nordDepositError instanceof Error ? nordDepositError.message : String(nordDepositError);\n logger.error('[BridgeDeposit] Nord deposit also failed - deposit may be truly complete', {\n error: nordErrorMsg,\n });\n\n // Now we can be more confident the deposit was already completed\n clearPendingDeposit();\n setBridgeError('This deposit appears to be already completed. Your funds should be in your Nord account. Click \"Start Over\" to continue.');\n setBridgeRetryable(false);\n setIsDepositing(false);\n return;\n }\n }\n }\n\n // For other errors, don't clear state - throw and let user retry\n throw claimDepositError;\n }\n\n return;\n }\n\n // If the nonce was NOT processed, we need a Solana signer to submit the claim.\n if (!solanaWallet) {\n setBridgeError('Solana wallet not connected. Please connect your Solana wallet to continue.');\n setBridgeRetryable(true);\n setDepositProgressPhase('claim');\n setIsDepositing(false);\n return;\n }\n\n if (solanaWallet.chain !== 'SOL') {\n setBridgeError('Wallet is not a Solana wallet. Please connect a Solana wallet.');\n setBridgeRetryable(true);\n setDepositProgressPhase('claim');\n setIsDepositing(false);\n return;\n }\n\n setDepositProgressPhase('solana');\n\n const signature = await submitClaimWithRetry({\n depositId,\n message: attestationData.message,\n attestation: attestationData.attestation,\n sourceChain: pendingState.chain || fromChain,\n destinationAddress: solanaRecipient,\n lookupTableAddress: lookupTableAddress ?? '',\n solanaWallet: solanaWallet as any,\n fallbackWallet: solanaAddress || turnkeyAddress || '',\n fallbackAmount: attestationData.decodedMessage?.decodedMessageBody?.amount || pendingState.amount || '0',\n bridgeTx,\n attestationId: pendingState.attestationId ?? null,\n });\n\n const updated = advancePendingDeposit(pendingState, {\n stage: 'bridge_confirmed',\n // Preserve the original EVM bridge tx hash - don't overwrite with Solana signature\n mintTx: signature,\n attestationId: pendingState.attestationId,\n });\n\n setPendingMintTx(signature);\n setPendingDepositId(updated.depositId);\n setDepositProgressPhase('claim');\n\n await confirmClaimAndDeposit({\n signature,\n destinationAddress: solanaRecipient,\n amountHint: pendingState.amount,\n pendingState: updated,\n });\n } catch (error) {\n logger.logError(createDepositError('CLAIM_FAILED', 'Failed to resume claim process', {\n cause: error instanceof Error ? error : undefined,\n context: { depositId },\n }));\n setBridgeError(formatBridgeError(error));\n setIsDepositing(false);\n throw error;\n }\n },\n [\n solanaAddress,\n confirmClaimAndDeposit,\n context.entryNetwork,\n context.selectedChainId,\n lookupTableAddress,\n setDepositProgressPhase,\n setIsDepositing,\n setPendingBridgeTx,\n setPendingDepositId,\n setPendingMintTx,\n solanaWallet,\n turnkeyAddress,\n turnkeyEnabled,\n turnkeyStatus,\n ]\n );\n\n return {\n startCctpBridge,\n resumeClaimProcess,\n bridgeRetryable,\n setBridgeRetryable,\n bridgeError,\n setBridgeError,\n bridgeApprovalPending,\n setBridgeApprovalPending,\n bridgeApprovalError,\n setBridgeApprovalError,\n };\n};\n"]}