@n1xyz/wallet-widget 0.0.35-alpha.0 → 0.0.35-alpha.1
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/bridge-assist/cctp-solana.d.ts +33 -0
- package/dist/bridge-assist/cctp-solana.js +392 -0
- package/dist/bridge-assist/cctp-solana.js.map +1 -0
- package/dist/main.css +1 -2
- package/dist/src/adapters/evm.d.ts +39 -0
- package/dist/src/adapters/evm.js +338 -0
- package/dist/src/adapters/evm.js.map +1 -0
- package/dist/src/adapters/factory.d.ts +37 -0
- package/dist/src/adapters/factory.js +82 -0
- package/dist/src/adapters/factory.js.map +1 -0
- package/dist/src/adapters/index.d.ts +33 -0
- package/dist/src/adapters/index.js +36 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/solana.d.ts +37 -0
- package/dist/src/adapters/solana.js +359 -0
- package/dist/src/adapters/solana.js.map +1 -0
- package/dist/src/adapters/types.d.ts +160 -0
- package/dist/src/adapters/types.js +20 -0
- package/dist/src/adapters/types.js.map +1 -0
- package/dist/src/animations/N1Loader.js.map +1 -0
- package/dist/src/animations/N1Loader.json +1 -0
- package/dist/src/animations/Processing.js.map +1 -0
- package/dist/src/animations/Processing.json +1 -0
- package/dist/{components → src/components}/LoadingFallback.d.ts +3 -0
- package/dist/{components → src/components}/LoadingFallback.js +3 -0
- package/dist/src/components/LoadingFallback.js.map +1 -0
- package/dist/{components → src/components}/Logo.d.ts +4 -0
- package/dist/{components → src/components}/Logo.js +4 -0
- package/dist/src/components/Logo.js.map +1 -0
- package/dist/src/components/N1ConnectButton.d.ts +13 -0
- package/dist/src/components/N1ConnectButton.js +66 -0
- package/dist/src/components/N1ConnectButton.js.map +1 -0
- package/dist/src/components/logos/ArbitrumLogo.js.map +1 -0
- package/dist/src/components/logos/BaseLogo.js +6 -0
- package/dist/src/components/logos/BaseLogo.js.map +1 -0
- package/dist/src/components/logos/BeraLogo.js.map +1 -0
- package/dist/src/components/logos/BitcoinLogo.js.map +1 -0
- package/dist/src/components/logos/EthereumLogo.js.map +1 -0
- package/dist/{components → src/components}/logos/HyperliquidLogo.js +1 -1
- package/dist/src/components/logos/HyperliquidLogo.js.map +1 -0
- package/dist/src/components/logos/OptimismLogo.js.map +1 -0
- package/dist/src/components/logos/SolanaLogo.js.map +1 -0
- package/dist/src/components/logos/ZeroOneLogo.js.map +1 -0
- package/dist/src/components/logos/index.js.map +1 -0
- package/dist/src/config/chains.d.ts +18 -0
- package/dist/src/config/chains.js +58 -0
- package/dist/src/config/chains.js.map +1 -0
- package/dist/src/config/dynamic.d.ts +1 -0
- package/dist/src/config/dynamic.js +18 -0
- package/dist/src/config/dynamic.js.map +1 -0
- package/dist/src/config/solana.js.map +1 -0
- package/dist/src/config/turnkey.d.ts +2 -0
- package/dist/src/config/turnkey.js +32 -0
- package/dist/src/config/turnkey.js.map +1 -0
- package/dist/src/context/n1-wallet-context.js.map +1 -0
- package/dist/src/errors/types.d.ts +72 -0
- package/dist/src/errors/types.js +140 -0
- package/dist/src/errors/types.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/N1WalletModal.js +44 -29
- package/dist/src/features/onboarding-flow/N1WalletModal.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/OnboardingFlow.d.ts +2 -1
- package/dist/{features → src/features}/onboarding-flow/OnboardingFlow.js +54 -8
- package/dist/src/features/onboarding-flow/OnboardingFlow.js.map +1 -0
- package/dist/src/features/onboarding-flow/bridge-assist/client.d.ts +42 -0
- package/dist/src/features/onboarding-flow/bridge-assist/client.js +268 -0
- package/dist/src/features/onboarding-flow/bridge-assist/client.js.map +1 -0
- package/dist/src/features/onboarding-flow/bridge-assist/config.d.ts +4 -0
- package/dist/src/features/onboarding-flow/bridge-assist/config.js +11 -0
- package/dist/src/features/onboarding-flow/bridge-assist/config.js.map +1 -0
- package/dist/src/features/onboarding-flow/bridge-assist/index.d.ts +1 -0
- package/dist/src/features/onboarding-flow/bridge-assist/index.js +2 -0
- package/dist/src/features/onboarding-flow/bridge-assist/index.js.map +1 -0
- package/dist/src/features/onboarding-flow/bridge-assist/types.d.ts +5 -0
- package/dist/src/features/onboarding-flow/bridge-assist/types.js +28 -0
- package/dist/src/features/onboarding-flow/bridge-assist/types.js.map +1 -0
- package/dist/src/features/onboarding-flow/cctp/bridgeKitClient.d.ts +35 -0
- package/dist/src/features/onboarding-flow/cctp/bridgeKitClient.js +391 -0
- package/dist/src/features/onboarding-flow/cctp/bridgeKitClient.js.map +1 -0
- package/dist/src/features/onboarding-flow/cctp/clientFactory.d.ts +6 -0
- package/dist/src/features/onboarding-flow/cctp/clientFactory.js +9 -0
- package/dist/src/features/onboarding-flow/cctp/clientFactory.js.map +1 -0
- package/dist/src/features/onboarding-flow/cctp/config.d.ts +16 -0
- package/dist/src/features/onboarding-flow/cctp/config.js +55 -0
- package/dist/src/features/onboarding-flow/cctp/config.js.map +1 -0
- package/dist/src/features/onboarding-flow/cctp/mockCctpClient.d.ts +11 -0
- package/dist/src/features/onboarding-flow/cctp/mockCctpClient.js +85 -0
- package/dist/src/features/onboarding-flow/cctp/mockCctpClient.js.map +1 -0
- package/dist/src/features/onboarding-flow/cctp/solanaClaim.d.ts +1 -0
- package/dist/src/features/onboarding-flow/cctp/solanaClaim.js +2 -0
- package/dist/src/features/onboarding-flow/cctp/solanaClaim.js.map +1 -0
- package/dist/src/features/onboarding-flow/cctp/types.d.ts +50 -0
- package/dist/src/features/onboarding-flow/cctp/types.js +2 -0
- package/dist/src/features/onboarding-flow/cctp/types.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/components/ChainButton.d.ts +5 -2
- package/dist/src/features/onboarding-flow/components/ChainButton.js +14 -0
- package/dist/src/features/onboarding-flow/components/ChainButton.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/components/Header.d.ts +2 -2
- package/dist/src/features/onboarding-flow/components/Header.js +69 -0
- package/dist/src/features/onboarding-flow/components/Header.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/components/ImageWithFallback.d.ts +2 -5
- package/dist/src/features/onboarding-flow/components/ImageWithFallback.js +33 -0
- package/dist/src/features/onboarding-flow/components/ImageWithFallback.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/components/TransactionTable.d.ts +5 -0
- package/dist/{features → src/features}/onboarding-flow/components/TransactionTable.js +8 -3
- package/dist/src/features/onboarding-flow/components/TransactionTable.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/components/WaitingMessage.d.ts +4 -0
- package/dist/src/features/onboarding-flow/components/WaitingMessage.js.map +1 -0
- package/dist/src/features/onboarding-flow/components/index.js.map +1 -0
- package/dist/src/features/onboarding-flow/errors/depositError.d.ts +36 -0
- package/dist/src/features/onboarding-flow/errors/depositError.js +134 -0
- package/dist/src/features/onboarding-flow/errors/depositError.js.map +1 -0
- package/dist/src/features/onboarding-flow/hooks/useBridgeDeposit.d.ts +35 -0
- package/dist/src/features/onboarding-flow/hooks/useBridgeDeposit.js +585 -0
- package/dist/src/features/onboarding-flow/hooks/useBridgeDeposit.js.map +1 -0
- package/dist/src/features/onboarding-flow/hooks/useDepositAuth.d.ts +6 -0
- package/dist/src/features/onboarding-flow/hooks/useDepositAuth.js +141 -0
- package/dist/src/features/onboarding-flow/hooks/useDepositAuth.js.map +1 -0
- package/dist/src/features/onboarding-flow/hooks/useDepositHydration.d.ts +15 -0
- package/dist/src/features/onboarding-flow/hooks/useDepositHydration.js +83 -0
- package/dist/src/features/onboarding-flow/hooks/useDepositHydration.js.map +1 -0
- package/dist/src/features/onboarding-flow/hooks/usePendingDepositState.d.ts +6 -0
- package/dist/src/features/onboarding-flow/hooks/usePendingDepositState.js +45 -0
- package/dist/src/features/onboarding-flow/hooks/usePendingDepositState.js.map +1 -0
- package/dist/src/features/onboarding-flow/hooks/useSolanaDeposit.d.ts +13 -0
- package/dist/src/features/onboarding-flow/hooks/useSolanaDeposit.js +161 -0
- package/dist/src/features/onboarding-flow/hooks/useSolanaDeposit.js.map +1 -0
- package/dist/src/features/onboarding-flow/index.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/providers/DepositFlowProvider.d.ts +10 -3
- package/dist/src/features/onboarding-flow/providers/DepositFlowProvider.js +762 -0
- package/dist/src/features/onboarding-flow/providers/DepositFlowProvider.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/providers/OnboardingStateProvider.d.ts +5 -0
- package/dist/src/features/onboarding-flow/providers/OnboardingStateProvider.js +399 -0
- package/dist/src/features/onboarding-flow/providers/OnboardingStateProvider.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/providers/StateProvider.d.ts +2 -2
- package/dist/{features → src/features}/onboarding-flow/providers/StateProvider.js +2 -2
- package/dist/src/features/onboarding-flow/providers/StateProvider.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/providers/WalletConnectionProvider.d.ts +8 -0
- package/dist/src/features/onboarding-flow/providers/WalletConnectionProvider.js +938 -0
- package/dist/src/features/onboarding-flow/providers/WalletConnectionProvider.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/providers/debug.js +5 -1
- package/dist/src/features/onboarding-flow/providers/debug.js.map +1 -0
- package/dist/src/features/onboarding-flow/providers/index.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/providers/onboardingStateMachine.d.ts +28 -1
- package/dist/{features → src/features}/onboarding-flow/providers/onboardingStateMachine.js +38 -4
- package/dist/src/features/onboarding-flow/providers/onboardingStateMachine.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/00-EntrySelectionScreen.d.ts +4 -0
- package/dist/src/features/onboarding-flow/screens/00-EntrySelectionScreen.js +32 -0
- package/dist/src/features/onboarding-flow/screens/00-EntrySelectionScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/01-ConnectWalletScreen.d.ts +5 -0
- package/dist/{features → src/features}/onboarding-flow/screens/01-ConnectWalletScreen.js +5 -0
- package/dist/src/features/onboarding-flow/screens/01-ConnectWalletScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/02-TurnkeyAuthScreen.d.ts +1 -0
- package/dist/src/features/onboarding-flow/screens/02-TurnkeyAuthScreen.js +25 -0
- package/dist/src/features/onboarding-flow/screens/02-TurnkeyAuthScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/03-TurnkeyPreparingScreen.d.ts +1 -0
- package/dist/src/features/onboarding-flow/screens/03-TurnkeyPreparingScreen.js +25 -0
- package/dist/src/features/onboarding-flow/screens/03-TurnkeyPreparingScreen.js.map +1 -0
- package/dist/{features/onboarding-flow/screens/02-ChainSelectionScreen.d.ts → src/features/onboarding-flow/screens/04-ChainSelectionScreen.d.ts} +11 -11
- package/dist/{features/onboarding-flow/screens/02-ChainSelectionScreen.js → src/features/onboarding-flow/screens/04-ChainSelectionScreen.js} +60 -30
- package/dist/src/features/onboarding-flow/screens/04-ChainSelectionScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/05-AmountInputScreen.d.ts +11 -0
- package/dist/src/features/onboarding-flow/screens/05-AmountInputScreen.js +585 -0
- package/dist/src/features/onboarding-flow/screens/05-AmountInputScreen.js.map +1 -0
- package/dist/{features/onboarding-flow/screens/04-DepositProgressScreen.d.ts → src/features/onboarding-flow/screens/06-DepositProgressScreen.d.ts} +5 -0
- package/dist/src/features/onboarding-flow/screens/06-DepositProgressScreen.js +367 -0
- package/dist/src/features/onboarding-flow/screens/06-DepositProgressScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/07-DepositSuccessScreen.d.ts +6 -0
- package/dist/{features/onboarding-flow/screens/05-DepositSuccessScreen.js → src/features/onboarding-flow/screens/07-DepositSuccessScreen.js} +12 -6
- package/dist/src/features/onboarding-flow/screens/07-DepositSuccessScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/08-AuthLoadingScreen.d.ts +5 -0
- package/dist/{features/onboarding-flow/screens/06-AuthLoadingScreen.js → src/features/onboarding-flow/screens/08-AuthLoadingScreen.js} +6 -2
- package/dist/src/features/onboarding-flow/screens/08-AuthLoadingScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/09-ErrorScreen.d.ts +5 -0
- package/dist/src/features/onboarding-flow/screens/09-ErrorScreen.js +43 -0
- package/dist/src/features/onboarding-flow/screens/09-ErrorScreen.js.map +1 -0
- package/dist/src/features/onboarding-flow/screens/index.d.ts +10 -0
- package/dist/src/features/onboarding-flow/screens/index.js +11 -0
- package/dist/src/features/onboarding-flow/screens/index.js.map +1 -0
- package/dist/src/features/onboarding-flow/turnkey/turnkeySessionMachine.d.ts +1 -0
- package/dist/src/features/onboarding-flow/turnkey/turnkeySessionMachine.js +2 -0
- package/dist/src/features/onboarding-flow/turnkey/turnkeySessionMachine.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/types.d.ts +38 -11
- package/dist/{features → src/features}/onboarding-flow/types.js +5 -0
- package/dist/src/features/onboarding-flow/types.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/bridgeUtils.d.ts +6 -0
- package/dist/src/features/onboarding-flow/utils/bridgeUtils.js +34 -0
- package/dist/src/features/onboarding-flow/utils/bridgeUtils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/attestationUtils.d.ts +29 -0
- package/dist/src/features/onboarding-flow/utils/deposit/attestationUtils.js +82 -0
- package/dist/src/features/onboarding-flow/utils/deposit/attestationUtils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/bridgeUtils.d.ts +5 -0
- package/dist/src/features/onboarding-flow/utils/deposit/bridgeUtils.js +10 -0
- package/dist/src/features/onboarding-flow/utils/deposit/bridgeUtils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/claimConfirmation.d.ts +14 -0
- package/dist/src/features/onboarding-flow/utils/deposit/claimConfirmation.js +94 -0
- package/dist/src/features/onboarding-flow/utils/deposit/claimConfirmation.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/claimSubmission.d.ts +25 -0
- package/dist/src/features/onboarding-flow/utils/deposit/claimSubmission.js +212 -0
- package/dist/src/features/onboarding-flow/utils/deposit/claimSubmission.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/depositPolling.d.ts +37 -0
- package/dist/src/features/onboarding-flow/utils/deposit/depositPolling.js +199 -0
- package/dist/src/features/onboarding-flow/utils/deposit/depositPolling.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/evmTxInterceptor.d.ts +27 -0
- package/dist/src/features/onboarding-flow/utils/deposit/evmTxInterceptor.js +149 -0
- package/dist/src/features/onboarding-flow/utils/deposit/evmTxInterceptor.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/nonceUtils.d.ts +5 -0
- package/dist/src/features/onboarding-flow/utils/deposit/nonceUtils.js +121 -0
- package/dist/src/features/onboarding-flow/utils/deposit/nonceUtils.js.map +1 -0
- package/dist/{features/onboarding-flow/utils/transaction.d.ts → src/features/onboarding-flow/utils/deposit/solanaDepositTransaction.d.ts} +3 -3
- package/dist/src/features/onboarding-flow/utils/deposit/solanaDepositTransaction.js +8 -0
- package/dist/src/features/onboarding-flow/utils/deposit/solanaDepositTransaction.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/solanaUtils.d.ts +12 -0
- package/dist/src/features/onboarding-flow/utils/deposit/solanaUtils.js +150 -0
- package/dist/src/features/onboarding-flow/utils/deposit/solanaUtils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/storage.d.ts +52 -0
- package/dist/src/features/onboarding-flow/utils/deposit/storage.js +243 -0
- package/dist/src/features/onboarding-flow/utils/deposit/storage.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/deposit/walletUtils.d.ts +36 -0
- package/dist/src/features/onboarding-flow/utils/deposit/walletUtils.js +304 -0
- package/dist/src/features/onboarding-flow/utils/deposit/walletUtils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/depositPolling.d.ts +1 -0
- package/dist/src/features/onboarding-flow/utils/depositPolling.js +3 -0
- package/dist/src/features/onboarding-flow/utils/depositPolling.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/explorerUrl.d.ts +14 -0
- package/dist/src/features/onboarding-flow/utils/explorerUrl.js +44 -0
- package/dist/src/features/onboarding-flow/utils/explorerUrl.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/nordUtils.d.ts +8 -0
- package/dist/{features/onboarding-flow/utils/nordUser.js → src/features/onboarding-flow/utils/nordUtils.js} +14 -1
- package/dist/src/features/onboarding-flow/utils/nordUtils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/pendingDepositCookie.d.ts +13 -0
- package/dist/src/features/onboarding-flow/utils/pendingDepositCookie.js +15 -0
- package/dist/src/features/onboarding-flow/utils/pendingDepositCookie.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/pendingDepositStorage.d.ts +15 -0
- package/dist/src/features/onboarding-flow/utils/pendingDepositStorage.js +94 -0
- package/dist/src/features/onboarding-flow/utils/pendingDepositStorage.js.map +1 -0
- package/dist/{features → src/features}/onboarding-flow/utils/utils.d.ts +9 -2
- package/dist/{features → src/features}/onboarding-flow/utils/utils.js +9 -4
- package/dist/src/features/onboarding-flow/utils/utils.js.map +1 -0
- package/dist/src/features/onboarding-flow/utils/withImageFallback.d.ts +6 -0
- package/dist/{features → src/features}/onboarding-flow/utils/withImageFallback.js +2 -3
- package/dist/src/features/onboarding-flow/utils/withImageFallback.js.map +1 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/useN1Wallet.d.ts +12 -0
- package/dist/{hooks → src/hooks}/useN1Wallet.js +10 -0
- package/dist/src/hooks/useN1Wallet.js.map +1 -0
- package/dist/src/hooks/useNordUserInitialization.d.ts +12 -0
- package/dist/{hooks → src/hooks}/useNordUserInitialization.js +74 -33
- package/dist/src/hooks/useNordUserInitialization.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/LazyWalletProvider.d.ts +4 -0
- package/dist/src/providers/LazyWalletProvider.js +404 -0
- package/dist/src/providers/LazyWalletProvider.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/ContextBridge.d.ts +28 -0
- package/dist/src/providers/N1WalletProvider/ContextBridge.js +273 -0
- package/dist/src/providers/N1WalletProvider/ContextBridge.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/ModalProvider.d.ts +113 -0
- package/dist/src/providers/N1WalletProvider/ModalProvider.js +319 -0
- package/dist/src/providers/N1WalletProvider/ModalProvider.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/NetworkProvider.d.ts +88 -0
- package/dist/src/providers/N1WalletProvider/NetworkProvider.js +252 -0
- package/dist/src/providers/N1WalletProvider/NetworkProvider.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/SessionProvider.d.ts +71 -0
- package/dist/src/providers/N1WalletProvider/SessionProvider.js +187 -0
- package/dist/src/providers/N1WalletProvider/SessionProvider.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/SigningProvider.d.ts +58 -0
- package/dist/src/providers/N1WalletProvider/SigningProvider.js +134 -0
- package/dist/src/providers/N1WalletProvider/SigningProvider.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/ThemingProvider.d.ts +50 -0
- package/dist/src/providers/N1WalletProvider/ThemingProvider.js +102 -0
- package/dist/src/providers/N1WalletProvider/ThemingProvider.js.map +1 -0
- package/dist/src/providers/N1WalletProvider/index.d.ts +21 -0
- package/dist/src/providers/N1WalletProvider/index.js +27 -0
- package/dist/src/providers/N1WalletProvider/index.js.map +1 -0
- package/dist/src/providers/N1WalletProvider.d.ts +17 -0
- package/dist/src/providers/N1WalletProvider.js +102 -0
- package/dist/src/providers/N1WalletProvider.js.map +1 -0
- package/dist/{providers → src/providers}/ShadowRootWrapper.d.ts +4 -0
- package/dist/{providers → src/providers}/ShadowRootWrapper.js +4 -5
- package/dist/src/providers/ShadowRootWrapper.js.map +1 -0
- package/dist/{providers → src/providers}/WalletErrorBoundary.d.ts +7 -2
- package/dist/{providers → src/providers}/WalletErrorBoundary.js +5 -1
- package/dist/src/providers/WalletErrorBoundary.js.map +1 -0
- package/dist/src/services/bootstrap/DepositRecoveryService.d.ts +64 -0
- package/dist/src/services/bootstrap/DepositRecoveryService.js +245 -0
- package/dist/src/services/bootstrap/DepositRecoveryService.js.map +1 -0
- package/dist/src/services/bootstrap/DynamicSdkService.d.ts +62 -0
- package/dist/src/services/bootstrap/DynamicSdkService.js +335 -0
- package/dist/src/services/bootstrap/DynamicSdkService.js.map +1 -0
- package/dist/src/services/bootstrap/SessionBootstrapService.d.ts +78 -0
- package/dist/src/services/bootstrap/SessionBootstrapService.js +280 -0
- package/dist/src/services/bootstrap/SessionBootstrapService.js.map +1 -0
- package/dist/src/services/bootstrap/TurnkeyBootstrapService.d.ts +92 -0
- package/dist/src/services/bootstrap/TurnkeyBootstrapService.js +253 -0
- package/dist/src/services/bootstrap/TurnkeyBootstrapService.js.map +1 -0
- package/dist/src/services/bootstrap/index.d.ts +13 -0
- package/dist/src/services/bootstrap/index.js +16 -0
- package/dist/src/services/bootstrap/index.js.map +1 -0
- package/dist/src/services/bootstrap/types.d.ts +92 -0
- package/dist/src/services/bootstrap/types.js +7 -0
- package/dist/src/services/bootstrap/types.js.map +1 -0
- package/dist/src/services/storage/StorageService.d.ts +98 -0
- package/dist/src/services/storage/StorageService.js +360 -0
- package/dist/src/services/storage/StorageService.js.map +1 -0
- package/dist/src/services/storage/index.d.ts +9 -0
- package/dist/src/services/storage/index.js +10 -0
- package/dist/src/services/storage/index.js.map +1 -0
- package/dist/src/services/storage/keys.d.ts +28 -0
- package/dist/src/services/storage/keys.js +45 -0
- package/dist/src/services/storage/keys.js.map +1 -0
- package/dist/src/services/storage/types.d.ts +73 -0
- package/dist/src/services/storage/types.js +23 -0
- package/dist/src/services/storage/types.js.map +1 -0
- package/dist/src/store/index.d.ts +8 -0
- package/dist/src/store/index.js +24 -0
- package/dist/src/store/index.js.map +1 -0
- package/dist/src/store/selectors.d.ts +105 -0
- package/dist/src/store/selectors.js +183 -0
- package/dist/src/store/selectors.js.map +1 -0
- package/dist/src/store/slices/bootstrapSlice.d.ts +64 -0
- package/dist/src/store/slices/bootstrapSlice.js +78 -0
- package/dist/src/store/slices/bootstrapSlice.js.map +1 -0
- package/dist/src/store/slices/configSlice.d.ts +7 -0
- package/dist/src/store/slices/configSlice.js +14 -0
- package/dist/src/store/slices/configSlice.js.map +1 -0
- package/dist/src/store/slices/index.d.ts +10 -0
- package/dist/src/store/slices/index.js +10 -0
- package/dist/src/store/slices/index.js.map +1 -0
- package/dist/src/store/slices/sessionSlice.d.ts +7 -0
- package/dist/src/store/slices/sessionSlice.js +17 -0
- package/dist/src/store/slices/sessionSlice.js.map +1 -0
- package/dist/src/store/slices/signingSlice.d.ts +7 -0
- package/dist/src/store/slices/signingSlice.js +14 -0
- package/dist/src/store/slices/signingSlice.js.map +1 -0
- package/dist/src/store/slices/uiSlice.d.ts +9 -0
- package/dist/src/store/slices/uiSlice.js +25 -0
- package/dist/src/store/slices/uiSlice.js.map +1 -0
- package/dist/src/store/slices/walletSlice.d.ts +7 -0
- package/dist/src/store/slices/walletSlice.js +21 -0
- package/dist/src/store/slices/walletSlice.js.map +1 -0
- package/dist/src/store/store.d.ts +50 -0
- package/dist/src/store/store.js +259 -0
- package/dist/src/store/store.js.map +1 -0
- package/dist/src/store/subscriptions/depositPersistence.d.ts +32 -0
- package/dist/src/store/subscriptions/depositPersistence.js +106 -0
- package/dist/src/store/subscriptions/depositPersistence.js.map +1 -0
- package/dist/src/store/subscriptions/index.d.ts +34 -0
- package/dist/src/store/subscriptions/index.js +73 -0
- package/dist/src/store/subscriptions/index.js.map +1 -0
- package/dist/src/store/subscriptions/turnkeyPersistence.d.ts +42 -0
- package/dist/src/store/subscriptions/turnkeyPersistence.js +127 -0
- package/dist/src/store/subscriptions/turnkeyPersistence.js.map +1 -0
- package/dist/src/store/types.d.ts +166 -0
- package/dist/src/store/types.js +7 -0
- package/dist/src/store/types.js.map +1 -0
- package/dist/src/styles/cdn-fonts.d.ts +12 -0
- package/dist/{styles → src/styles}/cdn-fonts.js +20 -2
- package/dist/src/styles/cdn-fonts.js.map +1 -0
- package/dist/src/styles/embedded-main-css.d.ts +2 -0
- package/dist/src/styles/embedded-main-css.js +3 -0
- package/dist/src/styles/embedded-main-css.js.map +1 -0
- package/dist/src/turnkey/TurnkeyProvider.d.ts +21 -0
- package/dist/src/turnkey/TurnkeyProvider.js +695 -0
- package/dist/src/turnkey/TurnkeyProvider.js.map +1 -0
- package/dist/src/turnkey/createTurnkeyWallet.d.ts +39 -0
- package/dist/src/turnkey/createTurnkeyWallet.js +319 -0
- package/dist/src/turnkey/createTurnkeyWallet.js.map +1 -0
- package/dist/src/turnkey/createWalletProvider.d.ts +8 -0
- package/dist/src/turnkey/createWalletProvider.js +286 -0
- package/dist/src/turnkey/createWalletProvider.js.map +1 -0
- package/dist/src/turnkey/index.d.ts +3 -0
- package/dist/src/turnkey/index.js +3 -0
- package/dist/src/turnkey/index.js.map +1 -0
- package/dist/src/turnkey/turnkeySessionMachine.d.ts +39 -0
- package/dist/src/turnkey/turnkeySessionMachine.js +77 -0
- package/dist/src/turnkey/turnkeySessionMachine.js.map +1 -0
- package/dist/src/turnkey/turnkeySessionStorage.d.ts +48 -0
- package/dist/src/turnkey/turnkeySessionStorage.js +183 -0
- package/dist/src/turnkey/turnkeySessionStorage.js.map +1 -0
- package/dist/src/turnkey/types.d.ts +61 -0
- package/dist/src/turnkey/types.js +12 -0
- package/dist/src/turnkey/types.js.map +1 -0
- package/dist/{types → src/types}/wallet.d.ts +39 -13
- package/dist/src/types/wallet.js.map +1 -0
- package/dist/src/utils/address.d.ts +130 -0
- package/dist/src/utils/address.js +274 -0
- package/dist/src/utils/address.js.map +1 -0
- package/dist/src/utils/chain.d.ts +89 -0
- package/dist/src/utils/chain.js +282 -0
- package/dist/src/utils/chain.js.map +1 -0
- package/dist/{utils → src/utils}/ed25519.d.ts +0 -2
- package/dist/{utils → src/utils}/ed25519.js +5 -20
- package/dist/src/utils/ed25519.js.map +1 -0
- package/dist/src/utils/errors.d.ts +68 -0
- package/dist/src/utils/errors.js +190 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/events.d.ts +124 -0
- package/dist/src/utils/events.js +155 -0
- package/dist/src/utils/events.js.map +1 -0
- package/dist/src/utils/formatAmount.d.ts +4 -0
- package/dist/src/utils/formatAmount.js +9 -0
- package/dist/src/utils/formatAmount.js.map +1 -0
- package/dist/src/utils/logger.d.ts +45 -0
- package/dist/{utils → src/utils}/logger.js +68 -2
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/shortenString.d.ts +5 -0
- package/dist/src/utils/shortenString.js +16 -0
- package/dist/src/utils/shortenString.js.map +1 -0
- package/package.json +45 -29
- package/dist/animations/N1Loader.js.map +0 -1
- package/dist/animations/Processing.js.map +0 -1
- package/dist/components/LoadingFallback.js.map +0 -1
- package/dist/components/Logo.js.map +0 -1
- package/dist/components/N1ConnectButton.d.ts +0 -5
- package/dist/components/N1ConnectButton.js +0 -49
- package/dist/components/N1ConnectButton.js.map +0 -1
- package/dist/components/logos/ArbitrumLogo.js.map +0 -1
- package/dist/components/logos/BaseLogo.js +0 -6
- package/dist/components/logos/BaseLogo.js.map +0 -1
- package/dist/components/logos/BeraLogo.js.map +0 -1
- package/dist/components/logos/BitcoinLogo.js.map +0 -1
- package/dist/components/logos/EthereumLogo.js.map +0 -1
- package/dist/components/logos/HyperliquidLogo.js.map +0 -1
- package/dist/components/logos/OptimismLogo.js.map +0 -1
- package/dist/components/logos/SolanaLogo.js.map +0 -1
- package/dist/components/logos/ZeroOneLogo.js.map +0 -1
- package/dist/components/logos/index.js.map +0 -1
- package/dist/config/chains.d.ts +0 -0
- package/dist/config/chains.js +0 -2
- package/dist/config/chains.js.map +0 -1
- package/dist/config/solana.js.map +0 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.js +0 -3
- package/dist/config.js.map +0 -1
- package/dist/context/n1-wallet-context.js.map +0 -1
- package/dist/errors/types.d.ts +0 -25
- package/dist/errors/types.js +0 -77
- package/dist/errors/types.js.map +0 -1
- package/dist/features/onboarding-flow/N1WalletModal.js.map +0 -1
- package/dist/features/onboarding-flow/OnboardingFlow.js.map +0 -1
- package/dist/features/onboarding-flow/components/ChainButton.js +0 -21
- package/dist/features/onboarding-flow/components/ChainButton.js.map +0 -1
- package/dist/features/onboarding-flow/components/Header.js +0 -45
- package/dist/features/onboarding-flow/components/Header.js.map +0 -1
- package/dist/features/onboarding-flow/components/ImageWithFallback.js +0 -63
- package/dist/features/onboarding-flow/components/ImageWithFallback.js.map +0 -1
- package/dist/features/onboarding-flow/components/TransactionTable.js.map +0 -1
- package/dist/features/onboarding-flow/components/WaitingMessage.js.map +0 -1
- package/dist/features/onboarding-flow/components/index.js.map +0 -1
- package/dist/features/onboarding-flow/index.js.map +0 -1
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js +0 -525
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js.map +0 -1
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js +0 -185
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js.map +0 -1
- package/dist/features/onboarding-flow/providers/StateProvider.js.map +0 -1
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js +0 -394
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js.map +0 -1
- package/dist/features/onboarding-flow/providers/debug.js.map +0 -1
- package/dist/features/onboarding-flow/providers/index.js.map +0 -1
- package/dist/features/onboarding-flow/providers/onboardingStateMachine.js.map +0 -1
- package/dist/features/onboarding-flow/screens/01-ConnectWalletScreen.d.ts +0 -1
- package/dist/features/onboarding-flow/screens/01-ConnectWalletScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/02-ChainSelectionScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.d.ts +0 -6
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.js +0 -360
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/04-DepositProgressScreen.js +0 -31
- package/dist/features/onboarding-flow/screens/04-DepositProgressScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/05-DepositSuccessScreen.d.ts +0 -1
- package/dist/features/onboarding-flow/screens/05-DepositSuccessScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/06-AuthLoadingScreen.d.ts +0 -1
- package/dist/features/onboarding-flow/screens/06-AuthLoadingScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.d.ts +0 -1
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.js +0 -14
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.js.map +0 -1
- package/dist/features/onboarding-flow/screens/index.d.ts +0 -7
- package/dist/features/onboarding-flow/screens/index.js +0 -8
- package/dist/features/onboarding-flow/screens/index.js.map +0 -1
- package/dist/features/onboarding-flow/types.js.map +0 -1
- package/dist/features/onboarding-flow/utils/depositStorage.d.ts +0 -4
- package/dist/features/onboarding-flow/utils/depositStorage.js +0 -48
- package/dist/features/onboarding-flow/utils/depositStorage.js.map +0 -1
- package/dist/features/onboarding-flow/utils/imageUtils.d.ts +0 -21
- package/dist/features/onboarding-flow/utils/imageUtils.js +0 -110
- package/dist/features/onboarding-flow/utils/imageUtils.js.map +0 -1
- package/dist/features/onboarding-flow/utils/nordUser.d.ts +0 -1
- package/dist/features/onboarding-flow/utils/nordUser.js.map +0 -1
- package/dist/features/onboarding-flow/utils/nordUtils.d.ts +0 -40
- package/dist/features/onboarding-flow/utils/nordUtils.js +0 -64
- package/dist/features/onboarding-flow/utils/nordUtils.js.map +0 -1
- package/dist/features/onboarding-flow/utils/session.d.ts +0 -17
- package/dist/features/onboarding-flow/utils/session.js +0 -69
- package/dist/features/onboarding-flow/utils/session.js.map +0 -1
- package/dist/features/onboarding-flow/utils/transaction.js +0 -8
- package/dist/features/onboarding-flow/utils/transaction.js.map +0 -1
- package/dist/features/onboarding-flow/utils/utils.js.map +0 -1
- package/dist/features/onboarding-flow/utils/withImageFallback.d.ts +0 -7
- package/dist/features/onboarding-flow/utils/withImageFallback.js.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/useN1Wallet.d.ts +0 -2
- package/dist/hooks/useN1Wallet.js.map +0 -1
- package/dist/hooks/useNordUserInitialization.d.ts +0 -1
- package/dist/hooks/useNordUserInitialization.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
- package/dist/polyfills/windowEthereumGuard.d.ts +0 -6
- package/dist/polyfills/windowEthereumGuard.js +0 -28
- package/dist/polyfills/windowEthereumGuard.js.map +0 -1
- package/dist/providers/LazyWalletProvider.d.ts +0 -1
- package/dist/providers/LazyWalletProvider.js +0 -230
- package/dist/providers/LazyWalletProvider.js.map +0 -1
- package/dist/providers/N1WalletProvider.d.ts +0 -3
- package/dist/providers/N1WalletProvider.js +0 -271
- package/dist/providers/N1WalletProvider.js.map +0 -1
- package/dist/providers/ShadowRootWrapper.js.map +0 -1
- package/dist/providers/WalletErrorBoundary.js.map +0 -1
- package/dist/styles/cdn-fonts.d.ts +0 -1
- package/dist/styles/cdn-fonts.js.map +0 -1
- package/dist/styles/embedded-main-css.d.ts +0 -2
- package/dist/styles/embedded-main-css.js +0 -3
- package/dist/styles/embedded-main-css.js.map +0 -1
- package/dist/types/wallet.js.map +0 -1
- package/dist/utils/ed25519.js.map +0 -1
- package/dist/utils/getPseudoName.d.ts +0 -1
- package/dist/utils/getPseudoName.js +0 -5826
- package/dist/utils/getPseudoName.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -21
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/shortenString.d.ts +0 -2
- package/dist/utils/shortenString.js +0 -9
- package/dist/utils/shortenString.js.map +0 -1
- package/dist/utils/words.d.ts +0 -9
- package/dist/utils/words.js +0 -93572
- package/dist/utils/words.js.map +0 -1
- /package/dist/{animations → src/animations}/N1Loader.d.ts +0 -0
- /package/dist/{animations → src/animations}/N1Loader.js +0 -0
- /package/dist/{animations → src/animations}/Processing.d.ts +0 -0
- /package/dist/{animations → src/animations}/Processing.js +0 -0
- /package/dist/{components → src/components}/logos/ArbitrumLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/ArbitrumLogo.js +0 -0
- /package/dist/{components → src/components}/logos/BaseLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/BeraLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/BeraLogo.js +0 -0
- /package/dist/{components → src/components}/logos/BitcoinLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/BitcoinLogo.js +0 -0
- /package/dist/{components → src/components}/logos/EthereumLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/EthereumLogo.js +0 -0
- /package/dist/{components → src/components}/logos/HyperliquidLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/OptimismLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/OptimismLogo.js +0 -0
- /package/dist/{components → src/components}/logos/SolanaLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/SolanaLogo.js +0 -0
- /package/dist/{components → src/components}/logos/ZeroOneLogo.d.ts +0 -0
- /package/dist/{components → src/components}/logos/ZeroOneLogo.js +0 -0
- /package/dist/{components → src/components}/logos/index.d.ts +0 -0
- /package/dist/{components → src/components}/logos/index.js +0 -0
- /package/dist/{config → src/config}/solana.d.ts +0 -0
- /package/dist/{config → src/config}/solana.js +0 -0
- /package/dist/{context → src/context}/n1-wallet-context.d.ts +0 -0
- /package/dist/{context → src/context}/n1-wallet-context.js +0 -0
- /package/dist/{features → src/features}/onboarding-flow/N1WalletModal.d.ts +0 -0
- /package/dist/{features → src/features}/onboarding-flow/components/WaitingMessage.js +0 -0
- /package/dist/{features → src/features}/onboarding-flow/components/index.d.ts +0 -0
- /package/dist/{features → src/features}/onboarding-flow/components/index.js +0 -0
- /package/dist/{features → src/features}/onboarding-flow/index.d.ts +0 -0
- /package/dist/{features → src/features}/onboarding-flow/index.js +0 -0
- /package/dist/{features → src/features}/onboarding-flow/providers/debug.d.ts +0 -0
- /package/dist/{features → src/features}/onboarding-flow/providers/index.d.ts +0 -0
- /package/dist/{features → src/features}/onboarding-flow/providers/index.js +0 -0
- /package/dist/{hooks → src/hooks}/index.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/index.js +0 -0
- /package/dist/{types → src/types}/wallet.js +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
38
|
+
import { getSolanaRpcUrl } from '../../../../config/solana';
|
|
39
|
+
import { mapChainToBridgeKit } from '../../cctp/bridgeKitClient';
|
|
40
|
+
/**
|
|
41
|
+
* Confirms the claim transaction (optional), then reads USDC token balance for the destination address.
|
|
42
|
+
* Returns the amount string that should be deposited to Nord.
|
|
43
|
+
*/
|
|
44
|
+
export var confirmClaimAndGetUsdcBalance = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
|
|
45
|
+
var rpcEndpoint, connection, shouldConfirmOnChain, confirmation, solanaChain, usdcMint, owner, tokenAccounts, totalRaw, decimals, _i, _c, acct, parsed, availableUsdc, amountToDeposit;
|
|
46
|
+
var _d, _e, _f, _g, _h;
|
|
47
|
+
var signature = _b.signature, destinationAddress = _b.destinationAddress, amountHint = _b.amountHint, skipConfirmation = _b.skipConfirmation;
|
|
48
|
+
return __generator(this, function (_j) {
|
|
49
|
+
switch (_j.label) {
|
|
50
|
+
case 0:
|
|
51
|
+
rpcEndpoint = process.env.NEXT_PUBLIC_NORD_SOLANA_URL || getSolanaRpcUrl();
|
|
52
|
+
connection = new Connection(rpcEndpoint);
|
|
53
|
+
shouldConfirmOnChain = Boolean(signature) && !skipConfirmation;
|
|
54
|
+
if (!(shouldConfirmOnChain && signature)) return [3 /*break*/, 2];
|
|
55
|
+
return [4 /*yield*/, connection.confirmTransaction(signature, 'finalized')];
|
|
56
|
+
case 1:
|
|
57
|
+
confirmation = _j.sent();
|
|
58
|
+
if ((_d = confirmation.value) === null || _d === void 0 ? void 0 : _d.err) {
|
|
59
|
+
throw new Error('Claim transaction failed on-chain');
|
|
60
|
+
}
|
|
61
|
+
_j.label = 2;
|
|
62
|
+
case 2:
|
|
63
|
+
solanaChain = mapChainToBridgeKit('solana');
|
|
64
|
+
usdcMint = new PublicKey(solanaChain.usdcAddress);
|
|
65
|
+
owner = new PublicKey(destinationAddress);
|
|
66
|
+
return [4 /*yield*/, connection.getParsedTokenAccountsByOwner(owner, { mint: usdcMint })];
|
|
67
|
+
case 3:
|
|
68
|
+
tokenAccounts = _j.sent();
|
|
69
|
+
totalRaw = BigInt(0);
|
|
70
|
+
decimals = 6;
|
|
71
|
+
for (_i = 0, _c = tokenAccounts.value; _i < _c.length; _i++) {
|
|
72
|
+
acct = _c[_i];
|
|
73
|
+
parsed = (_g = (_f = (_e = acct.account.data) === null || _e === void 0 ? void 0 : _e.parsed) === null || _f === void 0 ? void 0 : _f.info) === null || _g === void 0 ? void 0 : _g.tokenAmount;
|
|
74
|
+
if (parsed === null || parsed === void 0 ? void 0 : parsed.amount) {
|
|
75
|
+
decimals = (_h = parsed.decimals) !== null && _h !== void 0 ? _h : decimals;
|
|
76
|
+
totalRaw += BigInt(parsed.amount);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
availableUsdc = Number(totalRaw) / Math.pow(10, decimals);
|
|
80
|
+
// If we are explicitly skipping confirmation (typically "nonce already processed" recovery),
|
|
81
|
+
// do NOT fall back to amountHint. If USDC is not present, it's very likely the user already
|
|
82
|
+
// completed the Nord deposit earlier (or moved funds), so retrying would be misleading.
|
|
83
|
+
if (skipConfirmation && availableUsdc <= 0) {
|
|
84
|
+
throw new Error('No USDC available to deposit. This deposit may already be completed. If your deposit was successful, you can click "Start Over" to clear this state.');
|
|
85
|
+
}
|
|
86
|
+
amountToDeposit = availableUsdc > 0 ? availableUsdc : Number(amountHint !== null && amountHint !== void 0 ? amountHint : 0);
|
|
87
|
+
if (!Number.isFinite(amountToDeposit) || amountToDeposit <= 0) {
|
|
88
|
+
throw new Error('No USDC available after claim to deposit');
|
|
89
|
+
}
|
|
90
|
+
return [2 /*return*/, { amount: amountToDeposit.toString(), txSignature: signature }];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}); };
|
|
94
|
+
//# sourceMappingURL=claimConfirmation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claimConfirmation.js","sourceRoot":"","sources":["../../../../../../src/features/onboarding-flow/utils/deposit/claimConfirmation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AASjE;;;GAGG;AACH,MAAM,CAAC,IAAM,6BAA6B,GAAG,iEAAO,EAKd;;;QAJpC,SAAS,eAAA,EACT,kBAAkB,wBAAA,EAClB,UAAU,gBAAA,EACV,gBAAgB,sBAAA;;;;gBAEV,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,eAAe,EAAE,CAAC;gBAC3E,UAAU,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;gBAEzC,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;qBACjE,CAAA,oBAAoB,IAAI,SAAS,CAAA,EAAjC,wBAAiC;gBACd,qBAAM,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAA;;gBAA1E,YAAY,GAAG,SAA2D;gBAChF,IAAI,MAAA,YAAY,CAAC,KAAK,0CAAE,GAAG,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACvD,CAAC;;;gBAGG,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,QAAQ,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBAClD,KAAK,GAAG,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAG1B,qBAAM,UAAU,CAAC,6BAA6B,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAA;;gBAAzF,aAAa,GAAG,SAAyE;gBAE3F,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrB,QAAQ,GAAG,CAAC,CAAC;gBAEjB,WAAsC,EAAnB,KAAA,aAAa,CAAC,KAAK,EAAnB,cAAmB,EAAnB,IAAmB,EAAE,CAAC;oBAA9B,IAAI;oBACP,MAAM,GAAG,MAAA,MAAA,MAAC,IAAI,CAAC,OAAO,CAAC,IAAY,0CAAE,MAAM,0CAAE,IAAI,0CAAE,WAAW,CAAC;oBACrE,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE,CAAC;wBACnB,QAAQ,GAAG,MAAA,MAAM,CAAC,QAAQ,mCAAI,QAAQ,CAAC;wBACvC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAEK,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAA,EAAE,EAAI,QAAQ,CAAA,CAAC;gBACxD,6FAA6F;gBAC7F,4FAA4F;gBAC5F,wFAAwF;gBACxF,IAAI,gBAAgB,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,sJAAsJ,CAAC,CAAC;gBAC1K,CAAC;gBAEK,eAAe,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,CAAC,CAAC;gBAEpF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;oBAC9D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,CAAC;gBAED,sBAAO,EAAE,MAAM,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAC;;;KACvE,CAAC","sourcesContent":["import { Connection, PublicKey } from '@solana/web3.js';\nimport { getSolanaRpcUrl } from '../../../../config/solana';\nimport { mapChainToBridgeKit } from '../../cctp/bridgeKitClient';\n\nexport interface ConfirmClaimAndGetUsdcBalanceParams {\n signature: string | null;\n destinationAddress: string;\n amountHint?: string | number | null;\n skipConfirmation?: boolean;\n}\n\n/**\n * Confirms the claim transaction (optional), then reads USDC token balance for the destination address.\n * Returns the amount string that should be deposited to Nord.\n */\nexport const confirmClaimAndGetUsdcBalance = async ({\n signature,\n destinationAddress,\n amountHint,\n skipConfirmation,\n}: ConfirmClaimAndGetUsdcBalanceParams): Promise<{ amount: string; txSignature: string | null }> => {\n const rpcEndpoint = process.env.NEXT_PUBLIC_NORD_SOLANA_URL || getSolanaRpcUrl();\n const connection = new Connection(rpcEndpoint);\n\n const shouldConfirmOnChain = Boolean(signature) && !skipConfirmation;\n if (shouldConfirmOnChain && signature) {\n const confirmation = await connection.confirmTransaction(signature, 'finalized');\n if (confirmation.value?.err) {\n throw new Error('Claim transaction failed on-chain');\n }\n }\n\n const solanaChain = mapChainToBridgeKit('solana');\n const usdcMint = new PublicKey(solanaChain.usdcAddress);\n const owner = new PublicKey(destinationAddress);\n\n // Use parsed token accounts to avoid SPL decoding issues in some environments.\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(owner, { mint: usdcMint });\n\n let totalRaw = BigInt(0);\n let decimals = 6;\n\n for (const acct of tokenAccounts.value) {\n const parsed = (acct.account.data as any)?.parsed?.info?.tokenAmount;\n if (parsed?.amount) {\n decimals = parsed.decimals ?? decimals;\n totalRaw += BigInt(parsed.amount);\n }\n }\n\n const availableUsdc = Number(totalRaw) / 10 ** decimals;\n // If we are explicitly skipping confirmation (typically \"nonce already processed\" recovery),\n // do NOT fall back to amountHint. If USDC is not present, it's very likely the user already\n // completed the Nord deposit earlier (or moved funds), so retrying would be misleading.\n if (skipConfirmation && availableUsdc <= 0) {\n throw new Error('No USDC available to deposit. This deposit may already be completed. If your deposit was successful, you can click \"Start Over\" to clear this state.');\n }\n\n const amountToDeposit = availableUsdc > 0 ? availableUsdc : Number(amountHint ?? 0);\n\n if (!Number.isFinite(amountToDeposit) || amountToDeposit <= 0) {\n throw new Error('No USDC available after claim to deposit');\n }\n\n return { amount: amountToDeposit.toString(), txSignature: signature };\n};\n\n\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type SolanaWalletLike = {
|
|
2
|
+
chain?: string;
|
|
3
|
+
getSigner: () => Promise<{
|
|
4
|
+
signTransaction?: (tx: unknown) => Promise<unknown>;
|
|
5
|
+
} | null>;
|
|
6
|
+
};
|
|
7
|
+
export interface SubmitClaimWithRetryParams {
|
|
8
|
+
depositId: string;
|
|
9
|
+
message: string;
|
|
10
|
+
attestation: string;
|
|
11
|
+
sourceChain: string;
|
|
12
|
+
destinationAddress: string;
|
|
13
|
+
lookupTableAddress: string;
|
|
14
|
+
solanaWallet: SolanaWalletLike;
|
|
15
|
+
fallbackWallet: string;
|
|
16
|
+
fallbackAmount: string;
|
|
17
|
+
bridgeTx: string;
|
|
18
|
+
attestationId: string | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Submits a claim to Bridge Assist. If the deposit does not exist on the server (404),
|
|
22
|
+
* it will create it and retry once.
|
|
23
|
+
*/
|
|
24
|
+
export declare const submitClaimWithRetry: (params: SubmitClaimWithRetryParams) => Promise<string>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { Buffer } from 'buffer';
|
|
38
|
+
import { PublicKey, VersionedTransaction } from '@solana/web3.js';
|
|
39
|
+
import { BridgeAssistError } from '../../bridge-assist/types';
|
|
40
|
+
import { createBridgeDeposit, fetchServerFeePayer, submitBridgeClaim } from '../../bridge-assist';
|
|
41
|
+
import { constructCctpClaimTx, hashVersionedTransaction } from '../../cctp/solanaClaim';
|
|
42
|
+
import { delay } from './solanaUtils';
|
|
43
|
+
var FEE_PAYER_WAIT_MAX_MS = 60000;
|
|
44
|
+
var FEE_PAYER_BACKOFF_MS = [1000, 2000, 5000, 10000, 15000];
|
|
45
|
+
var fetchServerFeePayerWithRetry = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
46
|
+
var startedAt, attempt, lastError, feePayer, e_1, backoff;
|
|
47
|
+
return __generator(this, function (_a) {
|
|
48
|
+
switch (_a.label) {
|
|
49
|
+
case 0:
|
|
50
|
+
startedAt = Date.now();
|
|
51
|
+
attempt = 0;
|
|
52
|
+
lastError = null;
|
|
53
|
+
_a.label = 1;
|
|
54
|
+
case 1:
|
|
55
|
+
if (!(Date.now() - startedAt < FEE_PAYER_WAIT_MAX_MS)) return [3 /*break*/, 7];
|
|
56
|
+
_a.label = 2;
|
|
57
|
+
case 2:
|
|
58
|
+
_a.trys.push([2, 4, , 5]);
|
|
59
|
+
return [4 /*yield*/, fetchServerFeePayer()];
|
|
60
|
+
case 3:
|
|
61
|
+
feePayer = _a.sent();
|
|
62
|
+
if (feePayer)
|
|
63
|
+
return [2 /*return*/, feePayer];
|
|
64
|
+
return [3 /*break*/, 5];
|
|
65
|
+
case 4:
|
|
66
|
+
e_1 = _a.sent();
|
|
67
|
+
lastError = e_1;
|
|
68
|
+
// If the server is unreachable (network/CORS), surface immediately so UI can show it and auto-retry.
|
|
69
|
+
if (e_1 instanceof BridgeAssistError && e_1.status == null) {
|
|
70
|
+
throw e_1;
|
|
71
|
+
}
|
|
72
|
+
return [3 /*break*/, 5];
|
|
73
|
+
case 5:
|
|
74
|
+
backoff = FEE_PAYER_BACKOFF_MS[Math.min(attempt, FEE_PAYER_BACKOFF_MS.length - 1)];
|
|
75
|
+
attempt += 1;
|
|
76
|
+
return [4 /*yield*/, delay(backoff)];
|
|
77
|
+
case 6:
|
|
78
|
+
_a.sent();
|
|
79
|
+
return [3 /*break*/, 1];
|
|
80
|
+
case 7:
|
|
81
|
+
if (lastError instanceof BridgeAssistError) {
|
|
82
|
+
throw lastError;
|
|
83
|
+
}
|
|
84
|
+
throw new Error('Server fee payer not available');
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}); };
|
|
88
|
+
var buildSignAndSubmitClaimTx = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
|
|
89
|
+
var signer, feePayer, built, tx, blockhash, lastValidBlockHeight, signed, userKey, accountKeys, sigIndex, sig, userSignatureBase64, txHash, submission;
|
|
90
|
+
var depositId = _b.depositId, message = _b.message, attestation = _b.attestation, sourceChain = _b.sourceChain, destinationAddress = _b.destinationAddress, lookupTableAddress = _b.lookupTableAddress, solanaWallet = _b.solanaWallet;
|
|
91
|
+
return __generator(this, function (_c) {
|
|
92
|
+
switch (_c.label) {
|
|
93
|
+
case 0:
|
|
94
|
+
if (!lookupTableAddress) {
|
|
95
|
+
throw new Error('CCTP lookup table not configured (NEXT_PUBLIC_CCTP_LOOKUP_TABLE_ADDRESS)');
|
|
96
|
+
}
|
|
97
|
+
if (!depositId)
|
|
98
|
+
throw new Error('Missing deposit ID for claim transaction');
|
|
99
|
+
if (!solanaWallet)
|
|
100
|
+
throw new Error('Solana wallet not connected. Please connect your wallet to finish the claim.');
|
|
101
|
+
if (solanaWallet.chain && solanaWallet.chain !== 'SOL') {
|
|
102
|
+
throw new Error('Connected wallet is not a Solana wallet');
|
|
103
|
+
}
|
|
104
|
+
return [4 /*yield*/, solanaWallet.getSigner()];
|
|
105
|
+
case 1:
|
|
106
|
+
signer = _c.sent();
|
|
107
|
+
if (!(signer === null || signer === void 0 ? void 0 : signer.signTransaction)) {
|
|
108
|
+
throw new Error('Connected wallet cannot sign transactions');
|
|
109
|
+
}
|
|
110
|
+
return [4 /*yield*/, fetchServerFeePayerWithRetry()];
|
|
111
|
+
case 2:
|
|
112
|
+
feePayer = _c.sent();
|
|
113
|
+
return [4 /*yield*/, constructCctpClaimTx({
|
|
114
|
+
message: message,
|
|
115
|
+
attestation: attestation,
|
|
116
|
+
sourceChain: sourceChain,
|
|
117
|
+
destinationAddress: destinationAddress,
|
|
118
|
+
feePayer: feePayer,
|
|
119
|
+
userAddress: destinationAddress,
|
|
120
|
+
lookupTableAddress: lookupTableAddress,
|
|
121
|
+
rpcUrl: process.env.NEXT_PUBLIC_NORD_SOLANA_URL,
|
|
122
|
+
})];
|
|
123
|
+
case 3:
|
|
124
|
+
built = _c.sent();
|
|
125
|
+
if (!built) {
|
|
126
|
+
throw new Error('Failed to build claim transaction locally');
|
|
127
|
+
}
|
|
128
|
+
tx = built.tx, blockhash = built.blockhash, lastValidBlockHeight = built.lastValidBlockHeight;
|
|
129
|
+
return [4 /*yield*/, signer.signTransaction(tx)];
|
|
130
|
+
case 4:
|
|
131
|
+
signed = _c.sent();
|
|
132
|
+
if (!(signed instanceof VersionedTransaction)) {
|
|
133
|
+
throw new Error('Lookup-table claims require a VersionedTransaction');
|
|
134
|
+
}
|
|
135
|
+
userKey = new PublicKey(destinationAddress);
|
|
136
|
+
accountKeys = signed.message.staticAccountKeys;
|
|
137
|
+
sigIndex = accountKeys.findIndex(function (k) { return k.equals(userKey); });
|
|
138
|
+
if (sigIndex < 0) {
|
|
139
|
+
throw new Error('User pubkey not found in transaction account keys');
|
|
140
|
+
}
|
|
141
|
+
sig = signed.signatures[sigIndex];
|
|
142
|
+
if (!sig) {
|
|
143
|
+
throw new Error('User signature missing after signing');
|
|
144
|
+
}
|
|
145
|
+
userSignatureBase64 = Buffer.from(sig).toString('base64');
|
|
146
|
+
txHash = hashVersionedTransaction(signed);
|
|
147
|
+
return [4 /*yield*/, submitBridgeClaim(depositId, {
|
|
148
|
+
message: message,
|
|
149
|
+
attestation: attestation,
|
|
150
|
+
sourceChain: sourceChain,
|
|
151
|
+
destinationAddress: destinationAddress,
|
|
152
|
+
lookupTableAddress: lookupTableAddress,
|
|
153
|
+
blockhash: blockhash,
|
|
154
|
+
lastValidBlockHeight: lastValidBlockHeight,
|
|
155
|
+
userSignature: userSignatureBase64,
|
|
156
|
+
txHash: txHash,
|
|
157
|
+
})];
|
|
158
|
+
case 5:
|
|
159
|
+
submission = _c.sent();
|
|
160
|
+
if (!(submission === null || submission === void 0 ? void 0 : submission.tx)) {
|
|
161
|
+
throw new Error('Bridge Assist did not return a transaction signature');
|
|
162
|
+
}
|
|
163
|
+
return [2 /*return*/, submission.tx];
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}); };
|
|
167
|
+
/**
|
|
168
|
+
* Submits a claim to Bridge Assist. If the deposit does not exist on the server (404),
|
|
169
|
+
* it will create it and retry once.
|
|
170
|
+
*/
|
|
171
|
+
export var submitClaimWithRetry = function (params) { return __awaiter(void 0, void 0, void 0, function () {
|
|
172
|
+
var error_1, status_1, retryAfterMs;
|
|
173
|
+
var _a, _b;
|
|
174
|
+
return __generator(this, function (_c) {
|
|
175
|
+
switch (_c.label) {
|
|
176
|
+
case 0:
|
|
177
|
+
_c.trys.push([0, 2, , 8]);
|
|
178
|
+
return [4 /*yield*/, buildSignAndSubmitClaimTx(params)];
|
|
179
|
+
case 1: return [2 /*return*/, _c.sent()];
|
|
180
|
+
case 2:
|
|
181
|
+
error_1 = _c.sent();
|
|
182
|
+
if (!(error_1 instanceof BridgeAssistError)) return [3 /*break*/, 5];
|
|
183
|
+
status_1 = typeof error_1.status === 'number' ? error_1.status : undefined;
|
|
184
|
+
if (!((typeof status_1 === 'number' && status_1 >= 500) || status_1 == null)) return [3 /*break*/, 5];
|
|
185
|
+
retryAfterMs = ((_a = error_1.retryAfter) !== null && _a !== void 0 ? _a : 3) * 1000;
|
|
186
|
+
return [4 /*yield*/, delay(Math.min(Math.max(retryAfterMs, 1000), 15000))];
|
|
187
|
+
case 3:
|
|
188
|
+
_c.sent();
|
|
189
|
+
return [4 /*yield*/, buildSignAndSubmitClaimTx(params)];
|
|
190
|
+
case 4: return [2 /*return*/, _c.sent()];
|
|
191
|
+
case 5:
|
|
192
|
+
if (!(error_1 instanceof BridgeAssistError) || error_1.status !== 404) {
|
|
193
|
+
throw error_1;
|
|
194
|
+
}
|
|
195
|
+
return [4 /*yield*/, createBridgeDeposit({
|
|
196
|
+
wallet: params.fallbackWallet,
|
|
197
|
+
chain: params.sourceChain,
|
|
198
|
+
solanaAddress: params.destinationAddress,
|
|
199
|
+
amount: params.fallbackAmount,
|
|
200
|
+
bridgeTx: params.bridgeTx,
|
|
201
|
+
depositId: params.depositId,
|
|
202
|
+
attestationId: (_b = params.attestationId) !== null && _b !== void 0 ? _b : undefined,
|
|
203
|
+
})];
|
|
204
|
+
case 6:
|
|
205
|
+
_c.sent();
|
|
206
|
+
return [4 /*yield*/, buildSignAndSubmitClaimTx(params)];
|
|
207
|
+
case 7: return [2 /*return*/, _c.sent()];
|
|
208
|
+
case 8: return [2 /*return*/];
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}); };
|
|
212
|
+
//# sourceMappingURL=claimSubmission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claimSubmission.js","sourceRoot":"","sources":["../../../../../../src/features/onboarding-flow/utils/deposit/claimSubmission.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,IAAM,qBAAqB,GAAG,KAAM,CAAC;AACrC,IAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAM,EAAE,KAAM,CAAC,CAAC;AAEhE,IAAM,4BAA4B,GAAG;;;;;gBAC7B,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB,OAAO,GAAG,CAAC,CAAC;gBACZ,SAAS,GAAY,IAAI,CAAC;;;qBACvB,CAAA,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,qBAAqB,CAAA;;;;gBAEhC,qBAAM,mBAAmB,EAAE,EAAA;;gBAAtC,QAAQ,GAAG,SAA2B;gBAC5C,IAAI,QAAQ;oBAAE,sBAAO,QAAQ,EAAC;;;;gBAE9B,SAAS,GAAG,GAAC,CAAC;gBACd,qGAAqG;gBACrG,IAAI,GAAC,YAAY,iBAAiB,IAAI,GAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;oBACvD,MAAM,GAAC,CAAC;gBACV,CAAC;;;gBAEG,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzF,OAAO,IAAI,CAAC,CAAC;gBACb,qBAAM,KAAK,CAAC,OAAO,CAAC,EAAA;;gBAApB,SAAoB,CAAC;;;gBAEvB,IAAI,SAAS,YAAY,iBAAiB,EAAE,CAAC;oBAC3C,MAAM,SAAS,CAAC;gBAClB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;;;KACnD,CAAC;AAqBF,IAAM,yBAAyB,GAAG,iEAAO,EAQ8D;;QAPrG,SAAS,eAAA,EACT,OAAO,aAAA,EACP,WAAW,iBAAA,EACX,WAAW,iBAAA,EACX,kBAAkB,wBAAA,EAClB,kBAAkB,wBAAA,EAClB,YAAY,kBAAA;;;;gBAEZ,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;gBAC9F,CAAC;gBACD,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC5E,IAAI,CAAC,YAAY;oBAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;gBACnH,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBACvD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;gBAEc,qBAAM,YAAY,CAAC,SAAS,EAAE,EAAA;;gBAAvC,MAAM,GAAG,SAA8B;gBAC7C,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,CAAA,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC/D,CAAC;gBAIgB,qBAAM,4BAA4B,EAAE,EAAA;;gBAA/C,QAAQ,GAAG,SAAoC;gBAEvC,qBAAM,oBAAoB,CAAC;wBACvC,OAAO,SAAA;wBACP,WAAW,aAAA;wBACX,WAAW,aAAA;wBACX,kBAAkB,oBAAA;wBAClB,QAAQ,UAAA;wBACR,WAAW,EAAE,kBAAkB;wBAC/B,kBAAkB,oBAAA;wBAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;qBAChD,CAAC,EAAA;;gBATI,KAAK,GAAG,SASZ;gBAEF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC/D,CAAC;gBAEO,EAAE,GAAsC,KAAK,GAA3C,EAAE,SAAS,GAA2B,KAAK,UAAhC,EAAE,oBAAoB,GAAK,KAAK,qBAAV,CAAW;gBACvC,qBAAM,MAAM,CAAC,eAAe,CAAC,EAAS,CAAC,EAAA;;gBAAhD,MAAM,GAAG,SAAuC;gBACtD,IAAI,CAAC,CAAC,MAAM,YAAY,oBAAoB,CAAC,EAAE,CAAC;oBAC9C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACxE,CAAC;gBAGK,OAAO,GAAG,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAC5C,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;gBAC/C,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAjB,CAAiB,CAAC,CAAC;gBACjE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACK,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,CAAC;gBAEK,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC1D,MAAM,GAAG,wBAAwB,CAAC,MAAa,CAAC,CAAC;gBAEpC,qBAAM,iBAAiB,CAAC,SAAS,EAAE;wBACpD,OAAO,SAAA;wBACP,WAAW,aAAA;wBACX,WAAW,aAAA;wBACX,kBAAkB,oBAAA;wBAClB,kBAAkB,oBAAA;wBAClB,SAAS,WAAA;wBACT,oBAAoB,sBAAA;wBACpB,aAAa,EAAE,mBAAmB;wBAClC,MAAM,QAAA;qBACP,CAAC,EAAA;;gBAVI,UAAU,GAAG,SAUjB;gBAEF,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,EAAE,CAAA,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBAC1E,CAAC;gBAED,sBAAO,UAAU,CAAC,EAAE,EAAC;;;KACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAO,MAAkC;;;;;;;gBAElE,qBAAM,yBAAyB,CAAC,MAAM,CAAC,EAAA;oBAA9C,sBAAO,SAAuC,EAAC;;;qBAG3C,CAAA,OAAK,YAAY,iBAAiB,CAAA,EAAlC,wBAAkC;gBAC9B,WAAS,OAAO,OAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;qBACvE,CAAA,CAAC,OAAO,QAAM,KAAK,QAAQ,IAAI,QAAM,IAAI,GAAG,CAAC,IAAI,QAAM,IAAI,IAAI,CAAA,EAA/D,wBAA+D;gBAC3D,YAAY,GAAG,CAAC,MAAA,OAAK,CAAC,UAAU,mCAAI,CAAC,CAAC,GAAG,IAAI,CAAC;gBACpD,qBAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,KAAM,CAAC,CAAC,EAAA;;gBAA3D,SAA2D,CAAC;gBACrD,qBAAM,yBAAyB,CAAC,MAAM,CAAC,EAAA;oBAA9C,sBAAO,SAAuC,EAAC;;gBAGnD,IAAI,CAAC,CAAC,OAAK,YAAY,iBAAiB,CAAC,IAAI,OAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAClE,MAAM,OAAK,CAAC;gBACd,CAAC;gBAED,qBAAM,mBAAmB,CAAC;wBACxB,MAAM,EAAE,MAAM,CAAC,cAAc;wBAC7B,KAAK,EAAE,MAAM,CAAC,WAAW;wBACzB,aAAa,EAAE,MAAM,CAAC,kBAAkB;wBACxC,MAAM,EAAE,MAAM,CAAC,cAAc;wBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,aAAa,EAAE,MAAA,MAAM,CAAC,aAAa,mCAAI,SAAS;qBACjD,CAAC,EAAA;;gBARF,SAQE,CAAC;gBAEI,qBAAM,yBAAyB,CAAC,MAAM,CAAC,EAAA;oBAA9C,sBAAO,SAAuC,EAAC;;;;KAElD,CAAC","sourcesContent":["import { Buffer } from 'buffer';\nimport { PublicKey, VersionedTransaction } from '@solana/web3.js';\nimport { BridgeAssistError } from '../../bridge-assist/types';\nimport { createBridgeDeposit, fetchServerFeePayer, submitBridgeClaim } from '../../bridge-assist';\nimport { constructCctpClaimTx, hashVersionedTransaction } from '../../cctp/solanaClaim';\nimport { delay } from './solanaUtils';\n\nconst FEE_PAYER_WAIT_MAX_MS = 60_000;\nconst FEE_PAYER_BACKOFF_MS = [1000, 2000, 5000, 10_000, 15_000];\n\nconst fetchServerFeePayerWithRetry = async (): Promise<string> => {\n const startedAt = Date.now();\n let attempt = 0;\n let lastError: unknown = null;\n while (Date.now() - startedAt < FEE_PAYER_WAIT_MAX_MS) {\n try {\n const feePayer = await fetchServerFeePayer();\n if (feePayer) return feePayer;\n } catch (e) {\n lastError = e;\n // If the server is unreachable (network/CORS), surface immediately so UI can show it and auto-retry.\n if (e instanceof BridgeAssistError && e.status == null) {\n throw e;\n }\n }\n const backoff = FEE_PAYER_BACKOFF_MS[Math.min(attempt, FEE_PAYER_BACKOFF_MS.length - 1)];\n attempt += 1;\n await delay(backoff);\n }\n if (lastError instanceof BridgeAssistError) {\n throw lastError;\n }\n throw new Error('Server fee payer not available');\n};\n\ntype SolanaWalletLike = {\n chain?: string;\n getSigner: () => Promise<{ signTransaction?: (tx: unknown) => Promise<unknown> } | null>;\n};\n\nexport interface SubmitClaimWithRetryParams {\n depositId: string;\n message: string;\n attestation: string;\n sourceChain: string;\n destinationAddress: string;\n lookupTableAddress: string;\n solanaWallet: SolanaWalletLike;\n fallbackWallet: string;\n fallbackAmount: string;\n bridgeTx: string;\n attestationId: string | null;\n}\n\nconst buildSignAndSubmitClaimTx = async ({\n depositId,\n message,\n attestation,\n sourceChain,\n destinationAddress,\n lookupTableAddress,\n solanaWallet,\n}: Omit<SubmitClaimWithRetryParams, 'fallbackWallet' | 'fallbackAmount' | 'bridgeTx' | 'attestationId'>): Promise<string> => {\n if (!lookupTableAddress) {\n throw new Error('CCTP lookup table not configured (NEXT_PUBLIC_CCTP_LOOKUP_TABLE_ADDRESS)');\n }\n if (!depositId) throw new Error('Missing deposit ID for claim transaction');\n if (!solanaWallet) throw new Error('Solana wallet not connected. Please connect your wallet to finish the claim.');\n if (solanaWallet.chain && solanaWallet.chain !== 'SOL') {\n throw new Error('Connected wallet is not a Solana wallet');\n }\n\n const signer = await solanaWallet.getSigner();\n if (!signer?.signTransaction) {\n throw new Error('Connected wallet cannot sign transactions');\n }\n\n // Bridge Assist fee payer may briefly be unavailable during server startup.\n // Poll with backoff to avoid pausing the flow.\n const feePayer = await fetchServerFeePayerWithRetry();\n\n const built = await constructCctpClaimTx({\n message,\n attestation,\n sourceChain,\n destinationAddress,\n feePayer,\n userAddress: destinationAddress,\n lookupTableAddress,\n rpcUrl: process.env.NEXT_PUBLIC_NORD_SOLANA_URL,\n });\n\n if (!built) {\n throw new Error('Failed to build claim transaction locally');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = built;\n const signed = await signer.signTransaction(tx as any);\n if (!(signed instanceof VersionedTransaction)) {\n throw new Error('Lookup-table claims require a VersionedTransaction');\n }\n\n // Extract user signature from VersionedTransaction signatures\n const userKey = new PublicKey(destinationAddress);\n const accountKeys = signed.message.staticAccountKeys;\n const sigIndex = accountKeys.findIndex((k) => k.equals(userKey));\n if (sigIndex < 0) {\n throw new Error('User pubkey not found in transaction account keys');\n }\n const sig = signed.signatures[sigIndex];\n if (!sig) {\n throw new Error('User signature missing after signing');\n }\n\n const userSignatureBase64 = Buffer.from(sig).toString('base64');\n const txHash = hashVersionedTransaction(signed as any);\n\n const submission = await submitBridgeClaim(depositId, {\n message,\n attestation,\n sourceChain,\n destinationAddress,\n lookupTableAddress,\n blockhash,\n lastValidBlockHeight,\n userSignature: userSignatureBase64,\n txHash,\n });\n\n if (!submission?.tx) {\n throw new Error('Bridge Assist did not return a transaction signature');\n }\n\n return submission.tx;\n};\n\n/**\n * Submits a claim to Bridge Assist. If the deposit does not exist on the server (404),\n * it will create it and retry once.\n */\nexport const submitClaimWithRetry = async (params: SubmitClaimWithRetryParams): Promise<string> => {\n try {\n return await buildSignAndSubmitClaimTx(params);\n } catch (error) {\n // If Bridge Assist temporarily unavailable, retry once with backoff.\n if (error instanceof BridgeAssistError) {\n const status = typeof error.status === 'number' ? error.status : undefined;\n if ((typeof status === 'number' && status >= 500) || status == null) {\n const retryAfterMs = (error.retryAfter ?? 3) * 1000;\n await delay(Math.min(Math.max(retryAfterMs, 1000), 15_000));\n return await buildSignAndSubmitClaimTx(params);\n }\n }\n if (!(error instanceof BridgeAssistError) || error.status !== 404) {\n throw error;\n }\n\n await createBridgeDeposit({\n wallet: params.fallbackWallet,\n chain: params.sourceChain,\n solanaAddress: params.destinationAddress,\n amount: params.fallbackAmount,\n bridgeTx: params.bridgeTx,\n depositId: params.depositId,\n attestationId: params.attestationId ?? undefined,\n });\n\n return await buildSignAndSubmitClaimTx(params);\n }\n};\n\n\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { PendingDepositStage, PendingDepositState } from './storage';
|
|
2
|
+
export interface DepositStatus {
|
|
3
|
+
stage: PendingDepositStage;
|
|
4
|
+
tx?: string | null;
|
|
5
|
+
reason?: string | null;
|
|
6
|
+
bridgeTx?: string | null;
|
|
7
|
+
mintTx?: string | null;
|
|
8
|
+
attestationId?: string | null;
|
|
9
|
+
depositId?: string | null;
|
|
10
|
+
}
|
|
11
|
+
export type DepositStatusFetcher = (depositId: string) => Promise<DepositStatus | null>;
|
|
12
|
+
export interface DepositPollerOptions {
|
|
13
|
+
fetchStatus: DepositStatusFetcher;
|
|
14
|
+
intervalMs?: number;
|
|
15
|
+
maxIntervalMs?: number;
|
|
16
|
+
jitterMs?: number;
|
|
17
|
+
readStorage?: () => PendingDepositState | null;
|
|
18
|
+
writeStorage?: (state: PendingDepositState) => PendingDepositState | void;
|
|
19
|
+
clearStorage?: () => void;
|
|
20
|
+
onStatus?: (status: DepositStatus) => void;
|
|
21
|
+
onError?: (error: unknown) => void;
|
|
22
|
+
}
|
|
23
|
+
export interface DepositPoller {
|
|
24
|
+
start: (depositId: string) => void;
|
|
25
|
+
stop: () => void;
|
|
26
|
+
isRunning: () => boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates a deposit poller that tracks deposit status through bridge stages.
|
|
30
|
+
*
|
|
31
|
+
* Features:
|
|
32
|
+
* - Exponential backoff on errors (doubles interval up to maxIntervalMs)
|
|
33
|
+
* - Jittered intervals to prevent request synchronization
|
|
34
|
+
* - Storage-based state reconciliation between server and client
|
|
35
|
+
* - Auto-stops on completion (solana_confirmed) or failure
|
|
36
|
+
*/
|
|
37
|
+
export declare const createDepositPoller: (options: DepositPollerOptions) => DepositPoller;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { advancePendingDeposit, clearPendingDeposit, reconcileStages, readPendingDeposit, writePendingDeposit, } from './storage';
|
|
38
|
+
var DEFAULT_INTERVAL_MS = 3000;
|
|
39
|
+
var DEFAULT_MAX_INTERVAL_MS = 15000;
|
|
40
|
+
var DEFAULT_JITTER_MS = 250;
|
|
41
|
+
/**
|
|
42
|
+
* Adds random jitter to polling intervals to prevent synchronized requests.
|
|
43
|
+
*/
|
|
44
|
+
var addJitter = function (base, jitterMs) {
|
|
45
|
+
if (jitterMs <= 0) {
|
|
46
|
+
return base;
|
|
47
|
+
}
|
|
48
|
+
var jitter = Math.floor(Math.random() * jitterMs);
|
|
49
|
+
return base + jitter;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Creates a deposit poller that tracks deposit status through bridge stages.
|
|
53
|
+
*
|
|
54
|
+
* Features:
|
|
55
|
+
* - Exponential backoff on errors (doubles interval up to maxIntervalMs)
|
|
56
|
+
* - Jittered intervals to prevent request synchronization
|
|
57
|
+
* - Storage-based state reconciliation between server and client
|
|
58
|
+
* - Auto-stops on completion (solana_confirmed) or failure
|
|
59
|
+
*/
|
|
60
|
+
export var createDepositPoller = function (options) {
|
|
61
|
+
var _a, _b, _c, _d, _e, _f;
|
|
62
|
+
var readStorageFn = (_a = options.readStorage) !== null && _a !== void 0 ? _a : readPendingDeposit;
|
|
63
|
+
var writeStorageFn = (_b = options.writeStorage) !== null && _b !== void 0 ? _b : writePendingDeposit;
|
|
64
|
+
var clearStorageFn = (_c = options.clearStorage) !== null && _c !== void 0 ? _c : clearPendingDeposit;
|
|
65
|
+
var intervalMs = (_d = options.intervalMs) !== null && _d !== void 0 ? _d : DEFAULT_INTERVAL_MS;
|
|
66
|
+
var maxIntervalMs = (_e = options.maxIntervalMs) !== null && _e !== void 0 ? _e : DEFAULT_MAX_INTERVAL_MS;
|
|
67
|
+
var jitterMs = (_f = options.jitterMs) !== null && _f !== void 0 ? _f : DEFAULT_JITTER_MS;
|
|
68
|
+
var activeDepositId = null;
|
|
69
|
+
var timer = null;
|
|
70
|
+
var currentInterval = intervalMs;
|
|
71
|
+
var running = false;
|
|
72
|
+
var stop = function () {
|
|
73
|
+
running = false;
|
|
74
|
+
activeDepositId = null;
|
|
75
|
+
if (timer) {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
timer = null;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var scheduleNext = function () {
|
|
81
|
+
if (!running || !activeDepositId) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
var delay = addJitter(currentInterval, jitterMs);
|
|
85
|
+
timer = setTimeout(poll, delay);
|
|
86
|
+
};
|
|
87
|
+
var poll = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
88
|
+
var serverStatus, localState, localStage, nextStage, workingState, created, created, error_1;
|
|
89
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
90
|
+
return __generator(this, function (_p) {
|
|
91
|
+
switch (_p.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
if (!activeDepositId) {
|
|
94
|
+
stop();
|
|
95
|
+
return [2 /*return*/];
|
|
96
|
+
}
|
|
97
|
+
_p.label = 1;
|
|
98
|
+
case 1:
|
|
99
|
+
_p.trys.push([1, 3, 4, 5]);
|
|
100
|
+
return [4 /*yield*/, options.fetchStatus(activeDepositId)];
|
|
101
|
+
case 2:
|
|
102
|
+
serverStatus = _p.sent();
|
|
103
|
+
localState = readStorageFn();
|
|
104
|
+
localStage = (_a = localState === null || localState === void 0 ? void 0 : localState.stage) !== null && _a !== void 0 ? _a : 'initiated';
|
|
105
|
+
nextStage = reconcileStages(localStage, serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.stage);
|
|
106
|
+
// Safety check: stop if local state contains a different deposit ID
|
|
107
|
+
if (localState && localState.depositId !== activeDepositId) {
|
|
108
|
+
stop();
|
|
109
|
+
return [2 /*return*/];
|
|
110
|
+
}
|
|
111
|
+
if (serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.stage) {
|
|
112
|
+
(_b = options.onStatus) === null || _b === void 0 ? void 0 : _b.call(options, serverStatus);
|
|
113
|
+
}
|
|
114
|
+
workingState = localState;
|
|
115
|
+
if (!workingState && serverStatus) {
|
|
116
|
+
created = writeStorageFn({
|
|
117
|
+
depositId: activeDepositId,
|
|
118
|
+
wallet: '',
|
|
119
|
+
chain: '',
|
|
120
|
+
amount: '',
|
|
121
|
+
stage: serverStatus.stage,
|
|
122
|
+
tx: (_c = serverStatus.tx) !== null && _c !== void 0 ? _c : null,
|
|
123
|
+
reason: (_d = serverStatus.reason) !== null && _d !== void 0 ? _d : null,
|
|
124
|
+
updatedAt: Date.now(),
|
|
125
|
+
});
|
|
126
|
+
workingState =
|
|
127
|
+
(_e = created) !== null && _e !== void 0 ? _e : readStorageFn();
|
|
128
|
+
}
|
|
129
|
+
// Handle failure: persist error state and stop polling
|
|
130
|
+
if (nextStage === 'failed') {
|
|
131
|
+
if (workingState) {
|
|
132
|
+
advancePendingDeposit(workingState, { stage: 'failed', reason: serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.reason });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
created = writeStorageFn({
|
|
136
|
+
depositId: activeDepositId,
|
|
137
|
+
wallet: '',
|
|
138
|
+
chain: '',
|
|
139
|
+
amount: '',
|
|
140
|
+
stage: 'failed',
|
|
141
|
+
tx: (_f = serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.tx) !== null && _f !== void 0 ? _f : null,
|
|
142
|
+
reason: (_g = serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.reason) !== null && _g !== void 0 ? _g : null,
|
|
143
|
+
updatedAt: Date.now(),
|
|
144
|
+
});
|
|
145
|
+
workingState =
|
|
146
|
+
(_h = created) !== null && _h !== void 0 ? _h : readStorageFn();
|
|
147
|
+
}
|
|
148
|
+
stop();
|
|
149
|
+
return [2 /*return*/];
|
|
150
|
+
}
|
|
151
|
+
if (workingState) {
|
|
152
|
+
advancePendingDeposit(workingState, {
|
|
153
|
+
stage: nextStage,
|
|
154
|
+
tx: (_k = (_j = serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.tx) !== null && _j !== void 0 ? _j : workingState.tx) !== null && _k !== void 0 ? _k : null,
|
|
155
|
+
reason: (_m = (_l = serverStatus === null || serverStatus === void 0 ? void 0 : serverStatus.reason) !== null && _l !== void 0 ? _l : workingState.reason) !== null && _m !== void 0 ? _m : null,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// Completion: clear storage and stop polling
|
|
159
|
+
if (nextStage === 'solana_confirmed') {
|
|
160
|
+
clearStorageFn();
|
|
161
|
+
stop();
|
|
162
|
+
return [2 /*return*/];
|
|
163
|
+
}
|
|
164
|
+
// Reset interval on success
|
|
165
|
+
currentInterval = intervalMs;
|
|
166
|
+
return [3 /*break*/, 5];
|
|
167
|
+
case 3:
|
|
168
|
+
error_1 = _p.sent();
|
|
169
|
+
// Exponential backoff on errors
|
|
170
|
+
currentInterval = Math.min(currentInterval * 2, maxIntervalMs);
|
|
171
|
+
(_o = options.onError) === null || _o === void 0 ? void 0 : _o.call(options, error_1);
|
|
172
|
+
return [3 /*break*/, 5];
|
|
173
|
+
case 4:
|
|
174
|
+
scheduleNext();
|
|
175
|
+
return [7 /*endfinally*/];
|
|
176
|
+
case 5: return [2 /*return*/];
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}); };
|
|
180
|
+
var start = function (depositId) {
|
|
181
|
+
if (!depositId) {
|
|
182
|
+
throw new Error('Deposit id is required to start polling');
|
|
183
|
+
}
|
|
184
|
+
if (activeDepositId === depositId && running) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
stop();
|
|
188
|
+
activeDepositId = depositId;
|
|
189
|
+
running = true;
|
|
190
|
+
currentInterval = intervalMs;
|
|
191
|
+
void poll();
|
|
192
|
+
};
|
|
193
|
+
return {
|
|
194
|
+
start: start,
|
|
195
|
+
stop: stop,
|
|
196
|
+
isRunning: function () { return running; },
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=depositPolling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depositPolling.js","sourceRoot":"","sources":["../../../../../../src/features/onboarding-flow/utils/deposit/depositPolling.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAGL,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AA0BnB,IAAM,mBAAmB,GAAG,IAAK,CAAC;AAClC,IAAM,uBAAuB,GAAG,KAAM,CAAC;AACvC,IAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B;;GAEG;AACH,IAAM,SAAS,GAAG,UAAC,IAAY,EAAE,QAAgB;IAC/C,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;IACpD,OAAO,IAAI,GAAG,MAAM,CAAC;AACvB,CAAC,CAAC;AAQF;;;;;;;;GAQG;AACH,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,OAA6B;;IAC/D,IAAM,aAAa,GAAG,MAAA,OAAO,CAAC,WAAW,mCAAI,kBAAkB,CAAC;IAChE,IAAM,cAAc,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,mBAAmB,CAAC;IACnE,IAAM,cAAc,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,mBAAmB,CAAC;IACnE,IAAM,UAAU,GAAG,MAAA,OAAO,CAAC,UAAU,mCAAI,mBAAmB,CAAC;IAC7D,IAAM,aAAa,GAAG,MAAA,OAAO,CAAC,aAAa,mCAAI,uBAAuB,CAAC;IACvE,IAAM,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,iBAAiB,CAAC;IAEvD,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,eAAe,GAAG,UAAU,CAAC;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAM,IAAI,GAAG;QACX,OAAO,GAAG,KAAK,CAAC;QAChB,eAAe,GAAG,IAAI,CAAC;QACvB,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,IAAM,YAAY,GAAG;QACnB,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAM,KAAK,GAAG,SAAS,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QACnD,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,IAAM,IAAI,GAAG;;;;;;oBACX,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,IAAI,EAAE,CAAC;wBACP,sBAAO;oBACT,CAAC;;;;oBAEsB,qBAAM,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,EAAA;;oBAAzD,YAAY,GAAG,SAA0C;oBACzD,UAAU,GAAG,aAAa,EAAE,CAAC;oBAC7B,UAAU,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,mCAAI,WAAW,CAAC;oBAC9C,SAAS,GAAG,eAAe,CAAC,UAAU,EAAE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC,CAAC;oBAEnE,oEAAoE;oBACpE,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;wBAC3D,IAAI,EAAE,CAAC;wBACP,sBAAO;oBACT,CAAC;oBAED,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,EAAE,CAAC;wBACxB,MAAA,OAAO,CAAC,QAAQ,wDAAG,YAAY,CAAC,CAAC;oBACnC,CAAC;oBAEG,YAAY,GAAG,UAAU,CAAC;oBAC9B,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;wBAC5B,OAAO,GAAG,cAAc,CAAC;4BAC7B,SAAS,EAAE,eAAe;4BAC1B,MAAM,EAAE,EAAE;4BACV,KAAK,EAAE,EAAE;4BACT,MAAM,EAAE,EAAE;4BACV,KAAK,EAAE,YAAY,CAAC,KAAK;4BACzB,EAAE,EAAE,MAAA,YAAY,CAAC,EAAE,mCAAI,IAAI;4BAC3B,MAAM,EAAE,MAAA,YAAY,CAAC,MAAM,mCAAI,IAAI;4BACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;yBACtB,CAAC,CAAC;wBACH,YAAY;4BACV,MAAC,OAAkD,mCAAI,aAAa,EAAE,CAAC;oBAC3E,CAAC;oBAED,uDAAuD;oBACvD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;wBAC3B,IAAI,YAAY,EAAE,CAAC;4BACjB,qBAAqB,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE,CAAC,CAAC;wBACzF,CAAC;6BAAM,CAAC;4BACA,OAAO,GAAG,cAAc,CAAC;gCAC7B,SAAS,EAAE,eAAe;gCAC1B,MAAM,EAAE,EAAE;gCACV,KAAK,EAAE,EAAE;gCACT,MAAM,EAAE,EAAE;gCACV,KAAK,EAAE,QAAQ;gCACf,EAAE,EAAE,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,EAAE,mCAAI,IAAI;gCAC5B,MAAM,EAAE,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,mCAAI,IAAI;gCACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;6BACtB,CAAC,CAAC;4BACH,YAAY;gCACV,MAAC,OAAkD,mCAAI,aAAa,EAAE,CAAC;wBAC3E,CAAC;wBACD,IAAI,EAAE,CAAC;wBACP,sBAAO;oBACT,CAAC;oBAED,IAAI,YAAY,EAAE,CAAC;wBACjB,qBAAqB,CAAC,YAAY,EAAE;4BAClC,KAAK,EAAE,SAAS;4BAChB,EAAE,EAAE,MAAA,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,EAAE,mCAAI,YAAY,CAAC,EAAE,mCAAI,IAAI;4BAC/C,MAAM,EAAE,MAAA,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,mCAAI,YAAY,CAAC,MAAM,mCAAI,IAAI;yBAC5D,CAAC,CAAC;oBACL,CAAC;oBAED,6CAA6C;oBAC7C,IAAI,SAAS,KAAK,kBAAkB,EAAE,CAAC;wBACrC,cAAc,EAAE,CAAC;wBACjB,IAAI,EAAE,CAAC;wBACP,sBAAO;oBACT,CAAC;oBAED,4BAA4B;oBAC5B,eAAe,GAAG,UAAU,CAAC;;;;oBAE7B,gCAAgC;oBAChC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;oBAC/D,MAAA,OAAO,CAAC,OAAO,wDAAG,OAAK,CAAC,CAAC;;;oBAEzB,YAAY,EAAE,CAAC;;;;;SAElB,CAAC;IAEF,IAAM,KAAK,GAAG,UAAC,SAAiB;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,eAAe,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC;QACP,eAAe,GAAG,SAAS,CAAC;QAC5B,OAAO,GAAG,IAAI,CAAC;QACf,eAAe,GAAG,UAAU,CAAC;QAC7B,KAAK,IAAI,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,OAAA;QACL,IAAI,MAAA;QACJ,SAAS,EAAE,cAAM,OAAA,OAAO,EAAP,CAAO;KACzB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n PendingDepositStage,\n PendingDepositState,\n advancePendingDeposit,\n clearPendingDeposit,\n reconcileStages,\n readPendingDeposit,\n writePendingDeposit,\n} from './storage';\n\nexport interface DepositStatus {\n stage: PendingDepositStage;\n tx?: string | null;\n reason?: string | null;\n bridgeTx?: string | null;\n mintTx?: string | null;\n attestationId?: string | null;\n depositId?: string | null;\n}\n\nexport type DepositStatusFetcher = (depositId: string) => Promise<DepositStatus | null>;\n\nexport interface DepositPollerOptions {\n fetchStatus: DepositStatusFetcher;\n intervalMs?: number;\n maxIntervalMs?: number;\n jitterMs?: number;\n readStorage?: () => PendingDepositState | null;\n writeStorage?: (state: PendingDepositState) => PendingDepositState | void;\n clearStorage?: () => void;\n onStatus?: (status: DepositStatus) => void;\n onError?: (error: unknown) => void;\n}\n\nconst DEFAULT_INTERVAL_MS = 3_000;\nconst DEFAULT_MAX_INTERVAL_MS = 15_000;\nconst DEFAULT_JITTER_MS = 250;\n\n/**\n * Adds random jitter to polling intervals to prevent synchronized requests.\n */\nconst addJitter = (base: number, jitterMs: number): number => {\n if (jitterMs <= 0) {\n return base;\n }\n const jitter = Math.floor(Math.random() * jitterMs);\n return base + jitter;\n};\n\nexport interface DepositPoller {\n start: (depositId: string) => void;\n stop: () => void;\n isRunning: () => boolean;\n}\n\n/**\n * Creates a deposit poller that tracks deposit status through bridge stages.\n *\n * Features:\n * - Exponential backoff on errors (doubles interval up to maxIntervalMs)\n * - Jittered intervals to prevent request synchronization\n * - Storage-based state reconciliation between server and client\n * - Auto-stops on completion (solana_confirmed) or failure\n */\nexport const createDepositPoller = (options: DepositPollerOptions): DepositPoller => {\n const readStorageFn = options.readStorage ?? readPendingDeposit;\n const writeStorageFn = options.writeStorage ?? writePendingDeposit;\n const clearStorageFn = options.clearStorage ?? clearPendingDeposit;\n const intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxIntervalMs = options.maxIntervalMs ?? DEFAULT_MAX_INTERVAL_MS;\n const jitterMs = options.jitterMs ?? DEFAULT_JITTER_MS;\n\n let activeDepositId: string | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let currentInterval = intervalMs;\n let running = false;\n\n const stop = () => {\n running = false;\n activeDepositId = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const scheduleNext = () => {\n if (!running || !activeDepositId) {\n return;\n }\n const delay = addJitter(currentInterval, jitterMs);\n timer = setTimeout(poll, delay);\n };\n\n const poll = async () => {\n if (!activeDepositId) {\n stop();\n return;\n }\n try {\n const serverStatus = await options.fetchStatus(activeDepositId);\n const localState = readStorageFn();\n const localStage = localState?.stage ?? 'initiated';\n const nextStage = reconcileStages(localStage, serverStatus?.stage);\n\n // Safety check: stop if local state contains a different deposit ID\n if (localState && localState.depositId !== activeDepositId) {\n stop();\n return;\n }\n\n if (serverStatus?.stage) {\n options.onStatus?.(serverStatus);\n }\n\n let workingState = localState;\n if (!workingState && serverStatus) {\n const created = writeStorageFn({\n depositId: activeDepositId,\n wallet: '',\n chain: '',\n amount: '',\n stage: serverStatus.stage,\n tx: serverStatus.tx ?? null,\n reason: serverStatus.reason ?? null,\n updatedAt: Date.now(),\n });\n workingState =\n (created as PendingDepositState | undefined | null) ?? readStorageFn();\n }\n\n // Handle failure: persist error state and stop polling\n if (nextStage === 'failed') {\n if (workingState) {\n advancePendingDeposit(workingState, { stage: 'failed', reason: serverStatus?.reason });\n } else {\n const created = writeStorageFn({\n depositId: activeDepositId,\n wallet: '',\n chain: '',\n amount: '',\n stage: 'failed',\n tx: serverStatus?.tx ?? null,\n reason: serverStatus?.reason ?? null,\n updatedAt: Date.now(),\n });\n workingState =\n (created as PendingDepositState | undefined | null) ?? readStorageFn();\n }\n stop();\n return;\n }\n\n if (workingState) {\n advancePendingDeposit(workingState, {\n stage: nextStage,\n tx: serverStatus?.tx ?? workingState.tx ?? null,\n reason: serverStatus?.reason ?? workingState.reason ?? null,\n });\n }\n\n // Completion: clear storage and stop polling\n if (nextStage === 'solana_confirmed') {\n clearStorageFn();\n stop();\n return;\n }\n\n // Reset interval on success\n currentInterval = intervalMs;\n } catch (error) {\n // Exponential backoff on errors\n currentInterval = Math.min(currentInterval * 2, maxIntervalMs);\n options.onError?.(error);\n } finally {\n scheduleNext();\n }\n };\n\n const start = (depositId: string) => {\n if (!depositId) {\n throw new Error('Deposit id is required to start polling');\n }\n if (activeDepositId === depositId && running) {\n return;\n }\n stop();\n activeDepositId = depositId;\n running = true;\n currentInterval = intervalMs;\n void poll();\n };\n\n return {\n start,\n stop,\n isRunning: () => running,\n };\n};\n"]}
|