diff --git a/apps/namadillo/src/App/AppRoutes.tsx b/apps/namadillo/src/App/AppRoutes.tsx
index 0237345644..c74d1508d9 100644
--- a/apps/namadillo/src/App/AppRoutes.tsx
+++ b/apps/namadillo/src/App/AppRoutes.tsx
@@ -12,6 +12,7 @@ import {
import { AccountOverview } from "./AccountOverview";
import { App } from "./App";
import { BugReport } from "./Common/BugReport";
+import { FAQ } from "./Common/FAQ";
import { NotFound } from "./Common/NotFound";
import { RouteErrorBoundary } from "./Common/RouteErrorBoundary";
import { ShieldAssetsModal } from "./Common/ShieldAssetsModal";
@@ -134,6 +135,7 @@ export const MainRoutes = (): JSX.Element => {
)}
{/* Other */}
+ } />
} />
} />
diff --git a/apps/namadillo/src/App/Common/FAQ.tsx b/apps/namadillo/src/App/Common/FAQ.tsx
new file mode 100644
index 0000000000..9c87718be6
--- /dev/null
+++ b/apps/namadillo/src/App/Common/FAQ.tsx
@@ -0,0 +1,177 @@
+import { Panel } from "@namada/components";
+
+export const FAQ = (): JSX.Element => {
+ const faqItems = [
+ {
+ question: "What software versions do I need?",
+ answer: (
+ <>
+
To use Namadillo properly, ensure you have:
+
+ Namada Extension Wallet (latest version)
+ For Ledger users: Ledger Live (latest version)
+ For Ledger users: Namada app on Ledger (latest version)
+
+ >
+ ),
+ },
+ {
+ question: "How do I check if my software is up to date?",
+ answer: (
+ <>
+ Follow these steps to verify your software versions:
+
+
+ Browser: Check your browser's About section
+ for version info
+
+
+ Extension Wallet: Go to chrome://extensions/ and
+ check the version
+
+
+ Ledger Live: Open Ledger Live and check for
+ updates in Settings
+
+
+ Ledger Namada App: Update through Ledger
+ Live's Manager section
+
+
+ >
+ ),
+ },
+ {
+ question: "Ledger troubleshooting - Connection issues",
+ answer: (
+ <>
+ If you're having trouble connecting your Ledger device:
+
+ Ensure your Ledger device is unlocked
+ Open the Namada app on your Ledger device
+ Use a high-quality USB cable (avoid USB hubs)
+ Close Ledger Live while using Namadillo
+ Try a different USB port
+ Restart your browser and try again
+
+ >
+ ),
+ },
+ {
+ question: "Ledger troubleshooting - Transaction signing",
+ answer: (
+ <>
+ If transactions aren't signing properly with Ledger:
+
+ Make sure the Namada app is open on your Ledger
+
+ Check that "Blind signing" is enabled in Ledger Namada
+ app settings
+
+
+ Verify you're using the latest firmware on your Ledger device
+
+ Try reducing the transaction amount if it's failing
+ Ensure sufficient battery on your Ledger device
+
+ >
+ ),
+ },
+ {
+ question: "Common sync and loading issues",
+ answer: (
+ <>
+ If Namadillo is not loading properly or sync is slow:
+
+ Clear your browser cache and cookies for Namadillo
+ Disable browser extensions that might interfere
+ Check your internet connection stability
+ Try using a different browser
+ Wait for sync to complete - this can take several minutes
+ Refresh the page if stuck on loading screen
+
+ >
+ ),
+ },
+ {
+ question: "Transaction failures and errors",
+ answer: (
+ <>
+ If your transactions are failing:
+
+
+ Check that you have sufficient balance for the transaction + fees
+
+ Verify the recipient address is correct
+ Try reducing the transaction amount
+ Wait a few minutes and try again (network congestion)
+ For staking: ensure you meet minimum staking requirements
+ For MASP: wait for shielded sync to complete first
+
+ >
+ ),
+ },
+ {
+ question: "MASP (Privacy) related issues",
+ answer: (
+ <>
+ If you're having issues with shielded transactions:
+
+ Allow time for the initial MASP sync to complete
+ MASP sync can take 10-30 minutes depending on network
+ Don't close the browser during MASP sync
+ Shielded balances may not appear until sync is complete
+ Try refreshing if sync appears stuck
+
+ >
+ ),
+ },
+ ];
+
+ return (
+
+
+
+
+ Frequently Asked Questions
+
+
+ Common troubleshooting steps and solutions for using Namadillo. If
+ you don't find your answer here, try our community help or file
+ a bug report.
+
+
+
+
+ {faqItems.map((item, index) => (
+
+
+ {item.question}
+
+
+ {item.answer}
+
+
+ ))}
+
+
+
+
+ Still need help?
+
+
+ If you couldn't find the answer to your question, you can:
+
+
+ Ask for help in our Discord community
+ Report a bug if you think something is broken
+ Check the official Namada documentation
+
+
+
+
+ );
+};
diff --git a/apps/namadillo/src/App/Layout/Navigation.tsx b/apps/namadillo/src/App/Layout/Navigation.tsx
index 21e6230e82..265ccd8379 100644
--- a/apps/namadillo/src/App/Layout/Navigation.tsx
+++ b/apps/namadillo/src/App/Layout/Navigation.tsx
@@ -4,7 +4,7 @@ import { applicationFeaturesAtom } from "atoms/settings";
import { useAtomValue } from "jotai";
import { AiFillHome } from "react-icons/ai";
import { BsDiscord, BsTwitterX } from "react-icons/bs";
-import { FaVoteYea } from "react-icons/fa";
+import { FaQuestionCircle, FaVoteYea } from "react-icons/fa";
import { FaBug } from "react-icons/fa6";
import { GoHistory, GoStack } from "react-icons/go";
import { IoSwapHorizontal } from "react-icons/io5";
@@ -68,6 +68,15 @@ export const Navigation = (): JSX.Element => {
+
+
+
+ FAQ
+
+
{
+ const notifications = useAtomValue(toastNotificationsAtom);
+ const pendingTransactions = useAtomValue(pendingTransactionsHistoryAtom);
+ const dismissNotificationByTxHash = useSetAtom(
+ dismissNotificationByTxHashAtom
+ );
+
+ useEffect(() => {
+ // Get all pending transaction hashes
+ const pendingTxHashes = new Set(
+ pendingTransactions.map((tx) => tx.hash).filter(Boolean)
+ );
+
+ // Find stale pending notifications (notifications for transactions that are no longer pending)
+ const pendingNotifications = notifications.filter(
+ (n) => n.type === "pending"
+ );
+
+ pendingNotifications.forEach((notification) => {
+ // Extract transaction hashes from notification ID
+ const txHashesFromId = notification.id.split(",");
+
+ // Check if any of these hashes are still in pending transactions
+ const hasActivePendingTx = txHashesFromId.some((hash) =>
+ pendingTxHashes.has(hash)
+ );
+
+ // If no active pending transaction matches this notification, dismiss it
+ if (!hasActivePendingTx && txHashesFromId.length > 0) {
+ txHashesFromId.forEach((hash) => {
+ if (hash.trim()) {
+ dismissNotificationByTxHash(hash.trim());
+ }
+ });
+ }
+ });
+ }, [notifications, pendingTransactions, dismissNotificationByTxHash]);
+
+ // Also clean up when the page becomes visible (user switches back to tab)
+ useEffect(() => {
+ const handleVisibilityChange = (): void => {
+ if (!document.hidden) {
+ // Page became visible, trigger cleanup by updating dependencies
+ // The cleanup logic above will run due to the useEffect dependencies
+ }
+ };
+
+ document.addEventListener("visibilitychange", handleVisibilityChange);
+
+ return () => {
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
+ };
+ }, []);
+};