diff --git a/backend/frontend/app/auth/page.tsx b/backend/frontend/app/auth/page.tsx
index 3849ca77..ae03389f 100644
--- a/backend/frontend/app/auth/page.tsx
+++ b/backend/frontend/app/auth/page.tsx
@@ -1,10 +1,44 @@
'use client';
import { motion } from 'framer-motion';
-import { SocialLogin } from '@/components/auth/SocialLogin';
-import { WalletConnect } from '@/components/auth/WalletConnect';
+import dynamic from 'next/dynamic';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Wallet, Users } from 'lucide-react';
+import { Skeleton } from '@/components/ui/skeleton';
+// DashboardProviders must be a static import so WagmiProvider is available
+// synchronously before any child component calls useAccount() or useConnect().
+// Dynamically importing it would cause a race where WalletConnect renders
+// before the provider mounts, throwing a wagmi context error.
+import { DashboardProviders } from '@/components/providers-dashboard';
+
+// Dynamically import the heavy auth components — they pull in @web3auth/modal
+// and wagmi connectors. Loading them on-demand keeps the auth page's initial
+// JS small while the provider is already in place.
+const SocialLogin = dynamic(
+ () => import('@/components/auth/SocialLogin').then((m) => m.SocialLogin),
+ {
+ loading: () => (
+
+ {[1, 2, 3].map((i) => (
+
+ ))}
+
+ ),
+ ssr: false,
+ }
+);
+
+const WalletConnect = dynamic(
+ () => import('@/components/auth/WalletConnect').then((m) => m.WalletConnect),
+ {
+ loading: () => (
+
+
+
+ ),
+ ssr: false,
+ }
+);
export default function AuthPage() {
return (
@@ -28,31 +62,32 @@ export default function AuthPage() {
Welcome to AgenticPay
-
- Get paid instantly for your work
-
+ Get paid instantly for your work
-
-
-
-
- Social Login
-
-
-
- Web3 Wallet
-
-
+ {/* Provider must wrap the tabs so WalletConnect can call useConnect() */}
+
+
+
+
+
+ Social Login
+
+
+
+ Web3 Wallet
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
+
By continuing, you agree to our Terms of Service and Privacy Policy
@@ -62,4 +97,3 @@ export default function AuthPage() {
);
}
-
diff --git a/backend/frontend/app/dashboard/invoices/page.tsx b/backend/frontend/app/dashboard/invoices/page.tsx
index a134e285..f014b27d 100644
--- a/backend/frontend/app/dashboard/invoices/page.tsx
+++ b/backend/frontend/app/dashboard/invoices/page.tsx
@@ -1,11 +1,11 @@
'use client';
import { useState } from 'react';
-import { useDashboardData, DashboardInvoice } from '@/lib/hooks/useDashboardData';
+import { useDashboardData } from '@/lib/hooks/useDashboardData';
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { CheckCircle2, Clock, AlertCircle, Filter, FileText } from 'lucide-react';
-import { motion } from 'framer-motion';
+import { FadeIn } from '@/components/ui/fade-in';
import Link from 'next/link';
import { InvoiceCardSkeleton } from '@/components/ui/loading-skeletons';
import { EmptyState } from '@/components/empty/EmptyState';
@@ -88,12 +88,7 @@ export default function InvoicesPage() {
{filteredInvoices.map((invoice, index) => (
-
+
@@ -124,7 +119,7 @@ export default function InvoicesPage() {
-
+
))}
diff --git a/backend/frontend/app/dashboard/layout.tsx b/backend/frontend/app/dashboard/layout.tsx
index e5e41485..3d9f312d 100644
--- a/backend/frontend/app/dashboard/layout.tsx
+++ b/backend/frontend/app/dashboard/layout.tsx
@@ -3,10 +3,26 @@
import { useAuthStore } from '@/store/useAuthStore';
import { useRouter } from 'next/navigation';
import { useEffect } from 'react';
-import { Sidebar } from '@/components/layout/Sidebar';
-import { Header } from '@/components/layout/Header';
+import dynamic from 'next/dynamic';
+import { DashboardProviders } from '@/components/providers-dashboard';
import { ErrorBoundary } from '@/components/errors/ErrorBoundary';
+// Sidebar and Header are dashboard-only — load them as part of the dashboard
+// chunk rather than the root bundle.
+const Sidebar = dynamic(
+ () => import('@/components/layout/Sidebar').then((m) => m.Sidebar),
+ { ssr: false }
+);
+const Header = dynamic(
+ () => import('@/components/layout/Header').then((m) => m.Header),
+ { ssr: false }
+);
+
+// PWA components are non-critical — load after the dashboard is interactive.
+const PWAWrapper = dynamic(() => import('@/components/PWAWrapper'), {
+ ssr: false,
+});
+
export default function DashboardLayout({
children,
}: {
@@ -26,17 +42,19 @@ export default function DashboardLayout({
}
return (
-
-
-
-
-
-
- {children}
-
+
+
+
-
-
+
+
+
);
}
-
diff --git a/backend/frontend/app/dashboard/page.tsx b/backend/frontend/app/dashboard/page.tsx
index a20453d0..77780d0b 100644
--- a/backend/frontend/app/dashboard/page.tsx
+++ b/backend/frontend/app/dashboard/page.tsx
@@ -3,7 +3,7 @@
import { useDashboardData } from '@/lib/hooks/useDashboardData';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { DollarSign, Clock, Folder, CheckCircle2, TrendingUp } from 'lucide-react';
-import { motion } from 'framer-motion';
+import { FadeIn } from '@/components/ui/fade-in';
import { DashboardStatsSkeleton } from '@/components/ui/loading-skeletons';
export default function DashboardPage() {
@@ -43,11 +43,7 @@ export default function DashboardPage() {
{/* Stats Grid */}
-
+
@@ -63,13 +59,9 @@ export default function DashboardPage() {
-
+
-
+
@@ -82,13 +74,9 @@ export default function DashboardPage() {
Awaiting approval
-
+
-
+
@@ -101,13 +89,9 @@ export default function DashboardPage() {
In progress
-
+
-
+
@@ -120,15 +104,11 @@ export default function DashboardPage() {
Projects done
-
+
{/* Recent Activity */}
-
+
Recent Activity
@@ -152,7 +132,7 @@ export default function DashboardPage() {
)}
-
+
);
}
diff --git a/backend/frontend/app/dashboard/payments/page.tsx b/backend/frontend/app/dashboard/payments/page.tsx
index 8e34cff1..07a6c51c 100644
--- a/backend/frontend/app/dashboard/payments/page.tsx
+++ b/backend/frontend/app/dashboard/payments/page.tsx
@@ -3,7 +3,7 @@
import { useDashboardData } from '@/lib/hooks/useDashboardData';
import { Card, CardContent } from '@/components/ui/card';
import { CheckCircle2, Clock, XCircle, ExternalLink, Wallet } from 'lucide-react';
-import { motion } from 'framer-motion';
+import { FadeIn } from '@/components/ui/fade-in';
import { PaymentCardSkeleton } from '@/components/ui/loading-skeletons';
import { EmptyState } from '@/components/empty/EmptyState';
@@ -48,12 +48,7 @@ export default function PaymentsPage() {
{payments.map((payment, index) => (
-
+
@@ -95,7 +90,7 @@ export default function PaymentsPage() {
)}
-
+
))}
diff --git a/backend/frontend/app/dashboard/projects/[id]/page.tsx b/backend/frontend/app/dashboard/projects/[id]/page.tsx
index 507ee4d6..d888f8f6 100644
--- a/backend/frontend/app/dashboard/projects/[id]/page.tsx
+++ b/backend/frontend/app/dashboard/projects/[id]/page.tsx
@@ -8,7 +8,7 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { ArrowLeft, ExternalLink, CheckCircle2, Clock, Circle, Loader2 } from 'lucide-react';
import Link from 'next/link';
-import { motion } from 'framer-motion';
+import { FadeIn } from '@/components/ui/fade-in';
import { ProjectDetailSkeleton } from '@/components/ui/loading-skeletons';
import { useAgenticPay } from '@/lib/hooks/useAgenticPay';
import { useAccount } from 'wagmi';
@@ -70,19 +70,6 @@ export default function ProjectDetailPage() {
}
};
- const handleSubmitWork = async () => {
- if (!repoLink) {
- toast.error('Please enter a GitHub repository link');
- return;
- }
- try {
- await submitWork(project.id, repoLink);
- toast.info('Submission transaction submitted...');
- } catch (e) {
- console.error(e);
- }
- };
-
const handleApprove = async () => {
try {
await approveWork(project.id);
@@ -272,52 +259,49 @@ export default function ProjectDetailPage() {
{project.milestones.map((milestone, index) => (
-
-
-
- {getStatusIcon(milestone.status)}
-
-
{milestone.title}
- {milestone.description && (
-
{milestone.description}
- )}
+
+
+
+
+ {getStatusIcon(milestone.status)}
+
+
{milestone.title}
+ {milestone.description && (
+
{milestone.description}
+ )}
+
-
-
-
- {milestone.amount} {project.currency}
-
- {milestone.dueDate && (
-
- Due: {new Date(milestone.dueDate).toLocaleDateString()}
+
+
+ {milestone.amount} {project.currency}
- )}
-
-
-
-
-
Progress
-
{milestone.completionPercentage}%
+ {milestone.dueDate && (
+
+ Due: {new Date(milestone.dueDate).toLocaleDateString()}
+
+ )}
+
-
-
+
+ Progress
+ {milestone.completionPercentage}%
+
+
+
+ style={{ width: `${milestone.completionPercentage}%` }}
+ />
+
-
+
))}
diff --git a/backend/frontend/app/dashboard/projects/page.tsx b/backend/frontend/app/dashboard/projects/page.tsx
index 52a4ed83..190249a8 100644
--- a/backend/frontend/app/dashboard/projects/page.tsx
+++ b/backend/frontend/app/dashboard/projects/page.tsx
@@ -4,7 +4,7 @@ import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Plus, ExternalLink, Clock, Folder } from 'lucide-react';
import Link from 'next/link';
-import { motion } from 'framer-motion';
+import { FadeIn } from '@/components/ui/fade-in';
import { ProjectCardSkeleton } from '@/components/ui/loading-skeletons';
import { Skeleton } from '@/components/ui/skeleton';
import { EmptyState } from '@/components/empty/EmptyState';
@@ -101,12 +101,7 @@ export default function ProjectsPage() {
: 0;
return (
-
+
@@ -162,7 +157,7 @@ export default function ProjectsPage() {
-
+
);
})}
diff --git a/backend/frontend/app/globals.css b/backend/frontend/app/globals.css
index 7602c03d..08a68bc5 100644
--- a/backend/frontend/app/globals.css
+++ b/backend/frontend/app/globals.css
@@ -130,6 +130,22 @@
}
}
+/* Lightweight CSS fade-in-up — replaces framer-motion for simple list animations */
+@keyframes fade-in-up {
+ from {
+ opacity: 0;
+ transform: translateY(16px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-fade-in-up {
+ animation: fade-in-up 0.4s ease-out both;
+}
+
.bg-grid-pattern {
background-image:
linear-gradient(to right, rgba(0, 0, 0, 0.1) 1px, transparent 1px),
diff --git a/backend/frontend/app/layout.tsx b/backend/frontend/app/layout.tsx
index 5349258e..b04b187f 100644
--- a/backend/frontend/app/layout.tsx
+++ b/backend/frontend/app/layout.tsx
@@ -2,7 +2,6 @@ import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import { Providers } from "@/components/providers";
-import PWAWrapper from "@/components/PWAWrapper";
const geistSans = Geist({
variable: "--font-geist-sans",
@@ -16,19 +15,30 @@ const geistMono = Geist_Mono({
export const metadata: Metadata = {
title: "AgenticPay - Get Paid Instantly for Your Work",
- description: "Secure, fast, and transparent payments for freelancers powered by blockchain technology.",
+ description:
+ "Secure, fast, and transparent payments for freelancers powered by blockchain technology.",
manifest: "/manifest.webmanifest",
- keywords: ["freelancer", "payments", "blockchain", "crypto", "web3", "escrow", "milestones"],
+ keywords: [
+ "freelancer",
+ "payments",
+ "blockchain",
+ "crypto",
+ "web3",
+ "escrow",
+ "milestones",
+ ],
authors: [{ name: "AgenticPay" }],
openGraph: {
title: "AgenticPay - Get Paid Instantly for Your Work",
- description: "Secure, fast, and transparent payments for freelancers powered by blockchain technology.",
+ description:
+ "Secure, fast, and transparent payments for freelancers powered by blockchain technology.",
type: "website",
},
twitter: {
card: "summary_large_image",
title: "AgenticPay - Get Paid Instantly for Your Work",
- description: "Secure, fast, and transparent payments for freelancers powered by blockchain technology.",
+ description:
+ "Secure, fast, and transparent payments for freelancers powered by blockchain technology.",
},
};
@@ -39,13 +49,8 @@ export default function RootLayout({
}>) {
return (
-
-
- {children}
-
-
+
+ {children}
);
diff --git a/backend/frontend/app/page.tsx b/backend/frontend/app/page.tsx
index 7f25c6da..6ce784f7 100644
--- a/backend/frontend/app/page.tsx
+++ b/backend/frontend/app/page.tsx
@@ -1,147 +1,93 @@
-'use client';
+/**
+ * Landing page — Server Component.
+ * Only the animated sub-components (HeroCTA, HeroAnimations, Navbar) are
+ * client components, keeping framer-motion out of the initial HTML payload
+ * for the static sections.
+ */
import Link from 'next/link';
-import { motion } from 'framer-motion';
import { ArrowRight, Shield, Zap, Wallet, CheckCircle2 } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Navbar } from '@/components/landing/Navbar';
+import { HeroCTA } from '@/components/landing/HeroCTA';
+import { HeroAnimations } from '@/components/landing/HeroAnimations';
+
+const features = [
+ {
+ icon: Zap,
+ title: 'Instant Payments',
+ description:
+ 'Receive payments instantly upon milestone completion. No waiting, no delays.',
+ },
+ {
+ icon: Shield,
+ title: 'Secure & Transparent',
+ description:
+ 'Blockchain-powered escrow ensures your funds are safe and transactions are transparent.',
+ },
+ {
+ icon: Wallet,
+ title: 'Multiple Payment Methods',
+ description:
+ 'Connect with social login or your Web3 wallet. Choose what works for you.',
+ },
+ {
+ icon: CheckCircle2,
+ title: 'Milestone Tracking',
+ description:
+ 'Track project progress with clear milestones and automated invoicing.',
+ },
+];
export default function Home() {
return (
+
{/* Hero Section */}
-
+
-
-
-
- Secure • Fast • Transparent
-
-
-
- Get Paid Instantly for
-
- Your Work
-
-
-
-
- AgenticPay revolutionizes freelancer payments with blockchain technology.
- Get paid instantly, securely, and transparently.
-
-
-
-
-
- Get Started
-
-
-
-
- Learn More
-
-
-
-
- {/* Floating Elements */}
-
-
+ {/* Animated headline + CTA — client island */}
+
+ {/* Decorative blobs — client island */}
+
- {/* Features Section */}
+ {/* Features Section — fully static, no JS needed */}
-
+
Why Choose AgenticPay?
Everything you need to get paid faster and more securely
-
+
- {features.map((feature, index) => (
-
(
+
-
+
-
- {feature.title}
-
-
- {feature.description}
-
-
+
{feature.title}
+
{feature.description}
+
))}
- {/* CTA Section */}
+ {/* CTA Section — static */}
-
+
Ready to Get Started?
@@ -157,11 +103,11 @@ export default function Home() {
-
+
- {/* Footer */}
+ {/* Footer — static */}
);
}
-
diff --git a/backend/frontend/components/landing/HeroAnimations.tsx b/backend/frontend/components/landing/HeroAnimations.tsx
new file mode 100644
index 00000000..c958ebb1
--- /dev/null
+++ b/backend/frontend/components/landing/HeroAnimations.tsx
@@ -0,0 +1,27 @@
+'use client';
+
+import { motion } from 'framer-motion';
+
+/**
+ * Purely decorative floating blobs on the hero section.
+ * Isolated into a tiny client component so the rest of the landing page
+ * can remain a Server Component.
+ */
+export function HeroAnimations() {
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/backend/frontend/components/landing/HeroCTA.tsx b/backend/frontend/components/landing/HeroCTA.tsx
new file mode 100644
index 00000000..ece68de4
--- /dev/null
+++ b/backend/frontend/components/landing/HeroCTA.tsx
@@ -0,0 +1,76 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import Link from 'next/link';
+import { ArrowRight } from 'lucide-react';
+import { Button } from '@/components/ui/button';
+
+/**
+ * Animated hero headline + CTA buttons.
+ * Kept as a client component because of framer-motion entrance animations.
+ */
+export function HeroCTA() {
+ return (
+
+
+ {/* Shield icon inlined to avoid importing lucide on the server */}
+
+
+
+ Secure • Fast • Transparent
+
+
+
+ Get Paid Instantly for
+
+ Your Work
+
+
+
+
+ AgenticPay revolutionizes freelancer payments with blockchain technology.
+ Get paid instantly, securely, and transparently.
+
+
+
+
+
+ Get Started
+
+
+
+
+ Learn More
+
+
+
+ );
+}
diff --git a/backend/frontend/components/layout/Header.tsx b/backend/frontend/components/layout/Header.tsx
index 18123b7c..3a7e0859 100644
--- a/backend/frontend/components/layout/Header.tsx
+++ b/backend/frontend/components/layout/Header.tsx
@@ -14,9 +14,8 @@ import {
import { Avatar, AvatarFallback } from '@/components/ui/avatar';
import { Bell, LogOut, User, Settings } from 'lucide-react';
import { toast } from 'sonner';
-
import { useDisconnect } from 'wagmi';
-import { web3auth } from '@/lib/web3auth';
+import { getWeb3Auth } from '@/lib/web3auth';
export function Header() {
const { name, email, address, logout } = useAuthStore();
@@ -25,20 +24,28 @@ export function Header() {
const handleLogout = async () => {
disconnect();
- if (web3auth) {
- await web3auth.logout();
+ // Only attempt Web3Auth logout if the SDK was previously loaded and has
+ // an active provider (i.e. user logged in via social, not wallet).
+ const web3auth = await getWeb3Auth();
+ if (web3auth?.provider) {
+ try {
+ await web3auth.logout();
+ } catch {
+ // Ignore logout errors — session may already be expired
+ }
}
logout();
toast.success('Logged out successfully');
router.push('/auth');
};
- const initials = name
- ?.split(' ')
- .map((n) => n[0])
- .join('')
- .toUpperCase()
- .slice(0, 2) || 'U';
+ const initials =
+ name
+ ?.split(' ')
+ .map((n) => n[0])
+ .join('')
+ .toUpperCase()
+ .slice(0, 2) || 'U';
const shortAddress = address
? `${address.slice(0, 6)}...${address.slice(-4)}`
@@ -102,4 +109,3 @@ export function Header() {
);
}
-
diff --git a/backend/frontend/components/providers-dashboard.tsx b/backend/frontend/components/providers-dashboard.tsx
new file mode 100644
index 00000000..9ab8409e
--- /dev/null
+++ b/backend/frontend/components/providers-dashboard.tsx
@@ -0,0 +1,24 @@
+'use client';
+
+/**
+ * Dashboard-scoped providers.
+ * wagmi and @tanstack/react-query are only loaded when the user navigates
+ * to a /dashboard route, keeping them out of the landing-page bundle.
+ */
+
+import { WagmiProvider } from 'wagmi';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { wagmiConfig } from '@/lib/wagmi';
+import { useState } from 'react';
+
+export function DashboardProviders({ children }: { children: React.ReactNode }) {
+ const [queryClient] = useState(() => new QueryClient());
+
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/backend/frontend/components/providers.tsx b/backend/frontend/components/providers.tsx
index 80fb8e90..70f04c69 100644
--- a/backend/frontend/components/providers.tsx
+++ b/backend/frontend/components/providers.tsx
@@ -1,21 +1,19 @@
'use client';
-import { WagmiProvider } from 'wagmi';
-import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
-import { wagmiConfig } from '@/lib/wagmi';
-import { useState } from 'react';
+/**
+ * Root providers — intentionally minimal.
+ * Only Toaster lives here so it's available on every page (landing, auth, dashboard).
+ * WagmiProvider and QueryClientProvider are scoped to the dashboard layout
+ * via DashboardProviders to avoid loading wagmi/viem on the landing page.
+ */
+
import { Toaster } from '@/components/ui/sonner';
export function Providers({ children }: { children: React.ReactNode }) {
- const [queryClient] = useState(() => new QueryClient());
-
return (
-
-
- {children}
-
-
-
+ <>
+ {children}
+
+ >
);
}
-
diff --git a/backend/frontend/components/ui/fade-in.tsx b/backend/frontend/components/ui/fade-in.tsx
new file mode 100644
index 00000000..2af8db29
--- /dev/null
+++ b/backend/frontend/components/ui/fade-in.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import { CSSProperties, ReactNode } from 'react';
+
+interface FadeInProps {
+ children: ReactNode;
+ /** Delay in seconds */
+ delay?: number;
+ className?: string;
+}
+
+/**
+ * Lightweight CSS-only fade-in + slide-up animation.
+ * Use this instead of framer-motion for simple entrance
+ * animations in list items and cards — it adds zero JS weight.
+ */
+export function FadeIn({ children, delay = 0, className = '' }: FadeInProps) {
+ const style: CSSProperties = {
+ animationDelay: `${delay}s`,
+ };
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/backend/frontend/lib/web3auth.ts b/backend/frontend/lib/web3auth.ts
index 8b3d7a5c..80788b06 100644
--- a/backend/frontend/lib/web3auth.ts
+++ b/backend/frontend/lib/web3auth.ts
@@ -1,45 +1,80 @@
-import { Web3Auth } from "@web3auth/modal";
-import { CHAIN_NAMESPACES } from "@web3auth/base";
-import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider";
-
-const chainConfig = {
- chainNamespace: CHAIN_NAMESPACES.EIP155,
- chainId: "0x1", // Placeholder — Stellar integration uses Freighter wallet
- rpcTarget: "https://horizon-testnet.stellar.org",
- displayName: "Stellar Testnet",
- blockExplorer: "https://stellar.expert/explorer/testnet",
- ticker: "XLM",
- tickerName: "Stellar Lumens",
-};
-
-const privateKeyProvider = new EthereumPrivateKeyProvider({
- config: { chainConfig },
-});
-
-// Get client ID from environment or use a placeholder for development
-const clientId = process.env.NEXT_PUBLIC_WEB3AUTH_CLIENT_ID;
-
-if (!clientId) {
- console.warn(
- 'NEXT_PUBLIC_WEB3AUTH_CLIENT_ID is not set. Web3Auth will not work until you add your client ID to .env.local'
- );
-}
+/**
+ * Web3Auth is lazily initialised on first use so that the heavy
+ * @web3auth/modal bundle is NOT included in the initial JS payload.
+ * Import `getWeb3Auth` instead of the old `web3auth` singleton.
+ */
+
+import type { Web3Auth } from "@web3auth/modal";
+
+let _web3auth: Web3Auth | null = null;
+let _initPromise: Promise | null = null;
+
+/**
+ * Returns a fully-initialised Web3Auth instance, or null when the
+ * client ID env var is missing. The heavy SDK is dynamically imported
+ * so it only lands in the bundle for pages that actually call this.
+ */
+export async function getWeb3Auth(): Promise {
+ // Return cached instance
+ if (_web3auth) return _web3auth;
+
+ // Deduplicate concurrent calls
+ if (_initPromise) return _initPromise;
+
+ _initPromise = (async () => {
+ const clientId = process.env.NEXT_PUBLIC_WEB3AUTH_CLIENT_ID;
+ if (!clientId) {
+ console.warn(
+ "NEXT_PUBLIC_WEB3AUTH_CLIENT_ID is not set. Web3Auth will not work until you add your client ID to .env.local"
+ );
+ return null;
+ }
-// Only initialize Web3Auth if client ID is provided
-export const web3auth = clientId
- ? new Web3Auth({
+ // Dynamic import — only fetched when this function is first called
+ const [{ Web3Auth }, { CHAIN_NAMESPACES }, { EthereumPrivateKeyProvider }] =
+ await Promise.all([
+ import("@web3auth/modal"),
+ import("@web3auth/base"),
+ import("@web3auth/ethereum-provider"),
+ ]);
+
+ const chainConfig = {
+ chainNamespace: CHAIN_NAMESPACES.EIP155,
+ chainId: "0x1",
+ rpcTarget: "https://horizon-testnet.stellar.org",
+ displayName: "Stellar Testnet",
+ blockExplorer: "https://stellar.expert/explorer/testnet",
+ ticker: "XLM",
+ tickerName: "Stellar Lumens",
+ };
+
+ const privateKeyProvider = new EthereumPrivateKeyProvider({
+ config: { chainConfig },
+ }) as any; // SDK type mismatch between versions — cast is safe here
+
+ _web3auth = new Web3Auth({
clientId,
web3AuthNetwork: "testnet",
chainConfig,
privateKeyProvider,
uiConfig: {
appName: "AgenticPay",
- theme: {
- primary: "#0052FF",
- },
+ theme: { primary: "#0052FF" },
mode: "light",
loginMethodsOrder: ["google", "twitter", "email_passwordless"],
},
- })
- : null;
+ } as any); // SDK type mismatch between @web3auth/modal and @web3auth/base versions
+
+ return _web3auth;
+ })();
+
+ return _initPromise;
+}
+/**
+ * @deprecated Use `getWeb3Auth()` instead.
+ * Kept as a null export so existing static imports don't crash at
+ * module-evaluation time — they will just get null and should call
+ * getWeb3Auth() before using it.
+ */
+export const web3auth: Web3Auth | null = null;
diff --git a/backend/frontend/next.config.ts b/backend/frontend/next.config.ts
index e9ffa308..7607601a 100644
--- a/backend/frontend/next.config.ts
+++ b/backend/frontend/next.config.ts
@@ -1,7 +1,74 @@
import type { NextConfig } from "next";
+import bundleAnalyzer from "@next/bundle-analyzer";
+
+const withBundleAnalyzer = bundleAnalyzer({
+ enabled: process.env.ANALYZE === "true",
+});
const nextConfig: NextConfig = {
- /* config options here */
+ // Transpile heavy Web3 packages so they tree-shake correctly under Next.js
+ transpilePackages: [
+ "@web3auth/modal",
+ "@web3auth/base",
+ "@web3auth/ethereum-provider",
+ "@walletconnect/ethereum-provider",
+ ],
+
+ webpack(config, { isServer }) {
+ // Suppress critical-dependency warnings from Web3Auth / WalletConnect
+ config.ignoreWarnings = [
+ { module: /node_modules\/@walletconnect/ },
+ { module: /node_modules\/@web3auth/ },
+ ];
+
+ // Provide empty shims for Node.js built-ins used by crypto libs in the browser
+ if (!isServer) {
+ config.resolve.fallback = {
+ ...config.resolve.fallback,
+ fs: false,
+ net: false,
+ tls: false,
+ crypto: false,
+ stream: false,
+ url: false,
+ zlib: false,
+ http: false,
+ https: false,
+ assert: false,
+ os: false,
+ path: false,
+ };
+ }
+
+ return config;
+ },
+
+ // Compress responses
+ compress: true,
+
+ // Strict mode for better tree-shaking hints
+ reactStrictMode: true,
+
+ // Optimise images
+ images: {
+ formats: ["image/avif", "image/webp"],
+ },
+
+ // Experimental: optimise package imports so only used icons/components are bundled
+ experimental: {
+ optimizePackageImports: [
+ "lucide-react",
+ "framer-motion",
+ "@radix-ui/react-avatar",
+ "@radix-ui/react-dialog",
+ "@radix-ui/react-dropdown-menu",
+ "@radix-ui/react-label",
+ "@radix-ui/react-popover",
+ "@radix-ui/react-select",
+ "@radix-ui/react-slot",
+ "@radix-ui/react-tabs",
+ ],
+ },
};
-export default nextConfig;
+export default withBundleAnalyzer(nextConfig);
diff --git a/backend/frontend/package-lock.json b/backend/frontend/package-lock.json
index 04da9160..3521a677 100644
--- a/backend/frontend/package-lock.json
+++ b/backend/frontend/package-lock.json
@@ -41,6 +41,7 @@
"zustand": "^5.0.9"
},
"devDependencies": {
+ "@next/bundle-analyzer": "^16.2.6",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19.2.14",
@@ -604,6 +605,16 @@
"integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==",
"license": "MIT"
},
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/@ecies/ciphers": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.6.tgz",
@@ -1524,9 +1535,6 @@
"cpu": [
"arm"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1543,9 +1551,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1562,9 +1567,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1581,9 +1583,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1600,9 +1599,6 @@
"cpu": [
"s390x"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1619,9 +1615,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1638,9 +1631,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1657,9 +1647,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1676,9 +1663,6 @@
"cpu": [
"arm"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1701,9 +1685,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1726,9 +1707,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1751,9 +1729,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1776,9 +1751,6 @@
"cpu": [
"s390x"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1801,9 +1773,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1826,9 +1795,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1851,9 +1817,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2841,6 +2804,16 @@
"@tybys/wasm-util": "^0.10.0"
}
},
+ "node_modules/@next/bundle-analyzer": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-16.2.6.tgz",
+ "integrity": "sha512-amPkVtHCTJAdBwyhhl5+qztHk24O4JlASgrWqh15AmnYi74apfZR46NGC0u4pM6BMAU1mYld4WdzD3cRBP3dOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "webpack-bundle-analyzer": "4.10.1"
+ }
+ },
"node_modules/@next/env": {
"version": "16.2.4",
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.4.tgz",
@@ -2896,9 +2869,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2915,9 +2885,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2934,9 +2901,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2953,9 +2917,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -3091,9 +3052,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -3119,6 +3077,13 @@
"lit": "^3"
}
},
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@radix-ui/number": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
@@ -5597,9 +5562,6 @@
"arm"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5614,9 +5576,6 @@
"arm"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5631,9 +5590,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5648,9 +5604,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5665,9 +5618,6 @@
"loong64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5682,9 +5632,6 @@
"loong64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5699,9 +5646,6 @@
"ppc64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5716,9 +5660,6 @@
"ppc64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5733,9 +5674,6 @@
"riscv64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5750,9 +5688,6 @@
"riscv64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5767,9 +5702,6 @@
"s390x"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5783,9 +5715,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -5800,9 +5729,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -8789,9 +8715,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -8809,9 +8732,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -8829,9 +8749,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -8849,9 +8766,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -9361,13 +9275,6 @@
"viem": ">=2.45.0"
}
},
- "node_modules/@toruslabs/ethereum-controllers/node_modules/@adraffy/ens-normalize": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
- "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
- "extraneous": true,
- "license": "MIT"
- },
"node_modules/@toruslabs/ethereum-controllers/node_modules/@ethereumjs/common": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-10.1.1.tgz",
@@ -9706,78 +9613,6 @@
"@babel/runtime": "7.x"
}
},
- "node_modules/@toruslabs/ethereum-controllers/node_modules/abitype": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.4.tgz",
- "integrity": "sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==",
- "extraneous": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/wevm"
- },
- "peerDependencies": {
- "typescript": ">=5.0.4",
- "zod": "^3.22.0 || ^4.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- },
- "zod": {
- "optional": true
- }
- }
- },
- "node_modules/@toruslabs/ethereum-controllers/node_modules/color": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
- "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-convert": "^3.1.3",
- "color-string": "^2.1.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@toruslabs/ethereum-controllers/node_modules/color-convert": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
- "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=14.6"
- }
- },
- "node_modules/@toruslabs/ethereum-controllers/node_modules/color-name": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
- "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=12.20"
- }
- },
- "node_modules/@toruslabs/ethereum-controllers/node_modules/color-string": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
- "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@toruslabs/ethereum-controllers/node_modules/ethereum-cryptography": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz",
@@ -9810,53 +9645,6 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@toruslabs/ethereum-controllers/node_modules/ox": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/ox/-/ox-0.11.3.tgz",
- "integrity": "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==",
- "extraneous": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/wevm"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@adraffy/ens-normalize": "^1.11.0",
- "@noble/ciphers": "^1.3.0",
- "@noble/curves": "1.9.1",
- "@noble/hashes": "^1.8.0",
- "@scure/bip32": "^1.7.0",
- "@scure/bip39": "^1.6.0",
- "abitype": "^1.2.3",
- "eventemitter3": "5.0.1"
- },
- "peerDependencies": {
- "typescript": ">=5.4.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@toruslabs/ethereum-controllers/node_modules/ox/node_modules/@noble/curves": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
- "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
- "extraneous": true,
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "1.8.0"
- },
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@toruslabs/ethereum-controllers/node_modules/permissionless": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.3.5.tgz",
@@ -10658,7 +10446,7 @@
"version": "19.2.14",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"csstype": "^3.2.2"
@@ -10668,7 +10456,7 @@
"version": "19.2.3",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "^19.2.0"
@@ -11096,9 +10884,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11113,9 +10898,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11130,9 +10912,6 @@
"ppc64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11147,9 +10926,6 @@
"riscv64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11164,9 +10940,6 @@
"riscv64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11181,9 +10954,6 @@
"s390x"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11198,9 +10968,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11215,9 +10982,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -11656,20 +11420,6 @@
"ws": "^7.5.1"
}
},
- "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/utf-8-validate": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
- "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
- "extraneous": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
"node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/ws": {
"version": "7.5.10",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
@@ -12548,13 +12298,6 @@
}
}
},
- "node_modules/@web3auth/no-modal/node_modules/@adraffy/ens-normalize": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
- "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
- "extraneous": true,
- "license": "MIT"
- },
"node_modules/@web3auth/no-modal/node_modules/@ethereumjs/rlp": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-10.1.1.tgz",
@@ -12868,78 +12611,6 @@
"color": "^5.x"
}
},
- "node_modules/@web3auth/no-modal/node_modules/abitype": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.4.tgz",
- "integrity": "sha512-dpKH+N27vRjarMVTFFkeY445VTKftzGWpL0FiT7xmVmzQRKazZexzC5uHG0f6XKsVLAuUlndnbGau6lRejClxg==",
- "extraneous": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/wevm"
- },
- "peerDependencies": {
- "typescript": ">=5.0.4",
- "zod": "^3.22.0 || ^4.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- },
- "zod": {
- "optional": true
- }
- }
- },
- "node_modules/@web3auth/no-modal/node_modules/color": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
- "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-convert": "^3.1.3",
- "color-string": "^2.1.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@web3auth/no-modal/node_modules/color-convert": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
- "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=14.6"
- }
- },
- "node_modules/@web3auth/no-modal/node_modules/color-name": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
- "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=12.20"
- }
- },
- "node_modules/@web3auth/no-modal/node_modules/color-string": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
- "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@web3auth/no-modal/node_modules/ethereum-cryptography": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz",
@@ -12972,53 +12643,6 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@web3auth/no-modal/node_modules/ox": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/ox/-/ox-0.11.3.tgz",
- "integrity": "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==",
- "extraneous": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/wevm"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@adraffy/ens-normalize": "^1.11.0",
- "@noble/ciphers": "^1.3.0",
- "@noble/curves": "1.9.1",
- "@noble/hashes": "^1.8.0",
- "@scure/bip32": "^1.7.0",
- "@scure/bip39": "^1.6.0",
- "abitype": "^1.2.3",
- "eventemitter3": "5.0.1"
- },
- "peerDependencies": {
- "typescript": ">=5.4.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@web3auth/no-modal/node_modules/ox/node_modules/@noble/curves": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
- "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
- "extraneous": true,
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "1.8.0"
- },
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@web3auth/no-modal/node_modules/permissionless": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.3.5.tgz",
@@ -13371,56 +12995,6 @@
"color": "^5.x"
}
},
- "node_modules/@web3auth/ws-embed/node_modules/color": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
- "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-convert": "^3.1.3",
- "color-string": "^2.1.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@web3auth/ws-embed/node_modules/color-convert": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
- "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=14.6"
- }
- },
- "node_modules/@web3auth/ws-embed/node_modules/color-name": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
- "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=12.20"
- }
- },
- "node_modules/@web3auth/ws-embed/node_modules/color-string": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
- "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@web3auth/ws-embed/node_modules/ethereum-cryptography": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz",
@@ -13524,6 +13098,19 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/acorn-walk": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/aes-js": {
"version": "4.0.0-beta.5",
"resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz",
@@ -14121,16 +13708,6 @@
"integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
"license": "MIT"
},
- "node_modules/brotli-wasm": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-3.0.1.tgz",
- "integrity": "sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==",
- "extraneous": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=v18.0.0"
- }
- },
"node_modules/browserslist": {
"version": "4.28.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
@@ -14618,7 +14195,7 @@
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/damerau-levenshtein": {
@@ -14718,6 +14295,13 @@
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -14898,6 +14482,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/eciesjs": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz",
@@ -16405,6 +15996,22 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/h3": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
@@ -16620,6 +16227,13 @@
"node": ">=18"
}
},
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
@@ -17125,6 +16739,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
@@ -17399,20 +17023,6 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"license": "MIT"
},
- "node_modules/jayson/node_modules/utf-8-validate": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
- "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
- "extraneous": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
"node_modules/jayson/node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -17847,9 +17457,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -17871,9 +17478,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -17895,9 +17499,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -17919,9 +17520,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -18246,6 +17844,16 @@
"integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==",
"license": "MIT"
},
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -18766,6 +18374,16 @@
"integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==",
"license": "MIT"
},
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "dev": true,
+ "license": "(WTFPL OR MIT)",
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -20144,6 +19762,21 @@
"is-arrayish": "^0.3.1"
}
},
+ "node_modules/sirv": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
+ "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/slow-redact": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.2.tgz",
@@ -20703,6 +20336,16 @@
"integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==",
"license": "MIT"
},
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/tough-cookie": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
@@ -20917,6 +20560,7 @@
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
@@ -21732,27 +21376,6 @@
}
}
},
- "node_modules/wagmi/node_modules/@base-org/account": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.5.4.tgz",
- "integrity": "sha512-UKLGGYNeDO1EhxjvWkduJ+6T94o9hqnVDZqmlnSWii9DC0YVrnKm8XoWdV1cDMAbpEfrsKugsEES5eUGDat3Ig==",
- "extraneous": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@coinbase/cdp-sdk": "^1.0.0",
- "brotli-wasm": "^3.0.0",
- "clsx": "1.2.1",
- "eventemitter3": "5.0.1",
- "idb-keyval": "6.2.1",
- "ox": "0.6.9",
- "preact": "10.24.2",
- "viem": "^2.31.7",
- "zustand": "5.0.3"
- },
- "engines": {
- "node": ">=20"
- }
- },
"node_modules/wagmi/node_modules/@wagmi/connectors": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-8.0.4.tgz",
@@ -21804,16 +21427,6 @@
}
}
},
- "node_modules/wagmi/node_modules/clsx": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
- "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
- "extraneous": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/wagmi/node_modules/use-sync-external-store": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
@@ -21823,36 +21436,6 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "node_modules/wagmi/node_modules/zustand": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz",
- "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==",
- "extraneous": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.20.0"
- },
- "peerDependencies": {
- "@types/react": ">=18.0.0",
- "immer": ">=9.0.6",
- "react": ">=18.0.0",
- "use-sync-external-store": ">=1.2.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "immer": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "use-sync-external-store": {
- "optional": true
- }
- }
- },
"node_modules/webauthn-p256": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz",
@@ -21885,6 +21468,66 @@
"node": ">=12"
}
},
+ "node_modules/webpack-bundle-analyzer": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz",
+ "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@discoveryjs/json-ext": "0.5.7",
+ "acorn": "^8.0.4",
+ "acorn-walk": "^8.0.0",
+ "commander": "^7.2.0",
+ "debounce": "^1.2.1",
+ "escape-string-regexp": "^4.0.0",
+ "gzip-size": "^6.0.0",
+ "html-escaper": "^2.0.2",
+ "is-plain-object": "^5.0.0",
+ "opener": "^1.5.2",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.3",
+ "ws": "^7.3.1"
+ },
+ "bin": {
+ "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/ws": {
+ "version": "7.5.11",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz",
+ "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/whatwg-encoding": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
diff --git a/backend/frontend/package.json b/backend/frontend/package.json
index 24e087a6..8cac0926 100644
--- a/backend/frontend/package.json
+++ b/backend/frontend/package.json
@@ -7,6 +7,7 @@
"build": "next build",
"start": "next start",
"lint": "eslint",
+ "analyze": "ANALYZE=true next build",
"test": "vitest run --passWithNoTests",
"test:watch": "vitest --passWithNoTests"
},
@@ -44,6 +45,7 @@
"zustand": "^5.0.9"
},
"devDependencies": {
+ "@next/bundle-analyzer": "^16.2.6",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19.2.14",