@embarkai/ui-kit 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/built.css","../src/config/assets.tsx","../src/config/lumiaPassport.tsx","../src/lib/errors.ts","../src/internal/auth/base64url.ts","../src/internal/auth/webauthn.ts","../src/internal/utils/projectId.ts","../src/internal/auth/passkeyAuth.ts","../src/internal/auth/telegram.ts","../src/internal/lib/site.ts","../src/internal/auth/passkey.ts","../src/internal/lib/iframe-mpc-client.ts","../src/internal/constants.ts","../src/internal/hooks/useLayoutDataStore.ts","../src/internal/components/BalanceFeedProvider/BalanceFeedProvider.tsx","../src/internal/components/BalanceFeedProvider/index.ts","../src/internal/clients/account/constants.ts","../src/internal/clients/account/abis.ts","../src/internal/clients/account/helpers.ts","../src/internal/components/ChainSync/ChainSync.tsx","../src/internal/components/ChainSync/index.ts","../package.json","../src/internal/assets/networks/ArbitrumIcon.tsx","../src/internal/assets/networks/BaseIcon.tsx","../src/internal/assets/networks/BnbIcon.tsx","../src/internal/assets/networks/EthereumIcon.tsx","../src/internal/assets/networks/LumiaIcon.tsx","../src/config/networks.ts","../src/i18n/locales/en.json","../src/i18n/locales/ru.json","../src/i18n/locales/zh.json","../src/i18n/constants.ts","../src/i18n/languages.ts","../src/i18n/utils.ts","../src/i18n/useT.ts","../src/i18n/index.ts","../src/internal/hooks/useLayoutStore.ts","../src/internal/lib/utils.ts","../src/internal/components/KeyshareRestoreMenu/constants.ts","../src/internal/components/ui/button.tsx","../src/internal/components/Footer/Footer.tsx","../src/internal/components/Footer/index.ts","../src/internal/assets/LumiaIcon.tsx","../src/internal/assets/PositiveIcon.tsx","../src/internal/clients/httpClient.ts","../src/internal/clients/profile.ts","../src/internal/lib/priceFormatter.tsx","../src/internal/components/BalanceView/BalanceView.tsx","../src/internal/components/BalanceView/index.ts","../src/config/queryClient.ts","../src/internal/components/KYC/api/sumsub.ts","../src/internal/components/KYC/SumsubIframeManager.ts","../src/internal/components/KYC/useSumsubIframe.ts","../src/internal/components/KYC/SumsubIframe.tsx","../src/internal/components/KYC/KycMenu.tsx","../src/internal/components/KYC/KYCStatus.tsx","../src/internal/components/KYC/index.ts","../src/internal/components/Header/Header.tsx","../src/internal/components/Header/index.ts","../src/internal/components/ui/dialog.tsx","../src/internal/components/ui/visually-hidden.tsx","../src/internal/hooks/useListenIframeAuthEvents.ts","../src/internal/akHelpers.ts","../src/internal/clients/account/deposit-for-smart-account.ts","../src/internal/clients/account/user-operations.ts","../src/internal/clients/account/deploy-account.ts","../src/internal/clients/account/register-smart-account-address.ts","../src/internal/clients/account.ts","../src/internal/clients/account/session.ts","../src/internal/clients/account/get-entry-point-deposit.ts","../src/internal/clients/utils.ts","../src/internal/clients/nickname.ts","../src/internal/clients/nickname-types.ts","../src/internal/clients/index.ts","../src/internal/hooks/useAutoConnect.ts","../src/internal/hooks/useBackupStatusChanges.ts","../src/internal/hooks/useDetectMaxScrollHeight.ts","../src/internal/components/Expandable/hooks/useExpandable.ts","../src/internal/components/Expandable/Expandable.tsx","../src/internal/components/Expandable/index.ts","../src/internal/components/ui/highlight.tsx","../src/internal/components/AuthMenu/useAuthStore.ts","../src/internal/components/AuthMenu/AuthFailedStep.tsx","../src/internal/components/AuthMenu/LoadingStep.tsx","../src/internal/assets/PasskeyAddIcon.tsx","../src/internal/components/AuthMenu/PassKeyStep.tsx","../src/internal/components/ui/input.tsx","../src/internal/components/AuthMenu/SignInStep/Email.tsx","../src/internal/utils/telegramBrowser.ts","../src/internal/components/AuthMenu/SignInStep/utils.ts","../src/internal/components/AuthMenu/SignInStep/Social.tsx","../src/internal/components/AuthMenu/SignInStep/Wallet.tsx","../src/internal/components/AuthMenu/SignInStep/SignInStep.tsx","../src/internal/components/AuthMenu/SignInStep/index.ts","../src/internal/components/AuthMenu/useAuthMenuHanders.ts","../src/internal/assets/OtpIcon.tsx","../src/internal/components/AuthMenu/VerifyStep/VerificationCodeInput.tsx","../src/internal/components/AuthMenu/VerifyStep/VerifyStep.tsx","../src/internal/components/AuthMenu/VerifyStep/index.ts","../src/internal/components/AuthMenu/AuthMenu.tsx","../src/internal/components/AuthMenu/index.ts","../src/internal/components/ui/select.tsx","../src/internal/assets/fiatProviders/BinanceIcon.tsx","../src/internal/assets/fiatProviders/RampnowIcon.tsx","../src/internal/assets/fiatProviders/index.ts","../src/internal/hooks/useCoinsMeta.ts","../src/internal/components/BuyMenu/components/CoinSelector.tsx","../src/internal/components/BuyMenu/components/PaymentSelector.tsx","../src/internal/components/BuyMenu/components/FiatSelector.tsx","../src/internal/components/BuyMenu/components/index.ts","../src/internal/components/BuyMenu/queryKeys.ts","../src/internal/components/BuyMenu/binance/api.ts","../src/internal/components/BuyMenu/binance/utils.ts","../src/internal/components/BuyMenu/binance/useQueriesErrorHandler.ts","../src/internal/components/BuyMenu/binance/Binance.tsx","../src/internal/components/BuyMenu/binance/index.ts","../src/internal/components/BuyMenu/rampnow/api.ts","../src/internal/components/BuyMenu/rampnow/constants.ts","../src/internal/components/BuyMenu/rampnow/Rampnow.tsx","../src/internal/components/BuyMenu/rampnow/index.ts","../src/internal/components/BuyMenu/contants.tsx","../src/internal/utils/debounce.ts","../src/internal/components/BuyMenu/useSelectables.ts","../src/internal/components/BuyMenu/ByuMenu.tsx","../src/internal/components/BuyMenu/index.ts","../src/internal/utils/cn.ts","../src/internal/components/ui/badge.tsx","../src/internal/components/ChainsMenu/ChainsMenu.tsx","../src/internal/components/ChainsMenu/ChainSwitchRequest.tsx","../src/internal/components/ChainsMenu/index.ts","../src/internal/components/ui/switch.tsx","../src/internal/components/KeyshareRestoreMenu/hooks/useRestoreStore.ts","../src/internal/components/KeyshareRestoreMenu/hooks/useOnRestoreSuccess.ts","../src/internal/auth/providers/types.ts","../src/internal/auth/providers/passkey.ts","../src/internal/cloudStorage.ts","../src/internal/components/KeyshareRestoreMenu/hooks/useCreateBackup.ts","../src/internal/components/KeyshareRestoreMenu/hooks/useRestoreAccount.ts","../src/internal/components/KeyshareRestoreMenu/hooks/useValidateFileBackup.ts","../src/internal/components/KeyshareRestoreMenu/hooks/index.ts","../src/internal/components/KeyshareRestoreMenu/components/MethodSelector.tsx","../src/internal/components/KeyshareRestoreMenu/components/PasswordPasskey.tsx","../src/internal/components/KeyshareRestoreMenu/components/NoBackupFound.tsx","../src/internal/components/KeyshareRestoreMenu/components/index.ts","../src/internal/components/KeyshareRestoreMenu/methods/File.tsx","../src/internal/components/KeyshareRestoreMenu/methods/Server.tsx","../src/internal/components/KeyshareRestoreMenu/methods/Cloud.tsx","../src/internal/components/KeyshareRestoreMenu/methods/index.ts","../src/internal/components/KeyshareRestoreMenu/KeyshareRestoreMenu.tsx","../src/internal/components/KeyshareRestoreMenu/KeyshareBackupMenu.tsx","../src/internal/components/KeyshareRestoreMenu/index.ts","../src/internal/components/LanguagesMenu/LanguagesMenu.tsx","../src/internal/components/LanguagesMenu/index.ts","../src/internal/auth/providers/common.ts","../src/internal/components/ManageWalletMenu/hooks/useProvidersList.ts","../src/internal/components/MainMenu/MainMenu.tsx","../src/internal/components/MainMenu/index.ts","../src/modules/linkedProfiles.ts","../src/internal/components/ManageWalletMenu/hooks/useStore.ts","../src/internal/components/ManageWalletMenu/EmailForm.tsx","../src/internal/auth/providers/email.ts","../src/internal/components/ManageWalletMenu/hooks/useSendVerificationCode.ts","../src/internal/components/ManageWalletMenu/hooks/useVerifyCode.ts","../src/internal/components/ManageWalletMenu/AddProvider.tsx","../src/internal/components/ManageWalletMenu/EmailNotConnectedWarning.tsx","../src/internal/components/ManageWalletMenu/hooks/useLinkSocial.ts","../src/internal/auth/providers/telegram.ts","../src/internal/components/ManageWalletMenu/hooks/useLinkTelegram.ts","../src/internal/components/ManageWalletMenu/ProviderCard.tsx","../src/internal/components/ManageWalletMenu/ManageWallet.tsx","../src/internal/components/ManageWalletMenu/UnlinkProviderMenu.tsx","../src/internal/components/ManageWalletMenu/index.ts","../src/internal/lib/nickname-cooldown.ts","../src/internal/lib/nickname-errors.ts","../src/internal/components/NicknameMenu/NicknameAvailabilityIndicator.tsx","../src/internal/lib/nickname-validation.ts","../src/internal/components/NicknameMenu/NicknameEditForm.tsx","../src/internal/components/NicknameMenu/useNickname.ts","../src/internal/components/NicknameMenu/NicknameMenu.tsx","../src/internal/components/NicknameMenu/index.ts","../src/internal/hooks/useWatchTokens.ts","../src/internal/hooks/useBlockscoutAssets.ts","../src/internal/assets/tokens/BnbIcon.tsx","../src/internal/assets/tokens/LumiaIcon.tsx","../src/internal/assets/tokens/index.ts","../src/internal/components/PortfolioMenu/PortfolioItem.tsx","../src/internal/components/PortfolioMenu/PortfolioMenu.tsx","../src/internal/components/PortfolioMenu/index.ts","../src/internal/components/SecurityMenu/constants.ts","../src/internal/assets/NegativeIcon.tsx","../src/internal/components/SecurityMenu/Keyshare/KeyshareStatus.tsx","../src/internal/components/SecurityMenu/Keyshare/LastBackup.tsx","../src/internal/components/SecurityMenu/Keyshare/Keyshare.tsx","../src/internal/components/SecurityMenu/Keyshare/index.ts","../src/internal/components/SecurityMenu/RemoveTrustedApp.tsx","../src/internal/components/SecurityMenu/TrustedApps.tsx","../src/internal/components/SecurityMenu/SecurityMenu.tsx","../src/internal/components/SecurityMenu/index.ts","../src/hooks/useErc3643Compliance.ts","../src/internal/lib/nickname-fingerprint.ts","../src/hooks/useNicknameResolve.ts","../src/hooks/useSendTransaction.ts","../src/internal/components/SendRecieveMenu/utils.ts","../src/internal/components/SendRecieveMenu/components/AssetInputIcon.tsx","../src/internal/components/SendRecieveMenu/components/NftDisplayCard.tsx","../src/internal/components/SendRecieveMenu/useSendStore.ts","../src/internal/components/SendRecieveMenu/components/AssetList.tsx","../src/internal/components/SendRecieveMenu/components/NicknameData.tsx","../src/internal/components/SendRecieveMenu/components/index.ts","../src/internal/components/SendRecieveMenu/sendSteps/InputSendStep.tsx","../src/internal/components/SendRecieveMenu/sendSteps/ConfirmSendStep.tsx","../src/internal/components/SendRecieveMenu/sendSteps/index.ts","../src/internal/components/SendRecieveMenu/SendLumiaMenu.tsx","../src/internal/components/SendRecieveMenu/ReceiveLumiaMenu.tsx","../src/internal/components/SendRecieveMenu/index.ts","../src/internal/assets/KycIcon.tsx","../src/internal/components/SettingsMenu/constants.ts","../src/internal/components/SettingsMenu/SettingsMenu.tsx","../src/internal/components/SettingsMenu/index.ts","../src/internal/components/TermsOfService.tsx","../src/internal/components/TransactionsMenu/txUrls.ts","../src/internal/components/TransactionsMenu/adapters.ts","../src/internal/components/TransactionsMenu/api.ts","../src/internal/components/TransactionsMenu/utils.ts","../src/internal/components/TransactionsMenu/TransactionsGroup.tsx","../src/internal/components/TransactionsMenu/TransactionsMenu.tsx","../src/internal/components/TransactionsMenu/index.ts","../src/internal/components/PageMap.tsx","../src/internal/hooks/usePageMapper.tsx","../src/internal/hooks/useSettingsNotifications.ts","../src/internal/components/Dialog/LumiaPassportDialog.tsx","../src/internal/components/Dialog/index.ts","../src/internal/components/TssManager.tsx","../src/internal/auth/providers/wallet.ts","../src/internal/components/WalletConnectHandler.tsx","../src/context/LumiaPassportSessionContext.tsx","../src/internal/utils/env.ts","../src/internal/clients/base.ts","../src/internal/vaultClient.ts","../src/internal/auth/keyshare.ts","../src/internal/auth/providers/x.ts","../src/internal/auth/providers/index.ts","../src/internal/auth/index.ts","../src/internal/lib/iframe-manager.ts","../src/context/utils.ts","../src/config/wagmi.ts","../src/context/WagmiContext.tsx","../src/context/LumiaPassportContext.tsx","../src/components/ConnectWalletButton.tsx","../src/hooks/childAppHooks.ts","../src/hooks/useLumiaPassportOpen.ts","../src/hooks/useLumiaPassportColorMode.ts","../src/components/ThemeToggle.tsx","../src/components/LangToggle.tsx","../src/config/rainbowkit.ts","../src/context/RainbowKitContext.tsx","../src/internal/assets/LumiaLogo.tsx","../src/components/LumiaLogo.tsx","../src/clients/bundler/getUserOperationReceipt.ts","../src/clients/bundler/getUserOperationByHash.ts","../src/internal/components/Address.tsx","../src/internal/components/UserOpStatus.tsx","../src/internal/components/Hash.tsx","../src/internal/components/TransactionsMenu/TransactionsList.tsx","../src/hooks/useUserOpStatus.ts","../src/hooks/useLogout.ts","../src/clients/bundler/waitForUserOperationReceipt.ts","../src/clients/bundler/index.ts","../src/clients/index.ts","../src/modules/transactions.ts","../src/modules/assets.ts","../src/modules/smartAccountTransactions.ts","../src/index.ts"],"sourcesContent":[".container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=\"1\"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:\"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:\"`\"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:\"`\"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .invisible{visibility:hidden}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .sticky{position:sticky}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-0{right:0}.lumia-scope .-right-0\\.5{right:-.125rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .-right-2{right:-.5rem}.lumia-scope .-top-0{top:0}.lumia-scope .-top-0\\.5{top:-.125rem}.lumia-scope .-top-1{top:-.25rem}.lumia-scope .-top-2{top:-.5rem}.lumia-scope .-top-3{top:-.75rem}.lumia-scope .bottom-0{bottom:0}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-0{left:0}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .right-0{right:0}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .right-\\[var\\(--l-pass-pd\\)\\]{right:var(--l-pass-pd)}.lumia-scope .right-full{right:100%}.lumia-scope .top-0{top:0}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[var\\(--l-pass-pd\\)\\]{top:var(--l-pass-pd)}.lumia-scope .top-full{top:100%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[9998\\]{z-index:9998}.lumia-scope .z-\\[9999\\]{z-index:9999}.lumia-scope .-m-px{margin:-1px}.lumia-scope .m-0{margin:0}.lumia-scope .m-4{margin:1rem}.lumia-scope .-mx-1{margin-left:-.25rem;margin-right:-.25rem}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-1{margin-left:.25rem;margin-right:.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-1{margin-top:.25rem;margin-bottom:.25rem}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .my-auto{margin-top:auto;margin-bottom:auto}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-3{margin-left:.75rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mr-4{margin-right:1rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .aspect-square{aspect-ratio:1/1}.lumia-scope .size-3{width:.75rem;height:.75rem}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .size-5{width:1.25rem;height:1.25rem}.lumia-scope .size-auto{width:auto;height:auto}.lumia-scope .h-1{height:.25rem}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-20{height:5rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-7{height:1.75rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-\\[100dvh\\]{height:100dvh}.lumia-scope .h-\\[48px\\]{height:48px}.lumia-scope .h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.lumia-scope .h-fit{height:-moz-fit-content;height:fit-content}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-64{max-height:16rem}.lumia-scope .max-h-80{max-height:20rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[95dvh\\]{max-height:95dvh}.lumia-scope .max-h-full{max-height:100%}.lumia-scope .min-h-10{min-height:2.5rem}.lumia-scope .w-1{width:.25rem}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-20{width:5rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-7{width:1.75rem}.lumia-scope .w-72{width:18rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-\\[100dvw\\]{width:100dvw}.lumia-scope .w-\\[40px\\]{width:40px}.lumia-scope .w-\\[var\\(--l-pass-maw\\)\\]{width:var(--l-pass-maw)}.lumia-scope .w-fit{width:-moz-fit-content;width:fit-content}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-10{min-width:2.5rem}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-4{min-width:1rem}.lumia-scope .min-w-5{min-width:1.25rem}.lumia-scope .min-w-\\[256px\\]{min-width:256px}.lumia-scope .min-w-\\[8rem\\]{min-width:8rem}.lumia-scope .min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[144px\\]{max-width:144px}.lumia-scope .max-w-\\[150px\\]{max-width:150px}.lumia-scope .max-w-\\[160px\\]{max-width:160px}.lumia-scope .max-w-\\[256px\\]{max-width:256px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-\\[80px\\]{max-width:80px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-none{flex:none}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-x-\\[var\\(--l-pass-gap\\)\\]{--tw-translate-x:calc(var(--l-pass-gap)*-1)}.lumia-scope .-translate-x-\\[var\\(--l-pass-gap\\)\\],.lumia-scope .-translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .-translate-y-1\\/2,.lumia-scope .rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .rotate-180{--tw-rotate:180deg}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes glow-warning{0%,to{transform:scale(1);box-shadow:0 0 16px var(--l-pass-bg-warning)}50%{transform:scale(.97);box-shadow:0 0 4px var(--l-pass-bg-warning)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s ease infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-default{cursor:default}.lumia-scope .cursor-help{cursor:help}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .cursor-text{cursor:text}.lumia-scope .select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .scroll-my-1{scroll-margin-top:.25rem;scroll-margin-bottom:.25rem}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lumia-scope .grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lumia-scope .grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lumia-scope .grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .place-content-center{place-content:center}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-end{align-items:flex-end}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .justify-evenly{justify-content:space-evenly}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-1\\.5{gap:.375rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope .gap-\\[10px\\]{gap:10px}.lumia-scope .gap-\\[var\\(--l-pass-gap\\)\\]{gap:var(--l-pass-gap)}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .overflow-x-hidden{overflow-x:hidden}.lumia-scope .overflow-y-hidden{overflow-y:hidden}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lumia-scope .text-ellipsis{text-overflow:ellipsis}.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-normal{overflow-wrap:normal;word-break:normal}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-\\[10px\\]{border-radius:10px}.lumia-scope .rounded-\\[5px\\]{border-radius:5px}.lumia-scope .rounded-\\[var\\(--l-pass-bdrs\\)\\]{border-radius:var(--l-pass-bdrs)}.lumia-scope .rounded-\\[var\\(--l-pass-el-bdrs\\)\\]{border-radius:var(--l-pass-el-bdrs)}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:.5rem}.lumia-scope .rounded-md{border-radius:.375rem}.lumia-scope .rounded-sm{border-radius:.125rem}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-dashed{border-style:dashed}.lumia-scope .border-\\[var\\(--l-pass-bd\\)\\]{border-color:var(--l-pass-bd)}.lumia-scope .border-\\[var\\(--l-pass-bg-error\\)\\]{border-color:var(--l-pass-bg-error)}.lumia-scope .border-\\[var\\(--l-pass-bg-success\\)\\]{border-color:var(--l-pass-bg-success)}.lumia-scope .border-\\[var\\(--l-pass-bg-warning\\)\\]{border-color:var(--l-pass-bg-warning)}.lumia-scope .border-\\[var\\(--l-pass-error\\)\\]{border-color:var(--l-pass-error)}.lumia-scope .border-\\[var\\(--l-pass-secondary\\)\\]{border-color:var(--l-pass-secondary)}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.lumia-scope .border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity,1))}.lumia-scope .border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.lumia-scope .border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1))}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1))}.lumia-scope .border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .bg-\\[\\#002c15\\]{--tw-bg-opacity:1;background-color:rgb(0 44 21/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#081f2c\\]{--tw-bg-opacity:1;background-color:rgb(8 31 44/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#f3ba2f\\]{--tw-bg-opacity:1;background-color:rgb(243 186 47/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[var\\(--l-pass-accent\\)\\]{background-color:var(--l-pass-accent)}.lumia-scope .bg-\\[var\\(--l-pass-bg\\)\\]{background-color:var(--l-pass-bg)}.lumia-scope .bg-\\[var\\(--l-pass-bg-error\\)\\]{background-color:var(--l-pass-bg-error)}.lumia-scope .bg-\\[var\\(--l-pass-bg-info\\)\\]{background-color:var(--l-pass-bg-info)}.lumia-scope .bg-\\[var\\(--l-pass-bg-secondary\\)\\]{background-color:var(--l-pass-bg-secondary)}.lumia-scope .bg-\\[var\\(--l-pass-bg-success\\)\\]{background-color:var(--l-pass-bg-success)}.lumia-scope .bg-\\[var\\(--l-pass-bg-warning\\)\\]{background-color:var(--l-pass-bg-warning)}.lumia-scope .bg-\\[var\\(--l-pass-error\\)\\]{background-color:var(--l-pass-error)}.lumia-scope .bg-\\[var\\(--l-pass-fg\\)\\]{background-color:var(--l-pass-fg)}.lumia-scope .bg-\\[var\\(--l-pass-overlay\\)\\]{background-color:var(--l-pass-overlay)}.lumia-scope .bg-\\[var\\(--l-pass-primary\\)\\]{background-color:var(--l-pass-primary)}.lumia-scope .bg-\\[var\\(--l-pass-secondary\\)\\]{background-color:var(--l-pass-secondary)}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity,1))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/90{background-color:rgba(0,0,0,.9)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .fill-\\[var\\(--l-pass-bg-warning\\)\\]{fill:var(--l-pass-bg-warning)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .p-\\[2px\\]{padding:2px}.lumia-scope .p-\\[var\\(--l-pass-gap\\)\\]{padding:var(--l-pass-gap)}.lumia-scope .p-\\[var\\(--l-pass-pd\\)\\]{padding:var(--l-pass-pd)}.lumia-scope .px-0{padding-left:0;padding-right:0}.lumia-scope .px-1{padding-left:.25rem;padding-right:.25rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-5{padding-left:1.25rem;padding-right:1.25rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .px-\\[var\\(--l-pass-gap\\)\\]{padding-left:var(--l-pass-gap);padding-right:var(--l-pass-gap)}.lumia-scope .px-\\[var\\(--l-pass-pd\\)\\]{padding-left:var(--l-pass-pd);padding-right:var(--l-pass-pd)}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .py-\\[10px\\]{padding-top:10px;padding-bottom:10px}.lumia-scope .py-\\[var\\(--l-pass-pd\\)\\]{padding-top:var(--l-pass-pd);padding-bottom:var(--l-pass-pd)}.lumia-scope .pb-2{padding-bottom:.5rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pb-5{padding-bottom:1.25rem}.lumia-scope .pb-6{padding-bottom:1.5rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pl-2{padding-left:.5rem}.lumia-scope .pl-\\[var\\(--l-pass-pd\\)\\]{padding-left:var(--l-pass-pd)}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pr-8{padding-right:2rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .pt-5{padding-top:1.25rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-3xl{font-size:1.875rem;line-height:2.25rem}.lumia-scope .text-4xl{font-size:2.25rem;line-height:2.5rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[14px\\]{font-size:14px}.lumia-scope .text-\\[16px\\]{font-size:16px}.lumia-scope .text-\\[8px\\]{font-size:8px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-normal{font-weight:400}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .uppercase{text-transform:uppercase}.lumia-scope .lowercase{text-transform:lowercase}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-4{line-height:1rem}.lumia-scope .leading-5{line-height:1.25rem}.lumia-scope .leading-6{line-height:1.5rem}.lumia-scope .leading-8{line-height:2rem}.lumia-scope .leading-\\[8px\\]{line-height:8px}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-relaxed{line-height:1.625}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .tracking-wide{letter-spacing:.025em}.lumia-scope .tracking-wider{letter-spacing:.05em}.lumia-scope .text-\\[\\#c3f53c\\]{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .text-\\[var\\(--l-pass-bg-error\\)\\]{color:var(--l-pass-bg-error)}.lumia-scope .text-\\[var\\(--l-pass-bg-success\\)\\]{color:var(--l-pass-bg-success)}.lumia-scope .text-\\[var\\(--l-pass-bg-warning\\)\\]{color:var(--l-pass-bg-warning)}.lumia-scope .text-\\[var\\(--l-pass-error\\)\\]{color:var(--l-pass-error)}.lumia-scope .text-\\[var\\(--l-pass-fg\\)\\]{color:var(--l-pass-fg)}.lumia-scope .text-\\[var\\(--l-pass-fg-inverted\\)\\]{color:var(--l-pass-fg-inverted)}.lumia-scope .text-\\[var\\(--l-pass-fg-muted\\)\\]{color:var(--l-pass-fg-muted)}.lumia-scope .text-\\[var\\(--l-pass-info\\)\\]{color:var(--l-pass-info)}.lumia-scope .text-\\[var\\(--l-pass-success\\)\\]{color:var(--l-pass-success)}.lumia-scope .text-\\[var\\(--l-pass-text-secondary\\)\\]{color:var(--l-pass-text-secondary)}.lumia-scope .text-\\[var\\(--l-pass-warning\\)\\]{color:var(--l-pass-warning)}.lumia-scope .text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.lumia-scope .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.lumia-scope .text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity,1))}.lumia-scope .text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.lumia-scope .text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity,1))}.lumia-scope .text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-2{text-underline-offset:2px}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .opacity-50{opacity:.5}.lumia-scope .opacity-60{opacity:.6}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .shadow-sm,.lumia-scope .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.lumia-scope .outline-none{outline:2px solid transparent;outline-offset:2px}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .grayscale{--tw-grayscale:grayscale(100%)}.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-\\[color\\2c box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-none{transition-property:none}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope{--l-pass-ff:var(--lumia-passport-ff,-apple-system,BlinkMacSystemFont,\"Inter\",system-ui,sans-serif);--l-pass-maw:var(--lumia-passport-maw,384px);--l-pass-pd:var(--lumia-passport-pd,12px);--l-pass-gap:var(--lumia-passport-gap,10px);--l-pass-bdrs:var(--lumia-passport-bdrs,20px);--l-pass-el-bdrs:var(--lumia-passport-element-bdrs,10px);--l-pass-backdrop-blur:var(--lumia-passport-backdrop-blur,10px)}.lumia-scope[data-lumia-passport-mode=light]{--l-pass-overlay:var(--lumia-passport-overlay,hsla(0,0%,100%,.8));--l-pass-bg:var(--lumia-passport-bg,#fff);--l-pass-fg:var(--lumia-passport-fg,#000);--l-pass-fg-h:var(--lumia-passport-fg-h,rgba(0,0,0,.6));--l-pass-fg-a:var(--lumia-passport-fg-a,rgba(0,0,0,.4));--l-pass-fg-inverted:var(--lumia-passport-fg-inverted,#fff);--l-pass-fg-muted:var(--lumia-passport-fg-muted,rgba(0,0,0,.6));--l-pass-primary:var(--lumia-passport-primary,#000);--l-pass-primary-h:var(--lumia-passport-primary-h,rgba(0,0,0,.8));--l-pass-primary-a:var(--lumia-passport-primary-a,rgba(0,0,0,.6));--l-pass-secondary:var(--lumia-passport-secondary,#e4e4e4);--l-pass-secondary-h:var(--lumia-passport-secondary-h,hsla(0,0%,89%,.8));--l-pass-secondary-a:var(--lumia-passport-secondary-a,hsla(0,0%,89%,.6));--l-pass-bd:var(--lumia-passport-bd,#ebebeb);--l-pass-bd-intense:var(--lumia-passport-bd-intense,#a9a9a9);--l-pass-shadow-c:var(--lumia-passport-shadow-c,rgba(0,0,0,.1));--l-pass-info:var(--lumia-passport-info,var(--l-pass-fg));--l-pass-bg-info:var(--lumia-passport-bg-info,var(--l-pass-secondary));--l-pass-success:var(--lumia-passport-success,#000);--l-pass-bg-success:var(--lumia-passport-bg-success,#21ff51);--l-pass-warning:var(--lumia-passport-warning,#000);--l-pass-bg-warning:var(--lumia-passport-bg-warning,#e9fa00);--l-pass-error:var(--lumia-passport-error,#fff);--l-pass-bg-error:var(--lumia-passport-bg-error,#d6204e)}.lumia-scope[data-lumia-passport-mode=dark]{--l-pass-overlay:var(--lumia-passport-overlay,rgba(0,0,0,.8));--l-pass-bg:var(--lumia-passport-bg,#1a1a1a);--l-pass-fg:var(--lumia-passport-fg,#fff);--l-pass-fg-h:var(--lumia-passport-fg-h,hsla(0,0%,100%,.6));--l-pass-fg-a:var(--lumia-passport-fg-a,hsla(0,0%,100%,.4));--l-pass-fg-inverted:var(--lumia-passport-fg-inverted,#000);--l-pass-fg-muted:var(--lumia-passport-fg-muted,hsla(0,0%,100%,.6));--l-pass-primary:var(--lumia-passport-primary,#fff);--l-pass-primary-h:var(--lumia-passport-primary-h,hsla(0,0%,100%,.8));--l-pass-primary-a:var(--lumia-passport-primary-a,hsla(0,0%,100%,.6));--l-pass-secondary:var(--lumia-passport-secondary,#2a2a2a);--l-pass-secondary-h:var(--lumia-passport-secondary-h,rgba(42,42,42,.6));--l-pass-secondary-a:var(--lumia-passport-secondary-a,rgba(42,42,42,.4));--l-pass-bd:var(--lumia-passport-bd,#3a3a3a);--l-pass-bd-intense:var(--lumia-passport-bd-intense,#4a4a4a);--l-pass-shadow-c:var(--lumia-passport-shadow-c,rgba(0,0,0,.1));--l-pass-info:var(--lumia-passport-info,var(--l-pass-fg));--l-pass-bg-info:var(--lumia-passport-bg-info,var(--l-pass-secondary));--l-pass-success:var(--lumia-passport-success,#000);--l-pass-bg-success:var(--lumia-passport-bg-success,#21ff51);--l-pass-warning:var(--lumia-passport-warning,#000);--l-pass-bg-warning:var(--lumia-passport-bg-warning,#e9fa00);--l-pass-error:var(--lumia-passport-error,#fff);--l-pass-bg-error:var(--lumia-passport-bg-error,#d6204e)}.lumia-scope,.lumia-scope *{margin:0;box-sizing:border-box;font-family:var(--l-pass-ff);font-optical-sizing:auto;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent;-ms-tap-highlight-color:transparent;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lumia-scope button,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6,.lumia-scope input,.lumia-scope p,.lumia-scope select,.lumia-scope textarea{font-family:var(--l-pass-ff)!important;margin:0}.lumia-scope button,.lumia-scope input,.lumia-scope select,.lumia-scope textarea{border-style:solid;outline:none!important;appearance:none!important;-webkit-appearance:none;-moz-appearance:none}.lumia-scope input,.lumia-scope textarea{font-size:16px!important}.lumia-scope .lumia-passport-button{box-shadow:0 4px 20px var(--l-pass-shadow-c),inset 0 0 0 1px var(--l-pass-bd);transition:transform .25s ease}.lumia-scope .lumia-passport-button:hover{transform:scale(1.02)}.lumia-scope .lumia-passport-button:active{transform:scale(1)}@keyframes lumia-mobile-dialog-fade-in{0%{opacity:0;transform:translateY(64px)}to{opacity:1;transform:translateY(0)}}@keyframes lumia-mobile-dialog-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(64px)}}.lumia-scope .animate-mobile-dialog-in{animation:lumia-mobile-dialog-fade-in 375ms ease}.lumia-scope .animate-mobile-dialog-out{animation:lumia-mobile-dialog-fade-out 375ms ease}@keyframes lumia-dialog-fade-in{0%{opacity:0}to{opacity:1}}@keyframes lumia-dialog-fade-out{0%{opacity:1}to{opacity:0}}.lumia-scope .animate-dialog-in{animation:lumia-dialog-fade-in 375ms ease}.lumia-scope .animate-dialog-out{animation:lumia-dialog-fade-out 375ms ease}.lumia-scope .list-scrollbar-y{width:100%;padding-right:var(--l-pass-list-scrollbar-pd-r,0);overflow-y:auto;overflow-x:hidden;max-height:var(--l-pass-scrollbar-mah,300px)}.lumia-scope .list-scrollbar-y::-webkit-scrollbar{width:4px;height:4px}.lumia-scope .list-scrollbar-y::-webkit-scrollbar-thumb{cursor:pointer;width:4px;border-radius:2px;background-color:var(--l-pass-bd)}.lumia-scope .list-scrollbar-y::-webkit-scrollbar-track{margin-top:10px;margin-bottom:10px;background-color:transparent}.lumia-scope .noScrollbars::-webkit-scrollbar{display:none}.lumia-scope div[data-radix-popper-content-wrapper]{z-index:10000!important}.lumia-scope .file\\:mr-\\[var\\(--l-pass-gap\\)\\]::file-selector-button{margin-right:var(--l-pass-gap)}.lumia-scope .file\\:h-12::file-selector-button{height:3rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded-\\[var\\(--l-pass-el-bdrs\\)\\]::file-selector-button{border-radius:var(--l-pass-el-bdrs)}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-\\[var\\(--l-pass-primary\\)\\]::file-selector-button{background-color:var(--l-pass-primary)}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-\\[var\\(--l-pass-pd\\)\\]::file-selector-button{padding-left:var(--l-pass-pd);padding-right:var(--l-pass-pd)}.lumia-scope .file\\:text-\\[16px\\]::file-selector-button{font-size:16px}.lumia-scope .file\\:text-base::file-selector-button{font-size:1rem;line-height:1.5rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:text-\\[var\\(--l-pass-fg-inverted\\)\\]::file-selector-button{color:var(--l-pass-fg-inverted)}.lumia-scope .placeholder\\:text-\\[var\\(--l-pass-fg-muted\\)\\]::-moz-placeholder{color:var(--l-pass-fg-muted)}.lumia-scope .placeholder\\:text-\\[var\\(--l-pass-fg-muted\\)\\]::placeholder{color:var(--l-pass-fg-muted)}.lumia-scope .focus-within\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:focus-within{background-color:var(--l-pass-secondary-a)}.lumia-scope .focus-within\\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-bg\\)\\]:hover{background-color:var(--l-pass-bg)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-bg-secondary\\)\\]:hover{background-color:var(--l-pass-bg-secondary)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-primary-h\\)\\]:hover{background-color:var(--l-pass-primary-h)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-secondary\\)\\]:hover{background-color:var(--l-pass-secondary)}.lumia-scope .hover\\:bg-\\[var\\(--l-pass-secondary-h\\)\\]:hover{background-color:var(--l-pass-secondary-h)}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:text-\\[\\#c3f53c\\]:hover{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-\\[var\\(--l-pass-fg-h\\)\\]:hover{color:var(--l-pass-fg-h)}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .file\\:hover\\:opacity-90:hover::file-selector-button{opacity:.9}.lumia-scope .focus\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:focus{background-color:var(--l-pass-secondary-a)}.lumia-scope .focus\\:bg-transparent:focus{background-color:transparent}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-\\[2px\\]:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-transparent:focus-visible{--tw-ring-color:transparent}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .active\\:bg-\\[var\\(--l-pass-bg\\)\\]:active{background-color:var(--l-pass-bg)}.lumia-scope .active\\:bg-\\[var\\(--l-pass-primary-a\\)\\]:active{background-color:var(--l-pass-primary-a)}.lumia-scope .active\\:bg-\\[var\\(--l-pass-secondary-a\\)\\]:active{background-color:var(--l-pass-secondary-a)}.lumia-scope .active\\:text-\\[\\#c3f53c\\]:active{--tw-text-opacity:1;color:rgb(195 245 60/var(--tw-text-opacity,1))}.lumia-scope .active\\:text-\\[var\\(--l-pass-fg-a\\)\\]:active{color:var(--l-pass-fg-a)}.lumia-scope .file\\:active\\:opacity-80:active::file-selector-button{opacity:.8}.lumia-scope .disabled\\:cursor-default:disabled{cursor:default}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-bg\\)\\]:hover:disabled{background-color:var(--l-pass-bg)}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-primary\\)\\]:hover:disabled{background-color:var(--l-pass-primary)}.lumia-scope .disabled\\:hover\\:bg-\\[var\\(--l-pass-secondary\\)\\]:hover:disabled{background-color:var(--l-pass-secondary)}.lumia-scope .disabled\\:hover\\:text-\\[var\\(--l-pass-fg\\)\\]:hover:disabled{color:var(--l-pass-fg)}.lumia-scope .disabled\\:active\\:bg-\\[var\\(--l-pass-bg\\)\\]:active:disabled{background-color:var(--l-pass-bg)}.lumia-scope .disabled\\:active\\:bg-\\[var\\(--l-pass-primary\\)\\]:active:disabled{background-color:var(--l-pass-primary)}.lumia-scope .disabled\\:active\\:text-\\[var\\(--l-pass-fg\\)\\]:active:disabled{color:var(--l-pass-fg)}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}.lumia-scope :is(.group:hover .group-hover\\:opacity-60){opacity:.6}.lumia-scope .data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.lumia-scope .data-\\[size\\=default\\]\\:h-12[data-size=default]{height:3rem}.lumia-scope .data-\\[size\\=sm\\]\\:h-10[data-size=sm]{height:2.5rem}.lumia-scope .data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.lumia-scope .data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom],.lumia-scope .data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.lumia-scope .data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.lumia-scope .data-\\[side\\=right\\]\\:translate-x-1[data-side=right],.lumia-scope .data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.lumia-scope .data-\\[state\\=checked\\]\\:border-\\[var\\(--l-pass-bd-intense\\)\\][data-state=checked]{border-color:var(--l-pass-bd-intense)}.lumia-scope .data-\\[state\\=checked\\]\\:bg-\\[var\\(--l-pass-secondary\\)\\][data-state=checked]{background-color:var(--l-pass-secondary)}.lumia-scope .data-\\[state\\=checked\\]\\:text-\\[var\\(--l-pass-fg\\)\\][data-state=checked]{color:var(--l-pass-fg)}.lumia-scope .data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.lumia-scope :is(.\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1[data-slot=select-value]>*){overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.lumia-scope :is(.\\*\\:data-\\[slot\\=select-value\\]\\:flex[data-slot=select-value]>*){display:flex}.lumia-scope :is(.\\*\\:data-\\[slot\\=select-value\\]\\:items-center[data-slot=select-value]>*){align-items:center}.lumia-scope :is(.\\*\\:data-\\[slot\\=select-value\\]\\:gap-\\[var\\(--l-pass-gap\\)\\][data-slot=select-value]>*){gap:var(--l-pass-gap)}@media (min-width:640px){.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:text-left{text-align:left}}@media (min-width:768px){.lumia-scope .md\\:h-8{height:2rem}.lumia-scope .md\\:w-8{width:2rem}.lumia-scope .md\\:gap-\\[var\\(--l-pass-gap\\)\\]{gap:var(--l-pass-gap)}.lumia-scope .md\\:py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}.lumia-scope :is(.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-])){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}","export const GoogleIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n)\n\nexport const TelegramIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M9.78 18.65l.28-4.23 7.68-6.92c.34-.31-.07-.46-.52-.19L7.74 13.3 3.64 12c-.88-.25-.89-.86.2-1.3l15.97-6.16c.73-.33 1.43.18 1.15 1.3l-2.72 12.81c-.19.91-.74 1.13-1.5.71L12.6 16.3l-1.99 1.93c-.23.23-.42.42-.83.42z\" />\n </svg>\n)\n\nexport const TwitterIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n)\n\nexport const DiscordIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path\n fill=\"currentColor\"\n d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418Z\"\n />\n </svg>\n)\n","/**\n * LumiaPassport Configuration (library copy)\n * Default config can be overridden via Provider initialConfig\n */\n\nimport { ChainConfig } from '@embarkai/core/read'\nimport React from 'react'\n\nimport type { Asset } from '../modules/assets'\nimport { GoogleIcon, TelegramIcon } from './assets'\n\n// Build-time injected globals (tsup.define). Declare for type-checking.\ndeclare const __EMBARK_TSS_URL__: string\ndeclare const __EMBARK_BUNDLER_URL__: string\ndeclare const __EMBARK_SHARE_VAULT_URL__: string\ndeclare const __EMBARK_IFRAME_URL__: string\ndeclare const __EMBARK_TSS_REQUIRE_WASM__: boolean\ndeclare const __EMBARK_TSS_WASM_DEBUG__: boolean\ndeclare const __EMBARK_TG_BOT__: string\ndeclare const __EMBARK_TG_SALT__: string\ndeclare const __EMBARK_AA_FACTORY_ADDRESS__: string\ndeclare const __EMBARK_PAYMASTER_ADDRESS__: string\ndeclare const __EMBARK_EXPLORER_URL__: string\ndeclare const __EMBARK_RPC_URL__: string\n\ndeclare global {\n interface Window {\n __EMBARK_SERVICES__?: Partial<{\n bundlerUrl: string\n tssUrl: string\n shareVaultUrl: string\n tssRequireWasm: boolean\n tssWasmDebug: boolean\n }>\n __EMBARK_PROJECT_ID__?: string\n }\n}\n\nexport interface SocialProvider {\n id: string\n name: string\n enabled: boolean\n icon: React.ComponentType<{ className?: string }>\n comingSoon?: boolean\n meta?: Record<string, any>\n}\n\nexport interface ProjectAsset extends Omit<Asset, 'type'> {\n type: 'project'\n balanceQueryKey: string[]\n balanceQuery: () => Promise<{\n cryptoFormatted: number\n cryptoFiatRate: number\n cryptoSymbol: string\n fiatFormatted: number\n fiatSymbol: string\n }>\n hideInPortfolio?: boolean\n}\n\n/**\n * Token configuration for custom token watching.\n * Used when chain doesn't have Blockscout API or for project-specific tokens.\n * SDK will fetch balances via RPC multicall.\n */\nexport interface WatchToken {\n /** Contract address (required) */\n address: `0x${string}`\n /** Token symbol for display (required) */\n symbol: string\n /** Token name (optional, fetched from contract if missing) */\n name?: string\n /** Token decimals (optional, fetched from contract if missing) */\n decimals?: number\n /** Logo URL (optional) */\n logo?: string\n}\n\nexport interface LumiaPassportConfig {\n projectId: string\n\n passkey: {\n enabled: boolean\n showCreateButton: boolean\n primaryButtonText: string\n }\n email: {\n enabled: boolean\n placeholder: string\n buttonText: string\n verificationTitle: string\n }\n social: {\n enabled: boolean\n providers: SocialProvider[]\n }\n wallet: {\n enabled: boolean\n supportedChains?: number[]\n requireSignature: boolean\n walletConnectProjectId?: string\n }\n development: {\n enabled: boolean\n showOnProduction: boolean\n }\n\n preferedColorMode?: 'light' | 'dark' // unprovided means 'auto'\n\n projectAssets?: {\n assets: ProjectAsset[]\n showBalanceAs?: ProjectAsset['symbol']\n }\n\n /**\n * Custom tokens to monitor per chain.\n * SDK will fetch balances via RPC multicall.\n * Useful for chains without Blockscout API (BSC, Sepolia, Arbitrum, Base, etc.).\n * Can also be used on Blockscout chains - tokens are merged with discovered ones.\n *\n * @example\n * watchTokens: {\n * 97: [ // BSC Testnet\n * { address: '0x...', symbol: 'USDT', decimals: 18 },\n * { address: '0x...', symbol: 'BUSD', decimals: 18, logo: 'https://...' },\n * ],\n * 11155111: [ // Sepolia\n * { address: '0x...', symbol: 'LINK', decimals: 18 },\n * ]\n * }\n */\n watchTokens?: {\n [chainId: number]: WatchToken[]\n }\n\n ui: {\n title: string\n subtitle?: string\n\n useExternalIcons?: boolean\n\n dialogClassName?: string\n // Controls the order of auth sections on the sign-in screen\n authOrder?: ('email' | 'social' | 'wallet')[]\n }\n\n network: {\n name: string\n symbol: string\n /**\n * Default chain ID for new users.\n * Priority: User's explicit selection > dApp config chainId > SDK default (Testnet).\n * If user manually switches chains, their choice is preserved in localStorage.\n */\n chainId: number\n rpcUrl: string\n explorerUrl?: string\n testnet?: boolean\n forceChain?: boolean // if true, chain selector is disabled and user cannot switch to other chains\n }\n\n services: {\n bundlerUrl: string\n tssUrl: string\n shareVaultUrl: string\n iframeUrl?: string // URL for secure iframe wallet (default: https://auth.lumiapassport.com)\n tssRequireWasm?: boolean\n tssWasmDebug?: boolean\n }\n\n features: {\n mpcSecurity: boolean\n strictMode: boolean\n requestDeduplication: boolean\n kycNeeded?: boolean\n displayNameNeeded?: boolean\n showActiveBalanceAsFiat?: boolean\n }\n\n warnings: {\n backupWarning: boolean\n emailNotConnectedWarning: boolean\n }\n\n kyc?: {\n provider?: 'sumsub' | 'uaepass' | 'custom'\n options?: Record<string, any> // provider-specific metadata\n }\n\n /** language -> project namespace -> resource map */\n translations?: Record<string, Record<string, unknown>>\n}\n\nexport const DEFAULT_LUMIA_PASSPORT_CONFIG: Omit<LumiaPassportConfig, 'projectId'> = {\n passkey: {\n enabled: true,\n showCreateButton: true,\n primaryButtonText: 'Sign in with Passkey'\n },\n email: {\n enabled: true,\n placeholder: 'Enter your email',\n buttonText: 'Continue',\n verificationTitle: 'Check your email'\n },\n social: {\n enabled: true,\n\n providers: [\n { id: 'google', name: 'Google', enabled: true, icon: GoogleIcon, comingSoon: true },\n {\n id: 'telegram',\n name: 'Telegram',\n enabled: true,\n icon: TelegramIcon,\n comingSoon: false,\n meta: {\n botUsername: (typeof __EMBARK_TG_BOT__ !== 'undefined' && __EMBARK_TG_BOT__) || undefined,\n salt: (typeof __EMBARK_TG_SALT__ !== 'undefined' && __EMBARK_TG_SALT__) || 'demo'\n }\n }\n ]\n },\n wallet: {\n enabled: true,\n supportedChains: [1, 137, 56],\n requireSignature: true,\n walletConnectProjectId: undefined\n },\n\n development: {\n enabled: true,\n showOnProduction: false\n },\n\n // preferedColorMode: 'light', // undefined means 'auto'\n\n ui: {\n title: 'Sign in',\n subtitle: undefined,\n authOrder: ['email', 'social', 'wallet']\n },\n\n network: {\n name: 'Lumia Beam',\n symbol: 'LUMIA',\n chainId: 2030232745,\n rpcUrl: 'https://beam-rpc.lumia.org',\n explorerUrl: 'https://beam-explorer.lumia.org',\n testnet: true\n },\n services: {\n bundlerUrl: '', // Will fallback to build-time env vars\n tssUrl: '', // Will fallback to build-time env vars\n shareVaultUrl: '', // Will fallback to build-time env vars\n iframeUrl: 'https://auth.lumiapassport.com', // Secure iframe for MPC operations\n tssRequireWasm: false,\n tssWasmDebug: false\n },\n features: {\n mpcSecurity: true,\n strictMode: false,\n requestDeduplication: true,\n kycNeeded: false,\n displayNameNeeded: false,\n showActiveBalanceAsFiat: false\n },\n warnings: {\n backupWarning: true,\n emailNotConnectedWarning: true\n },\n kyc: {\n provider: undefined,\n options: undefined\n }\n}\n\nexport function getServiceUrls() {\n const config = DEFAULT_LUMIA_PASSPORT_CONFIG\n const globalOverride = (typeof window !== 'undefined' && window.__EMBARK_SERVICES__) || {}\n const searchParams = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : undefined\n const paramBundler = searchParams?.get('bundlerUrl') || undefined\n const paramTss = searchParams?.get('tssUrl') || undefined\n const paramVault = searchParams?.get('shareVaultUrl') || undefined\n // Build-time injected (via tsup.define)\n const buildBundler = (typeof __EMBARK_BUNDLER_URL__ !== 'undefined' && __EMBARK_BUNDLER_URL__) || ''\n const buildTss = (typeof __EMBARK_TSS_URL__ !== 'undefined' && __EMBARK_TSS_URL__) || ''\n const buildVault = (typeof __EMBARK_SHARE_VAULT_URL__ !== 'undefined' && __EMBARK_SHARE_VAULT_URL__) || ''\n const buildRequireWasm =\n (typeof __EMBARK_TSS_REQUIRE_WASM__ !== 'undefined' && (__EMBARK_TSS_REQUIRE_WASM__ as any) === true) || false\n const buildWasmDebug =\n (typeof __EMBARK_TSS_WASM_DEBUG__ !== 'undefined' && (__EMBARK_TSS_WASM_DEBUG__ as any) === true) || false\n\n // Use sensible defaults as last fallback\n const defaultBundler = '/bundler'\n const defaultTss = '/tss'\n const defaultVault = '/vault'\n\n const result = {\n bundlerUrl:\n paramBundler || globalOverride.bundlerUrl || buildBundler || config.services.bundlerUrl || defaultBundler,\n tssUrl: paramTss || globalOverride.tssUrl || buildTss || config.services.tssUrl || defaultTss,\n shareVaultUrl:\n paramVault || globalOverride.shareVaultUrl || buildVault || config.services.shareVaultUrl || defaultVault,\n tssRequireWasm: globalOverride.tssRequireWasm ?? buildRequireWasm ?? config.services.tssRequireWasm ?? false,\n tssWasmDebug: globalOverride.tssWasmDebug ?? buildWasmDebug ?? config.services.tssWasmDebug ?? false\n }\n\n return result\n}\n\nexport function getIframeUrl(): string {\n const config = DEFAULT_LUMIA_PASSPORT_CONFIG\n\n // Build-time injected iframe URL (from LUMIA_IFRAME_URL env var)\n const buildIframeUrl = (typeof __EMBARK_IFRAME_URL__ !== 'undefined' && __EMBARK_IFRAME_URL__) || ''\n\n // Priority: build-time env var > config > default production URL\n const iframeUrl = buildIframeUrl || config.services.iframeUrl || 'https://auth.lumiapassport.com'\n\n return iframeUrl\n}\n\nexport function getBlockscoutApiUrl(chainConfig?: ChainConfig): string | null {\n // Use blockscoutApiUrl from chain config if available\n // Note: Not all chains have Blockscout-compatible APIs (e.g., BSCScan, Etherscan)\n // if (chainConfig?.blockscoutApiUrl) {\n // return chainConfig.blockscoutApiUrl\n // }\n\n // No Blockscout API available for this chain\n return chainConfig?.blockscoutApiUrl || null\n}\n","/**\n * Custom error types for Lumia Passport operations\n */\n\n/**\n * Base error class for all Lumia Passport errors\n * Local copy to avoid @embarkai/core dependency in iframe bundle\n */\nexport class LumiaPassportError extends Error {\n /** Machine-readable error code for programmatic handling */\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.code = code;\n this.name = 'LumiaPassportError';\n\n // Maintain proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, LumiaPassportError);\n }\n }\n}\n\n/**\n * Error thrown when user rejects a transaction or signature request\n */\nexport class UserRejectedError extends LumiaPassportError {\n static readonly CODE = 'USER_REJECTED' as const;\n\n constructor(message: string = 'User rejected transaction') {\n super(message, UserRejectedError.CODE);\n this.name = 'UserRejectedError';\n }\n}\n\n/**\n * Error codes for Lumia Passport operations\n */\nexport const ErrorCodes = {\n MPC_SIGNING_ERROR: 'MPC_SIGNING_ERROR',\n USER_REJECTED: UserRejectedError.CODE,\n} as const;\n\n/**\n * Create appropriate error from error code\n * Used to reconstruct errors from iframe postMessage\n */\nexport function createLumiaPassportError(params: { message: string; code?: string }): Error {\n const { message, code } = params;\n\n if (!code) {\n return new Error(message);\n }\n\n switch (code) {\n case UserRejectedError.CODE:\n return new UserRejectedError(message);\n default:\n return new LumiaPassportError(message, code);\n }\n}\n","/**\n * Base64URL encoding/decoding utilities for browser\n * Re-exports core functionality and adds browser-specific helpers\n */\n\n// Re-export core base64url functions\nexport * from '@embarkai/core/auth';\n\n/**\n * Convert ArrayBuffer to base64url string (browser-specific)\n */\nexport function arrayBufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Convert base64url string to Uint8Array (browser-specific)\n */\nexport function base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { arrayBufferToBase64url } from './base64url';\n\nexport type AttestationCredentialPayload = {\n id: string;\n rawId: string; // base64url\n type: string; // \"public-key\"\n response: {\n clientDataJSON: string; // base64url\n attestationObject: string; // base64url\n transports?: string[];\n };\n};\n\nexport function credentialToAttestationPayload(credential: PublicKeyCredential): AttestationCredentialPayload {\n const response = credential.response as AuthenticatorAttestationResponse & {\n getTransports?: () => string[];\n };\n\n const transports = (response as any).getTransports?.() || [];\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n attestationObject: arrayBufferToBase64url(response.attestationObject),\n transports,\n },\n };\n}\n\n","/**\n * Helper to add projectId to URL query parameters\n * This is used across the codebase to ensure projectId is sent with every request\n */\nexport function addProjectIdToUrl(url: string): string {\n try {\n const projectId = typeof window !== 'undefined' ? (window as any).__EMBARK_PROJECT_ID__ : undefined;\n if (projectId) {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}projectId=${encodeURIComponent(projectId)}`;\n }\n } catch {}\n return url;\n}\n\n/**\n * Get projectId from window global\n */\nexport function getProjectId(): string | undefined {\n try {\n return typeof window !== 'undefined' ? (window as any).__EMBARK_PROJECT_ID__ : undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Browser-specific passkey authentication functions\n * These functions work with WebAuthn API and are UI-specific\n */\n\nimport { jwtTokenManager } from '@embarkai/core/auth';\nimport type { LoginResponse } from '@embarkai/core/auth';\nimport { credentialToAttestationPayload } from './webauthn';\nimport { arrayBufferToBase64url, base64urlToUint8Array } from './base64url';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { getServiceUrls } from '../../config/lumiaPassport';\n\nfunction getTssUrl(): string {\n return getServiceUrls().tssUrl;\n}\n\n/**\n * Begin passkey authentication flow\n */\nexport async function beginPasskeyAuthentication(\n username?: string\n): Promise<{\n challenge: string;\n challengeId: string;\n options: PublicKeyCredentialRequestOptions;\n}> {\n const response = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/login/begin`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ username }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Failed to begin authentication');\n throw new Error(`Begin auth failed: ${response.status} ${errorText}`);\n }\n\n const beginResponse = await response.json();\n\n const options: PublicKeyCredentialRequestOptions = {\n challenge: base64urlToUint8Array(beginResponse.challenge) as BufferSource,\n allowCredentials: (beginResponse.allowCredentials || []).map((cred: any) => ({\n type: cred.type,\n id: base64urlToUint8Array(cred.id) as BufferSource,\n transports: cred.transports,\n })),\n timeout: beginResponse.timeout,\n userVerification: beginResponse.userVerification || 'preferred',\n extensions: beginResponse.extensions,\n };\n\n return {\n challenge: beginResponse.challenge,\n challengeId: beginResponse.challengeId,\n options,\n };\n}\n\n/**\n * Complete passkey authentication flow\n */\nexport async function completePasskeyAuthentication(\n challengeId: string,\n credential: PublicKeyCredential,\n options?: { skipTokenSave?: boolean }\n): Promise<LoginResponse> {\n const response = credential.response as AuthenticatorAssertionResponse;\n\n const credentialData = {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n signature: arrayBufferToBase64url(response.signature),\n userHandle: response.userHandle ? arrayBufferToBase64url(response.userHandle) : null,\n },\n };\n\n const completeResponse = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/login/complete`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ challengeId, credential: credentialData }),\n }\n );\n\n if (!completeResponse.ok) {\n let message = 'Authentication failed';\n try {\n const err = await completeResponse.json();\n message = err?.message || message;\n } catch {\n try {\n const text = await completeResponse.text();\n message = (text || message).slice(0, 200);\n } catch {}\n }\n throw new Error(`Complete authentication failed: ${completeResponse.status} ${message}`);\n }\n\n const loginResponse: LoginResponse = (await completeResponse.json()) as LoginResponse;\n if (!options?.skipTokenSave) {\n await jwtTokenManager.setTokens(loginResponse);\n }\n return loginResponse;\n}\n\n/**\n * Begin passkey registration flow\n */\nexport async function beginPasskeyRegistration(\n username: string\n): Promise<{\n challengeId: string;\n options: PublicKeyCredentialCreationOptions;\n}> {\n const response = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/register/begin`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ username }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Failed to begin registration');\n throw new Error(`Begin registration failed: ${response.status} ${errorText}`);\n }\n\n const beginResponse = await response.json();\n\n const options: PublicKeyCredentialCreationOptions = {\n rp: beginResponse.rp,\n user: {\n id: base64urlToUint8Array(beginResponse.user.id) as BufferSource,\n name: beginResponse.user.name,\n displayName: beginResponse.user.displayName,\n },\n challenge: base64urlToUint8Array(beginResponse.challenge) as BufferSource,\n pubKeyCredParams: beginResponse.pubKeyCredParams,\n timeout: beginResponse.timeout,\n attestation: beginResponse.attestation,\n authenticatorSelection: {\n ...beginResponse.authenticatorSelection,\n residentKey: 'preferred',\n requireResidentKey: false,\n userVerification: 'preferred',\n },\n excludeCredentials:\n beginResponse.excludeCredentials?.map((cred: any) => ({\n type: cred.type,\n id: base64urlToUint8Array(cred.id),\n transports: cred.transports,\n })) || undefined,\n };\n\n return {\n challengeId: beginResponse.challengeId,\n options,\n };\n}\n\n/**\n * Complete passkey registration flow\n */\nexport async function completePasskeyRegistration(\n challengeId: string,\n credential: PublicKeyCredential,\n options?: { skipTokenSave?: boolean }\n): Promise<LoginResponse> {\n const credentialData = credentialToAttestationPayload(credential);\n\n const completeResponse = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/register/complete`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ challengeId, credential: credentialData }),\n }\n );\n\n if (!completeResponse.ok) {\n const errorText = await completeResponse.text().catch(() => 'Registration failed');\n throw new Error(errorText);\n }\n\n const loginResponse: LoginResponse = (await completeResponse.json()) as LoginResponse;\n if (!options?.skipTokenSave) {\n await jwtTokenManager.setTokens(loginResponse);\n }\n return loginResponse;\n}\n","import { isHex, toHex, keccak256, stringToBytes } from 'viem';\n\nexport type TelegramUser = {\n id: number;\n first_name?: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: string;\n hash: string;\n};\n\nexport interface TelegramAuthResult {\n user: TelegramUser;\n privateKey: `0x${string}`;\n displayName: string;\n}\n\nexport function deriveDemoPrivateKey(user: TelegramUser, salt: string): `0x${string}` {\n const base = `${user.id}:${salt}`;\n const h = keccak256(stringToBytes(base));\n const pk = h.slice(0, 66) as `0x${string}`;\n return isHex(pk) ? pk : (toHex(h).slice(0, 66) as `0x${string}`);\n}\n\nexport function initTelegramWidget(\n botUsername: string,\n onAuth: (result: TelegramAuthResult) => Promise<void>,\n salt: string = 'demo',\n rootId: string = 'tg-root'\n): () => void {\n const root = document.getElementById(rootId);\n if (!root) {\n console.warn(`[Telegram] No ${rootId} element found`);\n return () => {};\n }\n root.innerHTML = '';\n (window as any).onTelegramAuth = async (user: TelegramUser) => {\n if (!user?.id || !user.auth_date || !user.hash) throw new Error('Invalid Telegram auth payload');\n const privateKey = deriveDemoPrivateKey(user, salt);\n const displayName = user.first_name || user.username || `User ${user.id}`;\n await onAuth({ user, privateKey, displayName });\n };\n const script = document.createElement('script');\n script.async = true;\n script.src = 'https://telegram.org/js/telegram-widget.js?22';\n script.setAttribute('data-telegram-login', botUsername);\n script.setAttribute('data-size', 'large');\n script.setAttribute('data-userpic', 'true');\n script.setAttribute('data-onauth', 'onTelegramAuth(user)');\n script.setAttribute('data-request-access', 'write');\n script.onerror = (error) => { console.error('[Telegram] Failed to load widget script:', error); };\n root.appendChild(script);\n return () => {\n try { delete (window as any).onTelegramAuth; if (root) root.innerHTML = ''; if (script && script.parentElement && document.contains(script)) script.parentElement.removeChild(script); } catch {}\n };\n}\n\nexport function hideTelegramWidget(): void { try { const root = document.getElementById('tg-root'); if (root) root.style.display = 'none'; } catch {} }\nexport function showTelegramWidget(): void { try { const root = document.getElementById('tg-root'); if (root) root.style.display = ''; } catch {} }\n\n","export const APP_TITLE = 'Lumia Passport';\nexport const APP_SUBTITLE = 'Connect and use Lumia smart accounts';\nexport const DAPP_NAME = 'passport';\n\n","/** Passkey module (copied, lightly adapted) */\nimport { DAPP_NAME } from '../lib/site';\nimport { beginPasskeyRegistration, completePasskeyRegistration, beginPasskeyAuthentication, completePasskeyAuthentication } from './index';\n\nlet activeWebAuthnOperation: Promise<any> | null = null;\nlet conditionalUIStarting = false;\ndeclare global { interface Window { __EMBARK_CONDITIONAL_UI_ACTIVE__?: boolean } }\nfunction isConditionalUIGloballyActive(): boolean { return typeof window !== 'undefined' && window.__EMBARK_CONDITIONAL_UI_ACTIVE__ === true; }\nfunction setGlobalConditionalUI(active: boolean): void { if (typeof window !== 'undefined') window.__EMBARK_CONDITIONAL_UI_ACTIVE__ = active; }\nexport function resetWebAuthnFlags(): void { activeWebAuthnOperation = null; conditionalUIStarting = false; setGlobalConditionalUI(false); }\nfunction generatePasskeyUsername(): string { const timestamp = new Date().toISOString(); return `lumia-aa.${DAPP_NAME}-${timestamp}`; }\n\nexport interface PasskeyCredential { id: string; rawId: string; ownerPublicKey: `0x${string}` }\nexport interface PasskeyAuthResult { credential: PasskeyCredential; mpcUserId: string; loginResponse: any }\nexport interface PasskeyHelpers {\n getPasskeyKey: (key: string) => string;\n getCredId: () => string | null;\n getRawId: () => string | null;\n getOwnerPk: () => `0x${string}` | null;\n setCredId: (credId: string) => void;\n setRawId: (rawId: string) => void;\n setOwnerPk: (ownerPk: `0x${string}`) => void;\n clear: () => void;\n hasCredentials: () => boolean;\n}\n\nexport function createPasskeyHelpers(mpcUserId: string): PasskeyHelpers {\n const getPasskeyKey = (key: string) => `passkey.${mpcUserId}.${key}`;\n return {\n getPasskeyKey,\n getCredId: () => localStorage.getItem(getPasskeyKey('credId')),\n getRawId: () => localStorage.getItem(getPasskeyKey('rawId')),\n getOwnerPk: () => localStorage.getItem(getPasskeyKey('ownerPk')) as `0x${string}` | null,\n setCredId: (credId: string) => localStorage.setItem(getPasskeyKey('credId'), credId),\n setRawId: (rawId: string) => localStorage.setItem(getPasskeyKey('rawId'), rawId),\n setOwnerPk: (ownerPk: `0x${string}`) => localStorage.setItem(getPasskeyKey('ownerPk'), ownerPk),\n clear: () => { localStorage.removeItem(getPasskeyKey('credId')); localStorage.removeItem(getPasskeyKey('rawId')); localStorage.removeItem(getPasskeyKey('ownerPk')); },\n hasCredentials: () => !!(localStorage.getItem(getPasskeyKey('credId')) || localStorage.getItem(getPasskeyKey('rawId'))),\n };\n}\n\nexport function isWebAuthnSupported(): boolean { return ('credentials' in navigator && 'create' in navigator.credentials && 'get' in navigator.credentials); }\n\nexport async function hasAvailablePasskeys(): Promise<boolean> {\n if (!isWebAuthnSupported()) return false;\n try {\n const isAvailable = await Promise.race([\n PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(),\n new Promise<boolean>((_, reject) => setTimeout(() => reject(new Error('Timeout')), 3000)),\n ]);\n if (!isAvailable) return false;\n try {\n const credential = await Promise.race([\n navigator.credentials.get({ publicKey: { challenge: new Uint8Array(32), timeout: 5000, userVerification: 'preferred' }, mediation: 'silent' as any }),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Detection timeout')), 2000)),\n ]);\n return !!credential;\n } catch { return false; }\n } catch { return false; }\n}\n\nexport async function registerPasskey(mpcUserId: string, onProgress?: (s: string) => void, options?: { skipTokenSave?: boolean }): Promise<{ credential: PasskeyCredential; loginResponse: any }> {\n if (!isWebAuthnSupported()) throw new Error('WebAuthn not supported in this browser');\n const helpers = createPasskeyHelpers(mpcUserId);\n onProgress?.('Starting passkey registration...');\n const passkeyUsername = generatePasskeyUsername();\n onProgress?.('Getting registration challenge...');\n const { challengeId, options: credOptions } = await beginPasskeyRegistration(passkeyUsername);\n onProgress?.('Creating passkey credential...');\n const credential = (await navigator.credentials.create({ publicKey: credOptions })) as PublicKeyCredential;\n if (!credential) throw new Error('Failed to create passkey credential');\n onProgress?.('Verifying passkey with server...');\n const loginResponse = await completePasskeyRegistration(challengeId, credential, options);\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(credential.rawId)));\n const derivedOwnerPk = `0x${'0'.repeat(40)}${credential.id.slice(-24)}` as `0x${string}`;\n helpers.setCredId(credential.id); helpers.setRawId(rawIdB64); helpers.setOwnerPk(derivedOwnerPk);\n onProgress?.('Passkey registered successfully!');\n return {\n credential: { id: credential.id, rawId: rawIdB64, ownerPublicKey: derivedOwnerPk },\n loginResponse\n };\n}\n\nexport async function authenticateWithPasskey(_username?: string, onProgress?: (s: string) => void, options?: { skipTokenSave?: boolean }): Promise<PasskeyAuthResult> {\n if (!isWebAuthnSupported()) throw new Error('WebAuthn not supported in this browser');\n onProgress?.('Starting passkey authentication...');\n const { challengeId, options: beginOptions } = await beginPasskeyAuthentication();\n const getOptions = { ...beginOptions } as any; if (getOptions.allowCredentials && getOptions.allowCredentials.length === 0) delete getOptions.allowCredentials;\n const assertion = (await navigator.credentials.get({ publicKey: getOptions })) as PublicKeyCredential;\n if (!assertion) throw new Error('Passkey authentication failed - no credential returned');\n onProgress?.('Verifying passkey with server...');\n const loginResponse = await completePasskeyAuthentication(challengeId, assertion, options);\n const userHelpers = createPasskeyHelpers(loginResponse.userId);\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(assertion.rawId)));\n const derivedOwnerPk = `0x${'0'.repeat(40)}${assertion.id.slice(-24)}` as `0x${string}`;\n userHelpers.setCredId(assertion.id); userHelpers.setRawId(rawIdB64); userHelpers.setOwnerPk(derivedOwnerPk);\n onProgress?.('Authentication complete!');\n return {\n credential: { id: assertion.id, rawId: rawIdB64, ownerPublicKey: derivedOwnerPk },\n mpcUserId: loginResponse.userId,\n loginResponse\n };\n}\n","/**\n * Iframe-based MPC Client\n *\n * Secure implementation that uses iframe isolation for key share storage and cryptographic operations\n * This replaces the legacy mpcClient.ts localStorage-based approach with iframe-based security\n */\n\nimport type { Address, Hex } from 'viem';\nimport { getIframeManager } from './iframe-manager';\nimport { logSdkError } from '@embarkai/core/internal/error-tracking';\nimport { LumiaPassportError, ErrorCodes } from '../../lib/errors'\n\n/**\n * Performance statistics for MPC signing (compatible with legacy interface)\n */\nexport type MpcSigningStats = {\n startTime: number;\n endTime?: number;\n totalDurationMs?: number;\n rounds: {\n roundNumber: number;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n description: string;\n clientMsgSize?: number;\n serverMsgSize?: number;\n clientMsgKind?: string;\n serverMsgKind?: string;\n }[];\n wasmLoadTime?: number;\n keyshareLoadTime?: number;\n keyshareSize?: number;\n signatureVerificationTime?: number;\n totalDataTransferred?: number;\n};\n\nlet currentSigningStats: MpcSigningStats | null = null;\n\n/**\n * Get current MPC signing statistics\n */\nexport function getCurrentMpcSigningStats(): MpcSigningStats | null {\n if (!currentSigningStats) return null;\n const clonedRounds = currentSigningStats.rounds.map((r) => ({ ...r }));\n return { ...currentSigningStats, rounds: clonedRounds };\n}\n\n/**\n * Ensure DKG is completed and get owner address\n *\n * SECURITY: All cryptographic operations now happen inside the isolated iframe\n * Key shares are stored in iframe's localStorage (auth.lumiapassport.com)\n * NOT in parent domain's localStorage\n */\nexport async function ensureDkgAndGetOwner(\n userId: string,\n _clientSeedHex?: `0x${string}` // Deprecated parameter, kept for API compatibility\n): Promise<{ sessionId: string; ownerAddress?: Address }> {\n try {\n const iframeManager = getIframeManager();\n\n // Check if user already has a keyshare in iframe\n const keyshareStatus = await iframeManager.checkKeyshare(userId);\n\n if (keyshareStatus.hasKeyshare && keyshareStatus.address) {\n // Return with dummy sessionId (actual session is managed by iframe)\n return {\n sessionId: 'iframe-session',\n ownerAddress: keyshareStatus.address,\n };\n }\n\n // Authenticate user with iframe (will show consent modal if needed)\n await iframeManager.authenticate(userId);\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n let accessToken = jwtTokenManager.getAccessToken();\n if (!accessToken) {\n console.warn('[iframe-mpc-client] No access token available for DKG, attempting cookie-based session');\n accessToken = undefined;\n }\n\n // Start DKG in iframe\n const ownerAddress = await iframeManager.startDKG(userId, accessToken);\n\n return {\n sessionId: 'iframe-session',\n ownerAddress,\n };\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('DKG failed'),\n { userId },\n 'iframe-mpc'\n );\n throw error;\n }\n}\n\n/**\n * Check if error is an SDK channel error that can be recovered by reconnecting\n */\nfunction isChannelError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('invalid sdk channel') ||\n message.includes('sdk channel not found') ||\n message.includes('sdk channel expired') ||\n // Backward compatibility\n message === 'invalid session'\n );\n}\n\n/**\n * Sign digest with MPC using iframe\n *\n * SECURITY: All signing operations happen inside the isolated iframe\n * User sees confirmation modal inside iframe (parent cannot manipulate it)\n * Key share never leaves iframe's localStorage\n *\n * Includes automatic retry on SDK channel errors (e.g., after tab switch)\n */\nexport async function signDigestWithMpc(\n userId: string,\n digest32: `0x${string}`,\n userOpDetails?: {\n sender?: string;\n nonce?: string;\n callData?: string;\n callGasLimit?: string;\n verificationGasLimit?: string;\n preVerificationGas?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n paymaster?: string;\n factory?: string;\n factoryData?: string;\n callTarget?: string;\n value?: string;\n }\n): Promise<`0x${string}`> {\n const MAX_RETRIES = 1;\n const startTime = performance.now();\n currentSigningStats = {\n startTime,\n rounds: [],\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const iframeManager = getIframeManager();\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n throw new Error('No access token available for signing');\n }\n\n // Create transaction object with UserOp details for display + pre-computed digest\n const transaction = {\n to: (userOpDetails?.callTarget || '0x0000000000000000000000000000000000000000') as Address,\n value: userOpDetails?.value || '0',\n data: (userOpDetails?.callData || '0x') as Hex,\n digest32, // Pre-computed digest - DO NOT recompute!\n // Additional UserOp fields for display in confirmation modal\n userOpDetails,\n };\n\n // Sign transaction via iframe\n // This will show user confirmation modal inside iframe with full UserOp details\n const signature = await iframeManager.signTransaction(userId, transaction, accessToken);\n\n const endTime = performance.now();\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n\n return signature;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('MPC signing failed');\n\n // Check if this is an SDK channel error that can be retried\n if (isChannelError(lastError) && attempt < MAX_RETRIES) {\n console.warn(`[MPC] SDK channel error, reconnecting and retrying (attempt ${attempt + 1})...`);\n try {\n await getIframeManager().reconnect();\n continue; // Retry\n } catch (reconnectError) {\n console.error('[MPC] Reconnect failed:', reconnectError);\n // Fall through to throw the original error\n }\n }\n\n // Log and throw\n logSdkError(\n lastError,\n { userId, hasUserOpDetails: !!userOpDetails, attempt },\n 'iframe-mpc'\n );\n\n const endTime = performance.now();\n if (currentSigningStats) {\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n }\n\n if (lastError instanceof LumiaPassportError) {\n throw lastError;\n }\n\n throw new LumiaPassportError(\n lastError.message,\n ErrorCodes.MPC_SIGNING_ERROR\n );\n }\n }\n\n // Should not reach here, but TypeScript needs this\n throw lastError || new Error('MPC signing failed after retries');\n}\n\n/**\n * Sign EIP712 typed data with MPC using iframe\n *\n * SECURITY: All signing operations happen inside the isolated iframe\n * User sees structured EIP712 confirmation modal inside iframe\n * Key share never leaves iframe's localStorage\n */\nexport async function signTypedDataWithMpc(\n userId: string,\n digest32: `0x${string}`,\n typedData: {\n domain: {\n name?: string;\n version?: string;\n chainId?: number;\n verifyingContract?: string;\n salt?: string;\n };\n types: Record<string, Array<{ name: string; type: string }>>;\n primaryType: string;\n message: Record<string, any>;\n }\n): Promise<`0x${string}`> {\n const startTime = performance.now();\n currentSigningStats = {\n startTime,\n rounds: [],\n };\n\n try {\n console.log('[signTypedDataWithMpc] Starting EIP712 signature request:', {\n userId,\n primaryType: typedData?.primaryType,\n digest32\n });\n\n const iframeManager = getIframeManager();\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n console.error('[signTypedDataWithMpc] No access token available');\n throw new Error('No access token available for signing');\n }\n\n console.log('[signTypedDataWithMpc] Calling iframeManager.signTypedData...');\n\n // Sign typed data via iframe\n // This will show user confirmation modal inside iframe with structured EIP712 message\n const signature = await iframeManager.signTypedData(userId, typedData, digest32, accessToken);\n\n console.log('[signTypedDataWithMpc] Signature received:', signature);\n\n const endTime = performance.now();\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n\n return signature;\n } catch (error) {\n console.error('[signTypedDataWithMpc] Error occurred:', error);\n logSdkError(\n error instanceof Error ? error : new Error('EIP712 MPC signing failed'),\n { userId, primaryType: typedData?.primaryType },\n 'iframe-mpc'\n );\n\n const endTime = performance.now();\n if (currentSigningStats) {\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n }\n\n if (error instanceof LumiaPassportError) {\n throw error;\n }\n\n // Wrap other errors in LumiaPassportError to preserve context\n throw new LumiaPassportError(\n error instanceof Error ? error.message : 'EIP712 MPC signing failed',\n ErrorCodes.MPC_SIGNING_ERROR\n );\n }\n}\n\n/**\n * Check if user has a keyshare (via iframe)\n */\nexport async function checkKeyshare(\n userId: string\n): Promise<{ hasKeyshare: boolean; address?: Address }> {\n try {\n const iframeManager = getIframeManager();\n return await iframeManager.checkKeyshare(userId);\n } catch (error) {\n console.error('[IframeMPC] Error checking keyshare:', error);\n return { hasKeyshare: false };\n }\n}\n\n/**\n * Get user's wallet address (via iframe)\n */\nexport async function getAddress(userId: string): Promise<Address | undefined> {\n try {\n const iframeManager = getIframeManager();\n return await iframeManager.getAddress(userId);\n } catch (error) {\n console.error('[IframeMPC] Error getting address:', error);\n return undefined;\n }\n}\n","import { Transition } from 'framer-motion'\nimport { Key, Mail, Wallet2 } from 'lucide-react'\n\nimport { DiscordIcon, GoogleIcon, TelegramIcon, TwitterIcon } from '../config/assets'\nimport type { AuthProvider, ProvidersMeta } from './auth'\n\nexport const LOCAL_COLOR_MODE_KEY = 'lumia-passport-theme'\nexport const LP_JWT_TOKENS_LS_KEY = 'lumia-passport-jwt-tokens'\n\nexport const DEFAULT_AUTH_MENU_HEIGHT = 253 // in px, should match actual AUTH MENU height\nexport const DEFAULT_MAIN_MENU_HEIGHT = 90 // in px, should match actual AUTHED MAIN MENU height\nexport const DEFAULT_SETTINGS_MENU_HEIGHT = 462 // in px, should match actual AUTHED SETTINGS MENU height\n\nexport const MAX_CONTENT_HEIGHT = 640\n\nexport const MAIN_DIALOG_ANIMATION_SPEED = 375 // in ms\n\nexport const Y_ANIMATION_SETUP = { duration: 0.15, ease: 'easeInOut', height: { duration: 0.375 } } as Transition\n\n// Blockscout API configuration (URL derived from config.network.explorerUrl)\nexport const BLOCKSCOUT_QUERY_STALE_TIME = 30 * 1000 // 30 seconds\nexport const BLOCKSCOUT_QUERY_GC_TIME = 5 * 60 * 1000 // 5 minutes\nexport const BLOCKSCOUT_REFRESH_DEBOUNCE = 2000 // 2 seconds\nexport const IPFS_GATEWAY = 'https://ipfs.io/ipfs/'\n\nexport const PROVIDERS_META: Record<AuthProvider['provider'] | 'x', ProvidersMeta> = {\n passkey: { name: 'Passkey', icon: Key, description: 'Biometric authentication' },\n email: { name: 'Email', icon: Mail, description: 'Email verification' },\n telegram: { name: 'Telegram', icon: TelegramIcon, description: 'Telegram account' },\n google: { name: 'Google', icon: GoogleIcon, description: 'Google account' },\n discord: { name: 'Discord', icon: DiscordIcon, description: 'Discord account' },\n twitter: { name: 'X', icon: TwitterIcon, description: 'X (Twitter) account' },\n x: { name: 'X', icon: TwitterIcon, description: 'X (Twitter) account' }, // Alias for twitter (API uses 'x')\n wallet: { name: 'Wallet', icon: Wallet2, description: 'External wallet (EOA)' }\n}\n","import { create } from 'zustand'\n\nimport { DEFAULT_MAIN_MENU_HEIGHT } from '../constants'\n\nenum PageKey {\n AUTH = 'auth',\n LANGUAGES = 'languages',\n TERMS_OF_SERVICE = 'terms-of-service',\n MAIN_MENU = 'main-menu',\n SETTINGS = 'settings',\n SEND = 'send',\n RECEIVE = 'receive',\n BUY = 'buy',\n KYC = 'kyc',\n TRANSACTIONS = 'transactions',\n ASSETS = 'assets',\n MANAGE_WALLET = 'manage-wallet',\n UNLINK_PROVIDER = 'unlink-provider',\n SECURITY = 'security',\n KEYSARE_BACKUP = 'keysare-backup',\n KEYSHARE_RESTORE = 'keyshare-restore',\n CHAIN = 'chain',\n CHAIN_SWITCH_REQUEST = 'chain-switch-request',\n NICKNAME_SETTINGS = 'nickname-settings'\n}\n\n/** WIP: need to develop page options typeset, i.e options: AuthOpenOptions | BuyOpenOption etc */\ninterface PageOpenParams {\n key: PageKey\n [option: string]: unknown // WIP: need to develop page options typeset, i.e options: AuthOpenOptions | BuyOpenOptions etc\n}\n\ninterface SetttingsNotification {\n id: string\n target: PageKey\n message: string\n status: 'active' | 'resolved'\n}\n\ntype BalanceItem = {\n decimals: number\n formatted: string\n symbol: string\n value: bigint\n}\n\ninterface LayoutDataState {\n page: PageKey | null\n pageParams: PageOpenParams | null\n\n /** saves the page from which the language menu was opened, to return \"to\" when onLangChange fires. */\n langOpenedFromMenu: PageKey | null\n\n cryptoRate: number\n cryptoSymbol: string\n\n fiatBalance: number\n fiatSymbol: string\n\n balance: BalanceItem\n\n transitionPageHeight: number\n\n settingsNotifications: SetttingsNotification[]\n\n isWalletLinking: boolean\n}\n\ninterface LayoutDataActions {\n setPage: (page: PageKey | null) => void\n setPageParams: (options: PageOpenParams | null) => void\n\n setCryptoRate: (cryptoRate: number) => void\n setCryptoSymbol: (cryptoSymbol: string) => void\n\n setFiatBalance: (fiatBalance: number) => void\n setFiatSymbol: (fiatSymbol: string) => void\n\n setBalance: (balance: LayoutDataState['balance']) => void\n\n setTransitionPageHeight: (height: number) => void\n\n setSettingsNotifications: (notification: SetttingsNotification) => void\n\n setIsWalletLinking: (isWalletLinking: boolean) => void\n}\n\n/** Hook providing common data */\nconst useLayoutDataStore = create<LayoutDataState & LayoutDataActions>((set) => ({\n page: null,\n pageParams: null,\n\n langOpenedFromMenu: null,\n\n cryptoRate: 1,\n cryptoSymbol: 'LUMIA',\n\n fiatBalance: 0,\n fiatSymbol: 'USD',\n\n balance: { decimals: 18, formatted: '0.0', symbol: 'LUMIA', value: BigInt(0) },\n\n transitionPageHeight: DEFAULT_MAIN_MENU_HEIGHT,\n\n settingsNotifications: [],\n\n isWalletLinking: false,\n\n setPageParams: (pageOptions) => set({ pageParams: pageOptions }),\n setPage: (page) =>\n set((prev) => ({\n page,\n langOpenedFromMenu: page === PageKey.LANGUAGES ? prev.page : null\n })),\n\n setCryptoRate: (lumiaRate) => set({ cryptoRate: lumiaRate }),\n setCryptoSymbol: (cryptoSymbol) => set({ cryptoSymbol }),\n\n setFiatBalance: (usdBalance) => set({ fiatBalance: usdBalance }),\n setFiatSymbol: (fiatSymbol) => set({ fiatSymbol }),\n\n setBalance: (balance) => set({ balance }),\n\n setTransitionPageHeight: (transitionPageHeight) => set({ transitionPageHeight }),\n\n setSettingsNotifications: (notification) =>\n set((prev) => {\n const actions = notification.status === 'active' ? 'add' : 'remove'\n const exists = prev.settingsNotifications.find((n) => n.id === notification.id)\n\n if (actions === 'add') {\n if (exists) return prev // Avoid duplicates\n\n return { settingsNotifications: [...prev.settingsNotifications, notification] }\n }\n\n // Remove notification\n const filtered = prev.settingsNotifications.filter((n) => n.id !== notification.id)\n\n return { settingsNotifications: filtered }\n }),\n\n setIsWalletLinking: (isWalletLinking) => set({ isWalletLinking })\n}))\n\nexport { useLayoutDataStore, PageKey, PageOpenParams }\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQuery } from '@tanstack/react-query'\nimport { useEffect, useState } from 'react'\nimport { formatUnits } from 'viem'\n\nimport { useLayoutDataStore } from '../../hooks/useLayoutDataStore'\n\nconst BALANCE_POLLING_INTERVAL = 30000 // 30 seconds\nconst BALANCE_QUERY_KEY = 'lumia-passport-native-balance'\n\nconst SKIP_SYMBOLS = ['TEST', 'USDT']\n\nasync function getAssetRate(symbol: string = 'LUMIA', fiat: string = 'USDT') {\n if (SKIP_SYMBOLS.includes(symbol) || symbol === fiat) return { symbol, price: '1' }\n\n const assetURL = `https://api.binance.com/api/v3/ticker/price?symbol=${symbol.toUpperCase()}${fiat.toUpperCase()}`\n const response = await fetch(assetURL)\n return (await response.json()) as { symbol: string; price: string }\n}\nconst LUMIA_RATE_QUERY_KEY = 'lumia-passport-rate-query-key'\n\n/** Use only inside LumiaPassportSessionProvider */\nexport function BalanceFeedProvider() {\n const config = useLumiaPassportConfig().config\n const address = useLumiaPassportSession((st) => st.address)\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n const publicClient = useLumiaPassportSession((st) => st.publicClient)\n\n const { setCryptoRate, setFiatBalance, setBalance, setCryptoSymbol, setFiatSymbol } = useLayoutDataStore()\n\n const [balanceSymbol, setBalanceSymbol] = useState<string | null>(null)\n\n useEffect(() => {\n const { assets, showBalanceAs: customBalanceSymbol } = config.current?.projectAssets || {}\n const { balanceQuery, balanceQueryKey } = assets?.find((a) => a.symbol === customBalanceSymbol) || {}\n\n const isCustom = !!customBalanceSymbol && !!balanceQuery && !!balanceQueryKey\n\n setBalanceSymbol(isCustom ? customBalanceSymbol : chainConfig?.nativeCurrency.symbol)\n }, [config, address, chainConfig])\n\n const isNativeBalanceFeedEnabled = balanceSymbol === chainConfig?.nativeCurrency.symbol // not a custom asset\n const nativeSymbol = chainConfig?.nativeCurrency?.symbol || 'LUMIA'\n\n ///// ------------------------------------------------------------------- /////\n ///// -------- NATIVE BALANCE FETCH using viem publicClient ------------ /////\n ///// ------------------------------------------------------------------- /////\n const { data: balance } = useQuery({\n // Include chainId in query key to refetch when chain changes\n queryKey: [BALANCE_QUERY_KEY, address, chainConfig?.id],\n enabled: !!address && !!publicClient && !!isNativeBalanceFeedEnabled,\n refetchInterval: BALANCE_POLLING_INTERVAL,\n queryFn: async () => {\n if (!address || !publicClient) return null\n console.log('[BalanceFeedProvider] Fetching balance for', address, 'on chain', chainConfig?.id)\n const balanceValue = await publicClient.getBalance({ address: address as `0x${string}` })\n return {\n decimals: chainConfig?.nativeCurrency?.decimals || 18,\n formatted: formatUnits(balanceValue, chainConfig?.nativeCurrency?.decimals || 18),\n symbol: nativeSymbol,\n value: balanceValue\n }\n }\n })\n\n // Always update crypto symbol when chain changes\n useEffect(() => {\n setCryptoSymbol(nativeSymbol)\n }, [nativeSymbol, setCryptoSymbol])\n\n const { data: cryptoRate } = useQuery({\n queryKey: [LUMIA_RATE_QUERY_KEY, address, nativeSymbol],\n enabled: !!address && !!isNativeBalanceFeedEnabled,\n refetchInterval: BALANCE_POLLING_INTERVAL,\n queryFn: async () => getAssetRate(nativeSymbol, 'USDT')\n })\n\n useEffect(() => {\n const rate = cryptoRate ? Number(cryptoRate.price) : null\n\n if (!isNativeBalanceFeedEnabled || !balance || !rate) return\n\n const fiatBalanceValue = Number(formatUnits(BigInt(balance.value || '0'), balance.decimals || 18))\n\n setCryptoRate(rate)\n setCryptoSymbol(nativeSymbol)\n setFiatSymbol('USD')\n setFiatBalance(fiatBalanceValue * rate)\n setBalance(balance)\n }, [\n isNativeBalanceFeedEnabled,\n balance,\n cryptoRate,\n nativeSymbol,\n setFiatBalance,\n setCryptoRate,\n setBalance,\n setCryptoSymbol,\n setFiatSymbol\n ])\n\n ///// --------------------------------------- /////\n ///// -------- CUSTOM BALANCE FETCH -------- /////\n ///// --------------------------------------- /////\n const {\n balanceQuery: customBalanceQuery,\n balanceQueryKey: CUSTOM_BALANCE_QUERY_KEY,\n symbol: customAssetSymbol\n } = config.current?.projectAssets?.assets?.find((a) => a.symbol === config.current?.projectAssets?.showBalanceAs) ||\n {}\n\n const isCustomBalanceEnabled = balanceSymbol === customAssetSymbol\n\n // Custom balance fetch if custom balanceQuery is provided in config\n const { data: customBalance } = useQuery({\n retry: false,\n refetchInterval: BALANCE_POLLING_INTERVAL,\n enabled: !!address && !!isCustomBalanceEnabled,\n queryKey: CUSTOM_BALANCE_QUERY_KEY, // should be invalidated by host app via provided queryKey\n queryFn: async () => await customBalanceQuery?.()\n })\n\n useEffect(() => {\n if (!isCustomBalanceEnabled || !customBalance) return\n\n const { cryptoFiatRate, fiatFormatted, cryptoFormatted, cryptoSymbol, fiatSymbol } = customBalance\n\n if (!!cryptoSymbol) setCryptoSymbol(cryptoSymbol?.toUpperCase())\n if (!!fiatSymbol) setFiatSymbol(fiatSymbol?.toUpperCase())\n\n setCryptoRate(cryptoFiatRate || 1)\n setFiatBalance(fiatFormatted || 0)\n\n // conversions to fit setBalance interface\n setBalance({\n decimals: 18,\n formatted: cryptoFormatted?.toString() || '0',\n symbol: cryptoSymbol?.toUpperCase() || nativeSymbol,\n value: BigInt(Math.floor((cryptoFormatted || 0) * 10 ** 18))\n })\n }, [\n isCustomBalanceEnabled,\n customBalance,\n nativeSymbol,\n setFiatBalance,\n setBalance,\n setCryptoSymbol,\n setFiatSymbol,\n setCryptoRate\n ])\n\n return null\n}\n","export { BalanceFeedProvider } from './BalanceFeedProvider'\n","export const PAYMASTER_VERIFICATION_GAS_LIMIT: `0x${string}` = '0x249f0'\nexport const PAYMASTER_POSTOP_GAS_LIMIT: `0x${string}` = '0x186a0'\n\nexport const MAX_BUNDLER_VERIFICATION_GAS = 5_000_000n\nexport const PAYMASTER_VERIFICATION_GAS = 150_000n\nexport const PAYMASTER_POSTOP_GAS = 100_000n\n\nexport const SALT_ZERO: `0x${string}` = '0x0000000000000000000000000000000000000000000000000000000000000000'\nexport const SALT_ZERO_UINT256 = 0n\n\nexport const COMPAT_CREATE_ABI = [\n {\n type: 'function',\n name: 'createAccount',\n stateMutability: 'payable',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'salt', type: 'uint256' }\n ],\n outputs: [{ name: '', type: 'address' }]\n }\n] as const\n\nexport const executeAbi = [\n {\n type: 'function',\n name: 'execute',\n stateMutability: 'payable',\n inputs: [\n { name: 'target', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' }\n ],\n outputs: []\n }\n] as const\n\nexport const entryPointDepositAbi = [\n {\n type: 'function',\n name: 'depositTo',\n stateMutability: 'payable',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: []\n }\n] as const","/**\n * ABI definitions for account-related contracts\n */\n\nexport const ENTRY_POINT_DEPOSIT_ABI = [\n {\n type: 'function',\n name: 'depositTo',\n stateMutability: 'payable',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: []\n }\n] as const\n\nexport const ENTRY_POINT_BALANCE_ABI = [\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }]\n }\n] as const\n\nexport const ENTRY_POINT_NONCE_ABI = [\n {\n type: 'function',\n name: 'getNonce',\n stateMutability: 'view',\n inputs: [\n { name: 'account', type: 'address' },\n { name: 'key', type: 'uint192' }\n ],\n outputs: [{ name: '', type: 'uint256' }]\n }\n] as const\n\nexport const FACTORY_GET_ADDRESS_ABI = [\n {\n type: 'function',\n name: 'getAddress',\n stateMutability: 'view',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'salt', type: 'uint256' }\n ],\n outputs: [{ name: '', type: 'address' }]\n }\n] as const\n","import type { ChainContext } from '@embarkai/core/bundler'\n\nimport { FACTORY_GET_ADDRESS_ABI } from './abis'\n\n/**\n * Convert BigInt to hex string\n */\nexport function fromBigIntToHex(value: bigint): `0x${string}` {\n return `0x${value.toString(16)}` as `0x${string}`\n}\n\n/**\n * Normalize ECDSA signature to canonical form\n * Ensures s-value is in lower half of curve order\n */\nexport function normalizeSignature(signature: `0x${string}`): `0x${string}` {\n const sig = signature.slice(2)\n const r = sig.slice(0, 64)\n const s = sig.slice(64, 128)\n const v = sig.slice(128, 130)\n const sBigInt = BigInt(`0x${s}`)\n const secp256k1n = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141')\n const secp256k1nHalf = secp256k1n >> 1n\n let canonicalS = sBigInt\n let canonicalV = parseInt(v, 16)\n if (sBigInt > secp256k1nHalf) {\n canonicalS = secp256k1n - sBigInt\n canonicalV = canonicalV === 27 ? 28 : canonicalV === 28 ? 27 : canonicalV === 0 ? 1 : 0\n }\n const canonicalSHex = canonicalS.toString(16).padStart(64, '0')\n const canonicalVHex = canonicalV.toString(16).padStart(2, '0')\n return `0x${r}${canonicalSHex}${canonicalVHex}` as `0x${string}`\n}\n\n/**\n * Predict smart account address using factory's getAddress method\n */\nexport async function predictCompatAddress(\n owner: `0x${string}`,\n factory: `0x${string}`,\n salt: `0x${string}`,\n context: ChainContext\n): Promise<`0x${string}`> {\n const { client } = context\n try {\n // Convert bytes32 hex string to uint256 bigint for factory call\n const saltAsUint256 = BigInt(salt)\n const predicted = await (client as any).readContract({\n address: factory,\n abi: FACTORY_GET_ADDRESS_ABI,\n functionName: 'getAddress',\n args: [owner, saltAsUint256]\n })\n return predicted as `0x${string}`\n } catch (error) {\n throw new Error(`Failed to predict account address: ${error}`)\n }\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { getChainParams, useLumiaPassportSession, type ChainParams } from '@/src/context/LumiaPassportSessionContext'\nimport {\n // createBundlerClientForChain,\n // createPublicClientForChain,\n DEFAULT_CHAIN_ID,\n getChainConfig,\n // getViemChain,\n isChainSupported\n // type ChainConfig\n} from '@embarkai/core/read'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { throttle } from 'lodash-es'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport { SALT_ZERO } from '../../clients/account/constants'\nimport { predictCompatAddress } from '../../clients/account/helpers'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\n\n/**\n * Component that synchronizes the Smart Account address when the active chain changes.\n *\n * Different chains use different factory addresses, so the Smart Account address\n * (computed via CREATE2) differs per chain. This component recalculates the address\n * whenever activeChainId changes and updates the session store.\n *\n * If address prediction fails (e.g., due to incompatible factory contract),\n * it reverts to the previous chain.\n */\nexport function ChainSync() {\n const { config, callbacks } = useLumiaPassportConfig()\n\n const qc = useQueryClient()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const { address, session, activeChainId, setAddress, setSession, setActiveChain, setIsLoading, setStatus, setError } =\n useLumiaPassportSession()\n\n const prevChainId = useRef<number | null>(null)\n const isReverting = useRef(false)\n\n // console.warn('[CHAIN_SYNC]:', activeChainId, )\n\n const { mutate: updateChain } = useMutation({\n mutationFn: async (selectedChainId: number | null) => {\n if (!session?.ownerAddress) {\n console.warn('[CHAIN_SYNC] No session owner address, aborting chain update')\n throw new Error('No session owner')\n }\n\n if (prevChainId.current === activeChainId) {\n console.info('[CHAIN_SYNC] Current chain:', activeChainId)\n return { skip: true, targetChainId: activeChainId }\n }\n\n console.info('[CHAIN_SYNC]', prevChainId.current, '->', activeChainId)\n\n setIsLoading(true)\n\n let targetChainId: number | null = null\n\n switch (true) {\n case !!selectedChainId && !!isChainSupported(selectedChainId):\n targetChainId = selectedChainId\n break\n\n case !!selectedChainId && !isChainSupported(selectedChainId):\n console.warn(\n `[LumiaPassport] Current activeChainId ${selectedChainId} is not supported. Checking for fallback`\n )\n // no break, fallthrough to next case\n\n case !!config.current?.network?.chainId && !!isChainSupported(config.current.network.chainId):\n targetChainId = config.current.network.chainId\n console.info(`[LumiaPassport] Config chainId ${config.current.network.chainId} will be used.`)\n break\n\n case !!config.current?.network?.chainId && !isChainSupported(config.current.network.chainId):\n console.warn(`No Fallback ChainID Found. Using default chain ${DEFAULT_CHAIN_ID} instead.`)\n // no break, fallthrough to next case\n\n default:\n targetChainId = DEFAULT_CHAIN_ID\n break\n }\n\n // console.warn('[CHAIN_SYNC] targetChainId', targetChainId, address, session)\n\n setStatus(`Re-calculating address for chain ${targetChainId}...`)\n\n const chainConfig = getChainConfig(targetChainId)\n const chainParams: ChainParams = getChainParams(chainConfig)\n\n if (!chainConfig?.factoryAddress) {\n console.warn('[CHAIN_SYNC] Chain unchanged. No factory address ', targetChainId)\n throw new Error('Chain unchanged. No factory address ' + targetChainId)\n\n // Revert to previous chain if no factory\n // if (prevChainId.current !== null) {\n // console.warn('[ChainAddressSync] Reverting to previous chain', prevChainId.current)\n // isReverting.current = true\n // chainParams = getChainParams(getChainConfig(prevChainId.current))\n // }\n }\n\n return {\n skip: false,\n targetChainId,\n chainParams,\n smartAccountAddress: await predictCompatAddress(session.ownerAddress, chainConfig.factoryAddress, SALT_ZERO, {\n client: chainParams.publicClient\n })\n }\n },\n\n onSuccess: async ({ skip, targetChainId, smartAccountAddress, chainParams }) => {\n if (skip) return\n\n const { chainConfig } = chainParams\n\n // const targetChainId = chainConfig.id\n\n console.info('[CHAIN_SYNC] Address recalculated for chain', targetChainId, ':', smartAccountAddress)\n\n setActiveChain(chainParams)\n\n setAddress(smartAccountAddress)\n\n setSession({\n ...session,\n smartAccountAddress,\n address: smartAccountAddress,\n factoryAddress: chainConfig.factoryAddress\n })\n\n await callbacks?.onLumiaPassportChainChange?.({\n chainId: targetChainId,\n previousChainId: prevChainId.current\n })\n\n // if chain is not the one forced by dapp, show chain switch request page\n if (!config.current?.network?.forceChain && targetChainId !== config.current?.network?.chainId) {\n console.info('[CHAIN_SYNC] Dapp chain request:', targetChainId, '->', config.current?.network?.chainId)\n setPage(PageKey.CHAIN_SWITCH_REQUEST)\n }\n\n prevChainId.current = targetChainId\n\n await qc.invalidateQueries() // Invalidate all onscreen queries & tag all cached ones to be invalidated on next invoke. Both passport's & dapp's - all data is to be refetched after chain change\n\n setStatus('idle')\n setIsLoading(false)\n },\n\n onError: (error, selectedChainId) => {\n console.error('[CHAIN_SYNC] Failed to switch chain into ', selectedChainId, ':', error)\n\n setStatus('idle')\n setError((error as Error).message)\n setIsLoading(false)\n }\n })\n\n // calms down rapid programmatic chain changes, don't drop it into useEffect deps\n const updateChainRelaxed = useCallback(throttle(updateChain, 3000), [])\n\n useEffect(() => {\n if (!address) return\n\n if (prevChainId.current === activeChainId) return\n\n // Skip if we're in the process of reverting\n if (isReverting.current) {\n isReverting.current = false\n return\n }\n\n updateChainRelaxed(activeChainId)\n }, [address, activeChainId])\n\n return null\n}\n\n// useEffect(() => {\n// // Skip if no session or chain hasn't changed\n// // if (!session?.ownerAddress || activeChainId === prevChainId.current) {\n// // // Initialize prevChainId on first render with session\n// // if (session?.ownerAddress && prevChainId.current === null) {\n// // prevChainId.current = activeChainId\n// // }\n// // return\n// // }\n\n// // Skip if we're in the process of reverting\n// // if (isReverting.current) {\n// // isReverting.current = false\n// // prevChainId.current = activeChainId\n// // return\n// // }\n\n// const previousChainId = prevChainId.current\n// const targetChainId = activeChainId\n\n// const recalculateAddress = async () => {\n// const chainConfig = getChainConfig(targetChainId!)\n\n// // if (!chainConfig?.factoryAddress) {\n// // console.warn('[ChainAddressSync] No factory address for chain', targetChainId)\n// // // Revert to previous chain if no factory\n// // if (previousChainId !== null) {\n// // console.warn('[ChainAddressSync] Reverting to previous chain', previousChainId)\n// // isReverting.current = true\n// // setActiveChainId(previousChainId)\n// // }\n// // return\n// // }\n\n// const publicClient = createPublicClientForChain(targetChainId!)\n\n// try {\n// const newSmartAccountAddress = await predictCompatAddress(\n// session.ownerAddress,\n// chainConfig.factoryAddress,\n// SALT_ZERO,\n// { client: publicClient }\n// )\n\n// console.log('[ChainAddressSync] Address recalculated for chain', targetChainId, ':', newSmartAccountAddress)\n\n// // Success - update prevChainId and store\n// prevChainId.current = targetChainId\n\n// // Update address in store\n// setAddress(newSmartAccountAddress)\n\n// // Update session with new Smart Account address and factory\n// setSession({\n// ...session,\n// smartAccountAddress: newSmartAccountAddress,\n// address: newSmartAccountAddress,\n// factoryAddress: chainConfig.factoryAddress\n// })\n// } catch (error) {\n// console.error('[ChainAddressSync] Failed to recalculate address for chain', targetChainId, ':', error)\n\n// // Revert to previous chain on failure\n// if (previousChainId !== null) {\n// console.warn('[ChainAddressSync] Reverting to previous chain', previousChainId)\n// isReverting.current = true\n// setActiveChainId(previousChainId)\n// }\n// }\n// }\n\n// recalculateAddress()\n// }, [activeChainId, session, setAddress, setSession, setActiveChainId])\n","export { ChainSync } from './ChainSync'\n","{\n \"name\": \"@embarkai/ui-kit\",\n \"version\": \"0.1.1\",\n \"description\": \"React UI components and hooks for EmbarkAI authentication and Account Abstraction\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build:css\": \"tailwindcss -c tailwind.config.cjs -i src/styles/index.css -o src/styles/built.css --minify\",\n \"build:iframe-html\": \"node scripts/copy-iframe-html.js\",\n \"build:copy-css\": \"cp src/styles/built.css dist/styles.css\",\n \"build\": \"pnpm build:css && tsup && pnpm build:iframe-html && pnpm build:copy-css\",\n \"dev\": \"pnpm build:css && tsup --watch\",\n \"dev:iframe\": \"vite --config iframe/vite.config.ts\",\n \"csv\": \"npx tsx src/i18n/utils/prepareCsvProofread.ts --origin en --target zh\",\n \"locale\": \"npx tsx src/i18n/utils/makeLocaleFromCsv.ts\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./dist/styles.css\": \"./dist/styles.css\"\n },\n \"peerDependencies\": {\n \"@tanstack/react-query\": \">=5.0.0\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"tailwind-merge\": \">=2.2.0\",\n \"i18next\": \"^25.8.0\",\n \"react-i18next\": \"^16.5.3\"\n },\n \"dependencies\": {\n \"@radix-ui/react-slot\": \">=1.2.4\",\n \"@radix-ui/react-checkbox\": \">=1.3.3\",\n \"@radix-ui/react-select\": \">=2.2.6\",\n \"@radix-ui/react-dialog\": \">=1.1.15\",\n \"@embarkai/core\": \"workspace:*\",\n \"@rainbow-me/rainbowkit\": \"^2.2.10\",\n \"@sentry/browser\": \"^10.22.0\",\n \"class-variance-authority\": \"^0.7.0\",\n \"lodash-es\": \"^4.17.21\",\n \"clsx\": \"^2.1.1\",\n \"dkls23-wasm\": \"^0.1.0\",\n \"lucide-react\": \"^0.454.0\",\n \"qrcode\": \"^1.5.0\",\n \"zustand\": \"^5.0.8\",\n \"viem\": \"^2.38.0\",\n \"wagmi\": \"^2.17.5\",\n \"dayjs\": \"^1.11.9\",\n \"framer-motion\": \"^12.23.24\"\n },\n \"devDependencies\": {\n \"@tailwindcss/typography\": \"^0.5.16\",\n \"@tanstack/react-query\": \"^5.90.2\",\n \"@types/qrcode\": \"^1.5.0\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"autoprefixer\": \"^10.4.20\",\n \"dotenv\": \"^17.2.3\",\n \"postcss\": \"^8.4.47\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"tailwind-merge\": \"^2.2.0\",\n \"@types/lodash-es\": \"^4.17.12\",\n \"tailwindcss\": \"^3.4.10\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.4.5\",\n \"vite\": \"^5.0.0\",\n \"i18next\": \"^25.8.0\",\n \"react-i18next\": \"^16.5.3\",\n \"csvtojson\": \"^2.0.14\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lumiachain/lumia-passport-sdk\",\n \"directory\": \"packages/ui-kit\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import React from 'react';\n\ninterface ArbitrumIconProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport function ArbitrumIcon({ width = 28, height = 28, className }: ArbitrumIconProps) {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 28 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"14\" cy=\"14\" r=\"14\" fill=\"#2D374B\" />\n <path\n d=\"M14.5 7L9 17.5L14 15L14.5 7Z\"\n fill=\"#28A0F0\"\n />\n <path\n d=\"M14.5 7L20 17.5L14 15L14.5 7Z\"\n fill=\"white\"\n />\n <path\n d=\"M9 17.5L14 21L14 15L9 17.5Z\"\n fill=\"#28A0F0\"\n />\n <path\n d=\"M20 17.5L14 21L14 15L20 17.5Z\"\n fill=\"white\"\n />\n </svg>\n );\n}\n","import React from 'react';\n\ninterface BaseIconProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport function BaseIcon({ width = 28, height = 28, className }: BaseIconProps) {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 28 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"14\" cy=\"14\" r=\"14\" fill=\"#0052FF\" />\n <path\n d=\"M14 22C18.4183 22 22 18.4183 22 14C22 9.58172 18.4183 6 14 6C9.85786 6 6.45133 9.12231 6.03711 13.1429H17.1429V14.8571H6.03711C6.45133 18.8777 9.85786 22 14 22Z\"\n fill=\"white\"\n />\n </svg>\n );\n}\n","import React from 'react';\n\ninterface BnbIconProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport function BnbIcon({ width = 28, height = 28, className }: BnbIconProps) {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 28 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"14\" cy=\"14\" r=\"14\" fill=\"#F3BA2F\" />\n <path\n d=\"M14 6L11.09 8.91L14 11.82L16.91 8.91L14 6Z\"\n fill=\"white\"\n />\n <path\n d=\"M8.18 11.82L5.27 14.73L8.18 17.64L11.09 14.73L8.18 11.82Z\"\n fill=\"white\"\n />\n <path\n d=\"M14 14.73L11.09 17.64L14 20.55L16.91 17.64L14 14.73Z\"\n fill=\"white\"\n />\n <path\n d=\"M19.82 11.82L16.91 14.73L19.82 17.64L22.73 14.73L19.82 11.82Z\"\n fill=\"white\"\n />\n <path\n d=\"M14 11.82L11.09 14.73L14 17.64L16.91 14.73L14 11.82Z\"\n fill=\"white\"\n />\n </svg>\n );\n}\n","import React from 'react';\n\ninterface EthereumIconProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport function EthereumIcon({ width = 28, height = 28, className }: EthereumIconProps) {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 28 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"14\" cy=\"14\" r=\"14\" fill=\"#627EEA\" />\n <path\n d=\"M14 4L13.85 4.51V17.68L14 17.83L19.5 14.66L14 4Z\"\n fill=\"white\"\n fillOpacity=\"0.6\"\n />\n <path\n d=\"M14 4L8.5 14.66L14 17.83V11.39V4Z\"\n fill=\"white\"\n />\n <path\n d=\"M14 19.21L13.92 19.31V23.43L14 23.66L19.5 16.04L14 19.21Z\"\n fill=\"white\"\n fillOpacity=\"0.6\"\n />\n <path\n d=\"M14 23.66V19.21L8.5 16.04L14 23.66Z\"\n fill=\"white\"\n />\n <path\n d=\"M14 17.83L19.5 14.66L14 11.39V17.83Z\"\n fill=\"white\"\n fillOpacity=\"0.2\"\n />\n <path\n d=\"M8.5 14.66L14 17.83V11.39L8.5 14.66Z\"\n fill=\"white\"\n fillOpacity=\"0.6\"\n />\n </svg>\n );\n}\n","import React, { type SVGAttributes } from 'react'\n\nfunction LumiaIcon(props: SVGAttributes<SVGElement>): React.JSX.Element {\n const { width = '24', height = '24', ...svgProps } = props\n\n return (\n <svg\n {...svgProps}\n width={width}\n height={height}\n viewBox=\"0 0 72 72\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ flexShrink: 0 }}\n >\n <rect width=\"72\" height=\"72\" rx=\"36\" fill=\"var(--l-pass-fg)\" />\n <path\n d=\"M25.3636 35.359H6.77698L26.3313 26.2792L35.3827 6.78174L35.404 25.3043C35.4112 30.8547 30.9139 35.3661 25.3565 35.3661L25.3636 35.359Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M47.4365 35.359H66.0231L46.4687 26.2792L37.4174 6.78174L37.396 25.3043C37.3889 30.8547 41.8861 35.3661 47.4436 35.3661L47.4365 35.359Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M47.4365 37.4226H66.0231L46.4687 46.5025L37.4174 65.9999L37.396 47.4773C37.3889 41.927 41.8861 37.4155 47.4436 37.4155L47.4365 37.4226Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M25.3636 37.4226H6.77698L26.3313 46.5025L35.3827 65.9999L35.404 47.4773C35.4112 41.927 30.9139 37.4155 25.3565 37.4155L25.3636 37.4226Z\"\n fill=\"var(--l-pass-bg)\"\n />\n </svg>\n )\n}\n\nexport { LumiaIcon }\n","import { ArbitrumIcon } from '@/assets/networks/ArbitrumIcon'\nimport { BaseIcon } from '@/assets/networks/BaseIcon'\nimport { BnbIcon } from '@/assets/networks/BnbIcon'\nimport { EthereumIcon } from '@/assets/networks/EthereumIcon'\nimport { LumiaIcon } from '@/assets/networks/LumiaIcon'\n//\nimport {\n ARBITRUM_SEPOLIA_CHAIN_ID,\n BASE_SEPOLIA_CHAIN_ID,\n BSC_TESTNET_CHAIN_ID,\n LUMIA_MAINNET_CHAIN_ID,\n LUMIA_TESTNET_CHAIN_ID,\n SEPOLIA_CHAIN_ID\n} from '@embarkai/core/read'\n//\nimport type { FC } from 'react'\n\ninterface NetworkOption {\n chainId: number\n name: string\n badge: string\n isActive: boolean\n Icon: FC<{ className?: string }>\n}\n\nexport const NETWORK_OPTIONS: NetworkOption[] = [\n {\n chainId: LUMIA_TESTNET_CHAIN_ID,\n name: 'Lumia Beam',\n badge: 'TESTNET',\n Icon: LumiaIcon,\n isActive: true\n },\n {\n chainId: LUMIA_MAINNET_CHAIN_ID,\n name: 'Lumia Prism',\n badge: 'MAINNET',\n Icon: LumiaIcon,\n isActive: true\n },\n {\n chainId: SEPOLIA_CHAIN_ID,\n name: 'Sepolia',\n badge: 'TESTNET',\n Icon: EthereumIcon,\n isActive: true\n },\n {\n chainId: BSC_TESTNET_CHAIN_ID,\n name: 'BSC Testnet',\n badge: 'TESTNET',\n Icon: BnbIcon,\n isActive: true\n },\n {\n chainId: ARBITRUM_SEPOLIA_CHAIN_ID,\n name: 'Arbitrum Sepolia',\n badge: 'TESTNET',\n Icon: ArbitrumIcon,\n isActive: true\n },\n {\n chainId: BASE_SEPOLIA_CHAIN_ID,\n name: 'Base Sepolia',\n badge: 'TESTNET',\n Icon: BaseIcon,\n isActive: true\n }\n]\n","{\n \"common\": {\n \"create\": \"Create\",\n \"add\": \"Add\",\n \"added\": \"Added\",\n \"edit\": \"Edit\",\n \"confirm\": \"Confirm\",\n \"save\": \"Save\",\n \"saved\": \"Saved\",\n \"delete\": \"Delete\",\n \"download\": \"Download\",\n \"cancel\": \"Cancel\",\n \"close\": \"Close\",\n \"copy\": \"Copy\",\n \"back\": \"Back\",\n \"language\": \"Language\",\n \"account\": \"Account\",\n \"asset\": \"Asset\",\n \"amount\": \"Amount\",\n \"balance\": \"Balance\",\n \"continue\": \"Continue\",\n \"network\": \"Network\",\n \"fingerprint\": \"Fingerprint\",\n \"from\": \"From\",\n \"to\": \"To\",\n \"hide\": \"Hide\",\n \"show\": \"Show\",\n \"received\": \"Received\",\n \"sent\": \"Sent\",\n \"created\": \"Created\",\n \"settings\": \"Settings\",\n \"password\": \"Password\",\n \"passkey\": \"Passkey\",\n \"standard\": \"Standard\",\n \"advanced\": \"Advanced\"\n },\n\n \"auth\": {\n \"signin\": \"Sign In\",\n \"logout\": \"Log Out\",\n \"backToSignIn\": \"Back to SignIn\",\n \"orSeparator\": \"Or sign in using\",\n\n \"email\": {\n \"placeholder\": \"Enter your email\"\n },\n\n \"verification\": {\n \"title\": \"Verification code\",\n \"sentTo\": \"We sent a verification code to:\",\n \"codeExpires\": \"Code expires in {{time}}\",\n \"didntReceive\": \"Didn't receive code?\",\n \"resend\": \"Resend\"\n },\n\n \"social\": {\n \"comingSoonMessage\": \"{{provider}} authentication is coming soon!\"\n },\n\n \"wallet\": {\n \"label\": \"Wallet\"\n },\n\n \"passkey\": {\n \"label\": \"Passkey\",\n \"title\": \"Passkey\",\n \"signInExisting\": \"Sign in with existing Passkey\",\n \"dontHave\": \"Don't have a passkey?\",\n \"create\": \"Create Passkey\"\n },\n\n \"terms\": {\n \"text\": \"By signing in, you agree to the\",\n \"action\": \"Terms of Service\"\n }\n },\n\n \"main\": {\n \"send\": \"Send\",\n \"receive\": \"Receive\",\n \"buy\": \"Buy\",\n \"assets\": \"Portfolio\"\n },\n\n \"sendMenu\": {\n \"title\": \"Send\",\n \"selectAsset\": \"Select Asset\",\n \"confirmStep\": \"Confirm Sending\",\n \"sendNft\": \"Send NFT\",\n \"recipient\": \"Recipient\",\n \"pendingStep\": \"Send in Progress\",\n \"pendingStepMsg\": \"Please wait while we process your transaction\"\n },\n\n \"receiveMenu\": {\n \"title\": \"Receive Asset\",\n \"copyAddress\": \"Copy Address\",\n \"warning\": \"Ensure sender is on the same network\",\n \"share\": \"Share this address to receive tokens\"\n },\n\n \"buyMenu\": {\n \"title\": \"Buy Crypto\",\n \"provider\": \"Onramp Provider\",\n \"selectProvider\": \"Select Onramp Service\",\n \"selectCrypto\": \"Select Crypto to Purchase\",\n \"selectFiat\": \"Select Fiat to Use\",\n \"selectPaymentMode\": \"Select Payment Mode\",\n \"enterAmount\": \"Enter Amount\"\n },\n\n \"portfolioMenu\": {\n \"title\": \"Your Assets\",\n \"noAssets\": \"No assets found\"\n },\n\n \"transactionsMenu\": {\n \"title\": \"Transactions History\",\n \"noTransactions\": \"No transactions found\",\n \"internalTransactions\": \"Internal Transactions\",\n \"comingSoon\": \"Transaction history for this network is coming soon\"\n },\n\n \"kycMenu\": {\n \"title\": \"KYC\"\n },\n\n \"nicknameMenu\": {\n \"title\": \"Nickname\",\n \"yourNickname\": \"Your Nickname\",\n \"cooldownMessage\": \"You can change your nickname again on {{canChangeAt}} ({{days}} days remained)\",\n \"lastChanged\": \"Last changed\",\n \"timesChanged\": \"Times changed\",\n \"placeholder\": \"Enter new nickname\",\n \"hint\": \"3-20 characters, letters, numbers, and underscores only\",\n\n \"errors\": {\n \"tooShort\": \"Nickname must be at least 3 characters\",\n \"tooLong\": \"Nickname must be at most 20 characters\",\n \"invalidChars\": \"Nickname can only contain lowercase letters, numbers, and underscores\",\n \"invalidUnderscore\": \"Nickname cannot start/end with underscore or contain double underscores\",\n\n \"invalidFormat\": \"Nickname can only contain letters, numbers, and underscores\",\n \"nicknameTaken\": \"This nickname is already taken\",\n \"nicknameReserved\": \"This nickname is reserved\",\n \"cooldownActive\": \"You can change your nickname again in {days} days\",\n \"nicknameNotFound\": \"No user found with this nickname\",\n\n \"unknown\": \"An error occurred\"\n },\n\n \"availability\": {\n \"alreadyYourNickname\": \"This is already your nickname\",\n \"checkingAvailability\": \"Checking availability...\",\n \"nicknameAvailable\": \"Nickname is available\",\n \"nicknameNotAvailable\": \"This nickname is not available\"\n }\n },\n\n \"profilesMenu\": {\n \"title\": \"Profiles\",\n\n \"email\": {\n \"placeholder\": \"Provide Email to connect\",\n \"sentTo\": \"We sent a verification code to\",\n \"warningTitle\": \"Connect Email\",\n \"warningMsg\": \"Connect your email for easier account recovery and additional security.\"\n },\n\n \"passkey\": {\n \"message\": \"Link a passkey to your account using WebAuth. Your device may let you choose an existing passkey\",\n \"message2\": \"Otherwise a new one will be created\",\n \"linking\": \"Linking Passkey...\",\n \"createOnDevice\": \"Create on Passkey This Device\",\n \"createOnSecurityKey\": \"Add Passkey Profile\"\n },\n\n \"unlinkTitle\": \"This action cannot be undone\",\n \"unlinkConfirm\": \"Type the provider ID to confirm removal\",\n \"unlinkPlaceholder\": \"Type provider ID\"\n },\n\n \"securityMenu\": {\n \"title\": \"Security\",\n\n \"trustedApps\": {\n \"trustedApp\": \"Trusted Application\",\n \"trustedApps\": \"Trusted Applications\",\n \"noTrustedApps\": \"No Trusted Applications found\",\n \"removalNoteTitle\": \"After removing this application:\",\n \"removalNoteMsg1\": \"All transactions will require confirmation\",\n \"removalNoteMsg2\": \"You can re-add it anytime by checking \\\"Trust this app\\\"\"\n },\n\n \"keyshareStatus\": {\n \"title\": \"Keyshare Status\",\n \"serverReady\": \"Your Server Security Key Share is safe and ready\",\n \"serverMissing\": \"Server Security Key Share is missing\",\n \"localReady\": \"Your Private Local Security Key Share is safe and ready\",\n \"localMissing\": \"Private Local Security Key Share is missing\",\n \"valutBackupCreated\": \"Security Key Share Vault Backup exists and ready\",\n \"valutBackupMissing\": \"Security Key Share Vault Backup Missing. Create one to ensure your data is safe.\"\n },\n\n \"lastBackup\": \"Last Keyshare Vault Backup\",\n \"lastBackupMeta\": \"{{browser}} browser at {{deviceName}} device under {{os}} OS\"\n },\n\n \"backupMenu\": {\n \"title\": \"Account Backup\",\n\n \"passwordMsg\": \"Secure your account by strong PASSWORD\",\n \"passkeyMsg\": \"Use Passkey to\",\n \"passkeyCompleteMsg\": \"complete account security setup\",\n \"passkeyAccessMsg\": \"get access to your account\",\n\n \"passkeyMemo0\": \"If you don't have any Passkeys created yet, create a Passkey on this device\",\n \"passkeyMemo1\": \"Your Backup must be encrypted with a password or a passkey, so only you can decrypt it no matter where backup is stored.\",\n \"passkeyMemo2\": \"Passkeys are a password-free alternative.\",\n \"passkeyLearnMore\": \"Learn more about Google Passkeys\",\n\n \"vaultRecoveryStatus\": \"Private Security Key Share backup exists & encrypted by\",\n \"vaultCreate\": \"Create {{backupType}} Vault Backup\",\n \"vaultRestore\": \"Restore from Vault\",\n\n \"file\": \"Backup File\",\n \"fileCreate\": \"Download Backup File encoded by\",\n \"fileRestore\": \"Restore with File\",\n\n \"cloud\": \"Cloud\"\n },\n\n \"restoreMenu\": {\n \"title\": \"Account Recovery\",\n \"check\": \"Checking for backups...\",\n \"noBackups\": \"No Backup Found\",\n \"noBackupsMsg1\": \"This device doesn't have access to your wallet keyshare, and no backup was found.\",\n \"noBackupsMsg2\": \"If you're using a different device, please return to the one where you created your account to create a backup, then restore access on this device.\",\n \"uploadBackupFile\": \"Upload a backup file if you have one\",\n \"restoreWithBackupFile\": \"Decrypt {{fileName}} by {{decryptionMethod}}\",\n \"tryAnotherAccount\": \"Try Another Account\"\n },\n\n \"chainMenu\": {\n \"title\": \"Chain\",\n\n \"chainSwitchRequest\": {\n \"title\": \"Switch Chain?\",\n \"description\": \"Current application is configured to use chain <b>{{preferredChain}}</b> instead of your current chain <b>{{currentChain}}</b>. <br /> Do you want to switch to the preferred chain?\",\n \"confirmButton\": \"Switch to {{chain}}\",\n \"cancelButton\": \"Keep Current Chain\"\n }\n }\n}\n","{\n \"common\": {\n \"create\": \"Создать\",\n \"add\": \"Добавить\",\n \"added\": \"Добавлено\",\n \"edit\": \"Редактировать\",\n \"confirm\": \"Подтвердить\",\n \"save\": \"Сохранить\",\n \"saved\": \"Сохранено\",\n \"delete\": \"Удалить\",\n \"download\": \"Скачать\",\n \"cancel\": \"Отмена\",\n \"close\": \"Закрыть\",\n \"copy\": \"Копировать\",\n \"back\": \"Назад\",\n \"language\": \"Язык\",\n \"account\": \"Аккаунт\",\n \"asset\": \"Актив\",\n \"amount\": \"Количество\",\n \"balance\": \"Баланс\",\n \"continue\": \"Продолжить\",\n \"network\": \"Сеть\",\n \"fingerprint\": \"Отпечаток\",\n \"from\": \"От\",\n \"to\": \"Кому\",\n \"hide\": \"Скрыть\",\n \"show\": \"Показать\",\n \"received\": \"Получено\",\n \"sent\": \"Отправлено\",\n \"created\": \"Создано\",\n \"settings\": \"Настройки\",\n \"password\": \"Пароль\",\n \"passkey\": \"Passkey\",\n \"standard\": \"Стандартный\",\n \"advanced\": \"Расширенный\"\n },\n\n \"auth\": {\n \"signin\": \"Войти\",\n \"logout\": \"Выйти\",\n \"backToSignIn\": \"Назад к входу\",\n \"orSeparator\": \"Или войдите используя\",\n\n \"email\": {\n \"placeholder\": \"Введите ваш email\"\n },\n\n \"verification\": {\n \"title\": \"Код подтверждения\",\n \"sentTo\": \"Мы отправили код подтверждения на:\",\n \"codeExpires\": \"Код истекает через {{time}}\",\n \"didntReceive\": \"Не получили код?\",\n \"resend\": \"Отправить повторно\"\n },\n\n \"social\": {\n \"comingSoonMessage\": \"Аутентификация через {{provider}} скоро появится!\"\n },\n\n \"wallet\": {\n \"label\": \"Кошелёк\"\n },\n\n \"passkey\": {\n \"label\": \"Passkey\",\n \"title\": \"Passkey\",\n \"signInExisting\": \"Войти с существующим Passkey\",\n \"dontHave\": \"Нет Passkey?\",\n \"create\": \"Создать Passkey\"\n },\n\n \"terms\": {\n \"text\": \"Входя в систему, вы соглашаетесь с\",\n \"action\": \"Условиями\"\n }\n },\n\n \"main\": {\n \"send\": \"Отправить\",\n \"receive\": \"Получить\",\n \"buy\": \"Купить\",\n \"assets\": \"Портфолио\"\n },\n\n \"sendMenu\": {\n \"title\": \"Отправить\",\n \"selectAsset\": \"Выберите актив\",\n \"confirmStep\": \"Подтвердите отправку\",\n \"sendNft\": \"Отправить NFT\",\n \"recipient\": \"Получатель\",\n \"pendingStep\": \"Отправка в процессе\",\n \"pendingStepMsg\": \"Пожалуйста, подождите, пока мы обрабатываем вашу транзакцию\"\n },\n\n \"receiveMenu\": {\n \"title\": \"Получить актив\",\n \"copyAddress\": \"Копировать адрес\",\n \"warning\": \"Убедитесь, что отправитель находится в той же сети\",\n \"share\": \"Поделитесь этим адресом, чтобы получить токены\"\n },\n\n \"buyMenu\": {\n \"title\": \"Купить криптовалюту\",\n \"provider\": \"Onramp-сервис\",\n \"selectProvider\": \"Выберите Onramp-сервис\",\n \"selectCrypto\": \"Выберите криптовалюту для покупки\",\n \"selectFiat\": \"Выберите фиат для оплаты\",\n \"selectPaymentMode\": \"Выберите способ оплаты\",\n \"enterAmount\": \"Введите сумму\"\n },\n\n \"portfolioMenu\": {\n \"title\": \"Ваши активы\",\n \"noAssets\": \"Активы не найдены\"\n },\n\n \"transactionsMenu\": {\n \"title\": \"История транзакций\",\n \"noTransactions\": \"Транзакции не найдены\",\n \"internalTransactions\": \"Внутренние Транзакции\",\n \"comingSoon\": \"История транзакций для этой сети скоро будет доступна\"\n },\n\n \"kycMenu\": {\n \"title\": \"KYC\"\n },\n\n \"nicknameMenu\": {\n \"title\": \"Никнейм\",\n \"yourNickname\": \"Ваш никнейм\",\n \"cooldownMessage\": \"Вы сможете изменить никнейм снова через {{days}} дней ({{canChangeAt}})\",\n \"lastChanged\": \"Изменено\",\n \"timesChanged\": \"Изменено раз\",\n \"placeholder\": \"Введите новый никнейм\",\n \"hint\": \"3-20 символов, только буквы, цифры и подчёркивания\",\n\n \"errors\": {\n \"tooShort\": \"Никнейм должен содержать минимум 3 символа\",\n \"tooLong\": \"Никнейм должен содержать максимум 20 символов\",\n \"invalidChars\": \"Никнейм может содержать только строчные буквы, цифры и подчёркивания\",\n \"invalidUnderscore\": \"Никнейм не может начинаться/заканчиваться подчёркиванием или содержать двойные подчёркивания\",\n\n \"invalidFormat\": \"Никнейм может содержать только буквы, цифры и подчёркивания\",\n \"nicknameTaken\": \"Этот никнейм уже занят\",\n \"nicknameReserved\": \"Этот никнейм зарезервирован\",\n \"cooldownActive\": \"Вы сможете изменить никнейм через {days} дней\",\n \"nicknameNotFound\": \"Пользователь с таким никнеймом не найден\",\n\n \"unknown\": \"Произошла ошибка\"\n },\n\n \"availability\": {\n \"alreadyYourNickname\": \"Это уже ваш никнейм\",\n \"checkingAvailability\": \"Проверка доступности...\",\n \"nicknameAvailable\": \"Никнейм доступен\",\n \"nicknameNotAvailable\": \"Этот никнейм недоступен\"\n }\n },\n\n \"profilesMenu\": {\n \"title\": \"Профили\",\n\n \"email\": {\n \"placeholder\": \"Введите ваш email\",\n \"sentTo\": \"Мы отправили код подтверждения на\",\n \"warningTitle\": \"Привяжите email\",\n \"warningMsg\": \"Привяжите ваш email для упрощенного восстановления аккаунта и дополнительной безопасности.\"\n },\n\n \"passkey\": {\n \"message\": \"Привяжите Passkey к вашей учетной записи через WebAuth. Ваше устройство может позволить вам выбрать существующий Passkey\",\n \"message2\": \"В противном случае будет создан новый\",\n \"linking\": \"Привязка Passkey...\",\n \"createOnDevice\": \"Создать Passkey на этом устройстве\",\n \"createOnSecurityKey\": \"Добавить Passkey профиль\"\n },\n\n \"unlinkTitle\": \"Это действие нельзя отменить\",\n \"unlinkConfirm\": \"Введите ID провайдера для подтверждения удаления\",\n \"unlinkPlaceholder\": \"Введите ID провайдера\"\n },\n\n \"securityMenu\": {\n \"title\": \"Безопасность\",\n\n \"trustedApps\": {\n \"trustedApp\": \"Доверенное приложение\",\n \"trustedApps\": \"Доверенные приложения\",\n \"noTrustedApps\": \"Доверенные приложения не найдены\",\n \"removalNoteTitle\": \"После удаления этого приложения\",\n \"removalNoteMsg1\": \"Все транзакции потребуют подтверждения\",\n \"removalNoteMsg2\": \"Вы можете добавить его снова в любое время, отметив «Доверять этому приложению»\"\n },\n\n \"keyshareStatus\": {\n \"title\": \"Статус Keyshare\",\n \"serverReady\": \"Серверная часть ключа безопасности готова к использованию\",\n \"serverMissing\": \"Серверная часть ключа безопасности отсутствует\",\n \"localReady\": \"Ваша приватная часть ключа безопасности готова к использованию\",\n \"localMissing\": \"Ваша приватная часть ключа безопасности отсутствует\",\n \"valutBackupCreated\": \"Резервная копия вашей приватной части ключа безопасности создана и готова к использованию\",\n \"valutBackupMissing\": \"Резервная копия вашей приватной части ключа безопасности отсутствует. Создайте её для обеспечения безопасности ваших данных.\"\n },\n\n \"lastBackup\": \"Последнее резервное копирование вашей приватной локальной части\",\n \"lastBackupMeta\": \"Браузер {{browser}} на устройстве {{deviceName}} под управлением ОС {{os}}\"\n },\n\n \"backupMenu\": {\n \"title\": \"Бекап Аккаунта\",\n\n \"passwordMsg\": \"Защитите ваш аккаунт надежным ПАРОЛЕМ\",\n \"passkeyMsg\": \"Используйте Passkey для\",\n \"passkeyCompleteMsg\": \"завершения настройки безопасности аккаунта\",\n \"passkeyAccessMsg\": \"получения доступа к вашему аккаунту\",\n\n \"passkeyMemo0\": \"Если у вас еще нет созданных Passkey, создайте Passkey на этом устройстве\",\n \"passkeyMemo1\": \"Ваша резервная копия должна быть зашифрована паролем или passkey, чтобы только вы могли ее расшифровать, независимо от того, где она хранится.\",\n \"passkeyMemo2\": \"Passkey - это альтернатива без пароля.\",\n \"passkeyLearnMore\": \"Узнайте больше о Google Passkeys\",\n\n \"vaultRecoveryStatus\": \"Резервная копия вашей приватной части ключа безопасности существует и кодирована с помощью\",\n \"vaultCreate\": \"Создать Бекап ({{backupType}})\",\n \"vaultRestore\": \"Восстановить Бекап\",\n\n \"file\": \"Бекап-файл\",\n \"fileCreate\": \"Создать Бекап-файл, зашифрованный через\",\n \"fileRestore\": \"Восстановить с помощью Бекап-файла\",\n\n \"cloud\": \"Облако\"\n },\n\n \"restoreMenu\": {\n \"title\": \"Восстановление Аккаунта\",\n \"check\": \"Поиск бекапа...\",\n \"noBackups\": \"Бекап Не Найден\",\n \"noBackupsMsg1\": \"У этого устройства нет доступа к вашему ключу кошелька, и Бекап не был найден.\",\n \"noBackupsMsg2\": \"Если вы используете другое устройство, пожалуйста, вернитесь к тому, на котором вы создали аккаунт, создайте Бекап аккаунта, а затем восстановите доступ на этом устройстве.\",\n \"uploadBackupFile\": \"Загрузите файл резервной копии, если он у вас есть\",\n \"restoreWithBackupFile\": \"Расшифровать {{fileName}} используя {{decryptionMethod}}\",\n \"tryAnotherAccount\": \"Попробовать Другой Аккаунт\"\n },\n\n \"chainMenu\": {\n \"title\": \"Сеть\",\n\n \"chainSwitchRequest\": {\n \"title\": \"Переключить сеть?\",\n \"description\": \"Текущее приложение настроено на использование сети <b>{{preferredChain}}</b> вместо вашей текущей сети <b>{{currentChain}}</b>. <br /> Хотите переключиться на предпочитаемую сеть?\",\n \"confirmButton\": \"Переключиться на {{chain}}\",\n \"cancelButton\": \"Оставить текущую сеть\"\n }\n }\n}\n","{\n \"common\": {\n \"create\": \"创建\",\n \"add\": \"添加\",\n \"added\": \"已添加\",\n \"edit\": \"编辑\",\n \"confirm\": \"确认\",\n \"save\": \"保存\",\n \"saved\": \"已保存\",\n \"delete\": \"删除\",\n \"download\": \"下载\",\n \"cancel\": \"取消\",\n \"close\": \"关闭\",\n \"copy\": \"复制\",\n \"back\": \"返回\",\n \"language\": \"语言\",\n \"account\": \"账户\",\n \"asset\": \"资产\",\n \"amount\": \"金额\",\n \"balance\": \"余额\",\n \"continue\": \"继续\",\n \"network\": \"网络\",\n \"fingerprint\": \"指纹\",\n \"from\": \"从\",\n \"to\": \"到\",\n \"hide\": \"隐藏\",\n \"show\": \"显示\",\n \"received\": \"已收到\",\n \"sent\": \"已发送\",\n \"created\": \"已创建\",\n \"settings\": \"设置\",\n \"password\": \"密码\",\n \"passkey\": \"通行密钥\",\n \"standard\": \"标准\",\n \"advanced\": \"高级\"\n },\n\n \"auth\": {\n \"signin\": \"登录\",\n \"logout\": \"登出\",\n \"backToSignIn\": \"返回登录\",\n \"orSeparator\": \"或使用以下方式登录\",\n\n \"email\": {\n \"placeholder\": \"请输入您的邮箱\"\n },\n\n \"verification\": {\n \"title\": \"验证码\",\n \"sentTo\": \"我们已发送验证码至:\",\n \"codeExpires\": \"验证码将在 {{time}} 后过期\",\n \"didntReceive\": \"没有收到验证码?\",\n \"resend\": \"重新发送\"\n },\n\n \"social\": {\n \"comingSoonMessage\": \"{{provider}} 认证即将推出!\"\n },\n\n \"wallet\": {\n \"label\": \"钱包\"\n },\n\n \"passkey\": {\n \"label\": \"通行密钥\",\n \"title\": \"通行密钥\",\n \"signInExisting\": \"使用现有通行密钥登录\",\n \"dontHave\": \"还没有通行密钥?\",\n \"create\": \"创建通行密钥\"\n },\n\n \"terms\": {\n \"text\": \"登录即表示您同意\",\n \"action\": \"服务条款\"\n }\n },\n\n \"main\": {\n \"send\": \"发送\",\n \"receive\": \"接收\",\n \"buy\": \"购买\",\n \"assets\": \"资产组合\"\n },\n\n \"sendMenu\": {\n \"title\": \"发送\",\n \"selectAsset\": \"选择资产\",\n \"confirmStep\": \"确认发送\",\n \"sendNft\": \"发送 NFT\",\n \"recipient\": \"接收方\",\n \"pendingStep\": \"发送进行中\",\n \"pendingStepMsg\": \"请稍候,我们正在处理您的交易\"\n },\n\n \"receiveMenu\": {\n \"title\": \"接收资产\",\n \"copyAddress\": \"复制地址\",\n \"warning\": \"确保发送方在同一网络上\",\n \"share\": \"分享此地址以接收代币\"\n },\n\n \"buyMenu\": {\n \"title\": \"购买加密货币\",\n \"provider\": \"Onramp 提供商\",\n \"selectProvider\": \"选择 Onramp 服务\",\n \"selectCrypto\": \"选择购买的加密货币\",\n \"selectFiat\": \"选择使用的法币\",\n \"selectPaymentMode\": \"选择支付方式\",\n \"enterAmount\": \"输入金额\"\n },\n\n \"portfolioMenu\": {\n \"title\": \"您的资产\",\n \"noAssets\": \"未找到资产\"\n },\n\n \"transactionsMenu\": {\n \"title\": \"交易历史\",\n \"noTransactions\": \"未找到交易记录\",\n \"internalTransactions\": \"内部交易\",\n \"comingSoon\": \"该网络的交易历史即将推出\"\n },\n\n \"kycMenu\": {\n \"title\": \"身份认证\"\n },\n\n \"nicknameMenu\": {\n \"title\": \"昵称\",\n \"yourNickname\": \"您的昵称\",\n \"cooldownMessage\": \"您可以在 {{canChangeAt}} 再次更改昵称(还剩 {{days}} 天)\",\n \"lastChanged\": \"上次更改\",\n \"timesChanged\": \"更改次数\",\n \"placeholder\": \"输入新昵称\",\n \"hint\": \"3-20个字符,仅限字母、数字和下划线\",\n\n \"errors\": {\n \"tooShort\": \"昵称至少需要3个字符\",\n \"tooLong\": \"昵称最多20个字符\",\n \"invalidChars\": \"昵称只能包含小写字母、数字和下划线\",\n \"invalidUnderscore\": \"昵称不能以下划线开头或结尾,也不能包含连续的下划线\",\n\n \"invalidFormat\": \"昵称只能包含字母、数字和下划线\",\n \"nicknameTaken\": \"此昵称已被使用\",\n \"nicknameReserved\": \"此昵称已被保留\",\n \"cooldownActive\": \"您可以在 {days} 天后再次更改昵称\",\n \"nicknameNotFound\": \"未找到使用此昵称的用户\",\n\n \"unknown\": \"发生错误\"\n },\n\n \"availability\": {\n \"alreadyYourNickname\": \"这已经是您的昵称\",\n \"checkingAvailability\": \"正在检查可用性...\",\n \"nicknameAvailable\": \"昵称可用\",\n \"nicknameNotAvailable\": \"此昵称不可用\"\n }\n },\n\n \"profilesMenu\": {\n \"title\": \"个人资料\",\n\n \"email\": {\n \"placeholder\": \"提供邮箱以连接\",\n \"sentTo\": \"我们已发送验证码至\",\n \"warningTitle\": \"连接邮箱\",\n \"warningMsg\": \"连接您的邮箱以便更轻松地恢复账户并增强安全性。\"\n },\n\n \"passkey\": {\n \"message\": \"使用 WebAuth 将通行密钥关联到您的账户。您的设备可能允许您选择现有的通行密钥\",\n \"message2\": \"否则将创建一个新的通行密钥\",\n \"linking\": \"正在关联通行密钥...\",\n \"createOnDevice\": \"在此设备上创建通行密钥\",\n \"createOnSecurityKey\": \"添加通行密钥配置文件\"\n },\n\n \"unlinkTitle\": \"此操作无法撤销\",\n \"unlinkConfirm\": \"输入提供商ID以确认移除\",\n \"unlinkPlaceholder\": \"输入提供商ID\"\n },\n\n \"securityMenu\": {\n \"title\": \"安全\",\n\n \"trustedApps\": {\n \"trustedApp\": \"可信应用\",\n \"trustedApps\": \"可信应用\",\n \"noTrustedApps\": \"未找到可信应用\",\n \"removalNoteTitle\": \"移除此应用后:\",\n \"removalNoteMsg1\": \"所有交易都需要确认\",\n \"removalNoteMsg2\": \"您可以随时通过勾选'信任此应用'重新添加\"\n },\n\n \"keyshareStatus\": {\n \"title\": \"密钥分片状态\",\n \"serverReady\": \"您的服务器安全密钥分片已安全并准备就绪\",\n \"serverMissing\": \"服务器安全密钥分片缺失\",\n \"localReady\": \"您的私有本地安全密钥分片已安全并准备就绪\",\n \"localMissing\": \"私有本地安全密钥分片缺失\",\n \"valutBackupCreated\": \"安全密钥分片保险库备份已存在并准备就绪\",\n \"valutBackupMissing\": \"安全密钥分片保险库备份缺失。请创建一个以确保您的数据安全。\"\n },\n\n \"lastBackup\": \"最后一次密钥分片保险库备份\",\n \"lastBackupMeta\": \"{{browser}} 浏览器,{{deviceName}} 设备,{{os}} 操作系统\"\n },\n\n \"backupMenu\": {\n \"title\": \"账户备份\",\n\n \"passwordMsg\": \"使用强密码保护您的账户\",\n \"passkeyMsg\": \"使用通行密钥来\",\n \"passkeyCompleteMsg\": \"完成账户安全设置\",\n \"passkeyAccessMsg\": \"访问您的账户\",\n\n \"passkeyMemo0\": \"如果您还没有创建任何通行密钥,请在此设备上创建一个通行密钥\",\n \"passkeyMemo1\": \"您的备份必须使用密码或通行密钥加密,这样无论备份存储在何处,只有您可以解密。\",\n \"passkeyMemo2\": \"通行密钥是一种无需密码的替代方案。\",\n \"passkeyLearnMore\": \"了解更多关于 Google 通行密钥的信息\",\n\n \"vaultRecoveryStatus\": \"私有安全密钥分片备份已存在并由以下方式加密\",\n \"vaultCreate\": \"创建 {{backupType}} 保险库备份\",\n \"vaultRestore\": \"从保险库恢复\",\n\n \"file\": \"备份文件\",\n \"fileCreate\": \"下载由以下方式编码的备份文件\",\n \"fileRestore\": \"使用文件恢复\",\n\n \"cloud\": \"云端\"\n },\n\n \"restoreMenu\": {\n \"title\": \"账户恢复\",\n \"check\": \"正在检查备份...\",\n \"noBackups\": \"未找到备份\",\n \"noBackupsMsg1\": \"此设备无法访问您的钱包密钥分片,且未找到备份。\",\n \"noBackupsMsg2\": \"如果您使用的是其他设备,请返回您创建账户的设备创建备份,然后在此设备上恢复访问权限。\",\n \"uploadBackupFile\": \"如果您有备份文件,请上传\",\n \"restoreWithBackupFile\": \"通过 {{decryptionMethod}} 解密 {{fileName}}\",\n \"tryAnotherAccount\": \"尝试其他账户\"\n },\n\n \"chainMenu\": {\n \"title\": \"区块链\",\n\n \"chainSwitchRequest\": {\n \"title\": \"切换区块链?\",\n \"description\": \"当前应用程序更倾向于使用区块链 <b>{{preferredChain}}</b>,而不是您当前的区块链 <b>{{currentChain}}</b>。<br />您想切换到首选的区块链吗?\",\n \"confirmButton\": \"切换到 {{chain}}\",\n \"cancelButton\": \"保持当前区块链\"\n }\n }\n}\n","import en from './locales/en.json'\nimport ru from './locales/ru.json'\nimport zh from './locales/zh.json'\n\n/**\n * Passport translations object.\n * Note: For use in combineI18NResources, translations are imported directly\n * in utils.ts to avoid esbuild lazy initialization issues.\n */\nexport const PASSPORT_TRANSLATIONS = {\n en: { passport: en },\n zh: { passport: zh },\n ru: { passport: ru }\n}\n\nexport const PASSPORT_NAMESPACE = 'passport'\n\nexport const LOCAL_STORAGE_I18N_KEY = 'lumia-passport-language'\n","export const LANGUAGES = {\n // en: { flags: '🇺🇸 🇬🇧 🇦🇺', name: 'English' },\n en: { flags: '🇺🇸', name: 'English' },\n // es: { flags: '🇪🇸 🇲🇽 🇦🇷', name: 'Español' },\n es: { flags: '🇪🇸', name: 'Español' },\n fr: { flags: '🇫🇷 🇨🇦 🇧🇪', name: 'Français' },\n ar: { flags: '🇸🇦 🇪🇬 🇦🇪', name: 'العربية' },\n pt: { flags: '🇵🇹 🇧🇷', name: 'Português' },\n de: { flags: '🇩🇪 🇦🇹 🇨🇭', name: 'Deutsch' },\n // ru: { flags: '🇷🇺 🇧🇾', name: 'Русский' },\n ru: { flags: '🇷🇺', name: 'Русский' },\n // zh: { flags: '🇨🇳 🇹🇼 🇭🇰', name: '中文' },\n zh: { flags: '🇨🇳', name: '中文' },\n it: { flags: '🇮🇹', name: 'Italiano' },\n nl: { flags: '🇳🇱 🇧🇪', name: 'Nederlands' },\n ja: { flags: '🇯🇵', name: '日本語' },\n ko: { flags: '🇰🇷 🇰🇵', name: '한국어' },\n tr: { flags: '🇹🇷 🇨🇾 🇹🇲', name: 'Türkçe' },\n pl: { flags: '🇵🇱', name: 'Polski' },\n uk: { flags: '🇺🇦', name: 'Українська' },\n vi: { flags: '🇻🇳', name: 'Tiếng Việt' },\n th: { flags: '🇹🇭', name: 'ไทย' },\n sv: { flags: '🇸🇪 🇫🇮', name: 'Svenska' },\n el: { flags: '🇨🇾 🇬🇷', name: 'Ελληνικά' },\n cs: { flags: '🇨🇿', name: 'Čeština' },\n ro: { flags: '🇲🇩 🇷🇴', name: 'Română' },\n hu: { flags: '🇭🇺', name: 'Magyar' },\n fi: { flags: '🇫🇮', name: 'Suomi' },\n da: { flags: '🇩🇰', name: 'Dansk' },\n no: { flags: '🇳🇴', name: 'Norsk' },\n sk: { flags: '🇸🇰', name: 'Slovenčina' },\n bg: { flags: '🇧🇬', name: 'Български' },\n hr: { flags: '🇭🇷', name: 'Hrvatski' },\n sl: { flags: '🇸🇮', name: 'Slovenščina' },\n et: { flags: '🇪🇪', name: 'Eesti' },\n lv: { flags: '🇱🇻', name: 'Latviešu' },\n lt: { flags: '🇱🇹', name: 'Lietuvių' },\n sr: { flags: '🇲🇪 🇷🇸', name: 'Српски' },\n sq: { flags: '🇦🇱 🇽🇰', name: 'Shqip' },\n mk: { flags: '🇲🇰', name: 'Македонски' },\n bs: { flags: '🇧🇦', name: 'Bosanski' },\n is: { flags: '🇮🇸', name: 'Íslenska' },\n he: { flags: '🇮🇱', name: 'עברית' },\n fa: { flags: '🇦🇫 🇮🇷', name: 'فارسی' },\n ur: { flags: '🇵🇰', name: 'اردو' },\n hi: { flags: '🇮🇳', name: 'हिन्दी' },\n bn: { flags: '🇧🇩', name: 'বাংলা' },\n id: { flags: '🇮🇩', name: 'Bahasa Indonesia' },\n ms: { flags: '🇧🇳 🇲🇾 🇸🇬', name: 'Bahasa Melayu' },\n tl: { flags: '🇵🇭', name: 'Tagalog' },\n km: { flags: '🇰🇭', name: 'ខ្មែរ' },\n lo: { flags: '🇱🇦', name: 'ລາວ' },\n my: { flags: '🇲🇲', name: 'မြန်မာ' },\n ne: { flags: '🇳🇵', name: 'नेपाली' },\n si: { flags: '🇱🇰', name: 'සිංහල' },\n hy: { flags: '🇦🇲', name: 'Հայերեն' },\n ka: { flags: '🇬🇪', name: 'ქართული' },\n az: { flags: '🇦🇿', name: 'Azərbaycan' },\n uz: { flags: '🇺🇿', name: 'Oʻzbekcha' },\n kk: { flags: '🇰🇿', name: 'Қазақша' },\n mn: { flags: '🇲🇳', name: 'Монгол' },\n so: { flags: '🇸🇴 🇩🇯', name: 'Soomaali' },\n am: { flags: '🇪🇹 🇪🇷', name: 'አማርኛ' },\n sw: { flags: '🇰🇪 🇹🇿 🇺🇬', name: 'Kiswahili' },\n dz: { flags: '🇧🇹', name: 'རྫོང་ཁ' },\n dv: { flags: '🇲🇻', name: 'ދިވެހި' },\n ca: { flags: '🇦🇩', name: 'Català' },\n mg: { flags: '🇲🇬', name: 'Malagasy' }\n} as const\n","import { merge } from 'lodash-es'\n\nimport { LANGUAGES } from './languages'\n//\nimport en from './locales/en.json'\nimport ru from './locales/ru.json'\nimport zh from './locales/zh.json'\n\ntype TranslationResources = Record<string, Record<string, unknown>>\n\n/**\n * Combines project's translation resources with PASSPORT_TRANSLATIONS for i18n initialization\n * @param resourses - translation resources to merge with PASSPORT_TRANSLATIONS\n *\n * resource object structure (passport namespace is MANDATORY):\n *\n * ```\n * {\n * language1: {\n * passport: {...}\n * projectNamespace: {...}\n * ...\n * },\n * language2: {\n * passport: {...}\n * projectNamespace: {...}\n * ...\n * },\n * }\n * ```\n */\nexport function combineI18NResources(...resourses: TranslationResources[]): TranslationResources {\n return merge(\n {},\n {\n en: { passport: en },\n ru: { passport: ru },\n zh: { passport: zh }\n },\n ...resourses\n )\n}\n\n/**\n * Get list of available language keys from provided translation resources & LP default langset,\n * returns only languages with 'passport' namespace provided\n * */\nexport function getAvailableLanguages(resourses: TranslationResources): string[] {\n const languages: string[] = []\n\n if (!resourses || Object.keys(resourses).length === 0) return ['en'] // fallback to 'en' if no resources provided\n\n // const combinedResources = combineI18NResources(...resourses)\n\n if (typeof resourses !== 'object' || resourses === null) return ['en'] // fallback to 'en' if resources are invalid\n // adds language keys that have 'passport' namespace\n for (const languageKey in resourses) {\n if (!!resourses[languageKey]['passport']) {\n languages.push(languageKey)\n }\n }\n\n return languages\n}\n\nexport function getLanguageIcon(languageKey: string): string | null {\n return LANGUAGES[languageKey]?.flags?.split(' ')[0] || null\n}\n","import { useTranslation } from 'react-i18next'\n\nimport { PASSPORT_NAMESPACE } from './constants'\n\nexport function useT() {\n return useTranslation(PASSPORT_NAMESPACE)\n}\n","export { PASSPORT_TRANSLATIONS, PASSPORT_NAMESPACE, LOCAL_STORAGE_I18N_KEY } from './constants'\n\nexport { LANGUAGES } from './languages'\n\nexport { combineI18NResources, getAvailableLanguages, getLanguageIcon } from './utils'\n\nexport { useT } from './useT'\n","import type { ReactNode } from 'react'\nimport { create } from 'zustand'\n\nimport { MAX_CONTENT_HEIGHT } from '../constants'\n\ntype ColorMode = 'light' | 'dark'\n\ninterface LayoutState {\n colorMode: ColorMode\n\n isMobileView: boolean\n maxScrollHeight: number\n\n isDialogClosing: boolean\n isDialogOpen: boolean\n isDialogForced: boolean\n dialogTitle: string | null\n dialogDescription: string | null\n dialogContent: ReactNode\n\n isSettings: boolean\n}\n\ninterface LayoutActions {\n setColorMode: (colorMode: ColorMode) => void\n\n setIsMobileView: (isMobileView: boolean) => void\n setMaxScrollHeight: (maxScrollHeight: number) => void\n\n setIsDialogClosing: (isDialogClosing: boolean) => void\n setIsDialogOpen: (isLayoutDialogOpen: boolean) => void\n setIsDialogForced: (isLayoutDialogForced: boolean) => void\n setDialogTitle: (layoutDialogTitle: string | null) => void\n setDialogDescription: (layoutDialogDescription: string | null) => void\n setDialogContent: (layoutDialogContent: ReactNode) => void\n\n setIsSettings: (isSettings: boolean) => void\n}\n\n/** Hook providing layout state (e.g., color mode, layout view, dialog state) */\nconst useLayoutStore = create<LayoutState & LayoutActions>((set) => ({\n colorMode: 'light',\n\n isMobileView: false,\n maxScrollHeight: MAX_CONTENT_HEIGHT,\n\n isDialogClosing: false,\n isDialogOpen: false,\n isDialogForced: false,\n dialogTitle: null,\n dialogDescription: null,\n dialogContent: null,\n\n isSettings: false,\n\n setColorMode: (colorMode) => set({ colorMode }),\n // setLayoutView: (layoutView) => set(() => ({ layoutView })),\n // setDeviceType: (deviceType) => set(() => ({ deviceType })),\n\n setIsMobileView: (isMobileView) => set({ isMobileView }),\n setMaxScrollHeight: (maxScrollHeight) => set({ maxScrollHeight }),\n\n setIsDialogClosing: (isDialogClosing) => set({ isDialogClosing }),\n setIsDialogOpen: (isDialogOpen) => set({ isDialogOpen }),\n setIsDialogForced: (isDialogForced) => set({ isDialogForced }),\n setDialogTitle: (dialogTitle) => set({ dialogTitle }),\n setDialogDescription: (dialogDescription) => set({ dialogDescription }),\n setDialogContent: (dialogContent) => set({ dialogContent }),\n\n setIsSettings: (isSettings) => set({ isSettings })\n}))\n\nexport { useLayoutStore, type ColorMode }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nconst LP_JWT_TOKENS_LS_KEY = 'lumia-passport-jwt-tokens'\n\ninterface LumiaPassportSession {\n accessToken: string\n userId: string\n}\n\nexport function getAccessToken(): string | null {\n try {\n const sessionString = localStorage.getItem(LP_JWT_TOKENS_LS_KEY)\n if (!sessionString) return null\n\n const session = JSON.parse(sessionString) as LumiaPassportSession\n\n // Validate session structure\n if (session && typeof session.accessToken === 'string' && typeof session.userId === 'string') {\n return session.accessToken\n }\n\n return null\n } catch (error) {\n console.error('Failed to parse Lumia Passport session:', error)\n return null\n }\n}\n","export const AVAILABLE_CLOUD_PROVIDERS_QUERY_KEY = 'get-available-cloud-providers-query'\nexport const CHECK_BACKUP_QUERY_KEY = 'check-backup-availability-query'\n\nexport const RESTORE_MENU_MAX_HEIGHT = 480\n","import { cn } from '@/lib/utils'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { forwardRef, type ButtonHTMLAttributes } from 'react'\n\nconst buttonVariants = cva(\n cn(\n 'cursor-pointer py-0',\n 'inline-flex items-center justify-center gap-2',\n 'transition-colors duration-200',\n 'disabled:cursor-default disabled:opacity-50',\n 'whitespace-nowrap text-sm font-semibold font-sans',\n 'ring-offset-background focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0',\n '[&_svg]:shrink-0'\n ),\n {\n variants: {\n variant: {\n default: cn(\n 'border border-transparent',\n 'bg-[var(--l-pass-primary)] text-[var(--l-pass-fg-inverted)]',\n 'hover:bg-[var(--l-pass-primary-h)]',\n 'active:bg-[var(--l-pass-primary-a)]',\n 'disabled:hover:bg-[var(--l-pass-primary)] disabled:active:bg-[var(--l-pass-primary)]'\n ),\n\n outline: cn(\n 'border border-[var(--l-pass-bd)] bg-transparent text-[var(--l-pass-fg)]',\n 'hover:text-[var(--l-pass-fg-h)]',\n 'active:text-[var(--l-pass-fg-a)]',\n 'disabled:hover:text-[var(--l-pass-fg)] disabled:active:text-[var(--l-pass-fg)]'\n ),\n\n ghost: cn(\n 'border border-transparent bg-transparent text-[var(--l-pass-fg)]',\n 'hover:text-[var(--l-pass-fg-h)]',\n 'active:text-[var(--l-pass-fg-a)]',\n 'disabled:hover:text-[var(--l-pass-fg)] disabled:active:text-[var(--l-pass-fg)]'\n )\n },\n\n size: {\n small: 'h-6 px-2',\n medium: 'h-8 px-4 rounded-[var(--l-pass-el-bdrs)]',\n large: 'h-12 px-4 rounded-[var(--l-pass-el-bdrs)]',\n icon: 'h-8 w-8 p-0'\n }\n },\n\n defaultVariants: {\n variant: 'default',\n size: 'large'\n }\n }\n)\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'large', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n }\n)\n\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import PACKAGE from '@/package.json'\nimport { NETWORK_OPTIONS } from '@/src/config/networks'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { Loader, LogOut } from 'lucide-react'\n\nimport { jwtTokenManager } from '../../auth'\nimport { getExplorerUrl } from '../../clients/base'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { cn } from '../../lib/utils'\nimport { CHECK_BACKUP_QUERY_KEY } from '../KeyshareRestoreMenu/constants'\nimport { Button } from '../ui/button'\n\nexport function Footer() {\n const qc = useQueryClient()\n const { callbacks } = useLumiaPassportConfig()\n const { address, setSession, setAddress, setStatus, setError, setIsLoading } = useLumiaPassportSession()\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setIsDialogForced = useLayoutStore((st) => st.setIsDialogForced)\n\n const { mutate: disconnect, isPending: isDisconnecting } = useMutation({\n mutationFn: async (disconnectAddress: `0x${string}` | null) => {\n if (!disconnectAddress) throw new Error('No address to disconnect')\n setIsDialogForced(true) // Prevent dialog from being interactive during logout\n\n setError(null) // flush previous errors\n setStatus('disconnecting')\n setIsLoading(true)\n\n const userId = jwtTokenManager.getUserId() || null // save userId before logout\n\n const { logout } = await import('../../auth')\n await logout()\n\n return { disconnectedUserId: userId, disconnectAddress }\n },\n\n onSuccess: async ({ disconnectAddress, disconnectedUserId }) => {\n await qc.resetQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY] })\n\n setSession(null)\n setAddress(null)\n setError(null)\n setStatus('idle')\n setIsLoading(false)\n\n callbacks?.onLumiaPassportDisconnect?.({ address: disconnectAddress, userId: disconnectedUserId })\n\n setTimeout(() => {\n setPage(PageKey.AUTH)\n setIsDialogForced(false)\n }, 200)\n },\n\n onError: (err) => {\n setError(err.message || 'An unknown error occurred during sign out')\n setStatus('idle')\n setIsLoading(false)\n setIsDialogForced(false)\n }\n })\n\n // const { name, logo, logoDataUri } = chainConfig\n // const isNetworkIcon = !!logoDataUri || logo === 'lumia'\n\n const ChainIcon: React.FC<{ className?: string }> =\n NETWORK_OPTIONS.find((net) => net.chainId === chainConfig.id)?.Icon ||\n (() => (\n <div className=\"flex-none w-4 h-4 rounded-full flex items-center justify-center bg-[var(--l-pass-primary)]\">\n <span className=\"text-[var(--l-pass-fg-inverted)] text-xs font-bold\">{chainConfig.name.charAt(0)}</span>\n </div>\n ))\n\n return (\n <div\n style={{ borderTop: '1px solid var(--l-pass-bd)' }}\n className=\"relative w-full flex flex-col items-center p-[var(--l-pass-pd)] pb-5\"\n >\n <div className={cn('w-full flex justify-between', !!address ? 'justify-between' : 'justify-center')}>\n <Button\n size=\"small\"\n variant=\"ghost\"\n disabled={isDisconnecting}\n onClick={() => address && window.open(`${getExplorerUrl()}/address/${address}`, '_blank')}\n >\n <ChainIcon className=\"flex-none w-6 h-6\" />\n <span className=\"text-xs font-bold\">{chainConfig.name || 'Mbark Wallet'}</span>\n </Button>\n\n {!!address ? (\n <Button\n className=\"text-xs\"\n size=\"small\"\n variant=\"ghost\"\n onClick={() => disconnect(address)}\n disabled={isDisconnecting}\n >\n <span>{t('passport:auth.logout')}</span>\n {isDisconnecting ? <Loader className=\"w-4 h-4 animate-spin\" /> : <LogOut className=\"w-4 h-4\" />}\n </Button>\n ) : null}\n </div>\n\n <span\n className={cn(\n 'absolute block bottom-0 left-1/2 -translate-x-1/2',\n 'font-mono text-[8px] leading-5 text-[var(--l-pass-fg-muted)]'\n )}\n >{`v${PACKAGE.version}`}</span>\n </div>\n )\n}\n","export { Footer } from './Footer'\n","import React, { type SVGAttributes } from 'react'\n\nfunction LumiaIcon(props: SVGAttributes<SVGElement>): React.JSX.Element {\n const { width = '24', height = '24', ...svgProps } = props\n\n return (\n <svg\n {...svgProps}\n width={width}\n height={height}\n viewBox=\"0 0 72 72\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ flexShrink: 0 }}\n >\n <rect width=\"72\" height=\"72\" rx=\"36\" fill=\"var(--l-pass-fg)\" />\n <path\n d=\"M25.3636 35.359H6.77698L26.3313 26.2792L35.3827 6.78174L35.404 25.3043C35.4112 30.8547 30.9139 35.3661 25.3565 35.3661L25.3636 35.359Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M47.4365 35.359H66.0231L46.4687 26.2792L37.4174 6.78174L37.396 25.3043C37.3889 30.8547 41.8861 35.3661 47.4436 35.3661L47.4365 35.359Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M47.4365 37.4226H66.0231L46.4687 46.5025L37.4174 65.9999L37.396 47.4773C37.3889 41.927 41.8861 37.4155 47.4436 37.4155L47.4365 37.4226Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M25.3636 37.4226H6.77698L26.3313 46.5025L35.3827 65.9999L35.404 47.4773C35.4112 41.927 30.9139 37.4155 25.3565 37.4155L25.3636 37.4226Z\"\n fill=\"var(--l-pass-bg)\"\n />\n </svg>\n )\n}\n\nexport { LumiaIcon }\n","export function PositiveIcon(props: React.SVGProps<SVGSVGElement>) {\n const { width = '16', height = '16', ...rest } = props\n\n return (\n <svg {...rest} width={width} height={height} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"16\" height=\"16\" rx=\"8\" fill=\"var(--l-pass-bg-success)\" />\n <path d=\"M4.85742 7.71427L7.14311 10L11.1431 6\" stroke=\"#000000\" />\n </svg>\n )\n}\n","import { jwtTokenManager } from '../auth';\nimport { getTssUrl, getShareVaultUrl } from './base';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { logSdkError } from '@embarkai/core/internal/error-tracking';\n\ninterface ApiRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n body?: any;\n requireAuth?: boolean;\n}\n\ninterface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n status: number;\n}\n\nclass HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n }\n\n private async makeRequest<T>(\n endpoint: string,\n options: ApiRequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const {\n method = 'GET',\n headers = {},\n body,\n requireAuth = true\n } = options;\n\n // Add projectId to URL query params (so it's available in preflight OPTIONS request)\n const url = addProjectIdToUrl(`${this.baseUrl}${endpoint}`);\n\n // Prepare headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...headers\n };\n\n // Add auth header if required\n if (requireAuth) {\n const accessToken = jwtTokenManager.getAccessToken();\n if (accessToken) {\n requestHeaders['Authorization'] = `Bearer ${accessToken}`;\n }\n }\n\n // Prepare request config\n const requestConfig: RequestInit = {\n method,\n headers: requestHeaders,\n credentials: 'include' // Enable cookies for cross-origin requests\n };\n\n if (body && method !== 'GET') {\n requestConfig.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, requestConfig);\n\n // Handle 401 for token refresh\n if (response.status === 401 && requireAuth) {\n const refreshSuccess = await jwtTokenManager.refreshAccessToken();\n if (refreshSuccess) {\n // Update auth header with new token\n const newAccessToken = jwtTokenManager.getAccessToken();\n if (newAccessToken) {\n requestHeaders['Authorization'] = `Bearer ${newAccessToken}`;\n requestConfig.headers = requestHeaders;\n }\n\n // Retry the request\n const retryResponse = await fetch(url, requestConfig);\n return await this.processResponse<T>(retryResponse);\n } else {\n return {\n success: false,\n error: 'Authentication failed - unable to refresh token',\n status: 401\n };\n }\n }\n\n return await this.processResponse<T>(response);\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Network error'),\n { url, method },\n 'http-client'\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Network error',\n status: 0\n };\n }\n }\n\n private async processResponse<T>(response: Response): Promise<ApiResponse<T>> {\n const status = response.status;\n\n try {\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: data.message || data.error || `HTTP ${status}`,\n status,\n data\n };\n }\n\n return {\n success: true,\n data,\n status\n };\n } catch (parseError) {\n logSdkError(\n parseError instanceof Error ? parseError : new Error('Failed to parse response'),\n { status },\n 'http-client'\n );\n return {\n success: false,\n error: 'Invalid response format',\n status\n };\n }\n }\n\n // Convenience methods\n async get<T>(endpoint: string, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'GET', requireAuth });\n }\n\n async post<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'POST', body, requireAuth });\n }\n\n async put<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'PUT', body, requireAuth });\n }\n\n async patch<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'PATCH', body, requireAuth });\n }\n\n async delete<T>(endpoint: string, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'DELETE', requireAuth });\n }\n}\n\n// Factory function to create HTTP clients for different services\nexport function createHttpClient(baseUrl: string): HttpClient {\n return new HttpClient(baseUrl);\n}\n\n// Pre-configured singleton clients for our services\n// These use dynamic URLs and read projectId from window.__EMBARK_PROJECT_ID__ on each request\n// The projectId is set by LumiaPassportProvider during initialization\n// Using lazy initialization to ensure URLs are read after LumiaPassportProvider sets window.__EMBARK_SERVICES__\nlet _tssClient: HttpClient | null = null;\nlet _vaultClient: HttpClient | null = null;\n\nexport const tssClient = new Proxy({} as HttpClient, {\n get(target, prop) {\n if (!_tssClient) {\n _tssClient = createHttpClient(getTssUrl());\n }\n return (_tssClient as any)[prop];\n }\n});\n\nexport const vaultClient = new Proxy({} as HttpClient, {\n get(target, prop) {\n if (!_vaultClient) {\n _vaultClient = createHttpClient(getShareVaultUrl());\n }\n return (_vaultClient as any)[prop];\n }\n});\n\nexport { HttpClient };\nexport type { ApiResponse };","import { tssClient } from './httpClient';\n\nexport const QUERY_KEYS = {\n userProfile: 'user-profile-query',\n nicknameInfo: 'nickname-info',\n nicknameAvailability: (handle: string) => ['nickname-availability', handle] as const,\n nicknameResolve: (handle: string) => ['nickname-resolve', handle] as const\n}\n\n/**\n * Provider information in user profile\n * Matches the structure returned by backend /api/auth/profile\n */\nexport interface ProviderDetail {\n id: string; // Composite ID: \"provider:externalId\"\n provider: string; // Provider type: 'email', 'telegram', 'passkey', etc.\n verified: boolean; // Whether the provider is verified\n linkedAt: string; // ISO timestamp when provider was linked\n lastUsedAt: string; // ISO timestamp of last authentication\n externalId: string; // Provider-specific ID (email address, telegram ID, credential ID, etc.)\n meta?: Record<string, any>; // Provider-specific metadata (email, rpId, etc.)\n}\n\n/**\n * User profile information\n * Extended to include nickname fields from backend\n */\nexport interface UserProfile {\n userId: string;\n displayName?: string;\n avatar?: string;\n providers: ProviderDetail[];\n createdAt: string;\n updatedAt: string;\n hasKeyshare: boolean;\n kycDetails: {\n provider: 'sumsub' | 'uaepass' | 'custom'\n kycStatus: string\n } | null;\n // Nickname fields\n nickname: string | null;\n nicknameDisplay: string | null;\n nicknameCanChange: boolean;\n nicknameCooldownEndsAt: string | null;\n}\n\nexport interface UpdateProfileRequest {\n displayName?: string;\n}\n\n/**\n * Get user profile with detailed provider information\n *\n * Backend /api/auth/profile now returns complete provider details including:\n * - Provider type and identifier\n * - Verification status\n * - Linked and last used timestamps\n * - Provider-specific metadata\n */\nexport async function getUserProfile(): Promise<UserProfile> {\n const response = await tssClient.get<UserProfile>('/api/auth/profile', true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to fetch user profile';\n throw new Error(error);\n }\n\n return response.data;\n}\n\n/**\n * Update user profile\n */\nexport async function updateUserProfile(updates: UpdateProfileRequest): Promise<UserProfile> {\n const response = await tssClient.patch<UserProfile>('/api/auth/profile', updates, true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to update user profile';\n throw new Error(error);\n }\n\n return response.data;\n}\n","function formatValue(price: number, fractionDigits: number) {\n const formatter = Intl.NumberFormat('en-US', {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits\n })\n return formatter.format(price)\n}\n\n/** @description only in-JSX use */\nexport function formatPrice(price: number) {\n // just in case, price always expected defined\n if (!price) return <>{`0.00`}</>\n\n switch (true) {\n // Very small values formatting, like 0.000000001234\n case price < 0.0001: {\n const strigified = formatValue(price, 16)\n\n const absValue = parseInt(strigified.replace(/^0\\./, '')).toString().slice(0, 2)\n const zeroQnt = strigified\n .replace(/^0\\./, '')\n .split('')\n .findIndex((el) => +el > 0)\n\n return (\n <>\n {`0.0`}\n <sub className=\"text-[10px]\">{zeroQnt}</sub>\n {absValue}\n </>\n )\n }\n\n // Small values formatting\n case price < 1:\n return <>{formatValue(price, 4).replace(/\\.?0+$/, '')}</>\n\n // Billions formatting\n case price >= 1000000000:\n return (\n <>\n {formatValue(price / 1000000000, 0)}\n <strong>{'B'}</strong>\n </>\n )\n\n // Standard formatting\n default:\n return <>{formatValue(price, Number.isInteger(price) ? 0 : 2)}</>\n }\n}\n","import { useLayoutDataStore } from '@/hooks/useLayoutDataStore'\nimport { formatPrice } from '@/lib/priceFormatter'\nimport { cn } from '@/lib/utils'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { formatUnits } from 'viem'\n\ninterface BalanceViewProps {\n className?: string\n}\n\nexport const BALANCE_PREFIXES = {\n P: '$P\\u00A0', // Special case for the P token, with a space\n USD: '$',\n EUR: '€',\n GBP: '£'\n}\n\nexport function BalanceView(props: BalanceViewProps) {\n const { className } = props\n\n const config = useLumiaPassportConfig().config\n const showFiatBalance = config.current?.features?.showActiveBalanceAsFiat\n\n const balance = useLayoutDataStore((st) => st.balance)\n const cryptoSymbol = useLayoutDataStore((st) => st.cryptoSymbol)\n\n const cryptoBalance = Number(formatUnits(balance?.value || BigInt(0), balance?.decimals || 18))\n\n const fiatBalance = useLayoutDataStore((st) => st.fiatBalance)\n const fiatSymbol = useLayoutDataStore((st) => st.fiatSymbol)\n // const cryptoRate = useLayoutDataStore((st) => st.cryptoRate)\n\n const symbol = showFiatBalance ? fiatSymbol : cryptoSymbol\n\n return (\n <span className={cn('text-lg leading-5 font-bold', className)}>\n {BALANCE_PREFIXES[symbol] || null}\n <span>{formatPrice(showFiatBalance ? fiatBalance : cryptoBalance)}</span>\n {!BALANCE_PREFIXES[symbol] && <span> {symbol}</span>}\n </span>\n )\n}\n","export { BalanceView, BALANCE_PREFIXES } from './BalanceView'\n","import { QueryClient } from '@tanstack/react-query'\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 6, // 6 minutes\n gcTime: 1000 * 60 * 10, // 10 minutes\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false\n }\n }\n})\n","import { tssClient } from '@/clients/httpClient'\nimport { queryClient } from '@/src/config/queryClient'\n\nexport interface GetSumsubTokenParams {\n levelName?: string\n ttlInSecs?: number\n}\n\nexport interface GetSumsubTokenResponse {\n externalToken: {\n provider: string\n token: string | undefined\n payload: {\n userId: string\n levelName: string\n ttlInSecs: number\n }\n }\n expiresIn: number\n scopes: string[]\n audience: string\n}\n\nconst DEFAULT_TTL_SECONDS = 600\nconst QUERY_KEYS = { sumsubToken: 'sumsub-token' }\n\nasync function fetchToken(params: GetSumsubTokenParams = {}): Promise<string> {\n const { levelName, ttlInSecs = DEFAULT_TTL_SECONDS } = params\n\n const response = await tssClient.post<GetSumsubTokenResponse>('/api/auth/token/exchange', {\n scopes: ['kyc:get', 'kyc:create'],\n audience: 'lumia-passport-sumsub-service',\n ttl: ttlInSecs,\n levelName\n })\n\n if (!response.success) {\n throw new Error(response.error || `Sumsub token exchange failed: ${response.status}`)\n }\n\n const token = response.data?.externalToken?.token\n\n if (!token) throw new Error('Invalid Sumsub token response')\n return token\n}\n\nexport async function getSumsubSdkToken(params: GetSumsubTokenParams = {}): Promise<string> {\n return queryClient.ensureQueryData({\n queryKey: [QUERY_KEYS.sumsubToken, params.levelName],\n queryFn: () => fetchToken(params)\n })\n}\n\nexport async function refreshSumsubSdkToken(params: GetSumsubTokenParams = {}): Promise<string> {\n const queryKey = [QUERY_KEYS.sumsubToken, params.levelName]\n\n await queryClient.invalidateQueries({ queryKey })\n\n return queryClient.fetchQuery({\n queryKey,\n queryFn: () => fetchToken(params)\n })\n}\n","/**\n * Sumsub Iframe Manager\n *\n * Manages postMessage communication with Sumsub KYC iframe.\n */\n\ntype IframeToParentMessage =\n | { type: 'SUMSUB_IFRAME_LOADED' }\n | { type: 'SUMSUB_SDK_ON_BUILD' }\n | { type: 'SUMSUB_SDK_ON_INIT' }\n | { type: 'SUMSUB_ON_RESIZE'; data: { height: number } }\n | { type: 'SUMSUB_TOKEN_EXPIRED'; data: { requestId: string } }\n | { type: 'SUMSUB_INIT_ERROR'; data: { error: string } }\n | { type: 'SUMSUB_ERROR'; data: { error: string } }\n\ntype ParentToIframeMessage =\n | { type: 'SUMSUB_INIT'; data: { accessToken: string; theme?: SumsubTheme; customizationName?: string } }\n | { type: 'SUMSUB_TOKEN_REFRESH'; data: { requestId: string; accessToken: string } }\n\ntype SumsubTheme = 'light' | 'dark'\nexport const DEFAULT_THEME_NAME = 'Lumia Hub KYC Preset V2'\n\nexport interface SumsubIframeManagerConfig {\n options?: { theme?: SumsubTheme; customizationName?: string }\n iframeOrigin: string\n getToken: () => Promise<string>\n refreshToken: () => Promise<string>\n sendMessage: (message: ParentToIframeMessage) => void\n onSdkBuilt?: () => void\n onReady?: () => void\n onHeightChange?: (height: number) => void\n onError?: (error: string) => void\n}\n\nexport class SumsubIframeManager {\n private config: SumsubIframeManagerConfig\n private boundMessageHandler: (event: { origin: string; data: IframeToParentMessage }) => void\n\n constructor(config: SumsubIframeManagerConfig) {\n this.config = config\n this.boundMessageHandler = this.handleMessage.bind(this)\n window.addEventListener('message', this.boundMessageHandler)\n }\n\n destroy(): void {\n window.removeEventListener('message', this.boundMessageHandler)\n }\n\n private async handleMessage(event: { origin: string; data: IframeToParentMessage }): Promise<void> {\n if (event.origin !== this.config.iframeOrigin) return\n\n const message = event.data\n if (!message?.type) return\n\n switch (message.type) {\n case 'SUMSUB_IFRAME_LOADED':\n try {\n const token = await this.config.getToken()\n this.send({\n type: 'SUMSUB_INIT',\n data: {\n accessToken: token,\n theme: this.config.options.theme,\n customizationName: this.config.options.customizationName\n }\n })\n } catch (err) {\n this.config.onError?.(err instanceof Error ? err.message : 'Failed to get token')\n }\n break\n\n case 'SUMSUB_SDK_ON_INIT':\n this.config.onReady?.()\n break\n\n case 'SUMSUB_SDK_ON_BUILD':\n this.config.onSdkBuilt?.()\n break\n\n case 'SUMSUB_ON_RESIZE':\n this.config.onHeightChange?.(message.data.height)\n break\n\n case 'SUMSUB_TOKEN_EXPIRED': {\n const requestId = message.data?.requestId\n if (!requestId) return\n\n try {\n const token = await this.config.refreshToken()\n this.send({ type: 'SUMSUB_TOKEN_REFRESH', data: { requestId, accessToken: token } })\n } catch (err) {\n this.config.onError?.(err?.message || 'Failed to refresh token')\n }\n break\n }\n\n case 'SUMSUB_INIT_ERROR':\n case 'SUMSUB_ERROR':\n this.config.onError?.(message.data.error)\n break\n }\n }\n\n private send(message: ParentToIframeMessage): void {\n this.config.sendMessage(message)\n }\n}\n","import { useLumiaPassportColorMode, useLumiaPassportConfig } from '@/src'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { getSumsubSdkToken, refreshSumsubSdkToken } from './api/sumsub'\nimport { DEFAULT_THEME_NAME, SumsubIframeManager } from './SumsubIframeManager'\n\ninterface UseSumsubIframeOptions {\n iframeUrl: string\n}\n\nexport function useSumsubIframe({ iframeUrl }: UseSumsubIframeOptions) {\n const {\n config: { current: config }\n } = useLumiaPassportConfig()\n\n const { colorMode } = useLumiaPassportColorMode()\n\n const iframeRef = useRef<HTMLIFrameElement>(null)\n\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [height, setHeight] = useState(0)\n const [status, setStatus] = useState<string>('')\n\n const levelName = config.kyc?.options?.levelName\n\n useEffect(() => {\n setError(null)\n setIsLoading(true)\n setStatus('Preparing verification...')\n\n const iframeOrigin = new URL(iframeUrl).origin\n const manager = new SumsubIframeManager({\n options: {\n theme: colorMode === 'dark' ? 'dark' : 'light',\n customizationName: DEFAULT_THEME_NAME\n },\n iframeOrigin,\n getToken: () => {\n setStatus('Authenticating...')\n return getSumsubSdkToken({ levelName })\n },\n refreshToken: () => refreshSumsubSdkToken({ levelName }),\n onSdkBuilt: () => setStatus('Loading verification form...'),\n sendMessage: (msg) => iframeRef.current?.contentWindow?.postMessage(msg, iframeOrigin),\n onReady: () => {\n setIsLoading(false)\n setStatus('')\n },\n onHeightChange: setHeight,\n onError: (err) => {\n setIsLoading(false)\n setStatus('')\n setError(err)\n }\n })\n\n return () => {\n manager.destroy()\n }\n }, [iframeUrl, levelName])\n\n return {\n iframeRef,\n isLoading,\n error,\n height,\n status\n }\n}\n","import { useLumiaPassportConfig } from '@/src'\nimport { LoaderIcon } from 'lucide-react'\nimport React, { type CSSProperties } from 'react'\n\n// import { Expandable } from '../Expandable'\nimport { useSumsubIframe } from './useSumsubIframe'\n\n// const MAX_IFRAME_HEIGHT = 650\n\nexport const SumsubIframe: React.FC = () => {\n const config = useLumiaPassportConfig().config\n\n const iframeUrl = `${config.current.services.iframeUrl}/kyc/sumsub.html`\n\n const { iframeRef, isLoading, error, height, status } = useSumsubIframe({ iframeUrl })\n\n return (\n <>\n {isLoading && (\n <div className=\"rounded-[10px] p-6 text-center\">\n <LoaderIcon className=\"w-4 h-4 animate-spin mx-auto\" />\n <p className=\"text-sm text-[var(--l-pass-text-secondary)] mt-2\">{status || 'Loading KYC verification...'}</p>\n </div>\n )}\n\n {error && (\n <div className=\"rounded-[10px] p-4 text-center bg-[var(--l-pass-bg-error)] border border-[var(--l-pass-error)]\">\n <div className=\"text-sm text-[var(--l-pass-error)]\">{error}</div>\n </div>\n )}\n\n <div className=\" w-full h-full relative\">\n <iframe\n ref={iframeRef}\n src={iframeUrl}\n title=\"Sumsub KYC Verification\"\n className=\"noScrollbars w-full border-0 rounded-[10px]\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\"\n allow=\"camera; microphone; geolocation; clipboard-write\"\n style={{ height: isLoading || error ? 0 : height }}\n />\n </div>\n </>\n )\n}\n","// import { KycContent } from '@/components/KYC/KycContent'\n\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { ArrowLeft } from 'lucide-react'\nimport type { CSSProperties } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Button } from '../ui/button'\nimport { SumsubIframe } from './SumsubIframe'\n\nconst KycContent = (): JSX.Element => {\n const config = useLumiaPassportConfig().config\n const provider = config.current.kyc?.provider\n\n switch (provider) {\n case 'sumsub':\n return <SumsubIframe />\n\n default:\n return (\n <div className=\"rounded-xl p-[var(--l-pass-pd)] text-center bg-[var(--l-pass-secondary)]\">\n <div className=\"text-sm\">\n {provider ? `KYC provider \"${provider}\" coming soon…` : 'KYC verification coming soon…'}\n </div>\n </div>\n )\n }\n}\n\nexport function KycMenu() {\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': '4px',\n 'paddingTop': 'var(--l-pass-pd)',\n 'paddingBottom': 'var(--l-pass-pd)',\n 'paddingLeft': '4px'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full flex flex-col gap-[var(--l-pass-gap)]\"\n >\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button variant=\"ghost\" size=\"icon\" title=\"Back\" onClick={() => setPage(PageKey.SETTINGS)}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{'KYC'}</span>\n </div>\n\n <KycContent />\n </div>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQuery } from '@tanstack/react-query'\nimport { Loader } from 'lucide-react'\n\nimport { PositiveIcon } from '../../assets/PositiveIcon'\nimport { getUserProfile, QUERY_KEYS } from '../../clients/profile'\nimport { cn } from '../../lib/utils'\n\nexport function KYCStatus() {\n const address = useLumiaPassportSession((st) => st.address)\n\n const { data: userProfile = null, isLoading: isUserProfileLoading } = useQuery({\n retry: false,\n enabled: !!address,\n queryKey: [QUERY_KEYS.userProfile, address],\n queryFn: getUserProfile\n })\n\n const isKycVerified = !isUserProfileLoading && userProfile?.kycDetails?.kycStatus === 'verified'\n\n if (isUserProfileLoading) return <Loader className=\"w-4 h-4 animate-spin\" />\n\n if (!isKycVerified) return null\n\n return (\n <div className=\"group relative flex flex-shrink-0\">\n <PositiveIcon />\n\n <div\n className={cn(\n 'transition-opacity pointer-events-none whitespace-nowrap z-50',\n 'absolute top-1/2 right-full -translate-y-1/2 -translate-x-[var(--l-pass-gap)]',\n 'px-2 py-1 bg-[var(--l-pass-bg)] text-[var(--l-pass-fg)] text-xs rounded-full',\n 'border border-[var(--l-pass-bd)]',\n 'opacity-0 group-hover:opacity-100'\n )}\n >\n {'KYC Verified'}\n </div>\n </div>\n )\n}\n","export { KycMenu } from './KycMenu'\nexport { KYCStatus } from './KYCStatus'\n","import { LumiaIcon } from '@/assets/LumiaIcon'\nimport { NETWORK_OPTIONS } from '@/src/config/networks'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n/useT'\nimport { useQuery } from '@tanstack/react-query'\nimport { Copy, Loader, X } from 'lucide-react'\nimport { useCallback, useRef, useState } from 'react'\n\nimport { PositiveIcon } from '../../assets/PositiveIcon'\nimport { jwtTokenManager } from '../../auth'\nimport { getUserProfile, QUERY_KEYS } from '../../clients/profile'\nimport { cn } from '../../lib/utils'\nimport { BalanceView } from '../BalanceView'\nimport { KYCStatus } from '../KYC'\nimport { Button } from '../ui/button'\n\n// import { LumiaLogo } from '../../assets/LumiaLogo'\n// import { getExplorerUrl } from '../../clients'\n\nfunction formatAddress(addr: `0x${string}` | null) {\n if (!addr) return ''\n return `${addr.slice(0, 10)}...${addr.slice(-4)}`\n}\n\nexport function Header() {\n const config = useLumiaPassportConfig().config\n const address = useLumiaPassportSession((st) => st.address)\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n\n const { t } = useT()\n\n const [copied, setCopied] = useState(false)\n const [showEasterEgg, setShowEasterEgg] = useState(false)\n const clickCountRef = useRef(0)\n const clickTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleAvatarClick = useCallback(() => {\n clickCountRef.current += 1\n\n if (clickTimerRef.current) {\n clearTimeout(clickTimerRef.current)\n }\n\n if (clickCountRef.current >= 5) {\n clickCountRef.current = 0\n setShowEasterEgg(true)\n } else {\n clickTimerRef.current = setTimeout(() => {\n clickCountRef.current = 0\n }, 1000)\n }\n }, [])\n\n // Fetch profile to get nickname (with fallback to JWT data)\n const { data: profile, isLoading: isProfileLoading } = useQuery({\n retry: false,\n enabled: !!address,\n queryKey: [QUERY_KEYS.userProfile, address],\n queryFn: getUserProfile\n })\n\n const avatar = profile?.avatar || jwtTokenManager.getAvatar()\n // Prefer nicknameDisplay, fallback to displayName, then to JWT displayName\n const displayName = profile?.nicknameDisplay || profile?.displayName || jwtTokenManager.getDisplayName()\n\n // const { name, logo, logoDataUri, id } = chainConfig\n // const isNetworkIcon = !!logoDataUri || logo === 'lumia'\n\n const ChainIcon: React.FC<{ className?: string }> =\n NETWORK_OPTIONS.find((net) => net.chainId === chainConfig.id)?.Icon ||\n (() => (\n <div className=\"flex-none w-4 h-4 rounded-full flex items-center justify-center bg-[var(--l-pass-primary)]\">\n <span className=\"text-[var(--l-pass-fg-inverted)] text-xs font-bold\">{chainConfig.name.charAt(0)}</span>\n </div>\n ))\n\n return (\n <div\n style={{ borderBottom: '1px solid var(--l-pass-bd)' }}\n className=\"w-full flex flex-col gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)] pt-5\"\n >\n <div className=\"w-full flex items-center gap-[var(--l-pass-gap)]\">\n {/* AVATAR */}\n <div\n className=\"flex-none w-12 h-12 flex items-center justify-center cursor-pointer select-none\"\n onClick={handleAvatarClick}\n >\n {avatar ? (\n <img src={avatar} alt={displayName} className=\"w-full h-full object-cover rounded-full\" />\n ) : (\n <LumiaIcon width={48} height={48} />\n )}\n </div>\n\n {/* NAME & BALANCE */}\n <div\n style={{ width: 'calc(100% - 48px - var(--l-pass-gap))' }}\n className=\"flex-1 flex flex-col justify-center gap-1\"\n >\n {isProfileLoading && <Loader className=\"w-4 h-4 animate-spin\" />}\n\n {!!address && !isProfileLoading && !!profile && (\n <>\n {/* USERNAME */}\n <div className=\"w-full flex items-center gap-[var(--l-pass-gap)]\">\n <span\n className={cn(\n 'text-[14px] leading-4 truncate max-w-[144px] font-medium',\n 'text-ellipsis overflow-hidden whitespace-nowrap'\n )}\n >\n {displayName || config.current?.ui?.title || 'Mbark'}\n </span>\n\n <KYCStatus />\n </div>\n\n <BalanceView />\n </>\n )}\n </div>\n </div>\n\n {!!address && (\n <div className=\"w-full flex items-center justify-between gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center w-fit text-[10px] px-2 leading-6 text-[var(--l-pass-fg)] gap-2\">\n <span>{formatAddress(address)}</span>\n <ChainIcon className=\"flex-none w-4 h-4\" />\n </div>\n\n <div className=\"w-fit flex items-center gap-[var(--l-pass-gap)] justify-between\">\n <Button\n size=\"small\"\n variant=\"ghost\"\n className=\"text-[10px] px-2 text-[var(--l-pass-fg)] hover:text-[var(--l-pass-fg-h)] active:text-[var(--l-pass-fg-a)]\"\n onClick={async () => {\n await navigator.clipboard.writeText(address)\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }}\n >\n {copied ? <PositiveIcon /> : <Copy className=\"w-4 h-4\" />}\n <span className=\"uppercase\">{t('passport:common.copy')}</span>\n </Button>\n\n {/* <Button\n size=\"small\"\n variant=\"ghost\"\n className=\"text-[10px] px-0 text-[var(--l-pass-fg)] hover:text-[var(--l-pass-fg-h)] active:text-[var(--l-pass-fg-a)]\"\n onClick={() => {\n if (!address) return\n window.open(`${getExplorerUrl()}/address/${address}`, '_blank')\n }}\n >\n <ChainIcon className=\"flex-none w-4 h-4\" />\n {chainConfig.name.toUpperCase() || 'EXPLORER'}\n </Button> */}\n </div>\n </div>\n )}\n\n {/* Easter Egg Video Overlay */}\n {showEasterEgg && (\n <div\n className=\"fixed inset-0 z-[9999] bg-black/90 flex items-center justify-center\"\n onClick={() => setShowEasterEgg(false)}\n >\n <button\n className=\"absolute top-4 right-4 text-white hover:text-gray-300 transition-colors\"\n onClick={() => setShowEasterEgg(false)}\n >\n <X className=\"w-8 h-8\" />\n </button>\n <video\n autoPlay\n controls\n className=\"max-w-full max-h-full\"\n onEnded={() => setShowEasterEgg(false)}\n onClick={(e) => e.stopPropagation()}\n >\n <source src=\"https://github.com/cyberkostyan/ABrobot-ESP32-C3/raw/main/2026.webm\" type=\"video/webm\" />\n </video>\n </div>\n )}\n </div>\n )\n}\n","export { Header } from './Header'\n","import { cn } from '@/lib/utils'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { getLanguageIcon, useT } from '@/src/i18n'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { merge } from 'lodash-es'\nimport { ArrowLeft, SlidersHorizontal, X } from 'lucide-react'\nimport { forwardRef, type ComponentPropsWithoutRef, type CSSProperties, type ElementRef } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Button } from './button'\n\nconst Dialog = DialogPrimitive.Root\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\ntype DialogOverlayProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay> & {\n closing?: boolean\n}\n\nconst DialogOverlay = forwardRef<ElementRef<typeof DialogPrimitive.Overlay>, DialogOverlayProps>(\n ({ className, closing, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n style={{ backdropFilter: 'blur(var(--l-pass-backdrop-blur))' }}\n className={cn(\n 'w-[100dvw] h-[100dvh]',\n 'fixed inset-0 z-[9998] bg-[var(--l-pass-overlay)]',\n closing ? 'animate-dialog-out' : 'animate-dialog-in',\n className\n )}\n {...props}\n />\n )\n)\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n colorMode: 'light' | 'dark'\n // hideClose?: boolean\n}\n\nfunction useDecideContentStyles() {\n const isMobileView = useLayoutStore((st) => st.isMobileView)\n const isClosing = useLayoutStore((st) => !!st.isDialogOpen && !!st.isDialogClosing)\n\n const mobileStyles = isMobileView ? { '--l-pass-bdrs': '20px 20px 0px 0px' } : {}\n\n return {\n isClosing,\n isMobileView,\n style: merge({}, mobileStyles) as CSSProperties\n }\n}\n\nconst CONTENT_BG_SETUP: CSSProperties = {\n backgroundColor: 'var(--l-pass-bg)',\n border: '1px solid var(--l-pass-bd)',\n boxShadow: '0px 4px 10px var(--l-pass-shadow-c)'\n}\n\nconst DialogContent = forwardRef<React.ElementRef<typeof DialogPrimitive.Content>, DialogContentProps>(\n ({ className, children, colorMode, ...props }, ref) => {\n const { t, i18n } = useT()\n\n const isSessionLoading = useLumiaPassportSession((st) => st.isLoading)\n const isSettings = useLayoutStore((st) => st.isSettings)\n const isDialogForced = useLayoutStore((st) => st.isDialogForced)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const settingsNotifications = useLayoutDataStore((st) => st.settingsNotifications)\n\n const { isMobileView, isClosing, style } = useDecideContentStyles()\n\n const animationCnPrefix = isMobileView ? 'animate-mobile-dialog' : 'animate-dialog'\n const dialogAnimationCn = isClosing ? `${animationCnPrefix}-out` : `${animationCnPrefix}-in`\n\n return (\n <DialogPortal>\n <div className=\"lumia-scope\" data-lumia-passport-mode={colorMode} style={{ ...style, outline: 'none' }}>\n <DialogOverlay closing={isClosing} />\n\n <div\n className={cn(\n 'fixed inset-0 z-[9999] flex items-center justify-center pointer-events-none outline-none',\n dialogAnimationCn,\n isMobileView ? 'items-end w-[100dvw] h-[100dvh]' : 'items-center w-[var(--l-pass-maw)] mx-auto'\n )}\n >\n <DialogPrimitive.Content\n ref={ref}\n style={!!className ? undefined : CONTENT_BG_SETUP} // this gives complete dialog box control by external className\n className={cn(\n 'relative pointer-events-auto max-h-[95dvh] outline-none',\n 'p-0 gap-0 text-[var(--l-pass-fg)]',\n 'rounded-[var(--l-pass-bdrs)] overflow-hidden',\n isMobileView ? 'w-[100dvw]' : 'w-[var(--l-pass-maw)]',\n className\n )}\n {...props}\n >\n {children}\n\n {!isDialogForced && (\n <div\n className={cn(\n 'flex items-center justify-center gap-[var(--l-pass-gap)]',\n 'absolute right-[var(--l-pass-pd)] top-[var(--l-pass-pd)]'\n )}\n >\n {/* <span className=\"block font-mono text-[8px] leading-[8px] text-[var(--l-pass-fg-muted)]\">{`v${PACKAGE.version}`}</span> */}\n\n {!isSessionLoading && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"relative w-4 h-4\"\n onClick={() => setPage(PageKey.LANGUAGES)}\n >\n <span className=\"sr-only\">{t('passport:common.language')}</span>\n\n <span className=\"w-4 h-4 leading-4 block text-[10px] font-bold\">\n {getLanguageIcon(i18n.resolvedLanguage) || i18n.resolvedLanguage?.toUpperCase()}\n </span>\n </Button>\n )}\n\n {isSettings && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"relative w-4 h-4\"\n onClick={() => setPage(PageKey.SETTINGS)}\n >\n <span className=\"sr-only\">{t('passport:common.settings')}</span>\n\n <SlidersHorizontal className=\"w-4 h-4\" />\n\n {!!settingsNotifications.length && (\n <div\n className={cn(\n 'absolute -top-2 -right-2 flex h-4 w-4',\n 'items-center justify-center rounded-full bg-[var(--l-pass-bg-error)]',\n 'text-xs font-semibold text-[var(--l-pass-error)]'\n )}\n >\n {settingsNotifications.length}\n </div>\n )}\n </Button>\n )}\n\n <DialogPrimitive.Close asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"w-4 h-4\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('passport:common.close')}</span>\n </Button>\n </DialogPrimitive.Close>\n </div>\n )}\n </DialogPrimitive.Content>\n </div>\n </div>\n </DialogPortal>\n )\n }\n)\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogTopBar: React.FC<{ onBack?: () => void; className?: string; showClose?: boolean }> = ({\n onBack,\n className,\n showClose = false\n}) => (\n <div className={cn('flex items-center justify-between px-4 pt-4', className)}>\n <button\n onClick={onBack}\n disabled={!onBack}\n aria-label=\"Back\"\n className={`rounded-md p-1 ${onBack ? 'text-gray-400 hover:text-gray-600' : 'opacity-0 pointer-events-none'}`}\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n {showClose && (\n <DialogPrimitive.Close\n aria-label=\"Close\"\n className=\"rounded-md p-1 text-gray-500 hover:text-gray-700 focus:outline-none\"\n >\n <X className=\"w-4 h-4\" />\n </DialogPrimitive.Close>\n )}\n </div>\n)\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogTopBar,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription\n}\n","import React from 'react';\n\nexport interface VisuallyHiddenProps {\n children: React.ReactNode;\n}\n\nexport const VisuallyHidden: React.FC<VisuallyHiddenProps> = ({ children }) => (\n <span className=\"sr-only absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0\">\n {children}\n </span>\n);","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useCallback, useEffect } from 'react'\n\nimport { PageKey, useLayoutDataStore } from './useLayoutDataStore'\n\nexport function useListenIframeAuthEvents() {\n const setPage = useLayoutDataStore((state) => state.setPage)\n const setIsIframeReady = useLumiaPassportSession((state) => state.setIsIframeReady)\n\n const handleIframeMessage = useCallback(\n (event: MessageEvent) => {\n // console.log('[ IFRAME MESSAGE ] Received iframe message:', event.data)\n\n // Track when iframe is ready\n if (event.data?.type === 'LUMIA_PASSPORT_IFRAME_READY') {\n console.log('[ IFRAME MESSAGE CACTHED ] Iframe is ready')\n setIsIframeReady(true)\n }\n\n // Hide auth modal when consent screen is shown\n else if (event.data?.type === 'LUMIA_PASSPORT_SHOW_IFRAME') {\n console.log('[ IFRAME MESSAGE CACTHED ] Consent screen shown - hiding auth modal')\n }\n\n // Show auth modal when consent screen is hidden (if user cancelled)\n else if (event.data?.type === 'LUMIA_PASSPORT_HIDE_IFRAME') {\n console.log('[ IFRAME MESSAGE CACTHED ] Consent screen hidden')\n // Note: Don't automatically re-open auth modal here\n // Let the authentication flow handle it (e.g., show failed screen)\n }\n // Show auth modal when consent screen is hidden (if user cancelled)\n else if (event.data?.type === 'KEYSHARE_RECOVERY_NEEDED') {\n console.log('[ IFRAME MESSAGE CACTHED] recovery neede')\n // setPage(PageKey.KEYSHARE_RESTORE)\n // Note: Don't automatically re-open auth modal here\n // Let the authentication flow handle it (e.g., show failed screen)\n }\n },\n [setPage, setIsIframeReady]\n )\n\n // Listen for iframe ready and show/hide events\n useEffect(() => {\n window.addEventListener('message', handleIframeMessage)\n return () => window.removeEventListener('message', handleIframeMessage)\n }, [handleIframeMessage])\n}\n","import type { PublicClient } from 'viem'\nimport type { ChainContext } from '@embarkai/core/bundler'\n\nimport { getBundlerUrl } from './clients/base'\nimport { ENTRY_POINT_NONCE_ABI } from './clients/account/abis'\n\nconst ECRECOVER_PRECOMPILE = '0x0000000000000000000000000000000000000001' as const\nconst ECRECOVER_ABI = [\n {\n name: 'ecrecover',\n type: 'function',\n inputs: [\n { name: 'hash', type: 'bytes32' },\n { name: 'v', type: 'uint8' },\n { name: 'r', type: 'bytes32' },\n { name: 's', type: 'bytes32' }\n ],\n outputs: [{ name: 'addr', type: 'address' }]\n }\n] as const\n\nexport const safeToBigInt = (val: any, fallback = '0x0') => {\n try {\n return BigInt(val || fallback)\n } catch {\n return BigInt(fallback)\n }\n}\nexport const pack2x128 = (hi: bigint, lo: bigint): `0x${string}` => {\n return `0x${((hi << 128n) | (lo & ((1n << 128n) - 1n))).toString(16).padStart(64, '0')}`\n}\n\nexport async function verifySignatureAgainstOwner(\n opHash: `0x${string}`,\n signature: `0x${string}`,\n expectedOwner: `0x${string}` | undefined,\n context: ChainContext\n) {\n const { client } = context\n if (!signature || signature === '0x') return\n try {\n const recoveredAddress = await (client as any).readContract({\n address: ECRECOVER_PRECOMPILE,\n abi: ECRECOVER_ABI,\n functionName: 'ecrecover',\n args: [\n opHash,\n parseInt(signature.slice(-2), 16),\n `0x${signature.slice(2, 66)}` as `0x${string}`,\n `0x${signature.slice(66, 130)}` as `0x${string}`\n ]\n })\n console.error('[AA][sign][CRITICAL] Signature verification:', {\n opHash,\n signature,\n recoveredAddress,\n expectedOwner,\n addressesMatch: recoveredAddress?.toLowerCase() === expectedOwner?.toLowerCase()\n })\n } catch (e) {\n try {\n const { recoverAddress } = await import('viem')\n const recoveredAddress = await recoverAddress({ hash: opHash, signature })\n console.error('[AA][sign][CRITICAL] Signature verification (viem):', {\n opHash,\n signature,\n recoveredAddress,\n expectedOwner,\n addressesMatch: recoveredAddress?.toLowerCase() === expectedOwner?.toLowerCase()\n })\n } catch (e2) {\n console.error('[AA][sign][ERROR] Could not verify signature:', e2)\n }\n }\n}\n\nexport async function fetchEntryPointNonce(\n account: `0x${string}`,\n entryPoint: `0x${string}`,\n context: ChainContext\n): Promise<`0x${string}`> {\n const { client } = context\n try {\n const nonce = await (client as any).readContract({\n address: entryPoint,\n abi: ENTRY_POINT_NONCE_ABI,\n functionName: 'getNonce',\n args: [account, 0n]\n })\n if (typeof nonce === 'bigint') return `0x${nonce.toString(16)}`\n } catch {}\n return '0x0'\n}\n\nfunction sanitizeUserOperation(userOp: any): any {\n const sanitized = { ...userOp }\n\n // Fix sender field if it's an object (extract address and factory fields)\n if (typeof sanitized.sender === 'object' && sanitized.sender) {\n const senderObj = sanitized.sender\n\n // Extract the actual sender address\n sanitized.sender = senderObj.sender || senderObj.address || senderObj.smartAccountAddress\n\n // Extract factory fields if they exist\n if (senderObj.factory) {\n sanitized.factory = senderObj.factory\n }\n if (senderObj.factoryData) {\n sanitized.factoryData = senderObj.factoryData\n }\n }\n\n // Ensure all hex fields are valid and properly formatted\n const hexFields = [\n 'sender',\n 'nonce',\n 'callData',\n 'callGasLimit',\n 'verificationGasLimit',\n 'preVerificationGas',\n 'maxFeePerGas',\n 'maxPriorityFeePerGas',\n 'signature',\n 'factory',\n 'factoryData',\n 'paymaster',\n 'paymasterData',\n 'paymasterVerificationGasLimit',\n 'paymasterPostOpGasLimit'\n ]\n\n for (const field of hexFields) {\n const value = sanitized[field]\n if (value !== undefined && value !== null) {\n if (typeof value === 'string') {\n if (value === '0x' || value === '') {\n // Convert empty hex to 0x0 for numeric fields, 0x for data fields\n if (['callData', 'factoryData', 'paymasterData', 'signature'].includes(field)) {\n sanitized[field] = '0x'\n } else {\n sanitized[field] = '0x0'\n }\n } else if (field === 'sender' || field === 'factory' || field === 'paymaster') {\n // Address fields should not have 0x prefix added if missing\n if (!value.startsWith('0x')) {\n sanitized[field] = `0x${value}`\n }\n } else if (!value.startsWith('0x')) {\n sanitized[field] = `0x${value}`\n }\n }\n }\n }\n\n // Remove undefined/null fields for v0.7\n Object.keys(sanitized).forEach((key) => {\n if (sanitized[key] === undefined || sanitized[key] === null) {\n delete sanitized[key]\n }\n })\n\n // Ensure required fields exist with proper defaults\n if (!sanitized.callData) sanitized.callData = '0x'\n if (!sanitized.signature) sanitized.signature = '0x'\n\n return sanitized\n}\n\nexport async function bundlerRpc(method: string, params: any[]) {\n // Sanitize UserOperation if this is eth_sendUserOperation\n let cleanParams = params\n if (method === 'eth_sendUserOperation' && params[0]) {\n cleanParams = [sanitizeUserOperation(params[0]), params[1]]\n }\n\n const body = { jsonrpc: '2.0', id: 1, method, params: cleanParams }\n const bodyStr = JSON.stringify(body, (_k, v) => (typeof v === 'bigint' ? `0x${v.toString(16)}` : v))\n\n console.log('[AA][rpc] ->', method, bodyStr)\n\n // Bundler API doesn't require cookies, so we omit credentials to avoid CORS issues\n const res = await fetch(getBundlerUrl(), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: bodyStr\n })\n const json = await res.json()\n\n if (json.error) {\n console.log('[AA][rpc] <- ERROR:', JSON.stringify(json.error))\n const detail = json.error?.data ? ` | data: ${JSON.stringify(json.error.data)}` : ''\n throw new Error((json.error.message || JSON.stringify(json.error)) + detail)\n }\n\n console.log('[AA][rpc] <- SUCCESS:', JSON.stringify(json.result))\n return json.result\n}\n","import { requireActiveChainId } from '@/src'\nimport { getChainConfig, getViemChain } from '@embarkai/core/read'\nimport { createWalletClient, http, parseEther } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\n\nimport { FUNDER_PK } from '../base'\nimport { entryPointDepositAbi } from './constants'\n\nexport async function depositForSmartAccount(\n address: `0x${string}`,\n amountEth = '0.01'\n) {\n const chainId = requireActiveChainId()\n const chainConfig = getChainConfig(chainId)\n\n if (!FUNDER_PK) throw new Error('VITE_FUNDER_PK is not set')\n\n const entryPointAddress = chainConfig.entryPointV07Address\n\n const funder = privateKeyToAccount(FUNDER_PK as `0x${string}`)\n\n const viemChain = getViemChain(chainId)\n const wallet = createWalletClient({\n account: funder,\n chain: viemChain,\n transport: http(viemChain.rpcUrls.default.http[0])\n })\n const hash = await (wallet as any).writeContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPointDepositAbi,\n functionName: 'depositTo',\n args: [address],\n value: parseEther(amountEth),\n type: 'legacy',\n gasPrice: 1_000_000_000n\n } as any)\n return hash\n}\n","import {\n createUserOperationWithDynamicFees,\n estimateUserOperationGas,\n sendUserOperationWithRetry\n} from '@embarkai/core/bundler'\nimport type { UserOperationV07 } from '@embarkai/core/bundler'\nimport { createPublicClientForChain, getChainConfig } from '@embarkai/core/read'\nimport { encodeFunctionData } from 'viem'\nimport { entryPoint07Abi } from 'viem/account-abstraction'\nimport { privateKeyToAccount } from 'viem/accounts'\n\nimport { requireActiveChainId } from '../../../context/LumiaPassportSessionContext'\nimport { fetchEntryPointNonce, pack2x128 } from '../../akHelpers'\nimport { signDigestWithMpc } from '../../lib/iframe-mpc-client'\nimport {\n COMPAT_CREATE_ABI,\n executeAbi,\n PAYMASTER_POSTOP_GAS_LIMIT,\n PAYMASTER_VERIFICATION_GAS_LIMIT,\n SALT_ZERO_UINT256\n} from './constants'\nimport { normalizeSignature } from './helpers'\nimport type { AccountSession } from './types'\n\n/**\n * Parameters for preparing a UserOperation\n */\nexport interface PrepareUserOperationParams {\n /** Target address for the transaction */\n to: `0x${string}`\n /** Amount in wei to send (as string) */\n value: string\n /** Call data for the transaction (optional, defaults to '0x') */\n data?: `0x${string}`\n /** Fee tier: 'economy', 'standard' (default), or 'fast' */\n feeType?: 'economy' | 'standard' | 'fast'\n /** Chain ID (optional - uses activeChainId from store if not provided) */\n chainId?: number\n}\n\n/**\n * Parameters for sending a UserOperation (UI-Kit layer)\n * Higher-level API compared to core/bundler UserOperationParams\n */\nexport interface SendUserOperationParams {\n /** Target address for the transaction */\n to: `0x${string}`\n /** Amount in wei to send (as string) */\n value: string\n /** Call data for the transaction (optional, defaults to '0x') */\n data?: `0x${string}`\n /** Fee tier: 'economy', 'standard' (default), or 'fast' */\n feeType?: 'economy' | 'standard' | 'fast'\n /** Chain ID (optional - uses activeChainId from store if not provided) */\n chainId?: number\n}\n\n/**\n * Prepare and sign a UserOperation without sending it to the bundler.\n * Returns the signed UserOp and its hash for backend verification and submission.\n * Uses object-based parameters with multi-chain support.\n *\n * @param session - Account session with signing credentials\n * @param params - Transaction parameters (to, value, data, feeType, chainId)\n * @returns Object with signed UserOperation and its hash\n *\n * @example\n * ```typescript\n * const { userOp, userOpHash } = await prepareUserOperation(session, {\n * to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',\n * value: '1000000000000000000',\n * data: '0x',\n * feeType: 'standard'\n * });\n * ```\n */\nexport async function prepareUserOperation(\n session: AccountSession,\n params: PrepareUserOperationParams\n): Promise<{ userOp: UserOperationV07; userOpHash: `0x${string}` }> {\n const chainId = params.chainId ?? requireActiveChainId()\n const chainConfig = getChainConfig(chainId)\n\n if (!chainConfig) {\n throw new Error(`Chain ${chainId} is not supported`)\n }\n\n const chainPublicClient = createPublicClientForChain(chainId)\n const bundlerUrl = chainConfig.bundlerUrl\n\n const {\n to: callTarget,\n value: amountWei,\n data: innerData = '0x',\n feeType = 'standard'\n } = params\n const entryPointAddress = chainConfig.entryPointV07Address\n const amountWeiBigInt = BigInt(amountWei)\n\n const isMinimalTest =\n callTarget === '0x0000000000000000000000000000000000000000' && amountWei === '0' && innerData === '0x'\n\n let callData: `0x${string}`\n if (isMinimalTest) {\n callData = '0x'\n } else {\n callData = encodeFunctionData({\n abi: executeAbi,\n functionName: 'execute',\n args: [callTarget, amountWeiBigInt, innerData]\n })\n }\n\n let isDeployed = false\n try {\n const code = await chainPublicClient.getCode({ address: session.smartAccountAddress })\n if (code && code !== '0x' && code.length > 2) {\n isDeployed = true\n }\n } catch {}\n\n const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress, {\n client: chainPublicClient\n })\n const nonceValue = BigInt(nonce)\n\n if (!isDeployed && nonceValue !== 0n) {\n throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`)\n }\n\n const shouldIncludeFactory = !isDeployed\n\n let userOp: UserOperationV07\n\n if (shouldIncludeFactory) {\n const factoryData = encodeFunctionData({\n abi: COMPAT_CREATE_ABI,\n functionName: 'createAccount',\n args: [session.ownerAddress, SALT_ZERO_UINT256]\n })\n\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: true,\n factoryAddress: session.factoryAddress,\n factoryData,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n )\n } else {\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: false,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n )\n }\n\n try {\n const gasEst = await estimateUserOperationGas(\n { ...userOp, signature: `0x${'00'.repeat(65)}` },\n { chainId: chainConfig.id, retryWithoutFactory: true }\n )\n console.log('[Account] Gas estimation from bundler:', { callGasLimit: gasEst.callGasLimit, verificationGasLimit: gasEst.verificationGasLimit, preVerificationGas: gasEst.preVerificationGas })\n userOp.callGasLimit = gasEst.callGasLimit\n userOp.verificationGasLimit = gasEst.verificationGasLimit\n userOp.preVerificationGas = gasEst.preVerificationGas\n } catch (e) {\n console.log('[Account] Gas estimation failed:', e)\n throw new Error(`Gas estimation failed: ${e}`)\n }\n\n if (session.usePaymaster && chainConfig.paymasterAddress) {\n userOp.paymaster = chainConfig.paymasterAddress\n userOp.paymasterData = '0x' as `0x${string}`\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT\n }\n\n userOp.nonce = nonce\n\n const hasFactoryData = !!(userOp.factory && userOp.factoryData)\n const initCode = hasFactoryData\n ? (() => {\n const factoryAddr = (userOp.factory as string).startsWith('0x')\n ? (userOp.factory as string).slice(2)\n : (userOp.factory as string)\n const factoryDataClean = (userOp.factoryData as string).startsWith('0x')\n ? (userOp.factoryData as string).slice(2)\n : (userOp.factoryData as string)\n return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`\n })()\n : ('0x' as `0x${string}`)\n\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit))\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas))\n\n let paymasterAndData: `0x${string}` = '0x'\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0'\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0'\n const paymasterDataField = userOp.paymasterData || '0x'\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit))\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x')\n ? (userOp.paymaster as string).slice(2)\n : (userOp.paymaster as string)\n const paymasterDataClean =\n paymasterDataField === '0x'\n ? ''\n : paymasterDataField.startsWith('0x')\n ? paymasterDataField.slice(2)\n : paymasterDataField\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`\n }\n\n const packedForHash = {\n sender: session.smartAccountAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n }\n\n const opHash = await (chainPublicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPoint07Abi,\n functionName: 'getUserOpHash',\n args: [packedForHash]\n })\n\n let signature: `0x${string}`\n if (session.mpcUserId) {\n signature = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData\n })\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey)\n const rawSig = await account.sign({ hash: opHash })\n signature = normalizeSignature(rawSig)\n } else {\n throw new Error('No signing method available')\n }\n\n userOp.signature = signature\n\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress\n }\n\n return { userOp, userOpHash: opHash }\n}\n\n/**\n * Send a user operation with multi-chain support.\n * Uses object-based parameters for better developer experience.\n *\n * @param session - Account session with signing credentials\n * @param params - Transaction parameters (to, value, data, feeType, chainId)\n * @returns Promise resolving to the user operation hash\n *\n * @example\n * ```typescript\n * const hash = await sendUserOperation(session, {\n * to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',\n * value: '1000000000000000000',\n * data: '0x',\n * feeType: 'standard'\n * });\n * ```\n */\nexport async function sendUserOperation(\n session: AccountSession,\n params: SendUserOperationParams\n): Promise<`0x${string}`> {\n const chainId = params.chainId ?? requireActiveChainId()\n const chainConfig = getChainConfig(chainId)\n\n if (!chainConfig) {\n throw new Error(`Chain ${chainId} is not supported`)\n }\n\n const chainPublicClient = createPublicClientForChain(chainId)\n const bundlerUrl = chainConfig.bundlerUrl\n\n const {\n to: callTarget,\n value: amountWei,\n data: innerData = '0x',\n feeType = 'standard'\n } = params\n\n const entryPointAddress = chainConfig.entryPointV07Address\n const amountWeiBigInt = BigInt(amountWei)\n\n const isMinimalTest =\n callTarget === '0x0000000000000000000000000000000000000000' && amountWei === '0' && innerData === '0x'\n\n let callData: `0x${string}`\n if (isMinimalTest) {\n callData = '0x'\n } else {\n callData = encodeFunctionData({\n abi: executeAbi,\n functionName: 'execute',\n args: [callTarget, amountWeiBigInt, innerData]\n })\n }\n\n let isDeployed = false\n try {\n const code = await chainPublicClient.getCode({ address: session.smartAccountAddress })\n if (code && code !== '0x' && code.length > 2) {\n isDeployed = true\n }\n } catch {}\n\n const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress, {\n client: chainPublicClient\n })\n const nonceValue = BigInt(nonce)\n\n if (!isDeployed && nonceValue !== 0n) {\n throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`)\n }\n\n const shouldIncludeFactory = !isDeployed\n\n let userOp: UserOperationV07\n\n if (shouldIncludeFactory) {\n const factoryData = encodeFunctionData({\n abi: COMPAT_CREATE_ABI,\n functionName: 'createAccount',\n args: [session.ownerAddress, SALT_ZERO_UINT256]\n })\n\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: true,\n factoryAddress: session.factoryAddress,\n factoryData,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n )\n } else {\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: false,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n )\n }\n\n try {\n const gasEst = await estimateUserOperationGas(\n { ...userOp, signature: `0x${'00'.repeat(65)}` },\n { chainId: chainConfig.id, retryWithoutFactory: true }\n )\n console.log('[Account] Gas estimation from bundler:', { callGasLimit: gasEst.callGasLimit, verificationGasLimit: gasEst.verificationGasLimit, preVerificationGas: gasEst.preVerificationGas })\n userOp.callGasLimit = gasEst.callGasLimit\n userOp.verificationGasLimit = gasEst.verificationGasLimit\n userOp.preVerificationGas = gasEst.preVerificationGas\n } catch (e) {\n console.log('[Account] Gas estimation failed:', e)\n throw new Error(`Gas estimation failed: ${e}`)\n }\n\n if (session.usePaymaster && chainConfig.paymasterAddress) {\n userOp.paymaster = chainConfig.paymasterAddress\n userOp.paymasterData = '0x' as `0x${string}`\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT\n }\n\n const signUserOp = async (nonce: `0x${string}`) => {\n userOp.nonce = nonce\n\n const hasFactoryData = !!(userOp.factory && userOp.factoryData)\n const initCode = hasFactoryData\n ? (() => {\n const factoryAddr = (userOp.factory as string).startsWith('0x')\n ? (userOp.factory as string).slice(2)\n : (userOp.factory as string)\n const factoryDataClean = (userOp.factoryData as string).startsWith('0x')\n ? (userOp.factoryData as string).slice(2)\n : (userOp.factoryData as string)\n return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`\n })()\n : ('0x' as `0x${string}`)\n\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit))\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas))\n\n let paymasterAndData: `0x${string}` = '0x'\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0'\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0'\n const paymasterDataField = userOp.paymasterData || '0x'\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit))\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x')\n ? (userOp.paymaster as string).slice(2)\n : (userOp.paymaster as string)\n const paymasterDataClean =\n paymasterDataField === '0x'\n ? ''\n : paymasterDataField.startsWith('0x')\n ? paymasterDataField.slice(2)\n : paymasterDataField\n paymasterAndData =\n `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`\n }\n\n const packedForHash = {\n sender: session.smartAccountAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n }\n\n const opHash = await (chainPublicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPoint07Abi,\n functionName: 'getUserOpHash',\n args: [packedForHash]\n })\n\n let signature: `0x${string}`\n if (session.mpcUserId) {\n signature = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n callTarget,\n value: amountWei\n })\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey)\n const rawSig = await account.sign({ hash: opHash })\n signature = normalizeSignature(rawSig)\n } else {\n throw new Error('No signing method available')\n }\n\n userOp.signature = signature\n\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress\n }\n\n return userOp\n }\n\n userOp = await signUserOp(nonce)\n\n const hash = await sendUserOperationWithRetry(userOp, signUserOp, { chainId, maxRetries: 1 })\n\n return hash\n}\n","import { createPublicClientForChain } from '@embarkai/core/read'\nimport type { AccountSession } from './types';\nimport { sendUserOperation } from './user-operations';\nimport { requireActiveChainId } from '@/src/context/LumiaPassportSessionContext'\n\n/**\n * Deploy smart account contract if not already deployed.\n *\n * This sends a minimal UserOperation (to 0x0, value 0, data 0x) which triggers\n * account deployment via factory without requiring user consent.\n *\n * By default, checks if account is already deployed to avoid unnecessary gas costs.\n * If already deployed, returns null without sending a transaction.\n *\n * @param session - Account session with signing credentials\n * @param feeType - Fee type: 'economy', 'standard', or 'fast' (default: 'economy')\n * @param options - Deployment options\n * @param options.force - If true, sends transaction even if already deployed (default: false)\n * @param options.chainId - Chain ID\n * @returns UserOperation hash if deployed, null if already deployed (when force=false)\n *\n * @example\n * ```typescript\n * // Deploy account immediately after DKG (skips if already deployed)\n * const userOpHash = await deployAccount(session, 'economy');\n * if (userOpHash) {\n * console.log('Account deployed:', userOpHash);\n * } else {\n * console.log('Account already deployed');\n * }\n *\n * // Force deployment even if already deployed (not recommended)\n * const hash = await deployAccount(session, 'economy', { force: true });\n * ```\n */\nexport async function deployAccount(\n session: AccountSession,\n feeType: 'economy' | 'standard' | 'fast' = 'economy',\n options?: { force?: boolean, chainId?: number }\n): Promise<`0x${string}` | null> {\n const chainId = options?.chainId ?? requireActiveChainId()\n // Check if account is already deployed (unless force=true)\n if (!options?.force) {\n const publicClient = createPublicClientForChain(chainId);\n try {\n const code = await publicClient.getCode({\n address: session.smartAccountAddress,\n });\n\n const isDeployed = code && code !== '0x' && code.length > 2;\n\n if (isDeployed) {\n console.log('[deployAccount] Account already deployed, skipping deployment');\n return null;\n }\n\n console.log('[deployAccount] Account not deployed, initiating deployment');\n } catch (error) {\n console.warn('[deployAccount] Failed to check deployment status, proceeding with deployment:', error);\n // Continue with deployment on error\n }\n }\n\n // Send minimal operation to trigger deployment (using legacy API for now)\n return sendUserOperation(\n session,\n {\n to: '0x0000000000000000000000000000000000000000', // to: burn address\n value: '0', // value: 0 (no funds)\n data: '0x', // data: empty (no contract call)\n feeType,\n chainId,\n }\n );\n}\n","import { getTssUrl } from '@/clients'\nimport { addProjectIdToUrl } from '@/utils/projectId'\nimport { jwtTokenManager } from '../../auth';\n\nexport interface SmartAccountEntry {\n chainId: number;\n address: string;\n factoryAddress?: string;\n registeredAt: string;\n}\n\nexport interface RegisterSmartAccountResult {\n success: boolean;\n chainId: number;\n smartAccountAddress: string;\n alreadySet: boolean;\n}\n\n/**\n * Register Smart Account address for a specific chain with TSS backend.\n * This is required for the wallet to be fully operational on each chain.\n *\n * The endpoint is idempotent - calling with the same address for the same chain is safe.\n *\n * @param chainId - The chain ID to register for\n * @param smartAccountAddress - The computed Smart Account address to register\n * @param factoryAddress - Optional factory address used to create the Smart Account\n * @returns Registration result with success status\n */\nexport async function registerSmartAccountAddress(\n chainId: number,\n smartAccountAddress: `0x${string}`,\n factoryAddress?: `0x${string}`\n): Promise<RegisterSmartAccountResult> {\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n console.warn('[Account] No access token available for Smart Account registration');\n // Return success without registering - will be registered on next session\n return { success: true, chainId, smartAccountAddress, alreadySet: false };\n }\n\n const tssUrl = getTssUrl();\n const url = addProjectIdToUrl(`${tssUrl}/api/tss/wallet/smart-account/chain`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n chainId,\n smartAccountAddress,\n ...(factoryAddress && { factoryAddress }),\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n\n // 409 means address already set to different value - log warning but don't throw\n if (response.status === 409) {\n console.warn('[Account] Smart Account address conflict for chain', chainId, ':', errorData.error);\n return { success: true, chainId, smartAccountAddress, alreadySet: true };\n }\n\n // 404 means DKG not completed - should not happen at this point\n if (response.status === 404) {\n console.warn('[Account] DKG not completed on server:', errorData.error);\n return { success: false, chainId, smartAccountAddress, alreadySet: false };\n }\n\n console.warn('[Account] Failed to register Smart Account:', errorData.error || response.statusText);\n return { success: false, chainId, smartAccountAddress, alreadySet: false };\n }\n\n const result = await response.json();\n console.log('[Account] Smart Account registered for chain', chainId, ':', {\n address: result.smartAccountAddress,\n alreadySet: result.alreadySet,\n });\n\n return result;\n } catch (error) {\n console.warn('[Account] Error registering Smart Account address:', error);\n // Don't throw - registration failure should not block session creation\n return { success: false, chainId, smartAccountAddress, alreadySet: false };\n }\n}\n\n/**\n * Get all registered Smart Accounts across all chains.\n *\n * @returns List of Smart Account entries with chain IDs\n */\nexport async function getAllSmartAccounts(): Promise<SmartAccountEntry[]> {\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n console.warn('[Account] No access token available');\n return [];\n }\n\n const tssUrl = getTssUrl();\n const url = addProjectIdToUrl(`${tssUrl}/api/tss/wallet/smart-accounts`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n console.warn('[Account] Failed to get Smart Accounts:', errorData.error || response.statusText);\n return [];\n }\n\n const result = await response.json();\n return result.smartAccounts || [];\n } catch (error) {\n console.warn('[Account] Error getting Smart Accounts:', error);\n return [];\n }\n}\n\n/**\n * Get Smart Account for a specific chain.\n *\n * @param chainId - The chain ID to get Smart Account for\n * @returns Smart Account entry or null if not registered\n */\nexport async function getSmartAccountForChain(chainId: number): Promise<SmartAccountEntry | null> {\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n console.warn('[Account] No access token available');\n return null;\n }\n\n const tssUrl = getTssUrl();\n const url = addProjectIdToUrl(`${tssUrl}/api/tss/wallet/smart-account/chain/${chainId}`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n },\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n console.warn('[Account] Failed to get Smart Account for chain', chainId, ':', errorData.error || response.statusText);\n return null;\n }\n\n return response.json();\n } catch (error) {\n console.warn('[Account] Error getting Smart Account for chain', chainId, ':', error);\n return null;\n }\n}","import { COMPAT_CREATE_ABI, executeAbi, SALT_ZERO_UINT256 } from '@/clients/account/constants';\nimport {\n createUserOperationWithDynamicFees,\n estimateUserOperationGas,\n sendUserOperationWithRetry\n} from '@embarkai/core/bundler';\nimport type { UserOperationV07 } from '@embarkai/core/bundler';\nimport { createPublicClientForChain, getChainConfig } from '@embarkai/core/read'\nimport { encodeFunctionData, hashTypedData, http, parseEther } from 'viem'\nimport { entryPoint07Abi } from 'viem/account-abstraction';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { requireActiveChainId, useLumiaPassportSession } from '../../context/LumiaPassportSessionContext';\nimport { fetchEntryPointNonce, pack2x128 } from '../akHelpers';\nimport { signDigestWithMpc, signTypedDataWithMpc } from '../lib/iframe-mpc-client';\n\nconst PAYMASTER_VERIFICATION_GAS_LIMIT: `0x${string}` = '0x249f0'\nconst PAYMASTER_POSTOP_GAS_LIMIT: `0x${string}` = '0x186a0'\n\n\nexport interface AccountSession {\n ownerAddress: `0x${string}`;\n smartAccountAddress: `0x${string}`;\n factoryAddress: `0x${string}`;\n ownerPrivateKey?: `0x${string}`;\n mpcUserId?: string;\n usePaymaster?: boolean;\n kind: 'lumia';\n address: `0x${string}`;\n}\n\nexport interface CreateAccountParams {\n privateKey?: `0x${string}`;\n mpcUserId?: string;\n mpcPin?: string;\n usePaymaster?: boolean;\n}\n\nfunction normalizeSignature(signature: `0x${string}`): `0x${string}` {\n const sig = signature.slice(2);\n const r = sig.slice(0, 64);\n const s = sig.slice(64, 128);\n const v = sig.slice(128, 130);\n const sBigInt = BigInt(`0x${s}`);\n const secp256k1n = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\n const secp256k1nHalf = secp256k1n >> 1n;\n let canonicalS = sBigInt;\n let canonicalV = parseInt(v, 16);\n if (sBigInt > secp256k1nHalf) {\n canonicalS = secp256k1n - sBigInt;\n canonicalV = canonicalV === 27 ? 28 : canonicalV === 28 ? 27 : canonicalV === 0 ? 1 : 0;\n }\n const canonicalSHex = canonicalS.toString(16).padStart(64, '0');\n const canonicalVHex = canonicalV.toString(16).padStart(2, '0');\n return `0x${r}${canonicalSHex}${canonicalVHex}` as `0x${string}`;\n}\n\n/**\n * Parameters for preparing a UserOperation\n */\nexport interface PrepareUserOperationParams {\n /** Target address for the transaction */\n to: `0x${string}`;\n /** Amount in wei to send (as string) */\n value: string;\n /** Call data for the transaction (optional, defaults to '0x') */\n data?: `0x${string}`;\n /** Fee tier: 'economy', 'standard' (default), or 'fast' */\n feeType?: 'economy' | 'standard' | 'fast';\n /** Chain ID (optional - uses activeChainId from store if not provided) */\n chainId?: number;\n}\n\n/**\n * Prepare and sign a UserOperation without sending it to the bundler.\n * Returns the signed UserOp and its hash for backend verification and submission.\n * Uses object-based parameters with multi-chain support.\n *\n * @param session - Account session with signing credentials\n * @param params - Transaction parameters (to, value, data, feeType, chainId)\n * @returns Object with signed UserOperation and its hash\n *\n * @example\n * ```typescript\n * const { userOp, userOpHash } = await prepareUserOperation(session, {\n * to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',\n * value: '1000000000000000000',\n * data: '0x',\n * feeType: 'standard'\n * });\n * ```\n */\nexport async function prepareUserOperation(\n session: AccountSession,\n params: PrepareUserOperationParams\n): Promise<{ userOp: UserOperationV07; userOpHash: `0x${string}` }> {\n // T033: ChainId fixation to prevent race conditions\n const chainId = params.chainId ?? requireActiveChainId();\n\n // T034: Create blockchain clients for the specified chain\n const chainConfig = getChainConfig(chainId);\n const chainPublicClient = createPublicClientForChain(chainId);\n const bundlerUrl = chainConfig.bundlerUrl;\n\n // Extract parameters with defaults\n const {\n to: callTarget,\n value: amountWei,\n data: innerData = '0x',\n feeType = 'standard'\n } = params;\n const entryPointAddress = chainConfig.entryPointV07Address;\n const amountWeiBigInt = BigInt(amountWei);\n\n // Check if this is a minimal test transaction\n const isMinimalTest = callTarget === '0x0000000000000000000000000000000000000000'\n && amountWei === '0'\n && innerData === '0x';\n\n // Encode call data\n let callData: `0x${string}`;\n if (isMinimalTest) {\n callData = '0x';\n } else {\n callData = encodeFunctionData({\n abi: executeAbi,\n functionName: 'execute',\n args: [callTarget, amountWeiBigInt, innerData]\n });\n }\n\n // T034: Use chainPublicClient instead of publicClient\n let isDeployed = false;\n try {\n const code = await chainPublicClient.getCode({ address: session.smartAccountAddress });\n if (code && code !== '0x' && code.length > 2) {\n isDeployed = true;\n }\n } catch {}\n\n // T034: Pass providedClient to fetchEntryPointNonce\n const nonce = await fetchEntryPointNonce(\n session.smartAccountAddress,\n entryPointAddress,\n { client: chainPublicClient }\n );\n const nonceValue = BigInt(nonce);\n\n if (!isDeployed && nonceValue !== 0n) {\n throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);\n }\n\n const shouldIncludeFactory = !isDeployed;\n\n let userOp: UserOperationV07;\n\n if (shouldIncludeFactory) {\n const factoryData = encodeFunctionData({\n abi: COMPAT_CREATE_ABI,\n functionName: 'createAccount',\n args: [session.ownerAddress, SALT_ZERO_UINT256]\n });\n\n // T034: Pass providedClient and bundlerUrl to createUserOperationWithDynamicFees\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: true,\n factoryAddress: session.factoryAddress,\n factoryData,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n );\n } else {\n // T034: Pass providedClient and bundlerUrl to createUserOperationWithDynamicFees\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: false,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n );\n }\n\n // Add paymaster BEFORE estimation so preVerificationGas includes paymaster data size\n // Read usePaymaster from store directly to avoid race condition with session creation\n const storeUsePaymaster = useLumiaPassportSession.getState().usePaymaster;\n const shouldUsePaymaster = storeUsePaymaster ?? session.usePaymaster;\n if (shouldUsePaymaster && chainConfig.paymasterAddress) {\n userOp.paymaster = chainConfig.paymasterAddress;\n userOp.paymasterData = '0x' as `0x${string}`;\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;\n }\n\n try {\n const gasEst = await estimateUserOperationGas(userOp, { chainId, retryWithoutFactory: true });\n console.log('[Account] Gas estimation from bundler:', { callGasLimit: gasEst.callGasLimit, verificationGasLimit: gasEst.verificationGasLimit, preVerificationGas: gasEst.preVerificationGas });\n userOp.callGasLimit = gasEst.callGasLimit;\n userOp.verificationGasLimit = gasEst.verificationGasLimit;\n userOp.preVerificationGas = gasEst.preVerificationGas;\n } catch (e) {\n console.log('[Account] Gas estimation failed:', e);\n throw new Error(`Gas estimation failed: ${e}`);\n }\n\n // Calculate UserOp hash\n userOp.nonce = nonce;\n\n const hasFactoryData = !!(userOp.factory && userOp.factoryData);\n const initCode = hasFactoryData ? (() => {\n const factoryAddr = (userOp.factory as string).startsWith('0x') ? (userOp.factory as string).slice(2) : (userOp.factory as string);\n const factoryDataClean = (userOp.factoryData as string).startsWith('0x') ? (userOp.factoryData as string).slice(2) : (userOp.factoryData as string);\n return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`;\n })() : ('0x' as `0x${string}`);\n\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));\n\n let paymasterAndData: `0x${string}` = '0x';\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0';\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0';\n const paymasterDataField = userOp.paymasterData || '0x';\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x') ? (userOp.paymaster as string).slice(2) : (userOp.paymaster as string);\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`;\n }\n\n const packedForHash = {\n sender: session.smartAccountAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n };\n\n const opHash = await (chainPublicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPoint07Abi,\n functionName: 'getUserOpHash',\n args: [packedForHash]\n });\n\n // Sign the UserOp\n let signature: `0x${string}`;\n if (session.mpcUserId) {\n signature = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n });\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey);\n const rawSig = await account.sign({ hash: opHash });\n signature = normalizeSignature(rawSig);\n } else {\n throw new Error('No signing method available');\n }\n\n userOp.signature = signature;\n\n // Ensure sender is always a string\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress;\n }\n\n return { userOp, userOpHash: opHash };\n}\n\n/**\n * EIP712 Domain descriptor\n */\nexport interface TypedDataDomain {\n name?: string;\n version?: string;\n chainId?: number;\n verifyingContract?: `0x${string}`;\n salt?: `0x${string}`;\n}\n\n/**\n * EIP712 Type definition\n */\nexport interface TypedDataField {\n name: string;\n type: string;\n}\n\n/**\n * Parameters for signing typed data (EIP712)\n */\n/**\n * Parameters for sending or preparing a UserOperation (UI-Kit layer)\n * Higher-level API compared to core/bundler UserOperationParams\n */\nexport interface SendUserOperationParams {\n /** Target address for the transaction */\n to: `0x${string}`;\n /** Amount in wei to send (as string) */\n value: string;\n /** Call data for the transaction (optional, defaults to '0x') */\n data?: `0x${string}`;\n /** Fee tier: 'economy', 'standard' (default), or 'fast' */\n feeType?: 'economy' | 'standard' | 'fast';\n /** Chain ID (optional - uses activeChainId from store if not provided) */\n chainId?: number;\n}\n\n/**\n * Send a user operation with multi-chain support.\n * Uses object-based parameters for better developer experience.\n *\n * @param session - Account session with signing credentials\n * @param params - Transaction parameters (to, value, data, feeType, chainId)\n * @returns Promise resolving to the user operation hash\n *\n * @example\n * ```typescript\n * const hash = await sendUserOperation(session, {\n * to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',\n * value: '1000000000000000000', // 1 ETH in wei\n * data: '0x',\n * feeType: 'standard'\n * });\n * ```\n */\nexport async function sendUserOperation(\n session: AccountSession,\n params: SendUserOperationParams\n): Promise<`0x${string}`> {\n // T030: ChainId fixation to prevent race conditions\n const chainId = params.chainId ?? requireActiveChainId();\n\n // T031: Create blockchain clients for the specified chain\n const chainConfig = getChainConfig(chainId);\n const chainPublicClient = createPublicClientForChain(chainId);\n const bundlerUrl = chainConfig.bundlerUrl;\n\n // Extract parameters with defaults\n const {\n to: callTarget,\n value: amountWei,\n data: innerData = '0x',\n feeType = 'standard'\n } = params;\n\n const entryPointAddress = chainConfig.entryPointV07Address;\n const amountWeiBigInt = BigInt(amountWei);\n\n // Check if this is a minimal test transaction\n const isMinimalTest = callTarget === '0x0000000000000000000000000000000000000000'\n && amountWei === '0'\n && innerData === '0x';\n\n // Encode call data\n let callData: `0x${string}`;\n if (isMinimalTest) {\n callData = '0x';\n } else {\n callData = encodeFunctionData({\n abi: executeAbi,\n functionName: 'execute',\n args: [callTarget, amountWeiBigInt, innerData]\n });\n }\n\n // Check if account is deployed\n let isDeployed = false;\n try {\n const code = await chainPublicClient.getCode({ address: session.smartAccountAddress });\n if (code && code !== '0x' && code.length > 2) {\n isDeployed = true;\n }\n } catch {}\n\n // T032: Pass providedClient to fetchEntryPointNonce\n const nonce = await fetchEntryPointNonce(\n session.smartAccountAddress,\n entryPointAddress,\n { client: chainPublicClient }\n );\n const nonceValue = BigInt(nonce);\n\n if (!isDeployed && nonceValue !== 0n) {\n throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);\n }\n\n const shouldIncludeFactory = !isDeployed;\n\n let userOp: UserOperationV07;\n\n if (shouldIncludeFactory) {\n const factoryData = encodeFunctionData({\n abi: COMPAT_CREATE_ABI,\n functionName: 'createAccount',\n args: [session.ownerAddress, SALT_ZERO_UINT256]\n });\n\n // T032: Pass providedClient and bundlerUrl to createUserOperationWithDynamicFees\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: true,\n factoryAddress: session.factoryAddress,\n factoryData,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n );\n } else {\n // T032: Pass providedClient and bundlerUrl to createUserOperationWithDynamicFees\n userOp = await createUserOperationWithDynamicFees(\n {\n sender: session.smartAccountAddress,\n nonce,\n callData,\n includeFactory: false,\n feeType\n },\n { client: chainPublicClient, bundlerUrl, chainConfig }\n );\n }\n\n // Add paymaster BEFORE estimation so preVerificationGas includes paymaster data size\n // Read usePaymaster from store directly to avoid race condition with session creation\n const storeUsePaymaster = useLumiaPassportSession.getState().usePaymaster;\n const shouldUsePaymaster = storeUsePaymaster ?? session.usePaymaster;\n if (shouldUsePaymaster && chainConfig.paymasterAddress) {\n userOp.paymaster = chainConfig.paymasterAddress;\n userOp.paymasterData = '0x' as `0x${string}`;\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;\n }\n\n // Estimate gas - T032: Pass bundlerUrl to estimateUserOperationGas\n try {\n const gasEst = await estimateUserOperationGas(userOp, {\n chainId,\n retryWithoutFactory: true,\n });\n console.log('[Account] Gas estimation from bundler:', { callGasLimit: gasEst.callGasLimit, verificationGasLimit: gasEst.verificationGasLimit, preVerificationGas: gasEst.preVerificationGas });\n userOp.callGasLimit = gasEst.callGasLimit;\n userOp.verificationGasLimit = gasEst.verificationGasLimit;\n userOp.preVerificationGas = gasEst.preVerificationGas;\n } catch (e) {\n console.log('[Account] Gas estimation failed:', e);\n throw new Error(`Gas estimation failed: ${e}`);\n }\n\n // Sign user operation\n const signUserOp = async (nonce: `0x${string}`) => {\n userOp.nonce = nonce;\n\n const hasFactoryData = !!(userOp.factory && userOp.factoryData);\n const initCode = hasFactoryData\n ? (() => {\n const factoryAddr = (userOp.factory as string).startsWith('0x')\n ? (userOp.factory as string).slice(2)\n : (userOp.factory as string);\n const factoryDataClean = (userOp.factoryData as string).startsWith('0x')\n ? (userOp.factoryData as string).slice(2)\n : (userOp.factoryData as string);\n return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`;\n })()\n : ('0x' as `0x${string}`);\n\n const accountGasLimits = pack2x128(\n BigInt(userOp.verificationGasLimit),\n BigInt(userOp.callGasLimit)\n );\n const gasFees = pack2x128(\n BigInt(userOp.maxPriorityFeePerGas),\n BigInt(userOp.maxFeePerGas)\n );\n\n let paymasterAndData: `0x${string}` = '0x';\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0';\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0';\n const paymasterDataField = userOp.paymasterData || '0x';\n const packedPaymasterGasLimits = pack2x128(\n BigInt(verificationGasLimit),\n BigInt(postOpGasLimit)\n );\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x')\n ? (userOp.paymaster as string).slice(2)\n : (userOp.paymaster as string);\n const paymasterDataClean = paymasterDataField === '0x'\n ? ''\n : paymasterDataField.startsWith('0x')\n ? paymasterDataField.slice(2)\n : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`;\n }\n\n const packedForHash = {\n sender: session.smartAccountAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n };\n\n const opHash = await (chainPublicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPoint07Abi,\n functionName: 'getUserOpHash',\n args: [packedForHash]\n });\n\n // Sign the operation hash\n let signature: `0x${string}`;\n if (session.mpcUserId) {\n signature = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n callTarget,\n value: amountWei,\n });\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey);\n const rawSig = await account.sign({ hash: opHash });\n signature = normalizeSignature(rawSig);\n } else {\n throw new Error('No signing method available');\n }\n\n userOp.signature = signature;\n\n // Ensure sender is always a string\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress;\n }\n\n return userOp;\n };\n\n // Sign the user operation\n userOp = await signUserOp(nonce);\n\n // Submit to bundler\n const hash = await sendUserOperationWithRetry(userOp, signUserOp, { maxRetries: 1, chainId });\n\n return hash;\n}\n\n/**\n * Parameters for EIP-712 typed data signing\n */\nexport interface SignTypedDataParams {\n domain: TypedDataDomain;\n types: Record<string, TypedDataField[]>;\n primaryType: string;\n message: Record<string, any>;\n /** Chain ID (optional - overrides domain.chainId if provided) */\n chainId?: number;\n}\n\n/**\n * Sign typed data according to EIP712 standard.\n * This method computes the EIP712 hash and signs it using MPC.\n *\n * @param session - Account session with signing credentials\n * @param params - EIP712 typed data parameters (domain, types, primaryType, message)\n * @returns Hex-encoded signature\n *\n * @example\n * ```typescript\n * const signature = await signTypedData(session, {\n * domain: {\n * name: 'MyApp',\n * version: '1',\n * chainId: 994,\n * verifyingContract: '0x...'\n * },\n * types: {\n * Order: [\n * { name: 'tokenIds', type: 'uint256[]' },\n * { name: 'price', type: 'uint256' },\n * { name: 'deadline', type: 'uint256' }\n * ]\n * },\n * primaryType: 'Order',\n * message: {\n * tokenIds: [1n, 2n, 3n],\n * price: 1000000000000000000n,\n * deadline: 1735689600n\n * }\n * });\n * ```\n */\nexport async function signTypedData(\n session: AccountSession,\n params: SignTypedDataParams\n): Promise<`0x${string}`> {\n const { domain, types, primaryType, message, chainId: paramsChainId } = params;\n\n // T036: Validate chainId consistency\n if (paramsChainId !== undefined && domain.chainId !== undefined && paramsChainId !== domain.chainId) {\n console.warn(\n `[signTypedData] Warning: params.chainId (${paramsChainId}) differs from domain.chainId (${domain.chainId}). ` +\n `Using domain.chainId for EIP712 hash computation.`\n );\n }\n\n // Compute EIP712 hash\n const digest = hashTypedData({\n domain,\n types,\n primaryType,\n message\n } as any);\n\n // Helper function to convert BigInt values to strings for JSON serialization\n const serializeForIframe = (obj: any): any => {\n if (typeof obj === 'bigint') {\n return obj.toString();\n }\n if (Array.isArray(obj)) {\n return obj.map(serializeForIframe);\n }\n if (obj !== null && typeof obj === 'object') {\n const result: Record<string, any> = {};\n for (const key in obj) {\n result[key] = serializeForIframe(obj[key]);\n }\n return result;\n }\n return obj;\n };\n\n // Sign using MPC or private key\n let signature: `0x${string}`;\n\n if (session.mpcUserId) {\n // Use EIP712-specific MPC signing that shows structured data in confirmation modal\n // Convert BigInt values to strings for iframe communication\n signature = await signTypedDataWithMpc(\n session.mpcUserId,\n digest,\n {\n domain: {\n name: domain.name,\n version: domain.version,\n chainId: domain.chainId,\n verifyingContract: domain.verifyingContract,\n salt: domain.salt,\n },\n types,\n primaryType,\n message: serializeForIframe(message),\n }\n );\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey);\n const rawSig = await account.sign({ hash: digest });\n signature = normalizeSignature(rawSig);\n } else {\n throw new Error('No signing method available');\n }\n\n return signature;\n}\n\nexport {depositForSmartAccount} from './account/deposit-for-smart-account'\nexport { deployAccount } from './account/deploy-account';\nexport { getAllSmartAccounts, getSmartAccountForChain } from './account/register-smart-account-address';\nexport type { SmartAccountEntry, RegisterSmartAccountResult } from './account/register-smart-account-address';","import { privateKeyToAccount } from 'viem/accounts'\nimport { getChainConfig, createPublicClientForChain } from '@embarkai/core/read'\n\nimport { ensureDkgAndGetOwner } from '../../lib/iframe-mpc-client'\nimport { SALT_ZERO } from './constants'\nimport { predictCompatAddress } from './helpers'\nimport type { AccountSession } from './types'\nimport { registerSmartAccountAddress } from './register-smart-account-address'\n\nexport interface CreateAccountParams {\n privateKey?: `0x${string}`\n mpcUserId?: string\n mpcPin?: string\n usePaymaster?: boolean\n chainId: number\n}\n\nexport async function createAccountSession(params: CreateAccountParams): Promise<AccountSession> {\n const { privateKey, mpcUserId, usePaymaster = false, chainId } = params\n if (!privateKey && !mpcUserId) throw new Error('Either privateKey or mpcUserId must be provided')\n if (!privateKey && mpcUserId && !mpcUserId.trim()) throw new Error('mpcUserId cannot be empty when using MPC mode')\n \n // Get chain configuration\n const chainConfig = getChainConfig(chainId)\n if (!chainConfig) {\n throw new Error(`Chain ${chainId} is not supported`)\n }\n\n const factoryAddress = chainConfig.factoryAddress\n if (!factoryAddress) {\n throw new Error(`Factory address not configured for chain ${chainId}`)\n }\n\n // Create public client for this chain\n const publicClient = createPublicClientForChain(chainId)\n\n let ownerAddress: `0x${string}`\n let ownerPrivateKey: `0x${string}` | undefined\n if (privateKey) {\n const account = privateKeyToAccount(privateKey)\n ownerAddress = account.address\n ownerPrivateKey = privateKey\n } else if (mpcUserId) {\n const dkgResult = await ensureDkgAndGetOwner(mpcUserId)\n if (!dkgResult.ownerAddress) throw new Error('Failed to get owner address from DKG')\n ownerAddress = dkgResult.ownerAddress\n } else {\n throw new Error('Either privateKey or mpcUserId must be provided')\n }\n\n const smartAccountAddress = await predictCompatAddress(ownerAddress, factoryAddress, SALT_ZERO, { client: publicClient })\n\n // Register Smart Account address with TSS backend for this chain (required after DKG)\n // This is idempotent and non-blocking - failure doesn't prevent session creation\n if (mpcUserId) {\n registerSmartAccountAddress(chainId, smartAccountAddress, factoryAddress).catch((error) => {\n console.warn('[Account] Background Smart Account registration failed:', error);\n });\n }\n\n return {\n ownerAddress,\n smartAccountAddress,\n factoryAddress,\n ownerPrivateKey,\n mpcUserId: privateKey ? undefined : mpcUserId,\n usePaymaster,\n kind: 'lumia',\n address: smartAccountAddress\n }\n}\n","import { requireActiveChainId } from '@/src'\nimport { createPublicClientForChain, getChainConfig } from '@embarkai/core/read'\n\nexport async function getEntryPointDeposit(\n address: `0x${string}`\n): Promise<bigint> {\n const chainId = requireActiveChainId();\n const chainConfig = getChainConfig(chainId);\n const publicClient = createPublicClientForChain(chainId);\n\n const entryPointAddress = chainConfig.entryPointV07Address;\n const depositAbi = [ { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }], outputs: [{ name: '', type: 'uint256' }] } ] as const;\n return await (publicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: depositAbi,\n functionName: 'balanceOf',\n args: [address]\n } as any);\n}","import {\n sendUserOperation,\n depositForSmartAccount,\n type AccountSession,\n type CreateAccountParams,\n} from './account';\n\nimport { createAccountSession } from './account/session'\nimport { getEntryPointDeposit } from './account/get-entry-point-deposit'\n\nexport {\n createAccountSession,\n sendUserOperation,\n depositForSmartAccount,\n getEntryPointDeposit,\n type AccountSession,\n type CreateAccountParams,\n};","/**\n * Nickname API client\n * Functions for nickname-related API operations\n */\n\nimport { tssClient } from './httpClient';\nimport type {\n NicknameInfo,\n NicknameChangeResult,\n NicknameAvailability,\n NicknameResolution,\n NicknameChangeRequest,\n NicknameResolveRequest\n} from './nickname-types';\n\n/**\n * Get detailed nickname information for authenticated user\n * GET /api/auth/nickname\n */\nexport async function getNicknameInfo(): Promise<NicknameInfo> {\n const response = await tssClient.get<NicknameInfo>('/api/auth/nickname', true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to fetch nickname info';\n throw new Error(error);\n }\n\n return response.data;\n}\n\n/**\n * Change nickname for authenticated user\n * PUT /api/auth/nickname\n */\nexport async function changeNickname(handle: string): Promise<NicknameChangeResult> {\n const body: NicknameChangeRequest = { handle: handle.toLowerCase() };\n const response = await tssClient.put<NicknameChangeResult>('/api/auth/nickname', body, true);\n\n if (!response.success || !response.data) {\n const errorPayload = (response.data as any) || {};\n const errorMessage = response.error || errorPayload.error || 'Failed to change nickname';\n const err: any = new Error(errorMessage);\n err.error = errorMessage;\n err.code = errorPayload.code || 'UNKNOWN_ERROR';\n if (errorPayload.daysRemaining !== undefined) {\n err.daysRemaining = errorPayload.daysRemaining;\n }\n if (errorPayload.canChangeAt !== undefined) {\n err.canChangeAt = errorPayload.canChangeAt;\n }\n throw err;\n }\n\n return response.data;\n}\n\n/**\n * Check if a nickname is available (public endpoint)\n * POST /api/auth/nicknames/check\n */\nexport async function checkNicknameAvailability(handle: string): Promise<NicknameAvailability> {\n const normalizedHandle = handle.toLowerCase().replace(/^@/, '');\n const response = await tssClient.post<NicknameAvailability>(\n '/api/auth/nicknames/check',\n { handle: normalizedHandle },\n false // Public endpoint, no auth required\n );\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to check nickname availability';\n throw new Error(error);\n }\n\n return response.data;\n}\n\n/**\n * Resolve nickname to wallet address (public endpoint)\n * POST /api/auth/nicknames/resolve\n *\n * @param handle - The nickname handle to resolve\n * @param chainId - The target chain ID for resolution\n * @returns Resolved nickname data including wallet address and verification info\n */\nexport async function resolveNickname(\n handle: string,\n chainId: number\n): Promise<NicknameResolution> {\n const normalizedHandle = handle.toLowerCase().replace(/^@/, '');\n const body: NicknameResolveRequest = {\n handle: normalizedHandle,\n chainId\n };\n const response = await tssClient.post<NicknameResolution>(\n '/api/auth/nicknames/resolve',\n body,\n false // Public endpoint, no auth required\n );\n\n if (!response.success || !response.data) {\n // Preserve error code for specific error handling\n const errorData = (response.data as any) || {};\n if (errorData.code === 'NICKNAME_NOT_FOUND') {\n const error = new Error('Nickname not found') as any;\n error.code = 'NICKNAME_NOT_FOUND';\n throw error;\n }\n throw new Error(response.error || 'Failed to resolve nickname');\n }\n\n return response.data;\n}\n","/**\n * Nickname API types\n * Types for nickname-related API responses and requests\n */\n\n/**\n * Detailed nickname information\n * Returned by GET /api/auth/nickname\n */\nexport interface NicknameInfo {\n handle: string;\n displayHandle: string;\n createdAt: string;\n changedAt: string | null;\n changeCount: number;\n canChange: boolean;\n cooldownEndsAt: string | null;\n}\n\n/**\n * Result of changing nickname\n * Returned by PUT /api/auth/nickname\n */\nexport interface NicknameChangeResult {\n handle: string;\n displayHandle: string;\n previousHandle: string;\n isFirstChange: boolean;\n}\n\n/**\n * Nickname availability check result\n * Returned by GET /api/auth/nicknames/{handle}/check\n */\nexport interface NicknameAvailability {\n handle: string;\n available: boolean;\n reason?: NicknameUnavailableReason;\n}\n\nexport type NicknameUnavailableReason =\n | 'TAKEN'\n | 'RESERVED'\n | 'TOO_SHORT'\n | 'TOO_LONG'\n | 'INVALID_CHARS'\n | 'INVALID_UNDERSCORE';\n\n/**\n * Resolved target for a specific chain\n */\nexport interface NicknameResolvedTarget {\n chainId: number;\n wallet: `0x${string}`;\n}\n\n/**\n * Avatar information for nickname resolution\n */\nexport interface NicknameAvatar {\n type: 'deterministic-circles';\n seed: string; // owner address\n}\n\n/**\n * Nickname to wallet address resolution (v2)\n * Returned by POST /api/auth/nicknames/resolve\n */\nexport interface NicknameResolution {\n handle: string; // \"@nordic_wolf7\"\n requestedChainId: number;\n resolvedTarget: NicknameResolvedTarget | null; // null if wallet not set up\n availableTargets: NicknameResolvedTarget[]; // All supported chains\n owner: `0x${string}` | null; // EOA address (for verification)\n fingerprint: string | null; // \"K7Q4-M2P9\" (anti-phishing)\n avatar: NicknameAvatar | null;\n avatarSvg: string | null; // Data URI (e.g., \"data:image/svg+xml;...\")\n isFrozen: boolean; // If true, show warning\n}\n\n/**\n * Request body for resolving nickname (v2)\n */\nexport interface NicknameResolveRequest {\n handle: string;\n chainId: number;\n}\n\n/**\n * @deprecated Use NicknameResolution instead - kept for backwards compatibility\n */\nexport interface NicknameResolutionLegacy {\n handle: string;\n displayHandle: string;\n walletAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n}\n\n/**\n * Client-side nickname validation result\n */\nexport interface NicknameValidationResult {\n valid: boolean;\n error?: NicknameValidationError;\n}\n\nexport type NicknameValidationError =\n | 'TOO_SHORT'\n | 'TOO_LONG'\n | 'INVALID_CHARS'\n | 'INVALID_UNDERSCORE';\n\n/**\n * Nickname change error codes\n */\nexport type NicknameChangeErrorCode =\n | 'INVALID_FORMAT'\n | 'NICKNAME_TAKEN'\n | 'NICKNAME_RESERVED'\n | 'COOLDOWN_ACTIVE';\n\n/**\n * Nickname change error response\n */\nexport interface NicknameChangeError {\n error: string;\n code: NicknameChangeErrorCode;\n daysRemaining?: number;\n canChangeAt?: string;\n}\n\n/**\n * Nickname resolve error response\n */\nexport interface NicknameResolveError {\n error: string;\n code: 'NICKNAME_NOT_FOUND';\n}\n\n/**\n * Request body for changing nickname\n */\nexport interface NicknameChangeRequest {\n handle: string;\n}\n","export * from './base';\nexport * from './account';\nexport * from './utils';\nexport * from './nickname';\nexport * from './nickname-types';\n","import { useCallback, useEffect, useRef } from 'react'\n\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext'\nimport { PageKey, useLayoutDataStore } from './useLayoutDataStore'\n\nexport function useAutoConnect() {\n const {\n config: { current: config },\n callbacks\n } = useLumiaPassportConfig()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const {\n session,\n address,\n usePaymaster,\n publicClient,\n activeChainId,\n setSession,\n setAddress,\n setStatus,\n setHasServerVault,\n setError,\n setRecoveryUserId,\n setIsIframeReady,\n setIsLoading\n } = useLumiaPassportSession()\n\n // Internal function to create session with keyshare (doesn't depend on TssManager component)\n const createSessionWithKeyshare = useCallback(\n async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n try {\n // Notify that wallet connection process is starting\n try {\n callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' })\n } catch {}\n\n setStatus('checking key management setup...')\n\n const { ensureKeyshare } = await import('../auth')\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser)\n\n setStatus('creating smart account...')\n\n const { createAccountSession, getEntryPointDeposit } = await import('../clients')\n\n const sess = await createAccountSession({\n mpcUserId: userId,\n mpcPin: undefined,\n usePaymaster,\n chainId: activeChainId,\n })\n\n const addr = sess.address || sess.smartAccountAddress\n setStatus('loading account data...')\n\n if (!publicClient) {\n throw new Error('Public client not initialized. Store may not be hydrated yet.')\n }\n\n try {\n await getEntryPointDeposit(addr)\n } catch {}\n\n return { session: sess, address: addr }\n } catch (error: any) {\n // Don't reset status for recovery errors - caller will set the correct status\n if (error?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n setStatus('idle')\n setPage(PageKey.KEYSHARE_RESTORE)\n }\n\n throw error // Re-throw so caller can handle specific errors\n }\n },\n [usePaymaster, setStatus, callbacks, activeChainId]\n )\n\n // Auto-connect on refresh if valid tokens present\n const autoConnectAttemptedRef = useRef(false)\n\n useEffect(() => {\n // Skip if already attempted in this session\n if (autoConnectAttemptedRef.current) return\n\n setIsLoading(true)\n\n // TODO: useMutation\n const tryAutoConnect = async (attempt: number) => {\n console.log('[AUTOCONNECT] attempt', attempt)\n\n if (address || session) {\n setIsLoading(false)\n return\n }\n\n // Skip auto-connect if projectId not configured\n if (!config.projectId) {\n setIsLoading(false)\n return\n }\n\n // IMPORTANT: Wait for iframe to be ready before proceeding\n try {\n const { waitForIframe } = await import('../lib/iframe-manager')\n\n await waitForIframe()\n\n setIsIframeReady(true)\n //\n } catch (iframeError) {\n console.error('[UI-KIT][AutoConnect] Failed to initialize iframe:', iframeError)\n\n setIsIframeReady(false)\n // Retry after delay\n if (attempt < 20) {\n setTimeout(() => tryAutoConnect(attempt + 1), 500)\n }\n return\n }\n\n // Step 1: Ensure we have a valid access token (refresh if needed)\n const { ensureValidToken } = await import('../auth')\n\n const hasValid = await ensureValidToken()\n\n console.log('[AUTOCONNECT] Step 1: Ensure access token is valid', hasValid)\n\n if (!hasValid) {\n setIsLoading(false)\n return\n }\n\n const { jwtTokenManager } = await import('../auth')\n\n // Step 2: Verify token and get user info\n const { verifyToken } = await import('../auth')\n const verify = await verifyToken()\n\n // Get userId from token manager first, fallback to verify response (cookie-based auth)\n let userId = jwtTokenManager.getUserId()\n if (!userId && verify?.userId) {\n console.log('[UI-KIT][AutoConnect] Using userId from verify response (cookie-based auth)')\n userId = verify.userId\n }\n\n const hasKeyshare = jwtTokenManager.getHasKeyshare()\n\n if (!userId) {\n console.warn('[UI-KIT][AutoConnect] No userId found in tokens or verify response')\n setIsLoading(false)\n return\n }\n\n // Use hasKeyshare from verification if available, otherwise use from token manager\n const finalHasKeyshare = verify?.hasKeyshare ?? hasKeyshare ?? false\n\n try {\n callbacks?.onLumiaPassportAccount?.({ userId, address: null, session: null, hasKeyshare: finalHasKeyshare })\n } catch {}\n\n try {\n // Step 3: Create session with keyshare\n const jwt = await import('../auth').then((m) => m.jwtTokenManager.getTokens())\n\n const { session: sess, address: addr } = await createSessionWithKeyshare(\n userId,\n finalHasKeyshare,\n jwt?.isNewUser\n )\n\n setSession(sess)\n setAddress(addr)\n setStatus('ready')\n setIsLoading(false)\n\n try {\n callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess })\n } catch {}\n\n try {\n callbacks?.onLumiaPassportAccount?.({\n userId,\n address: addr,\n session: sess,\n hasKeyshare: finalHasKeyshare\n })\n } catch {}\n\n // Authenticate with iframe to trigger wallet ready check\n if (config.projectId) {\n try {\n const { getIframeManager } = await import('../lib/iframe-manager')\n\n const iframeManager = getIframeManager()\n\n await iframeManager.authenticate(userId)\n } catch (e) {\n console.warn('[UI-KIT][AutoConnect] iframe authentication failed:', e)\n }\n }\n\n // Step 4: Update vault status\n try {\n const { checkServerBackupAvailability, updateBackupStatus, getShareRecoveryStats } = await import(\n '../vaultClient'\n )\n const result = await checkServerBackupAvailability()\n\n if (result.hasBackup)\n updateBackupStatus(userId, 'server', {\n enabled: true,\n lastBackup: Date.now()\n })\n else\n updateBackupStatus(userId, 'server', {\n enabled: false,\n error: 'No server vault found'\n })\n\n // Update vault status indicator\n const stats = await getShareRecoveryStats()\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0))\n\n setHasServerVault(!!hasRecoveryData)\n } catch (e) {\n console.warn('[UI-KIT][AutoConnect] Vault status check failed:', e)\n }\n } catch (e: any) {\n if (e?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n // Set recovery state to open the recovery modal\n setRecoveryUserId(userId)\n setError(null)\n setStatus('recovery_needed')\n setIsLoading(false)\n\n setTimeout(() => {\n setPage(PageKey.KEYSHARE_RESTORE)\n }, 500)\n } else {\n console.warn('[UI-KIT][AutoConnect] Unexpected error during auto-connect:', e)\n setIsLoading(false)\n }\n }\n }\n\n autoConnectAttemptedRef.current = true\n tryAutoConnect(0)\n }, [])\n\n return null\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { useEffect } from 'react'\n\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext'\nimport { getShareRecoveryStats } from '../vaultClient'\nimport { PageKey, useLayoutDataStore } from './useLayoutDataStore'\n\ninterface CustomEventDetail {\n method?: string\n success?: boolean\n navigateToMainMenu?: boolean\n}\n\n// const NO_BACKUP_WARN_DELAY_MS = 5000\n/** Listen for backup status changes and update vault status accordingly */\nexport function useBackupStatusChanges() {\n const setHasServerVault = useLumiaPassportSession((st) => st.setHasServerVault)\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const { mutate: handleBackupStatusChanged } = useMutation({\n mutationFn: async (event: Event) => {\n const customEvent = event as CustomEvent<CustomEventDetail>\n console.log('[BACKUP STATUS] changed:', customEvent?.detail)\n\n return { stats: await getShareRecoveryStats(), detail: customEvent?.detail }\n },\n\n onSuccess: ({ stats, detail }) => {\n const hasRecoveryData = stats && (!!stats.created || !!stats?.devices?.length)\n\n if (!!hasRecoveryData) {\n console.log(\n '[BACKUP STATUS] Recovery data found after backup status change.\\n Redirect to main menu:',\n detail?.navigateToMainMenu\n )\n\n setHasServerVault(true)\n\n // redirecting only for new firstcomer users who just created backup\n if (!!detail?.navigateToMainMenu) {\n // setTimeout(() => setPage(PageKey.MAIN_MENU), 1000) // navigate back to main menu after backup\n setTimeout(() => setPage(null), 1000) // close any open menu after backup created for new users\n }\n console.info('[BACKUP STATUS] Recovery data found in vault, marking as has-server-vault')\n } else {\n setHasServerVault(false)\n setPage(PageKey.KEYSARE_BACKUP)\n console.warn('[BACKUP STATUS] No recovery data found in vault, marking as no-server-vault')\n }\n },\n\n onError: (error) => {\n setHasServerVault(false)\n console.warn('[BACKUP STATUS] Failed to fetch initial vault status:', error)\n }\n })\n\n useEffect(() => {\n window.addEventListener('lumia-passport-backup-status-changed', handleBackupStatusChanged)\n\n return () => {\n window.removeEventListener('lumia-passport-backup-status-changed', handleBackupStatusChanged)\n }\n }, [])\n}\n","import { debounce } from 'lodash-es'\nimport { useCallback, useEffect } from 'react'\n\nimport { MAX_CONTENT_HEIGHT } from '../constants'\nimport { PageKey, useLayoutDataStore } from './useLayoutDataStore'\nimport { useLayoutStore } from './useLayoutStore'\n\nconst DEBOUNCE_DELAY = 50\n\ninterface OnResizeEntry {\n width: number\n height: number\n}\n\nexport function useDetectMaxScrollHeight() {\n const page = useLayoutDataStore((state) => state.page)\n const setIsMobileView = useLayoutStore((state) => state.setIsMobileView)\n const setMaxScrollHeight = useLayoutStore((state) => state.setMaxScrollHeight)\n\n const onResize = useCallback(\n debounce(({ width, height }: OnResizeEntry) => {\n const headerHeight = page === PageKey.AUTH || page === PageKey.KEYSHARE_RESTORE ? 0 : 116\n\n const limContentHeight = height * 0.92 - headerHeight - 57 // 92% of screenheight minus static header and footer\n setIsMobileView(width < height && (width < 475 || limContentHeight <= MAX_CONTENT_HEIGHT))\n setMaxScrollHeight(Math.min(limContentHeight, MAX_CONTENT_HEIGHT))\n }, DEBOUNCE_DELAY),\n [page, setMaxScrollHeight, setIsMobileView]\n )\n\n useEffect(() => {\n const obs = new ResizeObserver(([entry]) => onResize(entry.contentRect))\n const doc = window.document.getElementsByTagName('html')[0] as HTMLElement\n\n if (doc) obs.observe(doc)\n\n return () => obs.disconnect()\n }, [onResize])\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n// import { debounce } from '../../../utils/debounce'\nimport type { ExpandableProps } from '../interfaces'\n\n// const ON_RESIZE_DELEAY = 50\n\nconst useExpandable = (props: ExpandableProps) => {\n const { isExpanded = false, children, initHeight = 0, minHeight = 0 } = props\n\n const expandableRef = useRef<HTMLDivElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!expandableRef.current) return\n expandableRef.current.style.setProperty('--ifo-basic-expandable-h', `${initHeight}px )`)\n }, [])\n\n const setExpandableHeight = useCallback(\n (isExpnd: boolean) => {\n // debounce((isExpnd: boolean) => {\n if (!contentRef.current || !expandableRef.current) return\n\n expandableRef.current.style.setProperty(\n '--ifo-basic-expandable-h',\n isExpnd ? `${contentRef.current.clientHeight}px` : `${minHeight}px`\n )\n },\n // ON_RESIZE_DELEAY),\n [minHeight]\n )\n\n useEffect(() => {\n if (!contentRef.current || !expandableRef.current) return\n\n const obs = new ResizeObserver(() => setExpandableHeight(isExpanded))\n obs.observe(expandableRef.current)\n\n return () => obs.disconnect()\n }, [isExpanded, children])\n\n return {\n expandableRef,\n contentRef\n }\n}\n\nexport { useExpandable }\n","import { cn } from '@/lib/utils'\nimport { forwardRef, useImperativeHandle } from 'react'\n\nimport { useExpandable } from './hooks/useExpandable'\nimport type { ExpandableProps } from './interfaces'\n\nconst Expandable = forwardRef<HTMLDivElement, ExpandableProps>((props, ref) => {\n const { children, className, contentClassName, minHeight, divProps } = props\n\n const { expandableRef, contentRef } = useExpandable(props)\n\n useImperativeHandle(ref, () => expandableRef.current!)\n\n return (\n <div\n {...divProps}\n ref={expandableRef}\n className={cn('w-full overflow-hidden', className)}\n style={{ height: 'var(--ifo-basic-expandable-h)', transition: 'height 500ms ease' }}\n >\n <div className={cn('w-full', contentClassName)} ref={contentRef} style={minHeight ? { minHeight } : undefined}>\n {children}\n </div>\n </div>\n )\n})\n\nexport { Expandable }\n","export { Expandable } from './Expandable'\n","import type { PropsWithChildren } from 'react'\n\nimport { cn } from '../../lib/utils'\n\nexport interface HighlightProps extends PropsWithChildren {\n type?: 'warning' | 'info' | 'error' | 'success'\n className?: string\n}\n\nconst CARD_STYLES: Record<HighlightProps['type'], string> = {\n info: 'text-[var(--l-pass-info)] bg-[var(--l-pass-bg-info)]',\n success: 'text-[var(--l-pass-success)] bg-[var(--l-pass-bg-success)]',\n warning: 'text-[var(--l-pass-warning)] bg-[var(--l-pass-bg-warning)]',\n error: 'text-[var(--l-pass-error)] bg-[var(--l-pass-bg-error)]'\n}\n\nexport function Highlight(props: HighlightProps) {\n const { type = 'info', children, className } = props\n\n return (\n <div\n className={cn(\n 'w-full text-xs rounded-[var(--l-pass-el-bdrs)] p-[var(--l-pass-pd)]',\n 'whitespace-pre-line',\n type === 'error' ? 'break-all' : 'break-normal',\n CARD_STYLES[type],\n className\n )}\n >\n {children}\n </div>\n )\n}\n","import { create } from 'zustand'\n\nexport type VerificationErrorType = 'general' | 'critical' | 'config'\n\n// Note: Telegram authentication now happens in iframe, no separate UI step needed\n// Note: display-name step removed - backend now auto-generates nicknames\nexport type AuthStep = 'signin' | 'signin-passkey' | 'verify' | 'failed' | 'loading'\n\ninterface AuthMenuStore {\n step: AuthStep\n\n email: string\n\n expiresIn: number | null\n\n passkeyStatus: 'idle' | string\n\n alert: { title: string; message: string } | null\n failedType: VerificationErrorType\n\n setStep: (step: AuthStep) => void\n\n setEmail: (email: string) => void\n setExpiresIn: (expiresIn: number | null) => void\n\n setPasskeyStatus: (status: string) => void\n\n setAlert: (alert: { title: string; message: string } | null) => void\n setFailedType: (type: VerificationErrorType) => void\n}\n\nexport const useAuthStore = create<AuthMenuStore>((set) => ({\n step: 'signin',\n\n alert: null,\n\n email: '',\n\n expiresIn: null,\n codeSendError: null,\n\n passkeyStatus: 'idle',\n\n failedType: 'general',\n\n setStep: (step) => set({ step }),\n\n setEmail: (email) => set({ email }),\n\n setExpiresIn: (expiresIn) => set({ expiresIn }),\n\n setPasskeyStatus: (status) => set({ passkeyStatus: status }),\n\n setAlert: (alert) => set({ alert }),\n setFailedType: (type) => set({ failedType: type })\n}))\n","import { AlertTriangle, Info } from 'lucide-react'\n\nimport { useLumiaPassportSession } from '../../../context/LumiaPassportSessionContext'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { useAuthStore } from './useAuthStore'\n\nexport function AuthFailedStep() {\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n const { failedType, setStep, setFailedType, setAlert } = useAuthStore()\n\n const isCritical = failedType === 'critical' || failedType === 'config'\n\n return (\n <>\n <Highlight type={isCritical ? 'error' : 'warning'} className=\"flex flex-col gap-[var(--l-pass-gap)]\">\n {isCritical ? (\n <AlertTriangle className=\"w-4 h-4 text-[var(--l-pass-error)]\" />\n ) : (\n <Info className=\"w-4 h-4 text-[var(--l-pass-warning)]\" />\n )}\n\n <span className=\"text-center block flex-1 text-lg font-semibold\">\n {failedType === 'config' ? 'Configuration Error' : failedType === 'critical' ? 'Critical Error' : 'Failed'}\n </span>\n </Highlight>\n\n {failedType === 'config' && (\n <div className=\"p-2 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-info)]\">\n <div className=\"text-sm font-medium text-[var(--l-pass-info)] mb-2\">{'To fix this issue:'}</div>\n\n <ul className=\"text-xs text-[var(--l-pass-info)] text-left space-y-1 list-disc list-inside\">\n <li>{'Contact your project administrator'}</li>\n <li>{'Verify projectId is correctly configured'}</li>\n <li>{'Check project metadata on the server'}</li>\n </ul>\n </div>\n )}\n\n {failedType === 'critical' && (\n <div className=\"p-2 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-error)] border\">\n <div className=\"text-sm font-semibold text-[var(--l-pass-error)] mb-2\">{'What to do next:'}</div>\n\n <ul className=\"text-xs text-[var(--l-pass-error)] text-left space-y-1 list-disc list-inside\">\n <li>{'Contact support immediately'}</li>\n <li>{'Provide your projectId and error details'}</li>\n <li>{'You may need to create a new account'}</li>\n </ul>\n </div>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"large\"\n onClick={() => {\n setStep('signin')\n setAlert(null)\n setFailedType('general')\n setIsLoading(false)\n }}\n className=\"w-full\"\n >\n {'Back to Sign In'}\n </Button>\n </>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { Loader } from 'lucide-react'\n\nexport function LoadingStep() {\n const passportStatus = useLumiaPassportSession((st) => st.status)\n\n const { t } = useT()\n\n return (\n <>\n <div className=\"flex w-full items-center gap-[var(--l-pass-gap)] justify-center px-4 py-3\">\n <Loader className=\"w-6 h-6 animate-spin\" />\n <span className=\"font-bold text-xl leading-6\">{t('passport:common.account')}</span>\n </div>\n\n <span className=\"w-full text-center text-xs text-[var(--l-pass-fg-muted)] leading-4 block pb-2\">\n {(passportStatus !== 'idle' ? passportStatus : 'Securing...').toUpperCase()}\n </span>\n </>\n )\n}\n","export function PasskeyAddIcon(props: React.SVGProps<SVGSVGElement>) {\n const { width = '24', height = '24', className = 'w-6 h-6', ...rest } = props\n\n return (\n <svg\n {...rest}\n // width={width}\n // height={height}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n // class=\"lucide lucide-icon customizable lucide-key-icon lucide-key lucide-icon customizable\"\n >\n <path d=\"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\"></path>\n <path d=\"m21 2-9.6 9.6\"></path>\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\"></circle>\n\n {/* <path d=\"M6 9v12\"></path>\n <path d=\"M13 6h3a2 2 0 0 1 2 2v3\"></path> */}\n <path d=\"M18 15v6\"></path>\n <path d=\"M21 18h-6\"></path>\n </svg>\n )\n}\n","import { useLumiaPassportSession } from '@/src//context/LumiaPassportSessionContext'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useT } from '@/src/i18n'\nimport { ArrowLeft, Key } from 'lucide-react'\nimport { useCallback, type MutableRefObject } from 'react'\n\nimport { PasskeyAddIcon } from '../../assets/PasskeyAddIcon'\nimport { authenticateWithPasskey, jwtTokenManager, registerPasskey } from '../../auth'\nimport { useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { useAuthStore } from './useAuthStore'\n\n// Helpers: soften WebAuthn cancellation/timeout errors\nfunction normalizeWebAuthnError(err: any): { benignCancel: boolean; message: string } {\n const raw = (err?.message || String(err || '')) as string\n const lower = raw.toLowerCase()\n // Typical cancellation/timeouts:\n // - DOMException: NotAllowedError\n // - \"The operation either timed out or was not allowed\"\n // - user gesture / abort\n const isBenign =\n (err && (err.name === 'NotAllowedError' || err.name === 'AbortError')) ||\n lower.includes('notallowederror') ||\n lower.includes('timed out') ||\n lower.includes('was not allowed') ||\n lower.includes('user cancelled') ||\n lower.includes('operation cancelled') ||\n lower.includes('aborterror')\n\n if (isBenign) return { benignCancel: true, message: '' }\n\n // Friendly mapping for a few known cases\n if (lower.includes('unknown or unsupported algorithm')) {\n return { benignCancel: false, message: 'This device cannot create a passkey with the requested algorithm.' }\n }\n return { benignCancel: false, message: raw }\n}\n\ninterface PassKeyProps {\n pendingLoginResponseRef: MutableRefObject<any>\n onAuthSuccess: () => Promise<void>\n}\n\nexport function PassKeyStep(props: PassKeyProps) {\n const { pendingLoginResponseRef, onAuthSuccess } = props\n\n const {\n config: { current: config },\n callbacks\n } = useLumiaPassportConfig()\n const { t } = useT()\n\n const isLoading = useLumiaPassportSession((st) => st.isLoading)\n const recoveryUserId = useLumiaPassportSession((st) => st.recoveryUserId)\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n\n const autoCloseOnSuccess = !recoveryUserId\n\n const { passkeyStatus, setStep, setPasskeyStatus, setAlert, setEmail, setFailedType } = useAuthStore()\n\n // TODO: useMutation\n // Passkey registration\n const onPasskeyRegister = useCallback(async () => {\n setAlert(null)\n setPasskeyStatus('registering passkey...')\n setIsLoading(true)\n\n try {\n // Auto-generate user ID for passkey registration\n const autoUserId = `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n const { credential, loginResponse } = await registerPasskey(\n autoUserId,\n (step) => {\n setPasskeyStatus(step)\n },\n { skipTokenSave: true }\n )\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n pendingLoginResponseRef.current = loginResponse\n\n // Check if this is a new user who needs DKG setup\n if (loginResponse.isNewUser) {\n // Display name check removed - backend now auto-generates nicknames\n\n // Call onAuthSuccess to trigger real authentication and DKG\n if (onAuthSuccess) await onAuthSuccess()\n\n // Reset state first, then close modal\n setStep('signin')\n setEmail('')\n setAlert(null)\n setPasskeyStatus('idle')\n\n // setPage(null)\n } else {\n // Existing user - just show success\n setPasskeyStatus('Passkey registered successfully!')\n setTimeout(() => {\n setPasskeyStatus('idle')\n }, 2000)\n }\n } catch (e: any) {\n const normalized = normalizeWebAuthnError(e)\n const errorMessage = normalized.message || ''\n\n // Handle specific credential duplication errors with alerts\n if (errorMessage.includes('CREDENTIAL_EXISTS')) {\n setAlert({\n title: 'Passkey Already Registered',\n message:\n 'This passkey is already registered to another account. Please use a different passkey or sign in to the existing account.'\n })\n } else if (errorMessage.includes('CREDENTIAL_DUPLICATE')) {\n setAlert({\n title: 'Passkey Already Registered',\n message: 'This passkey is already registered for your account. No need to register again!'\n })\n } else if (!normalized.benignCancel) {\n setAlert({\n title: 'Passkey Error',\n message: errorMessage\n })\n }\n\n // Trigger onLumiaPassportError callback for non-benign errors\n if (!normalized.benignCancel) {\n try {\n callbacks?.onLumiaPassportError?.({\n error: e instanceof Error ? e : new Error(errorMessage),\n message: errorMessage\n })\n } catch {}\n }\n\n setPasskeyStatus('idle')\n } finally {\n setIsLoading(false)\n }\n }, [onAuthSuccess, setPage, callbacks])\n\n // TODO: useMutation\n // Passkey authentication\n const onPasskeyAuth = useCallback(async () => {\n setAlert(null)\n setPasskeyStatus('checking available passkeys...')\n setIsLoading(true)\n\n try {\n // Clear any existing JWT session when switching to passkey authentication\n jwtTokenManager.clearTokens()\n\n // Try to authenticate with existing passkey\n setPasskeyStatus('authenticating with passkey...')\n\n // Use passkey without specifying user ID, skip token saving until consent approval\n const result = await authenticateWithPasskey(\n undefined,\n (step) => {\n setPasskeyStatus(step)\n },\n { skipTokenSave: true }\n )\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n pendingLoginResponseRef.current = result.loginResponse\n\n const hasKeyshare = result.loginResponse.hasKeyshare ?? false\n\n // Check for critical scenarios\n if (!hasKeyshare && result.loginResponse.isNewUser === undefined) {\n // Backend couldn't determine if user is new - indicates project misconfiguration\n setAlert({\n title: 'Configuration Error',\n message:\n 'The backend could not determine user status. This indicates you probably already have used the passkey and did not create required backups.\\n Unfortunately, your wallet cannot be recovered. You need to create account using a different passkey.'\n })\n setFailedType('config')\n setStep('failed')\n setPasskeyStatus('idle')\n setIsLoading(false)\n return\n }\n\n if (!hasKeyshare && result.loginResponse.isNewUser === false) {\n // CRITICAL: Existing user with lost server keyshare\n setAlert({\n title: 'Data has been lost',\n message:\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n })\n\n setFailedType('critical')\n setStep('failed')\n setPasskeyStatus('idle')\n setIsLoading(false)\n return\n }\n\n // Display name check removed - backend now auto-generates nicknames\n\n // Call onAuthSuccess to trigger real authentication - WAIT for completion\n try {\n if (onAuthSuccess) await onAuthSuccess()\n //\n } catch (authError: any) {\n // Handle authorization errors (e.g., user clicked Cancel in consent modal)\n if (authError?.message?.includes('User denied authorization')) {\n setAlert({\n title: 'Authorization Cancelled',\n message: authError?.message || 'You have cancelled the authorization process.'\n })\n setStep('failed')\n setPasskeyStatus('idle')\n return\n }\n // Re-throw other errors to be handled by outer catch\n throw authError\n }\n\n // Close modal immediately after success\n if (autoCloseOnSuccess) {\n // Reset state first, then close modal\n setStep('signin')\n setEmail('')\n setAlert(null)\n setPasskeyStatus('idle')\n setPage(null)\n }\n } catch (e: any) {\n const normalized = normalizeWebAuthnError(e)\n\n const errorMessage = normalized.message || 'Authentication failed'\n\n if (!normalized.benignCancel) {\n setAlert({\n title: 'Passkey Error',\n message: errorMessage\n })\n\n // Trigger onLumiaPassportError callback for non-benign errors\n try {\n callbacks?.onLumiaPassportError?.({\n error: e instanceof Error ? e : new Error(errorMessage),\n message: errorMessage\n })\n } catch {}\n }\n setPasskeyStatus('idle')\n console.error('[AuthModal] Passkey authentication failed:', e)\n } finally {\n setIsLoading(false)\n }\n }, [onAuthSuccess, setPage, callbacks])\n\n return (\n <>\n <div className=\"relative flex items-center justify-center gap-2 px-5 pt-3 pb-6\">\n <Key className=\"w-6 h-6\" />\n <span className=\"font-bold text-xl leading-6\">{t('passport:auth.passkey.title')}</span>\n\n <Button\n style={{ opacity: 0.5, transform: 'translate(-4px, -4px)' }}\n title={t('passport:auth.backToSignIn')}\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute left-0 top-0 w-5 h-5\"\n onClick={() => setStep('signin')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('passport:auth.backToSignIn')}</span>\n </Button>\n </div>\n\n <Button variant=\"default\" size=\"large\" className=\"w-full\" onClick={onPasskeyAuth} disabled={isLoading}>\n <Key className=\"w-4 h-4\" />\n {t('passport:auth.passkey.signInExisting')}\n </Button>\n\n {!!config.passkey?.showCreateButton && (\n <>\n <span className=\"block w-full text-center text-sm text-[var(--l-pass-fg-muted)]\">\n {t('passport:auth.passkey.dontHave')}\n </span>\n\n <Button variant=\"outline\" size=\"large\" className=\"w-full\" onClick={onPasskeyRegister} disabled={isLoading}>\n <PasskeyAddIcon className=\"w-4 h-4\" />\n {t('passport:auth.passkey.create')}\n </Button>\n </>\n )}\n\n {passkeyStatus !== 'idle' && (\n <Highlight className=\"flex gap-[var(--l-pass-gap)]\">\n <Key className=\"w-4 h-4\" />\n <span className=\"w-full block text-sm break-words whitespace-pre-wrap text-center\">{passkeyStatus}</span>\n </Highlight>\n )}\n </>\n )\n}\n","import React, { useImperativeHandle, useRef } from 'react'\n\nimport { cn } from '../../lib/utils'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n Icon?: React.ElementType<React.SVGProps<SVGSVGElement>>\n element?: React.ReactNode\n error?: string\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const { className, disabled, error, Icon, element, ...inputProps } = props\n\n const internalRef = useRef<HTMLInputElement>(null)\n useImperativeHandle(ref, () => internalRef.current as HTMLInputElement)\n\n return (\n <div className={cn('w-full flex flex-col gap-1', className)}>\n <div\n className={cn(\n 'flex h-12 w-full rounded-[var(--l-pass-el-bdrs)] items-center gap-[var(--l-pass-gap)] px-[var(--l-pass-pd)]',\n 'bg-[var(--l-pass-secondary)]',\n 'hover:bg-[var(--l-pass-secondary-h)]',\n 'transition-colors duration-200 ease-in-out',\n 'file:border-0 file:bg-transparent file:text-base file:font-medium',\n 'focus-within:outline-none focus-within:bg-[var(--l-pass-secondary-a)]',\n disabled ? 'cursor-default opacity-50' : 'cursor-text'\n )}\n onClick={() => {\n internalRef.current?.focus()\n }}\n >\n {Icon && (\n <div className=\"flex flex-none items-center justify-center w-6 h-6 p-1\">\n <Icon width={16} height={16} className=\"text-[var(--l-pass-fg)]\" />\n </div>\n )}\n\n <input\n ref={internalRef}\n className={cn(\n 'text-[16px] text-[var(--l-pass-fg)] font-semibold',\n 'placeholder:text-[var(--l-pass-fg-muted)]',\n 'focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0',\n 'w-full h-full flex-1 border-0 bg-transparent px-0',\n { ['cursor-default']: disabled }\n )}\n disabled={disabled}\n {...inputProps}\n />\n\n {element}\n </div>\n\n {!!error?.length && <span className=\"block text text-[var(--l-pass-error)]\">{error}</span>}\n </div>\n )\n})\n\nInput.displayName = 'Input'\n\nexport { Input }\n","import { getServiceUrls } from '@/src/config/lumiaPassport'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useMutation } from '@tanstack/react-query'\nimport { ChevronRight, Loader, Mail } from 'lucide-react'\nimport { useEffect, useRef } from 'react'\n\nimport { useLayoutStore } from '../../../hooks/useLayoutStore'\nimport { addProjectIdToUrl } from '../../../utils/projectId'\nimport { Button } from '../../ui/button'\nimport { Input } from '../../ui/input'\nimport { useAuthStore } from '../useAuthStore'\n\nexport function Email() {\n const { config, callbacks } = useLumiaPassportConfig()\n const { t } = useT()\n\n const focusRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n const isLoading = useLumiaPassportSession((st) => st.isLoading)\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n\n const isMobileView = useLayoutStore((st) => st.isMobileView)\n\n const { email, alert, setEmail, setExpiresIn, setStep, setAlert } = useAuthStore()\n\n const { mutate: onSendVerificationCode } = useMutation({\n mutationFn: async (mail: string) => {\n const isEmailValid = mail.length !== 0 && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(mail)\n\n if (!isEmailValid) {\n throw new Error('Invalid email format, please correct and try again.')\n }\n\n setIsLoading(true)\n setAlert(null)\n\n const apiUrl = addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`)\n\n return await fetch(apiUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ email: mail, purpose: 'login' })\n })\n },\n\n onSuccess: async (response) => {\n const data = (await response.json()) as { expiresIn?: number; retryAfter?: number; message?: string }\n\n if (response.ok) {\n setExpiresIn(data.expiresIn || 300)\n setStep('verify')\n } else {\n // Handle different error types\n if (response.status === 429) {\n const retryAfter = data.retryAfter || 60\n setAlert({\n title: 'Code already sent recently (Too Many Requests)',\n message: `Please wait ${retryAfter} seconds before requesting another.`\n })\n } else if (response.status === 400) {\n setAlert({\n title: 'Failed to send verification code',\n message: data.message || 'Unknown error occurred'\n })\n } else {\n setAlert({\n title: 'Failed to send verification code',\n message: data.message || 'Unknown error occurred'\n })\n }\n }\n\n setIsLoading(false)\n },\n\n onError: (error) => {\n callbacks?.onLumiaPassportError?.({ error, message: error?.message || '' })\n\n setAlert({\n title: 'Failed to send verification code',\n message: error?.message || 'Unknown error occurred'\n })\n\n setIsLoading(false)\n }\n })\n\n // HACK FOR IPhones to focus a non-input element to prevent automatic keyboard popup, causing keyboard overlapping the input\n useEffect(() => {\n if (!focusRef.current || !isMobileView) return\n\n // Focusing NOT email input to wait for open animation complete\n focusRef.current?.focus()\n\n // wait double 375ms to ensure open animation complete, then focus the input triggering mobile keyboard (IPHONE KEYBOARD OVERLAPPING HACK)\n setTimeout(() => {\n inputRef.current?.focus()\n }, 375 * 3)\n }, [isMobileView])\n\n return (\n <div className=\"relative w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {/* HACK FOR IPhones */}\n <div\n ref={focusRef}\n className=\"absolute top-4 left-4 w-1 h-1 rounded-full focus:bg-transparent outline-none\"\n tabIndex={-1}\n />\n\n <div\n className=\"w-full flex gap-[10px] items-center\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !isLoading && email) {\n buttonRef.current?.click()\n }\n }}\n >\n <Input\n ref={inputRef}\n name=\"signin-email\"\n Icon={Mail}\n type=\"email\"\n autoComplete=\"off\"\n autoFocus={!isMobileView}\n // placeholder={config.current?.email?.placeholder || t('passport:auth.email.placeholder')}\n placeholder={t('passport:auth.email.placeholder')}\n value={email}\n disabled={isLoading}\n className=\"flex-1 w-full\"\n onChange={(e) => {\n if (alert) setAlert(null)\n setEmail(e.target.value)\n }}\n />\n\n <Button\n ref={buttonRef}\n className=\"w-12 h-12 flex-none\"\n variant=\"default\"\n size=\"large\"\n disabled={!email || isLoading}\n onClick={() => onSendVerificationCode(email)}\n >\n {isLoading ? <Loader className=\"w-4 h-4 animate-spin\" /> : <ChevronRight className=\"w-4 h-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n","const TELEGRAM_UA_PATTERN = /Telegram/i\nconst TELEGRAM_REFERRER_PATTERN = /(^|\\/\\/)(t\\.me|telegram\\.(me|org))/i\n\nexport function isTelegramInAppBrowser(): boolean {\n if (typeof window === 'undefined') return false\n\n const w = window as any\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent || '' : ''\n const referrer = typeof document !== 'undefined' ? document.referrer || '' : ''\n\n const hasTelegramProxy =\n !!w.Telegram?.WebApp ||\n !!w.TelegramWebviewProxy ||\n !!w.TelegramWebviewProxyProto ||\n !!w.TelegramWebviewProxyReader ||\n !!w.TelegramWebviewProxyWriter ||\n !!w.TelegramWebviewProxyReady ||\n !!w.external?.TelegramWebviewProxy ||\n !!w.webkit?.messageHandlers?.TelegramWebviewProxy\n\n return TELEGRAM_UA_PATTERN.test(ua) || hasTelegramProxy || TELEGRAM_REFERRER_PATTERN.test(referrer)\n}\n\nexport function buildTelegramBrowserRestriction(\n providerLabel: string,\n actionLabel = 'linking'\n): { title: string; message: string } {\n const url = typeof window !== 'undefined' ? window.location.href : ''\n const linkLine = url ? `\\n\\nOpen in browser:\\n${url}` : ''\n\n return {\n title: 'Open in browser',\n message: `${providerLabel} ${actionLabel} isn't available inside the Telegram in-app browser. Please open this page in a regular browser to continue.${linkLine}`\n }\n}\n\nexport function shouldBlockSocialAuthInTelegram(providerId: string): boolean {\n if (!isTelegramInAppBrowser()) return false\n const id = providerId.toLowerCase()\n return id === 'telegram' || id === 'x' || id === 'twitter'\n}\n","import type { LumiaPassportConfig } from '@/src/config/lumiaPassport'\nimport { MutableRefObject } from 'react'\n\nimport { AuthMethod } from '../../../auth'\n\nconst POSSIBLE_SIGNIN_METHODS: ('email' | 'social' | 'wallet')[] = ['email', 'social', 'wallet']\n\nexport function getSignInEnabledMethods(config: MutableRefObject<LumiaPassportConfig>): AuthMethod[] {\n const order = config.current?.ui?.authOrder || []\n\n // wallet button is handled inside social block if wallet is not set as primary login button (as 1st in order)\n const possibleMethods = POSSIBLE_SIGNIN_METHODS.filter((m) => {\n if (m === 'wallet' && order[0] !== 'wallet') return false\n return true\n })\n\n const enabled: AuthMethod[] = new Array(possibleMethods.length).fill(null)\n const unorderedEnabled: AuthMethod[] = new Array(possibleMethods.length).fill(null)\n\n possibleMethods.forEach((loginMethod) => {\n const orderedIdx = order.indexOf(loginMethod)\n\n if (orderedIdx < 0) {\n // If not ordered & enabled -> push to the end\n unorderedEnabled.push(config.current?.[loginMethod]?.enabled ? loginMethod : null)\n } else {\n // If ordered & enabled -> place at the correct index\n enabled[orderedIdx] = config.current?.[loginMethod]?.enabled ? loginMethod : null\n }\n })\n\n return [...enabled.filter(Boolean), ...unorderedEnabled.filter(Boolean)]\n}\n\nexport async function normalizeSocialLoginResponse(\n rawLoginResponse: any,\n providerKey: string,\n userData?: any\n): Promise<any> {\n if (!rawLoginResponse) {\n return rawLoginResponse\n }\n\n let normalized = { ...rawLoginResponse }\n\n if (providerKey === 'x') {\n const needsEnrichment = typeof normalized.hasKeyshare !== 'boolean' || typeof normalized.isNewUser === 'undefined'\n\n if (needsEnrichment) {\n try {\n const { getUserProfile } = await import('../../../clients/profile')\n const profile = await getUserProfile()\n\n if (typeof normalized.hasKeyshare !== 'boolean' && typeof profile.hasKeyshare === 'boolean') {\n normalized.hasKeyshare = profile.hasKeyshare\n }\n\n if (typeof normalized.isNewUser === 'undefined') {\n normalized.isNewUser = !profile.hasKeyshare\n }\n\n if (profile.displayName && (normalized.displayName === undefined || normalized.displayName === null)) {\n normalized.displayName = profile.displayName\n }\n\n if (profile.avatar && (normalized.avatar === undefined || normalized.avatar === null)) {\n normalized.avatar = profile.avatar\n }\n } catch (profileError) {\n console.warn('[AuthModal] Failed to enrich X login response with profile:', profileError)\n\n if (typeof normalized.hasKeyshare !== 'boolean') {\n normalized.hasKeyshare = false\n }\n\n if (typeof normalized.isNewUser === 'undefined') {\n normalized.isNewUser = false\n }\n }\n }\n }\n\n return normalized\n}\n","import { DiscordIcon, GoogleIcon, TelegramIcon, TwitterIcon } from '@/src/config/assets'\nimport { getServiceUrls } from '@/src/config/lumiaPassport'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useLayoutDataStore } from '@/src/internal/hooks/useLayoutDataStore'\nimport { useCallback, type MutableRefObject } from 'react'\n\nimport { jwtTokenManager } from '../../../auth'\nimport { PROVIDERS_META } from '../../../constants'\nimport { cn } from '../../../lib/utils'\nimport { addProjectIdToUrl } from '../../../utils/projectId'\nimport { buildTelegramBrowserRestriction, shouldBlockSocialAuthInTelegram } from '../../../utils/telegramBrowser'\nimport { Button } from '../../ui/button'\nimport { useAuthStore } from '../useAuthStore'\nimport { normalizeSocialLoginResponse } from './utils'\n\ninterface TokenExchangeConfig {\n audience: string\n scopes: string[]\n ttl?: number\n additionalBody?: Record<string, any>\n}\n\ninterface RefreshTokenResponse {\n accessToken: string\n refreshToken: string\n expiresIn: number\n refreshTokenExpiresIn?: number\n}\n\n// Determine handler based on provider support\nconst SUPPORTED_PROVIDERS = ['telegram', 'x', 'twitter']\n\nconst SOCIAL_ICONS: Record<string, React.ComponentType<{ className?: string }> | undefined> = {\n google: GoogleIcon,\n telegram: TelegramIcon,\n x: TwitterIcon,\n twitter: TwitterIcon,\n discord: DiscordIcon\n}\n\nconst fetchTokensFromRefreshEndpoint = async (): Promise<RefreshTokenResponse | null> => {\n try {\n const { tssUrl } = getServiceUrls()\n const refreshUrl = addProjectIdToUrl(`${tssUrl}/api/auth/refresh`)\n\n const response = await fetch(refreshUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({})\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Token refresh failed')\n console.warn('[AuthModal] Token refresh endpoint responded with error:', response.status, errorText)\n return null\n }\n\n const refreshData = await response.json()\n\n if (refreshData?.accessToken && refreshData?.refreshToken) {\n return {\n accessToken: refreshData.accessToken,\n refreshToken: refreshData.refreshToken,\n expiresIn: refreshData.accessTokenExpiresIn ?? refreshData.expiresIn ?? 3600,\n refreshTokenExpiresIn: refreshData.refreshTokenExpiresIn\n }\n }\n\n console.warn('[AuthModal] Token refresh response missing tokens:', refreshData)\n return null\n } catch (error) {\n console.error('[AuthModal] Token refresh request failed:', error)\n return null\n }\n}\n\nconst enrichLoginResponseWithTokens = async (\n loginResponse: any,\n providerKey: string,\n exchangeConfig?: TokenExchangeConfig\n): Promise<any> => {\n if (!loginResponse) {\n return loginResponse\n }\n\n const hasAccessToken = typeof loginResponse.accessToken === 'string' && loginResponse.accessToken.length > 0\n const hasRefreshToken = typeof loginResponse.refreshToken === 'string' && loginResponse.refreshToken.length > 0\n\n if (hasAccessToken && hasRefreshToken) {\n return loginResponse\n }\n\n if (!exchangeConfig) {\n console.warn('[AuthModal] Token exchange skipped - no configuration provided for provider:', providerKey)\n return loginResponse\n }\n\n const sessionId = loginResponse.sessionId\n if (!sessionId) {\n console.warn('[AuthModal] Missing sessionId in login response, cannot exchange tokens')\n return loginResponse\n }\n\n const { audience, scopes, ttl, additionalBody } = exchangeConfig\n\n try {\n const { tssUrl } = getServiceUrls()\n const exchangeUrl = addProjectIdToUrl(`${tssUrl}/api/auth/token/exchange`)\n const exchangeResponse = await fetch(exchangeUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n sessionId,\n provider: providerKey,\n audience,\n scopes,\n ...(typeof ttl === 'number' ? { ttl } : {}),\n ...(additionalBody || {})\n })\n })\n\n if (!exchangeResponse.ok) {\n const errorText = await exchangeResponse.text().catch(() => 'Token exchange failed')\n console.warn('[AuthModal] Token exchange failed:', exchangeResponse.status, errorText)\n return loginResponse\n }\n\n const tokenData = await exchangeResponse.json()\n\n if (tokenData && tokenData.accessToken && tokenData.refreshToken) {\n console.log('[AuthModal] Token exchange successful for provider:', providerKey)\n const merged = {\n ...loginResponse,\n accessToken: tokenData.accessToken,\n refreshToken: tokenData.refreshToken,\n expiresIn: tokenData.expiresIn ?? loginResponse.expiresIn ?? 3600,\n hasKeyshare: tokenData.hasKeyshare ?? loginResponse.hasKeyshare,\n isNewUser: tokenData.isNewUser ?? loginResponse.isNewUser,\n avatar: tokenData.avatar ?? loginResponse.avatar,\n displayName: tokenData.displayName ?? loginResponse.displayName,\n providers: tokenData.providers ?? loginResponse.providers\n }\n return merged\n }\n\n console.warn('[AuthModal] Token exchange response missing tokens:', tokenData)\n return loginResponse\n } catch (error) {\n console.error('[AuthModal] Token exchange error:', error)\n return loginResponse\n }\n}\n\ninterface SocialProps {\n pendingLoginResponseRef: MutableRefObject<any>\n onAuthSuccess: () => Promise<void>\n}\n\nexport function Social(props: SocialProps) {\n const { pendingLoginResponseRef, onAuthSuccess } = props\n\n const { config, callbacks } = useLumiaPassportConfig()\n const { t } = useT()\n\n const isLoading = useLumiaPassportSession((st) => st.isLoading)\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking)\n\n const { alert, setStep, setEmail, setFailedType, setAlert, setPasskeyStatus } = useAuthStore()\n\n // TODO: useMutation\n const onSocialAuth = useCallback(\n async (providerId: string) => {\n const normalizedProviderId = providerId.toLowerCase()\n const provider = config.current?.social?.providers?.find(\n (p) => (p.id || '').toLowerCase() === normalizedProviderId && p.enabled\n )\n\n if (!provider) {\n setAlert({ title: 'Configuration Error', message: `${providerId} provider not found or not enabled.` })\n return\n }\n\n if (shouldBlockSocialAuthInTelegram(normalizedProviderId)) {\n setAlert(buildTelegramBrowserRestriction(provider.name || providerId, 'authentication'))\n return\n }\n\n setIsLoading(true)\n setStep('loading')\n\n try {\n const { getIframeManager } = await import('../../../lib/iframe-manager')\n\n const iframeManager = getIframeManager()\n\n const finalizeSocialLogin = async (\n rawLoginResponse: any,\n providerKey: string,\n userData?: any\n ): Promise<void> => {\n let loginResponse = await normalizeSocialLoginResponse(rawLoginResponse, providerKey, userData)\n\n // Check if tokens were already stored by iframe-manager (e.g., X OAuth exchange-code flow)\n // This avoids cookie-based fallbacks which fail in Safari due to ITP\n const existingAccessToken = jwtTokenManager.getAccessToken()\n const existingRefreshToken = jwtTokenManager.getRefreshToken()\n\n if (existingAccessToken && existingRefreshToken && !loginResponse.accessToken) {\n console.log('[AuthModal] Using tokens already stored by iframe-manager')\n loginResponse = {\n ...loginResponse,\n accessToken: existingAccessToken,\n refreshToken: existingRefreshToken\n }\n }\n\n // Only attempt token exchange/refresh if we still don't have tokens\n if (!loginResponse.accessToken || !loginResponse.refreshToken) {\n const tokenExchangeConfig: TokenExchangeConfig | undefined =\n (authConfig?.tokenExchange as TokenExchangeConfig | undefined) || (provider as any)?.tokenExchange\n\n loginResponse = await enrichLoginResponseWithTokens(loginResponse, providerKey, tokenExchangeConfig)\n\n if (!loginResponse.accessToken || !loginResponse.refreshToken) {\n const refreshTokens = await fetchTokensFromRefreshEndpoint()\n if (refreshTokens) {\n loginResponse = {\n ...loginResponse,\n accessToken: refreshTokens.accessToken,\n refreshToken: refreshTokens.refreshToken,\n expiresIn: refreshTokens.expiresIn\n }\n }\n }\n }\n\n if (!loginResponse) {\n setAlert({ title: 'Authentication Failed', message: 'No login response received' })\n\n setIsLoading(false)\n return\n }\n\n await jwtTokenManager.clearTokens()\n\n if (!loginResponse.accessToken || !loginResponse.refreshToken) {\n console.warn(\n '[AuthModal] Authentication tokens were not issued; continuing with cookie-based session only.'\n )\n }\n\n let tokensPersisted = false\n const persistTokensIfAvailable = async () => {\n if (!tokensPersisted && loginResponse.accessToken && loginResponse.refreshToken) {\n await jwtTokenManager.setTokens(loginResponse)\n tokensPersisted = true\n }\n }\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n pendingLoginResponseRef.current = loginResponse\n\n // Check for critical scenarios (allow missing metadata for certain providers after enrichment)\n const missingStatusInfo =\n typeof loginResponse.hasKeyshare !== 'boolean' && typeof loginResponse.isNewUser === 'undefined'\n\n if (missingStatusInfo) {\n if (providerKey === 'x') {\n // Default to non-destructive values so downstream flow can continue\n loginResponse.hasKeyshare = false\n loginResponse.isNewUser = false\n } else {\n setAlert({\n title: 'Configuration Error',\n message:\n 'The backend could not determine user status. This indicates that your projectId is not properly configured or the project metadata is missing.\\n\\nPlease contact support with your projectId to resolve this issue.'\n })\n setFailedType('config')\n setStep('failed')\n setIsLoading(false)\n pendingLoginResponseRef.current = null\n return\n }\n }\n\n if (loginResponse.hasKeyshare === false && loginResponse.isNewUser === false && providerKey !== 'x') {\n setAlert({\n title: 'Account Data Lost',\n message:\n 'Your account data has been lost on the server. This should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered. You will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n })\n\n setFailedType('critical')\n setStep('failed')\n setIsLoading(false)\n pendingLoginResponseRef.current = null\n return\n }\n\n // Display name check removed - backend now auto-generates nicknames\n\n console.log('[AuthModal] onAuthSuccess completed successfully')\n // if (loginResponse.isNewUser || !loginResponse.hasKeyshare) {\n // console.log('[AuthModal] New user detected - closing modal before DKG...')\n\n // console.log('[AuthModal] Calling onAuthSuccess for new user...')\n await onAuthSuccess?.()\n\n setStep('signin')\n setEmail('')\n setAlert(null)\n setPasskeyStatus('idle')\n setIsLoading(false)\n // } else {\n // onAuthSuccess?.()\n\n // setStep('signin')\n // setEmail('')\n // setAlert(null)\n // setPasskeyStatus('idle')\n // setIsLoading(false)\n // }\n }\n\n // Get bot username from provider meta or build-time env var\n let authConfig = (provider as any)?.meta || {}\n\n // For Telegram: fallback to build-time env var if botUsername not in config\n if (normalizedProviderId === 'telegram' && !authConfig.botUsername) {\n // @ts-ignore - build-time injected\n const defaultBotUsername = (typeof __EMBARK_TG_BOT__ !== 'undefined' && __EMBARK_TG_BOT__) || undefined\n if (defaultBotUsername) {\n authConfig = { ...authConfig, botUsername: defaultBotUsername }\n }\n }\n\n console.log('[AuthModal] Auth config for', providerId, ':', authConfig)\n\n // Open social auth popup\n const result = await iframeManager.openSocialAuthPopup(normalizedProviderId, authConfig)\n\n if (!result.success) {\n setAlert({\n title: 'Authentication Failed',\n message: result.error || `${provider.name} authentication failed`\n })\n\n setIsLoading(false)\n return\n }\n\n // Get user data from popup result\n const { user } = result\n\n // For X OAuth, the backend handles authentication via exchange-code flow\n // User data and tokens come via postMessage (Safari ITP compatible)\n if (normalizedProviderId === 'x' || normalizedProviderId === 'twitter') {\n console.log('[AuthModal] X OAuth completed, user authenticated via callback')\n\n // User data comes from exchange-code response\n // Tokens already stored in jwtTokenManager by iframe-manager\n if (!user) {\n setAlert({\n title: 'Authentication Failed',\n message: 'No user data received from X authentication'\n })\n\n setIsLoading(false)\n return\n }\n\n console.log('[AuthModal] X login data:', user)\n await finalizeSocialLogin(user, 'x')\n return\n }\n\n // For Telegram and other providers that return user data\n if (!user) {\n setAlert({\n title: 'Authentication Failed',\n message: 'No user data received'\n })\n\n setIsLoading(false)\n return\n }\n\n // Call backend API to verify and create session\n const { tssUrl } = getServiceUrls()\n const apiUrl = addProjectIdToUrl(`${tssUrl}/api/auth/${providerId}/login`)\n\n // Send data exactly as received from provider\n // For Telegram: Fields with undefined/null are excluded from signature calculation\n const payload: Record<string, any> =\n normalizedProviderId === 'telegram'\n ? {\n id: user.id,\n first_name: user.first_name,\n auth_date: user.auth_date,\n hash: user.hash\n }\n : user\n\n // Only include optional fields if they exist (for Telegram)\n if (normalizedProviderId === 'telegram') {\n if (user.last_name) payload.last_name = user.last_name\n if (user.username) payload.username = user.username\n if (user.photo_url) payload.photo_url = user.photo_url\n }\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify(payload)\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Login failed')\n throw new Error(`Login failed: ${response.status} ${errorText}`)\n }\n\n const loginResponse = await response.json()\n console.log(`[AuthModal] ${providerId} login response:`, loginResponse)\n await finalizeSocialLogin(loginResponse, normalizedProviderId, user)\n } catch (error) {\n setAlert({\n title: `${provider.name} Authentication Failed`,\n message: error instanceof Error ? error.message : 'Unknown error'\n })\n\n setIsLoading(false)\n } finally {\n setStep('signin')\n setIsLoading(false)\n }\n },\n [onAuthSuccess, callbacks]\n )\n\n const enabledSocialProviders = config.current?.social?.providers?.filter((provider) => provider.enabled) || []\n\n const isPasskey = !!config.current?.passkey?.enabled\n const isWallet = !!config.current?.wallet?.enabled && config.current?.ui?.authOrder?.[0] !== 'wallet' // when wallet is configured as primary login method (first in order) - shown in main menu\n\n const gridCols = enabledSocialProviders.length + (isPasskey ? 1 : 0) + (isWallet ? 1 : 0)\n\n const PasskeyIcon = PROVIDERS_META.passkey.icon\n const WalletIcon = PROVIDERS_META.wallet.icon\n\n return (\n <div\n className=\"grid gap-[var(--l-pass-gap)]\"\n style={{ gridTemplateColumns: `repeat(${gridCols}, minmax(0, 1fr))` }}\n >\n {config.current?.social?.providers\n .filter((provider) => provider.enabled)\n .map((provider) => {\n const providerId = (provider.id || '').toLowerCase()\n const isSupported = SUPPORTED_PROVIDERS.includes(providerId)\n\n const IconComponent = config.current?.ui?.useExternalIcons ? provider.icon : SOCIAL_ICONS[providerId]\n\n const handleClick = isSupported\n ? () => onSocialAuth(providerId)\n : () => setAlert({ title: 'Coming Soon', message: `${provider.name} authentication is coming soon!` })\n\n return (\n <Button\n key={provider.id}\n variant=\"outline\"\n size=\"large\"\n className=\"w-full\"\n onClick={() => {\n if (!!alert) setAlert(null)\n handleClick()\n }}\n disabled={isLoading}\n title={\n provider.comingSoon\n ? // @ts-expect-error\n t('passport:auth.social.comingSoonMessage', { provider: provider.name })\n : provider.name\n }\n >\n {IconComponent ? (\n <IconComponent className=\"w-5 h-5\" />\n ) : (\n <span\n className={cn(\n 'w-5 h-5 rounded-full flex items-center justify-center',\n 'block text-sm font-bold bg-[var(--l-pass-fg)] text-[var(--l-pass-fg-inverted)]'\n )}\n >\n {provider.name.slice(0, 1).toUpperCase()}\n </span>\n )}\n </Button>\n )\n })}\n\n {isPasskey && (\n <Button\n variant=\"outline\"\n size=\"large\"\n className=\"w-full\"\n onClick={() => {\n if (!!alert) setAlert(null)\n setStep('signin-passkey')\n }}\n disabled={isLoading}\n title={t('passport:auth.passkey.label')}\n >\n <PasskeyIcon className=\"w-5 h-5\" />\n </Button>\n )}\n\n {isWallet && (\n <Button\n variant=\"outline\"\n size=\"large\"\n className=\"w-full\"\n onClick={() => {\n if (!!alert) setAlert(null)\n setIsWalletLinking(true) // init wallet linking flow\n }}\n disabled={isLoading}\n title={t('passport:auth.wallet.label')}\n >\n <WalletIcon className=\"w-5 h-5\" />\n </Button>\n )}\n </div>\n )\n}\n","import { useT } from '@/src/i18n'\n\nimport { PROVIDERS_META } from '../../../constants'\nimport { useLayoutDataStore } from '../../../hooks/useLayoutDataStore'\nimport { Button } from '../../ui/button'\nimport { useAuthStore } from '../useAuthStore'\n\nexport function Wallet() {\n const { t } = useT()\n const setAlert = useAuthStore((st) => st.setAlert)\n const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking)\n\n const Icon = PROVIDERS_META.wallet.icon\n return (\n <Button\n size=\"large\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => {\n setAlert(null)\n setIsWalletLinking(true)\n }}\n >\n <Icon className=\"w-5 h-5\" />\n {t('passport:auth.wallet.label')}\n </Button>\n )\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useT } from '@/src/i18n'\nimport { UserCircle } from 'lucide-react'\nimport { Fragment, ReactNode, type MutableRefObject } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../../hooks/useLayoutDataStore'\nimport { Button } from '../../ui/button'\nimport { Email } from './Email'\nimport { Social } from './Social'\nimport { getSignInEnabledMethods } from './utils'\nimport { Wallet } from './Wallet'\n\ninterface SignInStepProps {\n pendingLoginResponseRef: MutableRefObject<any>\n onAuthSuccess: () => Promise<void>\n}\n\nexport function SignInStep(props: SignInStepProps) {\n const { pendingLoginResponseRef, onAuthSuccess } = props\n const config = useLumiaPassportConfig().config\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const enabledSigninMethods = getSignInEnabledMethods(config)\n\n const signInRenderComponents: Record<'email' | 'social' | 'wallet', ReactNode> = {\n email: <Email />,\n social: <Social pendingLoginResponseRef={pendingLoginResponseRef} onAuthSuccess={onAuthSuccess} />,\n wallet: <Wallet />\n }\n\n return (\n <>\n <div className=\"flex items-center justify-center gap-2 px-5 pt-3 pb-6\">\n <UserCircle className=\"w-6 h-6\" />\n <span className=\"font-bold text-xl leading-6\">{t('passport:auth.signin')}</span>\n </div>\n\n {enabledSigninMethods.map((kind, idx) => (\n <Fragment key={`auth-method-${kind}-${idx}`}>\n {idx > 0 && (\n <div className=\"flex items-center h-4\">\n <div style={{ borderTop: '1px solid var(--l-pass-bd)' }} className=\"flex-1\" />\n <div className=\"text-[10px] px-2 flex-none leading-4\">{t('passport:auth.orSeparator')}</div>\n <div style={{ borderTop: '1px solid var(--l-pass-bd)' }} className=\"flex-1\" />\n </div>\n )}\n\n {signInRenderComponents[kind]}\n </Fragment>\n ))}\n\n <div className=\"w-full flex items-center gap-2 justify-center\">\n <span className=\"text-[10px] font-medium\">{t('passport:auth.terms.text')}</span>\n\n <Button\n variant=\"ghost\"\n size=\"small\"\n className=\"h-fit px-0 text-[10px] font-medium underline underline-offset-4\"\n onClick={() => setPage(PageKey.TERMS_OF_SERVICE)}\n >\n {t('passport:auth.terms.action')}\n </Button>\n </div>\n </>\n )\n}\n","export { SignInStep } from './SignInStep'\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useRef, useState } from 'react'\n\nimport { jwtTokenManager } from '../../auth'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { CHECK_BACKUP_QUERY_KEY } from '../KeyshareRestoreMenu/constants'\nimport { useAuthStore } from './useAuthStore'\n\nexport function useAuthMenuHandlers() {\n const { config, callbacks } = useLumiaPassportConfig()\n const qc = useQueryClient()\n\n // Temporary storage for login response before consent approval. This will be moved to localStorage only after user approves consent\n const pendingLoginResponseRef = useRef<any>(null)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setIsDialogForced = useLayoutStore((st) => st.setIsDialogForced)\n\n // Telegram state\n const [telegramCleanup, setTelegramCleanup] = useState<(() => void) | null>(null)\n\n const {\n usePaymaster,\n publicClient,\n activeChainId,\n setError,\n setStatus,\n setSession,\n setAddress,\n setRecoveryUserId,\n setHasServerVault,\n setIsLoading\n } = useLumiaPassportSession()\n\n const setStep = useAuthStore((st) => st.setStep)\n const setAlert = useAuthStore((st) => st.setAlert)\n\n // Internal function to create session with keyshare (doesn't depend on TssManager component)\n const createSessionWithKeyshare = useCallback(\n async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n try {\n // Notify that wallet connection process is starting\n try {\n callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' })\n } catch {}\n\n setStatus('checking key management setup...')\n\n const { ensureKeyshare } = await import('../../auth')\n\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser)\n\n setStatus('creating smart account...')\n\n const { createAccountSession, getEntryPointDeposit } = await import('../../clients')\n\n if (!activeChainId) {\n throw new Error(\"Active chain id is not set\")\n }\n const sess = await createAccountSession({\n mpcUserId: userId,\n mpcPin: undefined,\n usePaymaster, // TODO: make configurable via layoutDataStore\n chainId: activeChainId\n })\n\n const addr = sess.address || sess.smartAccountAddress\n setStatus('loading account data...')\n\n if (!publicClient) {\n throw new Error('Public client not initialized. Store may not be hydrated yet.')\n }\n\n try {\n await getEntryPointDeposit(addr)\n } catch {}\n\n return { session: sess, address: addr }\n } catch (error: any) {\n // Don't reset status for recovery errors - caller will set the correct status\n if (error?.code !== 'KEYSHARE_RECOVERY_NEEDED') {\n setStatus('idle')\n }\n\n throw error // Re-throw so caller can handle specific errors\n }\n },\n [setStatus, callbacks, usePaymaster, activeChainId]\n )\n\n // TODO: useMutation\n // Handle successful authentication (called after consent approval)\n const onAuthSuccess = useCallback(async () => {\n setIsLoading(true)\n setStep('loading')\n // console.log('[ConnectWalletButton] handleAuthModalSuccess called')\n\n // Get pending login response from AuthModal (tokens not yet saved)\n const loginResponse = pendingLoginResponseRef.current\n // console.log('[ConnectWalletButton] loginResponse:', loginResponse)\n\n if (!loginResponse || !loginResponse.userId) {\n // console.error('[ConnectWalletButton] No login response or userId')\n setError('Authentication failed - no login data available')\n return\n }\n\n const userId: string = loginResponse.userId\n const hasServerKeyshare = loginResponse.hasKeyshare ?? false\n // console.log('[ConnectWalletButton] userId:', userId, 'hasServerKeyshare:', hasServerKeyshare)\n\n try {\n // Authenticate with iframe FIRST - this shows consent modal and waits for user action\n // If user clicks Cancel, this will throw an error and prevent token saving\n if (!config.current?.projectId) {\n throw new Error('projectId is not configured. Cannot authenticate with iframe.')\n }\n\n // console.log('[ConnectWalletButton] Getting iframe manager...')\n const { getIframeManager } = await import('../../lib/iframe-manager')\n\n const iframeManager = getIframeManager()\n\n // console.log('[ConnectWalletButton] Calling iframeManager.authenticate...')\n\n // Pass avatar and displayName from loginResponse (tokens not yet saved to jwtTokenManager)\n await iframeManager.authenticate(userId, loginResponse.avatar, loginResponse.displayName)\n // console.log('[ConnectWalletButton] iframeManager.authenticate completed')\n\n // User approved consent! Now save the tokens to localStorage\n if (loginResponse.accessToken && loginResponse.refreshToken) {\n await jwtTokenManager.setTokens(loginResponse)\n } else {\n console.warn('[ConnectWalletButton] Login response missing tokens; skipping jwtTokenManager.setTokens')\n }\n\n pendingLoginResponseRef.current = null\n\n // Only create session if iframe authentication succeeded (user clicked Authorize)\n const jwt = await import('../../auth').then((m) => m.jwtTokenManager.getTokens())\n\n const { session: sess, address: addr } = await createSessionWithKeyshare(\n userId,\n hasServerKeyshare,\n jwt?.isNewUser\n )\n\n setError(null)\n setAlert(null)\n\n try {\n callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess })\n callbacks?.onLumiaPassportAccount?.({ userId, address: addr, session: sess, hasKeyshare: hasServerKeyshare })\n } catch {}\n\n let hasKeyshareVaultBackup = false\n\n // Fetch vault status and update local backup indicators\n try {\n const { checkServerBackupAvailability, updateBackupStatus, getShareRecoveryStats } = await import(\n '../../vaultClient'\n )\n\n const result = await checkServerBackupAvailability()\n\n if (result.hasBackup) {\n updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now() })\n } else {\n updateBackupStatus(userId, 'server', { enabled: false, error: 'No server vault found' })\n }\n\n // Update vault status indicator\n const stats = await getShareRecoveryStats()\n hasKeyshareVaultBackup = !!stats && (!!stats.created || (!!stats.devices && stats.devices.length > 0))\n\n setHasServerVault(!!hasKeyshareVaultBackup)\n\n qc.refetchQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, addr] })\n } catch (e) {\n console.warn('[UI-KIT] Vault status check failed:', e)\n }\n\n setSession(sess)\n setAddress(addr)\n setStatus('ready')\n\n setTimeout(() => {\n if (!!jwt?.isNewUser || !hasKeyshareVaultBackup) {\n if (!!jwt?.isNewUser) console.log('[AuthMenu] New user detected - forcing backup flow')\n if (!hasKeyshareVaultBackup) console.log('[AuthMenu] No recovery data found - forcing backup flow')\n\n setIsDialogForced(true)\n setPage(PageKey.KEYSARE_BACKUP) // force open backup setup for new users\n } else {\n setIsDialogForced(false)\n setPage(null) // close auth modal\n }\n }, 100)\n } catch (error: any) {\n if (error?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n console.warn('[AuthMenu] Keyshare recovery needed for user:', userId)\n\n // For recovery errors, DON'T clear tokens - they're needed for backup restoration\n // Only clear the pending login response\n pendingLoginResponseRef.current = null\n\n setError(null)\n setRecoveryUserId(userId)\n setStatus('recovery_needed')\n\n // Open auth with recovery modal\n setTimeout(() => {\n setPage(PageKey.KEYSHARE_RESTORE)\n }, 100)\n // Don't throw - recovery modal will handle this\n } else {\n pendingLoginResponseRef.current = null\n\n await jwtTokenManager.clearTokens()\n\n setStatus('error')\n setError(error?.message || String(error))\n\n setAlert({\n title: 'Authorization cancelled',\n message: error?.message || String(error) || 'An unknown error occurred during authentication.'\n })\n\n setStep('failed')\n }\n } finally {\n setIsLoading(false)\n setStep('signin')\n }\n }, [\n qc,\n callbacks,\n setStep,\n setPage,\n setError,\n setStatus,\n setSession,\n setAlert,\n setAddress,\n setRecoveryUserId,\n setHasServerVault,\n setIsDialogForced,\n createSessionWithKeyshare\n ])\n\n const goBackToSignIn = useCallback(() => {\n setStep('signin')\n setAlert(null)\n\n // Clean up telegram widget if going back\n if (telegramCleanup) {\n telegramCleanup()\n setTelegramCleanup(null)\n }\n }, [setStep, setAlert, telegramCleanup])\n\n return {\n pendingLoginResponseRef,\n onAuthSuccess,\n goBackToSignIn\n }\n}\n","export function OtpIcon(props: React.SVGProps<SVGSVGElement>) {\n const { width = '24', height = '24', ...rest } = props\n\n return (\n <svg {...rest} width={width} height={height} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 19V17H22V19H2ZM3.15 12.95L1.85 12.2L2.7 10.7H1V9.2H2.7L1.85 7.75L3.15 7L4 8.45L4.85 7L6.15 7.75L5.3 9.2H7V10.7H5.3L6.15 12.2L4.85 12.95L4 11.45L3.15 12.95ZM11.15 12.95L9.85 12.2L10.7 10.7H9V9.2H10.7L9.85 7.75L11.15 7L12 8.45L12.85 7L14.15 7.75L13.3 9.2H15V10.7H13.3L14.15 12.2L12.85 12.95L12 11.45L11.15 12.95ZM19.15 12.95L17.85 12.2L18.7 10.7H17V9.2H18.7L17.85 7.75L19.15 7L20 8.45L20.85 7L22.15 7.75L21.3 9.2H23V10.7H21.3L22.15 12.2L20.85 12.95L20 11.45L19.15 12.95Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n","import { useT } from '@/src/i18n'\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport { cn } from '../../../lib/utils'\nimport { Button } from '../../ui/button'\nimport { useAuthStore } from '../useAuthStore'\n\ninterface VerificationCodeInputProps {\n onVerifyCode: (code: string) => Promise<void> | void\n onResendCode: () => Promise<void> | void\n isLoading: boolean\n expiresIn: number\n}\n\nexport const VerificationCodeInput: React.FC<VerificationCodeInputProps> = (props) => {\n const { onVerifyCode, onResendCode, isLoading, expiresIn } = props\n const { t } = useT()\n const setAlert = useAuthStore((st) => st.setAlert)\n\n const [timeLeft, setTimeLeft] = useState(expiresIn)\n\n useEffect(() => setTimeLeft(expiresIn), [expiresIn])\n\n useEffect(() => {\n const t = setInterval(() => setTimeLeft((secs) => (secs > 0 ? secs - 1 : 0)), 1000)\n return () => clearInterval(t)\n }, [])\n\n const lastSubmittedRef = useRef<string | null>(null)\n const inputsRef = useRef<Array<HTMLInputElement | null>>([])\n\n const [digits, setDigits] = useState<string[]>(['', '', '', '', '', ''])\n\n useEffect(() => {\n const code = digits.join('')\n\n if (code.length === 6 && digits.every((d) => d !== '') && !isLoading) {\n if (lastSubmittedRef.current !== code) {\n lastSubmittedRef.current = code\n onVerifyCode(code)\n }\n }\n }, [digits, isLoading, onVerifyCode])\n\n // Autofocus the first input on mount\n useEffect(() => {\n const t = setTimeout(() => {\n inputsRef.current[0]?.focus()\n }, 0)\n\n return () => clearTimeout(t)\n }, [])\n\n const handleChange = (index: number, value: string) => {\n const v = value.replace(/\\D/g, '').slice(-1)\n\n setDigits((prev) => {\n const next = [...prev]\n next[index] = v\n return next\n })\n\n if (!v) {\n // If user cleared a digit, allow re-submission later for same code\n lastSubmittedRef.current = null\n }\n\n if (v && inputsRef.current[index + 1]) inputsRef.current[index + 1]?.focus()\n }\n\n const handleKeyDown = (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n if (digits[index]) {\n setDigits((prev) => {\n const n = [...prev]\n n[index] = ''\n return n\n })\n } else if (inputsRef.current[index - 1]) {\n inputsRef.current[index - 1]?.focus()\n setDigits((prev) => {\n const n = [...prev]\n n[index - 1] = ''\n return n\n })\n }\n }\n if (e.key === 'ArrowLeft' && inputsRef.current[index - 1]) inputsRef.current[index - 1]?.focus()\n if (e.key === 'ArrowRight' && inputsRef.current[index + 1]) inputsRef.current[index + 1]?.focus()\n }\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = (e.clipboardData.getData('text') || '').replace(/\\D/g, '').slice(0, 6)\n if (text.length) {\n e.preventDefault()\n const arr = new Array(6).fill('').map((_, i) => text[i] || '')\n setDigits(arr)\n lastSubmittedRef.current = null\n const lastIndex = Math.min(text.length, 6) - 1\n if (inputsRef.current[lastIndex]) inputsRef.current[lastIndex]?.focus()\n }\n }\n\n const mm = Math.floor(timeLeft / 60).toString()\n const ss = (timeLeft % 60).toString().padStart(2, '0')\n\n return (\n <>\n <div className=\"flex items-center justify-center gap-2\">\n {digits.map((d, i) => (\n <input\n key={i}\n name={`verification-code-symbol-${i}`}\n ref={(el) => (inputsRef.current[i] = el)}\n type=\"text\"\n autoComplete=\"off\"\n disabled={isLoading}\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n maxLength={1}\n value={d}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n className={cn(\n 'block w-[40px] h-[48px] rounded-[var(--l-pass-el-bdrs)]',\n 'text-[16px] leading-5 text-center font-semibold text-[var(--l-pass-fg)] cursor-text',\n 'bg-[var(--l-pass-secondary)] focus:bg-[var(--l-pass-secondary-a)] hover:bg-[var(--l-pass-secondary-h)]',\n 'disabled:cursor-default disabled:opacity-50 disabled:hover:bg-[var(--l-pass-secondary)]',\n 'focus:bg-[var(--l-pass-secondary-a)]',\n 'border-0 border-transparent', // to avoid default appearance border\n 'transition-colors duration-200'\n )}\n />\n ))}\n </div>\n\n <span className=\"w-full text-center block text-xs\">\n {/* @ts-expect-error */}\n {t('passport:auth.verification.codeExpires', { time: `${mm}:${ss}` })}\n </span>\n\n <div className=\"w-full flex items-center justify-center gap-[var(--l-pass-gap)]\">\n <span className=\"text-xs text-[var(--l-pass-fg-muted)]\">{t('passport:auth.verification.didntReceive')}</span>\n\n <Button\n variant=\"ghost\"\n size=\"medium\"\n disabled={isLoading}\n className=\"text-xs h-fit px-0 leading-4 text-[var(--l-pass-fg-muted)] underline underline-offset-4\"\n onClick={() => {\n if (!timeLeft) return onResendCode()\n setAlert({ title: 'Please wait', message: 'Please wait until the current code expires to resend.' })\n setTimeout(() => setAlert(null), 3000)\n }}\n >\n {t('passport:auth.verification.resend')}\n </Button>\n </div>\n </>\n )\n}\n","import { getServiceUrls } from '@/src/config/lumiaPassport'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useMutation } from '@tanstack/react-query'\nimport { ArrowLeft, Loader } from 'lucide-react'\nimport { MutableRefObject } from 'react'\n\nimport { OtpIcon } from '../../../assets/OtpIcon'\nimport { addProjectIdToUrl } from '../../../utils/projectId'\nimport { Button } from '../../ui/button'\nimport { useAuthStore } from '../useAuthStore'\nimport { VerificationCodeInput } from './VerificationCodeInput'\n\ninterface VerifyStepProps {\n pendingLoginResponseRef: MutableRefObject<any>\n goBackToSignIn: () => void\n onAuthSuccess: () => Promise<void>\n}\n\nexport function VerifyStep(props: VerifyStepProps) {\n const { pendingLoginResponseRef, goBackToSignIn, onAuthSuccess } = props\n\n const { callbacks } = useLumiaPassportConfig()\n const { t } = useT()\n\n // const setPage = useLayoutDataStore((st) => st.setPage)\n\n const recoveryUserId = useLumiaPassportSession((st) => st.recoveryUserId)\n // const hasServerVault = useLumiaPassportSession((st) => st.hasServerVault)\n const isSessionLoading = useLumiaPassportSession((st) => st.isLoading)\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n\n const {\n email,\n expiresIn,\n\n setFailedType,\n setStep,\n setEmail,\n setExpiresIn,\n setAlert\n } = useAuthStore()\n\n const { mutate: onVerifyCode, isPending: isCodeVerifying } = useMutation({\n mutationFn: async (code: string) => {\n setIsLoading(true)\n setAlert(null)\n\n // Use the official loginWithEmail function but skip token saving until consent approval\n const { loginWithEmail } = await import('../../../auth')\n\n const loginResponse = await loginWithEmail(email, code, { skipTokenSave: true })\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n pendingLoginResponseRef.current = loginResponse\n\n return loginResponse\n },\n\n onSuccess: async (loginResponse) => {\n // Check for critical scenarios\n if (!loginResponse.hasKeyshare && loginResponse.isNewUser === undefined) {\n // Backend couldn't determine if user is new - indicates project misconfiguration\n\n setAlert({\n title: 'Configuration Error',\n message:\n 'The backend could not determine user status. This indicates that your projectId is not properly configured or the project metadata is missing.\\n\\nPlease contact support with your projectId to resolve this issue.'\n })\n\n setFailedType('config')\n setStep('failed')\n\n pendingLoginResponseRef.current = null\n\n setIsLoading(false)\n\n return\n }\n\n // CRITICAL: Existing user with lost server keyshare\n if (!loginResponse.hasKeyshare && loginResponse.isNewUser === false) {\n setAlert({\n title: 'Account Data Lost',\n message:\n 'Your account data has been lost on the server. This should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered. You will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n })\n\n setFailedType('critical')\n setStep('failed')\n\n pendingLoginResponseRef.current = null\n\n setIsLoading(false)\n\n return\n }\n\n // Check if user needs recovery (has server keyshare but no local keyshare)\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n const localKeyshare = storage?.getItem(`tss.${loginResponse.userId}.keyshare`)\n const needsRecovery = loginResponse.hasKeyshare && !loginResponse.isNewUser && !localKeyshare\n\n // Display name check removed - backend now auto-generates nicknames\n\n // Close modal immediately after success (unless recovery is needed)\n if (!recoveryUserId && !needsRecovery) {\n setEmail('')\n setAlert(null)\n // setStep('loading')\n }\n\n // Trigger session creation and DKG for new users - WAIT for completion\n await onAuthSuccess?.()\n\n console.log('[AuthModal] Authentication successful')\n\n setIsLoading(false)\n setStep('signin')\n },\n\n onError: (error) => {\n // Handle specific error messages from loginWithEmail\n let errorMessage = ''\n\n if (error.message?.includes('Invalid') || error.message?.includes('invalid')) {\n errorMessage = 'Invalid verification code. Please try again.'\n } else if (error.message?.includes('expired')) {\n errorMessage = 'Verification code expired. Please request a new one.'\n } else if (error.message?.includes('429') || error.message?.includes('Too many')) {\n errorMessage = 'Too many attempts. Please try again later.'\n } else {\n errorMessage = error.message || 'Verification failed. Please try again.'\n }\n\n setAlert({\n title: 'Verification failed',\n message: errorMessage\n })\n\n // Trigger onLumiaPassportError callback\n\n callbacks?.onLumiaPassportError?.({\n error: error instanceof Error ? error : new Error(errorMessage),\n message: errorMessage\n })\n\n setIsLoading(false)\n }\n })\n\n const { mutate: onResendCode, isPending: isCodeResending } = useMutation({\n mutationFn: async () => {\n setAlert(null)\n setIsLoading(true)\n\n // try {\n const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ email, purpose: 'login' })\n })\n\n return response\n },\n\n onSuccess: async (response) => {\n const data = (await response.json()) as { expiresIn?: number; retryAfter?: number; message?: string }\n\n if (response.ok) {\n setExpiresIn(data.expiresIn || 300)\n }\n\n if (!response.ok && response.status === 429) {\n setAlert({\n title: 'Code already sent recently (Too Many Requests)',\n message: `Please wait ${data.retryAfter || 60} seconds before requesting another.`\n })\n }\n\n if (!response.ok && response.status !== 429) {\n setAlert({\n title: 'Failed to resend verification code',\n message: data.message || 'Unknown error occurred'\n })\n }\n\n setIsLoading(false)\n },\n\n onError: (err) => {\n setAlert({\n title: 'Failed to resend verification code',\n message: err.message || 'Unknown error occurred'\n })\n\n setIsLoading(false)\n }\n })\n\n const isLoading = isSessionLoading || isCodeVerifying || isCodeResending\n\n return (\n <>\n <div className=\"relative flex items-center justify-center gap-2 px-5 pt-3 pb-6\">\n <OtpIcon className=\"w-6 h-6\" />\n\n <span className=\"font-bold text-xl leading-6\">{t('passport:auth.verification.title')}</span>\n\n {isLoading && <Loader className=\"h-4 w-4 animate-spin\" />}\n\n <Button\n disabled={isLoading}\n style={{ opacity: 0.5, transform: 'translate(-4px, -4px)' }}\n title={t('passport:auth.backToSignIn')}\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute left-0 top-0 w-5 h-5\"\n onClick={goBackToSignIn}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('passport:auth.backToSignIn')}</span>\n </Button>\n </div>\n\n <div className=\"w-full flex flex-col gap-1 text-center\">\n <span className=\"text-xs text-[var(--l-pass-fg-muted)]\">{t('passport:auth.verification.sentTo')}</span>\n <strong className=\"text-xs\">{email}</strong>\n </div>\n\n <VerificationCodeInput\n onVerifyCode={onVerifyCode}\n onResendCode={onResendCode}\n isLoading={isLoading}\n expiresIn={expiresIn}\n />\n </>\n )\n}\n","export { VerifyStep } from './VerifyStep'\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { AlertTriangle, Loader } from 'lucide-react'\nimport { useEffect, useMemo, type CSSProperties } from 'react'\n\nimport { DEFAULT_AUTH_MENU_HEIGHT } from '../../constants'\nimport { useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Highlight } from '../ui/highlight'\nimport { AuthFailedStep } from './AuthFailedStep'\nimport { LoadingStep } from './LoadingStep'\nimport { PassKeyStep as PasskeySignInStep } from './PassKeyStep'\nimport { SignInStep } from './SignInStep'\nimport { useAuthMenuHandlers } from './useAuthMenuHanders'\nimport { useAuthStore, type AuthStep } from './useAuthStore'\nimport { VerifyStep } from './VerifyStep'\n\nexport const AuthMenu = () => {\n const isIframeReady = useLumiaPassportSession((st) => st.isIframeReady)\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n const setTransitionPageHeight = useLayoutDataStore((st) => st.setTransitionPageHeight)\n\n const { step, alert, setStep, setPasskeyStatus, setEmail, setAlert } = useAuthStore()\n\n const { pendingLoginResponseRef, onAuthSuccess, goBackToSignIn } = useAuthMenuHandlers()\n\n useEffect(() => {\n setTransitionPageHeight(DEFAULT_AUTH_MENU_HEIGHT) // actual height measurement of the auth menu on mount. prevents layout animations jumps\n\n // Reset state on unmount\n return () => {\n setStep('signin')\n setEmail('')\n setPasskeyStatus('idle')\n setAlert(null)\n }\n }, [])\n\n // Show loading state if iframe is not ready yet\n if (!isIframeReady) {\n return (\n <div className=\"w-full p-8 flex flex-col justify-center items-center gap-[var(--l-pass-gap)]\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n <span className=\"text-sm text-[var(--l-pass-fg-muted)]\">{'Initializing wallet...'}</span>\n </div>\n )\n }\n\n const stepContent: Record<AuthStep, React.ReactNode> = useMemo(\n () => ({\n 'loading': <LoadingStep />,\n\n 'failed': <AuthFailedStep />,\n\n 'verify': (\n <VerifyStep\n pendingLoginResponseRef={pendingLoginResponseRef}\n goBackToSignIn={goBackToSignIn}\n onAuthSuccess={onAuthSuccess}\n />\n ),\n\n 'signin': <SignInStep pendingLoginResponseRef={pendingLoginResponseRef} onAuthSuccess={onAuthSuccess} />,\n\n 'signin-passkey': (\n <PasskeySignInStep pendingLoginResponseRef={pendingLoginResponseRef} onAuthSuccess={onAuthSuccess} />\n )\n }),\n [onAuthSuccess, goBackToSignIn]\n )\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {stepContent[step]}\n\n {alert && (\n <Highlight type=\"error\" className=\"w-full flex gap-[var(--l-pass-gap)] \">\n <AlertTriangle className=\"w-5 h-5 text-[var(--l-pass-error)]\" />\n\n <span className=\"block w-full flex flex-col gap-1 flex-1\">\n <span className=\"block font-bold leading-5\">{alert.title}</span>\n <span className=\"block whitespace-pre-line\">{alert.message || 'Unknown error'}</span>\n </span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","export { AuthMenu } from './AuthMenu'\nexport { useAuthStore } from './useAuthStore'\n","import * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\nimport React from 'react'\n\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { cn } from '../../lib/utils'\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: 'sm' | 'default'\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n 'flex w-fit h-12 items-center justify-between whitespace-nowrap',\n // 'border border-[var(--l-pass-bd)]',\n 'rounded-[var(--l-pass-el-bdrs)] gap-[var(--l-pass-gap)]',\n 'bg-transparent px-[var(--l-pass-pd)] text-xs',\n 'data-[size=default]:h-12 data-[size=sm]:h-10',\n \"data-[placeholder]:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-[var(--l-pass-gap)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n '[&_svg:not([class*=\"text-\"])]:text-muted-foreground',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'item-aligned',\n align = 'center',\n container,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & { container?: HTMLElement | null }) {\n const colorMode = useLayoutStore((st) => st.colorMode)\n\n return (\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-lumia-passport-mode={colorMode}\n style={\n {\n // backgroundColor: 'var(--l-pass-bg)',\n // border: '1px solid var(--l-pass-bd)',\n // color: 'var(--l-pass-fg)',\n // borderRadius: 'var(--l-pass-el-bdrs)'\n }\n }\n className={cn(\n 'lumia-scope text-[var(--l-pass-fg)] bg-[var(--l-pass-bg)]',\n 'rounded-[var(--l-pass-el-bdrs)] border border-[var(--l-pass-bd)]',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-[var(--l-pass-pd)]',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-2 py-1.5 text-xs', className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n 'cursor-pointer outline-hidden select-none', // text-sm\n 'relative flex w-full min-h-10 items-center',\n 'gap-[var(--l-pass-gap)] rounded-[var(--l-pass-el-bdrs)] py-0 pr-8 pl-[var(--l-pass-pd)]',\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span data-slot=\"select-item-indicator\" className=\"absolute right-4 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('bg-border pointer-events-none -mx-1 my-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue\n}\n","import React, { type SVGAttributes } from 'react'\n\nfunction BinanceIcon(props: SVGAttributes<SVGElement>): React.JSX.Element {\n const { width = '107', height = '23', ...svgProps } = props\n\n return (\n <svg\n {...svgProps}\n width={width}\n height={height}\n fill=\"none\"\n viewBox=\"0 0 107 23\"\n style={{ flexShrink: 0 }}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.79336 9.80429L10.9273 5.67729L15.0635 9.80647L17.4689 7.405L10.9273 0.874023L4.38794 7.40282L6.79336 9.80429Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5.09435 11.4996L2.68896 9.09814L0.283465 11.4997L2.68885 13.9011L5.09435 11.4996Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6.79299 13.1959L10.9269 17.3229L15.0629 13.1938L17.4697 15.594L17.4685 15.5953L10.9269 22.1261L4.3874 15.5975L4.38403 15.5941L6.79299 13.1959Z\"\n fill=\"currentColor\"\n />\n <path d=\"M19.1653 13.9023L21.5708 11.5007L19.1654 9.09931L16.7599 11.5009L19.1653 13.9023Z\" fill=\"currentColor\" />\n <path\n d=\"M13.3671 11.4987H13.3681L10.9272 9.06177L9.12333 10.8627H9.12316L8.91602 11.0696L8.48847 11.4965L8.48511 11.4998L8.48847 11.5034L10.9272 13.9381L13.3681 11.5012L13.3693 11.4998L13.3671 11.4987Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M25.3208 6.02344H30.5525C31.8509 6.02344 32.8328 6.35612 33.4983 7.02149C34.0132 7.5368 34.2707 8.17548 34.2707 8.93736V8.96959C34.2707 9.29153 34.2308 9.57604 34.1506 9.82278C34.0706 10.0699 33.9636 10.2923 33.83 10.4908C33.6967 10.6896 33.5416 10.864 33.3654 11.014C33.1891 11.1644 32.9996 11.2933 32.7967 11.4004C33.4493 11.6475 33.9631 11.9827 34.3377 12.4067C34.7122 12.8309 34.8996 13.4185 34.8996 14.1697V14.2017C34.8996 14.717 34.8004 15.1677 34.6019 15.5543C34.4033 15.9405 34.1188 16.2626 33.7484 16.5203C33.3781 16.7779 32.9327 16.971 32.4122 17.0999C31.8916 17.2286 31.3148 17.2929 30.6818 17.2929H25.3208V6.02344ZM30.0294 10.5795C30.5779 10.5795 31.0133 10.4858 31.3356 10.2978C31.6581 10.11 31.8193 9.80667 31.8193 9.38821V9.35598C31.8193 8.9805 31.6794 8.69347 31.4 8.49473C31.1204 8.29616 30.7172 8.19679 30.1907 8.19679H27.7395V10.5795H30.0294ZM30.6907 15.1197C31.2389 15.1197 31.6687 15.0207 31.9807 14.8219C32.2924 14.6234 32.4485 14.3147 32.4485 13.8961V13.864C32.4485 13.4883 32.3032 13.1906 32.013 12.9704C31.7227 12.7506 31.2551 12.6405 30.61 12.6405H27.7395V15.1199L30.6907 15.1197Z\"\n fill=\"currentColor\"\n />\n <path d=\"M38.0154 6.02344H40.499V17.2932H38.0154V6.02344Z\" fill=\"currentColor\" />\n <path\n d=\"M44.2605 6.02344H46.5501L51.8396 12.9625V6.02344H54.2907V17.2932H52.1784L46.7115 10.1289V17.2932H44.2605V6.02344Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M61.8094 5.94312H64.0992L68.9373 17.2933H66.3409L65.3087 14.7658H60.5354L59.5034 17.2933H56.9712L61.8094 5.94312ZM64.4218 12.576L62.922 8.92149L61.4226 12.576H64.4218Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M71.6182 6.02344H73.9083L79.1974 12.9625V6.02344H81.6486V17.2932H79.5362L74.0693 10.1289V17.2932H71.6182V6.02344Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M90.5862 17.4866C89.758 17.4866 88.9897 17.3362 88.28 17.0359C87.5703 16.7356 86.9577 16.3249 86.4417 15.8042C85.9255 15.2837 85.5222 14.6692 85.2323 13.9608C84.942 13.2523 84.7969 12.4957 84.7969 11.6906V11.6586C84.7969 10.8536 84.942 10.0997 85.2323 9.3966C85.5224 8.69363 85.9255 8.07643 86.4417 7.54518C86.9575 7.01393 87.5759 6.59514 88.296 6.28931C89.0161 5.98348 89.8122 5.83057 90.6829 5.83057C91.2093 5.83057 91.6903 5.8737 92.1258 5.95931C92.5612 6.04542 92.9562 6.16325 93.3113 6.31348C93.6662 6.46387 93.9937 6.64633 94.2952 6.86085C94.5956 7.0757 94.8754 7.3117 95.1335 7.56935L93.5534 9.38854C93.112 8.99157 92.6635 8.68003 92.2067 8.45477C91.7495 8.22952 91.2364 8.11672 90.6666 8.11672C90.1935 8.11672 89.7553 8.20803 89.3525 8.39049C88.9493 8.57294 88.6025 8.82506 88.3121 9.147C88.0221 9.46894 87.7963 9.84208 87.6347 10.2659C87.4738 10.6901 87.3933 11.1434 87.3933 11.6263V11.6584C87.3933 12.1413 87.4738 12.5977 87.6347 13.0267C87.7963 13.4563 88.0189 13.8318 88.3042 14.1537C88.5889 14.4756 88.933 14.7308 89.336 14.9186C89.7395 15.1066 90.1829 15.2003 90.6666 15.2003C91.3119 15.2003 91.857 15.0823 92.3032 14.8461C92.7494 14.6103 93.1931 14.2882 93.6337 13.8801L95.2142 15.474C94.9238 15.7854 94.6223 16.0645 94.3111 16.3111C93.9993 16.5582 93.658 16.77 93.2869 16.9473C92.9162 17.1242 92.51 17.2586 92.0696 17.3496C91.6285 17.4408 91.1342 17.4866 90.5862 17.4866Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M98.137 6.02344H106.635V8.22919H100.588V10.5153H105.91V12.7209H100.588V15.0876H106.716V17.2932H98.137V6.02344Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport { BinanceIcon }\n","import React, { type SVGAttributes } from 'react'\n\nfunction RampnowIcon(props: SVGAttributes<SVGElement>): React.JSX.Element {\n const { width = '107', height = '32', ...svgProps } = props\n\n return (\n <svg\n {...svgProps}\n width={width}\n height={height}\n fill=\"none\"\n viewBox=\"0 0 400 82\"\n style={{ flexShrink: 0 }}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n xmlns=\"http://www.w3.org/2000/svg\"\n d=\"M16.375 21.542 L 7.167 30.751 7.167 49.029 C 7.167 59.081,7.212 67.425,7.268 67.570 C 7.400 67.913,15.960 67.974,16.300 67.633 C 16.453 67.480,16.500 62.535,16.500 46.389 C 16.500 22.991,16.433 24.372,17.621 23.137 C 17.945 22.800,18.594 22.313,19.063 22.054 L 19.917 21.583 41.294 21.539 L 62.672 21.494 62.628 16.955 L 62.583 12.417 44.083 12.374 L 25.583 12.332 16.375 21.542 M127.974 20.915 C 127.929 20.960,127.155 21.073,126.253 21.166 C 125.352 21.260,124.532 21.401,124.432 21.479 C 124.332 21.558,124.063 21.662,123.833 21.711 C 123.604 21.760,123.154 21.894,122.833 22.008 C 122.513 22.123,122.175 22.243,122.083 22.274 C 121.992 22.306,121.542 22.553,121.083 22.823 C 120.625 23.093,119.912 23.498,119.500 23.723 C 114.588 26.397,110.117 35.851,111.139 41.400 C 111.246 41.980,111.333 42.808,111.333 43.239 C 111.333 43.669,111.421 44.186,111.529 44.386 C 111.637 44.586,111.782 45.012,111.852 45.333 C 112.172 46.809,112.373 47.365,113.179 49.000 C 113.653 49.963,114.355 51.125,114.738 51.583 C 115.121 52.042,115.603 52.659,115.809 52.954 C 116.209 53.529,119.037 56.000,119.294 56.000 C 119.379 56.000,119.582 56.147,119.745 56.328 C 120.107 56.728,122.335 57.833,122.779 57.833 C 122.955 57.833,123.171 57.899,123.258 57.979 C 124.464 59.085,132.049 59.333,133.873 58.326 C 134.032 58.239,134.273 58.167,134.409 58.167 C 134.544 58.167,134.939 58.044,135.286 57.894 C 135.633 57.743,136.104 57.539,136.333 57.439 C 138.334 56.568,141.167 53.925,142.203 51.962 C 142.793 50.845,142.833 51.013,142.833 54.597 C 142.833 56.362,142.879 57.925,142.934 58.070 C 143.074 58.434,149.347 58.469,149.647 58.107 C 149.784 57.942,149.823 53.026,149.792 39.815 L 149.750 21.750 146.333 21.750 L 142.917 21.750 142.874 25.000 C 142.823 28.824,142.789 28.992,142.243 28.083 C 140.560 25.279,137.558 22.768,134.833 21.885 C 132.470 21.119,128.352 20.537,127.974 20.915 M171.500 21.000 C 171.271 21.078,170.653 21.190,170.128 21.249 C 169.602 21.308,169.129 21.426,169.076 21.512 C 169.023 21.597,168.816 21.668,168.615 21.669 C 167.198 21.677,162.888 25.127,162.274 26.745 C 161.997 27.473,161.838 26.522,161.836 24.125 L 161.833 21.667 158.333 21.667 L 154.832 21.667 154.874 39.958 L 154.917 58.250 158.000 58.297 C 159.696 58.323,161.252 58.303,161.458 58.253 L 161.833 58.160 161.844 47.538 C 161.849 41.696,161.917 36.392,161.994 35.750 C 162.209 33.957,162.757 32.170,163.171 31.914 C 163.260 31.859,163.333 31.677,163.333 31.510 C 163.333 31.142,165.383 29.193,166.178 28.804 C 168.959 27.445,170.813 27.198,173.459 27.832 C 175.868 28.410,177.468 29.496,178.562 31.299 C 180.034 33.722,180.038 33.765,180.155 46.833 C 180.211 53.112,180.274 58.269,180.295 58.292 C 180.445 58.455,186.796 58.304,186.967 58.133 C 187.118 57.982,187.167 55.280,187.170 47.008 C 187.173 34.772,187.172 34.780,188.324 32.438 C 189.429 30.193,191.986 28.000,193.501 28.000 C 193.661 28.000,194.062 27.887,194.391 27.750 C 195.243 27.394,197.270 27.436,199.015 27.846 C 202.401 28.641,204.588 31.074,205.371 34.917 C 205.469 35.400,205.584 40.479,205.645 47.000 L 205.750 58.250 209.083 58.250 L 212.417 58.250 212.411 45.917 C 212.407 37.120,212.349 33.321,212.210 32.667 C 212.102 32.162,211.919 31.337,211.804 30.833 C 209.800 22.097,197.444 17.949,189.500 23.346 C 188.198 24.231,186.307 26.311,185.807 27.409 C 185.529 28.019,185.379 27.906,184.412 26.357 C 183.543 24.964,182.095 23.333,181.727 23.333 C 181.616 23.333,181.314 23.159,181.054 22.945 C 179.301 21.502,173.507 20.322,171.500 21.000 M234.917 21.267 C 231.846 21.888,229.079 23.370,227.250 25.373 C 226.143 26.585,225.333 27.609,225.333 27.796 C 225.333 27.966,224.786 28.500,224.612 28.500 C 224.550 28.500,224.500 26.961,224.500 25.080 L 224.500 21.660 221.042 21.705 L 217.583 21.750 217.583 46.667 L 217.583 71.583 221.042 71.628 L 224.500 71.673 224.500 61.503 C 224.500 55.910,224.547 51.333,224.605 51.333 C 224.784 51.333,225.333 52.038,225.333 52.267 C 225.333 52.846,229.788 57.000,230.409 57.000 C 230.540 57.000,230.692 57.073,230.747 57.162 C 230.840 57.312,231.298 57.542,232.583 58.084 C 232.858 58.199,233.496 58.385,234.000 58.495 C 234.504 58.605,235.188 58.764,235.519 58.848 C 236.924 59.202,242.149 58.905,242.917 58.427 C 243.100 58.312,243.574 58.168,243.970 58.106 C 244.587 58.009,246.082 57.336,247.250 56.629 C 250.223 54.831,252.401 52.534,254.073 49.433 C 254.216 49.167,254.333 48.872,254.333 48.779 C 254.333 48.686,254.443 48.489,254.576 48.341 C 256.163 46.587,256.933 37.044,255.676 34.703 C 255.591 34.546,255.439 34.042,255.336 33.583 C 254.789 31.128,252.105 27.063,249.835 25.251 C 249.204 24.748,248.640 24.259,248.582 24.164 C 248.487 24.011,248.023 23.742,246.000 22.669 C 242.893 21.020,238.740 20.495,234.917 21.267 M277.833 21.000 C 277.696 21.089,277.358 21.164,277.083 21.166 C 274.489 21.189,270.167 24.191,268.565 27.083 C 267.981 28.140,267.833 27.639,267.833 24.596 L 267.833 21.667 264.416 21.667 L 260.999 21.667 261.041 39.958 L 261.083 58.250 264.417 58.250 L 267.750 58.250 267.845 47.583 C 267.955 35.315,267.984 35.013,269.312 32.402 C 270.238 30.581,273.521 28.000,274.911 28.000 C 275.107 28.000,275.338 27.929,275.425 27.843 C 276.012 27.261,280.648 27.561,282.250 28.285 C 283.132 28.684,284.119 29.276,284.513 29.643 C 284.724 29.839,284.955 30.000,285.026 30.000 C 285.232 30.000,286.400 31.654,286.976 32.761 C 288.112 34.944,288.159 35.521,288.166 47.333 C 288.169 53.154,288.232 58.012,288.306 58.129 C 288.409 58.291,289.200 58.330,291.679 58.295 L 294.917 58.250 294.917 46.167 C 294.917 34.097,294.876 33.096,294.337 31.750 C 294.263 31.567,294.113 31.079,294.003 30.667 C 293.710 29.566,292.713 27.586,292.054 26.798 C 291.738 26.420,291.371 25.902,291.239 25.646 C 291.035 25.251,289.183 23.729,288.079 23.047 C 286.932 22.340,285.723 21.828,284.806 21.662 C 284.225 21.557,283.675 21.412,283.583 21.339 C 283.153 21.000,278.278 20.712,277.833 21.000 M316.750 20.990 C 316.475 21.066,315.811 21.136,315.275 21.147 C 314.739 21.158,314.064 21.269,313.775 21.395 C 313.486 21.521,312.950 21.704,312.583 21.802 C 310.808 22.277,310.039 22.563,309.553 22.932 C 309.261 23.153,308.960 23.333,308.884 23.333 C 308.661 23.333,307.014 24.477,305.707 25.540 C 304.032 26.902,302.171 29.367,301.082 31.667 C 300.930 31.988,300.749 32.362,300.680 32.500 C 300.610 32.637,300.423 33.200,300.263 33.750 C 300.103 34.300,299.908 34.873,299.830 35.022 C 299.107 36.408,299.106 42.175,299.829 44.833 C 300.116 45.887,300.412 46.988,300.488 47.279 C 300.564 47.570,300.769 48.020,300.945 48.279 C 301.120 48.538,301.411 49.050,301.590 49.417 C 302.030 50.315,302.686 51.294,303.320 52.000 C 303.608 52.321,303.960 52.771,304.101 53.000 C 304.242 53.229,304.650 53.626,305.007 53.882 C 305.365 54.138,306.044 54.700,306.517 55.131 C 307.364 55.901,310.946 57.831,311.532 57.833 C 311.687 57.833,311.853 57.896,311.900 57.973 C 312.154 58.384,315.984 59.003,318.250 59.000 C 321.920 58.995,324.670 58.217,328.347 56.144 C 330.347 55.016,334.333 50.868,334.333 49.915 C 334.333 49.778,334.400 49.667,334.483 49.667 C 334.671 49.667,335.525 47.876,335.914 46.667 C 336.076 46.163,336.276 45.574,336.358 45.360 C 336.677 44.523,337.193 40.242,337.094 39.250 C 336.936 37.665,336.661 35.993,336.396 35.000 C 336.261 34.496,336.070 33.783,335.971 33.417 C 335.756 32.617,334.866 30.808,334.085 29.583 C 333.272 28.307,331.390 26.107,330.716 25.643 C 330.305 25.361,329.616 24.819,329.184 24.440 C 328.259 23.627,325.601 22.327,323.833 21.823 C 323.146 21.627,322.433 21.405,322.250 21.329 C 321.940 21.202,321.068 21.112,318.333 20.927 C 317.737 20.886,317.025 20.915,316.750 20.990 M89.744 21.874 C 89.700 21.989,89.683 30.221,89.707 40.167 L 89.750 58.250 92.979 58.295 C 95.219 58.327,96.277 58.282,96.437 58.150 C 96.629 57.990,96.667 55.548,96.667 43.250 C 96.667 31.171,96.707 28.508,96.890 28.356 C 97.042 28.229,99.106 28.157,103.431 28.127 L 109.750 28.083 109.750 24.917 L 109.750 21.750 99.787 21.707 C 91.905 21.673,89.807 21.708,89.744 21.874 M336.667 21.987 C 336.667 22.167,336.742 22.360,336.833 22.417 C 336.925 22.473,337.003 22.646,337.006 22.802 C 337.009 22.957,337.156 23.383,337.333 23.750 C 337.510 24.117,337.658 24.511,337.661 24.627 C 337.664 24.742,337.804 25.155,337.972 25.543 C 338.327 26.363,338.660 27.274,338.778 27.750 C 338.824 27.933,338.928 28.233,339.009 28.417 C 339.147 28.727,339.318 29.191,339.836 30.667 C 339.949 30.988,340.133 31.475,340.245 31.750 C 340.529 32.448,340.846 33.355,340.945 33.750 C 340.991 33.933,341.161 34.383,341.322 34.750 C 341.665 35.527,341.973 36.378,342.167 37.083 C 342.393 37.908,342.698 38.714,343.025 39.356 C 343.194 39.689,343.333 40.053,343.333 40.164 C 343.333 40.275,343.433 40.603,343.556 40.891 C 343.892 41.683,344.189 42.534,344.294 43.000 C 344.346 43.229,344.563 43.747,344.777 44.150 C 344.991 44.553,345.167 45.055,345.167 45.265 C 345.167 45.475,345.242 45.693,345.333 45.750 C 345.425 45.807,345.500 45.980,345.501 46.135 C 345.502 46.290,345.614 46.631,345.751 46.894 C 345.888 47.157,346.000 47.507,346.000 47.672 C 346.000 47.838,346.112 48.185,346.248 48.445 C 346.626 49.165,347.333 51.076,347.333 51.378 C 347.333 51.526,347.408 51.693,347.500 51.750 C 347.592 51.807,347.666 51.980,347.666 52.135 C 347.666 52.387,348.154 53.720,348.747 55.083 C 348.867 55.358,349.097 56.033,349.259 56.583 C 349.794 58.405,349.658 58.333,352.573 58.333 C 355.352 58.333,355.656 58.226,355.879 57.167 C 355.977 56.698,356.270 55.859,356.628 55.021 C 356.760 54.712,356.930 54.262,357.006 54.021 C 357.082 53.780,357.338 53.058,357.575 52.417 C 357.811 51.775,358.160 50.800,358.350 50.250 C 358.539 49.700,358.798 49.025,358.924 48.750 C 359.051 48.475,359.371 47.612,359.637 46.833 C 360.261 45.001,360.975 43.056,361.268 42.391 C 361.396 42.103,361.500 41.802,361.500 41.724 C 361.500 41.645,361.769 40.907,362.098 40.082 C 362.427 39.258,362.833 38.133,363.001 37.583 C 363.288 36.641,363.879 35.079,364.175 34.480 C 364.249 34.332,364.389 33.920,364.488 33.564 C 364.811 32.394,365.371 32.169,365.547 33.136 C 365.620 33.535,365.763 33.978,366.174 35.083 C 366.242 35.267,366.428 35.792,366.588 36.250 C 366.747 36.708,366.942 37.155,367.022 37.242 C 367.102 37.329,367.167 37.542,367.167 37.716 C 367.167 37.890,367.270 38.231,367.396 38.474 C 367.522 38.718,367.754 39.329,367.913 39.833 C 368.071 40.337,368.343 41.068,368.517 41.457 C 368.691 41.845,368.833 42.246,368.833 42.348 C 368.833 42.450,368.938 42.769,369.066 43.058 C 369.195 43.347,369.431 43.996,369.592 44.500 C 369.753 45.004,370.010 45.717,370.165 46.083 C 370.319 46.450,370.615 47.237,370.822 47.833 C 371.029 48.429,371.256 49.067,371.325 49.250 C 371.394 49.433,371.542 49.846,371.654 50.167 C 371.767 50.487,372.049 51.237,372.281 51.833 C 372.514 52.429,372.742 53.124,372.788 53.377 C 372.834 53.630,372.938 53.878,373.019 53.929 C 373.100 53.979,373.167 54.146,373.168 54.302 C 373.168 54.457,373.281 54.798,373.418 55.061 C 373.555 55.323,373.667 55.660,373.667 55.808 C 373.667 55.957,373.851 56.454,374.075 56.914 C 374.300 57.374,374.523 57.881,374.570 58.042 C 374.647 58.303,374.924 58.333,377.256 58.333 C 380.013 58.333,380.500 58.225,380.500 57.611 C 380.500 57.403,380.565 57.162,380.644 57.075 C 380.724 56.988,380.988 56.288,381.232 55.519 C 381.475 54.750,381.775 53.925,381.898 53.686 C 382.020 53.446,382.212 52.987,382.323 52.667 C 383.259 49.967,383.529 49.206,383.649 48.917 C 383.835 48.472,384.327 47.130,385.083 45.000 C 385.425 44.038,385.809 43.014,385.936 42.725 C 386.063 42.436,386.167 42.137,386.167 42.061 C 386.167 41.887,386.804 40.222,387.084 39.667 C 387.199 39.438,387.419 38.800,387.573 38.250 C 387.726 37.700,387.998 36.932,388.176 36.543 C 388.354 36.155,388.500 35.691,388.500 35.512 C 388.500 35.333,388.573 35.141,388.662 35.087 C 388.750 35.032,389.006 34.408,389.230 33.702 C 389.659 32.347,390.187 30.934,390.591 30.058 C 390.724 29.769,390.833 29.475,390.833 29.405 C 390.833 29.255,391.959 26.072,392.184 25.583 C 392.269 25.400,392.407 25.025,392.491 24.750 C 392.575 24.475,392.835 23.725,393.069 23.083 C 393.302 22.442,393.495 21.860,393.496 21.792 C 393.503 21.561,386.393 21.643,386.213 21.875 C 386.052 22.083,385.770 22.857,385.166 24.750 C 384.599 26.525,384.144 27.887,383.662 29.250 C 383.403 29.983,383.097 30.921,382.983 31.333 C 382.868 31.746,382.721 32.158,382.655 32.250 C 382.590 32.342,382.404 32.904,382.242 33.500 C 382.080 34.096,381.893 34.658,381.825 34.750 C 381.758 34.842,381.570 35.404,381.409 36.000 C 381.247 36.596,381.059 37.158,380.992 37.250 C 380.924 37.342,380.737 37.904,380.575 38.500 C 380.414 39.096,380.230 39.658,380.167 39.750 C 380.105 39.842,379.620 41.267,379.090 42.917 C 378.560 44.567,378.062 46.067,377.983 46.250 C 377.905 46.433,377.766 46.790,377.674 47.042 C 377.583 47.294,377.433 47.500,377.341 47.500 C 377.248 47.500,377.127 47.294,377.071 47.042 C 377.015 46.790,376.869 46.358,376.747 46.083 C 376.462 45.439,376.027 44.243,375.808 43.500 C 375.713 43.179,375.568 42.845,375.485 42.758 C 375.401 42.671,375.333 42.490,375.333 42.355 C 375.333 42.143,374.791 40.633,374.339 39.583 C 374.260 39.400,374.067 38.837,373.910 38.333 C 373.753 37.829,373.522 37.218,373.396 36.974 C 373.270 36.731,373.167 36.410,373.167 36.260 C 373.167 36.111,372.979 35.619,372.750 35.167 C 372.521 34.714,372.333 34.228,372.333 34.087 C 372.333 33.945,372.268 33.699,372.189 33.539 C 371.989 33.137,371.651 32.165,371.539 31.667 C 371.488 31.438,371.270 30.920,371.056 30.517 C 370.842 30.114,370.667 29.612,370.667 29.402 C 370.667 29.192,370.592 28.973,370.500 28.917 C 370.408 28.860,370.331 28.687,370.328 28.532 C 370.325 28.377,370.177 27.950,370.000 27.583 C 369.823 27.217,369.675 26.822,369.672 26.707 C 369.669 26.591,369.529 26.178,369.361 25.790 C 369.012 24.984,368.678 24.071,368.552 23.583 C 368.505 23.400,368.362 23.014,368.233 22.725 C 368.105 22.436,368.000 22.080,368.000 21.933 C 368.000 21.699,367.650 21.667,365.125 21.671 L 362.250 21.675 361.958 22.261 C 361.798 22.583,361.667 22.990,361.667 23.164 C 361.667 23.338,361.600 23.522,361.518 23.572 C 361.437 23.622,361.320 23.870,361.259 24.123 C 361.122 24.690,360.049 27.725,359.732 28.442 C 359.604 28.731,359.500 29.072,359.500 29.200 C 359.500 29.328,359.432 29.505,359.349 29.592 C 359.266 29.679,359.123 30.012,359.031 30.333 C 358.843 30.989,357.898 33.738,357.684 34.250 C 357.387 34.961,356.853 36.448,356.667 37.083 C 356.461 37.784,355.940 39.239,355.592 40.083 C 355.252 40.905,354.972 41.724,354.877 42.167 C 354.829 42.396,354.731 42.658,354.662 42.750 C 354.592 42.842,354.459 43.179,354.366 43.500 C 354.274 43.821,353.998 44.608,353.752 45.250 C 353.507 45.892,353.264 46.567,353.212 46.750 C 352.971 47.609,352.572 47.712,352.411 46.958 C 352.347 46.660,352.239 46.342,352.170 46.250 C 352.101 46.158,352.005 45.896,351.956 45.667 C 351.907 45.438,351.773 44.987,351.659 44.667 C 351.544 44.346,351.398 43.933,351.333 43.750 C 351.269 43.567,351.124 43.154,351.011 42.833 C 350.897 42.512,350.767 42.100,350.722 41.917 C 350.676 41.733,350.581 41.433,350.511 41.250 C 350.186 40.402,349.959 39.715,349.877 39.333 C 349.829 39.104,349.732 38.842,349.664 38.750 C 349.595 38.658,349.483 38.323,349.415 38.005 C 349.347 37.688,349.235 37.313,349.166 37.172 C 349.097 37.032,348.912 36.504,348.756 36.000 C 348.600 35.496,348.414 34.933,348.344 34.750 C 348.085 34.073,347.802 33.241,347.722 32.917 C 347.676 32.733,347.581 32.433,347.511 32.250 C 347.254 31.579,346.969 30.742,346.888 30.417 C 346.843 30.233,346.748 29.933,346.678 29.750 C 346.420 29.079,346.136 28.242,346.055 27.917 C 346.010 27.733,345.910 27.433,345.834 27.250 C 345.757 27.067,345.566 26.504,345.408 26.000 C 345.250 25.496,345.063 24.933,344.991 24.750 C 344.920 24.567,344.735 24.004,344.581 23.500 C 344.426 22.996,344.211 22.396,344.102 22.167 L 343.904 21.750 340.285 21.705 C 336.787 21.662,336.667 21.671,336.667 21.987 M133.855 27.976 C 134.554 28.144,135.642 28.534,136.271 28.843 C 137.257 29.327,137.746 29.680,139.333 31.057 C 139.996 31.632,141.328 33.627,141.854 34.833 C 141.954 35.063,142.097 35.370,142.171 35.517 C 142.245 35.664,142.358 36.134,142.422 36.561 C 142.486 36.988,142.605 37.378,142.686 37.429 C 142.879 37.548,142.869 41.914,142.674 42.667 C 142.006 45.243,140.359 48.083,138.807 49.337 C 137.423 50.456,134.921 51.833,134.275 51.833 C 134.134 51.833,133.979 51.898,133.930 51.978 C 133.774 52.231,130.692 52.551,129.444 52.444 C 117.677 51.437,113.667 37.036,123.099 29.655 C 123.582 29.278,125.458 28.417,126.333 28.172 C 126.746 28.057,127.233 27.898,127.417 27.819 C 128.326 27.428,131.936 27.516,133.855 27.976 M240.833 28.092 C 241.704 28.334,242.518 28.616,242.643 28.718 C 242.886 28.918,243.139 29.073,244.020 29.564 C 247.852 31.699,250.531 38.293,249.344 42.667 C 248.515 45.723,247.036 48.137,245.027 49.715 C 244.025 50.502,241.495 51.833,241.000 51.833 C 240.854 51.833,240.662 51.903,240.575 51.987 C 240.378 52.179,238.106 52.500,236.946 52.500 C 235.426 52.500,232.088 51.724,231.500 51.235 C 231.362 51.120,230.838 50.820,230.333 50.568 C 227.702 49.251,224.846 44.842,224.829 42.069 C 224.827 41.710,224.761 41.138,224.681 40.797 C 224.502 40.026,224.895 36.642,225.250 35.893 C 225.387 35.603,225.500 35.281,225.500 35.178 C 225.500 34.465,227.419 31.685,228.530 30.790 C 228.898 30.493,229.436 30.055,229.725 29.816 C 230.513 29.165,231.632 28.590,232.750 28.261 C 233.300 28.099,233.900 27.901,234.083 27.821 C 235.134 27.362,238.724 27.507,240.833 28.092 M321.508 27.978 C 322.662 28.312,324.238 29.045,324.415 29.330 C 324.472 29.424,324.638 29.500,324.784 29.500 C 325.720 29.500,329.500 34.412,329.500 35.630 C 329.500 35.797,329.563 36.005,329.640 36.092 C 330.299 36.838,330.446 41.447,329.874 43.417 C 328.986 46.475,327.100 49.123,324.867 50.449 C 323.127 51.482,322.788 51.651,322.130 51.808 C 321.738 51.902,321.117 52.056,320.750 52.149 C 310.851 54.681,302.611 43.658,307.315 34.177 C 308.426 31.939,312.025 28.500,313.257 28.500 C 313.403 28.500,313.684 28.413,313.882 28.307 C 315.409 27.490,319.245 27.324,321.508 27.978 M34.874 39.876 L 25.667 49.084 25.667 58.372 L 25.667 67.660 26.042 67.752 C 26.248 67.803,28.292 67.823,30.583 67.797 L 34.750 67.750 34.833 55.500 C 34.914 43.604,34.926 43.235,35.250 42.742 C 35.433 42.463,35.757 41.962,35.969 41.628 C 37.077 39.882,37.289 39.857,51.042 39.844 L 62.667 39.833 62.667 35.514 C 62.667 33.138,62.621 31.075,62.566 30.930 C 62.475 30.694,61.501 30.667,53.273 30.667 L 44.082 30.667 34.874 39.876 \"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n )\n}\n\nexport { RampnowIcon }\n","export { BinanceIcon } from './BinanceIcon'\nexport { RampnowIcon } from './RampnowIcon'\nexport { SimplexIcon } from './SimplexIcon'\n","import { useQuery } from '@tanstack/react-query'\n\nconst STALE_TIME_MS = 5 * 60 * 1000 // 5 minutes\n\nexport type CoinMetaListItem = { id: string; symbol: string; name: string }\n\nexport function useCoinsMetaList() {\n return useQuery({\n retry: false,\n staleTime: STALE_TIME_MS,\n queryKey: ['assets-list-coingecko-query'],\n queryFn: async () => {\n const response = await fetch('https://api.coingecko.com/api/v3/coins/list', { method: 'GET' })\n return (await response.json()) as CoinMetaListItem[]\n }\n })\n}\n\nexport interface CoinMetaResponse {\n id: string\n symbol: string\n name: string\n\n image: {\n thumb: string\n small: string\n large: string\n }\n\n market_data: {\n current_price: { [k: string]: number } // currencies object, k - 'usd', 'eur', etc.\n }\n}\n\nexport function useCoinMeta(coingeckoId?: string) {\n return useQuery({\n enabled: !!coingeckoId,\n retry: false,\n staleTime: STALE_TIME_MS,\n queryKey: ['asset-meta-coingecko-query', coingeckoId],\n queryFn: async () => {\n const response = await fetch(`https://api.coingecko.com/api/v3/coins/${coingeckoId}`, { method: 'GET' })\n return (await response.json()) as CoinMetaResponse\n }\n })\n}\n","import { useT } from '@/src/i18n'\nimport { Loader } from 'lucide-react'\n\nimport { useCoinMeta } from '../../../hooks/useCoinsMeta'\nimport { formatPrice } from '../../../lib/priceFormatter'\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport type { FundWalletControl } from '../interfaces'\n\ninterface CoinItem {\n cryptoCurrency: string\n meta: { id: string; symbol: string; name: string } | undefined\n}\n\ntype CoinItemProps = CoinItem & Pick<FundWalletControl, 'selectedCrypto' | 'setSelectedCrypto'>\n\nfunction CoinItem(props: CoinItemProps) {\n const { cryptoCurrency, meta, selectedCrypto, setSelectedCrypto } = props\n\n const { data: metaData, isLoading: isMetaDataLoading } = useCoinMeta(meta?.id)\n\n // console.warn('[BINANCE] coinsMeta', isMetaDataLoading, metaData)\n\n return (\n <Button\n size=\"large\"\n disabled={isMetaDataLoading}\n variant={selectedCrypto === cryptoCurrency ? 'default' : 'outline'}\n onClick={() => setSelectedCrypto(cryptoCurrency)}\n className=\"justify-between\"\n >\n {isMetaDataLoading && <Loader className=\"w-4 h-4 animate-spin\" />}\n\n {metaData ? (\n <>\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <img src={metaData.image.thumb} alt={meta?.name} className=\"w-8 h-8 object-contain rounded-full\" />\n <span>{meta?.symbol?.toUpperCase() || cryptoCurrency}</span>\n </div>\n\n {metaData.market_data?.current_price?.usd && (\n <span>${formatPrice(metaData.market_data.current_price.usd)}</span>\n )}\n </>\n ) : (\n <span>{cryptoCurrency}</span>\n )}\n </Button>\n )\n}\n\ninterface CoinSelectorProps {\n coins: CoinItem[]\n control: FundWalletControl\n}\n\nexport function CoinSelector(props: CoinSelectorProps) {\n const { coins, control } = props\n const { selectedCrypto, setSelectedCrypto } = control\n\n const { t } = useT()\n\n return (\n <>\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:buyMenu.selectCrypto')}</span>\n\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {coins.length ? (\n coins.map(({ cryptoCurrency, meta }) => (\n <CoinItem\n key={`${cryptoCurrency}-${meta.id}`}\n meta={meta}\n cryptoCurrency={cryptoCurrency}\n selectedCrypto={selectedCrypto}\n setSelectedCrypto={setSelectedCrypto}\n />\n ))\n ) : (\n <Highlight type=\"info\">\n <span className=\"text-[10px]\">No crypto available to purchase at the moment.</span>\n </Highlight>\n )}\n </div>\n </>\n )\n}\n","import { cn } from '@/lib/utils'\nimport { useT } from '@/src/i18n'\nimport React from 'react'\n\nimport { Button } from '../../ui/button'\nimport type { PaymentSelectButtonProps } from '../interfaces'\n\ninterface PaymentSelectorProps {\n paymentMode: string | null\n paymentModes: PaymentSelectButtonProps[]\n disabled?: boolean\n setPaymentMode: React.Dispatch<React.SetStateAction<string | null>>\n}\n\nfunction PaymentSelector(props: PaymentSelectorProps): React.JSX.Element | null {\n const { paymentMode, paymentModes, disabled, setPaymentMode } = props\n\n const { t } = useT()\n\n if (!paymentModes.length) return null\n\n return (\n <>\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:buyMenu.selectPaymentMode')}</span>\n\n <div className=\"w-full flex gap-2 items-center justify-evenly flex-wrap\">\n {paymentModes.map((pMode) => (\n <Button\n key={pMode.id}\n type=\"button\"\n disabled={disabled}\n variant={paymentMode === pMode.id ? 'outline' : 'ghost'}\n onClick={() => setPaymentMode(pMode.id as string)}\n // className=\"flex-1 w-full\"\n size=\"large\"\n >\n {pMode.caption}\n </Button>\n ))}\n </div>\n </>\n )\n}\n\nexport { PaymentSelector }\n","import { useT } from '@/src/i18n'\n\n// import { Loader } from 'lucide-react'\n\n// import { formatPrice } from '../../../lib/priceFormatter'\n// import { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport type { FundWalletControl } from '../interfaces'\n\ninterface CoinSelectorProps {\n fiats: any[]\n control: FundWalletControl\n}\n\nexport function FiatSelector(props: CoinSelectorProps) {\n // const { fiats, control } = props\n\n const { t } = useT()\n\n return (\n <>\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:buyMenu.selectFiat')}</span>\n\n <Highlight type=\"info\">\n <span className=\"text-[10px]\">No fiat available to purchase for at the moment.</span>\n </Highlight>\n </>\n )\n}\n","export { CoinSelector } from './CoinSelector'\nexport { PaymentSelector } from './PaymentSelector'\nexport { FiatSelector } from './FiatSelector'\n","const QUERY_KEYS = {\n // RAMPNOW\n getRampNowConfig: 'get-rampnow-config-query',\n getRampNowQuote: 'get-rampnow-quote-query',\n\n // BINANCE\n binanceNetworksQuery: 'binance-networks-query',\n binanceTradingPairs: 'binance-trading-pairs-query',\n binancePaymentModes: 'binance-payment-modes-query',\n binanceQuote: 'binance-quote-query',\n\n // SIMPLEX\n simplexCurrencies: 'simplex-currencies-query',\n simplexQuote: 'simplex-quote-query'\n}\n\nexport { QUERY_KEYS }\n","import { getAccessToken } from '../../../lib//utils'\nimport { getIframeManager } from '../../../lib/iframe-manager'\n\n// import { NETWORKS_MOCK_RESPONSE } from './mock'\n\n// Types\nexport interface PaymentMethod {\n payMethodCode: string\n payMethodSubCode: string\n paymentMethod: string\n fiatMinLimit: string\n fiatMaxLimit: string\n cryptoMinLimit: string\n cryptoMaxLimit: string\n p2p: boolean\n /** 0: no restriction, 1: T+1 restriction */\n withdrawRestriction: number\n}\n\nasync function checkIsLumaiAvailableQuery() {\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('BINANCE_CHECK_IS_LUMIA_AVAILABLE_QUERY', { accessToken })) as boolean\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/2.get-crypto-networks\n */\ninterface BinanceCurrency {\n cryptoCurrency: string\n networks: {\n network: string\n addressRegex: string\n memoRegex: string\n withdrawFee: number\n withdrawMinAmount: number\n withdrawMaxAmount: number\n contractAddress: string\n withdrawEnable: boolean\n depositEnable: boolean\n }[]\n}\n\nasync function getLumiaNetworkQuery(): Promise<BinanceCurrency[]> {\n // return new Promise((resolve) => {\n // setTimeout(() => resolve(NETWORKS_MOCK_RESPONSE.data), 1500)\n // })\n\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('BINANCE_GET_LUMIA_NETWORK_QUERY', { accessToken })) as BinanceCurrency[]\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/3.get-payment-method-list\n */\ninterface GetPaymentMethodsQueryPayload {\n totalAmount: string\n}\n\nasync function getPaymentMethodsQuery(payload: GetPaymentMethodsQueryPayload): Promise<PaymentMethod[]> {\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('BINANCE_GET_PAYMENT_METHODS_QUERY', {\n ...payload,\n accessToken\n })) as PaymentMethod[]\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/3.get-payment-method-list\n */\ninterface GetQuoteQueryPayload {\n network: string\n walletAddress: string\n requestedAmount: string\n payMethodCode?: string\n payMethodSubCode?: string\n}\n\ninterface QuoteDataResponse {\n totalAmount: string\n quotePrice: string\n feeAmount: string\n feeCurrency: string\n networkFee: string\n payMethodCode: string\n payMethodSubCode: string\n}\n\nasync function getQuoteQuery(payload: GetQuoteQueryPayload): Promise<QuoteDataResponse> {\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('BINANCE_GET_QUOTE_QUERY', {\n ...payload,\n accessToken\n })) as QuoteDataResponse\n}\n\n/**\n * @link https://developers.binance.com/docs/binance_connect/on-ramp-buy-apis/5.pre-order#example-1\n */\ninterface PreorderMutationPayload {\n requestedAmount: string\n address: string\n payMethodCode?: string\n payMethodSubCode?: string\n redirectUrl?: string\n failRedirectUrl?: string\n network: string\n}\n\ninterface PreorderMutationResult {\n link: string\n /** Unix timestamp, ex 1742222863560 */\n linkExpireTime: number\n}\n\nasync function createPreorderMutation(payload: PreorderMutationPayload): Promise<PreorderMutationResult> {\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('BINANCE_CREATE_PREORDER_MUTATION', {\n ...payload,\n accessToken\n })) as PreorderMutationResult\n}\n\nexport {\n checkIsLumaiAvailableQuery,\n getLumiaNetworkQuery,\n getPaymentMethodsQuery,\n getQuoteQuery,\n createPreorderMutation\n}\n","import type { PaymentMethod } from './api'\n\nfunction getPayMethodID(pm: PaymentMethod) {\n return `${pm.payMethodCode}-${pm.payMethodSubCode}`\n}\n\ninterface BinanceErrorElement {\n error: string | null\n message: string | null\n}\n\nfunction handleErrors(errors: (Error | null)[]) {\n for (const err of errors) {\n if (!err) continue\n\n //@ts-expect-error\n return !!err?.response?.data\n ? //@ts-expect-error\n (err.response.data as BinanceErrorElement)\n : ({ error: 'Error', message: err?.message } as BinanceErrorElement)\n }\n\n return { error: null, message: null }\n}\n\nexport { getPayMethodID, handleErrors }\n","import { useEffect } from 'react'\n\n// import { toastError } from '../../../../components/Toast'\nimport { handleErrors } from './utils'\n\nconst useQueriesErrorHandler = (\n errors: (Error | null)[],\n stateUpdater: React.Dispatch<React.SetStateAction<number>>\n) => {\n const { error: errorTitle, message: errorMessage } = handleErrors(errors)\n\n useEffect(() => {\n if (!errorTitle && !errorMessage) return\n // toastError(`${errorTitle}\\n ${errorMessage}`)\n console.error(`[BuyModal][Binance] ${errorTitle}: ${errorMessage}`)\n\n // Reset input amount to re-trigger Expandable\n stateUpdater(1)\n setTimeout(() => stateUpdater(0), 0)\n }, [errorTitle, errorMessage])\n\n return { errorMessage }\n}\n\nexport { useQueriesErrorHandler }\n","import { cn } from '@/lib/utils'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { DollarSign, Loader } from 'lucide-react'\nimport React, { useEffect, useRef } from 'react'\n\nimport { useCoinMeta, useCoinsMetaList } from '../../../hooks/useCoinsMeta'\nimport { formatPrice } from '../../../lib/priceFormatter'\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport { Input } from '../../ui/input'\nimport { CoinSelector, FiatSelector, PaymentSelector } from '../components'\nimport { REDIRECT_TIMEOUT_MS } from '../contants'\nimport type { FundWalletProps } from '../interfaces'\nimport { QUERY_KEYS } from '../queryKeys'\nimport {\n createPreorderMutation,\n getLumiaNetworkQuery,\n getPaymentMethodsQuery,\n getQuoteQuery,\n type PaymentMethod\n} from './api'\nimport { useQueriesErrorHandler } from './useQueriesErrorHandler'\nimport { getPayMethodID } from './utils'\n\n// const BINANCE_LUMIA_NETWORK = 'LUMIA'\n\nfunction Binance(props: FundWalletProps): React.JSX.Element {\n const { control } = props\n\n const qc = useQueryClient()\n const { t } = useT()\n\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n const walletAddress = useLumiaPassportSession((st) => st.address)\n\n const {\n // containerRef,\n inputRef,\n\n srcQueryAmount,\n srcInputAmount,\n\n paymentMode,\n\n redirecting,\n\n selectedCrypto,\n\n isCryptoSelector,\n isFiatSelector,\n\n setIsCryptoSelector,\n setIsFiatSelector,\n setSelectedCrypto,\n setRedirecting,\n setPaymentMode,\n setMinAmount,\n setSrcInputAmount\n } = control\n\n const { data: coinsMeta, isLoading: isCoinsMetaLoading } = useCoinsMetaList()\n\n const selectedCryptoMeta = coinsMeta?.find(\n (coinMeta) => coinMeta.symbol.toLowerCase() === (selectedCrypto || '').toLowerCase()\n )\n\n const { data: selectedCryptoFullMeta, isLoading: isSelectedCryptoFullMetaLoading } = useCoinMeta(\n selectedCryptoMeta?.id\n )\n\n // console.warn('[BINANCE] coinsMeta', isCoinsMetaLoading, coinsMeta)\n\n /** Query crypto to buy under current network (chain) */\n const {\n data: networks = [],\n isLoading: isNetworksLoading,\n error: networksError\n } = useQuery({\n retry: false,\n enabled: !!walletAddress,\n queryKey: [QUERY_KEYS.binanceNetworksQuery, walletAddress],\n queryFn: getLumiaNetworkQuery,\n select: (data) =>\n data\n .filter((ntw) => ntw.networks.map((n) => n.network).includes(chainConfig?.name))\n .map((n) => ({\n ...n,\n meta: coinsMeta?.find((meta) => meta.symbol.toLowerCase() === n.cryptoCurrency.toLowerCase())\n }))\n })\n\n useEffect(() => {\n if (!networks.length) return\n if (!selectedCrypto) setSelectedCrypto(networks[0].cryptoCurrency)\n }, [networks])\n\n // console.warn('[BINANCE] networks query data', networksCurrencies)\n\n /** Query crypto to buy under current network (chain) */\n const {\n data: paymentModes = null,\n isLoading: isPaymentModesLoading,\n error: paymentMethodsError\n } = useQuery({\n retry: false,\n enabled: !!selectedCrypto && !!walletAddress, // && srcQueryAmount > 0,\n queryKey: [QUERY_KEYS.binancePaymentModes, walletAddress, srcQueryAmount],\n queryFn: async () => getPaymentMethodsQuery({ totalAmount: String(srcQueryAmount || 1) })\n })\n\n const lastLoadedPaymentModes = useRef<PaymentMethod[]>([])\n useEffect(() => {\n if (!paymentModes?.length) return\n setPaymentMode(getPayMethodID(paymentModes[0]))\n lastLoadedPaymentModes.current = paymentModes\n }, [paymentModes])\n\n const selectedPaymentMode = paymentModes?.find((el) => getPayMethodID(el) === paymentMode) || null\n\n const minimum = Number(selectedPaymentMode?.fiatMinLimit || '0')\n useEffect(() => setMinAmount(minimum), [minimum])\n\n const {\n data: quoteData = null,\n isLoading: isQuoteDataLoading,\n error: quoteError\n } = useQuery({\n retry: false,\n enabled: !!selectedCrypto && !!walletAddress && srcQueryAmount > 0 && minimum > 0 && srcQueryAmount >= minimum,\n queryKey: [QUERY_KEYS.binanceQuote, walletAddress, selectedPaymentMode, srcQueryAmount],\n queryFn: async () =>\n getQuoteQuery({\n network: 'LUMIA', // BINANCE_LUMIA_NETWORK,\n walletAddress,\n requestedAmount: String(srcQueryAmount),\n payMethodCode: selectedPaymentMode?.payMethodCode,\n payMethodSubCode: selectedPaymentMode?.payMethodSubCode\n })\n })\n\n // console.log('[BINANCE] selectedMethod & paymentMethods\\n', selectedPaymentMode, paymentModes)\n // console.log('[BINANCE] paymentModes\\n', quoteData)\n\n const { errorMessage } = useQueriesErrorHandler([networksError, paymentMethodsError, quoteError], setSrcInputAmount)\n\n const { mutate: checkoutFundWalletOrder, isPending: isFundWalletOrderCheckouting } = useMutation({\n mutationFn: async () => {\n setRedirecting(true)\n\n const returnUrl = window.location.href.split('?')[0]\n\n return createPreorderMutation({\n requestedAmount: String(srcQueryAmount),\n payMethodCode: selectedPaymentMode?.payMethodCode,\n payMethodSubCode: selectedPaymentMode?.payMethodSubCode,\n network: 'LUMIA', // BINANCE_LUMIA_NETWORK,\n address: walletAddress,\n redirectUrl: returnUrl,\n failRedirectUrl: returnUrl\n })\n },\n\n onSuccess: ({ link, linkExpireTime }) => {\n // toastInfo(\"Redirecting to Binance-Connect Payment Page\");\n\n setTimeout(() => {\n setRedirecting(false)\n window.open(link, '_blank', 'noopener,noreferrer')\n }, REDIRECT_TIMEOUT_MS)\n },\n\n onError: (err) => {\n setRedirecting(false)\n // toastError(err?.message || \"Create Checkout Order failed\");\n }\n })\n\n // on unmount\n useEffect(() => {\n return () => {\n qc.resetQueries({ queryKey: [QUERY_KEYS.binanceNetworksQuery] })\n qc.resetQueries({ queryKey: [QUERY_KEYS.binancePaymentModes] })\n qc.resetQueries({ queryKey: [QUERY_KEYS.binanceQuote] })\n }\n }, [qc])\n\n if (isCryptoSelector) return <CoinSelector coins={networks} control={control} />\n if (isFiatSelector) return <FiatSelector fiats={[]} control={control} />\n\n const receiveLumiaAmount = Number(quoteData?.totalAmount || '0')\n\n const isLoading = !!isNetworksLoading || !!isQuoteDataLoading || !!isPaymentModesLoading\n\n const isContinueDisabled =\n !!redirecting ||\n !!isLoading ||\n !!isFundWalletOrderCheckouting ||\n !quoteData ||\n srcInputAmount < minimum ||\n srcInputAmount !== srcQueryAmount\n\n const localError = errorMessage?.length\n ? errorMessage\n : srcInputAmount < minimum\n ? `Provider min: \\$${minimum}`\n : undefined\n\n const isCryptoSelectorLoading = isNetworksLoading || isCoinsMetaLoading || isSelectedCryptoFullMetaLoading\n\n return (\n <>\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:buyMenu.selectCrypto')}</span>\n\n <Button\n disabled={isCryptoSelectorLoading}\n variant=\"outline\"\n className=\"w-full justify-between\"\n onClick={() => setIsCryptoSelector(true)}\n >\n {isCryptoSelectorLoading && <Loader className=\"w-4 h-4 animate-spin\" />}\n\n {!isCryptoSelectorLoading && (\n <>\n {selectedCryptoFullMeta ? (\n <>\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <img\n src={selectedCryptoFullMeta.image.thumb}\n alt={selectedCryptoFullMeta?.name}\n className=\"w-8 h-8 object-contain rounded-full\"\n />\n <span>{selectedCryptoFullMeta.symbol.toUpperCase()}</span>\n </div>\n\n {selectedCryptoFullMeta.market_data?.current_price?.usd && (\n <span>${formatPrice(selectedCryptoFullMeta.market_data.current_price.usd)}</span>\n )}\n </>\n ) : (\n selectedCrypto?.toUpperCase() || t('passport:buyMenu.selectCrypto')\n )}\n </>\n )}\n </Button>\n\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:buyMenu.selectFiat')}</span>\n\n <Button\n // disabled={true}\n variant=\"outline\"\n className=\"w-full justify-between\"\n onClick={() => setIsFiatSelector(true)}\n >\n {t('passport:buyMenu.selectFiat')}\n </Button>\n\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:buyMenu.enterAmount')}</span>\n\n <Input\n ref={inputRef}\n Icon={DollarSign}\n name=\"binance-onramp-input\"\n disabled={isLoading || !selectedCrypto} // || !selectedFiat\n autoComplete=\"off\"\n type=\"number\"\n placeholder={t('passport:buyMenu.enterAmount')}\n step=\"any\"\n value={srcInputAmount || ''}\n onChange={(e) => setSrcInputAmount(+e.target.value)}\n />\n\n {/* {!localError && ((receiveLumiaAmount || 0) > 0 || isLoading) && (\n <div className={cn('flex justify-between gap-4 mt-2 text-sm leading-4', { 'opacity-60': srcInputAmount <= 0 })}>\n {isLoading ? (\n <Loader size={16} className=\"animate-spin\" />\n ) : (\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'You receive:'}</span>\n )}\n {(receiveLumiaAmount || 0) > 0 && <span>{`${receiveLumiaAmount || 0} LUMIA`}</span>}\n </div>\n )} */}\n\n <PaymentSelector\n disabled={isLoading}\n paymentMode={paymentMode}\n setPaymentMode={setPaymentMode}\n paymentModes={(paymentModes || lastLoadedPaymentModes.current).map((item) => ({\n id: getPayMethodID(item),\n caption: item.paymentMethod\n }))}\n />\n\n <Button\n size=\"large\"\n disabled={isContinueDisabled}\n className={cn('w-full h-12 flex-none', { 'cursor-pointer': !isContinueDisabled })}\n variant=\"default\"\n onClick={() => checkoutFundWalletOrder()}\n >\n {redirecting && <Loader size={16} className=\"animate-spin\" />}\n <span>{redirecting ? 'REDIRECTING...' : 'CONTINUE'}</span>\n </Button>\n\n {/* uncomment later */}\n {/* {localError && <Highlight type=\"error\">{localError}</Highlight>} */}\n </>\n )\n}\n\nexport { Binance }\n","export { Binance } from './Binance'\n","import { getIframeManager } from '../../../lib/iframe-manager'\nimport { getAccessToken } from '../../../lib/utils'\nimport type { RampnowConfigResponse, RampOrderQuotePayload, RampOrderQuoteQueryResponse } from './interfaces'\n\nexport async function getRampnowConfigQuery(): Promise<RampnowConfigResponse> {\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('RAMPNOW_GET_CONFIG', { accessToken })) as RampnowConfigResponse\n}\n\nexport async function getRampOrderQuoteQuery(payload: RampOrderQuotePayload): Promise<RampOrderQuoteQueryResponse> {\n const accessToken = getAccessToken()\n if (!accessToken) {\n throw new Error('Access token is not available')\n }\n\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager is not initialized')\n }\n\n return (await iframeManager.sendMessage('RAMPNOW_GET_ORDER_QUOTE', {\n ...payload,\n accessToken\n })) as RampOrderQuoteQueryResponse\n}\n","import type { PaymentSelectButtonProps } from '../interfaces'\n\nconst MINIMUM_RAMP_AMOUNT = 30\n\nconst PAYMENT_MODES: PaymentSelectButtonProps[] = [\n { id: 'card', caption: 'Card' }, // logo: cardPayIcon\n { id: 'apple_pay', caption: 'Apple Pay' }, //logo: applePayIcon\n { id: 'google_pay', caption: 'Google Pay' } //logo: googlePayIcon\n]\n\nconst ORDER_URL_QUERIES = [\n ['orderType', 'buy'],\n ['srcChain', 'fiat'],\n ['srcCurrency', 'USD'],\n ['dstChain', 'lumia'],\n ['dstCurrency', 'LUMIA']\n // ['apiKey', RAMPNOW_API_KEY]\n]\n\nexport { PAYMENT_MODES, ORDER_URL_QUERIES, MINIMUM_RAMP_AMOUNT }\n","import { cn } from '@/lib/utils'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { DollarSign, LoaderIcon } from 'lucide-react'\nimport React, { useEffect } from 'react'\n\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport { Input } from '../../ui/input'\nimport { PaymentSelector } from '../components/PaymentSelector'\nimport { REDIRECT_TIMEOUT_MS } from '../contants'\nimport type { FundWalletProps } from '../interfaces'\nimport { QUERY_KEYS } from '../queryKeys'\nimport { getRampnowConfigQuery, getRampOrderQuoteQuery } from './api'\nimport { MINIMUM_RAMP_AMOUNT, ORDER_URL_QUERIES, PAYMENT_MODES } from './constants'\nimport type { RampNowPaymentMode } from './interfaces'\n\nfunction Rampnow(props: FundWalletProps): React.JSX.Element {\n const { walletAddress, control } = props\n const {\n inputRef,\n srcQueryAmount,\n srcInputAmount,\n paymentMode,\n redirecting,\n setRedirecting,\n setPaymentMode,\n setSrcInputAmount,\n setMinAmount\n } = control\n\n const qc = useQueryClient()\n\n useEffect(() => {\n setMinAmount(MINIMUM_RAMP_AMOUNT)\n setPaymentMode(PAYMENT_MODES[0].id)\n }, [])\n\n const {\n data: configData,\n isLoading: isConfigLoading,\n error: configError\n } = useQuery({\n retry: false,\n enabled: !!walletAddress,\n queryKey: [QUERY_KEYS.getRampNowConfig, walletAddress],\n queryFn: getRampnowConfigQuery\n })\n\n const {\n data: quoteData,\n isLoading: isQuoteDataLoading,\n error: quoteError\n } = useQuery({\n retry: false,\n enabled: !!configData && !!walletAddress && !!paymentMode && srcQueryAmount >= MINIMUM_RAMP_AMOUNT,\n queryKey: [QUERY_KEYS.getRampNowQuote, walletAddress, srcQueryAmount, paymentMode],\n queryFn: () =>\n getRampOrderQuoteQuery({\n walletAddress,\n srcAmount: srcQueryAmount,\n paymentMode: paymentMode as RampNowPaymentMode\n })\n })\n\n const { mutate: checkoutFundWalletOrder, isPending: isFundWalletOrderCheckouting } = useMutation({\n mutationFn: async () => {\n if (!configData?.apiKey?.length || !configData?.orderUrl?.length) {\n throw new Error('RampNow order service is not available')\n }\n\n setRedirecting(true)\n\n // TODO: get order id from BE to track order status via RAMPNOW webhook\n\n const returnUrl = window.location.href.split('?')[0]\n const params = new URLSearchParams('')\n\n // console.log('[RAMPNOW returnUrl]', returnUrl)\n\n ORDER_URL_QUERIES.forEach(([paramName, paramVal]) => params.append(paramName, paramVal))\n\n params.append('srcAmount', `${srcQueryAmount}`)\n params.append('paymentMode', paymentMode!)\n params.append('walletAddress', walletAddress)\n // params.append('externalOrderUid', token?.contract || `${uid(32)}`)\n params.append('returnUrl', returnUrl)\n params.append('apiKey', configData.apiKey)\n\n const redirectUrl = `${configData.orderUrl}/order/confirm?${params.toString()}`\n\n console.log('[RAMPNOW order url]', redirectUrl)\n\n return { redirectUrl }\n },\n\n onSuccess: ({ redirectUrl }) => {\n // toastInfo('Redirecting to Rampnow Payment Page')\n\n setTimeout(() => {\n setRedirecting(false)\n window.open(redirectUrl, '_blank', 'noopener,noreferrer')\n }, REDIRECT_TIMEOUT_MS)\n },\n\n onError: (err) => {\n setRedirecting(false)\n console.error('Create CheckoutOrder failed:', err)\n // toastError(err?.message || 'Create CheckoutOrder failed')\n }\n })\n\n // on unmount\n useEffect(() => {\n return () => {\n qc.resetQueries({ queryKey: [QUERY_KEYS.getRampNowConfig] })\n qc.resetQueries({ queryKey: [QUERY_KEYS.getRampNowQuote] })\n }\n }, [qc])\n\n const receiveLumiaAmount = Number(quoteData?.data?.dstAmount || '0')\n\n const isLoading = isConfigLoading || isQuoteDataLoading\n\n const isContinueDisabled =\n !!redirecting ||\n !!isLoading ||\n !!isFundWalletOrderCheckouting ||\n !quoteData ||\n srcInputAmount < MINIMUM_RAMP_AMOUNT ||\n srcInputAmount !== srcQueryAmount\n\n const errorMessage = quoteError?.message || configError?.message || null\n const localError = errorMessage?.length\n ? errorMessage\n : srcInputAmount < MINIMUM_RAMP_AMOUNT\n ? `Provider min: \\$${MINIMUM_RAMP_AMOUNT}`\n : undefined\n\n return (\n <>\n <Input\n ref={inputRef}\n Icon={DollarSign}\n name=\"rampnow-onramp-input\"\n disabled={isLoading}\n autoComplete=\"off\"\n type=\"number\"\n placeholder=\"Set desired USD amount\"\n step=\"any\"\n value={srcInputAmount || ''}\n onChange={(e) => setSrcInputAmount(+e.target.value)}\n />\n\n {localError && <Highlight type=\"error\">{localError}</Highlight>}\n\n {!localError && ((receiveLumiaAmount || 0) > 0 || isLoading) && (\n <div className={cn('flex justify-between gap-4 text-sm leading-4', { 'opacity-60': srcInputAmount <= 0 })}>\n {isLoading ? (\n <LoaderIcon size={16} className=\"animate-spin\" />\n ) : (\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'You receive:'}</span>\n )}\n {(receiveLumiaAmount || 0) > 0 && <span>{`${receiveLumiaAmount || 0} LUMIA`}</span>}\n </div>\n )}\n\n <PaymentSelector\n disabled={!configData || !quoteData || isLoading}\n paymentMode={paymentMode}\n paymentModes={PAYMENT_MODES}\n setPaymentMode={(paymentMode) => setPaymentMode(paymentMode as RampNowPaymentMode)}\n />\n\n <Button\n size=\"large\"\n disabled={isContinueDisabled}\n className={cn('w-full h-12 flex-none', { 'cursor-pointer': !isContinueDisabled })}\n variant=\"default\"\n onClick={() => checkoutFundWalletOrder()}\n >\n {redirecting && <LoaderIcon size={16} className=\"animate-spin\" />}\n <span>{redirecting ? 'REDIRECTING...' : 'CONTINUE'}</span>\n </Button>\n </>\n )\n}\n\nexport { Rampnow }\n","export { Rampnow } from './Rampnow'\n","import { BinanceIcon, RampnowIcon, SimplexIcon } from '@/assets/fiatProviders'\nimport type { FC } from 'react'\n\nimport { Binance } from './binance'\nimport type { FundWalletProps, RampProviderType } from './interfaces'\nimport { Rampnow } from './rampnow'\n\ninterface AvalabaleRampProvider {\n id: RampProviderType\n icon: FC<{ className?: string }>\n}\n\nconst ACTIVE_PROVIDER_CNS = {\n rampnow: 'text-[#c3f53c] bg-[#002c15] hover:text-[#c3f53c] active:text-[#c3f53c]',\n simplex: 'bg-[#081f2c]',\n binance: 'bg-[#f3ba2f]'\n}\n\nconst AVAILABLE_RAMP_PROVIDERS: AvalabaleRampProvider[] = [\n {\n id: 'binance',\n icon: BinanceIcon\n },\n {\n id: 'rampnow',\n icon: RampnowIcon\n }\n // {\n // id: 'simplex',\n // icon: SimplexIcon\n // }\n]\n\nconst RAMP_PROVIDERS: Record<RampProviderType, React.FC<FundWalletProps>> = {\n rampnow: Rampnow,\n simplex: () => <div>Simplex</div>,\n binance: Binance\n}\n\nconst REDIRECT_TIMEOUT_MS = 1500\n\nexport { AVAILABLE_RAMP_PROVIDERS, ACTIVE_PROVIDER_CNS, RAMP_PROVIDERS, REDIRECT_TIMEOUT_MS }\n","export function debounce<F extends (...args: any[]) => void>(func: F, waitFor: number) {\n let timeout: ReturnType<typeof setTimeout>\n\n return (...args: Parameters<F>) => {\n if (timeout) clearTimeout(timeout)\n\n timeout = setTimeout(() => func(...args), waitFor)\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { debounce } from '../../utils/debounce'\nimport type { RampProviderType } from './interfaces'\n\nconst ON_INPUT_QUERY_DELAY = 2000\n\nconst useSelectables = () => {\n const containerRef = useRef<HTMLInputElement | null>(null)\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n const [isCryptoSelector, setIsCryptoSelector] = useState<boolean>(false)\n const [isFiatSelector, setIsFiatSelector] = useState<boolean>(false)\n const [redirecting, setRedirecting] = useState<boolean>(false)\n\n const [rampProvider, setrRampProvider] = useState<RampProviderType>('binance')\n const [selectedCrypto, setSelectedCrypto] = useState<string | null>(null)\n\n const [minAmount, setMinAmount] = useState<number>(0)\n\n const [srcQueryAmount, setSrcQueryAmount] = useState<number>(0)\n const [srcInputAmount, setSrcInputAmount] = useState<number>(0)\n\n const [paymentMode, setPaymentMode] = useState<string | null>(null)\n\n // debounced query trigger\n const setQueryAmountDebounced = useCallback(\n debounce((inputAmount: number) => {\n const checkedValue = Math.max(inputAmount, minAmount)\n\n setSrcInputAmount(checkedValue)\n setSrcQueryAmount(checkedValue)\n }, ON_INPUT_QUERY_DELAY),\n [minAmount]\n )\n\n useEffect(() => setQueryAmountDebounced(srcInputAmount), [srcInputAmount, setQueryAmountDebounced])\n\n return {\n containerRef,\n inputRef,\n\n isCryptoSelector,\n setIsCryptoSelector,\n\n isFiatSelector,\n setIsFiatSelector,\n\n redirecting,\n setRedirecting,\n\n rampProvider,\n setrRampProvider,\n\n selectedCrypto,\n setSelectedCrypto,\n\n setMinAmount,\n\n srcQueryAmount,\n\n srcInputAmount,\n setSrcInputAmount,\n\n paymentMode,\n setPaymentMode\n }\n}\n\nexport { useSelectables }\n","import { cn } from '@/lib/utils'\nimport { useT } from '@/src/i18n'\nimport { ArrowLeft } from 'lucide-react'\nimport { type CSSProperties, type FC } from 'react'\n\nimport { useLumiaPassportSession } from '../../../context/LumiaPassportSessionContext'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Select, SelectContent, SelectItem, SelectTrigger } from '../ui/select'\nimport { ACTIVE_PROVIDER_CNS, AVAILABLE_RAMP_PROVIDERS, RAMP_PROVIDERS } from './contants'\nimport type { FundWalletProps, RampProviderType } from './interfaces'\nimport { useSelectables } from './useSelectables'\n\nexport function BuyMenu(): JSX.Element {\n const { t } = useT()\n\n const walletAddress = useLumiaPassportSession((st) => st.address)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const control = useSelectables()\n\n const {\n isCryptoSelector,\n isFiatSelector,\n rampProvider,\n //\n setrRampProvider,\n setIsCryptoSelector,\n setIsFiatSelector\n } = control\n\n const selectedProviderItem = AVAILABLE_RAMP_PROVIDERS.find((p) => p.id === rampProvider)\n\n const TriggerIcon = selectedProviderItem?.icon || null\n const ProviderComponent = RAMP_PROVIDERS[rampProvider] as FC<FundWalletProps>\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable ref={control.containerRef} isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n onClick={() => {\n if (isCryptoSelector) {\n setIsCryptoSelector(false)\n return\n }\n\n if (isFiatSelector) {\n setIsFiatSelector(false)\n return\n }\n\n setPage(PageKey.MAIN_MENU)\n }}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"block text-xl font-semibold\">{t('passport:buyMenu.title')}</span>\n </div>\n\n {!isCryptoSelector && !isFiatSelector && (\n <>\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">\n {t('passport:buyMenu.selectProvider')}\n </span>\n\n <Select value={rampProvider || ''} onValueChange={(pr) => setrRampProvider(pr as RampProviderType)}>\n <SelectTrigger className={cn('w-full', ACTIVE_PROVIDER_CNS[rampProvider])}>\n {TriggerIcon ? <TriggerIcon className=\"size-auto\" /> : t('passport:buyMenu.selectProvider')}\n </SelectTrigger>\n\n <SelectContent\n side=\"bottom\"\n sideOffset={4}\n // avoidCollisions={false}\n position=\"popper\"\n container={control.containerRef.current}\n >\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {AVAILABLE_RAMP_PROVIDERS.map(({ id, icon: Icon }) => (\n <SelectItem\n key={id}\n value={id}\n className={cn({\n [ACTIVE_PROVIDER_CNS[id]]: rampProvider === id,\n 'hover:bg-[var(--l-pass-secondary-h)]': rampProvider !== id\n })}\n >\n <Icon className=\"size-auto\" />\n </SelectItem>\n ))}\n </div>\n </SelectContent>\n </Select>\n </>\n )}\n\n <ProviderComponent control={control} walletAddress={walletAddress} />\n </Expandable>\n </div>\n )\n}\n","export { BuyMenu } from './ByuMenu'\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\n\n// badge semantics does not allow having hover, focus, active states etc. badge is just a label\nconst badgeVariants = cva(cn('inline-flex items-center', 'border font-semibold'), {\n variants: {\n variant: {\n outline: 'border-[var(--l-pass-bd)] bg-transparent text-[var(--l-pass-fg)]',\n secondary: 'border-[var(--l-pass-secondary)] bg-[var(--l-pass-secondary)] text-[var(--l-pass-fg)]',\n destructive: 'border-[var(--l-pass-bg-error)] bg-[var(--l-pass-bg-error)] text-[var(--l-pass-error)]',\n success: 'border-[var(--l-pass-bg-success)] bg-[var(--l-pass-bg-success)] text-[var(--l-pass-success)]',\n warning: 'border-[var(--l-pass-bg-warning)] bg-[var(--l-pass-bg-warning)] text-[var(--l-pass-warning)]'\n },\n\n size: {\n default: 'h-5 px-2 rounded-full text-[10px] gap-[var(--l-pass-gap)]'\n }\n },\n\n defaultVariants: {\n variant: 'secondary'\n }\n})\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {}\n\nfunction Badge(props: BadgeProps) {\n const { className, variant = 'secondary', size = 'default', ...rest } = props\n return <span {...rest} className={cn(badgeVariants({ variant, size }), className)} />\n}\n\nexport { Badge, badgeVariants }\n","import { NETWORK_OPTIONS } from '@/src/config/networks'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n/useT'\nimport { ArrowLeft, Loader } from 'lucide-react'\nimport { CSSProperties, useState } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Badge } from '../ui/badge'\nimport { Button } from '../ui/button'\n\nexport function ChainsMenu() {\n const isLoading = useLumiaPassportSession((st) => st.isLoading)\n const activeChainId = useLumiaPassportSession((st) => st.activeChainId)\n const setActiveChainId = useLumiaPassportSession((st) => st.setActiveChainId)\n\n const [nextChainId, setNextChainId] = useState<number | null>(null)\n\n const { t } = useT()\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n title={t('passport:common.back')}\n onClick={() => setPage(PageKey.SETTINGS)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:chainMenu.title')}</span>\n </div>\n\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {NETWORK_OPTIONS.filter((option) => option.isActive).map(({ chainId, Icon, name, badge }) => (\n <Button\n type=\"button\"\n key={`chain-${chainId}`}\n disabled={isLoading}\n variant={activeChainId === chainId ? 'default' : 'outline'}\n onClick={() => {\n setNextChainId(chainId)\n setActiveChainId(chainId)\n }}\n >\n {isLoading && chainId === nextChainId ? (\n <div className=\"w-7 h-7 flex items-center justify-center\">\n <Loader className=\"h-4 w-4 animate-spin\" />\n </div>\n ) : (\n <Icon className=\"w-7 h-7\" />\n )}\n\n <span className=\"block flex-1 uppercase text-left text-[10px] md:text-sm truncate\">{name}</span>\n\n <Badge variant={activeChainId === chainId ? 'secondary' : 'secondary'}>{badge}</Badge>\n </Button>\n ))}\n </div>\n </Expandable>\n </div>\n )\n}\n","import { NETWORK_OPTIONS } from '@/src/config/networks'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n/useT'\nimport { ArrowLeft, Info, Loader } from 'lucide-react'\nimport { useEffect, useRef, type CSSProperties } from 'react'\nimport { Trans } from 'react-i18next'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\n\n/** This page design to appear only when coonfig.network.chainID provided as not forced chain */\nexport function ChainSwitchRequest() {\n const { t } = useT()\n const config = useLumiaPassportConfig().config\n\n const isLoading = useLumiaPassportSession((st) => st.isLoading)\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig) // watching actual chainConfig id\n const setActiveChainId = useLumiaPassportSession((st) => st.setActiveChainId) // setiing active chain, triggers chain sync & chainConfig update\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n // Reset page when chainConfig is found with preffered chainId\n const changeTouchedRef = useRef<boolean>(false)\n useEffect(() => {\n if (!changeTouchedRef.current || chainConfig?.id !== config.current?.network?.chainId) return\n setPage(null)\n\n return () => {\n changeTouchedRef.current = false\n }\n }, [chainConfig, setPage])\n\n const prefferedChain = NETWORK_OPTIONS.find((ch) => ch.chainId === config.current?.network?.chainId) || null\n const PrefferedChainIcon = prefferedChain?.Icon || (() => null)\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n title={t('passport:common.back')}\n onClick={() => setPage(PageKey.SETTINGS)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:chainMenu.chainSwitchRequest.title')}</span>\n </div>\n\n <Highlight type=\"info\" className=\"flex gap-[var(--l-pass-gap)]\">\n <Info className=\"w-4 h-4 flex-none\" />\n\n <span className=\"block\">\n <Trans\n // @ts-expect-error\n i18nKey=\"passport:chainMenu.chainSwitchRequest.description\"\n values={{\n preferredChain: `${prefferedChain?.name || 'N/A'}`,\n currentChain: `${chainConfig?.name || 'N/A'}`\n }}\n components={{\n br: <br />,\n b: <span className=\"font-bold\" />\n }}\n />\n </span>\n </Highlight>\n\n <Button\n size=\"large\"\n variant=\"default\"\n className=\"w-full\"\n disabled={isLoading}\n onClick={() => {\n if (!config.current?.network?.chainId) return // safety check\n\n changeTouchedRef.current = true\n\n setActiveChainId(config.current.network.chainId)\n }}\n >\n {isLoading ? <Loader className=\"w-6 h-6 animate-spin\" /> : <PrefferedChainIcon className=\"w-6 h-6\" />}\n {/* @ts-expect-error */}\n {t('passport:chainMenu.chainSwitchRequest.confirmButton', {\n chain: `${prefferedChain?.name || 'N/A'}`\n })}\n </Button>\n\n {/* <Button\n size=\"large\"\n variant=\"ghost\"\n className=\"w-full\"\n disabled={isLoading}\n onClick={() => {\n setPage(null)\n }}\n >\n {t('passport:chainMenu.chainSwitchRequest.cancelButton')}\n </Button> */}\n </Expandable>\n </div>\n )\n}\n","export { ChainsMenu } from './ChainsMenu'\nexport { ChainSwitchRequest } from './ChainSwitchRequest'\n","import { forwardRef, useState } from 'react'\n\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { cn } from '../../lib/utils'\n\ninterface SwitchProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string\n labels?: {\n checked: string\n unchecked: string\n }\n}\n\nconst Switch = forwardRef<HTMLInputElement, SwitchProps>((props, ref) => {\n const { className, labels, ...inputProps } = props\n\n const colorMode = useLayoutStore((st) => st.colorMode)\n\n const [labelW, setLabelW] = useState<number>(0)\n\n return (\n <div\n role=\"switch\"\n aria-checked={inputProps.checked}\n className={cn(\n 'block rounded-full w-fit h-5 p-[2px] outline-none flex-none',\n inputProps.checked ? 'bg-[var(--l-pass-bg-success)]' : 'bg-[var(--l-pass-bg-info)]',\n className\n )}\n >\n <label\n className=\"relative block h-4 outline-none leading-4\"\n style={{\n width: `calc(16px + ${labelW}px)`,\n transition: 'width 200ms ease',\n cursor: inputProps.disabled ? 'not-allowed' : 'pointer'\n }}\n >\n <input type=\"checkbox\" className=\"hidden sr-only peer outline-none\" ref={ref} {...inputProps} />\n\n <span\n ref={(inst) => {\n if (inst) setLabelW(inst.clientWidth)\n }}\n style={{\n left: inputProps.checked ? '0px' : '16px',\n color: inputProps.checked\n ? colorMode === 'dark'\n ? 'var(--l-pass-fg-inverted)'\n : 'var(--l-pass-fg)'\n : 'var(--l-pass-fg)',\n transition: 'left 200ms ease'\n }}\n className=\"absolute top-0 px-2 text-[10px] leading-4 font-semibold min-w-10 select-none\"\n >\n {inputProps.checked ? labels?.checked : labels?.unchecked}\n </span>\n\n <span\n style={{\n left: inputProps.checked ? `${labelW - 2}px` : '2px',\n transition: 'left 200ms ease'\n }}\n className=\"absolute top-0 w-4 h-4 rounded-full bg-[var(--l-pass-fg)]\"\n />\n </label>\n </div>\n )\n})\n\nSwitch.displayName = 'Switch'\n\nexport { Switch }\n","import { create } from 'zustand'\n\nexport type RestoreMethod = 'server' | 'file' | 'cloud'\n\nexport type RecoveryDataStatus = {\n enabled?: boolean\n lastBackup?: string\n error?: string\n}\n\nexport type RecoveryDataCurrentStatus = {\n server: RecoveryDataStatus\n cloud: RecoveryDataStatus\n local: RecoveryDataStatus\n}\n\n// type RecoveryData = {\n// method: 'server' | 'local' | 'cloud'\n// status: RecoveryDataStatus\n// currentStatus: RecoveryDataCurrentStatus\n// }\n\ninterface RestoreStore {\n method: RestoreMethod | null\n\n // recoveryData: RecoveryData | null\n\n showPassword: boolean\n restorePassword: string\n usePasskey: boolean\n\n restoreFile: File | null\n\n checkingBackup: boolean\n hasServerBackup: boolean\n isCreatingPasskey: boolean\n\n selectedCloudProvider: string | null\n\n error: string | null\n success: string | null\n\n setMethod: (method: RestoreMethod | null) => void\n\n // setRecoveryData: (recoveryData: RecoveryData | null) => void\n\n setShowPassword: (showPassword: boolean) => void\n setRestorePassword: (restorePassword: string) => void\n setUsePasskey: (usePasskey: boolean) => void\n\n setRestoreFile: (restoreFile: File | null) => void\n\n setCheckingBackup: (checkingBackup: boolean) => void\n setHasServerBackup: (hasServerBackup: boolean) => void\n setIsCreatingPasskey: (isCreatingPasskey: boolean) => void\n\n setSelectedCloudProvider: (providerId: string | null) => void\n\n setError: (error: string | null) => void\n setSuccess: (success: string | null) => void\n}\n\nexport const useRestoreStore = create<RestoreStore>((set) => ({\n method: null,\n\n // recoveryData: null,\n\n showPassword: false,\n restorePassword: '',\n usePasskey: false,\n\n restoreFile: null,\n\n checkingBackup: false,\n hasServerBackup: false,\n isCreatingPasskey: false,\n\n selectedCloudProvider: null,\n\n error: null,\n success: null,\n\n setMethod: (method) => set({ method }),\n\n // setRecoveryData: (data) => set({ recoveryData: data }),\n\n setShowPassword: (showPassword) => set({ showPassword }),\n setRestorePassword: (restorePassword) => set({ restorePassword }),\n setUsePasskey: (usePasskey) => set({ usePasskey }),\n\n setRestoreFile: (restoreFile) => set({ restoreFile }),\n\n setCheckingBackup: (checkingBackup) => set({ checkingBackup }),\n setHasServerBackup: (hasServerBackup) => set({ hasServerBackup }),\n setIsCreatingPasskey: (isCreatingPasskey) => set({ isCreatingPasskey }),\n\n setSelectedCloudProvider: (providerId) => set({ selectedCloudProvider: providerId }),\n\n setError: (error) => set({ error }),\n setSuccess: (success) => set({ success })\n}))\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useCallback } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../../hooks/useLayoutStore'\nimport { useRestoreStore } from './useRestoreStore'\n\nexport function useOnRestoreSuccess() {\n const { config, callbacks } = useLumiaPassportConfig()\n\n const setIsDialogForced = useLayoutStore((st) => st.setIsDialogForced)\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const { usePaymaster, publicClient, activeChainId, recoveryUserId, setRecoveryUserId, setSession, setAddress, setStatus } =\n useLumiaPassportSession()\n\n const { setError, setSuccess } = useRestoreStore()\n\n // Internal function to create session with keyshare (doesn't depend on TssManager component)\n const createSessionWithKeyshare = useCallback(\n async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n try {\n // Notify that wallet connection process is starting\n try {\n callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' })\n } catch {}\n\n setStatus('checking key management setup...')\n\n const { ensureKeyshare } = await import('../../../auth')\n\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser)\n\n setStatus('creating smart account...')\n\n const { createAccountSession, getEntryPointDeposit } = await import('../../../clients')\n\n if (!activeChainId) {\n throw new Error(\"Active chain id is not set\")\n }\n const sess = await createAccountSession({\n mpcUserId: userId,\n mpcPin: undefined,\n usePaymaster, // TODO: make configurable via layoutDataStore\n chainId: activeChainId\n })\n\n const addr = sess.address || sess.smartAccountAddress\n setStatus('loading account data...')\n\n if (!publicClient) {\n throw new Error('Public client not initialized. Store may not be hydrated yet.')\n }\n\n try {\n await getEntryPointDeposit(addr)\n } catch {}\n\n return { session: sess, address: addr }\n } catch (error: any) {\n // Don't reset status for recovery errors - caller will set the correct status\n if (error?.code !== 'KEYSHARE_RECOVERY_NEEDED') {\n setStatus('idle')\n }\n\n throw error // Re-throw so caller can handle specific errors\n }\n },\n [setStatus, callbacks, usePaymaster, activeChainId, publicClient]\n )\n\n const onRestoreSuccess = useCallback(async () => {\n const { verifyToken, jwtTokenManager } = await import('../../../auth')\n\n const verify = await verifyToken()\n\n const hasServerKeyshare = verify?.hasKeyshare ?? jwtTokenManager.getHasKeyshare() ?? false\n\n if (recoveryUserId) {\n try {\n const { session: sess, address: addr } = await createSessionWithKeyshare(recoveryUserId, hasServerKeyshare)\n\n setRecoveryUserId(null)\n setSuccess(null)\n setError(null)\n\n /* Unlock dialog & close */\n\n try {\n callbacks?.onLumiaPassportConnect?.({\n address: addr,\n session: sess\n })\n } catch {}\n\n try {\n callbacks?.onLumiaPassportAccount?.({\n userId: recoveryUserId,\n address: addr,\n session: sess,\n hasKeyshare: hasServerKeyshare\n })\n } catch {}\n\n // Authenticate with iframe to trigger wallet ready check\n if (config.current?.projectId) {\n try {\n const { getIframeManager } = await import('../../../lib/iframe-manager')\n\n const iframeManager = getIframeManager()\n await iframeManager.authenticate(recoveryUserId)\n } catch (e) {\n console.warn('[UI-KIT] iframe authentication failed:', e)\n }\n }\n\n // Update backup status after successful recovery\n try {\n const { updateBackupStatus } = await import('../../../vaultClient')\n updateBackupStatus(recoveryUserId, 'server', { enabled: true, lastBackup: Date.now() })\n } catch (e) {\n console.warn('[UI-KIT] Failed to update backup status:', e)\n }\n\n setSession(sess)\n setAddress(addr)\n setStatus('ready')\n // setPage(PageKey.MAIN_MENU)\n setPage(null) // close auth modal\n\n setTimeout(() => {\n setIsDialogForced(false)\n }, 375)\n //\n } catch (err: any) {\n setSuccess(null)\n setError(err?.message || String(err))\n setStatus('error')\n }\n }\n }, [\n recoveryUserId,\n setIsDialogForced,\n createSessionWithKeyshare,\n setSession,\n setAddress,\n setStatus,\n setRecoveryUserId,\n setPage,\n callbacks\n ])\n\n return { onRestoreSuccess }\n}\n","import { Key, Mail, Wallet2 } from 'lucide-react'\n\nimport { DiscordIcon, GoogleIcon, TelegramIcon, TwitterIcon } from '../../../config/assets'\nimport { getServiceUrls } from '../../../config/lumiaPassport'\n\nexport interface AuthProvider {\n provider: 'passkey' | 'email' | 'telegram' | 'google' | 'discord' | 'twitter' | 'wallet'\n verified: boolean\n linkedAt: string\n lastUsedAt?: string\n externalId: string\n}\n\nexport interface ProvidersResponse {\n providers: AuthProvider[]\n}\n\nexport function getTssUrl(): string {\n return getServiceUrls().tssUrl\n}\n\nexport interface ProvidersMeta {\n name: string\n icon: React.ComponentType<{ className?: string }>\n description: string\n}\n\nconst PROVIDERS_META: Record<AuthProvider['provider'] | 'x', ProvidersMeta> = {\n passkey: { name: 'Passkey', icon: Key, description: 'Biometric authentication' },\n email: { name: 'Email', icon: Mail, description: 'Email verification' },\n telegram: { name: 'Telegram', icon: TelegramIcon, description: 'Telegram account' },\n google: { name: 'Google', icon: GoogleIcon, description: 'Google account' },\n discord: { name: 'Discord', icon: DiscordIcon, description: 'Discord account' },\n twitter: { name: 'X', icon: TwitterIcon, description: 'X (Twitter) account' },\n x: { name: 'X', icon: TwitterIcon, description: 'X (Twitter) account' }, // Alias for twitter (API uses 'x')\n wallet: { name: 'Wallet', icon: Wallet2, description: 'External wallet (EOA)' }\n}\n\n// Default fallback for unknown providers\nconst UNKNOWN_PROVIDER: ProvidersMeta = { name: 'Unknown', icon: Key, description: 'Unknown provider' }\n\nexport function getProviderDisplayInfo(provider: string): ProvidersMeta {\n return PROVIDERS_META[provider as keyof typeof PROVIDERS_META] || UNKNOWN_PROVIDER\n}\n\nexport function formatDate(dateString: string): string {\n if (!dateString) return 'Never'\n try {\n const date = new Date(dateString)\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\n } catch {\n return 'Invalid date'\n }\n}\n","import { authenticatedFetch, ensureValidToken, jwtTokenManager } from '../index';\nimport { base64urlToUint8Array } from '../base64url';\nimport { credentialToAttestationPayload, type AttestationCredentialPayload } from '../webauthn';\nimport { getTssUrl } from './types';\n\n// Low-level endpoint wrapper\n// API: Link passkey to existing account\n// Method: POST\n// Path: /api/auth/link/passkey\nexport async function completePasskeyLinking(payload: { challengeId: string; credential: AttestationCredentialPayload }): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/complete`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link passkey: ${response.statusText}`);\n }\n}\n\nexport async function beginPasskeyLinking(): Promise<{ challengeId: string; options: PublicKeyCredentialCreationOptions }> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n // Try preferred begin endpoint first\n let res = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/begin`, { method: 'POST' });\n if (res.ok) {\n const begin = await res.json();\n const options: PublicKeyCredentialCreationOptions = {\n rp: begin.rp,\n user: { id: base64urlToUint8Array(begin.user.id) as BufferSource, name: begin.user.name, displayName: begin.user.displayName },\n challenge: base64urlToUint8Array(begin.challenge) as BufferSource,\n pubKeyCredParams: begin.pubKeyCredParams,\n timeout: begin.timeout,\n attestation: begin.attestation,\n authenticatorSelection: { ...begin.authenticatorSelection, residentKey: begin.authenticatorSelection?.residentKey ?? 'preferred', requireResidentKey: begin.authenticatorSelection?.requireResidentKey ?? false, userVerification: begin.authenticatorSelection?.userVerification ?? 'preferred' },\n excludeCredentials: begin.excludeCredentials?.map((cred: any) => ({ type: cred.type, id: base64urlToUint8Array(cred.id) as BufferSource, transports: cred.transports })) || undefined,\n };\n return { challengeId: begin.challengeId, options };\n }\n\n // Backward compatibility: options endpoint\n res = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/options`, { method: 'GET' });\n if (!res.ok) throw new Error('Failed to get passkey linking options');\n const begin = await res.json();\n const options: PublicKeyCredentialCreationOptions = {\n rp: begin.rp,\n user: { id: base64urlToUint8Array(begin.user.id) as BufferSource, name: begin.user.name, displayName: begin.user.displayName },\n challenge: base64urlToUint8Array(begin.challenge) as BufferSource,\n pubKeyCredParams: begin.pubKeyCredParams,\n timeout: begin.timeout,\n attestation: begin.attestation,\n authenticatorSelection: { ...begin.authenticatorSelection, residentKey: 'preferred', requireResidentKey: false, userVerification: 'preferred' },\n excludeCredentials: begin.excludeCredentials?.map((cred: any) => ({ type: cred.type, id: base64urlToUint8Array(cred.id) as BufferSource, transports: cred.transports })) || undefined,\n };\n return { challengeId: begin.challengeId, options };\n}\n\n// High-level helper: create a new WebAuthn credential and link it using COSE attestation\n// Returns credential data for localStorage storage\nexport async function linkPasskeyWithWebAuthn(optionsOverride?: Partial<PublicKeyCredentialCreationOptions>): Promise<{ credentialId: string; rawId: string }> {\n if (!('credentials' in navigator) || !('create' in navigator.credentials!)) {\n throw new Error('WebAuthn not supported in this browser');\n }\n\n const userId = jwtTokenManager.getUserId();\n if (!userId) throw new Error('No authenticated user');\n\n // Fetch linking options (challengeId + creation options)\n let challengeId: string | null = null;\n let publicKeyOptions: PublicKeyCredentialCreationOptions | null = null;\n try {\n const begin = await beginPasskeyLinking();\n challengeId = begin.challengeId;\n publicKeyOptions = begin.options;\n } catch {\n // Ignore and use fallback\n }\n\n if (!publicKeyOptions) {\n // Fallback minimal options (local challenge, host RP)\n const challenge = new Uint8Array(32);\n crypto.getRandomValues(challenge);\n publicKeyOptions = {\n rp: { name: window.location.hostname || 'Mbark Wallet' },\n user: {\n id: new TextEncoder().encode(userId),\n name: userId,\n displayName: userId,\n },\n challenge,\n pubKeyCredParams: [{ type: 'public-key', alg: -7 }],\n attestation: 'none',\n authenticatorSelection: { residentKey: 'preferred', userVerification: 'preferred' },\n timeout: 60000,\n } as PublicKeyCredentialCreationOptions;\n }\n\n // Improve UX: customize display name and username per creation so OS sheet shows distinct labels\n try {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const friendlyDisplay = `Mbark Wallet (${ts})`;\n const friendlyName = `lumia-passport.${ts}`;\n const originalUser = publicKeyOptions.user as PublicKeyCredentialUserEntity;\n publicKeyOptions = {\n ...publicKeyOptions,\n user: {\n ...originalUser,\n name: friendlyName,\n displayName: friendlyDisplay,\n },\n } as PublicKeyCredentialCreationOptions;\n } catch {}\n\n // Ensure secure context\n if (!(window.isSecureContext || window.location.hostname === 'localhost')) {\n throw new Error('Passkey requires secure context (https or localhost)');\n }\n\n // Normalize rp.id if it mismatches origin host (helps local/dev)\n try {\n const originHost = window.location.hostname;\n const rpId = (publicKeyOptions.rp as any)?.id as string | undefined;\n const suffixMatches = (host: string, rp: string) => host === rp || host.endsWith(`.${rp}`);\n if (rpId && !suffixMatches(originHost, rpId)) {\n console.warn('[PasskeyLink] Adjusting rp.id to origin host for WebAuthn', { rpId, originHost });\n publicKeyOptions = { ...publicKeyOptions, rp: { ...(publicKeyOptions.rp as any), id: originHost } } as any;\n }\n } catch {}\n\n console.log('[PasskeyLink] Calling navigator.credentials.create', {\n rp: publicKeyOptions.rp,\n timeout: publicKeyOptions.timeout,\n attestation: publicKeyOptions.attestation,\n });\n\n const credential = (await navigator.credentials.create({ publicKey: { ...publicKeyOptions, ...optionsOverride } as PublicKeyCredentialCreationOptions })) as PublicKeyCredential;\n if (!credential) throw new Error('Passkey creation was cancelled');\n\n // Convert to registration-like attestation payload (COSE format)\n const attestationPayload = credentialToAttestationPayload(credential);\n\n // If we don't have a challengeId (fallback path), emulate a local one to satisfy schema\n const cid = challengeId || 'local-' + Date.now();\n\n await completePasskeyLinking({ challengeId: cid, credential: attestationPayload });\n\n // Return credential data for localStorage storage\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(credential.rawId)));\n return { credentialId: credential.id, rawId: rawIdB64 };\n}\n","// Cloud storage integrations for secure backup files\n// Supports Google Drive, and can be extended for other providers\n\nexport interface CloudStorageProvider {\n name: string;\n id: string;\n icon: string;\n isAvailable: () => boolean;\n authenticate: () => Promise<boolean>;\n upload: (fileName: string, content: string, usePrivateStorage?: boolean) => Promise<string>; // Returns file URL or ID\n isAuthenticated: () => boolean;\n signOut: () => Promise<void>;\n}\n\n// Google Drive integration using Google Identity Services + Google API Client Library\nexport class GoogleDriveProvider implements CloudStorageProvider {\n name = 'Google Drive';\n id = 'google-drive';\n icon = '📁'; // Can be replaced with proper icon\n\n private accessToken: string | null = null;\n private readonly CLIENT_ID = __GOOGLE_DRIVE_CLIENT_ID__;\n private readonly DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';\n private readonly SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.appdata';\n\n private gapiInitialized = false;\n private gisInitialized = false;\n\n constructor() {\n this.initializeAPIs();\n }\n\n private async initializeAPIs(): Promise<void> {\n // Load Google APIs\n if (!window.gapi) {\n await this.loadScript('https://apis.google.com/js/api.js');\n }\n\n if (!window.google?.accounts) {\n await this.loadScript('https://accounts.google.com/gsi/client');\n }\n\n // Initialize gapi\n if (!this.gapiInitialized) {\n await new Promise<void>(resolve => {\n window.gapi.load('client', resolve);\n });\n\n await window.gapi.client.init({\n discoveryDocs: [this.DISCOVERY_DOC],\n });\n\n this.gapiInitialized = true;\n }\n\n // Initialize Google Identity Services\n if (!this.gisInitialized) {\n this.gisInitialized = true;\n }\n }\n\n private loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(script);\n });\n }\n\n isAvailable(): boolean {\n return !!this.CLIENT_ID && typeof window !== 'undefined';\n }\n\n async authenticate(): Promise<boolean> {\n if (!this.isAvailable()) {\n throw new Error(\n 'Google Drive integration is not available in this environment'\n );\n }\n\n await this.initializeAPIs();\n\n return new Promise((resolve, reject) => {\n try {\n const tokenClient = window.google.accounts.oauth2.initTokenClient({\n client_id: this.CLIENT_ID,\n scope: this.SCOPES,\n callback: (response: any) => {\n if (response.error) {\n console.error('[GoogleDrive] Authentication error:', response.error);\n reject(new Error(`Google Drive authentication failed: ${response.error}`));\n return;\n }\n\n this.accessToken = response.access_token;\n window.gapi.client.setToken({ access_token: this.accessToken });\n resolve(true);\n },\n });\n\n tokenClient.requestAccessToken({ prompt: 'consent' });\n } catch (error) {\n console.error('[GoogleDrive] Authentication initialization failed:', error);\n reject(new Error(`Google Drive authentication setup failed: ${error}`));\n }\n });\n }\n\n isAuthenticated(): boolean {\n return !!this.accessToken;\n }\n\n async signOut(): Promise<void> {\n if (this.accessToken) {\n window.google?.accounts.oauth2.revoke(this.accessToken);\n this.accessToken = null;\n window.gapi?.client.setToken(null);\n }\n }\n\n async upload(fileName: string, content: string, usePrivateStorage: boolean = true): Promise<string> {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated with Google Drive');\n }\n\n await this.initializeAPIs();\n\n if (usePrivateStorage) {\n // Try appDataFolder first (private, hidden)\n try {\n const fileId = await this.uploadToAppDataFolder(fileName, content);\n return fileId;\n } catch (error) {\n console.warn('[GoogleDrive] AppDataFolder upload failed, trying fallback to regular folder:', error);\n // Fallback to visible folder if appDataFolder fails\n const fileId = await this.uploadToAppFolder(fileName, content);\n return fileId;\n }\n } else {\n // Upload to \"Lumia Backups\" folder (visible in Drive)\n try {\n const fileId = await this.uploadToAppFolder(fileName, content);\n return fileId;\n } catch (error) {\n console.error('[GoogleDrive] Upload failed:', error);\n throw new Error(\n `Failed to upload to Google Drive: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n private async uploadToAppDataFolder(fileName: string, content: string): Promise<string> {\n const metadata = {\n name: fileName,\n parents: ['appDataFolder'], // Store in app-specific folder for privacy\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async uploadToAppFolder(fileName: string, content: string): Promise<string> {\n // First, find or create \"Mbark Wallet Backups\" folder\n const folderName = 'Mbark Wallet Backups';\n const folderId = await this.findOrCreateFolder(folderName);\n\n const metadata = {\n name: fileName,\n parents: [folderId],\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async findOrCreateFolder(folderName: string): Promise<string> {\n // Search for existing folder\n const searchResponse = await fetch(\n `https://www.googleapis.com/drive/v3/files?q=name='${folderName}' and mimeType='application/vnd.google-apps.folder' and trashed=false`,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: 'include'\n }\n );\n\n if (!searchResponse.ok) {\n throw new Error(`Failed to search for folder: ${searchResponse.status}`);\n }\n\n const searchResult = await searchResponse.json();\n\n if (searchResult.files && searchResult.files.length > 0) {\n return searchResult.files[0].id; // Return existing folder ID\n }\n\n // Create new folder\n const createResponse = await fetch('https://www.googleapis.com/drive/v3/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n name: folderName,\n mimeType: 'application/vnd.google-apps.folder',\n }),\n });\n\n if (!createResponse.ok) {\n throw new Error(`Failed to create folder: ${createResponse.status}`);\n }\n\n const createResult = await createResponse.json();\n return createResult.id;\n }\n\n private async performUpload(metadata: any, content: string): Promise<string> {\n const form = new FormData();\n form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));\n form.append('file', new Blob([content], { type: 'application/json' }));\n\n const response = await fetch(\n 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n },\n credentials: 'include',\n body: form,\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Google Drive upload failed: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const result = await response.json();\n return result.id; // Return file ID\n }\n}\n\n// Factory function to get available cloud storage providers\nexport function getAvailableCloudProviders(): CloudStorageProvider[] {\n const providers: CloudStorageProvider[] = [];\n\n // Google Drive\n const googleDrive = new GoogleDriveProvider();\n if (googleDrive.isAvailable()) {\n providers.push(googleDrive);\n }\n\n // Future: Add more providers (Dropbox, OneDrive, etc.)\n\n return providers;\n}\n\n// Type definitions for global APIs\ndeclare global {\n interface Window {\n gapi: any;\n google: any;\n }\n}","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useEffect } from 'react'\n\nimport { useLayoutStore } from '../../../hooks/useLayoutStore'\nimport { getIframeManager } from '../../../lib/iframe-manager'\nimport { CHECK_BACKUP_QUERY_KEY } from '../constants'\nimport { useRestoreStore } from '../hooks'\n\nexport function useCreateBackup() {\n const qc = useQueryClient()\n const session = useLumiaPassportSession((st) => st.session)\n const address = useLumiaPassportSession((st) => st.address)\n const hasServerVault = useLumiaPassportSession((st) => st.hasServerVault)\n\n const setIsDialogForced = useLayoutStore((st) => st.setIsDialogForced)\n\n const { usePasskey, restorePassword, selectedCloudProvider, setSuccess, setError, setMethod, setIsCreatingPasskey } = useRestoreStore()\n\n useEffect(() => {\n if (!hasServerVault) {\n setMethod('server')\n setIsDialogForced(true)\n }\n }, [hasServerVault, setIsDialogForced, setMethod]) // Force backup dialog if no server vault\n\n const passportUserId = session?.mpcUserId || ''\n const onBackupSuccess = () => console.log('[ConnectWalletButton] Backup created successfully')\n\n const { mutate: createPasswordBackup, isPending: isPasswordBackupCreating } = useMutation({\n mutationFn: async () => {\n const iframeManager = getIframeManager()\n\n if (!iframeManager) {\n throw new Error('Iframe manager not initialized')\n }\n\n const jwt = await import('../../../auth').then((m) => m.jwtTokenManager.getTokens())\n\n if (!usePasskey && !restorePassword) {\n throw new Error('Please provide a password for the backup')\n }\n\n // Note: We don't auto-create passkey here because:\n // 1. WebAuthn doesn't allow checking if passkeys exist (security restriction)\n // 2. Passkey may exist in system (Google Password Manager) but not in localStorage\n // 3. The iframe will handle passkey selection via navigator.credentials.get()\n // If no passkey exists, user will see WebAuthn error and can switch to password\n\n // Determine password (undefined for passkey)\n const password = !usePasskey ? restorePassword : undefined\n\n const navigateToMainMenu = jwt.isNewUser || !hasServerVault\n\n console.log('[BACKUP STATUS] is new user:', jwt.isNewUser, !hasServerVault, 'usePasskey:', usePasskey)\n\n return {\n response: await iframeManager.createBackup(\n passportUserId,\n { method: 'server', password },\n jwt.accessToken\n ),\n navigateToMainMenu: navigateToMainMenu\n }\n },\n\n onSuccess: async ({ response, navigateToMainMenu }) => {\n qc.invalidateQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, address] })\n\n if (response.success) {\n setSuccess('Successfully created server backup')\n\n // Dispatch event for other components\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lumia-passport-backup-status-changed', {\n detail: { method: 'server', success: true, navigateToMainMenu }\n })\n )\n }\n\n onBackupSuccess()\n } else {\n setError(response.error || 'Server backup failed')\n }\n\n setIsDialogForced(false)\n },\n\n onError: async (error: any) => {\n // Handle WebAuthn cancellation with user-friendly message\n if (error?.name === 'NotAllowedError' || error?.message?.includes('timed out or was not allowed')) {\n setError('Passkey selection was cancelled. Please try again or create a new passkey.')\n } else {\n setError(error?.message || 'Backup creation failed')\n }\n qc.invalidateQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, address] })\n }\n })\n\n const { mutate: createLocalBackup, isPending: isLocalBackupCreating } = useMutation({\n mutationFn: async () => {\n const iframeManager = getIframeManager()\n if (!usePasskey && !restorePassword) {\n throw new Error('Please provide a password for the backup')\n }\n\n // Local file backup: iframe encrypts, parent downloads\n const encryptedData = await iframeManager.encryptBackupData(passportUserId, restorePassword)\n\n const blob = new Blob([JSON.stringify(encryptedData, null, 2)], { type: 'application/json' })\n\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `lumia-passport-backup-${passportUserId}-${Date.now()}.json`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n },\n\n onSuccess: async () => {\n qc.invalidateQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, address] })\n\n setSuccess('Backup file downloaded successfully')\n\n // Dispatch event for other components\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lumia-passport-backup-status-changed', {\n detail: { method: 'local', success: true }\n })\n )\n }\n\n onBackupSuccess()\n },\n\n onError: async (error) => {\n setError(error?.message || 'Backup creation failed')\n qc.invalidateQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, address] })\n }\n })\n\n const { mutate: createPasskey, isPending: isPasskeyCreating } = useMutation({\n mutationFn: async () => {\n setIsCreatingPasskey(true)\n const { linkPasskeyWithWebAuthn } = await import('../../../auth/providers/passkey')\n const { createPasskeyHelpers } = await import('../../../auth/passkey')\n\n const { credentialId, rawId } = await linkPasskeyWithWebAuthn()\n\n // Save to localStorage for backup flow\n const helpers = createPasskeyHelpers(passportUserId)\n helpers.setCredId(credentialId)\n helpers.setRawId(rawId)\n\n return { credentialId, rawId }\n },\n\n onSuccess: async () => {\n setIsCreatingPasskey(false)\n setError(null) // Clear any previous errors so button is enabled\n setSuccess('Passkey created successfully. You can now create a backup.')\n },\n\n onError: async (error: any) => {\n setIsCreatingPasskey(false)\n if (error.name === 'NotAllowedError') {\n setError('Passkey creation cancelled. Please try again.')\n } else {\n setError(error?.message || 'Failed to create passkey')\n }\n }\n })\n\n const { mutate: createCloudBackup, isPending: isCloudBackupCreating } = useMutation({\n mutationFn: async () => {\n // Cloud backup: iframe encrypts, parent uploads to cloud\n const iframeManager = getIframeManager()\n\n const encryptedData = await iframeManager.encryptBackupData(passportUserId)\n\n // Import cloud storage provider\n const { getAvailableCloudProviders } = await import('../../../cloudStorage')\n const providers = getAvailableCloudProviders()\n\n const provider = selectedCloudProvider ? providers.find((p) => p.id === selectedCloudProvider) : providers[0]\n\n if (!provider) {\n throw new Error('No cloud provider available')\n }\n\n // Authenticate if needed\n if (!provider.isAuthenticated()) {\n const authenticated = await provider.authenticate()\n\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`)\n }\n }\n\n // Upload to cloud\n const timestamp = Date.now()\n const fileName = `lumia-keyshare-backup-${passportUserId}-${timestamp}.json`\n const fileContent = JSON.stringify(encryptedData, null, 2)\n\n const uploadResult = await provider.upload(fileName, fileContent, true)\n\n return { provider, uploadResult }\n },\n\n onSuccess: async ({ provider, uploadResult }) => {\n console.log('[KeyshareBackup] Cloud backup upload result:', uploadResult)\n setSuccess(`Successfully created cloud backup on ${provider.name}`)\n\n qc.invalidateQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, address] })\n\n // Dispatch event for other components\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lumia-passport-backup-status-changed', {\n detail: { method: 'cloud', success: true }\n })\n )\n }\n\n onBackupSuccess()\n },\n\n onError: async (error) => {\n setError(error?.message || 'Backup creation failed')\n qc.invalidateQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY, address] })\n }\n })\n\n return {\n isPasswordBackupCreating,\n createPasswordBackup,\n\n isCloudBackupCreating,\n createCloudBackup,\n\n isLocalBackupCreating,\n createLocalBackup,\n\n isPasskeyCreating,\n createPasskey\n }\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\n// import { useLayoutStore } from '@/src/internal/hooks/useLayoutStore'\nimport { useMutation } from '@tanstack/react-query'\n\nimport { useOnRestoreSuccess } from './useOnRestoreSuccess'\nimport { useRestoreStore } from './useRestoreStore'\n\nexport function useRestoreAccount() {\n const recoveryUserId = useLumiaPassportSession((st) => st.recoveryUserId)\n\n // const setIsDialogForced = useLayoutStore((st) => st.setIsDialogForced)\n\n const {\n restoreFile,\n restorePassword,\n\n usePasskey,\n setError,\n setSuccess,\n setMethod,\n setRestorePassword,\n setRestoreFile\n } = useRestoreStore()\n\n const { onRestoreSuccess } = useOnRestoreSuccess()\n\n const { mutate: restoreFromServer, isPending: isRestoringFromServer } = useMutation({\n mutationFn: async () => {\n setError(null)\n setSuccess(null)\n // setLoading((prev) => ({ ...prev, server: true }))\n\n console.log('[KeyshareRestoreMenu] Starting server restore for userId:', recoveryUserId)\n\n const { getIframeManager } = await import('../../../lib/iframe-manager')\n const iframeManager = getIframeManager()\n\n if (!iframeManager) {\n throw new Error('Iframe manager not initialized')\n }\n\n console.log(\n '[KeyshareRestoreMenu] Calling iframeManager.restoreFromServer with method:',\n usePasskey ? 'passkey' : 'password'\n )\n\n // Get JWT access token for authentication\n const jwt = await import('../../../auth').then((m) => m.jwtTokenManager.getTokens())\n const accessToken = jwt?.accessToken\n\n if (!usePasskey && !restorePassword) {\n throw new Error('Please enter the backup password')\n }\n\n const passwordToUse = !usePasskey ? restorePassword : undefined\n\n return await iframeManager.restoreFromServer(recoveryUserId, passwordToUse, accessToken)\n },\n\n onSuccess: async (response) => {\n if (response.success) {\n console.log('[KeyshareRestoreMenu] Server restore successful')\n\n setMethod(null)\n setSuccess('Successfully restored keyshare from server backup')\n\n onRestoreSuccess()\n } else {\n console.error('[KeyshareRestoreMenu] Server restore failed:', response.error)\n\n // setMethod(null)\n setError(response.error || 'Server restore failed')\n }\n },\n\n onError: async (err) => {\n console.error('[KeyshareRestoreMenu] Server restore exception:', err)\n\n const errorMsg = err instanceof Error ? err.message : 'Server restore failed'\n\n // setMethod(null)\n setError(errorMsg)\n }\n })\n\n const { mutate: restoreFromFile, isPending: isRestoringFromFile } = useMutation({\n mutationFn: async () => {\n if (!restoreFile) {\n throw new Error('Please select a backup file')\n }\n\n // if (method === 'password' && !restorePassword) {\n // throw new Error('Please enter the backup password')\n // }\n\n setError(null)\n setSuccess(null)\n\n const { getIframeManager } = await import('../../../lib/iframe-manager')\n const iframeManager = getIframeManager()\n\n if (!iframeManager) {\n throw new Error('Iframe manager not initialized')\n }\n\n const fileContent = await restoreFile.text()\n // const passwordToUse = useCustomPassword ? restorePassword : undefined\n\n if (!usePasskey && !restorePassword) {\n throw new Error('Please enter the backup password')\n }\n\n return await iframeManager.restoreFromLocalFile(recoveryUserId, fileContent, restorePassword) //, passwordToUse)\n },\n\n onSuccess: async (response) => {\n if (response.success) {\n setSuccess('Successfully restored keyshare from backup file')\n setRestoreFile(null)\n setRestorePassword('')\n\n setMethod(null)\n\n onRestoreSuccess()\n } else {\n // setMethod(null)\n setError(response.error || 'File restore failed')\n }\n },\n\n onError: async (err) => {\n const errorMsg = err instanceof Error ? err.message : 'Restore failed'\n // setMethod(null)\n setError(errorMsg)\n }\n })\n\n const { mutate: restoreFromCloud, isPending: isRestoringFromCloud } = useMutation({\n mutationFn: async () => {\n alert('Cloud restore not implemented yet')\n return null\n // TODO\n },\n onSuccess: async () => {\n // TODO\n },\n onError: async (error) => {\n // TODO\n }\n })\n\n return {\n restoreFromServer,\n isRestoringFromServer,\n\n restoreFromFile,\n isRestoringFromFile,\n\n restoreFromCloud,\n isRestoringFromCloud\n }\n}\n","import { useEffect, useState } from 'react'\n\nimport { useRestoreStore } from './useRestoreStore'\n\n// type BackupFileFormat = {\n// data: unknown\n// iv: unknown\n// salt: unknown\n// version: unknown\n// checksum: unknown\n// magic: unknown\n// encryptionMethod: 'password' | 'passkey'\n// createdAt: number\n// }\n\nfunction validateRestoreFileFormat(parsedData: unknown): boolean {\n if (typeof parsedData !== 'object' || parsedData === null) return false\n\n const data = parsedData as Record<string, unknown>\n\n return (\n 'data' in data &&\n 'iv' in data &&\n 'salt' in data &&\n 'version' in data &&\n 'checksum' in data &&\n 'magic' in data &&\n 'encryptionMethod' in data &&\n (data.encryptionMethod === 'password' || data.encryptionMethod === 'passkey') &&\n 'createdAt' in data &&\n typeof data.createdAt === 'number'\n )\n}\n\nexport function useValidateFileBackup() {\n const restoreFile = useRestoreStore((st) => st.restoreFile)\n const setError = useRestoreStore((st) => st.setError)\n const setUsePasskey = useRestoreStore((st) => st.setUsePasskey)\n\n // const [encryptionMethod, setEncryptionMethod] = useState<'passkey' | 'password' | null>(null)\n\n // Read and parse the JSON file to extract encryptionMethod\n useEffect(() => {\n if (!restoreFile) {\n // setEncryptionMethod(null)\n return\n }\n\n const reader = new FileReader()\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string\n const parsed = JSON.parse(content)\n\n if (!validateRestoreFileFormat(parsed)) {\n throw new Error('Invalid backup file')\n }\n\n setUsePasskey(parsed.encryptionMethod === 'passkey')\n // setEncryptionMethod(parsed.encryptionMethod)\n } catch (error) {\n setUsePasskey(false)\n // setEncryptionMethod(null)\n\n setError(error instanceof Error ? error.message : 'Unknown error occurred')\n }\n }\n reader.readAsText(restoreFile)\n }, [restoreFile])\n\n // return { encryptionMethod }\n}\n","export { useOnRestoreSuccess } from './useOnRestoreSuccess'\nexport { useCreateBackup } from './useCreateBackup'\nexport { useRestoreAccount } from './useRestoreAccount'\nexport { useValidateFileBackup } from './useValidateFileBackup'\nexport { useRestoreStore, type RestoreMethod, type RecoveryDataStatus } from './useRestoreStore'\n","import { useT } from '@/src/i18n/useT'\nimport { Cloud, FileDown, FileUp } from 'lucide-react'\nimport { Fragment, useMemo, type ComponentType } from 'react'\n\n// import { OtpIcon } from '../../../assets/OtpIcon'\nimport { PositiveIcon } from '../../../assets/PositiveIcon'\nimport { type RecoveryStats } from '../../../vaultClient'\nimport { Button } from '../../ui/button'\nimport { useRestoreStore, type RecoveryDataStatus, type RestoreMethod } from '../hooks'\n\ninterface MethodSelectorProps {\n mode?: 'backup' | 'restore'\n serverRecoveryStatus?: RecoveryStats | null\n}\n\ntype MethodOption = {\n data?: RecoveryDataStatus | null\n method: RestoreMethod\n label: string\n Icon: ComponentType<{ className?: string }>\n disabled?: boolean\n}\n\nconst getRecoveryRenderMethods: (mode?: 'backup' | 'restore') => MethodOption[] = (mode) => [\n // { method: 'server', label: 'Password', Icon: OtpIcon },\n { method: 'file', label: 'passport:backupMenu.file', Icon: mode === 'restore' ? FileUp : FileDown },\n { method: 'cloud', label: 'passport:backupMenu.cloud', Icon: Cloud, disabled: true }\n]\n\nexport function MethodSelector(props: MethodSelectorProps) {\n const { mode = 'restore', serverRecoveryStatus } = props\n\n const { t } = useT()\n\n const {\n method: selectedRecoveryMethod,\n\n setMethod,\n setShowPassword,\n setRestorePassword,\n setRestoreFile,\n setError,\n setSuccess\n } = useRestoreStore()\n\n const recoveryRenderMethods = useMemo(() => {\n const methodsWithBackupData = getRecoveryRenderMethods(mode).map((mt) => {\n let data: RecoveryDataStatus | null = null\n\n switch (true) {\n case mt.method === 'server' && !!serverRecoveryStatus?.created?.at:\n data = { enabled: true, lastBackup: serverRecoveryStatus.created.at }\n break\n\n default:\n break\n }\n\n return { ...mt, data }\n })\n\n return methodsWithBackupData\n }, [mode, serverRecoveryStatus])\n\n if (!!selectedRecoveryMethod) return null\n\n return (\n <Fragment>\n <div\n style={{ gridTemplateColumns: `repeat(${recoveryRenderMethods.length}, minmax(0, 1fr))` }}\n className=\"w-full max-w-[256px] grid gap-[var(--l-pass-gap)] mx-auto py-[var(--l-pass-pd)]\"\n >\n {recoveryRenderMethods.map(({ method: recoveryMethod, label, Icon, data, disabled }) => (\n <div key={recoveryMethod} className=\"w-full h-full flex flex-col items-center gap-[var(--l-pass-gap)]\">\n <Button\n size=\"icon\"\n variant=\"outline\"\n type=\"button\"\n disabled={disabled}\n style={{ height: 'unset', maxWidth: '96px' }}\n className=\"relative w-full aspect-square h-unset rounded-[var(--l-pass-el-bdrs)]\"\n onClick={() => {\n // store flush on method change\n setRestorePassword('')\n setRestoreFile(null)\n setShowPassword(false)\n setError(null)\n setSuccess(null)\n\n // set method\n setMethod(recoveryMethod)\n }}\n >\n <Icon className=\"w-5 h-5 md:w-8 md:h-8\" />\n\n {!!data?.lastBackup && (\n <div className=\"w-6 h-6 absolute -top-2 -right-2 flex items-center justify-center bg-transparent\">\n <PositiveIcon className=\"w-4 h-4\" />\n </div>\n )}\n </Button>\n\n {/* @ts-expect-error */}\n <span className=\"text-xs font-bold leading-4\">{t(label)}</span>\n </div>\n ))}\n </div>\n </Fragment>\n )\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { cn } from '@/src/internal/lib/utils'\nimport { ChevronRight, Eye, EyeOff, Info, Key, Loader, Plus } from 'lucide-react'\nimport { ComponentType, SVGAttributes, useEffect, useRef } from 'react'\n\nimport { OtpIcon } from '../../../assets/OtpIcon'\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport { Input } from '../../ui/input'\nimport { useRestoreStore } from '../hooks/useRestoreStore'\n\ninterface PasswordPasskeyProps {\n mode?: 'backup' | 'restore'\n actionCaption: string\n actionIcon?: ComponentType<SVGAttributes<SVGElement>>\n isLoading?: boolean\n disabled?: boolean\n\n isEncryptionMethod?: boolean\n\n actionHandler: () => void\n onCreatePasskey?: () => void\n}\n\nexport function PasswordPasskey(props: PasswordPasskeyProps) {\n const { t } = useT()\n\n const {\n mode = 'restore',\n actionCaption,\n actionIcon: ActionIcon,\n isLoading,\n disabled,\n isEncryptionMethod,\n actionHandler,\n onCreatePasskey\n } = props\n\n const hasServerVault = useLumiaPassportSession((st) => st.hasServerVault)\n\n const actionRef = useRef<HTMLButtonElement | null>(null)\n\n const {\n showPassword,\n restorePassword,\n usePasskey,\n error,\n isCreatingPasskey,\n setRestorePassword,\n setShowPassword,\n setUsePasskey,\n setRestoreFile\n } = useRestoreStore()\n\n const { config } = useLumiaPassportConfig()\n const isPasskeyEnabled = config.current.passkey.enabled\n\n useEffect(() => {\n if (!isPasskeyEnabled && usePasskey) setUsePasskey(false)\n }, [isPasskeyEnabled, usePasskey])\n\n return (\n <>\n {mode === 'backup' && isPasskeyEnabled && (\n <div className=\"flex items-center justify-center px-[var(--l-pass-pd)]\">\n <Button\n size=\"medium\"\n variant=\"ghost\"\n onClick={() => {\n setUsePasskey(false)\n setRestoreFile(null)\n setRestorePassword('')\n }}\n className={cn(usePasskey ? 'opacity-50' : 'opacity-100')}\n >\n <OtpIcon className=\"w-4 h-4 inline-block mr-1\" />\n {t('passport:common.password')}\n </Button>\n\n <Button\n size=\"medium\"\n variant=\"ghost\"\n onClick={() => {\n setUsePasskey(true)\n setRestoreFile(null)\n setRestorePassword('')\n }}\n className={cn(usePasskey ? 'opacity-100' : 'opacity-50')}\n >\n <Key className=\"w-4 h-4 inline-block mr-1\" />\n {t('passport:common.passkey')}\n </Button>\n </div>\n )}\n\n {!hasServerVault && (\n <span className=\"block w-full text-[10px] py-1 text-center text-[var(--l-pass-fg-muted)]\">\n {usePasskey ? (\n <>\n {t('passport:backupMenu.passkeyMsg')}{' '}\n <span>\n {mode === 'backup'\n ? t('passport:backupMenu.passkeyCompleteMsg')\n : t('passport:backupMenu.passkeyAccessMsg')}\n </span>\n </>\n ) : (\n t('passport:backupMenu.passwordMsg')\n )}\n </span>\n )}\n\n {usePasskey ? (\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <Button\n ref={actionRef}\n size=\"large\"\n variant=\"default\"\n title={actionCaption}\n onClick={actionHandler}\n disabled={isLoading || disabled || (!usePasskey && !restorePassword)}\n className=\"w-full\"\n >\n {isLoading ? (\n <>\n <Loader className=\"animate-spin h-4 w-4\" />\n {isCreatingPasskey && <span>Creating Passkey...</span>}\n </>\n ) : (\n <>\n <ActionIcon className=\"h-4 w-4\" />\n <span>{actionCaption}</span>\n </>\n )}\n </Button>\n\n {!isEncryptionMethod && mode === 'backup' && (\n <Highlight type=\"info\" className=\"flex flex-col gap-[var(--l-pass-gap)] text-[10px]\">\n <div className=\"flex gap-[var(--l-pass-gap)]\">\n <Info className=\"h-4 w-4 flex-shrink-0\" />\n\n <span className=\"text-[var(--l-pass-fg-muted)] block flex-1\">\n <span className=\"block mb-1\">{t('passport:backupMenu.passkeyMemo1')}</span>\n\n <span className=\"block\">\n {' '}\n {t('passport:backupMenu.passkeyMemo2')}{' '}\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href=\"https://safety.google/safety/authentication/passkey/\"\n className=\"inline font-bold underline underline-offset-2 text-[var(--l-pass-fg)] hover:text-[var(--l-pass-fg-h)] active:text-[var(--l-pass-fg-a)]\"\n >\n {t('passport:backupMenu.passkeyLearnMore')}\n </a>\n </span>\n\n {!!onCreatePasskey && (\n <span className=\"text-[var(--l-pass-fg)] block py-[var(--l-pass-pd)]\">\n {t('passport:backupMenu.passkeyMemo0')}\n </span>\n )}\n </span>\n </div>\n\n {!!onCreatePasskey && (\n <Button\n size=\"large\"\n variant=\"outline\"\n onClick={onCreatePasskey}\n disabled={isLoading || disabled}\n className=\"w-full bg-[var(--l-pass-bg)]\"\n >\n <Plus className=\"h-4 w-4\" />\n\n <span>\n {t('passport:common.create')} {t('passport:common.passkey')}\n </span>\n </Button>\n )}\n </Highlight>\n )}\n </div>\n ) : (\n <div className=\"w-full flex gap-[var(--l-pass-gap)]\">\n <Input\n autoComplete=\"off\"\n Icon={OtpIcon}\n type={showPassword ? 'text' : 'password'}\n placeholder={t('passport:common.password')}\n value={restorePassword}\n disabled={isLoading || disabled}\n className=\"flex-1\"\n onChange={(e) => {\n setRestorePassword(e.target.value)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !isLoading && restorePassword) actionRef.current?.click()\n }}\n element={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n type=\"button\"\n disabled={isLoading || disabled}\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </Button>\n }\n />\n\n <Button\n ref={actionRef}\n size=\"icon\"\n variant=\"default\"\n onClick={actionHandler}\n title={actionCaption}\n disabled={\n isLoading || disabled || error?.includes('Invalid backup file') || (!usePasskey && !restorePassword)\n }\n className=\"w-full w-12 h-12 flex-shrink-0 rounded-[var(--l-pass-el-bdrs)]\"\n >\n {isLoading ? <Loader className=\"animate-spin h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </Button>\n </div>\n )}\n </>\n )\n}\n","import { useT } from '@/src/i18n/useT'\nimport { AlertCircle, FileUp, Upload, User } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\nimport { Highlight } from '../../ui/highlight'\nimport { useRestoreStore, useValidateFileBackup } from '../hooks'\nimport { PasswordPasskey } from './PasswordPasskey'\n\ninterface NoBackupFoundProps {\n isLoading: boolean\n restoreFromFile: () => void\n}\n\nexport function NoBackupFound(props: NoBackupFoundProps) {\n const { isLoading, restoreFromFile } = props\n\n const { t } = useT()\n\n const restoreFile = useRestoreStore((st) => st.restoreFile)\n const usePasskey = useRestoreStore((st) => st.usePasskey)\n const error = useRestoreStore((st) => st.error)\n const setRestoreFile = useRestoreStore((st) => st.setRestoreFile)\n const setError = useRestoreStore((st) => st.setError)\n\n useValidateFileBackup()\n\n return (\n <>\n <div className=\"flex items-center justify-center gap-2 px-5 pt-3 pb-6\">\n <User className=\"w-6 h-6\" />\n <span className=\"font-bold text-xl leading-6\">{t('passport:restoreMenu.title')}</span>\n </div>\n\n {!restoreFile && (\n <Highlight type=\"warning\" className=\"animate-glow-warning flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"h-4 w-4 flex-0\" />\n\n <div className=\"w-full flex-1 flex flex-col gap-2\">\n <span className=\"block w-full text-sm leading-4 font-bold\">{t('passport:restoreMenu.noBackups')}</span>\n\n <span className=\"block w-full text-xs\">\n <span className=\"block mb-1\">{t('passport:restoreMenu.noBackupsMsg1')}</span>\n <span className=\"block w-full\">{t('passport:restoreMenu.noBackupsMsg2')}</span>\n </span>\n </div>\n </Highlight>\n )}\n\n {!restoreFile && (\n <Highlight type=\"info\" className=\"flex gap-[var(--l-pass-gap)]\">\n <Upload className=\"h-4 w-4 flex-0\" />\n <span className=\"block w-full text-[10px] text-[var(--l-pass-fg-muted)]\">\n {t('passport:restoreMenu.uploadBackupFile')}\n </span>\n </Highlight>\n )}\n\n <label\n className={cn(\n 'block w-full flex items-center justify-center cursor-pointer',\n 'p-[var(--l-pass-gap)] bg-[var(--l-pass-secondary)] rounded-[var(--l-pass-el-bdrs)]'\n )}\n >\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n if (!!error) setError(null)\n setRestoreFile(e.target.files?.[0] || null)\n }}\n className={cn(\n 'file:cursor-pointer',\n 'transition-colors duration-200 ease-in-out',\n 'block w-full font-medium font-mono',\n 'file:h-12 file:text-[16px] file:bg-[var(--l-pass-primary)] file:text-[var(--l-pass-fg-inverted)]',\n 'file:hover:opacity-90 file:active:opacity-80',\n 'file:mr-[var(--l-pass-gap)] file:px-[var(--l-pass-pd)] file:rounded-[var(--l-pass-el-bdrs)] file:border-0'\n )}\n />\n </label>\n\n {restoreFile && (\n <PasswordPasskey\n mode=\"restore\"\n isEncryptionMethod // encryption method should be in file if parsed correctly\n isLoading={isLoading}\n actionIcon={FileUp}\n actionHandler={() => restoreFromFile()}\n //@ts-expect-error\n actionCaption={t('passport:restoreMenu.restoreWithBackupFile', {\n fileName: restoreFile ? restoreFile.name : 'Backup File',\n decryptionMethod: usePasskey ? 'Passkey' : 'Password'\n })}\n // disabled={!!isLoading}\n />\n )}\n </>\n )\n}\n","export { MethodSelector } from './MethodSelector'\nexport { NoBackupFound } from './NoBackupFound'\n","import { useT } from '@/src/i18n/useT'\nimport { FileDown, FileUp } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\nimport { PasswordPasskey } from '../components/PasswordPasskey'\nimport { useRestoreStore, useValidateFileBackup } from '../hooks'\nimport { type ServerBackupFoundProps } from '../interfaces'\n\nexport function File(props: ServerBackupFoundProps) {\n const { isLoading, mode = 'restore', fileHandler } = props\n const { restoreFile, error, setRestoreFile, setError } = useRestoreStore()\n\n const { t } = useT()\n\n useValidateFileBackup()\n\n const actionText = mode === 'backup' ? t('passport:common.download') : 'Restore with'\n const isPasswordPasskey = (mode === 'restore' && !!restoreFile) || mode === 'backup'\n\n return (\n <>\n <span className=\"block w-full text-[10px] text-center leading-8 px-[var(--l-pass-pd)] truncate\">\n {mode === 'backup' ? t('passport:backupMenu.fileCreate') : t('passport:backupMenu.fileRestore')}\n </span>\n\n {mode === 'restore' && (\n <label\n className={cn(\n 'block w-full flex items-center justify-center cursor-pointer',\n 'p-[var(--l-pass-gap)] bg-[var(--l-pass-secondary)] rounded-[var(--l-pass-el-bdrs)]'\n )}\n >\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n if (!!error) setError(null)\n setRestoreFile(e.target.files?.[0] || null)\n }}\n className={cn(\n 'file:cursor-pointer',\n 'transition-colors duration-200 ease-in-out',\n 'block w-full file:h-12 text-xs file:bg-[var(--l-pass-primary)] file:text-[var(--l-pass-fg-inverted)]',\n 'file:hover:opacity-90 file:active:opacity-80',\n 'file:mr-[var(--l-pass-gap)] file:px-[var(--l-pass-pd)] file:rounded-[var(--l-pass-el-bdrs)] file:border-0 text-xs font-medium'\n )}\n />\n </label>\n )}\n\n {isPasswordPasskey && (\n <PasswordPasskey\n mode={mode}\n isLoading={isLoading}\n isEncryptionMethod={mode === 'restore'}\n actionCaption={`${actionText} ${restoreFile ? restoreFile.name : t('passport:backupMenu.file')}`}\n actionIcon={mode === 'restore' ? FileUp : FileDown}\n actionHandler={() => fileHandler()}\n disabled={!!isLoading || (mode === 'restore' && !restoreFile)}\n />\n )}\n </>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n/useT'\nimport { OtpIcon } from '@/src/internal/assets/OtpIcon'\nimport { useQueryClient } from '@tanstack/react-query'\nimport dayjs from 'dayjs'\nimport { Download, Key, Upload } from 'lucide-react'\nimport { useEffect } from 'react'\n\nimport { type RecoveryStats } from '../../../vaultClient'\nimport { Highlight } from '../../ui/highlight'\nimport { PasswordPasskey } from '../components/PasswordPasskey'\nimport { CHECK_BACKUP_QUERY_KEY } from '../constants'\nimport { useRestoreStore } from '../hooks'\nimport { type ServerBackupFoundProps } from '../interfaces'\n\nexport function Server(props: ServerBackupFoundProps) {\n const { isLoading, mode = 'restore', serverHandler, createPasskeyHandler } = props\n\n const address = useLumiaPassportSession((st) => st.address)\n const qc = useQueryClient()\n const { t } = useT()\n\n const usePasskey = useRestoreStore((st) => st.usePasskey)\n const setUsePasskey = useRestoreStore((st) => st.setUsePasskey)\n\n const serverRecoveryStatus = qc.getQueryData<RecoveryStats | null>([CHECK_BACKUP_QUERY_KEY, address])\n\n useEffect(() => {\n if (mode === 'backup' || !serverRecoveryStatus?.created?.encryptionMethod) return\n\n setUsePasskey(serverRecoveryStatus.created.encryptionMethod === 'passkey')\n }, [mode, serverRecoveryStatus, setUsePasskey])\n\n const isEncryptionMethod = mode === 'restore' && !!serverRecoveryStatus?.created?.encryptionMethod\n\n return (\n <>\n <PasswordPasskey\n mode={mode}\n isEncryptionMethod={isEncryptionMethod}\n isLoading={isLoading}\n actionIcon={mode === 'backup' ? Upload : Download}\n actionHandler={() => serverHandler()}\n onCreatePasskey={createPasskeyHandler}\n actionCaption={\n mode === 'backup'\n ? // @ts-expect-error\n t('passport:backupMenu.vaultCreate', {\n backupType: usePasskey ? t('passport:common.passkey') : t('passport:common.password')\n })\n : t('passport:backupMenu.vaultRestore')\n }\n />\n\n {!!serverRecoveryStatus?.created?.at && (\n <Highlight type=\"success\" className=\"flex gap-[var(--l-pass-gap)]\">\n {serverRecoveryStatus.created.encryptionMethod === 'password' ? (\n <OtpIcon className=\"w-4 h-4\" />\n ) : (\n <Key className=\"w-4 h-4\" />\n )}\n\n <span className=\"flex-1 block\">\n {t('passport:backupMenu.vaultRecoveryStatus')}{' '}\n <strong>{serverRecoveryStatus.created.encryptionMethod?.toUpperCase()}</strong>\n <br />\n <strong>{dayjs(serverRecoveryStatus.created.at).format('MMMM DD, YYYY HH:mm')}</strong>\n </span>\n </Highlight>\n )}\n </>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQuery } from '@tanstack/react-query'\nimport { ArrowLeft, CloudDownload, CloudUpload, Loader } from 'lucide-react'\nimport { useEffect } from 'react'\n\nimport { Button } from '../../ui/button'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../ui/select'\nimport { PasswordPasskey } from '../components/PasswordPasskey'\nimport { AVAILABLE_CLOUD_PROVIDERS_QUERY_KEY } from '../constants'\nimport { useRestoreStore } from '../hooks/useRestoreStore'\nimport type { CloudProviderInfo, ServerBackupFoundProps } from '../interfaces'\n\nexport function Cloud(props: ServerBackupFoundProps) {\n const { isLoading, mode = 'restore', cloudHandler } = props\n\n const session = useLumiaPassportSession((st) => st.session)\n const { selectedCloudProvider, usePasskey, setSelectedCloudProvider, setMethod, setError, setSuccess } =\n useRestoreStore()\n\n const passportUserId = session?.mpcUserId || ''\n\n const {\n data: cloudProviders = [],\n isLoading: isCloudProvidersLoading,\n error: cloudProvidersError\n } = useQuery<CloudProviderInfo[]>({\n retry: false,\n enabled: !!passportUserId,\n queryKey: [AVAILABLE_CLOUD_PROVIDERS_QUERY_KEY, passportUserId],\n queryFn: async () => {\n const { getAvailableCloudProviders } = await import('../../../cloudStorage')\n const availableProviders = getAvailableCloudProviders()\n return availableProviders.map((p) => ({ id: p.id, name: p.name, available: p.isAvailable() }))\n }\n })\n\n // Ensure a cloud provider is selected once loaded\n useEffect(() => {\n if (isCloudProvidersLoading) return\n\n if (!!cloudProvidersError) {\n console.error('[KeyshareBackup] Failed to load cloud providers:', cloudProvidersError)\n return\n }\n\n if (cloudProviders.length > 0 && !selectedCloudProvider) setSelectedCloudProvider(cloudProviders[0].id)\n }, [cloudProviders, selectedCloudProvider, cloudProvidersError, isCloudProvidersLoading])\n\n // console.log('[---- Cloud Providers ----]', selectedCloudProvider, cloudProviders)\n\n return (\n <>\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n onClick={() => {\n setError(null)\n setSuccess(null)\n setSelectedCloudProvider(null)\n setMethod(null)\n }}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-lg font-semibold\">{`${mode === 'restore' ? 'Restore' : 'Create'} Cloud Backup`}</span>\n </div>\n\n {isCloudProvidersLoading && <Loader className=\"animate-spin w-4 h-4 mx-auto\" />}\n\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{'1. Select Cloud Backup Vault'}</span>\n\n <Select\n disabled={isCloudProvidersLoading}\n value={selectedCloudProvider || ''}\n onValueChange={(value) => setSelectedCloudProvider(value)}\n >\n <SelectTrigger className=\"w-full\">\n <SelectValue placeholder=\"Select Cloud Provider\" />\n </SelectTrigger>\n\n <SelectContent\n side=\"bottom\"\n sideOffset={4}\n avoidCollisions={false}\n position=\"popper\"\n // collisionBoundary={selectBoundearyRef.current}\n >\n {cloudProviders.map((provider) => (\n <SelectItem key={provider.id} value={provider.id} disabled={!provider.available}>\n {provider.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">\n {`2. ${mode === 'restore' ? 'Decrypt' : 'Encrypt'} your backup by ${usePasskey ? 'passkey' : 'password'} `}\n </span>\n\n <PasswordPasskey\n mode={mode}\n isLoading={isLoading}\n actionCaption={mode === 'backup' ? 'Create Cloud Backup' : 'Restore Cloud Backup'}\n actionIcon={mode === 'backup' ? CloudUpload : CloudDownload}\n actionHandler={() => cloudHandler?.()}\n disabled={!!isCloudProvidersLoading || !selectedCloudProvider || cloudProviders.length === 0 || true}\n />\n </>\n )\n}\n","export { File } from './File'\nexport { Server } from './Server'\nexport { Cloud } from './Cloud'\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { AlertCircle, CheckCircle2, CloudDownload, Loader, UserCircle } from 'lucide-react'\nimport { useEffect, type ComponentType, type CSSProperties } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { getShareRecoveryStats } from '../../vaultClient'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { Switch } from '../ui/switch'\nimport { MethodSelector, NoBackupFound } from './components'\nimport { CHECK_BACKUP_QUERY_KEY } from './constants'\nimport { useRestoreAccount, useRestoreStore, type RestoreMethod } from './hooks'\nimport type { ServerBackupFoundProps } from './interfaces'\nimport { Cloud, File, Server } from './methods'\n\nconst RESTORE_COMPONENTS: Record<RestoreMethod, ComponentType<ServerBackupFoundProps>> = {\n server: Server,\n cloud: Cloud,\n file: File\n}\n\nexport const KeyshareRestoreMenu = () => {\n const qc = useQueryClient()\n const callbacks = useLumiaPassportConfig().callbacks\n const { t } = useT()\n\n const { address, setSession, setAddress, setStatus, setIsLoading } = useLumiaPassportSession()\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n const setIsDialogForced = useLayoutStore((st) => st.setIsDialogForced)\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const {\n method: currentRestoreMethod,\n\n error,\n success,\n\n setError,\n setShowPassword,\n setUsePasskey,\n setRestoreFile,\n setRestorePassword,\n setSuccess,\n setMethod\n } = useRestoreStore()\n\n useEffect(() => {\n setIsDialogForced(true)\n\n return () => {\n setRestorePassword('')\n setRestoreFile(null)\n setShowPassword(false)\n setUsePasskey(false)\n setMethod(null)\n setIsDialogForced(false)\n }\n }, [])\n\n const {\n restoreFromServer,\n isRestoringFromServer,\n\n restoreFromFile,\n isRestoringFromFile,\n\n restoreFromCloud,\n isRestoringFromCloud\n } = useRestoreAccount()\n\n const { data: serverRecoveryStatus, isLoading: isBackupStatusLoading } = useQuery({\n retry: false,\n queryKey: [CHECK_BACKUP_QUERY_KEY, address],\n queryFn: async () => await getShareRecoveryStats()\n })\n\n const hasServerBackup = serverRecoveryStatus?.created || serverRecoveryStatus?.devices?.length > 0\n\n useEffect(() => {\n if (!!hasServerBackup) setMethod('server') // select server restore if backup exists\n }, [hasServerBackup])\n\n const { mutate: disconnect, isPending: isDisconnecting } = useMutation({\n mutationFn: async () => {\n setError(null) // flush previous errors\n setMethod(null)\n setStatus('disconnecting')\n setIsLoading(true)\n\n const { jwtTokenManager } = await import('../../auth')\n const userId = jwtTokenManager.getUserId() || null // save userId before logout\n\n const { logout } = await import('../../auth')\n await logout()\n\n return { disconnectedUserId: userId }\n },\n\n onSuccess: async ({ disconnectedUserId }) => {\n await qc.resetQueries({ queryKey: [CHECK_BACKUP_QUERY_KEY] })\n\n setSession(null)\n setAddress(null)\n setError(null)\n setStatus('idle')\n setIsLoading(false)\n setIsDialogForced(false)\n\n callbacks?.onLumiaPassportDisconnect?.({ address: '0x', userId: disconnectedUserId })\n\n setTimeout(() => setPage(PageKey.AUTH), 50) // delay to allow UI to update\n },\n\n onError: (err) => {\n setError(err.message || 'An unknown error occurred during sign out')\n setStatus('idle')\n setIsLoading(false)\n setIsDialogForced(false)\n }\n })\n\n const RestoreComponent = currentRestoreMethod ? RESTORE_COMPONENTS[currentRestoreMethod] : null\n\n // const isBackupChecking = isBackupStatusLoading\n\n return (\n <div\n style={{ '--l-pass-scrollbar-mah': `${maxScrollHeight}px` } as CSSProperties}\n className=\"list-scrollbar-y w-full\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)]\">\n {/* Show loading state while checking backup */}\n {isBackupStatusLoading && (\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)] text-center justify-center items-center\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n <span className=\"block w-full text-xs leading-4\">{t('passport:restoreMenu.check')}</span>\n </div>\n )}\n\n {/* // Show CRITICAL Warning if no backup found */}\n {!success && !isBackupStatusLoading && !isDisconnecting && !hasServerBackup && (\n <NoBackupFound\n isLoading={isRestoringFromServer || isRestoringFromCloud || isRestoringFromFile || isDisconnecting}\n restoreFromFile={restoreFromFile}\n />\n )}\n\n {/* Show restore options if backup exists */}\n {!success && !isBackupStatusLoading && !isDisconnecting && hasServerBackup && (\n <>\n <div className=\"flex items-center justify-between gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <CloudDownload className=\"w-6 h-6\" />\n <span className=\"font-bold text-xl leading-6\">{t('passport:restoreMenu.title')}</span>\n </div>\n\n <Switch\n name=\"advanced-restore-flow-toggle\"\n labels={{ checked: t('passport:common.standard'), unchecked: t('passport:common.advanced') }}\n // disabled={isLoading}\n checked={currentRestoreMethod !== 'server'}\n onChange={() => {\n if (!!error) setError(null)\n\n if (currentRestoreMethod === 'server') {\n setRestorePassword('')\n setMethod(null)\n } else {\n setRestoreFile(null)\n setMethod('server')\n }\n }}\n />\n </div>\n\n <MethodSelector mode=\"restore\" serverRecoveryStatus={serverRecoveryStatus} />\n\n {!!currentRestoreMethod && (\n <RestoreComponent\n isLoading={isRestoringFromFile || isRestoringFromServer || isRestoringFromCloud || isDisconnecting}\n fileHandler={restoreFromFile}\n serverHandler={restoreFromServer}\n cloudHandler={restoreFromCloud}\n />\n )}\n </>\n )}\n\n {!success && !isBackupStatusLoading && (\n <Button\n size=\"large\"\n variant=\"ghost\"\n onClick={() => {\n // full flush\n setError(null)\n setShowPassword(false)\n setUsePasskey(false)\n setRestoreFile(null)\n setRestorePassword('')\n setSuccess(null)\n setMethod(null)\n\n // logout LumiaPassport session\n disconnect()\n }}\n disabled={isDisconnecting || isRestoringFromFile || isRestoringFromServer}\n className=\"w-fit mx-auto\"\n >\n {isDisconnecting ? <Loader className=\"w-4 h-4 animate-spin\" /> : <UserCircle className=\"w-4 h-4\" />}\n <span>{t('passport:restoreMenu.tryAnotherAccount')}</span>\n </Button>\n )}\n\n {error && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"w-full flex-1 block\">{error}</span>\n </Highlight>\n )}\n\n {success && (\n <Highlight type=\"success\" className=\"flex gap-[var(--l-pass-gap)]\">\n <CheckCircle2 className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"w-full flex-1 block\">{success}</span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useQuery } from '@tanstack/react-query'\nimport { AlertCircle, ArrowLeft, CheckCircle2, Loader, LockIcon } from 'lucide-react'\nimport { useEffect, type ComponentType, type CSSProperties } from 'react'\n\nimport { DEFAULT_SETTINGS_MENU_HEIGHT } from '../../constants'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { getShareRecoveryStats } from '../../vaultClient'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { Switch } from '../ui/switch'\nimport { MethodSelector } from './components'\nimport { CHECK_BACKUP_QUERY_KEY } from './constants'\nimport { useCreateBackup, useRestoreStore, type RestoreMethod } from './hooks'\nimport type { ServerBackupFoundProps } from './interfaces'\nimport { Cloud, File, Server } from './methods'\n\nconst COMPONENTS: Record<RestoreMethod, ComponentType<ServerBackupFoundProps>> = {\n server: Server,\n file: File,\n cloud: Cloud\n}\n\nexport function KeyshareBackupMenu() {\n const address = useLumiaPassportSession((st) => st.address)\n const hasServerVault = useLumiaPassportSession((st) => st.hasServerVault)\n\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const {\n method: currentBackupMethod,\n error,\n success,\n\n setSelectedCloudProvider,\n setSuccess,\n setError,\n setRestorePassword,\n setRestoreFile,\n setShowPassword,\n setUsePasskey,\n setMethod\n } = useRestoreStore()\n\n useEffect(() => {\n return () => {\n setSuccess(null)\n setError(null)\n\n setRestoreFile(null)\n setRestorePassword('')\n setShowPassword(false)\n setUsePasskey(false)\n setMethod(null)\n }\n }, [])\n\n const { data: serverRecoveryStatus, isLoading: isRecoveryLoading } = useQuery({\n retry: false,\n enabled: !!address, // Prevent query from running with undefined address\n queryKey: [CHECK_BACKUP_QUERY_KEY, address],\n queryFn: async () => await getShareRecoveryStats()\n })\n\n const hasRecoveryData = serverRecoveryStatus?.created || serverRecoveryStatus?.devices?.length > 0\n\n useEffect(() => {\n if (!!hasRecoveryData) setMethod('server') // select server restore if backup exists\n }, [hasRecoveryData])\n\n const {\n isPasswordBackupCreating,\n createPasswordBackup,\n\n isCloudBackupCreating,\n createCloudBackup,\n\n isLocalBackupCreating,\n createLocalBackup,\n\n isPasskeyCreating,\n createPasskey\n } = useCreateBackup()\n\n const BackupComponent = !!currentBackupMethod ? COMPONENTS[currentBackupMethod] : null\n\n return (\n <div\n style={{ '--l-pass-scrollbar-mah': `${maxScrollHeight}px` } as CSSProperties}\n className=\"list-scrollbar-y w-full\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)]\">\n {/* Show spinner only if loading AND (has vault OR no method set) - new users with method skip spinner */}\n {!!isRecoveryLoading && (hasServerVault || !currentBackupMethod) && (\n <div className=\"w-full flex items-center justify-center p-[var(--l-pass-pd)]\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n </div>\n )}\n\n {/* Show \"Secure Account\" header for new users immediately OR after query confirms no backup */}\n {(!isRecoveryLoading || !hasServerVault) && !hasRecoveryData && (\n <div className=\"flex items-center justify-center gap-2 px-5 py-[var(--l-pass-pd)]\">\n <LockIcon className=\"w-6 h-6\" />\n <span className=\"font-bold text-xl leading-6\">{t('passport:backupMenu.title')}</span>\n </div>\n )}\n\n {!isRecoveryLoading && !!hasRecoveryData && (\n <div className=\"flex items-center justify-between gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n onClick={() => {\n setRestorePassword('')\n setRestoreFile(null)\n setShowPassword(false)\n setSelectedCloudProvider(null)\n setUsePasskey(false)\n\n setError(null)\n setSuccess(null)\n\n setMethod(null)\n setPage(PageKey.SETTINGS)\n }}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold leading-8\">{t('passport:backupMenu.title')}</span>\n </div>\n\n <Switch\n name=\"advanced-restore-flow-toggle\"\n labels={{ checked: t('passport:common.standard'), unchecked: t('passport:common.advanced') }}\n // disabled={isLoading}\n checked={currentBackupMethod !== 'server'}\n onChange={() => {\n if (!!error) setError(null)\n\n if (currentBackupMethod === 'server') {\n setRestorePassword('')\n setMethod(null)\n } else {\n setRestoreFile(null)\n setMethod('server')\n }\n }}\n />\n </div>\n )}\n\n {!isRecoveryLoading && !!hasRecoveryData && !currentBackupMethod && (\n <MethodSelector mode=\"backup\" serverRecoveryStatus={serverRecoveryStatus} />\n )}\n\n {/* Show BackupComponent when: query done OR new user (no vault) - don't block on loading for new users */}\n {(!isRecoveryLoading || !hasServerVault) && !!currentBackupMethod && (\n <>\n <BackupComponent\n mode=\"backup\"\n isLoading={\n isPasswordBackupCreating || isCloudBackupCreating || isLocalBackupCreating || isPasskeyCreating\n }\n fileHandler={createLocalBackup}\n serverHandler={createPasswordBackup}\n cloudHandler={createCloudBackup}\n createPasskeyHandler={createPasskey}\n />\n </>\n )}\n\n {!isRecoveryLoading && !currentBackupMethod && !hasRecoveryData && (\n <Highlight type=\"warning\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"block flex-1 font-semibold\">No Backup Found</span>\n </Highlight>\n )}\n\n {error && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"block w-full flex-1\">{error}</span>\n </Highlight>\n )}\n\n {success && (\n <Highlight type=\"success\" className=\"flex gap-[var(--l-pass-gap)]\">\n <CheckCircle2 className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"block w-full flex-1\">{success}</span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","export { KeyshareRestoreMenu } from './KeyshareRestoreMenu'\nexport { KeyshareBackupMenu } from './KeyshareBackupMenu'\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { getAvailableLanguages, LANGUAGES, LOCAL_STORAGE_I18N_KEY, useT } from '@/src/i18n'\nimport { ArrowLeft } from 'lucide-react'\nimport { type CSSProperties } from 'react'\n\nimport { useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\n\nexport function LanguagesMenu() {\n const config = useLumiaPassportConfig().config\n\n const { t, i18n } = useT()\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n const langOpenedFromMenu = useLayoutDataStore((st) => st.langOpenedFromMenu)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const languageList = getAvailableLanguages(config.current.translations) // config translations are already combined with defaults\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button variant=\"ghost\" size=\"icon\" title=\"Back\" onClick={() => setPage(langOpenedFromMenu)}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:common.language')}</span>\n </div>\n\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)] py-[var(--l-pass-pd)]\">\n {languageList.map((langKey) => (\n <Button\n key={langKey}\n size=\"large\"\n variant={i18n.resolvedLanguage === langKey ? 'default' : 'ghost'}\n className=\"justify-between\"\n onClick={() => {\n i18n.changeLanguage(langKey)\n localStorage.setItem(LOCAL_STORAGE_I18N_KEY, langKey)\n setPage(langOpenedFromMenu)\n }}\n >\n <span>{LANGUAGES[langKey]?.name}</span>\n <span className=\"text-2xl leading-6\">{LANGUAGES[langKey]?.flags}</span>\n </Button>\n ))}\n </div>\n </Expandable>\n </div>\n )\n}\n","export { LanguagesMenu } from './LanguagesMenu'\n","import { authenticatedFetch, ensureValidToken, jwtTokenManager } from '../index';\nimport { getTssUrl } from './types';\nimport type { AuthProvider, ProvidersResponse } from './types';\n\nexport async function getLinkedProviders(): Promise<AuthProvider[]> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/providers`, { method: 'GET' });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to fetch providers: ${response.statusText}`);\n }\n const data: ProvidersResponse = await response.json();\n return data.providers;\n}\n\nexport async function unlinkProvider(providerType: string, externalId?: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n let url = `${getTssUrl()}/api/auth/unlink/${providerType}`;\n if (externalId) url += `?externalId=${encodeURIComponent(externalId)}`;\n const response = await authenticatedFetch(url, { method: 'DELETE' });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink provider: ${response.statusText}`);\n }\n try {\n const data = await response.json();\n if (data?.accessToken && data?.refreshToken && data?.expiresIn) {\n jwtTokenManager.setTokens({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n userId: jwtTokenManager.getUserId() || '',\n expiresIn: data.expiresIn,\n hasKeyshare: (jwtTokenManager.getHasKeyshare() ?? false) as boolean,\n } as any);\n }\n } catch {}\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQuery } from '@tanstack/react-query'\n\nimport { getLinkedProviders } from '../../../auth/providers/common'\nimport { PageKey, useLayoutDataStore } from '../../../hooks/useLayoutDataStore'\n\nexport const PROVIDERS_QUERY_KEY = 'lumia-passport-providers-query'\n\nexport function useProvidersList() {\n const address = useLumiaPassportSession((st) => st.address)\n const page = useLayoutDataStore((st) => st.page)\n\n return useQuery({\n retry: false,\n // hook is invoked on multiple pages to preload cache\n enabled: !!address && (page === PageKey.MANAGE_WALLET || page === PageKey.SETTINGS || page === PageKey.MAIN_MENU),\n queryKey: [PROVIDERS_QUERY_KEY, address],\n queryFn: async () => getLinkedProviders()\n })\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n/useT'\nimport i18n from 'i18next'\nimport { ChevronLeft, ChevronRight, DollarSign, Wallet2 } from 'lucide-react'\nimport { useEffect } from 'react'\n\nimport { DEFAULT_MAIN_MENU_HEIGHT } from '../../constants'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useProvidersList } from '../ManageWalletMenu/hooks/useProvidersList'\nimport { Button } from '../ui/button'\n\nconst MAIN_MENU_BUTTONS = [\n { id: PageKey.SEND, label: 'passport:main.send', icon: ChevronRight },\n { id: PageKey.RECEIVE, label: 'passport:main.receive', icon: ChevronLeft },\n { id: PageKey.BUY, label: 'passport:main.buy', icon: DollarSign },\n { id: PageKey.ASSETS, label: 'passport:main.assets', icon: Wallet2 }\n] as const\n\nexport function MainMenu() {\n const address = useLumiaPassportSession((st) => st.address)\n\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setTransitionPageHeight = useLayoutDataStore((st) => st.setTransitionPageHeight)\n\n // actual height measurement of the main menu on mount. prevents layout animations jumps\n useEffect(() => setTransitionPageHeight(DEFAULT_MAIN_MENU_HEIGHT), [])\n\n useProvidersList() // preload providers query cache\n\n return (\n <div className=\"w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"w-full grid grid-cols-4 gap-0 md:gap-[var(--l-pass-gap)] py-[10px] md:py-1\">\n {MAIN_MENU_BUTTONS.map(({ id, label, icon: Icon }) => (\n <Button\n key={id}\n size=\"large\"\n variant=\"ghost\"\n disabled={!address}\n className=\"flex-col w-full h-fit p-0\"\n onClick={() => setPage(id)}\n >\n <Icon className=\"w-5 h-5 md:w-8 md:h-8\" />\n <span className=\"text-xs font-semibold\">{t(label)}</span>\n </Button>\n ))}\n </div>\n </div>\n )\n}\n","export { MainMenu } from './MainMenu'\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCallback } from 'react'\n\n// import { useLumiaPassportConfig } from '../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext'\nimport { jwtTokenManager } from '../internal/auth'\nimport { getLinkedProviders } from '../internal/auth/providers/common'\nimport { getProviderDisplayInfo, type AuthProvider } from '../internal/auth/providers/types'\n\nexport interface LinkedProfileDisplay extends AuthProvider {\n displayName: string\n icon?: React.ComponentType<{ className?: string }> // React icon component\n color?: string\n}\n\nexport const LINKED_PROFILES_QUERY_KEY = 'lumia-passport-linked-profiles-query'\n\nasync function getLinkProfilesData() {\n const list = await getLinkedProviders()\n\n const loadedProfiles = list.map((p) => {\n const info = getProviderDisplayInfo(p.provider)\n return { ...p, displayName: info.name, icon: info.icon } as LinkedProfileDisplay\n })\n\n let avatar: string | null = null\n\n try {\n avatar = jwtTokenManager.getAvatar() || null\n } catch {\n avatar = null\n }\n\n return { profiles: loadedProfiles, avatar }\n}\n\nexport function useLumiaPassportLinkedProfiles() {\n const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n\n const {\n data,\n isFetching: isLoading,\n error\n } = useQuery({\n retry: false,\n enabled: !!address,\n queryKey: [LINKED_PROFILES_QUERY_KEY, address],\n queryFn: getLinkProfilesData\n })\n\n const { profiles = [], avatar = null } = data || {}\n\n const refresh = useCallback(async () => {\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address] })\n }, [qc, address])\n\n return { profiles, avatar, isLoading, error, refresh }\n}\n","import { create } from 'zustand'\n\nimport type { AuthMethod } from '../../../auth'\n\ntype AlertType = { title: string; message: string }\n\ninterface ManageWalletState {\n alert: AlertType | null\n\n emailStep: 'input' | 'verify' | null\n email: string\n emailCode: string\n emailCodeExpiresIn: number\n\n linkIsLoading: boolean\n linkError: string | null\n\n providerType: AuthMethod | null\n\n confirmUnlink: {\n provider: string\n providerName: string\n externalId: string\n } | null\n}\n\ninterface ManageWalletActions {\n setAlert: (alert: AlertType | null) => void\n\n setEmailStep: (emailStep: ManageWalletState['emailStep']) => void\n setEmail: (email: string) => void\n setEmailCode: (emailCode: string) => void\n setEmailCodeExpiresIn: (emailCodeExpiresIn: number) => void\n\n setLinkIsLoading: (linkIsLoading: boolean) => void\n setLinkError: (linkError: string | null) => void\n\n setProviderType: (providerType: AuthMethod | null) => void\n setConfirmUnlink: (confirmUnlink: ManageWalletState['confirmUnlink']) => void\n}\n\n/** Hook providing ManageWallet data */\nconst useManageWalletStore = create<ManageWalletState & ManageWalletActions>((set) => ({\n alert: null,\n\n emailStep: 'input',\n email: '',\n emailCode: '',\n emailCodeExpiresIn: 0,\n\n linkIsLoading: false,\n linkError: null,\n\n providerType: null,\n\n confirmUnlink: null,\n\n setAlert: (alert) => set({ alert }),\n\n setEmailStep: (emailStep) => set({ emailStep }),\n setEmail: (email) => set({ email }),\n setEmailCode: (emailCode) => set({ emailCode }),\n setEmailCodeExpiresIn: (emailCodeExpiresIn) => set({ emailCodeExpiresIn }),\n\n setLinkIsLoading: (linkIsLoading) => set({ linkIsLoading }),\n setLinkError: (linkError) => set({ linkError }),\n\n setProviderType: (providerType) => set({ providerType }),\n\n setConfirmUnlink: (confirmUnlink) => set({ confirmUnlink })\n}))\n\nexport { useManageWalletStore }\n","import { getServiceUrls } from '@/src/config/lumiaPassport'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useMutation } from '@tanstack/react-query'\nimport { ChevronRight, Loader, Mail } from 'lucide-react'\n\nimport { addProjectIdToUrl } from '../../utils/projectId'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { useManageWalletStore } from './hooks/useStore'\n\nexport function EmailForm() {\n const { callbacks } = useLumiaPassportConfig()\n\n const { t } = useT()\n\n const isLoading = useLumiaPassportSession((st) => st.isLoading)\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n\n const { email, setEmail, setAlert, setEmailCodeExpiresIn, setEmailStep } = useManageWalletStore()\n\n const { mutate: onSendVerificationCode } = useMutation({\n mutationFn: async () => {\n if (!email) return\n\n setIsLoading(true)\n setAlert(null)\n\n try {\n const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({\n email,\n purpose: 'login'\n })\n })\n\n const data = await response.json()\n\n if (response.ok) {\n setEmailCodeExpiresIn(data?.expiresIn || 300)\n\n setEmailStep('verify')\n } else {\n // Handle different error types\n if (response.status === 429) {\n const retryAfter = data.retryAfter || 60\n setAlert({\n title: 'Too Many Requests',\n message: `Code already sent recently. Please wait ${retryAfter} seconds before requesting another.`\n })\n } else if (response.status === 400) {\n setAlert({\n title: 'Invalid Email',\n message: data.message || 'Invalid email address'\n })\n } else {\n setAlert({\n title: 'Error',\n message: data.message || 'Failed to send verification code'\n })\n }\n }\n } catch (error) {\n const errorMessage = 'Network error. Please check your connection.'\n setAlert({\n title: 'Network Error',\n message: errorMessage\n })\n\n // Trigger onLumiaPassportError callback\n try {\n callbacks?.onLumiaPassportError?.({\n error: error instanceof Error ? error : new Error(errorMessage),\n message: errorMessage\n })\n } catch {}\n } finally {\n setIsLoading(false)\n }\n }\n })\n\n return (\n <div className=\"w-full flex gap-[10px] items-center\">\n <Input\n name=\"signin-email\"\n Icon={Mail}\n type=\"email\"\n autoComplete=\"off\"\n placeholder={t('passport:profilesMenu.email.placeholder')}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"flex-1 w-full\"\n />\n\n <Button\n className=\"w-12 h-12 flex-none\"\n variant=\"default\"\n size=\"large\"\n disabled={!email || isLoading}\n onClick={() => onSendVerificationCode()}\n >\n {isLoading ? <Loader className=\"w-4 h-4 animate-spin\" /> : <ChevronRight className=\"w-4 h-4\" />}\n </Button>\n </div>\n )\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport async function sendEmailLinkCode(email: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/email/send-code`, {\n method: 'POST',\n body: JSON.stringify({ email })\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to send email verification code: ${response.statusText}`);\n }\n}\n\nexport async function verifyEmailLinkCode(email: string, code: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/email/verify-code`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({ email, code })\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to verify email and link provider: ${response.statusText}`);\n }\n}\n\n","import { useMutation } from '@tanstack/react-query'\n\nimport { sendEmailLinkCode } from '../../../auth/providers/email'\nimport { useManageWalletStore } from '../hooks/useStore'\n\n/** Hook to send verification code to email */\nexport function useSendVerificationCode() {\n const setAlert = useManageWalletStore((st) => st.setAlert)\n const setLinkIsLoading = useManageWalletStore((st) => st.setLinkIsLoading)\n const setEmailCodeExpiresIn = useManageWalletStore((st) => st.setEmailCodeExpiresIn)\n\n return useMutation({\n mutationFn: async (email: string) => {\n if (!email) {\n throw new Error('Email is required')\n }\n\n setAlert(null)\n setLinkIsLoading(true)\n\n await sendEmailLinkCode(email)\n },\n\n onError: (error) => {\n console.error('Failed to send verification code', error.message)\n setAlert({ title: 'Error', message: error?.message || 'Failed to send verification code' })\n setLinkIsLoading(false)\n },\n\n onSuccess: () => {\n setEmailCodeExpiresIn(300)\n console.log('Verification code sent')\n setLinkIsLoading(false)\n }\n })\n}\n","import { LINKED_PROFILES_QUERY_KEY } from '@/src/modules/linkedProfiles'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\n\nimport { useLumiaPassportConfig } from '../../../../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../../../../context/LumiaPassportSessionContext'\n// import { type AuthMethod } from '../../../auth'\n//\nimport { verifyEmailLinkCode } from '../../../auth/providers/email'\n//\n// import { PageKey, useLayoutDataStore } from '../../../hooks/useLayoutDataStore'\nimport { PROVIDERS_QUERY_KEY } from '../hooks/useProvidersList'\nimport { useManageWalletStore } from '../hooks/useStore'\n\nexport function useVerifyCode() {\n const { callbacks } = useLumiaPassportConfig()\n\n const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n const setIsLoading = useLumiaPassportSession((st) => st.setIsLoading)\n\n const { email, emailCode, setEmail, setEmailStep, setEmailCode, setProviderType, setLinkIsLoading, setAlert } =\n useManageWalletStore()\n\n return useMutation({\n mutationFn: async (codeToVerify?: string) => {\n const code = codeToVerify ?? emailCode\n if (!code) {\n setAlert({ title: 'Error', message: 'Please enter the verification code' })\n return\n }\n\n setIsLoading(true)\n setLinkIsLoading(true)\n setAlert(null)\n\n return await verifyEmailLinkCode(email, code)\n },\n\n onSuccess: async () => {\n // Invalidate providers list after successful link\n\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, address] })\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address] })\n\n setProviderType(null)\n setEmail('')\n setEmailCode('')\n setAlert(null)\n setEmailStep('input')\n\n try {\n callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address]) })\n } catch {}\n\n setIsLoading(false)\n setLinkIsLoading(false)\n },\n\n onError: (error) => {\n setAlert({ title: 'Error', message: error?.message || 'Failed to verify and link email' })\n\n setIsLoading(false)\n setLinkIsLoading(false)\n }\n })\n}\n","import { useT } from '@/src/i18n'\nimport { LINKED_PROFILES_QUERY_KEY } from '@/src/modules/linkedProfiles'\nimport { useQueryClient } from '@tanstack/react-query'\n\nimport { useLumiaPassportConfig } from '../../../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../../../context/LumiaPassportSessionContext'\nimport { PasskeyAddIcon } from '../../assets/PasskeyAddIcon'\nimport { linkPasskeyWithWebAuthn } from '../../auth/providers/passkey'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { VerificationCodeInput } from '../AuthMenu/VerifyStep/VerificationCodeInput'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { EmailForm } from './EmailForm'\nimport { PROVIDERS_QUERY_KEY } from './hooks/useProvidersList'\nimport { useSendVerificationCode } from './hooks/useSendVerificationCode'\nimport { useManageWalletStore } from './hooks/useStore'\nimport { useVerifyCode } from './hooks/useVerifyCode'\n\nfunction normalizePasskeyLinkError(msg: string): string {\n const lower = msg.toLowerCase()\n if (lower.includes('already registered') || (lower.includes('credential') && lower.includes('exists'))) {\n return 'This authenticator already has a credential for this site. Try a different device or security key.'\n }\n if (lower.includes('not allowed') || lower.includes('user cancelled')) {\n return 'Operation cancelled. No changes were made.'\n }\n return msg\n}\n\nexport function AddProvider() {\n const qc = useQueryClient()\n const callbacks = useLumiaPassportConfig().callbacks\n const address = useLumiaPassportSession((st) => st.address)\n\n const { t } = useT()\n\n const {\n linkIsLoading,\n\n providerType,\n\n email,\n emailStep,\n emailCodeExpiresIn,\n\n setAlert,\n setProviderType,\n setLinkIsLoading\n } = useManageWalletStore()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const { mutate: onResendCode, isPending: isCodeSending } = useSendVerificationCode()\n const { mutate: onVerifyCode, isPending: isCodeVerifying } = useVerifyCode()\n\n const isLoading = linkIsLoading || isCodeSending || isCodeVerifying\n\n if (!providerType) return null\n\n return (\n <>\n {/* EMAIL START */}\n {providerType === 'email' && emailStep === 'input' && (\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"w-full flex flex-col gap-1 text-center\">\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">\n {t('passport:profilesMenu.email.placeholder')}\n </span>\n </div>\n\n <EmailForm />\n </div>\n )}\n\n {providerType === 'email' && emailStep === 'verify' && (\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"w-full flex flex-col gap-1 text-center\">\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:profilesMenu.email.sentTo')}</span>\n {': '}\n <strong className=\"text-[10px]\">{email}</strong>\n </div>\n\n <VerificationCodeInput\n onVerifyCode={onVerifyCode}\n onResendCode={() => onResendCode(email)}\n isLoading={isLoading}\n expiresIn={emailCodeExpiresIn}\n />\n </div>\n )}\n {/* EMAIL END */}\n\n {/* PASSKEY */}\n {providerType === 'passkey' && (\n <div className=\"flex flex-col gap-[var(--l-pass-gap)]\">\n <Highlight>\n <span className=\"block mb-1\">{t('passport:profilesMenu.passkey.message')}</span>\n <span className=\"block\">{t('passport:profilesMenu.passkey.message2')}</span>\n </Highlight>\n\n <Button\n className=\"w-full\"\n size=\"large\"\n disabled={isLoading}\n // TODO useMutation\n onClick={async () => {\n setAlert(null)\n setLinkIsLoading(true)\n\n try {\n // Prefer platform authenticator (this device)\n await linkPasskeyWithWebAuthn({\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n residentKey: 'preferred',\n userVerification: 'preferred'\n }\n })\n\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, address] })\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address] })\n\n try {\n callbacks?.onLumiaPassportUpdate?.({\n providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address])\n })\n } catch {}\n\n setPage(PageKey.MANAGE_WALLET)\n\n setProviderType(null)\n } catch (e: any) {\n const msg = e?.message || 'Failed to link passkey'\n setAlert({ title: 'Error', message: normalizePasskeyLinkError(msg) })\n } finally {\n setLinkIsLoading(false)\n }\n }}\n >\n <PasskeyAddIcon className=\"w-4 h-4\" />\n\n {linkIsLoading\n ? t('passport:profilesMenu.passkey.linking')\n : t('passport:profilesMenu.passkey.createOnDevice')}\n </Button>\n\n <Button\n className=\"w-full\"\n variant=\"outline\"\n size=\"large\"\n disabled={isLoading}\n // TODO useMutation\n onClick={async () => {\n setAlert(null)\n setLinkIsLoading(true)\n try {\n // Prefer cross-platform authenticator (security key / phone)\n await linkPasskeyWithWebAuthn({\n authenticatorSelection: {\n authenticatorAttachment: 'cross-platform',\n residentKey: 'preferred',\n userVerification: 'preferred'\n }\n })\n\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, address] })\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address] })\n\n try {\n callbacks?.onLumiaPassportUpdate?.({\n providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address])\n })\n } catch {}\n\n setPage(PageKey.MANAGE_WALLET)\n setProviderType(null)\n } catch (e: any) {\n const msg = e?.message || 'Failed to link passkey'\n setAlert({ title: 'Error', message: normalizePasskeyLinkError(msg) })\n } finally {\n setLinkIsLoading(false)\n }\n }}\n >\n <PasskeyAddIcon className=\"w-4 h-4\" />\n {t('passport:profilesMenu.passkey.createOnSecurityKey')}\n </Button>\n </div>\n )}\n\n {/* Telegram linking is handled automatically via popup when providerType is set */}\n {/* Wallet connection is now handled directly via RainbowKit modal */}\n {/* {providerType !== null &&\n providerType !== 'email' &&\n providerType !== 'passkey' &&\n // providerType !== 'telegram' &&\n providerType !== 'wallet' && (\n <Highlight>\n {linkIsLoading\n ? `Linking with ${providerType.charAt(0).toUpperCase() + providerType.slice(1)}… Follow the popup to approve the connection.`\n : `Launching ${providerType.charAt(0).toUpperCase() + providerType.slice(1)} authentication…`}\n </Highlight>\n )} */}\n </>\n )\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useT } from '@/src/i18n'\nimport { Mail } from 'lucide-react'\n\nimport { jwtTokenManager } from '../../auth'\nimport { Highlight } from '../ui/highlight'\n\nexport function EmailNotConnectedWarning() {\n const providers = jwtTokenManager.getProviders() // Get providers from JWT tokens (faster than API call)\n const hasEmail = providers.includes('email')\n\n const { t } = useT()\n\n const config = useLumiaPassportConfig().config\n\n const isShown = config.current?.warnings?.emailNotConnectedWarning && !hasEmail\n\n if (!isShown) return null\n\n return (\n <Highlight type=\"warning\" className=\"flex flex-col gap-[var(--l-pass-gap)] items-center text-center\">\n <span className=\"flex items-center gap-[var(--l-pass-gap)] text-lg font-bold\">\n <Mail className=\"w-5 h-5\" />\n {t('passport:profilesMenu.email.warningTitle')}\n </span>\n\n <span className=\"font-medium\">{t('passport:profilesMenu.email.warningMsg')}</span>\n </Highlight>\n )\n}\n","import { PageKey, useLayoutDataStore } from '@/hooks/useLayoutDataStore'\nimport { LINKED_PROFILES_QUERY_KEY } from '@/src/modules/linkedProfiles'\nimport { useQueryClient } from '@tanstack/react-query'\nimport React, { useEffect } from 'react'\n\nimport { useLumiaPassportConfig } from '../../../../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../../../../context/LumiaPassportSessionContext'\nimport { ensureValidToken, jwtTokenManager } from '../../../auth'\nimport { buildTelegramBrowserRestriction, shouldBlockSocialAuthInTelegram } from '../../../utils/telegramBrowser'\nimport { PROVIDERS_QUERY_KEY } from './useProvidersList'\nimport { useManageWalletStore } from './useStore'\n\nexport function useLinkSocial() {\n const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n\n const {\n config: { current: config },\n callbacks\n } = useLumiaPassportConfig()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking)\n const { providerType, linkIsLoading, setProviderType, setAlert, setLinkIsLoading } = useManageWalletStore()\n\n const handleLinkSocialProvider = React.useCallback(\n async (providerIdRaw: string) => {\n const providerKey = providerIdRaw.toLowerCase()\n // Normalize twitter to x for matching config\n const normalizedKey = providerKey === 'twitter' ? 'x' : providerKey\n\n try {\n if (shouldBlockSocialAuthInTelegram(providerKey)) {\n const label = providerKey === 'twitter' || providerKey === 'x' ? 'X' : providerIdRaw\n setAlert(buildTelegramBrowserRestriction(label, 'linking'))\n setProviderType(null)\n return\n }\n\n setLinkIsLoading(true)\n setAlert(null)\n\n const socialProvider = config.social?.providers?.find(\n (p: any) => (p.id || '').toLowerCase() === normalizedKey && p.enabled\n )\n\n if (!socialProvider) {\n throw new Error(`${providerIdRaw} provider not configured`)\n }\n\n let authConfig: Record<string, any> = {\n ...(socialProvider.meta || {}),\n mode: 'link'\n }\n\n // Ensure we have a fresh access token for authenticated link requests\n try {\n await ensureValidToken()\n } catch (tokenError) {\n console.warn('[ManageWallet] ensureValidToken failed before linking', tokenError)\n }\n\n const accessToken = jwtTokenManager.getAccessToken()\n if (accessToken) {\n authConfig.token = accessToken\n }\n\n const normalizedProvider = providerKey === 'twitter' ? 'x' : providerKey\n\n const { getIframeManager } = await import('../../../lib/iframe-manager')\n const iframeManager = getIframeManager()\n const result = await iframeManager.openSocialAuthPopup(normalizedProvider, authConfig)\n\n if (!result.success) {\n throw new Error(result.error || `${socialProvider.name || providerIdRaw} authentication failed`)\n }\n\n // Invalidate providers list after successful link\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, address] })\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address] })\n\n try {\n callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address]) })\n } catch {}\n\n setProviderType(null)\n setPage(PageKey.MANAGE_WALLET)\n } catch (e: any) {\n console.error(`[ManageWallet] Failed to link ${providerIdRaw}:`, e)\n const message = e?.message || `Failed to link ${providerIdRaw}`\n setAlert({ title: 'Error', message })\n setProviderType(null)\n } finally {\n setLinkIsLoading(false)\n }\n },\n [config.social?.providers, callbacks]\n )\n\n const [socialLinkStarted, setSocialLinkStarted] = React.useState(false)\n\n useEffect(() => {\n const key = providerType?.toLowerCase()\n console.log('[useLinkSocial] Effect triggered:', { key, linkIsLoading, socialLinkStarted, isWalletLinking })\n\n // Don't start social flow if wallet linking is in progress\n if (isWalletLinking) {\n console.log('[useLinkSocial] Skipping - wallet linking in progress')\n return\n }\n\n if (key && key !== 'telegram' && key !== 'email' && key !== 'passkey' && key !== 'wallet') {\n if (!linkIsLoading && !socialLinkStarted) {\n console.log('[useLinkSocial] Starting social link flow for:', key)\n setSocialLinkStarted(true)\n handleLinkSocialProvider(key)\n }\n } else if (socialLinkStarted) {\n setSocialLinkStarted(false)\n }\n }, [providerType, linkIsLoading, socialLinkStarted, isWalletLinking, handleLinkSocialProvider])\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport async function linkTelegram(telegramData: any): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n // Send data exactly as received from Telegram (no modifications)\n // Fields with undefined/null are excluded from signature calculation\n const formattedData: Record<string, any> = {\n id: telegramData.id,\n first_name: telegramData.first_name,\n auth_date: telegramData.auth_date,\n hash: telegramData.hash,\n };\n\n // Only include optional fields if they exist\n if (telegramData.last_name) formattedData.last_name = telegramData.last_name;\n if (telegramData.username) formattedData.username = telegramData.username;\n if (telegramData.photo_url) formattedData.photo_url = telegramData.photo_url;\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/telegram`, {\n method: 'POST',\n body: JSON.stringify(formattedData)\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link Telegram: ${response.statusText}`);\n }\n}\n\n// Lightweight widget integration helper\nexport function mountTelegramLoginWidget(container: HTMLElement, botUsername: string, onAuth: (data: any) => void, options?: { requestAccess?: 'write'; }) {\n const scriptId = 'telegram-login-widget';\n if (!document.getElementById(scriptId)) {\n const s = document.createElement('script');\n s.id = scriptId;\n s.src = 'https://telegram.org/js/telegram-widget.js?22';\n s.async = true;\n s.defer = true;\n container.parentElement?.appendChild(s);\n }\n\n // Create widget container\n const btn = document.createElement('div');\n btn.setAttribute('class', 'tg-login-button');\n btn.setAttribute('data-telegram-login', botUsername);\n btn.setAttribute('data-size', 'large');\n if (options?.requestAccess) btn.setAttribute('data-request-access', options.requestAccess);\n\n // Register callback\n const callbackName = `__lumia_tg_auth_cb_${Math.random().toString(36).slice(2)}`;\n (window as any)[callbackName] = (user: any) => onAuth(user);\n btn.setAttribute('data-onauth', callbackName);\n\n container.innerHTML = '';\n container.appendChild(btn);\n}\n\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { LINKED_PROFILES_QUERY_KEY } from '@/src/modules/linkedProfiles'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useEffect, useState } from 'react'\n\nimport { linkTelegram } from '../../../auth/providers/telegram'\nimport { PageKey, useLayoutDataStore } from '../../../hooks/useLayoutDataStore'\nimport { buildTelegramBrowserRestriction, shouldBlockSocialAuthInTelegram } from '../../../utils/telegramBrowser'\nimport { PROVIDERS_QUERY_KEY } from './useProvidersList'\nimport { useManageWalletStore } from './useStore'\n\nexport function useLinkTelegram() {\n const {\n config: { current: config },\n callbacks\n } = useLumiaPassportConfig()\n\n const qc = useQueryClient()\n\n const address = useLumiaPassportSession((st) => st.address)\n const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking)\n\n const { providerType, linkIsLoading, setLinkIsLoading, setProviderType, setAlert } = useManageWalletStore()\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n // TODO: useMutation!!! Handle Telegram linking via popup\n const handleLinkTelegram = useCallback(async () => {\n try {\n if (shouldBlockSocialAuthInTelegram('telegram')) {\n setAlert(buildTelegramBrowserRestriction('Telegram', 'linking'))\n setProviderType(null)\n return\n }\n\n setLinkIsLoading(true)\n setAlert(null)\n\n // Get bot username from config or build-time env var\n const telegramProvider = config.social?.providers?.find(\n (p: any) => (p.id || '').toLowerCase() === 'telegram' && p.enabled\n )\n let botUsername = telegramProvider?.meta?.botUsername as string | undefined\n\n // Fallback to build-time env var if not in config\n if (!botUsername) {\n // @ts-ignore - build-time injected\n botUsername = (typeof __EMBARK_TG_BOT__ !== 'undefined' && __EMBARK_TG_BOT__) || undefined\n }\n\n if (!botUsername) {\n throw new Error('Telegram bot username not configured')\n }\n\n // Open popup for Telegram auth\n const { getIframeManager } = await import('../../../lib/iframe-manager')\n const iframeManager = getIframeManager()\n\n const result = await iframeManager.openSocialAuthPopup('telegram', { botUsername })\n\n if (!result.success) {\n throw new Error(result.error || 'Telegram authentication failed')\n }\n\n // Link Telegram account\n const { user } = result\n if (!user) {\n throw new Error('No user data received from Telegram')\n }\n\n console.log('[ManageWallet] Linking Telegram with data:', user)\n await linkTelegram(user)\n\n // Invalidate providers list after successful link\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, address] })\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address] })\n\n try {\n callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address]) })\n } catch {}\n\n // Close dialog\n setPage(PageKey.MANAGE_WALLET)\n setProviderType(null)\n } catch (e: any) {\n console.error('[ManageWallet] Failed to link Telegram:', e)\n setAlert({ title: 'Error', message: e?.message || 'Failed to link Telegram' })\n // Reset provider type on error so user can try again\n setProviderType(null)\n } finally {\n setLinkIsLoading(false)\n }\n }, [config.social?.providers, callbacks])\n\n // Trigger Telegram linking when provider type is selected (only once)\n const [telegramLinkStarted, setTelegramLinkStarted] = useState(false)\n\n useEffect(() => {\n console.log('[useLinkTelegram] Effect triggered:', {\n providerType,\n linkIsLoading,\n telegramLinkStarted,\n isWalletLinking\n })\n\n // Don't start telegram flow if wallet linking is in progress\n if (isWalletLinking) {\n console.log('[useLinkTelegram] Skipping - wallet linking in progress')\n return\n }\n\n if (providerType === 'telegram' && !linkIsLoading && !telegramLinkStarted) {\n console.log('[useLinkTelegram] Starting Telegram link flow')\n setTelegramLinkStarted(true)\n handleLinkTelegram()\n }\n }, [providerType, handleLinkTelegram, linkIsLoading, telegramLinkStarted, isWalletLinking])\n\n // Reset telegram link started flag when provider type changes or dialog closes\n useEffect(() => {\n if (providerType !== 'telegram') {\n setTelegramLinkStarted(false)\n }\n }, [providerType])\n}\n","import { PageKey, useLayoutDataStore } from '@/hooks/useLayoutDataStore'\nimport { useT } from '@/src/i18n/useT'\nimport { CheckCircle, Clock, Trash2 } from 'lucide-react'\n\nimport { getProviderDisplayInfo, type AuthProvider } from '../../auth/providers/types'\nimport { Button } from '../ui/button'\nimport { useProvidersList } from './hooks/useProvidersList'\nimport { useManageWalletStore } from './hooks/useStore'\n\nexport function ProviderCard(props: AuthProvider) {\n const { t } = useT()\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setConfirmUnlink = useManageWalletStore((st) => st.setConfirmUnlink)\n\n const { data: providers = [] } = useProvidersList()\n\n // Guard against undefined props\n if (!props?.provider) {\n console.warn('[ProviderCard] Received undefined provider')\n return null\n }\n\n const canUnlink = (p: AuthProvider) => {\n const verified = providers.filter((x) => x.verified)\n if (verified.length <= 1 && p.verified) return false\n return true\n }\n\n const info = getProviderDisplayInfo(props.provider)\n\n const allowUnlink = canUnlink(props)\n const IconComponent = info.icon\n\n return (\n <div className=\"w-full flex items-center justify-between gap-[var(--l-pass-gap)]\">\n <div className=\"w-12 h-12 flex items-center justify-center flex-none border border-[var(--l-pass-bd)] rounded-full\">\n <IconComponent className=\"w-5 h-5\" />\n </div>\n\n <div className=\"flex flex-col gap-1 flex-1\">\n <span className=\"block w-full text-[10px] font-medium\">{info.name}</span>\n\n {props.externalId && (\n <span\n style={{ maxWidth: 184 }}\n className=\"block w-full font-bold text-xs whitespace-nowrap text-ellipsis overflow-hidden\"\n >\n {props.externalId}\n </span>\n )}\n </div>\n\n <div className=\"w-fit flex items-center gap-[var(--l-pass-gap)] flex-none\">\n {props.verified ? (\n <CheckCircle className={`w-4 h-4 text-[var(--l-pass-bg-success)]`} />\n ) : (\n <Clock className=\"w-4 h-4 text-[var(--l-pass-bg-warning)]\" />\n )}\n\n {allowUnlink && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={t('passport:common.delete')}\n className=\"w-5 h-5\"\n onClick={() => {\n setConfirmUnlink({ provider: props.provider, providerName: info.name, externalId: props.externalId })\n setPage(PageKey.UNLINK_PROVIDER)\n }}\n >\n <Trash2 className=\"w-4 h-4 text-[var(--l-pass-bg-error)]\" />\n </Button>\n )}\n </div>\n </div>\n )\n}\n","import { PageKey, useLayoutDataStore } from '@/hooks/useLayoutDataStore'\nimport { useLayoutStore } from '@/hooks/useLayoutStore'\nimport type { LumiaPassportConfig } from '@/src/config/lumiaPassport'\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useT } from '@/src/i18n'\nimport { fromPairs } from 'lodash-es'\nimport { AlertTriangle, ArrowLeft, Loader } from 'lucide-react'\nimport { useMemo, type CSSProperties } from 'react'\n\nimport type { AuthProvider } from '../../auth'\nimport { PROVIDERS_META } from '../../constants'\nimport { buildTelegramBrowserRestriction, shouldBlockSocialAuthInTelegram } from '../../utils/telegramBrowser'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { AddProvider } from './AddProvider'\nimport { EmailNotConnectedWarning } from './EmailNotConnectedWarning'\nimport { useLinkSocial } from './hooks/useLinkSocial'\nimport { useLinkTelegram } from './hooks/useLinkTelegram'\nimport { useProvidersList } from './hooks/useProvidersList'\nimport { useManageWalletStore } from './hooks/useStore'\nimport { ProviderCard } from './ProviderCard'\n\ntype DevelopedAuthProvider = Exclude<AuthProvider['provider'], 'google' | 'discord'>\n\n// also provides ordering\nconst POSSIBLE_PROVIDERS: DevelopedAuthProvider[] = [\n 'email',\n // 'google',\n 'twitter',\n 'telegram',\n // 'discord',\n 'passkey',\n 'wallet'\n]\n\nfunction getConfiguredProviders(config: LumiaPassportConfig) {\n return POSSIBLE_PROVIDERS.reduce(\n (acc, p) => {\n const isEnabled = config[p]?.enabled as boolean\n const isSocial = ['twitter', 'telegram', 'discord', 'google'].includes(p)\n\n if (!isSocial) acc[p] = isEnabled\n\n config?.social?.providers\n .filter((sp) => !!sp.enabled)\n .forEach((sp) => {\n if (sp.id === 'X' || sp.id === 'x') {\n acc['twitter'] = true\n } else {\n acc[sp.id.toLowerCase()] = true\n }\n })\n\n return acc\n },\n\n fromPairs(POSSIBLE_PROVIDERS.map((p) => [p, false]))\n ) as Record<DevelopedAuthProvider, boolean>\n}\n\nexport function ManageWalletMenu() {\n const config = useLumiaPassportConfig().config\n\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking)\n const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking)\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const {\n alert,\n providerType,\n\n setAlert,\n setProviderType,\n setEmail,\n setEmailStep,\n setEmailCodeExpiresIn,\n setEmailCode\n } = useManageWalletStore()\n\n const configuredProviders = getConfiguredProviders(config.current)\n\n const { data: providers = [], isLoading: isProvidersLoading, error: providersError } = useProvidersList()\n\n // console.log('[MANAGE WALLET MENU] RENDER', providers)\n\n const renderProviders = useMemo(() => {\n // Normalize provider names: API returns \"x\" but UI uses \"twitter\"\n const normalizeProviderName = (name: string): string => {\n if (name === 'x') return 'twitter'\n return name\n }\n\n const usedProviders = fromPairs(providers.map((p) => [normalizeProviderName(p.provider), true] as const)) as Record<\n DevelopedAuthProvider,\n boolean\n >\n\n const used: JSX.Element[] = []\n const unused: JSX.Element[] = []\n\n POSSIBLE_PROVIDERS.forEach((provider, providerIdx) => {\n if (!configuredProviders[provider]) return\n\n const Icon = PROVIDERS_META[provider].icon\n\n if (usedProviders[provider]) {\n // move used providers to top keeping order\n // Handle x/twitter naming: UI uses 'twitter' but API returns 'x'\n const apiProviderName = provider === 'twitter' ? 'x' : provider\n const providerData = providers.find((p) => p.provider === apiProviderName || p.provider === provider)\n\n if (providerData) {\n used.push(<ProviderCard key={`${provider}-${providerIdx}`} {...providerData} />)\n }\n } else {\n // move add provider buttons down keeping order\n unused.push(\n <Button\n key={`${provider}-${providerIdx}`}\n variant=\"default\"\n size=\"large\"\n className=\"w-full\"\n disabled={isWalletLinking}\n onClick={() => {\n // Prevent clicks when wallet linking is in progress\n if (isWalletLinking) return\n\n setAlert(null)\n\n if (shouldBlockSocialAuthInTelegram(provider)) {\n setAlert(buildTelegramBrowserRestriction(PROVIDERS_META[provider].name, 'linking'))\n return\n }\n\n switch (provider) {\n case 'email':\n setEmail('')\n setEmailCode('')\n setEmailCodeExpiresIn(0)\n setEmailStep('input')\n\n setProviderType(provider)\n break\n\n case 'twitter':\n // console.log('[ManageWallet] Twitter button clicked!')\n //@ts-expect-error X is twitter TODO: fix types\n setProviderType('twitter')\n break\n\n case 'wallet':\n setProviderType(null)\n setIsWalletLinking(true)\n break\n\n default:\n setProviderType(provider)\n break\n }\n }}\n >\n <Icon className=\"w-4 h-4\" />\n <span>\n <span>{t('passport:common.add')}</span> {provider.toUpperCase()}\n </span>\n </Button>\n )\n }\n })\n\n return [...used, ...unused]\n }, [providers, configuredProviders, isWalletLinking])\n\n useLinkTelegram()\n useLinkSocial()\n\n const showCurrentProviders =\n !isProvidersLoading &&\n !providersError &&\n ((providerType !== 'email' && providerType !== 'passkey') || providerType === null)\n\n const showExtraProvidersUi =\n !isProvidersLoading && !providersError && (providerType === 'email' || providerType === 'passkey')\n\n const combinedAlertMessage = alert?.message || providersError?.message || null\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n <Expandable isExpanded contentClassName=\"flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={t('passport:common.back')}\n onClick={() => {\n setAlert(null)\n\n if (providerType === 'email') {\n setEmail('')\n setEmailCode('')\n setEmailStep('input')\n setEmailCodeExpiresIn(0)\n }\n\n if (!providerType) setPage(PageKey.SETTINGS)\n\n setProviderType(null)\n }}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:profilesMenu.title')}</span>\n </div>\n\n {/* <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\"> */}\n {isProvidersLoading && (\n <div className=\"flex items-center justify-center p-4 text-[var(--l-pass-fg-muted)]\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n </div>\n )}\n\n <EmailNotConnectedWarning />\n\n {showCurrentProviders && renderProviders.map((node) => node)}\n\n {showExtraProvidersUi && <AddProvider />}\n\n {combinedAlertMessage && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertTriangle className=\"w-4 h-4 shrink-0\" />\n <span className=\"break-words whitespace-pre-wrap\">\n {alert?.title && (\n <>\n <strong>{alert.title}</strong>\n <br />\n </>\n )}\n\n {combinedAlertMessage}\n </span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","import { PageKey, useLayoutDataStore } from '@/hooks/useLayoutDataStore'\nimport { useT } from '@/src/i18n/useT'\nimport { LINKED_PROFILES_QUERY_KEY } from '@/src/modules/linkedProfiles'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { Key, Loader } from 'lucide-react'\nimport { useState } from 'react'\n\nimport { useLumiaPassportConfig } from '../../../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../../../context/LumiaPassportSessionContext'\nimport { unlinkProvider } from '../../auth'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { PROVIDERS_QUERY_KEY } from './hooks/useProvidersList'\nimport { useManageWalletStore } from './hooks/useStore'\n\nexport function UnlinkProviderMenu() {\n const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n const { callbacks } = useLumiaPassportConfig() as any\n\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const { confirmUnlink, setConfirmUnlink, setAlert } = useManageWalletStore()\n\n const [confirmInput, setConfirmInput] = useState('')\n\n const { mutate: handleUnlinkProvider, isPending: isProviderUnlinking } = useMutation({\n mutationFn: async () => {\n if (!confirmUnlink) {\n throw new Error('No provider to unlink')\n }\n\n const { provider, externalId } = confirmUnlink\n\n await unlinkProvider(provider, externalId)\n },\n\n onSuccess: async () => {\n setConfirmUnlink(null)\n setPage(PageKey.MANAGE_WALLET)\n\n // Invalidate and refetch providers list\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, address], refetchType: 'active' })\n await qc.invalidateQueries({ queryKey: [LINKED_PROFILES_QUERY_KEY, address], refetchType: 'active' })\n\n // This is redundant, invalidateQueries should be enough\n await qc.refetchQueries({ queryKey: [PROVIDERS_QUERY_KEY, address] })\n\n try {\n callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, address]) })\n } catch {}\n },\n\n onError: (error: any) => {\n setAlert({ title: 'Error', message: error?.message || 'Failed to unlink provider' })\n setPage(PageKey.MANAGE_WALLET)\n }\n })\n\n return (\n <div className=\"w-full p-5 flex flex-col gap-4\">\n <div className=\"text-xl font-semibold text-[var(--l-pass-error)]\">{t('passport:profilesMenu.unlinkTitle')}</div>\n\n {confirmUnlink && (\n <div className=\"w-full flex flex-col gap-2\">\n <div className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">\n {t('passport:profilesMenu.unlinkConfirm')}\n {': '}\n </div>\n <div className=\"text-[10px] font-bold font-mono break-all\">{confirmUnlink.externalId}</div>\n\n <Input\n Icon={Key}\n value={confirmInput}\n onChange={(e) => setConfirmInput(e.target.value)}\n placeholder={t('passport:profilesMenu.unlinkPlaceholder')}\n />\n </div>\n )}\n\n <div className=\"w-full flex justify-between gap-2\">\n <Button\n size=\"large\"\n variant=\"ghost\"\n disabled={!!isProviderUnlinking}\n className=\"w-full flex-1\"\n onClick={() => {\n setConfirmUnlink(null)\n setConfirmInput('')\n setPage(PageKey.MANAGE_WALLET)\n }}\n >\n {t('passport:common.cancel')}\n </Button>\n\n <Button\n size=\"large\"\n onClick={() => handleUnlinkProvider()}\n disabled={!!isProviderUnlinking || !confirmUnlink || confirmInput !== confirmUnlink.externalId}\n className=\"w-full flex-1\"\n >\n {isProviderUnlinking && <Loader className=\"animate-spin h-4 w-4\" />}\n {t('passport:common.delete')}\n </Button>\n </div>\n </div>\n )\n}\n","export { ManageWalletMenu } from './ManageWallet'\nexport { UnlinkProviderMenu } from './UnlinkProviderMenu'\nexport { useManageWalletStore } from './hooks/useStore'\nexport { PROVIDERS_QUERY_KEY } from './hooks/useProvidersList'\n","/**\n * Nickname cooldown helpers\n * Utilities for displaying cooldown information\n */\n\n/**\n * Calculate days remaining until cooldown ends\n *\n * @param cooldownEndsAt - ISO date string when cooldown ends\n * @returns Number of days remaining (0 if cooldown ended or invalid)\n */\nexport function getDaysRemaining(cooldownEndsAt: string | null): number {\n if (!cooldownEndsAt) return 0\n\n const endDate = new Date(cooldownEndsAt)\n const now = new Date()\n\n if (isNaN(endDate.getTime())) return 0\n if (endDate <= now) return 0\n\n const diffMs = endDate.getTime() - now.getTime()\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24))\n\n return Math.max(0, diffDays)\n}\n\n/**\n * Format cooldown end date for display\n *\n * @param cooldownEndsAt - ISO date string when cooldown ends\n * @returns Formatted date string or empty string if invalid\n */\nexport function formatCooldownEndDate(cooldownEndsAt: string | null): string {\n if (!cooldownEndsAt) return ''\n\n const endDate = new Date(cooldownEndsAt)\n if (isNaN(endDate.getTime())) return ''\n\n return endDate.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n}\n\n/**\n * Format a relative time string for cooldown\n *\n * @param cooldownEndsAt - ISO date string when cooldown ends\n * @returns Human-readable relative time (e.g., \"in 25 days\")\n */\nexport function formatCooldownRelative(cooldownEndsAt: string | null): string {\n const days = getDaysRemaining(cooldownEndsAt)\n\n if (days === 0) return 'now'\n if (days === 1) return 'in 1 day'\n return `in ${days} days`\n}\n\n/**\n * Check if cooldown is currently active\n *\n * @param cooldownEndsAt - ISO date string when cooldown ends\n * @returns true if cooldown is active\n */\nexport function isCooldownActive(cooldownEndsAt: string | null): boolean {\n if (!cooldownEndsAt) return false\n\n const endDate = new Date(cooldownEndsAt)\n if (isNaN(endDate.getTime())) return false\n\n return endDate > new Date()\n}\n","import { useT } from '@/src/i18n'\nimport { TFunction } from 'i18next'\n\n/**\n * Nickname error messages\n * Maps API error codes to user-friendly messages\n */\n\n/**\n * Error code to user-friendly message mapping\n */\nexport const NICKNAME_ERROR_MESSAGES: Record<string, string> = {\n // Client-side validation errors\n TOO_SHORT: 'passport:nicknameMenu.errors.tooShort',\n TOO_LONG: 'passport:nicknameMenu.errors.tooLong',\n INVALID_CHARS: 'passport:nicknameMenu.errors.invalidChars',\n INVALID_UNDERSCORE: 'passport:nicknameMenu.errors.invalidUnderscore',\n\n // Server-side errors\n INVALID_FORMAT: 'passport:nicknameMenu.errors.invalidFormat',\n NICKNAME_TAKEN: 'passport:nicknameMenu.errors.nicknameTaken',\n TAKEN: 'passport:nicknameMenu.errors.nicknameTaken',\n NICKNAME_RESERVED: 'passport:nicknameMenu.errors.nicknameReserved',\n COOLDOWN_ACTIVE: 'passport:nicknameMenu.errors.cooldownActive',\n NICKNAME_NOT_FOUND: 'passport:nicknameMenu.errors.nicknameNotFound',\n\n // Generic fallback\n UNKNOWN: 'passport:nicknameMenu.errors.unknown'\n}\n\ninterface GetNicknameErrorMessageParams {\n t: TFunction<'passport', undefined>\n days?: number\n canChangeAt?: string\n}\n\n/**\n * Get user-friendly error message for a nickname error code\n *\n * @param code - The error code from API or validation\n * @param params - Optional parameters for message interpolation\n * @returns User-friendly error message\n */\nexport function getNicknameErrorMessage(code: string, params?: GetNicknameErrorMessageParams): string {\n const { days, canChangeAt, t } = params || {}\n\n // @ts-expect-error\n console.warn('[code]', t?.(NICKNAME_ERROR_MESSAGES[code] || NICKNAME_ERROR_MESSAGES.UNKNOWN))\n // @ts-expect-error\n const message = t?.(NICKNAME_ERROR_MESSAGES[code] || NICKNAME_ERROR_MESSAGES.UNKNOWN)\n\n // Replace placeholders with actual values\n if (days !== undefined && message.includes('{days}')) {\n return message.replace('{days}', String(params.days))\n }\n\n return message\n}\n","import { useT } from '@/src/i18n'\nimport { Check, Loader, X } from 'lucide-react'\n\nimport type { NicknameAvailability } from '../../clients/nickname-types'\nimport { getNicknameErrorMessage } from '../../lib/nickname-errors'\nimport { Highlight } from '../ui/highlight'\n\ninterface NicknameAvailabilityIndicatorProps {\n isChecking: boolean\n availability: NicknameAvailability | undefined\n showWhenEmpty?: boolean\n}\n\nexport function NicknameAvailabilityIndicator({\n isChecking,\n availability,\n showWhenEmpty = false\n}: NicknameAvailabilityIndicatorProps) {\n const { t } = useT()\n\n // Show nothing if not checking and no availability data (unless showWhenEmpty)\n if (!isChecking && !availability && !showWhenEmpty) {\n return null\n }\n\n // Loading state\n if (isChecking) {\n return (\n <Highlight className=\"flex gap-[var(--l-pass-gap)]\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n <span>{t('passport:nicknameMenu.availability.checkingAvailability')}</span>\n </Highlight>\n )\n }\n\n // No data yet\n if (!availability) {\n return null\n }\n\n // Available\n if (availability.available) {\n return (\n <Highlight type=\"success\" className=\"flex gap-[var(--l-pass-gap)]\">\n <Check className=\"w-4 h-4\" />\n <span>{t('passport:nicknameMenu.availability.nicknameAvailable')}</span>\n </Highlight>\n )\n }\n\n // Not available - show reason\n const reason = availability.reason\n ? getNicknameErrorMessage('TAKEN', { t })\n : t('passport:nicknameMenu.availability.nicknameNotAvailable')\n\n return (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <X className=\"w-4 h-4\" />\n <span>{reason}</span>\n </Highlight>\n )\n}\n","/**\n * Client-side nickname validation\n * Rules match backend validation for instant feedback\n */\n\nimport type { NicknameValidationResult, NicknameValidationError } from '../clients/nickname-types';\n\n/**\n * Minimum nickname length\n */\nexport const NICKNAME_MIN_LENGTH = 3;\n\n/**\n * Maximum nickname length\n */\nexport const NICKNAME_MAX_LENGTH = 20;\n\n/**\n * Regex pattern for valid nickname characters (a-z, 0-9, underscore)\n */\nconst NICKNAME_PATTERN = /^[a-z0-9_]+$/;\n\n/**\n * Validate a nickname handle client-side\n * Returns validation result with error code if invalid\n *\n * Rules:\n * - Length: 3-20 characters\n * - Characters: only a-z, 0-9, underscore (_)\n * - Case: automatically converted to lowercase\n * - Cannot start or end with underscore\n * - Cannot contain double underscores (__)\n *\n * @param handle - The nickname to validate (will be lowercased)\n * @returns Validation result with valid flag and optional error code\n */\nexport function validateNickname(handle: string): NicknameValidationResult {\n // Remove @ prefix if present and normalize to lowercase\n const normalized = handle.replace(/^@/, '').toLowerCase().trim();\n\n // Check minimum length\n if (normalized.length < NICKNAME_MIN_LENGTH) {\n return { valid: false, error: 'TOO_SHORT' };\n }\n\n // Check maximum length\n if (normalized.length > NICKNAME_MAX_LENGTH) {\n return { valid: false, error: 'TOO_LONG' };\n }\n\n // Check for invalid characters\n if (!NICKNAME_PATTERN.test(normalized)) {\n return { valid: false, error: 'INVALID_CHARS' };\n }\n\n // Check for leading/trailing underscores or double underscores\n if (\n normalized.startsWith('_') ||\n normalized.endsWith('_') ||\n normalized.includes('__')\n ) {\n return { valid: false, error: 'INVALID_UNDERSCORE' };\n }\n\n return { valid: true };\n}\n\n/**\n * Normalize a nickname handle\n * Removes @ prefix and converts to lowercase\n *\n * @param handle - The nickname to normalize\n * @returns Normalized handle\n */\nexport function normalizeNickname(handle: string): string {\n return handle.replace(/^@/, '').toLowerCase().trim();\n}\n\n/**\n * Format a nickname for display with @ prefix\n *\n * @param handle - The nickname without @ prefix\n * @returns Formatted nickname with @ prefix\n */\nexport function formatNicknameDisplay(handle: string): string {\n const normalized = normalizeNickname(handle);\n return normalized ? `@${normalized}` : '';\n}\n","import { useT } from '@/src/i18n'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { AtSign, Check, ChevronRight, Copy, Loader } from 'lucide-react'\nimport { useCallback, useState } from 'react'\n\nimport { PositiveIcon } from '../../assets/PositiveIcon'\nimport { changeNickname as changeNicknameMutation } from '../../clients/nickname'\nimport type { NicknameChangeError } from '../../clients/nickname-types'\nimport { QUERY_KEYS } from '../../clients/profile'\nimport { getNicknameErrorMessage } from '../../lib/nickname-errors'\nimport { normalizeNickname, validateNickname } from '../../lib/nickname-validation'\nimport { cn } from '../../lib/utils'\n// UI components\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\n//\nimport type { NicknameEditFormProps } from './interfaces'\n\nexport function NicknameEditForm(props: NicknameEditFormProps) {\n const {\n inputValue,\n setInputValue,\n isUnavailable,\n isSameAsCurrentNickname,\n isAvailabilityChecking,\n //\n clientError,\n setClientError,\n info\n } = props\n\n const { handle: currentNickname, canChange } = info || { handle: '', canChange: false }\n\n const qc = useQueryClient()\n const { t } = useT()\n\n const [isNicknameCopied, setIsNicknameCopied] = useState<boolean>(false)\n\n const {\n mutate: changeNickname,\n isError: isNicknameChangeError,\n isPending: isNicknameChanging,\n isSuccess: isNicknameChangeSuccess,\n // error: nicknameChangeError,\n reset\n } = useMutation({\n mutationFn: (handle: string) => changeNicknameMutation(handle),\n\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [QUERY_KEYS.nicknameInfo] })\n qc.invalidateQueries({ queryKey: [QUERY_KEYS.userProfile] })\n },\n\n onError: (error: Error) => {\n // console.error('Nickname change error:', error)\n\n const changeNicknameError: NicknameChangeError | null = error as unknown as NicknameChangeError\n\n setClientError(\n changeNicknameError\n ? getNicknameErrorMessage(changeNicknameError.code, {\n t,\n days: changeNicknameError.daysRemaining,\n canChangeAt: changeNicknameError.canChangeAt\n })\n : null\n )\n }\n })\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setInputValue(value)\n\n // Clear previous errors when typing\n if (clientError) setClientError(null)\n if (isNicknameChangeError || isNicknameChangeSuccess) reset()\n\n // Run client-side validation as user types\n\n if (value?.length < 1) return\n\n const validation = validateNickname(value)\n\n if (!validation.valid && validation.error) {\n setClientError(getNicknameErrorMessage(validation.error, { t }))\n }\n // }\n },\n [clientError, isNicknameChangeError, isNicknameChangeSuccess, reset, t]\n )\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n if (!canChange) return\n\n e.preventDefault()\n\n const normalized = normalizeNickname(inputValue)\n\n // Check if it's the same as current\n if (normalized === currentNickname.toLowerCase()) {\n setClientError(t('passport:nicknameMenu.availability.alreadyYourNickname'))\n return\n }\n\n // Final client-side validation\n const validation = validateNickname(inputValue)\n if (!validation.valid && validation.error) {\n setClientError(getNicknameErrorMessage(validation.error, { t }))\n return\n }\n\n // Submit to server\n changeNickname(normalized)\n },\n [inputValue, currentNickname, canChange, changeNickname]\n )\n\n // Check if submit should be disabled\n const isSubmitDisabled =\n !canChange ||\n isNicknameChanging ||\n isAvailabilityChecking ||\n inputValue.length === 0 ||\n !!clientError ||\n isSameAsCurrentNickname ||\n isUnavailable\n\n return (\n <>\n {canChange ? (\n <form onSubmit={handleSubmit} className=\"w-full\">\n <div className=\"w-full flex items-center gap-[var(--l-pass-gap)]\">\n <Input\n Icon={AtSign}\n value={inputValue}\n onChange={handleInputChange}\n placeholder={t('passport:nicknameMenu.placeholder')}\n disabled={isNicknameChanging}\n className=\"flex-1\"\n />\n\n <Button type=\"submit\" size=\"large\" disabled={isSubmitDisabled} className=\"w-12\">\n {isNicknameChanging ? (\n <Loader className=\"w-4 h-4 animate-spin\" />\n ) : isNicknameChangeSuccess ? (\n <Check className=\"w-4 h-4\" />\n ) : (\n <ChevronRight className=\"w-4 h-4\" />\n )}\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"w-full flex items-center justify-between px-[var(--l-pass-pd)] h-12 bg-[var(--l-pass-secondary)] rounded-[var(--l-pass-el-bdrs)]\">\n <span\n className={cn('text-lg font-semibold leading-5 transition-colors duration-200', {\n 'text-[var(--l-pass-fg-muted)]': !currentNickname.length\n })}\n >\n {!!currentNickname.length && <span>@</span>}\n <span>{(currentNickname || t('passport:nicknameMenu.title')).toLowerCase()}</span>\n </span>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!!isNicknameCopied) return\n\n navigator.clipboard.writeText(currentNickname)\n setIsNicknameCopied(true)\n setTimeout(() => setIsNicknameCopied(false), 2000)\n }}\n >\n {isNicknameCopied ? <PositiveIcon className=\"w-4 h-4\" /> : <Copy className=\"w-4 h-4\" />}\n </Button>\n </div>\n )}\n\n {!!canChange && (\n <span className=\"w-full flex items-center leadding-4 text-[10px]\">{t('passport:nicknameMenu.hint')}</span>\n )}\n </>\n )\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useEffect, useState } from 'react'\n\nimport { checkNicknameAvailability } from '../../clients/nickname'\nimport { QUERY_KEYS } from '../../clients/profile'\nimport { normalizeNickname, validateNickname } from '../../lib/nickname-validation'\n\nconst DEBOUNCE_MS = 700\n\nexport function useNicknameForm(currentNickname: string) {\n const [inputValue, setInputValue] = useState('')\n const normalizedInputValue = normalizeNickname(inputValue)\n\n // Check if inputValue is valid for availability check\n const validation = validateNickname(inputValue)\n const isValidForCheck = validation.valid && normalizedInputValue.length > 0\n\n useEffect(() => {\n // console.log('[NICKNAME] form setup', currentNickname)\n setInputValue(currentNickname)\n }, [currentNickname])\n\n const [queryInputValue, setQueryInputValue] = useState('')\n // const [isDebouncing, setIsDebouncing] = useState(false)\n\n // Check availability in real-time\n const isSameAsCurrentNickname = normalizedInputValue === currentNickname.toLowerCase()\n\n const shouldCheckAvailability = validation.valid && !isSameAsCurrentNickname && inputValue.length > 0\n\n // Debounce the input for availability check\n useEffect(() => {\n if (!isValidForCheck || !shouldCheckAvailability) {\n setQueryInputValue('')\n // setIsDebouncing(false)\n return\n }\n\n // setIsDebouncing(true)\n\n const timer = setTimeout(() => {\n setQueryInputValue(normalizedInputValue)\n // setIsDebouncing(false)\n }, DEBOUNCE_MS)\n\n return () => {\n clearTimeout(timer)\n }\n }, [normalizedInputValue, isValidForCheck, shouldCheckAvailability])\n\n // Query for availability\n const query = useQuery({\n retry: 1,\n enabled: shouldCheckAvailability && isValidForCheck && queryInputValue.length > 0,\n queryKey: QUERY_KEYS.nicknameAvailability(queryInputValue),\n queryFn: () => checkNicknameAvailability(queryInputValue),\n staleTime: 1000 * 30 // 30 seconds stale to not check same InputValue repeatedly\n })\n\n return {\n inputValue,\n setInputValue,\n\n isSameAsCurrentNickname,\n isUnavailable: shouldCheckAvailability && !query?.data?.available,\n\n shouldCheckAvailability,\n\n availabilityQuery: query\n }\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useQuery } from '@tanstack/react-query'\nimport dayjs from 'dayjs'\nimport { AlertTriangle, ArrowLeft, Info, Loader } from 'lucide-react'\nimport { useState, type CSSProperties } from 'react'\n\nimport { getNicknameInfo } from '../../clients/nickname'\n// import type { NicknameChangeError } from '../../clients/nickname-types'\nimport { QUERY_KEYS } from '../../clients/profile'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { getDaysRemaining } from '../../lib/nickname-cooldown'\n// import { getNicknameErrorMessage } from '../../lib/nickname-errors'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { NicknameAvailabilityIndicator } from './NicknameAvailabilityIndicator'\nimport { NicknameEditForm } from './NicknameEditForm'\nimport { useNicknameForm } from './useNickname'\n\nexport function NicknameMenu() {\n // const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n\n const { t } = useT()\n\n const [clientError, setClientError] = useState<string | null>(null)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const {\n data: nicknameInfo,\n isLoading: isNicknameInfoLoading,\n error: nicknameInfoError\n } = useQuery({\n retry: 1,\n enabled: !!address,\n queryKey: [QUERY_KEYS.nicknameInfo, address],\n queryFn: getNicknameInfo\n })\n\n const {\n availabilityQuery,\n\n inputValue,\n isUnavailable,\n isSameAsCurrentNickname,\n shouldCheckAvailability,\n setInputValue\n } = useNicknameForm(nicknameInfo ? nicknameInfo.handle : '')\n\n const { data: availability, isFetching: isAvailabilityChecking } = availabilityQuery\n\n const resolvedError = clientError || nicknameInfoError?.message || null\n\n return (\n <div\n style={{ '--l-pass-scrollbar-mah': `${maxScrollHeight}px` } as CSSProperties}\n className=\"list-scrollbar-y w-full\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)] \">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={t('passport:common.back')}\n onClick={() => setPage(PageKey.SETTINGS)}\n >\n <ArrowLeft className=\"h-4 w-4 flex-none\" />\n </Button>\n\n <div className=\"flex gap-[var(--l-pass-gap)] items-center w-fit\">\n <span className=\"text-xl font-semibold\">{t('passport:nicknameMenu.title')}</span>\n {isNicknameInfoLoading && <Loader className=\"w-4 h-4 animate-spin\" />}\n </div>\n </div>\n\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:nicknameMenu.yourNickname')}</span>\n\n <NicknameEditForm\n inputValue={inputValue}\n setInputValue={setInputValue}\n info={nicknameInfo}\n //\n isAvailabilityChecking={isAvailabilityChecking}\n isUnavailable={isUnavailable}\n isSameAsCurrentNickname={isSameAsCurrentNickname}\n //\n clientError={clientError}\n setClientError={setClientError}\n />\n\n {shouldCheckAvailability && !clientError && (\n <NicknameAvailabilityIndicator isChecking={isAvailabilityChecking} availability={availability} />\n )}\n\n {/* Cooldown state */}\n {!nicknameInfo?.canChange && nicknameInfo?.cooldownEndsAt && (\n <Highlight type=\"warning\" className=\"flex gap-[var(--l-pass-gap)]\">\n <Info className=\"w-4 h-4 flex-none\" />\n\n <span>\n {/* @ts-expect-error */}\n {t('passport:nicknameMenu.cooldownMessage', {\n canChangeAt: dayjs(nicknameInfo.cooldownEndsAt).format('MMM D, YYYY'),\n days: String(getDaysRemaining(nicknameInfo.cooldownEndsAt))\n })}\n </span>\n\n {/* <span>\n \n\n <strong>{dayjs(nicknameInfo.cooldownEndsAt).format('MMM D, YYYY')}</strong>\n\n <span>\n ({getDaysRemaining(nicknameInfo.cooldownEndsAt)} {t('passport:nicknameMenu.daysRemained')})\n </span>\n </span> */}\n </Highlight>\n )}\n\n {/* Stats row */}\n {!!nicknameInfo && (\n <div className=\"flex items-center gap-[var(--l-pass-gap)] justify-between text-[10px]\">\n <span>\n <span className=\"text-[var(--l-pass-fg-muted)]\">\n {nicknameInfo.changedAt ? t('passport:nicknameMenu.lastChanged') : t('passport:common.created')}\n </span>\n\n <span>: </span>\n\n <strong className=\"text-[var(--l-pass-fg)]\">\n {dayjs(nicknameInfo.changedAt || nicknameInfo.createdAt).format('MMM D, YYYY')}\n </strong>\n </span>\n\n <span>\n <span className=\"text-[var(--l-pass-fg-muted)]\">{t('passport:nicknameMenu.timesChanged')}</span>\n\n <span>: </span>\n\n <strong className=\"text-[var(--l-pass-fg)]\">{nicknameInfo.changeCount}</strong>\n </span>\n </div>\n )}\n\n {/* Error state */}\n {!!resolvedError?.length && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertTriangle className=\"w-4 h-4 flex-none\" />\n <span>{resolvedError}</span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","export { NicknameMenu } from './NicknameMenu'\n","/**\n * Hook for fetching custom watch token balances via RPC multicall.\n * Uses the dynamic publicClient from session store (not wagmi) to support any chain.\n */\n\nimport { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { erc20Abi, formatUnits, type Address } from 'viem'\n\nimport type { WatchToken } from '../../config/lumiaPassport'\nimport type { Asset } from '../../modules/assets'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseWatchTokensOptions {\n /** Wallet address to query */\n address: Address | undefined\n /** Whether to enable the query (default: true when address provided) */\n enabled?: boolean\n}\n\nexport interface UseWatchTokensResult {\n /** Watch token assets with balances */\n assets: Asset[]\n /** Whether data is currently loading */\n isLoading: boolean\n /** Error if fetch failed */\n error: Error | null\n /** Manually refresh balances */\n refetch: () => void\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst WATCH_TOKENS_QUERY_KEY = 'watch-tokens'\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * React hook for fetching custom watch token balances via RPC.\n * Uses the dynamic publicClient from session store to support any chain.\n *\n * @example\n * ```tsx\n * const { assets, isLoading, error, refetch } = useWatchTokens({\n * address: '0x...',\n * });\n * ```\n */\nexport function useWatchTokens(options: UseWatchTokensOptions): UseWatchTokensResult {\n const { address, enabled = true } = options\n\n const { config } = useLumiaPassportConfig()\n const publicClient = useLumiaPassportSession((st) => st.publicClient)\n const activeChainId = useLumiaPassportSession((st) => st.activeChainId)\n\n // Get watch tokens for current chain from config\n const watchTokens = useMemo((): WatchToken[] => {\n const allWatchTokens = config.current.watchTokens\n const tokensForChain = activeChainId ? allWatchTokens?.[activeChainId] || [] : []\n return tokensForChain\n }, [config, activeChainId])\n\n // Fetch token data (metadata + balances) using publicClient\n const {\n data: assets,\n isLoading,\n error,\n refetch\n } = useQuery({\n queryKey: [WATCH_TOKENS_QUERY_KEY, activeChainId, address, watchTokens.map(t => t.address).join(',')],\n queryFn: async (): Promise<Asset[]> => {\n if (!publicClient || !address || watchTokens.length === 0) {\n return []\n }\n\n const results: Asset[] = []\n\n // Fetch data for each token\n for (const token of watchTokens) {\n try {\n // Fetch balance\n const balance = await publicClient.readContract({\n address: token.address,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [address]\n })\n\n // Fetch name if not provided\n let name = token.name\n if (!name) {\n try {\n name = await publicClient.readContract({\n address: token.address,\n abi: erc20Abi,\n functionName: 'name'\n })\n } catch {\n name = token.symbol // Fallback to symbol\n }\n }\n\n // Fetch decimals if not provided\n let decimals = token.decimals\n if (decimals === undefined) {\n try {\n decimals = await publicClient.readContract({\n address: token.address,\n abi: erc20Abi,\n functionName: 'decimals'\n })\n } catch {\n decimals = 18 // Default to 18\n }\n }\n\n const formattedBalance = formatUnits(balance, decimals)\n\n results.push({\n type: 'erc20',\n address: token.address,\n name: name || token.symbol,\n symbol: token.symbol,\n balance: balance.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n decimals,\n logo: token.logo\n })\n } catch (err) {\n console.warn(`[useWatchTokens] Failed to fetch token ${token.address}:`, err)\n // Skip failed tokens\n }\n }\n\n return results\n },\n enabled: !!publicClient && !!address && enabled && watchTokens.length > 0,\n staleTime: 30 * 1000, // 30 seconds\n gcTime: 5 * 60 * 1000, // 5 minutes\n retry: 2,\n retryDelay: 1000\n })\n\n return {\n assets: assets || [],\n isLoading,\n error: error || null,\n refetch\n }\n}\n","/**\n * Hook for fetching all assets from Blockscout API\n */\n\nimport { useLumiaPassportSession } from '@/src'\nimport {\n createBlockscoutClient,\n type BlockscoutNftItem,\n type BlockscoutTokenBalance\n} from '@embarkai/core/clients'\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useMemo, useRef } from 'react'\nimport { formatEther, formatUnits, type Address } from 'viem'\n\nimport { getBlockscoutApiUrl } from '../../config/lumiaPassport'\nimport type { Asset, AssetListError, AssetType, ComplianceStatus } from '../../modules/assets'\nimport {\n BLOCKSCOUT_QUERY_GC_TIME,\n BLOCKSCOUT_QUERY_STALE_TIME,\n BLOCKSCOUT_REFRESH_DEBOUNCE,\n IPFS_GATEWAY\n} from '../constants'\nimport { useWatchTokens } from './useWatchTokens'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseBlockscoutAssetsOptions {\n /** Wallet address to query */\n address: Address | undefined\n /** Whether to enable the query (default: true when address provided) */\n enabled?: boolean\n /** Whether to detect ERC3643 security tokens (default: true) */\n detectSecurityTokens?: boolean\n}\n\nexport interface UseBlockscoutAssetsResult {\n /** Native token balance (always available via RPC) */\n nativeBalance: {\n value: bigint\n formatted: string\n symbol: string\n } | null\n /** All discovered assets (native + tokens + NFTs) */\n assets: Asset[]\n /** Whether any data is currently loading */\n isLoading: boolean\n /** Whether initial load is in progress */\n isInitialLoading: boolean\n /** Error from Blockscout API (null if native balance available) */\n error: AssetListError | null\n /** Whether Blockscout API is reachable */\n isBlockscoutAvailable: boolean\n /** Manually refresh all balances */\n refreshBalances: () => Promise<void>\n /** Get balance for a specific token by address */\n getTokenBalance: (tokenAddress: Address) => Asset | null\n /** Timestamp of last successful fetch */\n lastUpdated: number | null\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst BLOCKSCOUT_QUERY_KEY = 'blockscout-token-balances'\nconst ERC3643_DETECTION_QUERY_KEY = 'erc3643-detection'\n\n// ERC3643 ABI for security token detection\nconst ERC3643_ABI = [\n {\n name: 'identityRegistry',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'address' }]\n }\n] as const\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Resolve IPFS URI to HTTP gateway URL\n */\nexport function resolveIpfsUri(uri: string): string {\n if (!uri) return ''\n\n if (uri.startsWith('ipfs://')) {\n return uri.replace('ipfs://', IPFS_GATEWAY)\n }\n\n if (uri.startsWith('data:application/json')) {\n // Base64 encoded JSON - return as-is, will be parsed separately\n return uri\n }\n\n return uri\n}\n\n/**\n * Map Blockscout token type to our AssetType\n */\nfunction mapTokenType(blockscoutType: string): AssetType {\n switch (blockscoutType) {\n case 'ERC-20':\n return 'erc20'\n case 'ERC-721':\n return 'erc721'\n case 'ERC-1155':\n return 'erc1155'\n default:\n return 'erc20'\n }\n}\n\n/**\n * Map Blockscout token balance to Asset\n */\nfunction mapBlockscoutToAsset(balance: BlockscoutTokenBalance): Asset {\n const { token, value, token_id, token_instance } = balance\n const type = mapTokenType(token.type)\n const decimals = token.decimals ? parseInt(token.decimals, 10) : undefined\n\n // Format balance based on token type\n let formattedBalance: string\n if (type === 'erc721') {\n formattedBalance = '1' // NFTs always have balance of 1\n } else if (decimals !== undefined) {\n // Preserve precision by using the string result directly\n formattedBalance = formatUnits(BigInt(value), decimals)\n } else {\n formattedBalance = value\n }\n\n const asset: Asset = {\n type,\n address: token.address as Address,\n name: token.name || 'Unknown Token',\n symbol: token.symbol || '???',\n balance: value,\n formattedBalance,\n decimals,\n logo: token.icon_url || undefined\n }\n\n // Add NFT-specific fields\n if (type === 'erc721' || type === 'erc1155') {\n asset.tokenId = token_id || undefined\n\n if (token_instance?.metadata) {\n const metadata = token_instance.metadata\n asset.image = metadata.image ? resolveIpfsUri(metadata.image) : undefined\n asset.nftMetadata = {\n name: metadata.name,\n description: metadata.description,\n image: asset.image,\n externalUrl: metadata.external_url,\n collectionName: token.name,\n attributes: metadata.attributes\n }\n }\n }\n\n return asset\n}\n\n/**\n * Map Blockscout NFT item to Asset (from /nft endpoint with full metadata)\n */\nfunction mapBlockscoutNftToAsset(nft: BlockscoutNftItem): Asset {\n const { token, value, id, image_url, metadata } = nft\n const type = mapTokenType(token.type)\n\n // Resolve image URL - prefer image_url from API, then metadata.image\n const imageUrl = image_url || (metadata?.image ? resolveIpfsUri(metadata.image) : undefined)\n\n const asset: Asset = {\n type,\n address: token.address as Address,\n name: token.name || 'Unknown NFT',\n symbol: token.symbol || '???',\n balance: value || '1',\n formattedBalance: '1',\n tokenId: id,\n logo: token.icon_url || undefined,\n image: imageUrl,\n nftMetadata: {\n name: metadata?.name,\n description: metadata?.description,\n image: imageUrl,\n externalUrl: metadata?.external_url,\n collectionName: token.name,\n attributes: metadata?.attributes\n }\n }\n\n return asset\n}\n\n/**\n * Create error object from exception\n */\nfunction createError(error: unknown): AssetListError {\n if (error instanceof Error) {\n const message = error.message\n\n if (message.includes('abort') || message.includes('timeout')) {\n return {\n type: 'timeout',\n message: 'Unable to load token list - request timed out',\n retryable: true\n }\n }\n\n if (message.includes('network') || message.includes('fetch')) {\n return {\n type: 'network',\n message: 'Unable to load token list - network error',\n retryable: true\n }\n }\n\n if (message.includes('Blockscout') || message.includes('API')) {\n return {\n type: 'api',\n message: 'Token service unavailable',\n retryable: true\n }\n }\n\n return {\n type: 'unknown',\n message: 'Unable to load token list',\n retryable: true\n }\n }\n\n return {\n type: 'unknown',\n message: 'Unable to load token list',\n retryable: true\n }\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * React hook for fetching all assets from Blockscout API\n *\n * @example\n * ```tsx\n * const { assets, isLoading, error, refreshBalances } = useBlockscoutAssets({\n * address: '0x...',\n * });\n * ```\n */\nexport function useBlockscoutAssets(options: UseBlockscoutAssetsOptions): UseBlockscoutAssetsResult {\n const { address, enabled = true, detectSecurityTokens = true } = options\n\n const publicClient = useLumiaPassportSession((st) => st.publicClient)\n const activeChainId = useLumiaPassportSession((st) => st.activeChainId)\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n\n // Get Blockscout API URL from chain config (null if not available for this chain)\n const blockscoutApiUrl = getBlockscoutApiUrl(chainConfig)\n\n // Create Blockscout client only if URL is available\n const blockscoutClient = useMemo(\n () => (blockscoutApiUrl ? createBlockscoutClient({ baseUrl: blockscoutApiUrl }) : null),\n [blockscoutApiUrl]\n )\n\n const lastRefreshRef = useRef<number>(0)\n\n // Fetch watch tokens (custom tokens from config) via RPC\n const {\n assets: watchTokenAssets,\n isLoading: watchTokensLoading,\n refetch: refetchWatchTokens\n } = useWatchTokens({ address, enabled })\n\n // Fetch native balance via dynamic publicClient (works with any chain)\n const {\n data: nativeBalanceData,\n isLoading: nativeLoading,\n refetch: refetchNative\n } = useQuery({\n queryKey: ['native-balance', activeChainId, address],\n queryFn: async () => {\n if (!publicClient || !address) return null\n const balance = await publicClient.getBalance({ address })\n return {\n value: balance,\n formatted: formatEther(balance),\n symbol: chainConfig?.nativeCurrency?.symbol || 'ETH',\n decimals: chainConfig?.nativeCurrency?.decimals || 18\n }\n },\n enabled: !!publicClient && !!address && enabled,\n staleTime: 30 * 1000, // 30 seconds\n gcTime: 5 * 60 * 1000 // 5 minutes\n })\n\n // Fetch token balances from Blockscout API (ERC20 tokens)\n // Disabled if chain doesn't have Blockscout-compatible API\n const {\n data: tokenBalances,\n isLoading: tokensLoading,\n error: tokensError,\n refetch: refetchTokens,\n dataUpdatedAt\n } = useQuery({\n queryKey: [BLOCKSCOUT_QUERY_KEY, address, blockscoutApiUrl],\n queryFn: () => blockscoutClient!.getTokenBalances(address!),\n enabled: !!address && enabled && !!blockscoutClient,\n // staleTime: BLOCKSCOUT_QUERY_STALE_TIME,\n gcTime: BLOCKSCOUT_QUERY_GC_TIME,\n retry: 2,\n retryDelay: 1000\n })\n\n // Fetch NFTs with full metadata from Blockscout API\n // Disabled if chain doesn't have Blockscout-compatible API\n const {\n data: nftItems,\n isLoading: nftsLoading,\n refetch: refetchNfts\n } = useQuery({\n queryKey: [BLOCKSCOUT_QUERY_KEY, 'nfts', address, blockscoutApiUrl],\n queryFn: () => blockscoutClient!.getNfts(address!),\n enabled: !!address && enabled && !!blockscoutClient,\n staleTime: BLOCKSCOUT_QUERY_STALE_TIME,\n gcTime: BLOCKSCOUT_QUERY_GC_TIME,\n retry: 2,\n retryDelay: 1000\n })\n\n // Extract ERC20 token addresses for ERC3643 detection\n const erc20TokenAddresses = useMemo((): Address[] => {\n if (!tokenBalances) return []\n return tokenBalances.filter((tb) => tb.token.type === 'ERC-20').map((tb) => tb.token.address as Address)\n }, [tokenBalances])\n\n // Detect ERC3643 security tokens by checking for identityRegistry function\n const { data: erc3643Results } = useQuery({\n queryKey: [ERC3643_DETECTION_QUERY_KEY, address, erc20TokenAddresses],\n queryFn: async (): Promise<Map<string, Address>> => {\n if (!publicClient || erc20TokenAddresses.length === 0) {\n return new Map()\n }\n\n const results = new Map<string, Address>()\n const batchSize = 10\n\n for (let i = 0; i < erc20TokenAddresses.length; i += batchSize) {\n const batch = erc20TokenAddresses.slice(i, i + batchSize)\n\n const promises = batch.map(async (tokenAddress) => {\n try {\n // Cast params via unknown - viem's strict typing doesn't infer correctly for dynamic ABI\n const registry = (await publicClient.readContract({\n address: tokenAddress,\n abi: ERC3643_ABI,\n functionName: 'identityRegistry',\n args: []\n } as unknown as Parameters<typeof publicClient.readContract>[0])) as Address\n if (registry && registry !== '0x0000000000000000000000000000000000000000') {\n return { tokenAddress, registry }\n }\n return null\n } catch {\n return null\n }\n })\n\n const batchResults = await Promise.allSettled(promises)\n batchResults.forEach((result) => {\n if (result.status === 'fulfilled' && result.value) {\n results.set(result.value.tokenAddress.toLowerCase(), result.value.registry)\n }\n })\n }\n\n return results\n },\n enabled: !!address && enabled && detectSecurityTokens && erc20TokenAddresses.length > 0 && !!publicClient,\n staleTime: BLOCKSCOUT_QUERY_STALE_TIME * 2,\n gcTime: BLOCKSCOUT_QUERY_GC_TIME,\n retry: 1\n })\n\n // Build combined assets list with ERC3643 detection and watch tokens\n const assets = useMemo((): Asset[] => {\n const result: Asset[] = []\n // Track addresses we've already added (for deduplication)\n const addedAddresses = new Set<string>()\n\n // Native balance always first\n if (nativeBalanceData) {\n result.push({\n type: 'native',\n name: chainConfig?.nativeCurrency?.name || nativeBalanceData.symbol,\n symbol: nativeBalanceData.symbol,\n balance: nativeBalanceData.value.toString(),\n formattedBalance: parseFloat(nativeBalanceData.formatted).toFixed(4),\n decimals: nativeBalanceData.decimals\n })\n }\n\n // Add ERC20 tokens from Blockscout token-balances (exclude NFTs - we get those from /nft endpoint)\n // Blockscout data takes priority over watch tokens (more accurate metadata)\n if (tokenBalances) {\n const erc20Tokens = tokenBalances.filter((balance) => balance.token.type === 'ERC-20')\n const mappedTokens = erc20Tokens.map((balance) => {\n const asset = mapBlockscoutToAsset(balance)\n\n // Track this address as already added\n if (asset.address) {\n addedAddresses.add(asset.address.toLowerCase())\n }\n\n // Check if this is an ERC3643 security token\n if (asset.type === 'erc20' && asset.address && erc3643Results) {\n const registryAddress = erc3643Results.get(asset.address.toLowerCase())\n if (registryAddress) {\n // Upgrade to erc3643 type\n asset.type = 'erc3643'\n asset.complianceStatus = {\n isSecurityToken: true,\n identityRegistry: registryAddress\n } as ComplianceStatus\n }\n }\n\n return asset\n })\n result.push(...mappedTokens)\n }\n\n // Add watch tokens that weren't already discovered by Blockscout\n // This is useful for:\n // 1. Chains without Blockscout API (BSC, Sepolia, Arbitrum, Base)\n // 2. Project-specific tokens that might not be indexed by Blockscout yet\n if (watchTokenAssets && watchTokenAssets.length > 0) {\n const newWatchTokens = watchTokenAssets.filter(\n (asset) => asset.address && !addedAddresses.has(asset.address.toLowerCase())\n )\n result.push(...newWatchTokens)\n }\n\n // Add NFTs from /nft endpoint (has full metadata with images)\n if (nftItems && nftItems.length > 0) {\n const mappedNfts = nftItems.map(mapBlockscoutNftToAsset)\n result.push(...mappedNfts)\n }\n\n return result\n }, [nativeBalanceData, tokenBalances, nftItems, erc3643Results, watchTokenAssets, chainConfig])\n\n // Native balance info\n const nativeBalance = useMemo(() => {\n if (!nativeBalanceData) return null\n return {\n value: nativeBalanceData.value,\n formatted: nativeBalanceData.formatted,\n symbol: nativeBalanceData.symbol\n }\n }, [nativeBalanceData])\n\n // Error state\n const error = useMemo((): AssetListError | null => {\n if (!tokensError) return null\n return createError(tokensError)\n }, [tokensError])\n\n // Refresh with debounce\n const refreshBalances = useCallback(async () => {\n const now = Date.now()\n if (now - lastRefreshRef.current < BLOCKSCOUT_REFRESH_DEBOUNCE) {\n return\n }\n lastRefreshRef.current = now\n\n await Promise.all([refetchNative(), refetchTokens(), refetchNfts(), refetchWatchTokens()])\n }, [refetchNative, refetchTokens, refetchNfts, refetchWatchTokens])\n\n // Get specific token balance\n const getTokenBalance = useCallback(\n (tokenAddress: Address): Asset | null => {\n return assets.find((a) => a.address?.toLowerCase() === tokenAddress.toLowerCase()) || null\n },\n [assets]\n )\n\n return {\n nativeBalance,\n assets,\n isLoading: nativeLoading || tokensLoading || nftsLoading || watchTokensLoading,\n isInitialLoading: nativeLoading && !nativeBalanceData,\n error,\n isBlockscoutAvailable: !!blockscoutClient && !tokensError,\n refreshBalances,\n getTokenBalance,\n lastUpdated: dataUpdatedAt || null\n }\n}\n","import React, { type SVGAttributes } from 'react'\n\nexport function BnbIcon(props: SVGAttributes<SVGElement>): React.JSX.Element {\n const { width = '24', height = '24', ...svgProps } = props\n\n return (\n <svg\n {...svgProps}\n height={height}\n width={width}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#F3BA2F\" />\n <path\n fill=\"#FFF\"\n d=\"M12.116 14.404L16 10.52l3.886 3.886 2.26-2.26L16 6l-6.144 6.144 2.26 2.26zM6 16l2.26-2.26L10.52 16l-2.26 2.26L6 16zm6.116 1.596L16 21.48l3.886-3.886 2.26 2.259L16 26l-6.144-6.144-.003-.003 2.263-2.257zM21.48 16l2.26-2.26L26 16l-2.26 2.26L21.48 16zm-3.188-.002h.002V16L16 18.294l-2.291-2.29-.004-.004.004-.003.401-.402.195-.195L16 13.706l2.293 2.293z\"\n />\n </svg>\n )\n}\n","import React, { type SVGAttributes } from 'react'\n\nfunction LumiaIcon(props: SVGAttributes<SVGElement>): React.JSX.Element {\n const { width = '24', height = '24', ...svgProps } = props\n\n return (\n <svg\n {...svgProps}\n width={width}\n height={height}\n viewBox=\"0 0 72 72\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ flexShrink: 0 }}\n >\n <rect width=\"72\" height=\"72\" rx=\"36\" fill=\"var(--l-pass-fg)\" />\n <path\n d=\"M25.3636 35.359H6.77698L26.3313 26.2792L35.3827 6.78174L35.404 25.3043C35.4112 30.8547 30.9139 35.3661 25.3565 35.3661L25.3636 35.359Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M47.4365 35.359H66.0231L46.4687 26.2792L37.4174 6.78174L37.396 25.3043C37.3889 30.8547 41.8861 35.3661 47.4436 35.3661L47.4365 35.359Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M47.4365 37.4226H66.0231L46.4687 46.5025L37.4174 65.9999L37.396 47.4773C37.3889 41.927 41.8861 37.4155 47.4436 37.4155L47.4365 37.4226Z\"\n fill=\"var(--l-pass-bg)\"\n />\n <path\n d=\"M25.3636 37.4226H6.77698L26.3313 46.5025L35.3827 65.9999L35.404 47.4773C35.4112 41.927 30.9139 37.4155 25.3565 37.4155L25.3636 37.4226Z\"\n fill=\"var(--l-pass-bg)\"\n />\n </svg>\n )\n}\n\nexport { LumiaIcon }\n","import type { SVGAttributes } from 'react'\n\nimport { BnbIcon } from './BnbIcon'\nimport { LumiaIcon } from './LumiaIcon'\n\nexport const TOKENS_ICONS: Record<string, (props: SVGAttributes<SVGElement>) => JSX.Element> = {\n LUMIA: LumiaIcon,\n BNB: BnbIcon\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { TOKENS_ICONS } from '@/src/internal/assets/tokens'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { Image as ImageIcon, Loader, ShieldAlert, Sparkles } from 'lucide-react'\nimport { useState } from 'react'\nimport { formatUnits } from 'viem'\n\nimport { type Asset } from '../../../modules/assets'\nimport { getExplorerUrl } from '../../clients/base'\nimport { formatPrice } from '../../lib/priceFormatter'\nimport { cn } from '../../lib/utils'\nimport { BALANCE_PREFIXES } from '../BalanceView'\n\ninterface PortfolioItemProps {\n address: `0x${string}` | null\n asset: Asset | Omit<Asset, 'type'>\n assetsRates?: Record<string, unknown>\n isProjectAsset?: boolean\n}\n\ninterface ProjectAssetBalance {\n cryptoFormatted: number\n cryptoFiatRate: number\n cryptoSymbol: string\n fiatFormatted: number\n fiatSymbol: string\n}\n\ninterface PortfolioItemImageProps {\n asset: Asset | Omit<Asset, 'type'>\n}\n\nfunction openInExplorer(address: string) {\n window.open(`${getExplorerUrl()}/address/${address}`, '_blank')\n}\n\nfunction isNftAsset(asset: Asset | Omit<Asset, 'type'>): boolean {\n if (!('type' in asset)) return false\n return asset.type === 'erc721' || asset.type === 'erc1155'\n}\n\nfunction getNftImage(asset: Asset | Omit<Asset, 'type'>): string | undefined {\n if (!('type' in asset)) return undefined\n // Try image field first (resolved from metadata), then nftMetadata.image\n return asset.image || asset.nftMetadata?.image\n}\n\nfunction isSecurityToken(asset: Asset | Omit<Asset, 'type'>): boolean {\n if (!('type' in asset)) return false\n return asset.type === 'erc3643'\n}\n\nfunction isAssetRateAvailable(symbol: string) {\n switch (symbol) {\n // list of prohibited symbols without market data on Binance\n\n // case 'XYZ':\n // case 'ABC':\n case 'P':\n return false\n\n default:\n return true\n }\n}\n\nconst SKIP_SYMBOLS = ['TEST']\n\nasync function getAssetRate(symbol: string) {\n if (SKIP_SYMBOLS.includes(symbol)) return { symbol, price: '0' }\n\n if (symbol === 'USDT') return { symbol, price: '1' }\n\n const assetURL = `https://api.binance.com/api/v3/ticker/price?symbol=${symbol.toUpperCase()}USDT`\n const response = await fetch(assetURL)\n return (await response.json()) as { symbol: string; price: string }\n}\nconst ASSETS_RATES_QUERY_KEY = 'lumia-passport-assets-rates-query-key'\n\nfunction PortfolioItemImage(props: PortfolioItemImageProps) {\n const { asset } = props\n\n const [nftImageError, setNftImageError] = useState(false)\n const [logoError, setLogoError] = useState(false)\n\n const isNft = isNftAsset(asset)\n const nftImage = getNftImage(asset)\n const isSecurity = isSecurityToken(asset)\n\n const LocalImage =\n // @ts-expect-error\n asset.type === 'native' &&\n //\n asset.symbol in TOKENS_ICONS\n ? TOKENS_ICONS[asset.symbol]\n : null\n\n return (\n <div\n className={cn('flex-none flex items-center justify-center relative', 'group-hover:opacity-60 transition-opacity')}\n >\n {/* NFT image display */}\n {isNft && nftImage && !nftImageError && (\n <img\n src={nftImage}\n alt={asset.nftMetadata?.name || asset.name}\n className=\"w-12 h-12 rounded-[var(--l-pass-el-bdrs)] object-cover\"\n onError={() => setNftImageError(true)}\n />\n )}\n\n {/* NFT placeholder when no image available */}\n {isNft && (!nftImage || nftImageError) && (\n <div className=\"w-12 h-12 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-fg)] flex items-center justify-center\">\n <ImageIcon className=\"w-5 h-5 text-[var(--l-pass-fg-inverted)]\" />\n </div>\n )}\n\n {/* NFT type badge */}\n {isNft && <Sparkles className=\"absolute top-0 right-0 w-4 h-4 text-[var(--l-pass-bg-success)]\" />}\n\n {/* NOT NFTS */}\n {!isNft && !!LocalImage && <LocalImage className=\"w-12 h-12 rounded-full\" />}\n\n {!isNft && !LocalImage && asset.logo && !logoError && (\n <img\n src={asset.logo}\n alt={asset.symbol}\n className=\"w-12 h-12 rounded-full object-contain\"\n onError={() => setLogoError(true)}\n />\n )}\n\n {!isNft && !LocalImage && (!asset.logo || logoError) && (\n <div className=\"w-12 h-12 rounded-full flex items-center justify-center bg-[var(--l-pass-fg)]\">\n <span className=\"text-[var(--l-pass-fg-inverted)] font-bold text-sm\">{asset.symbol.charAt(0)}</span>\n </div>\n )}\n\n {/* Security token badge */}\n {isSecurity && (\n <div className=\"absolute top-0 right-0\" title=\"Security Token (ERC-3643)\">\n <ShieldAlert className=\"w-4 h-4 text-[var(--l-pass-bg-error)] fill-[var(--l-pass-bg-warning)]\" />\n </div>\n )}\n </div>\n )\n}\n\nexport function PortfolioItem(props: PortfolioItemProps) {\n const { address, asset, isProjectAsset } = props\n\n // const [nftImageError, setNftImageError] = useState(false)\n // const [logoError, setLogoError] = useState(false)\n\n const { assets: projectAssets, showBalanceAs: showBalanceAsSymbol } =\n useLumiaPassportConfig().config.current.projectAssets || {}\n\n const qc = useQueryClient()\n\n const { balanceQueryKey } = projectAssets?.find((a) => a.symbol === showBalanceAsSymbol) || {}\n\n const projectAssetBalance = !!balanceQueryKey ? qc.getQueryData<ProjectAssetBalance>(balanceQueryKey) : null\n\n const isNft = isNftAsset(asset)\n // const nftImage = getNftImage(asset)\n const isSecurity = isSecurityToken(asset)\n\n const { data: assetRate, isLoading: isRateLoading } = useQuery({\n retry: false,\n staleTime: 4 * 60 * 1000,\n enabled: !!address && !!isAssetRateAvailable(asset.symbol) && !isProjectAsset && !isNft && !isSecurity,\n queryKey: [ASSETS_RATES_QUERY_KEY, address, asset.symbol],\n queryFn: async () => await getAssetRate(asset.symbol)\n })\n\n const showProjectFiatBalance = isProjectAsset && !!projectAssetBalance?.fiatFormatted\n\n const renderBalance = showProjectFiatBalance\n ? projectAssetBalance?.fiatFormatted || 0\n : Number(formatUnits(BigInt(asset?.balance || '0'), asset?.decimals || 18))\n\n const usdRenderBalance = !!assetRate?.price ? renderBalance * Number(assetRate.price) : 0\n\n return (\n <div\n className={cn(\n 'group',\n 'w-full flex items-center gap-[var(--l-pass-gap)]',\n 'hover:text-[var(--l-pass-fg-h)] transition-colors',\n { 'cursor-pointer': !!asset.address }\n )}\n onClick={() => (asset.address ? openInExplorer(asset.address) : undefined)}\n >\n <PortfolioItemImage asset={asset} />\n\n <div className=\"w-full flex-1\">\n {/* TITLES */}\n <div className=\"w-full flex items-center justify-between text-xs\">\n <span\n className=\"truncate max-w-[150px]\"\n title={isNft ? asset.nftMetadata?.collectionName || asset.name : asset.name}\n >\n {isNft\n ? asset.nftMetadata?.collectionName ||\n asset.name ||\n (asset.address ? `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` : 'Unknown')\n : asset.name || (asset.address ? `${asset.address.slice(0, 6)}...${asset.address.slice(-4)}` : 'Unknown')}\n </span>\n\n {!!usdRenderBalance && !isProjectAsset && !isNft && !isSecurity && (\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'USD'}</span>\n )}\n\n {!isSecurity && isNft && 'type' in asset && (\n <span className=\"uppercase text-[10px] px-1 bg-[var(--l-pass-bg-info)] rounded-full\">\n {asset.type === 'erc721' ? 'ERC-721' : 'ERC-1155'}\n </span>\n )}\n\n {isSecurity && (\n <span className=\"uppercase text-[10px] px-1 bg-[var(--l-pass-bg-warning)] rounded-full\">\n {'Security Token'}\n </span>\n )}\n </div>\n\n {/* VALUES */}\n <div className=\"w-full flex items-center justify-between font-bold text-lg leading-5\">\n {isNft ? (\n <>\n {/* NFT: Show name and token ID */}\n <span className=\"truncate max-w-[160px]\" title={asset.nftMetadata?.name || asset.symbol}>\n {asset.nftMetadata?.name || asset.symbol}\n </span>\n\n {'tokenId' in asset && asset.tokenId && (\n <span className=\"text-xs text-[var(--l-pass-fg-muted)] font-normal\">\n #{asset.tokenId.length > 8 ? `${asset.tokenId.slice(0, 6)}...` : asset.tokenId}\n </span>\n )}\n </>\n ) : (\n <>\n {/* Token: Show balance and price */}\n <span>\n {BALANCE_PREFIXES[asset.symbol] || null}\n <span>{formatPrice(Number(renderBalance))}</span>{' '}\n {!BALANCE_PREFIXES[asset.symbol] && <span> {asset.symbol}</span>}\n </span>\n\n {isRateLoading && <Loader className=\"h-4 w-4 animate-spin\" />}\n {!isRateLoading && !!usdRenderBalance && (\n <span>\n <span>{'$'}</span>\n <span>{formatPrice(usdRenderBalance)}</span>\n </span>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { AlertCircle, ArrowLeft, Gem, Loader, RefreshCw } from 'lucide-react'\nimport { useCallback, type CSSProperties } from 'react'\n\nimport { useBlockscoutAssets } from '../../hooks/useBlockscoutAssets'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { PortfolioItem } from './PortfolioItem'\n\nexport function PortfolioMenu() {\n const { assets: projectAssets = [] } = useLumiaPassportConfig().config.current?.projectAssets || {}\n\n const { t } = useT()\n\n const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const {\n assets: blockscoutAssets,\n refreshBalances: refreshBlockscoutBalances,\n isLoading: isBlockscoutLoading,\n error: blockscoutError,\n isBlockscoutAvailable\n } = useBlockscoutAssets({\n address: address as `0x${string}` | undefined,\n enabled: !!address\n })\n\n const shownProjectAssests = projectAssets.filter((asset) => !asset.hideInPortfolio)\n\n const refreshAllAssetsBalances = useCallback(() => {\n // no need async/await\n Promise.all(shownProjectAssests.map((asset) => qc.invalidateQueries({ queryKey: asset.balanceQueryKey })))\n refreshBlockscoutBalances()\n }, [qc, shownProjectAssests, refreshBlockscoutBalances])\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button variant=\"ghost\" size=\"icon\" title=\"Back\" onClick={() => setPage(PageKey.MAIN_MENU)}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:portfolioMenu.title')}</span>\n\n <Button\n title=\"Refresh balances\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={refreshAllAssetsBalances}\n disabled={isBlockscoutLoading}\n >\n {isBlockscoutLoading ? <Loader className=\"h-4 w-4 animate-spin\" /> : <RefreshCw className=\"h-4 w-4\" />}\n </Button>\n </div>\n\n {isBlockscoutLoading && (\n <div className=\"w-full flex items-center justify-center gap-[var(--l-pass-gap)] p-[var(--l-pass-pd)]\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n </div>\n )}\n\n {!isBlockscoutLoading && blockscoutAssets?.length === 0 && (\n <Highlight type=\"info\" className=\"flex flex-col items-center justify-center gap-[var(--l-pass-gap)]\">\n <Gem className=\"w-8 h-8\" />\n <span className=\"block\">{t('passport:portfolioMenu.noAssets')}</span>\n </Highlight>\n )}\n\n {!isBlockscoutLoading &&\n shownProjectAssests?.map((asset, index) => (\n <PortfolioItem key={`project-${asset.symbol}-${index}`} isProjectAsset address={address} asset={asset} />\n ))}\n\n {!isBlockscoutLoading &&\n blockscoutAssets?.length > 0 &&\n blockscoutAssets.map((asset, index) => (\n <PortfolioItem\n key={`${asset.type}-${asset.address || 'native'}-${asset.tokenId || index}`}\n address={address}\n asset={asset}\n />\n ))}\n\n {/* Error banner when Blockscout API is unavailable */}\n {blockscoutError && !isBlockscoutAvailable && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"text-xs\">{blockscoutError.message}</span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","export { PortfolioMenu } from './PortfolioMenu'\n","export const KEYSHARE_RECOVERY_STATS_QUERY = 'keyshare-recovery-stats-query'\n","export function NegativeIcon(props: React.SVGProps<SVGSVGElement>) {\n const { width = '16', height = '16', ...rest } = props\n\n return (\n <svg {...rest} width={width} height={height} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"16\" height=\"16\" rx=\"8\" fill=\"var(--l-pass-bg-error)\" />\n <path d=\"M10.8048 5.19482L5.19434 10.8055\" stroke=\"var(--l-pass-fg)\" strokeLinecap=\"round\" />\n <path d=\"M5.19421 5.19482L10.8047 10.8055\" stroke=\"var(--l-pass-fg)\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","import { Loader } from 'lucide-react'\nimport type { ElementType, PropsWithChildren, ReactNode, SVGProps } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\ninterface KeyshareStatusProps extends PropsWithChildren {\n content: ReactNode\n icon: ElementType<SVGProps<SVGSVGElement>>\n isLoading?: boolean\n}\n\nexport function KeyshareStatus(props: KeyshareStatusProps) {\n const { isLoading, content, icon: Icon, children } = props\n\n if (isLoading) return <Loader className=\"w-4 h-4 animate-spin\" />\n\n return (\n <div className=\"group relative w-full h-full\">\n {children}\n\n <div\n className={cn(\n 'absolute -top-2 -right-2 w-6 h-6 flex items-center justify-center',\n 'rounded-full bg-[var(--l-pass-bg)]'\n // 'border border-[var(--l-pass-bd)]'\n )}\n >\n <Icon className=\"w-4 h-4\" />\n </div>\n\n <div\n style={{ transform: 'translateY(calc(var(--l-pass-gap) * -4))' }}\n className={cn(\n 'transition-opacity pointer-events-none z-50',\n 'absolute top-0 right-0 max-w-full',\n 'px-2 py-1 bg-[var(--l-pass-bg)] text-[var(--l-pass-fg)] text-[10px] rounded-[var(--l-pass-el-bdrs)]',\n 'border border-[var(--l-pass-bd)]',\n 'opacity-0 group-hover:opacity-100'\n )}\n >\n {content}\n </div>\n </div>\n )\n}\n","import { useT } from '@/src/i18n/useT'\nimport dayjs from 'dayjs'\nimport {\n DatabaseBackup\n // HardDrive, Cloud\n} from 'lucide-react'\n\nimport type { BackupStatus, RecoveryStats } from '../../../vaultClient'\nimport { Highlight } from '../../ui/highlight'\n\ninterface LastBackupProps {\n backup: BackupStatus\n createdRecoveryStats?: RecoveryStats['created']\n}\n\nfunction parseOS(ua?: string | null): string | null {\n if (!ua) return null\n if (ua.includes('Mac OS X')) return 'macOS'\n if (ua.includes('Windows')) return 'Windows'\n if (ua.includes('Android')) return 'Android'\n if (ua.includes('Linux')) return 'Linux'\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iOS')) return 'iOS'\n return null\n}\n\nexport function LastBackup(props: LastBackupProps) {\n const { backup, createdRecoveryStats } = props\n\n const { t } = useT()\n // console.log('LastBackup backup:', backup)\n\n const {\n at: recoveryCreatedAt,\n browser: recoveryBrowser,\n ua: recoveryUa,\n deviceId: recoveryDeviceId,\n deviceName: recoveryDeviceName\n // country: recoveryCountry\n } = createdRecoveryStats || {}\n\n const hasBackupData =\n (backup?.server?.enabled && backup.server.lastBackup) ||\n (!backup.server.lastBackup && recoveryCreatedAt) ||\n (backup.cloud.enabled && backup.cloud?.lastBackup) ||\n (backup.local.enabled && backup.local.lastBackup)\n\n if (!hasBackupData) return null\n\n return (\n <Highlight type=\"info\" className=\"flex flex-col gap-[var(--l-pass-gap)] text-[10px] leading-tight\">\n <span className=\"flex items-center gap-[var(--l-pass-gap)] font-bold text-xs leading-4\">\n <DatabaseBackup className=\"w-4 h-4 flex-none\" />\n <span>{t('passport:securityMenu.lastBackup')}</span>\n </span>\n\n {/* {backup.server.enabled && backup.server.lastBackup && (\n <div className=\"flex items-center gap-1\">\n <Server className=\"h-3 w-3\" />\n <span>Server: {new Date(backup.server.lastBackup).toLocaleString()}</span>\n </div>\n )} */}\n\n {/* {!backup.server.lastBackup && recoveryCreatedAt && ( */}\n {recoveryCreatedAt && (\n <>\n <span>{dayjs(recoveryCreatedAt).format('MMMM DD, YYYY HH:mm')}</span>\n\n <span>\n {/* @ts-expect-error */}\n {t('passport:securityMenu.lastBackupMeta', {\n browser: recoveryBrowser || 'UNKNOWN',\n deviceName: recoveryDeviceName || 'UNKNOWN',\n os: parseOS(recoveryUa) || 'UNKNOWN'\n })}\n </span>\n </>\n )}\n\n {/* {backup.cloud.enabled && backup.cloud.lastBackup && (\n <div className=\"flex items-center gap-1\">\n <Cloud className=\"h-3 w-3\" />\n <span>Cloud: {dayjs(backup.cloud.lastBackup).format('MMMM DD, YYYY HH:mm')}</span>\n </div>\n )}\n\n {backup.local.enabled && backup.local.lastBackup && (\n <div className=\"flex items-center gap-1\">\n <HardDrive className=\"h-3 w-3\" />\n <span>Local: {dayjs(backup.local.lastBackup).format('MMMM DD, YYYY HH:mm')}</span>\n </div>\n )} */}\n </Highlight>\n )\n}\n","import { useT } from '@/src/i18n/useT'\nimport { Cloud, Laptop, Loader, RefreshCw, Server } from 'lucide-react'\n\nimport { NegativeIcon } from '../../../assets/NegativeIcon'\nimport { PositiveIcon } from '../../../assets/PositiveIcon'\nimport { getBackupStatus, type RecoveryStats } from '../../../vaultClient'\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport type { KeyshareInfo } from '../interfaces'\nimport { KeyshareStatus } from './KeyshareStatus'\nimport { LastBackup } from './LastBackup'\n\ninterface KeyshareProps {\n userId: string\n serverHasKeyshare: boolean\n localInfo: KeyshareInfo\n hasServerBackup: boolean\n createdRecoveryStats?: RecoveryStats['created']\n isLoading?: boolean\n refresh: () => void\n}\n\nexport function Keyshare(props: KeyshareProps) {\n const { userId, serverHasKeyshare, localInfo, hasServerBackup, createdRecoveryStats, isLoading, refresh } = props\n\n const { t } = useT()\n\n const backup = userId\n ? getBackupStatus(userId)\n : { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } }\n\n return (\n <>\n <div className=\"flex items-center justify-between gap-[var(--l-pass-gap)]\">\n <span className=\"text-xs text-[var(--l-pass-fg-muted)]\">{t('passport:securityMenu.keyshareStatus.title')}</span>\n\n <Button variant=\"ghost\" size=\"icon\" title=\"Refresh\" disabled={isLoading} onClick={refresh}>\n {isLoading ? <Loader className=\"h-4 w-4 animate-spin\" /> : <RefreshCw className=\"h-4 w-4\" />}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-3 gap-[var(--l-pass-gap)] px-[var(--l-pass-gap)]\">\n <KeyshareStatus\n content={\n serverHasKeyshare\n ? t('passport:securityMenu.keyshareStatus.serverReady')\n : t('passport:securityMenu.keyshareStatus.serverMissing')\n }\n icon={serverHasKeyshare ? PositiveIcon : NegativeIcon}\n >\n <Highlight\n type={serverHasKeyshare ? 'success' : 'warning'}\n className=\"w-full h-full flex flex-col items-center gap-0\"\n >\n <Cloud className=\"h-6 w-6\" />\n <span className=\"text-[10px] font-medium leading-4\">{'Server Share'}</span>\n </Highlight>\n </KeyshareStatus>\n\n <KeyshareStatus\n content={\n localInfo?.hasKeyshare\n ? t('passport:securityMenu.keyshareStatus.localReady')\n : t('passport:securityMenu.keyshareStatus.localMissing')\n }\n icon={localInfo?.hasKeyshare ? PositiveIcon : NegativeIcon}\n >\n <Highlight\n type={localInfo?.hasKeyshare ? 'success' : 'warning'}\n className=\"w-full h-full flex flex-col items-center gap-0\"\n >\n <Laptop className=\"h-6 w-6\" />\n <span className=\"text-[10px] font-medium leading-4\">{'Local Share'}</span>\n </Highlight>\n </KeyshareStatus>\n\n <KeyshareStatus\n content={\n hasServerBackup\n ? t('passport:securityMenu.keyshareStatus.valutBackupCreated')\n : t('passport:securityMenu.keyshareStatus.valutBackupMissing')\n }\n icon={hasServerBackup ? PositiveIcon : NegativeIcon}\n >\n <Highlight\n type={hasServerBackup ? 'success' : 'warning'}\n className=\"w-full h-full flex flex-col items-center gap-0\"\n >\n <Server className=\"h-6 w-6\" />\n <span className=\"text-[10px] font-medium leading-4\">{'Backup Vault'}</span>\n </Highlight>\n </KeyshareStatus>\n </div>\n\n {createdRecoveryStats?.at && <LastBackup backup={backup} createdRecoveryStats={createdRecoveryStats} />}\n\n {/* Local keyshare details */}\n {/* {localInfo?.hasKeyshare && (\n <Highlight type=\"info\" className=\"w-full flex flex-col gap-[var(--l-pass-gap)] text-[10px] leading-tight\">\n {localInfo.ownerAddress && (\n <div className=\"flex justify-between gap-[var(--l-pass-gap)]\">\n <span className=\"block flex-none text-[var(--l-pass-fg-muted)]\">{'Owner'}</span>\n <span className=\"block flex-1 font-mono\">{localInfo.ownerAddress}</span>\n </div>\n )}\n\n {typeof localInfo.keyshareSize === 'number' && (\n <div className=\"flex justify-between gap-[var(--l-pass-gap)]\">\n <span className=\"block flex-none text-[var(--l-pass-fg-muted)]\">{'Size'}</span>\n <span className=\"block flex-1 font-mono\">{`${Math.round((localInfo.keyshareSize || 0) / 1024)}KB`}</span>\n </div>\n )}\n\n {localInfo.sessionId && (\n <div className=\"flex justify-between gap-[var(--l-pass-gap)]\">\n <span className=\"block flex-none text-[var(--l-pass-fg-muted)]\">{'Session'}</span>\n <span className=\"block flex-1 font-mono\">{localInfo.sessionId}</span>\n </div>\n )}\n </Highlight>\n )} */}\n\n <div className=\"w-full\" style={{ borderTop: '1px solid var(--l-pass-bd)' }} />\n </>\n )\n}\n","export { Keyshare } from './Keyshare'\n","import { useT } from '@/src/i18n'\nimport { AppWindowMac, Loader } from 'lucide-react'\n\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\n\ntype AppToRemoveProps = {\n projectId: string\n origin: string\n hostname: string\n appName?: string\n appLogo?: string\n}\n\ninterface RemoveTrustedAppProps {\n appToRemove: AppToRemoveProps\n isRemoving?: boolean\n setAppToRemove: (app: AppToRemoveProps | null) => void\n handleRemoveTrustedApp: () => Promise<void>\n}\n\nexport function RemoveTrustedApp(props: RemoveTrustedAppProps) {\n const { appToRemove, isRemoving, setAppToRemove, handleRemoveTrustedApp } = props\n\n const { t } = useT()\n\n return (\n <div className=\"flex flex-col gap-[var(--l-pass-gap)]\">\n <Highlight className=\"flex flex-col gap-[var(--l-pass-gap)]\" type=\"warning\">\n <span className=\"text-sm leading-5 font-bold\">\n {t('passport:common.delete')} {t('passport:securityMenu.trustedApps.trustedApp')}?\n </span>\n\n <div className=\"w-full flex items-center justify-center gap-[var(--l-pass-gap)]\">\n {appToRemove.appLogo ? (\n <div className=\"w-12 h-12 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg)] flex-shrink-0 p-1\">\n <img src={appToRemove.appLogo} alt={appToRemove.appName} className=\"w-full h-full object-contain\" />\n </div>\n ) : (\n <div className=\"w-12 h-12 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg)] flex items-center justify-center flex-shrink-0\">\n <AppWindowMac className=\"w-6 h-6\" />\n </div>\n )}\n\n <div className=\"flex-1 text-left\">\n <div className=\"font-medium\">{appToRemove.appName || appToRemove.hostname}</div>\n <div className=\"text-[10px]\">({appToRemove.hostname})</div>\n </div>\n </div>\n </Highlight>\n\n <div className=\"text-[10px] text-[var(--l-pass-fg-muted)] text-left space-y-1\">\n <p>\n {t('passport:securityMenu.trustedApps.removalNoteTitle')}\n {':'}\n </p>\n\n <ul className=\"list-disc list-inside ml-2 space-y-0.5\">\n <li>{t('passport:securityMenu.trustedApps.removalNoteMsg1')}</li>\n <li>{t('passport:securityMenu.trustedApps.removalNoteMsg2')}</li>\n </ul>\n </div>\n\n <div className=\"w-full flex gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"outline\"\n size=\"large\"\n className=\"flex-1\"\n onClick={() => setAppToRemove(null)}\n disabled={isRemoving}\n >\n {t('passport:common.cancel')}\n </Button>\n\n <Button\n variant=\"default\"\n size=\"large\"\n className=\"flex-1 bg-[var(--l-pass-error)] hover:bg-[var(--l-pass-error)]/60 active:bg-[var(--l-pass-error)]/40\"\n onClick={handleRemoveTrustedApp}\n disabled={isRemoving}\n >\n {isRemoving ? <Loader className=\"h-4 w-4 animate-spin\" /> : t('passport:common.delete')}\n </Button>\n </div>\n </div>\n )\n}\n","import { useT } from '@/src/i18n'\nimport dayjs from 'dayjs'\nimport { AppWindowMac, Info, Trash2 } from 'lucide-react'\n\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { TrustedAppsProps } from './interfaces'\n\nexport function TrustedApps(props: TrustedAppsProps) {\n const { trustedApps, setAppToRemove } = props\n\n const { t } = useT()\n\n if (trustedApps.length === 0)\n return (\n <Highlight type=\"info\" className=\"flex gap-[var(--l-pass-gap)] \">\n <Info className=\"w-4 h-4\" />\n <span>{t('passport:securityMenu.trustedApps.noTrustedApps')}</span>\n </Highlight>\n )\n\n return (\n <>\n <span className=\"font-medium text-xs text-[var(--l-pass-fg)]\">{`${t('passport:securityMenu.trustedApps.trustedApps')} (${trustedApps.length}):`}</span>\n\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {trustedApps.map((app, index) => (\n <div\n key={index}\n className=\"text-[10px] leading-tight p-2 rounded-[var(--l-pass-el-bdrs)] flex items-center gap-[var(--l-pass-gap)] bg-[var(--l-pass-bg-info)]\"\n >\n {app.appLogo ? (\n <div className=\"w-12 h-12 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg)] flex-shrink-0 p-1\">\n <img src={app.appLogo} alt={app.appName} className=\"w-full h-full object-contain\" />\n </div>\n ) : (\n <div className=\"w-12 h-12 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg)] flex items-center justify-center flex-shrink-0\">\n <AppWindowMac className=\"w-6 h-6\" />\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-semibold truncate\">{app.appName || new URL(app.origin).hostname}</div>\n <div className=\"text-[var(--l-pass-fg-muted)] truncate\">{new URL(app.origin).hostname}</div>\n\n <div className=\"text-[var(--l-pass-fg-muted)] truncate\">\n {t('passport:common.added')}: {dayjs(app.trustedAt).format('MMM D, YYYY HH:mm')}\n </div>\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Remove from trusted\"\n className=\"text-[var(--l-pass-bg-error)] flex-shrink-0\"\n onClick={() => setAppToRemove({ ...app, hostname: new URL(app.origin).hostname })}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </div>\n </>\n )\n}\n","import { useT } from '@/src/i18n'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { ArrowLeft, Loader } from 'lucide-react'\nimport { useState, type CSSProperties } from 'react'\n\nimport { jwtTokenManager } from '../../auth'\nimport { getKeyshareInfo } from '../../auth/keyshare'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { getIframeManager } from '../../lib/iframe-manager'\nimport { getBackupStatus, getShareRecoveryStats } from '../../vaultClient'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { KEYSHARE_RECOVERY_STATS_QUERY } from './constants'\nimport type { KeyshareInfo } from './interfaces'\nimport { Keyshare } from './Keyshare'\nimport { RemoveTrustedApp } from './RemoveTrustedApp'\nimport { TrustedApps } from './TrustedApps'\n\n// function parseOS(ua?: string | null): string | null {\n// if (!ua) return null\n// if (ua.includes('Mac OS X')) return 'macOS'\n// if (ua.includes('Windows')) return 'Windows'\n// if (ua.includes('Android')) return 'Android'\n// if (ua.includes('Linux')) return 'Linux'\n// if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iOS')) return 'iOS'\n// return null\n// }\n\nexport function SecurityMenu() {\n const qc = useQueryClient()\n const { t } = useT()\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const userId = jwtTokenManager.getUserId()\n const serverHasKeyshare = jwtTokenManager.getHasKeyshare() ?? false\n\n const [isRemoving, setIsRemoving] = useState(false)\n const [appToRemove, setAppToRemove] = useState<{\n projectId: string\n origin: string\n hostname: string\n appName?: string\n appLogo?: string\n } | null>(null)\n\n const {\n data: recoveryData,\n isFetching: isRecoveryLoading,\n isLoading: isRecoveryLoadingInitial\n } = useQuery({\n enabled: !!userId,\n queryKey: [KEYSHARE_RECOVERY_STATS_QUERY, userId],\n queryFn: async () => {\n const iframeManager = getIframeManager()\n\n if (!iframeManager) {\n throw new Error('Iframe manager not available')\n }\n\n const trustedApps = await iframeManager.getTrustedApps(userId) // Load trusted apps from iframe\n const keyshareInfo = await getKeyshareInfo(userId) // Load local keyshare info from iframe\n const shareRecoveryStats = await getShareRecoveryStats() // Load recovery stats\n\n return { trustedApps, keyshareInfo, shareRecoveryStats }\n }\n })\n\n const localInfo = recoveryData?.keyshareInfo || ({} as KeyshareInfo)\n const trustedApps = recoveryData?.trustedApps || []\n\n const hasServerBackup =\n !!recoveryData?.shareRecoveryStats?.created || recoveryData?.shareRecoveryStats?.devices?.length > 0\n\n const backup = userId\n ? getBackupStatus(userId)\n : { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } }\n\n const handleRemoveTrustedApp = async () => {\n if (!userId || !appToRemove) return\n\n setIsRemoving(true)\n try {\n const iframeManager = getIframeManager()\n if (!iframeManager) {\n throw new Error('Iframe manager not available')\n }\n\n const success = await iframeManager.removeTrustedApp(userId, appToRemove.projectId, appToRemove.origin)\n\n if (success) {\n // Refresh the list\n qc.invalidateQueries({ queryKey: [KEYSHARE_RECOVERY_STATS_QUERY, userId] })\n setAppToRemove(null)\n } else {\n console.error('[SecurityMenu] Failed to remove trusted app')\n }\n } catch (error) {\n console.error('[SecurityMenu] Error removing trusted app:', error)\n } finally {\n setIsRemoving(false)\n }\n }\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={t('passport:common.back')}\n onClick={() => {\n if (!!appToRemove) setAppToRemove(null)\n else setPage(PageKey.SETTINGS)\n }}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:securityMenu.title')}</span>\n </div>\n\n {!!isRecoveryLoadingInitial && (\n <div className=\"w-full flex items-center justify-center p-[var(--l-pass-pd)]\">\n <Loader className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n\n {!isRecoveryLoadingInitial && !appToRemove && (\n <>\n <Keyshare\n userId={userId}\n serverHasKeyshare={serverHasKeyshare}\n localInfo={localInfo}\n hasServerBackup={hasServerBackup}\n isLoading={isRecoveryLoading}\n createdRecoveryStats={recoveryData?.shareRecoveryStats?.created}\n refresh={() => qc.invalidateQueries({ queryKey: [KEYSHARE_RECOVERY_STATS_QUERY, userId] })}\n />\n\n <TrustedApps trustedApps={trustedApps} setAppToRemove={setAppToRemove} />\n\n {/* Paranoia mode TODO: dedicated component */}\n {/* <Highlight className=\"flex flex-col gap-[var(--l-pass-gap)] user-select-none\" type=\"warning\">\n <label className=\"cursor-pointer flex items-center gap-[var(--l-pass-gap)]\">\n <Checkbox\n name=\"paranoia-mode-checkbox\"\n // checked={false} // Placeholder, replace with actual flow\n // onCheckedChange={(checked) => {}} // Placeholder, replace with actual flow\n />\n <span className=\"text-sm font-semibold\">{'Paranoia MODE (not implemented)'}</span>\n </label>\n\n <span>{'Paranoia mode description... (wip)'}</span>\n </Highlight> */}\n </>\n )}\n\n {!isRecoveryLoadingInitial && !!appToRemove && (\n <RemoveTrustedApp\n appToRemove={appToRemove}\n setAppToRemove={setAppToRemove}\n handleRemoveTrustedApp={handleRemoveTrustedApp}\n isRemoving={isRemoving}\n />\n )}\n </Expandable>\n </div>\n )\n}\n","export { SecurityMenu } from './SecurityMenu'\n","import { useReadContract } from 'wagmi'\nimport type { Address } from 'viem'\n\n// ABI for ERC3643 canTransfer function\nconst ERC3643_CAN_TRANSFER_ABI = [\n {\n type: 'function',\n name: 'canTransfer',\n inputs: [\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' }\n ],\n outputs: [{ name: '', type: 'bool' }]\n }\n] as const\n\nexport interface UseErc3643ComplianceOptions {\n /** Token contract address */\n tokenAddress: Address | undefined\n /** Recipient address */\n to: Address | undefined\n /** Amount to transfer (as bigint) */\n amount: bigint | undefined\n /** Whether to enable the query */\n enabled?: boolean\n /** Chain ID to use for the query */\n chainId?: number\n}\n\nexport interface UseErc3643ComplianceResult {\n /** Whether the transfer is allowed */\n canTransfer: boolean | undefined\n /** Whether the query is loading */\n isLoading: boolean\n /** Error message if compliance check failed */\n error: string | null\n /** Refetch the compliance status */\n refetch: () => void\n}\n\n/**\n * Hook to check ERC3643 (Security Token) transfer compliance.\n *\n * ERC3643 tokens have compliance requirements that must be met before transfers.\n * This hook calls the `canTransfer` function on the token contract to verify\n * if a transfer is allowed.\n *\n * @example\n * ```tsx\n * const { canTransfer, isLoading, error } = useErc3643Compliance({\n * tokenAddress: '0x...',\n * to: recipientAddress,\n * amount: parseUnits('100', 18),\n * enabled: selectedAsset?.type === 'erc3643'\n * });\n *\n * if (!canTransfer) {\n * // Show compliance error\n * }\n * ```\n */\nexport function useErc3643Compliance(options: UseErc3643ComplianceOptions): UseErc3643ComplianceResult {\n const { tokenAddress, to, amount, enabled = true } = options\n\n const isQueryEnabled = enabled && !!tokenAddress && !!to && amount !== undefined\n\n const {\n data: canTransferResult,\n isLoading,\n error: queryError,\n refetch\n } = useReadContract({\n address: tokenAddress,\n abi: ERC3643_CAN_TRANSFER_ABI,\n functionName: 'canTransfer',\n args: to && amount !== undefined ? [to, amount] : undefined,\n chainId: options.chainId,\n query: {\n enabled: isQueryEnabled\n }\n })\n\n let error: string | null = null\n\n if (queryError) {\n // Parse common ERC3643 compliance errors\n const errorMessage = queryError.message || ''\n\n if (errorMessage.includes('IDENTITY_NOT_VERIFIED')) {\n error = 'Recipient identity is not verified for this security token'\n } else if (errorMessage.includes('COUNTRY_NOT_ALLOWED')) {\n error = 'Transfer not allowed to recipient country'\n } else if (errorMessage.includes('INVESTOR_LIMIT_EXCEEDED')) {\n error = 'Maximum investor limit exceeded for this token'\n } else if (errorMessage.includes('HOLDING_PERIOD_NOT_MET')) {\n error = 'Holding period requirement not met'\n } else if (errorMessage.includes('AMOUNT_EXCEEDS_LIMIT')) {\n error = 'Transfer amount exceeds allowed limit'\n } else {\n error = 'Compliance check failed. Transfer may not be allowed.'\n }\n } else if (canTransferResult === false) {\n error = 'Transfer not allowed by token compliance rules'\n }\n\n // Safely cast the result to boolean\n const canTransfer = typeof canTransferResult === 'boolean' ? canTransferResult : undefined\n\n return {\n canTransfer,\n isLoading,\n error,\n refetch\n }\n}\n","/**\n * Nickname fingerprint verification utilities\n * Implements client-side verification per FRD spec\n *\n * IMPORTANT: Client MUST NOT trust server blindly.\n * Always verify fingerprint locally before displaying to user.\n */\n\nimport { keccak256, getAddress } from 'viem';\n\n/**\n * Base32 alphabet for fingerprint encoding\n * Excludes 0, O, I, L to avoid confusion\n */\nconst BASE32_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\n\n/**\n * Generate fingerprint from owner address\n * Must match backend algorithm exactly\n *\n * Algorithm:\n * 1. Normalize address to checksum format\n * 2. Compute keccak256 hash\n * 3. Take first 5 bytes (40 bits)\n * 4. Encode using Base32 alphabet\n * 5. Format as XXXX-XXXX\n *\n * @param ownerAddress - The EOA owner address\n * @returns Fingerprint in format \"XXXX-XXXX\"\n */\nexport function generateFingerprint(ownerAddress: string): string {\n const normalized = getAddress(ownerAddress);\n const hash = keccak256(normalized as `0x${string}`);\n\n // Take first 5 bytes (10 hex chars) for 40 bits\n const hexBytes = hash.slice(2, 12);\n const bytes = hexToBytes(hexBytes);\n\n let result = '';\n let bits = 0;\n let value = 0;\n\n for (const byte of bytes) {\n value = (value << 8) | byte;\n bits += 8;\n while (bits >= 5) {\n bits -= 5;\n result += BASE32_ALPHABET[(value >> bits) & 0x1f];\n }\n }\n\n return `${result.slice(0, 4)}-${result.slice(4, 8)}`;\n}\n\n/**\n * Convert hex string to byte array\n */\nfunction hexToBytes(hex: string): number[] {\n const bytes: number[] = [];\n for (let i = 0; i < hex.length; i += 2) {\n bytes.push(parseInt(hex.slice(i, i + 2), 16));\n }\n return bytes;\n}\n\n/**\n * Verify that received fingerprint matches computed fingerprint\n *\n * @param ownerAddress - The owner address from API response\n * @param receivedFingerprint - The fingerprint from API response\n * @returns true if fingerprint is valid, false if verification failed\n */\nexport function verifyFingerprint(\n ownerAddress: string,\n receivedFingerprint: string\n): boolean {\n if (!ownerAddress || !receivedFingerprint) {\n return false;\n }\n\n try {\n const computed = generateFingerprint(ownerAddress);\n return computed === receivedFingerprint;\n } catch {\n return false;\n }\n}\n\n/**\n * Fingerprint verification result\n */\nexport interface FingerprintVerificationResult {\n isValid: boolean;\n computedFingerprint: string | null;\n receivedFingerprint: string | null;\n error?: string;\n}\n\n/**\n * Verify fingerprint with detailed result\n * Use this for UI display of verification status\n *\n * @param ownerAddress - The owner address from API response\n * @param receivedFingerprint - The fingerprint from API response\n * @returns Detailed verification result\n */\nexport function verifyFingerprintDetailed(\n ownerAddress: string | null,\n receivedFingerprint: string | null\n): FingerprintVerificationResult {\n if (!ownerAddress) {\n return {\n isValid: false,\n computedFingerprint: null,\n receivedFingerprint,\n error: 'Owner address is missing'\n };\n }\n\n if (!receivedFingerprint) {\n return {\n isValid: false,\n computedFingerprint: null,\n receivedFingerprint: null,\n error: 'Fingerprint is missing'\n };\n }\n\n try {\n const computed = generateFingerprint(ownerAddress);\n const isValid = computed === receivedFingerprint;\n\n return {\n isValid,\n computedFingerprint: computed,\n receivedFingerprint,\n error: isValid ? undefined : 'Fingerprint mismatch - possible security issue'\n };\n } catch (e) {\n return {\n isValid: false,\n computedFingerprint: null,\n receivedFingerprint,\n error: `Failed to compute fingerprint: ${e instanceof Error ? e.message : 'Unknown error'}`\n };\n }\n}\n","/**\n * useNicknameResolve hook\n * Public hook for resolving nicknames to wallet addresses with verification\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useState, useEffect, useMemo } from 'react'\nimport { resolveNickname } from '../internal/clients/nickname'\nimport { QUERY_KEYS } from '../internal/clients/profile'\nimport { normalizeNickname } from '../internal/lib/nickname-validation'\nimport {\n verifyFingerprintDetailed,\n type FingerprintVerificationResult\n} from '../internal/lib/nickname-fingerprint'\nimport type { NicknameResolution } from '../internal/clients/nickname-types'\n\nconst DEBOUNCE_MS = 300\n\nexport interface UseNicknameResolveResult {\n data: NicknameResolution | undefined\n isLoading: boolean\n isResolving: boolean\n isError: boolean\n isNotFound: boolean\n isWalletNotSetup: boolean\n isFrozen: boolean\n isFingerprintVerified: boolean\n fingerprintVerification: FingerprintVerificationResult | null\n error: Error | null\n resolvedAddress: string | null\n}\n\n/**\n * Detect if input looks like a nickname (vs an address)\n * - Starts with @ or contains only lowercase a-z, 0-9, underscore\n * - Does not start with 0x\n */\nfunction looksLikeNickname(input: string): boolean {\n if (!input) return false\n if (input.startsWith('0x')) return false\n if (input.startsWith('@')) return true\n const normalized = input.toLowerCase().trim()\n // Only lowercase a-z, 0-9 and underscore (aligned with validation rules)\n return /^[a-z0-9_]+$/.test(normalized)\n}\n\nexport interface UseNicknameResolveOptions {\n enabled?: boolean\n chainId: number\n}\n\n/**\n * Hook to resolve a nickname to a wallet address with verification\n *\n * - Debounces API calls by 300ms\n * - Only resolves when input looks like a nickname\n * - Verifies fingerprint locally before returning data (MANDATORY)\n * - Returns resolved address when found and verified\n *\n * @param input - The recipient input (can be address or nickname)\n * @param options - Resolution options including chainId (required) and enabled flag\n * @returns Resolution data, loading states, error state, verification status, resolved address\n */\nexport function useNicknameResolve(\n input: string,\n options: UseNicknameResolveOptions\n): UseNicknameResolveResult {\n const { enabled = true, chainId } = options\n const [debouncedInput, setDebouncedInput] = useState('')\n const [isDebouncing, setIsDebouncing] = useState(false)\n\n // Normalize and check if input looks like a nickname\n const normalized = normalizeNickname(input)\n const isNicknameInput = looksLikeNickname(input) && normalized.length >= 3\n\n // Debounce the input\n useEffect(() => {\n if (!isNicknameInput || !enabled) {\n setDebouncedInput('')\n setIsDebouncing(false)\n return\n }\n\n setIsDebouncing(true)\n const timer = setTimeout(() => {\n setDebouncedInput(normalized)\n setIsDebouncing(false)\n }, DEBOUNCE_MS)\n\n return () => {\n clearTimeout(timer)\n }\n }, [normalized, isNicknameInput, enabled])\n\n // Query for resolution\n const query = useQuery({\n queryKey: [...QUERY_KEYS.nicknameResolve(debouncedInput), chainId],\n queryFn: () => resolveNickname(debouncedInput, chainId),\n enabled: enabled && isNicknameInput && debouncedInput.length > 0,\n staleTime: 1000 * 60 * 5, // 5 minutes - addresses don't change often\n retry: 1\n })\n\n // Check if error is \"not found\"\n const isNotFound = query.isError && (query.error as any)?.code === 'NICKNAME_NOT_FOUND'\n\n // Check if wallet not set up (user exists but resolvedTarget is null)\n const isWalletNotSetup = !!query.data && query.data.resolvedTarget === null\n\n // Check if handle is frozen\n const isFrozen = query.data?.isFrozen ?? false\n\n // Verify fingerprint locally (MANDATORY per FRD spec)\n const fingerprintVerification = useMemo<FingerprintVerificationResult | null>(() => {\n if (!query.data?.owner || !query.data?.fingerprint) {\n return null\n }\n return verifyFingerprintDetailed(query.data.owner, query.data.fingerprint)\n }, [query.data?.owner, query.data?.fingerprint])\n\n const isFingerprintVerified = fingerprintVerification?.isValid ?? false\n\n // Get resolved address from resolvedTarget\n const resolvedAddress = query.data?.resolvedTarget?.wallet || null\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isResolving: isDebouncing || query.isFetching,\n isError: query.isError,\n isNotFound,\n isWalletNotSetup,\n isFrozen,\n isFingerprintVerified,\n fingerprintVerification,\n error: query.error,\n resolvedAddress\n }\n}\n\nexport { looksLikeNickname }\n","import { useCallback, useState } from 'react'\nimport { encodeFunctionData, isAddress, parseEther, parseUnits } from 'viem'\n\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext'\nimport { sendUserOperation } from '../internal/clients/account'\nimport type { AssetType } from '../modules/assets'\n\n// ABI for ERC20 transfer\nconst ERC20_TRANSFER_ABI = [\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' }\n ],\n outputs: [{ name: '', type: 'bool' }]\n }\n] as const\n\n// ABI for ERC721 safeTransferFrom\nconst ERC721_SAFE_TRANSFER_ABI = [\n {\n type: 'function',\n name: 'safeTransferFrom',\n inputs: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'tokenId', type: 'uint256' }\n ],\n outputs: []\n }\n] as const\n\n// ABI for ERC1155 safeTransferFrom\nconst ERC1155_SAFE_TRANSFER_ABI = [\n {\n type: 'function',\n name: 'safeTransferFrom',\n inputs: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'id', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'data', type: 'bytes' }\n ],\n outputs: []\n }\n] as const\n\nexport interface SendTransactionParams {\n to: `0x${string}`\n value: string\n data?: `0x${string}`\n // Extended fields for token transfers\n assetType?: AssetType\n tokenAddress?: `0x${string}`\n tokenId?: string\n decimals?: number\n}\n\nexport interface UseSendTransactionReturn {\n sendTransaction: (params: SendTransactionParams) => Promise<string | null>\n isLoading: boolean\n error: string | null\n userOpHash: string | null\n reset: () => void\n}\n\nexport function useSendTransaction(): UseSendTransactionReturn {\n const session = useLumiaPassportSession((st) => st.session)\n const address = useLumiaPassportSession((st) => st.address)\n\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [userOpHash, setUserOpHash] = useState<string | null>(null)\n\n const sendTransaction = useCallback(\n async (params: SendTransactionParams): Promise<string | null> => {\n if (!session || !address) {\n setError('No active session')\n return null\n }\n\n // Validate recipient address\n if (!isAddress(params.to)) {\n setError('Invalid recipient address')\n return null\n }\n\n const assetType = params.assetType || 'native'\n\n // Validate amount for fungible tokens\n if (assetType !== 'erc721') {\n const value = parseFloat(params.value)\n if (isNaN(value) || value < 0) {\n setError('Invalid amount')\n return null\n }\n }\n\n // Validate token address for non-native transfers\n if (assetType !== 'native' && !params.tokenAddress) {\n setError('Token address is required for token transfers')\n return null\n }\n\n // Validate tokenId for NFT transfers\n if ((assetType === 'erc721' || assetType === 'erc1155') && !params.tokenId) {\n setError('Token ID is required for NFT transfers')\n return null\n }\n\n setIsLoading(true)\n setError(null)\n setUserOpHash(null)\n\n try {\n let callTarget: `0x${string}`\n let valueWei: string\n let innerData: `0x${string}`\n\n switch (assetType) {\n case 'native': {\n // Native token transfer: send value directly to recipient\n callTarget = params.to\n valueWei = parseEther(params.value).toString()\n innerData = (params.data || '0x') as `0x${string}`\n break\n }\n\n case 'erc20':\n case 'erc3643': {\n // ERC20/ERC3643 transfer: call transfer(to, amount) on token contract\n const decimals = params.decimals ?? 18\n const amount = parseUnits(params.value, decimals)\n\n callTarget = params.tokenAddress!\n valueWei = '0'\n innerData = encodeFunctionData({\n abi: ERC20_TRANSFER_ABI,\n functionName: 'transfer',\n args: [params.to, amount]\n })\n break\n }\n\n case 'erc721': {\n // ERC721 transfer: call safeTransferFrom(from, to, tokenId) on token contract\n callTarget = params.tokenAddress!\n valueWei = '0'\n innerData = encodeFunctionData({\n abi: ERC721_SAFE_TRANSFER_ABI,\n functionName: 'safeTransferFrom',\n args: [address as `0x${string}`, params.to, BigInt(params.tokenId!)]\n })\n break\n }\n\n case 'erc1155': {\n // ERC1155 transfer: call safeTransferFrom(from, to, id, amount, data) on token contract\n const amount = params.value ? BigInt(params.value) : 1n\n\n callTarget = params.tokenAddress!\n valueWei = '0'\n innerData = encodeFunctionData({\n abi: ERC1155_SAFE_TRANSFER_ABI,\n functionName: 'safeTransferFrom',\n args: [address as `0x${string}`, params.to, BigInt(params.tokenId!), amount, '0x']\n })\n break\n }\n\n default: {\n setError(`Unsupported asset type: ${assetType}`)\n return null\n }\n }\n\n // Send the transaction\n const hash = await sendUserOperation(\n session,\n {\n to: callTarget,\n value: valueWei,\n data: innerData,\n feeType: 'standard'\n }\n )\n\n setUserOpHash(hash)\n return hash\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Transaction failed'\n setError(errorMessage)\n return null\n } finally {\n setIsLoading(false)\n }\n },\n [session, address]\n )\n\n const reset = useCallback(() => {\n setError(null)\n setUserOpHash(null)\n setIsLoading(false)\n }, [])\n\n return {\n sendTransaction,\n isLoading,\n error,\n userOpHash,\n reset\n }\n}\n","import { formatUnits } from 'viem'\n\nimport type { Asset } from '../../../modules/assets'\n\n// Helper functions\nexport function isNftAsset(asset: Asset | null): boolean {\n if (!asset) return false\n return asset.type === 'erc721' || asset.type === 'erc1155'\n}\n\nexport function isSecurityToken(asset: Asset | null): boolean {\n if (!asset) return false\n return asset.type === 'erc3643'\n}\n\nexport function getAssetBalance(asset: Asset | null): number {\n if (!asset) return 0\n if (isNftAsset(asset)) return 1\n return Number(formatUnits(BigInt(asset.balance || '0'), asset.decimals || 18))\n}\n\nexport function isBalance(asset: Asset | null): boolean {\n return asset?.balance && BigInt(asset.balance || 0) > 0n\n}\n","import { TOKENS_ICONS } from '@/src/internal/assets/tokens'\nimport type { Asset } from '@/src/modules/assets'\nimport { Coins, Image as ImageIcon, ShieldCheck, Sparkles } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\nimport { isNftAsset, isSecurityToken } from '../utils'\n//\nimport fallbackAssetImage from './fallbackAssetImage.svg'\n\ninterface AssetInputIconProps {\n asset: Asset\n size?: 'small' | 'large'\n}\n\nexport function AssetInputIcon({ asset, size = 'small' }: AssetInputIconProps) {\n const iconSizeClass = size === 'small' ? 'w-6 h-6' : 'w-12 h-12'\n const subiconSizeClass = size === 'small' ? 'w-4 h-4' : 'w-5 h-5'\n\n if (!asset) return <Coins className={iconSizeClass} />\n\n const isNft = isNftAsset(asset)\n\n if (isNft) {\n return asset.image || asset.nftMetadata?.image ? (\n <div className={cn(iconSizeClass, 'flex-none relative')}>\n <img\n src={asset.image || asset.nftMetadata?.image}\n alt={asset.nftMetadata?.name || asset.name}\n className=\"w-full h-full rounded-[var(--l-pass-el-bdrs)] object-cover\"\n draggable={false}\n onError={(e) => {\n e.currentTarget.onerror = null\n e.currentTarget.src = fallbackAssetImage\n }}\n />\n <Sparkles className={cn(subiconSizeClass, 'absolute -top-1 -right-1')} />\n </div>\n ) : (\n <div className={cn(iconSizeClass, 'relative flex-none')}>\n <ImageIcon className={cn(iconSizeClass, 'flex-none')} />\n <Sparkles className={cn(subiconSizeClass, 'absolute -top-1 -right-1 text-[var(--l-pass-bg-success)]')} />\n </div>\n )\n }\n\n const isSecurity = isSecurityToken(asset)\n\n const CommonAssetIcon = TOKENS_ICONS[asset.symbol] || null\n\n const targetAssetIcon = !!asset.logo ? (\n <img\n src={asset.logo}\n alt={asset.symbol}\n className=\"w-full h-full rounded-full object-contain\"\n onError={(e) => {\n e.currentTarget.onerror = null\n e.currentTarget.src = fallbackAssetImage\n }}\n />\n ) : (\n <span className=\"text-[var(--l-pass-fg-inverted)] font-bold text-xs\">{asset.symbol.charAt(0)}</span>\n )\n\n return (\n <div\n className={cn(iconSizeClass, 'flex-none', {\n 'relative': isSecurity,\n 'flex items-center justify-center bg-[var(--l-pass-fg)] rounded-full': !asset.logo\n })}\n >\n {!!CommonAssetIcon ? <CommonAssetIcon className={iconSizeClass} /> : targetAssetIcon}\n\n {isSecurity && (\n <ShieldCheck\n style={{ fill: 'var(--l-pass-bg-warning)' }}\n className={cn(subiconSizeClass, 'absolute -top-1 -right-1 text-[var(--l-pass-bg-error)]')}\n />\n )}\n </div>\n )\n}\n","import { Image as ImageIcon, Sparkles } from 'lucide-react'\nimport { useState } from 'react'\n\nimport type { Asset } from '../../../../modules/assets'\n\nexport function NftDisplayCard({ asset }: { asset: Asset }) {\n const [imageError, setImageError] = useState(false)\n const nftImage = asset.image || asset.nftMetadata?.image\n\n return (\n <div className=\"flex items-center gap-3 p-3 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-secondary)]\">\n {nftImage && !imageError ? (\n <img\n src={nftImage}\n alt={asset.nftMetadata?.name || asset.name}\n className=\"w-16 h-16 rounded-[var(--l-pass-el-bdrs)] object-cover\"\n onError={() => setImageError(true)}\n />\n ) : (\n <div className=\"w-16 h-16 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-fg)] flex items-center justify-center\">\n <ImageIcon className=\"w-8 h-8 text-[var(--l-pass-fg-inverted)]\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-semibold text-[var(--l-pass-fg)] truncate\">{asset.nftMetadata?.name || asset.name}</div>\n <div className=\"text-sm text-[var(--l-pass-fg-muted)]\">\n {asset.symbol}\n {asset.tokenId && (\n <span className=\"ml-1\">\n #{asset.tokenId.length > 8 ? `${asset.tokenId.slice(0, 6)}...` : asset.tokenId}\n </span>\n )}\n </div>\n <div className=\"text-xs text-[var(--l-pass-fg-muted)] mt-1 flex items-center gap-1\">\n <Sparkles className=\"w-3 h-3\" />\n <span>{asset.type === 'erc721' ? 'ERC-721' : 'ERC-1155'}</span>\n </div>\n </div>\n </div>\n )\n}\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nimport type { Asset } from '../../../modules/assets'\n\ntype SendStep = 'input' | 'confirm' | 'pending' | 'success' | 'select-asset'\n\ninterface SendStore {\n recipient: string\n //\n amount: string\n selectedAsset: Asset | null\n //\n txStep: SendStep\n //\n sendError: string | null\n //\n setRecipient: (input: string) => void\n //\n setAmount: (input: string) => void\n setSelectedAsset: (asset: Asset) => void\n //\n setTxStep: (step: SendStep) => void\n\n setSendError: (error: string | null) => void\n //\n}\n\nexport const useSendStore = create<SendStore>((set) => ({\n recipient: '',\n //\n amount: '',\n selectedAsset: null,\n //\n txStep: 'input',\n //\n sendError: null,\n //\n setRecipient: (input: string) => set({ recipient: input, sendError: null }),\n //\n setAmount: (input: string) => set({ amount: input, sendError: null }),\n setSelectedAsset: (asset: Asset) => set({ selectedAsset: asset, sendError: null }),\n //\n setTxStep: (step) => set({ txStep: step, sendError: null }),\n //\n setSendError: (error: string | null) => set({ sendError: error })\n //\n}))\n// export const useSendStore = create<SendStore>()(\n// // persisted selected asset between sessions\n// persist(\n// (set) => ({\n// recipient: '',\n// //\n// amount: '',\n// selectedAsset: null,\n// //\n// txStep: 'input',\n// //\n// sendError: null,\n// //\n// setRecipient: (input: string) => set({ recipient: input, sendError: null }),\n// //\n// setAmount: (input: string) => set({ amount: input, sendError: null }),\n// setSelectedAsset: (asset: Asset) => set({ selectedAsset: asset, sendError: null }),\n// //\n// setTxStep: (step) => set({ txStep: step, sendError: null }),\n// //\n// setSendError: (error: string | null) => set({ sendError: error })\n// //\n// }),\n// {\n// name: 'send-store-selected-asset',\n// partialize: (state) => ({ selectedAsset: state.selectedAsset })\n// }\n// )\n// )\n","import type { Asset } from '@/src/modules/assets'\nimport { formatUnits } from 'viem'\n\nimport { formatPrice } from '../../../lib/priceFormatter'\nimport { cn } from '../../../lib/utils'\nimport { BALANCE_PREFIXES } from '../../BalanceView'\nimport { useSendStore } from '../useSendStore'\nimport { isNftAsset } from '../utils'\nimport { AssetInputIcon } from './AssetInputIcon'\n\nfunction getAssetBalance(asset: Asset) {\n if (isNftAsset(asset)) return '1'\n const balance = Number(formatUnits(BigInt(asset?.balance || '0'), asset?.decimals || 18))\n return formatPrice(balance)\n}\n\ninterface AssetListItemProps {\n asset: Asset\n}\n\nfunction AssetListItem(props: AssetListItemProps) {\n const { asset } = props\n\n const selectedAsset = useSendStore((st) => st.selectedAsset)\n const setAmount = useSendStore((st) => st.setAmount)\n const setTxStep = useSendStore((st) => st.setTxStep)\n const setSelectedAsset = useSendStore((st) => st.setSelectedAsset)\n\n const isNft = isNftAsset(asset)\n const isSelected = selectedAsset?.address === asset.address && selectedAsset?.tokenId === asset.tokenId\n\n return (\n <button\n type=\"button\"\n onClick={() => {\n setAmount('')\n setSelectedAsset(asset)\n setTxStep('input')\n }}\n className={cn(\n 'w-full flex items-center p-2 gap-[var(--l-pass-gap)] rounded-[var(--l-pass-el-bdrs)]',\n 'hover:bg-[var(--l-pass-secondary)] transition-colors cursor-pointer',\n isSelected && 'bg-[var(--l-pass-secondary)]'\n )}\n >\n <AssetInputIcon asset={asset} size=\"large\" />\n\n <div className=\"flex-1 flex flex-col items-start\">\n <div className=\"text-[10px] truncate leading-4\">\n {isNft ? asset.nftMetadata?.name || asset.name : asset.name}\n </div>\n\n <span className=\"block text-lg font-bold\">\n {isNft ? (\n <>\n {asset.symbol}\n {asset.tokenId && (\n <span className=\"ml-1\">\n #{asset.tokenId.length > 6 ? `${asset.tokenId.slice(0, 4)}...` : asset.tokenId}\n </span>\n )}\n </>\n ) : (\n <>\n {BALANCE_PREFIXES[asset.symbol] || null}\n <span>{getAssetBalance(asset)}</span> {!BALANCE_PREFIXES[asset.symbol] && <span> {asset.symbol}</span>}\n </>\n )}\n </span>\n </div>\n </button>\n )\n}\n\ninterface AssetSelectorProps {\n assets: Asset[]\n}\n\nexport function AssetList(props: AssetSelectorProps) {\n const { assets } = props\n\n // Filter assets with balance > 0 (for fungibles) or any NFT\n const transferableAssets = assets.filter((asset) => {\n if (isNftAsset(asset)) return true\n const balance = BigInt(asset.balance || '0')\n return balance > 0n\n })\n\n // Group assets by type\n const nativeAssets = transferableAssets.filter((a) => a.type === 'native')\n const tokenAssets = transferableAssets.filter((a) => a.type === 'erc20')\n const securityAssets = transferableAssets.filter((a) => a.type === 'erc3643')\n const nftAssets = transferableAssets.filter((a) => a.type === 'erc721' || a.type === 'erc1155')\n\n return (\n <>\n {nativeAssets.length > 0 && (\n <>\n <div className=\"text-[10px] text-[var(--l-pass-fg-muted)] uppercase\">Crypto</div>\n\n {nativeAssets.map((asset) => (\n <AssetListItem key={`native-${asset.symbol}`} asset={asset} />\n ))}\n </>\n )}\n\n {tokenAssets.length > 0 && (\n <>\n <div className=\"text-[10px] text-[var(--l-pass-fg-muted)] uppercase\">Tokens</div>\n\n {tokenAssets.map((asset) => (\n <AssetListItem key={`token-${asset.address}`} asset={asset} />\n ))}\n </>\n )}\n\n {securityAssets.length > 0 && (\n <>\n <div className=\"text-[10px] text-[var(--l-pass-fg-muted)] uppercase\">Security Tokens</div>\n\n {securityAssets.map((asset) => (\n <AssetListItem key={`security-${asset.address}`} asset={asset} />\n ))}\n </>\n )}\n\n {nftAssets.length > 0 && (\n <>\n <div className=\"text-[10px] text-[var(--l-pass-fg-muted)] uppercase\">NFTs</div>\n\n {nftAssets.map((asset) => (\n <AssetListItem key={`nft-${asset.address}-${asset.tokenId}`} asset={asset} />\n ))}\n </>\n )}\n\n {transferableAssets.length === 0 && (\n <div className=\"p-4 text-center text-[10px] text-[var(--l-pass-fg-muted)]\">No assets available</div>\n )}\n </>\n )\n}\n","import type { UseNicknameResolveResult } from '@/src/hooks/useNicknameResolve'\nimport { AlertCircle, AlertTriangle, AtSign, CheckCircle2, ShieldAlert, ShieldCheck } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\nimport { Highlight } from '../../ui/highlight'\nimport fallbackAssetImage from './fallbackAssetImage.svg'\n\ninterface NicknameDataProps {\n resolvedNicknameData: UseNicknameResolveResult\n isNicknameInput?: boolean\n}\n\nexport function NicknameData(props: NicknameDataProps) {\n const { resolvedNicknameData, isNicknameInput } = props\n\n const {\n resolvedAddress,\n isResolving,\n isNotFound,\n isWalletNotSetup,\n isFrozen,\n isFingerprintVerified,\n data: nicknameData\n } = resolvedNicknameData\n\n if (!isNicknameInput) return null\n\n /* Show resolved nickname data */\n if (resolvedAddress && !isResolving && nicknameData)\n return (\n <div className=\"flex items-center gap-[var(--l-pass-gap)] rounded-[var(--l-pass-el-bdrs)] px-[var(--l-pass-gap)]\">\n {/* Avatar */}\n {nicknameData.avatarSvg ? (\n <img\n src={nicknameData.avatarSvg}\n alt={nicknameData.handle}\n className=\"w-12 h-12 rounded-full object-cover flex-shrink-0\"\n onError={(e) => {\n e.currentTarget.onerror = null\n e.currentTarget.src = fallbackAssetImage\n }}\n />\n ) : (\n <div className=\"w-12 h-12 rounded-full bg-[var(--l-pass-secondary)] flex items-center justify-center flex-shrink-0\">\n <AtSign className=\"w-5 h-5\" />\n </div>\n )}\n\n <div className=\"flex flex-col gap-1\">\n {/* Address */}\n <div className=\"flex items-center gap-[var(--l-pass-gap)] text-[10px] text-[var(--l-pass-bg-success)]\">\n <CheckCircle2 className=\"w-4 h-4 flex-shrink-0\" />\n <span>{nicknameData.handle}</span>\n </div>\n\n {/* Fingerprint with verification status */}\n {nicknameData.fingerprint && (\n <div\n className={cn(\n 'flex items-center gap-[var(--l-pass-gap)] text-[10px]',\n isFingerprintVerified ? 'text-[var(--l-pass-bg-success)]' : 'text-[var(--l-pass-bg-error)]'\n )}\n >\n {isFingerprintVerified ? (\n <ShieldCheck className=\"w-4 h-4 flex-shrink-0\" />\n ) : (\n <ShieldAlert className=\"w-4 h-4 flex-shrink-0\" />\n )}\n <span>{`${resolvedAddress.slice(0, 6)}...${resolvedAddress.slice(-4)} : `}</span>\n {/* Fingerprint: <span>Fingerprint: {nicknameData.fingerprint}</span> */}\n <span>{isFingerprintVerified ? 'Verified' : 'FAILED'}</span>\n </div>\n )}\n </div>\n </div>\n )\n\n /* Show frozen handle warning */\n if (isFrozen && !isResolving) {\n return (\n <Highlight type=\"warning\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertTriangle className=\"w-4 h-4\" />\n <span>This handle is frozen. Proceed with caution.</span>\n </Highlight>\n )\n }\n\n /* Show wallet not setup */\n if (isWalletNotSetup && !isResolving) {\n return (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"w-4 h-4\" />\n <span>This user has not set up wallet yet</span>\n </Highlight>\n )\n }\n\n /* Show nickname not found */\n if (isNotFound && !isResolving) {\n return (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"w-4 h-4\" />\n <span>Nickname not found</span>\n </Highlight>\n )\n }\n}\n","export { AssetInputIcon } from './AssetInputIcon'\nexport { NftDisplayCard } from './NftDisplayCard'\nexport { AssetList } from './AssetList'\nexport { NicknameData } from './NicknameData'\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport type { UseErc3643ComplianceResult } from '@/src/hooks/useErc3643Compliance'\nimport type { UseNicknameResolveResult } from '@/src/hooks/useNicknameResolve'\nimport { useT } from '@/src/i18n/useT'\nimport { AlertCircle, AtSign, CheckCircle2, Loader, Wallet2 } from 'lucide-react'\nimport { formatUnits, isAddress } from 'viem'\n\nimport { formatPrice } from '../../../lib/priceFormatter'\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport { Input } from '../../ui/input'\nimport { AssetInputIcon, NftDisplayCard, NicknameData } from '../components'\nimport { useSendStore } from '../useSendStore'\nimport { getAssetBalance, isNftAsset, isSecurityToken } from '../utils'\n\ninterface InputSendStepProps {\n erc3643Compliance?: UseErc3643ComplianceResult\n //\n isNicknameInput?: boolean\n resolvedNicknameData?: UseNicknameResolveResult\n //\n isTransactionPending?: boolean\n isAssetsLoading?: boolean\n}\n\nexport function InputSendStep(props: InputSendStepProps): React.JSX.Element {\n const { erc3643Compliance, isNicknameInput, resolvedNicknameData, isTransactionPending, isAssetsLoading } = props\n\n const address = useLumiaPassportSession((st) => st.address)\n const { t } = useT()\n\n const {\n resolvedAddress,\n isResolving,\n isNotFound,\n isWalletNotSetup,\n // isFrozen,\n isFingerprintVerified,\n data: nicknameData\n } = resolvedNicknameData || {}\n\n const { recipient, selectedAsset, amount, setAmount, setRecipient, setSendError, setTxStep } = useSendStore()\n\n // Get selected asset balance\n const balance = getAssetBalance(selectedAsset)\n const isNft = isNftAsset(selectedAsset)\n const isSecurity = isSecurityToken(selectedAsset)\n\n // Determine the effective address to use (either direct input or resolved from nickname)\n const effectiveAddress = isNicknameInput ? resolvedAddress : recipient\n\n // ERC3643 compliance check\n const {\n canTransfer: erc3643CanTransfer,\n isLoading: isComplianceLoading,\n error: complianceError\n } = erc3643Compliance || {}\n\n const handleMaxAmount = () => {\n if (!selectedAsset || isNft) return\n\n if (selectedAsset.type === 'native') {\n // Leave some for gas\n const maxAmount = Math.max(0, balance - 0.001)\n setAmount(maxAmount.toFixed(6))\n } else {\n // For tokens, use full balance\n setAmount(formatUnits(BigInt(selectedAsset.balance || '0'), selectedAsset.decimals || 18))\n }\n }\n\n const validateInput = (): boolean => {\n // Validate recipient\n if (!recipient) {\n setSendError('Please enter a recipient address or @nickname')\n return false\n }\n\n // If resolving nickname, wait for it\n if (isNicknameInput && isResolving) {\n setSendError('Resolving nickname...')\n return false\n }\n\n // If nickname not found\n if (isNicknameInput && isNotFound) {\n setSendError('Nickname not found')\n return false\n }\n\n // If user exists but wallet not set up\n if (isNicknameInput && isWalletNotSetup) {\n setSendError('This user has not set up their wallet yet')\n return false\n }\n\n // CRITICAL: Block transaction if fingerprint verification failed\n if (isNicknameInput && nicknameData?.owner && nicknameData?.fingerprint && !isFingerprintVerified) {\n setSendError('Fingerprint verification failed - possible security issue')\n return false\n }\n\n // Use effectiveAddress for validation (resolved address or direct input)\n const addressToValidate = effectiveAddress\n\n if (!addressToValidate) {\n setSendError(isNicknameInput ? 'Could not resolve nickname' : 'Please enter a recipient address')\n return false\n }\n\n if (!isAddress(addressToValidate)) {\n setSendError('Invalid recipient address')\n return false\n }\n\n if (addressToValidate.toLowerCase() === address?.toLowerCase()) {\n setSendError('Cannot send to yourself')\n return false\n }\n\n // Validate asset selection\n if (!selectedAsset) {\n setSendError('Please select an asset to send')\n return false\n }\n\n // Validate amount (skip for NFTs as they always send 1)\n if (!isNft) {\n const amountNum = parseFloat(amount)\n if (!amount || isNaN(amountNum) || amountNum <= 0) {\n setSendError('Please enter a valid amount')\n return false\n }\n\n if (amountNum > balance) {\n setSendError('Insufficient balance')\n return false\n }\n }\n\n // ERC3643 compliance check\n if (isSecurity) {\n if (isComplianceLoading) {\n setSendError('Checking compliance...')\n return false\n }\n if (complianceError) {\n setSendError(complianceError)\n return false\n }\n if (erc3643CanTransfer === false) {\n setSendError('Transfer not allowed by token compliance rules')\n return false\n }\n }\n\n setSendError(null)\n return true\n }\n\n return (\n <>\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:sendMenu.selectAsset')}</span>\n\n <Button variant=\"outline\" size=\"large\" onClick={() => setTxStep('select-asset')} className=\"justify-between\">\n {selectedAsset ? (\n <span className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <AssetInputIcon asset={selectedAsset} />\n <span>\n {(isNft ? selectedAsset.nftMetadata?.name || selectedAsset.symbol : selectedAsset.name).toUpperCase()}\n </span>\n </span>\n ) : (\n <span className=\"text-[var(--l-pass-fg-muted)]\">No Asset Selected</span>\n )}\n\n {isAssetsLoading && <Loader className=\"w-4 h-4 animate-spin\" />}\n </Button>\n\n <span className=\"block text-[10px] text-[var(--l-pass-fg-muted)]\">{t('passport:sendMenu.recipient')}</span>\n\n <Input\n Icon={isNicknameInput ? AtSign : Wallet2}\n type=\"text\"\n value={recipient}\n onChange={(e) => setRecipient(e.target.value)}\n placeholder=\"0x... or @nickname\"\n element={\n isNicknameInput && isResolving ? (\n <Loader className=\"w-4 h-4 animate-spin text-[var(--l-pass-fg-muted)]\" />\n ) : null\n }\n />\n\n <NicknameData resolvedNicknameData={resolvedNicknameData} isNicknameInput={isNicknameInput} />\n\n <div className=\"flex justify-between items-center text-[10px] text-[var(--l-pass-fg-muted)]\">\n <span className=\"block \">{isNft ? t('passport:common.asset') : t('passport:common.amount')}</span>\n\n {!isNft && selectedAsset && (\n <span className=\"block text-[10px]\">\n {t('passport:common.balance')}{' '}\n <span className=\"text-[var(--l-pass-fg)] font-semibold\">\n {formatPrice(balance)} {selectedAsset.symbol}\n </span>\n </span>\n )}\n </div>\n\n {/* NFT display card */}\n {isNft && selectedAsset && <NftDisplayCard asset={selectedAsset} />}\n\n {/* Fungible token amount input */}\n {!isNft && (\n <Input\n type=\"number\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"0.0\"\n step=\"0.000001\"\n Icon={() => <AssetInputIcon asset={selectedAsset} />}\n element={\n <Button onClick={handleMaxAmount} variant=\"ghost\" size=\"medium\" className=\"px-2\">\n {'MAX'}\n </Button>\n }\n />\n )}\n\n {/* ERC3643 compliance status */}\n {isSecurity && effectiveAddress && amount && (\n <Highlight\n type={isComplianceLoading ? 'info' : erc3643CanTransfer ? 'success' : 'error'}\n className=\"flex gap-[var(--l-pass-gap)]\"\n >\n {isComplianceLoading ? (\n <>\n <Loader className=\"h-4 w-4 animate-spin\" />\n <span>Checking compliance...</span>\n </>\n ) : erc3643CanTransfer ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>Transfer compliant</span>\n </>\n ) : (\n <>\n <AlertCircle className=\"h-4 w-4\" />\n <span>{complianceError || 'Transfer not allowed'}</span>\n </>\n )}\n </Highlight>\n )}\n\n <div className=\"w-full py-[var(--l-pass-pd)]\">\n <Button\n size=\"large\"\n className=\"w-full uppercase font-semibold\"\n disabled={isTransactionPending || isComplianceLoading || !selectedAsset || !recipient || (!isNft && !amount)}\n onClick={() => {\n if (!validateInput()) return\n setTxStep('confirm')\n }}\n >\n {t('passport:common.continue')}\n </Button>\n </div>\n </>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport type { UseErc3643ComplianceResult } from '@/src/hooks/useErc3643Compliance'\nimport type { UseNicknameResolveResult } from '@/src/hooks/useNicknameResolve'\nimport type { UseSendTransactionReturn } from '@/src/hooks/useSendTransaction'\nimport { AlertTriangle, AtSign, Loader, Shield, ShieldAlert, ShieldCheck } from 'lucide-react'\n\nimport { formatPrice } from '../../../lib/priceFormatter'\nimport { cn } from '../../../lib/utils'\nimport { Button } from '../../ui/button'\nimport { Highlight } from '../../ui/highlight'\nimport { useSendStore } from '../useSendStore'\nimport { getAssetBalance, isNftAsset, isSecurityToken } from '../utils'\n\ninterface ConfirmSendStepProps {\n sendTransaction: UseSendTransactionReturn['sendTransaction']\n refreshBalances: () => Promise<void>\n\n erc3643Compliance?: UseErc3643ComplianceResult\n //\n isNicknameInput?: boolean\n resolvedNicknameData?: UseNicknameResolveResult\n //\n isTransactionPending?: boolean\n}\n\nexport function ConfirmSendStep(props: ConfirmSendStepProps) {\n const {\n sendTransaction,\n refreshBalances,\n erc3643Compliance,\n isNicknameInput,\n resolvedNicknameData,\n isTransactionPending\n } = props\n\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n\n const { resolvedAddress, isFrozen, isFingerprintVerified, data: nicknameData } = resolvedNicknameData || {}\n const { canTransfer: erc3643CanTransfer } = erc3643Compliance || {}\n\n const { recipient, selectedAsset, amount, setTxStep } = useSendStore()\n\n // Get selected asset balance\n const balance = getAssetBalance(selectedAsset)\n const isNft = isNftAsset(selectedAsset)\n const isSecurity = isSecurityToken(selectedAsset)\n\n // Determine the effective address to use (either direct input or resolved from nickname)\n const effectiveAddress = isNicknameInput ? resolvedAddress : recipient\n\n const handleConfirm = async () => {\n if (!effectiveAddress || !selectedAsset) return\n\n setTxStep('pending')\n\n const txAmount = isNft ? '1' : amount\n\n const hash = await sendTransaction({\n to: effectiveAddress as `0x${string}`,\n value: txAmount,\n assetType: selectedAsset.type,\n tokenAddress: selectedAsset.address,\n tokenId: selectedAsset.tokenId,\n decimals: selectedAsset.decimals\n })\n\n if (hash) {\n setTxStep('success')\n // Refresh balances after successful transaction\n setTimeout(() => refreshBalances(), 3000)\n } else {\n setTxStep('input')\n }\n }\n\n return (\n <>\n {/* Frozen handle warning banner */}\n {isNicknameInput && isFrozen && (\n <Highlight type=\"warning\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertTriangle className=\"h-4 w-4\" />\n <span>This handle is frozen. Proceed with caution.</span>\n </Highlight>\n )}\n\n {/* ERC3643 compliance verified */}\n {isSecurity && erc3643CanTransfer && (\n <Highlight type=\"success\" className=\"flex gap-[var(--l-pass-gap)]\">\n <Shield className=\"h-4 w-4 flex-shrink-0\" />\n <span>Security token compliance verified</span>\n </Highlight>\n )}\n\n {!isNft && (\n <div className=\"flex justify-between leading-5\">\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">{selectedAsset.symbol} Balance</span>\n <span className=\"text-sm font-bold\">\n {formatPrice(balance)} {selectedAsset.symbol}\n </span>\n </div>\n )}\n\n {/* Recipient Confirmation Card */}\n <Highlight type=\"info\" className=\"flex flex-col gap-[var(--l-pass-gap)]\">\n {isNicknameInput && nicknameData ? (\n <>\n {/* Nickname recipient with avatar and fingerprint */}\n <div className=\"flex items-start gap-[var(--l-pass-gap)]\">\n {/* Avatar */}\n {nicknameData.avatarSvg ? (\n <img\n src={nicknameData.avatarSvg}\n alt={nicknameData.handle}\n className=\"w-12 h-12 rounded-full object-cover flex-shrink-0\"\n />\n ) : (\n <div className=\"w-12 h-12 rounded-full bg-[var(--l-pass-secondary)] flex items-center justify-center flex-shrink-0\">\n <AtSign className=\"w-6 h-6\" />\n </div>\n )}\n\n <div className=\"flex flex-1 flex-col gap-1\">\n {/* Handle */}\n <span className=\"font-medium text-[14px] leading-4 truncate\">{nicknameData.handle}</span>\n\n {/* Fingerprint with verification status */}\n {nicknameData.fingerprint && (\n <span\n className={cn(\n 'flex items-center gap-[var(--l-pass-gap)] text-[10px]',\n isFingerprintVerified ? 'text-[var(--l-pass-bg-success)]' : 'text-[var(--l-pass-bg-error)]'\n )}\n >\n {isFingerprintVerified ? (\n <ShieldCheck className=\"w-4 h-4 flex-shrink-0\" />\n ) : (\n <ShieldAlert className=\"w-4 h-4 flex-shrink-0\" />\n )}\n <span>Fingerprint: {nicknameData.fingerprint}</span>\n <span>{isFingerprintVerified ? 'Verified' : 'FAILED'}</span>\n </span>\n )}\n\n {/* Partial address */}\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">{`${resolvedAddress.slice(0, 6)}...${resolvedAddress.slice(-4)} : `}</span>\n </div>\n </div>\n\n <div className=\"border-t border-[var(--l-pass-bd)] py-[var(--l-pass-pd)] text-[10px]\">\n {/* NFT details */}\n {isNft ? (\n <div className=\"flex justify-between items-start\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'NFT:'}</span>\n\n <div className=\"text-right\">\n <span className=\"font-semibold block\">{selectedAsset.nftMetadata?.name || selectedAsset.name}</span>\n\n {selectedAsset.tokenId && (\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">\n #\n {selectedAsset.tokenId.length > 10\n ? `${selectedAsset.tokenId.slice(0, 8)}...`\n : selectedAsset.tokenId}\n </span>\n )}\n </div>\n </div>\n ) : (\n // Fungible token details\n <div className=\"flex justify-between leading-5 gap-[var(--l-pass-gap)]\">\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">{'Amount:'}</span>\n <span className=\"text-sm font-bold\">\n {amount} {selectedAsset.symbol}\n </span>\n </div>\n )}\n\n <div className=\"flex justify-between leading-5 gap-[var(--l-pass-gap)]\">\n <span className=\"text-[10px] text-[var(--l-pass-fg-muted)]\">{'Network:'}</span>\n <span className=\"text-sm font-bold\">{chainConfig.name}</span>\n </div>\n </div>\n </>\n ) : (\n <>\n {/* Regular address recipient */}\n <h3 className=\"font-medium mb-3 text-[var(--l-pass-fg)]\">{'Transaction Details'}</h3>\n\n <div className=\"space-y-2 text-sm text-[var(--l-pass-fg)]\">\n <div className=\"flex justify-between\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">To:</span>\n <span className=\"font-mono text-xs\">\n {`${effectiveAddress.slice(0, 6)}...${effectiveAddress.slice(-4)}`}\n </span>\n </div>\n\n {isNft ? (\n // NFT details\n <>\n <div className=\"flex justify-between items-start\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'NFT:'}</span>\n <div className=\"text-right\">\n <span className=\"font-semibold block\">\n {selectedAsset.nftMetadata?.name || selectedAsset.name}\n </span>\n\n {selectedAsset.tokenId && (\n <span className=\"text-xs text-[var(--l-pass-fg-muted)]\">\n #\n {selectedAsset.tokenId.length > 10\n ? `${selectedAsset.tokenId.slice(0, 8)}...`\n : selectedAsset.tokenId}\n </span>\n )}\n </div>\n </div>\n </>\n ) : (\n // Fungible token details\n <div className=\"flex justify-between leading-5 gap-[var(--l-pass-gap)]\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'Amount:'}</span>\n <span className=\"font-semibold\">\n {amount} {selectedAsset.symbol}\n </span>\n </div>\n )}\n\n <div className=\"flex justify-between leading-5 gap-[var(--l-pass-gap)]\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">{'Network:'}</span>\n <span>{chainConfig.name}</span>\n </div>\n </div>\n </>\n )}\n </Highlight>\n\n <div className=\"w-full\">\n {/* <Button onClick={() => setTxStep('input')} variant=\"outline\" className=\"flex-1\" size=\"large\">\n {'Back'}\n </Button> */}\n\n <Button onClick={handleConfirm} disabled={isTransactionPending} className=\"w-full\" size=\"large\">\n {isTransactionPending && <Loader className=\"h-4 w-4 animate-spin\" />}\n {'CONFIRM'}\n </Button>\n </div>\n </>\n )\n}\n","export { InputSendStep } from './InputSendStep'\nexport { ConfirmSendStep } from './ConfirmSendStep'\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useErc3643Compliance } from '@/src/hooks/useErc3643Compliance'\nimport { looksLikeNickname, useNicknameResolve } from '@/src/hooks/useNicknameResolve'\nimport { useSendTransaction } from '@/src/hooks/useSendTransaction'\nimport { useT } from '@/src/i18n/useT'\nimport { AlertCircle, ArrowLeft, CheckCircle2, Loader } from 'lucide-react'\nimport React, { CSSProperties, useEffect, useMemo } from 'react'\nimport { parseUnits } from 'viem'\n\nimport { useBlockscoutAssets } from '../../hooks/useBlockscoutAssets'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\n//\n\nimport { AssetList } from './components'\nimport { ConfirmSendStep, InputSendStep } from './sendSteps'\nimport { useSendStore } from './useSendStore'\nimport { isBalance, isNftAsset, isSecurityToken } from './utils'\n\nexport interface SendModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onBack?: () => void\n onSuccess?: () => void\n recipientAddress?: string\n amount?: string\n}\n\nexport function SendLumiaMenu(): React.JSX.Element {\n const address = useLumiaPassportSession((st) => st.address)\n const activeChainId = useLumiaPassportSession((st) => st.activeChainId)\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const { t } = useT()\n\n // Use Blockscout assets for full asset list\n const {\n assets,\n refreshBalances,\n isLoading: isAssetsLoading\n } = useBlockscoutAssets({\n address: address as `0x${string}` | undefined\n })\n\n const {\n sendTransaction,\n isLoading: isTransactionPending,\n error: sendTransactionError,\n userOpHash,\n reset\n } = useSendTransaction()\n\n const {\n recipient,\n setRecipient,\n\n amount,\n setAmount,\n\n selectedAsset,\n setSelectedAsset,\n\n txStep,\n setTxStep,\n\n sendError,\n setSendError\n } = useSendStore()\n\n // Get selected asset balance\n // const balance = getAssetBalance(selectedAsset)\n const isNft = isNftAsset(selectedAsset)\n const isSecurity = isSecurityToken(selectedAsset)\n\n // reset store on unmount\n useEffect(\n () => () => {\n setSelectedAsset(null)\n setSendError(null)\n setRecipient('')\n setAmount('')\n reset()\n\n setTxStep('input')\n },\n []\n )\n\n // Set first chain native crypto OR token with balance as selected by default\n useEffect(() => {\n const shouldSetNativeAsset = assets.length > 0 && !selectedAsset\n\n if (!shouldSetNativeAsset) return\n\n const native = assets.find((a) => a.type === 'native')\n if (isBalance(native)) return setSelectedAsset(native)\n\n const erc20 = assets.find((a) => a.type === 'erc20')\n if (isBalance(erc20)) return setSelectedAsset(erc20)\n\n // setSelectedAsset(null)\n }, [assets, selectedAsset])\n\n // Nickname resolution with chainId and verification\n const isNicknameInput = looksLikeNickname(recipient)\n const resolvedNicknameData = useNicknameResolve(recipient, { enabled: isNicknameInput, chainId: activeChainId })\n\n // Determine the effective address to use (either direct input or resolved from nickname)\n const effectiveAddress = isNicknameInput ? resolvedNicknameData?.resolvedAddress : recipient\n\n // Calculate amount for ERC3643 compliance check\n const complianceAmount = useMemo(() => {\n if (!isSecurity || !amount || !selectedAsset) return undefined\n\n try {\n return parseUnits(amount, selectedAsset.decimals || 18)\n } catch {\n return undefined\n }\n }, [isSecurity, amount, selectedAsset])\n\n // ERC3643 compliance check\n const erc3643Compliance = useErc3643Compliance({\n tokenAddress: selectedAsset?.address,\n to: effectiveAddress as `0x${string}` | undefined,\n amount: complianceAmount,\n enabled: isSecurity && !!effectiveAddress && !!complianceAmount,\n chainId: activeChainId\n })\n\n // Get display name for the send page title\n const getPageTitle = () => {\n if (txStep === 'select-asset') return t('passport:sendMenu.selectAsset')\n if (txStep === 'confirm') return t('passport:sendMenu.confirmStep')\n if (txStep === 'pending') return t('passport:sendMenu.pendingStep')\n\n if (isNft) return t('passport:sendMenu.sendNft')\n\n if (!selectedAsset) return t('passport:common.back')\n return `${t('passport:sendMenu.title')} ${selectedAsset.name}`\n }\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {txStep !== 'pending' && (\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n onClick={() => {\n switch (txStep) {\n case 'input':\n return setPage(PageKey.MAIN_MENU)\n\n default:\n return setTxStep('input')\n }\n }}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{getPageTitle()}</span>\n </div>\n )}\n\n {txStep === 'select-asset' && <AssetList assets={assets} />}\n\n {txStep === 'input' && (\n <InputSendStep\n erc3643Compliance={erc3643Compliance}\n //\n isNicknameInput={isNicknameInput}\n resolvedNicknameData={resolvedNicknameData}\n //\n isAssetsLoading={isAssetsLoading}\n isTransactionPending={isTransactionPending}\n />\n )}\n\n {txStep === 'confirm' && effectiveAddress && selectedAsset && (\n <ConfirmSendStep\n sendTransaction={sendTransaction}\n refreshBalances={refreshBalances}\n //\n erc3643Compliance={erc3643Compliance}\n //\n isNicknameInput={isNicknameInput}\n resolvedNicknameData={resolvedNicknameData}\n //\n isTransactionPending={isTransactionPending}\n />\n )}\n\n {txStep === 'pending' && (\n <Highlight type=\"info\" className=\"flex gap-[var(--l-pass-gap)]\">\n <Loader className=\"h-4 w-4 animate-spin\" />\n\n <span className=\"flex-1\">\n <span className=\"block leading-4 font-semibold\">{t('passport:sendMenu.pendingStep')}</span>\n <span>{t('passport:sendMenu.pendingStepMsg')}</span>\n </span>\n </Highlight>\n )}\n\n {txStep === 'success' && userOpHash && (\n <>\n <Highlight type=\"success\" className=\"flex gap-[var(--l-pass-gap)]\">\n <CheckCircle2 className=\"h-4 w-4\" />\n\n <span className=\"flex-1\">\n <span className=\"block leading-4 font-semibold\">Transaction Initiated</span>\n <span>\n Your transaction is being processed and might take some time to accomplish. Visit your transaction\n history for details.\n </span>\n </span>\n </Highlight>\n\n <Button onClick={() => setPage(PageKey.TRANSACTIONS)} className=\"w-full\" size=\"large\">\n {'TRANSACTION HISTORY'}\n </Button>\n </>\n )}\n\n {(sendError || sendTransactionError) && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <AlertCircle className=\"h-4 w-4\" />\n <span className=\"text-sm\">{sendError || sendTransactionError}</span>\n </Highlight>\n )}\n </Expandable>\n </div>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { ArrowLeft, CheckCircle2, Copy, Info, Loader, Shield } from 'lucide-react'\nimport QRCode from 'qrcode'\nimport { useCallback, useEffect, useMemo, useState, type CSSProperties } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { generateFingerprint } from '../../lib/nickname-fingerprint'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\n\nexport function ReceiveLumiaMenu() {\n const session = useLumiaPassportSession((st) => st.session)\n const address = session?.smartAccountAddress ?? null\n const page = useLayoutDataStore((st) => st.page)\n const setPage = useLayoutDataStore((st) => st.setPage)\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n\n const { t } = useT()\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const open = page === 'receive'\n\n const [qrCodeUrl, setQrCodeUrl] = useState<string>('')\n const [copied, setCopied] = useState(false)\n const [fingerprintCopied, setFingerprintCopied] = useState(false)\n\n // Compute fingerprint from owner address\n const fingerprint = useMemo(() => {\n if (!session?.ownerAddress) return null\n try {\n return generateFingerprint(session.ownerAddress)\n } catch {\n return null\n }\n }, [session?.ownerAddress])\n\n useEffect(() => {\n if (open && address) {\n // Generate QR code when modal opens\n QRCode.toDataURL(address, {\n width: 200,\n margin: 1,\n color: { dark: '#000000', light: '#ffffff' }\n })\n .then((url) => {\n setQrCodeUrl(url)\n })\n .catch((err) => {\n console.error('Failed to generate QR code:', err)\n })\n }\n }, [open, address])\n\n const handleCopy = useCallback(async () => {\n if (!address) return\n\n try {\n await navigator.clipboard.writeText(address)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (error) {\n console.error('Failed to copy address:', error)\n }\n }, [address])\n\n const handleCopyFingerprint = useCallback(async () => {\n if (!fingerprint) return\n\n try {\n await navigator.clipboard.writeText(fingerprint)\n setFingerprintCopied(true)\n setTimeout(() => setFingerprintCopied(false), 2000)\n } catch (error) {\n console.error('Failed to copy fingerprint:', error)\n }\n }, [fingerprint])\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]\"\n >\n <div className=\"w-full flex items-center gap-[var(--l-pass-gap)]\">\n <Button variant=\"ghost\" size=\"icon\" title=\"Back\" onClick={() => setPage(PageKey.MAIN_MENU)}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:receiveMenu.title')}</span>\n </div>\n\n {/* Network Info */}\n <Highlight className=\"text-center\" type=\"warning\">\n <strong className=\"block w-full\">{`${t('passport:common.network')}: ${chainConfig.name}`}</strong>\n <span className=\"block w-full\">{t('passport:receiveMenu.warning')}</span>\n </Highlight>\n\n {/* QR Code */}\n <div className=\"flex items-center justify-center p-[var(--l-pass-pd)]\" style={{ minHeight: '216px' }}>\n {qrCodeUrl ? (\n <img src={qrCodeUrl} alt=\"Wallet QR Code\" className=\"w-48 h-48\" />\n ) : (\n <Loader className=\"w-4 h-4 animate-spin\" />\n )}\n </div>\n\n {/* Fingerprint Display */}\n {fingerprint && (\n <div className=\"flex items-center justify-center gap-2 p-3 rounded-[var(--l-pass-el-bdrs)] bg-[var(--l-pass-bg-secondary)]\">\n <Shield className=\"w-4 h-4 text-[var(--l-pass-bg-success)]\" />\n <span className=\"text-sm text-[var(--l-pass-fg-muted)]\">{t('passport:common.fingerprint')}</span>\n <span className=\"font-mono text-sm font-semibold text-[var(--l-pass-fg)]\">{fingerprint}</span>\n <div className=\"relative group\">\n <Info className=\"w-3.5 h-3.5 text-[var(--l-pass-fg-muted)] cursor-help\" />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 text-xs bg-[var(--l-pass-bg)] text-[var(--l-pass-fg)] rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity whitespace-nowrap pointer-events-none z-10\">\n {'Share this to verify your identity'}\n </div>\n </div>\n <button\n onClick={handleCopyFingerprint}\n className=\"p-1 rounded hover:bg-[var(--l-pass-bg)] transition-colors\"\n title=\"Copy fingerprint\"\n >\n {fingerprintCopied ? (\n <CheckCircle2 className=\"w-3.5 h-3.5 text-[var(--l-pass-bg-success)]\" />\n ) : (\n <Copy className=\"w-3.5 h-3.5 text-[var(--l-pass-fg-muted)]\" />\n )}\n </button>\n </div>\n )}\n\n {/* Address Display */}\n <Highlight type=\"info\">\n <span className=\"block w-full text-center font-mono text-[10px] break-all mb-2\">{address}</span>\n\n <Button onClick={handleCopy} className=\"w-full\" size=\"large\">\n {copied ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <Copy className=\"h-4 w-4\" />\n <span>{t('passport:receiveMenu.copyAddress')}</span>\n </>\n )}\n </Button>\n </Highlight>\n\n {/* Instructions */}\n <div className=\"text-center text-xs text-[var(--l-pass-fg-muted)]\">\n <span className=\"block\">{t('passport:receiveMenu.share')}</span>\n </div>\n </div>\n )\n}\n","export { SendLumiaMenu } from './SendLumiaMenu'\nexport { ReceiveLumiaMenu } from './ReceiveLumiaMenu'\n","export function KycIcon(props: React.SVGProps<SVGSVGElement>) {\n const { width = '24', height = '24', ...rest } = props\n\n return (\n <svg {...rest} width={width} height={height} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 18.5455C10.1727 18.5455 8.625 17.9114 7.35682 16.6432C6.08864 15.375 5.45455 13.8273 5.45455 12C5.45455 10.1727 6.08864 8.625 7.35682 7.35682C8.625 6.08864 10.1727 5.45455 12 5.45455C13.8273 5.45455 15.375 6.08864 16.6432 7.35682C17.9114 8.625 18.5455 10.1727 18.5455 12C18.5455 13.8273 17.9114 15.375 16.6432 16.6432C15.375 17.9114 13.8273 18.5455 12 18.5455ZM12 16.9091C13.3636 16.9091 14.5227 16.4318 15.4773 15.4773C16.4318 14.5227 16.9091 13.3636 16.9091 12C16.9091 11.7682 16.892 11.5398 16.858 11.3148C16.8239 11.0898 16.7727 10.8682 16.7045 10.65C16.5 10.6909 16.2955 10.7216 16.0909 10.742C15.8864 10.7625 15.6818 10.7727 15.4773 10.7727C14.6182 10.7727 13.8 10.6091 13.0227 10.2818C12.2455 9.95455 11.55 9.47727 10.9364 8.85C10.5545 9.62727 10.0295 10.3023 9.36136 10.875C8.69318 11.4477 7.93636 11.8636 7.09091 12.1227C7.13182 13.4591 7.62614 14.5909 8.57386 15.5182C9.52159 16.4455 10.6636 16.9091 12 16.9091ZM7.41818 10.2409C8.01818 9.92727 8.475 9.5625 8.78864 9.14659C9.10227 8.73068 9.40909 8.23636 9.70909 7.66364C9.19091 7.93636 8.73409 8.29432 8.33864 8.7375C7.94318 9.18068 7.63636 9.68182 7.41818 10.2409ZM9.95455 13.6364C9.72273 13.6364 9.52841 13.558 9.37159 13.4011C9.21477 13.2443 9.13636 13.05 9.13636 12.8182C9.13636 12.5864 9.21477 12.392 9.37159 12.2352C9.52841 12.0784 9.72273 12 9.95455 12C10.1864 12 10.3807 12.0784 10.5375 12.2352C10.6943 12.392 10.7727 12.5864 10.7727 12.8182C10.7727 13.05 10.6943 13.2443 10.5375 13.4011C10.3807 13.558 10.1864 13.6364 9.95455 13.6364ZM15.4773 9.13636H15.7227C15.8045 9.13636 15.8864 9.12955 15.9682 9.11591C15.5182 8.50227 14.9489 8.01136 14.2602 7.64318C13.5716 7.275 12.8182 7.09091 12 7.09091H11.7545C11.6727 7.09091 11.5977 7.09773 11.5295 7.11136C12.0614 7.725 12.6239 8.21591 13.217 8.58409C13.8102 8.95227 14.5636 9.13636 15.4773 9.13636ZM14.0455 13.6364C13.8136 13.6364 13.6193 13.558 13.4625 13.4011C13.3057 13.2443 13.2273 13.05 13.2273 12.8182C13.2273 12.5864 13.3057 12.392 13.4625 12.2352C13.6193 12.0784 13.8136 12 14.0455 12C14.2773 12 14.4716 12.0784 14.6284 12.2352C14.7852 12.392 14.8636 12.5864 14.8636 12.8182C14.8636 13.05 14.7852 13.2443 14.6284 13.4011C14.4716 13.558 14.2773 13.6364 14.0455 13.6364ZM3 7.09091V4.63636C3 4.18636 3.16023 3.80114 3.48068 3.48068C3.80114 3.16023 4.18636 3 4.63636 3H7.09091V4.63636H4.63636V7.09091H3ZM7.09091 21H4.63636C4.18636 21 3.80114 20.8398 3.48068 20.5193C3.16023 20.1989 3 19.8136 3 19.3636V16.9091H4.63636V19.3636H7.09091V21ZM16.9091 21V19.3636H19.3636V16.9091H21V19.3636C21 19.8136 20.8398 20.1989 20.5193 20.5193C20.1989 20.8398 19.8136 21 19.3636 21H16.9091ZM19.3636 7.09091V4.63636H16.9091V3H19.3636C19.8136 3 20.1989 3.16023 20.5193 3.48068C20.8398 3.80114 21 4.18636 21 4.63636V7.09091H19.3636Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n","import { ArrowLeftRight, AtSign, DatabaseBackup, Link2, LockKeyhole, UsersRound } from 'lucide-react'\n\nimport { KycIcon } from '../../assets/KycIcon'\nimport { PageKey } from '../../hooks/useLayoutDataStore'\nimport type { NavButtonItem } from './interfaces'\n\nexport const NAV_BUTTONS: NavButtonItem[] = [\n { id: PageKey.TRANSACTIONS, name: 'passport:transactionsMenu.title', Icon: ArrowLeftRight },\n { id: PageKey.KYC, name: 'passport:kycMenu.title', Icon: KycIcon },\n { id: PageKey.NICKNAME_SETTINGS, name: 'passport:nicknameMenu.title', Icon: AtSign },\n { id: PageKey.MANAGE_WALLET, name: 'passport:profilesMenu.title', Icon: UsersRound },\n { id: PageKey.SECURITY, name: 'passport:securityMenu.title', Icon: LockKeyhole },\n { id: PageKey.KEYSARE_BACKUP, name: 'passport:backupMenu.title', Icon: DatabaseBackup },\n { id: PageKey.CHAIN, name: 'passport:chainMenu.title', Icon: Link2 }\n]\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useQuery } from '@tanstack/react-query'\nimport { ArrowLeft } from 'lucide-react'\nimport { useEffect, type CSSProperties } from 'react'\n\nimport { getNicknameInfo } from '../../clients/nickname'\nimport { QUERY_KEYS as NICKNAME_KEYS } from '../../clients/profile'\n// import { DEFAULT_SETTINGS_MENU_HEIGHT } from '../../constants'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { cn } from '../../lib/utils'\nimport { useProvidersList } from '../ManageWalletMenu/hooks/useProvidersList'\nimport { Button } from '../ui/button'\nimport { NAV_BUTTONS } from './constants'\n\nfunction useSettingsButtons() {\n const config = useLumiaPassportConfig().config\n\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n const setTransitionPageHeight = useLayoutDataStore((st) => st.setTransitionPageHeight)\n\n const settingsButtons = NAV_BUTTONS.filter((btn) => {\n switch (btn.id) {\n case PageKey.CHAIN:\n if (!!config.current?.network?.chainId && !!config.current?.network?.forceChain) return false\n return true\n\n // other button filtering logic can be added here, ex:\n // case PageKey.MANAGE_WALLET:\n // return true\n\n default:\n return true\n }\n })\n\n // this makes makes mainMenu<->settingsMenu<->subMenus animations transition smoother\n useEffect(() => {\n const cssvEl = document.querySelector('.lumia-scope') as HTMLElement | null\n\n if (!cssvEl || !window?.getComputedStyle) {\n return\n // return setTransitionPageHeight(DEFAULT_SETTINGS_MENU_HEIGHT)\n }\n\n const computedStyle = getComputedStyle(cssvEl)\n const pd = parseFloat(computedStyle.getPropertyValue('--l-pass-pd'))\n const gap = parseFloat(computedStyle.getPropertyValue('--l-pass-gap'))\n\n const buttonListHeight = 2 * pd + 32 + gap + (settingsButtons.length * (48 + gap) - gap) // y-paddins + title height + gap + buttons list height\n const settingsMenuHeight = Math.min(buttonListHeight, maxScrollHeight)\n\n // console.warn('[SETTINGS]', buttonListHeight, maxScrollHeight, settingsMenuHeight)\n\n setTransitionPageHeight(settingsMenuHeight)\n }, [settingsButtons, maxScrollHeight, setTransitionPageHeight])\n\n return settingsButtons\n}\n\nexport function SettingsMenu() {\n const address = useLumiaPassportSession((st) => st.address)\n const { t } = useT()\n\n const settingsNotifications = useLayoutDataStore((st) => st.settingsNotifications)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const settingsButtons = useSettingsButtons()\n\n // preload providers query cache\n useProvidersList()\n\n // preload nickname query cache\n useQuery({\n retry: 1,\n enabled: !!address,\n queryKey: [NICKNAME_KEYS.nicknameInfo, address],\n queryFn: getNicknameInfo\n })\n\n const highlightedKeys = settingsNotifications.map((n) => n.target)\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]\"\n >\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button variant=\"ghost\" size=\"icon\" title=\"Back\" onClick={() => setPage(PageKey.MAIN_MENU)}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:common.settings')}</span>\n </div>\n\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {settingsButtons\n .map((el) => ({ ...el, onClick: () => setPage(el.id) }))\n .map(({ id, name, Icon, onClick }) => (\n <Button\n key={id}\n variant=\"outline\"\n size=\"large\"\n onClick={onClick}\n disabled={!address}\n className={cn(\n 'w-full items-center justify-start',\n highlightedKeys.includes(id) && 'animate-glow-warning'\n )}\n >\n <Icon className=\"w-4 h-4\" />\n <span>{t(name as 'passport:common.settings')}</span>\n </Button>\n ))}\n </div>\n </div>\n )\n}\n","export { SettingsMenu } from './SettingsMenu'\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { ArrowLeft } from 'lucide-react'\n\nimport { PageKey, useLayoutDataStore } from '../hooks/useLayoutDataStore'\nimport { Button } from './ui/button'\nimport { Highlight } from './ui/highlight'\n\nexport function TermsOfService() {\n const address = useLumiaPassportSession((st) => st.address)\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n return (\n <div className=\"w-full p-[var(--l-pass-pd)] flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n onClick={() => setPage(!!address ? PageKey.SETTINGS : PageKey.AUTH)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{'Terms of Service'}</span>\n </div>\n\n <Highlight type=\"warning\" className=\"text-center\">\n <span className=\"block text-xs\">{'By using Mbark Wallet you agree to our terms.'}</span>\n <span className=\"block text-xs\">{'To be updated...'}</span>\n </Highlight>\n </div>\n )\n}\n","import {\n ARBITRUM_SEPOLIA_CHAIN_ID,\n BASE_SEPOLIA_CHAIN_ID,\n BSC_TESTNET_CHAIN_ID,\n LUMIA_MAINNET_CHAIN_ID,\n LUMIA_TESTNET_CHAIN_ID,\n SEPOLIA_CHAIN_ID,\n type ChainConfig\n} from '@embarkai/core/read'\n\nimport { getExplorerUrl } from '../../clients/base'\nimport type { ExplorerApiType, HistoryUrlsResult } from './types'\n\ninterface TransactionsListParams {\n address: string\n chainConfig: ChainConfig\n}\n\n/**\n * Etherscan API V2 unified endpoint (only for Ethereum chains)\n * Note: V2 free tier does NOT support BSC, Arbitrum, Base - use their native APIs\n * @see https://docs.etherscan.io/v2-migration-guide\n */\nconst ETHERSCAN_V2_API_URL = 'https://api.etherscan.io/v2/api'\n\n/**\n * Blockscout API URLs for chains with free Blockscout explorer\n * These use the same module=account&action=txlist format as Etherscan V1\n * @see https://docs.blockscout.com/for-users/api/rpc-endpoints\n */\nconst BLOCKSCOUT_API_URLS: Record<number, string> = {\n [ARBITRUM_SEPOLIA_CHAIN_ID]: 'https://arbitrum-sepolia.blockscout.com/api',\n [BASE_SEPOLIA_CHAIN_ID]: 'https://base-sepolia.blockscout.com/api'\n}\n\n/**\n * Chain-specific API URLs for non-Ethereum chains with native explorers\n */\nconst CHAIN_SPECIFIC_API_URLS: Record<number, string> = {\n}\n\n/**\n * Chains that use Etherscan-compatible API (includes chain-specific APIs)\n */\nconst ETHERSCAN_CHAINS = new Set([\n SEPOLIA_CHAIN_ID,\n ARBITRUM_SEPOLIA_CHAIN_ID,\n BASE_SEPOLIA_CHAIN_ID\n])\n\n/**\n * Chains where transaction history is not yet available\n * (no free CORS-friendly explorer API)\n */\nconst UNSUPPORTED_HISTORY_CHAINS = new Set([\n BSC_TESTNET_CHAIN_ID\n])\n\n/**\n * Check if transaction history is supported for a given chain\n */\nexport function isTransactionHistorySupported(chainId: number): boolean {\n return !UNSUPPORTED_HISTORY_CHAINS.has(chainId)\n}\n\n/**\n * Get Blockscout API URLs for Lumia chains\n */\nfunction getBlockscoutHistoryUrls({ address }: TransactionsListParams): HistoryUrlsResult {\n const explorerUrl = getExplorerUrl()\n const baseUrl = explorerUrl.replace(/\\/$/, '')\n\n return {\n transactionsUrl: `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`,\n internalsUrl: `${baseUrl}/api/v2/addresses/${address}/internal-transactions?items_count=40`,\n tokenTransfersUrl: `${baseUrl}/api/v2/addresses/${address}/token-transfers?type=ERC-20&items_count=40`,\n apiType: 'blockscout'\n }\n}\n\n/**\n * Get Etherscan-compatible API URLs\n * Priority: Blockscout (free) > Chain-specific API > Etherscan V2 (Ethereum only)\n */\nfunction getEtherscanHistoryUrls({ address, chainConfig }: TransactionsListParams): HistoryUrlsResult {\n const chainId = chainConfig.id\n\n // 1. Check for free Blockscout API first (Arbitrum Sepolia, Base Sepolia)\n const blockscoutUrl = BLOCKSCOUT_API_URLS[chainId]\n if (blockscoutUrl) {\n return {\n transactionsUrl: `${blockscoutUrl}?module=account&action=txlist&address=${address}&page=1&offset=20&sort=desc`,\n internalsUrl: `${blockscoutUrl}?module=account&action=txlistinternal&address=${address}&page=1&offset=40&sort=desc`,\n tokenTransfersUrl: `${blockscoutUrl}?module=account&action=tokentx&address=${address}&page=1&offset=40&sort=desc`,\n apiType: 'etherscan' // Blockscout uses same format as Etherscan\n }\n }\n\n // 2. Chain-specific API (BSC Testnet - may have limited free access)\n const chainSpecificUrl = CHAIN_SPECIFIC_API_URLS[chainId]\n if (chainSpecificUrl) {\n return {\n transactionsUrl: `${chainSpecificUrl}?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&page=1&offset=20&sort=desc`,\n internalsUrl: `${chainSpecificUrl}?module=account&action=txlistinternal&address=${address}&startblock=0&endblock=99999999&page=1&offset=40&sort=desc`,\n tokenTransfersUrl: `${chainSpecificUrl}?module=account&action=tokentx&address=${address}&startblock=0&endblock=99999999&page=1&offset=40&sort=desc`,\n apiType: 'etherscan'\n }\n }\n\n // 3. Etherscan V2 API for Ethereum chains (Sepolia - free tier supported)\n return {\n transactionsUrl: `${ETHERSCAN_V2_API_URL}?chainid=${chainId}&module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&page=1&offset=20&sort=desc`,\n internalsUrl: `${ETHERSCAN_V2_API_URL}?chainid=${chainId}&module=account&action=txlistinternal&address=${address}&startblock=0&endblock=99999999&page=1&offset=40&sort=desc`,\n tokenTransfersUrl: `${ETHERSCAN_V2_API_URL}?chainid=${chainId}&module=account&action=tokentx&address=${address}&startblock=0&endblock=99999999&page=1&offset=40&sort=desc`,\n apiType: 'etherscan'\n }\n}\n\n/**\n * Determine API type for a chain\n */\nfunction getApiType(chainConfig: ChainConfig): ExplorerApiType {\n // Explicit configuration takes precedence\n if (chainConfig.explorerApiType) {\n return chainConfig.explorerApiType\n }\n\n // Check if chain is known to use Etherscan\n if (ETHERSCAN_CHAINS.has(chainConfig.id)) {\n return 'etherscan'\n }\n\n // Default to Blockscout for Lumia and unknown chains\n return 'blockscout'\n}\n\n/**\n * Get history URLs with auto-detection of API type\n */\nexport function getHistoryUrls(params: TransactionsListParams): HistoryUrlsResult {\n const apiType = getApiType(params.chainConfig)\n\n if (apiType === 'etherscan') {\n return getEtherscanHistoryUrls(params)\n }\n\n return getBlockscoutHistoryUrls(params)\n}\n\n/**\n * @deprecated Use getHistoryUrls instead\n * Legacy URL map for backwards compatibility\n */\nexport const TX_HISTORY_URLS: Record<\n number,\n (params: TransactionsListParams) => {\n transactionsUrl: string\n internalsUrl: string\n tokenTransfersUrl: string\n }\n> = {\n [LUMIA_TESTNET_CHAIN_ID]: (p) => {\n const result = getBlockscoutHistoryUrls(p)\n return {\n transactionsUrl: result.transactionsUrl,\n internalsUrl: result.internalsUrl,\n tokenTransfersUrl: result.tokenTransfersUrl\n }\n },\n\n [LUMIA_MAINNET_CHAIN_ID]: (p) => {\n const result = getBlockscoutHistoryUrls(p)\n return {\n transactionsUrl: result.transactionsUrl,\n internalsUrl: result.internalsUrl,\n tokenTransfersUrl: result.tokenTransfersUrl\n }\n },\n\n}\n\n/**\n * Get default history URLs (Blockscout format)\n * @deprecated Use getHistoryUrls instead\n */\nexport const getDefaultHistoryUrls = ({ address }: TransactionsListParams) => {\n const explorerUrl = getExplorerUrl()\n const baseUrl = explorerUrl.replace(/\\/$/, '')\n\n const transactionsUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`\n const internalsUrl = `${baseUrl}/api/v2/addresses/${address}/internal-transactions?items_count=40`\n const tokenTransfersUrl = `${baseUrl}/api/v2/addresses/${address}/token-transfers?type=ERC-20&items_count=40`\n\n return { transactionsUrl, internalsUrl, tokenTransfersUrl }\n}\n","/**\n * Adapters to convert Etherscan API responses to Blockscout-like format\n */\n\nimport type {\n EtherscanApiResponse,\n EtherscanTransaction,\n EtherscanInternalTransaction,\n EtherscanTokenTransfer\n} from './types'\n\n/**\n * Blockscout-like transaction format (internal interface matching api.ts expectations)\n */\ninterface BlockscoutTransaction {\n hash: string\n value: string\n from: {\n hash: string\n is_contract: boolean\n name: string | null\n }\n to: {\n hash: string\n is_contract: boolean\n name: string | null\n }\n status: string\n timestamp: string\n gas_used: string\n fee: { value: string }\n method: string | null\n transaction_types: string[]\n block_number: number\n nonce: number\n}\n\n/**\n * Blockscout-like internal transaction format\n */\ninterface BlockscoutInternalTransaction {\n transaction_hash: string\n value: string\n from: {\n hash: string\n is_contract: boolean\n name?: string | null\n }\n to: {\n hash: string\n is_contract: boolean\n name?: string | null\n }\n success?: boolean\n status?: string\n type?: string\n call_type?: string | null\n timestamp?: string | number | null\n block_number: number\n}\n\n/**\n * Blockscout-like token transfer format\n */\ninterface BlockscoutTokenTransfer {\n tx_hash?: string\n transaction_hash?: string\n timestamp?: string | number | null\n value?: string\n block_number?: number\n token?: {\n symbol?: string\n decimals?: string | number | null\n }\n total?: {\n value?: string\n decimals?: string | number | null\n }\n from: {\n hash: string\n }\n to: {\n hash: string\n }\n}\n\n/**\n * Parse Etherscan API response and extract result array\n * Handles error cases like \"No transactions found\"\n */\nexport function parseEtherscanResponse<T>(response: EtherscanApiResponse<T[]>): T[] {\n if (response.status === '0') {\n // Check if it's a \"no data\" message vs actual error\n if (\n typeof response.result === 'string' &&\n (response.result.includes('No transactions found') ||\n response.result.includes('No records found') ||\n response.message === 'No transactions found')\n ) {\n return []\n }\n // Real error - return empty array but log\n console.warn('[Etherscan API] Error response:', response.message, response.result)\n return []\n }\n\n if (!Array.isArray(response.result)) {\n return []\n }\n\n return response.result\n}\n\n/**\n * Convert Unix timestamp (seconds) to ISO string\n */\nfunction unixToIso(timestamp: string): string {\n const seconds = parseInt(timestamp, 10)\n if (isNaN(seconds)) return new Date().toISOString()\n return new Date(seconds * 1000).toISOString()\n}\n\n/**\n * Extract method name from functionName field\n * Example: \"transfer(address,uint256)\" -> \"transfer\"\n */\nfunction extractMethodName(functionName: string): string | null {\n if (!functionName) return null\n const match = functionName.match(/^([a-zA-Z_][a-zA-Z0-9_]*)/)\n return match ? match[1] : null\n}\n\n/**\n * Convert Etherscan transaction to Blockscout-like format\n */\nexport function adaptEtherscanTransaction(tx: EtherscanTransaction): BlockscoutTransaction {\n const gasUsed = BigInt(tx.gasUsed || '0')\n const gasPrice = BigInt(tx.gasPrice || '0')\n const fee = (gasUsed * gasPrice).toString()\n\n return {\n hash: tx.hash,\n value: tx.value || '0',\n from: {\n hash: tx.from,\n is_contract: false, // Etherscan doesn't provide this\n name: null\n },\n to: {\n hash: tx.to || '0x0000000000000000000000000000000000000000',\n is_contract: Boolean(tx.contractAddress), // Contract creation\n name: null\n },\n status: tx.isError === '0' ? 'ok' : 'error',\n timestamp: unixToIso(tx.timeStamp),\n gas_used: tx.gasUsed || '0',\n fee: { value: fee },\n method: extractMethodName(tx.functionName),\n transaction_types: [],\n block_number: parseInt(tx.blockNumber, 10) || 0,\n nonce: parseInt(tx.nonce, 10) || 0\n }\n}\n\n/**\n * Convert Etherscan internal transaction to Blockscout-like format\n */\nexport function adaptEtherscanInternalTransaction(\n tx: EtherscanInternalTransaction\n): BlockscoutInternalTransaction {\n return {\n transaction_hash: tx.hash,\n value: tx.value || '0',\n from: {\n hash: tx.from,\n is_contract: false,\n name: null\n },\n to: {\n hash: tx.to || '0x0000000000000000000000000000000000000000',\n is_contract: Boolean(tx.contractAddress),\n name: null\n },\n success: tx.isError === '0',\n status: tx.isError === '0' ? 'ok' : 'error',\n type: tx.type,\n call_type: tx.type?.toUpperCase() || null,\n timestamp: parseInt(tx.timeStamp, 10) || null,\n block_number: parseInt(tx.blockNumber, 10) || 0\n }\n}\n\n/**\n * Convert Etherscan token transfer to Blockscout-like format\n */\nexport function adaptEtherscanTokenTransfer(\n transfer: EtherscanTokenTransfer\n): BlockscoutTokenTransfer {\n return {\n tx_hash: transfer.hash,\n transaction_hash: transfer.hash,\n timestamp: parseInt(transfer.timeStamp, 10) || null,\n value: transfer.value || '0',\n block_number: parseInt(transfer.blockNumber, 10) || 0,\n token: {\n symbol: transfer.tokenSymbol || 'Token',\n decimals: transfer.tokenDecimal || '18'\n },\n total: {\n value: transfer.value || '0',\n decimals: transfer.tokenDecimal || '18'\n },\n from: {\n hash: transfer.from\n },\n to: {\n hash: transfer.to\n }\n }\n}\n\n/**\n * Batch convert Etherscan transactions\n */\nexport function adaptEtherscanTransactions(\n transactions: EtherscanTransaction[]\n): BlockscoutTransaction[] {\n return transactions.map(adaptEtherscanTransaction)\n}\n\n/**\n * Batch convert Etherscan internal transactions\n */\nexport function adaptEtherscanInternalTransactions(\n transactions: EtherscanInternalTransaction[]\n): BlockscoutInternalTransaction[] {\n return transactions.map(adaptEtherscanInternalTransaction)\n}\n\n/**\n * Batch convert Etherscan token transfers\n */\nexport function adaptEtherscanTokenTransfers(\n transfers: EtherscanTokenTransfer[]\n): BlockscoutTokenTransfer[] {\n return transfers.map(adaptEtherscanTokenTransfer)\n}\n","import { type ChainConfig } from '@embarkai/core/read'\n\nimport { getHistoryUrls } from './txUrls'\nimport {\n parseEtherscanResponse,\n adaptEtherscanTransactions,\n adaptEtherscanInternalTransactions,\n adaptEtherscanTokenTransfers\n} from './adapters'\nimport type {\n EtherscanApiResponse,\n EtherscanTransaction,\n EtherscanInternalTransaction,\n EtherscanTokenTransfer,\n ExplorerApiType\n} from './types'\n\n/** key for transactions history query revalidation on Buy/Sell and other TX actions */\nconst TRANSACTIONS_HISTORY_QUERY_KEY = 'lumia-passport-transactions-query'\n\ninterface Transaction {\n hash: string\n value: string\n from: {\n hash: string\n is_contract: boolean\n name: string | null\n }\n to: {\n hash: string\n is_contract: boolean\n name: string | null\n }\n status: string\n timestamp: string\n gas_used: string\n fee: { value: string }\n method: string | null\n transaction_types: string[]\n block_number: number\n nonce: number\n}\n\ninterface InternalTransaction {\n transaction_hash: string\n value: string\n from: {\n hash: string\n is_contract: boolean\n name?: string | null\n }\n to: {\n hash: string\n is_contract: boolean\n name?: string | null\n }\n success?: boolean\n status?: string\n type?: string\n call_type?: string | null\n timestamp?: string | number | null\n block_number: number\n}\n\ninterface TokenTransfer {\n tx_hash?: string\n transaction_hash?: string // Blockscout API may use either field\n timestamp?: string | number | null\n value?: string\n block_number?: number\n token?: {\n symbol?: string\n decimals?: string | number | null\n }\n total?: {\n value?: string\n decimals?: string | number | null\n }\n from: {\n hash: string\n }\n to: {\n hash: string\n }\n}\n\ntype HistoryDirection = 'in' | 'out'\n\ninterface HistoryItem {\n id: string\n kind: 'transaction' | 'internal' | 'token'\n hash: string\n parentHash: string\n direction: HistoryDirection\n counterparty: string\n counterpartyName?: string | null\n counterpartyIsContract: boolean\n value: string\n status: 'ok' | 'error'\n timestampMs: number\n method?: string | null\n blockNumber: number\n badgeLabel?: string\n assetSymbol?: string\n decimals?: number\n isEntryPoint?: boolean\n}\n\ninterface HistoryGroup {\n id: string\n parent: HistoryItem\n internals: HistoryItem[]\n timestampMs: number\n}\n\nconst ENTRYPOINT_ADDRESSES = new Set(\n [\n '0x000000000000000000000000000000000000a032',\n '0x0576a174d229e3cfa37253523e645a78a0c91b57',\n '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789'\n ].map((addr) => addr.toLowerCase())\n)\n\nconst MAX_HISTORY_ITEMS = 40\n\ninterface TransactionsListParams {\n address: string\n chainConfig: ChainConfig\n}\n\nconst toBigInt = (value: string) => {\n try {\n return BigInt(value || '0')\n } catch {\n return 0n\n }\n}\n\n// ============================================================================\n// Response Cache for Rate Limit Protection\n// ============================================================================\n\ninterface CachedTransactions {\n data: HistoryGroup[]\n timestamp: number\n}\n\nconst transactionCache = new Map<string, CachedTransactions>()\nconst CACHE_TTL_MS = 30_000 // 30 seconds\nconst CACHE_MAX_SIZE = 50 // Max entries to prevent memory leak\n\nfunction getCacheKey(chainId: number, address: string): string {\n return `${chainId}-${address.toLowerCase()}`\n}\n\nfunction getCachedData(chainId: number, address: string): HistoryGroup[] | null {\n const key = getCacheKey(chainId, address)\n const cached = transactionCache.get(key)\n\n if (!cached) return null\n\n const now = Date.now()\n if (now - cached.timestamp > CACHE_TTL_MS) {\n transactionCache.delete(key)\n return null\n }\n\n return cached.data\n}\n\nfunction setCachedData(chainId: number, address: string, data: HistoryGroup[]): void {\n // Clean old entries if cache is too large\n if (transactionCache.size >= CACHE_MAX_SIZE) {\n const now = Date.now()\n for (const [key, value] of transactionCache.entries()) {\n if (now - value.timestamp > CACHE_TTL_MS) {\n transactionCache.delete(key)\n }\n }\n // If still too large, remove oldest\n if (transactionCache.size >= CACHE_MAX_SIZE) {\n const firstKey = transactionCache.keys().next().value\n if (firstKey) transactionCache.delete(firstKey)\n }\n }\n\n const key = getCacheKey(chainId, address)\n transactionCache.set(key, {\n data,\n timestamp: Date.now()\n })\n}\n\n// ============================================================================\n// Data Fetching\n// ============================================================================\n\n/**\n * Parse Blockscout API response\n */\nfunction parseBlockscoutItems<T>(json: unknown): T[] {\n if (json && typeof json === 'object' && 'items' in json && Array.isArray((json as { items: unknown }).items)) {\n return (json as { items: T[] }).items\n }\n return []\n}\n\n/**\n * Fetch and parse transactions based on API type\n */\nasync function fetchTransactions(\n url: string,\n apiType: ExplorerApiType\n): Promise<Transaction[]> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch transactions: ${response.status}`)\n }\n\n const json = await response.json()\n\n if (apiType === 'etherscan') {\n const parsed = parseEtherscanResponse<EtherscanTransaction>(\n json as EtherscanApiResponse<EtherscanTransaction[]>\n )\n return adaptEtherscanTransactions(parsed)\n }\n\n return parseBlockscoutItems<Transaction>(json)\n}\n\n/**\n * Fetch and parse internal transactions based on API type\n */\nasync function fetchInternalTransactions(\n url: string,\n apiType: ExplorerApiType\n): Promise<InternalTransaction[]> {\n const response = await fetch(url)\n\n // 404 is acceptable for internal transactions (not all chains support it)\n if (!response.ok && response.status !== 404) {\n throw new Error(`Failed to fetch internal transactions: ${response.status}`)\n }\n\n if (response.status === 404) {\n return []\n }\n\n const json = await response.json()\n\n if (apiType === 'etherscan') {\n const parsed = parseEtherscanResponse<EtherscanInternalTransaction>(\n json as EtherscanApiResponse<EtherscanInternalTransaction[]>\n )\n return adaptEtherscanInternalTransactions(parsed)\n }\n\n return parseBlockscoutItems<InternalTransaction>(json)\n}\n\n/**\n * Fetch and parse token transfers based on API type\n */\nasync function fetchTokenTransfers(\n url: string,\n apiType: ExplorerApiType\n): Promise<TokenTransfer[]> {\n const response = await fetch(url)\n\n // 404 is acceptable for token transfers\n if (!response.ok && response.status !== 404) {\n console.warn('[TransactionsModal] Token transfers unavailable', response.status)\n return []\n }\n\n if (response.status === 404) {\n return []\n }\n\n const json = await response.json()\n\n if (apiType === 'etherscan') {\n const parsed = parseEtherscanResponse<EtherscanTokenTransfer>(\n json as EtherscanApiResponse<EtherscanTokenTransfer[]>\n )\n return adaptEtherscanTokenTransfers(parsed)\n }\n\n return parseBlockscoutItems<TokenTransfer>(json)\n}\n\nasync function getTransactionsListQuery(params: TransactionsListParams): Promise<HistoryGroup[]> {\n const { chainConfig, address } = params\n\n // Check cache first (helps with Etherscan rate limits)\n const cachedData = getCachedData(chainConfig.id, address)\n if (cachedData) {\n return cachedData\n }\n\n // Get URLs and API type\n const { transactionsUrl, internalsUrl, tokenTransfersUrl, apiType } = getHistoryUrls(params)\n\n // Get native currency symbol from chain config\n const nativeSymbol = chainConfig.nativeCurrency?.symbol || 'ETH'\n\n // Fetch all data in parallel\n const [transactionsResult, internalResult, tokenResult] = await Promise.allSettled([\n fetchTransactions(transactionsUrl, apiType),\n fetchInternalTransactions(internalsUrl, apiType),\n fetchTokenTransfers(tokenTransfersUrl, apiType)\n ])\n\n // Handle transactions (required)\n if (transactionsResult.status !== 'fulfilled') {\n throw new Error(`Failed to fetch transactions: ${transactionsResult.reason}`)\n }\n const transactionsData = transactionsResult.value\n\n // Handle internal transactions (optional)\n let internalData: InternalTransaction[] = []\n if (internalResult.status === 'fulfilled') {\n internalData = internalResult.value\n } else {\n console.warn('[TransactionsModal] Failed to load internal transactions', internalResult.reason)\n }\n\n // Handle token transfers (optional)\n let tokenTransfersData: TokenTransfer[] = []\n if (tokenResult.status === 'fulfilled') {\n tokenTransfersData = tokenResult.value\n } else {\n console.warn('[TransactionsModal] Failed to load token transfers', tokenResult.reason)\n }\n\n const combinedHistory: HistoryItem[] = []\n const lowerAddress = address.toLowerCase()\n const now = Date.now()\n\n transactionsData.forEach((tx) => {\n const toMatches = tx.to?.hash?.toLowerCase() === lowerAddress\n const fromMatches = tx.from?.hash?.toLowerCase() === lowerAddress\n const direction: HistoryDirection = toMatches ? 'in' : 'out'\n const counterpart = direction === 'in' ? tx.from : tx.to\n const counterpartHash = counterpart?.hash ?? '0x0000000000000000000000000000000000000000'\n const counterpartLower = counterpartHash.toLowerCase()\n const isEntryPoint = ENTRYPOINT_ADDRESSES.has(counterpartLower)\n const timestampMs = tx.timestamp ? new Date(tx.timestamp).getTime() : now\n\n combinedHistory.push({\n id: `tx-${tx.hash}`,\n kind: 'transaction',\n hash: tx.hash,\n parentHash: tx.hash,\n direction,\n counterparty: counterpartHash,\n counterpartyName: counterpart?.name ?? null,\n counterpartyIsContract: Boolean(counterpart?.is_contract),\n value: tx.value ?? '0',\n status: tx.status === 'ok' ? 'ok' : 'error',\n timestampMs: Number.isFinite(timestampMs) ? timestampMs : now,\n method: tx.method,\n blockNumber: tx.block_number,\n badgeLabel:\n Array.isArray(tx.transaction_types) && tx.transaction_types.length > 0\n ? tx.transaction_types[0]?.replace(/_/g, ' ')\n : undefined,\n assetSymbol: nativeSymbol,\n decimals: 18,\n isEntryPoint\n })\n\n // For smart accounts the direct transaction is typically the bundler call into EntryPoint.\n // Treat it as initiated by the smart account if it was the sender.\n if (!toMatches && !fromMatches && Array.isArray(tx.transaction_types)) {\n const hasUserOpTag = tx.transaction_types.some((type) => type.includes('erc4337'))\n if (hasUserOpTag) {\n combinedHistory[combinedHistory.length - 1].badgeLabel = 'User Operation'\n }\n }\n })\n\n internalData.forEach((trace, index) => {\n const fromHash = trace.from?.hash?.toLowerCase()\n const toHash = trace.to?.hash?.toLowerCase()\n\n if (fromHash !== lowerAddress && toHash !== lowerAddress) {\n return\n }\n\n const direction: HistoryDirection = fromHash === lowerAddress ? 'out' : 'in'\n const counterpart = direction === 'out' ? trace.to : trace.from\n const counterpartHash = counterpart?.hash ?? '0x0000000000000000000000000000000000000000'\n const counterpartLower = counterpartHash.toLowerCase()\n const isEntryPoint = ENTRYPOINT_ADDRESSES.has(counterpartLower)\n const tsInput = trace.timestamp\n const timestampMs = typeof tsInput === 'number' ? tsInput * 1000 : tsInput ? new Date(tsInput).getTime() : now\n\n combinedHistory.push({\n id: `internal-${trace.transaction_hash}-${index}`,\n kind: 'internal',\n hash: trace.transaction_hash,\n parentHash: trace.transaction_hash,\n direction,\n counterparty: counterpartHash,\n counterpartyName: counterpart?.name ?? null,\n counterpartyIsContract: Boolean(counterpart?.is_contract),\n value: trace.value ?? '0',\n status: trace.success === false || trace.status === 'error' ? 'error' : 'ok',\n timestampMs: Number.isFinite(timestampMs) ? timestampMs : now,\n method: trace.call_type ? trace.call_type.toUpperCase() : undefined,\n blockNumber: trace.block_number,\n badgeLabel: 'Internal',\n assetSymbol: nativeSymbol,\n decimals: 18,\n isEntryPoint\n })\n })\n\n const parentMap = new Map<string, HistoryGroup>()\n const orphanInternals: HistoryItem[] = []\n\n combinedHistory.forEach((item) => {\n if (item.kind === 'transaction') {\n parentMap.set(item.parentHash.toLowerCase(), {\n id: item.parentHash,\n parent: item,\n internals: [],\n timestampMs: item.timestampMs\n })\n }\n })\n\n combinedHistory.forEach((item) => {\n if (item.kind === 'internal') {\n const group = parentMap.get(item.parentHash.toLowerCase())\n if (group) {\n group.internals.push(item)\n group.timestampMs = Math.max(group.timestampMs, item.timestampMs)\n } else {\n orphanInternals.push(item)\n }\n }\n })\n\n const groups: HistoryGroup[] = Array.from(parentMap.values())\n\n groups.forEach((group) => {\n if (group.internals.length === 0) {\n return\n }\n\n const meaningfulInternals = group.internals.filter((internal) => {\n const amount = toBigInt(internal.value)\n return amount !== 0n && !internal.isEntryPoint\n })\n\n if (meaningfulInternals.length === 0) {\n group.internals = []\n return\n }\n\n let totalIn = 0n\n let totalOut = 0n\n\n meaningfulInternals.forEach((internal) => {\n const amount = toBigInt(internal.value)\n if (amount === 0n) {\n return\n }\n if (internal.direction === 'in') {\n totalIn += amount\n } else {\n totalOut += amount\n }\n })\n\n const hasPositiveFlow = totalIn > 0n || totalOut > 0n\n if (hasPositiveFlow) {\n const direction = totalIn >= totalOut ? 'in' : 'out'\n const netValue = direction === 'in' ? totalIn - totalOut : totalOut - totalIn\n\n group.parent.direction = direction\n group.parent.value = netValue > 0n ? netValue.toString() : group.parent.value\n\n const candidates = meaningfulInternals\n .filter((internal) => internal.direction === direction)\n .map((internal) => ({\n internal,\n amount: toBigInt(internal.value)\n }))\n .sort((a, b) => {\n if (a.amount === b.amount) return 0\n return a.amount > b.amount ? -1 : 1\n })\n\n const primary = candidates.length > 0 ? candidates[0].internal : meaningfulInternals[0]\n if (primary) {\n group.parent.counterparty = primary.counterparty\n group.parent.counterpartyName = primary.counterpartyName\n group.parent.counterpartyIsContract = primary.counterpartyIsContract\n group.parent.method = group.parent.method || primary.method\n }\n\n group.internals = meaningfulInternals\n } else {\n group.internals = []\n }\n })\n\n // Group orphan internals by parentHash to avoid duplicates\n const orphanGroupMap = new Map<string, HistoryItem[]>()\n orphanInternals.forEach((internalItem) => {\n if (internalItem.isEntryPoint || toBigInt(internalItem.value) === 0n) {\n return\n }\n const key = internalItem.parentHash.toLowerCase()\n const existing = orphanGroupMap.get(key) || []\n existing.push(internalItem)\n orphanGroupMap.set(key, existing)\n })\n\n // Process orphan groups - show only incoming transactions\n // For Smart Accounts, internal calls to implementation contract appear as \"out\"\n // but these are not real transfers, so we only show incoming funds\n orphanGroupMap.forEach((internals, parentHash) => {\n // Filter to only incoming transactions (real receives)\n const incomingInternals = internals.filter((internal) => {\n if (internal.direction !== 'in') return false\n const amount = toBigInt(internal.value)\n return amount > 0n\n })\n\n if (incomingInternals.length === 0) {\n return\n }\n\n // Calculate total incoming\n let totalIn = 0n\n incomingInternals.forEach((internal) => {\n totalIn += toBigInt(internal.value)\n })\n\n // Find the primary incoming (largest amount)\n const sorted = incomingInternals\n .map((internal) => ({\n internal,\n amount: toBigInt(internal.value)\n }))\n .sort((a, b) => {\n if (a.amount === b.amount) return 0\n return a.amount > b.amount ? -1 : 1\n })\n\n const primary = sorted[0].internal\n\n // Create a synthetic parent from the primary incoming\n const syntheticParent: HistoryItem = {\n ...primary,\n id: `orphan-${parentHash}`,\n direction: 'in',\n value: totalIn.toString()\n }\n\n groups.push({\n id: syntheticParent.id,\n parent: syntheticParent,\n internals: [],\n timestampMs: Math.max(...incomingInternals.map((i) => i.timestampMs))\n })\n })\n\n tokenTransfersData.forEach((transfer, index) => {\n // Blockscout API may return tx_hash or transaction_hash depending on version\n const txHash = transfer.tx_hash || transfer.transaction_hash\n // Skip transfers without transaction hash (cannot be displayed in explorer)\n if (!txHash) {\n return\n }\n\n // Blockscout API returns value in transfer.total.value or transfer.value\n const rawValue = transfer.total?.value ?? transfer.value ?? '0'\n const amount = toBigInt(rawValue)\n if (amount === 0n) {\n return\n }\n\n const toHash = transfer.to?.hash ?? ''\n const fromHash = transfer.from?.hash ?? ''\n const toLower = toHash.toLowerCase()\n const fromLower = fromHash.toLowerCase()\n const direction: HistoryDirection = toLower === lowerAddress ? 'in' : 'out'\n const counterparty = direction === 'in' ? fromHash : toHash\n if (!counterparty || ENTRYPOINT_ADDRESSES.has(counterparty.toLowerCase())) {\n return\n }\n\n const tsInput = transfer.timestamp\n const timestampMs =\n typeof tsInput === 'number'\n ? tsInput > 1e12\n ? tsInput\n : tsInput * 1000\n : tsInput\n ? new Date(tsInput).getTime()\n : now\n\n // Decimals can be in transfer.total.decimals or transfer.token.decimals\n const decimalsRaw = transfer.total?.decimals ?? transfer.token?.decimals\n const decimals =\n typeof decimalsRaw === 'string' ? parseInt(decimalsRaw, 10) : typeof decimalsRaw === 'number' ? decimalsRaw : 18\n const assetSymbol = transfer.token?.symbol || 'Token'\n\n const tokenItem: HistoryItem = {\n id: `token-${txHash}-${index}`,\n kind: 'token',\n hash: txHash,\n parentHash: txHash,\n direction,\n counterparty,\n counterpartyName: null,\n counterpartyIsContract: false,\n value: rawValue,\n status: 'ok',\n timestampMs: Number.isFinite(timestampMs) ? timestampMs : now,\n method: 'ERC20',\n blockNumber: transfer.block_number ?? 0,\n badgeLabel: assetSymbol.toUpperCase(),\n assetSymbol: assetSymbol.toUpperCase(),\n decimals: Number.isFinite(decimals) ? Number(decimals) : 18,\n isEntryPoint: false\n }\n\n groups.push({\n id: tokenItem.id,\n parent: tokenItem,\n internals: [],\n timestampMs: tokenItem.timestampMs\n })\n })\n\n const filteredGroups = groups.filter((group) => {\n const parent = group.parent\n if (parent.kind === 'token') {\n return true\n }\n const amount = toBigInt(parent.value)\n if (amount === 0n) {\n return false\n }\n const counterpartyLower = parent.counterparty?.toLowerCase?.() || ''\n if (ENTRYPOINT_ADDRESSES.has(counterpartyLower)) {\n return false\n }\n if (parent.assetSymbol && parent.assetSymbol !== nativeSymbol) {\n return amount > 0n\n }\n return true\n })\n\n filteredGroups.sort((a, b) => b.timestampMs - a.timestampMs)\n\n const result = filteredGroups.slice(0, MAX_HISTORY_ITEMS)\n\n // Cache the result\n setCachedData(chainConfig.id, address, result)\n\n return result\n}\n\nexport { getTransactionsListQuery, TRANSACTIONS_HISTORY_QUERY_KEY, type HistoryGroup }\n","import { getExplorerUrl } from '../../clients/base'\n\nexport const formatAddress = (addr: string) => {\n if (!addr) return 'Unknown'\n if (!addr.startsWith('0x') || addr.length <= 12) {\n return addr\n }\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`\n}\n\nexport const parseValue = (value: string) => {\n try {\n return BigInt(value || '0')\n } catch {\n return 0n\n }\n}\n\nfunction formatIntl(price: number, fractionDigits: number) {\n const formatter = Intl.NumberFormat('en-US', {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits\n })\n return formatter.format(price)\n}\n\nexport const formatValue = (value: string, decimals = 18) => {\n const amount = parseValue(value)\n if (amount === 0n) return '0'\n\n if (decimals <= 0) {\n return amount.toString()\n }\n\n const scale = 10n ** BigInt(decimals)\n const whole = amount / scale\n const fraction = amount % scale\n\n if (fraction === 0n) {\n return formatIntl(Number(whole), 0)\n }\n\n const fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '')\n const trimmed = fractionStr.slice(0, Math.min(6, fractionStr.length))\n return `${formatIntl(Number(whole), 0)}.${trimmed}`\n}\n\nexport const openInExplorer = (txHash: string | undefined) => {\n if (!txHash) {\n return\n }\n const explorerUrl = getExplorerUrl()\n window.open(`${explorerUrl}/tx/${txHash}`, '_blank')\n}\n\nexport const formatTimestamp = (timestampMs: number) => {\n try {\n return new Date(timestampMs).toLocaleString()\n } catch {\n return ''\n }\n}\n","import { useT } from '@/src/i18n'\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Copy } from 'lucide-react'\n\nimport { LumiaIcon } from '../../assets/LumiaIcon'\nimport { NegativeIcon } from '../../assets/NegativeIcon'\nimport { PositiveIcon } from '../../assets/PositiveIcon'\n//\nimport { cn } from '../../lib/utils'\nimport { Button } from '../ui/button'\nimport type { HistoryGroup } from './api'\nimport { formatAddress, formatTimestamp, formatValue, openInExplorer, parseValue } from './utils'\n\ninterface TransactionsGroupProps {\n group: HistoryGroup\n expanded: boolean\n onToggleExpanded: (groupId: string) => void\n}\n\ninterface InternalTransactionProps {\n internal: HistoryGroup['internals'][number]\n assetSymbol: string\n assetDecimals: number\n}\n\nfunction InternalTransaction({ internal, assetSymbol, assetDecimals }: InternalTransactionProps) {\n const internalSymbol = internal.assetSymbol || assetSymbol\n const internalDecimals = internal.decimals ?? assetDecimals\n\n const { t } = useT()\n\n return (\n <div className=\"border-t border-dashed border-[var(--l-pass-bd)]\">\n <div className=\"flex gap-2 items-center justify-between\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">{internal.method || 'CALL'}</span>\n\n <span>\n {formatValue(internal.value, internalDecimals)} {internalSymbol}\n </span>\n </div>\n\n <span className=\"text-[10px]\">\n <span className=\"text-[var(--l-pass-fg-muted)]\">\n {internal.direction === 'in' ? t('passport:common.from') : t('passport:common.to')}\n {': '}\n </span>\n\n <span className=\"font-mono\">{internal.counterpartyName || formatAddress(internal.counterparty)}</span>\n </span>\n </div>\n )\n}\n\nexport function TransactionsGroup(props: TransactionsGroupProps) {\n const { group, expanded, onToggleExpanded } = props\n\n const { t } = useT()\n\n const { parent } = group\n const isIncoming = parent.direction === 'in'\n const assetSymbol = parent.assetSymbol || 'LUMIA'\n const assetDecimals = parent.decimals ?? 18\n\n const internalsToRender = group.internals.filter((internal) => parseValue(internal.value) !== 0n)\n\n return (\n <div\n onClick={() => openInExplorer(parent.parentHash)}\n className={cn(\n 'w-full flex flex-col gap-1 p-[var(--l-pass-pd)] rounded-[var(--l-pass-el-bdrs)]',\n 'transition-colors cursor-pointer',\n 'bg-transparent hover:bg-[var(--l-pass-secondary-h)] active:bg-[var(--l-pass-secondary-a)]'\n )}\n >\n <div className=\"flex items-center justify-between gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-1 flex-0 w-fit\">\n {parent.direction === 'in' ? <ChevronLeft className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\n\n <span className=\"text-[10px] uppercase\">\n {isIncoming ? t('passport:common.received') : t('passport:common.sent')}\n </span>\n\n {parent.status === 'ok' ? <PositiveIcon /> : <NegativeIcon />}\n\n {/* {parent.badgeLabel && (\n <span\n className={cn(\n 'text-xs uppercase text-[var(--l-pass-fg)] px-2 py-1 rounded-full',\n 'bg-[var(--l-pass-secondary)]'\n )}\n >\n {parent.badgeLabel}\n </span>\n )} */}\n </div>\n\n <span className=\"block flex-0 font-mono text-[10px] text-[var(--l-pass-fg-muted)]\">\n {formatTimestamp(group.timestampMs)}\n </span>\n </div>\n\n <div className=\"flex items-center justify-between gap-[var(--l-pass-gap)]\">\n <div className=\"flex flex-col gap-0\">\n <span className=\"font-bold\">\n {formatValue(parent.value, assetDecimals)} {assetSymbol}\n </span>\n\n <span className=\"text-[10px] font-mono text-[var(--l-pass-fg-muted)]\">\n {isIncoming ? t('passport:common.from') : t('passport:common.to')}\n {': '}\n {parent.counterpartyName || formatAddress(parent.counterparty)}\n </span>\n </div>\n\n <div className=\"flex items-center gap-0\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n >\n <Copy className=\"w-4 h-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n >\n <LumiaIcon className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {internalsToRender.length > 0 && (\n <>\n <div className=\"w-full flex items-center h-4\">\n <div style={{ borderTop: '1px solid var(--l-pass-bd)' }} className=\"flex-1\" />\n </div>\n\n <div\n className=\"w-full rounded-[var(--l-pass-el-bdrs)] border border-dashed border-[var(--l-pass-bd)]\"\n onClick={(event) => event.stopPropagation()}\n >\n <Button\n variant=\"ghost\"\n size=\"small\"\n className=\"w-full justify-between text-[10px]\"\n onClick={() => onToggleExpanded(group.id)}\n >\n <span>\n {t('passport:transactionsMenu.internalTransactions')} ({internalsToRender.length})\n </span>\n\n {expanded ? (\n <ChevronUp className=\"w-4 h-4 text-[var(--l-pass-fg-muted)]\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-[var(--l-pass-fg-muted)]\" />\n )}\n\n {/* <span className=\"text-[var(--l-pass-fg-muted)]\">\n {expanded ? t('passport:common.hide') : t('passport:common.show')}\n </span> */}\n </Button>\n\n {expanded && (\n <div className=\"px-2 pb-2 flex flex-col gap-2 text-xs\">\n {internalsToRender.map((internal) => (\n <InternalTransaction\n key={internal.id}\n internal={internal}\n assetSymbol={assetSymbol}\n assetDecimals={assetDecimals}\n />\n ))}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n )\n}\n","import { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useT } from '@/src/i18n'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { ArrowLeft, Loader, RefreshCw, XCircle } from 'lucide-react'\nimport { CSSProperties, useCallback, useState } from 'react'\n\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { Expandable } from '../Expandable'\n// import { DummyListElements } from '../A_Temp'\nimport { Button } from '../ui/button'\nimport { Highlight } from '../ui/highlight'\nimport { getTransactionsListQuery, TRANSACTIONS_HISTORY_QUERY_KEY } from './api'\nimport { TransactionsGroup } from './TransactionsGroup'\nimport { isTransactionHistorySupported } from './txUrls'\n\nexport interface TransactionsModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onBack?: () => void\n}\n\nexport function TransactionsMenu() {\n const qc = useQueryClient()\n const address = useLumiaPassportSession((st) => st.address)\n const chainConfig = useLumiaPassportSession((st) => st.chainConfig)\n\n const { t } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const maxScrollHeight = useLayoutStore((st) => st.maxScrollHeight)\n\n const [expandedGroups, setExpandedGroups] = useState<Record<string, boolean>>({})\n\n const historySupported = isTransactionHistorySupported(chainConfig?.id)\n\n const {\n data: txHistoryGroups = [],\n isLoading: isTxHistoryLoading,\n isFetching: isTxHistoryFetching,\n error: txHistoryError\n } = useQuery({\n retry: false,\n enabled: !!address && !!chainConfig?.id && historySupported,\n queryKey: [TRANSACTIONS_HISTORY_QUERY_KEY, chainConfig.id, address],\n queryFn: () => getTransactionsListQuery({ address, chainConfig })\n })\n\n const refreshTxHistory = useCallback(\n () => qc.invalidateQueries({ queryKey: [TRANSACTIONS_HISTORY_QUERY_KEY, chainConfig.id, address] }),\n [qc, chainConfig.id, address]\n )\n\n const txHistoryResolvedError = txHistoryError\n ? txHistoryError instanceof Error\n ? txHistoryError.message\n : 'Failed to load transactions'\n : null\n\n return (\n <div\n style={\n {\n '--l-pass-scrollbar-mah': `${maxScrollHeight}px`,\n '--l-pass-list-scrollbar-pd-r': 'var(--l-pass-pd)'\n } as CSSProperties\n }\n className=\"list-scrollbar-y w-full p-[var(--l-pass-pd)]\"\n >\n {/* --------------------------------------------------------------------------------------------------------------- */\n /* -------- EXPANDABLE is designed to adjust its height automatically whenever ANY 1ST LEVEL CHILD changes! ------ */\n /* In order to ensure smooth expand animation consistency do not use 2nd (or 3rd etc) nested conditional rendering */\n /* elements, cause it might outcome Expandable not reacting to deeply nested elements' height changes ---------- */\n /* --------------------------------------------------------------------------------------------------------------- */}\n <Expandable isExpanded contentClassName=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n <Button variant=\"ghost\" size=\"icon\" title=\"Back\" onClick={() => setPage(PageKey.SETTINGS)}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n\n <span className=\"text-xl font-semibold\">{t('passport:transactionsMenu.title')}</span>\n\n {historySupported && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={refreshTxHistory}\n disabled={isTxHistoryFetching}\n title=\"Refresh transactions\"\n >\n {isTxHistoryFetching ? <Loader className=\"h-4 w-4 animate-spin\" /> : <RefreshCw className=\"h-4 w-4\" />}\n </Button>\n )}\n </div>\n\n {!historySupported && (\n <Highlight type=\"warning\">\n <span>{t('passport:transactionsMenu.comingSoon')}</span>\n </Highlight>\n )}\n\n {historySupported && isTxHistoryLoading && (\n <div className=\"flex items-center justify-center p-8\">\n <Loader className=\"w-4 h-4 animate-spin\" />\n </div>\n )}\n\n {historySupported && !isTxHistoryLoading && txHistoryResolvedError && (\n <Highlight type=\"error\" className=\"flex gap-[var(--l-pass-gap)]\">\n <XCircle className=\"w-4 h-4 flex-none\" />\n <span className=\"block w-full flex-1 text-center text-xs\">{txHistoryResolvedError}</span>\n </Highlight>\n )}\n\n {historySupported && !isTxHistoryLoading && !txHistoryResolvedError && txHistoryGroups.length === 0 && (\n <Highlight type=\"warning\">\n <span>{t('passport:transactionsMenu.noTransactions')}</span>\n </Highlight>\n )}\n\n {historySupported && !isTxHistoryLoading && !txHistoryResolvedError && txHistoryGroups.length > 0 && (\n <div className=\"w-full flex flex-col gap-[var(--l-pass-gap)]\">\n {txHistoryGroups.map((group) => (\n <TransactionsGroup\n key={group.id}\n group={group}\n expanded={expandedGroups[group.id] ?? false}\n onToggleExpanded={(groupId) => setExpandedGroups((prev) => ({ ...prev, [groupId]: !prev[groupId] }))}\n />\n ))}\n\n {/* <DummyListElements qty={32} /> */}\n </div>\n )}\n </Expandable>\n </div>\n )\n}\n","export { TransactionsMenu } from './TransactionsMenu'\nexport { TRANSACTIONS_HISTORY_QUERY_KEY } from './api'\n","import { PageKey } from '../hooks/useLayoutDataStore'\nimport { AuthMenu } from './AuthMenu'\nimport { BuyMenu } from './BuyMenu'\nimport { ChainsMenu, ChainSwitchRequest } from './ChainsMenu'\nimport { KeyshareBackupMenu, KeyshareRestoreMenu } from './KeyshareRestoreMenu'\nimport { KycMenu } from './KYC'\nimport { LanguagesMenu } from './LanguagesMenu'\nimport { MainMenu } from './MainMenu'\nimport { ManageWalletMenu, UnlinkProviderMenu } from './ManageWalletMenu'\nimport { NicknameMenu } from './NicknameMenu'\nimport { PortfolioMenu } from './PortfolioMenu'\nimport { SecurityMenu } from './SecurityMenu'\nimport { ReceiveLumiaMenu, SendLumiaMenu } from './SendRecieveMenu'\nimport { SettingsMenu } from './SettingsMenu'\nimport { TermsOfService } from './TermsOfService'\nimport { TransactionsMenu } from './TransactionsMenu'\n\nexport interface PageItem {\n key: PageKey\n title: string\n description: string\n component: React.ComponentType\n}\n\n// TODO: remove Partial when all pages are implemented\nexport const PAGE_MAP: Partial<Record<PageKey, PageItem>> = {\n [PageKey.AUTH]: {\n key: PageKey.AUTH,\n title: 'Authentication Menu',\n description: 'Authenticate to access your wallet',\n component: AuthMenu\n },\n\n [PageKey.TERMS_OF_SERVICE]: {\n key: PageKey.TERMS_OF_SERVICE,\n title: 'Terms of LumiaPassport',\n description: 'Read the Terms of LumiaPassport Service',\n component: TermsOfService\n },\n\n [PageKey.LANGUAGES]: {\n key: PageKey.LANGUAGES,\n title: 'Languages',\n description: 'Select language',\n component: LanguagesMenu\n },\n\n [PageKey.MAIN_MENU]: {\n key: PageKey.MAIN_MENU,\n title: 'Main Menu',\n description: 'Overview of your wallet',\n component: MainMenu\n },\n\n [PageKey.SETTINGS]: {\n key: PageKey.SETTINGS,\n title: 'Settings',\n description: 'Explore your wallet details and settings',\n component: SettingsMenu\n },\n\n [PageKey.SEND]: {\n key: PageKey.SEND,\n title: 'Send Menu',\n description: 'Send LUMIA tokens to another address',\n component: SendLumiaMenu\n },\n\n [PageKey.RECEIVE]: {\n key: PageKey.RECEIVE,\n title: 'Receive Menu',\n description: 'Your wallet address and QR code for receiving LUMIA',\n component: ReceiveLumiaMenu\n },\n\n [PageKey.BUY]: {\n key: PageKey.BUY,\n title: 'Buy Menu',\n description: 'Buy LUMIA for fiat',\n component: BuyMenu\n },\n\n [PageKey.KYC]: {\n key: PageKey.KYC,\n title: 'KYC Verification',\n description: 'Complete KYC verification process',\n component: KycMenu\n },\n\n [PageKey.TRANSACTIONS]: {\n key: PageKey.TRANSACTIONS,\n title: 'Transaction History Menu',\n description: 'View your transaction history',\n component: TransactionsMenu\n },\n\n [PageKey.ASSETS]: {\n key: PageKey.ASSETS,\n title: 'Assets Portfolio Menu',\n description: 'View your token balances and assets',\n component: PortfolioMenu\n },\n\n [PageKey.MANAGE_WALLET]: {\n key: PageKey.MANAGE_WALLET,\n title: 'Manage Wallet',\n description: 'Manage Wallet Providers',\n component: ManageWalletMenu\n },\n\n [PageKey.SECURITY]: {\n key: PageKey.SECURITY,\n title: 'Security',\n description: 'Keyshare and vault status',\n component: SecurityMenu\n },\n\n [PageKey.KEYSARE_BACKUP]: {\n key: PageKey.KEYSARE_BACKUP,\n title: 'Keyshare Backup',\n description: 'Create and manage encrypted backups of your keyshare',\n component: KeyshareBackupMenu\n },\n\n [PageKey.KEYSHARE_RESTORE]: {\n key: PageKey.KEYSHARE_RESTORE,\n title: 'Keyshare Restore',\n description: 'Restore your wallet from backup',\n component: KeyshareRestoreMenu\n },\n\n [PageKey.UNLINK_PROVIDER]: {\n key: PageKey.UNLINK_PROVIDER,\n title: 'Remove Provider',\n description:\n 'This will permanently unlink provider from your account. You may lose access if this is your only verified method.',\n component: UnlinkProviderMenu\n },\n\n [PageKey.CHAIN]: {\n key: PageKey.CHAIN,\n title: 'Chain',\n description: 'Switch between Chains',\n component: ChainsMenu\n },\n\n [PageKey.CHAIN_SWITCH_REQUEST]: {\n key: PageKey.CHAIN_SWITCH_REQUEST,\n title: 'Chain Switch Request',\n description: 'Chain Switch Request',\n component: ChainSwitchRequest\n },\n\n [PageKey.NICKNAME_SETTINGS]: {\n key: PageKey.NICKNAME_SETTINGS,\n title: 'Nickname Settings',\n description: 'View and manage your @nickname',\n component: NicknameMenu\n }\n}\n","// import { omit, pick } from 'lodash-es'\nimport { useCallback, useEffect } from 'react'\n\nimport { PAGE_MAP, type PageItem } from '../components/PageMap'\nimport { MAIN_DIALOG_ANIMATION_SPEED } from '../constants'\nimport {\n // PageKey,\n useLayoutDataStore\n} from './useLayoutDataStore'\nimport { useLayoutStore } from './useLayoutStore'\n\nconst CLEAR_DIALOG_TIMEOUT = MAIN_DIALOG_ANIMATION_SPEED + 5 // ms, synced with dialog close animation duration to prevent flickering\n\n/**\n * Hook to map page keys to dialog content and manage dialog state\n * @description Only use within LumiaPassportSessionProvider\n */\nexport function usePageMapper() {\n const page = useLayoutDataStore((st) => st.page)\n\n const {\n setDialogTitle,\n setDialogDescription,\n setIsDialogForced,\n setDialogContent,\n setIsDialogOpen,\n setIsDialogClosing\n } = useLayoutStore()\n\n const closeDialog = useCallback(() => {\n setIsDialogClosing(true)\n\n setTimeout(() => {\n setDialogContent(null)\n setDialogDescription(null)\n setDialogTitle(null)\n setIsDialogForced(false)\n setIsDialogClosing(false)\n setIsDialogOpen(false)\n }, CLEAR_DIALOG_TIMEOUT) // wait for close animation, then clear content\n }, [setDialogContent, setDialogDescription, setDialogTitle, setIsDialogForced, setIsDialogOpen, setIsDialogClosing])\n\n const openDialog = useCallback(\n (pageItem: PageItem) => {\n const PageContentComponent = pageItem.component\n\n setDialogTitle(pageItem.title)\n setDialogDescription(pageItem.description)\n setDialogContent(<PageContentComponent />)\n setIsDialogOpen(true)\n },\n [setDialogContent, setDialogDescription, setDialogTitle, setIsDialogOpen]\n )\n\n useEffect(() => {\n if (page === null) return closeDialog()\n\n const pageItem = PAGE_MAP[page]\n\n if (!pageItem) {\n alert(`[PASSPORT MAPPER]: Requested page \"${page}\" is not existing or not allowed. Closing dialog...`)\n closeDialog()\n return\n }\n\n openDialog(pageItem)\n }, [page, closeDialog, openDialog])\n}\n","// import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { useQuery } from '@tanstack/react-query'\nimport { useEffect } from 'react'\n\nimport { jwtTokenManager } from '../auth'\nimport { getUserProfile, QUERY_KEYS } from '../clients/profile'\nimport { PageKey, useLayoutDataStore } from './useLayoutDataStore'\n\nconst EMAIL_NOT_CONNECTED_NOTIFICATION = {\n id: 'email-not-connected',\n target: PageKey.MANAGE_WALLET,\n message: 'Email is not connected'\n}\n\nconst COMPLETE_KYC_PROGRESS = {\n id: 'backup-is-not-created',\n target: PageKey.KYC,\n message: 'Complete KYC process'\n}\n\nexport function useSettingsNotifications() {\n const address = useLumiaPassportSession((st) => st.address)\n\n // const hasServerVault = useLumiaPassportSession((st) => st.hasServerVault)\n const setSettingsNotifications = useLayoutDataStore((st) => st.setSettingsNotifications)\n\n const providers = jwtTokenManager.getProviders() // Get providers from JWT tokens (faster than API call)\n const hasEmail = providers.includes('email')\n\n const { data: userProfile = null } = useQuery({\n retry: false,\n enabled: !!address,\n queryKey: [QUERY_KEYS.userProfile, address],\n queryFn: getUserProfile\n })\n\n // Backup Not Created Notification\n useEffect(() => {\n const isKYCVerified = userProfile?.kycDetails?.kycStatus === 'verified'\n\n setSettingsNotifications({\n ...COMPLETE_KYC_PROGRESS,\n status: isKYCVerified ? 'resolved' : 'active'\n })\n }, [userProfile, setSettingsNotifications])\n\n // Email Not Connected Notification\n useEffect(() => {\n setSettingsNotifications({\n ...EMAIL_NOT_CONNECTED_NOTIFICATION,\n status: hasEmail ? 'resolved' : 'active'\n })\n }, [hasEmail, setSettingsNotifications])\n}\n","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useEffect } from 'react'\n\nimport { Footer } from '../../components/Footer'\nimport { Header } from '../../components/Header'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '../../components/ui/dialog'\nimport { VisuallyHidden } from '../../components/ui/visually-hidden'\nimport { Y_ANIMATION_SETUP } from '../../constants'\nimport { useListenIframeAuthEvents } from '../../hooks//useListenIframeAuthEvents'\nimport { useAutoConnect } from '../../hooks/useAutoConnect'\nimport { useBackupStatusChanges } from '../../hooks/useBackupStatusChanges'\nimport { useDetectMaxScrollHeight } from '../../hooks/useDetectMaxScrollHeight'\nimport { PageKey, useLayoutDataStore } from '../../hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../../hooks/useLayoutStore'\nimport { usePageMapper } from '../../hooks/usePageMapper'\nimport { useSettingsNotifications } from '../../hooks/useSettingsNotifications'\n\n/** Main LumiaPassport Dialog Component. DO NOT EXPORT OR USE DIRECTLY OUTSIDE THE LumiaPassportSessionProvider */\nexport function LumiaPassportDialog() {\n const config = useLumiaPassportConfig().config\n\n const className = config.current?.ui?.dialogClassName\n const session = useLumiaPassportSession((st) => st.session)\n const hasServerVault = useLumiaPassportSession((st) => st.hasServerVault)\n\n const page = useLayoutDataStore((st) => st.page)\n const transitionPageHeight = useLayoutDataStore((st) => st.transitionPageHeight)\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n const { colorMode, isDialogOpen, dialogTitle, dialogDescription, dialogContent, isDialogForced, setIsSettings } =\n useLayoutStore()\n\n useEffect(() => setIsSettings(!!session), [session, setIsSettings])\n\n /** CRITICAL */\n usePageMapper() // Dialog content manager\n useAutoConnect() // Auto-connect handler\n useBackupStatusChanges() // Listen for backup status changes and update vault status accordingly\n useDetectMaxScrollHeight() // Layout view detector\n useSettingsNotifications() // Watch settings button notifications\n useListenIframeAuthEvents() // Listen for iframe auth events\n /** CRITICAL */\n\n const isHeaderHidden = !session || (page === PageKey.KEYSARE_BACKUP && !hasServerVault)\n\n return (\n <Dialog\n open={isDialogOpen}\n onOpenChange={(open) => {\n if (isDialogForced) return\n if (!open) setPage(null)\n }}\n >\n <DialogContent colorMode={colorMode} className={className}>\n <VisuallyHidden>\n <DialogTitle>{dialogTitle}</DialogTitle>\n </VisuallyHidden>\n\n <DialogDescription className=\"sr-only\">{dialogDescription}</DialogDescription>\n\n {!isHeaderHidden && <Header />}\n\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={page || 'empty'}\n initial={{ opacity: 0, height: transitionPageHeight }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: transitionPageHeight }}\n style={{ overflow: 'hidden' }}\n transition={Y_ANIMATION_SETUP}\n >\n {dialogContent}\n </motion.div>\n </AnimatePresence>\n\n <Footer />\n </DialogContent>\n </Dialog>\n )\n}\n","export { LumiaPassportDialog } from './LumiaPassportDialog'\n","import React, { useCallback } from 'react'\n\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext'\nimport { ensureKeyshare } from '../auth'\nimport { createAccountSession, getEntryPointDeposit, type AccountSession } from '../clients'\n\ninterface TssManagerProps {\n mpcPin?: string\n}\n\nexport default function TssManager(props: TssManagerProps) {\n const { mpcPin } = props\n\n const usePaymaster = useLumiaPassportSession((st) => st.usePaymaster)\n const publicClient = useLumiaPassportSession((st) => st.publicClient)\n const activeChainId = useLumiaPassportSession((st) => st.activeChainId)\n const setStatus = useLumiaPassportSession((st) => st.setStatus)\n const setSession = useLumiaPassportSession((st) => st.setSession)\n const setAddress = useLumiaPassportSession((st) => st.setAddress)\n\n const onSessionCreated = useCallback(\n (session: AccountSession, address: `0x${string}`) => {\n setSession(session)\n setAddress(address)\n },\n [setSession, setAddress]\n )\n\n const createSessionWithKeyshare = React.useCallback(\n async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n setStatus('checking key management setup...')\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser)\n setStatus('creating smart account...')\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: mpcPin || undefined, usePaymaster, chainId: activeChainId! })\n const addr = sess.address || sess.smartAccountAddress\n setStatus('loading account data...')\n\n if (!publicClient) {\n throw new Error('Public client not initialized. Store may not be hydrated yet.')\n }\n\n try {\n await getEntryPointDeposit(addr)\n } catch {}\n onSessionCreated(sess, addr)\n return { session: sess, address: addr }\n },\n [mpcPin, usePaymaster, activeChainId, publicClient, onSessionCreated, setStatus]\n )\n\n return null\n}\n\nexport interface TssManagerRef {\n createSessionWithKeyshare: (\n userId: string,\n hasServerKeyshare: boolean,\n isNewUser?: boolean\n ) => Promise<{ session: AccountSession; address: `0x${string}` }>\n}\n\nexport const TssManagerWithRef = React.forwardRef<TssManagerRef, TssManagerProps>((props, ref) => {\n const { mpcPin } = props\n\n const usePaymaster = useLumiaPassportSession((st) => st.usePaymaster)\n const publicClient = useLumiaPassportSession((st) => st.publicClient)\n const activeChainId = useLumiaPassportSession((st) => st.activeChainId)\n const setStatus = useLumiaPassportSession((st) => st.setStatus)\n const setSession = useLumiaPassportSession((st) => st.setSession)\n const setAddress = useLumiaPassportSession((st) => st.setAddress)\n\n const onSessionCreated = useCallback(\n (session: AccountSession, address: `0x${string}`) => {\n setSession(session)\n setAddress(address)\n },\n [setSession, setAddress]\n )\n\n const createSessionWithKeyshare = React.useCallback(\n async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n setStatus('checking key management setup...')\n\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser)\n\n setStatus('creating smart account...')\n\n const sess = await createAccountSession({\n mpcUserId: userId,\n mpcPin: mpcPin || undefined,\n usePaymaster: usePaymaster,\n chainId: activeChainId\n })\n const addr = sess.address || sess.smartAccountAddress\n\n setStatus('loading account data...')\n\n if (!publicClient) {\n throw new Error('Public client not initialized. Store may not be hydrated yet.')\n }\n\n try {\n await getEntryPointDeposit(addr)\n } catch {}\n\n onSessionCreated(sess, addr)\n\n return { session: sess, address: addr }\n },\n [setStatus, usePaymaster, activeChainId, publicClient, mpcPin]\n )\n\n React.useImperativeHandle(ref, () => ({ createSessionWithKeyshare }), [createSessionWithKeyshare])\n\n return null\n})\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\nimport type { Address } from 'viem';\n\nexport interface WalletLinkRequest {\n address: Address;\n signature: string;\n message: string;\n chainId: number;\n walletName?: string; // e.g., \"MetaMask\", \"Rainbow\", \"Coinbase Wallet\"\n walletType?: string; // e.g., \"metaMask\", \"rainbow\", \"coinbaseWallet\" (connector id)\n}\n\nexport async function linkWallet(walletData: WalletLinkRequest): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/wallet`, {\n method: 'POST',\n body: JSON.stringify(walletData)\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link wallet: ${response.statusText}`);\n }\n}\n\nexport async function unlinkWallet(address: Address): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/unlink/wallet?address=${encodeURIComponent(address)}`, {\n method: 'DELETE'\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink wallet: ${response.statusText}`);\n }\n}\n\nexport function createSignatureMessage(address: Address, nonce?: string): string {\n const timestamp = Date.now();\n const nonceValue = nonce || Math.random().toString(36).substring(2, 15);\n\n return `Mbark Wallet Link\\n\\nAddress: ${address}\\nNonce: ${nonceValue}\\nTimestamp: ${timestamp}\\n\\nSign this message to link your wallet to Mbark Wallet`;\n}","import { useLumiaPassportConfig } from '@/src/context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '@/src/context/LumiaPassportSessionContext'\nimport { LINKED_PROFILES_QUERY_KEY } from '@/src/modules/linkedProfiles'\n//\nimport { useConnectModal } from '@rainbow-me/rainbowkit'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport React, { useCallback, useEffect } from 'react'\nimport { useAccount, useDisconnect, useSignMessage } from 'wagmi'\n\nimport { createSignatureMessage, linkWallet } from '../auth/providers/wallet'\nimport { useAuthStore } from '../components/AuthMenu'\nimport { PageKey, useLayoutDataStore } from '../hooks/useLayoutDataStore'\nimport { PROVIDERS_QUERY_KEY, useManageWalletStore } from './ManageWalletMenu'\n\n// import type { Address } from 'viem';\n\nexport function WalletConnectHandler() {\n const qc = useQueryClient()\n const callbacks = useLumiaPassportConfig().callbacks\n const passportWalletAddress = useLumiaPassportSession((st) => st.address)\n\n const { address: walletAddress, isConnected, chain, connector } = useAccount()\n const { openConnectModal, connectModalOpen } = useConnectModal()\n const { disconnect } = useDisconnect()\n const { signMessageAsync } = useSignMessage()\n\n const isWalletLinking = useLayoutDataStore((st) => st.isWalletLinking)\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setIsWalletLinking = useLayoutDataStore((st) => st.setIsWalletLinking)\n\n const setAuthError = useAuthStore((st) => st.setAlert)\n\n const setManageWalletLinkError = useManageWalletStore((st) => st.setLinkError)\n const setLinkIsLoading = useManageWalletStore((st) => st.setLinkIsLoading)\n const setProviderType = useManageWalletStore((st) => st.setProviderType)\n\n const onLinkingComplete = useCallback(\n async (success: boolean) => {\n // console.log('[WalletConnectHandler] onLinkingComplete called:', { success, userAddress })\n\n setIsWalletLinking(false)\n\n // Handle success=false scenarios\n if (!success && !passportWalletAddress) {\n setProviderType(null)\n setPage(PageKey.AUTH)\n\n return\n }\n\n if (!success && passportWalletAddress) {\n setProviderType(null)\n setPage(PageKey.MANAGE_WALLET)\n\n return\n }\n\n // Handle success=true scenarios\n setProviderType(null)\n setPage(PageKey.MANAGE_WALLET)\n\n // Invalidate and refetch providers & linked profiles after successful link\n await qc.invalidateQueries({ queryKey: [PROVIDERS_QUERY_KEY, passportWalletAddress], refetchType: 'active' })\n await qc.invalidateQueries({\n queryKey: [LINKED_PROFILES_QUERY_KEY, passportWalletAddress],\n refetchType: 'active'\n })\n\n // Also try refetching explicitly\n // await qc.refetchQueries({ queryKey: [PROVIDERS_QUERY_KEY, userAddress] })\n\n try {\n callbacks?.onLumiaPassportUpdate?.({ providers: qc.getQueryData([PROVIDERS_QUERY_KEY, passportWalletAddress]) })\n } catch {}\n },\n [qc, passportWalletAddress, callbacks, setProviderType, setPage, setIsWalletLinking]\n )\n\n const [hasStartedLinking, setHasStartedLinking] = React.useState(false)\n\n // Open modal when requested\n useEffect(() => {\n if (isWalletLinking && !hasStartedLinking) {\n setHasStartedLinking(true)\n setProviderType(null) // Reset providerType to prevent social auth hooks from triggering\n\n // Always disconnect first to ensure clean state\n if (isConnected) {\n disconnect()\n\n setTimeout(() => {\n setPage(null) // Close LumiaPassport dialog if open\n openConnectModal()\n }, 500) // Wait for disconnect to complete\n } else {\n setPage(null) // Close LumiaPassport dialog if open\n openConnectModal() // If not connected, open modal immediately\n }\n }\n\n // Reset state when isLinking becomes false\n if (!isWalletLinking && hasStartedLinking) {\n setHasStartedLinking(false)\n\n // Also disconnect if still connected\n if (isConnected) disconnect()\n }\n }, [isWalletLinking, hasStartedLinking, isConnected, openConnectModal, disconnect, setPage, setProviderType])\n\n // Handle modal close - reset wallet linking state when user closes the modal without connecting\n useEffect(() => {\n // console.log('[WalletConnectHandler] Modal state check:', {\n // hasStartedLinking,\n // connectModalOpen,\n // isConnected,\n // isWalletLinking\n // })\n if (hasStartedLinking && !connectModalOpen && !isConnected && isWalletLinking) {\n // Modal was closed without connecting - reset state\n console.log('[WalletConnectHandler] Modal closed without connecting')\n onLinkingComplete(false)\n setHasStartedLinking(false)\n }\n }, [connectModalOpen, hasStartedLinking, isConnected, isWalletLinking])\n\n const { mutate: handleWalletSign, isPending: isWalletSigning } = useMutation({\n mutationFn: async (payload: { chainId?: number; signingWalletAddress?: `0x${string}` }) => {\n const { chainId, signingWalletAddress } = payload\n\n // if (!walletAddress || !chain) {\n if (!signingWalletAddress || !chainId) {\n disconnect()\n\n if (passportWalletAddress) {\n setManageWalletLinkError('Wallet error! No wallet available')\n } else {\n setAuthError({ title: 'Wallet error', message: 'No wallet available' })\n }\n\n setIsWalletLinking(false)\n setHasStartedLinking(false)\n onLinkingComplete(false)\n\n setPage(passportWalletAddress ? PageKey.MANAGE_WALLET : PageKey.AUTH)\n\n return\n }\n\n // try {\n setLinkIsLoading(true)\n\n // Create signature message\n const message = createSignatureMessage(signingWalletAddress)\n\n // Request signature from wallet\n // const signature = await signMessageAsync({ message })\n const signature = await signMessageAsync({ message, account: signingWalletAddress })\n\n if (!signature) {\n throw new Error('Failed to get signature')\n }\n\n // Get wallet metadata\n const walletName = connector?.name || 'Unknown Wallet'\n const walletType = connector?.id || 'unknown'\n\n // console.log('[WalletConnectHandler] Wallet metadata:', {\n // walletAddress,\n // walletName,\n // walletType,\n // connectorInfo: connector\n // })\n\n // TODO: only link & unlink method exist, need connect method creating LP account\n // Link wallet to account with metadata\n return await linkWallet({\n // chainId: chain.id,\n chainId,\n address: signingWalletAddress,\n signature,\n message,\n walletName,\n walletType\n })\n },\n\n onSuccess: () => {\n disconnect()\n\n setHasStartedLinking(false)\n onLinkingComplete(true) // Notify success - this will trigger providers reload in parent component\n\n setLinkIsLoading(false)\n },\n\n onError: (err) => {\n // Disconnect on error\n disconnect()\n\n setIsWalletLinking(false)\n onLinkingComplete(false)\n setHasStartedLinking(false)\n setLinkIsLoading(false)\n\n // User friendly error messages\n const errorMsg = err?.message || 'Failed to link wallet'\n if (errorMsg.includes('User rejected') || errorMsg.includes('User denied')) {\n if (passportWalletAddress) {\n setManageWalletLinkError('Signature request was cancelled')\n } else {\n setAuthError({ title: 'Signature error', message: 'Signature request was cancelled' })\n }\n } else if (errorMsg.includes('already linked')) {\n if (passportWalletAddress) {\n setManageWalletLinkError('This wallet is already linked to another account')\n } else {\n setAuthError({ title: 'Wallet error', message: 'This wallet is already linked to another account' })\n }\n } else {\n if (passportWalletAddress) {\n setManageWalletLinkError(errorMsg)\n } else {\n setAuthError({ title: 'Error', message: errorMsg })\n }\n }\n\n setPage(passportWalletAddress ? PageKey.MANAGE_WALLET : PageKey.AUTH)\n }\n })\n\n // Handle wallet connection and signing\n useEffect(() => {\n if (!!chain?.id && isConnected && walletAddress && isWalletLinking && hasStartedLinking) {\n console.log('[WalletConnectHandler] handleWalletSign triggered')\n handleWalletSign({ chainId: chain.id, signingWalletAddress: walletAddress })\n }\n }, [chain, isConnected, walletAddress, isWalletLinking, hasStartedLinking])\n\n return null // This component doesn't render anything\n}\n","// used only as store types\nimport {\n createBundlerClientForChain,\n createPublicClientForChain,\n DEFAULT_CHAIN_ID,\n getChainConfig,\n getViemChain,\n type ChainConfig\n // isChainSupported,\n} from '@embarkai/core/read'\nimport { Fragment, type PropsWithChildren } from 'react'\nimport type { Chain, PublicClient } from 'viem'\nimport type { BundlerClient } from 'viem/account-abstraction'\nimport { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nimport { type AccountSession } from '../internal/clients/account'\nimport { BalanceFeedProvider } from '../internal/components/BalanceFeedProvider'\nimport { ChainSync } from '../internal/components/ChainSync'\nimport { LumiaPassportDialog } from '../internal/components/Dialog'\nimport { TssManagerWithRef } from '../internal/components/TssManager'\nimport { WalletConnectHandler } from '../internal/components/WalletConnectHandler'\nimport { type WalletReadyStatus } from '../internal/lib/iframe-manager'\nimport { useLumiaPassportConfig } from './LumiaPassportContext'\n\nexport interface ChainParams {\n activeChainId: number\n publicClient: ReturnType<typeof createPublicClientForChain>\n bundlerClient: ReturnType<typeof createBundlerClientForChain>\n chainConfig: ReturnType<typeof getChainConfig>\n viemChain: ReturnType<typeof getViemChain>\n}\n\ninterface SessionState {\n session: AccountSession | null\n address: `0x${string}` | null\n status: string\n error: string | null\n recoveryUserId: string | null\n isIframeReady: boolean\n usePaymaster: boolean\n hasServerVault: boolean\n isLoading: boolean\n //\n //chain params\n activeChainId: number | null\n publicClient: PublicClient | null\n bundlerClient: BundlerClient | null\n chainConfig: ChainConfig | null\n viemChain: Chain | null\n /** Tracks if user explicitly selected a chain (vs using dApp config default) */\n // isChainUserSelected: boolean\n\n walletReadyStatus: WalletReadyStatus | null\n\n setUsePaymaster: (usePaymaster: boolean) => void\n setIsIframeReady: (ready: boolean) => void\n setSession: (s: AccountSession | null) => void\n setAddress: (a: `0x${string}` | null) => void\n setStatus: (s: string) => void\n setError: (e: string | null) => void\n setRecoveryUserId: (userId: string | null) => void\n setHasServerVault: (hasServerVault: boolean) => void\n setIsLoading: (isLoading: boolean) => void\n setWalletReadyStatus: (status: WalletReadyStatus) => void\n\n setActiveChainId: (activeChainId: number | null) => void\n setActiveChain: (chainParams: ChainParams) => void\n}\n\nexport function getChainParams(chainCfg: ChainConfig): ChainParams {\n return {\n activeChainId: chainCfg.id,\n chainConfig: chainCfg,\n publicClient: createPublicClientForChain(chainCfg.id),\n bundlerClient: createBundlerClientForChain(chainCfg.id),\n viemChain: getViemChain(chainCfg.id)\n }\n}\n\n/**\n * @function useLumiaPassportSession is UNLIKELY to use outside Lumia Passport, as it is INTERNAL zustand session store!\n * Use it with caution, using zustand callback extraction. EX: const address = useLumiaPassportSession((st) => st.address)\n * @description refactor your app to NOT use this directly in your application, use set of new dedicated session hooks: useLumiaPassportAccountSession, useLumiaPassportAddress, etc.\n */\nexport const useLumiaPassportSession = create<SessionState>()(\n persist(\n (set) => ({\n isLoading: false,\n\n usePaymaster: true,\n\n session: null,\n address: null,\n status: 'idle',\n error: null,\n\n recoveryUserId: null,\n\n isIframeReady: false,\n hasServerVault: true, // assume true until proven otherwise to not throw red warnings before checking\n\n walletReadyStatus: null,\n\n // Will be set after hydration from localStorage or default to TESTNET\n activeChainId: null,\n // isChainUserSelected: false,\n publicClient: null,\n bundlerClient: null,\n chainConfig: null,\n viemChain: null,\n\n setIsLoading: (isLoading) => set({ isLoading }),\n\n setUsePaymaster: (usePaymaster) => set({ usePaymaster }),\n setIsIframeReady: (ready) => set({ isIframeReady: ready }),\n\n setSession: (s) => set({ session: s }),\n setAddress: (a) => set({ address: a }),\n setStatus: (s) => set({ status: s }),\n setError: (e) => set({ error: e }),\n\n setRecoveryUserId: (userId) => set({ recoveryUserId: userId }),\n setHasServerVault: (hasServerVault) => set({ hasServerVault }),\n\n setWalletReadyStatus: (status) => set({ walletReadyStatus: status }),\n\n setActiveChainId: (activeChainId) => set({ activeChainId }),\n setActiveChain: (chainParams) => set({ ...chainParams })\n\n // Multi-chain support: update active chain\n // setActiveChainId: (chainParams) => {\n // const newPublicClient = createPublicClientForChain(chainId)\n // const newBundlerClient = createBundlerClientForChain(chainId)\n // const chainConfig = getChainConfig(chainId)\n // const viemChain = getViemChain(chainId)\n\n // set({\n // activeChainId: chainParams.chainId,\n // publicClient: chainParams.newPublicClient,\n // bundlerClient: chainParams.newBundlerClient,\n // chainConfig: chainParams.chainConfig,\n // viemChain: chainParams.viemChain\n // // isChainUserSelected: true, // Mark as user-selected\n // })\n // }\n }),\n {\n name: 'lumia-passport-session',\n // Only persist activeChainId and isChainUserSelected (other session data is ephemeral)\n partialize: (state) => ({\n activeChainId: state.activeChainId\n // isChainUserSelected: state.isChainUserSelected\n }),\n // Set default chainId after hydration if not persisted\n onRehydrateStorage: () => (state) => {\n if (!state) return\n\n const hydartedChain = getChainParams(getChainConfig(state.activeChainId || DEFAULT_CHAIN_ID))\n\n state.activeChainId = hydartedChain.activeChainId\n state.publicClient = hydartedChain.publicClient\n state.bundlerClient = hydartedChain.bundlerClient\n state.chainConfig = hydartedChain.chainConfig\n state.viemChain = hydartedChain.viemChain\n }\n }\n )\n)\n\n/**\n * Require active chain ID from session store (for non-React usage)\n * Throws an error if the chain ID is not yet set (e.g., before store hydration)\n *\n * @returns Current active chain ID\n * @throws Error if activeChainId is null (store not hydrated yet)\n *\n * @example\n * ```typescript\n * import { requireActiveChainId } from '@embarkai/ui-kit'\n *\n * // In non-React code (e.g., sendUserOperation)\n * const chainId = requireActiveChainId()\n * const client = createPublicClientForChain(chainId)\n * ```\n */\nexport const requireActiveChainId = (): number => {\n const chainId = useLumiaPassportSession.getState().activeChainId\n console.log('[requireActiveChainId] = ', chainId)\n if (chainId === null) {\n throw new Error(\n 'Active chain ID is not set. Store may not be hydrated yet. ' +\n 'Please ensure LumiaPassportSessionProvider is mounted before calling operations.'\n )\n }\n return chainId\n}\n\nexport function LumiaPassportSessionProvider({ children }: PropsWithChildren) {\n const config = useLumiaPassportConfig().config\n\n // console.log('[--- PASSPORT PROVIDER RENDER ---]: should be as less as possible')\n\n return (\n <Fragment>\n {children}\n\n {/** Wallet connection handler - works besides dialog state */}\n {config.current?.wallet?.enabled && <WalletConnectHandler />}\n\n {/** Balance Feed */}\n <BalanceFeedProvider />\n\n {/** Chain Sync on inint & chain switch */}\n <ChainSync />\n\n {/** Tss Session Manager */}\n <TssManagerWithRef\n // ref={tssManagerRef}\n mpcPin={undefined}\n />\n\n {/** Main LumiaPassport Dialog */}\n <LumiaPassportDialog />\n </Fragment>\n )\n}\n","/**\n * Universal environment variable access that works in both ESM and CJS builds\n */\n\ninterface EnvVars {\n VITE_FORCE_LEGACY_GAS?: string;\n VITE_LEGACY_GAS_CHAIN_IDS?: string;\n NODE_ENV?: string;\n MODE?: string;\n}\n\nfunction getEnvironmentVars(): EnvVars {\n // Try browser environment first (Vite)\n if (typeof window !== 'undefined' && (window as any).__EMBARK_ENV__) {\n return (window as any).__EMBARK_ENV__;\n }\n\n // Try import.meta.env (ESM/Vite)\n if (typeof globalThis !== 'undefined' && (globalThis as any).import?.meta?.env) {\n return (globalThis as any).import.meta.env;\n }\n\n // Try process.env (Node.js/CJS)\n if (typeof process !== 'undefined' && process.env) {\n return process.env as unknown as EnvVars;\n }\n\n // Fallback for browser environment without explicit env\n return {};\n}\n\nexport function getEnvVar(name: string): string | undefined {\n const env = getEnvironmentVars();\n return (env as any)[name];\n}\n\nexport function getEnvVarBool(name: string): boolean {\n const value = getEnvVar(name);\n return value === 'true' || value === '1';\n}\n\nexport function getEnvVarArray(name: string, separator = ','): string[] {\n const value = getEnvVar(name);\n return value ? value.split(separator).map(s => s.trim()).filter(Boolean) : [];\n}\n\nexport function getAllEnvVars(): EnvVars {\n return getEnvironmentVars();\n}\n","import { requireActiveChainId } from '../../context/LumiaPassportSessionContext';\nimport { getChainConfig, getViemChain, lumiaMainnetChain, lumiaTestnetChain } from '@embarkai/core/read'\nimport { http, type Chain } from 'viem';\nimport { createBundlerClient } from 'viem/account-abstraction';\nimport { getServiceUrls } from '../../config/lumiaPassport';\nimport { getEnvVar } from '../utils/env';\n\n// Unified service URL resolution for all endpoints\nexport function getTssUrl(): string {\n const serviceUrls = getServiceUrls()\n const paramUrl =\n typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('tssUrl') || undefined : undefined\n const envUrl = getEnvVar('VITE_LUMIA_TSS_URL') || getEnvVar('LUMIA_TSS_URL')\n return paramUrl || serviceUrls.tssUrl || envUrl || 'http://localhost:9256'\n}\n\nexport function getBundlerUrl(): string {\n const serviceUrls = getServiceUrls()\n const paramUrl =\n typeof window !== 'undefined'\n ? new URLSearchParams(window.location.search).get('bundlerUrl') || undefined\n : undefined\n const envUrl = getEnvVar('VITE_LUMIA_BUNDLER_URL') || getEnvVar('LUMIA_BUNDLER_URL')\n const proxyPath = '/bundler'\n return (paramUrl || serviceUrls.bundlerUrl || envUrl || 'http://localhost:4337').replace(/^\\/$/, proxyPath)\n}\n\nexport function getShareVaultUrl(): string {\n const serviceUrls = getServiceUrls()\n const paramUrl =\n typeof window !== 'undefined'\n ? new URLSearchParams(window.location.search).get('shareVaultUrl') || undefined\n : undefined\n const envUrl = getEnvVar('VITE_LUMIA_SHARE_VAULT_URL') || getEnvVar('LUMIA_SHARE_VAULT_URL')\n return paramUrl || serviceUrls.shareVaultUrl || envUrl || 'http://localhost:9090'\n}\n\n// Network selection and defaults\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NETWORK = typeof __EMBARK_NETWORK__ !== 'undefined' ? (__EMBARK_NETWORK__ as string) : ''\n\nfunction getSelectedNetwork(): 'beam' | 'prisma' {\n const paramNet =\n typeof window !== 'undefined'\n ? (new URLSearchParams(window.location.search).get('network') || '').toLowerCase()\n : ''\n const envNet = (getEnvVar('VITE_LUMIA_NETWORK') || getEnvVar('LUMIA_NETWORK') || BUILD_NETWORK || '').toLowerCase()\n const net = (paramNet || envNet) as string\n return net === 'prisma' ? 'prisma' : 'beam'\n}\n\nexport function getExplorerUrl(): string {\n const paramUrl =\n typeof window !== 'undefined'\n ? new URLSearchParams(window.location.search).get('explorerUrl') || undefined\n : undefined\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const net = getSelectedNetwork()\n\n const chainId = requireActiveChainId()\n const chainConfig = getChainConfig(chainId)\n\n console.log('[getExplorerUrl] ', paramUrl, chainConfig.blockExplorerUrl)\n return paramUrl || chainConfig.blockExplorerUrl\n}\n\n// Note: Previously exported BUNDLER_URL and TSS_URL constants have been removed\n// Always use getBundlerUrl(), getTssUrl(), getShareVaultUrl() functions instead\n// to ensure dynamic configuration updates are reflected\n\n// For backward compatibility\nexport const lumiaBeamTestnet: Chain = lumiaTestnetChain\n\n// For backward compatibility\nexport const lumiaPrisma: Chain = lumiaMainnetChain\n\nexport const FUNDER_PK = getEnvVar('VITE_FUNDER_PK') || ''\n\n// NOTE: publicClient and bundlerClient are now managed in Zustand SessionState (LumiaPassportSessionContext)\n// and recreated dynamically when the active chain changes. The setPublicClient function from\n// @embarkai/core/bundler is called from the store to update the global client used for gas fee calculations.\n\n// Create bundler client dynamically to get the latest URL\nexport function getBundlerClient() {\n const chainId = requireActiveChainId()\n const chainConfig = getChainConfig(chainId)\n const viemChain = getViemChain(chainId)\n return createBundlerClient({\n chain: viemChain,\n transport: http(chainConfig.bundlerUrl, { timeout: 10_000, retryCount: 0, fetchOptions: { mode: 'cors' } })\n })\n}\n","// Client-side backup functionality for keyshares\n// Provides encrypted backup options: Server, Cloud (iCloud/etc), Local file\n\nimport { logSdkError } from '@embarkai/core/internal/error-tracking'\n\nimport { jwtTokenManager } from './auth'\nimport { createPasskeyHelpers } from './auth/passkey'\nimport { getShareVaultUrl, getTssUrl } from './clients/base'\nimport { createHttpClient } from './clients/httpClient'\n\nexport interface KeyshareBackupData {\n userId: string\n sessionId: string\n keyshare: string\n ownerAddress: `0x${string}`\n createdAt: number\n version: string\n}\n\nexport interface EncryptedBackup {\n data: string\n iv: string\n salt: string\n version: string\n checksum: string\n magic: string\n encryptionMethod: 'passkey' | 'password'\n createdAt: number\n credentialId?: string // WebAuthn credential ID (required for passkey method)\n}\n\nexport interface EnvelopeEncryptedShare {\n ciphertext_share: string\n wrapped_dek: string\n kdf: { prf: string; hkdf: string; info: string }\n alg: { data: string; wrap: string }\n aad: { userId: string; version: number; deviceId?: string }\n createdAt?: string\n expiresAt?: string | null\n // Server spec fields for encryption method tracking\n encryptionMethod?: 'passkey' | 'password' // for client guidance during recovery\n credentialId?: string // WebAuthn credential ID (required for passkey method)\n // Optional nonces for server-stored format (IVs may be separate or embedded)\n nonce_wrap?: string\n nonce_share?: string\n}\n\nexport type BackupMethod = 'server' | 'cloud' | 'local'\n\nexport class PasswordValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'PasswordValidationError'\n }\n}\n\nexport const BACKUP_MAGIC = 'LUMIA_PASSPORT_BACKUP_V1'\nconst BACKUP_VERSION = '1.0'\n\nexport function getBackupEncryptionMethod(backupFile: EncryptedBackup): 'passkey' | 'password' | 'unknown' {\n if (backupFile.encryptionMethod) return backupFile.encryptionMethod\n return 'unknown'\n}\n\nexport function isCloudShareSupported(): { supported: boolean; canShareFiles: boolean } {\n if (typeof navigator === 'undefined' || !navigator.share) return { supported: false, canShareFiles: false }\n const canShareFiles = navigator.canShare?.({ files: [new File(['test'], 'test.txt')] }) ?? false\n return { supported: true, canShareFiles }\n}\n\nexport async function checkPasskeyAvailability(userId: string): Promise<boolean> {\n try {\n if (!navigator.credentials || !window.PublicKeyCredential) return false\n const challengeString = `lumia-check:${userId}`\n const challenge = new TextEncoder().encode(challengeString)\n const credential = await navigator.credentials.get({\n publicKey: { challenge, allowCredentials: [], userVerification: 'preferred', timeout: 5000 }\n })\n return !!credential\n } catch {\n return false\n }\n}\n\nexport interface BackupStatus {\n server: { enabled: boolean; lastBackup?: number; error?: string }\n cloud: { enabled: boolean; lastBackup?: number; error?: string }\n local: { enabled: boolean; lastBackup?: number; error?: string }\n}\n\n// Using unified URL functions from base.ts\n\ninterface ShareVaultToken {\n token: string\n expiresAt: number\n}\n\nasync function getShareVaultToken(scopes: string[]): Promise<ShareVaultToken> {\n const httpClient = createHttpClient(getTssUrl())\n\n const response = await httpClient.post('/api/auth/token/exchange', {\n scopes,\n audience: 'lumia-passport-share-vault-service',\n ttl: 300\n })\n\n if (!response.success) {\n throw new Error(`Failed to get Share Vault token: ${response.error}`)\n }\n\n const data = response.data as { resourceToken?: string; expiresIn?: number }\n if (!data?.resourceToken) {\n throw new Error(`Invalid token response: ${JSON.stringify(data)}`)\n }\n\n return {\n token: data.resourceToken,\n expiresAt: Date.now() + (data.expiresIn || 300) * 1000\n }\n}\n\n// Share API types (aligned with Vault docs)\nexport interface RecoveryStatsDeviceEntry {\n deviceId: string\n name?: string\n count: number\n lastAt: string\n ip?: string\n ua?: string\n secChUa?: string\n browser?: string\n}\nexport interface RecoveryStatsCreatedMeta {\n at: string\n ip?: string\n ua?: string\n secChUa?: string\n browser?: string\n deviceId?: string\n deviceName?: string\n country?: string\n encryptionMethod?: 'passkey' | 'password'\n}\nexport interface RecoveryStats {\n created: RecoveryStatsCreatedMeta\n devices: RecoveryStatsDeviceEntry[]\n}\n\nexport async function getShareRecoveryStats(): Promise<RecoveryStats | null> {\n try {\n const token = await getShareVaultToken(['share:get'])\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/recovery/stats`, {\n method: 'GET',\n headers: { 'Authorization': `Bearer ${token.token}`, 'Content-Type': 'application/json' }\n })\n if (response.status === 404) return null\n if (!response.ok) return null\n return await response.json()\n } catch {\n return null\n }\n}\n\nexport async function getShare(): Promise<EnvelopeEncryptedShare | null> {\n const token = await getShareVaultToken(['share:get'])\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, {\n method: 'GET',\n headers: { 'Authorization': `Bearer ${token.token}`, 'Content-Type': 'application/json' }\n })\n if (response.status === 404) return null\n if (!response.ok) throw new Error(`Failed to fetch share: ${response.status} ${response.statusText}`)\n return (await response.json()) as EnvelopeEncryptedShare\n}\n\nexport async function uploadShare(share: EnvelopeEncryptedShare, idempotencyKey: string): Promise<{ etag: string }> {\n const token = await getShareVaultToken(['share:put'])\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token.token}`,\n 'Content-Type': 'application/json',\n 'Idempotency-Key': idempotencyKey\n },\n body: JSON.stringify(share)\n })\n if (!response.ok) throw new Error(`Failed to upload share: ${response.status} ${response.statusText}`)\n return (await response.json()) as { etag: string }\n}\n\nexport async function rewrapShare(\n payload: {\n wrapped_dek: string\n nonce_wrap?: string\n alg?: { wrap: string }\n kdf?: { prf: string; hkdf?: string; info?: string }\n },\n idempotencyKey: string\n): Promise<{ etag: string }> {\n const token = await getShareVaultToken(['share:rewrap'])\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/rewrap`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token.token}`,\n 'Content-Type': 'application/json',\n 'Idempotency-Key': idempotencyKey\n },\n body: JSON.stringify(payload)\n })\n if (!response.ok) throw new Error(`Failed to rewrap share: ${response.status} ${response.statusText}`)\n return (await response.json()) as { etag: string }\n}\n\nexport async function deleteShare(): Promise<void> {\n const token = await getShareVaultToken(['share:delete'])\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${token.token}` }\n })\n if (!response.ok && response.status !== 404)\n throw new Error(`Failed to delete share: ${response.status} ${response.statusText}`)\n}\n\nasync function decryptShareEnvelopeWithPasskey(\n userId: string,\n share: EnvelopeEncryptedShare\n): Promise<KeyshareBackupData> {\n if (!share.nonce_wrap || !share.nonce_share) throw new Error('Invalid share envelope: missing nonces')\n const kek = await deriveKEKFromPasskey(userId, share.credentialId)\n const kekKey = await crypto.subtle.importKey('raw', kek, 'AES-GCM', false, ['decrypt'])\n const wrappedDekBytes = base64ToBytes(share.wrapped_dek)\n const nonceWrapBytes = base64ToBytes(share.nonce_wrap)\n const dekBytesBuffer = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonceWrapBytes as BufferSource }, kekKey, wrappedDekBytes as BufferSource)\n const dekKey = await crypto.subtle.importKey('raw', new Uint8Array(dekBytesBuffer), 'AES-GCM', false, ['decrypt'])\n const cipherBytes = base64ToBytes(share.ciphertext_share)\n const nonceShareBytes = base64ToBytes(share.nonce_share)\n const plain = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonceShareBytes as BufferSource }, dekKey, cipherBytes as BufferSource)\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(new Uint8Array(plain)))\n}\n\nasync function deriveKEKFromPasskey(userId: string, requiredCredentialId?: string): Promise<ArrayBuffer> {\n const challengeString = `lumia-kek:${userId}`\n const challenge = new TextEncoder().encode(challengeString)\n\n // Helper function to decode base64url credential ID\n function base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/')\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0\n const padded = base64 + '='.repeat(pad)\n const binary = atob(padded)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n }\n\n // Use required credential ID if provided (from server backup), otherwise fallback to stored credential ID\n const targetCredentialId = requiredCredentialId || createPasskeyHelpers(userId).getCredId()\n\n const allowCredentials: PublicKeyCredentialDescriptor[] = targetCredentialId\n ? [{ id: base64urlToUint8Array(targetCredentialId) as BufferSource, type: 'public-key' as const }]\n : []\n\n try {\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required',\n extensions: { prf: { eval: { first: challenge } } }\n }\n })) as PublicKeyCredential\n\n if (credential) {\n const extensionResults = (credential as any).getClientExtensionResults?.()\n\n if (extensionResults?.prf?.results?.first) {\n return extensionResults.prf.results.first as ArrayBuffer\n }\n }\n\n // Fallback: HKDF on credential id\n const credentialIdBytes = new TextEncoder().encode(credential.id)\n const keyMaterial = await crypto.subtle.importKey('raw', credentialIdBytes, 'HKDF', false, ['deriveBits'])\n const kekBytes = await crypto.subtle.deriveBits(\n { name: 'HKDF', hash: 'SHA-256', salt: challenge, info: new TextEncoder().encode('client-share') },\n keyMaterial,\n 256\n )\n return kekBytes\n } catch (error) {\n logSdkError(error instanceof Error ? error : new Error('Passkey operation failed'), { userId }, 'vault')\n throw error\n }\n}\n\nasync function deriveKeyFromPassword(password: string, salt: Uint8Array): Promise<CryptoKey> {\n const encoder = new TextEncoder()\n const keyMaterial = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, [\n 'deriveBits',\n 'deriveKey'\n ])\n const key = await crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt: salt as BufferSource, iterations: 150000, hash: 'SHA-256' },\n keyMaterial,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt']\n )\n return key\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const bin = atob(base64)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\nfunction bytesToBase64(bytes: Uint8Array): string {\n let bin = ''\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i])\n return btoa(bin)\n}\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n// Demo-app compatible encrypt/decrypt for file backups\nasync function encryptKeyshare(\n data: KeyshareBackupData,\n password: string,\n encryptionMethod: 'passkey' | 'password' = 'password',\n credentialId?: string\n): Promise<EncryptedBackup> {\n const encoder = new TextEncoder()\n const plaintext = JSON.stringify(data)\n const salt = crypto.getRandomValues(new Uint8Array(16))\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits'])\n const keyMaterial = await crypto.subtle.deriveBits(\n { name: 'PBKDF2', salt: salt as BufferSource, iterations: 100000, hash: 'SHA-256' },\n passwordKey,\n 256\n )\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['encrypt'])\n const iv = crypto.getRandomValues(new Uint8Array(12))\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: iv as BufferSource }, key, encoder.encode(plaintext))\n const checksumData = `${data.userId}:${data.sessionId}:${encryptionMethod}`\n const checksumBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(checksumData))\n const checksum = bytesToBase64(new Uint8Array(checksumBuffer))\n const timestamp = Date.now()\n return {\n data: bytesToBase64(new Uint8Array(encryptedData)),\n iv: bytesToBase64(iv),\n salt: bytesToBase64(salt),\n version: BACKUP_VERSION,\n checksum,\n magic: BACKUP_MAGIC,\n encryptionMethod,\n createdAt: timestamp,\n credentialId: encryptionMethod === 'passkey' ? credentialId : undefined\n }\n}\n\nasync function decryptKeyshare(encryptedBackup: EncryptedBackup, password: string): Promise<KeyshareBackupData> {\n try {\n if (encryptedBackup.magic && encryptedBackup.magic !== BACKUP_MAGIC)\n throw new PasswordValidationError('Invalid backup file format')\n if (encryptedBackup.version && encryptedBackup.version !== BACKUP_VERSION)\n throw new PasswordValidationError(`Unsupported backup version: ${encryptedBackup.version}`)\n } catch (e) {\n if (e instanceof PasswordValidationError) throw e\n }\n try {\n const encoder = new TextEncoder()\n const decoder = new TextDecoder()\n const salt = base64ToBytes(encryptedBackup.salt)\n const iv = base64ToBytes(encryptedBackup.iv)\n const encryptedData = base64ToBytes(encryptedBackup.data)\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits'])\n const keyMaterial = await crypto.subtle.deriveBits(\n { name: 'PBKDF2', salt: salt as BufferSource, iterations: 100000, hash: 'SHA-256' },\n passwordKey,\n 256\n )\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['decrypt'])\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: iv as BufferSource }, key, encryptedData as BufferSource)\n const plaintext = decoder.decode(decryptedData)\n const backupData = JSON.parse(plaintext) as KeyshareBackupData\n if (encryptedBackup.checksum) {\n const expected = `${backupData.userId}:${backupData.sessionId}:${encryptedBackup.encryptionMethod || 'password'}`\n const expectedBuf = await crypto.subtle.digest('SHA-256', encoder.encode(expected))\n const expectedChecksum = bytesToBase64(new Uint8Array(expectedBuf))\n if (expectedChecksum !== encryptedBackup.checksum)\n throw new PasswordValidationError('Backup integrity check failed - file may be corrupted or tampered with')\n }\n return backupData\n } catch (error: any) {\n const message = error?.message || String(error)\n const name = error?.name || 'Error'\n if (name === 'OperationError' || message.includes('decrypt'))\n throw new PasswordValidationError('Incorrect password - unable to decrypt backup file')\n if (error instanceof SyntaxError || message.includes('JSON'))\n throw new PasswordValidationError('Corrupted backup file - decryption succeeded but data is invalid')\n throw new Error(`Failed to decrypt backup: ${message}`)\n }\n}\n\nasync function deriveBackupPasswordFromPasskey(\n userId: string,\n credentialId?: string\n): Promise<{ password: string; credentialId: string }> {\n const challengeString = `lumia-backup-key:${userId}`\n const challenge = new TextEncoder().encode(challengeString)\n\n let allowCredentials: PublicKeyCredentialDescriptor[] = []\n\n // If credentialId is provided, use it for more deterministic passkey selection\n if (credentialId) {\n try {\n // Convert base64url credential ID to bytes\n const base64 = credentialId.replace(/-/g, '+').replace(/_/g, '/')\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0\n const paddedBase64 = base64 + '='.repeat(pad)\n const credentialIdBytes = Uint8Array.from(atob(paddedBase64), (c) => c.charCodeAt(0))\n\n allowCredentials = [\n {\n id: credentialIdBytes,\n type: 'public-key',\n transports: ['internal', 'hybrid']\n }\n ]\n } catch (error) {\n console.warn(\n '[deriveBackupPasswordFromPasskey] Failed to parse credentialId, falling back to open selection:',\n error\n )\n }\n }\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required'\n }\n })) as PublicKeyCredential\n\n if (credential && credential.response) {\n const credentialIdBytes = new TextEncoder().encode(credential.id)\n const combined = new Uint8Array(credentialIdBytes.length + challengeString.length)\n combined.set(credentialIdBytes, 0)\n combined.set(new TextEncoder().encode(challengeString), credentialIdBytes.length)\n const password = bytesToBase64(combined)\n\n // Return both password and the actual credential ID used\n return { password, credentialId: credential.id }\n }\n throw new Error('Passkey key derivation failed - user must provide password manually')\n}\n\nexport function getBackupStatus(userId: string): BackupStatus {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n const statusData = storage?.getItem(`lumia-passport.backup.status.${userId}`)\n if (statusData) {\n try {\n return JSON.parse(statusData)\n } catch {}\n }\n return { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } }\n}\n\nexport function updateBackupStatus(\n userId: string,\n method: BackupMethod,\n status: Partial<BackupStatus[BackupMethod]>\n): void {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n if (!storage) return\n const current = getBackupStatus(userId)\n ;(current as any)[method] = { ...(current as any)[method], ...status }\n storage.setItem(`lumia-passport.backup.status.${userId}`, JSON.stringify(current))\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lumia-passport-backup-status-changed', { detail: { method, status, currentStatus: current } })\n )\n }\n}\n\nexport function clearBackupStatus(userId: string): void {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n storage?.removeItem(`lumia-passport.backup.status.${userId}`)\n}\n\nexport async function checkServerBackupAvailability(): Promise<{ hasBackup: boolean; serviceAvailable: boolean }> {\n try {\n const token = await getShareVaultToken(['share:get'])\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/recovery/stats`, {\n method: 'GET',\n headers: { 'Authorization': `Bearer ${token.token}`, 'Content-Type': 'application/json' }\n })\n if (response.status === 404) return { hasBackup: false, serviceAvailable: true }\n if (!response.ok) return { hasBackup: false, serviceAvailable: false }\n return { hasBackup: true, serviceAvailable: true }\n } catch {\n return { hasBackup: false, serviceAvailable: false }\n }\n}\n\nasync function uploadShareToVault(envelope: EnvelopeEncryptedShare, token: string): Promise<void> {\n const idempotencyKey = crypto.randomUUID ? crypto.randomUUID() : `backup-${Date.now()}`\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n 'Idempotency-Key': idempotencyKey\n },\n body: JSON.stringify(envelope)\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to upload share: ${response.status} ${response.statusText} - ${errorText}`)\n }\n}\n\nasync function downloadShareFromVault(token: string): Promise<EnvelopeEncryptedShare> {\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'X-Client-Device-Id': 'lumia-ui-kit',\n 'X-Client-Device-Name': 'Lumia UI Kit'\n }\n })\n if (!response.ok) {\n if (response.status === 404) throw new Error('No backup found on server for this user')\n const errorText = await response.text()\n throw new Error(`Failed to download share: ${response.status} ${response.statusText} - ${errorText}`)\n }\n const envelope = (await response.json()) as EnvelopeEncryptedShare\n if (!envelope.ciphertext_share || !envelope.wrapped_dek || !envelope.kdf || !envelope.alg || !envelope.aad)\n throw new Error('Invalid envelope structure received from Share Vault')\n return envelope\n}\n\nasync function envelopeEncryptKeyshare(data: KeyshareBackupData, userId: string): Promise<EnvelopeEncryptedShare> {\n // Get the credential ID that will be used for encryption\n const passkeyHelpers = createPasskeyHelpers(userId)\n const credentialId = passkeyHelpers.getCredId()\n\n const dek = crypto.getRandomValues(new Uint8Array(32))\n const kekBytes = await deriveKEKFromPasskey(userId)\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['encrypt'])\n const plaintext = JSON.stringify(data)\n const plaintextBytes = new TextEncoder().encode(plaintext)\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt'])\n const dataIv = crypto.getRandomValues(new Uint8Array(12))\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes)\n const wrapIv = crypto.getRandomValues(new Uint8Array(12))\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kek, dek)\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength)\n ciphertextWithIv.set(dataIv, 0)\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length)\n const wrappedDekWithIv = new Uint8Array(wrapIv.length + wrappedDekData.byteLength)\n wrappedDekWithIv.set(wrapIv, 0)\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), wrapIv.length)\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'webauthn-prf', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'passkey', // Track encryption method\n credentialId: credentialId || undefined // Save the credential ID used for encryption\n }\n}\n\nasync function envelopeEncryptKeyshareWithPassword(\n data: KeyshareBackupData,\n password: string\n): Promise<EnvelopeEncryptedShare> {\n // Generate DEK and derive KEK from password\n const dek = crypto.getRandomValues(new Uint8Array(32))\n const salt = crypto.getRandomValues(new Uint8Array(16))\n const kekKey = await deriveKeyFromPassword(password, salt)\n\n const plaintext = JSON.stringify(data)\n const plaintextBytes = new TextEncoder().encode(plaintext)\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt'])\n const dataIv = crypto.getRandomValues(new Uint8Array(12))\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes)\n const wrapIv = crypto.getRandomValues(new Uint8Array(12))\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, dek)\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength)\n ciphertextWithIv.set(dataIv, 0)\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length)\n const wrappedDekWithIv = new Uint8Array(salt.length + wrapIv.length + wrappedDekData.byteLength)\n wrappedDekWithIv.set(salt, 0)\n wrappedDekWithIv.set(wrapIv, salt.length)\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), salt.length + wrapIv.length)\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'pbkdf2', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'password' // Track encryption method\n }\n}\n\nasync function envelopeDecryptKeyshare(envelope: EnvelopeEncryptedShare, userId: string): Promise<KeyshareBackupData> {\n const kekBytes = await deriveKEKFromPasskey(userId, envelope.credentialId)\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['decrypt'])\n\n const wrappedDekWithIv = base64ToBytes(envelope.wrapped_dek)\n const wrapIv = wrappedDekWithIv.slice(0, 12)\n const wrappedDekData = wrappedDekWithIv.slice(12)\n\n try {\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kek, wrappedDekData)\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt'])\n\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share)\n const dataIv = ciphertextWithIv.slice(0, 12)\n const encryptedData = ciphertextWithIv.slice(12)\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData)\n\n const plaintext = new TextDecoder().decode(decryptedData)\n const result = JSON.parse(plaintext) as KeyshareBackupData\n return result\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Envelope decryption failed'),\n { hasCredentialId: !!envelope.credentialId },\n 'vault'\n )\n if (error instanceof Error && error.name === 'OperationError') {\n const credentialHint = envelope.credentialId\n ? `The backup requires a specific passkey (ID: ${envelope.credentialId.slice(-8)}...)`\n : 'The backup was encrypted with a different passkey than the one you selected'\n throw new Error(\n `Passkey mismatch: ${credentialHint}. If you have multiple passkeys, please try again and select the correct passkey that was used when creating this backup.`\n )\n }\n throw new Error('Failed to decrypt keyshare: ' + (error instanceof Error ? error.message : String(error)))\n }\n}\n\nasync function envelopeDecryptKeyshareWithPassword(\n envelope: EnvelopeEncryptedShare,\n password: string\n): Promise<KeyshareBackupData> {\n const wrappedDekWithSaltAndIv = base64ToBytes(envelope.wrapped_dek)\n\n // Extract salt (16 bytes), wrapIv (12 bytes), and wrapped DEK data\n const salt = wrappedDekWithSaltAndIv.slice(0, 16)\n const wrapIv = wrappedDekWithSaltAndIv.slice(16, 28)\n const wrappedDekData = wrappedDekWithSaltAndIv.slice(28)\n\n try {\n // Derive KEK from password using the same salt\n const kekKey = await deriveKeyFromPassword(password, salt)\n\n // Decrypt the DEK\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, wrappedDekData)\n\n // Import DEK as crypto key\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt'])\n\n // Decrypt main data\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share)\n const dataIv = ciphertextWithIv.slice(0, 12)\n const encryptedData = ciphertextWithIv.slice(12)\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData)\n\n const plaintext = new TextDecoder().decode(decryptedData)\n const result = JSON.parse(plaintext) as KeyshareBackupData\n return result\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Password decryption failed'),\n { errorName: error instanceof Error ? error.name : 'unknown' },\n 'vault'\n )\n if (error instanceof Error && error.name === 'OperationError') {\n throw new Error('Incorrect password: Unable to decrypt the backup with the provided password.')\n }\n throw new Error(\n 'Failed to decrypt keyshare with password: ' + (error instanceof Error ? error.message : String(error))\n )\n }\n}\n\nexport async function backupToServer(userId: string, password?: string): Promise<void> {\n const storageData = typeof window !== 'undefined' ? window.localStorage : undefined\n const keyshareData = storageData?.getItem(`tss.${userId}.keyshare`)\n const sessionId = storageData?.getItem(`tss.${userId}.sessionId`)\n const ownerAddress = storageData?.getItem(`tss.${userId}.ownerAddress`)\n\n if (!keyshareData || !sessionId || !ownerAddress) throw new Error('No keyshare data available for backup')\n\n const backupData = {\n userId,\n sessionId,\n keyshare: keyshareData,\n ownerAddress: ownerAddress as `0x${string}`,\n createdAt: Date.now(),\n version: BACKUP_VERSION\n }\n\n // Create envelope with appropriate encryption method\n const envelope = password\n ? await envelopeEncryptKeyshareWithPassword(backupData, password)\n : await envelopeEncryptKeyshare(backupData, userId)\n\n const vaultToken = await getShareVaultToken(['share:put'])\n await uploadShareToVault(envelope, vaultToken.token)\n updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now(), error: undefined })\n}\n\nexport async function restoreFromServer(userId: string, password: string | null = null): Promise<void> {\n const vaultToken = await getShareVaultToken(['share:get'])\n const envelope = await downloadShareFromVault(vaultToken.token)\n\n // Decrypt based on encryption method or user preference\n const backupData = password\n ? await envelopeDecryptKeyshareWithPassword(envelope, password)\n : await envelopeDecryptKeyshare(envelope, userId)\n\n if (backupData.userId !== userId) throw new Error('Server backup does not match current user')\n\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n if (!storage) throw new Error('localStorage not available')\n\n storage.setItem(`tss.${userId}.keyshare`, backupData.keyshare)\n storage.setItem(`tss.${userId}.sessionId`, backupData.sessionId)\n storage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress)\n}\n\nexport async function restoreFromBackup(file: File, password: string | null, userId: string): Promise<void> {\n const fileContent = await file.text()\n const encryptedBackup: EncryptedBackup = JSON.parse(fileContent)\n\n let decryptionPassword: string\n if (password) {\n // Use provided password\n decryptionPassword = password\n } else {\n // Use passkey-derived password, with specific credentialId if available\n const credentialIdFromBackup =\n encryptedBackup.encryptionMethod === 'passkey' ? encryptedBackup.credentialId : undefined\n const result = await deriveBackupPasswordFromPasskey(userId, credentialIdFromBackup).catch(() => {\n throw new Error('Restore requires either password or passkey authentication')\n })\n decryptionPassword = result.password\n }\n\n const backupData = await decryptKeyshare(encryptedBackup, decryptionPassword)\n if (backupData.userId !== userId) throw new Error('Backup file does not match current user')\n\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n if (!storage) throw new Error('localStorage not available')\n\n storage.setItem(`tss.${userId}.keyshare`, backupData.keyshare)\n storage.setItem(`tss.${userId}.sessionId`, backupData.sessionId)\n storage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress)\n}\n\nexport function getCurrentKeyshareBackupData(userId: string): KeyshareBackupData | null {\n try {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined\n const keyshareData = storage?.getItem(`tss.${userId}.keyshare`)\n const sessionId = storage?.getItem(`tss.${userId}.sessionId`)\n const ownerAddress = storage?.getItem(`tss.${userId}.ownerAddress`)\n if (!keyshareData || !sessionId || !ownerAddress) {\n console.warn('[BACKUP] Missing keyshare data for backup:', {\n hasKeyshare: !!keyshareData,\n hasSession: !!sessionId,\n hasOwner: !!ownerAddress\n })\n return null\n }\n return {\n userId,\n sessionId,\n keyshare: keyshareData,\n ownerAddress: ownerAddress as `0x${string}`,\n createdAt: Date.now(),\n version: BACKUP_VERSION\n }\n } catch (error) {\n logSdkError(error instanceof Error ? error : new Error('Failed to get keyshare data'), { userId }, 'vault')\n return null\n }\n}\n\nexport async function backupToLocalFile(userId: string, password?: string): Promise<void> {\n const backupData = getCurrentKeyshareBackupData(userId)\n if (!backupData) {\n throw new Error('No keyshare data available for backup')\n }\n\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey'\n let backupPassword: string\n let credentialId: string | undefined\n\n if (password) {\n // Use provided password\n backupPassword = password\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication')\n })\n backupPassword = result.password\n credentialId = result.credentialId\n }\n\n const encryptedBackup = await encryptKeyshare(backupData, backupPassword, encryptionMethod, credentialId)\n\n const fileName = `lumia-keyshare-backup-${userId}-${Date.now()}.json`\n const fileContent = JSON.stringify(encryptedBackup, null, 2)\n\n // Create and trigger download\n const blob = new Blob([fileContent], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n\n const a = document.createElement('a')\n a.href = url\n a.download = fileName\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n\n updateBackupStatus(userId, 'local', { enabled: true, lastBackup: Date.now(), error: undefined })\n console.info('[BACKUP] Successfully downloaded backup file')\n}\n\nexport async function backupToCloud(\n userId: string,\n password?: string,\n providerId?: string,\n usePrivateStorage: boolean = true\n): Promise<void> {\n const backupData = getCurrentKeyshareBackupData(userId)\n if (!backupData) {\n throw new Error('No keyshare data available for backup')\n }\n\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey'\n let backupPassword: string\n let credentialId: string | undefined\n\n if (password) {\n // Use provided password\n backupPassword = password\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication')\n })\n backupPassword = result.password\n credentialId = result.credentialId\n }\n\n const encryptedBackup = await encryptKeyshare(backupData, backupPassword, encryptionMethod, credentialId)\n\n const timestamp = Date.now()\n const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`\n const fileContent = JSON.stringify(encryptedBackup, null, 2)\n\n // Import cloud storage module dynamically to avoid bundle bloat\n try {\n const { getAvailableCloudProviders } = await import('./cloudStorage')\n const providers = getAvailableCloudProviders()\n\n if (providers.length === 0) {\n throw new Error('No cloud storage providers available in this environment')\n }\n\n // Use specified provider or first available\n const provider = providerId ? providers.find((p) => p.id === providerId) : providers[0]\n\n if (!provider) {\n throw new Error(\n providerId ? `Cloud provider '${providerId}' not available` : 'No cloud storage provider available'\n )\n }\n\n console.info(`[BACKUP] Using ${provider.name} for cloud backup`)\n\n // Authenticate if not already authenticated\n if (!provider.isAuthenticated()) {\n console.info(`[BACKUP] Authenticating with ${provider.name}`)\n const authenticated = await provider.authenticate()\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`)\n }\n }\n\n // Upload file to cloud storage\n console.info(`[BACKUP] Uploading backup to ${provider.name}`)\n const fileId = await provider.upload(fileName, fileContent, usePrivateStorage)\n\n updateBackupStatus(userId, 'cloud', { enabled: true, lastBackup: timestamp, error: undefined })\n } catch (error) {\n logSdkError(error instanceof Error ? error : new Error('Cloud backup failed'), { userId, providerId }, 'vault')\n const errorMsg = error instanceof Error ? error.message : 'Cloud backup failed'\n updateBackupStatus(userId, 'cloud', { error: errorMsg })\n throw new Error(errorMsg)\n }\n}\n\nexport async function getAvailableCloudProviders(): Promise<\n Array<{ id: string; name: string; icon: string; isAuthenticated: boolean }>\n> {\n try {\n const { getAvailableCloudProviders } = await import('./cloudStorage')\n const providers = getAvailableCloudProviders()\n\n return providers.map((provider) => ({\n id: provider.id,\n name: provider.name,\n icon: provider.icon,\n isAuthenticated: provider.isAuthenticated()\n }))\n } catch (error) {\n console.warn('[BACKUP] Failed to load cloud providers:', error)\n return []\n }\n}\n","// Use iframe-based MPC client for secure key storage\nimport {\n ensureDkgAndGetOwner,\n checkKeyshare,\n getAddress,\n} from '../lib/iframe-mpc-client';\nimport { syncKeyshareStatus } from './index';\n\nexport interface KeyshareStatus {\n hasServerKeyshare: boolean;\n hasLocalKeyshare: boolean;\n needsDkg: boolean;\n needsRecovery: boolean;\n ownerAddress?: `0x${string}`;\n}\n\nexport async function checkKeyshareStatusWithSync(userId: string): Promise<KeyshareStatus> {\n const serverHasKeyshare = await syncKeyshareStatus();\n return checkKeyshareStatus(userId, serverHasKeyshare);\n}\n\nexport async function checkKeyshareStatus(\n userId: string,\n serverHasKeyshare: boolean\n): Promise<KeyshareStatus> {\n // Check keyshare status via secure iframe\n const keyshareInfo = await checkKeyshare(userId);\n const hasLocalKeyshare = keyshareInfo.hasKeyshare;\n const localOwnerAddress = keyshareInfo.address;\n\n console.log('[checkKeyshareStatus] Checking via iframe:', {\n userId,\n serverHasKeyshare,\n hasLocalKeyshare,\n ownerAddress: localOwnerAddress,\n });\n\n let needsDkg = false;\n let needsRecovery = false;\n if (!serverHasKeyshare && !hasLocalKeyshare) needsDkg = true;\n else if (serverHasKeyshare && !hasLocalKeyshare) needsRecovery = true;\n else if (!serverHasKeyshare && hasLocalKeyshare) {\n needsDkg = true;\n }\n\n const result = {\n hasServerKeyshare: serverHasKeyshare,\n hasLocalKeyshare,\n needsDkg,\n needsRecovery,\n ownerAddress: localOwnerAddress,\n };\n console.log('[checkKeyshareStatus] Result:', result);\n\n return result;\n}\n\nasync function ensureKeyshareForNewUser(userId: string, onProgress?: (step: string) => void): Promise<{ ownerAddress: `0x${string}` }> {\n onProgress?.('Setting up secure key management...');\n const result = await ensureDkgAndGetOwner(userId);\n if (!result.ownerAddress) throw new Error('DKG completed but no owner address received');\n await syncKeyshareStatus();\n onProgress?.('Key management setup complete');\n return { ownerAddress: result.ownerAddress };\n}\n\nexport async function ensureKeyshare(\n userId: string,\n serverHasKeyshare: boolean,\n onProgress?: (step: string) => void,\n isNewUser?: boolean\n): Promise<{ ownerAddress: `0x${string}` }> {\n console.log('[ensureKeyshare] Called with:', { userId, serverHasKeyshare, isNewUser });\n\n const status = await checkKeyshareStatus(userId, serverHasKeyshare);\n\n if (!status.needsDkg && !status.needsRecovery && status.ownerAddress) {\n console.log('[ensureKeyshare] Keyshare already ready, returning');\n onProgress?.('Keyshare ready');\n return { ownerAddress: status.ownerAddress };\n }\n\n if (status.needsRecovery) {\n console.log('[ensureKeyshare] Recovery needed, checking backups...');\n onProgress?.('Checking backup availability...');\n const { checkServerBackupAvailability, getBackupStatus } = await import('@/vaultClient');\n const localBackupStatus = getBackupStatus(userId);\n const serverBackupResult = await checkServerBackupAvailability();\n const hasLocalBackup = localBackupStatus.local.enabled && localBackupStatus.local.lastBackup;\n const hasCloudBackup = localBackupStatus.cloud.enabled && localBackupStatus.cloud.lastBackup;\n const hasAnyBackup = serverBackupResult.hasBackup || hasLocalBackup || hasCloudBackup;\n if (!serverBackupResult.serviceAvailable) {\n if (!hasLocalBackup && !hasCloudBackup) { const e = new Error('Your account exists but backup verification failed.\\n\\nThe backup server is currently unavailable.'); (e as any).code = 'BACKUP_SERVICE_UNAVAILABLE'; (e as any).userId = userId; (e as any).serverHasKeyshare = true; throw e; }\n } else if (!hasAnyBackup) {\n const noBackupError = new Error('Your account exists but no backups are available for recovery.'); (noBackupError as any).code = 'NO_BACKUP_AVAILABLE'; (noBackupError as any).userId = userId; (noBackupError as any).serverHasKeyshare = true; throw noBackupError;\n }\n onProgress?.('Backup found - restoration required');\n const recoveryError = new Error('Account exists on server but keyshare missing locally. Please restore from backup to access your account.');\n (recoveryError as any).code = 'KEYSHARE_RECOVERY_NEEDED'; (recoveryError as any).userId = userId; (recoveryError as any).serverHasKeyshare = true; (recoveryError as any).availableBackups = { server: serverBackupResult.hasBackup, local: hasLocalBackup, cloud: hasCloudBackup };\n throw recoveryError;\n }\n\n if (status.needsDkg) { onProgress?.('Setting up secure key management...'); }\n else { throw new Error('Invalid keyshare state - neither DKG nor recovery needed but keyshare missing'); }\n return ensureKeyshareForNewUser(userId, onProgress);\n}\n\nexport async function clearLocalKeyshare(userId: string): Promise<void> {\n // Note: In iframe-based architecture, keyshares are stored in iframe's isolated localStorage\n // We can't directly clear them from parent context\n // This function is kept for API compatibility but does nothing in iframe mode\n console.log('[clearLocalKeyshare] Keyshares are now managed by secure iframe');\n console.log('[clearLocalKeyshare] To clear keyshares, user must revoke authorization in iframe');\n\n // For backwards compatibility during migration, also clear any old localStorage keys\n if (typeof window !== 'undefined' && window.localStorage) {\n const keys = [\n `tss.${userId}.keyshare`,\n `tss.${userId}.ownerAddress`,\n `tss.${userId}.sessionId`,\n ...Object.keys(window.localStorage).filter((key) => key.startsWith(`tss.${userId}.dkg.`)),\n ];\n keys.forEach((key) => window.localStorage.removeItem(key));\n console.log('[clearLocalKeyshare] Cleared old localStorage keys for migration');\n }\n}\n\nexport async function getKeyshareInfo(userId: string): Promise<{\n hasKeyshare: boolean;\n ownerAddress?: `0x${string}`;\n sessionId?: string;\n keyshareSize?: number;\n}> {\n // Get keyshare info from secure iframe\n const info = await checkKeyshare(userId);\n\n return {\n hasKeyshare: info.hasKeyshare,\n ownerAddress: info.address,\n sessionId: 'iframe-session', // Session managed by iframe\n keyshareSize: undefined, // Size not exposed for security\n };\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport interface XAuthOptions {\n mode?: 'login' | 'link';\n}\n\n/**\n * Link X (Twitter) account to existing user\n * Uses OAuth 2.0 with PKCE flow\n */\nexport async function linkX(): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n // The linking flow is handled via popup in iframe-manager\n // This function is kept for API compatibility\n throw new Error('Use openSocialAuthPopup(\"x\") to link X account');\n}\n\n/**\n * Login with X (Twitter) account\n * Uses OAuth 2.0 with PKCE flow\n */\nexport async function loginWithX(): Promise<any> {\n // The login flow is handled via popup in iframe-manager\n // This function is kept for API compatibility\n throw new Error('Use openSocialAuthPopup(\"x\") to login with X account');\n}\n\n/**\n * Unlink X (Twitter) account from user\n */\nexport async function unlinkX(externalId?: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const url = externalId\n ? `${getTssUrl()}/api/auth/unlink/x?externalId=${encodeURIComponent(externalId)}`\n : `${getTssUrl()}/api/auth/unlink/x`;\n\n const response = await authenticatedFetch(url, {\n method: 'DELETE'\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink X account: ${response.statusText}`);\n }\n}\n","export * from './types';\nexport * from './common';\nexport * from './email';\nexport * from './passkey';\nexport * from './telegram';\nexport * from './wallet';\nexport * from './x';\n\n","// Re-export JWT functionality from @embarkai/core\nexport {\n type JwtTokens,\n type LoginResponse,\n type RefreshResponse,\n type VerifyResponse,\n JwtTokenManager,\n createJwtTokenManager,\n jwtTokenManager,\n configureJwtModule,\n logout,\n verifyToken,\n ensureValidToken,\n getValidTokens,\n authenticatedFetch,\n loginWithUserId,\n loginWithEmail,\n loginWithTelegram,\n syncKeyshareStatus\n} from '@embarkai/core/auth'\n\n// Browser-specific passkey auth functions\nexport {\n beginPasskeyAuthentication,\n completePasskeyAuthentication,\n beginPasskeyRegistration,\n completePasskeyRegistration\n} from './passkeyAuth'\n\n// UI-specific auth modules\nexport * from './telegram'\nexport * from './passkey'\nexport * from './keyshare'\nexport * from './providers'\n\nexport type AuthMethod = 'social' | 'telegram' | 'passkey' | 'wallet' | 'development' | 'email'\n\nexport interface AuthState {\n method?: AuthMethod\n isAuthenticated: boolean\n userId?: string\n displayName?: string\n photoUrl?: string\n accessToken?: string\n expiresAt?: number\n hasKeyshare?: boolean\n needsRecovery?: boolean\n}\n\nexport const createInitialAuthState = (): AuthState => ({ isAuthenticated: false })\n","/**\n * Iframe Manager for Parent SDK\n *\n * Manages secure communication with the isolated iframe wallet at auth.lumiapassport.com\n * Implements postMessage protocol with HMAC authentication and replay protection\n */\n\nimport type { Address, Hex } from 'viem'\n\nimport { createLumiaPassportError } from '../../lib/errors'\n\n// ========================================\n// Types\n// ========================================\n\ninterface SecureMessage {\n type: string\n messageId: string\n timestamp: number\n nonce: string\n hmac?: string\n projectId: string\n data: Record<string, any>\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void\n reject: (error: Error) => void\n timestamp: number\n}\n\ninterface Transaction {\n to: Address\n value: string\n data?: Hex\n gasLimit?: string\n}\n\nexport interface IframeManagerConfig {\n iframeUrl: string\n projectId: string\n debug?: boolean\n onWalletReady?: (status: WalletReadyStatus) => void\n}\n\nexport interface WalletReadyStatus {\n ready: boolean\n userId?: string\n address?: `0x${string}`\n hasKeyshare: boolean\n hasSession: boolean\n timestamp: number\n}\n\n// ========================================\n// Iframe Manager\n// ========================================\n\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null\n private iframeUrl: string\n private projectId: string\n private debug: boolean\n private channelToken: string | null = null\n private isReady: boolean = false\n private readyPromise: Promise<void>\n private readyResolve!: () => void\n private onWalletReadyCallback?: (status: WalletReadyStatus) => void\n\n // Message handling\n private pendingRequests = new Map<string, PendingRequest>()\n private usedNonces = new Set<string>()\n private messageListener: ((event: MessageEvent) => void) | null = null\n\n // Track hidden dialog elements for restoration\n private hiddenElements: Array<{\n element: HTMLElement\n originalDisplay: string\n originalVisibility: string\n originalPointerEvents: string\n originalZIndex: string\n }> = []\n private pointerGuardCleanup: (() => void) | null = null\n private iframeHideTimeout: ReturnType<typeof setTimeout> | null = null\n private iframeActive = false\n private providerSessions = new Map<string, string | null>()\n private providerConnections = new Map<string, boolean>()\n\n // Timeouts\n private readonly REQUEST_TIMEOUT = 300000 // 5 minutes (for user interactions like consent)\n private readonly NONCE_EXPIRY = 300000 // 5 minutes\n private readonly HEARTBEAT_INTERVAL = 5 * 60 * 1000 // 5 minutes\n\n // SDK Channel management\n private heartbeatInterval?: ReturnType<typeof setInterval>\n private isReconnecting = false\n\n constructor(config: IframeManagerConfig) {\n this.iframeUrl = config.iframeUrl\n this.projectId = config.projectId\n this.debug = config.debug || false\n this.onWalletReadyCallback = config.onWalletReady\n\n this.readyPromise = new Promise((resolve) => {\n this.readyResolve = resolve\n })\n\n this.log('[IframeManager] Initialized with:', {\n iframeUrl: this.iframeUrl,\n projectId: this.projectId\n })\n }\n\n setDebug(debug: boolean): void {\n this.debug = debug\n }\n\n /**\n * Initialize iframe and wait for it to be ready\n */\n async initialize(): Promise<void> {\n if (this.iframe) {\n return this.readyPromise\n }\n\n // Create iframe element\n this.iframe = document.createElement('iframe')\n\n // Build iframe URL with theme colors\n let iframeUrl = this.iframeUrl\n\n this.iframe.src = iframeUrl\n this.iframe.id = 'lumia-passport-iframe'\n\n // Initially hidden\n this.iframe.style.display = 'none'\n this.iframe.style.position = 'fixed'\n this.iframe.style.top = '0'\n this.iframe.style.left = '0'\n this.iframe.style.width = '100%'\n this.iframe.style.height = '100%'\n this.iframe.style.border = 'none'\n this.iframe.style.zIndex = '999999'\n this.iframe.style.background = 'rgba(0, 0, 0, 0.5)'\n\n // Sandbox with allow-popups for explorer links\n this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox')\n\n // Allow WebAuthn (passkey) API in iframe\n this.iframe.setAttribute('allow', 'publickey-credentials-get *; publickey-credentials-create *')\n\n // Setup message listener\n this.messageListener = this.handleMessage.bind(this)\n window.addEventListener('message', this.messageListener)\n\n // Append to body\n document.body.appendChild(this.iframe)\n\n // Wait for IFRAME_READY message\n await this.readyPromise\n\n // Authenticate SDK with iframe\n await this.authenticateSDK()\n\n // Prime known session state so we can detect new sessions accurately\n await this.primeProviderSessions()\n\n // Start heartbeat to keep SDK channel alive\n this.startHeartbeat()\n\n // Setup visibility change handler\n this.setupVisibilityHandler()\n\n this.log('[IframeManager] ✅ Iframe ready and authenticated')\n }\n\n /**\n * Set the onWalletReady callback\n */\n setOnWalletReady(callback: (status: WalletReadyStatus) => void): void {\n this.onWalletReadyCallback = callback\n }\n\n /**\n * Authenticate SDK with iframe to establish secure channel\n */\n private async authenticateSDK(): Promise<void> {\n const response = await this.sendMessage('SDK_AUTH', {\n projectId: this.projectId\n })\n\n if (response.type === 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS') {\n this.channelToken = response.sessionToken // sessionToken in response for backward compatibility\n } else {\n throw new Error('SDK channel authentication failed')\n }\n }\n\n /**\n * Start periodic heartbeat to check SDK channel validity\n */\n private startHeartbeat(): void {\n // Clear any existing interval\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval)\n }\n\n this.heartbeatInterval = setInterval(async () => {\n if (!this.channelToken) return\n\n try {\n const response = await this.sendMessage('SDK_CHANNEL_HEARTBEAT', {})\n if (!response.valid) {\n this.log('[IframeManager] SDK channel invalid, reconnecting...')\n await this.reconnect()\n }\n } catch (error) {\n this.log('[IframeManager] Heartbeat failed:', error)\n await this.reconnect()\n }\n }, this.HEARTBEAT_INTERVAL)\n\n this.log('[IframeManager] Heartbeat started (interval: 5 min)')\n }\n\n /**\n * Stop heartbeat\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval)\n this.heartbeatInterval = undefined\n this.log('[IframeManager] Heartbeat stopped')\n }\n }\n\n /**\n * Reconnect SDK channel after it becomes invalid\n */\n public async reconnect(): Promise<void> {\n if (this.isReconnecting) {\n this.log('[IframeManager] Already reconnecting, skipping...')\n return\n }\n\n this.isReconnecting = true\n this.log('[IframeManager] Reconnecting SDK channel...')\n\n try {\n // Clear old token\n this.channelToken = null\n\n // Re-authenticate to get new channel token\n await this.authenticateSDK()\n\n this.log('[IframeManager] ✅ SDK channel reconnected')\n } catch (error) {\n this.log('[IframeManager] ❌ Reconnect failed:', error)\n throw error\n } finally {\n this.isReconnecting = false\n }\n }\n\n /**\n * Setup visibility change handler to check channel when tab becomes visible\n */\n private setupVisibilityHandler(): void {\n if (typeof document === 'undefined') return\n\n document.addEventListener('visibilitychange', async () => {\n if (document.visibilityState === 'visible' && this.channelToken) {\n this.log('[IframeManager] Tab visible, checking SDK channel...')\n\n try {\n const response = await this.sendMessage('SDK_CHANNEL_HEARTBEAT', {})\n if (!response.valid) {\n this.log('[IframeManager] SDK channel expired while tab was hidden')\n await this.reconnect()\n }\n } catch (error) {\n this.log('[IframeManager] Channel check failed, reconnecting...')\n await this.reconnect()\n }\n }\n })\n\n this.log('[IframeManager] Visibility handler setup')\n }\n\n /**\n * Handle incoming postMessage events\n */\n private handleMessage(event: MessageEvent): void {\n const message = event.data\n\n // Quick filter: ignore messages that are clearly not ours\n // This prevents spam from browser extensions, dev tools, etc.\n if (!message || typeof message !== 'object' || !message.type) {\n // Silently ignore messages without basic structure\n return\n }\n\n // Check if this looks like a Lumia Passport message\n // Our expected message types from iframe\n const validIframeTypes = [\n 'LUMIA_PASSPORT_IFRAME_READY',\n 'LUMIA_PASSPORT_WALLET_READY',\n 'LUMIA_PASSPORT_SHOW_IFRAME',\n 'LUMIA_PASSPORT_HIDE_IFRAME',\n 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS',\n 'LUMIA_PASSPORT_AUTH_SUCCESS',\n 'LUMIA_PASSPORT_DKG_SUCCESS',\n 'LUMIA_PASSPORT_SIGNATURE',\n 'LUMIA_PASSPORT_ADDRESS',\n 'LUMIA_PASSPORT_KEYSHARE_STATUS',\n 'LUMIA_PASSPORT_TRUSTED_APPS_LIST',\n 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED',\n 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN',\n 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n 'LUMIA_PASSPORT_HEARTBEAT_RESPONSE',\n 'LUMIA_PASSPORT_RESPONSE',\n 'LUMIA_PASSPORT_ERROR'\n ]\n\n if (!validIframeTypes.includes(message.type) && !message.messageId) {\n // Not our message type and no messageId - ignore\n return\n }\n\n // IMPORTANT: Origin validation\n // We MUST validate that messages come from our iframe (auth.lumiapassport.com)\n // This protects against malicious actors sending fake messages from other origins\n const iframeOrigin = new URL(this.iframeUrl).origin\n if (event.origin !== iframeOrigin) {\n // Log warning for potential security issue\n this.log('[IframeManager] ⚠️ Ignored message from invalid origin:', {\n received: event.origin,\n expected: iframeOrigin\n })\n return\n }\n\n // At this point we know:\n // 1. Message has valid structure\n // 2. Message type matches our protocol\n // 3. Message originated from our iframe (auth.lumiapassport.com)\n\n // Handle IFRAME_READY\n if (message.type === 'LUMIA_PASSPORT_IFRAME_READY') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_IFRAME_READY')\n this.isReady = true\n this.readyResolve()\n return\n }\n\n // Handle WALLET_READY status\n if (message.type === 'LUMIA_PASSPORT_WALLET_READY') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_WALLET_READY', message.data)\n if (this.onWalletReadyCallback) {\n this.onWalletReadyCallback(message.data as WalletReadyStatus)\n }\n return\n }\n\n // Handle SHOW_IFRAME request\n if (message.type === 'LUMIA_PASSPORT_SHOW_IFRAME') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_SHOW_IFRAME')\n this.showIframe()\n return\n }\n\n // Handle HIDE_IFRAME request\n if (message.type === 'LUMIA_PASSPORT_HIDE_IFRAME') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_HIDE_IFRAME')\n this.hideIframe()\n return\n }\n\n // Handle REQUEST_NEW_TOKEN from iframe\n if (message.type === 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_REQUEST_NEW_TOKEN')\n // Handle async token refresh without blocking message processing\n this.handleTokenRefreshRequest(message).catch((error) => {\n this.log('[IframeManager] ❌ Token refresh error:', error)\n })\n return\n }\n\n // Handle responses to our requests\n if (message.messageId) {\n const pending = this.pendingRequests.get(message.messageId)\n if (pending) {\n this.pendingRequests.delete(message.messageId)\n\n if (message.type === 'LUMIA_PASSPORT_ERROR') {\n const passportError = createLumiaPassportError({\n message: message.error || 'Unknown error',\n code: message.code\n })\n pending.reject(passportError)\n } else {\n pending.resolve(message.data || message)\n }\n }\n }\n }\n\n /**\n * Handle token refresh request from iframe\n */\n private async handleTokenRefreshRequest(message: any): Promise<void> {\n try {\n // Import jwtTokenManager dynamically\n const { jwtTokenManager } = await import('../auth')\n\n // Attempt to refresh the token\n const refreshSuccess = await jwtTokenManager.refreshAccessToken()\n\n if (refreshSuccess) {\n const newAccessToken = jwtTokenManager.getAccessToken()\n\n // Send new token to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n accessToken: newAccessToken,\n timestamp: Date.now()\n },\n iframeOrigin\n )\n }\n } else {\n // Send error to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n error: 'Token refresh failed',\n timestamp: Date.now()\n },\n iframeOrigin\n )\n }\n }\n } catch (error) {\n // Send error to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: Date.now()\n },\n iframeOrigin\n )\n }\n }\n }\n\n /**\n * Send secure message to iframe\n */\n public async sendMessage(type: string, data: Record<string, any>): Promise<any> {\n if (!this.iframe || !this.iframe.contentWindow) {\n throw new Error('Iframe not initialized')\n }\n\n const messageId = this.generateMessageId()\n const nonce = this.generateNonce()\n const timestamp = Date.now()\n\n const message: SecureMessage = {\n type,\n messageId,\n timestamp,\n nonce,\n projectId: this.projectId,\n data: {\n ...data,\n sessionToken: this.channelToken // named sessionToken for backward compatibility with iframe\n }\n }\n\n // Compute HMAC if SDK channel is established\n if (this.channelToken) {\n message.hmac = await this.computeHMAC(message)\n }\n\n // Create promise for response\n const responsePromise = new Promise<any>((resolve, reject) => {\n this.pendingRequests.set(messageId, {\n resolve,\n reject,\n timestamp\n })\n\n // Set timeout\n setTimeout(() => {\n if (this.pendingRequests.has(messageId)) {\n this.pendingRequests.delete(messageId)\n reject(new Error(`Request timeout: ${type}`))\n }\n }, this.REQUEST_TIMEOUT)\n })\n\n // Send message\n const iframeOrigin = new URL(this.iframeUrl).origin\n this.iframe.contentWindow.postMessage(message, iframeOrigin)\n\n this.log(`[IframeManager] 📤 Sent message: ${type}`, { messageId })\n\n return responsePromise\n }\n\n /**\n * Compute HMAC for message authentication using SDK channel token\n */\n private async computeHMAC(message: SecureMessage): Promise<string> {\n const encoder = new TextEncoder()\n const payload = JSON.stringify({\n type: message.type,\n messageId: message.messageId,\n timestamp: message.timestamp,\n nonce: message.nonce,\n data: JSON.stringify(message.data)\n })\n\n const data = encoder.encode(payload)\n const key = encoder.encode(this.channelToken!)\n\n const cryptoKey = await crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, data)\n\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`\n }\n\n /**\n * Generate nonce for replay protection\n */\n private generateNonce(): string {\n const randomBytes = new Uint8Array(16)\n crypto.getRandomValues(randomBytes)\n return Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n // ========================================\n // UI Methods\n // ========================================\n\n /**\n * Show iframe (for consent/confirmation UI)\n */\n showIframe(): void {\n if (this.iframe) {\n if (this.iframeHideTimeout) {\n clearTimeout(this.iframeHideTimeout)\n this.iframeHideTimeout = null\n }\n\n // Hide all Radix Dialog modals FIRST, before showing iframe\n this.hideAllDialogs()\n\n this.iframeActive = true\n\n // Activate guards so hidden dialogs cannot intercept pointer events\n this.enablePointerEventGuards()\n\n // Then show iframe with maximum z-index\n this.iframe.style.display = 'block'\n // Raise z-index to maximum to ensure consent appears above all modals (including SendModal)\n this.iframe.style.zIndex = '2147483648'\n // Ensure iframe takes control of pointer/visibility each time\n this.iframe.style.pointerEvents = 'auto'\n this.iframe.style.visibility = 'visible'\n this.iframe.style.background = 'rgba(0, 0, 0, 0.5)'\n }\n }\n\n /**\n * Hide iframe\n */\n hideIframe(): void {\n if (this.iframe) {\n this.log('[IframeManager] hideIframe called - making iframe non-blocking')\n\n this.iframeActive = false\n\n // Immediately lower z-index below dialogs AND make non-blocking\n this.iframe.style.zIndex = '1'\n this.iframe.style.background = 'transparent'\n this.iframe.style.pointerEvents = 'none'\n this.iframe.style.visibility = 'hidden'\n\n this.log('[IframeManager] iframe z-index set to 1, transparent, pointer-events: none')\n\n // Restore all previously hidden dialogs immediately\n this.restoreAllDialogs()\n this.disablePointerEventGuards()\n\n // Fully hide iframe after a small delay\n this.iframeHideTimeout = setTimeout(() => {\n if (this.iframe) {\n this.log('[IframeManager] Fully hiding iframe with display: none')\n this.iframe.style.display = 'none'\n // Restore original settings for next time\n this.iframe.style.zIndex = '999999'\n this.iframe.style.background = 'rgba(0, 0, 0, 0.5)'\n this.iframe.style.pointerEvents = 'auto'\n this.iframe.style.visibility = 'visible'\n }\n this.iframeHideTimeout = null\n }, 200)\n }\n }\n\n /**\n * Hide all Radix Dialog modals (SendModal, etc.)\n */\n private hideAllDialogs(): void {\n // Clear previous hidden elements\n this.hiddenElements = []\n\n // Find all elements with high z-index (potential overlays/modals)\n const allElements = document.body.querySelectorAll('*')\n\n allElements.forEach((element) => {\n const htmlElement = element as HTMLElement\n\n // Skip if this is the iframe itself or its children\n if (htmlElement.id === 'lumia-passport-iframe' || htmlElement.closest('#lumia-passport-iframe')) {\n return\n }\n\n // Skip AuthModal (we don't want to hide login/error screens)\n if (htmlElement.hasAttribute('data-lumia-auth-modal') || htmlElement.closest('[data-lumia-auth-modal]')) {\n return\n }\n\n // Get computed z-index\n const computedStyle = window.getComputedStyle(htmlElement)\n const zIndex = parseInt(computedStyle.zIndex, 10)\n\n // Check if element is Radix focus guard or portal element\n const isRadixElement =\n htmlElement.hasAttribute('data-radix-focus-guard') ||\n htmlElement.hasAttribute('data-radix-portal') ||\n htmlElement.hasAttribute('data-radix-popper-content-wrapper')\n\n // Hide elements if:\n // 1. They have very high z-index (above 1 million) - likely Dialog overlays/content\n // 2. They are Radix utility elements (focus guards, portals)\n if ((!isNaN(zIndex) && zIndex > 1000000) || isRadixElement) {\n // Store original values and element reference\n this.hiddenElements.push({\n element: htmlElement,\n originalDisplay: htmlElement.style.display || '',\n originalVisibility: htmlElement.style.visibility || '',\n originalPointerEvents: htmlElement.style.pointerEvents || '',\n originalZIndex: htmlElement.style.zIndex || ''\n })\n\n // Hide the element completely\n htmlElement.style.display = 'none'\n htmlElement.style.visibility = 'hidden'\n htmlElement.style.pointerEvents = 'none'\n htmlElement.style.zIndex = '-1'\n\n const elementType = isRadixElement ? 'Radix element' : `z-index ${zIndex}`\n this.log(\n `[IframeManager] Hiding ${elementType}: ${htmlElement.className || '(no class)'} (Tag: ${htmlElement.tagName})`\n )\n }\n })\n\n this.log(`[IframeManager] Hidden ${this.hiddenElements.length} elements total`)\n }\n\n /**\n * Restore all previously hidden Radix Dialog modals\n */\n private restoreAllDialogs(): void {\n this.log(`[IframeManager] Restoring ${this.hiddenElements.length} elements`)\n\n this.hiddenElements.forEach(\n ({ element, originalDisplay, originalVisibility, originalPointerEvents, originalZIndex }) => {\n // Restore original values\n element.style.display = originalDisplay\n element.style.visibility = originalVisibility\n // CRITICAL: If original pointer-events was empty, set to 'auto' to override any class-based pointer-events: none\n element.style.pointerEvents = originalPointerEvents || 'auto'\n element.style.zIndex = originalZIndex\n\n this.log(\n `[IframeManager] Restored element: ${element.className} (Tag: ${element.tagName}), pointerEvents set to: ${element.style.pointerEvents}`\n )\n }\n )\n\n // Clear the array\n this.hiddenElements = []\n\n this.log(`[IframeManager] All elements restored`)\n }\n\n /**\n * Stop Radix dismissable layers from swallowing the first click on the iframe.\n * Radix attaches pointer event guards at the document level; we intercept at window\n * capture phase so user clicks flow straight into the consent iframe.\n */\n private enablePointerEventGuards(): void {\n if (this.pointerGuardCleanup) {\n return\n }\n\n const handler = (event: Event) => {\n if (!this.iframeActive || !this.iframe) {\n return\n }\n\n const target = event.target as EventTarget | null\n const composedPath = typeof event.composedPath === 'function' ? event.composedPath() : []\n const hitsIframe = target === this.iframe || (Array.isArray(composedPath) && composedPath.includes(this.iframe))\n\n if (!hitsIframe) {\n return\n }\n\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n ;(event as any).stopImmediatePropagation()\n }\n event.stopPropagation()\n }\n\n const options: AddEventListenerOptions = { capture: true }\n const eventNames = ['pointerdown', 'mousedown', 'mouseup', 'click', 'touchstart', 'focusin']\n\n eventNames.forEach((eventName) => {\n window.addEventListener(eventName, handler as EventListener, options)\n })\n\n this.pointerGuardCleanup = () => {\n eventNames.forEach((eventName) => {\n window.removeEventListener(eventName, handler as EventListener, options)\n })\n this.pointerGuardCleanup = null\n }\n\n this.log('[IframeManager] Enabled pointer event guards for iframe consent')\n }\n\n /**\n * Remove pointer interception once iframe is hidden again.\n */\n private disablePointerEventGuards(): void {\n if (this.pointerGuardCleanup) {\n this.pointerGuardCleanup()\n this.pointerGuardCleanup = null\n this.log('[IframeManager] Disabled pointer event guards for iframe consent')\n }\n }\n\n // ========================================\n // Public API Methods\n // ========================================\n\n /**\n * Authenticate user with application\n */\n async authenticate(\n userId: string,\n avatar?: string | null,\n displayName?: string | null\n ): Promise<{ userId: string; address: Address | undefined }> {\n const response = await this.sendMessage('AUTHENTICATE', {\n userId,\n projectId: this.projectId,\n avatar,\n displayName\n })\n\n if (response.type === 'LUMIA_PASSPORT_AUTH_SUCCESS') {\n return {\n userId: response.userId,\n address: response.address\n }\n }\n\n throw new Error('Authentication failed')\n }\n\n /**\n * Start DKG (Distributed Key Generation)\n */\n async startDKG(userId: string, accessToken?: string): Promise<Address> {\n const response = await this.sendMessage('START_DKG', {\n userId,\n projectId: this.projectId,\n accessToken // Pass access token for TSS API authentication\n })\n\n if (response.type === 'LUMIA_PASSPORT_DKG_SUCCESS') {\n return response.ownerAddress\n }\n\n throw new Error('DKG failed')\n }\n\n /**\n * Sign transaction\n */\n async signTransaction(\n userId: string,\n transaction: Transaction,\n accessToken?: string,\n avatar?: string | null,\n displayName?: string | null\n ): Promise<Hex> {\n // If avatar/displayName not provided, try to get from JWT tokens\n if (!avatar || !displayName) {\n const { jwtTokenManager } = await import('@embarkai/core/auth')\n avatar = avatar || jwtTokenManager.getAvatar()\n displayName = displayName || jwtTokenManager.getDisplayName()\n }\n\n const response = await this.sendMessage('SIGN_TRANSACTION', {\n userId,\n projectId: this.projectId,\n transaction,\n accessToken, // Pass access token for TSS API authentication\n avatar,\n displayName\n })\n\n if (response.type === 'LUMIA_PASSPORT_SIGNATURE') {\n return response.signature\n }\n\n throw new Error('Transaction signing failed')\n }\n\n /**\n * Sign EIP712 typed data\n */\n async signTypedData(\n userId: string,\n typedData: {\n domain: {\n name?: string\n version?: string\n chainId?: number\n verifyingContract?: string\n salt?: string\n }\n types: Record<string, Array<{ name: string; type: string }>>\n primaryType: string\n message: Record<string, any>\n },\n digest32: Hex,\n accessToken?: string,\n avatar?: string | null,\n displayName?: string | null\n ): Promise<Hex> {\n console.log('[IframeManager] signTypedData: Sending SIGN_TYPED_DATA message', {\n userId,\n primaryType: typedData.primaryType,\n digest32\n })\n\n // If avatar/displayName not provided, try to get from JWT tokens\n if (!avatar || !displayName) {\n const { jwtTokenManager } = await import('@embarkai/core/auth')\n avatar = avatar || jwtTokenManager.getAvatar()\n displayName = displayName || jwtTokenManager.getDisplayName()\n }\n\n const response = await this.sendMessage('SIGN_TYPED_DATA', {\n userId,\n projectId: this.projectId,\n typedData,\n digest32,\n accessToken, // Pass access token for TSS API authentication\n avatar,\n displayName\n })\n\n console.log('[IframeManager] signTypedData: Response received', {\n type: response.type,\n hasSignature: !!response.signature\n })\n\n if (response.type === 'LUMIA_PASSPORT_EIP712_SIGNATURE') {\n return response.signature\n }\n\n throw new Error('EIP712 signing failed')\n }\n\n /**\n * Get user's wallet address\n */\n async getAddress(userId: string): Promise<Address | undefined> {\n const response = await this.sendMessage('GET_ADDRESS', {\n userId\n })\n\n if (response.type === 'LUMIA_PASSPORT_ADDRESS') {\n return response.address\n }\n\n return undefined\n }\n\n /**\n * Check if user has a keyshare\n */\n async checkKeyshare(userId: string): Promise<{ hasKeyshare: boolean; address?: Address }> {\n const response = await this.sendMessage('CHECK_KEYSHARE', {\n userId\n })\n\n if (response.type === 'LUMIA_PASSPORT_KEYSHARE_STATUS') {\n return {\n hasKeyshare: response.hasKeyshare,\n address: response.address\n }\n }\n\n return { hasKeyshare: false }\n }\n\n /**\n * Open social auth popup (Telegram, Discord, Twitter, etc.)\n */\n async openSocialAuthPopup(\n provider: string,\n config?: Record<string, any>\n ): Promise<{\n provider: string\n success: boolean\n user?: any\n mode?: 'login' | 'link'\n error?: string\n }> {\n this.log(`[IframeManager] Opening social auth popup for provider: ${provider}`)\n\n return new Promise((resolve, reject) => {\n const normalizedProviderName = provider.toLowerCase()\n const providerKey = normalizedProviderName === 'twitter' ? 'x' : normalizedProviderName\n const xMode: 'login' | 'link' = config?.mode === 'link' ? 'link' : 'login'\n const sessionBeforeFlow = providerKey === 'x' ? this.getKnownSessionId('x') : null\n const connectionBeforeFlow = providerKey === 'x' ? this.getKnownProviderConnection('x') : null\n\n // Determine popup URL based on provider\n let popupUrl: string\n\n if (providerKey === 'telegram') {\n // Get iframe URL and construct popup URL\n const iframeOrigin = new URL(this.iframeUrl).origin\n const botUsername = config?.botUsername\n\n this.log('[IframeManager] Telegram config:', config)\n this.log('[IframeManager] Bot username:', botUsername)\n\n // Add bot username as URL parameter if provided\n const url = new URL(`${iframeOrigin}/oauth/telegram.html`)\n if (botUsername) {\n url.searchParams.set('bot', botUsername)\n }\n\n popupUrl = url.toString()\n this.log('[IframeManager] Popup URL:', popupUrl)\n } else if (providerKey === 'x') {\n // X (Twitter) OAuth flow\n const iframeOrigin = new URL(this.iframeUrl).origin\n\n this.log('[IframeManager] X OAuth config:', config)\n\n // Build popup URL with parameters\n const url = new URL(`${iframeOrigin}/oauth/x.html`)\n\n // Get TSS URL from service configuration (not from iframe URL)\n const { getServiceUrls } = require('../../config/lumiaPassport')\n const { tssUrl } = getServiceUrls()\n\n // Get projectId from window global\n const projectId = typeof window !== 'undefined' ? (window as any).__EMBARK_PROJECT_ID__ : undefined\n\n this.log('[IframeManager] TSS URL from config:', tssUrl)\n this.log('[IframeManager] Project ID:', projectId)\n\n url.searchParams.set('tssUrl', tssUrl)\n url.searchParams.set('mode', xMode)\n\n // Add projectId if available\n if (projectId) {\n url.searchParams.set('projectId', projectId)\n }\n\n // For link mode, pass auth token\n if (xMode === 'link' && config?.token) {\n url.searchParams.set('token', config.token)\n }\n\n popupUrl = url.toString()\n this.log('[IframeManager] X OAuth Popup URL:', popupUrl)\n } else {\n reject(new Error(`Provider ${provider} not supported yet`))\n return\n }\n\n // Open popup window\n const popup = window.open(\n popupUrl,\n `${provider}_auth`,\n 'width=550,height=650,menubar=no,toolbar=no,location=no,status=no'\n )\n\n if (!popup) {\n reject(new Error('Failed to open popup. Please allow popups for this site.'))\n return\n }\n\n // Declare interval variable for cleanup\n let checkClosed: NodeJS.Timeout | undefined\n let resolved = false\n let messageHandler: ((event: MessageEvent) => void) | null = null\n let pendingCancellation = false\n\n const cleanup = (closePopup = true) => {\n if (messageHandler) {\n window.removeEventListener('message', messageHandler)\n }\n if (checkClosed) {\n clearInterval(checkClosed)\n checkClosed = undefined\n }\n if (closePopup && !popup.closed) {\n popup.close()\n }\n }\n\n const finalize = (\n result: {\n success: boolean\n user?: any\n mode?: 'login' | 'link'\n error?: string\n },\n closePopup = true\n ) => {\n if (resolved) {\n return\n }\n resolved = true\n cleanup(closePopup)\n\n if (result.success && providerKey === 'x') {\n this.updateProviderTrackingFromUser('x', result.user)\n }\n\n resolve({\n provider,\n ...result\n })\n }\n\n // Listen for messages from popup\n messageHandler = (event: MessageEvent) => {\n // Security: check origin matches iframe URL\n const iframeOrigin = new URL(this.iframeUrl).origin\n if (event.origin !== iframeOrigin) {\n return\n }\n\n // Normalize provider name for comparison\n const eventProvider = event.data.provider?.toLowerCase()\n\n // Handle Telegram auth success\n if (event.data.type === 'TELEGRAM_AUTH_SUCCESS' && eventProvider === 'telegram' && providerKey === 'telegram') {\n this.log('[IframeManager] Telegram auth successful from popup:', event.data)\n\n finalize({\n success: true,\n user: event.data.user\n })\n }\n // Handle X auth success\n else if (event.data.type === 'X_AUTH_SUCCESS' && eventProvider === 'x' && providerKey === 'x') {\n this.log('[IframeManager] X auth successful from popup:', event.data)\n\n // Store tokens if provided (new flow for Safari ITP fix)\n if (event.data.tokens) {\n this.log('[IframeManager] Tokens received in postMessage, storing via jwtTokenManager')\n import('../auth')\n .then(({ jwtTokenManager }) => {\n return jwtTokenManager.setTokens({\n accessToken: event.data.tokens.accessToken,\n refreshToken: event.data.tokens.refreshToken,\n userId: event.data.user.userId,\n expiresIn: event.data.user.expiresIn || 3600,\n hasKeyshare: event.data.user.hasKeyshare || false,\n displayName: event.data.user.displayName || null,\n providers: event.data.user.providers || ['x']\n })\n })\n .then(() => {\n this.log('[IframeManager] Tokens stored successfully')\n })\n .catch((tokenError) => {\n this.log('[IframeManager] Warning: Failed to store tokens:', tokenError)\n // Continue anyway - tokens might be available via cookies\n })\n }\n\n finalize({\n success: true,\n user: event.data.user,\n mode: event.data.mode\n })\n }\n // Handle Telegram auth cancelled\n else if (\n event.data.type === 'TELEGRAM_AUTH_CANCELLED' &&\n eventProvider === 'telegram' &&\n providerKey === 'telegram'\n ) {\n this.log('[IframeManager] Telegram auth cancelled by user')\n\n finalize(\n {\n success: false,\n error: 'User cancelled authentication'\n },\n false\n )\n }\n // Handle X auth cancelled\n else if (event.data.type === 'X_AUTH_CANCELLED' && eventProvider === 'x' && providerKey === 'x') {\n this.log('[IframeManager] X auth cancelled by user')\n\n pendingCancellation = true\n\n // Attempt to verify session in case OAuth already completed successfully\n this.verifyAuthSession({ provider: 'x' })\n .then((verification) => {\n const sessionId = verification.sessionId || null\n const providers = verification.providers || []\n const isConnectedNow = providers.includes('x')\n const sessionChanged = !!sessionId && sessionId !== sessionBeforeFlow\n const connectionGained = connectionBeforeFlow === false && isConnectedNow\n\n if (verification.success) {\n if (sessionChanged || connectionGained) {\n this.log(\n '[IframeManager] X auth cancellation fallback found active session change, treating as success'\n )\n finalize(\n {\n success: true,\n user: verification.user,\n mode: xMode\n },\n true\n )\n } else {\n this.log('[IframeManager] X auth fallback did not detect new session, treating as cancellation')\n if (popup.closed) {\n finalize(\n {\n success: false,\n error: 'User cancelled authentication'\n },\n false\n )\n }\n }\n } else {\n this.log('[IframeManager] X auth fallback verification reported no session, treating as cancellation')\n if (popup.closed) {\n finalize(\n {\n success: false,\n error: 'User cancelled authentication'\n },\n false\n )\n }\n }\n })\n .catch((error) => {\n this.log('[IframeManager] X auth fallback verification error:', error)\n if (popup.closed) {\n finalize(\n {\n success: false,\n error: 'User cancelled authentication'\n },\n false\n )\n }\n })\n }\n // Handle X auth error\n else if (event.data.type === 'X_AUTH_ERROR' && eventProvider === 'x' && providerKey === 'x') {\n this.log('[IframeManager] X auth error from popup:', event.data.error)\n\n finalize({\n success: false,\n error: event.data.error || 'Authentication failed'\n })\n }\n }\n\n window.addEventListener('message', messageHandler)\n\n // Check if popup was closed without completing auth\n checkClosed = setInterval(() => {\n if (popup.closed) {\n if (checkClosed) {\n clearInterval(checkClosed)\n checkClosed = undefined\n }\n\n if (!resolved) {\n if (providerKey === 'x' && pendingCancellation) {\n finalize(\n {\n success: false,\n error: 'User cancelled authentication'\n },\n false\n )\n } else {\n finalize(\n {\n success: false,\n error: 'Popup was closed'\n },\n false\n )\n }\n }\n }\n }, 500)\n })\n }\n\n /**\n * Verify current auth session with the backend.\n * Can optionally track session state for a specific provider.\n * @param options.silent - If true, suppress logging\n * @param options.provider - Optional provider key to track session state for (e.g., 'x', 'telegram')\n */\n private async verifyAuthSession(options: { silent?: boolean; provider?: string } = {}): Promise<{\n success: boolean\n user?: any\n sessionId?: string | null\n providers?: string[]\n }> {\n if (typeof window === 'undefined' || typeof fetch === 'undefined') {\n return { success: false }\n }\n\n try {\n const { getServiceUrls } = require('../../config/lumiaPassport')\n const { tssUrl } = getServiceUrls()\n const projectId = typeof window !== 'undefined' ? (window as any).__EMBARK_PROJECT_ID__ : undefined\n\n if (!tssUrl) {\n this.log('[IframeManager] Session verify aborted: missing TSS URL')\n return { success: false }\n }\n\n const verifyUrl = new URL(`${tssUrl}/api/auth/verify`)\n if (projectId) {\n verifyUrl.searchParams.set('projectId', projectId)\n }\n\n // Get access token and attempt refresh if needed\n const { jwtTokenManager, ensureValidToken } = await import('../auth')\n const hasValidToken = await ensureValidToken()\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json'\n }\n\n if (hasValidToken) {\n const accessToken = jwtTokenManager.getAccessToken()\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`\n }\n }\n\n let response = await fetch(verifyUrl.toString(), {\n method: 'GET',\n headers,\n credentials: 'include'\n })\n\n // Handle 401 - try refresh and retry\n if (response.status === 401) {\n this.log('[IframeManager] Session verify got 401, attempting token refresh...')\n\n const refreshSuccess = await jwtTokenManager.refreshAccessToken()\n if (refreshSuccess) {\n const newAccessToken = jwtTokenManager.getAccessToken()\n if (newAccessToken) {\n headers['Authorization'] = `Bearer ${newAccessToken}`\n this.log('[IframeManager] Token refreshed, retrying verify...')\n\n // Retry the request with new token\n response = await fetch(verifyUrl.toString(), {\n method: 'GET',\n headers,\n credentials: 'include'\n })\n }\n }\n }\n\n if (!response.ok) {\n this.log('[IframeManager] Session verify returned status:', response.status)\n if (options.provider) {\n this.recordProviderSession(options.provider, null)\n this.recordProviderConnection(options.provider, false)\n }\n return { success: false }\n }\n\n let userData: any = undefined\n try {\n userData = await response.json()\n } catch (jsonError) {\n this.log('[IframeManager] Session verify JSON parse failed:', jsonError)\n }\n\n const sessionId = this.extractSessionId(userData)\n const providers = this.getProvidersList(userData)\n\n if (options.provider) {\n this.recordProviderSession(options.provider, sessionId)\n this.recordProviderConnection(options.provider, providers.includes(options.provider))\n }\n\n if (!options.silent) {\n this.log('[IframeManager] Session verify result:', {\n sessionId,\n providers\n })\n }\n\n return {\n success: true,\n user: userData,\n sessionId,\n providers\n }\n } catch (error) {\n this.log('[IframeManager] Session verify error:', error)\n if (options.provider) {\n this.recordProviderSession(options.provider, null)\n this.recordProviderConnection(options.provider, false)\n }\n return { success: false }\n }\n }\n\n /**\n * Prime provider session/cache state to detect future changes.\n */\n private async primeProviderSessions(): Promise<void> {\n try {\n await this.verifyAuthSession({ silent: true })\n } catch (error) {\n this.log('[IframeManager] Prime provider sessions failed:', error)\n }\n }\n\n private getKnownSessionId(providerKey: string): string | null {\n return this.providerSessions.has(providerKey) ? (this.providerSessions.get(providerKey) ?? null) : null\n }\n\n private getKnownProviderConnection(providerKey: string): boolean | null {\n if (!this.providerConnections.has(providerKey)) {\n return null\n }\n const value = this.providerConnections.get(providerKey)\n return typeof value === 'boolean' ? value : null\n }\n\n private recordProviderSession(providerKey: string, sessionId: string | null): void {\n this.providerSessions.set(providerKey, sessionId ?? null)\n }\n\n private recordProviderConnection(providerKey: string, connected: boolean): void {\n this.providerConnections.set(providerKey, connected)\n }\n\n private updateProviderTrackingFromUser(providerKey: string, user: any): void {\n if (!user) {\n return\n }\n\n if (providerKey === 'x') {\n const sessionId = this.extractSessionId(user)\n this.recordProviderSession('x', sessionId)\n const providers = this.getProvidersList(user)\n this.recordProviderConnection('x', providers.includes('x'))\n }\n }\n\n private extractSessionId(user: any): string | null {\n if (!user || typeof user !== 'object') {\n return null\n }\n\n if (typeof user.sessionId === 'string') {\n return user.sessionId\n }\n\n if (user.data && typeof user.data.sessionId === 'string') {\n return user.data.sessionId\n }\n\n return null\n }\n\n private getProvidersList(user: any): string[] {\n if (!user || typeof user !== 'object') {\n return []\n }\n\n const providersRaw = user.providers || user.data?.providers\n if (!Array.isArray(providersRaw)) {\n return []\n }\n\n return providersRaw\n .map((provider) => (typeof provider === 'string' ? provider.toLowerCase() : null))\n .filter((provider): provider is string => provider !== null)\n }\n\n /**\n * Get trusted apps for user\n */\n async getTrustedApps(userId: string): Promise<\n {\n userId: string\n projectId: string\n origin: string\n trustedAt: number\n appName?: string\n appLogo?: string\n }[]\n > {\n const response = await this.sendMessage('GET_TRUSTED_APPS', {\n userId\n })\n\n if (response.type === 'LUMIA_PASSPORT_TRUSTED_APPS_LIST') {\n return response.apps || []\n }\n\n return []\n }\n\n /**\n * Remove app from trusted list\n */\n async removeTrustedApp(userId: string, projectId: string, origin: string): Promise<boolean> {\n const response = await this.sendMessage('REMOVE_TRUSTED_APP', {\n userId,\n projectId,\n appOrigin: origin\n })\n\n if (response.type === 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED') {\n return response.success\n }\n\n return false\n }\n\n /**\n * Clear all authorizations for current project (for testing consent flow)\n * This will force the consent modal to appear on next authentication\n */\n async clearAuthorizations(): Promise<boolean> {\n try {\n const response = await this.sendMessage('CLEAR_AUTHORIZATIONS', {\n projectId: this.projectId\n })\n\n this.log('[IframeManager] Cleared authorizations for project:', this.projectId)\n return response.success || true\n } catch (error) {\n this.log('[IframeManager] Failed to clear authorizations:', error)\n return false\n }\n }\n\n /**\n * Create backup of keyshare\n */\n async createBackup(\n userId: string,\n backupRequest: { method: 'server' | 'cloud' | 'local'; password?: string; cloudProvider?: string },\n accessToken?: string\n ): Promise<{ success: boolean; method: string; timestamp: number; error?: string }> {\n const response = await this.sendMessage('CREATE_BACKUP', {\n userId,\n backupRequest,\n accessToken // Pass access token for TSS API authentication\n })\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_CREATED') {\n return response.result\n }\n\n throw new Error('Unexpected response type')\n }\n\n /**\n * Restore keyshare from server backup\n */\n async restoreFromServer(\n userId: string,\n password?: string,\n accessToken?: string\n ): Promise<{ success: boolean; timestamp: number; error?: string; data?: any }> {\n const response = await this.sendMessage('RESTORE_BACKUP', {\n userId,\n password,\n accessToken // Pass access token for TSS API authentication\n })\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_RESTORED') {\n return response.result\n }\n\n throw new Error('Unexpected response type')\n }\n\n /**\n * Encrypt backup data without uploading (for cloud/local backups)\n * Returns encrypted data that parent can upload/download\n */\n async encryptBackupData(userId: string, password?: string): Promise<any> {\n const response = await this.sendMessage('ENCRYPT_BACKUP_DATA', {\n userId,\n password\n })\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_ENCRYPTED') {\n return response.encryptedData\n }\n\n throw new Error('Unexpected response type')\n }\n\n /**\n * Restore keyshare from local file backup\n */\n async restoreFromLocalFile(\n userId: string,\n fileContent: string,\n password?: string\n ): Promise<{ success: boolean; timestamp: number; error?: string; data?: any }> {\n const response = await this.sendMessage('RESTORE_FROM_FILE', {\n userId,\n fileContent,\n password\n })\n\n if (response.type === 'LUMIA_PASSPORT_FILE_RESTORED') {\n return response.result\n }\n\n throw new Error('Unexpected response type')\n }\n\n /**\n * Get backup status for user\n */\n async getBackupStatus(userId: string): Promise<{\n server: { lastBackup?: number; error?: string }\n cloud: { lastBackup?: number; error?: string }\n local: { lastBackup?: number; error?: string }\n }> {\n const response = await this.sendMessage('GET_BACKUP_STATUS', {\n userId\n })\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_STATUS') {\n return response.status\n }\n\n throw new Error('Unexpected response type')\n }\n\n /**\n * Get available cloud providers\n */\n async getCloudProviders(): Promise<Array<{ id: string; name: string; available: boolean }>> {\n const response = await this.sendMessage('GET_CLOUD_PROVIDERS', {})\n\n if (response.type === 'LUMIA_PASSPORT_CLOUD_PROVIDERS') {\n return response.providers\n }\n\n throw new Error('Unexpected response type')\n }\n\n /**\n * Cleanup and destroy iframe\n */\n destroy(): void {\n this.log('[IframeManager] Destroying iframe...')\n\n // Stop heartbeat\n this.stopHeartbeat()\n\n // Clear pending requests\n this.pendingRequests.forEach((pending) => {\n pending.reject(new Error('Iframe manager destroyed'))\n })\n this.pendingRequests.clear()\n\n // Remove message listener\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener)\n this.messageListener = null\n }\n\n // Remove iframe\n if (this.iframe && this.iframe.parentNode) {\n this.iframe.parentNode.removeChild(this.iframe)\n }\n\n this.iframe = null\n this.isReady = false\n this.channelToken = null\n\n this.log('[IframeManager] ✅ Destroyed')\n }\n\n /**\n * Debug logging\n */\n private log(message: string, data?: any): void {\n if (this.debug) {\n if (data) {\n console.log(message, data)\n } else {\n console.log(message)\n }\n }\n }\n}\n\n// ========================================\n// Singleton Instance\n// ========================================\n\nlet iframeManagerInstance: IframeManager | null = null\n\n/**\n * Get or create iframe manager singleton\n */\nexport function getIframeManager(config?: IframeManagerConfig): IframeManager {\n if (!iframeManagerInstance && config) {\n iframeManagerInstance = new IframeManager(config)\n }\n\n if (!iframeManagerInstance) {\n throw new Error(\n 'IframeManager not initialized. This usually means projectId is not configured.\\n\\n' +\n 'To fix this:\\n' +\n '1. Get your projectId from https://dashboard.lumiapassport.com/\\n' +\n '2. Add it to LumiaPassportProvider:\\n' +\n ' <LumiaPassportProvider projectId=\"your-project-id\">\\n\\n' +\n 'For more details, see the documentation.'\n )\n }\n\n return iframeManagerInstance\n}\n\n/**\n * Wait for iframe to be ready\n * Returns a promise that resolves when iframe is initialized and authenticated\n */\nexport async function waitForIframe(): Promise<void> {\n const manager = getIframeManager()\n await manager.initialize()\n}\n\n/**\n * Destroy iframe manager singleton\n */\nexport function destroyIframeManager(): void {\n if (iframeManagerInstance) {\n iframeManagerInstance.destroy()\n iframeManagerInstance = null\n }\n}\n","export function notifyNoProjetctId(projectId?: string) {\n if (!!projectId) {\n console.log('[LumiaPassport] ✅ Initialized with projectId:', projectId)\n return\n }\n\n console.error(\n '\\n' +\n '╔══════════════════════════════════════════════════════════════════════════╗\\n' +\n '║ ⚠️ LUMIA PASSPORT WARNING ⚠️ ║\\n' +\n '╠══════════════════════════════════════════════════════════════════════════╣\\n' +\n '║ ║\\n' +\n '║ projectId is NOT configured! ║\\n' +\n '║ ║\\n' +\n '║ Your integration will NOT work without a valid projectId. ║\\n' +\n '║ Most features will be disabled and errors will occur. ║\\n' +\n '║ ║\\n' +\n '║ To fix this: ║\\n' +\n '║ 1. Get your projectId from: https://dashboard.lumiapassport.com/ ║\\n' +\n '║ 2. Add it to your LumiaPassportProvider: ║\\n' +\n '║ ║\\n' +\n '║ <LumiaPassportProvider projectId=\"your-project-id\"> ║\\n' +\n '║ {children} ║\\n' +\n '║ </LumiaPassportProvider> ║\\n' +\n '║ ║\\n' +\n '╚══════════════════════════════════════════════════════════════════════════╝\\n'\n )\n}\n","import { lumiaMainnetChain, lumiaTestnetChain } from '@embarkai/core/read';\nimport { fallback } from 'viem';\nimport { createConfig, http } from 'wagmi'\n\n// Re-export for backward compatibility\nexport { queryClient } from './queryClient';\n\n/**\n * Wagmi config for RainbowKit and wallet connections.\n * Note: Balance fetching uses dynamic publicClient from session store,\n * so chains don't need to be listed here for balance queries.\n */\nexport const wagmiConfig = createConfig({\n chains: [lumiaMainnetChain, lumiaTestnetChain],\n transports: {\n [lumiaTestnetChain.id]: buildTransport(lumiaTestnetChain.rpcUrls.default.http),\n [lumiaMainnetChain.id]: buildTransport(lumiaMainnetChain.rpcUrls.default.http),\n },\n});\n\nfunction buildTransport(urls: readonly string[]) {\n const transports = urls.map((url) =>\n http(url, {\n timeout: 10_000,\n retryCount: 0,\n batch: false, // Disable batch requests\n fetchOptions: { mode: 'cors' },\n }),\n );\n\n if (transports.length === 1) {\n return transports[0];\n }\n\n return fallback(transports, {\n rank: false,\n retryCount: 0,\n });\n}\n","import React from 'react';\nimport { WagmiProvider } from 'wagmi';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { wagmiConfig, queryClient } from '../config/wagmi';\n\nexport interface LumiaWagmiProviderProps {\n children: React.ReactNode;\n}\n\nexport const LumiaWagmiProvider: React.FC<LumiaWagmiProviderProps> = ({ children }) => {\n return (\n <WagmiProvider config={wagmiConfig}>\n {/* <QueryClientProvider client={queryClient}> */}\n {children}\n {/* </QueryClientProvider> */}\n </WagmiProvider>\n );\n};","import { initSdkErrorTracking } from '@embarkai/core/internal/error-tracking'\nimport { merge } from 'lodash-es'\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type MutableRefObject,\n type ReactNode\n} from 'react'\n\nimport {\n DEFAULT_LUMIA_PASSPORT_CONFIG,\n getIframeUrl,\n getServiceUrls,\n type LumiaPassportConfig\n} from '../config/lumiaPassport'\n//\nimport { destroyIframeManager, getIframeManager } from '../internal/lib/iframe-manager'\nimport { useLumiaPassportSession } from './LumiaPassportSessionContext'\nimport { notifyNoProjetctId } from './utils'\nimport { LumiaWagmiProvider } from './WagmiContext'\n\nexport interface WalletReadyStatus {\n ready: boolean\n userId?: string\n address?: `0x${string}`\n hasKeyshare: boolean\n hasSession: boolean\n timestamp: number\n}\n\nexport interface LumiaPassportCallbacks {\n onLumiaPassportConnecting?: (payload: {\n method: 'passkey' | 'email' | 'social' | 'wallet'\n provider?: string\n }) => void\n onLumiaPassportConnect?: (payload: { address: `0x${string}`; session: any }) => void\n onLumiaPassportAccount?: (payload: {\n userId?: string | null\n address?: `0x${string}` | null\n session?: any\n hasKeyshare?: boolean\n }) => void\n onLumiaPassportUpdate?: (payload: { providers?: Array<any> }) => void\n onLumiaPassportDisconnect?: (payload: { address?: `0x${string}` | null; userId?: string | null }) => void\n onLumiaPassportError?: (payload: { error: Error; code?: string; message: string }) => void\n onLumiaPassportChainChange?: (payload: { chainId: number; previousChainId: number }) => void\n onWalletReady?: (status: WalletReadyStatus) => void\n}\n\ninterface LumiaPassportContextType {\n config: MutableRefObject<LumiaPassportConfig>\n updateConfig: (updates: Partial<LumiaPassportConfig>) => void\n callbacks?: LumiaPassportCallbacks\n}\n\nconst LumiaPassportContext = createContext<LumiaPassportContextType | undefined>(undefined)\n\nexport interface LumiaPassportProviderProps {\n children: ReactNode\n projectId?: string\n initialConfig?: Partial<LumiaPassportConfig>\n callbacks?: LumiaPassportCallbacks\n}\n\n/** NEVER EVER declare here any state (useState or whatever). This Provider should NEVER trigger self of child-app re-renders */\nexport function LumiaPassportProvider(props: LumiaPassportProviderProps) {\n const { children, projectId, initialConfig = {}, callbacks } = props\n\n const callbacksRef = useRef<LumiaPassportCallbacks | undefined>(callbacks)\n useEffect(() => {\n callbacksRef.current = callbacks\n }, [callbacks])\n\n useEffect(() => notifyNoProjetctId(projectId), [projectId]) // Log warning if projectId is not set\n\n const config = useRef<LumiaPassportConfig>({ projectId, ...DEFAULT_LUMIA_PASSPORT_CONFIG }) // config as ref to avoid re-renders\n\n /** updates LumiaPassport config without causing any re-renders */\n const updateConfig = useCallback((updates: Partial<LumiaPassportConfig>) => {\n const prev = config.current\n const next = { ...prev }\n\n if (updates.projectId !== undefined) next.projectId = updates.projectId\n\n if (updates.projectAssets) next.projectAssets = { ...next.projectAssets, ...updates.projectAssets }\n\n if (updates.passkey) next.passkey = { ...next.passkey, ...updates.passkey }\n if (updates.email) next.email = { ...next.email, ...updates.email }\n if (updates.social) {\n next.social = { ...next.social, ...updates.social }\n if (updates.social.providers) next.social.providers = updates.social.providers\n }\n\n if (updates.development) next.development = { ...next.development, ...updates.development }\n\n if (updates.ui) next.ui = { ...next.ui, ...updates.ui }\n\n if (updates.network) next.network = { ...next.network, ...updates.network }\n if (updates.services) next.services = { ...next.services, ...updates.services }\n if (updates.features) next.features = { ...next.features, ...updates.features }\n if (updates.warnings) next.warnings = { ...next.warnings, ...updates.warnings }\n if (updates.kyc) next.kyc = { ...next.kyc, ...updates.kyc }\n if (updates.watchTokens) next.watchTokens = { ...next.watchTokens, ...updates.watchTokens }\n\n // Update global services when services config changes\n if (updates.services && typeof window !== 'undefined') {\n try {\n window.__EMBARK_SERVICES__ = next.services\n // console.log('[LumiaPassportProvider] Updated window.__EMBARK_SERVICES__:', next.services)\n } catch {}\n }\n\n // Update global projectId when it changes\n if (updates.projectId !== undefined && typeof window !== 'undefined') {\n try {\n window.__EMBARK_PROJECT_ID__ = next.projectId\n // console.log('[LumiaPassportProvider] Updated __EMBARK_PROJECT_ID__:', next.projectId)\n } catch {}\n }\n\n if (updates.translations) next.translations = { ...next.translations, ...updates.translations }\n\n config.current = next\n }, [])\n\n useEffect(() => {\n if (typeof window === 'undefined' || !projectId) return\n\n const mergedConfig = merge(DEFAULT_LUMIA_PASSPORT_CONFIG, initialConfig)\n updateConfig(mergedConfig)\n\n // Make services override available immediately for non-React modules\n try {\n if (typeof window !== 'undefined') {\n window.__EMBARK_SERVICES__ = mergedConfig.services\n window.__EMBARK_PROJECT_ID__ = projectId\n\n const resolvedServices = getServiceUrls()\n console.log('[LumiaPassportProvider] Resolved services:', resolvedServices)\n }\n } catch {}\n\n // If forceChain is enabled and chainId is provided, set activeChainId immediately\n const activeChainId = useLumiaPassportSession.getState().activeChainId // last user's activeChainId is persisted in localStorage\n if (!!mergedConfig.network.forceChain && mergedConfig.network.chainId !== activeChainId) {\n useLumiaPassportSession.getState().setActiveChainId(mergedConfig.network.chainId) // setting active chain auto-runs side-effects to update sdk/network contexts\n }\n }, [projectId, initialConfig])\n\n // Initialize iframe manager for secure MPC operations (reactive only to projectId)\n useEffect(() => {\n if (typeof window === 'undefined' || !projectId) return\n\n // Initialize SDK error tracking (automatic, no user configuration needed)\n try {\n initSdkErrorTracking()\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('[LumiaPassport] Failed to initialize SDK error tracking:', error)\n }\n }\n\n const iframeUrl = getIframeUrl()\n\n try {\n const iframeManager = getIframeManager({\n iframeUrl,\n projectId,\n debug: config.current.features?.mpcSecurity ?? true,\n onWalletReady: (status: WalletReadyStatus) => {\n useLumiaPassportSession.getState().setWalletReadyStatus(status)\n callbacksRef.current?.onWalletReady?.(status)\n }\n })\n\n // Initialize iframe asynchronously\n iframeManager\n .initialize()\n .then(() => void useLumiaPassportSession.getState().setIsIframeReady(true))\n .catch((error) => void console.error('[LumiaPassport] ❌ Failed to initialize iframe wallet:', error))\n\n // Cleanup on unmount\n return () => {\n console.log('[LumiaPassport] Cleaning up iframe manager...')\n destroyIframeManager()\n }\n } catch (error) {\n console.error('[LumiaPassport] Error setting up iframe manager:', error)\n }\n\n // Не добавлять зависимости без полного понимания.\n // Триггер жизненного цикла сейчас происходит ТОЛЬКО при маунте\\анмаунте контекста или смене projectId.\n // Нужно это для избежания багов, связанных с лишними пересозданиями iframeManager\n }, [projectId])\n\n const contextValue = useMemo(() => ({ config, updateConfig, callbacks }), [config, updateConfig, callbacks])\n\n return (\n <LumiaWagmiProvider>\n <LumiaPassportContext.Provider value={contextValue}>{children}</LumiaPassportContext.Provider>\n </LumiaWagmiProvider>\n )\n}\n\nexport const useLumiaPassportConfig = () => {\n const ctx = useContext(LumiaPassportContext)\n if (!ctx) throw new Error('useLumiaPassportConfig must be used within a LumiaPassportProvider')\n return ctx\n}\n","import { LumiaIcon } from '@/assets/LumiaIcon'\nimport { useQuery } from '@tanstack/react-query'\nimport { Cloud, Laptop, Loader, Shield } from 'lucide-react'\nimport { useEffect, useMemo, type FC, type HTMLAttributes } from 'react'\n\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext'\nimport { jwtTokenManager } from '../internal/auth'\nimport { getUserProfile, QUERY_KEYS } from '../internal/clients/profile'\nimport { BalanceView } from '../internal/components/BalanceView'\nimport { KYCStatus } from '../internal/components/KYC'\n//\nimport { Button } from '../internal/components/ui/button'\nimport { PageKey, useLayoutDataStore } from '../internal/hooks/useLayoutDataStore'\n//\nimport { useLayoutStore } from '../internal/hooks/useLayoutStore'\nimport { cn } from '../internal/lib/utils'\n\nexport interface ConnectWalletButtonProps {\n /** Button Component to render as unsigned button instance */\n ConnectButton?: FC<HTMLAttributes<HTMLButtonElement>>\n className?: string\n label?: string\n\n // TODO: provide usePaymaster via config context\n usePaymaster?: boolean\n}\n\nfunction getFormattedStatus(label: string, status: string, showStatus: boolean) {\n const isStatus = showStatus && status && status !== 'idle' && status !== 'ready'\n if (!isStatus) return label\n return status\n}\n\nexport function ConnectWalletButton(props: ConnectWalletButtonProps) {\n const {\n ConnectButton,\n className,\n label = 'Connect Wallet',\n // TODO: provide usePaymaster via config context\n usePaymaster = true\n } = props\n\n // console.log('[ CONNECT BUTTON RENDER ] should be as minimal as possible')\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n const settingsNotifications = useLayoutDataStore((st) => st.settingsNotifications)\n const colorMode = useLayoutStore((st) => st.colorMode)\n\n const { config } = useLumiaPassportConfig()\n const { session, address, hasServerVault, isLoading, isIframeReady, status, setUsePaymaster } =\n useLumiaPassportSession()\n\n const connectButtonLabel = getFormattedStatus(label || 'Connect', status, isIframeReady)\n\n useEffect(() => setUsePaymaster(usePaymaster), [setUsePaymaster, usePaymaster])\n\n // Fetch profile to get nickname (with fallback to JWT data)\n const { data: profile, isLoading: isProfileLoading } = useQuery({\n retry: false,\n enabled: !!address,\n queryKey: [QUERY_KEYS.userProfile, address],\n queryFn: getUserProfile\n })\n\n // RENDER CONSTANTS\n\n // const avatar = jwtTokenManager.getAvatar()\n // const displayName = jwtTokenManager.getDisplayName()\n\n const displayName = profile?.nicknameDisplay || profile?.displayName || jwtTokenManager.getDisplayName()\n\n const indicators = useMemo(() => {\n // const userId = jwtTokenManager.getUserId()\n const userId = session?.mpcUserId\n\n if (!userId) return { server: false, local: false, backup: false }\n // Note: In iframe mode, local keyshare is stored in iframe's isolated localStorage\n // We can't directly check it from parent context, so we use server indicator\n // The local indicator now means \"has session with iframe\"\n const server = jwtTokenManager.getHasKeyshare() ?? false\n const local = !!address // If address exists, iframe has keyshare\n // Use the actual server vault status instead of local backup status\n return { server, local, backup: hasServerVault }\n }, [session, address, hasServerVault])\n\n const isConnecting = connectButtonLabel !== label || isLoading\n\n return (\n <div data-lumia-passport-mode={colorMode} className={cn('lumia-scope w-fit h-fit', className)}>\n {!address ? (\n /** external Buttons can be provided */\n <>\n {ConnectButton ? (\n <ConnectButton\n //@ts-expect-error\n type=\"button\"\n disabled={isConnecting}\n onClick={() => setPage(PageKey.AUTH)}\n >\n {isConnecting && <Loader className=\"w-4 h-4 animate-spin\" />}\n {connectButtonLabel}\n </ConnectButton>\n ) : (\n <Button\n type=\"button\"\n disabled={isConnecting}\n variant=\"default\" // keep it default\n size=\"large\"\n onClick={() => setPage(PageKey.AUTH)}\n className={cn(\n 'lumia-passport-button w-fit h-16 px-8',\n // 'rounded-[var(--l-pass-bdrs)]',\n 'border-0 border-transparent', // to override button appearance bd, which case to case might drop black border\n 'bg-[var(--l-pass-bg)] hover:bg-[var(--l-pass-bg)] active:bg-[var(--l-pass-bg)] text-[var(--l-pass-fg)]',\n 'disabled:hover:bg-[var(--l-pass-bg)] disabled:active:bg-[var(--l-pass-bg)]'\n )}\n >\n {isConnecting && <Loader className=\"w-4 h-4 animate-spin\" />}\n {connectButtonLabel.toUpperCase()}\n </Button>\n )}\n </>\n ) : (\n <button\n type=\"button\"\n onClick={() => setPage(PageKey.MAIN_MENU)}\n className={cn(\n 'lumia-passport-button relative',\n 'border-0 border-transparent', // to override button appearance bd, which case to case might drop black border\n 'relative flex items-center gap-2 cursor-pointer bg-[var(--l-pass-bg)]',\n 'rounded-[var(--l-pass-bdrs)] p-4 max-w-sm min-w-[256px]'\n )}\n >\n <div className=\"w-12 h-12 rounded-full bg-[var(--l-pass-fg)] flex items-center justify-center flex-shrink-0\">\n {profile?.avatar ? (\n <img src={profile.avatar} alt=\"User avatar\" className=\"w-full h-full object-cover\" />\n ) : (\n <LumiaIcon width={48} height={48} />\n )}\n </div>\n\n <div className=\"text-left flex-1 min-w-0 text-[var(--l-pass-fg)]\">\n <div className=\"flex items-center gap-[var(--l-pass-gap)]\">\n {isProfileLoading ? (\n <Loader className=\"w-4 h-4 animate-spin\" />\n ) : (\n <span className=\"w-fit text-[14px] leading-4 truncate max-w-[144px] text-[var(--l-pass-fg)]\">\n {displayName}\n </span>\n )}\n\n {!isProfileLoading && <KYCStatus />}\n </div>\n\n <BalanceView />\n </div>\n\n <div className=\"flex items-center space-x-1\">\n <div className=\"group relative\">\n <Cloud\n className={`w-3 h-3 ${indicators.server ? 'text-[var(--l-pass-bg-success)]' : 'text-[var(--l-pass-bg-warning)]'}`}\n />\n <div\n className={cn(\n 'text-[var(--l-pass-fg)] bg-[var(--l-pass-secondary)] text-xs rounded-full opacity-0 whitespace-nowrap z-50',\n 'absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1',\n 'group-hover:opacity-100 transition-opacity pointer-events-none'\n )}\n >\n Server KeyShare: {indicators.server ? `Protected` : 'Missing'}\n </div>\n </div>\n\n <div className=\"group relative\">\n <Laptop\n className={`w-3 h-3 ${indicators.local ? 'text-[var(--l-pass-bg-success)]' : 'text-[var(--l-pass-bg-warning)]'}`}\n />\n <div\n className={cn(\n 'text-[var(--l-pass-fg)] bg-[var(--l-pass-secondary)] text-xs rounded-full opacity-0 whitespace-nowrap z-50',\n 'absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1',\n 'group-hover:opacity-100 transition-opacity pointer-events-none'\n )}\n >\n Local KeyShare: {indicators.local ? 'Secured' : 'Missing'}\n </div>\n </div>\n\n <div className=\"group relative\">\n <Shield\n className={`w-3 h-3 ${indicators.backup ? 'text-[var(--l-pass-bg-success)]' : 'text-[var(--l-pass-bg-warning)]'}`}\n />\n <div\n className={cn(\n 'text-[var(--l-pass-fg)] bg-[var(--l-pass-secondary)] text-xs rounded-full opacity-0 whitespace-nowrap z-50',\n 'absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1',\n 'group-hover:opacity-100 transition-opacity pointer-events-none'\n )}\n >\n Vault Keyshare Backup: {indicators.backup ? 'Secured' : 'Missing'}\n </div>\n </div>\n </div>\n\n {!!settingsNotifications.length && (\n <div\n className={cn(\n 'absolute -top-2 right-4 flex h-4 w-4',\n 'items-center justify-center rounded-full bg-[var(--l-pass-bg-error)]',\n 'text-xs font-bold text-[var(--l-pass-error)]'\n )}\n >\n {settingsNotifications.length}\n </div>\n )}\n </button>\n )}\n </div>\n )\n}\n","import { useLumiaPassportSession } from '../context/LumiaPassportSessionContext'\nimport { useLayoutDataStore } from '../internal/hooks/useLayoutDataStore'\nimport { useLayoutStore } from '../internal/hooks/useLayoutStore'\n\nexport const useLumiaPassportIsMobileView = () => {\n // isolation to prevent child app's components rerendering when other layout data changes\n return useLayoutStore((st) => st.isMobileView)\n}\n\nexport const useLumiaPassportBalance = () => {\n // isolation to prevent child app's components rerendering when other layout data changes\n const walletBalance = useLayoutDataStore((st) => st.balance)\n const fiatBalance = useLayoutDataStore((st) => st.fiatBalance)\n const cryptoRate = useLayoutDataStore((st) => st.cryptoRate)\n const fiatSymbol = useLayoutDataStore((st) => st.fiatSymbol)\n const cryptoSymbol = useLayoutDataStore((st) => st.cryptoSymbol)\n\n return { walletBalance, fiatBalance, cryptoRate, fiatSymbol, cryptoSymbol }\n}\n\nexport const useLumiaPassportIFrameReady = () => useLumiaPassportSession((st) => st.isIframeReady)\n\nexport const useLumiaPassportAccountSession = () => useLumiaPassportSession((st) => st.session)\nexport const useLumiaPassportAddress = () => useLumiaPassportSession((st) => st.address)\n\nexport const useLumiaPassportError = () => useLumiaPassportSession((st) => st.error)\nexport const useLumiaPassportLoadingStatus = () => {\n // isolation to prevent child app's components rerendering when other session data changes\n const sessionStatus = useLumiaPassportSession((st) => st.status)\n const isSessionLoading = useLumiaPassportSession((st) => st.isLoading)\n\n return { isSessionLoading, sessionStatus }\n}\n\nexport const useLumiaPassportRecoveryUserId = () => useLumiaPassportSession((st) => st.recoveryUserId)\nexport const useLumiaPassportHasServerVault = () => useLumiaPassportSession((st) => st.hasServerVault)\nexport const useLumiaPassportActiveChainId = () => useLumiaPassportSession((st) => st.activeChainId)\n","import { useCallback } from 'react'\n\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext'\nimport { PageKey, useLayoutDataStore, type PageOpenParams } from '../internal/hooks/useLayoutDataStore'\n\n// TODO: implement pageOptions obj\n\n/**\n * Hook to programmatically open the LumiaPassport dialogs\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isOpen, open, close } = useLumiaPassportOpen();\n *\n * return (\n * <button onClick={() => open(PageKey.BUY, { amount: 10 })}>\n * Buy LUMIA\n * </button>\n * );\n * }\n * ```\n */\nexport function useLumiaPassportOpen() {\n const page = useLayoutDataStore((st) => st.page)\n const setPage = useLayoutDataStore((st) => st.setPage)\n const setPageParams = useLayoutDataStore((st) => st.setPageParams)\n\n const address = useLumiaPassportSession((st) => st.address)\n\n const open = useCallback(\n (passportPage: PageKey, params?: PageOpenParams) => {\n if (!address) return setPage(PageKey.AUTH)\n\n if (!!address && passportPage === PageKey.AUTH) return setPage(PageKey.MANAGE_WALLET)\n\n setPage(passportPage)\n\n if (!!params) setPageParams(params)\n },\n [setPage, setPageParams, address]\n )\n\n const close = useCallback(() => setPage(null), [setPage])\n\n return { open, close, isOpen: page !== null } as const\n}\n","import { useCallback, useEffect } from 'react'\n\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext'\nimport { LOCAL_COLOR_MODE_KEY } from '../internal/constants'\nimport { useLayoutStore, type ColorMode } from '../internal/hooks/useLayoutStore'\n\nexport function useLumiaPassportColorMode() {\n const {\n config: { current: config }\n } = useLumiaPassportConfig()\n\n const preferedColorMode = config?.preferedColorMode as ColorMode | undefined\n\n const colorMode = useLayoutStore((st) => st.colorMode)\n const handleStoreColorMode = useLayoutStore((st) => st.setColorMode)\n\n const setColorMode = useCallback(\n (mode: ColorMode) => {\n localStorage.setItem(LOCAL_COLOR_MODE_KEY, mode)\n handleStoreColorMode(mode)\n },\n [handleStoreColorMode]\n )\n\n // Sync localStorage color mode store on mount\n useEffect(() => {\n let targetColorMode = localStorage.getItem(LOCAL_COLOR_MODE_KEY) as ColorMode | null\n\n // no preferedColorMode & no localStoredColorMode means 'auto' detection\n if (!targetColorMode && !preferedColorMode) {\n const systemMode = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n localStorage.setItem(LOCAL_COLOR_MODE_KEY, systemMode)\n targetColorMode = systemMode\n }\n\n // use preferedColorMode from config if available\n if (!targetColorMode && !!preferedColorMode) {\n localStorage.setItem(LOCAL_COLOR_MODE_KEY, preferedColorMode)\n targetColorMode = preferedColorMode\n }\n\n handleStoreColorMode(targetColorMode)\n // no dependencies to run only once on mount\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return { colorMode, setColorMode }\n}\n","import { Moon, Sun } from 'lucide-react'\n\nimport { useLumiaPassportColorMode } from '../hooks/useLumiaPassportColorMode'\nimport { Button, type ButtonProps } from '../internal/components/ui/button'\nimport { cn } from '../internal/lib/utils'\n\n/** LumiaPassport Color Mode Switcher */\nexport function ThemeToggle(props: ButtonProps) {\n const { className, ...btnProps } = props\n\n const { colorMode, setColorMode } = useLumiaPassportColorMode()\n\n return (\n <div\n className={cn('lumia-scope', className)}\n data-lumia-passport-mode={colorMode}\n style={{ width: 'fit-content', height: 'fit-content' }}\n >\n <Button\n {...btnProps}\n variant=\"ghost\"\n onClick={() => setColorMode(colorMode === 'light' ? 'dark' : 'light')}\n title={`Current theme: ${colorMode}. Click to switch.`}\n >\n {colorMode === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\n </Button>\n </div>\n )\n}\n","import { getLanguageIcon, useT } from '../i18n'\nimport { Button, type ButtonProps } from '../internal/components/ui/button'\nimport { PageKey, useLayoutDataStore } from '../internal/hooks/useLayoutDataStore'\nimport { cn } from '../internal/lib/utils'\n\n/** LumiaPassport Language Switcher */\nexport function LangToggle(props: ButtonProps) {\n const { className, ...btnProps } = props\n\n const { i18n } = useT()\n\n const setPage = useLayoutDataStore((st) => st.setPage)\n\n return (\n <div\n className={cn('lumia-scope', className)}\n data-mbark-language={i18n.resolvedLanguage || 'en'}\n style={{ width: 'fit-content', height: 'fit-content' }}\n >\n <Button\n {...btnProps}\n variant=\"ghost\"\n onClick={() => setPage(PageKey.LANGUAGES)}\n title={`Current language: ${i18n.resolvedLanguage}. Click to switch.`}\n >\n {getLanguageIcon(i18n.resolvedLanguage || 'en')}\n </Button>\n </div>\n )\n}\n","import { getDefaultConfig } from '@rainbow-me/rainbowkit'\nimport { arbitrum, avalanche, base, bsc, mainnet, optimism, polygon, zora } from 'wagmi/chains'\n\nimport { lumiaMainnetChain, lumiaTestnetChain } from '@embarkai/core/read'\n\n// Get WalletConnect project ID from environment or use default\nconst getProjectId = (configProjectId?: string) => {\n // First check if provided via config\n if (configProjectId) {\n return configProjectId\n }\n\n // Check various possible environment variable formats\n if (typeof window !== 'undefined') {\n // Browser environment\n return (\n (window as any).NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID ||\n (window as any).VITE_WALLET_CONNECT_PROJECT_ID ||\n (window as any).__WALLET_CONNECT_PROJECT_ID__ ||\n 'YOUR_PROJECT_ID'\n )\n }\n\n // Default fallback - this will work for testing but not production\n return 'YOUR_PROJECT_ID'\n}\n\n// Create RainbowKit configuration with all popular chains\nexport const createRainbowConfig = (projectId?: string): ReturnType<typeof getDefaultConfig> => {\n return getDefaultConfig({\n appName: 'Mbark Wallet',\n projectId: getProjectId(projectId),\n chains: [\n lumiaMainnetChain,\n lumiaTestnetChain,\n mainnet,\n polygon,\n bsc,\n arbitrum,\n optimism,\n avalanche,\n base,\n zora\n ],\n ssr: false // Set to true if using SSR\n })\n}\n\n// Default config for backwards compatibility\nexport const rainbowConfig: ReturnType<typeof getDefaultConfig> = createRainbowConfig()\n\n// Custom theme for RainbowKit to match Lumia design\n// Mapped from lumia-scope CSS variables for consistency\nexport const rainbowTheme = {\n lightMode: {\n colors: {\n // Primary accent - using --l-pass-primary\n accentColor: '#000000', // --l-pass-primary\n accentColorForeground: '#ffffff', // --l-pass-fg-inverted\n\n // Borders\n actionButtonBorder: 'rgb(201, 201, 201)', // --l-pass-bd\n actionButtonBorderMobile: 'rgb(169, 169, 169)', // --l-pass-bd-intense\n\n // Secondary backgrounds\n actionButtonSecondaryBackground: '#e4e4e4', // --l-pass-secondary\n\n // Close button\n closeButton: 'rgba(0, 0, 0, 0.6)', // --l-pass-fg-h\n closeButtonBackground: '#e4e4e4', // --l-pass-secondary\n\n // Connect button\n connectButtonBackground: '#ffffff', // --l-pass-bg\n connectButtonBackgroundError: '#d6204e', // --l-pass-bg-error\n connectButtonInnerBackground: 'linear-gradient(0deg, rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.02))',\n connectButtonText: '#000000', // --l-pass-fg\n connectButtonTextError: '#ffffff', // --l-pass-error\n\n // Status indicators\n connectionIndicator: '#21ff51', // --l-pass-bg-success\n standby: '#e9fa00', // --l-pass-bg-warning\n error: '#d6204e', // --l-pass-bg-error\n\n // Card backgrounds\n downloadBottomCardBackground:\n 'linear-gradient(126deg, rgba(0, 0, 0, 0) 9.49%, rgba(0, 0, 0, 0.05) 71.04%), #ffffff',\n downloadTopCardBackground: 'linear-gradient(126deg, rgba(0, 0, 0, 0.05) 9.49%, rgba(0, 0, 0, 0) 71.04%), #ffffff',\n\n // Borders\n generalBorder: 'rgb(201, 201, 201)', // --l-pass-bd\n generalBorderDim: 'rgba(201, 201, 201, 0.5)',\n\n // Menu items\n menuItemBackground: '#e4e4e4', // --l-pass-secondary\n\n // Modal\n modalBackdrop: 'rgba(255, 255, 255, 0.8)', // --l-pass-overlay\n modalBackground: '#ffffff', // --l-pass-bg\n modalBorder: 'rgb(201, 201, 201)', // --l-pass-bd\n modalText: '#000000', // --l-pass-fg\n modalTextDim: 'rgba(0, 0, 0, 0.4)', // --l-pass-fg-a\n modalTextSecondary: 'rgba(0, 0, 0, 0.6)', // --l-pass-fg-h\n\n // Profile\n profileAction: '#ffffff', // --l-pass-bg\n profileActionHover: '#e4e4e4', // --l-pass-secondary\n profileForeground: '#e4e4e4', // --l-pass-secondary\n\n // Selection\n selectedOptionBorder: 'rgb(169, 169, 169)' // --l-pass-bd-intense\n },\n shadows: {\n connectButton: '0px 4px 10px rgba(0, 0, 0, 0.1)', // matches --l-pass-shadow-c\n dialog: '0px 8px 32px rgba(0, 0, 0, 0.1)',\n profileDetailsAction: '0px 2px 6px rgba(0, 0, 0, 0.1)',\n selectedOption: '0px 2px 6px rgba(0, 0, 0, 0.1)',\n selectedWallet: '0px 2px 6px rgba(0, 0, 0, 0.1)',\n walletLogo: '0px 2px 16px rgba(0, 0, 0, 0.1)'\n },\n radii: {\n actionButton: '10px', // --l-pass-el-bdrs\n connectButton: '20px', // --l-pass-bdrs\n menuButton: '10px', // --l-pass-el-bdrs\n modal: '20px', // --l-pass-bdrs\n modalMobile: '20px' // --l-pass-bdrs\n }\n },\n darkMode: {\n colors: {\n // Primary accent - using --l-pass-primary\n accentColor: '#ffffff', // --l-pass-primary\n accentColorForeground: '#000000', // --l-pass-fg-inverted\n\n // Borders\n actionButtonBorder: '#3a3a3a', // --l-pass-bd\n actionButtonBorderMobile: '#4a4a4a', // --l-pass-bd-intense\n\n // Secondary backgrounds\n actionButtonSecondaryBackground: '#2a2a2a', // --l-pass-secondary\n\n // Close button\n closeButton: 'rgba(255, 255, 255, 0.6)', // --l-pass-fg-h\n closeButtonBackground: '#2a2a2a', // --l-pass-secondary\n\n // Connect button\n connectButtonBackground: '#1a1a1a', // --l-pass-bg\n connectButtonBackgroundError: '#d6204e', // --l-pass-bg-error\n connectButtonInnerBackground: 'linear-gradient(0deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02))',\n connectButtonText: '#ffffff', // --l-pass-fg\n connectButtonTextError: '#ffffff', // --l-pass-error\n\n // Status indicators\n connectionIndicator: '#21ff51', // --l-pass-bg-success\n standby: '#e9fa00', // --l-pass-bg-warning\n error: '#d6204e', // --l-pass-bg-error\n\n // Card backgrounds\n downloadBottomCardBackground:\n 'linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(255, 255, 255, 0.05) 71.04%), #1a1a1a',\n downloadTopCardBackground:\n 'linear-gradient(126deg, rgba(255, 255, 255, 0.05) 9.49%, rgba(255, 255, 255, 0) 71.04%), #1a1a1a',\n\n // Borders\n generalBorder: '#3a3a3a', // --l-pass-bd\n generalBorderDim: 'rgba(58, 58, 58, 0.5)',\n\n // Menu items\n menuItemBackground: '#2a2a2a', // --l-pass-secondary\n\n // Modal\n modalBackdrop: 'rgba(0, 0, 0, 0.8)', // --l-pass-overlay\n modalBackground: '#1a1a1a', // --l-pass-bg\n modalBorder: '#3a3a3a', // --l-pass-bd\n modalText: '#ffffff', // --l-pass-fg\n modalTextDim: 'rgba(255, 255, 255, 0.4)', // --l-pass-fg-a\n modalTextSecondary: 'rgba(255, 255, 255, 0.6)', // --l-pass-fg-h\n\n // Profile\n profileAction: '#1a1a1a', // --l-pass-bg\n profileActionHover: '#2a2a2a', // --l-pass-secondary\n profileForeground: '#2a2a2a', // --l-pass-secondary\n\n // Selection\n selectedOptionBorder: '#4a4a4a' // --l-pass-bd-intense\n },\n shadows: {\n connectButton: '0px 4px 10px rgba(0, 0, 0, 0.5)', // matches --l-pass-shadow-c\n dialog: '0px 8px 32px rgba(0, 0, 0, 0.5)',\n profileDetailsAction: '0px 2px 6px rgba(0, 0, 0, 0.5)',\n selectedOption: '0px 2px 6px rgba(0, 0, 0, 0.5)',\n selectedWallet: '0px 2px 6px rgba(0, 0, 0, 0.5)',\n walletLogo: '0px 2px 16px rgba(0, 0, 0, 0.5)'\n },\n radii: {\n actionButton: '10px', // --l-pass-el-bdrs\n connectButton: '20px', // --l-pass-bdrs\n menuButton: '10px', // --l-pass-el-bdrs\n modal: '20px', // --l-pass-bdrs\n modalMobile: '20px' // --l-pass-bdrs\n }\n }\n}\n","import { darkTheme, lightTheme, RainbowKitProvider, Theme } from '@rainbow-me/rainbowkit'\nimport { useMemo, type PropsWithChildren } from 'react'\nimport { WagmiProvider } from 'wagmi'\n\nimport { createRainbowConfig, rainbowTheme } from '../config/rainbowkit'\nimport { useLayoutStore } from '../internal/hooks/useLayoutStore'\nimport { useLumiaPassportConfig } from './LumiaPassportContext'\n\nimport '@rainbow-me/rainbowkit/styles.css'\n\nexport function LumiaRainbowKitProvider({ children }: PropsWithChildren) {\n const config = useLumiaPassportConfig().config\n const colorMode = useLayoutStore((st) => st.colorMode)\n\n // Create config with projectId from Lumia config\n const rainbowConfig = useMemo(() => createRainbowConfig(config.current?.wallet?.walletConnectProjectId), [config])\n\n // Merge custom theme with RainbowKit theme\n const customTheme: Theme = useMemo(\n () =>\n colorMode === 'dark'\n ? {\n ...darkTheme(),\n colors: { ...darkTheme().colors, ...rainbowTheme.darkMode.colors },\n shadows: rainbowTheme.darkMode.shadows,\n radii: rainbowTheme.darkMode.radii\n }\n : {\n ...lightTheme(),\n colors: { ...lightTheme().colors, ...rainbowTheme.lightMode.colors },\n shadows: rainbowTheme.lightMode.shadows,\n radii: rainbowTheme.lightMode.radii\n },\n [colorMode]\n )\n\n // If wallet is not enabled, just render children without RainbowKit\n if (!config.current?.wallet?.enabled) return <>{children}</>\n\n return (\n <WagmiProvider config={rainbowConfig}>\n <RainbowKitProvider theme={customTheme} modalSize=\"compact\" showRecentTransactions={true}>\n {children}\n </RainbowKitProvider>\n </WagmiProvider>\n )\n}\n","import { forwardRef } from 'react'\n\ninterface LumiaLogoProps {\n size?: number\n className?: string\n}\n\nexport const LumiaLogo = forwardRef<SVGSVGElement, LumiaLogoProps>(({ size = 24, className = '' }, ref) => (\n <svg\n ref={ref}\n viewBox=\"0 0 512 512\"\n width={size}\n height={size}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n >\n <circle cx=\"256\" cy=\"256\" r=\"256\" fill=\"currentColor\" strokeWidth=\"0\" />\n\n <path\n d=\"M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z\"\n fill=\"var(--l-pass-fg-inverted)\"\n strokeWidth=\"0\"\n />\n <path\n d=\"M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z\"\n fill=\"var(--l-pass-fg-inverted)\"\n strokeWidth=\"0\"\n />\n <path\n d=\"M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z\"\n fill=\"var(--l-pass-fg-inverted)\"\n strokeWidth=\"0\"\n />\n <path\n d=\"M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z\"\n fill=\"var(--l-pass-fg-inverted)\"\n strokeWidth=\"0\"\n />\n </svg>\n))\n","import { LumiaLogo } from '../internal/assets/LumiaLogo'\n\nexport { LumiaLogo }\n","/**\n * Get UserOperation receipt by hash\n */\n\nimport type { Hash } from 'viem'\nimport { bundlerRpc } from '@embarkai/core'\nimport { getChainConfig } from '@embarkai/core/read'\nimport { requireActiveChainId } from '../../context/LumiaPassportSessionContext'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * UserOperation receipt\n *\n * Contains execution details after UserOp is included in a block\n */\nexport interface UserOperationReceipt {\n /** UserOperation hash */\n userOpHash: Hash\n\n /** EntryPoint address that processed this UserOp */\n entryPoint: `0x${string}`\n\n /** Sender (smart account) address */\n sender: `0x${string}`\n\n /** Nonce used for this UserOp */\n nonce: `0x${string}`\n\n /** True if UserOp succeeded, false if reverted */\n success: boolean\n\n /** Actual gas cost paid */\n actualGasCost: `0x${string}`\n\n /** Actual gas used */\n actualGasUsed: `0x${string}`\n\n /** Paymaster address (if used) */\n paymaster?: `0x${string}`\n\n /** Transaction receipt */\n receipt: {\n transactionHash: Hash\n blockNumber: `0x${string}`\n blockHash: Hash\n [key: string]: any\n }\n\n /** Logs emitted during execution */\n logs?: any[]\n\n /** Revert reason, if unsuccessful */\n reason?: string\n}\n\n// ============================================================================\n// Function\n// ============================================================================\n\n/**\n * Get UserOperation receipt by hash\n *\n * Automatically uses active chain from UI unless chainId is specified.\n * Returns null if UserOp is still pending or not found.\n *\n * @param userOpHash - UserOperation hash returned from sendUserOperation\n * @param chainId - Optional chain ID (defaults to active chain)\n * @returns Receipt if found and mined, null if pending or not found\n * @throws {Error} If chain has no bundlerUrl configured\n *\n * @example\n * ```typescript\n * const hash = await sendUserOperation(session, { ... })\n * const receipt = await getUserOperationReceipt(hash)\n * if (receipt?.success) {\n * console.log('Gas used:', receipt.actualGasUsed)\n * }\n * ```\n */\nexport async function getUserOperationReceipt(\n userOpHash: Hash | string,\n chainId?: number\n): Promise<UserOperationReceipt | null> {\n const targetChainId = chainId ?? requireActiveChainId()\n const chainConfig = getChainConfig(targetChainId)\n\n if (!chainConfig) {\n throw new Error(`Chain ${targetChainId} is not supported`)\n }\n\n if (!chainConfig.bundlerUrl) {\n throw new Error(`Chain ${targetChainId} has no bundlerUrl configured`)\n }\n\n if (!userOpHash) {\n throw new Error(\"Operation hash is required\")\n }\n\n try {\n const result = await bundlerRpc('eth_getUserOperationReceipt', [userOpHash], chainConfig.bundlerUrl)\n\n if (!result) {\n return null\n }\n console.log('[getUserOperationReceipt] Receipt:', JSON.stringify(result, null, 2))\n\n return {\n userOpHash: result.userOpHash,\n entryPoint: result.entryPoint,\n sender: result.sender,\n nonce: result.nonce,\n success: result.success,\n actualGasCost: result.actualGasCost,\n actualGasUsed: result.actualGasUsed,\n paymaster: result.paymaster,\n receipt: result.receipt,\n logs: result.logs,\n reason: result.reason\n }\n } catch (error) {\n console.warn('[getUserOperationReceipt] Failed to get receipt:', error)\n return null\n }\n}","/**\n * Get UserOperation data by hash\n */\n\nimport type { Hash } from 'viem'\nimport { bundlerRpc } from '@embarkai/core'\nimport { getChainConfig } from '@embarkai/core/read'\nimport { requireActiveChainId } from '../../context/LumiaPassportSessionContext'\n\n/**\n * UserOperation data from bundler response\n */\nexport interface UserOperationByHash {\n /** EntryPoint address */\n entryPoint: `0x${string}`\n\n /** User operation details */\n userOperation: {\n sender: `0x${string}`\n nonce: `0x${string}`\n callData: `0x${string}`\n callGasLimit: `0x${string}`\n verificationGasLimit: `0x${string}`\n preVerificationGas: `0x${string}`\n maxPriorityFeePerGas: `0x${string}`\n maxFeePerGas: `0x${string}`\n paymaster?: `0x${string}`\n paymasterVerificationGasLimit?: `0x${string}`\n paymasterPostOpGasLimit?: `0x${string}`\n paymasterData?: `0x${string}`\n signature: `0x${string}`\n }\n\n /** Transaction hash (null if not yet included in block) */\n transactionHash: `0x${string}` | null\n\n /** Block number (null if not yet included in block) */\n blockNumber: `0x${string}` | null\n\n /** Block hash (null if not yet included in block) */\n blockHash: `0x${string}` | null\n}\n\n/**\n * Get UserOperation data by hash\n *\n * Automatically uses active chain from UI unless chainId is specified.\n * Returns null if UserOp is not found.\n *\n * @param userOpHash - UserOperation hash returned from sendUserOperation\n * @param chainId - Optional chain ID (defaults to active chain)\n * @returns UserOperation data if found, null if not found\n * @throws {Error} If chain has no bundlerUrl configured\n *\n * @example\n * ```typescript\n * const hash = await sendUserOperation(session, { ... })\n * const userOp = await getUserOperationByHash(hash)\n * ```\n */\nexport async function getUserOperationByHash(\n userOpHash: Hash | string,\n chainId?: number\n): Promise<UserOperationByHash | null> {\n const targetChainId = chainId ?? requireActiveChainId()\n const chainConfig = getChainConfig(targetChainId)\n\n if (!chainConfig) {\n throw new Error(`Chain ${targetChainId} is not supported`)\n }\n\n if (!chainConfig.bundlerUrl) {\n throw new Error(`Chain ${targetChainId} has no bundlerUrl configured`)\n }\n\n if (!userOpHash) {\n throw new Error(\"Operation hash is required\")\n }\n\n try {\n const result = await bundlerRpc('eth_getUserOperationByHash', [userOpHash], chainConfig.bundlerUrl)\n\n if (!result) {\n return null\n }\n\n console.log('[getUserOperationByHash] Receipt:', JSON.stringify(result, null, 2))\n\n return {\n entryPoint: result.entryPoint,\n userOperation: result.userOperation,\n transactionHash: result.transactionHash,\n blockNumber: result.blockNumber,\n blockHash: result.blockHash\n }\n } catch (error) {\n console.warn('[getUserOperationByHash] Failed to get user operation:', error)\n return null\n }\n}","import { Copy, ExternalLink } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Button } from './ui/button'\n\ntype ChainLike = {\n id: number\n blockExplorers?: { default?: { url: string } }\n}\n\nexport type AddressProps = {\n address?: `0x${string}` | string | null\n chain?: ChainLike\n className?: string\n truncate?: boolean\n showCopy?: boolean\n showExplorer?: boolean\n label?: string\n}\n\nfunction toExplorerAddressUrl(address: string, chain?: ChainLike): string | null {\n const base = chain?.blockExplorers?.default?.url\n if (!base) return null\n return `${base.replace(/\\/$/, '')}/address/${address}`\n}\n\nfunction short(addr: string): string {\n if (addr.length <= 14) return addr\n return `${addr.slice(0, 10)}...${addr.slice(-8)}`\n}\n\nexport const Address: React.FC<AddressProps> = ({\n address,\n chain,\n className,\n truncate = true,\n showCopy = true,\n showExplorer = true,\n label\n}) => {\n const addr = address || ''\n const explorer = toExplorerAddressUrl(addr, chain || undefined)\n const [copied, setCopied] = React.useState(false)\n\n if (!addr) return <span className={cn('text-muted-foreground', className)}>—</span>\n\n return (\n <div className={cn('flex items-center gap-2', className)} style={{ listStyle: 'none' }}>\n {label && <span className=\"text-sm font-medium\">{label}</span>}\n <code className=\"text-xs bg-background px-2 py-1 rounded select-all\">{truncate ? short(addr) : addr}</code>\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"small\"\n title={copied ? 'Copied' : 'Copy address'}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(addr)\n setCopied(true)\n setTimeout(() => setCopied(false), 1200)\n } catch {}\n }}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n )}\n {showExplorer && explorer && (\n <a\n href={explorer}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n )\n}\n","import { AlertCircle, CheckCircle2, Clock, Copy, ExternalLink, RefreshCw } from 'lucide-react'\nimport * as React from 'react'\n\nimport { getUserOperationReceipt } from '../../clients/bundler/getUserOperationReceipt'\nimport { getUserOperationByHash } from '../../clients/bundler/getUserOperationByHash'\nimport { cn } from '../utils/cn'\nimport { Address } from './Address'\nimport { Badge } from './ui/badge'\nimport { Button } from './ui/button'\n\ntype ChainLike = {\n id: number\n blockExplorers?: { default?: { url: string } }\n}\n\nexport type UserOpStatusProps = {\n userOpHash: `0x${string}` | string\n chain?: ChainLike\n chainId?: number\n className?: string\n pollMs?: number\n maxPollTimeMs?: number // Maximum time to poll before giving up\n // Optional: provide external state to avoid duplicate polling\n externalState?: {\n receipt?: any | null\n mempool?: any | null\n error?: string | null\n isPolling?: boolean\n }\n}\n\nexport const UserOpStatus: React.FC<UserOpStatusProps> = ({\n userOpHash,\n chain,\n chainId,\n className,\n pollMs = 1000,\n maxPollTimeMs = 60000, // Default 1 minute\n externalState\n}) => {\n // If external state is provided, use it instead of internal polling\n const useExternalState = !!externalState\n\n const [internalReceipt, setInternalReceipt] = React.useState<any | null>(null)\n const [internalMempool, setInternalMempool] = React.useState<any | null>(null)\n const [internalError, setInternalError] = React.useState<string | null>(null)\n const [attempt, setAttempt] = React.useState<number>(0)\n const [internalRefreshing, setInternalRefreshing] = React.useState<boolean>(false)\n const [timedOut, setTimedOut] = React.useState<boolean>(false)\n const [rejected, setRejected] = React.useState<boolean>(false)\n const intervalRef = React.useRef<NodeJS.Timeout | null>(null)\n const startTimeRef = React.useRef<number>(Date.now())\n\n // Use external state if provided, otherwise use internal state\n const receipt = useExternalState ? (externalState.receipt ?? null) : internalReceipt\n const mempool = useExternalState ? (externalState.mempool ?? null) : internalMempool\n const error = useExternalState ? (externalState.error ?? null) : internalError\n const refreshing = useExternalState ? (externalState.isPolling ?? false) : internalRefreshing\n\n const tick = React.useCallback(async () => {\n // Don't poll if using external state\n if (useExternalState) return\n\n // Check if we've exceeded the maximum polling time\n const elapsed = Date.now() - startTimeRef.current\n if (elapsed > maxPollTimeMs) {\n setTimedOut(true)\n setInternalMempool(null)\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n return\n }\n\n try {\n setInternalRefreshing(true)\n setInternalError(null)\n const r = await getUserOperationReceipt(userOpHash, chainId)\n if (r) {\n setInternalReceipt(r)\n setInternalMempool(null)\n // Clear interval when we get receipt\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n return\n }\n const m = await getUserOperationByHash(userOpHash, chainId)\n if (m === null) {\n // null result means UserOperation was dropped from mempool - terminal state\n setRejected(true)\n setInternalMempool(null)\n // Clear interval when UserOp is rejected\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n return\n }\n setInternalMempool(m ? { entryPoint: m.entryPoint, sender: m.userOperation?.sender } : null)\n } catch (e: any) {\n setInternalError(e?.message || String(e))\n } finally {\n setInternalRefreshing(false)\n setAttempt((x) => x + 1)\n }\n }, [userOpHash, chainId, maxPollTimeMs, useExternalState])\n\n // Initialize state when hash changes (skip if using external state)\n React.useEffect(() => {\n if (useExternalState) return\n\n console.log('[UserOpStatus] Initializing polling for UserOp hash:', userOpHash)\n startTimeRef.current = Date.now()\n setTimedOut(false)\n setRejected(false)\n setInternalReceipt(null)\n setInternalMempool(null)\n setInternalError(null)\n setAttempt(0)\n setInternalRefreshing(false)\n }, [userOpHash, useExternalState])\n\n // Start polling effect (skip if using external state)\n React.useEffect(() => {\n if (useExternalState) {\n console.log('[UserOpStatus] Using external state, skipping internal polling')\n return\n }\n\n if (receipt) {\n console.log('[UserOpStatus] Already have receipt, not starting polling')\n return\n }\n\n let mounted = true\n\n const startPolling = async () => {\n if (mounted) {\n console.log('[UserOpStatus] Starting polling for hash:', userOpHash, 'pollMs:', pollMs)\n await tick()\n\n // Start interval only if still mounted and no receipt\n if (mounted && !receipt) {\n console.log('[UserOpStatus] Starting interval polling every', pollMs, 'ms')\n intervalRef.current = setInterval(() => {\n if (mounted) tick()\n }, pollMs)\n }\n }\n }\n\n startPolling()\n\n return () => {\n mounted = false\n if (intervalRef.current) {\n console.log('[UserOpStatus] Clearing interval in cleanup')\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }\n }, [userOpHash, pollMs, useExternalState])\n\n const stateBadge = () => {\n if (receipt) {\n const ok = !!receipt.success\n return (\n <Badge variant={ok ? 'success' : 'destructive'}>\n {ok ? <CheckCircle2 className=\"h-3 w-3\" /> : <AlertCircle className=\"h-3 w-3\" />}\n {ok ? 'Included' : 'Failed'}\n </Badge>\n )\n }\n if (rejected) {\n return (\n <Badge variant=\"destructive\">\n <AlertCircle className=\"h-3 w-3\" /> Rejected by bundler\n </Badge>\n )\n }\n if (timedOut) {\n return (\n <Badge variant=\"warning\">\n <AlertCircle className=\"h-3 w-3\" /> Timeout - may be rejected\n </Badge>\n )\n }\n if (mempool) {\n return (\n <Badge variant=\"outline\">\n <Clock className=\"h-3 w-3\" /> Pending in bundler\n </Badge>\n )\n }\n return (\n <Badge variant=\"secondary\">\n <Clock className=\"h-3 w-3\" /> Waiting\n </Badge>\n )\n }\n\n return (\n <div\n className={cn(\n 'lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]',\n className\n )}\n style={{ textAlign: 'left', listStyle: 'none' }}\n >\n {/* Header with Badge and Refresh button */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {stateBadge()}\n <span className=\"text-xs text-muted-foreground\">\n This is a UserOperation hash (EIP-4337), not a L2 tx hash.\n </span>\n </div>\n <Button variant=\"ghost\" size=\"small\" onClick={() => tick()} disabled={refreshing} className=\"h-8\">\n <RefreshCw className={cn('h-3.5 w-3.5 mr-1', refreshing && 'animate-spin')} />\n <span className=\"text-xs\">Refresh</span>\n </Button>\n </div>\n\n {/* UserOp Hash Row */}\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-medium min-w-16 shrink-0\">UO Hash</span>\n <code className=\"text-xs font-mono flex-1 select-all\">{userOpHash}</code>\n <Button\n variant=\"ghost\"\n size=\"small\"\n className=\"h-8 w-8 p-0\"\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(userOpHash)\n } catch {}\n }}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n\n {/* Tx Hash Row (only when receipt exists) */}\n {receipt && receipt.receipt?.transactionHash && (\n <div className=\"flex items-center gap-2 mb-3\">\n <span className=\"text-sm font-medium min-w-16 shrink-0\">Tx Hash</span>\n <code className=\"text-xs font-mono flex-1 select-all\">{receipt.receipt.transactionHash}</code>\n <Button\n variant=\"ghost\"\n size=\"small\"\n className=\"h-8 w-8 p-0\"\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(receipt.receipt.transactionHash)\n } catch {}\n }}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n {chain?.blockExplorers?.default?.url && (\n <a\n href={`${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n )}\n\n {/* Block info (only when receipt exists) */}\n {receipt && (\n <div className=\"text-xs text-muted-foreground mb-3\">\n Block {parseInt(receipt.receipt?.blockNumber || '0x0', 16)} • Gas Used{' '}\n {parseInt(receipt.actualGasUsed || '0x0', 16)} • Success {String(!!receipt.success)}\n </div>\n )}\n\n {/* Bundler info */}\n <div className=\"text-xs text-muted-foreground\">\n {/* Bundler: {getBundlerUrl()} */}\n {!receipt && !timedOut && !rejected && (\n <span className=\"ml-2\">• Polling for {Math.round((Date.now() - startTimeRef.current) / 1000)}s</span>\n )}\n </div>\n\n {/* Mempool info */}\n {mempool && (\n <div className=\"text-sm text-muted-foreground mt-2\" style={{ listStyle: 'none' }}>\n <div>\n Seen by bundler at <Address address={mempool.entryPoint} chain={chain} showExplorer truncate={false} />\n </div>\n <div>\n sender <Address address={mempool.sender} chain={chain} truncate={false} />\n </div>\n </div>\n )}\n\n {/* Error messages */}\n {error && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" /> {error}\n </div>\n )}\n {rejected && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" />\n UserOperation was dropped from bundler mempool. This usually means it was invalid or replaced.\n </div>\n )}\n {timedOut && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" />\n Stopped polling after {Math.round(maxPollTimeMs / 1000)}s. UserOperation may have been rejected by the\n bundler.\n </div>\n )}\n </div>\n )\n}\n","import { Copy, ExternalLink } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Button } from './ui/button'\n\ntype ChainLike = {\n id: number\n blockExplorers?: { default?: { url: string } }\n}\n\nexport type HashProps = {\n hash?: `0x${string}` | string | null\n chain?: ChainLike\n className?: string\n truncate?: boolean\n showCopy?: boolean\n showExplorer?: boolean\n kind?: 'tx' | 'address' | 'block'\n label?: string\n}\n\nfunction toExplorerUrl(kind: 'tx' | 'address' | 'block', value: string, chain?: ChainLike): string | null {\n const base = chain?.blockExplorers?.default?.url\n if (!base) return null\n const path = kind === 'tx' ? 'tx' : kind === 'address' ? 'address' : 'block'\n return `${base.replace(/\\/$/, '')}/${path}/${value}`\n}\n\nfunction short(value: string): string {\n if (value.length <= 18) return value\n return `${value.slice(0, 10)}...${value.slice(-8)}`\n}\n\nexport const Hash: React.FC<HashProps> = ({\n hash,\n chain,\n className,\n truncate = true,\n showCopy = true,\n showExplorer = true,\n kind = 'tx',\n label\n}) => {\n const value = hash || ''\n const explorer = toExplorerUrl(kind, value, chain || undefined)\n const [copied, setCopied] = React.useState(false)\n\n if (!value) return <span className={cn('text-muted-foreground', className)}>—</span>\n\n return (\n <div className={cn('flex items-center gap-2', className)}>\n {label && <span className=\"text-sm font-medium\">{label}</span>}\n <code className=\"text-xs bg-background px-2 py-1 rounded break-all\">{truncate ? short(value) : value}</code>\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"small\"\n title={copied ? 'Copied' : 'Copy'}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(value)\n setCopied(true)\n setTimeout(() => setCopied(false), 1200)\n } catch {}\n }}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n )}\n {showExplorer && explorer && (\n <a\n href={explorer}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\n\nimport { getExplorerUrl } from '../../clients/base'\n\ninterface TransactionFrom {\n hash: string\n is_contract: boolean\n name: string | null\n}\n\ninterface TransactionTo {\n hash: string\n is_contract: boolean\n name: string | null\n}\n\ninterface Transaction {\n hash: string\n value: string\n from: TransactionFrom\n to: TransactionTo\n status: string\n timestamp: string\n gas_used: string\n fee: {\n value: string\n }\n method: string | null\n transaction_types: string[]\n}\n\ninterface TransactionsResponse {\n items: Transaction[]\n next_page_params: any\n}\n\ninterface TransactionsListProps {\n address: string\n itemsCount?: number\n}\n\nexport const TransactionsList: React.FC<TransactionsListProps> = ({ address, itemsCount = 10 }) => {\n const [transactions, setTransactions] = useState<Transaction[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n const fetchTransactions = async () => {\n try {\n setLoading(true)\n setError(null)\n\n const explorerUrl = getExplorerUrl()\n const baseUrl = explorerUrl.replace(/\\/$/, '')\n const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=${itemsCount}`\n\n console.log('[TransactionsList] Fetching from:', apiUrl)\n\n const response = await fetch(apiUrl)\n if (!response.ok) {\n throw new Error(`Failed to fetch transactions: ${response.status}`)\n }\n\n const data: TransactionsResponse = await response.json()\n setTransactions(data.items || [])\n } catch (err) {\n console.error('[TransactionsList] Error:', err)\n setError(err instanceof Error ? err.message : 'Unknown error')\n } finally {\n setLoading(false)\n }\n }\n\n if (address) {\n fetchTransactions()\n }\n }, [address, itemsCount])\n\n const formatValue = (value: string) => {\n try {\n const wei = BigInt(value)\n const eth = Number(wei) / 1e18\n return eth.toFixed(4)\n } catch {\n return '0.0000'\n }\n }\n\n const formatAddress = (addr: string) => {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`\n }\n\n const formatDate = (timestamp: string) => {\n return new Date(timestamp).toLocaleString()\n }\n\n const openTransaction = (txHash: string) => {\n const explorerUrl = getExplorerUrl()\n window.open(`${explorerUrl}/tx/${txHash}`, '_blank')\n }\n\n if (loading) {\n return (\n <div className=\"p-4 text-center\">\n <div className=\"animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full\" />\n <p className=\"mt-2 text-sm text-gray-600\">Loading transactions...</p>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-red-600 text-sm\">{error}</p>\n <button onClick={() => window.location.reload()} className=\"mt-2 text-blue-600 text-sm hover:underline\">\n Retry\n </button>\n </div>\n )\n }\n\n if (transactions.length === 0) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-gray-600 text-sm\">No transactions found</p>\n </div>\n )\n }\n\n return (\n <div className=\"max-h-96 overflow-y-auto\">\n <div className=\"space-y-2 p-2\">\n {transactions.map((tx) => (\n <div\n key={tx.hash}\n className=\"border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors\"\n onClick={() => openTransaction(tx.hash)}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-xs font-mono bg-gray-100 px-2 py-1 rounded\">{formatAddress(tx.hash)}</span>\n <span\n className={`text-xs px-2 py-1 rounded ${\n tx.status === 'ok' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\n }`}\n >\n {tx.status === 'ok' ? 'Success' : 'Failed'}\n </span>\n </div>\n\n <div className=\"text-sm space-y-1\">\n <div>\n <span className=\"text-gray-600\">From:</span>\n <span className=\"font-mono ml-1\">\n {formatAddress(tx.from.hash)}\n {tx.from.is_contract && <span className=\"text-xs text-blue-600 ml-1\">(Contract)</span>}\n </span>\n </div>\n\n <div>\n <span className=\"text-gray-600\">To:</span>\n <span className=\"font-mono ml-1\">\n {formatAddress(tx.to.hash)}\n {tx.to.is_contract && <span className=\"text-xs text-blue-600 ml-1\">(Contract)</span>}\n </span>\n </div>\n\n <div>\n <span className=\"text-gray-600\">Value:</span>\n <span className=\"font-semibold ml-1\">{formatValue(tx.value)} LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-right text-xs text-gray-500\">\n <div>{formatDate(tx.timestamp)}</div>\n <div className=\"mt-1\">Gas: {parseInt(tx.gas_used).toLocaleString()}</div>\n {tx.method && <div className=\"mt-1 text-blue-600\">{tx.method}</div>}\n </div>\n </div>\n\n {tx.transaction_types.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {tx.transaction_types.map((type, idx) => (\n <span key={idx} className=\"text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full\">\n {type.replace('_', ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import { getUserOperationByHash, getUserOperationReceipt, UserOperationReceipt } from '@/src'\nimport * as React from 'react';\n\n\n\nimport { getBundlerUrl } from '../internal/clients/base';\n\n\nexport interface UserOpMempool {\n entryPoint: `0x${string}` | null;\n sender: `0x${string}` | null;\n}\n\nexport type UserOpState =\n | 'waiting' // Initial state, not yet seen by bundler\n | 'pending' // Seen in bundler mempool\n | 'included' // Successfully included in block\n | 'failed' // Failed execution\n | 'rejected' // Dropped from bundler mempool\n | 'timeout'; // Polling timeout\n\nexport interface UseUserOpStatusOptions {\n userOpHash?: `0x${string}` | string | null;\n pollMs?: number;\n maxPollTimeMs?: number;\n enabled?: boolean;\n onStateChange?: (state: UserOpState) => void;\n onReceipt?: (receipt: UserOperationReceipt) => void;\n onTxHash?: (txHash: `0x${string}`) => void;\n}\n\nexport interface UseUserOpStatusReturn {\n state: UserOpState;\n receipt: UserOperationReceipt | null;\n mempool: UserOpMempool | null;\n txHash: `0x${string}` | null;\n error: string | null;\n isPolling: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useUserOpStatus(options: UseUserOpStatusOptions = {}): UseUserOpStatusReturn {\n const {\n userOpHash,\n pollMs = 1000,\n maxPollTimeMs = 60000,\n enabled = true,\n onStateChange,\n onReceipt,\n onTxHash,\n } = options;\n\n const [state, setState] = React.useState<UserOpState>('waiting');\n const [receipt, setReceipt] = React.useState<UserOperationReceipt | null>(null);\n const [mempool, setMempool] = React.useState<UserOpMempool | null>(null);\n const [txHash, setTxHash] = React.useState<`0x${string}` | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isPolling, setIsPolling] = React.useState(false);\n\n const intervalRef = React.useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = React.useRef<number>(Date.now());\n const prevStateRef = React.useRef<UserOpState>('waiting');\n\n const extractMempoolInfo = React.useCallback((m: any): UserOpMempool | null => {\n if (!m) return null;\n const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;\n const sender = m.sender || m?.userOperation?.sender || null;\n if (!entryPoint && !sender) return null;\n return { entryPoint, sender };\n }, []);\n\n const updateState = React.useCallback((newState: UserOpState) => {\n setState(newState);\n if (prevStateRef.current !== newState) {\n prevStateRef.current = newState;\n onStateChange?.(newState);\n }\n }, [onStateChange]);\n\n const tick = React.useCallback(async () => {\n if (!userOpHash || !enabled) return;\n\n // Don't poll if we already have a receipt\n if (receipt) {\n console.log('[useUserOpStatus] Already have receipt, skipping tick');\n return;\n }\n\n const elapsed = Date.now() - startTimeRef.current;\n if (elapsed > maxPollTimeMs) {\n updateState('timeout');\n setMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n try {\n setIsPolling(true);\n setError(null);\n\n // Check for receipt first\n const r = await getUserOperationReceipt(userOpHash)\n if (r) {\n const newState = r.success ? 'included' : 'failed';\n console.log('[useUserOpStatus] Got receipt, updating state to:', newState);\n\n setReceipt(r);\n setMempool(null);\n const newTxHash = r.receipt?.transactionHash;\n if (newTxHash && newTxHash !== txHash) {\n setTxHash(newTxHash);\n onTxHash?.(newTxHash);\n }\n updateState(newState);\n onReceipt?.(r);\n\n // Clear interval when we get receipt\n if (intervalRef.current) {\n console.log('[useUserOpStatus] Clearing interval after receipt');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n // Check mempool only if we don't have receipt yet\n const m = await getUserOperationByHash(userOpHash);\n if (m === null) {\n // null result means UserOperation was dropped from mempool\n updateState('rejected');\n setMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n const info = extractMempoolInfo(m);\n setMempool(info);\n // Only update state to pending/waiting if we don't already have a terminal state\n if (!receipt) {\n updateState(info ? 'pending' : 'waiting');\n }\n } catch (e: any) {\n setError(e?.message || String(e));\n } finally {\n setIsPolling(false);\n }\n }, [\n userOpHash,\n enabled,\n receipt,\n maxPollTimeMs,\n extractMempoolInfo,\n updateState,\n onTxHash,\n onReceipt,\n ]);\n\n // Initialize state when hash changes\n React.useEffect(() => {\n if (!userOpHash || !enabled) return;\n\n console.log('[useUserOpStatus] Initializing for UserOp hash:', userOpHash);\n startTimeRef.current = Date.now();\n setState('waiting');\n prevStateRef.current = 'waiting';\n setReceipt(null);\n setMempool(null);\n setTxHash(null);\n setError(null);\n setIsPolling(false);\n }, [userOpHash, enabled]);\n\n // Start polling effect\n React.useEffect(() => {\n if (!userOpHash || !enabled) {\n console.log('[useUserOpStatus] Not starting polling - no hash or disabled');\n return;\n }\n\n if (receipt) {\n console.log('[useUserOpStatus] Not starting polling - already have receipt');\n return;\n }\n\n let mounted = true;\n\n const startPolling = async () => {\n if (mounted) {\n console.log('[useUserOpStatus] Starting polling for hash:', userOpHash);\n await tick();\n\n // Start interval only if still mounted and no receipt\n if (mounted && !receipt) {\n console.log('[useUserOpStatus] Creating interval with pollMs:', pollMs);\n intervalRef.current = setInterval(() => {\n if (mounted) {\n console.log('[useUserOpStatus] Interval tick');\n tick();\n }\n }, pollMs);\n }\n }\n };\n\n startPolling();\n\n return () => {\n console.log('[useUserOpStatus] Cleaning up polling effect');\n mounted = false;\n if (intervalRef.current) {\n console.log('[useUserOpStatus] Clearing interval in cleanup');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [userOpHash, enabled, pollMs]);\n\n const refresh = React.useCallback(async () => {\n await tick();\n }, [tick]);\n\n return {\n state,\n receipt,\n mempool,\n txHash,\n error,\n isPolling,\n refresh,\n };\n}\n","import { logout as coreLogout, jwtTokenManager } from '@embarkai/core/auth'\nimport { useCallback } from 'react'\n\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext'\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext'\n\nexport interface UseLogoutReturn {\n logout: () => Promise<void>\n}\n\n/**\n * Hook for logging out and disconnecting from Lumia Passport\n * Clears session, tokens, and notifies callbacks\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { logout } = useLogout();\n *\n * return (\n * <button onClick={logout}>\n * Disconnect\n * </button>\n * );\n * }\n * ```\n */\nexport function useLogout(): UseLogoutReturn {\n const { setSession, setIsLoading, setAddress, setStatus, setError, address } = useLumiaPassportSession()\n const { callbacks } = useLumiaPassportConfig()\n\n const logout = useCallback(async () => {\n const prevAddress = address\n let userId: string | null = null\n setIsLoading(true)\n\n try {\n userId = jwtTokenManager.getUserId() || null\n } catch (error) {\n console.warn('[useLogout] Could not get userId:', error)\n }\n\n // Call logout to clear tokens and notify backend\n try {\n await coreLogout()\n } catch (error) {\n console.warn('[useLogout] Core logout failed:', error)\n }\n\n // Clear session state\n setSession(null)\n setAddress(null)\n setStatus('idle')\n setError(null)\n setIsLoading(false)\n\n // Notify callbacks\n try {\n callbacks?.onLumiaPassportDisconnect?.({\n address: prevAddress as any,\n userId\n })\n } catch (error) {\n console.warn('[useLogout] Callback error:', error)\n }\n }, [address, setAddress, setError, setSession, setStatus, callbacks])\n\n return { logout }\n}\n","/**\n * Wait for UserOperation receipt with polling\n */\n\nimport type { Hash } from 'viem'\nimport { requireActiveChainId } from '../../context/LumiaPassportSessionContext'\nimport { getUserOperationReceipt, type UserOperationReceipt } from './getUserOperationReceipt'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for waiting for UserOperation receipt\n */\nexport interface WaitForReceiptOptions {\n /**\n * Polling interval in milliseconds\n * @default 1000 (1 second)\n */\n pollIntervalMs?: number\n\n /**\n * Maximum wait time in milliseconds\n * @default 60000 (60 seconds)\n */\n maxPollTimeMs?: number\n\n /**\n * Chain ID (optional)\n * If not provided, uses activeChainId from UI state.\n */\n chainId?: number\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Thrown when waitForUserOperationReceipt exceeds maxPollTimeMs\n */\nexport class UserOperationTimeoutError extends Error {\n userOpHash: Hash\n chainId: number\n timeoutMs: number\n\n constructor(userOpHash: Hash, chainId: number, timeoutMs: number) {\n super(\n `Timeout waiting for UserOperation receipt after ${timeoutMs}ms (hash: ${userOpHash}, chainId: ${chainId})`\n )\n this.name = 'UserOperationTimeoutError'\n this.userOpHash = userOpHash\n this.chainId = chainId\n this.timeoutMs = timeoutMs\n }\n}\n\n// ============================================================================\n// Function\n// ============================================================================\n\n/**\n * Wait for UserOperation receipt with automatic polling\n *\n * Polls bundler until receipt is available or timeout is reached.\n * Automatically uses active chain from UI unless chainId is specified in options.\n *\n * @param userOpHash - UserOperation hash returned from sendUserOperation\n * @param options - Polling configuration and optional chainId\n * @returns Receipt once UserOp is mined\n * @throws {UserOperationTimeoutError} If timeout is exceeded before receipt is available\n * @throws {Error} If chain has no bundlerUrl configured\n *\n * @example\n * ```typescript\n * const hash = await sendUserOperation(session, { to, value, data })\n * const receipt = await waitForUserOperationReceipt(hash)\n * if (receipt.success) {\n * console.log('TxHash:', receipt.receipt.transactionHash)\n * }\n * ```\n */\nexport async function waitForUserOperationReceipt(\n userOpHash: Hash,\n options?: WaitForReceiptOptions\n): Promise<UserOperationReceipt> {\n const pollIntervalMs = options?.pollIntervalMs ?? 1000\n const maxPollTimeMs = options?.maxPollTimeMs ?? 60000\n const targetChainId = options?.chainId ?? requireActiveChainId()\n\n const startTime = Date.now()\n\n while (true) {\n const elapsed = Date.now() - startTime\n if (elapsed >= maxPollTimeMs) {\n throw new UserOperationTimeoutError(userOpHash, targetChainId, maxPollTimeMs)\n }\n\n const receipt = await getUserOperationReceipt(userOpHash, targetChainId)\n if (receipt) {\n return receipt\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs))\n }\n}","/**\n * Bundler client functions\n *\n * High-level wrappers for querying UserOperation data from the bundler.\n * All functions automatically use activeChainId from Zustand store unless overridden.\n */\n\nexport { getUserOperationByHash, type UserOperationByHash } from './getUserOperationByHash'\nexport { getUserOperationReceipt, type UserOperationReceipt } from './getUserOperationReceipt'\nexport {\n waitForUserOperationReceipt,\n type WaitForReceiptOptions,\n UserOperationTimeoutError\n} from './waitForUserOperationReceipt'","/**\n * Public client API exports\n */\n\nexport {\n getUserOperationByHash,\n getUserOperationReceipt,\n waitForUserOperationReceipt,\n UserOperationTimeoutError,\n type UserOperationByHash,\n type UserOperationReceipt,\n type WaitForReceiptOptions\n} from './bundler'","import { requireActiveChainId } from '@/src/context/LumiaPassportSessionContext';\nimport { getViemChain } from '@embarkai/core/read';\nimport { Hash, parseEther, TransactionReceipt } from 'viem';\nimport { useAccount, usePublicClient, useWalletClient } from 'wagmi'\n\n\nexport interface Transaction {\n hash: Hash;\n from: string;\n to: string | null;\n value: string;\n gasUsed: string;\n gasPrice: string;\n blockNumber: bigint;\n timestamp: number;\n status: 'success' | 'failed' | 'pending';\n}\n\nexport interface SendTransactionParams {\n to: `0x${string}`;\n value: string; // in ETH\n data?: `0x${string}`;\n}\n\nexport interface SendTransactionResult {\n hash: Hash;\n wait: () => Promise<TransactionReceipt>;\n}\n\nexport function useTransactions() {\n const chainId = requireActiveChainId()\n const viemChain = getViemChain(chainId)\n const publicClient = usePublicClient({ chainId });\n const { data: walletClient } = useWalletClient();\n const { address } = useAccount();\n\n const sendTransaction = async (params: SendTransactionParams): Promise<SendTransactionResult> => {\n if (!walletClient) {\n throw new Error('Wallet not connected');\n }\n\n const txParams: any = {\n to: params.to,\n value: parseEther(params.value),\n data: params.data,\n chain: viemChain,\n };\n // Viem 2.x types require `kzg` for blob-supporting chains; our chain doesn't use blobs.\n // Cast to any to keep DTS stable across viem versions while preserving runtime behavior.\n const hash = await (walletClient as any).sendTransaction(txParams);\n\n return {\n hash,\n wait: async () => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.waitForTransactionReceipt({ hash });\n },\n };\n };\n\n const getTransaction = async (hash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.getTransaction({ hash });\n };\n\n const getTransactionReceipt = async (hash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.getTransactionReceipt({ hash });\n };\n\n const getTransactionHistory = async (address: `0x${string}`, limit: number = 10): Promise<Transaction[]> => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // For smart accounts, we'll use a simplified approach\n // In production, you would typically use an indexer service or event logs\n\n // Option 1: Return empty for now to avoid excessive RPC calls\n // In a real implementation, you would:\n // 1. Use an indexer like The Graph or Etherscan API\n // 2. Filter UserOperationEvent events from the EntryPoint contract\n // 3. Or maintain a backend service that tracks transactions\n\n console.log('[Transactions] Fetching history for smart account:', address);\n\n // For demo purposes, return empty array to prevent RPC spam\n // Real implementation would query indexed data\n return [];\n\n // Alternative: Query only recent blocks (last 10) for demo\n // Uncomment if you want minimal transaction checking:\n /*\n const latestBlock = await publicClient.getBlockNumber();\n const transactions: Transaction[] = [];\n const blocksToCheck = 10; // Only check last 10 blocks\n\n for (let i = 0; i < blocksToCheck; i++) {\n const blockNumber = latestBlock - BigInt(i);\n try {\n const block = await publicClient.getBlock({\n blockNumber,\n includeTransactions: false, // Don't fetch full transactions\n });\n\n // In production, you'd query events here instead\n } catch {\n continue;\n }\n }\n\n return transactions;\n */\n } catch (error) {\n console.error('Failed to fetch transaction history:', error);\n return [];\n }\n };\n\n return {\n sendTransaction,\n getTransaction,\n getTransactionReceipt,\n getTransactionHistory,\n address,\n isConnected: !!address && !!walletClient,\n };\n}\n","import React from 'react';\nimport { useBalance, useReadContract, useReadContracts } from 'wagmi';\nimport { formatEther, formatUnits, erc20Abi } from 'viem';\nimport { requireActiveChainId } from '@/src/context/LumiaPassportSessionContext'\n\nexport interface TokenBalance {\n address: `0x${string}`;\n name: string;\n symbol: string;\n decimals: number;\n balance: string;\n formattedBalance: string;\n logo?: string;\n}\n\n/**\n * Asset type classification\n */\nexport type AssetType = 'native' | 'erc20' | 'erc721' | 'erc1155' | 'erc3643';\n\n/**\n * NFT metadata from token instance\n */\nexport interface NFTMetadata {\n /** NFT name from metadata */\n name?: string;\n /** NFT description */\n description?: string;\n /** Image URL (resolved from IPFS if needed) */\n image?: string;\n /** External URL for more info */\n externalUrl?: string;\n /** Collection name */\n collectionName?: string;\n /** Additional attributes */\n attributes?: Array<{ trait_type: string; value: string | number }>;\n}\n\n/**\n * Compliance status for security tokens (ERC3643)\n */\nexport interface ComplianceStatus {\n /** Whether the token is a security token (ERC3643) */\n isSecurityToken: boolean;\n /** Identity registry address */\n identityRegistry?: `0x${string}`;\n /** Whether current user is verified */\n isVerified?: boolean;\n /** Transfer restrictions message */\n transferRestrictions?: string;\n}\n\n/**\n * Error state for asset list\n */\nexport interface AssetListError {\n /** Error type for categorization */\n type: 'network' | 'api' | 'timeout' | 'unknown';\n /** Human-readable error message */\n message: string;\n /** Whether the request can be retried */\n retryable: boolean;\n}\n\n/**\n * Represents a token or NFT asset\n */\nexport interface Asset {\n /** Asset type classification */\n type: AssetType;\n /** Contract address (undefined for native token) */\n address?: `0x${string}`;\n /** Human-readable token name */\n name: string;\n /** Token symbol (e.g., \"LUMIA\", \"USDC\") */\n symbol: string;\n /** Raw balance as string (wei for fungible, count for NFT) */\n balance: string;\n /** Human-readable formatted balance */\n formattedBalance: string;\n /** Decimal precision (undefined for NFTs) */\n decimals?: number;\n /** NFT token ID (only for ERC721/ERC1155) */\n tokenId?: string;\n /** Token logo URL */\n logo?: string;\n /** NFT image URL (only for ERC721/ERC1155) */\n image?: string;\n /** NFT metadata (only for ERC721/ERC1155) */\n nftMetadata?: NFTMetadata;\n /** Security token compliance status (only for ERC3643) */\n complianceStatus?: ComplianceStatus;\n}\n\n// Common ERC20 tokens on Lumia (example addresses - would need real ones)\nconst COMMON_TOKENS: Array<{\n address: `0x${string}`;\n name: string;\n symbol: string;\n decimals: number;\n logo?: string;\n}> = [\n // Add real token addresses here when available\n // {\n // address: '0x....',\n // name: 'USD Coin',\n // symbol: 'USDC',\n // decimals: 6,\n // logo: 'https://...'\n // }\n];\n\nexport function useAssets(address?: `0x${string}`) {\n const chainId = requireActiveChainId()\n // Get native LUMIA balance\n const { data: nativeBalance, isLoading: nativeBalanceLoading, refetch: refetchNativeBalance } = useBalance({\n address,\n chainId,\n query: {\n enabled: !!address,\n },\n });\n\n // Get ERC20 token balances\n const tokenContracts = COMMON_TOKENS.map(token => ({\n address: token.address,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [address as `0x${string}`],\n chainId,\n }));\n\n const readContractsResult: any = useReadContracts({\n contracts: tokenContracts as any,\n query: {\n enabled: !!address && COMMON_TOKENS.length > 0,\n },\n } as any);\n const { data: tokenBalances, isLoading: tokenBalancesLoading, refetch: refetchTokenBalances } = readContractsResult as any;\n\n const getAllAssets = (): Asset[] => {\n const assets: Asset[] = [];\n\n // Add native LUMIA\n if (nativeBalance) {\n assets.push({\n type: 'native',\n name: 'Lumia',\n symbol: 'LUMIA',\n balance: nativeBalance.value.toString(),\n formattedBalance: parseFloat(nativeBalance.formatted).toFixed(4),\n decimals: 18,\n });\n }\n\n // Add ERC20 tokens\n if (tokenBalances && COMMON_TOKENS.length > 0) {\n tokenBalances.forEach((balance, index) => {\n const token = COMMON_TOKENS[index];\n if (balance.status === 'success' && balance.result) {\n const balanceValue = balance.result as bigint;\n const formattedBalance = formatUnits(balanceValue, token.decimals);\n\n assets.push({\n type: 'erc20',\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n balance: balanceValue.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n decimals: token.decimals,\n logo: token.logo,\n });\n }\n });\n }\n\n return assets;\n };\n\n const getTokenBalance = (tokenAddress: `0x${string}`) => {\n const tokenIndex = COMMON_TOKENS.findIndex(token =>\n token.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n\n if (tokenIndex === -1 || !tokenBalances?.[tokenIndex]) {\n return null;\n }\n\n const balance = tokenBalances[tokenIndex];\n const token = COMMON_TOKENS[tokenIndex];\n\n if (balance.status === 'success' && balance.result) {\n const balanceValue = balance.result as bigint;\n const formattedBalance = formatUnits(balanceValue, token.decimals);\n\n return {\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n balance: balanceValue.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n logo: token.logo,\n };\n }\n\n return null;\n };\n\n const refreshBalances = async () => {\n await Promise.all([\n refetchNativeBalance(),\n refetchTokenBalances(),\n ]);\n };\n\n return {\n nativeBalance,\n tokenBalances,\n assets: getAllAssets(),\n getTokenBalance,\n refreshBalances,\n isLoading: nativeBalanceLoading || tokenBalancesLoading,\n isConnected: !!address,\n };\n}\n\n// Hook for getting specific token information\nexport function useTokenInfo(tokenAddress: `0x${string}`) {\n const chainId = requireActiveChainId()\n\n const readContractsResult: any = useReadContracts({\n contracts: [\n { address: tokenAddress, abi: erc20Abi, functionName: 'name', chainId },\n { address: tokenAddress, abi: erc20Abi, functionName: 'symbol', chainId },\n { address: tokenAddress, abi: erc20Abi, functionName: 'decimals', chainId },\n ] as any,\n } as any);\n const { data: tokenData, isLoading } = readContractsResult as any;\n\n if (!tokenData || isLoading) {\n return { isLoading, tokenInfo: null };\n }\n\n const [nameResult, symbolResult, decimalsResult] = tokenData;\n\n if (nameResult.status === 'success' &&\n symbolResult.status === 'success' &&\n decimalsResult.status === 'success') {\n return {\n isLoading: false,\n tokenInfo: {\n name: nameResult.result as string,\n symbol: symbolResult.result as string,\n decimals: decimalsResult.result as number,\n address: tokenAddress,\n },\n };\n }\n\n return { isLoading: false, tokenInfo: null };\n}\n\n// Hook for getting token balance for a specific token\nexport function useTokenBalance(tokenAddress: `0x${string}`, userAddress?: `0x${string}`) {\n const chainId = requireActiveChainId()\n const { data: balance, isLoading, refetch } = useReadContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: userAddress ? [userAddress] : undefined,\n chainId,\n query: {\n enabled: !!userAddress,\n },\n });\n\n const { tokenInfo } = useTokenInfo(tokenAddress);\n\n const formattedBalance = React.useMemo(() => {\n if (!balance || !tokenInfo) return '0';\n return formatUnits(balance as bigint, tokenInfo.decimals);\n }, [balance, tokenInfo]);\n\n return {\n balance,\n formattedBalance,\n tokenInfo,\n isLoading,\n refetch,\n };\n}\n","import { Hash, parseAbiItem } from 'viem';\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext';\n\nexport interface UserOperation {\n hash: Hash;\n sender: `0x${string}`;\n nonce: bigint;\n success: boolean;\n actualGasCost: bigint;\n blockNumber: bigint;\n timestamp: number;\n transactionHash: Hash;\n}\n\n// EntryPoint UserOperationEvent\nconst USER_OP_EVENT = parseAbiItem(\n 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n);\n\nexport function useSmartAccountTransactions() {\n // Use publicClient from Zustand store\n const publicClient = useLumiaPassportSession((st) => st.publicClient);\n\n const getUserOperations = async (\n address: `0x${string}`,\n fromBlock: bigint | 'earliest' = 'earliest',\n toBlock: bigint | 'latest' = 'latest'\n ): Promise<UserOperation[]> => {\n // TEMPORARILY DISABLED to prevent RPC spam\n console.log('[getUserOperations] Disabled to prevent RPC spam');\n return [];\n\n /* Original implementation (disabled):\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // For efficiency, limit the block range for recent transactions\n let actualFromBlock = fromBlock;\n if (fromBlock === 'earliest' && toBlock === 'latest') {\n const latestBlock = await publicClient.getBlockNumber();\n // Only check last 1000 blocks (adjust based on chain block time)\n actualFromBlock = latestBlock > 1000n ? latestBlock - 1000n : 0n;\n }\n\n // Get UserOperationEvent events from EntryPoint\n const logs = await publicClient.getLogs({\n address: ENTRYPOINT,\n event: USER_OP_EVENT,\n args: {\n sender: address,\n },\n fromBlock: actualFromBlock,\n toBlock,\n });\n\n // Process logs into UserOperation objects\n const operations: UserOperation[] = [];\n\n for (const log of logs) {\n if (!log.args) continue;\n\n const [userOpHash, sender, , nonce, success, actualGasCost] = log.args as [\n `0x${string}`,\n `0x${string}`,\n `0x${string}`,\n bigint,\n boolean,\n bigint,\n bigint\n ];\n\n // Get block timestamp\n const block = await publicClient.getBlock({\n blockNumber: log.blockNumber,\n });\n\n operations.push({\n hash: userOpHash,\n sender,\n nonce,\n success,\n actualGasCost,\n blockNumber: log.blockNumber,\n timestamp: Number(block.timestamp),\n transactionHash: log.transactionHash,\n });\n }\n\n return operations.sort((a, b) => b.timestamp - a.timestamp);\n } catch (error) {\n console.error('Failed to fetch UserOperations:', error);\n return [];\n }\n */\n };\n\n const getRecentUserOperations = async (\n address: `0x${string}`,\n limit: number = 20\n ): Promise<UserOperation[]> => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // TEMPORARILY DISABLED to prevent RPC spam\n // In production, you should use an indexer service\n console.log('[SmartAccountTransactions] Fetching operations for:', address);\n console.log('[SmartAccountTransactions] Note: Transaction history disabled to prevent RPC spam');\n console.log('[SmartAccountTransactions] In production, use an indexer service like The Graph');\n\n // Return empty array for now\n return [];\n\n // Original implementation (commented out to prevent spam):\n /*\n const latestBlock = await publicClient.getBlockNumber();\n\n // Only check last 100 blocks to minimize requests\n const blockRange = 100n;\n const fromBlock = latestBlock > blockRange ? latestBlock - blockRange : 0n;\n\n const operations = await getUserOperations(address, fromBlock, latestBlock);\n return operations.slice(0, limit);\n */\n } catch (error) {\n console.error('Failed to fetch recent UserOperations:', error);\n return [];\n }\n };\n\n const getTransactionDetails = async (txHash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n const [tx, receipt] = await Promise.all([\n publicClient.getTransaction({ hash: txHash }),\n publicClient.getTransactionReceipt({ hash: txHash }),\n ]);\n\n return { transaction: tx, receipt };\n } catch (error) {\n console.error('Failed to fetch transaction details:', error);\n return null;\n }\n };\n\n return {\n getUserOperations,\n getRecentUserOperations,\n getTransactionDetails,\n };\n}","// Auto-attach package styles (inline) — no action needed in host app\nimport cssText from './styles/built.css'\n\ndeclare const __EMBARK_DISABLE_AUTO_CSS__: string | undefined\n;(() => {\n try {\n if (typeof document === 'undefined') return\n // Allow host apps to opt-out of auto CSS injection\n const disabled = typeof __EMBARK_DISABLE_AUTO_CSS__ !== 'undefined' && !!__EMBARK_DISABLE_AUTO_CSS__\n if (disabled) return\n const markerId = 'lumia-passport-ui-kit-styles'\n if (document.getElementById(markerId)) return\n const style = document.createElement('style')\n style.id = markerId\n style.textContent = (cssText as unknown as string) || ''\n document.head.appendChild(style)\n } catch {}\n})()\n\nexport { LumiaPassportProvider, useLumiaPassportConfig } from './context/LumiaPassportContext'\nexport type { LumiaPassportProviderProps, LumiaPassportCallbacks } from './context/LumiaPassportContext'\n\nexport { ConnectWalletButton, type ConnectWalletButtonProps } from './components/ConnectWalletButton'\nexport {\n LumiaPassportSessionProvider,\n useLumiaPassportSession,\n requireActiveChainId\n} from './context/LumiaPassportSessionContext'\n\nexport {\n useLumiaPassportIsMobileView,\n useLumiaPassportBalance,\n useLumiaPassportAccountSession,\n useLumiaPassportAddress,\n useLumiaPassportIFrameReady,\n useLumiaPassportLoadingStatus,\n useLumiaPassportError,\n useLumiaPassportRecoveryUserId,\n useLumiaPassportHasServerVault,\n useLumiaPassportActiveChainId\n} from './hooks/childAppHooks'\n\nexport { useLumiaPassportOpen } from './hooks/useLumiaPassportOpen'\nexport { useLumiaPassportColorMode } from './hooks/useLumiaPassportColorMode'\nexport { ThemeToggle } from './components/ThemeToggle'\nexport { LangToggle } from './components/LangToggle'\nexport { PageKey, PageOpenParams } from './internal/hooks/useLayoutDataStore'\n\nexport { LumiaWagmiProvider } from './context/WagmiContext'\nexport { LumiaRainbowKitProvider } from './context/RainbowKitContext'\n\nexport { LumiaLogo } from './components/LumiaLogo'\n\n// UserOperation monitoring components\nexport { UserOpStatus } from './internal/components/UserOpStatus'\nexport { Hash } from './internal/components/Hash'\nexport { Address } from './internal/components/Address'\nexport { TransactionsList } from './internal/components/TransactionsMenu/TransactionsList'\n\nexport { KeyshareBackupMenu as KeyshareBackup } from './internal/components/KeyshareRestoreMenu'\n\nexport type { UserOpStatusProps } from './internal/components/UserOpStatus'\nexport type { HashProps } from './internal/components/Hash'\nexport type { AddressProps } from './internal/components/Address'\n\n// Transaction hooks\nexport { useSendTransaction } from './hooks/useSendTransaction'\nexport type { UseSendTransactionReturn } from './hooks/useSendTransaction'\nexport type { SendTransactionParams as UserOpSendTransactionParams } from './hooks/useSendTransaction'\nexport { useUserOpStatus } from './hooks/useUserOpStatus'\n\n// ERC3643 compliance hook\nexport { useErc3643Compliance } from './hooks/useErc3643Compliance'\nexport type { UseErc3643ComplianceOptions, UseErc3643ComplianceResult } from './hooks/useErc3643Compliance'\nexport type { UseUserOpStatusReturn, UseUserOpStatusOptions, UserOpState, UserOpMempool } from './hooks/useUserOpStatus'\n\n// Auth hooks\nexport { useLogout } from './hooks/useLogout'\nexport type { UseLogoutReturn } from './hooks/useLogout'\n\n// Nickname hooks\nexport { useNicknameResolve, looksLikeNickname } from './hooks/useNicknameResolve'\nexport type { UseNicknameResolveResult, UseNicknameResolveOptions } from './hooks/useNicknameResolve'\n\n// Public client API\nexport type {\n AccountSession,\n TypedDataDomain,\n TypedDataField,\n SignTypedDataParams,\n SmartAccountEntry,\n RegisterSmartAccountResult\n} from './internal/clients/account'\nexport {\n sendUserOperation,\n prepareUserOperation,\n signTypedData,\n deployAccount,\n getAllSmartAccounts,\n getSmartAccountForChain\n} from './internal/clients/account'\nexport { lumiaBeamTestnet, lumiaPrisma } from './internal/clients/base'\nexport {\n getUserOperationByHash,\n getUserOperationReceipt,\n waitForUserOperationReceipt,\n UserOperationTimeoutError\n} from './clients'\nexport type { UserOperationByHash, UserOperationReceipt, WaitForReceiptOptions } from './clients'\n\n// Auth API\nexport { logout, jwtTokenManager, getValidTokens } from './internal/auth'\nexport type { JwtTokens, LoginResponse, VerifyResponse } from './internal/auth'\n\n// Profile API\nexport { getUserProfile, updateUserProfile } from './internal/clients/profile'\nexport type { UserProfile, UpdateProfileRequest, ProviderDetail } from './internal/clients/profile'\n\n// Nickname API types\nexport type {\n NicknameInfo,\n NicknameChangeResult,\n NicknameAvailability,\n NicknameResolution,\n NicknameResolvedTarget,\n NicknameAvatar,\n NicknameResolveRequest,\n NicknameValidationResult\n} from './internal/clients/nickname-types'\n\n// Nickname fingerprint verification\nexport { generateFingerprint, verifyFingerprint, verifyFingerprintDetailed } from './internal/lib/nickname-fingerprint'\nexport type { FingerprintVerificationResult } from './internal/lib/nickname-fingerprint'\n\n// Error types\nexport { LumiaPassportError, UserRejectedError, createLumiaPassportError, ErrorCodes } from './lib/errors'\n\n// Wagmi configuration\nexport { wagmiConfig, queryClient } from './config/wagmi'\n\n// Blockchain modules\nexport { useTransactions } from './modules/transactions'\nexport { useAssets, useTokenInfo, useTokenBalance } from './modules/assets'\nexport { useSmartAccountTransactions } from './modules/smartAccountTransactions'\nexport { useLumiaPassportLinkedProfiles } from './modules/linkedProfiles'\nexport type { Transaction, SendTransactionParams, SendTransactionResult } from './modules/transactions'\nexport type { TokenBalance, Asset } from './modules/assets'\nexport type { UserOperation } from './modules/smartAccountTransactions'\nexport type { LumiaPassportConfig, WatchToken } from './config/lumiaPassport'\n\n// Iframe Manager types and functions (for internal dynamic imports)\nexport type { WalletReadyStatus } from './internal/lib/iframe-manager'\nexport { getIframeManager, destroyIframeManager } from './internal/lib/iframe-manager'\n\n// Internationalization (i18n)\nexport {\n combineI18NResources,\n getAvailableLanguages,\n getLanguageIcon,\n PASSPORT_TRANSLATIONS,\n LOCAL_STORAGE_I18N_KEY\n} from './i18n'\n"],"mappings":"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","names":["base","jwtTokenManager","PageKey","init_BalanceFeedProvider","init_constants","useEffect","init_constants","init_ChainSync","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","init_constants","init_constants","init_constants","create","init_utils","init_constants","jsx","init_utils","useMutation","useQueryClient","jsx","jsxs","jwtTokenManager","logout","init_utils","init_constants","init_Footer","jsx","jsxs","LumiaIcon","init_LumiaIcon","jsx","jsxs","logSdkError","jwtTokenManager","getTssUrl","jsx","jsxs","formatUnits","jsx","jsxs","init_utils","init_BalanceView","QUERY_KEYS","useEffect","useRef","useState","Fragment","jsx","jsxs","jsx","jsxs","useQuery","Loader","jsx","jsxs","init_utils","useQuery","Loader","useCallback","useRef","useState","Fragment","jsx","jsxs","jwtTokenManager","LumiaIcon","init_LumiaIcon","init_utils","init_BalanceView","init_Header","merge","ArrowLeft","X","forwardRef","jsx","jsxs","init_utils","jsx","useCallback","useEffect","getChainConfig","init_constants","getChainConfig","privateKeyToAccount","nonce","init_constants","createPublicClientForChain","jwtTokenManager","getTssUrl","createUserOperationWithDynamicFees","estimateUserOperationGas","sendUserOperationWithRetry","createPublicClientForChain","getChainConfig","encodeFunctionData","entryPoint07Abi","privateKeyToAccount","normalizeSignature","PAYMASTER_VERIFICATION_GAS_LIMIT","PAYMASTER_POSTOP_GAS_LIMIT","sendUserOperation","nonce","init_constants","privateKeyToAccount","getChainConfig","createPublicClientForChain","init_constants","createPublicClientForChain","getChainConfig","init_utils","getTssUrl","sendUserOperation","init_utils","useCallback","useEffect","useRef","ensureKeyshare","createAccountSession","getEntryPointDeposit","waitForIframe","ensureValidToken","jwtTokenManager","verifyToken","getIframeManager","checkServerBackupAvailability","updateBackupStatus","getShareRecoveryStats","useMutation","useEffect","useCallback","useEffect","useCallback","useEffect","useRef","forwardRef","jsx","init_utils","init_Expandable","jsx","init_utils","create","alert","Fragment","jsx","jsxs","Loader","Fragment","jsx","jsxs","jsx","jsxs","ArrowLeft","Key","useCallback","Fragment","jsx","jsxs","jwtTokenManager","useImperativeHandle","useRef","jsx","jsxs","init_utils","Icon","useMutation","Loader","Mail","useEffect","useRef","jsx","jsxs","alert","getUserProfile","init_utils","useCallback","jsx","jsxs","alert","getIframeManager","loginResponse","jwtTokenManager","init_utils","jsx","jsxs","Icon","Fragment","jsx","jsxs","init_utils","init_SignInStep","useQueryClient","useCallback","useRef","useState","ensureKeyshare","createAccountSession","getEntryPointDeposit","getIframeManager","jwtTokenManager","checkServerBackupAvailability","updateBackupStatus","getShareRecoveryStats","init_constants","jsx","useEffect","useRef","useState","Fragment","jsx","jsxs","init_utils","t","useMutation","ArrowLeft","Loader","Fragment","jsx","jsxs","loginWithEmail","init_VerifyStep","AlertTriangle","Loader","useEffect","jsx","jsxs","init_Expandable","init_SignInStep","init_VerifyStep","alert","init_AuthMenu","jsx","jsxs","init_utils","jsx","jsxs","jsx","useQuery","Loader","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","QUERY_KEYS","init_utils","init_utils","useEffect","init_utils","useMutation","useQuery","useQueryClient","Loader","useEffect","useRef","Fragment","jsx","jsxs","QUERY_KEYS","init_utils","init_api","init_utils","init_constants","useMutation","useQuery","useQueryClient","DollarSign","LoaderIcon","useEffect","Fragment","jsx","jsxs","QUERY_KEYS","paymentMode","init_utils","init_api","init_constants","jsx","debounce","useCallback","useEffect","useRef","useState","debounce","ArrowLeft","Fragment","jsx","jsxs","Icon","init_utils","init_Expandable","clsx","twMerge","cn","cva","jsx","cn","ArrowLeft","Loader","useState","jsx","jsxs","Icon","init_Expandable","ArrowLeft","Info","Loader","useEffect","useRef","jsx","jsxs","init_Expandable","init_ChainsMenu","forwardRef","useState","jsx","jsxs","init_utils","create","useCallback","ensureKeyshare","createAccountSession","getEntryPointDeposit","verifyToken","jwtTokenManager","getIframeManager","updateBackupStatus","Key","Mail","Wallet2","getTssUrl","PROVIDERS_META","passkey_exports","getTssUrl","begin","options","jwtTokenManager","init_passkey","useMutation","useQueryClient","useEffect","linkPasskeyWithWebAuthn","createPasskeyHelpers","getAvailableCloudProviders","init_constants","useMutation","restoreFromServer","getIframeManager","useEffect","Fragment","useMemo","jsx","jsxs","Icon","ChevronRight","Info","Key","Loader","useEffect","useRef","Fragment","jsx","jsxs","init_utils","FileUp","Fragment","jsx","jsxs","init_utils","init_components","FileDown","FileUp","Fragment","jsx","jsxs","File","init_utils","useQueryClient","Key","Upload","useEffect","Fragment","jsx","jsxs","init_constants","useQuery","ArrowLeft","Loader","useEffect","Fragment","jsx","jsxs","Cloud","getAvailableCloudProviders","init_constants","useMutation","useQuery","useQueryClient","AlertCircle","CloudDownload","Loader","UserCircle","useEffect","Fragment","jsx","jsxs","init_Expandable","init_components","init_constants","Cloud","File","restoreFromServer","jwtTokenManager","logout","useQuery","AlertCircle","ArrowLeft","CheckCircle2","Loader","useEffect","Fragment","jsx","jsxs","init_Expandable","init_components","init_constants","File","Cloud","init_KeyshareRestoreMenu","ArrowLeft","jsx","jsxs","init_Expandable","init_LanguagesMenu","getTssUrl","jwtTokenManager","useQuery","ChevronRight","DollarSign","Wallet2","useEffect","jsx","jsxs","Icon","init_MainMenu","useQuery","useQueryClient","useCallback","jwtTokenManager","create","alert","useMutation","ChevronRight","Loader","Mail","jsx","jsxs","getTssUrl","useMutation","useMutation","useQueryClient","useQueryClient","Fragment","jsx","jsxs","init_passkey","Mail","jsx","jsxs","jwtTokenManager","useQueryClient","React","useEffect","jwtTokenManager","getIframeManager","getTssUrl","init_telegram","useQueryClient","useCallback","useEffect","useState","getIframeManager","init_telegram","jsx","jsxs","AlertTriangle","ArrowLeft","Loader","useMemo","Fragment","jsx","jsxs","alert","Icon","init_Expandable","useMutation","useQueryClient","Key","Loader","useState","jsx","jsxs","Loader","X","jsx","jsxs","useMutation","useQueryClient","Check","ChevronRight","Copy","Loader","useCallback","useState","Fragment","jsx","jsxs","changeNickname","init_utils","useQuery","useEffect","useState","useQuery","dayjs","AlertTriangle","ArrowLeft","Info","Loader","useState","jsx","jsxs","init_Expandable","init_NicknameMenu","useQuery","useMemo","formatUnits","useQuery","useCallback","useMemo","useRef","formatUnits","jsx","jsxs","BnbIcon","init_BnbIcon","jsx","jsxs","LumiaIcon","init_LumiaIcon","init_BnbIcon","init_LumiaIcon","LumiaIcon","BnbIcon","useQuery","useQueryClient","Loader","useState","formatUnits","Fragment","jsx","jsxs","getAssetRate","SKIP_SYMBOLS","init_utils","init_BalanceView","useQueryClient","AlertCircle","ArrowLeft","Loader","useCallback","jsx","jsxs","init_Expandable","init_PortfolioMenu","init_constants","jsx","jsxs","Loader","jsx","jsxs","Icon","init_utils","dayjs","Fragment","jsx","jsxs","Cloud","Loader","RefreshCw","Server","Fragment","jsx","jsxs","init_Keyshare","Loader","jsx","jsxs","dayjs","AppWindowMac","Info","Trash2","Fragment","jsx","jsxs","useQuery","useQueryClient","ArrowLeft","Loader","useState","Fragment","jsx","jsxs","jwtTokenManager","trustedApps","init_Expandable","init_constants","init_Keyshare","init_SecurityMenu","keccak256","useQuery","useState","useEffect","useMemo","DEBOUNCE_MS","useCallback","useState","encodeFunctionData","parseEther","sendUserOperation","formatUnits","isNftAsset","isSecurityToken","init_utils","ImageIcon","Sparkles","jsx","jsxs","isNftAsset","isSecurityToken","init_utils","ImageIcon","Sparkles","useState","jsx","jsxs","create","formatUnits","Fragment","jsx","jsxs","getAssetBalance","isNftAsset","init_utils","init_BalanceView","AlertCircle","AlertTriangle","AtSign","CheckCircle2","ShieldAlert","ShieldCheck","jsx","jsxs","init_utils","init_components","AlertCircle","AtSign","CheckCircle2","Loader","Wallet2","formatUnits","isAddress","Fragment","jsx","jsxs","isNftAsset","isSecurityToken","init_components","init_utils","AlertTriangle","AtSign","Loader","ShieldAlert","ShieldCheck","Fragment","jsx","jsxs","isNftAsset","isSecurityToken","init_utils","AlertCircle","ArrowLeft","CheckCircle2","Loader","useEffect","useMemo","parseUnits","Fragment","jsx","jsxs","isNftAsset","isSecurityToken","init_Expandable","init_components","init_utils","ArrowLeft","CheckCircle2","Copy","Info","Loader","Shield","useCallback","useEffect","useMemo","useState","Fragment","jsx","jsxs","jsx","AtSign","DatabaseBackup","init_constants","useQuery","ArrowLeft","useEffect","jsx","jsxs","Icon","init_utils","init_constants","init_SettingsMenu","ArrowLeft","jsx","jsxs","ARBITRUM_SEPOLIA_CHAIN_ID","BASE_SEPOLIA_CHAIN_ID","BSC_TESTNET_CHAIN_ID","LUMIA_MAINNET_CHAIN_ID","LUMIA_TESTNET_CHAIN_ID","SEPOLIA_CHAIN_ID","key","init_api","formatAddress","formatValue","openInExplorer","init_utils","ChevronLeft","ChevronRight","Copy","Fragment","jsx","jsxs","formatValue","formatAddress","openInExplorer","LumiaIcon","init_LumiaIcon","init_utils","useQuery","useQueryClient","ArrowLeft","Loader","RefreshCw","useCallback","useState","jsx","jsxs","init_Expandable","init_api","init_TransactionsMenu","init_AuthMenu","init_ChainsMenu","init_KeyshareRestoreMenu","init_LanguagesMenu","init_MainMenu","init_NicknameMenu","init_PortfolioMenu","init_SecurityMenu","init_SettingsMenu","init_TransactionsMenu","useCallback","useEffect","jsx","useQuery","useEffect","jwtTokenManager","useEffect","jsx","jsxs","init_Footer","init_Header","React","useCallback","getTssUrl","useMutation","useQueryClient","React","useCallback","useEffect","init_AuthMenu","createPublicClientForChain","DEFAULT_CHAIN_ID","getChainConfig","getViemChain","Fragment","create","jsx","jsxs","init_BalanceFeedProvider","init_ChainSync","getChainConfig","getViemChain","http","getTssUrl","getAvailableCloudProviders","logSdkError","getTssUrl","base64urlToUint8Array","checkServerBackupAvailability","getBackupStatus","getTssUrl","init_passkey","init_telegram","getTssUrl","jwtTokenManager","jwtTokenManager","getServiceUrls","ensureValidToken","init_utils","lumiaMainnetChain","lumiaTestnetChain","http","jsx","merge","useCallback","useEffect","useMemo","useRef","jsx","init_utils","useQuery","Cloud","Laptop","Loader","Shield","useEffect","useMemo","Fragment","jsx","jsxs","jwtTokenManager","LumiaIcon","init_LumiaIcon","init_BalanceView","init_utils","useCallback","useCallback","useEffect","jsx","init_utils","jsx","init_utils","lumiaMainnetChain","lumiaTestnetChain","useMemo","WagmiProvider","Fragment","jsx","rainbowConfig","forwardRef","jsx","jsxs","init_LumiaLogo","getChainConfig","bundlerRpc","getChainConfig","Copy","React","jsx","jsxs","base","cn","AlertCircle","CheckCircle2","Clock","Copy","ExternalLink","RefreshCw","React","jsx","jsxs","cn","Copy","ExternalLink","React","jsx","jsxs","base","short","cn","useEffect","useState","jsx","jsxs","fetchTransactions","formatValue","formatAddress","formatDate","React","jwtTokenManager","useCallback","logout","init_clients","getViemChain","parseEther","useAccount","address","React","useReadContract","formatUnits","erc20Abi","token","init_assets","init_LumiaLogo","init_KeyshareRestoreMenu","init_clients","init_assets"]}