diff --git a/components/project-details/project-layout.tsx b/components/project-details/project-layout.tsx
index d00602749..8bf6fdc3d 100644
--- a/components/project-details/project-layout.tsx
+++ b/components/project-details/project-layout.tsx
@@ -14,7 +14,8 @@ import ProjectVoters from './project-voters';
import ProjectBackers from './project-backers';
import { ProjectSidebar } from './project-sidebar';
import { cn } from '@/lib/utils';
-import { Crowdfunding, CrowdfundingProject } from '@/types/project';
+import { Crowdfunding, CrowdfundingProject } from '@/features/projects/types';
+import { getProjectStatus } from './project-sidebar/utils';
export function ProjectLayout({
project,
@@ -34,6 +35,36 @@ export function ProjectLayout({
const [isLeftScrollable, setIsLeftScrollable] = useState(true);
const [isRightScrollable, setIsRightScrollable] = useState(true);
const tabsListRef = useRef(null);
+ const projectStatus = getProjectStatus(project, crowdfund);
+
+ const getVisibleTabs = () => {
+ const baseTabs = [
+ { value: 'details', label: 'Details' },
+ { value: 'team', label: 'Team' },
+ { value: 'milestones', label: 'Milestones' },
+ { value: 'comments', label: 'Comments' },
+ ];
+
+ if (isMobile) {
+ baseTabs.unshift({ value: 'about', label: 'About' });
+ }
+
+ if (projectStatus === 'Validation') {
+ baseTabs.splice(4, 0, { value: 'voters', label: 'Voters' });
+ } else if (projectStatus === 'Funding') {
+ baseTabs.splice(4, 0, { value: 'voters', label: 'Voters' });
+ baseTabs.splice(5, 0, { value: 'backers', label: 'Backers' });
+ } else {
+ // Funded, Completed, etc.
+ baseTabs.splice(4, 0, { value: 'voters', label: 'Voters' });
+ baseTabs.splice(5, 0, { value: 'backers', label: 'Backers' });
+ }
+
+ return baseTabs;
+ };
+
+ const visibleTabs = getVisibleTabs();
+
const handleScroll = () => {
if (tabsListRef.current) {
const { scrollLeft, scrollWidth, clientWidth } = tabsListRef.current;
@@ -96,10 +127,10 @@ export function ProjectLayout({
if (isMobile) {
return (
-
+
{/* Mobile Header with Sidebar */}
-
+
{/* Enhanced Tab Navigation */}
-
+
)}
- {[
- { value: 'about', label: 'About' },
- { value: 'details', label: 'Details' },
- { value: 'team', label: 'Team' },
- { value: 'milestones', label: 'Milestones' },
- { value: 'voters', label: 'Voters' },
- { value: 'comments', label: 'Comments' },
- ]
- .filter(tab => !hiddenTabs.includes(tab.value))
- .map(tab => (
-
- {tab.label}
-
- ))}
+ {visibleTabs.map(tab => (
+
+ {tab.label}
+
+ ))}
@@ -197,12 +219,12 @@ export function ProjectLayout({
}
return (
-
+
{/* Sidebar - Sticky */}
-
+
{/* Enhanced Tab Navigation */}
-
+
- {[
- { value: 'details', label: 'Details' },
- { value: 'team', label: 'Team' },
- { value: 'milestones', label: 'Milestones' },
- { value: 'voters', label: 'Voters' },
- { value: 'backers', label: 'Backers' },
- { value: 'comments', label: 'Comments' },
- ]
- .filter(tab => !hiddenTabs.includes(tab.value))
- .map(tab => (
-
- {tab.label}
-
- ))}
+ {visibleTabs.map(tab => (
+
+ {tab.label}
+
+ ))}
diff --git a/components/project-details/project-milestone/index.tsx b/components/project-details/project-milestone/index.tsx
index e9ca51897..900ea8649 100644
--- a/components/project-details/project-milestone/index.tsx
+++ b/components/project-details/project-milestone/index.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useMemo } from 'react';
+import React, { useState, useMemo, useEffect } from 'react';
import { Timeline, TimelineItemType } from '@/components/ui/timeline';
import {
DropdownMenu,
@@ -11,7 +11,9 @@ import { ListFilter } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Status } from './milestone-card';
import EmptyState from '@/components/EmptyState';
-import { Crowdfunding } from '@/types/project';
+import { Crowdfunding, Milestone } from '@/features/projects/types';
+import Link from 'next/link';
+import { getCrowdfundingMilestones } from '@/features/projects/api';
const filterOptions = [
{ value: 'all', label: 'All Milestones', count: 0 },
@@ -30,23 +32,32 @@ interface ProjectMilestoneProps {
const ProjectMilestone = ({ crowdfund }: ProjectMilestoneProps) => {
const [selectedFilter, setSelectedFilter] = useState
('all');
+ const [fetchedMilestones, setFetchedMilestones] = useState([]);
+ const [loading, setLoading] = useState(true);
+ useEffect(() => {
+ const fetchMilestones = async () => {
+ try {
+ setLoading(true);
+ const data = await getCrowdfundingMilestones(crowdfund.slug);
+ setFetchedMilestones(data || []);
+ } catch {
+ // Failed to fetch milestones
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ if (crowdfund.slug) {
+ fetchMilestones();
+ }
+ }, [crowdfund.slug]);
const milestones: TimelineItemType[] = useMemo(() => {
- if (!crowdfund.milestones || crowdfund.milestones.length === 0) {
+ if (!fetchedMilestones || fetchedMilestones.length === 0) {
return [];
}
- const totalAmount = crowdfund.milestones.reduce(
- (sum, milestone) => sum + milestone.amount,
- 0
- );
-
- return crowdfund.milestones.map(milestone => {
- const percentage =
- totalAmount > 0
- ? Math.round((milestone.amount / totalAmount) * 100)
- : 0;
-
+ return fetchedMilestones.map((milestone, index) => {
let dueDate = 'TBD';
try {
if (milestone.endDate) {
@@ -60,8 +71,8 @@ const ProjectMilestone = ({ crowdfund }: ProjectMilestoneProps) => {
// Invalid date format, use TBD
}
- const mapStatus = (status: string): Status => {
- const normalizedStatus = status.toLowerCase();
+ const mapStatus = (status?: string): Status => {
+ const normalizedStatus = (status || 'pending').toLowerCase();
switch (normalizedStatus) {
case 'completed':
@@ -89,22 +100,22 @@ const ProjectMilestone = ({ crowdfund }: ProjectMilestoneProps) => {
}
};
- const mappedStatus = mapStatus(milestone.status);
+ const mappedStatus = mapStatus(milestone.reviewStatus);
return {
- id: milestone.name,
- title: milestone.name,
+ id: milestone.id || `milestone-${index}`,
+ title: milestone.title,
description: milestone.description,
dueDate,
amount: milestone.amount,
- percentage,
+ percentage: milestone.fundingPercentage,
status: mappedStatus,
- ...(milestone.status === 'in-review' && { feedbackDays: 3 }),
- ...(milestone.status === 'rejected' && { deadline: dueDate }),
- ...(milestone.status === 'approved' && { isUnlocked: true }),
+ ...(milestone.reviewStatus === 'in-review' && { feedbackDays: 3 }),
+ ...(milestone.reviewStatus === 'rejected' && { deadline: dueDate }),
+ ...(milestone.reviewStatus === 'approved' && { isUnlocked: true }),
};
});
- }, [crowdfund.milestones]);
+ }, [fetchedMilestones]);
const filterOptionsWithCounts = useMemo(() => {
return filterOptions.map(option => {
@@ -129,6 +140,14 @@ const ProjectMilestone = ({ crowdfund }: ProjectMilestoneProps) => {
filterOptionsWithCounts.find(option => option.value === selectedFilter)
?.label || 'All Milestones';
+ if (loading) {
+ return (
+
+ );
+ }
+
return (
@@ -169,6 +188,11 @@ const ProjectMilestone = ({ crowdfund }: ProjectMilestoneProps) => {
+
+
+
{
showConnector={true}
variant='default'
className='w-full'
- projectId={crowdfund.project.id}
+ projectSlug={crowdfund.slug}
/>
{filteredMilestones.length === 0 && (
diff --git a/components/project-details/project-milestone/milestone-details/MilestoneDetails.tsx b/components/project-details/project-milestone/milestone-details/MilestoneDetails.tsx
index 00e128b74..265756c3e 100644
--- a/components/project-details/project-milestone/milestone-details/MilestoneDetails.tsx
+++ b/components/project-details/project-milestone/milestone-details/MilestoneDetails.tsx
@@ -3,11 +3,11 @@
import React from 'react';
import { Card, CardContent } from '@/components/ui/card';
import { useMarkdown } from '@/hooks/use-markdown';
-import { CrowdfundingProject } from '@/types/project';
+import { Crowdfunding } from '@/features/projects/types';
interface MilestoneDetailsProps {
milestoneId: string;
- project?: CrowdfundingProject | null;
+ project?: Crowdfunding | null;
milestone?: {
_id: string;
title: string;
@@ -33,11 +33,6 @@ const MilestoneDetails = ({
amount: 0,
};
- // Get project links from project data
- const projectLinks = project?.socialLinks || [];
- const projectWebsite = project?.projectWebsite;
- const githubUrl = project?.githubUrl;
-
const { loading, error, styledContent } = useMarkdown(
milestoneData.description || 'No description available.',
{
@@ -67,7 +62,7 @@ const MilestoneDetails = ({
{/* Video Media Showcase */}
- {project?.demoVideo && (
+ {project?.project.demoVideo && (
Media Showcase
@@ -82,7 +77,10 @@ const MilestoneDetails = ({
className='h-full w-full rounded-lg object-cover'
controls
>
-
+
Your browser does not support the video tag.
@@ -97,13 +95,13 @@ const MilestoneDetails = ({
)}
{/* Project Documents Section */}
- {project?.documents && (
+ {project?.project.documents && (
Project Documents
);
};
diff --git a/components/project-details/project-milestone/milestone-details/MilestoneLinks.tsx b/components/project-details/project-milestone/milestone-details/MilestoneLinks.tsx
index 3410f8608..0bb81a12c 100644
--- a/components/project-details/project-milestone/milestone-details/MilestoneLinks.tsx
+++ b/components/project-details/project-milestone/milestone-details/MilestoneLinks.tsx
@@ -2,10 +2,10 @@ import React from 'react';
import Link from 'next/link';
import { Github } from 'lucide-react';
import Image from 'next/image';
-import { CrowdfundingProject } from '@/types/project';
+import { Crowdfunding } from '@/features/projects/types';
interface MilestoneLinksProps {
- project?: CrowdfundingProject | null;
+ project?: Crowdfunding | null;
milestone?: {
_id: string;
title: string;
@@ -20,24 +20,24 @@ const MilestoneLinks = ({ project }: MilestoneLinksProps) => {
return (
- {project?.githubUrl && (
+ {project?.project.githubUrl && (
-
{project.githubUrl}
+
{project.project.githubUrl}
)}
- {project?.projectWebsite && (
+ {project?.project.projectWebsite && (
-
🌐 {project.projectWebsite}
+
🌐 {project.project.projectWebsite}
)}
{project?.socialLinks?.map((link, index) => (
@@ -51,8 +51,8 @@ const MilestoneLinks = ({ project }: MilestoneLinksProps) => {
🔗 {link.platform}: {link.url}
))}
- {!project?.githubUrl &&
- !project?.projectWebsite &&
+ {!project?.project.githubUrl &&
+ !project?.project.projectWebsite &&
(!project?.socialLinks || project.socialLinks.length === 0) && (
@@ -62,60 +62,61 @@ const MilestoneLinks = ({ project }: MilestoneLinksProps) => {
)}
{/* Project Team Section */}
- {project?.teamMembers && project.teamMembers.length > 0 && (
-
-
- Project Team
-
- {project.teamMembers.slice(0, 3).map((member, index) => (
-
-
-
-
-
+ {project?.project.teamMembers &&
+ project.project.teamMembers.length > 0 && (
+
+
+ Project Team
+
+ {project.project.teamMembers.slice(0, 3).map((member, index) => (
+
+
-
-
- {member.profile?.firstName} {member.profile?.lastName}
-
-
- {member.role}
-
+
+
+ {member.profile?.firstName} {member.profile?.lastName}
+
+
+ {member.role}
+
+
-
-
-
- ))}
-
- )}
+
+
+ ))}
+
+ )}
);
};
diff --git a/components/project-details/project-milestone/milestone-details/MilstoneOverview.tsx b/components/project-details/project-milestone/milestone-details/MilstoneOverview.tsx
index b792f4a54..be38efcaa 100644
--- a/components/project-details/project-milestone/milestone-details/MilstoneOverview.tsx
+++ b/components/project-details/project-milestone/milestone-details/MilstoneOverview.tsx
@@ -4,7 +4,7 @@ import { Separator } from '@/components/ui/separator';
import Link from 'next/link';
import { Github } from 'lucide-react';
import Image from 'next/image';
-import { CrowdfundingProject } from '@/types/project';
+import { CrowdfundingProject } from '@/features/projects/types';
interface MilstoneOverviewProps {
project?: CrowdfundingProject | null;
@@ -131,7 +131,7 @@ const MilstoneOverview = ({ project, milestone }: MilstoneOverviewProps) => {
🌐 {project.projectWebsite}
)}
- {project?.socialLinks?.map((link, index) => (
+ {/* {project?.socialLinks?.map((link, index) => (
{
>
🔗 {link.platform}: {link.url}
- ))}
+ ))} */}
diff --git a/components/project-details/project-sidebar/Discord-Symbol-Black.sDvg b/components/project-details/project-sidebar/Discord-Symbol-Black.sDvg
deleted file mode 100644
index 86bfd7729..000000000
--- a/components/project-details/project-sidebar/Discord-Symbol-Black.sDvg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/components/project-details/project-sidebar/Discord-Symbol-Blurple.ssvg b/components/project-details/project-sidebar/Discord-Symbol-Blurple.ssvg
deleted file mode 100644
index fdf7c0a26..000000000
--- a/components/project-details/project-sidebar/Discord-Symbol-Blurple.ssvg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/components/project-details/project-sidebar/ProjectSidebarActions.tsx b/components/project-details/project-sidebar/ProjectSidebarActions.tsx
index 43b677cc6..d0fac0766 100644
--- a/components/project-details/project-sidebar/ProjectSidebarActions.tsx
+++ b/components/project-details/project-sidebar/ProjectSidebarActions.tsx
@@ -12,8 +12,8 @@ import {
import { ProjectSidebarActionsProps } from './types';
import { BoundlessButton } from '@/components/buttons';
import { SharePopup } from './SharePopup';
-import { useProtectedAction } from '@/hooks/use-protected-action';
import { FollowButton } from '@/components/follow';
+import { FundingModal } from '@/components/project-details/funding-modal';
export function ProjectSidebarActions({
project,
@@ -21,13 +21,10 @@ export function ProjectSidebarActions({
isVoting,
userVote,
onVote,
+ crowdfund,
}: ProjectSidebarActionsProps) {
const [isSharePopupOpen, setIsSharePopupOpen] = useState(false);
- const { executeProtectedAction } = useProtectedAction({
- actionName: 'fund project',
- });
-
const handleShareClick = () => {
setIsSharePopupOpen(true);
};
@@ -36,10 +33,6 @@ export function ProjectSidebarActions({
setIsSharePopupOpen(false);
};
- const handleFundClick = async () => {
- await executeProtectedAction(() => {});
- };
-
return (
{projectStatus === 'Validation' && (
@@ -69,22 +62,29 @@ export function ProjectSidebarActions({
{/* Dropdown text */}
- Voting is straightforward and individualistic — it’s for everyone.
+ Voting is straightforward and individualistic — it's for everyone.
Voting power, weight, and eligibility for who can vote are currently
under implementation.
)}
- {projectStatus === 'IDEA' && (
-
}
- iconPosition='left'
+ {projectStatus === 'Funding' && (
+
- Back Project
-
+ }
+ iconPosition='left'
+ >
+ Back Project
+
+
)}
{projectStatus === 'Completed' && (
@@ -134,31 +134,6 @@ export function ProjectSidebarActions({
projectUrl={typeof window !== 'undefined' ? window.location.href : ''}
/>
-
- {/* Fund Project Modal
-
-
- */}
);
}
diff --git a/components/project-details/project-sidebar/ProjectSidebarProgress.tsx b/components/project-details/project-sidebar/ProjectSidebarProgress.tsx
index 0a212edcd..c9b069d8b 100644
--- a/components/project-details/project-sidebar/ProjectSidebarProgress.tsx
+++ b/components/project-details/project-sidebar/ProjectSidebarProgress.tsx
@@ -1,77 +1,21 @@
'use client';
-import { useState, useEffect } from 'react';
-import { Progress } from '@/components/ui/progress';
import { ProjectSidebarProgressProps } from './types';
-import { getVoteCounts } from '@/lib/api/votes';
-import { VoteEntityType } from '@/types/votes';
-import { VoteCountResponse } from '@/types/votes';
-import { useVoteRealtime } from '@/hooks/use-vote-realtime';
+import { Progress } from '@/components/ui/progress';
export function ProjectSidebarProgress({
project,
+ crowdfund,
projectStatus,
+ voteCounts,
}: ProjectSidebarProgressProps) {
- const [voteCounts, setVoteCounts] = useState(null);
-
- const projectId = project?.id;
-
- // Real-time vote updates
- useVoteRealtime(
- {
- entityType: VoteEntityType.CROWDFUNDING_CAMPAIGN,
- entityId: projectId || '',
- enabled: !!projectId,
- },
- {
- onVoteUpdated: data => {
- setVoteCounts({
- upvotes: data.voteCounts.upvotes,
- downvotes: data.voteCounts.downvotes,
- totalVotes: data.voteCounts.totalVotes,
- userVote: data.voteCounts.userVote || null,
- });
- },
- onVoteCreated: data => {
- setVoteCounts({
- upvotes: data.voteCounts.upvotes,
- downvotes: data.voteCounts.downvotes,
- totalVotes: data.voteCounts.totalVotes,
- userVote: data.voteCounts.userVote || null,
- });
- },
- onVoteDeleted: data => {
- setVoteCounts({
- upvotes: data.voteCounts.upvotes,
- downvotes: data.voteCounts.downvotes,
- totalVotes: data.voteCounts.totalVotes,
- userVote: data.voteCounts.userVote || null,
- });
- },
- }
- );
-
- useEffect(() => {
- if (!projectId) return;
+ const fundingRaised =
+ crowdfund?.fundingRaised ?? project.funding?.raised ?? 0;
+ const fundingGoal = crowdfund?.fundingGoal ?? project.funding?.goal ?? 0;
+ const voteGoal = crowdfund?.voteGoal ?? crowdfund?.thresholdVotes ?? 50;
- const fetchVoteCounts = async () => {
- try {
- const response = await getVoteCounts(
- projectId,
- VoteEntityType.CROWDFUNDING_CAMPAIGN
- );
- setVoteCounts(response);
- } catch {
- // Silently fail - voting data is not critical
- }
- };
-
- fetchVoteCounts();
- }, [projectId]);
-
- const fundingPercentage = project.funding
- ? (project.funding.raised / project.funding.goal) * 100
- : 0;
+ const fundingPercentage =
+ fundingGoal > 0 ? (fundingRaised / fundingGoal) * 100 : 0;
const milestonePercentage = project.milestones
? (project.milestones.filter(m => m.status === 'completed').length /
@@ -87,8 +31,8 @@ export function ProjectSidebarProgress({
- ${project.funding?.raised?.toLocaleString() || 0}/ $
- {project.funding?.goal?.toLocaleString() || 0}{' '}
+ ${fundingRaised.toLocaleString()}/ $
+ {fundingGoal.toLocaleString()}{' '}
Raised
@@ -98,14 +42,14 @@ export function ProjectSidebarProgress({
case 'Validation': {
const validationProgress = Math.min(
- ((voteCounts?.upvotes || 0) / 50) * 100,
+ ((voteCounts?.upvotes || 0) / voteGoal) * 100,
100
);
return (
- {voteCounts?.upvotes || 0}/50{' '}
+ {voteCounts?.upvotes || 0}/{voteGoal}{' '}
Upvotes
@@ -117,12 +61,15 @@ export function ProjectSidebarProgress({
);
}
- case 'Completed': {
+ case 'Completed':
+ case 'Funded': {
const completedMilestones =
- project.milestones?.filter(m => m.status === 'completed').length || 0;
- const totalMilestones = project.milestones?.length || 0;
+ crowdfund?.milestones?.filter(m => m.reviewStatus === 'completed')
+ .length || 0;
+ const totalMilestones = crowdfund?.milestones?.length || 0;
const rejectedMilestones =
- project.milestones?.filter(m => m.status === 'rejected').length || 0;
+ crowdfund?.milestones?.filter(m => m.reviewStatus === 'rejected')
+ .length || 0;
return (
@@ -144,17 +91,18 @@ export function ProjectSidebarProgress({
default: {
const defaultProgress = Math.min(
- ((voteCounts?.totalVotes || 0) / 50) * 100,
+ ((voteCounts?.totalVotes || 0) / voteGoal) * 100,
100
);
return (
- {voteCounts?.totalVotes || 0}/50{' '}
+ {voteCounts?.totalVotes || 0}/{voteGoal}{' '}
Votes
+
);
diff --git a/components/project-details/project-sidebar/discord-icon-svgrepo-com.ssvg b/components/project-details/project-sidebar/discord-icon-svgrepo-com.ssvg
deleted file mode 100644
index c03e8e127..000000000
--- a/components/project-details/project-sidebar/discord-icon-svgrepo-com.ssvg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/components/project-details/project-sidebar/index.tsx b/components/project-details/project-sidebar/index.tsx
index 379757a7f..c557f2d3a 100644
--- a/components/project-details/project-sidebar/index.tsx
+++ b/components/project-details/project-sidebar/index.tsx
@@ -1,16 +1,19 @@
'use client';
-import { useState } from 'react';
+import { useState, useEffect } from 'react';
import { useSearchParams } from 'next/navigation';
import { ProjectSidebarHeader } from './ProjectSidebarHeader';
import { ProjectSidebarProgress } from './ProjectSidebarProgress';
import { ProjectSidebarActions } from './ProjectSidebarActions';
import { ProjectSidebarCreator } from './ProjectSidebarCreator';
import { ProjectSidebarLinks } from './ProjectSidebarLinks';
+import { voteProject } from '@/features/projects/api';
import { createVote, deleteVote } from '@/lib/api/votes';
-import { VoteEntityType, VoteType } from '@/types/votes';
import { getProjectStatus } from './utils';
import { ProjectSidebarProps } from './types';
+import { VoteCountResponse, VoteEntityType, VoteType } from '@/types/votes';
+import { useVoteRealtime } from '@/hooks/use-vote-realtime';
+import { getVoteCounts } from '@/lib/api/votes';
export function ProjectSidebar({
project,
@@ -25,31 +28,82 @@ export function ProjectSidebar({
: VoteEntityType.CROWDFUNDING_CAMPAIGN;
const [isVoting, setIsVoting] = useState(false);
- const [userVote, setUserVote] = useState<1 | -1 | null>(null);
+ const [voteCounts, setVoteCounts] = useState
(
+ project.voting
+ ? {
+ upvotes: project.voting.upvotes,
+ downvotes: project.voting.downvotes,
+ totalVotes: project.voting.totalVotes,
+ userVote: project.voting.userVote,
+ }
+ : null
+ );
const projectStatus = getProjectStatus(project, crowdfund);
+ const projectId = project?.id;
+
+ // Real-time vote updates
+ useVoteRealtime(
+ {
+ entityType: VoteEntityType.CROWDFUNDING_CAMPAIGN,
+ entityId: projectId || '',
+ enabled: !!projectId,
+ },
+ {
+ onVoteUpdated: data => {
+ setVoteCounts({
+ upvotes: data.voteCounts.upvotes,
+ downvotes: data.voteCounts.downvotes,
+ totalVotes: data.voteCounts.totalVotes,
+ userVote: data.voteCounts.userVote || null,
+ });
+ },
+ onVoteCreated: data => {
+ setVoteCounts({
+ upvotes: data.voteCounts.upvotes,
+ downvotes: data.voteCounts.downvotes,
+ totalVotes: data.voteCounts.totalVotes,
+ userVote: data.voteCounts.userVote || null,
+ });
+ },
+ onVoteDeleted: data => {
+ setVoteCounts({
+ upvotes: data.voteCounts.upvotes,
+ downvotes: data.voteCounts.downvotes,
+ totalVotes: data.voteCounts.totalVotes,
+ userVote: null,
+ });
+ },
+ }
+ );
+
+ useEffect(() => {
+ if (!projectId) return;
+
+ const fetchVoteCounts = async () => {
+ try {
+ const response = await getVoteCounts(
+ projectId,
+ VoteEntityType.CROWDFUNDING_CAMPAIGN
+ );
+ setVoteCounts(response);
+ } catch {
+ // Silently fail - voting data is not critical
+ }
+ };
+
+ fetchVoteCounts();
+ }, [projectId]);
const handleVote = async (value: 1 | -1) => {
if (isVoting) return;
setIsVoting(true);
try {
- if (userVote === value) {
- // Remove vote if clicking the same vote
- await deleteVote(project.id, entityType);
- setUserVote(null);
- } else {
- // Add/update vote
- await createVote({
- projectId: project.id,
- entityType: entityType,
- voteType: value === 1 ? VoteType.UPVOTE : VoteType.DOWNVOTE,
- });
- setUserVote(value);
- }
+ await voteProject(project.id, value);
+ // Optimistic update could go here, but we rely on realtime/refetch
} catch {
- // Handle error silently or show user-friendly message
- // You can add toast notifications here if needed
+ // Handle error implicitly
} finally {
setIsVoting(false);
}
@@ -67,22 +121,27 @@ export function ProjectSidebar({
)}
- {!hideProgress && (
-
- )}
+
diff --git a/components/project-details/project-sidebar/types.ts b/components/project-details/project-sidebar/types.ts
index 965c8f26f..6139534b8 100644
--- a/components/project-details/project-sidebar/types.ts
+++ b/components/project-details/project-sidebar/types.ts
@@ -1,4 +1,5 @@
-import { Crowdfunding, CrowdfundingProject } from '@/types/project';
+import { Crowdfunding, CrowdfundingProject } from '@/features/projects/types';
+import { VoteCountResponse } from '@/types/votes';
export interface CrowdfundData {
_id: string;
@@ -29,6 +30,7 @@ export interface ProjectSidebarProgressProps {
project: CrowdfundingProject;
crowdfund?: Crowdfunding;
projectStatus: string;
+ voteCounts: VoteCountResponse | null;
}
export interface ProjectSidebarActionsProps {
@@ -53,6 +55,7 @@ export type ProjectStatus =
| 'Funded'
| 'Completed'
| 'Validation'
+ | 'Funding'
| 'idea'
- | 'SUBMITTED'
- | 'pending';
+ | 'pending'
+ | 'SUBMITTED';
diff --git a/components/project-details/project-sidebar/utils.ts b/components/project-details/project-sidebar/utils.ts
index 86b78f58f..52c54508b 100644
--- a/components/project-details/project-sidebar/utils.ts
+++ b/components/project-details/project-sidebar/utils.ts
@@ -1,4 +1,4 @@
-import { Crowdfunding, CrowdfundingProject } from '@/types/project';
+import { Crowdfunding, CrowdfundingProject } from '@/features/projects/types';
import { ProjectStatus } from './types';
/**
@@ -8,18 +8,22 @@ export function getProjectStatus(
project: CrowdfundingProject,
crowdfund?: Crowdfunding
): ProjectStatus {
- if (project.status === 'idea') {
+ if (project.status === 'IDEA' || project.status === 'idea') {
return 'Validation';
}
if (
- crowdfund?.fundingRaised &&
- crowdfund?.fundingGoal &&
- crowdfund?.fundingRaised >= crowdfund?.fundingGoal
+ project.status === 'funded' ||
+ (crowdfund?.fundingRaised &&
+ crowdfund?.fundingGoal &&
+ crowdfund?.fundingRaised >= crowdfund?.fundingGoal)
) {
return 'Funded';
}
- if (project.status === 'campaigning') {
- return 'campaigning';
+ if (project.status === 'campaigning' || project.status === 'active') {
+ return 'Funding';
+ }
+ if (project.status === 'completed') {
+ return 'Completed';
}
return project.status as ProjectStatus;
}
diff --git a/components/project-details/project-team.tsx b/components/project-details/project-team.tsx
index 0e7918991..65579f8a8 100644
--- a/components/project-details/project-team.tsx
+++ b/components/project-details/project-team.tsx
@@ -2,7 +2,7 @@
import React from 'react';
import { TeamList, TeamMember } from '@/components/ui/TeamList';
-import { Crowdfunding } from '@/types/project';
+import { Crowdfunding } from '@/features/projects/types';
interface ProjectTeamProps {
crowdfund: Crowdfunding;
diff --git a/components/project-details/project-voters/index.tsx b/components/project-details/project-voters/index.tsx
index 3fc4c53b6..064b477eb 100644
--- a/components/project-details/project-voters/index.tsx
+++ b/components/project-details/project-voters/index.tsx
@@ -1,7 +1,7 @@
import React, { useState, useEffect } from 'react';
import Empty from './Empty';
import Image from 'next/image';
-import { CrowdfundingProject } from '@/types/project';
+import { CrowdfundingProject } from '@/features/projects/types';
import { VoteType, VoteEntityType, VoterDto } from '@/types/votes';
import {
getVoteCounts as apiGetVoteCounts,
diff --git a/components/project/ProjectsPage.tsx b/components/project/ProjectsPage.tsx
deleted file mode 100644
index 1e6eb28b4..000000000
--- a/components/project/ProjectsPage.tsx
+++ /dev/null
@@ -1,175 +0,0 @@
-'use client';
-
-import React from 'react';
-import ProjectCard from '@/components/landing-page/project/ProjectCard';
-import ExploreHeader from '@/components/projects/ExploreHeader';
-import LoadingSpinner from '@/components/LoadingSpinner';
-import { useProjects } from '@/hooks/project/use-project';
-import { useProjectFilters } from '@/hooks/project/use-project-filters';
-import { BoundlessButton } from '../buttons';
-import { ArrowDownIcon, RefreshCwIcon, XIcon } from 'lucide-react';
-import EmptyState from '../EmptyState';
-import LoadingScreen from '../landing-page/project/CreateProjectModal/LoadingScreen';
-
-interface ProjectsClientProps {
- className?: string;
-}
-
-export default function ProjectsClient({
- className,
-}: ProjectsClientProps = {}) {
- const {
- filters,
- handleSearch,
- handleSort,
- handleStatus,
- handleCategory,
- clearSearch,
- clearAllFilters,
- } = useProjectFilters();
-
- const { projects, loading, loadingMore, error, hasMore, loadMore, refetch } =
- useProjects({ initialFilters: filters });
-
- // Memoized project cards to prevent unnecessary re-renders
- const projectCards = React.useMemo(() => {
- // console.log({projects})
- return projects.map(project => (
-
- ));
- }, [projects]);
-
- return (
-
-
-
-
- {/* Results Summary */}
- {!loading && !error && projects.length > 0 && (
-
-
-
- Showing {projects.length} project
- {projects.length !== 1 ? 's' : ''}
- {filters.search && ` for "${filters.search}"`}
- {filters.category && ` in ${filters.category}`}
- {filters.status && ` with status ${filters.status}`}
-
-
- {filters.search && (
-
}
- iconPosition='right'
- >
- Clear search
-
- )}
-
- )}
-
- {/* Loading State */}
- {loading && (
-
-
-
- )}
-
- {/* Error State */}
- {error && (
-
-
- }
- iconPosition='right'
- >
- Try Again
-
- }
- />
-
-
- )}
-
- {/* Empty State */}
- {!loading && !error && projects.length === 0 && (
-
-
-
-
- {(filters.search || filters.category || filters.status) && (
-
-
- Clear all filters
-
-
- )}
-
-
- )}
-
- {/* Projects Grid */}
- {!loading && !error && projects.length > 0 && (
- <>
-
- {projectCards}
-
-
- {/* Load More Button */}
- {hasMore && (
-
-
- )
- }
- className='flex items-center gap-2 rounded-lg px-8 py-3 font-medium text-white transition-colors disabled:cursor-not-allowed disabled:bg-gray-600'
- iconPosition='right'
- >
- {loadingMore && (
-
- )}
- {loadingMore
- ? 'Loading more projects...'
- : 'Load More Projects'}
-
-
- )}
- >
- )}
-
-
- );
-}
diff --git a/components/recent-projects.tsx b/components/recent-projects.tsx
new file mode 100644
index 000000000..9453fbf9b
--- /dev/null
+++ b/components/recent-projects.tsx
@@ -0,0 +1,348 @@
+'use client';
+
+import Link from 'next/link';
+import { format } from 'date-fns';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Button } from '@/components/ui/button';
+import { ArrowRight, Package } from 'lucide-react';
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from '@/components/ui/table';
+import { Badge } from '@/components/ui/badge';
+import {
+ ColumnDef,
+ SortingState,
+ flexRender,
+ getCoreRowModel,
+ getSortedRowModel,
+ useReactTable,
+} from '@tanstack/react-table';
+import { ArrowUpDown } from 'lucide-react';
+import * as React from 'react';
+
+import Image from 'next/image';
+
+interface Project {
+ id: string;
+ title: string;
+ vision: string;
+ category: string;
+ status: string;
+ banner?: string | null;
+ logo?: string | null;
+ createdAt: string;
+}
+
+interface RecentProjectsProps {
+ projects: Project[];
+ maxDisplay?: number;
+}
+
+export function RecentProjects({
+ projects,
+ maxDisplay = 5,
+}: RecentProjectsProps) {
+ const [sorting, setSorting] = React.useState([]);
+
+ const { displayProjects, hasMoreProjects } = React.useMemo(() => {
+ const sorted = [...projects].sort(
+ (a, b) =>
+ new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
+ );
+ return {
+ displayProjects: sorted.slice(0, maxDisplay),
+ hasMoreProjects: sorted.length > maxDisplay,
+ };
+ }, [projects, maxDisplay]);
+
+ // Map project status to display status
+ const mapProjectStatus = (status: string) => {
+ switch (status.toLowerCase()) {
+ case 'campaigning':
+ return 'Funding';
+ case 'idea':
+ return 'Validation';
+ case 'completed':
+ return 'Completed';
+ case 'live':
+ return 'Funded';
+ case 'reviewing':
+ return 'Reviewing';
+ default:
+ return 'Not sure';
+ }
+ };
+
+ // Get status badge specific classes
+ const getStatusColor = (status: string) => {
+ switch (status.toLowerCase()) {
+ case 'campaigning':
+ return 'bg-blue-500/15 text-blue-500 hover:bg-blue-500/25 border-blue-500/20';
+ case 'idea':
+ return 'bg-yellow-500/15 text-yellow-500 hover:bg-yellow-500/25 border-yellow-500/20';
+ case 'completed':
+ return 'bg-green-500/15 text-green-500 hover:bg-green-500/25 border-green-500/20';
+ case 'live':
+ return 'bg-emerald-500/15 text-emerald-500 hover:bg-emerald-500/25 border-emerald-500/20';
+ case 'reviewing':
+ return 'bg-purple-500/15 text-purple-500 hover:bg-purple-500/25 border-purple-500/20';
+ default:
+ return 'bg-gray-500/15 text-gray-500 hover:bg-gray-500/25 border-gray-500/20';
+ }
+ };
+
+ const columns = React.useMemo[]>(
+ () => [
+ {
+ accessorKey: 'title',
+ header: ({ column }) => {
+ return (
+
+ );
+ },
+ cell: ({ row }) => {
+ const project = row.original;
+ const imageUrl = project.logo || project.banner;
+ return (
+
+ {imageUrl &&
+ imageUrl !== '' &&
+ !imageUrl.includes('example.com') && (
+
{
+ // Hide the image if it fails to load
+ e.currentTarget.style.display = 'none';
+ }}
+ />
+ )}
+
+
+ );
+ },
+ },
+ {
+ accessorKey: 'category',
+ header: ({ column }) => {
+ return (
+
+ );
+ },
+ cell: ({ row }) => {
+ return (
+
+ {row.original.category}
+
+ );
+ },
+ },
+ {
+ accessorKey: 'status',
+ header: ({ column }) => {
+ return (
+
+ );
+ },
+ cell: ({ row }) => {
+ const status = mapProjectStatus(row.original.status);
+ return (
+
+ {status}
+
+ );
+ },
+ },
+ {
+ accessorKey: 'createdAt',
+ header: ({ column }) => {
+ return (
+
+ );
+ },
+ cell: ({ row }) => {
+ return (
+
+ {format(new Date(row.original.createdAt), 'MMM dd, yyyy')}
+
+ );
+ },
+ },
+ ],
+ []
+ );
+
+ const table = useReactTable({
+ data: displayProjects,
+ columns,
+ onSortingChange: setSorting,
+ getCoreRowModel: getCoreRowModel(),
+ getSortedRowModel: getSortedRowModel(),
+ state: {
+ sorting,
+ },
+ });
+
+ if (displayProjects.length === 0) {
+ return (
+
+
+
+
+ Recent Projects
+
+
+ Your latest project creations
+
+
+
+
+
+
No projects yet
+
Create your first project to get started!
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ Recent Projects
+
+
+ Your latest project creations
+
+
+
+
+
+
+ {table.getHeaderGroups().map(headerGroup => (
+
+ {headerGroup.headers.map(header => {
+ return (
+
+ {header.isPlaceholder
+ ? null
+ : flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+
+ );
+ })}
+
+ ))}
+
+
+ {table.getRowModel().rows?.length ? (
+ table.getRowModel().rows.map(row => (
+
+ {row.getVisibleCells().map(cell => (
+
+ {flexRender(
+ cell.column.columnDef.cell,
+ cell.getContext()
+ )}
+
+ ))}
+
+ ))
+ ) : (
+
+
+ No projects found.
+
+
+ )}
+
+
+
+
+ {hasMoreProjects && (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/components/section-cards.tsx b/components/section-cards.tsx
new file mode 100644
index 000000000..224b1b48e
--- /dev/null
+++ b/components/section-cards.tsx
@@ -0,0 +1,115 @@
+import {
+ Card,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Package2, Users, Star, Trophy, LucideIcon } from 'lucide-react';
+
+interface StatsData {
+ projectsCreated?: number;
+ followers?: number;
+ reputation?: number;
+ communityScore?: number;
+}
+
+interface CardConfig {
+ title: string;
+ value?: number;
+ icon?: LucideIcon;
+ description?: string;
+}
+
+interface SectionCardsProps {
+ stats?: StatsData;
+ cards?: CardConfig[];
+}
+
+function formatNumber(num?: number): string {
+ if (num === undefined || num === null) return '0';
+ if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;
+ if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;
+ return num.toLocaleString();
+}
+
+export function SectionCards({ stats, cards }: SectionCardsProps = {}) {
+ if (cards && cards.length > 0) {
+ return (
+
+ {cards.map((card, index) => (
+
+ ))}
+
+ );
+ }
+
+ const defaultCards: CardConfig[] = [
+ {
+ title: 'Projects Created',
+ value: stats?.projectsCreated,
+ icon: Package2,
+ },
+ {
+ title: 'Followers',
+ value: stats?.followers,
+ icon: Users,
+ },
+ {
+ title: 'Reputation',
+ value: stats?.reputation,
+ icon: Star,
+ },
+ {
+ title: 'Community Score',
+ value: stats?.communityScore,
+ icon: Trophy,
+ },
+ ];
+
+ return (
+
+ {defaultCards.map((card, index) => (
+
+ ))}
+
+ );
+}
+
+interface DashCardProps {
+ value?: number;
+ title: string;
+ icon?: LucideIcon;
+ description?: string;
+}
+
+function DashCard({
+ value,
+ title,
+ icon: Icon = Package2,
+ description,
+}: DashCardProps) {
+ return (
+
+
+
+ {description || title}
+ {Icon && }
+
+
+ {formatNumber(value)}
+
+
+
+ );
+}
diff --git a/components/site-header.tsx b/components/site-header.tsx
new file mode 100644
index 000000000..e0ea36b41
--- /dev/null
+++ b/components/site-header.tsx
@@ -0,0 +1,24 @@
+import { Separator } from '@/components/ui/separator';
+import { SidebarTrigger } from '@/components/ui/sidebar';
+import { UserMenu } from './user/UserMenu';
+import { SmartBreadcrumb } from './smart-breadcrumb';
+
+export function SiteHeader() {
+ return (
+
+ );
+}
diff --git a/components/smart-breadcrumb.tsx b/components/smart-breadcrumb.tsx
new file mode 100644
index 000000000..d532f949f
--- /dev/null
+++ b/components/smart-breadcrumb.tsx
@@ -0,0 +1,110 @@
+'use client';
+
+import { usePathname } from 'next/navigation';
+import Link from 'next/link';
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from '@/components/ui/breadcrumb';
+
+const routeLabels: Record = {
+ dashboard: 'Dashboard',
+ me: 'Profile',
+ projects: 'Projects',
+ hackathons: 'Hackathons',
+ bounties: 'Bounties',
+ organizations: 'Organizations',
+ waitlist: 'Waitlist',
+ auth: 'Authentication',
+ profile: 'Profile',
+ settings: 'Settings',
+ create: 'Create',
+ edit: 'Edit',
+ view: 'View',
+};
+
+function generateBreadcrumbs(pathname: string) {
+ const segments = pathname.split('/').filter(Boolean);
+
+ // Skip dynamic route segments (those with brackets or UUIDs)
+ const filteredSegments = segments.filter(
+ segment =>
+ !segment.includes('[') &&
+ !segment.includes(']') &&
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(
+ segment
+ ) &&
+ !/^[0-9a-f]{24}$/i.test(segment) // MongoDB ObjectId
+ );
+
+ const breadcrumbs = filteredSegments.map((segment, index) => {
+ const href = '/' + filteredSegments.slice(0, index + 1).join('/');
+ const label =
+ routeLabels[segment] ||
+ segment.charAt(0).toUpperCase() + segment.slice(1);
+ const isLast = index === filteredSegments.length - 1;
+
+ return {
+ href,
+ label,
+ isLast,
+ };
+ });
+
+ return breadcrumbs;
+}
+
+export function SmartBreadcrumb() {
+ const pathname = usePathname();
+
+ // Don't show breadcrumbs on the home page or landing pages
+ if (pathname === '/' || pathname.startsWith('/(landing)')) {
+ return null;
+ }
+
+ const breadcrumbs = generateBreadcrumbs(pathname);
+
+ // If no breadcrumbs to show, return null
+ if (breadcrumbs.length === 0) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+ Home
+
+
+
+ {breadcrumbs.map(breadcrumb => (
+
+
+
+ {breadcrumb.isLast ? (
+
+ {breadcrumb.label}
+
+ ) : (
+
+
+ {breadcrumb.label}
+
+
+ )}
+
+
+ ))}
+
+
+ );
+}
diff --git a/components/ui/data-table-pagination.tsx b/components/ui/data-table-pagination.tsx
new file mode 100644
index 000000000..18f5e5db2
--- /dev/null
+++ b/components/ui/data-table-pagination.tsx
@@ -0,0 +1,103 @@
+import { type Table } from '@tanstack/react-table';
+import {
+ ChevronLeft,
+ ChevronRight,
+ ChevronsLeft,
+ ChevronsRight,
+} from 'lucide-react';
+
+import { Button } from '@/components/ui/button';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+
+interface DataTablePaginationProps {
+ table: Table;
+ loading?: boolean;
+}
+
+export function DataTablePagination({
+ table,
+ loading = false,
+}: DataTablePaginationProps) {
+ return (
+
+
+ {table.getFilteredSelectedRowModel().rows.length} of{' '}
+ {table.getFilteredRowModel().rows.length} row(s) selected.
+
+
+
+
Rows per page
+
+
+
+ Page {table.getState().pagination.pageIndex + 1} of{' '}
+ {table.getPageCount()}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx
index a1ce09b34..16f83d0c8 100644
--- a/components/ui/dropdown-menu.tsx
+++ b/components/ui/dropdown-menu.tsx
@@ -34,10 +34,13 @@ function DropdownMenuTrigger({
function DropdownMenuContent({
className,
sideOffset = 4,
+ container,
...props
-}: React.ComponentProps) {
+}: React.ComponentProps & {
+ container?: DropdownMenuPrimitive.DropdownMenuPortalProps['container'];
+}) {
return (
-
+
{
+ asChild?: boolean;
+}
+
+type RootElement = React.ComponentRef;
+
+type Direction = 'ltr' | 'rtl';
+
+interface StoreState {
+ controlsVisible: boolean;
+ dragging: boolean;
+ menuOpen: boolean;
+ volumeIndicatorVisible: boolean;
+}
+
+interface Store {
+ subscribe: (cb: () => void) => () => void;
+ getState: () => StoreState;
+ setState: (
+ key: keyof StoreState,
+ value: StoreState[keyof StoreState]
+ ) => void;
+ notify: () => void;
+}
+
+const StoreContext = React.createContext(null);
+
+function useStoreContext(consumerName: string) {
+ const context = React.useContext(StoreContext);
+ if (!context) {
+ throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);
+ }
+ return context;
+}
+
+function useStore(selector: (state: StoreState) => T): T {
+ const store = useStoreContext('useStore');
+
+ const getSnapshot = React.useCallback(
+ () => selector(store.getState()),
+ [store, selector]
+ );
+
+ return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);
+}
+
+interface MediaPlayerContextValue {
+ mediaId: string;
+ labelId: string;
+ descriptionId: string;
+ dir: Direction;
+ rootRef: React.RefObject;
+ mediaRef: React.RefObject;
+ portalContainer: Element | DocumentFragment | null;
+ tooltipDelayDuration: number;
+ tooltipSideOffset: number;
+ disabled: boolean;
+ isVideo: boolean;
+ withoutTooltip: boolean;
+}
+
+const MediaPlayerContext = React.createContext(
+ null
+);
+
+function useMediaPlayerContext(consumerName: string) {
+ const context = React.useContext(MediaPlayerContext);
+ if (!context) {
+ throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);
+ }
+ return context;
+}
+
+interface MediaPlayerProps extends Omit<
+ DivProps,
+ 'onTimeUpdate' | 'onVolumeChange'
+> {
+ onPlay?: () => void;
+ onPause?: () => void;
+ onEnded?: () => void;
+ onTimeUpdate?: (time: number) => void;
+ onVolumeChange?: (volume: number) => void;
+ onMuted?: (muted: boolean) => void;
+ onMediaError?: (error: MediaError | null) => void;
+ onPipError?: (error: unknown, state: 'enter' | 'exit') => void;
+ onFullscreenChange?: (fullscreen: boolean) => void;
+ dir?: Direction;
+ label?: string;
+ tooltipDelayDuration?: number;
+ tooltipSideOffset?: number;
+ autoHide?: boolean;
+ disabled?: boolean;
+ withoutTooltip?: boolean;
+}
+
+function MediaPlayer(props: MediaPlayerProps) {
+ const listenersRef = useLazyRef(() => new Set<() => void>());
+ const stateRef = useLazyRef(() => ({
+ controlsVisible: true,
+ dragging: false,
+ menuOpen: false,
+ volumeIndicatorVisible: false,
+ }));
+
+ const store: Store = React.useMemo(() => {
+ return {
+ subscribe: cb => {
+ listenersRef.current.add(cb);
+ return () => listenersRef.current.delete(cb);
+ },
+ getState: () => stateRef.current,
+ setState: (key, value) => {
+ if (Object.is(stateRef.current[key], value)) return;
+ stateRef.current[key] = value;
+ store.notify();
+ },
+ notify: () => {
+ for (const cb of listenersRef.current) {
+ cb();
+ }
+ },
+ };
+ }, [listenersRef, stateRef]);
+
+ return (
+
+
+
+
+
+ );
+}
+
+function MediaPlayerImpl(props: MediaPlayerProps) {
+ const {
+ onPlay,
+ onPause,
+ onEnded,
+ onTimeUpdate,
+ onFullscreenChange,
+ onVolumeChange,
+ onMuted,
+ onMediaError,
+ onPipError,
+ dir: dirProp,
+ label,
+ tooltipDelayDuration = 600,
+ tooltipSideOffset = FLOATING_MENU_SIDE_OFFSET,
+ asChild,
+ autoHide = false,
+ disabled = false,
+ withoutTooltip = false,
+ children,
+ className,
+ ref,
+ ...rootImplProps
+ } = props;
+
+ const mediaId = React.useId();
+ const labelId = React.useId();
+ const descriptionId = React.useId();
+
+ const rootRef = React.useRef(null);
+ const fullscreenRef = useMediaFullscreenRef();
+ const composedRef = useComposedRefs(ref, rootRef, fullscreenRef);
+
+ const dir = useDirection(dirProp);
+ const dispatch = useMediaDispatch();
+ const mediaRef = React.useRef(
+ null
+ );
+
+ const store = useStoreContext(ROOT_NAME);
+
+ const controlsVisible = useStore(state => state.controlsVisible);
+ const dragging = useStore(state => state.dragging);
+ const menuOpen = useStore(state => state.menuOpen);
+
+ const hideControlsTimeoutRef = React.useRef | null>(null);
+ const lastMouseMoveRef = React.useRef(Date.now());
+ const volumeIndicatorTimeoutRef = React.useRef | null>(null);
+
+ const mediaPaused = useMediaSelector(state => state.mediaPaused ?? true);
+ const isFullscreen = useMediaSelector(
+ state => state.mediaIsFullscreen ?? false
+ );
+
+ const [mounted, setMounted] = React.useState(false);
+ React.useLayoutEffect(() => {
+ setMounted(true);
+ }, []);
+
+ const portalContainer = mounted
+ ? isFullscreen
+ ? rootRef.current
+ : globalThis.document.body
+ : null;
+
+ const isVideo =
+ (typeof HTMLVideoElement !== 'undefined' &&
+ mediaRef.current instanceof HTMLVideoElement) ||
+ mediaRef.current?.tagName?.toLowerCase() === 'mux-player';
+
+ const onControlsShow = React.useCallback(() => {
+ store.setState('controlsVisible', true);
+ lastMouseMoveRef.current = Date.now();
+
+ if (hideControlsTimeoutRef.current) {
+ clearTimeout(hideControlsTimeoutRef.current);
+ }
+
+ if (autoHide && !mediaPaused && !menuOpen && !dragging) {
+ hideControlsTimeoutRef.current = setTimeout(() => {
+ store.setState('controlsVisible', false);
+ }, 3000);
+ }
+ }, [store.setState, autoHide, mediaPaused, menuOpen, dragging]);
+
+ const onVolumeIndicatorTrigger = React.useCallback(() => {
+ if (menuOpen) return;
+
+ store.setState('volumeIndicatorVisible', true);
+
+ if (volumeIndicatorTimeoutRef.current) {
+ clearTimeout(volumeIndicatorTimeoutRef.current);
+ }
+
+ volumeIndicatorTimeoutRef.current = setTimeout(() => {
+ store.setState('volumeIndicatorVisible', false);
+ }, 2000);
+
+ if (autoHide) {
+ onControlsShow();
+ }
+ }, [store.setState, menuOpen, autoHide, onControlsShow]);
+
+ const onMouseLeave = React.useCallback(
+ (event: React.MouseEvent) => {
+ rootImplProps.onMouseLeave?.(event);
+
+ if (event.defaultPrevented) return;
+
+ if (autoHide && !mediaPaused && !menuOpen && !dragging) {
+ store.setState('controlsVisible', false);
+ }
+ },
+ [
+ store.setState,
+ rootImplProps.onMouseLeave,
+ autoHide,
+ mediaPaused,
+ menuOpen,
+ dragging,
+ ]
+ );
+
+ const onMouseMove = React.useCallback(
+ (event: React.MouseEvent) => {
+ rootImplProps.onMouseMove?.(event);
+
+ if (event.defaultPrevented) return;
+
+ if (autoHide) {
+ onControlsShow();
+ }
+ },
+ [autoHide, rootImplProps.onMouseMove, onControlsShow]
+ );
+
+ React.useEffect(() => {
+ if (mediaPaused || menuOpen || dragging) {
+ store.setState('controlsVisible', true);
+ if (hideControlsTimeoutRef.current) {
+ clearTimeout(hideControlsTimeoutRef.current);
+ }
+ return;
+ }
+
+ if (autoHide) {
+ onControlsShow();
+ }
+ }, [
+ store.setState,
+ onControlsShow,
+ autoHide,
+ menuOpen,
+ mediaPaused,
+ dragging,
+ ]);
+
+ const onKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (disabled) return;
+
+ rootImplProps.onKeyDown?.(event);
+
+ if (event.defaultPrevented) return;
+
+ const mediaElement = mediaRef.current;
+ if (!mediaElement) return;
+
+ const isMediaFocused = document.activeElement === mediaElement;
+ const isPlayerFocused =
+ document.activeElement?.closest('[data-slot="media-player"]') !== null;
+
+ if (!isMediaFocused && !isPlayerFocused) return;
+
+ if (autoHide) onControlsShow();
+
+ switch (event.key.toLowerCase()) {
+ case ' ':
+ case 'k':
+ event.preventDefault();
+ dispatch({
+ type: mediaElement.paused
+ ? MediaActionTypes.MEDIA_PLAY_REQUEST
+ : MediaActionTypes.MEDIA_PAUSE_REQUEST,
+ });
+ break;
+
+ case 'f':
+ event.preventDefault();
+ dispatch({
+ type: document.fullscreenElement
+ ? MediaActionTypes.MEDIA_EXIT_FULLSCREEN_REQUEST
+ : MediaActionTypes.MEDIA_ENTER_FULLSCREEN_REQUEST,
+ });
+ break;
+
+ case 'm': {
+ event.preventDefault();
+ if (isVideo) {
+ onVolumeIndicatorTrigger();
+ }
+ dispatch({
+ type: mediaElement.muted
+ ? MediaActionTypes.MEDIA_UNMUTE_REQUEST
+ : MediaActionTypes.MEDIA_MUTE_REQUEST,
+ });
+ break;
+ }
+
+ case 'arrowright':
+ event.preventDefault();
+ if (
+ isVideo ||
+ (mediaElement instanceof HTMLAudioElement && event.shiftKey)
+ ) {
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: Math.min(
+ mediaElement.duration,
+ mediaElement.currentTime + SEEK_STEP_SHORT
+ ),
+ });
+ }
+ break;
+
+ case 'arrowleft':
+ event.preventDefault();
+ if (
+ isVideo ||
+ (mediaElement instanceof HTMLAudioElement && event.shiftKey)
+ ) {
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: Math.max(0, mediaElement.currentTime - SEEK_STEP_SHORT),
+ });
+ }
+ break;
+
+ case 'arrowup':
+ event.preventDefault();
+ if (isVideo) {
+ onVolumeIndicatorTrigger();
+ dispatch({
+ type: MediaActionTypes.MEDIA_VOLUME_REQUEST,
+ detail: Math.min(1, mediaElement.volume + 0.1),
+ });
+ }
+ break;
+
+ case 'arrowdown':
+ event.preventDefault();
+ if (isVideo) {
+ onVolumeIndicatorTrigger();
+ dispatch({
+ type: MediaActionTypes.MEDIA_VOLUME_REQUEST,
+ detail: Math.max(0, mediaElement.volume - 0.1),
+ });
+ }
+ break;
+
+ case '<': {
+ event.preventDefault();
+ const currentRate = mediaElement.playbackRate;
+ const currentIndex = SPEEDS.indexOf(currentRate);
+ const newIndex = Math.max(0, currentIndex - 1);
+ const newRate = SPEEDS[newIndex] ?? 1;
+ dispatch({
+ type: MediaActionTypes.MEDIA_PLAYBACK_RATE_REQUEST,
+ detail: newRate,
+ });
+ break;
+ }
+
+ case '>': {
+ event.preventDefault();
+ const currentRate = mediaElement.playbackRate;
+ const currentIndex = SPEEDS.indexOf(currentRate);
+ const newIndex = Math.min(SPEEDS.length - 1, currentIndex + 1);
+ const newRate = SPEEDS[newIndex] ?? 1;
+ dispatch({
+ type: MediaActionTypes.MEDIA_PLAYBACK_RATE_REQUEST,
+ detail: newRate,
+ });
+ break;
+ }
+
+ case 'c':
+ event.preventDefault();
+ if (isVideo && mediaElement.textTracks.length > 0) {
+ dispatch({
+ type: MediaActionTypes.MEDIA_TOGGLE_SUBTITLES_REQUEST,
+ });
+ }
+ break;
+
+ case 'd': {
+ const hasDownload = mediaElement.querySelector(
+ '[data-slot="media-player-download"]'
+ );
+
+ if (!hasDownload) break;
+
+ event.preventDefault();
+ if (mediaElement.currentSrc) {
+ const link = document.createElement('a');
+ link.href = mediaElement.currentSrc;
+ link.download = '';
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ }
+ break;
+ }
+
+ case 'p': {
+ event.preventDefault();
+ if (isVideo && 'requestPictureInPicture' in mediaElement) {
+ const isPip = document.pictureInPictureElement === mediaElement;
+ dispatch({
+ type: isPip
+ ? MediaActionTypes.MEDIA_EXIT_PIP_REQUEST
+ : MediaActionTypes.MEDIA_ENTER_PIP_REQUEST,
+ });
+ if (isPip) {
+ document.exitPictureInPicture().catch(error => {
+ onPipError?.(error, 'exit');
+ });
+ } else {
+ mediaElement.requestPictureInPicture().catch(error => {
+ onPipError?.(error, 'enter');
+ });
+ }
+ }
+ break;
+ }
+
+ case 'r': {
+ event.preventDefault();
+ mediaElement.loop = !mediaElement.loop;
+ break;
+ }
+
+ case 'j': {
+ event.preventDefault();
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: Math.max(0, mediaElement.currentTime - SEEK_STEP_LONG),
+ });
+ break;
+ }
+
+ case 'l': {
+ event.preventDefault();
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: Math.min(
+ mediaElement.duration,
+ mediaElement.currentTime + SEEK_STEP_LONG
+ ),
+ });
+ break;
+ }
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9': {
+ event.preventDefault();
+ const percent = Number.parseInt(event.key, 10) / 10;
+ const seekTime = mediaElement.duration * percent;
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: seekTime,
+ });
+ break;
+ }
+
+ case 'home': {
+ event.preventDefault();
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: 0,
+ });
+ break;
+ }
+
+ case 'end': {
+ event.preventDefault();
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: mediaElement.duration,
+ });
+ break;
+ }
+ }
+ },
+ [
+ dispatch,
+ rootImplProps.onKeyDown,
+ onVolumeIndicatorTrigger,
+ onPipError,
+ disabled,
+ isVideo,
+ onControlsShow,
+ autoHide,
+ ]
+ );
+
+ const onKeyUp = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ rootImplProps.onKeyUp?.(event);
+
+ const key = event.key.toLowerCase();
+ if (key === 'arrowup' || key === 'arrowdown' || key === 'm') {
+ onVolumeIndicatorTrigger();
+ }
+ },
+ [rootImplProps.onKeyUp, onVolumeIndicatorTrigger]
+ );
+
+ React.useEffect(() => {
+ const mediaElement = mediaRef.current;
+ if (!mediaElement) return;
+
+ if (onPlay) mediaElement.addEventListener('play', onPlay);
+ if (onPause) mediaElement.addEventListener('pause', onPause);
+ if (onEnded) mediaElement.addEventListener('ended', onEnded);
+ if (onTimeUpdate)
+ mediaElement.addEventListener('timeupdate', () =>
+ onTimeUpdate?.(mediaElement.currentTime)
+ );
+ if (onVolumeChange)
+ mediaElement.addEventListener('volumechange', () => {
+ onVolumeChange?.(mediaElement.volume);
+ onMuted?.(mediaElement.muted);
+ });
+ if (onMediaError)
+ mediaElement.addEventListener('error', () =>
+ onMediaError?.(mediaElement.error)
+ );
+ if (onFullscreenChange) {
+ document.addEventListener('fullscreenchange', () =>
+ onFullscreenChange?.(!!document.fullscreenElement)
+ );
+ }
+
+ return () => {
+ if (onPlay) mediaElement.removeEventListener('play', onPlay);
+ if (onPause) mediaElement.removeEventListener('pause', onPause);
+ if (onEnded) mediaElement.removeEventListener('ended', onEnded);
+ if (onTimeUpdate)
+ mediaElement.removeEventListener('timeupdate', () =>
+ onTimeUpdate?.(mediaElement.currentTime)
+ );
+ if (onVolumeChange)
+ mediaElement.removeEventListener('volumechange', () => {
+ onVolumeChange?.(mediaElement.volume);
+ onMuted?.(mediaElement.muted);
+ });
+ if (onMediaError)
+ mediaElement.removeEventListener('error', () =>
+ onMediaError?.(mediaElement.error)
+ );
+ if (onFullscreenChange) {
+ document.removeEventListener('fullscreenchange', () =>
+ onFullscreenChange?.(!!document.fullscreenElement)
+ );
+ }
+ if (volumeIndicatorTimeoutRef.current) {
+ clearTimeout(volumeIndicatorTimeoutRef.current);
+ }
+ if (hideControlsTimeoutRef.current) {
+ clearTimeout(hideControlsTimeoutRef.current);
+ }
+ };
+ }, [
+ onPlay,
+ onPause,
+ onEnded,
+ onTimeUpdate,
+ onVolumeChange,
+ onMuted,
+ onMediaError,
+ onFullscreenChange,
+ ]);
+
+ const contextValue = React.useMemo(
+ () => ({
+ mediaId,
+ labelId,
+ descriptionId,
+ dir,
+ rootRef,
+ mediaRef,
+ portalContainer,
+ tooltipDelayDuration,
+ tooltipSideOffset,
+ disabled,
+ isVideo,
+ withoutTooltip,
+ }),
+ [
+ mediaId,
+ labelId,
+ descriptionId,
+ dir,
+ portalContainer,
+ tooltipDelayDuration,
+ tooltipSideOffset,
+ disabled,
+ isVideo,
+ withoutTooltip,
+ ]
+ );
+
+ const RootPrimitive = asChild ? Slot : 'div';
+
+ return (
+
+
+
+ {label ?? 'Media player'}
+
+
+ {isVideo
+ ? 'Video player with custom controls for playback, volume, seeking, and more. Use space bar to play/pause, arrow keys (←/→) to seek, and arrow keys (↑/↓) to adjust volume.'
+ : 'Audio player with custom controls for playback, volume, seeking, and more. Use space bar to play/pause, Shift + arrow keys (←/→) to seek, and arrow keys (↑/↓) to adjust volume.'}
+
+ {children}
+
+
+
+ );
+}
+
+interface MediaPlayerVideoProps extends React.ComponentProps<'video'> {
+ asChild?: boolean;
+}
+
+function MediaPlayerVideo(props: MediaPlayerVideoProps) {
+ const { asChild, ref, ...videoProps } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerVideo');
+ const dispatch = useMediaDispatch();
+ const mediaRefCallback = useMediaRef();
+ const composedRef = useComposedRefs(ref, context.mediaRef, mediaRefCallback);
+
+ const onPlayToggle = React.useCallback(
+ (event: React.MouseEvent) => {
+ props.onClick?.(event);
+
+ if (event.defaultPrevented) return;
+
+ const mediaElement = event.currentTarget;
+ if (!mediaElement) return;
+
+ dispatch({
+ type: mediaElement.paused
+ ? MediaActionTypes.MEDIA_PLAY_REQUEST
+ : MediaActionTypes.MEDIA_PAUSE_REQUEST,
+ });
+ },
+ [dispatch, props.onClick]
+ );
+
+ const VideoPrimitive = asChild ? Slot : 'video';
+
+ return (
+
+ );
+}
+
+interface MediaPlayerAudioProps extends React.ComponentProps<'audio'> {
+ asChild?: boolean;
+}
+
+function MediaPlayerAudio(props: MediaPlayerAudioProps) {
+ const { asChild, ref, ...audioProps } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerAudio');
+ const mediaRefCallback = useMediaRef();
+ const composedRef = useComposedRefs(ref, context.mediaRef, mediaRefCallback);
+
+ const AudioPrimitive = asChild ? Slot : 'audio';
+
+ return (
+
+ );
+}
+
+function MediaPlayerControls(props: DivProps) {
+ const { asChild, className, ...controlsProps } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerControls');
+ const isFullscreen = useMediaSelector(
+ state => state.mediaIsFullscreen ?? false
+ );
+ const controlsVisible = useStore(state => state.controlsVisible);
+
+ const ControlsPrimitive = asChild ? Slot : 'div';
+
+ return (
+
+ );
+}
+
+interface MediaPlayerLoadingProps extends DivProps {
+ delayMs?: number;
+}
+
+function MediaPlayerLoading(props: MediaPlayerLoadingProps) {
+ const {
+ delayMs = 500,
+ asChild,
+ className,
+ children,
+ ...loadingProps
+ } = props;
+
+ const isLoading = useMediaSelector(state => state.mediaLoading ?? false);
+ const isPaused = useMediaSelector(state => state.mediaPaused ?? true);
+ const hasPlayed = useMediaSelector(state => state.mediaHasPlayed ?? false);
+
+ const shouldShowLoading = isLoading && !isPaused;
+ const shouldUseDelay = hasPlayed && shouldShowLoading;
+ const loadingDelayMs = shouldUseDelay ? delayMs : 0;
+
+ const [shouldRender, setShouldRender] = React.useState(false);
+ const timeoutRef = React.useRef | null>(null);
+
+ React.useEffect(() => {
+ if (timeoutRef.current) {
+ clearTimeout(timeoutRef.current);
+ timeoutRef.current = null;
+ }
+
+ if (shouldShowLoading) {
+ if (loadingDelayMs > 0) {
+ timeoutRef.current = setTimeout(() => {
+ setShouldRender(true);
+ timeoutRef.current = null;
+ }, loadingDelayMs);
+ } else {
+ setShouldRender(true);
+ }
+ } else {
+ setShouldRender(false);
+ }
+
+ return () => {
+ if (timeoutRef.current) {
+ clearTimeout(timeoutRef.current);
+ timeoutRef.current = null;
+ }
+ };
+ }, [shouldShowLoading, loadingDelayMs]);
+
+ if (!shouldRender) return null;
+
+ const LoadingPrimitive = asChild ? Slot : 'div';
+
+ return (
+
+ {children ?? (
+
+ )}
+
+ );
+}
+
+interface MediaPlayerErrorProps extends DivProps {
+ error?: MediaError | null;
+ label?: string;
+ description?: string;
+ onRetry?: () => void;
+ onReload?: () => void;
+ asChild?: boolean;
+}
+
+function MediaPlayerError(props: MediaPlayerErrorProps) {
+ const {
+ error: errorProp,
+ label,
+ description,
+ onRetry: onRetryProp,
+ onReload: onReloadProp,
+ asChild,
+ className,
+ children,
+ ...errorProps
+ } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerError');
+ const isFullscreen = useMediaSelector(
+ state => state.mediaIsFullscreen ?? false
+ );
+ const mediaError = useMediaSelector(state => state.mediaError);
+
+ const error = errorProp ?? mediaError;
+
+ const labelId = React.useId();
+ const descriptionId = React.useId();
+
+ const [actionState, setActionState] = React.useState<{
+ retryPending: boolean;
+ reloadPending: boolean;
+ }>({
+ retryPending: false,
+ reloadPending: false,
+ });
+
+ const onRetry = React.useCallback(() => {
+ setActionState(prev => ({ ...prev, retryPending: true }));
+
+ requestAnimationFrame(() => {
+ const mediaElement = context.mediaRef.current;
+ if (!mediaElement) {
+ setActionState(prev => ({ ...prev, retryPending: false }));
+ return;
+ }
+
+ if (onRetryProp) {
+ onRetryProp();
+ } else {
+ const currentSrc = mediaElement.currentSrc ?? mediaElement.src;
+ if (currentSrc) {
+ mediaElement.load();
+ }
+ }
+
+ setActionState(prev => ({ ...prev, retryPending: false }));
+ });
+ }, [context.mediaRef, onRetryProp]);
+
+ const onReload = React.useCallback(() => {
+ setActionState(prev => ({ ...prev, reloadPending: true }));
+
+ requestAnimationFrame(() => {
+ if (onReloadProp) {
+ onReloadProp();
+ } else {
+ window.location.reload();
+ }
+ });
+ }, [onReloadProp]);
+
+ const errorLabel = React.useMemo(() => {
+ if (label) return label;
+
+ if (!error) return 'Playback Error';
+
+ const labelMap: Record = {
+ [MediaError.MEDIA_ERR_ABORTED]: 'Playback Interrupted',
+ [MediaError.MEDIA_ERR_NETWORK]: 'Connection Problem',
+ [MediaError.MEDIA_ERR_DECODE]: 'Media Error',
+ [MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED]: 'Unsupported Format',
+ };
+
+ return labelMap[error.code] ?? 'Playback Error';
+ }, [label, error]);
+
+ const errorDescription = React.useMemo(() => {
+ if (description) return description;
+
+ if (!error) return 'An unknown error occurred';
+
+ const descriptionMap: Record = {
+ [MediaError.MEDIA_ERR_ABORTED]: 'Media playback was aborted',
+ [MediaError.MEDIA_ERR_NETWORK]:
+ 'A network error occurred while loading the media',
+ [MediaError.MEDIA_ERR_DECODE]:
+ 'An error occurred while decoding the media',
+ [MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED]:
+ 'The media format is not supported',
+ };
+
+ return descriptionMap[error.code] ?? 'An unknown error occurred';
+ }, [description, error]);
+
+ if (!error) return null;
+
+ const ErrorPrimitive = asChild ? Slot : 'div';
+
+ return (
+
+ {children ?? (
+
+
+
+
+ {errorLabel}
+
+
+ {errorDescription}
+
+
+
+
+
+
+
+ )}
+
+ );
+}
+
+function MediaPlayerVolumeIndicator(props: DivProps) {
+ const { asChild, className, ...indicatorProps } = props;
+
+ const mediaVolume = useMediaSelector(state => state.mediaVolume ?? 1);
+ const mediaMuted = useMediaSelector(state => state.mediaMuted ?? false);
+ const mediaVolumeLevel = useMediaSelector(
+ state => state.mediaVolumeLevel ?? 'high'
+ );
+ const volumeIndicatorVisible = useStore(
+ state => state.volumeIndicatorVisible
+ );
+
+ if (!volumeIndicatorVisible) return null;
+
+ const effectiveVolume = mediaMuted ? 0 : mediaVolume;
+ const volumePercentage = Math.round(effectiveVolume * 100);
+ const barCount = 10;
+ const activeBarCount = Math.ceil(effectiveVolume * barCount);
+
+ const VolumeIndicatorPrimitive = asChild ? Slot : 'div';
+
+ return (
+
+
+
+ {mediaVolumeLevel === 'off' || mediaMuted ? (
+
+ ) : mediaVolumeLevel === 'high' ? (
+
+ ) : (
+
+ )}
+
+ {mediaMuted ? 'Muted' : `${volumePercentage}%`}
+
+
+
+ {Array.from({ length: barCount }, (_, index) => (
+
+ ))}
+
+
+
+ );
+}
+
+function MediaPlayerControlsOverlay(props: DivProps) {
+ const { asChild, className, ...overlayProps } = props;
+
+ const isFullscreen = useMediaSelector(
+ state => state.mediaIsFullscreen ?? false
+ );
+ const controlsVisible = useStore(state => state.controlsVisible);
+
+ const OverlayPrimitive = asChild ? Slot : 'div';
+
+ return (
+
+ );
+}
+
+function MediaPlayerPlay(props: React.ComponentProps) {
+ const { children, className, disabled, ...playButtonProps } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerPlay');
+ const dispatch = useMediaDispatch();
+ const mediaPaused = useMediaSelector(state => state.mediaPaused ?? true);
+
+ const isDisabled = disabled || context.disabled;
+
+ const onPlayToggle = React.useCallback(
+ (event: React.MouseEvent) => {
+ props.onClick?.(event);
+
+ if (event.defaultPrevented) return;
+
+ dispatch({
+ type: mediaPaused
+ ? MediaActionTypes.MEDIA_PLAY_REQUEST
+ : MediaActionTypes.MEDIA_PAUSE_REQUEST,
+ });
+ },
+ [dispatch, props.onClick, mediaPaused]
+ );
+
+ return (
+
+
+
+ );
+}
+
+interface MediaPlayerSeekBackwardProps extends React.ComponentProps<
+ typeof Button
+> {
+ seconds?: number;
+}
+
+function MediaPlayerSeekBackward(props: MediaPlayerSeekBackwardProps) {
+ const {
+ seconds = SEEK_STEP_SHORT,
+ children,
+ className,
+ disabled,
+ ...seekBackwardProps
+ } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerSeekBackward');
+ const dispatch = useMediaDispatch();
+ const mediaCurrentTime = useMediaSelector(
+ state => state.mediaCurrentTime ?? 0
+ );
+
+ const isDisabled = disabled || context.disabled;
+
+ const onSeekBackward = React.useCallback(
+ (event: React.MouseEvent) => {
+ props.onClick?.(event);
+
+ if (event.defaultPrevented) return;
+
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: Math.max(0, mediaCurrentTime - seconds),
+ });
+ },
+ [dispatch, props.onClick, mediaCurrentTime, seconds]
+ );
+
+ return (
+
+
+
+ );
+}
+
+interface MediaPlayerSeekForwardProps extends React.ComponentProps<
+ typeof Button
+> {
+ seconds?: number;
+}
+
+function MediaPlayerSeekForward(props: MediaPlayerSeekForwardProps) {
+ const {
+ seconds = SEEK_STEP_LONG,
+ children,
+ className,
+ disabled,
+ ...seekForwardProps
+ } = props;
+
+ const context = useMediaPlayerContext('MediaPlayerSeekForward');
+ const dispatch = useMediaDispatch();
+ const mediaCurrentTime = useMediaSelector(
+ state => state.mediaCurrentTime ?? 0
+ );
+ const [, seekableEnd] = useMediaSelector(
+ state => state.mediaSeekable ?? [0, 0]
+ );
+ const isDisabled = disabled || context.disabled;
+
+ const onSeekForward = React.useCallback(
+ (event: React.MouseEvent) => {
+ props.onClick?.(event);
+
+ if (event.defaultPrevented) return;
+
+ dispatch({
+ type: MediaActionTypes.MEDIA_SEEK_REQUEST,
+ detail: Math.min(
+ seekableEnd ?? Number.POSITIVE_INFINITY,
+ mediaCurrentTime + seconds
+ ),
+ });
+ },
+ [dispatch, props.onClick, mediaCurrentTime, seekableEnd, seconds]
+ );
+
+ return (
+
+
+
+ );
+}
+
+interface SeekState {
+ isHovering: boolean;
+ pendingSeekTime: number | null;
+ hasInitialPosition: boolean;
+}
+
+interface MediaPlayerSeekProps extends React.ComponentProps<
+ typeof SliderPrimitive.Root
+> {
+ withTime?: boolean;
+ withoutChapter?: boolean;
+ withoutTooltip?: boolean;
+ tooltipThumbnailSrc?: string | ((time: number) => string);
+ tooltipTimeVariant?: 'current' | 'progress';
+ tooltipSideOffset?: number;
+ tooltipCollisionBoundary?: Element | Element[];
+ tooltipCollisionPadding?:
+ | number
+ | Partial>;
+}
+
+function MediaPlayerSeek(props: MediaPlayerSeekProps) {
+ const {
+ withTime = false,
+ withoutChapter = false,
+ withoutTooltip = false,
+ tooltipTimeVariant = 'current',
+ tooltipThumbnailSrc,
+ tooltipSideOffset,
+ tooltipCollisionPadding = SEEK_COLLISION_PADDING,
+ tooltipCollisionBoundary,
+ className,
+ disabled,
+ ...seekProps
+ } = props;
+
+ const context = useMediaPlayerContext(SEEK_NAME);
+ const store = useStoreContext(SEEK_NAME);
+ const dispatch = useMediaDispatch();
+ const mediaCurrentTime = useMediaSelector(
+ state => state.mediaCurrentTime ?? 0
+ );
+ const [seekableStart = 0, seekableEnd = 0] = useMediaSelector(
+ state => state.mediaSeekable ?? [0, 0]
+ );
+ const mediaBuffered = useMediaSelector(state => state.mediaBuffered ?? []);
+ const mediaEnded = useMediaSelector(state => state.mediaEnded ?? false);
+
+ const chapterCues = useMediaSelector(state => state.mediaChaptersCues ?? []);
+ const mediaPreviewTime = useMediaSelector(state => state.mediaPreviewTime);
+ const mediaPreviewImage = useMediaSelector(state => state.mediaPreviewImage);
+ const mediaPreviewCoords = useMediaSelector(
+ state => state.mediaPreviewCoords
+ );
+
+ const seekRef = React.useRef(null);
+ const tooltipRef = React.useRef(null);
+ const justCommittedRef = React.useRef(false);
+
+ const hoverTimeRef = React.useRef(0);
+ const tooltipXRef = React.useRef(0);
+ const tooltipYRef = React.useRef(0);
+ const seekRectRef = React.useRef(null);
+ const collisionDataRef = React.useRef<{
+ padding: { top: number; right: number; bottom: number; left: number };
+ boundaries: Element[];
+ } | null>(null);
+
+ const [seekState, setSeekState] = React.useState({
+ isHovering: false,
+ pendingSeekTime: null,
+ hasInitialPosition: false,
+ });
+
+ const rafIdRef = React.useRef(null);
+ const seekThrottleRef = React.useRef(null);
+ const hoverTimeoutRef = React.useRef(null);
+ const lastPointerXRef = React.useRef(0);
+ const lastPointerYRef = React.useRef(0);
+ const previewDebounceRef = React.useRef(null);
+ const pointerEnterTimeRef = React.useRef(0);
+ const horizontalMovementRef = React.useRef(0);
+ const verticalMovementRef = React.useRef(0);
+ const lastSeekCommitTimeRef = React.useRef(0);
+
+ const timeCache = React.useRef
@@ -137,7 +137,7 @@ const CampaignLiveSuccess: React.FC
= ({
diff --git a/features/projects/components/Contributions/ContributionsDataTable.tsx b/features/projects/components/Contributions/ContributionsDataTable.tsx
new file mode 100644
index 000000000..c7c7a06b0
--- /dev/null
+++ b/features/projects/components/Contributions/ContributionsDataTable.tsx
@@ -0,0 +1,170 @@
+'use client';
+
+import * as React from 'react';
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from '@/components/ui/table';
+import {
+ ColumnFiltersState,
+ SortingState,
+ VisibilityState,
+ flexRender,
+ getCoreRowModel,
+ getFilteredRowModel,
+ getPaginationRowModel,
+ getSortedRowModel,
+ useReactTable,
+} from '@tanstack/react-table';
+import { DataTablePagination } from '@/components/ui/data-table-pagination';
+import { Contributor } from '@/features/projects/types';
+import { contributionsTableColumns } from './ContributionsTableColumns';
+import { Input } from '@/components/ui/input';
+import { Search } from 'lucide-react';
+
+interface ContributionsDataTableProps {
+ data: Contributor[];
+ loading?: boolean;
+}
+
+export function ContributionsDataTable({
+ data,
+ loading = false,
+}: ContributionsDataTableProps) {
+ const [sorting, setSorting] = React.useState
([
+ { id: 'date', desc: true }, // Sort by date descending by default
+ ]);
+ const [columnFilters, setColumnFilters] = React.useState(
+ []
+ );
+ const [columnVisibility, setColumnVisibility] =
+ React.useState({});
+ const [rowSelection, setRowSelection] = React.useState({});
+ const [globalFilter, setGlobalFilter] = React.useState('');
+
+ const table = useReactTable({
+ data,
+ columns: contributionsTableColumns,
+ onSortingChange: setSorting,
+ onColumnFiltersChange: setColumnFilters,
+ getCoreRowModel: getCoreRowModel(),
+ getPaginationRowModel: getPaginationRowModel(),
+ getSortedRowModel: getSortedRowModel(),
+ getFilteredRowModel: getFilteredRowModel(),
+ onColumnVisibilityChange: setColumnVisibility,
+ onRowSelectionChange: setRowSelection,
+ onGlobalFilterChange: setGlobalFilter,
+ globalFilterFn: 'includesString',
+ state: {
+ sorting,
+ columnFilters,
+ columnVisibility,
+ rowSelection,
+ globalFilter,
+ },
+ initialState: {
+ pagination: {
+ pageSize: 10,
+ },
+ },
+ });
+
+ return (
+
+ {/* Search */}
+
+
+
+ setGlobalFilter(String(event.target.value))}
+ className='focus-visible:border-primary bg-background-card border-[#2B2B2B] pl-9 text-white placeholder:text-gray-600'
+ />
+
+
+
+ {/* Table */}
+
+
+
+ {table.getHeaderGroups().map(headerGroup => (
+
+ {headerGroup.headers.map(header => (
+
+ {header.isPlaceholder
+ ? null
+ : flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+
+ ))}
+
+ ))}
+
+
+ {loading ? (
+
+
+
+
+
+ ) : table.getRowModel().rows?.length ? (
+ table.getRowModel().rows.map(row => (
+
+ {row.getVisibleCells().map(cell => (
+
+ {flexRender(
+ cell.column.columnDef.cell,
+ cell.getContext()
+ )}
+
+ ))}
+
+ ))
+ ) : (
+
+
+
+
No contributions yet
+
+ Be the first to contribute to this project!
+
+
+
+
+ )}
+
+
+
+
+ {/* Pagination */}
+ {table.getRowModel().rows?.length > 0 && (
+
+ )}
+
+ );
+}
diff --git a/features/projects/components/Contributions/ContributionsTableColumns.tsx b/features/projects/components/Contributions/ContributionsTableColumns.tsx
new file mode 100644
index 000000000..e355b9421
--- /dev/null
+++ b/features/projects/components/Contributions/ContributionsTableColumns.tsx
@@ -0,0 +1,136 @@
+'use client';
+
+import { ColumnDef } from '@tanstack/react-table';
+import { Contributor } from '@/features/projects/types';
+import { formatNumber } from '@/lib/utils';
+import { ExternalLink } from 'lucide-react';
+import { getTransactionExplorerUrl } from '@/lib/wallet-utils';
+import { Button } from '@/components/ui/button';
+import { format } from 'date-fns';
+import Link from 'next/link';
+
+export const contributionsTableColumns: ColumnDef[] = [
+ {
+ accessorKey: 'name',
+ header: 'Contributor',
+ cell: ({ row }) => {
+ const contributor = row.original;
+ const isAnonymous = !contributor.name || contributor.name === 'Anonymous';
+
+ if (isAnonymous) {
+ return (
+
+ );
+ }
+
+ const profileUrl = `/profile/${contributor.username}`;
+
+ return (
+
+ {contributor.image ? (
+
+ ) : (
+
+
+ {contributor.name.charAt(0).toUpperCase()}
+
+
+ )}
+
+
+ {contributor.name}
+
+ {contributor.username && (
+
+ @{contributor.username}
+
+ )}
+
+
+ );
+ },
+ },
+ {
+ accessorKey: 'amount',
+ header: 'Amount',
+ cell: ({ row }) => {
+ const amount = row.getValue('amount') as number;
+ return (
+
+ {formatNumber(amount)} USD
+
+ );
+ },
+ },
+ {
+ accessorKey: 'message',
+ header: 'Message',
+ cell: ({ row }) => {
+ const message = row.original.message;
+
+ if (!message) {
+ return No message;
+ }
+
+ return (
+
+ );
+ },
+ },
+ {
+ accessorKey: 'date',
+ header: 'Date',
+ cell: ({ row }) => {
+ const date = row.getValue('date') as string;
+ try {
+ return (
+
+ {format(new Date(date), 'MMM dd, yyyy')}
+
+ );
+ } catch {
+ return Invalid date;
+ }
+ },
+ },
+ {
+ accessorKey: 'transactionHash',
+ header: 'Transaction',
+ cell: ({ row }) => {
+ const txHash = row.getValue('transactionHash') as string;
+ const explorerUrl = getTransactionExplorerUrl(txHash);
+
+ return (
+
+ );
+ },
+ },
+];
diff --git a/components/landing-page/project/CreateProjectModal/Basic.tsx b/features/projects/components/CreateProjectModal/Basic.tsx
similarity index 84%
rename from components/landing-page/project/CreateProjectModal/Basic.tsx
rename to features/projects/components/CreateProjectModal/Basic.tsx
index 4d07e6734..0020cb2c6 100644
--- a/components/landing-page/project/CreateProjectModal/Basic.tsx
+++ b/features/projects/components/CreateProjectModal/Basic.tsx
@@ -21,6 +21,8 @@ export interface BasicFormData {
projectName: string;
logo: File | string | null;
logoUrl?: string;
+ banner: File | string | null;
+ bannerUrl?: string;
vision: string;
category: string;
githubUrl: string;
@@ -59,6 +61,8 @@ const basicSchema = z
projectName: z.string().trim().min(1, 'Project name is required'),
logo: z.any().optional(),
logoUrl: z.string().optional(),
+ banner: z.any().optional(),
+ bannerUrl: z.string().optional(),
vision: z
.string()
.trim()
@@ -96,6 +100,8 @@ const Basic = React.forwardRef<{ validate: () => boolean }, BasicProps>(
projectName: initialData?.projectName || '',
logo: initialData?.logo || null,
logoUrl: initialData?.logoUrl || '',
+ banner: initialData?.banner || null,
+ bannerUrl: initialData?.bannerUrl || '',
vision: initialData?.vision || '',
category: initialData?.category || '',
githubUrl: initialData?.githubUrl || '',
@@ -110,6 +116,8 @@ const Basic = React.forwardRef<{ validate: () => boolean }, BasicProps>(
projectName: initialData.projectName || '',
logo: initialData.logo || null,
logoUrl: initialData.logoUrl || '',
+ banner: initialData.banner || null,
+ bannerUrl: initialData.bannerUrl || '',
vision: initialData.vision || '',
category: initialData.category || '',
githubUrl: initialData.githubUrl || '',
@@ -583,6 +591,141 @@ const Basic = React.forwardRef<{ validate: () => boolean }, BasicProps>(
+
+
+
+
{
+ const file = e.target.files?.[0];
+ if (file) {
+ // Reusing similar logic to logo upload but inline here or abstracted
+ // For brevity, duplicating logic with 'banner' key
+ setTouched(prev => ({ ...prev, banner: true }));
+ setUploadError(null);
+
+ if (!file.type.match(/^image\/(jpeg|png)$/)) {
+ setErrors(prev => ({
+ ...prev,
+ banner: 'Only JPEG and PNG files are allowed',
+ }));
+ return;
+ }
+
+ if (file.size > 5 * 1024 * 1024) {
+ // Banner can be slightly larger maybe? Keeping 5MB
+ setErrors(prev => ({
+ ...prev,
+ banner: 'File size must be less than 5MB',
+ }));
+ return;
+ }
+
+ handleInputChange('banner', file);
+ setIsUploading(true);
+ uploadService
+ .uploadSingle(file, {
+ folder: 'boundless/projects/banners',
+ tags: ['project', 'banner'],
+ transformation: {
+ width: 1200,
+ height: 400,
+ crop: 'fill',
+ quality: 'auto',
+ format: 'auto',
+ },
+ })
+ .then(uploadResult => {
+ if (uploadResult.success) {
+ handleInputChange(
+ 'bannerUrl',
+ uploadResult.data.secure_url
+ );
+ setFormData(prev => {
+ const newData = { ...prev, banner: null };
+ onDataChange?.(newData);
+ return newData;
+ });
+ setErrors(prev => ({ ...prev, banner: undefined }));
+ } else {
+ throw new Error(
+ uploadResult.message || 'Upload failed'
+ );
+ }
+ })
+ .catch(error => {
+ setUploadError(
+ error instanceof Error
+ ? error.message
+ : 'Banner upload failed'
+ );
+ setErrors(prev => ({
+ ...prev,
+ banner: 'Failed to upload banner. Please try again.',
+ }));
+ })
+ .finally(() => {
+ setIsUploading(false);
+ });
+ }
+ }}
+ className='hidden'
+ id='banner-upload'
+ />
+
+
+
+
- {/* {isActive && (
-
- )} */}
);
diff --git a/components/landing-page/project/CreateProjectModal/LoadingScreen.tsx b/features/projects/components/CreateProjectModal/LoadingScreen.tsx
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/LoadingScreen.tsx
rename to features/projects/components/CreateProjectModal/LoadingScreen.tsx
diff --git a/components/landing-page/project/CreateProjectModal/Milestones.tsx b/features/projects/components/CreateProjectModal/Milestones.tsx
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/Milestones.tsx
rename to features/projects/components/CreateProjectModal/Milestones.tsx
diff --git a/components/landing-page/project/CreateProjectModal/SuccessScreen.tsx b/features/projects/components/CreateProjectModal/SuccessScreen.tsx
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/SuccessScreen.tsx
rename to features/projects/components/CreateProjectModal/SuccessScreen.tsx
diff --git a/components/landing-page/project/CreateProjectModal/Team.tsx b/features/projects/components/CreateProjectModal/Team.tsx
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/Team.tsx
rename to features/projects/components/CreateProjectModal/Team.tsx
diff --git a/components/landing-page/project/CreateProjectModal/TransactionSigningScreen.tsx b/features/projects/components/CreateProjectModal/TransactionSigningScreen.tsx
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/TransactionSigningScreen.tsx
rename to features/projects/components/CreateProjectModal/TransactionSigningScreen.tsx
diff --git a/components/landing-page/project/CreateProjectModal/index copy.tsx b/features/projects/components/CreateProjectModal/index copy.tsx
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/index copy.tsx
rename to features/projects/components/CreateProjectModal/index copy.tsx
diff --git a/features/projects/components/CreateProjectModal/index.tsx b/features/projects/components/CreateProjectModal/index.tsx
new file mode 100644
index 000000000..5bac51666
--- /dev/null
+++ b/features/projects/components/CreateProjectModal/index.tsx
@@ -0,0 +1,192 @@
+import BoundlessSheet from '@/components/sheet/boundless-sheet';
+import { MultiStepLoader } from '@/components/ui/multi-step-loader';
+import React from 'react';
+import Header from './Header';
+import Footer from './Footer';
+import Basic from './Basic';
+import Details from './Details';
+import Milestones from './Milestones';
+import Team from './Team';
+import Contact from './Contact';
+import LoadingScreen from './LoadingScreen';
+import SuccessScreen from './SuccessScreen';
+import TransactionSigningScreen from './TransactionSigningScreen';
+import { cn } from '@/lib/utils';
+import { useCreateProject } from './useCreateProject';
+
+interface CreateProjectModalProps {
+ open: boolean;
+ setOpen: (open: boolean) => void;
+}
+
+const CreateProjectModal = ({ open, setOpen }: CreateProjectModalProps) => {
+ const {
+ currentStep,
+ isSubmitting,
+ submitErrors,
+ showSuccess,
+ isLoading,
+ flowStep,
+ formData,
+ stepRefs,
+ contentRef,
+ isSigningTransaction,
+ handleBack,
+ handleContinue,
+ handleRetry,
+ handleSignTransaction,
+ handleReset,
+ handleTestData,
+ handleDataChange,
+ isStepValid,
+ loaderActive,
+ loadingStates,
+ loadingStateIndex,
+ } = useCreateProject(open, setOpen);
+
+ const renderStepContent = () => {
+ // Handle the flow states
+ if (flowStep === 'initializing' || (isLoading && flowStep !== 'signing')) {
+ return
;
+ }
+ if (flowStep === 'success' || showSuccess) {
+ return
;
+ }
+ // Show loading screen during signing and confirming states
+ if (
+ flowStep === 'signing' ||
+ flowStep === 'confirming' ||
+ isSigningTransaction
+ ) {
+ return (
+
0}
+ errorMessage={submitErrors[0]}
+ />
+ );
+ }
+
+ switch (currentStep) {
+ case 1:
+ return (
+ handleDataChange('basic', data)}
+ initialData={formData.basic}
+ />
+ );
+ case 2:
+ return (
+ handleDataChange('details', data)}
+ initialData={formData.details}
+ />
+ );
+ case 3:
+ return (
+ handleDataChange('milestones', data)}
+ initialData={formData.milestones}
+ />
+ );
+ case 4:
+ return (
+ handleDataChange('team', data)}
+ initialData={formData.team}
+ />
+ );
+ case 5:
+ return (
+ handleDataChange('contact', data)}
+ initialData={formData.contact}
+ />
+ );
+ default:
+ return (
+ handleDataChange('basic', data)}
+ initialData={formData.basic}
+ />
+ );
+ }
+ };
+
+ return (
+ <>
+
+
+ {flowStep === 'form' && (
+
+ )}
+
+ {flowStep !== 'form' ? (
+
+ {renderStepContent()}
+
+ ) : (
+ <>
+ {submitErrors.length > 0 && (
+
+
+ Please fix the following errors before submitting:
+
+
+ {submitErrors.map((e, idx) => (
+ -
+ {e}
+
+ ))}
+
+
+ )}
+
{renderStepContent()}
+ >
+ )}
+
+ {flowStep === 'form' && (
+
+ )}
+
+ >
+ );
+};
+
+export default CreateProjectModal;
diff --git a/components/landing-page/project/CreateProjectModal/md-editor-custom.css b/features/projects/components/CreateProjectModal/md-editor-custom.css
similarity index 100%
rename from components/landing-page/project/CreateProjectModal/md-editor-custom.css
rename to features/projects/components/CreateProjectModal/md-editor-custom.css
diff --git a/features/projects/components/CreateProjectModal/schema.ts b/features/projects/components/CreateProjectModal/schema.ts
new file mode 100644
index 000000000..2a7e6510f
--- /dev/null
+++ b/features/projects/components/CreateProjectModal/schema.ts
@@ -0,0 +1,185 @@
+import { z } from 'zod';
+
+export const milestoneSchema = z
+ .object({
+ id: z.string().optional(),
+ title: z.string().trim().min(1),
+ description: z.string().trim().min(1),
+ startDate: z.string().min(1),
+ endDate: z.string().min(1),
+ })
+ .superRefine((val, ctx) => {
+ const today = new Date();
+ today.setHours(0, 0, 0, 0);
+
+ const startDate = new Date(val.startDate);
+ const endDate = new Date(val.endDate);
+
+ // Check if start date is in the future (at least tomorrow)
+ if (startDate <= today) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ['startDate'],
+ message: 'Start date must be at least tomorrow',
+ });
+ }
+
+ // Check if end date is after start date
+ if (endDate <= startDate) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ['endDate'],
+ message: 'End date must be after start date',
+ });
+ }
+
+ // Check if milestone has reasonable duration (at least 1 week)
+ const durationInDays = Math.ceil(
+ (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)
+ );
+ if (durationInDays < 7) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ['endDate'],
+ message: 'Milestone duration must be at least 1 week',
+ });
+ }
+
+ // Check if milestone is not too far in the future (max 2 years)
+ const maxFutureDate = new Date();
+ maxFutureDate.setFullYear(maxFutureDate.getFullYear() + 2);
+ if (startDate > maxFutureDate) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ['startDate'],
+ message: 'Start date cannot be more than 2 years in the future',
+ });
+ }
+ });
+
+export const projectSchema = z.object({
+ basic: z.object({
+ projectName: z.string().trim().min(1),
+ logo: z.any().optional(),
+ logoUrl: z.string().optional(),
+ banner: z.any().optional(),
+ bannerUrl: z.string().optional(),
+ vision: z.string().trim().min(1).max(300),
+ category: z.string().trim().min(1),
+ githubUrl: z
+ .string()
+ .trim()
+ .optional()
+ .or(z.literal(''))
+ .refine(
+ v => !v || /^https?:\/\/.+/i.test(v) || /^[\w.-]+\.[a-z]{2,}$/i.test(v),
+ {
+ message:
+ 'Please enter a valid URL (with or without https), e.g., https://github.com or github.com',
+ }
+ )
+ .optional(),
+ websiteUrl: z
+ .string()
+ .trim()
+ .optional()
+ .or(z.literal(''))
+ .refine(
+ v => !v || /^https?:\/\/.+/i.test(v) || /^[\w.-]+\.[a-z]{2,}$/i.test(v),
+ {
+ message:
+ 'Please enter a valid URL (with or without https), e.g., https://boundlessfi.xyz or boundlessfi.xyz',
+ }
+ )
+ .optional(),
+ demoVideoUrl: z
+ .string()
+ .trim()
+ .optional()
+ .or(z.literal(''))
+ .refine(
+ v => !v || /^https?:\/\/.+/i.test(v) || /^[\w.-]+\.[a-z]{2,}$/i.test(v),
+ {
+ message:
+ 'Please enter a valid URL (with or without https), e.g., https://demo.com or demo.com',
+ }
+ )
+ .optional(),
+ socialLinks: z.array(z.string()).min(1),
+ }),
+ details: z.object({
+ vision: z.string().trim().min(1),
+ }),
+ milestones: z.object({
+ fundingAmount: z
+ .string()
+ .refine(v => !isNaN(parseFloat(v)) && parseFloat(v) > 0),
+ milestones: z
+ .array(milestoneSchema)
+ .min(1)
+ .superRefine((milestones, ctx) => {
+ // Check that milestones are in chronological order
+ for (let i = 0; i < milestones.length - 1; i++) {
+ const currentEndDate = new Date(milestones[i].endDate);
+ const nextStartDate = new Date(milestones[i + 1].startDate);
+
+ // Allow some overlap (up to 1 day) but not significant overlap
+ const daysBetween = Math.ceil(
+ (nextStartDate.getTime() - currentEndDate.getTime()) /
+ (1000 * 60 * 60 * 24)
+ );
+
+ if (daysBetween < -1) {
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: [i + 1, 'startDate'],
+ message: `Milestone ${i + 2} start date should be after milestone ${i + 1} end date`,
+ });
+ }
+ }
+
+ // Check that total project timeline is reasonable (max 3 years)
+ if (milestones.length > 0) {
+ const firstStartDate = new Date(milestones[0].startDate);
+ const lastEndDate = new Date(
+ milestones[milestones.length - 1].endDate
+ );
+ const totalDurationInDays = Math.ceil(
+ (lastEndDate.getTime() - firstStartDate.getTime()) /
+ (1000 * 60 * 60 * 24)
+ );
+
+ if (totalDurationInDays > 1095) {
+ // 3 years
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ path: ['milestones'],
+ message: 'Total project timeline cannot exceed 3 years',
+ });
+ }
+ }
+ }),
+ }),
+ team: z
+ .object({
+ members: z
+ .array(
+ z.object({
+ id: z.string(),
+ email: z.string().email(),
+ role: z.string().optional(),
+ })
+ )
+ .optional()
+ .default([]),
+ })
+ .optional()
+ .default({ members: [] }),
+ contact: z.object({
+ telegram: z.string().trim().min(1),
+ backupType: z.enum(['discord', 'whatsapp']),
+ backupContact: z.string().trim().min(1),
+ agreeToTerms: z.literal(true),
+ agreeToPrivacy: z.literal(true),
+ }),
+});
diff --git a/features/projects/components/CreateProjectModal/test-data.ts b/features/projects/components/CreateProjectModal/test-data.ts
new file mode 100644
index 000000000..a3da6e787
--- /dev/null
+++ b/features/projects/components/CreateProjectModal/test-data.ts
@@ -0,0 +1,220 @@
+import { ProjectFormData } from './types';
+
+export const TEST_PROJECT_TEMPLATES: Record = {
+ defi: {
+ basic: {
+ projectName: 'Nebula Finance',
+ logo: 'https://res.cloudinary.com/danuy5rqb/image/upload/v1759431246/boundless/projects/logos/jfc5v0l6xec0bdhmliet.png',
+ logoUrl:
+ 'https://res.cloudinary.com/danuy5rqb/image/upload/v1759431246/boundless/projects/logos/jfc5v0l6xec0bdhmliet.png',
+ banner:
+ 'https://images.unsplash.com/photo-1639762681485-074b7f938ba0?auto=format&fit=crop&q=80&w=2832&ixlib=rb-4.0.3',
+ bannerUrl:
+ 'https://images.unsplash.com/photo-1639762681485-074b7f938ba0?auto=format&fit=crop&q=80&w=2832&ixlib=rb-4.0.3',
+ vision:
+ 'Nebula Finance is redefining decentralized finance with real-time, cross-chain yield aggregation and AI-driven investment strategies for both retail and institutional users.',
+ category: 'DeFi & Finance',
+ githubUrl: 'https://github.com/nebula-finance/nebula-protocol',
+ websiteUrl: 'https://nebula.finance',
+ demoVideoUrl: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
+ socialLinks: [
+ 'https://twitter.com/nebula_defi',
+ 'https://discord.gg/nebula-finance',
+ 'https://t.me/nebula_defi',
+ ],
+ },
+ details: {
+ vision: `# Nebula Finance Vision
+
+## Overview
+Nebula Finance is a next-generation DeFi protocol that enables users to earn optimized yields across multiple blockchains without needing to actively manage assets.
+
+## Core Features
+- **AI Yield Optimization**: Machine-learning models analyze yield opportunities in real-time.
+- **Cross-Chain Aggregation**: Unified interface across Ethereum, Arbitrum, and Optimism.
+- **Decentralized Governance**: Token holders influence strategy and emissions.
+
+## Roadmap
+- **Q1 2026**: Smart contract audit and testnet launch
+- **Q2 2026**: Mainnet launch with ETH, ARB, integrations
+- **Q3 2026**: Cross-chain dashboard`,
+ },
+ milestones: {
+ fundingAmount: '250000',
+ milestones: [
+ {
+ id: 'milestone-1',
+ title: 'Protocol Architecture & Smart Contracts',
+ description:
+ 'Design core protocol architecture and write smart contracts for vaults, rebalancing, and governance.',
+ startDate: '2026-06-01',
+ endDate: '2026-08-30',
+ },
+ {
+ id: 'milestone-2',
+ title: 'UI/UX Development',
+ description:
+ 'Design and develop the frontend interface with wallet integrations (MetaMask, WalletConnect).',
+ startDate: '2026-09-01',
+ endDate: '2026-10-31',
+ },
+ {
+ id: 'milestone-3',
+ title: 'Security Audits & Launch',
+ description:
+ 'Conduct security audits, final integration tests, and launch the protocol on mainnet.',
+ startDate: '2026-11-01',
+ endDate: '2026-12-31',
+ },
+ ],
+ },
+ team: {
+ members: [
+ { id: 'm1', email: 'alice@nebula.finance' },
+ { id: 'm2', email: 'bob@nebula.finance' },
+ ],
+ },
+ contact: {
+ telegram: 'nebula_support',
+ backupType: 'discord',
+ backupContact: 'nebula_admin#0420',
+ agreeToTerms: true,
+ agreeToPrivacy: true,
+ },
+ },
+ rwa: {
+ basic: {
+ projectName: 'RealEstate Tokenizer',
+ logo: 'https://images.unsplash.com/photo-1560518883-ce09059eeffa?auto=format&fit=crop&q=80&w=1000',
+ logoUrl:
+ 'https://images.unsplash.com/photo-1560518883-ce09059eeffa?auto=format&fit=crop&q=80&w=1000',
+ banner:
+ 'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&q=80&w=2070',
+ bannerUrl:
+ 'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&q=80&w=2070',
+ vision:
+ 'Democratizing access to premium real estate investments through fractionalized NFT ownership and compliant security tokens.',
+ category: 'Real World Assets',
+ websiteUrl: 'https://retokenizer.io',
+ socialLinks: ['https://twitter.com/retokenizer'],
+ },
+ details: {
+ vision: `# RealEstate Tokenizer
+
+## Problem
+High barrier to entry for real estate investment.
+
+## Solution
+Fractionalized ownership via blockchain.
+
+## Legal
+Fully compliant with REG D/S.`,
+ },
+ milestones: {
+ fundingAmount: '500000',
+ milestones: [
+ {
+ id: 'm1',
+ title: 'Legal Framework & Entity Setup',
+ description: 'Establish SPVs and legal opinions for tokenization.',
+ startDate: '2026-03-01',
+ endDate: '2026-05-01',
+ },
+ {
+ id: 'm2',
+ title: 'Platform MVP',
+ description: 'Develop the marketplace for trading property tokens.',
+ startDate: '2026-05-02',
+ endDate: '2026-08-01',
+ },
+ ],
+ },
+ team: { members: [] },
+ contact: {
+ telegram: 're_support',
+ backupType: 'whatsapp',
+ backupContact: '+15550199',
+ agreeToTerms: true,
+ agreeToPrivacy: true,
+ },
+ },
+ devtool: {
+ basic: {
+ projectName: 'Solidity Linter Pro',
+ logo: 'https://images.unsplash.com/photo-1580894732444-8ecded7900cd?auto=format&fit=crop&q=80&w=1000',
+ logoUrl:
+ 'https://images.unsplash.com/photo-1580894732444-8ecded7900cd?auto=format&fit=crop&q=80&w=1000',
+ banner:
+ 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?auto=format&fit=crop&q=80&w=2070',
+ bannerUrl:
+ 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?auto=format&fit=crop&q=80&w=2070',
+ vision:
+ 'An advanced static analysis tool for Solidity smart contracts that detects vulnerabilities and gas optimizations in real-time.',
+ category: 'Developer Tools',
+ githubUrl: 'https://github.com/sol-linter/pro',
+ },
+ details: {
+ vision: `# Solidity Linter Pro
+
+Focuses on security and gas efficiency.`,
+ },
+ milestones: {
+ fundingAmount: '50000',
+ milestones: [
+ {
+ id: 'm1',
+ title: 'Core Analyzer Engine',
+ description: 'Implement AST parsing and basic rule set.',
+ startDate: '2026-02-01',
+ endDate: '2026-04-01',
+ },
+ ],
+ },
+ team: { members: [] },
+ contact: {
+ telegram: 'sollinter',
+ backupType: 'discord',
+ backupContact: 'dev#1234',
+ agreeToTerms: true,
+ agreeToPrivacy: true,
+ },
+ },
+ amm: {
+ basic: {
+ projectName: 'LiquidSwap AMM',
+ logo: 'https://images.unsplash.com/photo-1622630998477-20aa696fab05?auto=format&fit=crop&q=80&w=1000',
+ logoUrl:
+ 'https://images.unsplash.com/photo-1622630998477-20aa696fab05?auto=format&fit=crop&q=80&w=1000',
+ banner:
+ 'https://images.unsplash.com/photo-1642104704074-907c0698cbd9?auto=format&fit=crop&q=80&w=2832',
+ bannerUrl:
+ 'https://images.unsplash.com/photo-1642104704074-907c0698cbd9?auto=format&fit=crop&q=80&w=2832',
+ vision:
+ 'A next-gen AMM with concentrated liquidity and impermanent loss protection mechanisms.',
+ category: 'DeFi & Finance',
+ },
+ details: {
+ vision: 'Concentrated liquidity AMM.',
+ },
+ milestones: {
+ fundingAmount: '150000',
+ milestones: [
+ {
+ id: 'm1',
+ title: 'Smart Contracts',
+ description: 'Swap router and liquidity pools.',
+ startDate: '2026-07-01',
+ endDate: '2026-09-01',
+ },
+ ],
+ },
+ team: { members: [] },
+ contact: {
+ telegram: 'liquidswap',
+ backupType: 'discord',
+ backupContact: 'admin#9999',
+ agreeToTerms: true,
+ agreeToPrivacy: true,
+ },
+ },
+};
diff --git a/features/projects/components/CreateProjectModal/types.ts b/features/projects/components/CreateProjectModal/types.ts
new file mode 100644
index 000000000..ce589b120
--- /dev/null
+++ b/features/projects/components/CreateProjectModal/types.ts
@@ -0,0 +1,13 @@
+import { BasicFormData } from './Basic';
+import { DetailsFormData } from './Details';
+import { MilestonesFormData } from './Milestones';
+import { TeamFormData } from './Team';
+import { ContactFormData } from './Contact';
+
+export interface ProjectFormData {
+ basic: Partial;
+ details: Partial;
+ milestones: Partial;
+ team: Partial;
+ contact: Partial;
+}
diff --git a/features/projects/components/CreateProjectModal/useCreateProject.ts b/features/projects/components/CreateProjectModal/useCreateProject.ts
new file mode 100644
index 000000000..c12d23b64
--- /dev/null
+++ b/features/projects/components/CreateProjectModal/useCreateProject.ts
@@ -0,0 +1,537 @@
+import { useState, useRef, useEffect, useCallback } from 'react';
+import { createCrowdfundingProject } from '@/features/projects/api';
+import { CreateCrowdfundingProjectRequest } from '@/lib/api/types';
+import { useWalletProtection } from '@/hooks/use-wallet-protection';
+import { useWalletContext } from '@/components/providers/wallet-provider';
+import { signTransaction } from '@/lib/config/wallet-kit';
+import {
+ useInitializeEscrow,
+ useSendTransaction,
+} from '@trustless-work/escrow';
+import {
+ InitializeMultiReleaseEscrowPayload,
+ EscrowType,
+ EscrowRequestResponse,
+ Status,
+ InitializeMultiReleaseEscrowResponse,
+} from '@trustless-work/escrow';
+import { projectSchema } from './schema';
+import { mapFormDataToApiRequest } from './utils';
+import { ProjectFormData } from './types';
+
+export type StepHandle = {
+ validate: () => boolean;
+ markSubmitted?: () => void;
+};
+
+export const useCreateProject = (
+ open: boolean,
+ setOpen: (open: boolean) => void
+) => {
+ const [currentStep, setCurrentStep] = useState(1);
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [submitErrors, setSubmitErrors] = useState([]);
+ const [showSuccess, setShowSuccess] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
+ const [unsignedTransaction, setUnsignedTransaction] = useState(
+ null
+ );
+ const [isSigningTransaction, setIsSigningTransaction] = useState(false);
+
+ // Escrow hooks
+ const { deployEscrow } = useInitializeEscrow();
+ const { sendTransaction } = useSendTransaction();
+
+ // Flow state // Extract these types to types.ts later if reused elsewhere
+ const [flowStep, setFlowStep] = useState<
+ 'form' | 'initializing' | 'signing' | 'confirming' | 'success'
+ >('form');
+
+ const { walletAddress } = useWalletContext() || {
+ walletAddress: '',
+ };
+
+ // Form data state
+ const [formData, setFormData] = useState({
+ basic: {},
+ details: {},
+ milestones: {},
+ team: {},
+ contact: {},
+ });
+
+ // Refs for step components to access validation methods
+ const stepRefs = {
+ basic: useRef(null),
+ details: useRef(null),
+ milestones: useRef(null),
+ team: useRef(null),
+ contact: useRef(null),
+ };
+
+ // Ref for the scrollable content container
+ const contentRef = useRef(null);
+
+ // Wallet signing hooks
+ const { requireWallet } = useWalletProtection({
+ actionName: 'sign project creation transaction',
+ });
+
+ // Reset scroll position when step changes with smooth transition
+ useEffect(() => {
+ if (currentStep === 1) return; // Skip for initial load
+
+ const resetScroll = () => {
+ window.scrollTo(0, 0);
+
+ if (contentRef.current) {
+ const scrollableParent =
+ contentRef.current.closest('[data-radix-scroll-area-viewport]') ||
+ contentRef.current.closest('.overflow-y-auto') ||
+ contentRef.current.parentElement?.querySelector('.overflow-y-auto');
+
+ if (scrollableParent) {
+ scrollableParent.scrollTop = 0;
+ } else {
+ contentRef.current.scrollTop = 0;
+ }
+
+ const allScrollableElements =
+ document.querySelectorAll('.overflow-y-auto');
+ allScrollableElements.forEach(element => {
+ if (element.contains(contentRef.current)) {
+ element.scrollTop = 0;
+ }
+ });
+ }
+ };
+
+ resetScroll();
+ }, [currentStep]);
+
+ // Auto-trigger transaction signing when we reach the signing state
+ useEffect(() => {
+ if (
+ flowStep === 'signing' &&
+ unsignedTransaction &&
+ !isSigningTransaction &&
+ submitErrors.length === 0
+ ) {
+ handleSignTransaction();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ flowStep,
+ unsignedTransaction,
+ isSigningTransaction,
+ submitErrors.length,
+ ]);
+
+ const handleBack = () => {
+ if (currentStep > 1) {
+ setCurrentStep(currentStep - 1);
+ }
+ };
+
+ const getStepKey = (step: number): keyof typeof stepRefs => {
+ switch (step) {
+ case 1:
+ return 'basic';
+ case 2:
+ return 'details';
+ case 3:
+ return 'milestones';
+ case 4:
+ return 'team';
+ case 5:
+ return 'contact';
+ default:
+ return 'basic';
+ }
+ };
+
+ const validateCurrentStep = (): boolean => {
+ const stepRef = stepRefs[getStepKey(currentStep)];
+ return stepRef?.current?.validate() ?? true;
+ };
+
+ const handleContinue = async () => {
+ const key = getStepKey(currentStep);
+ stepRefs[key].current?.markSubmitted?.();
+
+ if (!validateCurrentStep()) {
+ return;
+ }
+
+ if (currentStep < 5) {
+ setCurrentStep(currentStep + 1);
+ return;
+ }
+
+ await handleSubmit();
+ };
+
+ const handleRetry = () => {
+ setSubmitErrors([]);
+ setFlowStep('signing');
+ };
+
+ const handleCreateProject = async (
+ contractId: string,
+ transactionHash: string
+ ) => {
+ try {
+ const apiRequest = mapFormDataToApiRequest(formData);
+
+ const projectRequest: CreateCrowdfundingProjectRequest = {
+ ...apiRequest,
+ escrowId: contractId,
+ transactionHash,
+ };
+
+ await createCrowdfundingProject(projectRequest);
+
+ setFlowStep('success');
+ setShowSuccess(true);
+ setIsSigningTransaction(false);
+ setIsSubmitting(false);
+ setLoaderActive(false);
+ } catch (error) {
+ let errorMessage = 'Failed to create project. Please try again.';
+
+ if (error instanceof Error) {
+ errorMessage = error.message;
+ }
+
+ setSubmitErrors([errorMessage]);
+ setIsSigningTransaction(false);
+ setFlowStep('signing');
+ setLoaderActive(false);
+ }
+ };
+
+ const handleSignTransaction = async () => {
+ if (!unsignedTransaction) {
+ setSubmitErrors(['No transaction to sign']);
+ return;
+ }
+
+ const walletValid = await requireWallet(async () => {
+ setIsSigningTransaction(true);
+ setFlowStep('confirming');
+ setLoaderActive(true); // Re-activate loader
+ setLoadingStateIndex(3); // Deploying Escrow (Signing & Sending)
+
+ try {
+ const signedXdr = await signTransaction({
+ unsignedTransaction,
+ address: walletAddress || '',
+ });
+
+ const sendResponse = await sendTransaction(signedXdr);
+
+ if (
+ 'status' in sendResponse &&
+ sendResponse.status !== ('SUCCESS' as Status)
+ ) {
+ const errorMessage =
+ 'message' in sendResponse &&
+ typeof sendResponse.message === 'string'
+ ? sendResponse.message
+ : 'Failed to send transaction';
+ throw new Error(errorMessage);
+ }
+
+ if (!('contractId' in sendResponse)) {
+ throw new Error('Response does not contain contractId');
+ }
+
+ const responseData =
+ sendResponse as InitializeMultiReleaseEscrowResponse;
+ const contractId = responseData.contractId;
+ const transactionHash = contractId;
+
+ setLoadingStateIndex(4); // Finalizing Project
+ await handleCreateProject(contractId, transactionHash);
+ } catch (error) {
+ setLoaderActive(false);
+ let errorMessage = 'Failed to sign transaction. Please try again.';
+
+ if (error instanceof Error) {
+ if (error.message.includes('User rejected')) {
+ errorMessage =
+ 'Transaction signing was cancelled. Please try again.';
+ } else if (error.message.includes('Invalid transaction')) {
+ errorMessage =
+ 'Invalid transaction format. Please contact support.';
+ } else if (error.message.includes('Network')) {
+ errorMessage =
+ 'Network error. Please check your connection and try again.';
+ } else if (error.message.includes('Wallet not connected')) {
+ errorMessage =
+ 'Wallet is not connected. Please reconnect your wallet.';
+ } else {
+ errorMessage = error.message;
+ }
+ }
+
+ setSubmitErrors([errorMessage]);
+ setIsSigningTransaction(false);
+ setFlowStep('signing');
+ }
+ });
+
+ if (!walletValid) {
+ return;
+ }
+ };
+
+ // Loader state
+ const [loaderActive, setLoaderActive] = useState(false);
+ const [loadingStates] = useState([
+ { text: 'Validating Project Details' },
+ { text: 'Preparing Smart Contract' },
+ { text: 'Waiting for Signature' },
+ { text: 'Deploying Escrow' },
+ { text: 'Finalizing Project' },
+ ]);
+ const [loadingStateIndex, setLoadingStateIndex] = useState(0);
+
+ const handleSubmit = async () => {
+ setIsSubmitting(true);
+ // setIsLoading(true); // Handled by loaderActive now
+ setSubmitErrors([]);
+
+ try {
+ const payload: ProjectFormData = {
+ ...formData,
+ contact: {
+ ...(formData.contact || {}),
+ agreeToTerms: true,
+ agreeToPrivacy: true,
+ },
+ } as ProjectFormData;
+
+ const parsed = projectSchema.safeParse(payload);
+ if (!parsed.success) {
+ setSubmitErrors(
+ parsed.error.issues.map(i => `${i.path.join('.')} - ${i.message}`)
+ );
+ setIsSubmitting(false);
+ setFlowStep('form');
+ return;
+ }
+
+ if (!walletAddress) {
+ throw new Error(
+ 'Wallet not connected. Please connect your wallet first.'
+ );
+ }
+
+ const apiRequest = mapFormDataToApiRequest(formData);
+
+ // Step 1: Validate Project Data
+ setLoaderActive(true);
+ setLoadingStateIndex(0); // Validating Project Details
+
+ try {
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
+ const {
+ validateCrowdfundingProject,
+ } = require('@/features/projects/api');
+ await validateCrowdfundingProject(apiRequest);
+ } catch (error: any) {
+ // If validation fails, stop everything
+ setLoaderActive(false);
+ const errorMessage =
+ error.response?.data?.message || error.message || 'Validation failed';
+ setSubmitErrors([errorMessage]);
+ setIsSubmitting(false);
+ return;
+ }
+
+ setLoadingStateIndex(1); // Preparing Smart Contract
+
+ const milestones = payload.milestones || {
+ milestones: [],
+ fundingAmount: '0',
+ };
+ const totalFunding = parseFloat(milestones.fundingAmount || '0');
+ const milestoneCount = milestones.milestones?.length || 1;
+ const amountPerMilestone = Math.floor(totalFunding / milestoneCount);
+
+ const escrowPayload: InitializeMultiReleaseEscrowPayload = {
+ signer: walletAddress,
+ engagementId: `project-${Date.now()}`,
+ title: payload.basic?.projectName || 'Crowdfunding Project',
+ description: payload.basic?.vision || payload.details?.vision || '',
+ platformFee: 4,
+ trustline: {
+ address: 'GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5',
+ symbol: 'USDC',
+ },
+ roles: {
+ approver: walletAddress,
+ serviceProvider: walletAddress,
+ platformAddress: walletAddress,
+ releaseSigner: walletAddress,
+ disputeResolver: walletAddress,
+ },
+ milestones: (milestones.milestones || []).map(milestone => ({
+ description: `${milestone.title}: ${milestone.description}`,
+ amount: amountPerMilestone,
+ receiver: walletAddress,
+ })),
+ };
+
+ setFlowStep('initializing'); // This might be redundant if we just use loader, but keeping for compatibility
+
+ setLoadingStateIndex(1); // Preparing Smart Contract (still)
+
+ const escrowResponse: EscrowRequestResponse = await deployEscrow(
+ escrowPayload,
+ 'multi-release' as EscrowType
+ );
+
+ if (
+ escrowResponse.status !== ('SUCCESS' as Status) ||
+ !escrowResponse.unsignedTransaction
+ ) {
+ const errorMessage =
+ 'message' in escrowResponse &&
+ typeof escrowResponse.message === 'string'
+ ? escrowResponse.message
+ : 'Failed to initialize escrow';
+ throw new Error(errorMessage);
+ }
+
+ const { unsignedTransaction } = escrowResponse;
+ setUnsignedTransaction(unsignedTransaction);
+
+ setLoadingStateIndex(2); // Waiting for Signature
+ // At this point we need user signature.
+ // We might want to pause the loader or update text?
+ // The original flow stopped here for user to click "Sign".
+ // But user wants "Cleanly written".
+ // If we auto-trigger sign, we can keep loader up.
+ // Let's rely on the useEffect that watches `flowStep === 'signing'`
+
+ setFlowStep('signing');
+ setLoaderActive(false); // Hide loader while waiting for user interaction/signature?
+ // Or keep it but maybe with a different state?
+ // User request implies a continuous flow.
+ // If `requireWallet` pops up a modal, we might want to keep the loader in background or hide it.
+ // Let's hide it for now because the signing step is manual in the current UI (button click or auto-trigger).
+ // Actually, let's keep it consistent with the previous flow but just add the validation step.
+
+ setIsLoading(false);
+ } catch (error) {
+ setLoaderActive(false);
+ let errorMessage = 'Error preparing project. Please try again.';
+
+ if (error instanceof Error) {
+ if (error.message.includes('Network')) {
+ errorMessage =
+ 'Network error. Please check your connection and try again.';
+ } else if (error.message.includes('Validation')) {
+ errorMessage =
+ 'Project validation failed. Please check your project details.';
+ } else if (error.message.includes('Unauthorized')) {
+ errorMessage =
+ 'Authentication required. Please log in and try again.';
+ } else if (error.message.includes('Server')) {
+ errorMessage = 'Server error. Please try again in a few moments.';
+ } else {
+ errorMessage = error.message;
+ }
+ }
+
+ setSubmitErrors([errorMessage]);
+ setIsLoading(false);
+ setIsSubmitting(false);
+ setFlowStep('form');
+ }
+ };
+
+ const handleDataChange = useCallback(
+ (step: K, data: ProjectFormData[K]) => {
+ setFormData(prev => ({
+ ...prev,
+ [step]: {
+ ...(prev[step] as Record),
+ ...(data as Record),
+ },
+ }));
+ },
+ []
+ );
+
+ const isStepValid = (() => {
+ if (currentStep === 2) {
+ const v = (formData.details?.vision || '').trim();
+ return v.length > 0;
+ }
+ if (currentStep === 5) {
+ const contact = formData.contact || {};
+ return !!(
+ contact.telegram?.trim() &&
+ contact.backupType &&
+ contact.backupContact?.trim()
+ );
+ }
+ return true;
+ })();
+
+ const handleReset = () => {
+ setFormData({
+ basic: {},
+ details: {},
+ milestones: {},
+ team: {},
+ contact: {},
+ });
+ setCurrentStep(1);
+ setShowSuccess(false);
+ setIsLoading(false);
+ setUnsignedTransaction(null);
+ setIsSigningTransaction(false);
+ setSubmitErrors([]);
+ setFlowStep('form');
+ setOpen(false);
+ };
+
+ const handleTestData = (templateKey: string = 'defi') => {
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
+ const { TEST_PROJECT_TEMPLATES } = require('./test-data');
+ const template = TEST_PROJECT_TEMPLATES[templateKey];
+
+ if (template) {
+ setFormData(template);
+ }
+ };
+
+ return {
+ currentStep,
+ setCurrentStep,
+ isSubmitting,
+ submitErrors,
+ showSuccess,
+ isLoading,
+ flowStep,
+ formData,
+ stepRefs,
+ contentRef,
+ isSigningTransaction,
+ handleBack,
+ handleContinue,
+ handleRetry,
+ handleSignTransaction,
+ handleReset,
+ handleTestData,
+ handleDataChange,
+ isStepValid,
+ loaderActive,
+ loadingStates,
+ loadingStateIndex,
+ };
+};
diff --git a/features/projects/components/CreateProjectModal/utils.ts b/features/projects/components/CreateProjectModal/utils.ts
new file mode 100644
index 000000000..af962a32b
--- /dev/null
+++ b/features/projects/components/CreateProjectModal/utils.ts
@@ -0,0 +1,90 @@
+import { CreateCrowdfundingProjectRequest } from '@/lib/api/types';
+import { ProjectFormData } from './types';
+
+export const mapFormDataToApiRequest = (
+ data: ProjectFormData
+): CreateCrowdfundingProjectRequest => {
+ const basic = data.basic || {};
+ const details = data.details || {};
+ const milestones = data.milestones || {
+ fundingAmount: '0',
+ milestones: [],
+ };
+ const team = data.team || { members: [] };
+ const contact = data.contact || {
+ telegram: '',
+ backupType: 'whatsapp',
+ backupContact: '',
+ };
+
+ // Convert milestones to API format
+ const apiMilestones = (milestones.milestones || []).map(
+ (milestone, index) => {
+ // Create a date object from the end date string
+ const endDate = milestone.endDate
+ ? new Date(milestone.endDate).toISOString()
+ : new Date().toISOString();
+
+ // Calculate percentage (equal distribution for now as per previous logic)
+ // Ideally this should be user definable but keeping it simple for now
+ const count = milestones.milestones?.length || 1;
+ const percentage = parseFloat((100 / count).toFixed(2));
+
+ return {
+ title: milestone.title,
+ description: milestone.description,
+ deliverable: milestone.description,
+ expectedDeliveryDate: endDate,
+ fundingPercentage: percentage,
+ orderIndex: index,
+ amount:
+ (percentage / 100) *
+ (parseFloat(milestones.fundingAmount || '0') || 0),
+ };
+ }
+ );
+
+ // Convert team members to API format
+ const apiTeam = (team.members || []).map(member => ({
+ name: member.email.split('@')[0], // Extract name from email
+ role: 'MEMBER', // Default role for all members
+ email: member.email,
+ }));
+
+ // Convert social links to API format
+ const socialLinks = basic.socialLinks?.filter(link => link.trim()) || [];
+ const apiSocialLinks = socialLinks.map(link => ({
+ platform: link.startsWith('https://twitter.com/')
+ ? 'twitter'
+ : link.startsWith('https://discord.gg/')
+ ? 'discord'
+ : link.startsWith('https://t.me/')
+ ? 'telegram'
+ : 'other', // Default platform
+ url: link,
+ }));
+
+ return {
+ title: basic.projectName || '',
+ logo: basic.logoUrl || '',
+ banner: basic.bannerUrl || undefined,
+ vision: basic.vision || '',
+ category: basic.category || '',
+ details: details.vision || '',
+ fundingAmount: parseFloat(milestones.fundingAmount || '0') || 0,
+ githubUrl: basic.githubUrl || undefined,
+ gitlabUrl: undefined,
+ bitbucketUrl: undefined,
+ projectWebsite: basic.websiteUrl || undefined,
+ demoVideo: basic.demoVideoUrl || undefined,
+ milestones: apiMilestones,
+ team: apiTeam,
+ contact: {
+ primary: `@${contact.telegram || ''}`,
+ backup: contact.backupContact || '',
+ },
+ socialLinks: apiSocialLinks,
+ escrowId: '',
+ transactionHash: '',
+ };
+};
diff --git a/components/projects/ExploreHeader.tsx b/features/projects/components/ExploreHeader.tsx
similarity index 100%
rename from components/projects/ExploreHeader.tsx
rename to features/projects/components/ExploreHeader.tsx
diff --git a/components/project/Initialize.tsx b/features/projects/components/Initialize.tsx
similarity index 98%
rename from components/project/Initialize.tsx
rename to features/projects/components/Initialize.tsx
index a479e54c7..5460ab3b3 100644
--- a/components/project/Initialize.tsx
+++ b/features/projects/components/Initialize.tsx
@@ -3,14 +3,14 @@ import ProjectSubmissionForm, {
ProjectSubmissionData,
} from './ProjectSubmissionForm';
import { Button } from '@/components/ui/button';
-import { initProject } from '@/lib/api/project';
+import { initProject } from '@/features/projects/api';
import type { ProjectInitRequest } from '@/lib/api/types';
import { toast } from 'sonner';
import type { Milestone } from './MilestoneForm';
import MilestoneManager from './MilestoneManager';
import MilestoneReview from './MilestoneReview';
import ProjectSubmissionSuccess from './ProjectSubmissionSuccess';
-import Loading from '../Loading';
+import Loading from '@/components/loading/Loading';
import { useWalletProtection } from '@/hooks/use-wallet-protection';
import WalletRequiredModal from '@/components/wallet/WalletRequiredModal';
@@ -122,7 +122,7 @@ const Initialize: React.FC = ({ onSuccess }) => {
description: m.description,
deliveryDate: m.deliveryDate,
fundPercentage: pct,
- fundAmount: amt,
+ amount: amt,
};
});
@@ -132,7 +132,7 @@ const Initialize: React.FC = ({ onSuccess }) => {
tagline: formData.tagline,
type: 'crowdfund',
category: formData.category,
- fundAmount: formData.fundAmount,
+ amount: formData.fundAmount,
tags: formData.tags,
milestones: milestonesPayload,
thumbnail: 'https://placehold.co/600x400',
diff --git a/features/projects/components/Milestone/MilestoneEvidence.tsx b/features/projects/components/Milestone/MilestoneEvidence.tsx
new file mode 100644
index 000000000..e743d83f5
--- /dev/null
+++ b/features/projects/components/Milestone/MilestoneEvidence.tsx
@@ -0,0 +1,133 @@
+'use client';
+
+import React from 'react';
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
+import {
+ FileText,
+ Image as ImageIcon,
+ Video,
+ Link as LinkIcon,
+ ExternalLink,
+} from 'lucide-react';
+import Image from 'next/image';
+
+interface MilestoneEvidenceProps {
+ evidence: string;
+ attachments?: Array<{
+ type: 'image' | 'video' | 'document' | 'link';
+ url: string;
+ name?: string;
+ }>;
+}
+
+export function MilestoneEvidence({
+ evidence,
+ attachments,
+}: MilestoneEvidenceProps) {
+ return (
+
+
+ Evidence & Proof of Work
+
+
+ {/* Text Evidence */}
+
+
+ {/* Attachments */}
+ {attachments && attachments.length > 0 && (
+
+
Attachments
+
+ {attachments.map((attachment, index) => (
+
+ ))}
+
+
+ )}
+
+
+ );
+}
+
+function AttachmentItem({
+ type,
+ url,
+ name,
+}: {
+ type: string;
+ url: string;
+ name?: string;
+}) {
+ const getIcon = () => {
+ switch (type) {
+ case 'image':
+ return ;
+ case 'video':
+ return ;
+ case 'document':
+ return ;
+ case 'link':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ if (type === 'image') {
+ return (
+
+
+
+
+ );
+ }
+
+ if (type === 'video') {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ {getIcon()}
+
+
{name || 'Attachment'}
+
{type}
+
+
+
+ );
+}
diff --git a/features/projects/components/Milestone/MilestoneStatusCard.tsx b/features/projects/components/Milestone/MilestoneStatusCard.tsx
new file mode 100644
index 000000000..e2581e56a
--- /dev/null
+++ b/features/projects/components/Milestone/MilestoneStatusCard.tsx
@@ -0,0 +1,202 @@
+'use client';
+
+import React from 'react';
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
+import { Badge } from '@/components/ui/badge';
+import { CheckCircle2, Clock, XCircle, AlertCircle } from 'lucide-react';
+
+interface MilestoneStatusCardProps {
+ status: string;
+ evidence?: string;
+ submittedAt?: string;
+ approvedAt?: string;
+ rejectedAt?: string;
+}
+
+const statusConfig = {
+ pending: {
+ label: 'Pending',
+ icon: Clock,
+ color: 'text-yellow-500',
+ bgColor: 'bg-yellow-500/10',
+ borderColor: 'border-yellow-500/30',
+ },
+ 'in-progress': {
+ label: 'In Progress',
+ icon: Clock,
+ color: 'text-blue-500',
+ bgColor: 'bg-blue-500/10',
+ borderColor: 'border-blue-500/30',
+ },
+ submitted: {
+ label: 'Submitted for Review',
+ icon: AlertCircle,
+ color: 'text-orange-500',
+ bgColor: 'bg-orange-500/10',
+ borderColor: 'border-orange-500/30',
+ },
+ 'in-review': {
+ label: 'Under Review',
+ icon: AlertCircle,
+ color: 'text-purple-500',
+ bgColor: 'bg-purple-500/10',
+ borderColor: 'border-purple-500/30',
+ },
+ completed: {
+ label: 'Completed',
+ icon: CheckCircle2,
+ color: 'text-green-500',
+ bgColor: 'bg-green-500/10',
+ borderColor: 'border-green-500/30',
+ },
+ approved: {
+ label: 'Approved',
+ icon: CheckCircle2,
+ color: 'text-green-500',
+ bgColor: 'bg-green-500/10',
+ borderColor: 'border-green-500/30',
+ },
+ rejected: {
+ label: 'Rejected',
+ icon: XCircle,
+ color: 'text-red-500',
+ bgColor: 'bg-red-500/10',
+ borderColor: 'border-red-500/30',
+ },
+};
+
+export function MilestoneStatusCard({
+ status,
+ evidence,
+ submittedAt,
+ approvedAt,
+ rejectedAt,
+}: MilestoneStatusCardProps) {
+ const config =
+ statusConfig[status as keyof typeof statusConfig] || statusConfig.pending;
+ const StatusIcon = config.icon;
+
+ return (
+
+
+
+ Milestone Status
+
+
+ {config.label}
+
+
+
+
+ {/* Status Timeline */}
+
+ {submittedAt && (
+
+
+
+
+ Submitted for Review
+
+
+ {new Date(submittedAt).toLocaleDateString('en-US', {
+ day: '2-digit',
+ month: 'short',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ })}
+
+
+
+ )}
+
+ {approvedAt && (
+
+
+
+
Approved
+
+ {new Date(approvedAt).toLocaleDateString('en-US', {
+ day: '2-digit',
+ month: 'short',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ })}
+
+
+
+ )}
+
+ {rejectedAt && (
+
+
+
+
Rejected
+
+ {new Date(rejectedAt).toLocaleDateString('en-US', {
+ day: '2-digit',
+ month: 'short',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ })}
+
+
+
+ )}
+
+
+ {/* Evidence Section */}
+ {evidence && (
+
+
+ Proof of Completion
+
+
+
+ )}
+
+ {/* Status-specific messages */}
+ {status === 'pending' && (
+
+
+ This milestone is awaiting work to begin. Check back later for
+ updates.
+
+
+ )}
+
+ {status === 'in-progress' && (
+
+
+ The creator is currently working on this milestone.
+
+
+ )}
+
+ {status === 'in-review' && (
+
+
+ This milestone submission is currently under review by the
+ community.
+
+
+ )}
+
+ {status === 'rejected' && (
+
+
+ This milestone was rejected. The creator will need to resubmit
+ with corrections.
+
+
+ )}
+
+
+ );
+}
diff --git a/components/project/MilestoneForm.tsx b/features/projects/components/MilestoneForm.tsx
similarity index 95%
rename from components/project/MilestoneForm.tsx
rename to features/projects/components/MilestoneForm.tsx
index 61fad311f..ae1ef15f0 100644
--- a/components/project/MilestoneForm.tsx
+++ b/features/projects/components/MilestoneForm.tsx
@@ -1,21 +1,25 @@
'use client';
import React from 'react';
-import { Input } from '../ui/input';
-import { Textarea } from '../ui/textarea';
-import { Button } from '../ui/button';
+import { Input } from '@/components/ui/input';
+import { Textarea } from '@/components/ui/textarea';
+import { Button } from '@/components/ui/button';
import { Calendar as CalendarIcon, Trash2, HelpCircle } from 'lucide-react';
import { toast } from 'sonner';
-import { BoundlessButton } from '../buttons';
-import { Label } from '../ui/label';
+import { BoundlessButton } from '@/components/buttons';
+import { Label } from '@/components/ui/label';
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
-} from '../ui/tooltip';
-import { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';
-import { Calendar } from '../ui/calendar';
+} from '@/components/ui/tooltip';
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from '@/components/ui/popover';
+import { Calendar } from '@/components/ui/calendar';
export interface Milestone {
id: string;
diff --git a/components/project/MilestoneManager.tsx b/features/projects/components/MilestoneManager.tsx
similarity index 97%
rename from components/project/MilestoneManager.tsx
rename to features/projects/components/MilestoneManager.tsx
index 1639b5b75..c61a309f3 100644
--- a/components/project/MilestoneManager.tsx
+++ b/features/projects/components/MilestoneManager.tsx
@@ -1,11 +1,11 @@
'use client';
import React from 'react';
-import { Button } from '../ui/button';
+import { Button } from '@/components/ui/button';
import { Plus } from 'lucide-react';
import MilestoneForm, { Milestone } from './MilestoneForm';
import { toast } from 'sonner';
-import { Label } from '../ui/label';
+import { Label } from '@/components/ui/label';
interface MilestoneManagerProps {
milestones: Milestone[];
diff --git a/components/project/MilestoneReview.tsx b/features/projects/components/MilestoneReview.tsx
similarity index 100%
rename from components/project/MilestoneReview.tsx
rename to features/projects/components/MilestoneReview.tsx
diff --git a/components/project/MilestoneSubmissionModal.tsx b/features/projects/components/MilestoneSubmissionModal.tsx
similarity index 98%
rename from components/project/MilestoneSubmissionModal.tsx
rename to features/projects/components/MilestoneSubmissionModal.tsx
index fc8a8e157..6ab446029 100644
--- a/components/project/MilestoneSubmissionModal.tsx
+++ b/features/projects/components/MilestoneSubmissionModal.tsx
@@ -1,9 +1,7 @@
'use client';
import React, { useState } from 'react';
-import BoundlessSheet from '../sheet/boundless-sheet';
-import { BoundlessButton } from '../buttons/BoundlessButton';
-import { Label } from '../ui/label';
+
import {
Calendar,
Coins,
@@ -17,6 +15,9 @@ import { cn } from '@/lib/utils';
import MilestoneSubmissionSuccess from './MilestoneSubmissionSuccess';
import { useWalletProtection } from '@/hooks/use-wallet-protection';
import WalletRequiredModal from '@/components/wallet/WalletRequiredModal';
+import BoundlessSheet from '@/components/sheet/boundless-sheet';
+import { Label } from '@/components/ui/label';
+import { BoundlessButton } from '@/components/buttons';
export interface MilestoneSubmissionData {
files: File[];
diff --git a/components/project/MilestoneSubmissionPage.tsx b/features/projects/components/MilestoneSubmissionPage.tsx
similarity index 98%
rename from components/project/MilestoneSubmissionPage.tsx
rename to features/projects/components/MilestoneSubmissionPage.tsx
index f161b4d7a..c48ec7374 100644
--- a/components/project/MilestoneSubmissionPage.tsx
+++ b/features/projects/components/MilestoneSubmissionPage.tsx
@@ -1,10 +1,10 @@
'use client';
import React, { useState } from 'react';
-import { BoundlessButton } from '../buttons/BoundlessButton';
-import { Input } from '../ui/input';
-import { Label } from '../ui/label';
-import { Textarea } from '../ui/textarea';
+import { BoundlessButton } from '@/components/buttons';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import { Textarea } from '@/components/ui/textarea';
import {
Calendar,
Coins,
diff --git a/components/project/MilestoneSubmissionSuccess.tsx b/features/projects/components/MilestoneSubmissionSuccess.tsx
similarity index 96%
rename from components/project/MilestoneSubmissionSuccess.tsx
rename to features/projects/components/MilestoneSubmissionSuccess.tsx
index 0393a4b24..08ac39826 100644
--- a/components/project/MilestoneSubmissionSuccess.tsx
+++ b/features/projects/components/MilestoneSubmissionSuccess.tsx
@@ -3,7 +3,7 @@
import React from 'react';
import { Check } from 'lucide-react';
import Link from 'next/link';
-import { BoundlessButton } from '../buttons/BoundlessButton';
+import { BoundlessButton } from '@/components/buttons';
interface MilestoneSubmissionSuccessProps {
onContinue?: () => void;
diff --git a/features/projects/components/ProjectCard.tsx b/features/projects/components/ProjectCard.tsx
new file mode 100644
index 000000000..9de3d313f
--- /dev/null
+++ b/features/projects/components/ProjectCard.tsx
@@ -0,0 +1,241 @@
+import { Progress } from '@/components/ui/progress';
+import { formatNumber } from '@/lib/utils';
+import { useRouter } from 'nextjs-toploader/app';
+import Image from 'next/image';
+import { ProjectCardData } from '@/features/projects/utils/card-mappers';
+
+type ProjectCardProps = {
+ data: ProjectCardData;
+ newTab?: boolean;
+ isFullWidth?: boolean;
+ className?: string;
+};
+
+function ProjectCard({
+ data,
+ newTab = false,
+ isFullWidth = false,
+ className = '',
+}: ProjectCardProps) {
+ const router = useRouter();
+
+ const {
+ slug,
+ title,
+ vision,
+ banner,
+ logo,
+ creator,
+ category,
+ status,
+ stats,
+ } = data;
+
+ const currentBanner =
+ banner || '/images/placeholders/project-banner-placeholder.png';
+
+ const handleClick = () => {
+ router.push(`/projects/${slug}`);
+ };
+
+ const getStatusStyles = () => {
+ switch (status) {
+ case 'Funding':
+ return 'text-blue-400 bg-blue-400/10';
+ case 'Funded':
+ return 'text-green-400 bg-green-400/10';
+ case 'Completed':
+ return 'text-green-400 bg-green-400/10';
+ case 'Validation':
+ return 'text-yellow-400 bg-yellow-400/10';
+ default:
+ return 'text-gray-400 bg-gray-800/20';
+ }
+ };
+
+ const getDeadlineInfo = () => {
+ if (status === 'Completed') {
+ // Check for rejected milestones if available to display warning,
+ // but simplistic approach for now:
+ return { text: 'Completed', className: 'text-green-400' };
+ }
+
+ const { daysLeft } = stats;
+
+ if (daysLeft <= 3) {
+ return {
+ text: `${daysLeft} days left`,
+ className: 'text-red-400',
+ };
+ }
+
+ if (daysLeft <= 15) {
+ return {
+ text: `${daysLeft} days left`,
+ className: 'text-yellow-400',
+ };
+ }
+
+ return {
+ text: `${daysLeft} days left`,
+ className: 'text-green-400',
+ };
+ };
+
+ const deadlineInfo = getDeadlineInfo();
+ const statusColor = getStatusStyles();
+
+ return (
+ {}}
+ className={`group flex cursor-pointer flex-col overflow-hidden rounded-xl border border-neutral-800 bg-[#0c0c0c] transition-all duration-300 hover:border-neutral-700 hover:shadow-lg hover:shadow-black/40 ${
+ isFullWidth ? 'w-full' : 'max-w-[400px]'
+ } ${className}`}
+ >
+ {/* Banner / Image Section */}
+
+
{
+ // Fallback to project logo if banner fails
+ e.currentTarget.src = logo || '';
+ e.currentTarget.classList.add(
+ 'object-contain',
+ 'p-4',
+ 'bg-[#1a1a1a]'
+ );
+ e.currentTarget.classList.remove('object-cover');
+ }}
+ />
+
+
+ {/* Top Overlay: Categories & Status Badge */}
+
+ {/* Categories */}
+
+
+ {category}
+
+
+
+
+ {status}
+
+
+
+ {/* Bottom Overlay: Creator Info */}
+
+
+
+ {/* Body Section */}
+
+
+
+
+ {title}
+
+
+
+
+ {vision}
+
+
+
+ {/* Stats / Progress Section */}
+
+ {status === 'Validation' && stats.votes && (
+
+
+ Votes
+
+ {formatNumber(stats.votes.current)}
+
+ {' '}
+ / {formatNumber(stats.votes.goal)}
+
+
+
+
+
+ )}
+
+ {status === 'Funding' && stats.funding && (
+
+
+
Raised
+
+
+ {formatNumber(stats.funding.raised)}
+
+
+ / {formatNumber(stats.funding.goal)}{' '}
+ {stats.funding.currency}
+
+
+
+
+
+ )}
+
+ {(status === 'Funded' || status === 'Completed') &&
+ stats.milestones && (
+
+
+ Milestones
+
+ {stats.milestones.completed}
+
+ {' '}
+ / {stats.milestones.total}
+
+
+
+
+
+ )}
+
+
+ {/* Footer info: Deadline/Status Text */}
+
+
+ {deadlineInfo.text}
+
+
+
+
+ );
+}
+
+export default ProjectCard;
diff --git a/components/Project-Page-Hero.tsx b/features/projects/components/ProjectPageHero.tsx
similarity index 97%
rename from components/Project-Page-Hero.tsx
rename to features/projects/components/ProjectPageHero.tsx
index b7221ad2b..c1303cb44 100644
--- a/components/Project-Page-Hero.tsx
+++ b/features/projects/components/ProjectPageHero.tsx
@@ -1,7 +1,7 @@
'use client';
import React from 'react';
import { ArrowDown } from 'lucide-react';
-import { BoundlessButton } from './buttons/BoundlessButton';
+import { BoundlessButton } from '@/components/buttons';
export default function ProjectPageHero() {
const scrollToProjects = () => {
diff --git a/components/project/ProjectSubmissionFlow.tsx b/features/projects/components/ProjectSubmissionFlow.tsx
similarity index 94%
rename from components/project/ProjectSubmissionFlow.tsx
rename to features/projects/components/ProjectSubmissionFlow.tsx
index 42c0a0f1f..14bce6599 100644
--- a/components/project/ProjectSubmissionFlow.tsx
+++ b/features/projects/components/ProjectSubmissionFlow.tsx
@@ -1,11 +1,12 @@
'use client';
import React, { useState } from 'react';
-import BoundlessSheet from '../sheet/boundless-sheet';
-import Stepper from '../stepper/Stepper';
+
import ProjectSubmissionForm from './ProjectSubmissionForm';
import ProjectSubmissionSuccess from './ProjectSubmissionSuccess';
import ProjectSubmissionLoading from './ProjectSubmissionLoading';
+import BoundlessSheet from '@/components/sheet/boundless-sheet';
+import { Stepper } from '@/components/stepper';
type StepState = 'active' | 'pending' | 'completed';
diff --git a/components/project/ProjectSubmissionForm.tsx b/features/projects/components/ProjectSubmissionForm.tsx
similarity index 97%
rename from components/project/ProjectSubmissionForm.tsx
rename to features/projects/components/ProjectSubmissionForm.tsx
index 58313b6e5..fcb335fe7 100644
--- a/components/project/ProjectSubmissionForm.tsx
+++ b/features/projects/components/ProjectSubmissionForm.tsx
@@ -2,18 +2,28 @@
import Image from 'next/image';
import React, { useState, useRef, useEffect } from 'react';
-import { Textarea } from '../ui/textarea';
+// import { Textarea } from '../ui/textarea';
+// import {
+// Select,
+// SelectContent,
+// SelectItem,
+// SelectTrigger,
+// SelectValue,
+// } from '../ui/select';
+import { formatBytes } from '@/lib/utils';
+// import { Badge } from '../ui/badge';
+import { DollarSign, Package, Trash, X } from 'lucide-react';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
-} from '../ui/select';
-import { formatBytes } from '@/lib/utils';
-import { Badge } from '../ui/badge';
-import { DollarSign, Package, Trash, X } from 'lucide-react';
-import { Input } from '../ui/input';
+} from '@/components/ui/select';
+import { Textarea } from '@/components/ui/textarea';
+import { Input } from '@/components/ui/input';
+import { Badge } from '@/components/ui/badge';
+// import { Input } from '../ui/input';
const fundingGoals = [
{ value: 'Technology', label: 'Technology' },
diff --git a/components/project/ProjectSubmissionLoading.tsx b/features/projects/components/ProjectSubmissionLoading.tsx
similarity index 100%
rename from components/project/ProjectSubmissionLoading.tsx
rename to features/projects/components/ProjectSubmissionLoading.tsx
diff --git a/components/project/ProjectSubmissionSuccess.tsx b/features/projects/components/ProjectSubmissionSuccess.tsx
similarity index 100%
rename from components/project/ProjectSubmissionSuccess.tsx
rename to features/projects/components/ProjectSubmissionSuccess.tsx
diff --git a/features/projects/components/ProjectsPage.tsx b/features/projects/components/ProjectsPage.tsx
new file mode 100644
index 000000000..630fc3952
--- /dev/null
+++ b/features/projects/components/ProjectsPage.tsx
@@ -0,0 +1,267 @@
+'use client';
+
+import React from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { ArrowDownIcon, RefreshCwIcon, XIcon, Loader2 } from 'lucide-react';
+
+import ProjectCard from './ProjectCard';
+import ExploreHeader from './ExploreHeader';
+import { useProjects } from '@/features/projects/hooks/use-project';
+import { useProjectFilters } from '@/features/projects/hooks/use-project-filters';
+import { BoundlessButton } from '@/components/buttons';
+import EmptyState from '@/components/EmptyState';
+import LoadingScreen from '@/features/projects/components/CreateProjectModal/LoadingScreen';
+import { cn } from '@/lib/utils';
+import { Crowdfunding } from '@/features/projects/types';
+
+interface ProjectsClientProps {
+ className?: string;
+}
+
+export default function ProjectsClient({ className }: ProjectsClientProps) {
+ const {
+ filters,
+ handleSearch,
+ handleSort,
+ handleStatus,
+ handleCategory,
+ clearSearch,
+ clearAllFilters,
+ } = useProjectFilters();
+
+ const { projects, loading, loadingMore, error, hasMore, loadMore, refetch } =
+ useProjects({ initialFilters: filters });
+
+ const isFiltering =
+ !!filters.search || !!filters.category || !!filters.status;
+
+ const showResultsSummary = !loading && !error && projects.length > 0;
+ const showEmptyState = !loading && !error && projects.length === 0;
+
+ return (
+
+
+
+
+
+ {loading ? (
+
+
+
+ ) : error ? (
+
+
+
+ ) : showEmptyState ? (
+
+
+
+ ) : (
+
+ {showResultsSummary && (
+
+ )}
+
+
+
+ {hasMore && (
+
+ )}
+
+ )}
+
+
+
+ );
+}
+
+// Sub-components for cleaner file structure
+
+function ResultsSummary({
+ count,
+ filters,
+ onClearSearch,
+}: {
+ count: number;
+ filters: any; // Ideally this should be matched to FilterState type from hook
+ onClearSearch: () => void;
+}) {
+ return (
+
+
+ Showing {count}{' '}
+ project
+ {count !== 1 && 's'}
+ {filters.search && (
+ <>
+ {' '}
+ matching{' '}
+ "{filters.search}"
+ >
+ )}
+ {filters.category && (
+ <>
+ {' '}
+ in {filters.category}
+ >
+ )}
+ {filters.status && (
+ <>
+ {' '}
+ with status {filters.status}
+ >
+ )}
+
+
+ {filters.search && (
+
}
+ iconPosition='right'
+ >
+ Clear search
+
+ )}
+
+ );
+}
+
+function ErrorState({
+ message,
+ onRetry,
+}: {
+ message: string;
+ onRetry: () => void;
+}) {
+ return (
+
+ }
+ >
+ Try Again
+
+ }
+ />
+
+ );
+}
+
+function NoProjectsState({
+ isFiltering,
+ onClearFilters,
+}: {
+ isFiltering: boolean;
+ onClearFilters: () => void;
+}) {
+ return (
+
+
+ Clear all filters
+
+ ) : undefined
+ }
+ />
+
+ );
+}
+
+import { mapCrowdfundingToCardData } from '@/features/projects/utils/card-mappers';
+
+function ProjectsGrid({ projects }: { projects: Crowdfunding[] }) {
+ // Memoize projects if needed, though React usually handles this well enough in mapping
+ return (
+
+ {projects.map(project => (
+
+ ))}
+
+ );
+}
+
+function LoadMoreSection({
+ loadingMore,
+ onLoadMore,
+}: {
+ loadingMore: boolean;
+ onLoadMore: () => void;
+}) {
+ return (
+
+
+ ) : (
+
+ )
+ }
+ >
+ {loadingMore ? 'Loading...' : 'Load More Projects'}
+
+
+ );
+}
diff --git a/components/project/ShareCampaignModal.tsx b/features/projects/components/ShareCampaignModal.tsx
similarity index 100%
rename from components/project/ShareCampaignModal.tsx
rename to features/projects/components/ShareCampaignModal.tsx
diff --git a/components/project/TimelineStepper.tsx b/features/projects/components/TimelineStepper.tsx
similarity index 87%
rename from components/project/TimelineStepper.tsx
rename to features/projects/components/TimelineStepper.tsx
index 1e258d089..588afe888 100644
--- a/components/project/TimelineStepper.tsx
+++ b/features/projects/components/TimelineStepper.tsx
@@ -1,7 +1,7 @@
'use client';
import React from 'react';
-import { CrowdfundingProject } from '@/types/project';
+import { CrowdfundingProject } from '@/features/projects/types';
import { Check, ThumbsUp } from 'lucide-react';
import { cn } from '@/lib/utils';
@@ -62,7 +62,7 @@ const TimelineStepper: React.FC = () => {
= () => {
{item.label}
@@ -96,9 +94,7 @@ const TimelineStepper: React.FC = () => {
{item.date}
diff --git a/components/project/ValidationFlow.tsx b/features/projects/components/ValidationFlow.tsx
similarity index 98%
rename from components/project/ValidationFlow.tsx
rename to features/projects/components/ValidationFlow.tsx
index bd58b77b8..c6bc5d820 100644
--- a/components/project/ValidationFlow.tsx
+++ b/features/projects/components/ValidationFlow.tsx
@@ -2,11 +2,10 @@
import React, { useState } from 'react';
import Image from 'next/image';
-import { CrowdfundingProject } from '@/types/project';
+import { CrowdfundingProject } from '@/features/projects/types';
import { Badge } from '@/components/ui/badge';
import { Progress } from '@/components/ui/progress';
import { Button } from '@/components/ui/button';
-import CommentModal from '../comment/modal';
import {
ThumbsUp,
MessageCircle,
@@ -20,6 +19,7 @@ import { cn } from '@/lib/utils';
import TimelineStepper from './TimelineStepper';
import { useWalletProtection } from '@/hooks/use-wallet-protection';
import WalletRequiredModal from '@/components/wallet/WalletRequiredModal';
+import CommentModal from '@/components/comment/modal';
interface ValidationFlowProps {
project: CrowdfundingProject;
diff --git a/components/project/index.ts b/features/projects/components/index.ts
similarity index 100%
rename from components/project/index.ts
rename to features/projects/components/index.ts
diff --git a/hooks/project/use-project-filters.ts b/features/projects/hooks/use-project-filters.ts
similarity index 97%
rename from hooks/project/use-project-filters.ts
rename to features/projects/hooks/use-project-filters.ts
index 69349d6fe..3525bab22 100644
--- a/hooks/project/use-project-filters.ts
+++ b/features/projects/hooks/use-project-filters.ts
@@ -1,7 +1,7 @@
'use client';
import * as React from 'react';
-import { useDebounce } from '../use-debounce';
+import { useDebounce } from '@/hooks/use-debounce';
type SortOption =
| 'newest'
diff --git a/hooks/project/use-project.ts b/features/projects/hooks/use-project.ts
similarity index 97%
rename from hooks/project/use-project.ts
rename to features/projects/hooks/use-project.ts
index 13a1cc48c..e27ebc2d8 100644
--- a/hooks/project/use-project.ts
+++ b/features/projects/hooks/use-project.ts
@@ -1,8 +1,8 @@
'use client';
import * as React from 'react';
-import { getCrowdfundingProjects } from '@/lib/api/project';
-import type { Crowdfunding } from '@/types/project';
+import { getCrowdfundingProjects } from '@/features/projects/api';
+import type { Crowdfunding } from '@/features/projects/types';
type SortOption =
| 'newest'
diff --git a/types/project.ts b/features/projects/types/index.ts
similarity index 95%
rename from types/project.ts
rename to features/projects/types/index.ts
index aed298fb4..7f0bfce38 100644
--- a/types/project.ts
+++ b/features/projects/types/index.ts
@@ -7,6 +7,7 @@ export interface Contributor {
username: string;
name: string;
image: string;
+ message?: string;
}
export interface TeamMember {
@@ -31,10 +32,13 @@ export interface Milestone {
id?: string;
name: string;
amount: number;
- status: string;
+ reviewStatus: string;
endDate: string;
startDate: string;
description: string;
+ fundingPercentage: number;
+ title: string;
+ orderIndex?: string;
}
export interface User {
@@ -70,7 +74,7 @@ export interface PublicUserProfile {
projects: Array<{
id: string;
title: string;
- description: string;
+ vision: string;
category: string;
status: string;
banner: string | null;
@@ -160,7 +164,9 @@ export interface CrowdfundingProject {
export interface Crowdfunding {
id: string;
projectId: string;
+ slug: string;
fundingGoal: number;
+ voteGoal: number;
fundingRaised: number;
fundingCurrency: string;
fundingEndDate: string;
diff --git a/features/projects/utils/card-mappers.ts b/features/projects/utils/card-mappers.ts
new file mode 100644
index 000000000..d601e56bd
--- /dev/null
+++ b/features/projects/utils/card-mappers.ts
@@ -0,0 +1,178 @@
+import { Crowdfunding, CrowdfundingProject } from '@/features/projects/types';
+import { Project as UserProject } from '@/types/user';
+
+export type ProjectCardStatus =
+ | 'Validation'
+ | 'Funding'
+ | 'Funded'
+ | 'Completed';
+
+export interface ProjectCardData {
+ id: string;
+ slug: string;
+ title: string;
+ vision: string;
+ banner: string | null;
+ logo: string | null;
+ category: string;
+ creator: {
+ name: string;
+ image: string;
+ };
+ status: ProjectCardStatus;
+ stats: {
+ votes?: {
+ current: number;
+ goal: number;
+ };
+ funding?: {
+ raised: number;
+ goal: number;
+ currency: string;
+ };
+ milestones?: {
+ completed: number;
+ total: number;
+ };
+ daysLeft: number;
+ };
+}
+
+export const mapCrowdfundingToCardData = (
+ item: Crowdfunding
+): ProjectCardData => {
+ const { project } = item;
+
+ // Calculate days left
+ let daysLeft = 0;
+ if (item.fundingEndDate) {
+ try {
+ const now = new Date();
+ const end = new Date(item.fundingEndDate);
+ daysLeft = Math.max(
+ 0,
+ Math.ceil((end.getTime() - now.getTime()) / (1000 * 60 * 60 * 24))
+ );
+ } catch {
+ daysLeft = 0;
+ }
+ }
+
+ // Determine status map
+ let status: ProjectCardStatus = 'Funding';
+ const rawStatus = project.status;
+ if (rawStatus === 'IDEA') status = 'Validation';
+ else if (rawStatus === 'ACTIVE') status = 'Funding';
+ else if (rawStatus === 'LIVE') status = 'Funded';
+ else if (rawStatus === 'COMPLETED') status = 'Completed';
+ // Add other status mappings as needed
+
+ // Milestones
+ const completedMilestones =
+ item.milestones?.filter(m => m.reviewStatus === 'completed')?.length || 0;
+ const totalMilestones = item.milestones?.length || 0;
+
+ return {
+ id: item.projectId,
+ slug: item.slug,
+ title: project.title,
+ vision: project.vision || '',
+ banner: project.banner,
+ logo: project.logo,
+ category: project.category,
+ creator: {
+ name: project.creator?.name || 'Unknown Creator',
+ image: project.creator?.image || '/user.png',
+ },
+ status,
+ stats: {
+ votes: {
+ current: item.voteProgress || 0, // Using voteProgress from new type if available
+ goal: item.voteGoal || 100,
+ },
+ funding: {
+ raised: item.fundingRaised,
+ goal: item.fundingGoal,
+ currency: item.fundingCurrency,
+ },
+ milestones: {
+ completed: completedMilestones,
+ total: totalMilestones,
+ },
+ daysLeft,
+ },
+ };
+};
+
+export const mapProjectToCardData = (
+ project: UserProject,
+ creator: { name: string; image: string }
+): ProjectCardData => {
+ // Map simplified status
+ let status: ProjectCardStatus = 'Validation';
+ if (project.status === 'funding' || project.status === 'in_progress')
+ status = 'Funding';
+ else if (project.status === 'LIVE') status = 'Funded';
+ else if (project.status === 'completed') status = 'Completed';
+
+ return {
+ id: project.id,
+ slug: project.id, // Fallback slug to id if not available
+ title: project.title,
+ vision: project.vision || '',
+ banner: project.banner || null,
+ logo: project.logo || null,
+ category: project.category,
+ creator,
+ status,
+ stats: {
+ daysLeft: 30, // Default for simple view
+ funding: {
+ raised: 0,
+ goal: 10000,
+ currency: 'USDC',
+ },
+ votes: {
+ current: 0,
+ goal: 100,
+ },
+ },
+ };
+};
+
+export const mapCrowdfundingProjectToCardData = (
+ project: CrowdfundingProject
+): ProjectCardData => {
+ // Keep logic similar to existing usage
+ let status: ProjectCardStatus = 'Validation';
+ if (project.status === 'active' || project.status === 'funding')
+ status = 'Funding';
+ else if (project.status === 'funded') status = 'Funded';
+ else if (project.status === 'completed') status = 'Completed';
+
+ // Calculate days left if needed, or default
+ const daysLeft = project.daysToDeadline || 30;
+
+ return {
+ id: project.id,
+ slug: project.id,
+ title: project.title,
+ vision: project.vision || '',
+ banner: project.banner,
+ logo: project.logo,
+ category: project.category,
+ creator: {
+ name: project.creator?.name || 'Creator',
+ image: project.creator?.image || '/user.png',
+ },
+ status,
+ stats: {
+ funding: {
+ raised: project.funding?.raised || 0,
+ goal: project.funding?.goal || 0,
+ currency: project.funding?.currency || 'USDC',
+ },
+ daysLeft,
+ },
+ };
+};
diff --git a/hooks/use-lazy-ref.ts b/hooks/use-lazy-ref.ts
new file mode 100644
index 000000000..65c384f48
--- /dev/null
+++ b/hooks/use-lazy-ref.ts
@@ -0,0 +1,13 @@
+import * as React from 'react';
+
+function useLazyRef(fn: () => T) {
+ const ref = React.useRef(null);
+
+ if (ref.current === null) {
+ ref.current = fn();
+ }
+
+ return ref as React.RefObject;
+}
+
+export { useLazyRef };
diff --git a/hooks/use-markdown.ts b/hooks/use-markdown.ts
index b4893631c..a6941a161 100644
--- a/hooks/use-markdown.ts
+++ b/hooks/use-markdown.ts
@@ -1,3 +1,4 @@
+'use client';
import { useState, useEffect, useMemo } from 'react';
import { marked } from 'marked';
import React from 'react';
diff --git a/hooks/use-notification-polling.ts b/hooks/use-notification-polling.ts
index cb6eb9ac4..210c1294b 100644
--- a/hooks/use-notification-polling.ts
+++ b/hooks/use-notification-polling.ts
@@ -1,5 +1,5 @@
import { useEffect, useRef } from 'react';
-import type { UseNotificationsReturn } from './use-notifications';
+import type { UseNotificationsReturn } from './useNotifications';
interface UseNotificationPollingOptions {
interval?: number;
diff --git a/hooks/use-notifications.ts b/hooks/use-notifications.ts
deleted file mode 100644
index f8c2154ca..000000000
--- a/hooks/use-notifications.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import { useState, useEffect, useCallback } from 'react';
-import {
- getNotifications,
- markAsRead,
- markAllAsRead,
-} from '@/lib/api/notifications';
-import type { Notification } from '@/types/notifications';
-
-interface UseNotificationsOptions {
- page?: number;
- limit?: number;
- autoFetch?: boolean;
-}
-
-export interface UseNotificationsReturn {
- notifications: Notification[];
- loading: boolean;
- error: Error | null;
- total: number;
- currentPage: number;
- setCurrentPage: (page: number) => void;
- unreadCount: number;
- markNotificationAsRead: (ids: string[]) => Promise;
- markAllAsRead: () => Promise;
- refetch: () => Promise;
-}
-
-export const useNotifications = (
- options: UseNotificationsOptions = {}
-): UseNotificationsReturn => {
- const { page: initialPage = 1, limit = 10, autoFetch = true } = options;
-
- const [notifications, setNotifications] = useState([]);
- const [loading, setLoading] = useState(autoFetch);
- const [error, setError] = useState(null);
- const [total, setTotal] = useState(0);
- const [currentPage, setCurrentPage] = useState(initialPage);
-
- const fetchNotifications = useCallback(async () => {
- try {
- setLoading(true);
- setError(null);
- const response = await getNotifications(currentPage, limit);
-
- // Response structure: { data: Notification[], total: number, page: number, limit: number }
- if (response && Array.isArray(response.data)) {
- setNotifications(response.data || []);
- setTotal(response.total || 0);
- } else {
- throw new Error('Invalid response format');
- }
- } catch (err) {
- const errorMessage =
- err instanceof Error ? err : new Error('Failed to fetch notifications');
- setError(errorMessage);
- setNotifications([]);
- } finally {
- setLoading(false);
- }
- }, [currentPage, limit]);
-
- useEffect(() => {
- if (autoFetch) {
- fetchNotifications();
- }
- }, [fetchNotifications, autoFetch]);
-
- const markNotificationAsRead = useCallback(
- async (ids: string[]) => {
- // Optimistic update
- setNotifications(prev =>
- prev.map(notif =>
- ids.includes(notif._id)
- ? {
- ...notif,
- read: true,
- readAt: new Date().toISOString(),
- }
- : notif
- )
- );
-
- try {
- await markAsRead({ ids });
- } catch (err) {
- // Revert on error
- await fetchNotifications();
- throw err;
- }
- },
- [fetchNotifications]
- );
-
- const handleMarkAllAsRead = useCallback(async () => {
- // Optimistic update
- setNotifications(prev =>
- prev.map(notif => ({
- ...notif,
- read: true,
- readAt: new Date().toISOString(),
- }))
- );
-
- try {
- await markAllAsRead();
- } catch (err) {
- // Revert on error
- await fetchNotifications();
- throw err;
- }
- }, [fetchNotifications]);
-
- const unreadCount = notifications.filter(n => !n.read).length;
-
- return {
- notifications,
- loading,
- error,
- total,
- currentPage,
- setCurrentPage,
- unreadCount,
- markNotificationAsRead,
- markAllAsRead: handleMarkAllAsRead,
- refetch: fetchNotifications,
- };
-};
diff --git a/hooks/useNotifications.ts b/hooks/useNotifications.ts
index 0ef69cd57..e9eb1812c 100644
--- a/hooks/useNotifications.ts
+++ b/hooks/useNotifications.ts
@@ -1,19 +1,38 @@
-'use client';
-
-import { useEffect, useState } from 'react';
+import { useEffect, useState, useCallback } from 'react';
import { useSocket } from './useSocket';
+import { getNotifications } from '@/lib/api/notifications';
+import { Notification } from '@/types/notifications';
+
+interface UseNotificationsOptions {
+ page?: number;
+ limit?: number;
+ autoFetch?: boolean;
+}
-interface Notification {
- id: string;
- type: string;
- title: string;
- message: string;
- data?: Record;
- timestamp?: string;
- [key: string]: unknown;
+export interface UseNotificationsReturn {
+ notifications: Notification[];
+ unreadCount: number;
+ isConnected: boolean;
+ loading: boolean;
+ error: Error | null;
+ total: number;
+ currentPage: number;
+ setCurrentPage: (page: number) => void;
+ markAsRead: (notificationId: string) => void;
+ markAllAsRead: () => Promise;
+ markNotificationAsRead: (ids: string[]) => Promise;
+ fetchNotifications: () => Promise;
+ refetch: () => Promise;
}
-export function useNotifications(userId?: string) {
+export function useNotifications(
+ input?: string | UseNotificationsOptions
+): UseNotificationsReturn {
+ // Handle overloaded arguments
+ const userId = typeof input === 'string' ? input : undefined;
+ const options = typeof input === 'object' ? input : {};
+ const { page: initialPage = 1, limit = 10, autoFetch = true } = options;
+
const { socket, isConnected } = useSocket({
namespace: '/notifications',
userId,
@@ -21,12 +40,47 @@ export function useNotifications(userId?: string) {
const [notifications, setNotifications] = useState([]);
const [unreadCount, setUnreadCount] = useState(0);
+ const [loading, setLoading] = useState(autoFetch);
+ const [error, setError] = useState(null);
+ const [total, setTotal] = useState(0);
+ const [currentPage, setCurrentPage] = useState(initialPage);
+
+ // Fetch notifications with pagination
+ const fetchNotifications = useCallback(async () => {
+ try {
+ setLoading(true);
+ setError(null);
+ const response = await getNotifications(currentPage, limit);
+
+ if (response && Array.isArray(response.notifications)) {
+ // Sort notifications by createdAt desc to ensure correct order
+ const sorted = [...response.notifications].sort(
+ (a, b) =>
+ new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
+ );
+ setNotifications(sorted);
+ setTotal(response.total || 0);
+ }
+ } catch (err) {
+ console.error('Failed to fetch notifications:', err);
+ setError(
+ err instanceof Error ? err : new Error('Failed to fetch notifications')
+ );
+ } finally {
+ setLoading(false);
+ }
+ }, [currentPage, limit]);
+
+ // Initial fetch
+ useEffect(() => {
+ if (autoFetch) {
+ fetchNotifications();
+ }
+ }, [fetchNotifications, autoFetch]);
// Request initial unread count when socket connects
useEffect(() => {
if (socket && isConnected) {
- console.log('Socket connected, requesting unread count');
- // Request initial unread count from server
socket.emit('get-unread-count');
}
}, [socket, isConnected]);
@@ -38,14 +92,30 @@ export function useNotifications(userId?: string) {
}
// Listen for new notifications
- const handleNotification = (notification: Notification) => {
+ const handleNotification = (notification: any) => {
+ const normalizedNotification: Notification = {
+ ...notification,
+ id: notification.id || notification._id,
+ createdAt:
+ notification.createdAt ||
+ notification.timestamp ||
+ new Date().toISOString(),
+ };
+
setNotifications(prev => {
// Avoid duplicates
- const exists = prev.some(n => n.id === notification.id);
+ const exists = prev.some(n => n.id === normalizedNotification.id);
if (exists) {
return prev;
}
- return [notification, ...prev];
+
+ // Add new notification and resort
+ // Note: For pagination, real-time updates might be tricky.
+ // We typically add it to the top if we are on page 1.
+ if (currentPage === 1) {
+ return [normalizedNotification, ...prev];
+ }
+ return prev;
});
setUnreadCount(prev => prev + 1);
};
@@ -57,12 +127,10 @@ export function useNotifications(userId?: string) {
// Listen for notification updates
const handleNotificationUpdated = (data: any) => {
- // Update notification if it exists
- if (data.notificationId) {
+ const id = data.notificationId || data.id || data._id;
+ if (id) {
setNotifications(prev =>
- prev.map(notif =>
- notif.id === data.notificationId ? { ...notif, ...data } : notif
- )
+ prev.map(notif => (notif.id === id ? { ...notif, ...data } : notif))
);
}
};
@@ -73,12 +141,10 @@ export function useNotifications(userId?: string) {
setUnreadCount(0);
};
- // Error handling
const handleError = (error: { message: string }) => {
console.error('WebSocket error:', error);
};
- // Register all listeners
socket.on('notification', handleNotification);
socket.on('unread-count', handleUnreadCount);
socket.on('notification-updated', handleNotificationUpdated);
@@ -92,21 +158,37 @@ export function useNotifications(userId?: string) {
socket.off('all-notifications-read', handleAllRead);
socket.off('error', handleError);
};
- }, [socket]);
+ }, [socket, currentPage]);
const markAsRead = (notificationId: string) => {
+ setNotifications(prev =>
+ prev.map(n => (n.id === notificationId ? { ...n, read: true } : n))
+ );
+ setUnreadCount(prev => Math.max(0, prev - 1));
+
if (socket && isConnected) {
socket.emit('mark-read', { notificationId });
- } else {
- console.warn('Cannot mark as read: socket not connected');
}
};
- const markAllAsRead = () => {
+ const markNotificationAsRead = async (ids: string[]) => {
+ // Optimistic
+ setNotifications(prev =>
+ prev.map(n => (ids.includes(n.id) ? { ...n, read: true } : n))
+ );
+ // Note: unread count update is approximate here, ideally we wait for socket update
+
+ if (socket && isConnected) {
+ ids.forEach(id => socket.emit('mark-read', { notificationId: id }));
+ }
+ };
+
+ const markAllAsRead = async () => {
+ setNotifications(prev => prev.map(n => ({ ...n, read: true })));
+ setUnreadCount(0);
+
if (socket && isConnected) {
socket.emit('mark-all-read');
- } else {
- console.warn('Cannot mark all as read: socket not connected');
}
};
@@ -114,7 +196,15 @@ export function useNotifications(userId?: string) {
notifications,
unreadCount,
isConnected,
+ loading,
+ error,
+ total,
+ currentPage,
+ setCurrentPage,
markAsRead,
markAllAsRead,
+ markNotificationAsRead,
+ fetchNotifications,
+ refetch: fetchNotifications,
};
}
diff --git a/lib/activities-description.ts b/lib/activities-description.ts
index 307ade41b..512e6c76f 100644
--- a/lib/activities-description.ts
+++ b/lib/activities-description.ts
@@ -1,6 +1,4 @@
-import { ActivityType } from '@/types/user';
-
-export const getActivityDescription = (activityType: ActivityType) => {
+export const getActivityDescription = (activityType: string) => {
switch (activityType) {
case 'AVATAR_CHANGED':
return 'You changed your avatar';
diff --git a/lib/api/auth.ts b/lib/api/auth.ts
index d16611c0f..4f0252d9c 100644
--- a/lib/api/auth.ts
+++ b/lib/api/auth.ts
@@ -2,7 +2,8 @@ import api from './api';
import { ApiResponse } from '@/lib/api/types';
import { authClient } from '@/lib/auth-client';
import { User } from '@/types/user';
-import { PublicUserProfile } from '@/types/project';
+import { PublicUserProfile } from '@/features/projects/types';
+import { GetMeResponse } from '@/lib/api/types';
/**
* Get current user profile from backend API
@@ -11,11 +12,9 @@ import { PublicUserProfile } from '@/types/project';
* For client-side usage, cookies are automatically sent via withCredentials
* For server-side usage, use getMeServer() from '@/lib/api/auth-server' instead
*/
-export const getMe = async (): Promise => {
- console.trace('getMe called from:');
-
- const res = await api.get>('/users/me');
- return res.data.data as User;
+export const getMe = async (): Promise => {
+ const res = await api.get>('/users/me');
+ return res.data.data as GetMeResponse;
};
/**
diff --git a/lib/api/notifications.ts b/lib/api/notifications.ts
index df00d7fe1..c928f9200 100644
--- a/lib/api/notifications.ts
+++ b/lib/api/notifications.ts
@@ -14,30 +14,27 @@ export const getNotifications = async (
page: number = 1,
limit: number = 10
): Promise => {
- console.log('getNotifications', page, limit);
- // const params = new URLSearchParams({
- // page: page.toString(),
- // limit: limit.toString(),
- // });
+ const params = new URLSearchParams({
+ page: page.toString(),
+ limit: limit.toString(),
+ });
- // const res = await api.get(
- // `/notifications?${params.toString()}`
- // );
+ const res = await api.get<{ data: NotificationsResponse }>(
+ `/notifications?${params.toString()}`
+ );
- // // Backend returns { data, total, page, limit } directly
- // // The api.get wrapper returns ApiResponse, so res.data is the actual response
- // if (res.data && 'data' in res.data) {
- // return res.data as NotificationsResponse;
- // }
+ // Backend returns { success, message, data: { notifications: [], ... } }
+ if (res.data && res.data.data) {
+ return res.data.data;
+ }
- // // Fallback: if the response structure is different, return as-is
- // return res.data as NotificationsResponse;
+ // Fallback
return {
- data: [],
+ notifications: [],
total: 0,
- page: 1,
- limit: 10,
- } as NotificationsResponse;
+ limit,
+ offset: 0,
+ };
};
/**
diff --git a/lib/api/project.ts b/lib/api/project.ts
deleted file mode 100644
index 8135bf436..000000000
--- a/lib/api/project.ts
+++ /dev/null
@@ -1,342 +0,0 @@
-/* eslint-disable @typescript-eslint/no-unused-vars */
-import { CrowdfundingProject, Crowdfunding } from '@/types/project';
-import api from './api';
-import {
- ProjectInitRequest,
- CreateCrowdfundingProjectRequest,
- CreateCrowdfundingProjectResponse,
- PrepareCrowdfundingProjectResponse,
- ConfirmCrowdfundingProjectRequest,
- ConfirmCrowdfundingProjectResponse,
- GetCrowdfundingProjectsResponse,
- UpdateCrowdfundingProjectRequest,
- UpdateCrowdfundingProjectResponse,
- DeleteCrowdfundingProjectResponse,
- FundCrowdfundingProjectRequest,
- FundCrowdfundingProjectResponse,
- PrepareFundingRequest,
- PrepareFundingResponse,
- ConfirmFundingRequest,
- ConfirmFundingResponse,
- VoteResponse,
- GetProjectVotesRequest,
- GetProjectVotesResponse,
- RemoveVoteResponse,
-} from './types';
-
-export const initProject = async (data: ProjectInitRequest) => {
- const res = await api.post('/projects', data);
- return res;
-};
-
-export const getProjects = async (
- page = 1,
- limit = 9,
- filters?: {
- status?: string;
- owner?: string;
- }
-): Promise<{
- projects: CrowdfundingProject[];
- pagination: {
- currentPage: number;
- totalPages: number;
- totalItems: number;
- hasNextPage: boolean;
- hasPrevPage: boolean;
- };
-}> => {
- const params = new URLSearchParams({
- page: page.toString(),
- limit: limit.toString(),
- });
-
- if (filters?.status && filters.status !== 'all') {
- params.append('status', filters.status);
- }
-
- if (filters?.owner) {
- params.append('owner', filters.owner);
- }
-
- const res = await api.get(`/projects?${params.toString()}`);
- return res.data.data;
-};
-
-export const getProjectDetails = async (_projectId: string) => {
- const res = await api.get(`/projects/${_projectId}`);
- return res.data.data;
-};
-
-export const deleteProject = async (_projectId: string) => {
- const res = await api.delete(`/projects/${_projectId}`);
- return res.data.data;
-};
-
-export const updateProject = async (
- _projectId: string,
- data: ProjectInitRequest
-) => {
- const res = await api.put(`/projects/${_projectId}`, data);
- return res.data.data;
-};
-
-export const launchCampaign = async (_projectId: string) => {
- console.log('launchCampaign', _projectId);
- // Mock implementation for now
- return new Promise(resolve => {
- setTimeout(() => {
- resolve({
- success: true,
- message: 'Campaign launched successfully',
- data: {
- campaignId: 'launched-campaign-123',
- shareLink: 'https://boundlessfi.xyz/campaigns/launched-campaign-123',
- },
- });
- }, 2000);
- });
-};
-
-export const generateCampaignLink = async (_projectId: string) => {
- // Mock implementation for now
- return new Promise(resolve => {
- setTimeout(() => {
- resolve({
- success: true,
- data: {
- shareLink: 'https://boundlessfi.xyz/campaigns/' + _projectId,
- },
- });
- }, 500);
- });
-};
-
-/**
- * Create a crowdfunding project
- * Frontend handles all blockchain transactions and provides escrow data
- * @param data - Project data including escrowId, transactionHash, and validateMilestones
- */
-export const createCrowdfundingProject = async (
- data: CreateCrowdfundingProjectRequest
-): Promise => {
- const res = await api.post('/crowdfunding', data);
- return res.data;
-};
-
-/**
- * @deprecated This endpoint no longer exists in the backend.
- * All blockchain transactions are now handled in the frontend.
- * Use createCrowdfundingProject directly with contractId, escrowAddress, and transactionHash.
- */
-export const prepareCrowdfundingProject = async (
- data: CreateCrowdfundingProjectRequest
-): Promise => {
- console.log('prepareCrowdfundingProject', data);
- throw new Error(
- 'prepareCrowdfundingProject is deprecated. All blockchain transactions should be handled in the frontend. Use createCrowdfundingProject with contractId, escrowAddress, and transactionHash.'
- );
-};
-
-/**
- * @deprecated This endpoint no longer exists in the backend.
- * All blockchain transactions are now handled in the frontend.
- * Use createCrowdfundingProject directly with contractId, escrowAddress, and transactionHash.
- */
-export const confirmCrowdfundingProject = async (
- data: ConfirmCrowdfundingProjectRequest
-): Promise => {
- console.log('confirmCrowdfundingProject', data);
- throw new Error(
- 'confirmCrowdfundingProject is deprecated. All blockchain transactions should be handled in the frontend. Use createCrowdfundingProject with contractId, escrowAddress, and transactionHash.'
- );
-};
-
-// Crowdfunding Project API Functions
-
-/**
- * Get all crowdfunding projects with pagination and filtering
- */
-export const getCrowdfundingProjects = async (
- page = 1,
- limit = 10,
- filters?: {
- category?: string;
- status?: string;
- minFundingGoal?: string;
- maxFundingGoal?: string;
- sortBy?: string;
- sortOrder?: 'asc' | 'desc';
- search?: string;
- }
-): Promise => {
- const params = new URLSearchParams({
- page: page.toString(),
- limit: limit.toString(),
- });
-
- if (filters?.category) {
- params.append('category', filters.category);
- }
-
- if (filters?.status) {
- params.append('status', filters.status);
- }
-
- if (filters?.minFundingGoal) {
- params.append('minFundingGoal', filters.minFundingGoal);
- }
-
- if (filters?.maxFundingGoal) {
- params.append('maxFundingGoal', filters.maxFundingGoal);
- }
-
- if (filters?.sortBy) {
- params.append('sortBy', filters.sortBy);
- }
-
- if (filters?.sortOrder) {
- params.append('sortOrder', filters.sortOrder);
- }
-
- if (filters?.search) {
- params.append('search', filters.search);
- }
-
- const queryString = params.toString();
- const url = queryString ? `/crowdfunding?${queryString}` : '/crowdfunding';
-
- const res = await api.get(url);
- return res.data;
-};
-
-/**
- * Get a single crowdfunding project by ID
- */
-export const getCrowdfundingProject = async (
- projectId: string
-): Promise => {
- const res = await api.get(`/crowdfunding/${projectId}`);
- console.log(res);
- return res.data.data;
-};
-
-/**
- * Update a crowdfunding project
- */
-export const updateCrowdfundingProject = async (
- projectId: string,
- data: UpdateCrowdfundingProjectRequest
-): Promise => {
- const res = await api.put(`/crowdfunding/${projectId}`, data);
- return res.data;
-};
-
-/**
- * Delete a crowdfunding project
- */
-export const deleteCrowdfundingProject = async (
- projectId: string
-): Promise => {
- const res = await api.delete(`/crowdfunding/projects/${projectId}`);
- return res.data;
-};
-
-/**
- * Fund a crowdfunding project
- * Frontend handles all blockchain transactions and provides transaction hash
- * @param projectId - The ID of the project to fund
- * @param data - Funding data including amount and transactionHash
- */
-export const fundCrowdfundingProject = async (
- projectId: string,
- data: FundCrowdfundingProjectRequest
-): Promise => {
- const res = await api.post(`/crowdfunding/projects/${projectId}/fund`, data);
- return res.data;
-};
-
-/**
- * @deprecated This endpoint no longer exists in the backend.
- * All blockchain transactions are now handled in the frontend.
- * Use fundCrowdfundingProject directly with amount and transactionHash.
- */
-export const prepareProjectFunding = async (
- projectId: string,
- data: PrepareFundingRequest
-): Promise => {
- console.log('prepareProjectFunding', projectId, data);
- throw new Error(
- 'prepareProjectFunding is deprecated. All blockchain transactions should be handled in the frontend. Use fundCrowdfundingProject with amount and transactionHash.'
- );
-};
-
-/**
- * @deprecated This endpoint no longer exists in the backend.
- * All blockchain transactions are now handled in the frontend.
- * Use fundCrowdfundingProject directly with amount and transactionHash.
- */
-export const confirmProjectFunding = async (
- projectId: string,
- data: ConfirmFundingRequest
-): Promise => {
- console.log('confirmProjectFunding', projectId, data);
- throw new Error(
- 'confirmProjectFunding is deprecated. All blockchain transactions should be handled in the frontend. Use fundCrowdfundingProject with amount and transactionHash.'
- );
-};
-export const voteProject = async (
- projectId: string,
- value: 1 | -1 = 1
-): Promise => {
- const res = await api.post(`/projects/${projectId}/vote`, { value });
- return res.data;
-};
-
-/**
- * Get votes for a project with pagination and filtering
- */
-export const getProjectVotes = async (
- projectId: string,
- params?: GetProjectVotesRequest
-): Promise => {
- const queryParams = new URLSearchParams();
-
- if (params?.page) {
- queryParams.append('page', params.page.toString());
- }
-
- if (params?.limit) {
- queryParams.append('limit', params.limit.toString());
- }
-
- if (params?.voteType) {
- queryParams.append('voteType', params.voteType);
- }
-
- const queryString = queryParams.toString();
- const url = queryString
- ? `/projects/${projectId}/votes?${queryString}`
- : `/projects/${projectId}/votes`;
-
- const res = await api.get(url);
- return res.data;
-};
-
-/**
- * Remove user's vote from a project
- */
-export const removeProjectVote = async (
- projectId: string
-): Promise => {
- const res = await api.delete(`/projects/${projectId}/vote`);
- return res.data;
-};
-
-export const contributeToProject = async (
- projectId: string,
- data: FundCrowdfundingProjectRequest
-): Promise => {
- const res = await api.post(`/crowdfunding/${projectId}/contribute`, data);
- return res.data;
-};
diff --git a/lib/api/types.ts b/lib/api/types.ts
index 616792c8f..2d24bb7fa 100644
--- a/lib/api/types.ts
+++ b/lib/api/types.ts
@@ -1,4 +1,4 @@
-import { CrowdfundingProject, Crowdfunding } from '@/types/project';
+import { CrowdfundingProject, Crowdfunding } from '@/features/projects/types';
// Backend API Response Structure
export interface ApiResponse {
@@ -49,13 +49,74 @@ export interface UserProfile {
}
export interface User {
- _id: string;
+ id: string;
+ name: string;
email: string;
- profile: UserProfile;
- isVerified: boolean;
- roles: string[];
- lastLogin?: string;
- [key: string]: unknown;
+ emailVerified: boolean;
+ image?: string;
+ createdAt: string;
+ updatedAt: string;
+ lastLoginMethod?: string;
+ role: string;
+ banned: boolean;
+ banReason?: string | null;
+ banExpires?: string | null;
+ username: string;
+ displayUsername: string;
+ metadata?: Record;
+ twoFactorEnabled: boolean;
+ members?: Array<{
+ id: string;
+ organizationId: string;
+ userId: string;
+ role: string;
+ createdAt: string;
+ organization: {
+ id: string;
+ name: string;
+ slug: string;
+ logo: string;
+ createdAt: string;
+ _count: {
+ hackathons: number;
+ members: number;
+ };
+ };
+ }>;
+ projects?: Array<{
+ id: string;
+ title: string;
+ vision: string;
+ category: string;
+ status: string;
+ banner?: string | null;
+ logo?: string | null;
+ createdAt: string;
+ }>;
+ activities?: Array<{
+ id: string;
+ type: string;
+ userId: string;
+ projectId?: string | null;
+ organizationId?: string | null;
+ metadata?: any;
+ createdAt: string;
+ updatedAt: string;
+ project?: Record;
+ }>;
+ userBadges?: unknown[];
+ grantApplicationsAsApplicant?: unknown[];
+ hackathonSubmissionsAsParticipant?: Array<{
+ id: string;
+ status: string;
+ rank?: number | null;
+ submittedAt: string;
+ }>;
+ profile?: Record;
+ stats?: {
+ followers: number;
+ following: number;
+ };
}
export interface OrganizationLinks {
website: string;
@@ -101,8 +162,8 @@ export interface Organization {
members?: string[]; // Array of user emails
admins?: string[]; // Array of admin emails
owner?: string; // Owner email or userId
- hackathons?: any[]; // Full hackathon objects instead of just IDs
- grants?: any[]; // Full grant objects instead of just IDs
+ hackathons?: unknown[]; // Full hackathon objects instead of just IDs
+ grants?: unknown[]; // Full grant objects instead of just IDs
isProfileComplete: boolean;
pendingInvites?: string[]; // Array of emails invited but not yet accepted
betterAuthOrgId?: string; // Better Auth organization ID for organizations using Better Auth integration
@@ -162,29 +223,36 @@ export interface GoogleAuthRequest {
export type GoogleAuthResponse = AuthTokens;
// GetMe
-export type GetMeResponse = User & {
- organizations: Organization[];
- projects: CrowdfundingProject[];
- following: User[];
- followers: User[];
+export interface GetMeResponse {
+ user: User;
stats: {
- votes: number;
- grants: number;
- hackathons: number;
- donations: number;
projectsCreated: number;
projectsFunded: number;
totalContributed: number;
- reputation: number;
- communityScore: number;
commentsPosted: number;
- organizations: number;
+ votes: number;
+ grants: number;
+ hackathons: number;
followers: number;
following: number;
+ reputation: number;
+ communityScore: number;
};
- activities: unknown[];
- contributedProjects: unknown[];
-};
+ chart: Array<{ date: string; count: number }>;
+ activitiesGraph: Array<{ date: string; count: number }>;
+ recentActivities: Array<{
+ id: string;
+ type: string;
+ userId: string;
+ projectId?: string | null;
+ organizationId?: string | null;
+ metadata?: any;
+ createdAt: string;
+ updatedAt: string;
+ project?: Record;
+ organization?: Record;
+ }>;
+}
// Logout
export interface LogoutResponse {
@@ -327,7 +395,7 @@ export interface MilestoneInit {
description: string;
deliveryDate: string; // YYYY-MM-DD
fundPercentage: number; // 0-100
- fundAmount: number; // derived: fundAmount * fundPercentage / 100
+ amount: number; // derived: fundAmount * fundPercentage / 100
}
export interface ProjectInitRequest {
@@ -336,7 +404,7 @@ export interface ProjectInitRequest {
tagline: string;
type: 'crowdfund' | 'grant';
category: string;
- fundAmount: number;
+ amount: number;
tags: string[];
// Optional assets until upload integration is wired
thumbnail?: string;
@@ -360,7 +428,7 @@ export interface CampaignDetails {
tagline: string;
description: string;
category: string;
- fundAmount: number;
+ amount: number;
raisedAmount: number;
tags: string[];
thumbnail: string;
@@ -413,8 +481,8 @@ export interface ShareLinkResponse {
export interface CrowdfundingMilestone {
name: string;
description: string;
- startDate: string; // YYYY-MM-DD
- endDate: string; // YYYY-MM-DD
+ startDate: string;
+ endDate: string;
amount: number;
}
@@ -439,6 +507,7 @@ export interface CrowdfundingSocialLink {
export interface CreateCrowdfundingProjectRequest {
title: string;
logo: string;
+ banner?: string;
vision: string;
category: string;
details: string;
@@ -448,14 +517,32 @@ export interface CreateCrowdfundingProjectRequest {
bitbucketUrl?: string;
projectWebsite?: string;
demoVideo?: string;
- milestones: CrowdfundingMilestone[];
- team: CrowdfundingTeamMember[];
- contact: CrowdfundingContact;
- socialLinks?: CrowdfundingSocialLink[];
- // Blockchain transaction data (handled by frontend)
+ milestones: Array<{
+ title: string;
+ description: string;
+ deliverable: string;
+ expectedDeliveryDate: string;
+ fundingPercentage: number;
+ orderIndex: number;
+ amount: number;
+ }>;
+ team: Array<{
+ name: string;
+ role: string;
+ email: string;
+ linkedin?: string;
+ twitter?: string;
+ }>;
+ contact: {
+ primary: string;
+ backup: string;
+ };
+ socialLinks: Array<{
+ platform: string;
+ url: string;
+ }>;
escrowId: string;
transactionHash: string;
- validateMilestones?: boolean;
}
// Step 1: Prepare Project Response
@@ -768,6 +855,8 @@ export interface DeleteCrowdfundingProjectResponse {
export interface FundCrowdfundingProjectRequest {
amount: number;
transactionHash: string;
+ anonymous?: boolean;
+ message?: string;
}
export interface FundCrowdfundingProjectResponse {
@@ -890,3 +979,6 @@ export interface RemoveVoteResponse {
};
message: string;
}
+
+// Alias for backward compatibility
+// export type CrowdfundingCampaign = CreateCrowdfundingProjectResponse;
diff --git a/lib/api/upload.ts b/lib/api/upload.ts
index d879dce14..e75e14e00 100644
--- a/lib/api/upload.ts
+++ b/lib/api/upload.ts
@@ -458,4 +458,18 @@ export const uploadProjectGallery = async (
});
};
+/**
+ * Upload milestone evidence documents
+ */
+export const uploadMilestoneDocuments = async (
+ files: File[],
+ campaignId: string,
+ milestoneIndex: number
+) => {
+ return uploadService.uploadMultiple(files, {
+ folder: `boundless/campaigns/${campaignId}/milestones/${milestoneIndex}`,
+ tags: ['milestone', 'evidence', 'document'],
+ });
+};
+
export default uploadService;
diff --git a/lib/auth/server-auth.ts b/lib/auth/server-auth.ts
index 00b91dfb1..79f6b7d79 100644
--- a/lib/auth/server-auth.ts
+++ b/lib/auth/server-auth.ts
@@ -98,13 +98,13 @@ export async function getServerUser(): Promise {
const user = await getMeServer();
return {
- id: (user._id || user.id) as string,
- email: user.email as string,
- name: (user.profile?.firstName || user.name) as string | null,
- image: (user.profile?.avatar || user.image) as string | null,
- role: user.roles?.[0] === 'ADMIN' ? 'ADMIN' : 'USER',
- isVerified: user.isVerified,
- profile: user.profile,
+ id: user.user.id as string,
+ email: user.user.email as string,
+ name: user.user.name as string | null,
+ image: user.user.image as string | null,
+ role: user.user.role === 'super_admin' ? 'ADMIN' : 'USER',
+ isVerified: user.user.emailVerified,
+ profile: user.user.profile,
};
} catch {
// Silently handle auth errors
diff --git a/lib/auth/utils.ts b/lib/auth/utils.ts
index dc83fa966..793ef4238 100644
--- a/lib/auth/utils.ts
+++ b/lib/auth/utils.ts
@@ -4,7 +4,7 @@ import { User } from '@/lib/api/types';
* Safely extracts role from user data, defaulting to 'USER'
*/
export function safeRole(val: unknown): 'USER' | 'ADMIN' {
- return val === 'ADMIN' ? 'ADMIN' : 'USER';
+ return val === 'ADMIN' || val === 'super_admin' ? 'ADMIN' : 'USER';
}
/**
@@ -38,9 +38,7 @@ export function safeStringOrNull(value: unknown): string | null {
export function extractUserInfo(user: User) {
// Extract role with proper fallback logic
let role: 'USER' | 'ADMIN' = 'USER';
- if (Array.isArray(user.roles) && user.roles.length > 0) {
- role = safeRole(user.roles[0]);
- } else if (typeof user.role === 'string') {
+ if (typeof user.role === 'string') {
role = safeRole(user.role);
}
@@ -49,11 +47,12 @@ export function extractUserInfo(user: User) {
user.profile && typeof user.profile === 'object' ? user.profile : {};
const firstName = safeStringOrNull(
- (profile as Record).firstName || user.firstName
+ (profile as Record).firstName || user.name?.split(' ')[0]
);
const lastName = safeStringOrNull(
- (profile as Record).lastName || user.lastName
+ (profile as Record).lastName ||
+ user.name?.split(' ').slice(1).join(' ')
);
const image = safeStringOrNull(
@@ -61,11 +60,11 @@ export function extractUserInfo(user: User) {
);
const username = safeStringOrNull(
- (profile as Record).username
+ (profile as Record).username || user.username
);
return {
- id: getId(user._id, user.id),
+ id: getId(user.id, user.id),
email: safeString(user.email),
firstName,
lastName,
diff --git a/lib/compose-refs.ts b/lib/compose-refs.ts
new file mode 100644
index 000000000..ade7a28f3
--- /dev/null
+++ b/lib/compose-refs.ts
@@ -0,0 +1,62 @@
+import * as React from 'react';
+
+type PossibleRef = React.Ref | undefined;
+
+/**
+ * Set a given ref to a given value
+ * This utility takes care of different types of refs: callback refs and RefObject(s)
+ */
+function setRef(ref: PossibleRef, value: T) {
+ if (typeof ref === 'function') {
+ return ref(value);
+ }
+
+ if (ref !== null && ref !== undefined) {
+ ref.current = value;
+ }
+}
+
+/**
+ * A utility to compose multiple refs together
+ * Accepts callback refs and RefObject(s)
+ */
+function composeRefs(...refs: PossibleRef[]): React.RefCallback {
+ return node => {
+ let hasCleanup = false;
+ const cleanups = refs.map(ref => {
+ const cleanup = setRef(ref, node);
+ if (!hasCleanup && typeof cleanup === 'function') {
+ hasCleanup = true;
+ }
+ return cleanup;
+ });
+
+ // React <19 will log an error to the console if a callback ref returns a
+ // value. We don't use ref cleanups internally so this will only happen if a
+ // user's ref callback returns a value, which we only expect if they are
+ // using the cleanup functionality added in React 19.
+ if (hasCleanup) {
+ return () => {
+ for (let i = 0; i < cleanups.length; i++) {
+ const cleanup = cleanups[i];
+ if (typeof cleanup === 'function') {
+ cleanup();
+ } else {
+ setRef(refs[i], null);
+ }
+ }
+ };
+ }
+ };
+}
+
+/**
+ * A custom hook that composes multiple refs
+ * Accepts callback refs and RefObject(s)
+ */
+function useComposedRefs(...refs: PossibleRef[]): React.RefCallback {
+ // biome-ignore lint/correctness/useExhaustiveDependencies: we want to memoize by all values
+ return React.useCallback(composeRefs(...refs), refs);
+}
+
+export { composeRefs, useComposedRefs };
diff --git a/lib/providers/OrganizationProvider.tsx b/lib/providers/OrganizationProvider.tsx
index 1481e9485..85a3aa6f0 100644
--- a/lib/providers/OrganizationProvider.tsx
+++ b/lib/providers/OrganizationProvider.tsx
@@ -390,7 +390,7 @@ export function OrganizationProvider({
throw new Error('Invalid response from getMe API');
}
- const organizations = response.members || [];
+ const organizations = response.user.members || [];
logger.info({
eventType: 'org.fetchOrganizations.organizations_loaded',
count: Array.isArray(organizations) ? organizations.length : 0,
@@ -1139,7 +1139,7 @@ export function OrganizationProvider({
try {
// Get current user info from getMe API
const userResponse = await getMe();
- const userId = userResponse.id;
+ const userId = userResponse.user.id;
if (!userId) return false;
// List members from Better Auth
diff --git a/lib/stores/auth-store.ts b/lib/stores/auth-store.ts
index e3c9f1ba4..08c092bd8 100644
--- a/lib/stores/auth-store.ts
+++ b/lib/stores/auth-store.ts
@@ -165,14 +165,14 @@ export const useAuthStore = create()(
const user = await getMe();
const transformedUser: User = {
- id: user.id as string,
- email: user.email as string,
- name: user.name as string | null,
- image: user.image as string | null,
- username: user.username as string | null,
- role: user.role as 'USER' | 'ADMIN',
- isVerified: user.emailVerified as boolean | undefined,
- profile: user.profile as User['profile'],
+ id: user.user.id as string,
+ email: user.user.email as string,
+ name: user.user.name as string | null,
+ image: user.user.image as string | null,
+ username: user.user.username as string | null,
+ role: user.user.role as 'USER' | 'ADMIN',
+ isVerified: user.user.emailVerified as boolean | undefined,
+ profile: user.user.profile as User['profile'],
} as User;
set({
@@ -234,14 +234,14 @@ export const useAuthStore = create()(
const user = await getMe();
const transformedUser: User = {
- id: user.id as string,
- email: user.email as string,
- name: user.name as string | null,
- image: user.image as string | null,
- username: user.username as string | null,
- role: user.role as 'USER' | 'ADMIN',
- isVerified: user.emailVerified as boolean | undefined,
- profile: user.profile as User['profile'],
+ id: user.user.id as string,
+ email: user.user.email as string,
+ name: user.user.name as string | null,
+ image: user.user.image as string | null,
+ username: user.user.username as string | null,
+ role: user.user.role as 'USER' | 'ADMIN',
+ isVerified: user.user.emailVerified as boolean | undefined,
+ profile: user.user.profile as User['profile'],
} as User;
set({
@@ -314,14 +314,14 @@ export const useAuthStore = create()(
const user = await getMe();
const transformedUser: User = {
- id: user.id as string,
- email: user.email as string,
- name: user.name as string | null,
- image: user.image as string | null,
- username: user.username as string | null,
- role: user.role as 'USER' | 'ADMIN',
- isVerified: user.emailVerified as boolean | undefined,
- profile: user.profile as User['profile'],
+ id: user.user.id as string,
+ email: user.user.email as string,
+ name: user.user.name as string | null,
+ image: user.user.image as string | null,
+ username: user.user.username as string | null,
+ role: user.user.role as 'USER' | 'ADMIN',
+ isVerified: user.user.emailVerified as boolean | undefined,
+ profile: user.user.profile as User['profile'],
} as User;
set({
diff --git a/lib/stores/project-sheet-store.ts b/lib/stores/project-sheet-store.ts
index 965f27eff..c12ec5fa0 100644
--- a/lib/stores/project-sheet-store.ts
+++ b/lib/stores/project-sheet-store.ts
@@ -1,6 +1,6 @@
'use client';
-import { CrowdfundingProject } from '@/types/project';
+import { CrowdfundingProject } from '@/features/projects/types';
import { create } from 'zustand';
type ProjectSheetMode = 'initialize' | 'validate';
diff --git a/lib/utils/hackathon-escrow.ts b/lib/utils/hackathon-escrow.ts
index f04aa7214..139e49ec2 100644
--- a/lib/utils/hackathon-escrow.ts
+++ b/lib/utils/hackathon-escrow.ts
@@ -24,7 +24,7 @@ const PLACEHOLDER_MILESTONE_AMOUNT = 1;
*/
const BOUNDLESS_PLATFORM_ADDRESS =
process.env.NEXT_PUBLIC_BOUNDLESS_PLATFORM_ADDRESS ||
- 'GA4XJQJTKVQZXYW5CYM77CD5E7CX7FJLVDSIWZAV6FEIBFZNRKSWWTFN'; // Fallback to empty string if not configured
+ 'GB56E64MBDKI43NLRKOGXDENXHEEYSSHALOJ4Q5YDLW3TMTLUCHCIJWC'; // Fallback to empty string if not configured
/**
* Get Boundless platform wallet address
diff --git a/package-lock.json b/package-lock.json
index 09f7cd524..34bd72cb1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,8 +10,9 @@
"hasInstallScript": true,
"dependencies": {
"@countrystatecity/countries": "^1.0.4",
- "@creit.tech/stellar-wallets-kit": "^1.7.6",
+ "@creit.tech/stellar-wallets-kit": "^1.5.0",
"@dnd-kit/core": "^6.3.1",
+ "@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@gsap/react": "^2.1.2",
@@ -20,34 +21,37 @@
"@radix-ui/react-accordion": "^1.2.11",
"@radix-ui/react-alert-dialog": "^1.1.14",
"@radix-ui/react-aspect-ratio": "^1.1.7",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-checkbox": "^1.3.2",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-collapsible": "^1.1.11",
"@radix-ui/react-context-menu": "^2.2.15",
- "@radix-ui/react-dialog": "^1.1.14",
- "@radix-ui/react-dropdown-menu": "^2.1.15",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-direction": "^1.1.1",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.14",
- "@radix-ui/react-label": "^2.1.7",
+ "@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-menubar": "^1.1.15",
"@radix-ui/react-navigation-menu": "^1.2.13",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "^1.3.7",
"@radix-ui/react-scroll-area": "^1.2.9",
- "@radix-ui/react-select": "^2.2.5",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slider": "^1.3.5",
- "@radix-ui/react-slot": "^1.2.3",
+ "@radix-ui/react-select": "^2.2.6",
+ "@radix-ui/react-separator": "^1.1.8",
+ "@radix-ui/react-slider": "^1.3.6",
+ "@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.5",
- "@radix-ui/react-tabs": "^1.1.12",
- "@radix-ui/react-toggle": "^1.1.9",
- "@radix-ui/react-toggle-group": "^1.1.10",
- "@radix-ui/react-tooltip": "^1.2.7",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@radix-ui/react-toggle": "^1.1.10",
+ "@radix-ui/react-toggle-group": "^1.1.11",
+ "@radix-ui/react-tooltip": "^1.2.8",
"@react-three/drei": "^10.7.6",
"@react-three/fiber": "^9.3.0",
"@stellar/freighter-api": "^4.1.0",
"@stellar/stellar-sdk": "^13.3.0",
+ "@tabler/icons-react": "^3.36.1",
"@tailwindcss/postcss": "^4",
+ "@tanstack/react-table": "^8.21.3",
"@tiptap/core": "^3.7.2",
"@tiptap/extension-blockquote": "^3.7.2",
"@tiptap/extension-bold": "^3.7.2",
@@ -94,8 +98,8 @@
"lodash.debounce": "^4.0.8",
"lucide-react": "^0.525.0",
"marked": "^16.3.0",
- "media-chrome": "^4.15.1",
- "motion": "^12.23.24",
+ "media-chrome": "^4.17.2",
+ "motion": "^12.30.0",
"next": "^16.1.1",
"next-auth": "^5.0.0-beta.29",
"next-themes": "^0.4.6",
@@ -110,12 +114,12 @@
"recharts": "^2.15.4",
"remark-gfm": "^4.0.1",
"socket.io-client": "^4.8.1",
- "sonner": "^2.0.6",
+ "sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"three": "^0.180.0",
"tw-animate-css": "^1.3.6",
"vaul": "^1.1.2",
- "zod": "^4.0.10",
+ "zod": "^4.3.5",
"zustand": "^5.0.6"
},
"devDependencies": {
@@ -125,7 +129,7 @@
"@types/react-dom": "19.2.3",
"@typescript-eslint/eslint-plugin": "^8.38.0",
"@typescript-eslint/parser": "^8.38.0",
- "eslint": "^8.57.0",
+ "eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.3",
"eslint-plugin-react": "^7.37.5",
@@ -189,13 +193,12 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
- "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
@@ -207,7 +210,6 @@
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
"integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -217,7 +219,6 @@
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
@@ -248,21 +249,19 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
- "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz",
+ "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.5",
- "@babel/types": "^7.28.5",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -271,11 +270,22 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+ "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-compilation-targets": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.2",
@@ -292,7 +302,36 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz",
+ "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-member-expression-to-functions": "^7.28.5",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.6",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -302,36 +341,84 @@
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz",
+ "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
"version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
- "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.27.1",
"@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
- "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
- "dev": true,
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz",
+ "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.28.3"
+ "@babel/helper-member-expression-to-functions": "^7.28.5",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -340,11 +427,23 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -354,7 +453,6 @@
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -364,7 +462,6 @@
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -374,7 +471,6 @@
"version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
@@ -385,13 +481,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
- "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.5"
+ "@babel/types": "^7.29.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -400,6 +495,90 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz",
+ "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz",
+ "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz",
+ "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz",
+ "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-typescript": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/runtime": {
"version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
@@ -410,33 +589,31 @@
}
},
"node_modules/@babel/template": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
- "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
- "dev": true,
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/parser": "^7.27.2",
- "@babel/types": "^7.27.1"
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
- "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.5",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.5",
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.5",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
"debug": "^4.3.1"
},
"engines": {
@@ -444,10 +621,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
- "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
- "dev": true,
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -504,13 +680,12 @@
"license": "ODbL-1.0"
},
"node_modules/@creit.tech/stellar-wallets-kit": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/@creit.tech/stellar-wallets-kit/-/stellar-wallets-kit-1.9.5.tgz",
- "integrity": "sha512-b9E77r+o6Opow0CttmHdFBPeJpdLhOcLFTx3CbnwMQVivo94niap70y3A03F5cYgwVk9HhM4CJr0aimm0eNwxA==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@creit.tech/stellar-wallets-kit/-/stellar-wallets-kit-1.5.0.tgz",
+ "integrity": "sha512-H01QToFltbfhaelLYn/HQNHyeLOfYfi+u/Nc5Ak7rLtcSkBHEsRjq4lwo/lla1tbIUohndS4REq0Mncin69bUw==",
"dependencies": {
"@albedo-link/intent": "0.12.0",
- "@creit.tech/xbull-wallet-connect": "^0.4.0",
- "@hot-wallet/sdk": "1.0.11",
+ "@creit.tech/xbull-wallet-connect": "0.3.0",
"@ledgerhq/hw-app-str": "7.0.4",
"@ledgerhq/hw-transport": "6.31.4",
"@ledgerhq/hw-transport-webusb": "6.29.4",
@@ -519,9 +694,9 @@
"@ngneat/elf-devtools": "1.3.0",
"@ngneat/elf-entities": "5.0.2",
"@ngneat/elf-persist-state": "1.2.1",
- "@stellar/freighter-api": "5.0.0",
- "@trezor/connect-plugin-stellar": "9.2.1",
- "@trezor/connect-web": "9.6.2",
+ "@stellar/freighter-api": "4.0.0",
+ "@trezor/connect-plugin-stellar": "9.0.6",
+ "@trezor/connect-web": "9.4.7",
"@walletconnect/modal": "2.6.2",
"@walletconnect/sign-client": "2.11.2",
"buffer": "6.0.3",
@@ -533,35 +708,65 @@
"node": ">=16"
},
"peerDependencies": {
- "@stellar/stellar-base": "^14.0.0"
+ "@stellar/stellar-base": "^12.1.1"
}
},
"node_modules/@creit.tech/stellar-wallets-kit/node_modules/@stellar/freighter-api": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-5.0.0.tgz",
- "integrity": "sha512-MydzLg+WpSzmws24uUs4mVME2LPN8xhUWkwyGEP0N1Hr519swC6I/W7K6cdVBzghBiVv7f/vvGFNT+0p1a33Vg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-4.0.0.tgz",
+ "integrity": "sha512-LYuVAUuvmZhzissBoAQPu2InD+R7WW1NUAJZ3iD0mPa/e5pMEhQSQUQoBWLcSpSrsQduRSDqEn5Egu8caUjLgQ==",
"license": "Apache-2.0",
"dependencies": {
- "buffer": "6.0.3",
- "semver": "7.7.1"
+ "buffer": "^6.0.3",
+ "semver": "^7.6.3"
}
},
- "node_modules/@creit.tech/stellar-wallets-kit/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/@creit.tech/stellar-wallets-kit/node_modules/@stellar/stellar-sdk": {
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-12.3.0.tgz",
+ "integrity": "sha512-F2DYFop/M5ffXF0lvV5Ezjk+VWNKg0QDX8gNhwehVU3y5LYA3WAY6VcCarMGPaG9Wdgoeh1IXXzOautpqpsltw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@stellar/stellar-base": "^12.1.1",
+ "axios": "^1.7.7",
+ "bignumber.js": "^9.1.2",
+ "eventsource": "^2.0.2",
+ "randombytes": "^2.1.0",
+ "toml": "^3.0.0",
+ "urijs": "^1.19.1"
+ }
+ },
+ "node_modules/@creit.tech/stellar-wallets-kit/node_modules/@trezor/connect-plugin-stellar": {
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/@trezor/connect-plugin-stellar/-/connect-plugin-stellar-9.0.6.tgz",
+ "integrity": "sha512-LieD7xqckUXaPIA3a5XHyAAWE4gMRru6ot+kp1J93MfLn7wnjzJ5FrH2/TXFMxXJh/o1VCX/CzT4KQmgFSQ4Lw==",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "@trezor/utils": "9.2.2"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "@stellar/stellar-sdk": "^12.1.3",
+ "@trezor/connect": "9.x.x",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@creit.tech/stellar-wallets-kit/node_modules/@trezor/utils": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.2.2.tgz",
+ "integrity": "sha512-eTKOXhJsqUObQiL4ccJvamuDe9YDt+QFPh25YG85fqUInN85H/dxRXiLEboeqkRHldP06+bG+e2t4iAnsWuINQ==",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "bignumber.js": "^9.1.2"
+ },
+ "peerDependencies": {
+ "tslib": "^2.6.2"
}
},
"node_modules/@creit.tech/xbull-wallet-connect": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@creit.tech/xbull-wallet-connect/-/xbull-wallet-connect-0.4.0.tgz",
- "integrity": "sha512-LrCUIqUz50SkZ4mv2hTqSmwews8CNRYVoZ9+VjLsK/1U8PByzXTxv1vZyenj6avRTG86ifpoeihz7D3D5YIDrQ==",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@creit.tech/xbull-wallet-connect/-/xbull-wallet-connect-0.3.0.tgz",
+ "integrity": "sha512-pByi0bTAWd2ZdolVtkXcAU1DYTtz/cJc/IkRUz9x9/1NsFVyrM4UxE8tHgVZ3mwrJ4josoDwYP957ynQw195YQ==",
"dependencies": {
"rxjs": "^7.5.5",
"tweetnacl": "^1.0.3",
@@ -610,6 +815,20 @@
"react-dom": ">=16.8.0"
}
},
+ "node_modules/@dnd-kit/modifiers": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz",
+ "integrity": "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@dnd-kit/utilities": "^3.2.2",
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@dnd-kit/core": "^6.3.0",
+ "react": ">=16.8.0"
+ }
+ },
"node_modules/@dnd-kit/sortable": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz",
@@ -650,13 +869,15 @@
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz",
"integrity": "sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@emurgo/cardano-serialization-lib-nodejs": {
"version": "13.2.0",
"resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-13.2.0.tgz",
"integrity": "sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.9.0",
@@ -687,6 +908,47 @@
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/@eslint/eslintrc": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
@@ -712,63 +974,122 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
- "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
+ "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@ethereumjs/common": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-10.1.0.tgz",
- "integrity": "sha512-zIHCy0i2LFmMDp+QkENyoPGxcoD3QzeNVhx6/vE4nJk4uWGNXzO8xJ2UC4gtGW4UJTAOXja8Z1yZMVeRc2/+Ew==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-10.1.1.tgz",
+ "integrity": "sha512-NefPzPlrJ9w+NWVe06P+sHZQU98E1AEU9vhiHJEVT2wEcNBC1YX6hON9+smrfbn86C4U1pb2zbvjhkF+n/LKBw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@ethereumjs/util": "^10.1.0",
+ "@ethereumjs/util": "^10.1.1",
"eventemitter3": "^5.0.1"
}
},
"node_modules/@ethereumjs/rlp": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-10.1.0.tgz",
- "integrity": "sha512-r67BJbwilammAqYI4B5okA66cNdTlFzeWxPNJOolKV52ZS/flo0tUBf4x4gxWXBgh48OgsdFV1Qp5pRoSe8IhQ==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-10.1.1.tgz",
+ "integrity": "sha512-jbnWTEwcpoY+gE0r+wxfDG9zgiu54DcTcwnc9sX3DsqKR4l5K7x2V8mQL3Et6hURa4DuT9g7z6ukwpBLFchszg==",
"license": "MPL-2.0",
+ "peer": true,
"bin": {
"rlp": "bin/rlp.cjs"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
}
},
"node_modules/@ethereumjs/tx": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-10.1.0.tgz",
- "integrity": "sha512-svG6pyzUZDpunafszf2BaolA6Izuvo8ZTIETIegpKxAXYudV1hmzPQDdSI+d8nHCFyQfEFbQ6tfUq95lNArmmg==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-10.1.1.tgz",
+ "integrity": "sha512-Kz8GWIKQjEQB60ko9hsYDX3rZMHZZOTcmm6OFl855Lu3padVnf5ZactUKM6nmWPsumHED5bWDjO32novZd1zyw==",
"license": "MPL-2.0",
+ "peer": true,
"dependencies": {
- "@ethereumjs/common": "^10.1.0",
- "@ethereumjs/rlp": "^10.1.0",
- "@ethereumjs/util": "^10.1.0",
- "ethereum-cryptography": "^3.2.0"
+ "@ethereumjs/common": "^10.1.1",
+ "@ethereumjs/rlp": "^10.1.1",
+ "@ethereumjs/util": "^10.1.1",
+ "@noble/curves": "^2.0.1",
+ "@noble/hashes": "^2.0.1"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
+ }
+ },
+ "node_modules/@ethereumjs/tx/node_modules/@noble/hashes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz",
+ "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/@ethereumjs/util": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-10.1.0.tgz",
- "integrity": "sha512-GGTCkRu1kWXbz2JoUnIYtJBOoA9T5akzsYa91Bh+DZQ3Cj4qXj3hkNU0Rx6wZlbcmkmhQfrjZfVt52eJO/y2nA==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-10.1.1.tgz",
+ "integrity": "sha512-r2EhaeEmLZXVs1dT2HJFQysAkr63ZWATu/9tgYSp1IlvjvwyC++DLg5kCDwMM49HBq3sOAhrPnXkoqf9DV2gbw==",
"license": "MPL-2.0",
+ "peer": true,
"dependencies": {
- "@ethereumjs/rlp": "^10.1.0",
- "ethereum-cryptography": "^3.2.0"
+ "@ethereumjs/rlp": "^10.1.1",
+ "@noble/curves": "^2.0.1",
+ "@noble/hashes": "^2.0.1"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
+ }
+ },
+ "node_modules/@ethereumjs/util/node_modules/@noble/hashes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz",
+ "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/@fivebinaries/coin-selection": {
@@ -776,6 +1097,7 @@
"resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-3.0.0.tgz",
"integrity": "sha512-h25Pn1ZA7oqQBQDodGAgIsQt66T2wDge9onBKNqE66WNWL0KJiKJbpij8YOLo5AAlEIg5IS7EB1QjBgDOIg6DQ==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@emurgo/cardano-serialization-lib-browser": "^13.2.0",
"@emurgo/cardano-serialization-lib-nodejs": "13.2.0"
@@ -841,36 +1163,28 @@
"react-hook-form": "^7.55.0"
}
},
- "node_modules/@hot-wallet/sdk": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@hot-wallet/sdk/-/sdk-1.0.11.tgz",
- "integrity": "sha512-qRDH/4yqnRCnk7L/Qd0/LDOKDUKWcFgvf6eRELJkP0OgxIe65i/iXaG+u2lL0mLbTGkiWYk67uAvEerNUv2gzA==",
- "dependencies": {
- "@near-js/crypto": "^1.4.0",
- "@near-js/utils": "^1.0.0",
- "@near-wallet-selector/core": "^8.9.13",
- "@solana/wallet-adapter-base": "^0.9.23",
- "@solana/web3.js": "^1.95.0",
- "borsh": "^2.0.0",
- "js-sha256": "^0.11.0",
- "sha1": "^1.1.1",
- "uuid4": "^2.0.3"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
- "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
- "deprecated": "Use @eslint/config-array instead",
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@humanwhocodes/object-schema": "^2.0.3",
- "debug": "^4.3.1",
- "minimatch": "^3.0.5"
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
- "node": ">=10.10.0"
+ "node": ">=18.18.0"
}
},
"node_modules/@humanwhocodes/module-importer": {
@@ -887,13 +1201,19 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
- "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
- "deprecated": "Use @eslint/object-schema instead",
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
- "license": "BSD-3-Clause"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
},
"node_modules/@img/colour": {
"version": "1.0.0",
@@ -1616,259 +1936,16 @@
"tslib": "^2.3.1"
}
},
- "node_modules/@near-js/accounts": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@near-js/accounts/-/accounts-1.4.1.tgz",
- "integrity": "sha512-ni3QT9H3NdrbVVKyx56yvz93r89Dvpc/vgVtiIK2OdXjkK6jcj+UKMDRQ6F7rd9qJOInLkHZbVBtcR6j1CXLjw==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/crypto": "1.4.2",
- "@near-js/providers": "1.0.3",
- "@near-js/signers": "0.2.2",
- "@near-js/transactions": "1.3.3",
- "@near-js/types": "0.3.1",
- "@near-js/utils": "1.1.0",
- "@noble/hashes": "1.7.1",
- "borsh": "1.0.0",
- "depd": "2.0.0",
- "is-my-json-valid": "^2.20.6",
- "lru_map": "0.4.1",
- "near-abi": "0.2.0"
- }
- },
- "node_modules/@near-js/accounts/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0",
- "peer": true
- },
- "node_modules/@near-js/crypto": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-1.4.2.tgz",
- "integrity": "sha512-GRfchsyfWvSAPA1gI9hYhw5FH94Ac1BUo+Cmp5rSJt/V0K3xVzCWgOQxvv4R3kDnWjaXJEuAmpEEnr4Bp3FWrA==",
- "license": "ISC",
- "dependencies": {
- "@near-js/types": "0.3.1",
- "@near-js/utils": "1.1.0",
- "@noble/curves": "1.8.1",
- "borsh": "1.0.0",
- "randombytes": "2.1.0",
- "secp256k1": "5.0.1"
- }
- },
- "node_modules/@near-js/crypto/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0"
- },
- "node_modules/@near-js/keystores": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.2.2.tgz",
- "integrity": "sha512-DLhi/3a4qJUY+wgphw2Jl4S+L0AKsUYm1mtU0WxKYV5OBwjOXvbGrXNfdkheYkfh3nHwrQgtjvtszX6LrRXLLw==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/crypto": "1.4.2",
- "@near-js/types": "0.3.1"
- }
- },
- "node_modules/@near-js/keystores-browser": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@near-js/keystores-browser/-/keystores-browser-0.2.2.tgz",
- "integrity": "sha512-Pxqm7WGtUu6zj32vGCy9JcEDpZDSB5CCaLQDTQdF3GQyL0flyRv2I/guLAgU5FLoYxU7dJAX9mslJhPW7P2Bfw==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/crypto": "1.4.2",
- "@near-js/keystores": "0.2.2"
- }
- },
- "node_modules/@near-js/keystores-node": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@near-js/keystores-node/-/keystores-node-0.1.2.tgz",
- "integrity": "sha512-MWLvTszZOVziiasqIT/LYNhUyWqOJjDGlsthOsY6dTL4ZcXjjmhmzrbFydIIeQr+CcEl5wukTo68ORI9JrHl6g==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/crypto": "1.4.2",
- "@near-js/keystores": "0.2.2"
- }
- },
- "node_modules/@near-js/providers": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@near-js/providers/-/providers-1.0.3.tgz",
- "integrity": "sha512-VJMboL14R/+MGKnlhhE3UPXCGYvMd1PpvF9OqZ9yBbulV7QVSIdTMfY4U1NnDfmUC2S3/rhAEr+3rMrIcNS7Fg==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/transactions": "1.3.3",
- "@near-js/types": "0.3.1",
- "@near-js/utils": "1.1.0",
- "borsh": "1.0.0",
- "exponential-backoff": "^3.1.2"
- },
- "optionalDependencies": {
- "node-fetch": "2.6.7"
- }
- },
- "node_modules/@near-js/providers/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0",
- "peer": true
- },
- "node_modules/@near-js/providers/node_modules/node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/@near-js/signers": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.2.2.tgz",
- "integrity": "sha512-M6ib+af9zXAPRCjH2RyIS0+RhCmd9gxzCeIkQ+I2A3zjgGiEDkBZbYso9aKj8Zh2lPKKSH7h+u8JGymMOSwgyw==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/crypto": "1.4.2",
- "@near-js/keystores": "0.2.2",
- "@noble/hashes": "1.3.3"
- }
- },
- "node_modules/@near-js/signers/node_modules/@noble/hashes": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz",
- "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@near-js/transactions": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@near-js/transactions/-/transactions-1.3.3.tgz",
- "integrity": "sha512-1AXD+HuxlxYQmRTLQlkVmH+RAmV3HwkAT8dyZDu+I2fK/Ec9BQHXakOJUnOBws3ihF+akQhamIBS5T0EXX/Ylw==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/crypto": "1.4.2",
- "@near-js/signers": "0.2.2",
- "@near-js/types": "0.3.1",
- "@near-js/utils": "1.1.0",
- "@noble/hashes": "1.7.1",
- "borsh": "1.0.0"
- }
- },
- "node_modules/@near-js/transactions/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0",
- "peer": true
- },
- "node_modules/@near-js/types": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.3.1.tgz",
- "integrity": "sha512-8qIA7ynAEAuVFNAQc0cqz2xRbfyJH3PaAG5J2MgPPhD18lu/tCGd6pzYg45hjhtiJJRFDRjh/FUWKS+ZiIIxUw==",
- "license": "ISC"
- },
- "node_modules/@near-js/utils": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@near-js/utils/-/utils-1.1.0.tgz",
- "integrity": "sha512-5XWRq7xpu8Wud9pRXe2U347KXyi0mXofedUY2DQ9TaqiZUcMIaN9xj7DbCs2v6dws3pJyYrT1KWxeNp5fSaY3w==",
- "license": "ISC",
- "dependencies": {
- "@near-js/types": "0.3.1",
- "@scure/base": "^1.2.0",
- "depd": "2.0.0",
- "mustache": "4.0.0"
- }
- },
- "node_modules/@near-js/wallet-account": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@near-js/wallet-account/-/wallet-account-1.3.3.tgz",
- "integrity": "sha512-GDzg/Kz0GBYF7tQfyQQQZ3vviwV8yD+8F2lYDzsWJiqIln7R1ov0zaXN4Tii86TeS21KPn2hHAsVu3Y4txa8OQ==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@near-js/accounts": "1.4.1",
- "@near-js/crypto": "1.4.2",
- "@near-js/keystores": "0.2.2",
- "@near-js/providers": "1.0.3",
- "@near-js/signers": "0.2.2",
- "@near-js/transactions": "1.3.3",
- "@near-js/types": "0.3.1",
- "@near-js/utils": "1.1.0",
- "borsh": "1.0.0"
- }
- },
- "node_modules/@near-js/wallet-account/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0",
- "peer": true
- },
- "node_modules/@near-wallet-selector/core": {
- "version": "8.10.2",
- "resolved": "https://registry.npmjs.org/@near-wallet-selector/core/-/core-8.10.2.tgz",
- "integrity": "sha512-MH8sg6XHyylq2ZXxnOjrKHMCmuRgFfpfdC816fW0R8hctZiXZ0lmfLvgG1xfA2BAxrVytiU1g3dcE97/P5cZqg==",
- "dependencies": {
- "borsh": "1.0.0",
- "events": "3.3.0",
- "js-sha256": "0.9.0",
- "rxjs": "7.8.1"
- },
- "peerDependencies": {
- "near-api-js": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/@near-wallet-selector/core/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0"
- },
- "node_modules/@near-wallet-selector/core/node_modules/js-sha256": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
- "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==",
- "license": "MIT"
- },
"node_modules/@next/env": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.1.tgz",
- "integrity": "sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
+ "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==",
"license": "MIT"
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.1.tgz",
- "integrity": "sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz",
+ "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==",
"cpu": [
"arm64"
],
@@ -1882,9 +1959,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.1.tgz",
- "integrity": "sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz",
+ "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==",
"cpu": [
"x64"
],
@@ -1898,9 +1975,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.1.tgz",
- "integrity": "sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz",
+ "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==",
"cpu": [
"arm64"
],
@@ -1914,9 +1991,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.1.tgz",
- "integrity": "sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz",
+ "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==",
"cpu": [
"arm64"
],
@@ -1930,9 +2007,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.1.tgz",
- "integrity": "sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz",
+ "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==",
"cpu": [
"x64"
],
@@ -1946,9 +2023,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.1.tgz",
- "integrity": "sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz",
+ "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==",
"cpu": [
"x64"
],
@@ -1962,9 +2039,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.1.tgz",
- "integrity": "sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz",
+ "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==",
"cpu": [
"arm64"
],
@@ -1978,9 +2055,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.1.tgz",
- "integrity": "sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz",
+ "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==",
"cpu": [
"x64"
],
@@ -2040,68 +2117,44 @@
}
},
"node_modules/@noble/curves": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz",
- "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz",
+ "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@noble/hashes": "1.7.1"
+ "@noble/hashes": "2.0.1"
},
"engines": {
- "node": "^14.21.3 || >=16"
+ "node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@noble/hashes": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz",
- "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==",
+ "node_modules/@noble/curves/node_modules/@noble/hashes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz",
+ "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==",
"license": "MIT",
+ "peer": true,
"engines": {
- "node": "^14.21.3 || >=16"
+ "node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
"license": "MIT",
"engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "node": "^14.21.3 || >=16"
},
- "engines": {
- "node": ">= 8"
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/@panva/hkdf": {
@@ -3900,6 +3953,7 @@
"resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
"integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==",
"license": "MIT",
+ "peer": true,
"funding": {
"url": "https://paulmillr.com/funding/"
}
@@ -3909,6 +3963,7 @@
"resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz",
"integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@noble/curves": "~1.9.0",
"@noble/hashes": "~1.8.0",
@@ -3923,6 +3978,7 @@
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
"integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@noble/hashes": "1.8.0"
},
@@ -3933,23 +3989,12 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@scure/bip32/node_modules/@noble/hashes": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
- "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
- "license": "MIT",
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@scure/bip39": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz",
"integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@noble/hashes": "~1.8.0",
"@scure/base": "~1.2.5"
@@ -3958,18 +4003,6 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@scure/bip39/node_modules/@noble/hashes": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
- "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
- "license": "MIT",
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@sinclair/typebox": {
"version": "0.33.22",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.33.22.tgz",
@@ -3987,6 +4020,7 @@
"resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.8.0.tgz",
"integrity": "sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==",
"license": "Apache-2.0",
+ "peer": true,
"peerDependencies": {
"@solana/kit": "^2.1.0"
}
@@ -3996,6 +4030,7 @@
"resolved": "https://registry.npmjs.org/@solana-program/stake/-/stake-0.2.1.tgz",
"integrity": "sha512-ssNPsJv9XHaA+L7ihzmWGYcm/+XYURQ8UA3wQMKf6ccEHyHOUgoglkkDU/BoA0+wul6HxZUN0tHFymC0qFw6sg==",
"license": "MIT",
+ "peer": true,
"peerDependencies": {
"@solana/kit": "^2.1.0"
}
@@ -4005,6 +4040,7 @@
"resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.7.0.tgz",
"integrity": "sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==",
"license": "Apache-2.0",
+ "peer": true,
"peerDependencies": {
"@solana/kit": "^2.1.0"
}
@@ -4014,6 +4050,7 @@
"resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz",
"integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==",
"license": "Apache-2.0",
+ "peer": true,
"peerDependencies": {
"@solana/kit": "^2.1.0"
}
@@ -4023,6 +4060,7 @@
"resolved": "https://registry.npmjs.org/@solana-program/token-2022/-/token-2022-0.4.2.tgz",
"integrity": "sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==",
"license": "Apache-2.0",
+ "peer": true,
"peerDependencies": {
"@solana/kit": "^2.1.0",
"@solana/sysvars": "^2.1.0"
@@ -4033,6 +4071,7 @@
"resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.3.0.tgz",
"integrity": "sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/addresses": "2.3.0",
"@solana/codecs-core": "2.3.0",
@@ -4053,6 +4092,7 @@
"resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.3.0.tgz",
"integrity": "sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/assertions": "2.3.0",
"@solana/codecs-core": "2.3.0",
@@ -4072,6 +4112,7 @@
"resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.3.0.tgz",
"integrity": "sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0"
},
@@ -4082,23 +4123,12 @@
"typescript": ">=5.3.3"
}
},
- "node_modules/@solana/buffer-layout": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz",
- "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==",
- "license": "MIT",
- "dependencies": {
- "buffer": "~6.0.3"
- },
- "engines": {
- "node": ">=5.10"
- }
- },
"node_modules/@solana/codecs": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.3.0.tgz",
"integrity": "sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/codecs-core": "2.3.0",
"@solana/codecs-data-structures": "2.3.0",
@@ -4118,6 +4148,7 @@
"resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz",
"integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0"
},
@@ -4133,6 +4164,7 @@
"resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.3.0.tgz",
"integrity": "sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/codecs-core": "2.3.0",
"@solana/codecs-numbers": "2.3.0",
@@ -4150,6 +4182,7 @@
"resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz",
"integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/codecs-core": "2.3.0",
"@solana/errors": "2.3.0"
@@ -4166,6 +4199,7 @@
"resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.3.0.tgz",
"integrity": "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/codecs-core": "2.3.0",
"@solana/codecs-numbers": "2.3.0",
@@ -4184,6 +4218,7 @@
"resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz",
"integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"chalk": "^5.4.1",
"commander": "^14.0.0"
@@ -4203,6 +4238,7 @@
"resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.3.0.tgz",
"integrity": "sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=20.18.0"
},
@@ -4215,6 +4251,7 @@
"resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.3.0.tgz",
"integrity": "sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=20.18.0"
},
@@ -4227,6 +4264,7 @@
"resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.3.0.tgz",
"integrity": "sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/codecs-core": "2.3.0",
"@solana/errors": "2.3.0"
@@ -4243,6 +4281,7 @@
"resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.3.0.tgz",
"integrity": "sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/assertions": "2.3.0",
"@solana/codecs-core": "2.3.0",
@@ -4262,6 +4301,7 @@
"resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.3.0.tgz",
"integrity": "sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/accounts": "2.3.0",
"@solana/addresses": "2.3.0",
@@ -4294,6 +4334,7 @@
"resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-2.3.0.tgz",
"integrity": "sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=20.18.0"
},
@@ -4306,6 +4347,7 @@
"resolved": "https://registry.npmjs.org/@solana/options/-/options-2.3.0.tgz",
"integrity": "sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/codecs-core": "2.3.0",
"@solana/codecs-data-structures": "2.3.0",
@@ -4325,6 +4367,7 @@
"resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.3.0.tgz",
"integrity": "sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/addresses": "2.3.0",
"@solana/errors": "2.3.0"
@@ -4341,6 +4384,7 @@
"resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.3.0.tgz",
"integrity": "sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=20.18.0"
},
@@ -4353,6 +4397,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.3.0.tgz",
"integrity": "sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/fast-stable-stringify": "2.3.0",
@@ -4376,6 +4421,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.3.0.tgz",
"integrity": "sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/addresses": "2.3.0",
"@solana/codecs-core": "2.3.0",
@@ -4401,6 +4447,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.3.0.tgz",
"integrity": "sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=20.18.0"
},
@@ -4413,6 +4460,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.3.0.tgz",
"integrity": "sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/rpc-spec-types": "2.3.0"
@@ -4429,6 +4477,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.3.0.tgz",
"integrity": "sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=20.18.0"
},
@@ -4441,6 +4490,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.3.0.tgz",
"integrity": "sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/fast-stable-stringify": "2.3.0",
@@ -4466,6 +4516,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.3.0.tgz",
"integrity": "sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/addresses": "2.3.0",
"@solana/keys": "2.3.0",
@@ -4487,6 +4538,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.3.0.tgz",
"integrity": "sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/functional": "2.3.0",
@@ -4506,6 +4558,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.3.0.tgz",
"integrity": "sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/promises": "2.3.0",
@@ -4524,6 +4577,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.3.0.tgz",
"integrity": "sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/functional": "2.3.0",
@@ -4543,6 +4597,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.3.0.tgz",
"integrity": "sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/errors": "2.3.0",
"@solana/rpc-spec": "2.3.0",
@@ -4561,6 +4616,7 @@
"resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.3.0.tgz",
"integrity": "sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/addresses": "2.3.0",
"@solana/codecs-core": "2.3.0",
@@ -4581,6 +4637,7 @@
"resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.3.0.tgz",
"integrity": "sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@solana/addresses": "2.3.0",
"@solana/codecs-core": "2.3.0",
@@ -4603,171 +4660,771 @@
"resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.3.0.tgz",
"integrity": "sha512-DkgohEDbMkdTWiKAoatY02Njr56WXx9e/dKKfmne8/Ad6/2llUIrax78nCdlvZW9quXMaXPTxZvdQqo9N669Og==",
"license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@solana/errors": "2.3.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.3.3"
+ }
+ },
+ "node_modules/@solana/sysvars": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.3.0.tgz",
+ "integrity": "sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@solana/accounts": "2.3.0",
+ "@solana/codecs": "2.3.0",
+ "@solana/errors": "2.3.0",
+ "@solana/rpc-types": "2.3.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.3.3"
+ }
+ },
+ "node_modules/@solana/transaction-confirmation": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.3.0.tgz",
+ "integrity": "sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@solana/addresses": "2.3.0",
+ "@solana/codecs-strings": "2.3.0",
+ "@solana/errors": "2.3.0",
+ "@solana/keys": "2.3.0",
+ "@solana/promises": "2.3.0",
+ "@solana/rpc": "2.3.0",
+ "@solana/rpc-subscriptions": "2.3.0",
+ "@solana/rpc-types": "2.3.0",
+ "@solana/transaction-messages": "2.3.0",
+ "@solana/transactions": "2.3.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.3.3"
+ }
+ },
+ "node_modules/@solana/transaction-messages": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.3.0.tgz",
+ "integrity": "sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@solana/addresses": "2.3.0",
+ "@solana/codecs-core": "2.3.0",
+ "@solana/codecs-data-structures": "2.3.0",
+ "@solana/codecs-numbers": "2.3.0",
+ "@solana/errors": "2.3.0",
+ "@solana/functional": "2.3.0",
+ "@solana/instructions": "2.3.0",
+ "@solana/nominal-types": "2.3.0",
+ "@solana/rpc-types": "2.3.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.3.3"
+ }
+ },
+ "node_modules/@solana/transactions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.3.0.tgz",
+ "integrity": "sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@solana/addresses": "2.3.0",
+ "@solana/codecs-core": "2.3.0",
+ "@solana/codecs-data-structures": "2.3.0",
+ "@solana/codecs-numbers": "2.3.0",
+ "@solana/codecs-strings": "2.3.0",
+ "@solana/errors": "2.3.0",
+ "@solana/functional": "2.3.0",
+ "@solana/instructions": "2.3.0",
+ "@solana/keys": "2.3.0",
+ "@solana/nominal-types": "2.3.0",
+ "@solana/rpc-types": "2.3.0",
+ "@solana/transaction-messages": "2.3.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.3.3"
+ }
+ },
+ "node_modules/@solana/web3.js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-2.0.0.tgz",
+ "integrity": "sha512-x+ZRB2/r5tVK/xw8QRbAfgPcX51G9f2ifEyAQ/J5npOO+6+MPeeCjtr5UxHNDAYs9Ypo0PN+YJATCO4vhzQJGg==",
+ "deprecated": "@solana/web3.js version 2.0 is now @solana/kit! Remove @solana/web3.js@2 from your dependencies and replace it with @solana/kit. As needed, upgrade all of your @solana-program/* dependencies to the latest versions that use Kit.",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/accounts": "2.0.0",
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/instructions": "2.0.0",
+ "@solana/keys": "2.0.0",
+ "@solana/programs": "2.0.0",
+ "@solana/rpc": "2.0.0",
+ "@solana/rpc-parsed-types": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0",
+ "@solana/rpc-subscriptions": "2.0.0",
+ "@solana/rpc-types": "2.0.0",
+ "@solana/signers": "2.0.0",
+ "@solana/sysvars": "2.0.0",
+ "@solana/transaction-confirmation": "2.0.0",
+ "@solana/transaction-messages": "2.0.0",
+ "@solana/transactions": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/accounts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.0.0.tgz",
+ "integrity": "sha512-1CE4P3QSDH5x+ZtSthMY2mn/ekROBnlT3/4f3CHDJicDvLQsgAq2yCvGHsYkK3ZA0mxhFLuhJVjuKASPnmG1rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/rpc-spec": "2.0.0",
+ "@solana/rpc-types": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/addresses": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.0.0.tgz",
+ "integrity": "sha512-8n3c/mUlH1/z+pM8e7OJ6uDSXw26Be0dgYiokiqblO66DGQ0d+7pqFUFZ5pEGjJ9PU2lDTSfY8rHf4cemOqwzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/assertions": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/assertions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.0.0.tgz",
+ "integrity": "sha512-NyPPqZRNGXs/GAjfgsw7YS6vCTXWt4ibXveS+ciy5sdmp/0v3pA6DlzYjleF9Sljrew0IiON15rjaXamhDxYfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/codecs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0.tgz",
+ "integrity": "sha512-xneIG5ppE6WIGaZCK7JTys0uLhzlnEJUdBO8nRVIyerwH6aqCfb0fGe7q5WNNYAVDRSxC0Pc1TDe1hpdx3KWmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-data-structures": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/options": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/codecs-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0.tgz",
+ "integrity": "sha512-qCG+3hDU5Pm8V6joJjR4j4Zv9md1z0RaecniNDIkEglnxmOUODnmPLWbtOjnDylfItyuZeDihK8hkewdj8cUtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/codecs-data-structures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0.tgz",
+ "integrity": "sha512-N98Y4jsrC/XeOgqrfsGqcOFIaOoMsKdAxOmy5oqVaEN67YoGSLNC9ROnqamOAOrsZdicTWx9/YLKFmQi9DPh1A==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/codecs-numbers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0.tgz",
+ "integrity": "sha512-r66i7VzJO1MZkQWZIAI6jjJOFVpnq0+FIabo2Z2ZDtrArFus/SbSEv543yCLeD2tdR/G/p+1+P5On10qF50Y1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/codecs-core": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/codecs-strings": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0.tgz",
+ "integrity": "sha512-dNqeCypsvaHcjW86H0gYgAZGGkKVBeKVeh7WXlOZ9kno7PeQ2wNkpccyzDfuzaIsKv+HZUD3v/eo86GCvnKazQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "fastestsmallesttextencoderdecoder": "^1.0.22",
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0.tgz",
+ "integrity": "sha512-IHlaPFSy4lvYco1oHJ3X8DbchWwAwJaL/4wZKnF1ugwZ0g0re8wbABrqNOe/jyZ84VU9Z14PYM8W9oDAebdJbw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "commander": "^12.1.0"
+ },
+ "bin": {
+ "errors": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/fast-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.0.0.tgz",
+ "integrity": "sha512-EsIx9z+eoxOmC+FpzhEb+H67CCYTbs/omAqXD4EdEYnCHWrI1li1oYBV+NoKzfx8fKlX+nzNB7S/9kc4u7Etpw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/functional": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.0.0.tgz",
+ "integrity": "sha512-Sj+sLiUTimnMEyGnSLGt0lbih2xPDUhxhonnrIkPwA+hjQ3ULGHAxeevHU06nqiVEgENQYUJ5rCtHs4xhUFAkQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/instructions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.0.0.tgz",
+ "integrity": "sha512-MiTEiNF7Pzp+Y+x4yadl2VUcNHboaW5WP52psBuhHns3GpbbruRv5efMpM9OEQNe1OsN+Eg39vjEidX55+P+DQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.0.0.tgz",
+ "integrity": "sha512-SSLSX8BXRvfLKBqsmBghmlhMKpwHeWd5CHi5zXgTS1BRrtiU6lcrTVC9ie6B+WaNNq7oe3e6K5bdbhu3fFZ+0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/assertions": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/options": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0.tgz",
+ "integrity": "sha512-OVc4KnYosB8oAukQ/htgrxXSxlUP6gUu5Aau6d/BgEkPQzWd/Pr+w91VWw3i3zZuu2SGpedbyh05RoJBe/hSXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-data-structures": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/programs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.0.0.tgz",
+ "integrity": "sha512-JPIKB61pWfODnsvEAaPALc6vR5rn7kmHLpFaviWhBtfUlEVgB8yVTR0MURe4+z+fJCPRV5wWss+svA4EeGDYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/addresses": "2.0.0",
+ "@solana/errors": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/promises": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.0.0.tgz",
+ "integrity": "sha512-4teQ52HDjK16ORrZe1zl+Q9WcZdQ+YEl0M1gk59XG7D0P9WqaVEQzeXGnKSCs+Y9bnB1u5xCJccwpUhHYWq6gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.0.0.tgz",
+ "integrity": "sha512-TumQ9DFRpib/RyaIqLVfr7UjqSo7ldfzpae0tgjM93YjbItB4Z0VcUXc3uAFvkeYw2/HIMb46Zg43mkUwozjDg==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/fast-stable-stringify": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/rpc-api": "2.0.0",
+ "@solana/rpc-spec": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0",
+ "@solana/rpc-transformers": "2.0.0",
+ "@solana/rpc-transport-http": "2.0.0",
+ "@solana/rpc-types": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-api": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.0.0.tgz",
+ "integrity": "sha512-1FwitYxwADMF/6zKP2kNXg8ESxB6GhNBNW1c4f5dEmuXuBbeD/enLV3WMrpg8zJkIaaYarEFNbt7R7HyFzmURQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/keys": "2.0.0",
+ "@solana/rpc-parsed-types": "2.0.0",
+ "@solana/rpc-spec": "2.0.0",
+ "@solana/rpc-transformers": "2.0.0",
+ "@solana/rpc-types": "2.0.0",
+ "@solana/transaction-messages": "2.0.0",
+ "@solana/transactions": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-parsed-types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.0.0.tgz",
+ "integrity": "sha512-VCeY/oKVEtBnp8EDOc5LSSiOeIOLFIgLndcxqU0ij/cZaQ01DOoHbhluvhZtU80Z3dUeicec8TiMgkFzed+WhQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-spec": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.0.0.tgz",
+ "integrity": "sha512-1uIDzj7vocCUqfOifjv1zAuxQ53ugiup/42edVFoQLOnJresoEZLL6WjnsJq4oCTccEAvGhUBI1WWKeZTGNxFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-spec-types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.0.0.tgz",
+ "integrity": "sha512-G2lmhFhgtxMQd/D6B04BHGE7bm5dMZdIPQNOqVGhzNAVjrmyapD3JN2hKAbmaYPe97wLfZERw0Ux1u4Y6q7TqA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-subscriptions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.0.0.tgz",
+ "integrity": "sha512-AdwMJHMrhlj7q1MPjZmVcKq3iLqMW3N0MT8kzIAP2vP+8o/d6Fn4aqGxoz2Hlfn3OYIZoYStN2VBtwzbcfEgMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/fast-stable-stringify": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/promises": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0",
+ "@solana/rpc-subscriptions-api": "2.0.0",
+ "@solana/rpc-subscriptions-channel-websocket": "2.0.0",
+ "@solana/rpc-subscriptions-spec": "2.0.0",
+ "@solana/rpc-transformers": "2.0.0",
+ "@solana/rpc-types": "2.0.0",
+ "@solana/subscribable": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-subscriptions-api": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.0.0.tgz",
+ "integrity": "sha512-NAJQvSFXYIIf8zxsMFBCkSbZNZgT32pzPZ1V6ZAd+U2iDEjx3L+yFwoJgfOcHp8kAV+alsF2lIsGBlG4u+ehvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/addresses": "2.0.0",
+ "@solana/keys": "2.0.0",
+ "@solana/rpc-subscriptions-spec": "2.0.0",
+ "@solana/rpc-transformers": "2.0.0",
+ "@solana/rpc-types": "2.0.0",
+ "@solana/transaction-messages": "2.0.0",
+ "@solana/transactions": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-subscriptions-channel-websocket": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.0.0.tgz",
+ "integrity": "sha512-hSQDZBmcp2t+gLZsSBqs/SqVw4RuNSC7njiP46azyzW7oGg8X2YPV36AHGsHD12KPsc0UpT1OAZ4+AN9meVKww==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/rpc-subscriptions-spec": "2.0.0",
+ "@solana/subscribable": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5",
+ "ws": "^8.18.0"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-subscriptions-spec": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.0.0.tgz",
+ "integrity": "sha512-VXMiI3fYtU1PkVVTXL87pcY48ZY8aCi1N6FqtxSP2xg/GASL01j1qbwyIL1OvoCqGyRgIxdd/YfaByW9wmWBhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/promises": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0",
+ "@solana/subscribable": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-transformers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.0.0.tgz",
+ "integrity": "sha512-H6tN0qcqzUangowsLLQtYXKJsf1Roe3/qJ1Cy0gv9ojY9uEvNbJqpeEj+7blv0MUZfEe+rECAwBhxxRKPMhYGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0",
+ "@solana/rpc-types": "2.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-transport-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.0.0.tgz",
+ "integrity": "sha512-UJLhKhhxDd1OPi8hb2AenHsDm1mofCBbhWn4bDCnH2Q3ulwYadUhcNqNbxjJPQ774VNhAf53SSI5A6PQo8IZSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@solana/errors": "2.0.0",
+ "@solana/rpc-spec": "2.0.0",
+ "@solana/rpc-spec-types": "2.0.0",
+ "undici-types": "^6.20.0"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/@solana/web3.js/node_modules/@solana/rpc-types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.0.0.tgz",
+ "integrity": "sha512-o1ApB9PYR0A3XjVSOh//SOVWgjDcqMlR3UNmtqciuREIBmWqnvPirdOa5EJxD3iPhfA4gnNnhGzT+tMDeDW/Kw==",
+ "license": "MIT",
"dependencies": {
- "@solana/errors": "2.3.0"
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0"
},
"engines": {
"node": ">=20.18.0"
},
"peerDependencies": {
- "typescript": ">=5.3.3"
+ "typescript": ">=5"
}
},
- "node_modules/@solana/sysvars": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.3.0.tgz",
- "integrity": "sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==",
+ "node_modules/@solana/web3.js/node_modules/@solana/signers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.0.0.tgz",
+ "integrity": "sha512-JEYJS3x/iKkqPV/3b1nLpX9lHib21wQKV3fOuu1aDLQqmX9OYKrnIIITYdnFDhmvGhpEpkkbPnqu7yVaFIBYsQ==",
"license": "MIT",
"dependencies": {
- "@solana/accounts": "2.3.0",
- "@solana/codecs": "2.3.0",
- "@solana/errors": "2.3.0",
- "@solana/rpc-types": "2.3.0"
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/instructions": "2.0.0",
+ "@solana/keys": "2.0.0",
+ "@solana/transaction-messages": "2.0.0",
+ "@solana/transactions": "2.0.0"
},
"engines": {
"node": ">=20.18.0"
},
"peerDependencies": {
- "typescript": ">=5.3.3"
+ "typescript": ">=5"
}
},
- "node_modules/@solana/transaction-confirmation": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.3.0.tgz",
- "integrity": "sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==",
+ "node_modules/@solana/web3.js/node_modules/@solana/subscribable": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.0.0.tgz",
+ "integrity": "sha512-Ex7d2GnTSNVMZDU3z6nKN4agRDDgCgBDiLnmn1hmt0iFo3alr3gRAqiqa7qGouAtYh9/29pyc8tVJCijHWJPQQ==",
"license": "MIT",
"dependencies": {
- "@solana/addresses": "2.3.0",
- "@solana/codecs-strings": "2.3.0",
- "@solana/errors": "2.3.0",
- "@solana/keys": "2.3.0",
- "@solana/promises": "2.3.0",
- "@solana/rpc": "2.3.0",
- "@solana/rpc-subscriptions": "2.3.0",
- "@solana/rpc-types": "2.3.0",
- "@solana/transaction-messages": "2.3.0",
- "@solana/transactions": "2.3.0"
+ "@solana/errors": "2.0.0"
},
"engines": {
"node": ">=20.18.0"
},
"peerDependencies": {
- "typescript": ">=5.3.3"
+ "typescript": ">=5"
}
},
- "node_modules/@solana/transaction-messages": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.3.0.tgz",
- "integrity": "sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==",
+ "node_modules/@solana/web3.js/node_modules/@solana/sysvars": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.0.0.tgz",
+ "integrity": "sha512-8D4ajKcCYQsTG1p4k30lre2vjxLR6S5MftUGJnIaQObDCzGmaeA9GRti4Kk4gSPWVYFTBoj1ASx8EcEXaB3eIQ==",
"license": "MIT",
"dependencies": {
- "@solana/addresses": "2.3.0",
- "@solana/codecs-core": "2.3.0",
- "@solana/codecs-data-structures": "2.3.0",
- "@solana/codecs-numbers": "2.3.0",
- "@solana/errors": "2.3.0",
- "@solana/functional": "2.3.0",
- "@solana/instructions": "2.3.0",
- "@solana/nominal-types": "2.3.0",
- "@solana/rpc-types": "2.3.0"
+ "@solana/accounts": "2.0.0",
+ "@solana/codecs": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/rpc-types": "2.0.0"
},
"engines": {
"node": ">=20.18.0"
},
"peerDependencies": {
- "typescript": ">=5.3.3"
+ "typescript": ">=5"
}
},
- "node_modules/@solana/transactions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.3.0.tgz",
- "integrity": "sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==",
+ "node_modules/@solana/web3.js/node_modules/@solana/transaction-confirmation": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.0.0.tgz",
+ "integrity": "sha512-JkTw5gXLiqQjf6xK0fpVcoJ/aMp2kagtFSD/BAOazdJ3UYzOzbzqvECt6uWa3ConcMswQ2vXalVtI7ZjmYuIeg==",
"license": "MIT",
"dependencies": {
- "@solana/addresses": "2.3.0",
- "@solana/codecs-core": "2.3.0",
- "@solana/codecs-data-structures": "2.3.0",
- "@solana/codecs-numbers": "2.3.0",
- "@solana/codecs-strings": "2.3.0",
- "@solana/errors": "2.3.0",
- "@solana/functional": "2.3.0",
- "@solana/instructions": "2.3.0",
- "@solana/keys": "2.3.0",
- "@solana/nominal-types": "2.3.0",
- "@solana/rpc-types": "2.3.0",
- "@solana/transaction-messages": "2.3.0"
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/keys": "2.0.0",
+ "@solana/promises": "2.0.0",
+ "@solana/rpc": "2.0.0",
+ "@solana/rpc-subscriptions": "2.0.0",
+ "@solana/rpc-types": "2.0.0",
+ "@solana/transaction-messages": "2.0.0",
+ "@solana/transactions": "2.0.0"
},
"engines": {
"node": ">=20.18.0"
},
"peerDependencies": {
- "typescript": ">=5.3.3"
+ "typescript": ">=5"
}
},
- "node_modules/@solana/wallet-adapter-base": {
- "version": "0.9.27",
- "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.27.tgz",
- "integrity": "sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==",
- "license": "Apache-2.0",
+ "node_modules/@solana/web3.js/node_modules/@solana/transaction-messages": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.0.0.tgz",
+ "integrity": "sha512-Uc6Fw1EJLBrmgS1lH2ZfLAAKFvprWPQQzOVwZS78Pv8Whsk7tweYTK6S0Upv0nHr50rGpnORJfmdBrXE6OfNGg==",
+ "license": "MIT",
"dependencies": {
- "@solana/wallet-standard-features": "^1.3.0",
- "@wallet-standard/base": "^1.1.0",
- "@wallet-standard/features": "^1.1.0",
- "eventemitter3": "^5.0.1"
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-data-structures": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/instructions": "2.0.0",
+ "@solana/rpc-types": "2.0.0"
},
"engines": {
- "node": ">=20"
+ "node": ">=20.18.0"
},
"peerDependencies": {
- "@solana/web3.js": "^1.98.0"
+ "typescript": ">=5"
}
},
- "node_modules/@solana/wallet-standard-features": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@solana/wallet-standard-features/-/wallet-standard-features-1.3.0.tgz",
- "integrity": "sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==",
- "license": "Apache-2.0",
+ "node_modules/@solana/web3.js/node_modules/@solana/transactions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.0.0.tgz",
+ "integrity": "sha512-VfdTE+59WKvuBG//6iE9RPjAB+ZT2kLgY2CDHabaz6RkH6OjOkMez9fWPVa3Xtcus+YQWN1SnQoryjF/xSx04w==",
+ "license": "MIT",
"dependencies": {
- "@wallet-standard/base": "^1.1.0",
- "@wallet-standard/features": "^1.1.0"
+ "@solana/addresses": "2.0.0",
+ "@solana/codecs-core": "2.0.0",
+ "@solana/codecs-data-structures": "2.0.0",
+ "@solana/codecs-numbers": "2.0.0",
+ "@solana/codecs-strings": "2.0.0",
+ "@solana/errors": "2.0.0",
+ "@solana/functional": "2.0.0",
+ "@solana/instructions": "2.0.0",
+ "@solana/keys": "2.0.0",
+ "@solana/rpc-types": "2.0.0",
+ "@solana/transaction-messages": "2.0.0"
},
"engines": {
- "node": ">=16"
+ "node": ">=20.18.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=5"
}
},
- "node_modules/@solana/web3.js": {
- "version": "1.98.4",
- "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz",
- "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==",
+ "node_modules/@solana/web3.js/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
"license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.25.0",
- "@noble/curves": "^1.4.2",
- "@noble/hashes": "^1.4.0",
- "@solana/buffer-layout": "^4.0.1",
- "@solana/codecs-numbers": "^2.1.0",
- "agentkeepalive": "^4.5.0",
- "bn.js": "^5.2.1",
- "borsh": "^0.7.0",
- "bs58": "^4.0.1",
- "buffer": "6.0.3",
- "fast-stable-stringify": "^1.0.0",
- "jayson": "^4.1.1",
- "node-fetch": "^2.7.0",
- "rpc-websockets": "^9.0.2",
- "superstruct": "^2.0.2"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@solana/web3.js/node_modules/borsh": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz",
- "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==",
- "license": "Apache-2.0",
- "dependencies": {
- "bn.js": "^5.2.0",
- "bs58": "^4.0.0",
- "text-encoding-utf-8": "^1.0.2"
- }
+ "node_modules/@solana/web3.js/node_modules/undici-types": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.23.0.tgz",
+ "integrity": "sha512-HN7GeXgBUs1StmY/vf9hIH11LrNI5SfqmFVtxKyp9Dhuf1P1cDSRlS+H1NJDaGOWzlI08q+NmiHgu11Vx6QnhA==",
+ "license": "MIT"
},
"node_modules/@stablelib/aead": {
"version": "1.0.1",
@@ -4940,50 +5597,21 @@
"license": "Apache-2.0"
},
"node_modules/@stellar/stellar-base": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.0.3.tgz",
- "integrity": "sha512-mBxNArxWq4wKNJATPJpXB2vIRQ3vUzIvjMCloSsGbfKRrSy96ie8yy7DWh9vSOHV6tNwe85hd3v+p/shlyosqA==",
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-12.1.1.tgz",
+ "integrity": "sha512-gOBSOFDepihslcInlqnxKZdIW9dMUO1tpOm3AtJR33K2OvpXG6SaVHCzAmCFArcCqI9zXTEiSoh70T48TmiHJA==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
- "@noble/curves": "^1.9.6",
"@stellar/js-xdr": "^3.1.2",
"base32.js": "^0.1.0",
- "bignumber.js": "^9.3.1",
+ "bignumber.js": "^9.1.2",
"buffer": "^6.0.3",
- "sha.js": "^2.4.12"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
- "node_modules/@stellar/stellar-base/node_modules/@noble/curves": {
- "version": "1.9.7",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
- "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@noble/hashes": "1.8.0"
- },
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@stellar/stellar-base/node_modules/@noble/hashes": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
- "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": "^14.21.3 || >=16"
+ "sha.js": "^2.3.6",
+ "tweetnacl": "^1.0.3"
},
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "optionalDependencies": {
+ "sodium-native": "^4.1.1"
}
},
"node_modules/@stellar/stellar-sdk": {
@@ -5034,6 +5662,32 @@
"tslib": "^2.8.0"
}
},
+ "node_modules/@tabler/icons": {
+ "version": "3.36.1",
+ "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.36.1.tgz",
+ "integrity": "sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
+ }
+ },
+ "node_modules/@tabler/icons-react": {
+ "version": "3.36.1",
+ "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.36.1.tgz",
+ "integrity": "sha512-/8nOXeNeMoze9xY/QyEKG65wuvRhkT3q9aytaur6Gj8bYU2A98YVJyLc9MRmc5nVvpy+bRlrrwK/Ykr8WGyUWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tabler/icons": ""
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
+ },
+ "peerDependencies": {
+ "react": ">= 16"
+ }
+ },
"node_modules/@tailwindcss/node": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz",
@@ -5290,6 +5944,39 @@
"tailwindcss": "4.1.17"
}
},
+ "node_modules/@tanstack/react-table": {
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz",
+ "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/table-core": "8.21.3"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/@tanstack/table-core": {
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz",
+ "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
"node_modules/@tiptap/core": {
"version": "3.12.1",
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.12.1.tgz",
@@ -5738,36 +6425,23 @@
}
},
"node_modules/@trezor/analytics": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.4.3.tgz",
- "integrity": "sha512-0o7gp7nfip8yjhAwP3R/Hcy5S8RfmZmYwpCcN0PbydWa5U5VMQ+T/iB/OpbpeV+8j13bf6i7++38nTCUNas0GA==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.5.0.tgz",
+ "integrity": "sha512-evILW5XJEmfPlf0TY1duOLtGJ47pdGeSKVE3P75ODEUsRNxtPVqlkOUBPmYpCxPnzS8XDmkatT8lf9/DF0G6nA==",
"license": "See LICENSE.md in repo root",
"peer": true,
"dependencies": {
- "@trezor/env-utils": "1.4.3",
- "@trezor/utils": "9.4.3"
- },
- "peerDependencies": {
- "tslib": "^2.6.2"
- }
- },
- "node_modules/@trezor/analytics/node_modules/@trezor/utils": {
- "version": "9.4.3",
- "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.3.tgz",
- "integrity": "sha512-QkLHpGTF3W3wNGj6OCdcMog7MhAAdlUmpjjmMjMqE0JSoi1Yjr0m7k7xN0iIHSqcgrhYteZDeJZAGlAf/b7gqw==",
- "license": "SEE LICENSE IN LICENSE.md",
- "peer": true,
- "dependencies": {
- "bignumber.js": "^9.3.1"
+ "@trezor/env-utils": "1.5.0",
+ "@trezor/utils": "9.5.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/blockchain-link": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.5.4.tgz",
- "integrity": "sha512-3Xki/2Vmr1/rKa5LF+Eb2/Qd5N9LqwyRL76+ycqe1KwqV7xK3XGMsqTH9FUUReRvGxrzAFonbOgADAJczhx81w==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.6.1.tgz",
+ "integrity": "sha512-SPwxkihOMI0o79BOy0RkfgVL2meuJhIe1yWHCeR8uoqf5KGblUyeXxvNCy6w8ckJ9LRpM1+bZhsUODuNs3083Q==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
@@ -5777,64 +6451,174 @@
"@solana-program/token-2022": "^0.4.2",
"@solana/kit": "^2.3.0",
"@solana/rpc-types": "^2.3.0",
- "@stellar/stellar-sdk": "^13.3.0",
- "@trezor/blockchain-link-types": "1.4.4",
- "@trezor/blockchain-link-utils": "1.4.4",
- "@trezor/env-utils": "1.4.3",
- "@trezor/utils": "9.4.4",
- "@trezor/utxo-lib": "2.4.4",
- "@trezor/websocket-client": "1.2.4",
+ "@stellar/stellar-sdk": "14.2.0",
+ "@trezor/blockchain-link-types": "1.5.0",
+ "@trezor/blockchain-link-utils": "1.5.1",
+ "@trezor/env-utils": "1.5.0",
+ "@trezor/utils": "9.5.0",
+ "@trezor/utxo-lib": "2.5.0",
+ "@trezor/websocket-client": "1.3.0",
"@types/web": "^0.0.197",
"crypto-browserify": "3.12.0",
"socks-proxy-agent": "8.0.5",
"stream-browserify": "^3.0.0",
- "xrpl": "^4.4.0"
+ "xrpl": "4.4.3"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/blockchain-link-types": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.4.4.tgz",
- "integrity": "sha512-B38LH4aniZ7gKbpSdMRiA4YriauoYPHgjhKEd+ybR0ca+liNlPAvMwSHJyMhL1eDIYEs16oOjTgT53WjRRZbMg==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.5.0.tgz",
+ "integrity": "sha512-wD6FKKxNr89MTWYL+NikRkBcWXhiWNFR0AuDHW6GHmlCEHhKu/hAvQtcER8X5jt/Wd0hSKNZqtHBXJ1ZkpJ6rg==",
"license": "See LICENSE.md in repo root",
"peer": true,
"dependencies": {
- "@trezor/utils": "9.4.4",
- "@trezor/utxo-lib": "2.4.4"
+ "@trezor/utils": "9.5.0",
+ "@trezor/utxo-lib": "2.5.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/blockchain-link-utils": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.4.4.tgz",
- "integrity": "sha512-8BZD6h5gs3ETPOG2Ri+GOyH44D38YQVeQj8n7oVOVQi21zx93JOpdL3fWS9RytkfmvB84WwVzYoHGlTs3T80Gw==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.5.1.tgz",
+ "integrity": "sha512-2tDGLEj5jzydjsJQONGTWVmCDDy6FTZ4ytr1/2gE6anyYEJU8MbaR+liTt3UvcP5jwZTNutwYLvZixRfrb8JpA==",
"license": "See LICENSE.md in repo root",
"peer": true,
"dependencies": {
- "@mobily/ts-belt": "^3.13.1",
- "@stellar/stellar-sdk": "^13.3.0",
- "@trezor/env-utils": "1.4.3",
- "@trezor/protobuf": "1.4.4",
- "@trezor/utils": "9.4.4",
- "xrpl": "^4.4.0"
+ "@mobily/ts-belt": "^3.13.1",
+ "@stellar/stellar-sdk": "14.2.0",
+ "@trezor/env-utils": "1.5.0",
+ "@trezor/protobuf": "1.5.1",
+ "@trezor/utils": "9.5.0",
+ "xrpl": "4.4.3"
+ },
+ "peerDependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@trezor/blockchain-link-utils/node_modules/@noble/curves": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
+ "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@noble/hashes": "1.8.0"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@trezor/blockchain-link-utils/node_modules/@stellar/stellar-base": {
+ "version": "14.0.4",
+ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.0.4.tgz",
+ "integrity": "sha512-UbNW6zbdOBXJwLAV2mMak0bIC9nw3IZVlQXkv2w2dk1jgCbJjy3oRVC943zeGE5JAm0Z9PHxrIjmkpGhayY7kw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@noble/curves": "^1.9.6",
+ "@stellar/js-xdr": "^3.1.2",
+ "base32.js": "^0.1.0",
+ "bignumber.js": "^9.3.1",
+ "buffer": "^6.0.3",
+ "sha.js": "^2.4.12"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@trezor/blockchain-link-utils/node_modules/@stellar/stellar-sdk": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz",
+ "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@stellar/stellar-base": "^14.0.1",
+ "axios": "^1.12.2",
+ "bignumber.js": "^9.3.1",
+ "eventsource": "^2.0.2",
+ "feaxios": "^0.0.23",
+ "randombytes": "^2.1.0",
+ "toml": "^3.0.0",
+ "urijs": "^1.19.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@trezor/blockchain-link/node_modules/@noble/curves": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
+ "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@noble/hashes": "1.8.0"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@trezor/blockchain-link/node_modules/@stellar/stellar-base": {
+ "version": "14.0.4",
+ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.0.4.tgz",
+ "integrity": "sha512-UbNW6zbdOBXJwLAV2mMak0bIC9nw3IZVlQXkv2w2dk1jgCbJjy3oRVC943zeGE5JAm0Z9PHxrIjmkpGhayY7kw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@noble/curves": "^1.9.6",
+ "@stellar/js-xdr": "^3.1.2",
+ "base32.js": "^0.1.0",
+ "bignumber.js": "^9.3.1",
+ "buffer": "^6.0.3",
+ "sha.js": "^2.4.12"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@trezor/blockchain-link/node_modules/@stellar/stellar-sdk": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz",
+ "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@stellar/stellar-base": "^14.0.1",
+ "axios": "^1.12.2",
+ "bignumber.js": "^9.3.1",
+ "eventsource": "^2.0.2",
+ "feaxios": "^0.0.23",
+ "randombytes": "^2.1.0",
+ "toml": "^3.0.0",
+ "urijs": "^1.19.1"
},
- "peerDependencies": {
- "tslib": "^2.6.2"
+ "engines": {
+ "node": ">=20.0.0"
}
},
"node_modules/@trezor/connect": {
- "version": "9.6.4",
- "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.6.4.tgz",
- "integrity": "sha512-/N3hhOFIIhufvihCx92wvxd15Wy9XAJOSbTiV8rYG2N9uBvzejctNO2+LpwCRl/cBKle9rsp4S7C/zz++iDuOg==",
+ "version": "9.7.1",
+ "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.7.1.tgz",
+ "integrity": "sha512-W2ym0bs4FVmXByEr9gANBp+bRErzNcmqqqYzSJLOVkawxikqYXag2aCpdiXU3LlZbFbhFhIsT/fpDLfwiLRySA==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
- "@ethereumjs/common": "^10.0.0",
- "@ethereumjs/tx": "^10.0.0",
+ "@ethereumjs/common": "^10.1.0",
+ "@ethereumjs/tx": "^10.1.0",
"@fivebinaries/coin-selection": "3.0.0",
"@mobily/ts-belt": "^3.13.1",
"@noble/hashes": "^1.6.1",
@@ -5844,21 +6628,22 @@
"@solana-program/token": "^0.5.1",
"@solana-program/token-2022": "^0.4.2",
"@solana/kit": "^2.3.0",
- "@trezor/blockchain-link": "2.5.4",
- "@trezor/blockchain-link-types": "1.4.4",
- "@trezor/blockchain-link-utils": "1.4.4",
- "@trezor/connect-analytics": "1.3.6",
- "@trezor/connect-common": "0.4.4",
- "@trezor/crypto-utils": "1.1.5",
- "@trezor/device-utils": "1.1.4",
- "@trezor/env-utils": "^1.4.3",
- "@trezor/protobuf": "1.4.4",
- "@trezor/protocol": "1.2.10",
- "@trezor/schema-utils": "1.3.4",
- "@trezor/transport": "1.5.4",
- "@trezor/type-utils": "1.1.9",
- "@trezor/utils": "9.4.4",
- "@trezor/utxo-lib": "2.4.4",
+ "@trezor/blockchain-link": "2.6.1",
+ "@trezor/blockchain-link-types": "1.5.0",
+ "@trezor/blockchain-link-utils": "1.5.1",
+ "@trezor/connect-analytics": "1.4.0",
+ "@trezor/connect-common": "0.5.0",
+ "@trezor/crypto-utils": "1.2.0",
+ "@trezor/device-authenticity": "1.1.1",
+ "@trezor/device-utils": "1.2.0",
+ "@trezor/env-utils": "^1.5.0",
+ "@trezor/protobuf": "1.5.1",
+ "@trezor/protocol": "1.3.0",
+ "@trezor/schema-utils": "1.4.0",
+ "@trezor/transport": "1.6.1",
+ "@trezor/type-utils": "1.2.0",
+ "@trezor/utils": "9.5.0",
+ "@trezor/utxo-lib": "2.5.0",
"blakejs": "^1.2.1",
"bs58": "^6.0.0",
"bs58check": "^4.0.0",
@@ -5871,231 +6656,265 @@
}
},
"node_modules/@trezor/connect-analytics": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.3.6.tgz",
- "integrity": "sha512-Skya46inItcjaahaqpeSsQmB2Xle70f/l+6eTTJYxKQdpMtuW5LRsRRiyMAQTp5RBycL2ngnsVtY+/83Bt5lUw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.4.0.tgz",
+ "integrity": "sha512-hy2J2oeIhRC/e1bOWXo5dsVMVnDwO2UKnxhR6FD8PINR3jgM6PWAXc6k33WJsBcyiTzwMP7/xPysLcgNJH5o4w==",
"license": "See LICENSE.md in repo root",
"peer": true,
"dependencies": {
- "@trezor/analytics": "1.4.3"
+ "@trezor/analytics": "1.5.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-common": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.4.4.tgz",
- "integrity": "sha512-xG2CoPjgcldtO6HU0ZjNCvFdQ4hpl56qzU1VEF1/A1BL2zj2TwLGLmyr4E878go1mmfksNGY5a1tqnzAZ7pRLw==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.5.0.tgz",
+ "integrity": "sha512-WE71iaFcWmfQxDCiTUNynj2DccRgUiLBJ+g3nrqCBJqEYzu+cD6eZ5k/OLtZ3hfh5gyB5EQwXdGvRT07iNdxAA==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
- "@trezor/env-utils": "1.4.3",
- "@trezor/type-utils": "1.1.9",
- "@trezor/utils": "9.4.4"
+ "@trezor/env-utils": "1.5.0",
+ "@trezor/type-utils": "1.2.0",
+ "@trezor/utils": "9.5.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
- "node_modules/@trezor/connect-plugin-stellar": {
- "version": "9.2.1",
- "resolved": "https://registry.npmjs.org/@trezor/connect-plugin-stellar/-/connect-plugin-stellar-9.2.1.tgz",
- "integrity": "sha512-Orz5gFZzYFZs1+cTsgg8fz/VWFjhl7pqMCqD5DVNZpXW+wrjwBaRbcGJZ+ibkPKU3AlM7Uv3SVD/pjaQmAkZ2Q==",
+ "node_modules/@trezor/connect-web": {
+ "version": "9.4.7",
+ "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.4.7.tgz",
+ "integrity": "sha512-mICiGnw1xt60LbELZd2OId+nXGG/NAiywQIXGp5rOY6116I/sqJMw4fuKQrkGJ5zpKzzX/G7Be9GcshICD1ZDg==",
+ "deprecated": "This version is no longer supported",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "@trezor/utils": "9.4.1"
+ "@trezor/connect": "9.4.7",
+ "@trezor/connect-common": "0.2.7",
+ "@trezor/utils": "9.2.6"
},
"peerDependencies": {
- "@stellar/stellar-sdk": "^13.3.0",
- "@trezor/connect": "9.x.x",
"tslib": "^2.6.2"
}
},
- "node_modules/@trezor/connect-plugin-stellar/node_modules/@trezor/utils": {
- "version": "9.4.1",
- "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.1.tgz",
- "integrity": "sha512-9MYNa99tzXiTBnKadABoY2D80YL9Mh3ntM5wziwVhjZ4HyhqFH6BsCxwFpWYLUIKBctD55QEdE4bASoqp7Ad1A==",
- "license": "SEE LICENSE IN LICENSE.md",
+ "node_modules/@trezor/connect-web/node_modules/@emurgo/cardano-serialization-lib-browser": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.5.0.tgz",
+ "integrity": "sha512-qchOJ9NYDUz10tzs5r5QhP9hK0p+ZOlRiBwPdTAxqAYLw/8emYBkQQLaS8T1DF6EkeudyrgS00ym5Trw1fo4iA==",
+ "license": "MIT"
+ },
+ "node_modules/@trezor/connect-web/node_modules/@emurgo/cardano-serialization-lib-nodejs": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz",
+ "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==",
+ "license": "MIT"
+ },
+ "node_modules/@trezor/connect-web/node_modules/@ethereumjs/common": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-4.4.0.tgz",
+ "integrity": "sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w==",
+ "license": "MIT",
+ "dependencies": {
+ "@ethereumjs/util": "^9.1.0"
+ }
+ },
+ "node_modules/@trezor/connect-web/node_modules/@ethereumjs/rlp": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz",
+ "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==",
+ "license": "MPL-2.0",
+ "bin": {
+ "rlp": "bin/rlp.cjs"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@trezor/connect-web/node_modules/@ethereumjs/tx": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-5.4.0.tgz",
+ "integrity": "sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA==",
+ "license": "MPL-2.0",
"dependencies": {
- "bignumber.js": "^9.3.0"
+ "@ethereumjs/common": "^4.4.0",
+ "@ethereumjs/rlp": "^5.0.2",
+ "@ethereumjs/util": "^9.1.0",
+ "ethereum-cryptography": "^2.2.1"
},
- "peerDependencies": {
- "tslib": "^2.6.2"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@trezor/connect-web": {
- "version": "9.6.2",
- "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.6.2.tgz",
- "integrity": "sha512-QGuCjX8Bx9aCq1Pg52KifbbzYn00FQu9mCTDSgCVGH/HAzbxhcRkDKc86kFwW8z9NdJxw+XeVJq5Ky/js3iEDA==",
- "license": "SEE LICENSE IN LICENSE.md",
+ "node_modules/@trezor/connect-web/node_modules/@ethereumjs/util": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz",
+ "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==",
+ "license": "MPL-2.0",
"dependencies": {
- "@trezor/connect": "9.6.2",
- "@trezor/connect-common": "0.4.2",
- "@trezor/utils": "9.4.2",
- "@trezor/websocket-client": "1.2.2"
+ "@ethereumjs/rlp": "^5.0.2",
+ "ethereum-cryptography": "^2.2.1"
},
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@trezor/connect-web/node_modules/@fivebinaries/coin-selection": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-2.2.1.tgz",
+ "integrity": "sha512-iYFsYr7RY7TEvTqP9NKR4p/yf3Iybf9abUDR7lRjzanGsrLwVsREvIuyE05iRYFrvqarlk+gWRPsdR1N2hUBrg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@emurgo/cardano-serialization-lib-browser": "^11.5.0",
+ "@emurgo/cardano-serialization-lib-nodejs": "11.5.0"
+ }
+ },
+ "node_modules/@trezor/connect-web/node_modules/@solana-program/token": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.4.1.tgz",
+ "integrity": "sha512-eSYmjsapzE9jXT2J9xydlMj/zsangMEIZAy9dy75VCXM6kgDCSnH5R7+HsIoKOTvb2VggU7GojC+YhMwWGCIBw==",
+ "license": "Apache-2.0",
"peerDependencies": {
- "tslib": "^2.6.2"
+ "@solana/web3.js": "^2.0.0"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/analytics": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.4.2.tgz",
- "integrity": "sha512-FgjJekuDvx1TjiDemvpnPiRck7Kp/v1ZeppsBYpQR3yGKyKzbG1pVpcl0RyI2237raXxbORaz7XV8tcyjq4BXg==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.2.5.tgz",
+ "integrity": "sha512-+6DnjUj1XHD9wHffilPYXIPGmIwPNlYJLlS98FhAv5tOVr9rWvomqtXx2GWwtiv2B3oR/h6oMiYGmS/yjpM2cA==",
"license": "See LICENSE.md in repo root",
"dependencies": {
- "@trezor/env-utils": "1.4.2",
- "@trezor/utils": "9.4.2"
+ "@trezor/env-utils": "1.2.1",
+ "@trezor/utils": "9.2.5"
+ },
+ "peerDependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@trezor/connect-web/node_modules/@trezor/analytics/node_modules/@trezor/utils": {
+ "version": "9.2.5",
+ "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.2.5.tgz",
+ "integrity": "sha512-FaGKQxwvivcWOa8vK4qQPdyvUm/AcjH0xOKfcvjNfaBhf+TVDzKn2ORKnioQb2Sgjncb8B2ubqrUI3MIc+RKKw==",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "bignumber.js": "^9.1.2"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.5.2.tgz",
- "integrity": "sha512-/egUnIt/fR57QY33ejnkPMhZwRvVRS/pUCoqdVIGitN1Q7QZsdopoR4hw37hdK/Ux/q1ZLH6LZz7U2UFahjppw==",
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.3.6.tgz",
+ "integrity": "sha512-cuqGJr5d5iTwGNbTAKDskE+m7yL/4RQsagNwA64793tli1fDWeeGT/B2mCvFwpUmIo9dVFDkYb++ZiltUIGZ3w==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "@solana-program/stake": "^0.2.1",
- "@solana-program/token": "^0.5.1",
- "@solana-program/token-2022": "^0.4.2",
- "@solana/kit": "^2.1.1",
- "@solana/rpc-types": "^2.1.1",
- "@stellar/stellar-sdk": "^13.3.0",
- "@trezor/blockchain-link-types": "1.4.2",
- "@trezor/blockchain-link-utils": "1.4.2",
- "@trezor/env-utils": "1.4.2",
- "@trezor/utils": "9.4.2",
- "@trezor/utxo-lib": "2.4.2",
- "@trezor/websocket-client": "1.2.2",
- "@types/web": "^0.0.197",
+ "@solana-program/token": "^0.4.1",
+ "@solana/web3.js": "^2.0.0",
+ "@trezor/blockchain-link-types": "1.2.5",
+ "@trezor/blockchain-link-utils": "1.2.6",
+ "@trezor/env-utils": "1.2.1",
+ "@trezor/utils": "9.2.6",
+ "@trezor/utxo-lib": "2.2.6",
+ "@types/web": "^0.0.174",
"events": "^3.3.0",
- "socks-proxy-agent": "8.0.5",
- "xrpl": "^4.3.0"
+ "ripple-lib": "^1.10.1",
+ "socks-proxy-agent": "8.0.4",
+ "ws": "^8.18.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link-types": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.4.2.tgz",
- "integrity": "sha512-KThBmGOFLJAFnmou9ThQhnjEVxfYPfEwMOaVTVNgJ+NAkt5rEMx0SKBBelCGZ63XtOLWdVPglFo83wtm+I9Vpg==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.2.5.tgz",
+ "integrity": "sha512-aGxLNGxhQqre4cCYDboy1s1gHAi92tTszLYl3GMhGmtB6EuAl049eO8ngCcMcuOZLTvFYA/1e/3mZoPIMBkeng==",
"license": "See LICENSE.md in repo root",
"dependencies": {
- "@trezor/utxo-lib": "2.4.2"
+ "@solana/web3.js": "^2.0.0",
+ "@trezor/type-utils": "1.1.4",
+ "@trezor/utxo-lib": "2.2.6"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.4.2.tgz",
- "integrity": "sha512-PBEBrdtHn0dn/c9roW6vjdHI/CucMywJm5gthETZAZmzBOtg6ZDpLTn+qL8+jZGIbwcAkItrQ3iHrHhR6xTP5g==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.2.6.tgz",
+ "integrity": "sha512-6ExuAyKxGH79aZhT3eA6xng9ljYixiE9EBC635BLPc+lafpin2+Aplb0q2zA6f/S5ksl9ges63W627pb7IFgGw==",
"license": "See LICENSE.md in repo root",
"dependencies": {
"@mobily/ts-belt": "^3.13.1",
- "@stellar/stellar-sdk": "^13.3.0",
- "@trezor/env-utils": "1.4.2",
- "@trezor/utils": "9.4.2",
- "xrpl": "^4.3.0"
+ "@trezor/env-utils": "1.2.1",
+ "@trezor/utils": "9.2.6"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/connect": {
- "version": "9.6.2",
- "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.6.2.tgz",
- "integrity": "sha512-XsSERBK+KnF6FPsATuhB9AEM0frekVLwAwFo35MRV9I4P+mdv6tnUiZUq8O8aoPbfJwDjtNJSYv+PMsKuRH6rg==",
+ "version": "9.4.7",
+ "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.4.7.tgz",
+ "integrity": "sha512-Ky8AMWxhq0ieOCNgZtaIKTQie5qaQjK3uuv+TriUZXuxDqSoJcD8T50TAEY1Lxo1xl8Yv3wT0m6LQkmBn3T+xQ==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "@ethereumjs/common": "^10.0.0",
- "@ethereumjs/tx": "^10.0.0",
- "@fivebinaries/coin-selection": "3.0.0",
- "@mobily/ts-belt": "^3.13.1",
- "@noble/hashes": "^1.6.1",
- "@scure/bip39": "^1.5.1",
- "@solana-program/compute-budget": "^0.8.0",
- "@solana-program/system": "^0.7.0",
- "@solana-program/token": "^0.5.1",
- "@solana-program/token-2022": "^0.4.2",
- "@solana/kit": "^2.1.1",
- "@trezor/blockchain-link": "2.5.2",
- "@trezor/blockchain-link-types": "1.4.2",
- "@trezor/blockchain-link-utils": "1.4.2",
- "@trezor/connect-analytics": "1.3.5",
- "@trezor/connect-common": "0.4.2",
- "@trezor/crypto-utils": "1.1.4",
- "@trezor/device-utils": "1.1.2",
- "@trezor/env-utils": "^1.4.2",
- "@trezor/protobuf": "1.4.2",
- "@trezor/protocol": "1.2.8",
- "@trezor/schema-utils": "1.3.4",
- "@trezor/transport": "1.5.2",
- "@trezor/type-utils": "1.1.8",
- "@trezor/utils": "9.4.2",
- "@trezor/utxo-lib": "2.4.2",
+ "@babel/preset-typescript": "^7.24.7",
+ "@ethereumjs/common": "^4.4.0",
+ "@ethereumjs/tx": "^5.4.0",
+ "@fivebinaries/coin-selection": "2.2.1",
+ "@trezor/blockchain-link": "2.3.6",
+ "@trezor/blockchain-link-types": "1.2.5",
+ "@trezor/connect-analytics": "1.2.4",
+ "@trezor/connect-common": "0.2.7",
+ "@trezor/protobuf": "1.2.6",
+ "@trezor/protocol": "1.2.2",
+ "@trezor/schema-utils": "1.2.3",
+ "@trezor/transport": "1.3.7",
+ "@trezor/utils": "9.2.6",
+ "@trezor/utxo-lib": "2.2.6",
"blakejs": "^1.2.1",
"bs58": "^6.0.0",
"bs58check": "^4.0.0",
- "cross-fetch": "^4.0.0",
- "jws": "^4.0.0"
+ "cross-fetch": "^4.0.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/connect-analytics": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.3.5.tgz",
- "integrity": "sha512-Aoi+EITpZZycnELQJEp9XV0mHFfaCQ6JE0Ka5mWuHtOny3nJdFLBrih4ipcEXJdJbww6pBxRJB09sJ19cTyacA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.2.4.tgz",
+ "integrity": "sha512-x7cbQ/x+THMG6pBttRip9qySDU6SRnTiN0AHUKDLBpUrOV+85fRScxUaX5RddtmG26J96HgNEw7Ydms7tBOlSQ==",
"license": "See LICENSE.md in repo root",
"dependencies": {
- "@trezor/analytics": "1.4.2"
+ "@trezor/analytics": "1.2.5"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/connect-common": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.4.2.tgz",
- "integrity": "sha512-ND5TTjrTPnJdfl8Wlhl9YtFWnY2u6FHM1dsPkNYCmyUKIMoflJ5cLn95Xabl6l1btHERYn3wTUvgEYQG7r8OVQ==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.2.7.tgz",
+ "integrity": "sha512-m9gYDY0Elitofs4k3E4uAmzgi2DtJHneb47jQVbjBZSLpzROiV7fz49aDxBnz/oPCJnIVF9Gu2OUQEh2GDeZcA==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "@trezor/env-utils": "1.4.2",
- "@trezor/utils": "9.4.2"
+ "@trezor/env-utils": "1.2.1",
+ "@trezor/utils": "9.2.6"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
- "node_modules/@trezor/connect-web/node_modules/@trezor/crypto-utils": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.1.4.tgz",
- "integrity": "sha512-Y6VziniqMPoMi70IyowEuXKqRvBYQzgPAekJaUZTHhR+grtYNRKRH2HJCvuZ8MGmSKUFSYfa7y8AvwALA8mQmA==",
- "license": "SEE LICENSE IN LICENSE.md",
- "peerDependencies": {
- "tslib": "^2.6.2"
- }
- },
- "node_modules/@trezor/connect-web/node_modules/@trezor/device-utils": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.1.2.tgz",
- "integrity": "sha512-R3AJvAo+a3wYVmcGZO2VNl9PZOmDEzCZIlmCJn0BlSRWWd8G9u1qyo/fL9zOwij/YhCaJyokmSHmIEmbY9qpgw==",
- "license": "See LICENSE.md in repo root"
- },
"node_modules/@trezor/connect-web/node_modules/@trezor/env-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz",
- "integrity": "sha512-lQvrqcNK5I4dy2MuiLyMuEm0KzY59RIu2GLtc9GsvqyxSPZkADqVzGeLJjXj/vI2ajL8leSpMvmN4zPw3EK8AA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.2.1.tgz",
+ "integrity": "sha512-ESBV+/AWpfJA6qnHk7BgBYFbhNtUKjPZZzQr1LOUiePwFITbVu421b5BHjTSPFVjpbrWo6Ob0IG7u8saJi0G5A==",
"license": "See LICENSE.md in repo root",
"dependencies": {
- "ua-parser-js": "^2.0.4"
+ "ua-parser-js": "^1.0.37"
},
"peerDependencies": {
"expo-constants": "*",
@@ -6116,13 +6935,12 @@
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/protobuf": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.4.2.tgz",
- "integrity": "sha512-AeIYKCgKcE9cWflggGL8T9gD+IZLSGrwkzqCk3wpIiODd5dUCgEgA4OPBufR6OMu3RWu/Tgu2xviHunijG3LXQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.2.6.tgz",
+ "integrity": "sha512-QN/1T0/NgZk3r5FVGtMVL41Q3UaUdjFsE4LSxWvzreLp9T5jsHp5bL0wT6TCkocNqmKK3ijH2Ro/Dh8VOSZDbQ==",
"license": "See LICENSE.md in repo root",
"dependencies": {
- "@trezor/schema-utils": "1.3.4",
- "long": "5.2.5",
+ "@trezor/schema-utils": "1.2.3",
"protobufjs": "7.4.0"
},
"peerDependencies": {
@@ -6130,69 +6948,83 @@
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/protocol": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.8.tgz",
- "integrity": "sha512-8EH+EU4Z1j9X4Ljczjbl9G7vVgcUz41qXcdE+6FOG3BFvMDK4KUVvaOtWqD+1dFpeo5yvWSTEKdhgXMPFprWYQ==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.2.tgz",
+ "integrity": "sha512-iXD+Wqpk0FpwJpQbAFKw+8AL6ipfDjQ7g+MYZ7lU1H7/gCxM2XqLI4eW7Il+FAwk7orepDuoSbJSVcsNJYKjOA==",
+ "license": "See LICENSE.md in repo root",
+ "peerDependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@trezor/connect-web/node_modules/@trezor/schema-utils": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.2.3.tgz",
+ "integrity": "sha512-+/GmaSTfUf8nEBSSWz/SV0W/0l37YQBfDMygAKXlKMbtXJI03PHqkEF/jQrt+BP2Gh24gjo5GNqCwx7EIlzZug==",
"license": "See LICENSE.md in repo root",
+ "dependencies": {
+ "@sinclair/typebox": "^0.33.7",
+ "ts-mixer": "^6.0.3"
+ },
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/transport": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.5.2.tgz",
- "integrity": "sha512-rYP87zdVll2bNBtsD3VxJq0yjaNvIClcgszZjQwVTQxpKGFPkx8bLSpAGI05R9qfxusZJCfYarjX3qki9nHYPw==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.3.7.tgz",
+ "integrity": "sha512-pxoPbgaDKUg5ElgyzW+vuQ1YLLX75W/bfAk0V6SdPGqpd3V+6NvJaNQVxAnmL6k3qzHheBFrqyhlkkkEdyuuSQ==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "@trezor/protobuf": "1.4.2",
- "@trezor/protocol": "1.2.8",
- "@trezor/type-utils": "1.1.8",
- "@trezor/utils": "9.4.2",
+ "@trezor/protobuf": "1.2.6",
+ "@trezor/protocol": "1.2.2",
+ "@trezor/utils": "9.2.6",
"cross-fetch": "^4.0.0",
- "usb": "^2.15.0"
+ "long": "^4.0.0",
+ "protobufjs": "7.4.0",
+ "usb": "^2.14.0"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/type-utils": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.8.tgz",
- "integrity": "sha512-VtvkPXpwtMtTX9caZWYlMMTmhjUeDq4/1LGn0pSdjd4OuL/vQyuPWXCT/0RtlnRraW6R2dZF7rX2UON2kQIMTQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.4.tgz",
+ "integrity": "sha512-pzrIdskmTZRocHellMZxCDPQ3IpmTr749qn1xdIN29pIKuI4ms0OfNUPk/rfR4Iug0kEiWt+n+Hw7+lIBzc2LA==",
"license": "See LICENSE.md in repo root"
},
"node_modules/@trezor/connect-web/node_modules/@trezor/utils": {
- "version": "9.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz",
- "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==",
+ "version": "9.2.6",
+ "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.2.6.tgz",
+ "integrity": "sha512-8kJYRcOm2uD9uAzktXFivY9Ctkub39MUQCo0TIFzL01erzSDt5i9f81meIgLANm8cgmg3PPVA6SWyitOKRkKpg==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "bignumber.js": "^9.3.0"
+ "bignumber.js": "^9.1.2"
},
"peerDependencies": {
"tslib": "^2.6.2"
}
},
"node_modules/@trezor/connect-web/node_modules/@trezor/utxo-lib": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.4.2.tgz",
- "integrity": "sha512-dTXfBg/cEKnmHM5CLG5+0qrp6fqOfwxqe8YPACdKeM7g1XJKCGDAuFpDUVeT3lrcUsTh6bEMHM06z4H3gZp5MQ==",
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.2.6.tgz",
+ "integrity": "sha512-OAwN1d4CXU/7LhczatdL/xKaYcyjxWiURYfG5hOfscTvhaDZ+veFhxo6YHJ2fGGlpZwS+B14JRsmDoXAelIeeA==",
"license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "@trezor/utils": "9.4.2",
+ "@trezor/utils": "9.2.6",
"bchaddrjs": "^0.5.2",
"bech32": "^2.0.0",
"bip66": "^2.0.0",
"bitcoin-ops": "^1.4.1",
"blake-hash": "^2.0.0",
"blakejs": "^1.2.1",
- "bn.js": "^5.2.2",
+ "bn.js": "^5.2.1",
"bs58": "^6.0.0",
"bs58check": "^4.0.0",
"create-hmac": "^1.1.7",
- "int64-buffer": "^1.1.0",
+ "int64-buffer": "^1.0.1",
"pushdata-bitcoin": "^1.0.1",
- "tiny-secp256k1": "^1.1.7",
+ "tiny-secp256k1": "^1.1.6",
"typeforce": "^1.18.0",
"varuint-bitcoin": "2.0.0",
"wif": "^5.0.0"
@@ -6201,72 +7033,93 @@
"tslib": "^2.6.2"
}
},
- "node_modules/@trezor/connect-web/node_modules/@trezor/websocket-client": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.2.2.tgz",
- "integrity": "sha512-vu9L1V/5yh8LHQCmsGC9scCnihELsVuR5Tri1IvW3CdgTUFFcfjsEgXsFqFME3HlxuUmx6qokw0Gx/o0/hzaSQ==",
- "license": "SEE LICENSE IN LICENSE.md",
- "dependencies": {
- "@trezor/utils": "9.4.2",
- "ws": "^8.18.0"
- },
- "peerDependencies": {
- "tslib": "^2.6.2"
- }
+ "node_modules/@trezor/connect-web/node_modules/@types/web": {
+ "version": "0.0.174",
+ "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.174.tgz",
+ "integrity": "sha512-dT8gX38RUQjy+uruZg49EvloEa2S3gR0z2eRi557eTSFKqUSXkSCWYa0IY9uabX9MZPMGOu+1r8Qn6tsvJ1KnQ==",
+ "license": "Apache-2.0"
},
- "node_modules/@trezor/connect-web/node_modules/base-x": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
- "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
- "license": "MIT"
+ "node_modules/@trezor/connect-web/node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "license": "Apache-2.0"
},
- "node_modules/@trezor/connect-web/node_modules/bs58": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
- "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
+ "node_modules/@trezor/connect-web/node_modules/socks-proxy-agent": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz",
+ "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
"license": "MIT",
"dependencies": {
- "base-x": "^5.0.0"
+ "agent-base": "^7.1.1",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
}
},
- "node_modules/@trezor/connect/node_modules/base-x": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
- "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/@trezor/connect/node_modules/bs58": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
- "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
+ "node_modules/@trezor/connect-web/node_modules/ua-parser-js": {
+ "version": "1.0.41",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz",
+ "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/faisalman"
+ }
+ ],
"license": "MIT",
- "peer": true,
- "dependencies": {
- "base-x": "^5.0.0"
+ "bin": {
+ "ua-parser-js": "script/cli.js"
+ },
+ "engines": {
+ "node": "*"
}
},
"node_modules/@trezor/crypto-utils": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.1.5.tgz",
- "integrity": "sha512-Bp3L9MvzYy1OhPcNJIPIPu7kAH1lQyI1ZMuGnIo53nLDcU+t7cWO8z8xpyGW1BAnQ9wn+xaqrycLRf76I0TBtA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.2.0.tgz",
+ "integrity": "sha512-9i1NrfW1IE6JO910ut7xrx4u5LxE++GETbpJhWLj4P5xpuGDDSDLEn/MXaYisls2DpE897aOrGPaa1qyt8V6tw==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"peerDependencies": {
"tslib": "^2.6.2"
}
},
+ "node_modules/@trezor/device-authenticity": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@trezor/device-authenticity/-/device-authenticity-1.1.1.tgz",
+ "integrity": "sha512-WlYbQgc5l0pWUVP9GkMp+Oj3rVAqMKsWF0HyxujoymNjEB7rLTl2hXs+GFjlz7VnldaSslECc6EBex/eQiNOnA==",
+ "license": "See LICENSE.md in repo root",
+ "peer": true,
+ "dependencies": {
+ "@noble/curves": "^2.0.1",
+ "@trezor/crypto-utils": "1.2.0",
+ "@trezor/protobuf": "1.5.1",
+ "@trezor/schema-utils": "1.4.0",
+ "@trezor/utils": "9.5.0"
+ }
+ },
"node_modules/@trezor/device-utils": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.1.4.tgz",
- "integrity": "sha512-hFC0nVnWVFaWx0IfCsoHGvBrh5SKsnTHwrX5pvBotwOw51lzTDMd43CkA7nHRybkhcc2JgX1Qq2UbYdwgEWhPg==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.2.0.tgz",
+ "integrity": "sha512-Aqp7pIooFTx21zRUtTI6i1AS4d9Lrx7cclvksh2nJQF9WJvbzuCXshEGkLoOsHwhQrCl3IXfbGuMdA12yDenPA==",
"license": "See LICENSE.md in repo root",
"peer": true
},
"node_modules/@trezor/env-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.3.tgz",
- "integrity": "sha512-sWC828NRNQi5vc9W4M9rHOJDeI9XlsgnzZaML/lHju7WhlZCmSq5BOntZQvD8d1W0fSwLMLdlcBKBr/gQkvFZQ==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz",
+ "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==",
"license": "See LICENSE.md in repo root",
"peer": true,
"dependencies": {
@@ -6291,13 +7144,13 @@
}
},
"node_modules/@trezor/protobuf": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.4.4.tgz",
- "integrity": "sha512-+DwcXkio4qlMkPu6KxnEfhXv5PHTkKh2n6Fo88i5zishUHpYD3NhCS0pouzti8PIPyJE73HQ9MoisG44KQjbtg==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.1.tgz",
+ "integrity": "sha512-nAkaCCAqLpErBd+IuKeG5MpbyLR/2RMgCw18TWc80m1Ws/XgQirhHY9Jbk6gLImTXb9GTrxP0+MDSahzd94rSA==",
"license": "See LICENSE.md in repo root",
"peer": true,
"dependencies": {
- "@trezor/schema-utils": "1.3.4",
+ "@trezor/schema-utils": "1.4.0",
"long": "5.2.5",
"protobufjs": "7.4.0"
},
@@ -6306,9 +7159,9 @@
}
},
"node_modules/@trezor/protocol": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.10.tgz",
- "integrity": "sha512-Ek5bHu2s4OAWOaJU5ksd1kcpe/STyLWOtUVTq6Vn4oMT3++qtrjWRQx/aTN/UaTfNoZlKvFXCC/STGlgBv9CKQ==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.3.0.tgz",
+ "integrity": "sha512-rmrxbDrdgxTouBPbZcSeqU7ba/e5WVT1dxvxxEntHqRdTiDl7d3VK+BErCrlyol8EH5YCqEF3/rXt0crSOfoFw==",
"license": "See LICENSE.md in repo root",
"peer": true,
"peerDependencies": {
@@ -6316,10 +7169,11 @@
}
},
"node_modules/@trezor/schema-utils": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.3.4.tgz",
- "integrity": "sha512-guP5TKjQEWe6c5HGx+7rhM0SAdEL5gylpkvk9XmJXjZDnl1Ew81nmLHUs2ghf8Od3pKBe4qjBIMBHUQNaOqWUg==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.4.0.tgz",
+ "integrity": "sha512-K7upSeh7VDrORaIC4KAxYVW93XNlohmUnH5if/5GKYmTdQSRp1nBkO6Jm+Z4hzIthdnz/1aLgnbeN3bDxWLRxA==",
"license": "See LICENSE.md in repo root",
+ "peer": true,
"dependencies": {
"@sinclair/typebox": "^0.33.7",
"ts-mixer": "^6.0.3"
@@ -6329,16 +7183,16 @@
}
},
"node_modules/@trezor/transport": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.5.4.tgz",
- "integrity": "sha512-3vGn2IEofbzhKMyLjzmTCwVTE5Wj0gkncLCNc66DU95IEW5WlwNGt/nXSJCg9TMBHK6qtlbY1HOBFuUzEW2Q7w==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.6.1.tgz",
+ "integrity": "sha512-RQNQingZ1TOVKSJu3Av9bmQovsu9n1NkcAYJ64+ZfapORfl/AzmZizRflhxU3FlIujQJK1gbIaW79+L54g7a8w==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
- "@trezor/protobuf": "1.4.4",
- "@trezor/protocol": "1.2.10",
- "@trezor/type-utils": "1.1.9",
- "@trezor/utils": "9.4.4",
+ "@trezor/protobuf": "1.5.1",
+ "@trezor/protocol": "1.3.0",
+ "@trezor/type-utils": "1.2.0",
+ "@trezor/utils": "9.5.0",
"cross-fetch": "^4.0.0",
"usb": "^2.15.0"
},
@@ -6347,16 +7201,16 @@
}
},
"node_modules/@trezor/type-utils": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.9.tgz",
- "integrity": "sha512-/Ug5pmVEpT5OVrf007kEvDj+zOdedHV0QcToUHG/WpVAKH9IsOssOAYIfRr8lDDgT+mDHuArZk/bYa1qvVz8Hw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.2.0.tgz",
+ "integrity": "sha512-+E2QntxkyQuYfQQyl8RvT01tq2i5Dp/LFUOXuizF+KVOqsZBjBY43j5hewcCO3+MokD7deDiPyekbUEN5/iVlw==",
"license": "See LICENSE.md in repo root",
"peer": true
},
"node_modules/@trezor/utils": {
- "version": "9.4.4",
- "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.4.tgz",
- "integrity": "sha512-08ciafbBqhApn58q3KkewdLQ3dCA71MsK/BOUfD43EB2GpB420zzky7REilXhOONc3giD0fBbTG3Zdt3HNL0/Q==",
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.5.0.tgz",
+ "integrity": "sha512-kdyMyDbxzvOZmwBNvTjAK+C/kzyOz8T4oUbFvq+KaXn5mBFf1uf8rq5X2HkxgdYRPArtHS3PxLKsfkNCdhCYtQ==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
@@ -6367,13 +7221,13 @@
}
},
"node_modules/@trezor/utxo-lib": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.4.4.tgz",
- "integrity": "sha512-rccdH3+iqvBL/Nkso/wGCdIXAQY+M/ubLIf/i/hBbcpRH6JoOg8oyaoaHzegsYNE6yHKnykTOZWz5Q4MTG02Bw==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.5.0.tgz",
+ "integrity": "sha512-Fa2cZh0037oX6AHNLfpFIj65UR/OoX0ZJTocFuQASe77/1PjZHysf6BvvGfmzuFToKfrAQ+DM/1Sx+P/vnyNmA==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
- "@trezor/utils": "9.4.4",
+ "@trezor/utils": "9.5.0",
"bech32": "^2.0.0",
"bip66": "^2.0.0",
"bitcoin-ops": "^1.4.1",
@@ -6395,31 +7249,14 @@
"tslib": "^2.6.2"
}
},
- "node_modules/@trezor/utxo-lib/node_modules/base-x": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
- "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/@trezor/utxo-lib/node_modules/bs58": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
- "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "base-x": "^5.0.0"
- }
- },
"node_modules/@trezor/websocket-client": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.2.4.tgz",
- "integrity": "sha512-UgU31gFX8gY0abeI5DjRVnH4RfbXqHcOb019ogkR51KlfjkiWXTvUWKRLLqwslWiUIMEAI3ZFeXQds84b7Uw/Q==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.3.0.tgz",
+ "integrity": "sha512-9KQSaVc3NtmM6rFFj1e+9bM0C5mVKVidbnxlfzuBJu7G2YMRdIdLPcAXhvmRZjs40uzDuBeApK+p547kODz2ug==",
"license": "SEE LICENSE IN LICENSE.md",
"peer": true,
"dependencies": {
- "@trezor/utils": "9.4.4",
+ "@trezor/utils": "9.5.0",
"ws": "^8.18.0"
},
"peerDependencies": {
@@ -6445,15 +7282,6 @@
"integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==",
"license": "MIT"
},
- "node_modules/@types/connect": {
- "version": "3.4.38",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
- "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/d3-array": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
@@ -6566,8 +7394,8 @@
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "license": "MIT",
- "peer": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/linkify-it": {
"version": "5.0.0",
@@ -6729,12 +7557,6 @@
"integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
"license": "MIT"
},
- "node_modules/@types/uuid": {
- "version": "8.3.4",
- "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz",
- "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==",
- "license": "MIT"
- },
"node_modules/@types/w3c-web-usb": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.13.tgz",
@@ -6745,7 +7567,8 @@
"version": "0.0.197",
"resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.197.tgz",
"integrity": "sha512-V4sOroWDADFx9dLodWpKm298NOJ1VJ6zoDVgaP+WBb/utWxqQ6gnMzd9lvVDAr/F3ibiKaxH9i45eS0gQPSTaQ==",
- "license": "Apache-2.0"
+ "license": "Apache-2.0",
+ "peer": true
},
"node_modules/@types/webxr": {
"version": "0.5.24",
@@ -7160,29 +7983,8 @@
"optional": true
},
"vue-router": {
- "optional": true
- }
- }
- },
- "node_modules/@wallet-standard/base": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@wallet-standard/base/-/base-1.1.0.tgz",
- "integrity": "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/@wallet-standard/features": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@wallet-standard/features/-/features-1.1.0.tgz",
- "integrity": "sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@wallet-standard/base": "^1.1.0"
- },
- "engines": {
- "node": ">=16"
+ "optional": true
+ }
}
},
"node_modules/@walletconnect/core": {
@@ -7631,6 +8433,7 @@
"resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz",
"integrity": "sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@noble/hashes": "^1.0.0",
"eventemitter3": "5.0.1",
@@ -7645,6 +8448,7 @@
"resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-2.0.0.tgz",
"integrity": "sha512-z3AOibRTE9E8MbjgzxqMpG1RNaBhQ1jnfhNCa1cGf2reZUJzPMYs4TggQTc7j8+0WyV3cr7y/U8Oz99SXIkN5Q==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@xrplf/isomorphic": "^1.0.1",
"ripple-keypairs": "^2.0.0"
@@ -7682,18 +8486,6 @@
"node": ">= 14"
}
},
- "node_modules/agentkeepalive": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
- "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==",
- "license": "MIT",
- "dependencies": {
- "humanize-ms": "^1.2.1"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -7941,6 +8733,19 @@
"license": "MIT",
"peer": true
},
+ "node_modules/assert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
+ "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-nan": "^1.3.2",
+ "object-is": "^1.1.5",
+ "object.assign": "^4.1.4",
+ "util": "^0.12.5"
+ }
+ },
"node_modules/async-function": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
@@ -8063,13 +8868,10 @@
"optional": true
},
"node_modules/base-x": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz",
- "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
+ "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
+ "license": "MIT"
},
"node_modules/base32.js": {
"version": "0.1.0",
@@ -8124,6 +8926,24 @@
"node": ">=8.0.0"
}
},
+ "node_modules/bchaddrjs/node_modules/base-x": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz",
+ "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/bchaddrjs/node_modules/bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "license": "MIT",
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
"node_modules/bchaddrjs/node_modules/bs58check": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
@@ -8331,12 +9151,6 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"license": "ISC"
},
- "node_modules/borsh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz",
- "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==",
- "license": "Apache-2.0"
- },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -8494,7 +9308,6 @@
"version": "4.28.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
"integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -8525,12 +9338,12 @@
}
},
"node_modules/bs58": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
- "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
+ "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
"license": "MIT",
"dependencies": {
- "base-x": "^3.0.2"
+ "base-x": "^5.0.0"
}
},
"node_modules/bs58check": {
@@ -8543,21 +9356,6 @@
"bs58": "^6.0.0"
}
},
- "node_modules/bs58check/node_modules/base-x": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
- "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
- "license": "MIT"
- },
- "node_modules/bs58check/node_modules/bs58": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
- "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
- "license": "MIT",
- "dependencies": {
- "base-x": "^5.0.0"
- }
- },
"node_modules/buffer": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
@@ -8586,7 +9384,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/buffer-xor": {
"version": "1.0.3",
@@ -8595,20 +9394,6 @@
"license": "MIT",
"peer": true
},
- "node_modules/bufferutil": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz",
- "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==",
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
@@ -8801,15 +9586,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": "*"
- }
- },
"node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@@ -9072,7 +9848,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
"license": "MIT"
},
"node_modules/cookie-es": {
@@ -9188,15 +9963,6 @@
"uncrypto": "^0.1.3"
}
},
- "node_modules/crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": "*"
- }
- },
"node_modules/crypto-browserify": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@@ -9465,6 +10231,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "license": "MIT"
+ },
"node_modules/decimal.js-light": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
@@ -9521,7 +10293,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
@@ -9541,18 +10312,6 @@
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
- "node_modules/delay": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
- "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -9562,15 +10321,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -9621,7 +10371,8 @@
"url": "https://paypal.me/faisalman"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/detect-gpu": {
"version": "5.0.70",
@@ -9767,6 +10518,7 @@
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"safe-buffer": "^5.0.1"
}
@@ -9775,7 +10527,6 @@
"version": "1.5.264",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.264.tgz",
"integrity": "sha512-1tEf0nLgltC3iy9wtlYDlQDc5Rg9lEKVjEmIHJ21rI9OcqkvD45K1oyNIRA4rR1z3LgJ7KeGzEBojVcV6m4qjA==",
- "dev": true,
"license": "ISC"
},
"node_modules/elliptic": {
@@ -10128,26 +10879,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
- "license": "MIT"
- },
- "node_modules/es6-promisify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
- "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==",
- "license": "MIT",
- "dependencies": {
- "es6-promise": "^4.0.3"
- }
- },
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -10166,60 +10901,63 @@
}
},
"node_modules/eslint": {
- "version": "8.57.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
- "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
- "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
+ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.1",
- "@humanwhocodes/config-array": "^0.13.0",
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.2",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
+ "cross-spawn": "^7.0.6",
"debug": "^4.3.2",
- "doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^8.0.0",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
+ "optionator": "^0.9.3"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
"node_modules/eslint-config-prettier": {
@@ -10333,9 +11071,9 @@
}
},
"node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -10343,7 +11081,7 @@
"estraverse": "^5.2.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -10362,40 +11100,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/@eslint/eslintrc": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
- "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/eslint/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -10429,66 +11133,19 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/eslint/node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
"license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/eslint/node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/espree": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
@@ -10577,56 +11234,72 @@
}
},
"node_modules/ethereum-cryptography": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz",
- "integrity": "sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz",
+ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/curves": "1.4.2",
+ "@noble/hashes": "1.4.0",
+ "@scure/bip32": "1.4.0",
+ "@scure/bip39": "1.3.0"
+ }
+ },
+ "node_modules/ethereum-cryptography/node_modules/@noble/curves": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz",
+ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==",
"license": "MIT",
"dependencies": {
- "@noble/ciphers": "1.3.0",
- "@noble/curves": "1.9.0",
- "@noble/hashes": "1.8.0",
- "@scure/bip32": "1.7.0",
- "@scure/bip39": "1.6.0"
+ "@noble/hashes": "1.4.0"
},
- "engines": {
- "node": "^14.21.3 || >=16",
- "npm": ">=9"
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/ethereum-cryptography/node_modules/@noble/ciphers": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz",
- "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==",
+ "node_modules/ethereum-cryptography/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
"license": "MIT",
"engines": {
- "node": "^14.21.3 || >=16"
+ "node": ">= 16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/ethereum-cryptography/node_modules/@noble/curves": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz",
- "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==",
+ "node_modules/ethereum-cryptography/node_modules/@scure/base": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz",
+ "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ethereum-cryptography/node_modules/@scure/bip32": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz",
+ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==",
"license": "MIT",
"dependencies": {
- "@noble/hashes": "1.8.0"
- },
- "engines": {
- "node": "^14.21.3 || >=16"
+ "@noble/curves": "~1.4.0",
+ "@noble/hashes": "~1.4.0",
+ "@scure/base": "~1.1.6"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/ethereum-cryptography/node_modules/@noble/hashes": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
- "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "node_modules/ethereum-cryptography/node_modules/@scure/bip39": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz",
+ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==",
"license": "MIT",
- "engines": {
- "node": "^14.21.3 || >=16"
+ "dependencies": {
+ "@noble/hashes": "~1.4.0",
+ "@scure/base": "~1.1.6"
},
"funding": {
"url": "https://paulmillr.com/funding/"
@@ -10667,27 +11340,12 @@
"safe-buffer": "^5.1.1"
}
},
- "node_modules/exponential-backoff": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
- "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
- "license": "Apache-2.0",
- "peer": true
- },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"license": "MIT"
},
- "node_modules/eyes": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
- "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==",
- "engines": {
- "node": "> 0.1.90"
- }
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -10733,12 +11391,6 @@
"node": ">=6"
}
},
- "node_modules/fast-stable-stringify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz",
- "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==",
- "license": "MIT"
- },
"node_modules/fastestsmallesttextencoderdecoder": {
"version": "1.0.22",
"resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz",
@@ -10746,16 +11398,6 @@
"license": "CC0-1.0",
"peer": true
},
- "node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
"node_modules/feaxios": {
"version": "0.0.23",
"resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz",
@@ -10772,16 +11414,16 @@
"license": "MIT"
},
"node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "flat-cache": "^3.0.4"
+ "flat-cache": "^4.0.0"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=16.0.0"
}
},
"node_modules/file-selector": {
@@ -10842,18 +11484,17 @@
}
},
"node_modules/flat-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
- "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
+ "keyv": "^4.5.4"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=16"
}
},
"node_modules/flatted": {
@@ -10915,13 +11556,13 @@
}
},
"node_modules/framer-motion": {
- "version": "12.23.25",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz",
- "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==",
+ "version": "12.30.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.30.0.tgz",
+ "integrity": "sha512-S7t3UjvghrFiJzFJ30ncX6keUipexw9f7DRpauhW9bXPNxg0dMxoPbNIDpLuxK1NvxF2wswFEMEm7WiNAcdELg==",
"license": "MIT",
"dependencies": {
- "motion-dom": "^12.23.23",
- "motion-utils": "^12.23.6",
+ "motion-dom": "^12.30.0",
+ "motion-utils": "^12.29.2",
"tslib": "^2.4.0"
},
"peerDependencies": {
@@ -10941,13 +11582,6 @@
}
}
},
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -10988,31 +11622,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/generate-function": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
- "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "is-property": "^1.0.2"
- }
- },
- "node_modules/generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "is-property": "^1.0.0"
- }
- },
"node_modules/generator-function": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
"integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -11022,7 +11635,6 @@
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -11120,28 +11732,6 @@
"integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
"license": "ISC"
},
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -11223,9 +11813,9 @@
"license": "Standard 'no charge' license: https://gsap.com/standard-license."
},
"node_modules/h3": {
- "version": "1.15.4",
- "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz",
- "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==",
+ "version": "1.15.5",
+ "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz",
+ "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==",
"license": "MIT",
"dependencies": {
"cookie-es": "^1.2.2",
@@ -11233,9 +11823,9 @@
"defu": "^6.1.4",
"destr": "^2.0.5",
"iron-webcrypto": "^1.2.1",
- "node-mock-http": "^1.0.2",
+ "node-mock-http": "^1.0.4",
"radix3": "^1.1.2",
- "ufo": "^1.6.1",
+ "ufo": "^1.6.3",
"uncrypto": "^0.1.3"
}
},
@@ -11720,55 +12310,31 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"license": "MIT",
- "peer": true,
"dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
+ "agent-base": "6",
+ "debug": "4"
},
"engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/http-errors/node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
+ "node": ">= 6"
}
},
- "node_modules/http-errors/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "license": "ISC",
- "peer": true
- },
- "node_modules/humanize-ms": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+ "node_modules/https-proxy-agent/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"license": "MIT",
"dependencies": {
- "ms": "^2.0.0"
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
}
},
- "node_modules/humanize-ms/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/husky": {
"version": "9.1.7",
"resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
@@ -11854,18 +12420,6 @@
"node": ">=0.8.19"
}
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -11960,6 +12514,22 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/is-arguments": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
+ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-array-buffer": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -12150,7 +12720,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
"integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.4",
@@ -12202,25 +12771,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-my-ip-valid": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz",
- "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/is-my-json-valid": {
- "version": "2.20.6",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz",
- "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==",
+ "node_modules/is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
"license": "MIT",
- "peer": true,
"dependencies": {
- "generate-function": "^2.0.0",
- "generate-object-property": "^1.1.0",
- "is-my-ip-valid": "^1.0.0",
- "jsonpointer": "^5.0.0",
- "xtend": "^4.0.0"
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-negative-zero": {
@@ -12263,16 +12827,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-plain-obj": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -12291,18 +12845,10 @@
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
"license": "MIT"
},
- "node_modules/is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
- "license": "MIT",
- "peer": true
- },
"node_modules/is-regex": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
"integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -12376,7 +12922,8 @@
"url": "https://paypal.me/faisalman"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/is-string": {
"version": "1.1.1",
@@ -12496,15 +13043,6 @@
"unfetch": "^4.2.0"
}
},
- "node_modules/isomorphic-ws": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
- "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==",
- "license": "MIT",
- "peerDependencies": {
- "ws": "*"
- }
- },
"node_modules/iterator.prototype": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
@@ -12544,65 +13082,6 @@
"@types/react": "*"
}
},
- "node_modules/jayson": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.2.0.tgz",
- "integrity": "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==",
- "license": "MIT",
- "dependencies": {
- "@types/connect": "^3.4.33",
- "@types/node": "^12.12.54",
- "@types/ws": "^7.4.4",
- "commander": "^2.20.3",
- "delay": "^5.0.0",
- "es6-promisify": "^5.0.0",
- "eyes": "^0.1.8",
- "isomorphic-ws": "^4.0.1",
- "json-stringify-safe": "^5.0.1",
- "stream-json": "^1.9.1",
- "uuid": "^8.3.2",
- "ws": "^7.5.10"
- },
- "bin": {
- "jayson": "bin/jayson.js"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jayson/node_modules/@types/node": {
- "version": "12.20.55",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
- "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
- "license": "MIT"
- },
- "node_modules/jayson/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "license": "MIT"
- },
- "node_modules/jayson/node_modules/ws": {
- "version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
"node_modules/jiti": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
@@ -12630,12 +13109,6 @@
"node": ">=14"
}
},
- "node_modules/js-sha256": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.1.tgz",
- "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==",
- "license": "MIT"
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -12659,7 +13132,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "dev": true,
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
@@ -12689,17 +13161,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "license": "ISC"
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
@@ -12708,14 +13173,13 @@
"node": ">=6"
}
},
- "node_modules/jsonpointer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
- "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "node_modules/jsonschema": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz",
+ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==",
"license": "MIT",
- "peer": true,
"engines": {
- "node": ">=0.10.0"
+ "node": "*"
}
},
"node_modules/jsx-ast-utils": {
@@ -12739,6 +13203,7 @@
"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
"integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"buffer-equal-constant-time": "^1.0.1",
"ecdsa-sig-formatter": "1.0.11",
@@ -12750,6 +13215,7 @@
"resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
"integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"jwa": "^2.0.1",
"safe-buffer": "^5.0.1"
@@ -13158,9 +13624,9 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"license": "MIT"
},
"node_modules/lodash.debounce": {
@@ -13231,18 +13697,10 @@
"loose-envify": "cli.js"
}
},
- "node_modules/lru_map": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.4.1.tgz",
- "integrity": "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==",
- "license": "MIT",
- "peer": true
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
@@ -13624,9 +14082,9 @@
"license": "MIT"
},
"node_modules/media-chrome": {
- "version": "4.16.1",
- "resolved": "https://registry.npmjs.org/media-chrome/-/media-chrome-4.16.1.tgz",
- "integrity": "sha512-qtFlsy0lNDVCyVo//ZCAfRPKwgehfOYp6rThZzDUuZ5ypv41yqUfAxK+P9TOs+XSVWXATPTT2WRV0fbW0BH4vQ==",
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/media-chrome/-/media-chrome-4.17.2.tgz",
+ "integrity": "sha512-o/IgiHx0tdSVwRxxqF5H12FK31A/A8T71sv3KdAvh7b6XeBS9dXwqvIFwlR9kdEuqg3n7xpmRIuL83rmYq8FTg==",
"license": "MIT",
"dependencies": {
"ce-la-react": "^0.3.2"
@@ -14305,12 +14763,12 @@
}
},
"node_modules/motion": {
- "version": "12.23.25",
- "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.25.tgz",
- "integrity": "sha512-Fk5Y1kcgxYiTYOUjmwfXQAP7tP+iGqw/on1UID9WEL/6KpzxPr9jY2169OsjgZvXJdpraKXy0orkjaCVIl5fgQ==",
+ "version": "12.30.0",
+ "resolved": "https://registry.npmjs.org/motion/-/motion-12.30.0.tgz",
+ "integrity": "sha512-5D2ERK0dnZjXPcmKFVEoyToa/BR1FpHzVP508yOeU+mH3fsSVYP6P2qmbF+opUXLetxHy0GVgH9NEZxBdXpe+A==",
"license": "MIT",
"dependencies": {
- "framer-motion": "^12.23.25",
+ "framer-motion": "^12.30.0",
"tslib": "^2.4.0"
},
"peerDependencies": {
@@ -14331,18 +14789,18 @@
}
},
"node_modules/motion-dom": {
- "version": "12.23.23",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz",
- "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==",
+ "version": "12.30.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.30.0.tgz",
+ "integrity": "sha512-p6Mp+lxm+mK4O86YVyL6KAlFDVCIqpmcBt+uMVapMBqltPXpwZ5Wj2crnN2VE7lwsas0ONCPIW9YVpMigu4F5g==",
"license": "MIT",
"dependencies": {
- "motion-utils": "^12.23.6"
+ "motion-utils": "^12.29.2"
}
},
"node_modules/motion-utils": {
- "version": "12.23.6",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
- "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
+ "version": "12.29.2",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
"license": "MIT"
},
"node_modules/ms": {
@@ -14360,22 +14818,10 @@
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==",
"license": "(Apache-2.0 AND MIT)"
},
- "node_modules/mustache": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz",
- "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==",
- "license": "MIT",
- "bin": {
- "mustache": "bin/mustache"
- },
- "engines": {
- "npm": ">=1.4.0"
- }
- },
"node_modules/nan": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.24.0.tgz",
- "integrity": "sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==",
+ "version": "2.25.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz",
+ "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==",
"license": "MIT"
},
"node_modules/nano-spawn": {
@@ -14431,77 +14877,13 @@
"dev": true,
"license": "MIT"
},
- "node_modules/near-abi": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/near-abi/-/near-abi-0.2.0.tgz",
- "integrity": "sha512-kCwSf/3fraPU2zENK18sh+kKG4uKbEUEQdyWQkmW8ZofmLarObIz2+zAYjA1teDZLeMvEQew3UysnPDXgjneaA==",
- "license": "(MIT AND Apache-2.0)",
- "peer": true,
- "dependencies": {
- "@types/json-schema": "^7.0.11"
- }
- },
- "node_modules/near-api-js": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/near-api-js/-/near-api-js-5.1.1.tgz",
- "integrity": "sha512-h23BGSKxNv8ph+zU6snicstsVK1/CTXsQz4LuGGwoRE24Hj424nSe4+/1tzoiC285Ljf60kPAqRCmsfv9etF2g==",
- "license": "(MIT AND Apache-2.0)",
- "peer": true,
- "dependencies": {
- "@near-js/accounts": "1.4.1",
- "@near-js/crypto": "1.4.2",
- "@near-js/keystores": "0.2.2",
- "@near-js/keystores-browser": "0.2.2",
- "@near-js/keystores-node": "0.1.2",
- "@near-js/providers": "1.0.3",
- "@near-js/signers": "0.2.2",
- "@near-js/transactions": "1.3.3",
- "@near-js/types": "0.3.1",
- "@near-js/utils": "1.1.0",
- "@near-js/wallet-account": "1.3.3",
- "@noble/curves": "1.8.1",
- "borsh": "1.0.0",
- "depd": "2.0.0",
- "http-errors": "1.7.2",
- "near-abi": "0.2.0",
- "node-fetch": "2.6.7"
- }
- },
- "node_modules/near-api-js/node_modules/borsh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz",
- "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==",
- "license": "Apache-2.0",
- "peer": true
- },
- "node_modules/near-api-js/node_modules/node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
"node_modules/next": {
- "version": "16.1.1",
- "resolved": "https://registry.npmjs.org/next/-/next-16.1.1.tgz",
- "integrity": "sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==",
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz",
+ "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==",
"license": "MIT",
"dependencies": {
- "@next/env": "16.1.1",
+ "@next/env": "16.1.6",
"@swc/helpers": "0.5.15",
"baseline-browser-mapping": "^2.8.3",
"caniuse-lite": "^1.0.30001579",
@@ -14515,14 +14897,14 @@
"node": ">=20.9.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "16.1.1",
- "@next/swc-darwin-x64": "16.1.1",
- "@next/swc-linux-arm64-gnu": "16.1.1",
- "@next/swc-linux-arm64-musl": "16.1.1",
- "@next/swc-linux-x64-gnu": "16.1.1",
- "@next/swc-linux-x64-musl": "16.1.1",
- "@next/swc-win32-arm64-msvc": "16.1.1",
- "@next/swc-win32-x64-msvc": "16.1.1",
+ "@next/swc-darwin-arm64": "16.1.6",
+ "@next/swc-darwin-x64": "16.1.6",
+ "@next/swc-linux-arm64-gnu": "16.1.6",
+ "@next/swc-linux-arm64-musl": "16.1.6",
+ "@next/swc-linux-x64-gnu": "16.1.6",
+ "@next/swc-linux-x64-musl": "16.1.6",
+ "@next/swc-win32-arm64-msvc": "16.1.6",
+ "@next/swc-win32-x64-msvc": "16.1.6",
"sharp": "^0.34.4"
},
"peerDependencies": {
@@ -14675,16 +15057,15 @@
}
},
"node_modules/node-mock-http": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz",
- "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz",
+ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==",
"license": "MIT"
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
- "dev": true,
"license": "MIT"
},
"node_modules/nofilter": {
@@ -14755,11 +15136,26 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -14769,7 +15165,6 @@
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
"integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
@@ -15059,16 +15454,6 @@
"node": ">=8"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -15712,43 +16097,22 @@
}
},
"node_modules/query-string": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
- "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
- "license": "MIT",
- "dependencies": {
- "decode-uri-component": "^0.2.2",
- "filter-obj": "^1.1.0",
- "split-on-first": "^1.0.0",
- "strict-uri-encode": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+ "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-uri-component": "^0.2.2",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
@@ -16563,17 +16927,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
@@ -16581,23 +16934,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/ripemd160": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz",
@@ -16616,6 +16952,7 @@
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.0.tgz",
"integrity": "sha512-de7osLRH/pt5HX2xw2TRJtbdLLWHu0RXirpQaEeCnWKY5DYHykh3ETSkofvm0aX0LJiV7kwkegJxQkmbO94gWw==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@scure/base": "^1.1.3",
"@xrplf/isomorphic": "^1.0.0"
@@ -16625,10 +16962,11 @@
}
},
"node_modules/ripple-binary-codec": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.5.1.tgz",
- "integrity": "sha512-rzN4GTorLRH0bQD7Tccgn6Eq4aunMhZaUTXDEUJ+3xrjo0m1Av5AY1Doc/jsCIaxPIAnyoVg5rWlmI93U7pGdg==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.6.0.tgz",
+ "integrity": "sha512-OJBRxjjalO7SrIwydHhcC9wOFLoeKcawoqSEfGZilAtXROYTWHx5kTly2VcUMmMMSEYIh1+yEstBtLBObNjeKQ==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@xrplf/isomorphic": "^1.0.1",
"bignumber.js": "^9.0.0",
@@ -16643,6 +16981,7 @@
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz",
"integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@noble/curves": "^1.0.0",
"@xrplf/isomorphic": "^1.0.0",
@@ -16652,74 +16991,153 @@
"node": ">= 16"
}
},
- "node_modules/rope-sequence": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
- "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
- "license": "MIT"
- },
- "node_modules/rou3": {
- "version": "0.7.10",
- "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.7.10.tgz",
- "integrity": "sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==",
- "license": "MIT"
- },
- "node_modules/rpc-websockets": {
- "version": "9.3.2",
- "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.2.tgz",
- "integrity": "sha512-VuW2xJDnl1k8n8kjbdRSWawPRkwaVqUQNjE1TdeTawf0y0abGhtVJFTXCLfgpgGDBkO/Fj6kny8Dc/nvOW78MA==",
- "license": "LGPL-3.0-only",
+ "node_modules/ripple-keypairs/node_modules/@noble/curves": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
+ "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@swc/helpers": "^0.5.11",
- "@types/uuid": "^8.3.4",
- "@types/ws": "^8.2.2",
- "buffer": "^6.0.3",
- "eventemitter3": "^5.0.1",
- "uuid": "^8.3.2",
- "ws": "^8.5.0"
+ "@noble/hashes": "1.8.0"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
},
"funding": {
- "type": "paypal",
- "url": "https://paypal.me/kozjak"
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ripple-lib": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.10.1.tgz",
+ "integrity": "sha512-OQk+Syl2JfxKxV2KuF/kBMtnh012I5tNnziP3G4WDGCGSIAgeqkOgkR59IQ0YDNrs1YW8GbApxrdMSRi/QClcA==",
+ "deprecated": "ripple-lib is deprecated. Please migrate to xrpl.js using this migration guide: https://xrpl.org/xrpljs2-migration-guide.html",
+ "license": "ISC",
+ "dependencies": {
+ "@types/lodash": "^4.14.136",
+ "@types/ws": "^7.2.0",
+ "bignumber.js": "^9.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "jsonschema": "1.2.2",
+ "lodash": "^4.17.4",
+ "ripple-address-codec": "^4.1.1",
+ "ripple-binary-codec": "^1.1.3",
+ "ripple-keypairs": "^1.0.3",
+ "ripple-lib-transactionparser": "0.8.2",
+ "ws": "^7.2.0"
},
- "optionalDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "engines": {
+ "node": ">=10.13.0",
+ "yarn": "^1.15.2"
+ }
+ },
+ "node_modules/ripple-lib-transactionparser": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz",
+ "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==",
+ "license": "ISC",
+ "dependencies": {
+ "bignumber.js": "^9.0.0",
+ "lodash": "^4.17.15"
}
},
- "node_modules/rpc-websockets/node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "node_modules/ripple-lib/node_modules/base-x": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz",
+ "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==",
"license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "safe-buffer": "^5.0.1"
}
},
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "node_modules/ripple-lib/node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/ripple-lib/node_modules/ripple-address-codec": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz",
+ "integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==",
+ "license": "ISC",
+ "dependencies": {
+ "base-x": "^3.0.9",
+ "create-hash": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/ripple-lib/node_modules/ripple-binary-codec": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.11.0.tgz",
+ "integrity": "sha512-g7+gs3T+NfoeW6vIq5dcN0CkIT4t/zwRzFxz8X2RzfbrWRnewPUKqQbmBgs05tXLX5NuWPaneiaAVpFpYBcdfw==",
+ "license": "ISC",
+ "dependencies": {
+ "assert": "^2.0.0",
+ "big-integer": "^1.6.48",
+ "buffer": "6.0.3",
+ "create-hash": "^1.2.0",
+ "decimal.js": "^10.2.0",
+ "ripple-address-codec": "^4.3.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/ripple-lib/node_modules/ripple-keypairs": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz",
+ "integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==",
+ "license": "ISC",
+ "dependencies": {
+ "bn.js": "^5.1.1",
+ "brorand": "^1.0.5",
+ "elliptic": "^6.5.4",
+ "hash.js": "^1.0.3",
+ "ripple-address-codec": "^4.3.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/ripple-lib/node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
},
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "utf-8-validate": {
+ "optional": true
}
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
}
},
+ "node_modules/rope-sequence": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
+ "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
+ "license": "MIT"
+ },
+ "node_modules/rou3": {
+ "version": "0.7.10",
+ "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.7.10.tgz",
+ "integrity": "sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==",
+ "license": "MIT"
+ },
"node_modules/rxjs": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
@@ -16790,7 +17208,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
"integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -16819,27 +17236,6 @@
"integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
"license": "MIT"
},
- "node_modules/secp256k1": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz",
- "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==",
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "elliptic": "^6.5.7",
- "node-addon-api": "^5.0.0",
- "node-gyp-build": "^4.2.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/secp256k1/node_modules/node-addon-api": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
- "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
- "license": "MIT"
- },
"node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@@ -16912,13 +17308,6 @@
"node": ">= 0.4"
}
},
- "node_modules/setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
- "license": "ISC",
- "peer": true
- },
"node_modules/sha.js": {
"version": "2.4.12",
"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz",
@@ -16939,19 +17328,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/sha1": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
- "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "charenc": ">= 0.0.1",
- "crypt": ">= 0.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/sharp": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
@@ -17227,6 +17603,7 @@
"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
"integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"agent-base": "^7.1.2",
"debug": "^4.3.4",
@@ -17328,16 +17705,6 @@
"integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==",
"license": "MIT"
},
- "node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/stop-iteration-iterator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
@@ -17362,21 +17729,6 @@
"readable-stream": "^3.5.0"
}
},
- "node_modules/stream-chain": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz",
- "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==",
- "license": "BSD-3-Clause"
- },
- "node_modules/stream-json": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz",
- "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "stream-chain": "^2.2.5"
- }
- },
"node_modules/stream-shift": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
@@ -17610,15 +17962,6 @@
}
}
},
- "node_modules/superstruct": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz",
- "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==",
- "license": "MIT",
- "engines": {
- "node": ">=14.0.0"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -17699,18 +18042,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/text-encoding-utf-8": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz",
- "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/thread-stream": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz",
@@ -17862,16 +18193,6 @@
"node": ">=8.0"
}
},
- "node_modules/toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.6"
- }
- },
"node_modules/toml": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
@@ -18030,19 +18351,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
@@ -18157,12 +18465,13 @@
"url": "https://paypal.me/faisalman"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/ua-parser-js": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.6.tgz",
- "integrity": "sha512-EmaxXfltJaDW75SokrY4/lXMrVyXomE/0FpIIqP2Ctic93gK7rlme55Cwkz8l3YZ6gqf94fCU7AnIkidd/KXPg==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.8.tgz",
+ "integrity": "sha512-BdnBM5waFormdrOFBU+cA90R689V0tWUWlIG2i30UXxElHjuCu5+dOV2Etw3547jcQ/yaLtPm9wrqIuOY2bSJg==",
"funding": [
{
"type": "opencollective",
@@ -18178,6 +18487,7 @@
}
],
"license": "AGPL-3.0-or-later",
+ "peer": true,
"dependencies": {
"detect-europe-js": "^0.1.2",
"is-standalone-pwa": "^0.1.1",
@@ -18197,9 +18507,9 @@
"license": "MIT"
},
"node_modules/ufo": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
- "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
"license": "MIT"
},
"node_modules/uint8array-tools": {
@@ -18246,10 +18556,11 @@
"license": "MIT"
},
"node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
- "license": "MIT"
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.20.0.tgz",
+ "integrity": "sha512-PZDAAlMkNw5ZzN/ebfyrwzrMWfIf7Jbn9iM/I6SF456OKrb2wnfqVowaxEY/cMAM8MjFu1zhdpJyA0L+rTYwNw==",
+ "license": "MIT",
+ "peer": true
},
"node_modules/unfetch": {
"version": "4.2.0",
@@ -18461,7 +18772,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.1.tgz",
"integrity": "sha512-R9NcHbbZ45RoWfTdhn1J9SS7zxNvlddv4YRrHTUaFdtjbmfncfedB45EC9IaqJQ97iAR1GZgOfyRQO+ExIF6EQ==",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -18580,18 +18890,17 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "node_modules/utf-8-validate": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
- "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
- "hasInstallScript": true,
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
"license": "MIT",
- "optional": true,
"dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
}
},
"node_modules/util-deprecate": {
@@ -18609,21 +18918,6 @@
"node": ">= 4"
}
},
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/uuid4": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/uuid4/-/uuid4-2.0.3.tgz",
- "integrity": "sha512-CTpAkEVXMNJl2ojgtpLXHgz23dh8z81u6/HEPiQFOvBc/c2pde6TVHmH4uwY0d/GLF3tb7+VDAj4+2eJaQSdZQ==",
- "license": "ISC"
- },
"node_modules/valtio": {
"version": "1.11.2",
"resolved": "https://registry.npmjs.org/valtio/-/valtio-1.11.2.tgz",
@@ -18965,9 +19259,9 @@
"license": "ISC"
},
"node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -18998,6 +19292,7 @@
"resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.4.3.tgz",
"integrity": "sha512-vi2OjuNkiaP8nv1j+nqHp8GZwwEjO6Y8+j/OuVMg6M4LwXEwyHdIj33dlg7cyY1Lw5+jb9HqFOQvABhaywVbTQ==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@scure/bip32": "^1.3.1",
"@scure/bip39": "^1.2.1",
@@ -19014,16 +19309,6 @@
"node": ">=18.0.0"
}
},
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.4"
- }
- },
"node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
@@ -19034,7 +19319,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
"license": "ISC"
},
"node_modules/yaml": {
@@ -19204,9 +19488,9 @@
}
},
"node_modules/zod": {
- "version": "4.1.13",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
- "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz",
+ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
diff --git a/package.json b/package.json
index 084fd8604..72ed485d1 100644
--- a/package.json
+++ b/package.json
@@ -25,8 +25,9 @@
},
"dependencies": {
"@countrystatecity/countries": "^1.0.4",
- "@creit.tech/stellar-wallets-kit": "^1.7.6",
+ "@creit.tech/stellar-wallets-kit": "^1.5.0",
"@dnd-kit/core": "^6.3.1",
+ "@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@gsap/react": "^2.1.2",
@@ -35,34 +36,37 @@
"@radix-ui/react-accordion": "^1.2.11",
"@radix-ui/react-alert-dialog": "^1.1.14",
"@radix-ui/react-aspect-ratio": "^1.1.7",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-checkbox": "^1.3.2",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-collapsible": "^1.1.11",
"@radix-ui/react-context-menu": "^2.2.15",
- "@radix-ui/react-dialog": "^1.1.14",
- "@radix-ui/react-dropdown-menu": "^2.1.15",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-direction": "^1.1.1",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.14",
- "@radix-ui/react-label": "^2.1.7",
+ "@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-menubar": "^1.1.15",
"@radix-ui/react-navigation-menu": "^1.2.13",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "^1.3.7",
"@radix-ui/react-scroll-area": "^1.2.9",
- "@radix-ui/react-select": "^2.2.5",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slider": "^1.3.5",
- "@radix-ui/react-slot": "^1.2.3",
+ "@radix-ui/react-select": "^2.2.6",
+ "@radix-ui/react-separator": "^1.1.8",
+ "@radix-ui/react-slider": "^1.3.6",
+ "@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.5",
- "@radix-ui/react-tabs": "^1.1.12",
- "@radix-ui/react-toggle": "^1.1.9",
- "@radix-ui/react-toggle-group": "^1.1.10",
- "@radix-ui/react-tooltip": "^1.2.7",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@radix-ui/react-toggle": "^1.1.10",
+ "@radix-ui/react-toggle-group": "^1.1.11",
+ "@radix-ui/react-tooltip": "^1.2.8",
"@react-three/drei": "^10.7.6",
"@react-three/fiber": "^9.3.0",
"@stellar/freighter-api": "^4.1.0",
"@stellar/stellar-sdk": "^13.3.0",
+ "@tabler/icons-react": "^3.36.1",
"@tailwindcss/postcss": "^4",
+ "@tanstack/react-table": "^8.21.3",
"@tiptap/core": "^3.7.2",
"@tiptap/extension-blockquote": "^3.7.2",
"@tiptap/extension-bold": "^3.7.2",
@@ -109,8 +113,8 @@
"lodash.debounce": "^4.0.8",
"lucide-react": "^0.525.0",
"marked": "^16.3.0",
- "media-chrome": "^4.15.1",
- "motion": "^12.23.24",
+ "media-chrome": "^4.17.2",
+ "motion": "^12.30.0",
"next": "^16.1.1",
"next-auth": "^5.0.0-beta.29",
"next-themes": "^0.4.6",
@@ -125,12 +129,12 @@
"recharts": "^2.15.4",
"remark-gfm": "^4.0.1",
"socket.io-client": "^4.8.1",
- "sonner": "^2.0.6",
+ "sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"three": "^0.180.0",
"tw-animate-css": "^1.3.6",
"vaul": "^1.1.2",
- "zod": "^4.0.10",
+ "zod": "^4.3.5",
"zustand": "^5.0.6"
},
"devDependencies": {
@@ -140,7 +144,7 @@
"@types/react-dom": "19.2.3",
"@typescript-eslint/eslint-plugin": "^8.38.0",
"@typescript-eslint/parser": "^8.38.0",
- "eslint": "^8.57.0",
+ "eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.3",
"eslint-plugin-react": "^7.37.5",
diff --git a/public/pattern.ssvg b/public/pattern.svg
similarity index 100%
rename from public/pattern.ssvg
rename to public/pattern.svg
diff --git a/types/notifications.ts b/types/notifications.ts
index ae00d943d..c33b71ec7 100644
--- a/types/notifications.ts
+++ b/types/notifications.ts
@@ -84,7 +84,7 @@ export enum NotificationType {
* Notification data structure matching backend API response
*/
export interface Notification {
- _id: string;
+ id: string;
userId: {
type: string;
};
@@ -135,10 +135,10 @@ export interface Notification {
* Paginated notifications response
*/
export interface NotificationsResponse {
- data: Notification[];
+ notifications: Notification[];
total: number;
- page: number;
limit: number;
+ offset: number;
}
/**
diff --git a/types/user.ts b/types/user.ts
index 76f9c1edb..c78760e97 100644
--- a/types/user.ts
+++ b/types/user.ts
@@ -70,11 +70,11 @@ export interface UserMetadata {
export interface Project {
id: string;
title: string;
- description: string;
+ vision: string;
category: string;
- status: ProjectStatus;
- banner: string | null;
- logo: string;
+ status: string; // Changed from ProjectStatus to string
+ banner?: string | null;
+ logo?: string | null;
createdAt: string;
updatedAt?: string;
}
@@ -90,14 +90,15 @@ export interface ActivityMetadata {
export interface Activity {
id: string;
- type: ActivityType;
+ type: string; // Changed from ActivityType to string to match API
userId: string;
- projectId: string | null;
- organizationId: string | null;
- metadata: ActivityMetadata;
+ projectId?: string | null;
+ organizationId?: string | null;
+ metadata?: any;
createdAt: string;
updatedAt: string;
- project: Project | null;
+ project?: any;
+ organization?: any;
}
export interface UserBadge {
@@ -153,26 +154,70 @@ export interface User {
name: string;
email: string;
emailVerified: boolean;
- image: string;
+ image?: string;
createdAt: string;
updatedAt: string;
- lastLoginMethod: LoginMethod;
- role: UserRole;
+ lastLoginMethod?: string;
+ role: string;
banned: boolean;
- banReason: string | null;
- banExpires: string | null;
+ banReason?: string | null;
+ banExpires?: string | null;
username: string;
displayUsername: string;
+ metadata?: any;
twoFactorEnabled: boolean;
- members: OrganizationMembership[];
- // organizations: Organization[];
- stats: Stats;
- profile: UserProfileData;
- projects: Project[];
- activities: Activity[];
- badges: UserBadge[];
- grantApplicationsAsApplicant: GrantApplication[];
- hackathonSubmissionsAsParticipant: HackathonSubmission[];
+ members?: Array<{
+ id: string;
+ organizationId: string;
+ userId: string;
+ role: string;
+ createdAt: string;
+ organization: {
+ id: string;
+ name: string;
+ slug: string;
+ logo: string;
+ createdAt: string;
+ _count: {
+ hackathons: number;
+ members: number;
+ };
+ };
+ }>;
+ projects?: Array<{
+ id: string;
+ title: string;
+ vision: string;
+ category: string;
+ status: string;
+ banner?: string | null;
+ logo?: string | null;
+ createdAt: string;
+ }>;
+ activities?: Array<{
+ id: string;
+ type: string;
+ userId: string;
+ projectId?: string | null;
+ organizationId?: string | null;
+ metadata?: any;
+ createdAt: string;
+ updatedAt: string;
+ project?: any;
+ }>;
+ userBadges?: any[];
+ grantApplicationsAsApplicant?: any[];
+ hackathonSubmissionsAsParticipant?: Array<{
+ id: string;
+ status: string;
+ rank?: number | null;
+ submittedAt: string;
+ }>;
+ profile?: any;
+ stats?: {
+ followers: number;
+ following: number;
+ };
}
export interface SessionUser extends User {}
@@ -235,13 +280,7 @@ export type UserWithoutSensitiveData = Omit<
export type PublicUserProfile = Pick<
User,
- | 'id'
- | 'name'
- | 'username'
- | 'displayUsername'
- | 'image'
- | 'projects'
- | 'badges'
+ 'id' | 'name' | 'username' | 'displayUsername' | 'image' | 'projects'
> & {
metadata: {
profile: UserProfileData;