From d1831e3d282b8d26f08f29d3bb75829ee1b16115 Mon Sep 17 00:00:00 2001 From: Ishant5436 Date: Thu, 28 May 2026 00:03:56 +0530 Subject: [PATCH 1/2] refactor: extend Bounty type and remove ad-hoc casts (fixes #211) --- .../bounty-detail/bounty-detail-client.tsx | 22 ++++++++---------- hooks/use-competition-join-state.ts | 13 ++++------- types/bounty.ts | 23 +++++++++++++++++++ 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/components/bounty-detail/bounty-detail-client.tsx b/components/bounty-detail/bounty-detail-client.tsx index 2d1e2b47..c19710fb 100644 --- a/components/bounty-detail/bounty-detail-client.tsx +++ b/components/bounty-detail/bounty-detail-client.tsx @@ -71,10 +71,7 @@ function getFullMilestoneData(bounty: BountyData): { // Backend does not currently provide applications in the response. // Fall back to empty array until the schema supports it. const getApplications = (bounty: BountyData): Application[] => { - return ( - (bounty as BountyData & { applications?: Application[] })?.applications ?? - [] - ); + return (bounty?.applications as Application[]) ?? []; }; export function BountyDetailClient({ bountyId }: { bountyId: string }) { @@ -155,17 +152,18 @@ export function BountyDetailClient({ bountyId }: { bountyId: string }) { // Identify if the current user is the assigned contributor // using a fallback check on submissions or assumed backend field. const isAssignedApplicant = - (bounty as BountyData & { assignedContributorId?: string }) - ?.assignedContributorId === session?.user?.id || + bounty?.assignedContributorId === session?.user?.id || bounty.submissions?.some((s) => s.submittedBy === session?.user?.id) || (!isCreator && bounty.status === "IN_PROGRESS"); - // submissions is present on BountyQuery (single-bounty query) but not on - // BountyFieldsFragment (list query). The cast is safe here because - // useBountyDetail returns BountyFieldsFragment & Partial. - const competitionSubmissions = - (bounty as { submissions?: CompetitionSubmissionEntry[] | null }) - .submissions ?? []; + const competitionSubmissions = bounty.submissions ?? []; + + // Use the casted submissions list or fallback to our placeholder + const userSubmission = competitionSubmissions.find( + (s) => + s.submittedBy === + (session?.user as { walletAddress?: string })?.walletAddress, + ); return (
diff --git a/hooks/use-competition-join-state.ts b/hooks/use-competition-join-state.ts index 1dde47bb..2cca2de5 100644 --- a/hooks/use-competition-join-state.ts +++ b/hooks/use-competition-join-state.ts @@ -9,6 +9,7 @@ import { } from "@/hooks/use-competition-bounty"; import { useDeadlinePassed } from "@/hooks/use-deadline-passed"; import type { BountyFieldsFragment } from "@/lib/graphql/generated"; +import type { Bounty } from "@/types/bounty"; interface CompetitionJoinState { walletAddress: string | null; @@ -19,7 +20,7 @@ interface CompetitionJoinState { } export function useCompetitionJoinState( - bounty: BountyFieldsFragment, + bounty: BountyFieldsFragment & Partial, ): CompetitionJoinState { const { data: session } = authClient.useSession(); const joinMutation = useJoinCompetition(); @@ -38,13 +39,9 @@ export function useCompetitionJoinState( // Derive from server payload (submissions list on BountyQuery) + local optimism. // BountyFieldsFragment (list queries) doesn't include submissions, so falls // back to false until the detail query resolves. - const bountySubmissions = ( - bounty as { submissions?: Array<{ submittedBy: string }> | null } - ).submissions; - const serverHasJoined = - walletAddress != null && - (bountySubmissions?.some((s) => s.submittedBy === walletAddress) ?? false); - const hasJoined = serverHasJoined || localJoined; + const hasJoined = Boolean( + bounty?.submissions?.some((sub) => sub.submittedBy === walletAddress), + ) || localJoined; const handleJoin = async () => { if (!walletAddress) { diff --git a/types/bounty.ts b/types/bounty.ts index c0c8580a..34356d56 100644 --- a/types/bounty.ts +++ b/types/bounty.ts @@ -83,6 +83,24 @@ export interface ContributorProgress { currentMilestoneId: string; } +export interface BountyApplication { + id: string; + applicantAddress: string; + applicantName?: string; + proposal: { + approach: string; + estimatedTimeline: string; + relevantExperience: string; + portfolioUrl?: string; + }; + reputation: { + score: number; + tier: string; + completionStats: string; + }; + createdAt: string; +} + export interface Bounty { id: string; title: string; @@ -105,14 +123,19 @@ export interface Bounty { bountyWindow?: BountyWindowType | null; submissions?: BountySubmission[] | null; + applications?: BountyApplication[] | null; _count?: BountyCount | null; + claimCount?: number | null; milestones?: Milestone[] | null; contributorProgress?: ContributorProgress[] | null; + maxParticipants?: number | null; maxSlots?: number | null; totalSlotsOccupied?: number | null; + assignedContributorId?: string | null; + createdBy: string; createdAt: string; updatedAt: string; From 618e12610fa72305d11954a45129ff1634dbb8a9 Mon Sep 17 00:00:00 2001 From: Ishant5436 Date: Thu, 28 May 2026 00:24:15 +0530 Subject: [PATCH 2/2] Refactor mock data architecture to centralized factory pattern Migrate legacy mock data files to a unified lib/mock directory structure. Implement factory functions for Bounties, Projects, Leaderboard, and Wallet entities to improve testability. Centralize exports and resolve associated TypeScript type conflicts in consuming components. --- app/api/leaderboard/route.ts | 44 +- app/api/leaderboard/top/route.ts | 18 +- app/api/leaderboard/user/[userId]/route.ts | 32 +- app/discover/page.tsx | 5 +- app/projects/[id]/page.tsx | 69 +-- app/projects/page.tsx | 11 +- app/wallet/page.tsx | 2 +- .../bounty-detail/bounty-detail-client.tsx | 5 +- lib/mock-data.ts | 437 ----------------- lib/mock-project.ts | 132 ------ lib/mock-wallet.ts | 74 --- lib/{mock-bounty.ts => mock/bounties.ts} | 323 +++++++++++++ lib/mock/index.ts | 5 + .../leaderboard.ts} | 23 + lib/{mock-model4.ts => mock/model4.ts} | 22 + lib/mock/projects.ts | 314 +++++++++++++ lib/mock/wallet.ts | 90 ++++ lib/services/withdrawal.ts | 192 ++++---- lib/store.ts | 148 ++++-- package.json | 1 + pnpm-lock.yaml | 439 ++++++++++++++++-- 21 files changed, 1464 insertions(+), 922 deletions(-) delete mode 100644 lib/mock-data.ts delete mode 100644 lib/mock-project.ts delete mode 100644 lib/mock-wallet.ts rename lib/{mock-bounty.ts => mock/bounties.ts} (50%) create mode 100644 lib/mock/index.ts rename lib/{mock-leaderboard.ts => mock/leaderboard.ts} (81%) rename lib/{mock-model4.ts => mock/model4.ts} (71%) create mode 100644 lib/mock/projects.ts create mode 100644 lib/mock/wallet.ts diff --git a/app/api/leaderboard/route.ts b/app/api/leaderboard/route.ts index 9b47e640..91d6a0a3 100644 --- a/app/api/leaderboard/route.ts +++ b/app/api/leaderboard/route.ts @@ -1,29 +1,29 @@ -import { NextResponse } from 'next/server'; -import { getMockLeaderboard } from '@/lib/mock-leaderboard'; -import { LeaderboardResponse, ReputationTier } from '@/types/leaderboard'; +import { NextResponse } from "next/server"; +import { getMockLeaderboard } from "@/lib/mock"; +import { LeaderboardResponse, ReputationTier } from "@/types/leaderboard"; export async function GET(request: Request) { - const { searchParams } = new URL(request.url); - const page = parseInt(searchParams.get('page') || '1'); - const limit = parseInt(searchParams.get('limit') || '10'); - const tier = searchParams.get('tier') as ReputationTier | null; + const { searchParams } = new URL(request.url); + const page = parseInt(searchParams.get("page") || "1"); + const limit = parseInt(searchParams.get("limit") || "10"); + const tier = searchParams.get("tier") as ReputationTier | null; - // Simulate network delay - await new Promise(resolve => setTimeout(resolve, 300)); + // Simulate network delay + await new Promise((resolve) => setTimeout(resolve, 300)); - const { data, total } = getMockLeaderboard(page, limit, tier || undefined); + const { data, total } = getMockLeaderboard(page, limit, tier || undefined); - const response: LeaderboardResponse = { - entries: data.map((contributor, index) => ({ - rank: (page - 1) * limit + index + 1, - previousRank: null, // Mock data doesn't track history yet - rankChange: 0, - contributor, - })), - totalCount: total, - currentUserRank: null, // Only relevant if user context is provided - lastUpdatedAt: new Date().toISOString(), - }; + const response: LeaderboardResponse = { + entries: data.map((contributor, index) => ({ + rank: (page - 1) * limit + index + 1, + previousRank: null, // Mock data doesn't track history yet + rankChange: 0, + contributor, + })), + totalCount: total, + currentUserRank: null, // Only relevant if user context is provided + lastUpdatedAt: new Date().toISOString(), + }; - return NextResponse.json(response); + return NextResponse.json(response); } diff --git a/app/api/leaderboard/top/route.ts b/app/api/leaderboard/top/route.ts index 5aa70b15..5779fbe9 100644 --- a/app/api/leaderboard/top/route.ts +++ b/app/api/leaderboard/top/route.ts @@ -1,15 +1,15 @@ -import { NextResponse } from 'next/server'; -import { getMockLeaderboard } from '@/lib/mock-leaderboard'; +import { NextResponse } from "next/server"; +import { getMockLeaderboard } from "@/lib/mock"; export async function GET(request: Request) { - const { searchParams } = new URL(request.url); - const count = parseInt(searchParams.get('count') || '5'); + const { searchParams } = new URL(request.url); + const count = parseInt(searchParams.get("count") || "5"); - // Simulate network delay - await new Promise(resolve => setTimeout(resolve, 200)); + // Simulate network delay + await new Promise((resolve) => setTimeout(resolve, 200)); - // Get top N contributors - const { data } = getMockLeaderboard(1, count); + // Get top N contributors + const { data } = getMockLeaderboard(1, count); - return NextResponse.json(data); + return NextResponse.json(data); } diff --git a/app/api/leaderboard/user/[userId]/route.ts b/app/api/leaderboard/user/[userId]/route.ts index 1386335b..e82b30f9 100644 --- a/app/api/leaderboard/user/[userId]/route.ts +++ b/app/api/leaderboard/user/[userId]/route.ts @@ -1,26 +1,26 @@ -import { NextResponse } from 'next/server'; -import { getMockUserRank } from '@/lib/mock-leaderboard'; +import { NextResponse } from "next/server"; +import { getMockUserRank } from "@/lib/mock"; interface Params { - params: Promise<{ userId: string }>; + params: Promise<{ userId: string }>; } export async function GET(request: Request, { params }: Params) { - // Await params as per Next.js 15+ requirements if applicable, or good practice for future - const { userId } = await params; + // Await params as per Next.js 15+ requirements if applicable, or good practice for future + const { userId } = await params; - // Simulate network delay - await new Promise(resolve => setTimeout(resolve, 200)); + // Simulate network delay + await new Promise((resolve) => setTimeout(resolve, 200)); - const result = getMockUserRank(userId); + const result = getMockUserRank(userId); - if (!result) { - return NextResponse.json({ error: 'User not found' }, { status: 404 }); - } + if (!result) { + return NextResponse.json({ error: "User not found" }, { status: 404 }); + } - return NextResponse.json({ - rank: result.rank, - contributor: result.contributor, - paramsUserId: userId - }); + return NextResponse.json({ + rank: result.rank, + contributor: result.contributor, + paramsUserId: userId, + }); } diff --git a/app/discover/page.tsx b/app/discover/page.tsx index 525667b8..3130cbb5 100644 --- a/app/discover/page.tsx +++ b/app/discover/page.tsx @@ -7,7 +7,10 @@ import { FilterPanel } from "@/components/filters/filter-panel"; import { ProjectCard } from "@/components/cards/project-card"; import { BountyCard } from "@/components/cards/bounty-card"; import { Skeleton } from "@/components/ui/skeleton"; -import { mockProjects, mockBounties as rawMockBounties } from "@/lib/mock-data"; +import { + mockDiscoverProjects as mockProjects, + mockDiscoverBounties as rawMockBounties, +} from "@/lib/mock"; import { FilterState, TabType } from "@/lib/types"; import { PackageOpen, Coins } from "lucide-react"; import { BountyLogic } from "@/lib/logic/bounty-logic"; diff --git a/app/projects/[id]/page.tsx b/app/projects/[id]/page.tsx index 160538f0..89825fc0 100644 --- a/app/projects/[id]/page.tsx +++ b/app/projects/[id]/page.tsx @@ -1,41 +1,43 @@ -import { notFound } from "next/navigation" -import type { Metadata } from "next" -import { getAllProjects, getProjectById } from "@/lib/mock-project" -import { truncateAtWordBoundary } from "@/lib/truncate" -import { ProjectLogo } from "@/components/projects/project-logo" -import { ProjectBounties } from "@/components/projects/project-bounties" -import { ProjectMaintainers } from "@/components/projects/project-maintainers" -import { ProjectSidebar } from "@/components/projects/project-sidebar" -import { Badge } from "@/components/ui/badge" -import { Separator } from "@/components/ui/separator" -import { ChevronDown, Globe, ExternalLink } from "lucide-react" -import Markdown from "react-markdown" +import { notFound } from "next/navigation"; +import type { Metadata } from "next"; +import { getAllProjects, getProjectById } from "@/lib/mock"; +import { truncateAtWordBoundary } from "@/lib/truncate"; +import { ProjectLogo } from "@/components/projects/project-logo"; +import { ProjectBounties } from "@/components/projects/project-bounties"; +import { ProjectMaintainers } from "@/components/projects/project-maintainers"; +import { ProjectSidebar } from "@/components/projects/project-sidebar"; +import { Badge } from "@/components/ui/badge"; +import { Separator } from "@/components/ui/separator"; +import { ChevronDown, Globe, ExternalLink } from "lucide-react"; +import Markdown from "react-markdown"; interface ProjectPageProps { - params: Promise<{ id: string }> + params: Promise<{ id: string }>; } export async function generateStaticParams() { - return getAllProjects().map((p) => ({ id: p.id })) + return getAllProjects().map((p) => ({ id: p.id })); } -export async function generateMetadata({ params }: ProjectPageProps): Promise { - const { id } = await params - const project = getProjectById(id) +export async function generateMetadata({ + params, +}: ProjectPageProps): Promise { + const { id } = await params; + const project = getProjectById(id); - if (!project) return { title: "Project Not Found" } + if (!project) return { title: "Project Not Found" }; return { title: `${project.name} | Projects`, description: truncateAtWordBoundary(project.description, 160), - } + }; } export default async function ProjectPage({ params }: ProjectPageProps) { - const { id } = await params - const project = getProjectById(id) + const { id } = await params; + const project = getProjectById(id); - if (!project) notFound() + if (!project) notFound(); return (
@@ -46,13 +48,17 @@ export default async function ProjectPage({ params }: ProjectPageProps) { {/* Header Section */}
- +
-

{project.name}

- - {project.openBountyCount} open - +

+ {project.name} +

+ {project.openBountyCount} open {project.websiteUrl && ( )}
-

{project.description}

+

+ {project.description} +

@@ -119,7 +127,7 @@ export default async function ProjectPage({ params }: ProjectPageProps) { {project.description}
- ) + ); } - diff --git a/app/projects/page.tsx b/app/projects/page.tsx index 4d9f26dd..bd5eaaf7 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -1,10 +1,9 @@ -import { getAllProjects, getAllProjectTags } from "@/lib/mock-project" -import { ProjectsDiscovery } from "@/components/projects/projects-discovery" +import { getAllProjects, getAllProjectTags } from "@/lib/mock"; +import { ProjectsDiscovery } from "@/components/projects/projects-discovery"; export default async function ProjectsPage() { - const projects = getAllProjects() - const allTags = getAllProjectTags(projects) + const projects = getAllProjects(); + const allTags = getAllProjectTags(projects); - return + return ; } - diff --git a/app/wallet/page.tsx b/app/wallet/page.tsx index 77f3241e..31060c7b 100644 --- a/app/wallet/page.tsx +++ b/app/wallet/page.tsx @@ -18,7 +18,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { WalletInfo } from "@/types/wallet"; -import { mockWalletWithAssets } from "@/lib/mock-wallet"; +import { mockWalletWithAssets } from "@/lib/mock"; import { useSearchParams } from "next/navigation"; import { AlertCircle } from "lucide-react"; diff --git a/components/bounty-detail/bounty-detail-client.tsx b/components/bounty-detail/bounty-detail-client.tsx index c19710fb..9967bb05 100644 --- a/components/bounty-detail/bounty-detail-client.tsx +++ b/components/bounty-detail/bounty-detail-client.tsx @@ -21,10 +21,7 @@ import { authClient } from "@/lib/auth-client"; import { useDeadlinePassed } from "@/hooks/use-deadline-passed"; import type { CancellationRecord } from "@/types/escrow"; import { MilestoneFunnel } from "@/components/bounty/milestone-funnel"; -import { - MOCK_MODEL4_MILESTONES, - MOCK_MODEL4_CONTRIBUTORS, -} from "@/lib/mock-model4"; +import { MOCK_MODEL4_MILESTONES, MOCK_MODEL4_CONTRIBUTORS } from "@/lib/mock"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { MilestoneSubmissionCard } from "./milestone-submission-card"; import { Model4MaintainerDashboard } from "./model4-maintainer-dashboard"; diff --git a/lib/mock-data.ts b/lib/mock-data.ts deleted file mode 100644 index 239ae94d..00000000 --- a/lib/mock-data.ts +++ /dev/null @@ -1,437 +0,0 @@ -import { Project, Bounty } from "./types"; - -// Mock Projects Data -export const mockProjects: Project[] = [ - { - id: "proj-1", - title: "Stellar DeFi Dashboard", - description: - "A comprehensive dashboard for tracking DeFi protocols on Stellar network. Features real-time analytics, portfolio tracking, and yield optimization.", - tags: ["DeFi", "Frontend", "Analytics", "Stellar"], - status: "active", - createdAt: "2024-01-15T00:00:00Z", - updatedAt: "2024-01-20T00:00:00Z", - creator: "stellar_dev", - category: "DeFi", - milestones: 5, - completedMilestones: 3, - }, - { - id: "proj-2", - title: "NFT Marketplace on Stellar", - description: - "Decentralized NFT marketplace built on Stellar. Supports minting, trading, and royalty management with low transaction fees.", - tags: ["NFT", "Smart Contracts", "Full Stack", "Stellar"], - status: "active", - createdAt: "2024-01-10T00:00:00Z", - updatedAt: "2024-01-22T00:00:00Z", - creator: "nft_builder", - category: "NFT", - milestones: 8, - completedMilestones: 5, - }, - { - id: "proj-3", - title: "Cross-Chain Bridge Protocol", - description: - "Secure bridge protocol enabling asset transfers between Stellar and other major blockchains.", - tags: ["DeFi", "Smart Contracts", "Security", "Infrastructure"], - status: "active", - createdAt: "2024-01-05T00:00:00Z", - updatedAt: "2024-01-18T00:00:00Z", - creator: "bridge_team", - category: "Infrastructure", - milestones: 6, - completedMilestones: 2, - }, - { - id: "proj-4", - title: "Stellar Mobile Wallet", - description: - "User-friendly mobile wallet for Stellar assets with built-in DEX integration and staking features.", - tags: ["Mobile", "Frontend", "Web3", "Stellar"], - status: "active", - createdAt: "2023-12-20T00:00:00Z", - updatedAt: "2024-01-21T00:00:00Z", - creator: "mobile_dev", - category: "Wallet", - milestones: 10, - completedMilestones: 8, - }, - { - id: "proj-5", - title: "DAO Governance Platform", - description: - "Decentralized governance platform for DAOs on Stellar with voting mechanisms and proposal management.", - tags: ["Smart Contracts", "Frontend", "Backend", "Web3"], - status: "completed", - createdAt: "2023-11-01T00:00:00Z", - updatedAt: "2023-12-15T00:00:00Z", - creator: "dao_builders", - category: "Governance", - milestones: 4, - completedMilestones: 4, - }, - { - id: "proj-6", - title: "Stellar Analytics Engine", - description: - "Advanced analytics engine for Stellar blockchain data with customizable dashboards and alerts.", - tags: ["Analytics", "Backend", "Infrastructure", "Stellar"], - status: "active", - createdAt: "2024-01-12T00:00:00Z", - updatedAt: "2024-01-19T00:00:00Z", - creator: "analytics_pro", - category: "Analytics", - milestones: 7, - completedMilestones: 4, - }, - { - id: "proj-7", - title: "Smart Contract Testing Suite", - description: - "Comprehensive testing framework for Stellar smart contracts with automated security audits.", - tags: ["Testing", "Security", "Smart Contracts", "Infrastructure"], - status: "paused", - createdAt: "2023-12-01T00:00:00Z", - updatedAt: "2024-01-10T00:00:00Z", - creator: "test_master", - category: "Development Tools", - milestones: 5, - completedMilestones: 2, - }, - { - id: "proj-8", - title: "Decentralized Identity System", - description: - "Self-sovereign identity solution on Stellar for secure credential management and verification.", - tags: ["Security", "Smart Contracts", "Backend", "Web3"], - status: "active", - createdAt: "2024-01-08T00:00:00Z", - updatedAt: "2024-01-22T00:00:00Z", - creator: "identity_dev", - category: "Identity", - milestones: 6, - completedMilestones: 3, - }, - { - id: "proj-9", - title: "Stellar Documentation Hub", - description: - "Comprehensive documentation platform with interactive tutorials and code examples for Stellar developers.", - tags: ["Documentation", "Frontend", "Design"], - status: "completed", - createdAt: "2023-10-15T00:00:00Z", - updatedAt: "2023-12-01T00:00:00Z", - creator: "docs_team", - category: "Education", - milestones: 3, - completedMilestones: 3, - }, - { - id: "proj-10", - title: "Yield Aggregator Protocol", - description: - "Automated yield optimization protocol that finds the best returns across Stellar DeFi platforms.", - tags: ["DeFi", "Smart Contracts", "Backend", "Analytics"], - status: "active", - createdAt: "2024-01-14T00:00:00Z", - updatedAt: "2024-01-21T00:00:00Z", - creator: "yield_hunter", - category: "DeFi", - milestones: 8, - completedMilestones: 4, - }, -]; - -// Mock Bounties Data — aligned with backend schema -export const mockBounties: Bounty[] = [ - { - id: "bounty-1", - title: "Implement Multi-Signature Wallet Feature", - description: - "Add multi-signature functionality to existing Stellar wallet with customizable approval thresholds.", - type: "FIXED_PRICE", - rewardAmount: 5000, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-wallet", - organization: { - id: "org-wallet", - name: "Wallet Project", - logo: "/logos/org-wallet.png", - slug: "org-wallet", - }, - projectId: mockProjects[0].id, - project: mockProjects[0], - githubIssueUrl: "https://github.com/wallet-project/issues/1", - githubIssueNumber: null, - createdBy: "wallet_project", - createdAt: "2024-01-20T00:00:00Z", - updatedAt: "2024-01-20T00:00:00Z", - }, - { - id: "bounty-2", - title: "Design Landing Page for DeFi Protocol", - description: - "Create modern, responsive landing page design with dark mode support and animated elements.", - type: "COMPETITION", - rewardAmount: 2000, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-defi", - organization: { - id: "org-defi", - name: "DeFi Startup", - logo: "/logos/org-defi.png", - slug: "org-defi", - }, - projectId: mockProjects[1].id, - project: mockProjects[1], - githubIssueUrl: "https://github.com/defi-startup/issues/1", - githubIssueNumber: null, - createdBy: "defi_startup", - createdAt: "2024-01-19T00:00:00Z", - updatedAt: "2024-01-21T00:00:00Z", - }, - { - id: "bounty-3", - title: "Fix Security Vulnerability in Smart Contract", - description: - "Identify and fix critical security vulnerability in liquidity pool smart contract.", - type: "FIXED_PRICE", - rewardAmount: 8000, - rewardCurrency: "USDC", - status: "IN_PROGRESS", - organizationId: "org-security", - organization: { - id: "org-security", - name: "Security Team", - logo: "/logos/org-security.png", - slug: "org-security", - }, - projectId: mockProjects[2].id, - project: mockProjects[2], - githubIssueUrl: "https://github.com/security-team/issues/1", - githubIssueNumber: null, - createdBy: "security_team", - createdAt: "2024-01-18T00:00:00Z", - updatedAt: "2024-01-22T00:00:00Z", - }, - { - id: "bounty-4", - title: "Build Mobile App UI Components", - description: - "Create reusable React Native components for Stellar wallet mobile app.", - type: "MILESTONE_BASED", - rewardAmount: 3000, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-mobile", - organization: { - id: "org-mobile", - name: "Mobile Team", - logo: "/logos/org-mobile.png", - slug: "org-mobile", - }, - projectId: mockProjects[3].id, - project: mockProjects[3], - githubIssueUrl: "https://github.com/mobile-team/issues/1", - githubIssueNumber: null, - createdBy: "mobile_team", - createdAt: "2024-01-17T00:00:00Z", - updatedAt: "2024-01-17T00:00:00Z", - }, - { - id: "bounty-5", - title: "Write Integration Tests for DEX", - description: - "Develop comprehensive integration test suite for decentralized exchange smart contracts.", - type: "FIXED_PRICE", - rewardAmount: 2500, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-dex", - organization: { - id: "org-dex", - name: "DEX Protocol", - logo: "/logos/org-dex.png", - slug: "org-dex", - }, - projectId: mockProjects[4].id, - project: mockProjects[4], - githubIssueUrl: "https://github.com/dex-protocol/issues/1", - githubIssueNumber: null, - createdBy: "dex_protocol", - createdAt: "2024-01-16T00:00:00Z", - updatedAt: "2024-01-20T00:00:00Z", - }, - { - id: "bounty-6", - title: "Optimize Gas Fees for NFT Minting", - description: - "Reduce transaction costs for NFT minting operations by optimizing smart contract code.", - type: "FIXED_PRICE", - rewardAmount: 4000, - rewardCurrency: "USDC", - status: "COMPLETED", - organizationId: "org-nft", - organization: { - id: "org-nft", - name: "NFT Marketplace", - logo: "/logos/org-nft.png", - slug: "org-nft", - }, - projectId: mockProjects[5].id, - project: mockProjects[5], - githubIssueUrl: "https://github.com/nft-marketplace/issues/1", - githubIssueNumber: null, - createdBy: "nft_marketplace", - createdAt: "2024-01-10T00:00:00Z", - updatedAt: "2024-01-15T00:00:00Z", - }, - { - id: "bounty-7", - title: "Create Tutorial Videos for Beginners", - description: - "Produce 5 tutorial videos explaining Stellar development basics for newcomers.", - type: "MILESTONE_BASED", - rewardAmount: 1500, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-edu", - organization: { - id: "org-edu", - name: "Education DAO", - logo: "/logos/org-edu.png", - slug: "org-edu", - }, - projectId: mockProjects[6].id, - project: mockProjects[6], - githubIssueUrl: "https://github.com/education-dao/issues/1", - githubIssueNumber: null, - createdBy: "education_dao", - createdAt: "2024-01-15T00:00:00Z", - updatedAt: "2024-01-18T00:00:00Z", - }, - { - id: "bounty-8", - title: "Implement Real-Time Price Oracle", - description: - "Build reliable price oracle service for DeFi protocols with multiple data sources.", - type: "FIXED_PRICE", - rewardAmount: 6000, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-oracle", - organization: { - id: "org-oracle", - name: "Oracle Network", - logo: "/logos/org-oracle.png", - slug: "org-oracle", - }, - projectId: mockProjects[7].id, - project: mockProjects[7], - githubIssueUrl: "https://github.com/oracle-network/issues/1", - githubIssueNumber: null, - createdBy: "oracle_network", - createdAt: "2024-01-14T00:00:00Z", - updatedAt: "2024-01-21T00:00:00Z", - }, - { - id: "bounty-9", - title: "Add Dark Mode to Dashboard", - description: - "Implement dark mode theme with smooth transitions for analytics dashboard.", - type: "FIXED_PRICE", - rewardAmount: 1000, - rewardCurrency: "USDC", - status: "IN_PROGRESS", - organizationId: "org-analytics", - organization: { - id: "org-analytics", - name: "Analytics Platform", - logo: "/logos/org-analytics.png", - slug: "org-analytics", - }, - projectId: mockProjects[8].id, - project: mockProjects[8], - githubIssueUrl: "https://github.com/analytics-platform/issues/1", - githubIssueNumber: null, - createdBy: "analytics_platform", - createdAt: "2024-01-13T00:00:00Z", - updatedAt: "2024-01-19T00:00:00Z", - }, - { - id: "bounty-10", - title: "Audit Staking Contract", - description: - "Perform comprehensive security audit of staking smart contract with detailed report.", - type: "FIXED_PRICE", - rewardAmount: 7000, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-staking", - organization: { - id: "org-staking", - name: "Staking Protocol", - logo: "/logos/org-staking.png", - slug: "org-staking", - }, - projectId: mockProjects[9].id, - project: mockProjects[9], - githubIssueUrl: "https://github.com/staking-protocol/issues/1", - githubIssueNumber: null, - createdBy: "staking_protocol", - createdAt: "2024-01-12T00:00:00Z", - updatedAt: "2024-01-22T00:00:00Z", - }, - { - id: "bounty-11", - title: "Build API Documentation Site", - description: - "Create interactive API documentation website with code examples and playground.", - type: "COMPETITION", - rewardAmount: 2800, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-api", - organization: { - id: "org-api", - name: "API Team", - logo: "/logos/org-api.png", - slug: "org-api", - }, - projectId: mockProjects[0].id, - project: mockProjects[0], - githubIssueUrl: "https://github.com/api-team/issues/1", - githubIssueNumber: null, - createdBy: "api_team", - createdAt: "2024-01-11T00:00:00Z", - updatedAt: "2024-01-16T00:00:00Z", - }, - { - id: "bounty-12", - title: "Integrate Wallet Connect", - description: - "Add Wallet Connect support to DApp for seamless mobile wallet integration.", - type: "FIXED_PRICE", - rewardAmount: 3500, - rewardCurrency: "USDC", - status: "OPEN", - organizationId: "org-dapp", - organization: { - id: "org-dapp", - name: "DApp Builders", - logo: "/logos/org-dapp.png", - slug: "org-dapp", - }, - projectId: mockProjects[1].id, - project: mockProjects[1], - githubIssueUrl: "https://github.com/dapp-builders/issues/1", - githubIssueNumber: null, - createdBy: "dapp_builders", - createdAt: "2024-01-09T00:00:00Z", - updatedAt: "2024-01-20T00:00:00Z", - }, -]; diff --git a/lib/mock-project.ts b/lib/mock-project.ts deleted file mode 100644 index c00626e1..00000000 --- a/lib/mock-project.ts +++ /dev/null @@ -1,132 +0,0 @@ -import type { Project } from "@/types/project"; - -export const mockProjects: Project[] = [ - { - id: "boundless", - name: "Boundless", - logoUrl: "/logo-icon.png", - websiteUrl: "https://www.boundlessfi.xyz", - description: - "Boundless is building a better way to ship open-source work with transparent funding, milestone-based payouts, and community validation.", - tags: ["Infrastructure", "Grants", "Bounties", "Stellar"], - bountyCount: 12, - openBountyCount: 4, - creatorName: "Boundless Team", - creatorAvatarUrl: "https://github.com/shadcn.png", - prizeAmount: "$12,000", - status: "Active", - bannerUrl: - "https://images.unsplash.com/photo-1639762681485-074b7f938ba0?q=80&w=2832&auto=format&fit=crop", - createdAt: "2025-01-05T12:00:00Z", - updatedAt: "2025-01-18T14:30:00Z", - maintainers: [ - { - userId: "1", - username: "boundless-admin", - avatarUrl: "https://github.com/shadcn.png", - profileUrl: "https://github.com/boundless-admin", - }, - { - userId: "2", - username: "dev-team", - avatarUrl: "https://github.com/vercel.png", - profileUrl: "https://github.com/dev-team", - }, - ], - }, - { - id: "nivo-ui-stellar-build", - name: "NivoUI Stellar Build Hackathon", - logoUrl: "/logo-icon.png", - description: "From idea to on-chain in hours, not weeks.", - tags: ["Infrastructure", "DeFi", "Privacy"], - bountyCount: 8, - openBountyCount: 0, - creatorName: "Thritn", - creatorAvatarUrl: "https://github.com/steven-tey.png", - prizeAmount: "$180", - status: "Ended", - bannerUrl: - "https://images.unsplash.com/photo-1639322537228-f710d846310a?q=80&w=2832&auto=format&fit=crop", - createdAt: "2024-12-20T09:00:00Z", - updatedAt: "2025-01-02T16:15:00Z", - }, - { - id: "soroban-kit", - name: "Soroban Kit", - logoUrl: "/logo-icon.png", - websiteUrl: "https://soroban-kit.dev", - description: - "Utilities, templates, and SDK helpers for building Soroban apps. Includes testing harnesses, example contracts, and deployment workflows.", - tags: ["DeFi", "Infrastructure", "SDK", "Soroban"], - bountyCount: 22, - openBountyCount: 9, - creatorName: "Soroban Devs", - creatorAvatarUrl: null, - prizeAmount: "$5,000", - status: "Active", - bannerUrl: - "https://images.unsplash.com/photo-1644088379091-d574269d422f?q=80&w=2893&auto=format&fit=crop", - createdAt: "2025-01-12T08:30:00Z", - updatedAt: "2025-01-21T10:05:00Z", - maintainers: [ - { - userId: "3", - username: "soroban-core", - avatarUrl: "https://github.com/soroban-core.png", - profileUrl: "https://github.com/soroban-core", - }, - ], - }, - { - id: "stellar-privacy-lab", - name: "Stellar Privacy Lab", - logoUrl: "/logo-icon.png", - websiteUrl: "https://privacy.stellar.org", - description: - "Research and prototypes focused on privacy-preserving primitives and integrations for Stellar—bringing safer defaults to on-chain apps.", - tags: ["Privacy", "Research", "Crypto"], - bountyCount: 5, - openBountyCount: 2, - creatorName: "Privacy Lab", - creatorAvatarUrl: null, - prizeAmount: "$3,500", - status: "Active", - bannerUrl: - "https://images.unsplash.com/photo-1639762681057-074b7f938ba0?q=80&w=2832&auto=format&fit=crop", - createdAt: "2025-01-02T11:00:00Z", - updatedAt: "2025-01-23T18:45:00Z", - maintainers: [ - { - userId: "4", - username: "privacy-research", - avatarUrl: "https://github.com/privacy-research.png", - profileUrl: "https://github.com/privacy-research", - }, - { - userId: "5", - username: "stellar-labs", - avatarUrl: "https://github.com/stellar-labs.png", - profileUrl: "https://github.com/stellar-labs", - }, - ], - }, -]; - -export function getAllProjects(): Project[] { - return mockProjects; -} - -export function getProjectById(id: string): Project | undefined { - return mockProjects.find((p) => p.id === id); -} - -export function getAllProjectTags( - projects: Project[] = mockProjects, -): string[] { - const set = new Set(); - for (const p of projects) { - for (const t of p.tags) set.add(t); - } - return Array.from(set).sort((a, b) => a.localeCompare(b)); -} diff --git a/lib/mock-wallet.ts b/lib/mock-wallet.ts deleted file mode 100644 index 3f077b73..00000000 --- a/lib/mock-wallet.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { WalletInfo } from '@/types/wallet' - -// Mock Stellar wallet with proper address format -export const mockWalletInfo: WalletInfo = { - address: 'GC64SVY3XSYEE7MYADTEQNO3ACCWJ6NLWNNJLPO2FGS4I2PCNBPVNZOP', - displayName: 'John Doe', - balance: 0, - balanceCurrency: 'USD', - assets: [], - recentActivity: [], - has2FA: false, - isConnected: true -} - -// Example with assets and activity (for testing populated states) -export const mockWalletWithAssets: WalletInfo = { - address: 'GC64SVY3XSYEE7MYADTEQNO3ACCWJ6NLWNNJLPO2FGS4I2PCNBPVNZOP', - displayName: 'Jane Smith', - balance: 1250.50, - balanceCurrency: 'USD', - assets: [ - { - id: '1', - tokenSymbol: 'XLM', - tokenName: 'Stellar Lumens', - amount: 5000, - usdValue: 625.00 - }, - { - id: '2', - tokenSymbol: 'USDC', - tokenName: 'USD Coin', - amount: 625.50, - usdValue: 625.50 - } - ], - recentActivity: [ - { - id: '1', - type: 'earning', - amount: 500, - currency: 'USDC', - date: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(), - status: 'completed', - description: 'Bounty reward - Feature Implementation' - }, - { - id: '2', - type: 'earning', - amount: 250, - currency: 'XLM', - date: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString(), - status: 'completed', - description: 'Bounty reward - Bug Fix' - }, - { - id: '3', - type: 'withdrawal', - amount: 100, - currency: 'USDC', - date: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), - status: 'completed', - description: 'Withdrawal to external wallet' - } - ], - has2FA: true, - isConnected: true -} - -// Helper to truncate Stellar address -export function truncateStellarAddress(address: string): string { - if (address.length <= 8) return address - return `${address.slice(0, 4)}...${address.slice(-4)}` -} diff --git a/lib/mock-bounty.ts b/lib/mock/bounties.ts similarity index 50% rename from lib/mock-bounty.ts rename to lib/mock/bounties.ts index 44b7af01..68dcb5aa 100644 --- a/lib/mock-bounty.ts +++ b/lib/mock/bounties.ts @@ -1,5 +1,37 @@ +import { mockDiscoverProjects } from "./projects"; import { Bounty } from "@/types/bounty"; +export function makeMockBounty(overrides: Partial = {}): Bounty { + return { + id: "mock-bounty-" + Math.random().toString(36).substr(2, 9), + type: "FIXED_PRICE", + title: "Mock Bounty", + organizationId: "org-boundless", + organization: { + id: "org-boundless", + name: "Boundless", + logo: "/logo.svg", + slug: "boundless", + }, + projectId: "proj-bounties", + project: { + id: "proj-bounties", + title: "Bounties Platform", + description: null, + }, + githubIssueUrl: "https://github.com/boundlessfi/bounties/issues/1", + githubIssueNumber: 1, + description: "Mock description", + rewardAmount: 500, + rewardCurrency: "USDC", + status: "OPEN", + createdBy: "user-admin", + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + ...overrides, + } as Bounty; +} + export const mockBounties: Bounty[] = [ { id: "1", @@ -275,3 +307,294 @@ export function getBountyById(id: string): Bounty | undefined { export function getAllBounties(): Bounty[] { return mockBounties; } + +export const mockDiscoverBounties: Bounty[] = [ + { + id: "bounty-1", + title: "Implement Multi-Signature Wallet Feature", + description: + "Add multi-signature functionality to existing Stellar wallet with customizable approval thresholds.", + type: "FIXED_PRICE", + rewardAmount: 5000, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-wallet", + organization: { + id: "org-wallet", + name: "Wallet Project", + logo: "/logos/org-wallet.png", + slug: "org-wallet", + }, + projectId: mockDiscoverProjects[0].id, + project: mockDiscoverProjects[0], + githubIssueUrl: "https://github.com/wallet-project/issues/1", + githubIssueNumber: null, + createdBy: "wallet_project", + createdAt: "2024-01-20T00:00:00Z", + updatedAt: "2024-01-20T00:00:00Z", + }, + { + id: "bounty-2", + title: "Design Landing Page for DeFi Protocol", + description: + "Create modern, responsive landing page design with dark mode support and animated elements.", + type: "COMPETITION", + rewardAmount: 2000, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-defi", + organization: { + id: "org-defi", + name: "DeFi Startup", + logo: "/logos/org-defi.png", + slug: "org-defi", + }, + projectId: mockDiscoverProjects[1].id, + project: mockDiscoverProjects[1], + githubIssueUrl: "https://github.com/defi-startup/issues/1", + githubIssueNumber: null, + createdBy: "defi_startup", + createdAt: "2024-01-19T00:00:00Z", + updatedAt: "2024-01-21T00:00:00Z", + }, + { + id: "bounty-3", + title: "Fix Security Vulnerability in Smart Contract", + description: + "Identify and fix critical security vulnerability in liquidity pool smart contract.", + type: "FIXED_PRICE", + rewardAmount: 8000, + rewardCurrency: "USDC", + status: "IN_PROGRESS", + organizationId: "org-security", + organization: { + id: "org-security", + name: "Security Team", + logo: "/logos/org-security.png", + slug: "org-security", + }, + projectId: mockDiscoverProjects[2].id, + project: mockDiscoverProjects[2], + githubIssueUrl: "https://github.com/security-team/issues/1", + githubIssueNumber: null, + createdBy: "security_team", + createdAt: "2024-01-18T00:00:00Z", + updatedAt: "2024-01-22T00:00:00Z", + }, + { + id: "bounty-4", + title: "Build Mobile App UI Components", + description: + "Create reusable React Native components for Stellar wallet mobile app.", + type: "MILESTONE_BASED", + rewardAmount: 3000, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-mobile", + organization: { + id: "org-mobile", + name: "Mobile Team", + logo: "/logos/org-mobile.png", + slug: "org-mobile", + }, + projectId: mockDiscoverProjects[3].id, + project: mockDiscoverProjects[3], + githubIssueUrl: "https://github.com/mobile-team/issues/1", + githubIssueNumber: null, + createdBy: "mobile_team", + createdAt: "2024-01-17T00:00:00Z", + updatedAt: "2024-01-17T00:00:00Z", + }, + { + id: "bounty-5", + title: "Write Integration Tests for DEX", + description: + "Develop comprehensive integration test suite for decentralized exchange smart contracts.", + type: "FIXED_PRICE", + rewardAmount: 2500, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-dex", + organization: { + id: "org-dex", + name: "DEX Protocol", + logo: "/logos/org-dex.png", + slug: "org-dex", + }, + projectId: mockDiscoverProjects[4].id, + project: mockDiscoverProjects[4], + githubIssueUrl: "https://github.com/dex-protocol/issues/1", + githubIssueNumber: null, + createdBy: "dex_protocol", + createdAt: "2024-01-16T00:00:00Z", + updatedAt: "2024-01-20T00:00:00Z", + }, + { + id: "bounty-6", + title: "Optimize Gas Fees for NFT Minting", + description: + "Reduce transaction costs for NFT minting operations by optimizing smart contract code.", + type: "FIXED_PRICE", + rewardAmount: 4000, + rewardCurrency: "USDC", + status: "COMPLETED", + organizationId: "org-nft", + organization: { + id: "org-nft", + name: "NFT Marketplace", + logo: "/logos/org-nft.png", + slug: "org-nft", + }, + projectId: mockDiscoverProjects[5].id, + project: mockDiscoverProjects[5], + githubIssueUrl: "https://github.com/nft-marketplace/issues/1", + githubIssueNumber: null, + createdBy: "nft_marketplace", + createdAt: "2024-01-10T00:00:00Z", + updatedAt: "2024-01-15T00:00:00Z", + }, + { + id: "bounty-7", + title: "Create Tutorial Videos for Beginners", + description: + "Produce 5 tutorial videos explaining Stellar development basics for newcomers.", + type: "MILESTONE_BASED", + rewardAmount: 1500, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-edu", + organization: { + id: "org-edu", + name: "Education DAO", + logo: "/logos/org-edu.png", + slug: "org-edu", + }, + projectId: mockDiscoverProjects[6].id, + project: mockDiscoverProjects[6], + githubIssueUrl: "https://github.com/education-dao/issues/1", + githubIssueNumber: null, + createdBy: "education_dao", + createdAt: "2024-01-15T00:00:00Z", + updatedAt: "2024-01-18T00:00:00Z", + }, + { + id: "bounty-8", + title: "Implement Real-Time Price Oracle", + description: + "Build reliable price oracle service for DeFi protocols with multiple data sources.", + type: "FIXED_PRICE", + rewardAmount: 6000, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-oracle", + organization: { + id: "org-oracle", + name: "Oracle Network", + logo: "/logos/org-oracle.png", + slug: "org-oracle", + }, + projectId: mockDiscoverProjects[7].id, + project: mockDiscoverProjects[7], + githubIssueUrl: "https://github.com/oracle-network/issues/1", + githubIssueNumber: null, + createdBy: "oracle_network", + createdAt: "2024-01-14T00:00:00Z", + updatedAt: "2024-01-21T00:00:00Z", + }, + { + id: "bounty-9", + title: "Add Dark Mode to Dashboard", + description: + "Implement dark mode theme with smooth transitions for analytics dashboard.", + type: "FIXED_PRICE", + rewardAmount: 1000, + rewardCurrency: "USDC", + status: "IN_PROGRESS", + organizationId: "org-analytics", + organization: { + id: "org-analytics", + name: "Analytics Platform", + logo: "/logos/org-analytics.png", + slug: "org-analytics", + }, + projectId: mockDiscoverProjects[8].id, + project: mockDiscoverProjects[8], + githubIssueUrl: "https://github.com/analytics-platform/issues/1", + githubIssueNumber: null, + createdBy: "analytics_platform", + createdAt: "2024-01-13T00:00:00Z", + updatedAt: "2024-01-19T00:00:00Z", + }, + { + id: "bounty-10", + title: "Audit Staking Contract", + description: + "Perform comprehensive security audit of staking smart contract with detailed report.", + type: "FIXED_PRICE", + rewardAmount: 7000, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-staking", + organization: { + id: "org-staking", + name: "Staking Protocol", + logo: "/logos/org-staking.png", + slug: "org-staking", + }, + projectId: mockDiscoverProjects[9].id, + project: mockDiscoverProjects[9], + githubIssueUrl: "https://github.com/staking-protocol/issues/1", + githubIssueNumber: null, + createdBy: "staking_protocol", + createdAt: "2024-01-12T00:00:00Z", + updatedAt: "2024-01-22T00:00:00Z", + }, + { + id: "bounty-11", + title: "Build API Documentation Site", + description: + "Create interactive API documentation website with code examples and playground.", + type: "COMPETITION", + rewardAmount: 2800, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-api", + organization: { + id: "org-api", + name: "API Team", + logo: "/logos/org-api.png", + slug: "org-api", + }, + projectId: mockDiscoverProjects[0].id, + project: mockDiscoverProjects[0], + githubIssueUrl: "https://github.com/api-team/issues/1", + githubIssueNumber: null, + createdBy: "api_team", + createdAt: "2024-01-11T00:00:00Z", + updatedAt: "2024-01-16T00:00:00Z", + }, + { + id: "bounty-12", + title: "Integrate Wallet Connect", + description: + "Add Wallet Connect support to DApp for seamless mobile wallet integration.", + type: "FIXED_PRICE", + rewardAmount: 3500, + rewardCurrency: "USDC", + status: "OPEN", + organizationId: "org-dapp", + organization: { + id: "org-dapp", + name: "DApp Builders", + logo: "/logos/org-dapp.png", + slug: "org-dapp", + }, + projectId: mockDiscoverProjects[1].id, + project: mockDiscoverProjects[1], + githubIssueUrl: "https://github.com/dapp-builders/issues/1", + githubIssueNumber: null, + createdBy: "dapp_builders", + createdAt: "2024-01-09T00:00:00Z", + updatedAt: "2024-01-20T00:00:00Z", + }, +]; diff --git a/lib/mock/index.ts b/lib/mock/index.ts new file mode 100644 index 00000000..296cb9ce --- /dev/null +++ b/lib/mock/index.ts @@ -0,0 +1,5 @@ +export * from "./bounties"; +export * from "./projects"; +export * from "./leaderboard"; +export * from "./wallet"; +export * from "./model4"; diff --git a/lib/mock-leaderboard.ts b/lib/mock/leaderboard.ts similarity index 81% rename from lib/mock-leaderboard.ts rename to lib/mock/leaderboard.ts index 37b1bc0e..3940e94b 100644 --- a/lib/mock-leaderboard.ts +++ b/lib/mock/leaderboard.ts @@ -1,5 +1,28 @@ import { LeaderboardContributor, ReputationTier } from "@/types/leaderboard"; +export function makeMockLeaderboardContributor( + overrides: Partial = {}, +): LeaderboardContributor { + return { + id: "contributor-mock", + userId: "user-mock", + walletAddress: "0x1234567890abcdef", + displayName: "Mock Contributor", + avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=mock", + totalScore: 1000, + tier: "SILVER", + stats: { + totalCompleted: 10, + totalEarnings: 500, + earningsCurrency: "USDC", + completionRate: 0.9, + averageRating: 4.5, + }, + recentBadges: [], + ...overrides, + } as LeaderboardContributor; +} + const generateMockContributor = ( id: string, rank: number, diff --git a/lib/mock-model4.ts b/lib/mock/model4.ts similarity index 71% rename from lib/mock-model4.ts rename to lib/mock/model4.ts index bee26f60..95117f4b 100644 --- a/lib/mock-model4.ts +++ b/lib/mock/model4.ts @@ -1,5 +1,27 @@ import { Milestone, ContributorProgress } from "@/types/bounty"; +export function makeMockMilestone( + overrides: Partial = {}, +): Milestone { + return { + id: "m-" + Math.random().toString(36).substr(2, 9), + title: "Mock Milestone", + description: "Mock description", + isCompleted: false, + ...overrides, + } as Milestone; +} + +export function makeMockContributorProgress( + overrides: Partial = {}, +): ContributorProgress { + return { + contributorId: "c-" + Math.random().toString(36).substr(2, 9), + completedMilestoneIds: [], + ...overrides, + } as ContributorProgress; +} + export const MOCK_MODEL4_MILESTONES: Milestone[] = [ { id: "m1", diff --git a/lib/mock/projects.ts b/lib/mock/projects.ts new file mode 100644 index 00000000..28c2491a --- /dev/null +++ b/lib/mock/projects.ts @@ -0,0 +1,314 @@ +import type { Project } from "@/types/project"; +import type { Project as DiscoverProject } from "@/lib/types"; + +export function makeMockProject(overrides: Partial = {}): Project { + return { + id: "proj-" + Math.random().toString(36).substr(2, 9), + name: "Mock Project", + logoUrl: "/logo-icon.png", + description: "Mock description", + tags: [], + bountyCount: 0, + openBountyCount: 0, + creatorName: "Mock Creator", + creatorAvatarUrl: null, + prizeAmount: "$0", + status: "Active", + bannerUrl: null, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + ...overrides, + } as Project; +} + +export function makeMockDiscoverProject( + overrides: Partial = {}, +): DiscoverProject { + return { + id: "proj-" + Math.random().toString(36).substr(2, 9), + title: "Mock Discover Project", + description: "Mock description", + tags: [], + status: "active", + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + creator: "creator", + category: "category", + ...overrides, + } as DiscoverProject; +} + +export const mockProjects: Project[] = [ + { + id: "boundless", + name: "Boundless", + logoUrl: "/logo-icon.png", + websiteUrl: "https://www.boundlessfi.xyz", + description: + "Boundless is building a better way to ship open-source work with transparent funding, milestone-based payouts, and community validation.", + tags: ["Infrastructure", "Grants", "Bounties", "Stellar"], + bountyCount: 12, + openBountyCount: 4, + creatorName: "Boundless Team", + creatorAvatarUrl: "https://github.com/shadcn.png", + prizeAmount: "$12,000", + status: "Active", + bannerUrl: + "https://images.unsplash.com/photo-1639762681485-074b7f938ba0?q=80&w=2832&auto=format&fit=crop", + createdAt: "2025-01-05T12:00:00Z", + updatedAt: "2025-01-18T14:30:00Z", + maintainers: [ + { + userId: "1", + username: "boundless-admin", + avatarUrl: "https://github.com/shadcn.png", + profileUrl: "https://github.com/boundless-admin", + }, + { + userId: "2", + username: "dev-team", + avatarUrl: "https://github.com/vercel.png", + profileUrl: "https://github.com/dev-team", + }, + ], + }, + { + id: "nivo-ui-stellar-build", + name: "NivoUI Stellar Build Hackathon", + logoUrl: "/logo-icon.png", + description: "From idea to on-chain in hours, not weeks.", + tags: ["Infrastructure", "DeFi", "Privacy"], + bountyCount: 8, + openBountyCount: 0, + creatorName: "Thritn", + creatorAvatarUrl: "https://github.com/steven-tey.png", + prizeAmount: "$180", + status: "Ended", + bannerUrl: + "https://images.unsplash.com/photo-1639322537228-f710d846310a?q=80&w=2832&auto=format&fit=crop", + createdAt: "2024-12-20T09:00:00Z", + updatedAt: "2025-01-02T16:15:00Z", + }, + { + id: "soroban-kit", + name: "Soroban Kit", + logoUrl: "/logo-icon.png", + websiteUrl: "https://soroban-kit.dev", + description: + "Utilities, templates, and SDK helpers for building Soroban apps. Includes testing harnesses, example contracts, and deployment workflows.", + tags: ["DeFi", "Infrastructure", "SDK", "Soroban"], + bountyCount: 22, + openBountyCount: 9, + creatorName: "Soroban Devs", + creatorAvatarUrl: null, + prizeAmount: "$5,000", + status: "Active", + bannerUrl: + "https://images.unsplash.com/photo-1644088379091-d574269d422f?q=80&w=2893&auto=format&fit=crop", + createdAt: "2025-01-12T08:30:00Z", + updatedAt: "2025-01-21T10:05:00Z", + maintainers: [ + { + userId: "3", + username: "soroban-core", + avatarUrl: "https://github.com/soroban-core.png", + profileUrl: "https://github.com/soroban-core", + }, + ], + }, + { + id: "stellar-privacy-lab", + name: "Stellar Privacy Lab", + logoUrl: "/logo-icon.png", + websiteUrl: "https://privacy.stellar.org", + description: + "Research and prototypes focused on privacy-preserving primitives and integrations for Stellar—bringing safer defaults to on-chain apps.", + tags: ["Privacy", "Research", "Crypto"], + bountyCount: 5, + openBountyCount: 2, + creatorName: "Privacy Lab", + creatorAvatarUrl: null, + prizeAmount: "$3,500", + status: "Active", + bannerUrl: + "https://images.unsplash.com/photo-1639762681057-074b7f938ba0?q=80&w=2832&auto=format&fit=crop", + createdAt: "2025-01-02T11:00:00Z", + updatedAt: "2025-01-23T18:45:00Z", + maintainers: [ + { + userId: "4", + username: "privacy-research", + avatarUrl: "https://github.com/privacy-research.png", + profileUrl: "https://github.com/privacy-research", + }, + { + userId: "5", + username: "stellar-labs", + avatarUrl: "https://github.com/stellar-labs.png", + profileUrl: "https://github.com/stellar-labs", + }, + ], + }, +]; + +export function getAllProjects(): Project[] { + return mockProjects; +} + +export function getProjectById(id: string): Project | undefined { + return mockProjects.find((p) => p.id === id); +} + +export function getAllProjectTags( + projects: Project[] = mockProjects, +): string[] { + const set = new Set(); + for (const p of projects) { + for (const t of p.tags) set.add(t); + } + return Array.from(set).sort((a, b) => a.localeCompare(b)); +} + +// From mock-data.ts +export const mockDiscoverProjects: DiscoverProject[] = [ + { + id: "proj-1", + title: "Stellar DeFi Dashboard", + description: + "A comprehensive dashboard for tracking DeFi protocols on Stellar network. Features real-time analytics, portfolio tracking, and yield optimization.", + tags: ["DeFi", "Frontend", "Analytics", "Stellar"], + status: "active", + createdAt: "2024-01-15T00:00:00Z", + updatedAt: "2024-01-20T00:00:00Z", + creator: "stellar_dev", + category: "DeFi", + milestones: 5, + completedMilestones: 3, + }, + { + id: "proj-2", + title: "NFT Marketplace on Stellar", + description: + "Decentralized NFT marketplace built on Stellar. Supports minting, trading, and royalty management with low transaction fees.", + tags: ["NFT", "Smart Contracts", "Full Stack", "Stellar"], + status: "active", + createdAt: "2024-01-10T00:00:00Z", + updatedAt: "2024-01-22T00:00:00Z", + creator: "nft_builder", + category: "NFT", + milestones: 8, + completedMilestones: 5, + }, + { + id: "proj-3", + title: "Cross-Chain Bridge Protocol", + description: + "Secure bridge protocol enabling asset transfers between Stellar and other major blockchains.", + tags: ["DeFi", "Smart Contracts", "Security", "Infrastructure"], + status: "active", + createdAt: "2024-01-05T00:00:00Z", + updatedAt: "2024-01-18T00:00:00Z", + creator: "bridge_team", + category: "Infrastructure", + milestones: 6, + completedMilestones: 2, + }, + { + id: "proj-4", + title: "Stellar Mobile Wallet", + description: + "User-friendly mobile wallet for Stellar assets with built-in DEX integration and staking features.", + tags: ["Mobile", "Frontend", "Web3", "Stellar"], + status: "active", + createdAt: "2023-12-20T00:00:00Z", + updatedAt: "2024-01-21T00:00:00Z", + creator: "mobile_dev", + category: "Wallet", + milestones: 10, + completedMilestones: 8, + }, + { + id: "proj-5", + title: "DAO Governance Platform", + description: + "Decentralized governance platform for DAOs on Stellar with voting mechanisms and proposal management.", + tags: ["Smart Contracts", "Frontend", "Backend", "Web3"], + status: "completed", + createdAt: "2023-11-01T00:00:00Z", + updatedAt: "2023-12-15T00:00:00Z", + creator: "dao_builders", + category: "Governance", + milestones: 4, + completedMilestones: 4, + }, + { + id: "proj-6", + title: "Stellar Analytics Engine", + description: + "Advanced analytics engine for Stellar blockchain data with customizable dashboards and alerts.", + tags: ["Analytics", "Backend", "Infrastructure", "Stellar"], + status: "active", + createdAt: "2024-01-12T00:00:00Z", + updatedAt: "2024-01-19T00:00:00Z", + creator: "analytics_pro", + category: "Analytics", + milestones: 7, + completedMilestones: 4, + }, + { + id: "proj-7", + title: "Smart Contract Testing Suite", + description: + "Comprehensive testing framework for Stellar smart contracts with automated security audits.", + tags: ["Testing", "Security", "Smart Contracts", "Infrastructure"], + status: "paused", + createdAt: "2023-12-01T00:00:00Z", + updatedAt: "2024-01-10T00:00:00Z", + creator: "test_master", + category: "Development Tools", + milestones: 5, + completedMilestones: 2, + }, + { + id: "proj-8", + title: "Decentralized Identity System", + description: + "Self-sovereign identity solution on Stellar for secure credential management and verification.", + tags: ["Security", "Smart Contracts", "Backend", "Web3"], + status: "active", + createdAt: "2024-01-08T00:00:00Z", + updatedAt: "2024-01-22T00:00:00Z", + creator: "identity_dev", + category: "Identity", + milestones: 6, + completedMilestones: 3, + }, + { + id: "proj-9", + title: "Stellar Documentation Hub", + description: + "Comprehensive documentation platform with interactive tutorials and code examples for Stellar developers.", + tags: ["Documentation", "Frontend", "Design"], + status: "completed", + createdAt: "2023-10-15T00:00:00Z", + updatedAt: "2023-12-01T00:00:00Z", + creator: "docs_team", + category: "Education", + milestones: 3, + completedMilestones: 3, + }, + { + id: "proj-10", + title: "Yield Aggregator Protocol", + description: + "Automated yield optimization protocol that finds the best returns across Stellar DeFi platforms.", + tags: ["DeFi", "Smart Contracts", "Backend", "Analytics"], + status: "active", + createdAt: "2024-01-14T00:00:00Z", + updatedAt: "2024-01-21T00:00:00Z", + creator: "yield_hunter", + category: "DeFi", + milestones: 8, + completedMilestones: 4, + }, +]; diff --git a/lib/mock/wallet.ts b/lib/mock/wallet.ts new file mode 100644 index 00000000..3a8f6510 --- /dev/null +++ b/lib/mock/wallet.ts @@ -0,0 +1,90 @@ +import { WalletInfo } from "@/types/wallet"; + +export function makeMockWalletInfo( + overrides: Partial = {}, +): WalletInfo { + return { + address: "GC64SVY3XSYEE7MYADTEQNO3ACCWJ6NLWNNJLPO2FGS4I2PCNBPVNZOP", + displayName: "Mock Wallet", + balance: 0, + balanceCurrency: "USD", + assets: [], + recentActivity: [], + has2FA: false, + isConnected: true, + ...overrides, + } as WalletInfo; +} + +// Mock Stellar wallet with proper address format +export const mockWalletInfo: WalletInfo = { + address: "GC64SVY3XSYEE7MYADTEQNO3ACCWJ6NLWNNJLPO2FGS4I2PCNBPVNZOP", + displayName: "John Doe", + balance: 0, + balanceCurrency: "USD", + assets: [], + recentActivity: [], + has2FA: false, + isConnected: true, +}; + +// Example with assets and activity (for testing populated states) +export const mockWalletWithAssets: WalletInfo = { + address: "GC64SVY3XSYEE7MYADTEQNO3ACCWJ6NLWNNJLPO2FGS4I2PCNBPVNZOP", + displayName: "Jane Smith", + balance: 1250.5, + balanceCurrency: "USD", + assets: [ + { + id: "1", + tokenSymbol: "XLM", + tokenName: "Stellar Lumens", + amount: 5000, + usdValue: 625.0, + }, + { + id: "2", + tokenSymbol: "USDC", + tokenName: "USD Coin", + amount: 625.5, + usdValue: 625.5, + }, + ], + recentActivity: [ + { + id: "1", + type: "earning", + amount: 500, + currency: "USDC", + date: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(), + status: "completed", + description: "Bounty reward - Feature Implementation", + }, + { + id: "2", + type: "earning", + amount: 250, + currency: "XLM", + date: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString(), + status: "completed", + description: "Bounty reward - Bug Fix", + }, + { + id: "3", + type: "withdrawal", + amount: 100, + currency: "USDC", + date: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + status: "completed", + description: "Withdrawal to external wallet", + }, + ], + has2FA: true, + isConnected: true, +}; + +// Helper to truncate Stellar address +export function truncateStellarAddress(address: string): string { + if (address.length <= 8) return address; + return `${address.slice(0, 4)}...${address.slice(-4)}`; +} diff --git a/lib/services/withdrawal.ts b/lib/services/withdrawal.ts index 5958bb90..ecfc3afe 100644 --- a/lib/services/withdrawal.ts +++ b/lib/services/withdrawal.ts @@ -1,101 +1,117 @@ -import { WithdrawalRequest, WithdrawalValidationResult } from "@/types/withdrawal"; +import { + WithdrawalRequest, + WithdrawalValidationResult, +} from "@/types/withdrawal"; import { ComplianceService } from "./compliance"; import { TermsService } from "./terms"; import { GeoRestrictionService } from "./geo-restriction"; -import { mockWalletWithAssets } from "@/lib/mock-wallet"; +import { mockWalletWithAssets } from "@/lib/mock"; const MOCK_WITHDRAWALS: Record = {}; export class WithdrawalService { - static async validate(userId: string, amount: number, ip: string): Promise { - const result: WithdrawalValidationResult = { - valid: true, - errors: [], - warnings: [], - blockers: {}, - }; - - // Check balance - if (amount > mockWalletWithAssets.balance) { - result.valid = false; - result.errors.push('Insufficient balance'); - result.blockers.insufficientBalance = true; - } - - // Check limits - const compliance = await ComplianceService.getUserCompliance(userId); - const limitCheck = await ComplianceService.validateWithdrawalAmount(userId, amount); - - if (!limitCheck.valid) { - result.valid = false; - result.errors.push(`Exceeds ${limitCheck.exceededLimit} limit`); - result.blockers.exceedsLimit = true; - result.blockers.limitType = limitCheck.exceededLimit; - } - - // Check hold state - if (compliance.holdState !== 'NONE') { - result.valid = false; - result.errors.push(`Account is ${compliance.holdState.toLowerCase()}`); - result.blockers.complianceHold = true; - } - - // Check terms - const termsStatus = await TermsService.getUserTermsStatus(userId); - if (termsStatus.requiresAcceptance) { - result.valid = false; - result.errors.push('Terms must be accepted'); - result.blockers.termsNotAccepted = true; - } - - // Check location - const location = await GeoRestrictionService.checkLocation(ip); - if (location.isRestricted) { - result.valid = false; - result.errors.push('Withdrawals not available in your region'); - result.blockers.restrictedJurisdiction = true; - } - - return result; + static async validate( + userId: string, + amount: number, + ip: string, + ): Promise { + const result: WithdrawalValidationResult = { + valid: true, + errors: [], + warnings: [], + blockers: {}, + }; + + // Check balance + if (amount > mockWalletWithAssets.balance) { + result.valid = false; + result.errors.push("Insufficient balance"); + result.blockers.insufficientBalance = true; } - static async submit(userId: string, amount: number, currency: string, destinationId: string, ip: string): Promise { - const validation = await this.validate(userId, amount, ip); - if (!validation.valid) { - throw new Error(validation.errors[0] || 'Withdrawal validation failed'); - } - - const compliance = await ComplianceService.getUserCompliance(userId); - - const withdrawal: WithdrawalRequest = { - id: `wd-${Date.now()}`, - userId, - amount, - currency, - destinationId, - fee: 2.50, - netAmount: amount - 2.50, - status: 'PENDING', - compliance: { - tierAtSubmission: compliance.currentTier, - limitsChecked: true, - termsAccepted: true, - geoCheckPassed: true, - }, - createdAt: new Date().toISOString(), - }; - - if (!MOCK_WITHDRAWALS[userId]) { - MOCK_WITHDRAWALS[userId] = []; - } - MOCK_WITHDRAWALS[userId].push(withdrawal); - - await ComplianceService.trackWithdrawal(userId, amount); - - return withdrawal; + // Check limits + const compliance = await ComplianceService.getUserCompliance(userId); + const limitCheck = await ComplianceService.validateWithdrawalAmount( + userId, + amount, + ); + + if (!limitCheck.valid) { + result.valid = false; + result.errors.push(`Exceeds ${limitCheck.exceededLimit} limit`); + result.blockers.exceedsLimit = true; + result.blockers.limitType = limitCheck.exceededLimit; } - static async getHistory(userId: string): Promise { - return MOCK_WITHDRAWALS[userId] || []; + // Check hold state + if (compliance.holdState !== "NONE") { + result.valid = false; + result.errors.push(`Account is ${compliance.holdState.toLowerCase()}`); + result.blockers.complianceHold = true; } + + // Check terms + const termsStatus = await TermsService.getUserTermsStatus(userId); + if (termsStatus.requiresAcceptance) { + result.valid = false; + result.errors.push("Terms must be accepted"); + result.blockers.termsNotAccepted = true; + } + + // Check location + const location = await GeoRestrictionService.checkLocation(ip); + if (location.isRestricted) { + result.valid = false; + result.errors.push("Withdrawals not available in your region"); + result.blockers.restrictedJurisdiction = true; + } + + return result; + } + + static async submit( + userId: string, + amount: number, + currency: string, + destinationId: string, + ip: string, + ): Promise { + const validation = await this.validate(userId, amount, ip); + if (!validation.valid) { + throw new Error(validation.errors[0] || "Withdrawal validation failed"); + } + + const compliance = await ComplianceService.getUserCompliance(userId); + + const withdrawal: WithdrawalRequest = { + id: `wd-${Date.now()}`, + userId, + amount, + currency, + destinationId, + fee: 2.5, + netAmount: amount - 2.5, + status: "PENDING", + compliance: { + tierAtSubmission: compliance.currentTier, + limitsChecked: true, + termsAccepted: true, + geoCheckPassed: true, + }, + createdAt: new Date().toISOString(), + }; + + if (!MOCK_WITHDRAWALS[userId]) { + MOCK_WITHDRAWALS[userId] = []; + } + MOCK_WITHDRAWALS[userId].push(withdrawal); + + await ComplianceService.trackWithdrawal(userId, amount); + + return withdrawal; + } + + static async getHistory(userId: string): Promise { + return MOCK_WITHDRAWALS[userId] || []; + } } diff --git a/lib/store.ts b/lib/store.ts index 44c77bd6..36abc799 100644 --- a/lib/store.ts +++ b/lib/store.ts @@ -1,7 +1,12 @@ import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Bounty } from "@/types/bounty"; -import { Application, Submission, MilestoneParticipation, CompetitionParticipation } from "@/types/participation"; -import { mockBounties } from "./mock-bounty"; +import { + Application, + Submission, + MilestoneParticipation, + CompetitionParticipation, +} from "@/types/participation"; +import { mockBounties } from "./mock"; /** * @deprecated The previous globalThis-based local store is deprecated. @@ -14,11 +19,16 @@ export const localStoreKeys = { applications: ["localStore", "applications"] as const, submissions: ["localStore", "submissions"] as const, milestoneParticipations: ["localStore", "milestoneParticipations"] as const, - competitionParticipations: ["localStore", "competitionParticipations"] as const, + competitionParticipations: [ + "localStore", + "competitionParticipations", + ] as const, }; function notFoundError(entity: string, id: string) { - return new Error(`${entity} with id "${id}" was not found in the local query cache.`); + return new Error( + `${entity} with id "${id}" was not found in the local query cache.`, + ); } // --- Bounties --- @@ -34,20 +44,29 @@ export function useLocalBounties() { export function useUpdateLocalBounty() { const queryClient = useQueryClient(); return useMutation({ - mutationFn: async ({ id, updates }: { id: string; updates: Partial }) => { + mutationFn: async ({ + id, + updates, + }: { + id: string; + updates: Partial; + }) => { let updatedBounty: Bounty | null = null; - queryClient.setQueryData(localStoreKeys.bounties, (current = [...mockBounties]) => { - const index = current.findIndex((bounty) => bounty.id === id); - if (index === -1) { - return current; - } + queryClient.setQueryData( + localStoreKeys.bounties, + (current = [...mockBounties]) => { + const index = current.findIndex((bounty) => bounty.id === id); + if (index === -1) { + return current; + } - const next = [...current]; - updatedBounty = { ...next[index], ...updates }; - next[index] = updatedBounty; - return next; - }); + const next = [...current]; + updatedBounty = { ...next[index], ...updates }; + next[index] = updatedBounty; + return next; + }, + ); if (!updatedBounty) { throw notFoundError("Bounty", id); @@ -65,7 +84,8 @@ export function useLocalApplications(bountyId?: string) { queryFn: () => [] as Application[], initialData: [], staleTime: Infinity, - select: (apps) => (bountyId ? apps.filter((app) => app.bountyId === bountyId) : apps), + select: (apps) => + bountyId ? apps.filter((app) => app.bountyId === bountyId) : apps, }); } @@ -73,10 +93,10 @@ export function useAddLocalApplication() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (application: Application) => { - queryClient.setQueryData(localStoreKeys.applications, (current = []) => [ - ...current, - application, - ]); + queryClient.setQueryData( + localStoreKeys.applications, + (current = []) => [...current, application], + ); return application; }, @@ -86,20 +106,31 @@ export function useAddLocalApplication() { export function useUpdateLocalApplication() { const queryClient = useQueryClient(); return useMutation({ - mutationFn: async ({ id, updates }: { id: string; updates: Partial }) => { + mutationFn: async ({ + id, + updates, + }: { + id: string; + updates: Partial; + }) => { let updatedApplication: Application | null = null; - queryClient.setQueryData(localStoreKeys.applications, (current = []) => { - const index = current.findIndex((application) => application.id === id); - if (index === -1) { - return current; - } + queryClient.setQueryData( + localStoreKeys.applications, + (current = []) => { + const index = current.findIndex( + (application) => application.id === id, + ); + if (index === -1) { + return current; + } - const next = [...current]; - updatedApplication = { ...next[index], ...updates }; - next[index] = updatedApplication; - return next; - }); + const next = [...current]; + updatedApplication = { ...next[index], ...updates }; + next[index] = updatedApplication; + return next; + }, + ); if (!updatedApplication) { throw notFoundError("Application", id); @@ -118,7 +149,9 @@ export function useLocalSubmissions(bountyId?: string) { initialData: [], staleTime: Infinity, select: (submissions) => - bountyId ? submissions.filter((submission) => submission.bountyId === bountyId) : submissions, + bountyId + ? submissions.filter((submission) => submission.bountyId === bountyId) + : submissions, }); } @@ -126,10 +159,10 @@ export function useAddLocalSubmission() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (submission: Submission) => { - queryClient.setQueryData(localStoreKeys.submissions, (current = []) => [ - ...current, - submission, - ]); + queryClient.setQueryData( + localStoreKeys.submissions, + (current = []) => [...current, submission], + ); return submission; }, @@ -139,20 +172,29 @@ export function useAddLocalSubmission() { export function useUpdateLocalSubmission() { const queryClient = useQueryClient(); return useMutation({ - mutationFn: async ({ id, updates }: { id: string; updates: Partial }) => { + mutationFn: async ({ + id, + updates, + }: { + id: string; + updates: Partial; + }) => { let updatedSubmission: Submission | null = null; - queryClient.setQueryData(localStoreKeys.submissions, (current = []) => { - const index = current.findIndex((submission) => submission.id === id); - if (index === -1) { - return current; - } + queryClient.setQueryData( + localStoreKeys.submissions, + (current = []) => { + const index = current.findIndex((submission) => submission.id === id); + if (index === -1) { + return current; + } - const next = [...current]; - updatedSubmission = { ...next[index], ...updates }; - next[index] = updatedSubmission; - return next; - }); + const next = [...current]; + updatedSubmission = { ...next[index], ...updates }; + next[index] = updatedSubmission; + return next; + }, + ); if (!updatedSubmission) { throw notFoundError("Submission", id); @@ -172,7 +214,9 @@ export function useLocalMilestoneParticipations(bountyId?: string) { staleTime: Infinity, select: (participations) => bountyId - ? participations.filter((participation) => participation.bountyId === bountyId) + ? participations.filter( + (participation) => participation.bountyId === bountyId, + ) : participations, }); } @@ -206,7 +250,9 @@ export function useUpdateLocalMilestoneParticipation() { queryClient.setQueryData( localStoreKeys.milestoneParticipations, (current = []) => { - const index = current.findIndex((participation) => participation.id === id); + const index = current.findIndex( + (participation) => participation.id === id, + ); if (index === -1) { return current; } @@ -236,7 +282,9 @@ export function useLocalCompetitionParticipations(bountyId?: string) { staleTime: Infinity, select: (participations) => bountyId - ? participations.filter((participation) => participation.bountyId === bountyId) + ? participations.filter( + (participation) => participation.bountyId === bountyId, + ) : participations, }); } diff --git a/package.json b/package.json index 126abc4f..e40698ed 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "@graphql-codegen/typescript-operations": "^5.0.8", "@graphql-codegen/typescript-react-query": "^7.0.0", "@graphql-typed-document-node/core": "^3.2.0", + "@jest/globals": "^30.4.1", "@next/swc-wasm-nodejs": "^16.1.6", "@playwright/test": "^1.59.1", "@tailwindcss/postcss": "^4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 953a904f..fca0459f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@creit-tech/stellar-wallets-kit': specifier: npm:@creit.tech/stellar-wallets-kit@^2.0.1 - version: '@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6)' + version: '@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6)' '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.71.1(react@19.2.3)) @@ -139,7 +139,7 @@ importers: version: 2.12.6(graphql@16.12.0) graphql-ws: specifier: ^6.0.7 - version: 6.0.7(crossws@0.3.5)(graphql@16.12.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + version: 6.0.7(crossws@0.3.5)(graphql@16.12.0)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -184,7 +184,7 @@ importers: version: 4.0.1 smart-account-kit: specifier: ^0.2.10 - version: 0.2.10(@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6))(@stellar/stellar-sdk@14.6.1) + version: 0.2.10(@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6))(@stellar/stellar-sdk@14.6.1) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -213,6 +213,9 @@ importers: '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.12.0) + '@jest/globals': + specifier: ^30.4.1 + version: 30.4.1 '@next/swc-wasm-nodejs': specifier: ^16.1.6 version: 16.1.6 @@ -1161,89 +1164,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1431,6 +1450,10 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.4.0': + resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.2.0': resolution: {integrity: sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1445,18 +1468,34 @@ packages: resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@30.4.1': + resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.2.0': resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.4.1': + resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@30.2.0': resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@30.4.1': + resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.2.0': resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.4.1': + resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1465,10 +1504,18 @@ packages: resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/globals@30.4.1': + resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.4.0': + resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/reporters@30.2.0': resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1482,10 +1529,18 @@ packages: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@30.4.1': + resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.2.0': resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.4.1': + resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1502,10 +1557,18 @@ packages: resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@30.4.1': + resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.2.0': resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.4.1': + resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1633,24 +1696,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.6': resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.6': resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.6': resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-wasm-nodejs@16.1.6': resolution: {integrity: sha512-U9Qpc9JefEXb1ykflZoYdFskAfVemCHNzTwKoG7nyRnO0DMmvitsoQwYl9JCcFVU2tR8MGmJu5cs4jVMiyOEPQ==} @@ -2645,66 +2712,79 @@ packages: resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.57.1': resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.57.1': resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.57.1': resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.57.1': resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.57.1': resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.57.1': resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.57.1': resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.57.1': resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.57.1': resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.57.1': resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.57.1': resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.57.1': resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.57.1': resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} @@ -2773,6 +2853,9 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@sinonjs/fake-timers@15.4.0': + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} + '@solana-program/compute-budget@0.8.0': resolution: {integrity: sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==} peerDependencies: @@ -3478,24 +3561,28 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.2.0': resolution: {integrity: sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.2.0': resolution: {integrity: sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.2.0': resolution: {integrity: sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.2.0': resolution: {integrity: sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==} @@ -3980,41 +4067,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -5414,6 +5509,10 @@ packages: resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + expect@30.4.1: + resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} @@ -6169,6 +6268,10 @@ packages: resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-diff@30.4.1: + resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-docblock@30.2.0: resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6194,6 +6297,10 @@ packages: resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-haste-map@30.4.1: + resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@30.2.0: resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6202,14 +6309,26 @@ packages: resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.4.1: + resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.2.0: resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.4.1: + resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.2.0: resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.4.1: + resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -6223,6 +6342,10 @@ packages: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-regex-util@30.4.0: + resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve-dependencies@30.2.0: resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6243,10 +6366,18 @@ packages: resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-snapshot@30.4.1: + resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.2.0: resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@30.4.1: + resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@30.2.0: resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6259,6 +6390,10 @@ packages: resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@30.4.1: + resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest@30.2.0: resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6412,24 +6547,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} @@ -7192,6 +7331,10 @@ packages: resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.4.1: + resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7289,6 +7432,9 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.2.6: + resolution: {integrity: sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==} + react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: @@ -8877,7 +9023,7 @@ snapshots: - utf-8-validate optional: true - '@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6)': + '@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6)': dependencies: '@albedo-link/intent': 0.12.0 '@creit.tech/xbull-wallet-connect': 0.4.0 @@ -8890,8 +9036,8 @@ snapshots: '@reown/appkit': 1.8.19(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(zod@4.3.6) '@stellar/freighter-api': 6.0.0 '@stellar/stellar-base': 14.0.1 - '@trezor/connect-plugin-stellar': 9.2.6(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(tslib@2.8.1) - '@trezor/connect-web': 9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/connect-plugin-stellar': 9.2.6(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(tslib@2.8.1) + '@trezor/connect-web': 9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@twind/core': 1.1.3(typescript@5.9.3) '@twind/preset-autoprefix': 1.0.7(@twind/core@1.1.3(typescript@5.9.3))(typescript@5.9.3) '@twind/preset-tailwind': 1.1.4(@twind/core@1.1.3(typescript@5.9.3))(typescript@5.9.3) @@ -9997,6 +10143,8 @@ snapshots: '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.4.0': {} + '@jest/environment-jsdom-abstract@30.2.0(jsdom@26.1.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@jest/environment': 30.2.0 @@ -10015,10 +10163,21 @@ snapshots: '@types/node': 20.19.33 jest-mock: 30.2.0 + '@jest/environment@30.4.1': + dependencies: + '@jest/fake-timers': 30.4.1 + '@jest/types': 30.4.1 + '@types/node': 20.19.33 + jest-mock: 30.4.1 + '@jest/expect-utils@30.2.0': dependencies: '@jest/get-type': 30.1.0 + '@jest/expect-utils@30.4.1': + dependencies: + '@jest/get-type': 30.1.0 + '@jest/expect@30.2.0': dependencies: expect: 30.2.0 @@ -10026,6 +10185,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/expect@30.4.1': + dependencies: + expect: 30.4.1 + jest-snapshot: 30.4.1 + transitivePeerDependencies: + - supports-color + '@jest/fake-timers@30.2.0': dependencies: '@jest/types': 30.2.0 @@ -10035,6 +10201,15 @@ snapshots: jest-mock: 30.2.0 jest-util: 30.2.0 + '@jest/fake-timers@30.4.1': + dependencies: + '@jest/types': 30.4.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 20.19.33 + jest-message-util: 30.4.1 + jest-mock: 30.4.1 + jest-util: 30.4.1 + '@jest/get-type@30.1.0': {} '@jest/globals@30.2.0': @@ -10046,11 +10221,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/globals@30.4.1': + dependencies: + '@jest/environment': 30.4.1 + '@jest/expect': 30.4.1 + '@jest/types': 30.4.1 + jest-mock: 30.4.1 + transitivePeerDependencies: + - supports-color + '@jest/pattern@30.0.1': dependencies: '@types/node': 20.19.33 jest-regex-util: 30.0.1 + '@jest/pattern@30.4.0': + dependencies: + '@types/node': 20.19.33 + jest-regex-util: 30.4.0 + '@jest/reporters@30.2.0': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -10083,6 +10272,10 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.48 + '@jest/schemas@30.4.1': + dependencies: + '@sinclair/typebox': 0.34.48 + '@jest/snapshot-utils@30.2.0': dependencies: '@jest/types': 30.2.0 @@ -10090,6 +10283,13 @@ snapshots: graceful-fs: 4.2.11 natural-compare: 1.4.0 + '@jest/snapshot-utils@30.4.1': + dependencies: + '@jest/types': 30.4.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + '@jest/source-map@30.0.1': dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -10130,6 +10330,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/transform@30.4.1': + dependencies: + '@babel/core': 7.29.0 + '@jest/types': 30.4.1 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.4.1 + jest-regex-util: 30.4.0 + jest-util: 30.4.1 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + '@jest/types@30.2.0': dependencies: '@jest/pattern': 30.0.1 @@ -10140,6 +10359,16 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 + '@jest/types@30.4.1': + dependencies: + '@jest/pattern': 30.4.0 + '@jest/schemas': 30.4.1 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.33 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -11684,31 +11913,35 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + '@sinonjs/fake-timers@15.4.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - '@solana-program/stake@0.2.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + '@solana-program/stake@0.2.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) optional: true - '@solana-program/system@0.7.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + '@solana-program/system@0.7.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana/sysvars': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: @@ -11940,7 +12173,7 @@ snapshots: - fastestsmallesttextencoderdecoder optional: true - '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -11953,11 +12186,11 @@ snapshots: '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.3) '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/signers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) typescript: 5.9.3 @@ -12170,14 +12403,14 @@ snapshots: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@solana/errors': 2.3.0(typescript@5.9.3) '@solana/functional': 2.3.0(typescript@5.9.3) '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) '@solana/subscribable': 2.3.0(typescript@5.9.3) typescript: 5.9.3 - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: @@ -12211,7 +12444,7 @@ snapshots: typescript: 5.9.3 optional: true - '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@solana/errors': 2.3.0(typescript@5.9.3) '@solana/fast-stable-stringify': 2.3.0(typescript@5.9.3) @@ -12219,7 +12452,7 @@ snapshots: '@solana/promises': 2.3.0(typescript@5.9.3) '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) '@solana/rpc-subscriptions-api': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 2.3.0(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-subscriptions-channel-websocket': 2.3.0(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -12413,7 +12646,7 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -12421,7 +12654,7 @@ snapshots: '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/promises': 2.3.0(typescript@5.9.3) '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -12789,13 +13022,13 @@ snapshots: - react-native - utf-8-validate - '@trezor/blockchain-link@2.6.1(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@trezor/blockchain-link@2.6.1(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: - '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))) - '@solana-program/stake': 0.2.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))) - '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))) - '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/stake': 0.2.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@stellar/stellar-sdk': 14.2.0 '@trezor/blockchain-link-types': 1.5.0(tslib@2.8.1) @@ -12843,16 +13076,16 @@ snapshots: - expo-localization - react-native - '@trezor/connect-plugin-stellar@9.2.6(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(tslib@2.8.1)': + '@trezor/connect-plugin-stellar@9.2.6(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(tslib@2.8.1)': dependencies: '@stellar/stellar-sdk': 14.6.1 - '@trezor/connect': 9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/connect': 9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@trezor/utils': 9.5.0(tslib@2.8.1) tslib: 2.8.1 - '@trezor/connect-web@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@trezor/connect-web@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: - '@trezor/connect': 9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/connect': 9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@trezor/connect-common': 0.5.1(tslib@2.8.1) '@trezor/utils': 9.5.0(tslib@2.8.1) '@trezor/websocket-client': 1.3.0(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6) @@ -12871,7 +13104,7 @@ snapshots: - utf-8-validate - ws - '@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@ethereumjs/common': 10.1.1 '@ethereumjs/tx': 10.1.1 @@ -12879,12 +13112,12 @@ snapshots: '@mobily/ts-belt': 3.13.1 '@noble/hashes': 1.8.0 '@scure/bip39': 1.6.0 - '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))) - '@solana-program/system': 0.7.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))) - '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))) - '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - '@trezor/blockchain-link': 2.6.1(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/system': 0.7.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/blockchain-link': 2.6.1(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@trezor/blockchain-link-types': 1.5.1(tslib@2.8.1) '@trezor/blockchain-link-utils': 1.5.2(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6) '@trezor/connect-analytics': 1.4.0(tslib@2.8.1) @@ -15328,6 +15561,15 @@ snapshots: jest-mock: 30.2.0 jest-util: 30.2.0 + expect@30.4.1: + dependencies: + '@jest/expect-utils': 30.4.1 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.4.1 + jest-message-util: 30.4.1 + jest-mock: 30.4.1 + jest-util: 30.4.1 + exponential-backoff@3.1.3: {} extend@3.0.2: {} @@ -15622,13 +15864,6 @@ snapshots: graphql: 16.12.0 tslib: 2.8.1 - graphql-ws@6.0.7(crossws@0.3.5)(graphql@16.12.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)): - dependencies: - graphql: 16.12.0 - optionalDependencies: - crossws: 0.3.5 - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) - graphql-ws@6.0.7(crossws@0.3.5)(graphql@16.12.0)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)): dependencies: graphql: 16.12.0 @@ -16199,6 +16434,13 @@ snapshots: chalk: 4.1.2 pretty-format: 30.2.0 + jest-diff@30.4.1: + dependencies: + '@jest/diff-sequences': 30.4.0 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.4.1 + jest-docblock@30.2.0: dependencies: detect-newline: 3.1.0 @@ -16248,6 +16490,21 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + jest-haste-map@30.4.1: + dependencies: + '@jest/types': 30.4.1 + '@types/node': 20.19.33 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.4.0 + jest-util: 30.4.1 + jest-worker: 30.4.1 + picomatch: 4.0.3 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + jest-leak-detector@30.2.0: dependencies: '@jest/get-type': 30.1.0 @@ -16260,6 +16517,13 @@ snapshots: jest-diff: 30.2.0 pretty-format: 30.2.0 + jest-matcher-utils@30.4.1: + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.4.1 + pretty-format: 30.4.1 + jest-message-util@30.2.0: dependencies: '@babel/code-frame': 7.29.0 @@ -16272,18 +16536,39 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.4.1: + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 30.4.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.4.1 + picomatch: 4.0.3 + pretty-format: 30.4.1 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 '@types/node': 20.19.33 jest-util: 30.2.0 + jest-mock@30.4.1: + dependencies: + '@jest/types': 30.4.1 + '@types/node': 20.19.33 + jest-util: 30.4.1 + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): optionalDependencies: jest-resolve: 30.2.0 jest-regex-util@30.0.1: {} + jest-regex-util@30.4.0: {} + jest-resolve-dependencies@30.2.0: dependencies: jest-regex-util: 30.0.1 @@ -16382,6 +16667,32 @@ snapshots: transitivePeerDependencies: - supports-color + jest-snapshot@30.4.1: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 + '@jest/expect-utils': 30.4.1 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.4.1 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + chalk: 4.1.2 + expect: 30.4.1 + graceful-fs: 4.2.11 + jest-diff: 30.4.1 + jest-matcher-utils: 30.4.1 + jest-message-util: 30.4.1 + jest-util: 30.4.1 + pretty-format: 30.4.1 + semver: 7.7.4 + synckit: 0.11.12 + transitivePeerDependencies: + - supports-color + jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 @@ -16391,6 +16702,15 @@ snapshots: graceful-fs: 4.2.11 picomatch: 4.0.3 + jest-util@30.4.1: + dependencies: + '@jest/types': 30.4.1 + '@types/node': 20.19.33 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + jest-validate@30.2.0: dependencies: '@jest/get-type': 30.1.0 @@ -16419,6 +16739,14 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest-worker@30.4.1: + dependencies: + '@types/node': 20.19.33 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.4.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest@30.2.0(@types/node@20.19.33)(ts-node@10.9.2(@types/node@20.19.33)(typescript@5.9.3)): dependencies: '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@20.19.33)(typescript@5.9.3)) @@ -17610,6 +17938,13 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.4.1: + dependencies: + '@jest/schemas': 30.4.1 + ansi-styles: 5.2.0 + react-is-18: react-is@18.3.1 + react-is-19: react-is@19.2.6 + process-nextick-args@2.0.1: {} process-warning@5.0.0: {} @@ -17769,6 +18104,8 @@ snapshots: react-is@18.3.1: {} + react-is@19.2.6: {} + react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.3): dependencies: '@types/hast': 3.0.4 @@ -18256,14 +18593,14 @@ snapshots: '@stellar/stellar-sdk': 14.6.1 buffer: 6.0.3 - smart-account-kit@0.2.10(@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6))(@stellar/stellar-sdk@14.6.1): + smart-account-kit@0.2.10(@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6))(@stellar/stellar-sdk@14.6.1): dependencies: '@simplewebauthn/browser': 13.3.0 '@stellar/stellar-sdk': 14.6.1 base64url: 3.0.1 smart-account-kit-bindings: 0.1.2(@stellar/stellar-sdk@14.6.1) optionalDependencies: - '@creit-tech/stellar-wallets-kit': '@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6)' + '@creit-tech/stellar-wallets-kit': '@creit.tech/stellar-wallets-kit@2.1.0(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@stellar/stellar-sdk@14.6.1)(@trezor/connect@9.7.2(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(near-api-js@5.1.1)(react@19.2.3)(tslib@2.8.1)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.3))(utf-8-validate@6.0.6)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@4.3.6)' smart-buffer@4.2.0: {}