@n1xyz/wallet-widget 0.0.35-alpha.33 → 0.0.35-alpha.35
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/features/onboarding-flow/providers/WalletConnectionProvider.js +23 -4
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/WithdrawalFlowProvider.js +1 -0
- package/dist/features/onboarding-flow/providers/WithdrawalFlowProvider.js.map +1 -1
- package/dist/features/onboarding-flow/utils/withdrawal/bridgeFlowPhases.d.ts +1 -0
- package/dist/features/onboarding-flow/utils/withdrawal/bridgeFlowPhases.js +153 -15
- package/dist/features/onboarding-flow/utils/withdrawal/bridgeFlowPhases.js.map +1 -1
- package/dist/hooks/useNordUserInitialization.js +60 -26
- package/dist/hooks/useNordUserInitialization.js.map +1 -1
- package/dist/providers/LazyWalletProvider.js +51 -27
- package/dist/providers/LazyWalletProvider.js.map +1 -1
- package/dist/services/storage/StorageService.d.ts +6 -3
- package/dist/services/storage/StorageService.js +31 -12
- package/dist/services/storage/StorageService.js.map +1 -1
- package/dist/services/storage/keys.d.ts +7 -1
- package/dist/services/storage/keys.js +9 -1
- package/dist/services/storage/keys.js.map +1 -1
- package/dist/turnkey/TurnkeyProvider.js +288 -103
- package/dist/turnkey/TurnkeyProvider.js.map +1 -1
- package/package.json +1 -1
|
@@ -195,12 +195,30 @@ export var WalletConnectionProvider = function (_a) {
|
|
|
195
195
|
var evmSwitched = Boolean(previousEvm && evmWalletAddress && previousEvm !== evmWalletAddress);
|
|
196
196
|
var solanaSwitched = Boolean(previousSolana && solanaWalletAddress && previousSolana !== solanaWalletAddress);
|
|
197
197
|
if (evmSwitched || solanaSwitched) {
|
|
198
|
-
logger.debug('Wallet switch detected; resetting onboarding flow', {
|
|
198
|
+
logger.debug('Wallet switch detected; resetting session and onboarding flow', {
|
|
199
199
|
previousEvm: previousEvm,
|
|
200
200
|
currentEvm: evmWalletAddress,
|
|
201
201
|
previousSolana: previousSolana,
|
|
202
202
|
currentSolana: solanaWalletAddress,
|
|
203
203
|
});
|
|
204
|
+
// Clear stale session state from the previous wallet so the new
|
|
205
|
+
// wallet starts with a clean slate (nordUser, sessionPubKey,
|
|
206
|
+
// isConnected, signing functions). Without this the widget ends
|
|
207
|
+
// up showing address B but still holding address A's session.
|
|
208
|
+
var storeActions = getWalletActions();
|
|
209
|
+
storeActions.session.resetSession();
|
|
210
|
+
storeActions.signing.resetSigning();
|
|
211
|
+
// NOTE: Do NOT call clearSession() here. The stored Turnkey client
|
|
212
|
+
// address in localStorage is needed by ensureCleanSessionForAddress()
|
|
213
|
+
// (inside the bootstrap effect) to detect the user switch and call
|
|
214
|
+
// client.logout() — which clears the old session from IndexedDB.
|
|
215
|
+
// Clearing it prematurely causes isSessionForDifferentUser() to
|
|
216
|
+
// return false, skipping the logout and leaving the old IndexedDB
|
|
217
|
+
// session around, which breaks subsequent API calls.
|
|
218
|
+
// Clear internal processing refs so the new wallet is treated
|
|
219
|
+
// as a fresh connection rather than a no-op.
|
|
220
|
+
processedWalletAddressRef.current = null;
|
|
221
|
+
turnkeyAuthenticatedEvmAddressRef.current = null;
|
|
204
222
|
skipAutoResumeRef.current = true;
|
|
205
223
|
flowActions.resetFlow();
|
|
206
224
|
}
|
|
@@ -320,9 +338,10 @@ export var WalletConnectionProvider = function (_a) {
|
|
|
320
338
|
// The deposit is preserved in localStorage and will only be shown
|
|
321
339
|
// if the user reconnects with the same wallet (validated by walletMatchesPendingDeposit).
|
|
322
340
|
if (turnkeyEnabled) {
|
|
323
|
-
//
|
|
324
|
-
//
|
|
325
|
-
|
|
341
|
+
// Clear the per-address session for the disconnecting wallet.
|
|
342
|
+
// With per-address storage this only removes that wallet's session
|
|
343
|
+
// data — other wallets' sessions are preserved.
|
|
344
|
+
clearSession(evmAddr);
|
|
326
345
|
}
|
|
327
346
|
}, [
|
|
328
347
|
solanaWalletAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WalletConnectionProvider.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/providers/WalletConnectionProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTurnkey } from '../../../turnkey';\nimport { useN1WalletContext } from '../../../hooks';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { useSession } from '../../../providers/N1WalletProvider/SessionProvider';\nimport { useModal, useModalActions } from '../../../providers/N1WalletProvider/ModalProvider';\nimport { useSigningActions } from '../../../providers/N1WalletProvider/SigningProvider';\nimport { getWalletActions } from '../../../store';\nimport { logger } from '../../../utils/logger';\nimport { EVENTS, createWalletEvent } from '../../../utils/events';\nimport { createWalletError } from '../../../utils/errors';\nimport { OnboardingStep, initialOnboardingContext } from '../types';\nimport { useOnboardingState } from './OnboardingStateProvider';\nimport { clearLastDepositRecord, readLastDepositRecord, readPendingDeposit } from '../utils/deposit/storage';\nimport { N1ModalViewMode } from '../../../types/wallet';\nimport { removeKeysFromLocalStorage } from '../utils/utils';\nimport { SolanaNetwork } from '../../../config/solana';\nimport { clearSession, clearPendingDeposit } from '../../../services/bootstrap';\n\ntype TurnkeyBootstrapStatus =\n | 'idle'\n | 'authenticating'\n | 'creating'\n | 'ready'\n | 'error';\nconst WALLET_CONNECTION_STEPS = new Set<OnboardingStep>([\n OnboardingStep.CONNECTING_WALLET,\n OnboardingStep.TURNKEY_AUTH,\n OnboardingStep.TURNKEY_PREPARING,\n]);\nconst isWalletConnectionStep = (step: OnboardingStep): boolean =>\n WALLET_CONNECTION_STEPS.has(step);\n\nconst useOptionalTurnkey = () => {\n try {\n return useTurnkey();\n } catch {\n return null;\n }\n};\n\nexport const FLOW_STATE_STORAGE_KEY = 'n1_wallet_connection_flow_state';\n// Define the shape of the context value\nexport interface WalletConnectionContextValue {\n isConnecting: boolean;\n connectWallet: () => Promise<void>;\n disconnectWallet: () => void;\n turnkeyEnabled: boolean;\n turnkeyStatus: TurnkeyBootstrapStatus;\n turnkeyError: string | null;\n retryTurnkeyBootstrap: () => void;\n turnkeyAddress: string | null;\n signTransaction?: (transaction: any) => Promise<any>;\n}\n\n// Create the context with a default value\nconst WalletConnectionContext = createContext<WalletConnectionContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface WalletConnectionProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the wallet connection context\n */\nexport const WalletConnectionProvider: React.FC<WalletConnectionProviderProps> = ({\n children,\n}) => {\n // Use new providers for wallet/session/modal state\n const {\n solanaAddress,\n solanaWallet,\n evmWallet,\n setSolanaAddress,\n setSolanaWallet,\n setEvmWallet,\n setEvmAddress,\n setEvmChain,\n setPreferredWalletNetwork,\n setBalances,\n } = useNetwork();\n const {\n nordUser,\n dynamicSdkHasLoaded,\n turnkeyEnabled,\n setIsConnected,\n setNordUser,\n setSessionPubKey,\n setWalletPubKey,\n } = useSession();\n const {\n showLogin,\n closeModal,\n onCloseComplete,\n showDynamicWidget,\n dynamicHandleLogOut,\n setViewMode,\n } = useModal();\n\n // nord client still comes from legacy context (passed as prop)\n const { nord } = useN1WalletContext();\n // Signing setters from SigningProvider\n const { setSignMessageWithSessionKey, setSignMessageWithWalletKey, setSignTransactionWithWalletKey } = useSigningActions();\n // Disconnect handler from ModalProvider\n const { setDisconnectWalletHandler } = useModalActions();\n\n // Get flow context\n const {\n state,\n context,\n actions: flowActions,\n updateContext,\n } = useOnboardingState();\n\n const [isConnecting, setIsConnecting] = useState(false);\n const dynamicWidgetRequestedRef = useRef(false);\n const lastDynamicOpenTimeRef = useRef<number>(0);\n const skipAutoResumeRef = useRef(false);\n const turnkeyContext = useOptionalTurnkey();\n const turnkey = turnkeyEnabled ? turnkeyContext : null;\n const previousEvmWalletAddressRef = useRef<string | null>(null);\n const turnkeyAuthenticatedEvmAddressRef = useRef<string | null>(null);\n const lastConnectedWalletRef = useRef<{ evm: string | null; solana: string | null }>({\n evm: null,\n solana: null,\n });\n const getUserCacheRef = useRef<{ address: string; result: any; timestamp: number } | null>(null);\n const getUserInFlightRef = useRef<Promise<any> | null>(null);\n const lastProcessedGetUserRef = useRef<{ nordUser: any; sessionId: string | null; address: string } | null>(null);\n const GET_USER_CACHE_TTL_MS = 10000; // Cache getUser results for 10 seconds\n\n const turnkeyStatus: TurnkeyBootstrapStatus =\n turnkey?.turnkeyStatus ?? (turnkeyEnabled ? 'idle' : 'ready');\n const turnkeyError: string | null = turnkey?.turnkeyError ?? null;\n const turnkeyAddress = turnkey?.turnkeyAddress ?? null;\n const retryTurnkeyBootstrap = turnkey?.retryTurnkeyBootstrap ?? (() => { });\n const prepareTurnkeyWallet = turnkey?.prepareTurnkeyWallet;\n\n const evmWalletAddress = useMemo(\n () => evmWallet?.address?.toLowerCase?.() ?? null,\n [evmWallet?.address]\n );\n const solanaWalletAddress = useMemo(\n () => solanaWallet?.address ?? null,\n [solanaWallet?.address]\n );\n\n // Auto-resume the flow if a wallet was restored so we don't strand users on EntrySelection\n useEffect(() => {\n if (!dynamicSdkHasLoaded) {\n return;\n }\n // Don't auto-resume when the modal is closed — the reset on modal\n // close puts state back to ENTRY_SELECTION, but we don't want to\n // re-trigger the connection flow until the user actually opens the modal.\n if (!showLogin) {\n return;\n }\n if (skipAutoResumeRef.current) {\n logger.debug('[WalletConnection] Skipping auto-resume after wallet switch');\n skipAutoResumeRef.current = false;\n return;\n }\n if (context.entryNetwork) {\n return;\n }\n if (state !== OnboardingStep.ENTRY_SELECTION) {\n return;\n }\n\n // Skip auto-resume if Turnkey is in error state - let the retry handle it first\n if (turnkeyEnabled && turnkeyStatus === 'error') {\n logger.debug('[WalletConnection] Skipping auto-resume - Turnkey in error state, waiting for retry');\n return;\n }\n\n const walletChain = solanaWallet?.chain\n ? String(solanaWallet.chain).toUpperCase()\n : '';\n const restoredNetwork =\n evmWallet || walletChain.startsWith('ETH') || walletChain.startsWith('ARB') || walletChain.startsWith('BASE')\n ? 'evm'\n : walletChain.startsWith('SOL')\n ? 'solana'\n : null;\n\n if (!restoredNetwork) {\n return;\n }\n\n logger.debug(\"[WalletConnection] Auto-selecting entry network from restored wallet\", {\n restoredNetwork,\n hasEvmWallet: Boolean(evmWallet),\n walletChain,\n });\n flowActions.beginWalletConnection(restoredNetwork as 'evm' | 'solana');\n }, [context.entryNetwork, dynamicSdkHasLoaded, solanaWallet, evmWallet, flowActions, state, turnkeyEnabled, turnkeyStatus, showLogin]);\n\n // Skip CONNECTING_WALLET if wallet already exists for the selected entry network\n useEffect(() => {\n if (state !== OnboardingStep.CONNECTING_WALLET) {\n return;\n }\n if (!context.entryNetwork) {\n return;\n }\n if (!dynamicSdkHasLoaded) {\n return;\n }\n\n const walletChain = solanaWallet?.chain ? String(solanaWallet.chain).toUpperCase() : '';\n const isTurnkeySolana = solanaWallet?.type === 'turnkey' && walletChain.startsWith('SOL');\n const hasSolanaWallet = walletChain.startsWith('SOL') && !isTurnkeySolana;\n const hasEvmWallet = Boolean(evmWalletAddress);\n\n const hasMatchingWallet =\n (context.entryNetwork === 'solana' && (hasSolanaWallet || isTurnkeySolana)) ||\n (context.entryNetwork === 'evm' && hasEvmWallet);\n\n if (hasMatchingWallet) {\n logger.debug('[WalletConnection] Wallet already connected for entry network, skipping CONNECTING_WALLET', {\n entryNetwork: context.entryNetwork,\n hasEvmWallet,\n hasSolanaWallet,\n isTurnkeySolana,\n });\n\n // Don't advance to CHAIN_SELECTION here — the async nordUser\n // processing effect will decide the final destination (either\n // completeFlow for returning users, or goToChainSelection for\n // new accounts / deposit-only flows). Advancing here causes a\n // brief flash of the chain selection screen for returning users.\n // For EVM with Turnkey, let the Turnkey status effect handle it.\n }\n }, [state, context.entryNetwork, dynamicSdkHasLoaded, solanaWallet, evmWalletAddress, flowActions, turnkeyEnabled, turnkeyStatus]);\n\n useEffect(() => {\n const { evm: previousEvm, solana: previousSolana } = lastConnectedWalletRef.current;\n const evmSwitched = Boolean(previousEvm && evmWalletAddress && previousEvm !== evmWalletAddress);\n const solanaSwitched = Boolean(\n previousSolana && solanaWalletAddress && previousSolana !== solanaWalletAddress\n );\n\n if (evmSwitched || solanaSwitched) {\n logger.debug('Wallet switch detected; resetting onboarding flow', {\n previousEvm,\n currentEvm: evmWalletAddress,\n previousSolana,\n currentSolana: solanaWalletAddress,\n });\n skipAutoResumeRef.current = true;\n flowActions.resetFlow();\n }\n\n lastConnectedWalletRef.current = {\n evm: evmWalletAddress,\n solana: solanaWalletAddress,\n };\n }, [evmWalletAddress, solanaWalletAddress, flowActions]);\n\n useEffect(() => {\n if (!turnkeyEnabled) {\n return;\n }\n\n const previousAddress = previousEvmWalletAddressRef.current;\n if (previousAddress === evmWalletAddress) {\n return;\n }\n\n previousEvmWalletAddressRef.current = evmWalletAddress;\n turnkeyAuthenticatedEvmAddressRef.current = null;\n retryTurnkeyBootstrap();\n }, [evmWalletAddress, retryTurnkeyBootstrap, turnkeyEnabled]);\n\n // Use refs to track previous values\n const processedWalletAddressRef = useRef<string | null>(null);\n const prevNordUserRef = useRef(nordUser);\n const prevSessionIdRef = useRef<string | null>(\n nordUser?.sessionId ? nordUser.sessionId.toString() : null\n );\n const stateRef = useRef(state);\n useEffect(() => { stateRef.current = state; }, [state]);\n const prevStateRef = useRef(state);\n const reportedNordClientErrorRef = useRef(false);\n\n\n const closeDynamicWidget = useCallback(() => {\n if (!dynamicWidgetRequestedRef.current) {\n return;\n }\n\n if (showDynamicWidget) {\n try {\n showDynamicWidget(false);\n } catch (error) {\n logger.warn('Failed to close Dynamic widget', error);\n }\n }\n\n dynamicWidgetRequestedRef.current = false;\n }, [showDynamicWidget]);\n\n /**\n * Disconnect wallet\n */\n const disconnectWallet = useCallback(() => {\n // Capture addresses NOW before any state changes\n const solanaAddr = solanaWalletAddress || solanaAddress;\n const evmAddr = evmWalletAddress;\n const currentAddress = solanaAddr || evmAddr;\n\n logger.event(createWalletEvent(EVENTS.WALLET.DISCONNECT, {\n address: currentAddress,\n network: solanaAddr ? 'solana' : evmAddr ? 'evm' : null,\n }));\n\n // Clear internal refs FIRST\n processedWalletAddressRef.current = null;\n turnkeyAuthenticatedEvmAddressRef.current = null;\n previousEvmWalletAddressRef.current = null;\n\n // Reset all store state atomically using store actions\n // Do this BEFORE Dynamic handleLogOut to prevent race conditions\n const storeActions = getWalletActions();\n storeActions.session.resetSession(); // Clears: nordUser, sessionPubKey, walletPubKey, isConnected\n storeActions.wallet.resetWallet(); // Clears: solanaWallet, evmWallet, addresses, balances\n storeActions.signing.resetSigning(); // Clears: all signing functions\n\n // Reset flow state BEFORE clearing storage\n flowActions.resetFlow();\n\n // Reset onboarding context\n updateContext(initialOnboardingContext);\n\n try {\n // Clear localStorage using captured addresses (not state)\n if (typeof window !== 'undefined') {\n // Clear Solana session data\n if (solanaAddr) {\n const sessionIdKey = `n1_sessionId_${solanaAddr}`;\n window.localStorage.removeItem(sessionIdKey);\n removeKeysFromLocalStorage(solanaAddr);\n clearLastDepositRecord(solanaAddr);\n }\n\n // Clear EVM session data\n if (evmAddr) {\n const sessionIdKey = `n1_sessionId_${evmAddr}`;\n window.localStorage.removeItem(sessionIdKey);\n removeKeysFromLocalStorage(evmAddr);\n clearLastDepositRecord(evmAddr);\n }\n\n // Clear cached address\n window.localStorage.removeItem('n1_last_connected_address');\n\n // Clear flow state\n window.localStorage.removeItem(FLOW_STATE_STORAGE_KEY);\n }\n\n // Call Dynamic SDK handleLogOut AFTER our state is cleared\n // Force immediate disconnect to prevent silent re-authentication\n if (dynamicHandleLogOut) {\n dynamicHandleLogOut();\n }\n closeDynamicWidget();\n\n logger.debug('[Disconnect] Complete - all state cleared', {\n solanaAddress: solanaAddr || null,\n evmAddress: evmAddr || null,\n storeReset: true,\n flowReset: true,\n localStorageCleared: true,\n });\n } catch (error) {\n logger.logError(createWalletError('DISCONNECT_FAILED', 'Error during wallet disconnect', {\n cause: error instanceof Error ? error : undefined,\n context: { address: currentAddress },\n }));\n }\n\n // Reset UI state\n setViewMode(N1ModalViewMode.Automatic);\n // Close modal via state machine (triggers closing → closed transition)\n // Do NOT call onCloseComplete() here - it will be called automatically after the close animation\n closeModal();\n // Note: We intentionally do NOT clear pending deposit here.\n // The deposit is preserved in localStorage and will only be shown\n // if the user reconnects with the same wallet (validated by walletMatchesPendingDeposit).\n if (turnkeyEnabled) {\n // Pass no address to unconditionally clear the session\n // (passing evmWalletAddress would fail if stored session belongs to different wallet)\n clearSession();\n }\n }, [\n solanaWalletAddress,\n solanaAddress,\n evmWalletAddress,\n closeDynamicWidget,\n dynamicHandleLogOut,\n updateContext,\n setViewMode,\n flowActions,\n turnkeyEnabled,\n closeModal,\n ]);\n\n useEffect(() => {\n // Don't wrap in arrow function - pass the function directly\n setDisconnectWalletHandler(disconnectWallet);\n }, [disconnectWallet, setDisconnectWalletHandler]);\n\n useEffect(() => {\n if (state === OnboardingStep.CONNECTING_WALLET) {\n processedWalletAddressRef.current = null;\n }\n }, [state]);\n\n useEffect(() => {\n if (\n !turnkeyEnabled ||\n !evmWallet ||\n context.entryNetwork !== 'evm' ||\n !prepareTurnkeyWallet ||\n turnkeyStatus !== 'idle'\n ) {\n return;\n }\n\n prepareTurnkeyWallet().catch((error) => {\n logger.logError(createWalletError('CONNECT_FAILED', 'Turnkey bootstrap failed', {\n cause: error instanceof Error ? error : undefined,\n }));\n });\n }, [\n context.entryNetwork,\n evmWallet,\n logger,\n prepareTurnkeyWallet,\n turnkeyEnabled,\n turnkeyStatus,\n ]);\n\n // Set isConnected whenever we have a valid wallet + nordUser, regardless\n // of whether the modal is open. This ensures the host app sees the correct\n // connection status even when the modal is closed.\n useEffect(() => {\n if (dynamicSdkHasLoaded && nordUser && solanaWallet) {\n setIsConnected(true);\n }\n }, [dynamicSdkHasLoaded, nordUser, solanaWallet, setIsConnected]);\n\n useEffect(() => {\n setPreferredWalletNetwork(context.entryNetwork);\n }, [context.entryNetwork, setPreferredWalletNetwork]);\n\n useEffect(() => {\n const inTurnkeyState =\n state === OnboardingStep.TURNKEY_AUTH ||\n state === OnboardingStep.TURNKEY_PREPARING;\n\n // If we are in DEPOSIT_PROGRESS (e.g. recovering a bridge deposit),\n // do not allow Turnkey status updates to hijack the view.\n // Authentication happens in the background.\n if (state === OnboardingStep.DEPOSIT_PROGRESS) {\n return;\n }\n\n if (!turnkeyEnabled || context.entryNetwork === 'solana') {\n if (inTurnkeyState) {\n flowActions.returnToWalletConnection();\n }\n return;\n }\n\n if (turnkeyStatus === 'authenticating') {\n if (state !== OnboardingStep.TURNKEY_AUTH) {\n flowActions.enterTurnkeyAuth();\n }\n return;\n }\n\n if (turnkeyStatus === 'creating') {\n if (state !== OnboardingStep.TURNKEY_PREPARING) {\n flowActions.enterTurnkeyPreparing();\n }\n return;\n }\n\n if (\n turnkeyStatus === 'ready' &&\n (state === OnboardingStep.TURNKEY_AUTH || state === OnboardingStep.TURNKEY_PREPARING)\n ) {\n // When Turnkey bootstrap completes, return to CONNECTING_WALLET\n // instead of jumping to CHAIN_SELECTION. The async nordUser\n // processing effect will decide the final destination (completeFlow\n // for returning users, or goToChainSelection for new/deposit flows).\n flowActions.returnToWalletConnection();\n return;\n }\n\n if (turnkeyStatus === 'error') {\n // Only set error state if we're actively in the Turnkey flow, not if user has reset\n const isInTurnkeyFlow =\n state === OnboardingStep.CONNECTING_WALLET ||\n state === OnboardingStep.TURNKEY_AUTH ||\n state === OnboardingStep.TURNKEY_PREPARING;\n\n if (isInTurnkeyFlow) {\n logger.logError(createWalletError('CONNECT_FAILED', turnkeyError || 'Turnkey initialization failed'));\n flowActions.setErrorState(new Error(turnkeyError || 'Turnkey initialization failed'));\n }\n return;\n }\n }, [turnkeyStatus, turnkeyEnabled, flowActions, state, context.entryNetwork]);\n\n // If the user picked the EVM path but Dynamic silently restored a Solana session,\n // clear it so the widget can prompt for an EVM wallet instead of hijacking with Phantom.\n useEffect(() => {\n if (context.entryNetwork !== 'evm') {\n return;\n }\n if (!solanaWallet) {\n return;\n }\n const walletChain = solanaWallet.chain\n ? String(solanaWallet.chain).toUpperCase()\n : '';\n const isTurnkeySolana = solanaWallet?.type === 'turnkey' && walletChain.startsWith('SOL');\n const isSolanaWallet = walletChain.startsWith('SOL');\n if (!isSolanaWallet || isTurnkeySolana) {\n return;\n }\n\n logger.debug('Solana wallet restored during EVM entry; clearing Dynamic session');\n if (dynamicHandleLogOut) {\n dynamicHandleLogOut().catch((error: unknown) => {\n logger.warn('Failed to log out of restored Solana wallet', error);\n });\n }\n setSolanaWallet(null);\n setSolanaAddress('');\n setEvmWallet(null);\n setEvmAddress(null);\n setEvmChain(null);\n }, [\n context.entryNetwork,\n dynamicHandleLogOut,\n solanaWallet,\n logger,\n setSolanaAddress,\n setSolanaWallet,\n setEvmAddress,\n setEvmChain,\n setEvmWallet,\n ]);\n\n /**\n * Connect wallet using Dynamic widget\n */\n const connectWallet = useCallback(async () => {\n if (isConnecting || !showDynamicWidget || !dynamicSdkHasLoaded) return;\n\n const wantsEvm = context.entryNetwork === 'evm';\n const walletChain = solanaWallet?.chain ? String(solanaWallet.chain).toUpperCase() : '';\n const isTurnkeySolana =\n solanaWallet?.type === 'turnkey' && walletChain.startsWith('SOL');\n const hasSolanaWallet = walletChain.startsWith('SOL') && !isTurnkeySolana;\n const hasEvmWallet = Boolean(evmWalletAddress);\n\n if (wantsEvm && hasSolanaWallet && dynamicHandleLogOut) {\n // If a Solana wallet was silently restored but the user chose the EVM path,\n // clear the stale session so they can pick an EVM wallet.\n try {\n await dynamicHandleLogOut();\n } catch (error) {\n logger.warn('Failed to log out of existing Solana wallet before EVM connect', error);\n }\n }\n\n const hasMatchingWallet =\n (context.entryNetwork === 'solana' &&\n (walletChain.startsWith('SOL') || isTurnkeySolana)) ||\n (context.entryNetwork === 'evm' && hasEvmWallet);\n\n if (hasMatchingWallet) {\n logger.debug('Wallet already available for selected entry; skipping widget open', {\n entryNetwork: context.entryNetwork,\n hasEvmWallet,\n turnkeyEnabled,\n turnkeyStatus,\n });\n // Wallet is already connected - need to proceed to next step\n // For EVM with Turnkey: the turnkeyStatus effect will handle transition\n // For Solana: need to trigger chain selection\n if (context.entryNetwork === 'solana') {\n flowActions.goToChainSelection();\n }\n // For EVM: Turnkey bootstrap should already be running via TurnkeyProvider effect\n // If it's not, we may need to trigger it - log current status for debugging\n if (context.entryNetwork === 'evm' && turnkeyEnabled) {\n logger.debug('EVM wallet connected, waiting for Turnkey bootstrap', {\n turnkeyStatus,\n turnkeyError,\n });\n }\n return;\n }\n\n // Prevent rapid re-opening of Dynamic widget (cooldown: 3 seconds)\n const now = Date.now();\n const timeSinceLastOpen = now - lastDynamicOpenTimeRef.current;\n if (timeSinceLastOpen < 3000) {\n logger.debug('Skipping Dynamic widget open - cooldown active', {\n timeSinceLastOpen,\n });\n setIsConnecting(false);\n return;\n }\n\n setIsConnecting(true);\n logger.event(createWalletEvent(EVENTS.WALLET.CONNECT_START, {\n network: context.entryNetwork,\n }));\n\n dynamicWidgetRequestedRef.current = true;\n lastDynamicOpenTimeRef.current = now;\n\n try {\n await showDynamicWidget(true);\n logger.debug('Dynamic widget shown');\n } catch (error) {\n dynamicWidgetRequestedRef.current = false;\n setIsConnecting(false);\n logger.logError(createWalletError('CONNECT_FAILED', 'Dynamic widget could not be shown', {\n cause: error instanceof Error ? error : undefined,\n context: { network: context.entryNetwork },\n }));\n }\n }, [\n context.entryNetwork,\n dynamicHandleLogOut,\n dynamicSdkHasLoaded,\n solanaWallet,\n evmWalletAddress,\n isConnecting,\n showDynamicWidget,\n ]);\n\n useEffect(() => {\n if (!dynamicSdkHasLoaded) {\n return;\n }\n\n if (nord) {\n reportedNordClientErrorRef.current = false;\n return;\n }\n\n if (nord == null) {\n // Nord client is still initializing; wait before reporting an error\n return;\n }\n\n if (reportedNordClientErrorRef.current) {\n setIsConnecting(false);\n return;\n }\n\n reportedNordClientErrorRef.current = true;\n setIsConnecting(false);\n flowActions.setErrorState(\n new Error(\n 'The client could not be initialized. Verify your Nord environment variables and try again.'\n )\n );\n }, [dynamicSdkHasLoaded, nord, flowActions]);\n\n // Process nordUser changes\n useEffect(() => {\n if (!dynamicSdkHasLoaded || !nordUser || !solanaWallet) return;\n // Don't process when modal is closed — avoids re-triggering flow transitions\n // after the reset-on-close puts state back to ENTRY_SELECTION.\n if (!showLogin) return;\n\n // Early exit if we have a pending bridge deposit - don't run any transition logic\n const pendingEarlyCheck = readPendingDeposit();\n logger.info('[WalletConnection] Early exit check for pending deposit', {\n pendingEarlyCheck,\n pendingStringified: JSON.stringify(pendingEarlyCheck),\n hasPendingEarly: !!pendingEarlyCheck,\n currentState: state,\n });\n\n const hasPendingBridgeEarly = pendingEarlyCheck &&\n (pendingEarlyCheck.stage === 'bridge_submitted' ||\n pendingEarlyCheck.stage === 'bridge_confirmed' ||\n (pendingEarlyCheck.stage === 'failed' && pendingEarlyCheck.tx)) &&\n pendingEarlyCheck.tx;\n\n logger.info('[WalletConnection] Early exit check result', {\n hasPendingBridgeEarly,\n pendingStage: pendingEarlyCheck?.stage,\n pendingTx: !!pendingEarlyCheck?.tx,\n pendingTxValue: pendingEarlyCheck?.tx,\n });\n\n if (hasPendingBridgeEarly) {\n logger.info('[WalletConnection] Effect early exit: pending bridge deposit detected, skipping all logic', {\n pendingStage: pendingEarlyCheck.stage,\n pendingTx: pendingEarlyCheck.tx,\n currentState: state,\n });\n return;\n }\n\n const currentNordUser = nordUser;\n const prevNordUser = prevNordUserRef.current;\n const currentSessionId = currentNordUser.sessionId\n ? currentNordUser.sessionId.toString()\n : null;\n const prevSessionId = prevSessionIdRef.current;\n const walletAddress = solanaWallet.address ?? null;\n const hasProcessedWallet =\n walletAddress != null && processedWalletAddressRef.current === walletAddress;\n\n // Early return if nothing meaningful changed\n if (\n currentNordUser === prevNordUser &&\n currentSessionId === prevSessionId &&\n hasProcessedWallet\n ) {\n return;\n }\n\n // Check cache FIRST (synchronously) before starting any async work\n const cached = getUserCacheRef.current;\n const now = Date.now();\n const isCacheValid = cached &&\n cached.address === walletAddress &&\n (now - cached.timestamp) < GET_USER_CACHE_TTL_MS;\n\n // Check if we've already processed this exact combination (prevents rapid re-processing)\n const lastProcessed = lastProcessedGetUserRef.current;\n const isSameState = lastProcessed &&\n lastProcessed.nordUser === currentNordUser &&\n lastProcessed.sessionId === currentSessionId &&\n lastProcessed.address === walletAddress;\n\n // If we have valid cache AND same state, skip entirely\n if (isCacheValid && isSameState) {\n logger.debug('NordUser changed, cache valid and same state, skipping duplicate processing', {\n cacheAge: `${now - cached.timestamp}ms`,\n });\n return;\n }\n\n // If we have valid cache but different state, we can still use cache but need to process\n // If we have in-flight request, wait for it instead of starting new one\n if (getUserInFlightRef.current && !isCacheValid) {\n logger.debug('NordUser changed, getUser already in flight, skipping duplicate call');\n return;\n }\n\n // Prevent concurrent execution\n if (getUserInFlightRef.current) {\n logger.debug('NordUser changed, getUser already in flight, skipping');\n return;\n }\n\n prevNordUserRef.current = currentNordUser;\n prevSessionIdRef.current = currentSessionId;\n if (walletAddress) {\n // Clear getUser cache if wallet address changed\n const isNewWallet = processedWalletAddressRef.current !== walletAddress;\n if (isNewWallet) {\n getUserCacheRef.current = null;\n logger.debug('Wallet address changed, cleared getUser cache');\n\n // Log wallet connect success when a new wallet is processed\n const isSolana = solanaWallet?.chain ? String(solanaWallet.chain).toUpperCase().startsWith('SOL') : false;\n logger.event(createWalletEvent(EVENTS.WALLET.CONNECT_SUCCESS, {\n address: walletAddress,\n network: isSolana ? 'solana' : 'evm',\n }));\n\n // Clear orphaned pending deposit if it belongs to a different wallet\n const pending = readPendingDeposit();\n if (pending && pending.wallet) {\n const pendingWalletLower = pending.wallet.toLowerCase();\n const currentWalletLower = walletAddress.toLowerCase();\n if (pendingWalletLower !== currentWalletLower) {\n clearPendingDeposit();\n logger.debug('Cleared orphaned pending deposit from different wallet', {\n pendingWallet: pending.wallet.substring(0, 10) + '...',\n currentWallet: walletAddress.substring(0, 10) + '...',\n });\n }\n }\n }\n processedWalletAddressRef.current = walletAddress;\n }\n\n // Mark this combination as being processed\n lastProcessedGetUserRef.current = {\n nordUser: currentNordUser,\n sessionId: currentSessionId,\n address: walletAddress ?? '',\n };\n\n // Only run if we have processed a wallet\n if (solanaWallet) {\n logger.debug('NordUser changed, checking account status', {\n sessionIdChanged: currentSessionId !== prevSessionId,\n nordUserChanged: currentNordUser !== prevNordUser,\n walletChanged: processedWalletAddressRef.current !== walletAddress,\n hasCache: Boolean(cached),\n cacheValid: isCacheValid,\n });\n\n const runGetUser = (async () => {\n try {\n if (!nord) {\n throw new Error('Nord client is not available.');\n }\n\n let nordAccount;\n\n // Check cache again inside async function (in case it was set by concurrent call)\n const cachedInside = getUserCacheRef.current;\n const nowInside = Date.now();\n const isCacheValidInside = cachedInside &&\n cachedInside.address === solanaWallet.address &&\n (nowInside - cachedInside.timestamp) < GET_USER_CACHE_TTL_MS;\n\n if (isCacheValidInside) {\n logger.debug('NordUser changed, using cached getUser result (checked inside async)', {\n cacheAge: `${nowInside - cachedInside.timestamp}ms`,\n });\n nordAccount = cachedInside.result;\n } else {\n logger.debug('NordUser changed, calling getUser (cache miss or expired)', {\n hasCache: Boolean(cachedInside),\n cacheAddress: cachedInside?.address?.substring(0, 10) + \"...\",\n currentAddress: solanaWallet.address?.substring(0, 10) + \"...\",\n });\n const getUserPromise = nord.getUser({ pubkey: solanaWallet.address });\n getUserInFlightRef.current = getUserPromise;\n nordAccount = await getUserPromise;\n\n // Cache the result immediately\n getUserCacheRef.current = {\n address: solanaWallet.address,\n result: nordAccount,\n timestamp: Date.now(),\n };\n }\n\n let hasNordAccount = nordAccount != null;\n let hasActiveSession = false;\n let hasRecentDeposit = false;\n\n // If API says no account but we have a recent successful deposit record,\n // trust the deposit record (API might not have indexed yet)\n if (!hasNordAccount) {\n try {\n const lastDeposit = readLastDepositRecord(solanaWallet.address);\n\n if (lastDeposit) {\n const depositAge = Date.now() - lastDeposit.timestamp;\n const RECENT_DEPOSIT_THRESHOLD = 5 * 60 * 1000; // 5 minutes\n if (depositAge < RECENT_DEPOSIT_THRESHOLD) {\n logger.debug('Recent successful deposit found - treating as Nord account holder', {\n depositAge: Math.floor(depositAge / 1000) + 's',\n transactionId: lastDeposit.transactionId,\n });\n hasNordAccount = true;\n hasRecentDeposit = true;\n // Assume session is active since we just deposited\n hasActiveSession = true;\n }\n }\n } catch (storageError) {\n logger.warn('Failed to read last deposit record', storageError);\n }\n }\n\n // Always check API sessions, but only apply them if we're not using recent deposit data\n let sessionId = currentNordUser.sessionId;\n let sessionIdString = sessionId ? sessionId.toString() : null;\n const serverSessions = nordAccount?.sessions ?? {};\n let sessionMatchesServer =\n sessionIdString != null && Boolean(serverSessions?.[sessionIdString]);\n\n // Check for active sessions directly via API endpoint if we don't have a stored sessionId\n // This allows us to detect sessions even if the user hasn't gone through the deposit flow\n if (!sessionIdString && solanaWallet.address && !hasRecentDeposit) {\n try {\n const { getActiveSessionId } = await import('../../../utils/nordApi');\n const apiSessionId = await getActiveSessionId(solanaWallet.address);\n if (apiSessionId) {\n logger.info('[WalletConnection] Found active session via API endpoint', {\n sessionId: apiSessionId,\n });\n sessionIdString = apiSessionId;\n hasActiveSession = true;\n hasNordAccount = true; // If they have a session, they have an account\n\n // Store the session ID in localStorage for future use\n if (typeof window !== 'undefined') {\n try {\n const sessionIdKey = `n1_sessionId_${solanaWallet.address}`;\n window.localStorage.setItem(sessionIdKey, apiSessionId);\n logger.debug('[WalletConnection] Stored session ID from API to localStorage');\n } catch (storageError) {\n logger.warn('[WalletConnection] Failed to store session ID', storageError);\n }\n }\n }\n } catch (apiError) {\n logger.warn('[WalletConnection] Failed to check API sessions', apiError);\n // Fall back to existing logic\n }\n }\n\n // Only override hasActiveSession if we're not using recent deposit data\n if (!hasRecentDeposit && sessionIdString && !hasActiveSession) {\n hasActiveSession = sessionMatchesServer;\n\n // Clear stale session if server doesn't recognize it\n if (sessionIdString && !sessionMatchesServer) {\n logger.debug('Stored session is missing on Nord; clearing cached session ID');\n if (typeof window !== 'undefined') {\n try {\n const sessionIdKey = `n1_sessionId_${solanaWallet.address}`;\n window.localStorage.removeItem(sessionIdKey);\n } catch (storageError) {\n logger.warn('Failed to clear stale sessionId from localStorage', storageError);\n }\n }\n }\n }\n\n // Check if the Nord account has any existing token balance\n // nordAccount.balances is an array of { tokenId, token, amount }\n const accountBalances = (nordAccount as any)?.balances ?? [];\n const hasExistingBalance = Array.isArray(accountBalances) &&\n accountBalances.some((b: any) => typeof b?.amount === 'number' && b.amount > 0);\n\n updateContext({ hasNordAccount, hasActiveSession, hasExistingBalance });\n\n logger.debug('Nord account check', {\n walletAddress: solanaWallet.address,\n hasNordAccount,\n hasActiveSession,\n hasExistingBalance,\n balanceCount: accountBalances.length,\n sessionId: sessionIdString,\n serverSessions: Object.keys(serverSessions ?? {}),\n });\n\n // Early check for pending bridge deposits - prevent any transitions if we need to resume\n const pending = readPendingDeposit();\n logger.info('[WalletConnection] Raw pending deposit check', {\n pending,\n pendingStringified: JSON.stringify(pending),\n hasPending: !!pending,\n });\n\n const hasPendingBridgeDeposit = pending &&\n (pending.stage === 'bridge_submitted' ||\n pending.stage === 'bridge_confirmed' ||\n (pending.stage === 'failed' && pending.tx)) &&\n pending.tx;\n\n logger.info('[WalletConnection] Checking for pending bridge deposit', {\n hasPending: !!pending,\n pendingStage: pending?.stage,\n pendingTx: !!pending?.tx,\n pendingTxValue: pending?.tx,\n hasPendingBridgeDeposit,\n currentState: state,\n stageMatch: pending ? (pending.stage === 'bridge_submitted' || pending.stage === 'bridge_confirmed' || (pending.stage === 'failed' && pending.tx)) : false,\n stageCheck: pending ? {\n isBridgeSubmitted: pending.stage === 'bridge_submitted',\n isBridgeConfirmed: pending.stage === 'bridge_confirmed',\n isFailedWithTx: pending.stage === 'failed' && pending.tx,\n } : null,\n });\n\n if (hasPendingBridgeDeposit) {\n // Only transition to DEPOSIT_PROGRESS if solanaWallet is ready (needed for claim signing)\n if (!solanaWallet) {\n logger.info('[WalletConnection] Pending bridge deposit detected but solanaWallet not ready - waiting', {\n pendingStage: pending.stage,\n pendingTx: pending.tx,\n currentState: state,\n hasSolanaWallet: !!solanaWallet,\n });\n return;\n }\n\n logger.info('[WalletConnection] Pending bridge deposit detected, transitioning to DEPOSIT_PROGRESS', {\n pendingStage: pending.stage,\n pendingTx: pending.tx,\n currentState: state,\n hasSolanaWallet: !!solanaWallet,\n });\n closeDynamicWidget();\n setIsConnecting(false);\n // Transition directly to DEPOSIT_PROGRESS\n if (state !== OnboardingStep.DEPOSIT_PROGRESS) {\n flowActions.startDeposit();\n }\n return;\n }\n\n // Use stateRef.current to read the LIVE state, not the stale\n // closure value which may still be CONNECTING_WALLET even though\n // other effects have already advanced the state.\n const liveState = stateRef.current;\n\n if (\n isWalletConnectionStep(liveState) &&\n !context.isDepositOnlyFlow\n ) {\n try {\n // Only restore last deposit if there's NO active pending deposit.\n // If there's a pending deposit in progress, let the deposit flow handle it\n // to avoid race conditions with finalizeBridgeSuccess.\n const activePending = readPendingDeposit();\n const hasActivePendingDeposit = activePending?.depositId &&\n activePending.stage !== 'solana_confirmed' &&\n activePending.stage !== 'failed';\n\n if (hasActivePendingDeposit) {\n logger.debug('Skipping last deposit restore - active pending deposit exists', {\n pendingStage: activePending?.stage,\n pendingId: activePending?.depositId,\n });\n } else {\n const lastDepositRecord = readLastDepositRecord(solanaWallet.address);\n if (lastDepositRecord) {\n // Only show success screen if deposit was recent (within 2 minutes)\n // This prevents showing the success screen every time user reconnects\n const depositAge = Date.now() - lastDepositRecord.timestamp;\n const SHOW_SUCCESS_THRESHOLD = 2 * 60 * 1000; // 2 minutes\n\n if (depositAge < SHOW_SUCCESS_THRESHOLD) {\n logger.debug('Showing recent deposit success from local storage', {\n depositAge: Math.floor(depositAge / 1000) + 's',\n transactionId: lastDepositRecord.transactionId,\n });\n flowActions.markDepositSuccess({\n transactionId: lastDepositRecord.transactionId,\n record: lastDepositRecord,\n });\n closeDynamicWidget();\n setIsConnecting(false);\n return;\n } else {\n logger.debug('Last deposit too old to show success screen - treating as existing balance', {\n depositAge: Math.floor(depositAge / 1000) + 's',\n });\n // Fall through to normal flow - user already saw success screen\n }\n }\n }\n } catch (error) {\n logger.logError(createWalletError('ADAPTER_ERROR', 'Error restoring last deposit record', {\n cause: error instanceof Error ? error : undefined,\n }));\n }\n }\n\n // Unless this is an explicit deposit-only flow, just close the\n // modal after connecting. Deposits, withdrawals, and other actions\n // are triggered manually by the host application.\n if (!context.isDepositOnlyFlow) {\n logger.info('[WalletConnection] Completing flow after wallet connect', {\n hasNordAccount,\n hasActiveSession,\n hasExistingBalance,\n isDepositOnlyFlow: context.isDepositOnlyFlow,\n });\n closeDynamicWidget();\n setIsConnecting(false);\n flowActions.completeFlow({\n hasNordAccount,\n hasActiveSession,\n });\n return;\n }\n\n // Deposit-only flow: route to chain selection\n closeDynamicWidget();\n\n try {\n // Check for pending bridge deposits before transitioning\n const pendingCheck = readPendingDeposit();\n const hasPendingBridgeDepositCheck = pendingCheck &&\n (pendingCheck.stage === 'bridge_submitted' ||\n pendingCheck.stage === 'bridge_confirmed' ||\n (pendingCheck.stage === 'failed' && pendingCheck.tx)) &&\n pendingCheck.tx;\n\n const finalState = stateRef.current;\n\n // Don't regress if state has already advanced past chain selection\n const isAlreadyPastChainSelection =\n finalState === OnboardingStep.AMOUNT_INPUT ||\n finalState === OnboardingStep.DEPOSIT_PROGRESS ||\n finalState === OnboardingStep.DEPOSIT_SUCCESS ||\n finalState === OnboardingStep.AUTH_LOADING ||\n finalState === OnboardingStep.FINAL_SUCCESS;\n\n if (isAlreadyPastChainSelection || hasPendingBridgeDepositCheck) {\n logger.info('[WalletConnection] Skipping transition to CHAIN_SELECTION', {\n reason: isAlreadyPastChainSelection\n ? `state already at ${finalState}`\n : 'pending bridge deposit detected',\n state: finalState,\n hasPendingBridgeDepositCheck,\n pendingStage: pendingCheck?.stage,\n });\n } else if (context.entryNetwork === 'solana') {\n logger.debug('Proceeding directly to Solana amount entry');\n flowActions.selectChain({\n id: 'solana',\n name: 'Solana',\n network: SolanaNetwork.MAINNET,\n });\n } else {\n logger.debug('Attempting transition to ' + OnboardingStep.CHAIN_SELECTION, {\n fromState: finalState,\n });\n flowActions.goToChainSelection();\n }\n } catch (error) {\n logger.logError(createWalletError('ADAPTER_ERROR', 'Error during transition', {\n cause: error instanceof Error ? error : undefined,\n }));\n } finally {\n setIsConnecting(false);\n }\n } catch (error) {\n logger.logError(createWalletError('ADAPTER_ERROR', 'Error checking account status', {\n cause: error instanceof Error ? error : undefined,\n }));\n closeDynamicWidget();\n setIsConnecting(false);\n } finally {\n getUserInFlightRef.current = null;\n }\n })();\n\n getUserInFlightRef.current = runGetUser;\n }\n }, [\n nord,\n nordUser,\n solanaWallet,\n updateContext,\n flowActions,\n state,\n dynamicSdkHasLoaded,\n context.isDepositOnlyFlow,\n // Removed nordUser?.sessionId - it's redundant since nordUser is already in deps\n closeDynamicWidget,\n context.entryNetwork,\n showLogin,\n ]);\n\n\n\n\n // Handle Dynamic widget closing while still connecting.\n // If the Nord modal is gone, make sure we reset any pending Dynamic state\n // so a subsequent open can trigger the widget again.\n useEffect(() => {\n if (showLogin) {\n return;\n }\n\n if (dynamicWidgetRequestedRef.current) {\n closeDynamicWidget();\n }\n\n if (isConnecting) {\n logger.debug('Wallet modal closed before connection completed; resetting state');\n setIsConnecting(false);\n }\n }, [isConnecting, showLogin, closeDynamicWidget]);\n\n // Handle connecting state changes in a separate effect\n useEffect(() => {\n const currentState = state;\n const prevState = prevStateRef.current;\n\n // Only run if state has changed\n if (currentState !== prevState) {\n if (!isWalletConnectionStep(currentState) && isConnecting) {\n // If we're no longer in the connecting state, reset the connecting flag\n setIsConnecting(false);\n }\n\n // Update ref\n prevStateRef.current = currentState;\n }\n }, [state, isConnecting]);\n\n // Create the context value\n const contextValue: WalletConnectionContextValue = {\n isConnecting,\n connectWallet,\n disconnectWallet,\n turnkeyEnabled,\n turnkeyStatus,\n turnkeyError,\n retryTurnkeyBootstrap,\n turnkeyAddress,\n signTransaction: solanaWallet?.connector?.signTransaction\n };\n\n return (\n <WalletConnectionContext.Provider value={contextValue}>\n {children}\n </WalletConnectionContext.Provider>\n );\n};\n\n/**\n * Custom hook to use the wallet connection context\n * @returns The wallet connection context value\n * @throws Error if used outside of a WalletConnectionProvider\n */\nexport const useWalletConnection = (): WalletConnectionContextValue => {\n const context = useContext(WalletConnectionContext);\n\n if (context === undefined) {\n throw new Error('useWalletConnection must be used within a WalletConnectionProvider');\n }\n\n return context;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"WalletConnectionProvider.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/providers/WalletConnectionProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTurnkey } from '../../../turnkey';\nimport { useN1WalletContext } from '../../../hooks';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { useSession } from '../../../providers/N1WalletProvider/SessionProvider';\nimport { useModal, useModalActions } from '../../../providers/N1WalletProvider/ModalProvider';\nimport { useSigningActions } from '../../../providers/N1WalletProvider/SigningProvider';\nimport { getWalletActions } from '../../../store';\nimport { logger } from '../../../utils/logger';\nimport { EVENTS, createWalletEvent } from '../../../utils/events';\nimport { createWalletError } from '../../../utils/errors';\nimport { OnboardingStep, initialOnboardingContext } from '../types';\nimport { useOnboardingState } from './OnboardingStateProvider';\nimport { clearLastDepositRecord, readLastDepositRecord, readPendingDeposit } from '../utils/deposit/storage';\nimport { N1ModalViewMode } from '../../../types/wallet';\nimport { removeKeysFromLocalStorage } from '../utils/utils';\nimport { SolanaNetwork } from '../../../config/solana';\nimport { clearSession, clearPendingDeposit } from '../../../services/bootstrap';\n\ntype TurnkeyBootstrapStatus =\n | 'idle'\n | 'authenticating'\n | 'creating'\n | 'ready'\n | 'error';\nconst WALLET_CONNECTION_STEPS = new Set<OnboardingStep>([\n OnboardingStep.CONNECTING_WALLET,\n OnboardingStep.TURNKEY_AUTH,\n OnboardingStep.TURNKEY_PREPARING,\n]);\nconst isWalletConnectionStep = (step: OnboardingStep): boolean =>\n WALLET_CONNECTION_STEPS.has(step);\n\nconst useOptionalTurnkey = () => {\n try {\n return useTurnkey();\n } catch {\n return null;\n }\n};\n\nexport const FLOW_STATE_STORAGE_KEY = 'n1_wallet_connection_flow_state';\n// Define the shape of the context value\nexport interface WalletConnectionContextValue {\n isConnecting: boolean;\n connectWallet: () => Promise<void>;\n disconnectWallet: () => void;\n turnkeyEnabled: boolean;\n turnkeyStatus: TurnkeyBootstrapStatus;\n turnkeyError: string | null;\n retryTurnkeyBootstrap: () => void;\n turnkeyAddress: string | null;\n signTransaction?: (transaction: any) => Promise<any>;\n}\n\n// Create the context with a default value\nconst WalletConnectionContext = createContext<WalletConnectionContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface WalletConnectionProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the wallet connection context\n */\nexport const WalletConnectionProvider: React.FC<WalletConnectionProviderProps> = ({\n children,\n}) => {\n // Use new providers for wallet/session/modal state\n const {\n solanaAddress,\n solanaWallet,\n evmWallet,\n setSolanaAddress,\n setSolanaWallet,\n setEvmWallet,\n setEvmAddress,\n setEvmChain,\n setPreferredWalletNetwork,\n setBalances,\n } = useNetwork();\n const {\n nordUser,\n dynamicSdkHasLoaded,\n turnkeyEnabled,\n setIsConnected,\n setNordUser,\n setSessionPubKey,\n setWalletPubKey,\n } = useSession();\n const {\n showLogin,\n closeModal,\n onCloseComplete,\n showDynamicWidget,\n dynamicHandleLogOut,\n setViewMode,\n } = useModal();\n\n // nord client still comes from legacy context (passed as prop)\n const { nord } = useN1WalletContext();\n // Signing setters from SigningProvider\n const { setSignMessageWithSessionKey, setSignMessageWithWalletKey, setSignTransactionWithWalletKey } = useSigningActions();\n // Disconnect handler from ModalProvider\n const { setDisconnectWalletHandler } = useModalActions();\n\n // Get flow context\n const {\n state,\n context,\n actions: flowActions,\n updateContext,\n } = useOnboardingState();\n\n const [isConnecting, setIsConnecting] = useState(false);\n const dynamicWidgetRequestedRef = useRef(false);\n const lastDynamicOpenTimeRef = useRef<number>(0);\n const skipAutoResumeRef = useRef(false);\n const turnkeyContext = useOptionalTurnkey();\n const turnkey = turnkeyEnabled ? turnkeyContext : null;\n const previousEvmWalletAddressRef = useRef<string | null>(null);\n const turnkeyAuthenticatedEvmAddressRef = useRef<string | null>(null);\n const lastConnectedWalletRef = useRef<{ evm: string | null; solana: string | null }>({\n evm: null,\n solana: null,\n });\n const getUserCacheRef = useRef<{ address: string; result: any; timestamp: number } | null>(null);\n const getUserInFlightRef = useRef<Promise<any> | null>(null);\n const lastProcessedGetUserRef = useRef<{ nordUser: any; sessionId: string | null; address: string } | null>(null);\n const GET_USER_CACHE_TTL_MS = 10000; // Cache getUser results for 10 seconds\n\n const turnkeyStatus: TurnkeyBootstrapStatus =\n turnkey?.turnkeyStatus ?? (turnkeyEnabled ? 'idle' : 'ready');\n const turnkeyError: string | null = turnkey?.turnkeyError ?? null;\n const turnkeyAddress = turnkey?.turnkeyAddress ?? null;\n const retryTurnkeyBootstrap = turnkey?.retryTurnkeyBootstrap ?? (() => { });\n const prepareTurnkeyWallet = turnkey?.prepareTurnkeyWallet;\n\n const evmWalletAddress = useMemo(\n () => evmWallet?.address?.toLowerCase?.() ?? null,\n [evmWallet?.address]\n );\n const solanaWalletAddress = useMemo(\n () => solanaWallet?.address ?? null,\n [solanaWallet?.address]\n );\n\n // Auto-resume the flow if a wallet was restored so we don't strand users on EntrySelection\n useEffect(() => {\n if (!dynamicSdkHasLoaded) {\n return;\n }\n // Don't auto-resume when the modal is closed — the reset on modal\n // close puts state back to ENTRY_SELECTION, but we don't want to\n // re-trigger the connection flow until the user actually opens the modal.\n if (!showLogin) {\n return;\n }\n if (skipAutoResumeRef.current) {\n logger.debug('[WalletConnection] Skipping auto-resume after wallet switch');\n skipAutoResumeRef.current = false;\n return;\n }\n if (context.entryNetwork) {\n return;\n }\n if (state !== OnboardingStep.ENTRY_SELECTION) {\n return;\n }\n\n // Skip auto-resume if Turnkey is in error state - let the retry handle it first\n if (turnkeyEnabled && turnkeyStatus === 'error') {\n logger.debug('[WalletConnection] Skipping auto-resume - Turnkey in error state, waiting for retry');\n return;\n }\n\n const walletChain = solanaWallet?.chain\n ? String(solanaWallet.chain).toUpperCase()\n : '';\n const restoredNetwork =\n evmWallet || walletChain.startsWith('ETH') || walletChain.startsWith('ARB') || walletChain.startsWith('BASE')\n ? 'evm'\n : walletChain.startsWith('SOL')\n ? 'solana'\n : null;\n\n if (!restoredNetwork) {\n return;\n }\n\n logger.debug(\"[WalletConnection] Auto-selecting entry network from restored wallet\", {\n restoredNetwork,\n hasEvmWallet: Boolean(evmWallet),\n walletChain,\n });\n flowActions.beginWalletConnection(restoredNetwork as 'evm' | 'solana');\n }, [context.entryNetwork, dynamicSdkHasLoaded, solanaWallet, evmWallet, flowActions, state, turnkeyEnabled, turnkeyStatus, showLogin]);\n\n // Skip CONNECTING_WALLET if wallet already exists for the selected entry network\n useEffect(() => {\n if (state !== OnboardingStep.CONNECTING_WALLET) {\n return;\n }\n if (!context.entryNetwork) {\n return;\n }\n if (!dynamicSdkHasLoaded) {\n return;\n }\n\n const walletChain = solanaWallet?.chain ? String(solanaWallet.chain).toUpperCase() : '';\n const isTurnkeySolana = solanaWallet?.type === 'turnkey' && walletChain.startsWith('SOL');\n const hasSolanaWallet = walletChain.startsWith('SOL') && !isTurnkeySolana;\n const hasEvmWallet = Boolean(evmWalletAddress);\n\n const hasMatchingWallet =\n (context.entryNetwork === 'solana' && (hasSolanaWallet || isTurnkeySolana)) ||\n (context.entryNetwork === 'evm' && hasEvmWallet);\n\n if (hasMatchingWallet) {\n logger.debug('[WalletConnection] Wallet already connected for entry network, skipping CONNECTING_WALLET', {\n entryNetwork: context.entryNetwork,\n hasEvmWallet,\n hasSolanaWallet,\n isTurnkeySolana,\n });\n\n // Don't advance to CHAIN_SELECTION here — the async nordUser\n // processing effect will decide the final destination (either\n // completeFlow for returning users, or goToChainSelection for\n // new accounts / deposit-only flows). Advancing here causes a\n // brief flash of the chain selection screen for returning users.\n // For EVM with Turnkey, let the Turnkey status effect handle it.\n }\n }, [state, context.entryNetwork, dynamicSdkHasLoaded, solanaWallet, evmWalletAddress, flowActions, turnkeyEnabled, turnkeyStatus]);\n\n useEffect(() => {\n const { evm: previousEvm, solana: previousSolana } = lastConnectedWalletRef.current;\n const evmSwitched = Boolean(previousEvm && evmWalletAddress && previousEvm !== evmWalletAddress);\n const solanaSwitched = Boolean(\n previousSolana && solanaWalletAddress && previousSolana !== solanaWalletAddress\n );\n\n if (evmSwitched || solanaSwitched) {\n logger.debug('Wallet switch detected; resetting session and onboarding flow', {\n previousEvm,\n currentEvm: evmWalletAddress,\n previousSolana,\n currentSolana: solanaWalletAddress,\n });\n\n // Clear stale session state from the previous wallet so the new\n // wallet starts with a clean slate (nordUser, sessionPubKey,\n // isConnected, signing functions). Without this the widget ends\n // up showing address B but still holding address A's session.\n const storeActions = getWalletActions();\n storeActions.session.resetSession();\n storeActions.signing.resetSigning();\n\n // NOTE: Do NOT call clearSession() here. The stored Turnkey client\n // address in localStorage is needed by ensureCleanSessionForAddress()\n // (inside the bootstrap effect) to detect the user switch and call\n // client.logout() — which clears the old session from IndexedDB.\n // Clearing it prematurely causes isSessionForDifferentUser() to\n // return false, skipping the logout and leaving the old IndexedDB\n // session around, which breaks subsequent API calls.\n\n // Clear internal processing refs so the new wallet is treated\n // as a fresh connection rather than a no-op.\n processedWalletAddressRef.current = null;\n turnkeyAuthenticatedEvmAddressRef.current = null;\n\n skipAutoResumeRef.current = true;\n flowActions.resetFlow();\n }\n\n lastConnectedWalletRef.current = {\n evm: evmWalletAddress,\n solana: solanaWalletAddress,\n };\n }, [evmWalletAddress, solanaWalletAddress, flowActions]);\n\n useEffect(() => {\n if (!turnkeyEnabled) {\n return;\n }\n\n const previousAddress = previousEvmWalletAddressRef.current;\n if (previousAddress === evmWalletAddress) {\n return;\n }\n\n previousEvmWalletAddressRef.current = evmWalletAddress;\n turnkeyAuthenticatedEvmAddressRef.current = null;\n retryTurnkeyBootstrap();\n }, [evmWalletAddress, retryTurnkeyBootstrap, turnkeyEnabled]);\n\n // Use refs to track previous values\n const processedWalletAddressRef = useRef<string | null>(null);\n const prevNordUserRef = useRef(nordUser);\n const prevSessionIdRef = useRef<string | null>(\n nordUser?.sessionId ? nordUser.sessionId.toString() : null\n );\n const stateRef = useRef(state);\n useEffect(() => { stateRef.current = state; }, [state]);\n const prevStateRef = useRef(state);\n const reportedNordClientErrorRef = useRef(false);\n\n\n const closeDynamicWidget = useCallback(() => {\n if (!dynamicWidgetRequestedRef.current) {\n return;\n }\n\n if (showDynamicWidget) {\n try {\n showDynamicWidget(false);\n } catch (error) {\n logger.warn('Failed to close Dynamic widget', error);\n }\n }\n\n dynamicWidgetRequestedRef.current = false;\n }, [showDynamicWidget]);\n\n /**\n * Disconnect wallet\n */\n const disconnectWallet = useCallback(() => {\n // Capture addresses NOW before any state changes\n const solanaAddr = solanaWalletAddress || solanaAddress;\n const evmAddr = evmWalletAddress;\n const currentAddress = solanaAddr || evmAddr;\n\n logger.event(createWalletEvent(EVENTS.WALLET.DISCONNECT, {\n address: currentAddress,\n network: solanaAddr ? 'solana' : evmAddr ? 'evm' : null,\n }));\n\n // Clear internal refs FIRST\n processedWalletAddressRef.current = null;\n turnkeyAuthenticatedEvmAddressRef.current = null;\n previousEvmWalletAddressRef.current = null;\n\n // Reset all store state atomically using store actions\n // Do this BEFORE Dynamic handleLogOut to prevent race conditions\n const storeActions = getWalletActions();\n storeActions.session.resetSession(); // Clears: nordUser, sessionPubKey, walletPubKey, isConnected\n storeActions.wallet.resetWallet(); // Clears: solanaWallet, evmWallet, addresses, balances\n storeActions.signing.resetSigning(); // Clears: all signing functions\n\n // Reset flow state BEFORE clearing storage\n flowActions.resetFlow();\n\n // Reset onboarding context\n updateContext(initialOnboardingContext);\n\n try {\n // Clear localStorage using captured addresses (not state)\n if (typeof window !== 'undefined') {\n // Clear Solana session data\n if (solanaAddr) {\n const sessionIdKey = `n1_sessionId_${solanaAddr}`;\n window.localStorage.removeItem(sessionIdKey);\n removeKeysFromLocalStorage(solanaAddr);\n clearLastDepositRecord(solanaAddr);\n }\n\n // Clear EVM session data\n if (evmAddr) {\n const sessionIdKey = `n1_sessionId_${evmAddr}`;\n window.localStorage.removeItem(sessionIdKey);\n removeKeysFromLocalStorage(evmAddr);\n clearLastDepositRecord(evmAddr);\n }\n\n // Clear cached address\n window.localStorage.removeItem('n1_last_connected_address');\n\n // Clear flow state\n window.localStorage.removeItem(FLOW_STATE_STORAGE_KEY);\n }\n\n // Call Dynamic SDK handleLogOut AFTER our state is cleared\n // Force immediate disconnect to prevent silent re-authentication\n if (dynamicHandleLogOut) {\n dynamicHandleLogOut();\n }\n closeDynamicWidget();\n\n logger.debug('[Disconnect] Complete - all state cleared', {\n solanaAddress: solanaAddr || null,\n evmAddress: evmAddr || null,\n storeReset: true,\n flowReset: true,\n localStorageCleared: true,\n });\n } catch (error) {\n logger.logError(createWalletError('DISCONNECT_FAILED', 'Error during wallet disconnect', {\n cause: error instanceof Error ? error : undefined,\n context: { address: currentAddress },\n }));\n }\n\n // Reset UI state\n setViewMode(N1ModalViewMode.Automatic);\n // Close modal via state machine (triggers closing → closed transition)\n // Do NOT call onCloseComplete() here - it will be called automatically after the close animation\n closeModal();\n // Note: We intentionally do NOT clear pending deposit here.\n // The deposit is preserved in localStorage and will only be shown\n // if the user reconnects with the same wallet (validated by walletMatchesPendingDeposit).\n if (turnkeyEnabled) {\n // Clear the per-address session for the disconnecting wallet.\n // With per-address storage this only removes that wallet's session\n // data — other wallets' sessions are preserved.\n clearSession(evmAddr);\n }\n }, [\n solanaWalletAddress,\n solanaAddress,\n evmWalletAddress,\n closeDynamicWidget,\n dynamicHandleLogOut,\n updateContext,\n setViewMode,\n flowActions,\n turnkeyEnabled,\n closeModal,\n ]);\n\n useEffect(() => {\n // Don't wrap in arrow function - pass the function directly\n setDisconnectWalletHandler(disconnectWallet);\n }, [disconnectWallet, setDisconnectWalletHandler]);\n\n useEffect(() => {\n if (state === OnboardingStep.CONNECTING_WALLET) {\n processedWalletAddressRef.current = null;\n }\n }, [state]);\n\n useEffect(() => {\n if (\n !turnkeyEnabled ||\n !evmWallet ||\n context.entryNetwork !== 'evm' ||\n !prepareTurnkeyWallet ||\n turnkeyStatus !== 'idle'\n ) {\n return;\n }\n\n prepareTurnkeyWallet().catch((error) => {\n logger.logError(createWalletError('CONNECT_FAILED', 'Turnkey bootstrap failed', {\n cause: error instanceof Error ? error : undefined,\n }));\n });\n }, [\n context.entryNetwork,\n evmWallet,\n logger,\n prepareTurnkeyWallet,\n turnkeyEnabled,\n turnkeyStatus,\n ]);\n\n // Set isConnected whenever we have a valid wallet + nordUser, regardless\n // of whether the modal is open. This ensures the host app sees the correct\n // connection status even when the modal is closed.\n useEffect(() => {\n if (dynamicSdkHasLoaded && nordUser && solanaWallet) {\n setIsConnected(true);\n }\n }, [dynamicSdkHasLoaded, nordUser, solanaWallet, setIsConnected]);\n\n useEffect(() => {\n setPreferredWalletNetwork(context.entryNetwork);\n }, [context.entryNetwork, setPreferredWalletNetwork]);\n\n useEffect(() => {\n const inTurnkeyState =\n state === OnboardingStep.TURNKEY_AUTH ||\n state === OnboardingStep.TURNKEY_PREPARING;\n\n // If we are in DEPOSIT_PROGRESS (e.g. recovering a bridge deposit),\n // do not allow Turnkey status updates to hijack the view.\n // Authentication happens in the background.\n if (state === OnboardingStep.DEPOSIT_PROGRESS) {\n return;\n }\n\n if (!turnkeyEnabled || context.entryNetwork === 'solana') {\n if (inTurnkeyState) {\n flowActions.returnToWalletConnection();\n }\n return;\n }\n\n if (turnkeyStatus === 'authenticating') {\n if (state !== OnboardingStep.TURNKEY_AUTH) {\n flowActions.enterTurnkeyAuth();\n }\n return;\n }\n\n if (turnkeyStatus === 'creating') {\n if (state !== OnboardingStep.TURNKEY_PREPARING) {\n flowActions.enterTurnkeyPreparing();\n }\n return;\n }\n\n if (\n turnkeyStatus === 'ready' &&\n (state === OnboardingStep.TURNKEY_AUTH || state === OnboardingStep.TURNKEY_PREPARING)\n ) {\n // When Turnkey bootstrap completes, return to CONNECTING_WALLET\n // instead of jumping to CHAIN_SELECTION. The async nordUser\n // processing effect will decide the final destination (completeFlow\n // for returning users, or goToChainSelection for new/deposit flows).\n flowActions.returnToWalletConnection();\n return;\n }\n\n if (turnkeyStatus === 'error') {\n // Only set error state if we're actively in the Turnkey flow, not if user has reset\n const isInTurnkeyFlow =\n state === OnboardingStep.CONNECTING_WALLET ||\n state === OnboardingStep.TURNKEY_AUTH ||\n state === OnboardingStep.TURNKEY_PREPARING;\n\n if (isInTurnkeyFlow) {\n logger.logError(createWalletError('CONNECT_FAILED', turnkeyError || 'Turnkey initialization failed'));\n flowActions.setErrorState(new Error(turnkeyError || 'Turnkey initialization failed'));\n }\n return;\n }\n }, [turnkeyStatus, turnkeyEnabled, flowActions, state, context.entryNetwork]);\n\n // If the user picked the EVM path but Dynamic silently restored a Solana session,\n // clear it so the widget can prompt for an EVM wallet instead of hijacking with Phantom.\n useEffect(() => {\n if (context.entryNetwork !== 'evm') {\n return;\n }\n if (!solanaWallet) {\n return;\n }\n const walletChain = solanaWallet.chain\n ? String(solanaWallet.chain).toUpperCase()\n : '';\n const isTurnkeySolana = solanaWallet?.type === 'turnkey' && walletChain.startsWith('SOL');\n const isSolanaWallet = walletChain.startsWith('SOL');\n if (!isSolanaWallet || isTurnkeySolana) {\n return;\n }\n\n logger.debug('Solana wallet restored during EVM entry; clearing Dynamic session');\n if (dynamicHandleLogOut) {\n dynamicHandleLogOut().catch((error: unknown) => {\n logger.warn('Failed to log out of restored Solana wallet', error);\n });\n }\n setSolanaWallet(null);\n setSolanaAddress('');\n setEvmWallet(null);\n setEvmAddress(null);\n setEvmChain(null);\n }, [\n context.entryNetwork,\n dynamicHandleLogOut,\n solanaWallet,\n logger,\n setSolanaAddress,\n setSolanaWallet,\n setEvmAddress,\n setEvmChain,\n setEvmWallet,\n ]);\n\n /**\n * Connect wallet using Dynamic widget\n */\n const connectWallet = useCallback(async () => {\n if (isConnecting || !showDynamicWidget || !dynamicSdkHasLoaded) return;\n\n const wantsEvm = context.entryNetwork === 'evm';\n const walletChain = solanaWallet?.chain ? String(solanaWallet.chain).toUpperCase() : '';\n const isTurnkeySolana =\n solanaWallet?.type === 'turnkey' && walletChain.startsWith('SOL');\n const hasSolanaWallet = walletChain.startsWith('SOL') && !isTurnkeySolana;\n const hasEvmWallet = Boolean(evmWalletAddress);\n\n if (wantsEvm && hasSolanaWallet && dynamicHandleLogOut) {\n // If a Solana wallet was silently restored but the user chose the EVM path,\n // clear the stale session so they can pick an EVM wallet.\n try {\n await dynamicHandleLogOut();\n } catch (error) {\n logger.warn('Failed to log out of existing Solana wallet before EVM connect', error);\n }\n }\n\n const hasMatchingWallet =\n (context.entryNetwork === 'solana' &&\n (walletChain.startsWith('SOL') || isTurnkeySolana)) ||\n (context.entryNetwork === 'evm' && hasEvmWallet);\n\n if (hasMatchingWallet) {\n logger.debug('Wallet already available for selected entry; skipping widget open', {\n entryNetwork: context.entryNetwork,\n hasEvmWallet,\n turnkeyEnabled,\n turnkeyStatus,\n });\n // Wallet is already connected - need to proceed to next step\n // For EVM with Turnkey: the turnkeyStatus effect will handle transition\n // For Solana: need to trigger chain selection\n if (context.entryNetwork === 'solana') {\n flowActions.goToChainSelection();\n }\n // For EVM: Turnkey bootstrap should already be running via TurnkeyProvider effect\n // If it's not, we may need to trigger it - log current status for debugging\n if (context.entryNetwork === 'evm' && turnkeyEnabled) {\n logger.debug('EVM wallet connected, waiting for Turnkey bootstrap', {\n turnkeyStatus,\n turnkeyError,\n });\n }\n return;\n }\n\n // Prevent rapid re-opening of Dynamic widget (cooldown: 3 seconds)\n const now = Date.now();\n const timeSinceLastOpen = now - lastDynamicOpenTimeRef.current;\n if (timeSinceLastOpen < 3000) {\n logger.debug('Skipping Dynamic widget open - cooldown active', {\n timeSinceLastOpen,\n });\n setIsConnecting(false);\n return;\n }\n\n setIsConnecting(true);\n logger.event(createWalletEvent(EVENTS.WALLET.CONNECT_START, {\n network: context.entryNetwork,\n }));\n\n dynamicWidgetRequestedRef.current = true;\n lastDynamicOpenTimeRef.current = now;\n\n try {\n await showDynamicWidget(true);\n logger.debug('Dynamic widget shown');\n } catch (error) {\n dynamicWidgetRequestedRef.current = false;\n setIsConnecting(false);\n logger.logError(createWalletError('CONNECT_FAILED', 'Dynamic widget could not be shown', {\n cause: error instanceof Error ? error : undefined,\n context: { network: context.entryNetwork },\n }));\n }\n }, [\n context.entryNetwork,\n dynamicHandleLogOut,\n dynamicSdkHasLoaded,\n solanaWallet,\n evmWalletAddress,\n isConnecting,\n showDynamicWidget,\n ]);\n\n useEffect(() => {\n if (!dynamicSdkHasLoaded) {\n return;\n }\n\n if (nord) {\n reportedNordClientErrorRef.current = false;\n return;\n }\n\n if (nord == null) {\n // Nord client is still initializing; wait before reporting an error\n return;\n }\n\n if (reportedNordClientErrorRef.current) {\n setIsConnecting(false);\n return;\n }\n\n reportedNordClientErrorRef.current = true;\n setIsConnecting(false);\n flowActions.setErrorState(\n new Error(\n 'The client could not be initialized. Verify your Nord environment variables and try again.'\n )\n );\n }, [dynamicSdkHasLoaded, nord, flowActions]);\n\n // Process nordUser changes\n useEffect(() => {\n if (!dynamicSdkHasLoaded || !nordUser || !solanaWallet) return;\n // Don't process when modal is closed — avoids re-triggering flow transitions\n // after the reset-on-close puts state back to ENTRY_SELECTION.\n if (!showLogin) return;\n\n // Early exit if we have a pending bridge deposit - don't run any transition logic\n const pendingEarlyCheck = readPendingDeposit();\n logger.info('[WalletConnection] Early exit check for pending deposit', {\n pendingEarlyCheck,\n pendingStringified: JSON.stringify(pendingEarlyCheck),\n hasPendingEarly: !!pendingEarlyCheck,\n currentState: state,\n });\n\n const hasPendingBridgeEarly = pendingEarlyCheck &&\n (pendingEarlyCheck.stage === 'bridge_submitted' ||\n pendingEarlyCheck.stage === 'bridge_confirmed' ||\n (pendingEarlyCheck.stage === 'failed' && pendingEarlyCheck.tx)) &&\n pendingEarlyCheck.tx;\n\n logger.info('[WalletConnection] Early exit check result', {\n hasPendingBridgeEarly,\n pendingStage: pendingEarlyCheck?.stage,\n pendingTx: !!pendingEarlyCheck?.tx,\n pendingTxValue: pendingEarlyCheck?.tx,\n });\n\n if (hasPendingBridgeEarly) {\n logger.info('[WalletConnection] Effect early exit: pending bridge deposit detected, skipping all logic', {\n pendingStage: pendingEarlyCheck.stage,\n pendingTx: pendingEarlyCheck.tx,\n currentState: state,\n });\n return;\n }\n\n const currentNordUser = nordUser;\n const prevNordUser = prevNordUserRef.current;\n const currentSessionId = currentNordUser.sessionId\n ? currentNordUser.sessionId.toString()\n : null;\n const prevSessionId = prevSessionIdRef.current;\n const walletAddress = solanaWallet.address ?? null;\n const hasProcessedWallet =\n walletAddress != null && processedWalletAddressRef.current === walletAddress;\n\n // Early return if nothing meaningful changed\n if (\n currentNordUser === prevNordUser &&\n currentSessionId === prevSessionId &&\n hasProcessedWallet\n ) {\n return;\n }\n\n // Check cache FIRST (synchronously) before starting any async work\n const cached = getUserCacheRef.current;\n const now = Date.now();\n const isCacheValid = cached &&\n cached.address === walletAddress &&\n (now - cached.timestamp) < GET_USER_CACHE_TTL_MS;\n\n // Check if we've already processed this exact combination (prevents rapid re-processing)\n const lastProcessed = lastProcessedGetUserRef.current;\n const isSameState = lastProcessed &&\n lastProcessed.nordUser === currentNordUser &&\n lastProcessed.sessionId === currentSessionId &&\n lastProcessed.address === walletAddress;\n\n // If we have valid cache AND same state, skip entirely\n if (isCacheValid && isSameState) {\n logger.debug('NordUser changed, cache valid and same state, skipping duplicate processing', {\n cacheAge: `${now - cached.timestamp}ms`,\n });\n return;\n }\n\n // If we have valid cache but different state, we can still use cache but need to process\n // If we have in-flight request, wait for it instead of starting new one\n if (getUserInFlightRef.current && !isCacheValid) {\n logger.debug('NordUser changed, getUser already in flight, skipping duplicate call');\n return;\n }\n\n // Prevent concurrent execution\n if (getUserInFlightRef.current) {\n logger.debug('NordUser changed, getUser already in flight, skipping');\n return;\n }\n\n prevNordUserRef.current = currentNordUser;\n prevSessionIdRef.current = currentSessionId;\n if (walletAddress) {\n // Clear getUser cache if wallet address changed\n const isNewWallet = processedWalletAddressRef.current !== walletAddress;\n if (isNewWallet) {\n getUserCacheRef.current = null;\n logger.debug('Wallet address changed, cleared getUser cache');\n\n // Log wallet connect success when a new wallet is processed\n const isSolana = solanaWallet?.chain ? String(solanaWallet.chain).toUpperCase().startsWith('SOL') : false;\n logger.event(createWalletEvent(EVENTS.WALLET.CONNECT_SUCCESS, {\n address: walletAddress,\n network: isSolana ? 'solana' : 'evm',\n }));\n\n // Clear orphaned pending deposit if it belongs to a different wallet\n const pending = readPendingDeposit();\n if (pending && pending.wallet) {\n const pendingWalletLower = pending.wallet.toLowerCase();\n const currentWalletLower = walletAddress.toLowerCase();\n if (pendingWalletLower !== currentWalletLower) {\n clearPendingDeposit();\n logger.debug('Cleared orphaned pending deposit from different wallet', {\n pendingWallet: pending.wallet.substring(0, 10) + '...',\n currentWallet: walletAddress.substring(0, 10) + '...',\n });\n }\n }\n }\n processedWalletAddressRef.current = walletAddress;\n }\n\n // Mark this combination as being processed\n lastProcessedGetUserRef.current = {\n nordUser: currentNordUser,\n sessionId: currentSessionId,\n address: walletAddress ?? '',\n };\n\n // Only run if we have processed a wallet\n if (solanaWallet) {\n logger.debug('NordUser changed, checking account status', {\n sessionIdChanged: currentSessionId !== prevSessionId,\n nordUserChanged: currentNordUser !== prevNordUser,\n walletChanged: processedWalletAddressRef.current !== walletAddress,\n hasCache: Boolean(cached),\n cacheValid: isCacheValid,\n });\n\n const runGetUser = (async () => {\n try {\n if (!nord) {\n throw new Error('Nord client is not available.');\n }\n\n let nordAccount;\n\n // Check cache again inside async function (in case it was set by concurrent call)\n const cachedInside = getUserCacheRef.current;\n const nowInside = Date.now();\n const isCacheValidInside = cachedInside &&\n cachedInside.address === solanaWallet.address &&\n (nowInside - cachedInside.timestamp) < GET_USER_CACHE_TTL_MS;\n\n if (isCacheValidInside) {\n logger.debug('NordUser changed, using cached getUser result (checked inside async)', {\n cacheAge: `${nowInside - cachedInside.timestamp}ms`,\n });\n nordAccount = cachedInside.result;\n } else {\n logger.debug('NordUser changed, calling getUser (cache miss or expired)', {\n hasCache: Boolean(cachedInside),\n cacheAddress: cachedInside?.address?.substring(0, 10) + \"...\",\n currentAddress: solanaWallet.address?.substring(0, 10) + \"...\",\n });\n const getUserPromise = nord.getUser({ pubkey: solanaWallet.address });\n getUserInFlightRef.current = getUserPromise;\n nordAccount = await getUserPromise;\n\n // Cache the result immediately\n getUserCacheRef.current = {\n address: solanaWallet.address,\n result: nordAccount,\n timestamp: Date.now(),\n };\n }\n\n let hasNordAccount = nordAccount != null;\n let hasActiveSession = false;\n let hasRecentDeposit = false;\n\n // If API says no account but we have a recent successful deposit record,\n // trust the deposit record (API might not have indexed yet)\n if (!hasNordAccount) {\n try {\n const lastDeposit = readLastDepositRecord(solanaWallet.address);\n\n if (lastDeposit) {\n const depositAge = Date.now() - lastDeposit.timestamp;\n const RECENT_DEPOSIT_THRESHOLD = 5 * 60 * 1000; // 5 minutes\n if (depositAge < RECENT_DEPOSIT_THRESHOLD) {\n logger.debug('Recent successful deposit found - treating as Nord account holder', {\n depositAge: Math.floor(depositAge / 1000) + 's',\n transactionId: lastDeposit.transactionId,\n });\n hasNordAccount = true;\n hasRecentDeposit = true;\n // Assume session is active since we just deposited\n hasActiveSession = true;\n }\n }\n } catch (storageError) {\n logger.warn('Failed to read last deposit record', storageError);\n }\n }\n\n // Always check API sessions, but only apply them if we're not using recent deposit data\n let sessionId = currentNordUser.sessionId;\n let sessionIdString = sessionId ? sessionId.toString() : null;\n const serverSessions = nordAccount?.sessions ?? {};\n let sessionMatchesServer =\n sessionIdString != null && Boolean(serverSessions?.[sessionIdString]);\n\n // Check for active sessions directly via API endpoint if we don't have a stored sessionId\n // This allows us to detect sessions even if the user hasn't gone through the deposit flow\n if (!sessionIdString && solanaWallet.address && !hasRecentDeposit) {\n try {\n const { getActiveSessionId } = await import('../../../utils/nordApi');\n const apiSessionId = await getActiveSessionId(solanaWallet.address);\n if (apiSessionId) {\n logger.info('[WalletConnection] Found active session via API endpoint', {\n sessionId: apiSessionId,\n });\n sessionIdString = apiSessionId;\n hasActiveSession = true;\n hasNordAccount = true; // If they have a session, they have an account\n\n // Store the session ID in localStorage for future use\n if (typeof window !== 'undefined') {\n try {\n const sessionIdKey = `n1_sessionId_${solanaWallet.address}`;\n window.localStorage.setItem(sessionIdKey, apiSessionId);\n logger.debug('[WalletConnection] Stored session ID from API to localStorage');\n } catch (storageError) {\n logger.warn('[WalletConnection] Failed to store session ID', storageError);\n }\n }\n }\n } catch (apiError) {\n logger.warn('[WalletConnection] Failed to check API sessions', apiError);\n // Fall back to existing logic\n }\n }\n\n // Only override hasActiveSession if we're not using recent deposit data\n if (!hasRecentDeposit && sessionIdString && !hasActiveSession) {\n hasActiveSession = sessionMatchesServer;\n\n // Clear stale session if server doesn't recognize it\n if (sessionIdString && !sessionMatchesServer) {\n logger.debug('Stored session is missing on Nord; clearing cached session ID');\n if (typeof window !== 'undefined') {\n try {\n const sessionIdKey = `n1_sessionId_${solanaWallet.address}`;\n window.localStorage.removeItem(sessionIdKey);\n } catch (storageError) {\n logger.warn('Failed to clear stale sessionId from localStorage', storageError);\n }\n }\n }\n }\n\n // Check if the Nord account has any existing token balance\n // nordAccount.balances is an array of { tokenId, token, amount }\n const accountBalances = (nordAccount as any)?.balances ?? [];\n const hasExistingBalance = Array.isArray(accountBalances) &&\n accountBalances.some((b: any) => typeof b?.amount === 'number' && b.amount > 0);\n\n updateContext({ hasNordAccount, hasActiveSession, hasExistingBalance });\n\n logger.debug('Nord account check', {\n walletAddress: solanaWallet.address,\n hasNordAccount,\n hasActiveSession,\n hasExistingBalance,\n balanceCount: accountBalances.length,\n sessionId: sessionIdString,\n serverSessions: Object.keys(serverSessions ?? {}),\n });\n\n // Early check for pending bridge deposits - prevent any transitions if we need to resume\n const pending = readPendingDeposit();\n logger.info('[WalletConnection] Raw pending deposit check', {\n pending,\n pendingStringified: JSON.stringify(pending),\n hasPending: !!pending,\n });\n\n const hasPendingBridgeDeposit = pending &&\n (pending.stage === 'bridge_submitted' ||\n pending.stage === 'bridge_confirmed' ||\n (pending.stage === 'failed' && pending.tx)) &&\n pending.tx;\n\n logger.info('[WalletConnection] Checking for pending bridge deposit', {\n hasPending: !!pending,\n pendingStage: pending?.stage,\n pendingTx: !!pending?.tx,\n pendingTxValue: pending?.tx,\n hasPendingBridgeDeposit,\n currentState: state,\n stageMatch: pending ? (pending.stage === 'bridge_submitted' || pending.stage === 'bridge_confirmed' || (pending.stage === 'failed' && pending.tx)) : false,\n stageCheck: pending ? {\n isBridgeSubmitted: pending.stage === 'bridge_submitted',\n isBridgeConfirmed: pending.stage === 'bridge_confirmed',\n isFailedWithTx: pending.stage === 'failed' && pending.tx,\n } : null,\n });\n\n if (hasPendingBridgeDeposit) {\n // Only transition to DEPOSIT_PROGRESS if solanaWallet is ready (needed for claim signing)\n if (!solanaWallet) {\n logger.info('[WalletConnection] Pending bridge deposit detected but solanaWallet not ready - waiting', {\n pendingStage: pending.stage,\n pendingTx: pending.tx,\n currentState: state,\n hasSolanaWallet: !!solanaWallet,\n });\n return;\n }\n\n logger.info('[WalletConnection] Pending bridge deposit detected, transitioning to DEPOSIT_PROGRESS', {\n pendingStage: pending.stage,\n pendingTx: pending.tx,\n currentState: state,\n hasSolanaWallet: !!solanaWallet,\n });\n closeDynamicWidget();\n setIsConnecting(false);\n // Transition directly to DEPOSIT_PROGRESS\n if (state !== OnboardingStep.DEPOSIT_PROGRESS) {\n flowActions.startDeposit();\n }\n return;\n }\n\n // Use stateRef.current to read the LIVE state, not the stale\n // closure value which may still be CONNECTING_WALLET even though\n // other effects have already advanced the state.\n const liveState = stateRef.current;\n\n if (\n isWalletConnectionStep(liveState) &&\n !context.isDepositOnlyFlow\n ) {\n try {\n // Only restore last deposit if there's NO active pending deposit.\n // If there's a pending deposit in progress, let the deposit flow handle it\n // to avoid race conditions with finalizeBridgeSuccess.\n const activePending = readPendingDeposit();\n const hasActivePendingDeposit = activePending?.depositId &&\n activePending.stage !== 'solana_confirmed' &&\n activePending.stage !== 'failed';\n\n if (hasActivePendingDeposit) {\n logger.debug('Skipping last deposit restore - active pending deposit exists', {\n pendingStage: activePending?.stage,\n pendingId: activePending?.depositId,\n });\n } else {\n const lastDepositRecord = readLastDepositRecord(solanaWallet.address);\n if (lastDepositRecord) {\n // Only show success screen if deposit was recent (within 2 minutes)\n // This prevents showing the success screen every time user reconnects\n const depositAge = Date.now() - lastDepositRecord.timestamp;\n const SHOW_SUCCESS_THRESHOLD = 2 * 60 * 1000; // 2 minutes\n\n if (depositAge < SHOW_SUCCESS_THRESHOLD) {\n logger.debug('Showing recent deposit success from local storage', {\n depositAge: Math.floor(depositAge / 1000) + 's',\n transactionId: lastDepositRecord.transactionId,\n });\n flowActions.markDepositSuccess({\n transactionId: lastDepositRecord.transactionId,\n record: lastDepositRecord,\n });\n closeDynamicWidget();\n setIsConnecting(false);\n return;\n } else {\n logger.debug('Last deposit too old to show success screen - treating as existing balance', {\n depositAge: Math.floor(depositAge / 1000) + 's',\n });\n // Fall through to normal flow - user already saw success screen\n }\n }\n }\n } catch (error) {\n logger.logError(createWalletError('ADAPTER_ERROR', 'Error restoring last deposit record', {\n cause: error instanceof Error ? error : undefined,\n }));\n }\n }\n\n // Unless this is an explicit deposit-only flow, just close the\n // modal after connecting. Deposits, withdrawals, and other actions\n // are triggered manually by the host application.\n if (!context.isDepositOnlyFlow) {\n logger.info('[WalletConnection] Completing flow after wallet connect', {\n hasNordAccount,\n hasActiveSession,\n hasExistingBalance,\n isDepositOnlyFlow: context.isDepositOnlyFlow,\n });\n closeDynamicWidget();\n setIsConnecting(false);\n flowActions.completeFlow({\n hasNordAccount,\n hasActiveSession,\n });\n return;\n }\n\n // Deposit-only flow: route to chain selection\n closeDynamicWidget();\n\n try {\n // Check for pending bridge deposits before transitioning\n const pendingCheck = readPendingDeposit();\n const hasPendingBridgeDepositCheck = pendingCheck &&\n (pendingCheck.stage === 'bridge_submitted' ||\n pendingCheck.stage === 'bridge_confirmed' ||\n (pendingCheck.stage === 'failed' && pendingCheck.tx)) &&\n pendingCheck.tx;\n\n const finalState = stateRef.current;\n\n // Don't regress if state has already advanced past chain selection\n const isAlreadyPastChainSelection =\n finalState === OnboardingStep.AMOUNT_INPUT ||\n finalState === OnboardingStep.DEPOSIT_PROGRESS ||\n finalState === OnboardingStep.DEPOSIT_SUCCESS ||\n finalState === OnboardingStep.AUTH_LOADING ||\n finalState === OnboardingStep.FINAL_SUCCESS;\n\n if (isAlreadyPastChainSelection || hasPendingBridgeDepositCheck) {\n logger.info('[WalletConnection] Skipping transition to CHAIN_SELECTION', {\n reason: isAlreadyPastChainSelection\n ? `state already at ${finalState}`\n : 'pending bridge deposit detected',\n state: finalState,\n hasPendingBridgeDepositCheck,\n pendingStage: pendingCheck?.stage,\n });\n } else if (context.entryNetwork === 'solana') {\n logger.debug('Proceeding directly to Solana amount entry');\n flowActions.selectChain({\n id: 'solana',\n name: 'Solana',\n network: SolanaNetwork.MAINNET,\n });\n } else {\n logger.debug('Attempting transition to ' + OnboardingStep.CHAIN_SELECTION, {\n fromState: finalState,\n });\n flowActions.goToChainSelection();\n }\n } catch (error) {\n logger.logError(createWalletError('ADAPTER_ERROR', 'Error during transition', {\n cause: error instanceof Error ? error : undefined,\n }));\n } finally {\n setIsConnecting(false);\n }\n } catch (error) {\n logger.logError(createWalletError('ADAPTER_ERROR', 'Error checking account status', {\n cause: error instanceof Error ? error : undefined,\n }));\n closeDynamicWidget();\n setIsConnecting(false);\n } finally {\n getUserInFlightRef.current = null;\n }\n })();\n\n getUserInFlightRef.current = runGetUser;\n }\n }, [\n nord,\n nordUser,\n solanaWallet,\n updateContext,\n flowActions,\n state,\n dynamicSdkHasLoaded,\n context.isDepositOnlyFlow,\n // Removed nordUser?.sessionId - it's redundant since nordUser is already in deps\n closeDynamicWidget,\n context.entryNetwork,\n showLogin,\n ]);\n\n\n\n\n // Handle Dynamic widget closing while still connecting.\n // If the Nord modal is gone, make sure we reset any pending Dynamic state\n // so a subsequent open can trigger the widget again.\n useEffect(() => {\n if (showLogin) {\n return;\n }\n\n if (dynamicWidgetRequestedRef.current) {\n closeDynamicWidget();\n }\n\n if (isConnecting) {\n logger.debug('Wallet modal closed before connection completed; resetting state');\n setIsConnecting(false);\n }\n }, [isConnecting, showLogin, closeDynamicWidget]);\n\n // Handle connecting state changes in a separate effect\n useEffect(() => {\n const currentState = state;\n const prevState = prevStateRef.current;\n\n // Only run if state has changed\n if (currentState !== prevState) {\n if (!isWalletConnectionStep(currentState) && isConnecting) {\n // If we're no longer in the connecting state, reset the connecting flag\n setIsConnecting(false);\n }\n\n // Update ref\n prevStateRef.current = currentState;\n }\n }, [state, isConnecting]);\n\n // Create the context value\n const contextValue: WalletConnectionContextValue = {\n isConnecting,\n connectWallet,\n disconnectWallet,\n turnkeyEnabled,\n turnkeyStatus,\n turnkeyError,\n retryTurnkeyBootstrap,\n turnkeyAddress,\n signTransaction: solanaWallet?.connector?.signTransaction\n };\n\n return (\n <WalletConnectionContext.Provider value={contextValue}>\n {children}\n </WalletConnectionContext.Provider>\n );\n};\n\n/**\n * Custom hook to use the wallet connection context\n * @returns The wallet connection context value\n * @throws Error if used outside of a WalletConnectionProvider\n */\nexport const useWalletConnection = (): WalletConnectionContextValue => {\n const context = useContext(WalletConnectionContext);\n\n if (context === undefined) {\n throw new Error('useWalletConnection must be used within a WalletConnectionProvider');\n }\n\n return context;\n};\n"]}
|
|
@@ -218,6 +218,7 @@ export var WithdrawalFlowProvider = function (_a) {
|
|
|
218
218
|
// --- Claim phase: receive on EVM ---
|
|
219
219
|
setWithdrawalProgressPhase('claiming');
|
|
220
220
|
return [4 /*yield*/, executeClaimPhase({
|
|
221
|
+
withdrawalId: activeWithdrawalId,
|
|
221
222
|
attestation: bridgeResult.attestation,
|
|
222
223
|
message: bridgeResult.message,
|
|
223
224
|
evmAddress: evmAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WithdrawalFlowProvider.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/providers/WithdrawalFlowProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { logger } from '../../../utils/logger';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { WithdrawalProgressPhase, WithdrawalTransactionResult } from '../types';\nimport { normalizeWithdrawalError } from '../utils/withdrawal/errors';\nimport {\n readPendingWithdrawal,\n clearPendingWithdrawal,\n saveLastWithdrawalRecord,\n updatePendingWithdrawal,\n} from '../utils/withdrawal/storage';\nimport { useOnboardingState } from './OnboardingStateProvider';\nimport { RESUMABLE_STATUSES, BRIDGE_ASSIST_POLL_INTERVAL_MS } from '../constants/withdrawal';\nimport {\n executeBurnPhase,\n executeBridgePhase,\n executeClaimPhase,\n reportClaimToBridgeAssist,\n} from '../utils/withdrawal/bridgeFlowPhases';\n\nexport interface WithdrawalFlowContextValue {\n amount: string;\n isWithdrawing: boolean;\n withdrawalProgressPhase: WithdrawalProgressPhase;\n withdrawalError: string | null;\n retryable: boolean;\n actionId: string | null;\n\n // Bridge-specific state\n pendingBurnTx: string | null;\n pendingBurnExplorerUrl: string | null;\n pendingClaimTx: string | null;\n destinationChain: string;\n setDestinationChain: (chain: string) => void;\n\n transactionResult: WithdrawalTransactionResult | null;\n updateAmount: (newAmount: string) => void;\n startBridge: (tokenId: number) => Promise<void>;\n completeBridge: () => void;\n retryBridge: () => Promise<void>;\n}\n\n// Create the context with a default value\nconst WithdrawalFlowContext = createContext<WithdrawalFlowContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface WithdrawalFlowProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the Turnkey Solana → EVM bridge flow state.\n * Nord → Turnkey withdrawals are handled separately via the useNordWithdrawal hook.\n */\nexport const WithdrawalFlowProvider: React.FC<WithdrawalFlowProviderProps> = ({ children }) => {\n const { context, actions: flowActions } = useOnboardingState();\n const { solanaAddress, evmAddress, solanaWallet, evmWallet, evmAdapter } = useNetwork();\n\n const [amount, setAmount] = useState(context.amount || '');\n const [isWithdrawing, setIsWithdrawing] = useState(false);\n const [withdrawalProgressPhase, setWithdrawalProgressPhase] =\n useState<WithdrawalProgressPhase>('validating');\n const [withdrawalError, setWithdrawalError] = useState<string | null>(null);\n const [retryable, setRetryable] = useState(false);\n const [actionId, setActionId] = useState<string | null>(null);\n const [pendingBurnTx, setPendingBurnTx] = useState<string | null>(null);\n const [pendingBurnExplorerUrl, setPendingBurnExplorerUrl] = useState<string | null>(null);\n const [pendingClaimTx, setPendingClaimTx] = useState<string | null>(null);\n const [destinationChain, setDestinationChain] = useState('ethereum');\n\n const [transactionResult, setTransactionResult] = useState<WithdrawalTransactionResult | null>(null);\n\n const startBridgeInFlightRef = useRef(false);\n const currentTokenIdRef = useRef<number | null>(null);\n\n // Stable ref for flowActions to avoid effect dependency cycles.\n // flowActions is recreated when onboarding state changes (guardedDispatch depends on state),\n // so using it directly in useEffect deps causes infinite loops.\n const flowActionsRef = useRef(flowActions);\n flowActionsRef.current = flowActions;\n\n const updateAmount = useCallback((newAmount: string) => {\n setAmount(newAmount);\n }, []);\n\n /** Resets all flow state back to defaults. */\n const resetFlowState = useCallback(() => {\n clearPendingWithdrawal();\n setIsWithdrawing(false);\n setPendingBurnTx(null);\n setPendingBurnExplorerUrl(null);\n setPendingClaimTx(null);\n setActionId(null);\n setTransactionResult(null);\n setWithdrawalError(null);\n setRetryable(false);\n setDestinationChain('ethereum');\n startBridgeInFlightRef.current = false;\n currentTokenIdRef.current = null;\n }, []);\n\n const completeBridge = useCallback(() => {\n logger.info('[WithdrawalFlow] Completing bridge');\n resetFlowState();\n }, [resetFlowState]);\n\n const executeBridgeFlow = useCallback(\n async (tokenId: number, retryAttempt: boolean = false) => {\n if (!retryAttempt && startBridgeInFlightRef.current) {\n logger.warn('[WithdrawalFlow] Bridge already in progress');\n return;\n }\n\n // Check for resumable pending withdrawal (burn already succeeded).\n // Done before wallet checks so resume flows aren't blocked by wallets reconnecting.\n const existingPending = readPendingWithdrawal();\n const canResume = existingPending?.burnTx &&\n (RESUMABLE_STATUSES as readonly string[]).includes(existingPending.status || '');\n const skipBridgeSubmission = canResume && existingPending\n ? (existingPending.status === 'submitted_to_bridge' || existingPending.status === 'attested')\n : false;\n\n // Resume paths that skip bridge submission only need evmAddress\n if (!canResume || !skipBridgeSubmission) {\n if (!solanaAddress) {\n const error = 'No Solana wallet address available';\n logger.error('[WithdrawalFlow]', error);\n setWithdrawalError(error);\n setRetryable(!!canResume);\n return;\n }\n }\n\n if (!evmAddress) {\n const error = 'No EVM wallet connected. Please connect an EVM wallet to bridge.';\n logger.error('[WithdrawalFlow]', error);\n setWithdrawalError(error);\n setRetryable(!!canResume);\n return;\n }\n\n startBridgeInFlightRef.current = true;\n currentTokenIdRef.current = tokenId;\n setIsWithdrawing(true);\n setWithdrawalError(null);\n setRetryable(false);\n setPendingBurnTx(null);\n setPendingBurnExplorerUrl(null);\n setPendingClaimTx(null);\n\n try {\n logger.info('[WithdrawalFlow] Phase: validating', { amount, tokenId });\n setWithdrawalProgressPhase('validating');\n\n let activeWithdrawalId: string;\n let burnTxHash: string;\n let pendingState;\n\n if (canResume && existingPending) {\n // --- Resume from existing burn — skip burn phase ---\n logger.info('[WithdrawalFlow] Resuming from existing burn', {\n withdrawalId: existingPending.withdrawalId,\n status: existingPending.status,\n });\n activeWithdrawalId = existingPending.withdrawalId;\n burnTxHash = existingPending.burnTx!;\n pendingState = existingPending;\n\n setAmount(existingPending.amount);\n if (existingPending.destinationChain) setDestinationChain(existingPending.destinationChain);\n setPendingBurnTx(burnTxHash);\n flowActions.withdrawalProgress({ amount: existingPending.amount, tokenId });\n setWithdrawalProgressPhase('bridging');\n } else {\n // --- Fresh flow — burn USDC on Solana ---\n activeWithdrawalId = `withdrawal_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n flowActions.withdrawalProgress({ amount, tokenId });\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n setWithdrawalProgressPhase('burning');\n const burnResult = await executeBurnPhase({\n withdrawalId: activeWithdrawalId,\n amount,\n tokenId,\n destinationChain,\n evmAddress,\n solanaAddress: solanaAddress!,\n solanaWallet: solanaWallet as any,\n });\n\n burnTxHash = burnResult.burnTxHash;\n pendingState = burnResult.pendingState;\n setPendingBurnTx(burnTxHash);\n setPendingBurnExplorerUrl(burnResult.burnExplorerUrl);\n }\n\n // --- Bridge phase: submit + poll attestation ---\n const effectiveAmount = canResume && existingPending ? existingPending.amount : amount;\n const effectiveSolanaAddr = canResume && existingPending?.wallet ? existingPending.wallet : solanaAddress!;\n const effectiveDestChain = canResume && existingPending?.destinationChain ? existingPending.destinationChain : destinationChain;\n\n setWithdrawalProgressPhase('bridging');\n const bridgeResult = await executeBridgePhase({\n withdrawalId: activeWithdrawalId,\n burnTxHash,\n amount: effectiveAmount,\n solanaAddr: effectiveSolanaAddr,\n evmAddr: evmAddress!,\n destinationChain: effectiveDestChain,\n skipSubmission: !!skipBridgeSubmission,\n existingAttestationData: existingPending?.attestationData,\n pendingState,\n });\n pendingState = bridgeResult.pendingState;\n\n // --- Claim phase: receive on EVM ---\n setWithdrawalProgressPhase('claiming');\n const claimResult = await executeClaimPhase({\n attestation: bridgeResult.attestation,\n message: bridgeResult.message,\n evmAddress: evmAddress!,\n destinationChain: effectiveDestChain,\n evmWallet,\n evmAdapter,\n existingClaimTx: existingPending?.claimTx,\n pendingState,\n });\n pendingState = claimResult.pendingState;\n\n // --- Success ---\n setPendingClaimTx(claimResult.claimTxHash);\n await reportClaimToBridgeAssist(activeWithdrawalId, claimResult.claimTxHash);\n\n updatePendingWithdrawal(pendingState, {\n status: 'bridged_to_evm',\n claimTx: claimResult.claimTxHash,\n });\n\n setWithdrawalProgressPhase('complete');\n\n const recordWallet = canResume && existingPending?.wallet\n ? existingPending.wallet\n : solanaAddress!;\n\n setActionId(burnTxHash);\n setTransactionResult({\n success: true,\n actionId: burnTxHash,\n amount: effectiveAmount,\n tokenSymbol: 'USDC',\n fromAddress: recordWallet,\n status: 'bridged_to_evm',\n });\n\n saveLastWithdrawalRecord(recordWallet, {\n actionId: burnTxHash,\n amount: effectiveAmount,\n tokenSymbol: 'USDC',\n wallet: evmAddress!,\n timestamp: Date.now(),\n status: 'bridged_to_evm',\n });\n\n clearPendingWithdrawal();\n\n flowActions.withdrawalSuccess({\n actionId: burnTxHash,\n amount: effectiveAmount,\n });\n\n logger.info('[WithdrawalFlow] Turnkey → EVM bridge flow completed successfully');\n } catch (error) {\n logger.error('[WithdrawalFlow] Bridge failed', { error });\n\n const normalizedError = normalizeWithdrawalError(error);\n const pendingAfterError = readPendingWithdrawal();\n const burnAlreadyDone = pendingAfterError?.burnTx &&\n (RESUMABLE_STATUSES as readonly string[]).includes(pendingAfterError.status || '');\n\n setWithdrawalError(\n burnAlreadyDone\n ? 'Bridge step failed but your burn transaction succeeded. Your funds are safe — click retry to resume.'\n : normalizedError.userMessage\n );\n setRetryable(burnAlreadyDone ? true : normalizedError.retryable);\n setIsWithdrawing(false);\n startBridgeInFlightRef.current = false;\n\n if (!burnAlreadyDone) {\n // Only reset to starting state if burn hasn't happened\n if (normalizedError.retryable && !retryAttempt) {\n logger.info('[WithdrawalFlow] Auto-retrying in 5 seconds...');\n await new Promise((resolve) => setTimeout(resolve, BRIDGE_ASSIST_POLL_INTERVAL_MS));\n\n if (currentTokenIdRef.current !== null) {\n return executeBridgeFlow(currentTokenIdRef.current, true);\n }\n } else {\n // Non-retryable error or manual retry needed\n flowActions.withdrawalFailed(normalizedError.userMessage);\n }\n }\n // If burn succeeded, stay on progress screen — user can click retry to resume\n }\n },\n [amount, destinationChain, solanaAddress, evmAddress, solanaWallet, evmWallet, evmAdapter, flowActions]\n );\n\n const startBridge = useCallback(\n async (tokenId: number) => {\n logger.info('[WithdrawalFlow] Starting bridge', { amount, tokenId });\n await executeBridgeFlow(tokenId, false);\n },\n [executeBridgeFlow, amount]\n );\n\n const retryBridge = useCallback(async () => {\n if (currentTokenIdRef.current === null) {\n logger.error('[WithdrawalFlow] Cannot retry - no token ID stored');\n return;\n }\n\n logger.info('[WithdrawalFlow] Retrying bridge');\n setWithdrawalError(null);\n setRetryable(false);\n setActionId(null);\n setTransactionResult(null);\n await executeBridgeFlow(currentTokenIdRef.current, false);\n }, [executeBridgeFlow]);\n\n useEffect(() => {\n const pending = readPendingWithdrawal();\n if (!pending) return;\n\n logger.info('[WithdrawalFlow] Found pending withdrawal on mount', pending);\n\n // Restore common state for all pending withdrawal cases\n currentTokenIdRef.current = pending.tokenId;\n setAmount(pending.amount);\n setActionId(pending.actionId || null);\n if (pending.destinationChain) {\n setDestinationChain(pending.destinationChain);\n }\n\n if (pending.actionId) {\n // Completed withdrawal — show success\n setIsWithdrawing(false);\n setWithdrawalProgressPhase('complete');\n setTransactionResult({\n success: true,\n actionId: pending.actionId,\n amount: pending.amount,\n tokenSymbol: 'USDC',\n fromAddress: pending.wallet,\n status: pending.status || 'bridged_to_evm',\n });\n\n saveLastWithdrawalRecord(pending.wallet, {\n actionId: pending.actionId,\n amount: pending.amount,\n tokenSymbol: 'USDC',\n wallet: pending.wallet,\n timestamp: Date.now(),\n status: pending.status || 'bridged_to_evm',\n });\n clearPendingWithdrawal();\n\n flowActionsRef.current.withdrawalSuccess({\n actionId: pending.actionId,\n amount: pending.amount,\n });\n } else if (pending.status === 'pending') {\n // Burn never went through — clear stale state\n logger.info('[WithdrawalFlow] Clearing stale pending withdrawal (burn never started)', {\n withdrawalId: pending.withdrawalId,\n });\n clearPendingWithdrawal();\n } else if (pending.status && (RESUMABLE_STATUSES as readonly string[]).includes(pending.status)) {\n // Resumable in-progress withdrawal — local state already restored above.\n // Navigation to the progress screen is handled by OnboardingStateProvider\n // when the withdrawal flow is activated.\n logger.info('[WithdrawalFlow] Found resumable pending withdrawal', {\n status: pending.status,\n withdrawalId: pending.withdrawalId,\n });\n } else {\n // Stale or unrecognized status — expire\n logger.warn('[WithdrawalFlow] Expiring stale pending withdrawal', {\n status: pending.status,\n withdrawalId: pending.withdrawalId,\n });\n saveLastWithdrawalRecord(pending.wallet, {\n actionId: pending.withdrawalId,\n amount: pending.amount,\n tokenSymbol: 'USDC',\n wallet: pending.wallet,\n timestamp: Date.now(),\n status: 'expired',\n });\n setWithdrawalError('A previous withdrawal was interrupted and could not be resumed. Please try again.');\n clearPendingWithdrawal();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const value: WithdrawalFlowContextValue = {\n amount,\n isWithdrawing,\n withdrawalProgressPhase,\n withdrawalError,\n retryable,\n actionId,\n pendingBurnTx,\n pendingBurnExplorerUrl,\n pendingClaimTx,\n destinationChain,\n setDestinationChain,\n transactionResult,\n updateAmount,\n startBridge,\n completeBridge,\n retryBridge,\n };\n\n return (\n <WithdrawalFlowContext.Provider value={value}>\n {children}\n </WithdrawalFlowContext.Provider>\n );\n};\n\nexport const useWithdrawalFlow = (): WithdrawalFlowContextValue => {\n const context = useContext(WithdrawalFlowContext);\n if (!context) {\n throw new Error('useWithdrawalFlow must be used within a WithdrawalFlowProvider');\n }\n return context;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"WithdrawalFlowProvider.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/providers/WithdrawalFlowProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { logger } from '../../../utils/logger';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { WithdrawalProgressPhase, WithdrawalTransactionResult } from '../types';\nimport { normalizeWithdrawalError } from '../utils/withdrawal/errors';\nimport {\n readPendingWithdrawal,\n clearPendingWithdrawal,\n saveLastWithdrawalRecord,\n updatePendingWithdrawal,\n} from '../utils/withdrawal/storage';\nimport { useOnboardingState } from './OnboardingStateProvider';\nimport { RESUMABLE_STATUSES, BRIDGE_ASSIST_POLL_INTERVAL_MS } from '../constants/withdrawal';\nimport {\n executeBurnPhase,\n executeBridgePhase,\n executeClaimPhase,\n reportClaimToBridgeAssist,\n} from '../utils/withdrawal/bridgeFlowPhases';\n\nexport interface WithdrawalFlowContextValue {\n amount: string;\n isWithdrawing: boolean;\n withdrawalProgressPhase: WithdrawalProgressPhase;\n withdrawalError: string | null;\n retryable: boolean;\n actionId: string | null;\n\n // Bridge-specific state\n pendingBurnTx: string | null;\n pendingBurnExplorerUrl: string | null;\n pendingClaimTx: string | null;\n destinationChain: string;\n setDestinationChain: (chain: string) => void;\n\n transactionResult: WithdrawalTransactionResult | null;\n updateAmount: (newAmount: string) => void;\n startBridge: (tokenId: number) => Promise<void>;\n completeBridge: () => void;\n retryBridge: () => Promise<void>;\n}\n\n// Create the context with a default value\nconst WithdrawalFlowContext = createContext<WithdrawalFlowContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface WithdrawalFlowProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the Turnkey Solana → EVM bridge flow state.\n * Nord → Turnkey withdrawals are handled separately via the useNordWithdrawal hook.\n */\nexport const WithdrawalFlowProvider: React.FC<WithdrawalFlowProviderProps> = ({ children }) => {\n const { context, actions: flowActions } = useOnboardingState();\n const { solanaAddress, evmAddress, solanaWallet, evmWallet, evmAdapter } = useNetwork();\n\n const [amount, setAmount] = useState(context.amount || '');\n const [isWithdrawing, setIsWithdrawing] = useState(false);\n const [withdrawalProgressPhase, setWithdrawalProgressPhase] =\n useState<WithdrawalProgressPhase>('validating');\n const [withdrawalError, setWithdrawalError] = useState<string | null>(null);\n const [retryable, setRetryable] = useState(false);\n const [actionId, setActionId] = useState<string | null>(null);\n const [pendingBurnTx, setPendingBurnTx] = useState<string | null>(null);\n const [pendingBurnExplorerUrl, setPendingBurnExplorerUrl] = useState<string | null>(null);\n const [pendingClaimTx, setPendingClaimTx] = useState<string | null>(null);\n const [destinationChain, setDestinationChain] = useState('ethereum');\n\n const [transactionResult, setTransactionResult] = useState<WithdrawalTransactionResult | null>(null);\n\n const startBridgeInFlightRef = useRef(false);\n const currentTokenIdRef = useRef<number | null>(null);\n\n // Stable ref for flowActions to avoid effect dependency cycles.\n // flowActions is recreated when onboarding state changes (guardedDispatch depends on state),\n // so using it directly in useEffect deps causes infinite loops.\n const flowActionsRef = useRef(flowActions);\n flowActionsRef.current = flowActions;\n\n const updateAmount = useCallback((newAmount: string) => {\n setAmount(newAmount);\n }, []);\n\n /** Resets all flow state back to defaults. */\n const resetFlowState = useCallback(() => {\n clearPendingWithdrawal();\n setIsWithdrawing(false);\n setPendingBurnTx(null);\n setPendingBurnExplorerUrl(null);\n setPendingClaimTx(null);\n setActionId(null);\n setTransactionResult(null);\n setWithdrawalError(null);\n setRetryable(false);\n setDestinationChain('ethereum');\n startBridgeInFlightRef.current = false;\n currentTokenIdRef.current = null;\n }, []);\n\n const completeBridge = useCallback(() => {\n logger.info('[WithdrawalFlow] Completing bridge');\n resetFlowState();\n }, [resetFlowState]);\n\n const executeBridgeFlow = useCallback(\n async (tokenId: number, retryAttempt: boolean = false) => {\n if (!retryAttempt && startBridgeInFlightRef.current) {\n logger.warn('[WithdrawalFlow] Bridge already in progress');\n return;\n }\n\n // Check for resumable pending withdrawal (burn already succeeded).\n // Done before wallet checks so resume flows aren't blocked by wallets reconnecting.\n const existingPending = readPendingWithdrawal();\n const canResume = existingPending?.burnTx &&\n (RESUMABLE_STATUSES as readonly string[]).includes(existingPending.status || '');\n const skipBridgeSubmission = canResume && existingPending\n ? (existingPending.status === 'submitted_to_bridge' || existingPending.status === 'attested')\n : false;\n\n // Resume paths that skip bridge submission only need evmAddress\n if (!canResume || !skipBridgeSubmission) {\n if (!solanaAddress) {\n const error = 'No Solana wallet address available';\n logger.error('[WithdrawalFlow]', error);\n setWithdrawalError(error);\n setRetryable(!!canResume);\n return;\n }\n }\n\n if (!evmAddress) {\n const error = 'No EVM wallet connected. Please connect an EVM wallet to bridge.';\n logger.error('[WithdrawalFlow]', error);\n setWithdrawalError(error);\n setRetryable(!!canResume);\n return;\n }\n\n startBridgeInFlightRef.current = true;\n currentTokenIdRef.current = tokenId;\n setIsWithdrawing(true);\n setWithdrawalError(null);\n setRetryable(false);\n setPendingBurnTx(null);\n setPendingBurnExplorerUrl(null);\n setPendingClaimTx(null);\n\n try {\n logger.info('[WithdrawalFlow] Phase: validating', { amount, tokenId });\n setWithdrawalProgressPhase('validating');\n\n let activeWithdrawalId: string;\n let burnTxHash: string;\n let pendingState;\n\n if (canResume && existingPending) {\n // --- Resume from existing burn — skip burn phase ---\n logger.info('[WithdrawalFlow] Resuming from existing burn', {\n withdrawalId: existingPending.withdrawalId,\n status: existingPending.status,\n });\n activeWithdrawalId = existingPending.withdrawalId;\n burnTxHash = existingPending.burnTx!;\n pendingState = existingPending;\n\n setAmount(existingPending.amount);\n if (existingPending.destinationChain) setDestinationChain(existingPending.destinationChain);\n setPendingBurnTx(burnTxHash);\n flowActions.withdrawalProgress({ amount: existingPending.amount, tokenId });\n setWithdrawalProgressPhase('bridging');\n } else {\n // --- Fresh flow — burn USDC on Solana ---\n activeWithdrawalId = `withdrawal_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n flowActions.withdrawalProgress({ amount, tokenId });\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n setWithdrawalProgressPhase('burning');\n const burnResult = await executeBurnPhase({\n withdrawalId: activeWithdrawalId,\n amount,\n tokenId,\n destinationChain,\n evmAddress,\n solanaAddress: solanaAddress!,\n solanaWallet: solanaWallet as any,\n });\n\n burnTxHash = burnResult.burnTxHash;\n pendingState = burnResult.pendingState;\n setPendingBurnTx(burnTxHash);\n setPendingBurnExplorerUrl(burnResult.burnExplorerUrl);\n }\n\n // --- Bridge phase: submit + poll attestation ---\n const effectiveAmount = canResume && existingPending ? existingPending.amount : amount;\n const effectiveSolanaAddr = canResume && existingPending?.wallet ? existingPending.wallet : solanaAddress!;\n const effectiveDestChain = canResume && existingPending?.destinationChain ? existingPending.destinationChain : destinationChain;\n\n setWithdrawalProgressPhase('bridging');\n const bridgeResult = await executeBridgePhase({\n withdrawalId: activeWithdrawalId,\n burnTxHash,\n amount: effectiveAmount,\n solanaAddr: effectiveSolanaAddr,\n evmAddr: evmAddress!,\n destinationChain: effectiveDestChain,\n skipSubmission: !!skipBridgeSubmission,\n existingAttestationData: existingPending?.attestationData,\n pendingState,\n });\n pendingState = bridgeResult.pendingState;\n\n // --- Claim phase: receive on EVM ---\n setWithdrawalProgressPhase('claiming');\n const claimResult = await executeClaimPhase({\n withdrawalId: activeWithdrawalId,\n attestation: bridgeResult.attestation,\n message: bridgeResult.message,\n evmAddress: evmAddress!,\n destinationChain: effectiveDestChain,\n evmWallet,\n evmAdapter,\n existingClaimTx: existingPending?.claimTx,\n pendingState,\n });\n pendingState = claimResult.pendingState;\n\n // --- Success ---\n setPendingClaimTx(claimResult.claimTxHash);\n await reportClaimToBridgeAssist(activeWithdrawalId, claimResult.claimTxHash);\n\n updatePendingWithdrawal(pendingState, {\n status: 'bridged_to_evm',\n claimTx: claimResult.claimTxHash,\n });\n\n setWithdrawalProgressPhase('complete');\n\n const recordWallet = canResume && existingPending?.wallet\n ? existingPending.wallet\n : solanaAddress!;\n\n setActionId(burnTxHash);\n setTransactionResult({\n success: true,\n actionId: burnTxHash,\n amount: effectiveAmount,\n tokenSymbol: 'USDC',\n fromAddress: recordWallet,\n status: 'bridged_to_evm',\n });\n\n saveLastWithdrawalRecord(recordWallet, {\n actionId: burnTxHash,\n amount: effectiveAmount,\n tokenSymbol: 'USDC',\n wallet: evmAddress!,\n timestamp: Date.now(),\n status: 'bridged_to_evm',\n });\n\n clearPendingWithdrawal();\n\n flowActions.withdrawalSuccess({\n actionId: burnTxHash,\n amount: effectiveAmount,\n });\n\n logger.info('[WithdrawalFlow] Turnkey → EVM bridge flow completed successfully');\n } catch (error) {\n logger.error('[WithdrawalFlow] Bridge failed', { error });\n\n const normalizedError = normalizeWithdrawalError(error);\n const pendingAfterError = readPendingWithdrawal();\n const burnAlreadyDone = pendingAfterError?.burnTx &&\n (RESUMABLE_STATUSES as readonly string[]).includes(pendingAfterError.status || '');\n\n setWithdrawalError(\n burnAlreadyDone\n ? 'Bridge step failed but your burn transaction succeeded. Your funds are safe — click retry to resume.'\n : normalizedError.userMessage\n );\n setRetryable(burnAlreadyDone ? true : normalizedError.retryable);\n setIsWithdrawing(false);\n startBridgeInFlightRef.current = false;\n\n if (!burnAlreadyDone) {\n // Only reset to starting state if burn hasn't happened\n if (normalizedError.retryable && !retryAttempt) {\n logger.info('[WithdrawalFlow] Auto-retrying in 5 seconds...');\n await new Promise((resolve) => setTimeout(resolve, BRIDGE_ASSIST_POLL_INTERVAL_MS));\n\n if (currentTokenIdRef.current !== null) {\n return executeBridgeFlow(currentTokenIdRef.current, true);\n }\n } else {\n // Non-retryable error or manual retry needed\n flowActions.withdrawalFailed(normalizedError.userMessage);\n }\n }\n // If burn succeeded, stay on progress screen — user can click retry to resume\n }\n },\n [amount, destinationChain, solanaAddress, evmAddress, solanaWallet, evmWallet, evmAdapter, flowActions]\n );\n\n const startBridge = useCallback(\n async (tokenId: number) => {\n logger.info('[WithdrawalFlow] Starting bridge', { amount, tokenId });\n await executeBridgeFlow(tokenId, false);\n },\n [executeBridgeFlow, amount]\n );\n\n const retryBridge = useCallback(async () => {\n if (currentTokenIdRef.current === null) {\n logger.error('[WithdrawalFlow] Cannot retry - no token ID stored');\n return;\n }\n\n logger.info('[WithdrawalFlow] Retrying bridge');\n setWithdrawalError(null);\n setRetryable(false);\n setActionId(null);\n setTransactionResult(null);\n await executeBridgeFlow(currentTokenIdRef.current, false);\n }, [executeBridgeFlow]);\n\n useEffect(() => {\n const pending = readPendingWithdrawal();\n if (!pending) return;\n\n logger.info('[WithdrawalFlow] Found pending withdrawal on mount', pending);\n\n // Restore common state for all pending withdrawal cases\n currentTokenIdRef.current = pending.tokenId;\n setAmount(pending.amount);\n setActionId(pending.actionId || null);\n if (pending.destinationChain) {\n setDestinationChain(pending.destinationChain);\n }\n\n if (pending.actionId) {\n // Completed withdrawal — show success\n setIsWithdrawing(false);\n setWithdrawalProgressPhase('complete');\n setTransactionResult({\n success: true,\n actionId: pending.actionId,\n amount: pending.amount,\n tokenSymbol: 'USDC',\n fromAddress: pending.wallet,\n status: pending.status || 'bridged_to_evm',\n });\n\n saveLastWithdrawalRecord(pending.wallet, {\n actionId: pending.actionId,\n amount: pending.amount,\n tokenSymbol: 'USDC',\n wallet: pending.wallet,\n timestamp: Date.now(),\n status: pending.status || 'bridged_to_evm',\n });\n clearPendingWithdrawal();\n\n flowActionsRef.current.withdrawalSuccess({\n actionId: pending.actionId,\n amount: pending.amount,\n });\n } else if (pending.status === 'pending') {\n // Burn never went through — clear stale state\n logger.info('[WithdrawalFlow] Clearing stale pending withdrawal (burn never started)', {\n withdrawalId: pending.withdrawalId,\n });\n clearPendingWithdrawal();\n } else if (pending.status && (RESUMABLE_STATUSES as readonly string[]).includes(pending.status)) {\n // Resumable in-progress withdrawal — local state already restored above.\n // Navigation to the progress screen is handled by OnboardingStateProvider\n // when the withdrawal flow is activated.\n logger.info('[WithdrawalFlow] Found resumable pending withdrawal', {\n status: pending.status,\n withdrawalId: pending.withdrawalId,\n });\n } else {\n // Stale or unrecognized status — expire\n logger.warn('[WithdrawalFlow] Expiring stale pending withdrawal', {\n status: pending.status,\n withdrawalId: pending.withdrawalId,\n });\n saveLastWithdrawalRecord(pending.wallet, {\n actionId: pending.withdrawalId,\n amount: pending.amount,\n tokenSymbol: 'USDC',\n wallet: pending.wallet,\n timestamp: Date.now(),\n status: 'expired',\n });\n setWithdrawalError('A previous withdrawal was interrupted and could not be resumed. Please try again.');\n clearPendingWithdrawal();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const value: WithdrawalFlowContextValue = {\n amount,\n isWithdrawing,\n withdrawalProgressPhase,\n withdrawalError,\n retryable,\n actionId,\n pendingBurnTx,\n pendingBurnExplorerUrl,\n pendingClaimTx,\n destinationChain,\n setDestinationChain,\n transactionResult,\n updateAmount,\n startBridge,\n completeBridge,\n retryBridge,\n };\n\n return (\n <WithdrawalFlowContext.Provider value={value}>\n {children}\n </WithdrawalFlowContext.Provider>\n );\n};\n\nexport const useWithdrawalFlow = (): WithdrawalFlowContextValue => {\n const context = useContext(WithdrawalFlowContext);\n if (!context) {\n throw new Error('useWithdrawalFlow must be used within a WithdrawalFlowProvider');\n }\n return context;\n};\n"]}
|
|
@@ -51,6 +51,7 @@ export interface BridgePhaseResult {
|
|
|
51
51
|
}
|
|
52
52
|
export declare function executeBridgePhase(params: BridgePhaseParams): Promise<BridgePhaseResult>;
|
|
53
53
|
export interface ClaimPhaseParams {
|
|
54
|
+
withdrawalId: string;
|
|
54
55
|
attestation: string;
|
|
55
56
|
message: string;
|
|
56
57
|
evmAddress: string;
|