@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.
- package/dist/src/features/onboarding-flow/cctp/bridgeKitClient.js +60 -5
- package/dist/src/features/onboarding-flow/cctp/bridgeKitClient.js.map +1 -1
- package/dist/src/features/onboarding-flow/hooks/useBridgeDeposit.js +28 -44
- package/dist/src/features/onboarding-flow/hooks/useBridgeDeposit.js.map +1 -1
- package/dist/src/features/onboarding-flow/providers/WalletConnectionProvider.js +39 -88
- package/dist/src/features/onboarding-flow/providers/WalletConnectionProvider.js.map +1 -1
- package/dist/src/features/onboarding-flow/utils/deposit/claimConfirmation.js +3 -19
- package/dist/src/features/onboarding-flow/utils/deposit/claimConfirmation.js.map +1 -1
- package/dist/src/features/onboarding-flow/utils/deposit/claimSubmission.d.ts +1 -1
- package/dist/src/features/onboarding-flow/utils/deposit/claimSubmission.js +41 -58
- package/dist/src/features/onboarding-flow/utils/deposit/claimSubmission.js.map +1 -1
- package/package.json +21 -35
- package/dist/src/providers/N1WalletProviderTemp.d.ts +0 -0
- package/dist/src/providers/N1WalletProviderTemp.js +0 -184
- package/dist/src/providers/N1WalletProviderTemp.js.map +0 -1
- package/dist/src/store/subscriptions/fontInjection.d.ts +0 -18
- package/dist/src/store/subscriptions/fontInjection.js +0 -90
- package/dist/src/store/subscriptions/fontInjection.js.map +0 -1
- package/dist/src/types/dynamic-wallets.d.ts +0 -104
- package/dist/src/types/dynamic-wallets.js +0 -8
- package/dist/src/types/dynamic-wallets.js.map +0 -1
|
@@ -179,7 +179,8 @@ var BridgeKitClient = /** @class */ (function () {
|
|
|
179
179
|
return [2 /*return*/, mappedToChain_1];
|
|
180
180
|
}); }); },
|
|
181
181
|
capabilities: {
|
|
182
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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*/,
|
|
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
|
-
|
|
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
|
-
|
|
515
|
-
if (!
|
|
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
|
-
|
|
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!
|
|
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.
|
|
510
|
+
logger.error('[BridgeDeposit] Nord deposit also failed - deposit may be truly complete', {
|
|
528
511
|
error: nordErrorMsg,
|
|
529
512
|
});
|
|
530
|
-
//
|
|
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
|
|
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
|
|
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
|
|
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"]}
|