From 31fc326c70638114186cd27fbed8db65726821eb Mon Sep 17 00:00:00 2001 From: Johnson Oyemade Date: Sun, 21 Jun 2026 23:47:52 +0100 Subject: [PATCH 1/5] feat: add risk rule utility query builders --- lib/risk-helpers.ts | 141 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 lib/risk-helpers.ts diff --git a/lib/risk-helpers.ts b/lib/risk-helpers.ts new file mode 100644 index 0000000..dae64c3 --- /dev/null +++ b/lib/risk-helpers.ts @@ -0,0 +1,141 @@ +import mongoose from "mongoose" + +/** + * 1. Late Repayments + * Identify contracts where repayments are past their due date. + * Returns a MongoDB query filter object. + * Applicable Model: HirePurchaseContract + */ +export const buildLateRepaymentsQuery = (options?: { currentDate?: Date }) => { + const now = options?.currentDate || new Date() + return { + status: "ACTIVE", + nextDueDate: { $lt: now, $ne: null }, + } +} + +/** + * 2. Repeated Failed Transactions + * Identify users/wallets with > X failed payment attempts within a timeframe. + * Returns a MongoDB aggregation pipeline. + * Applicable Model: Transaction or DriverPayment + */ +export const buildRepeatedFailedTransactionsPipeline = (options?: { + threshold?: number + daysFrame?: number + currentDate?: Date + userField?: string // e.g. "userId" or "driverUserId" + dateField?: string // e.g. "timestamp" or "createdAt" +}) => { + const threshold = options?.threshold ?? 3 + const daysFrame = options?.daysFrame ?? 7 + const now = options?.currentDate || new Date() + const timeLimit = new Date(now.getTime() - daysFrame * 24 * 60 * 60 * 1000) + const userField = options?.userField ?? "userId" + const dateField = options?.dateField ?? "timestamp" + + return [ + { + $match: { + status: { $in: ["Failed", "FAILED"] }, + [dateField]: { $gte: timeLimit }, + }, + }, + { + $group: { + _id: `$${userField}`, + failedCount: { $sum: 1 }, + latestFailure: { $max: `$${dateField}` }, + }, + }, + { + $match: { + failedCount: { $gt: threshold }, + }, + }, + { + $sort: { failedCount: -1 }, + }, + ] +} + +/** + * 3. Inactive Contracts/Drivers + * Identify active contracts with zero activity over a set period. + * Returns a MongoDB query filter object. + * Applicable Model: HirePurchaseContract + */ +export const buildInactiveContractsQuery = (options?: { + daysInactive?: number + currentDate?: Date +}) => { + const daysInactive = options?.daysInactive ?? 14 + const now = options?.currentDate || new Date() + const timeLimit = new Date(now.getTime() - daysInactive * 24 * 60 * 60 * 1000) + + return { + status: "ACTIVE", + updatedAt: { $lt: timeLimit }, + } +} + +/** + * 4. Underperforming Pools + * Flag vehicle pools falling below expected revenue metrics. + * Returns a MongoDB aggregation pipeline. + * Applicable Model: InvestmentPool + */ +export const buildUnderperformingPoolsPipeline = (options?: { + expectedRevenueField?: string + actualRevenueField?: string + tolerancePercentage?: number +}) => { + const tolerance = options?.tolerancePercentage ?? 0.8 + const expectedField = options?.expectedRevenueField ?? "targetAmountNgn" + const actualField = options?.actualRevenueField ?? "currentRaisedNgn" + + return [ + { + $match: { + status: { $in: ["OPEN", "FUNDED", "ACTIVE"] }, + }, + }, + { + $addFields: { + performanceRatio: { + $cond: [ + { $gt: [`$${expectedField}`, 0] }, + { $divide: [`$${actualField}`, `$${expectedField}`] }, + 1, // if expected is 0, default to ratio of 1 (not underperforming) + ], + }, + }, + }, + { + $match: { + performanceRatio: { $lt: tolerance }, + }, + }, + { + $sort: { performanceRatio: 1 }, + }, + ] +} + +/** + * 5. High-Value Wallet Funding + * Flag wallet top-ups exceeding a suspicious threshold. + * Returns a MongoDB query filter object. + * Applicable Model: Transaction + */ +export const buildHighValueWalletFundingQuery = (options?: { + suspiciousThresholdNgn?: number +}) => { + const threshold = options?.suspiciousThresholdNgn ?? 500000 // default 500k NGN + + return { + type: { $in: ["wallet_funding", "deposit"] }, + status: { $in: ["Completed", "PENDING", "Pending"] }, + amount: { $gt: threshold }, + } +} From b00fa67e5eb64c3e57867ace8678a76c38733758 Mon Sep 17 00:00:00 2001 From: Johnson Oyemade Date: Sun, 21 Jun 2026 23:49:22 +0100 Subject: [PATCH 2/5] feat: add admin risk summary and details API routes --- app/api/admin/risk/details/route.ts | 128 ++++++++++++++++++++++++++++ app/api/admin/risk/summary/route.ts | 57 +++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 app/api/admin/risk/details/route.ts create mode 100644 app/api/admin/risk/summary/route.ts diff --git a/app/api/admin/risk/details/route.ts b/app/api/admin/risk/details/route.ts new file mode 100644 index 0000000..8f8219b --- /dev/null +++ b/app/api/admin/risk/details/route.ts @@ -0,0 +1,128 @@ +import { NextResponse } from "next/server" + +import { getAuthenticatedUser, withSessionRefresh } from "@/lib/auth/current-user" +import dbConnect from "@/lib/dbConnect" +import HirePurchaseContract from "@/models/HirePurchaseContract" +import Transaction from "@/models/Transaction" +import InvestmentPool from "@/models/InvestmentPool" +import User from "@/models/User" // In case population needs the model registered +import { + buildLateRepaymentsQuery, + buildRepeatedFailedTransactionsPipeline, + buildInactiveContractsQuery, + buildUnderperformingPoolsPipeline, + buildHighValueWalletFundingQuery, +} from "@/lib/risk-helpers" + +export async function GET(request: Request) { + try { + const { user, shouldRefreshSession } = await getAuthenticatedUser(request) + if (!user) { + return NextResponse.json({ message: "Unauthorized" }, { status: 401 }) + } + + if (user.role !== "admin") { + return NextResponse.json({ message: "Forbidden" }, { status: 403 }) + } + + await dbConnect() + + const { searchParams } = new URL(request.url) + const type = searchParams.get("type") // e.g., late_repayments + const page = parseInt(searchParams.get("page") || "1") + const limit = parseInt(searchParams.get("limit") || "10") + const skip = (page - 1) * limit + + let records: any[] = [] + let total = 0 + + // Construct options from search params for flexibility + const options: any = {} + if (searchParams.get("daysInactive")) options.daysInactive = parseInt(searchParams.get("daysInactive")!) + if (searchParams.get("threshold")) options.threshold = parseInt(searchParams.get("threshold")!) + if (searchParams.get("daysFrame")) options.daysFrame = parseInt(searchParams.get("daysFrame")!) + if (searchParams.get("suspiciousThresholdNgn")) options.suspiciousThresholdNgn = parseInt(searchParams.get("suspiciousThresholdNgn")!) + + switch (type) { + case "late_repayments": { + const query = buildLateRepaymentsQuery(options) + total = await HirePurchaseContract.countDocuments(query) + records = await HirePurchaseContract.find(query) + .skip(skip) + .limit(limit) + .populate("driverUserId", "name email privyUserId") + .lean() + break + } + case "repeated_failed_transactions": { + const pipeline = buildRepeatedFailedTransactionsPipeline(options) + + // Count via aggregation + const countPipeline = [...pipeline, { $count: "total" }] + const countResult = await Transaction.aggregate(countPipeline) + total = countResult[0]?.total || 0 + + // Fetch data + const dataPipeline = [...pipeline, { $skip: skip }, { $limit: limit }] + records = await Transaction.aggregate(dataPipeline) + + // Populate User info (where _id is the grouped userId) + await User.populate(records, { path: "_id", select: "name email privyUserId" }) + break + } + case "inactive_contracts": { + const query = buildInactiveContractsQuery(options) + total = await HirePurchaseContract.countDocuments(query) + records = await HirePurchaseContract.find(query) + .skip(skip) + .limit(limit) + .populate("driverUserId", "name email privyUserId") + .lean() + break + } + case "underperforming_pools": { + const pipeline = buildUnderperformingPoolsPipeline(options) + + // Count + const countPipeline = [...pipeline, { $count: "total" }] + const countResult = await InvestmentPool.aggregate(countPipeline) + total = countResult[0]?.total || 0 + + // Data + const dataPipeline = [...pipeline, { $skip: skip }, { $limit: limit }] + records = await InvestmentPool.aggregate(dataPipeline) + break + } + case "high_value_wallet_funding": { + const query = buildHighValueWalletFundingQuery(options) + total = await Transaction.countDocuments(query) + records = await Transaction.find(query) + .skip(skip) + .limit(limit) + .populate("userId", "name email privyUserId") + .lean() + break + } + default: + return NextResponse.json({ message: "Invalid or missing risk type." }, { status: 400 }) + } + + const response = NextResponse.json({ + success: true, + data: { + records, + pagination: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }, + }) + + return shouldRefreshSession ? withSessionRefresh(response, user) : response + } catch (error) { + console.error("ADMIN_RISK_DETAILS_ERROR", error) + return NextResponse.json({ message: "Failed to load risk details." }, { status: 500 }) + } +} diff --git a/app/api/admin/risk/summary/route.ts b/app/api/admin/risk/summary/route.ts new file mode 100644 index 0000000..9772aa9 --- /dev/null +++ b/app/api/admin/risk/summary/route.ts @@ -0,0 +1,57 @@ +import { NextResponse } from "next/server" + +import { getAuthenticatedUser, withSessionRefresh } from "@/lib/auth/current-user" +import dbConnect from "@/lib/dbConnect" +import HirePurchaseContract from "@/models/HirePurchaseContract" +import Transaction from "@/models/Transaction" +import InvestmentPool from "@/models/InvestmentPool" +import { + buildLateRepaymentsQuery, + buildRepeatedFailedTransactionsPipeline, + buildInactiveContractsQuery, + buildUnderperformingPoolsPipeline, + buildHighValueWalletFundingQuery, +} from "@/lib/risk-helpers" + +export async function GET(request: Request) { + try { + const { user, shouldRefreshSession } = await getAuthenticatedUser(request) + if (!user) { + return NextResponse.json({ message: "Unauthorized" }, { status: 401 }) + } + + if (user.role !== "admin") { + return NextResponse.json({ message: "Forbidden" }, { status: 403 }) + } + + await dbConnect() + + const [ + lateRepaymentsCount, + failedTransactionsResult, + inactiveContractsCount, + underperformingPoolsResult, + highValueFundingCount, + ] = await Promise.all([ + HirePurchaseContract.countDocuments(buildLateRepaymentsQuery()), + Transaction.aggregate(buildRepeatedFailedTransactionsPipeline()), + HirePurchaseContract.countDocuments(buildInactiveContractsQuery()), + InvestmentPool.aggregate(buildUnderperformingPoolsPipeline()), + Transaction.countDocuments(buildHighValueWalletFundingQuery()), + ]) + + const summary = { + lateRepayments: lateRepaymentsCount, + repeatedFailedTransactions: failedTransactionsResult.length, + inactiveContracts: inactiveContractsCount, + underperformingPools: underperformingPoolsResult.length, + highValueWalletFundings: highValueFundingCount, + } + + const response = NextResponse.json({ success: true, summary }) + return shouldRefreshSession ? withSessionRefresh(response, user) : response + } catch (error) { + console.error("ADMIN_RISK_SUMMARY_ERROR", error) + return NextResponse.json({ message: "Failed to load risk summary." }, { status: 500 }) + } +} From 4adae26b8bc663da73ea0100c9413ca3438c653f Mon Sep 17 00:00:00 2001 From: Johnson Oyemade Date: Sun, 21 Jun 2026 23:50:58 +0100 Subject: [PATCH 3/5] feat: add admin risk UI components --- components/admin/risk/RiskDataTable.tsx | 90 ++++++++++++++++++++++ components/admin/risk/RiskDetailModal.tsx | 63 +++++++++++++++ components/admin/risk/RiskFilterBar.tsx | 82 ++++++++++++++++++++ components/admin/risk/RiskSummaryCards.tsx | 48 ++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 components/admin/risk/RiskDataTable.tsx create mode 100644 components/admin/risk/RiskDetailModal.tsx create mode 100644 components/admin/risk/RiskFilterBar.tsx create mode 100644 components/admin/risk/RiskSummaryCards.tsx diff --git a/components/admin/risk/RiskDataTable.tsx b/components/admin/risk/RiskDataTable.tsx new file mode 100644 index 0000000..09ad093 --- /dev/null +++ b/components/admin/risk/RiskDataTable.tsx @@ -0,0 +1,90 @@ +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { Badge } from "@/components/ui/badge" + +interface RiskDataTableProps { + data: any[] + isLoading?: boolean + onRowClick: (record: any) => void +} + +export function RiskDataTable({ data, isLoading, onRowClick }: RiskDataTableProps) { + if (isLoading) { + return ( +
+ Loading records... +
+ ) + } + + if (!data || data.length === 0) { + return ( +
+ No risk records found matching the current criteria. +
+ ) + } + + return ( +
+ + + + Date + Entity + Risk Signal + Admin Status + + + + {data.map((record, index) => { + // Flexible property resolution based on the record type + const user = record.driverUserId || record.userId || {} + const entityName = user.name || user.email || record._id?.name || record._id?.email || "Unknown User/Entity" + + // Generate a simple signal description + let riskSignal = "Flagged Activity" + if (record.amount !== undefined) riskSignal = `Amount: ${record.amount}` + if (record.failedCount !== undefined) riskSignal = `${record.failedCount} Failed TXNs` + if (record.performanceRatio !== undefined) riskSignal = `Ratio: ${(record.performanceRatio * 100).toFixed(1)}%` + if (record.nextDueDate !== undefined) riskSignal = `Due: ${new Date(record.nextDueDate).toLocaleDateString()}` + + // Date processing + const recordDate = record.createdAt || record.timestamp || record.latestFailure || record.updatedAt + const dateStr = recordDate ? new Date(recordDate).toLocaleDateString() : "N/A" + + // Fake review status badge logic for demonstration + const reviewStatus = record.adminReviewStatus || "Pending Review" + const isPending = reviewStatus === "Pending Review" || reviewStatus === "Pending" + + return ( + onRowClick(record)} + > + {dateStr} + {entityName} + {riskSignal} + + + {reviewStatus} + + + + ) + })} + +
+
+ ) +} diff --git a/components/admin/risk/RiskDetailModal.tsx b/components/admin/risk/RiskDetailModal.tsx new file mode 100644 index 0000000..4b92370 --- /dev/null +++ b/components/admin/risk/RiskDetailModal.tsx @@ -0,0 +1,63 @@ +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from "@/components/ui/dialog" +import { Button } from "@/components/ui/button" + +interface RiskDetailModalProps { + isOpen: boolean + onClose: () => void + record: any | null +} + +export function RiskDetailModal({ isOpen, onClose, record }: RiskDetailModalProps) { + if (!record) return null + + return ( + !open && onClose()}> + + + Risk Record Details + + Inspect the details of this flagged record to determine the necessary administrative action. + + + +
+
+
+              {JSON.stringify(record, null, 2)}
+            
+
+ +
+

Admin Action

+

+ What would you like to do with this flagged record? Actions will be implemented in the next phase. +

+
+
+ + + + + + +
+
+ ) +} diff --git a/components/admin/risk/RiskFilterBar.tsx b/components/admin/risk/RiskFilterBar.tsx new file mode 100644 index 0000000..a3e3825 --- /dev/null +++ b/components/admin/risk/RiskFilterBar.tsx @@ -0,0 +1,82 @@ +import { Input } from "@/components/ui/input" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { Button } from "@/components/ui/button" + +interface RiskFilterBarProps { + filters: { + type: string + status: string + role: string + dateRange: string + } + onFilterChange: (key: string, value: string) => void + onClearFilters: () => void +} + +export function RiskFilterBar({ filters, onFilterChange, onClearFilters }: RiskFilterBarProps) { + return ( +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ onFilterChange("dateRange", e.target.value)} + placeholder="Filter by Date" + /> +
+ +
+ +
+
+ ) +} diff --git a/components/admin/risk/RiskSummaryCards.tsx b/components/admin/risk/RiskSummaryCards.tsx new file mode 100644 index 0000000..a881bd8 --- /dev/null +++ b/components/admin/risk/RiskSummaryCards.tsx @@ -0,0 +1,48 @@ +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { AlertCircle, Clock, ShieldAlert, TrendingDown, Wallet } from "lucide-react" + +interface RiskSummaryCardsProps { + summary: { + lateRepayments: number + repeatedFailedTransactions: number + inactiveContracts: number + underperformingPools: number + highValueWalletFundings: number + } | null + isLoading?: boolean +} + +export function RiskSummaryCards({ summary, isLoading }: RiskSummaryCardsProps) { + const cards = [ + { title: "Late Repayments", value: summary?.lateRepayments, icon: Clock, color: "text-amber-500" }, + { title: "Failed Transactions", value: summary?.repeatedFailedTransactions, icon: AlertCircle, color: "text-red-500" }, + { title: "Inactive Contracts", value: summary?.inactiveContracts, icon: ShieldAlert, color: "text-slate-500" }, + { title: "Underperforming Pools", value: summary?.underperformingPools, icon: TrendingDown, color: "text-orange-500" }, + { title: "High-Value Flags", value: summary?.highValueWalletFundings, icon: Wallet, color: "text-purple-500" }, + ] + + return ( +
+ {cards.map((card, i) => { + const Icon = card.icon + return ( + + + {card.title} + + + +
+ {isLoading ? ( +
+ ) : ( + (card.value ?? 0) + )} +
+ + + ) + })} +
+ ) +} From 96992b147fa2b7cf32f1cbad4c7d88b0b5381570 Mon Sep 17 00:00:00 2001 From: Johnson Oyemade Date: Sun, 21 Jun 2026 23:52:35 +0100 Subject: [PATCH 4/5] feat: add admin risk dashboard page --- app/admin/risk/page.tsx | 154 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 app/admin/risk/page.tsx diff --git a/app/admin/risk/page.tsx b/app/admin/risk/page.tsx new file mode 100644 index 0000000..0004fbf --- /dev/null +++ b/app/admin/risk/page.tsx @@ -0,0 +1,154 @@ +"use client" + +import { useState, useEffect, useCallback } from "react" +import { RiskSummaryCards } from "@/components/admin/risk/RiskSummaryCards" +import { RiskFilterBar } from "@/components/admin/risk/RiskFilterBar" +import { RiskDataTable } from "@/components/admin/risk/RiskDataTable" +import { RiskDetailModal } from "@/components/admin/risk/RiskDetailModal" +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" +import { AlertCircle } from "lucide-react" + +export default function AdminRiskDashboard() { + const [summary, setSummary] = useState(null) + const [isSummaryLoading, setIsSummaryLoading] = useState(true) + const [summaryError, setSummaryError] = useState(null) + + const [details, setDetails] = useState([]) + const [isDetailsLoading, setIsDetailsLoading] = useState(false) + const [detailsError, setDetailsError] = useState(null) + + const [filters, setFilters] = useState({ + type: "late_repayments", + status: "all", + role: "all", + dateRange: "", + }) + + const [selectedRecord, setSelectedRecord] = useState(null) + const [isModalOpen, setIsModalOpen] = useState(false) + + const fetchSummary = async () => { + try { + setIsSummaryLoading(true) + setSummaryError(null) + const res = await fetch("/api/admin/risk/summary") + if (!res.ok) { + if (res.status === 401 || res.status === 403) throw new Error("Unauthorized access.") + throw new Error("Failed to fetch risk summary.") + } + const data = await res.json() + setSummary(data.summary) + } catch (err: any) { + setSummaryError(err.message || "An error occurred.") + } finally { + setIsSummaryLoading(false) + } + } + + const fetchDetails = useCallback(async () => { + try { + setIsDetailsLoading(true) + setDetailsError(null) + + const queryParams = new URLSearchParams({ + type: filters.type, + page: "1", + limit: "50", + }) + + if (filters.status !== "all") queryParams.append("status", filters.status) + if (filters.role !== "all") queryParams.append("role", filters.role) + if (filters.dateRange) queryParams.append("dateRange", filters.dateRange) + + const res = await fetch(`/api/admin/risk/details?${queryParams.toString()}`) + if (!res.ok) { + if (res.status === 401 || res.status === 403) throw new Error("Unauthorized access.") + throw new Error("Failed to fetch risk details.") + } + const data = await res.json() + setDetails(data.data.records) + } catch (err: any) { + setDetailsError(err.message || "An error occurred.") + } finally { + setIsDetailsLoading(false) + } + }, [filters]) + + // Fetch summary on mount + useEffect(() => { + fetchSummary() + }, []) + + // Fetch details whenever filters change + useEffect(() => { + fetchDetails() + }, [fetchDetails]) + + const handleFilterChange = (key: string, value: string) => { + setFilters(prev => ({ ...prev, [key]: value })) + } + + const handleClearFilters = () => { + setFilters({ + type: "late_repayments", + status: "all", + role: "all", + dateRange: "", + }) + } + + const handleRowClick = (record: any) => { + setSelectedRecord(record) + setIsModalOpen(true) + } + + return ( +
+
+

Risk Dashboard

+

+ Monitor and take action on system-wide risk signals and flagged entities. +

+
+ + {summaryError && ( + + + Error loading summary + {summaryError} + + )} + + + +
+

Risk Details

+ + + {detailsError ? ( + + + Error loading details + {detailsError} + + ) : ( + + )} +
+ + setIsModalOpen(false)} + record={selectedRecord} + /> +
+ ) +} From 96e97cfd13fa38971bbec5f990b0e621dd104168 Mon Sep 17 00:00:00 2001 From: Johnson Oyemade Date: Mon, 22 Jun 2026 09:23:40 +0100 Subject: [PATCH 5/5] fix: resolve CI/CD failures (unused import and TS typing) --- bun.lock | 102 ++++++++++++++++++++++++++++++++++++++++++-- lib/risk-helpers.ts | 5 +-- package.json | 1 + 3 files changed, 102 insertions(+), 6 deletions(-) diff --git a/bun.lock b/bun.lock index 46c0c4f..c40c255 100644 --- a/bun.lock +++ b/bun.lock @@ -40,6 +40,7 @@ "@solana-program/token": "^0.6.0", "@solana/kit": "^3.0.3", "@solana/sysvars": "^6.0.1", + "@stellar/stellar-sdk": "^14.6.1", "@tanstack/react-query": "^5.81.2", "@vercel/blob": "^2.3.3", "autoprefixer": "^10.4.20", @@ -68,6 +69,7 @@ "react-resizable-panels": "^2.1.7", "recharts": "latest", "resend": "^4.0.0", + "server-only": "^0.0.1", "sonner": "^1.7.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", @@ -79,9 +81,11 @@ "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.6.4", "@testing-library/react": "^16.0.1", + "@types/jest": "^30.0.0", "@types/node": "^22", "@types/react": "^19", "@types/react-dom": "^19", + "@types/use-sync-external-store": "^1.5.0", "eslint": "^9.39.2", "eslint-config-next": "^16.2.3", "jsdom": "^25.0.1", @@ -329,6 +333,18 @@ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@jest/diff-sequences": ["@jest/diff-sequences@30.4.0", "", {}, "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g=="], + + "@jest/expect-utils": ["@jest/expect-utils@30.4.1", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ=="], + + "@jest/get-type": ["@jest/get-type@30.1.0", "", {}, "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA=="], + + "@jest/pattern": ["@jest/pattern@30.4.0", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.4.0" } }, "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg=="], + + "@jest/schemas": ["@jest/schemas@30.4.1", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q=="], + + "@jest/types": ["@jest/types@30.4.1", "", { "dependencies": { "@jest/pattern": "30.4.0", "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -653,6 +669,8 @@ "@simplewebauthn/browser": ["@simplewebauthn/browser@13.2.2", "https://registry.npmmirror.com/@simplewebauthn/browser/-/browser-13.2.2.tgz", {}, "sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.49", "", {}, "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A=="], + "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "https://registry.npmmirror.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], "@solana-program/compute-budget": ["@solana-program/compute-budget@0.13.0", "https://registry.npmmirror.com/@solana-program/compute-budget/-/compute-budget-0.13.0.tgz", { "peerDependencies": { "@solana/kit": "^6.0.0" } }, "sha512-jdiiWaxFG3kEf6bYPNo2mwz2jNxaj7sF+gZIb8wHw9zK3ZILmpkg4sUeChb1BnH2UGf+HgYb9L/lMdqOTqUoWA=="], @@ -745,6 +763,12 @@ "@solana/wallet-standard-features": ["@solana/wallet-standard-features@1.3.0", "https://registry.npmmirror.com/@solana/wallet-standard-features/-/wallet-standard-features-1.3.0.tgz", { "dependencies": { "@wallet-standard/base": "^1.1.0", "@wallet-standard/features": "^1.1.0" } }, "sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg=="], + "@stellar/js-xdr": ["@stellar/js-xdr@3.1.2", "", {}, "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ=="], + + "@stellar/stellar-base": ["@stellar/stellar-base@14.1.0", "", { "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" } }, "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw=="], + + "@stellar/stellar-sdk": ["@stellar/stellar-sdk@14.6.1", "", { "dependencies": { "@stellar/stellar-base": "^14.1.0", "axios": "^1.13.3", "bignumber.js": "^9.3.1", "commander": "^14.0.2", "eventsource": "^2.0.2", "feaxios": "^0.0.23", "randombytes": "^2.1.0", "toml": "^3.0.0", "urijs": "^1.19.1" }, "bin": { "stellar-js": "bin/stellar-js" } }, "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg=="], + "@swc/helpers": ["@swc/helpers@0.5.15", "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.15.tgz", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], "@tanstack/query-core": ["@tanstack/query-core@5.81.5", "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.81.5.tgz", {}, "sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q=="], @@ -787,6 +811,14 @@ "@types/estree": ["@types/estree@1.0.8", "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/jest": ["@types/jest@30.0.0", "", { "dependencies": { "expect": "^30.0.0", "pretty-format": "^30.0.0" } }, "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], "@types/json5": ["@types/json5@0.0.29", "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], @@ -801,14 +833,22 @@ "@types/react-dom": ["@types/react-dom@19.1.6", "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.1.6.tgz", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw=="], + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + "@types/stylis": ["@types/stylis@4.2.7", "https://registry.npmmirror.com/@types/stylis/-/stylis-4.2.7.tgz", {}, "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA=="], "@types/trusted-types": ["@types/trusted-types@2.0.7", "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + "@types/use-sync-external-store": ["@types/use-sync-external-store@1.5.0", "", {}, "sha512-5dyB8nLC/qogMrlCizZnYWQTA4lnb/v+It+sqNl5YnSRAPMlIqY/X0Xn+gZw8vOL+TgTTr28VEbn3uf8fUtAkw=="], + "@types/webidl-conversions": ["@types/webidl-conversions@7.0.3", "https://registry.npmmirror.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", {}, "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="], "@types/whatwg-url": ["@types/whatwg-url@11.0.5", "https://registry.npmmirror.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", { "dependencies": { "@types/webidl-conversions": "*" } }, "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ=="], + "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.56.0", "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/type-utils": "8.56.0", "@typescript-eslint/utils": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.56.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.56.0", "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.56.0.tgz", { "dependencies": { "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg=="], @@ -1011,6 +1051,8 @@ "base-x": ["base-x@5.0.1", "https://registry.npmmirror.com/base-x/-/base-x-5.0.1.tgz", {}, "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg=="], + "base32.js": ["base32.js@0.1.0", "", {}, "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ=="], + "base64-js": ["base64-js@1.5.1", "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="], @@ -1019,6 +1061,8 @@ "big.js": ["big.js@6.2.2", "https://registry.npmmirror.com/big.js/-/big.js-6.2.2.tgz", {}, "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ=="], + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + "binary-extensions": ["binary-extensions@2.3.0", "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "blakejs": ["blakejs@1.2.1", "https://registry.npmmirror.com/blakejs/-/blakejs-1.2.1.tgz", {}, "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="], @@ -1073,6 +1117,8 @@ "chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + "class-variance-authority": ["class-variance-authority@0.7.1", "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], "client-only": ["client-only@0.0.1", "https://registry.npmmirror.com/client-only/-/client-only-0.0.1.tgz", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], @@ -1091,7 +1137,7 @@ "combined-stream": ["combined-stream@1.0.8", "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@4.1.1", "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + "commander": ["commander@14.0.3", "https://registry.npmmirror.com/commander/-/commander-14.0.3.tgz", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], "concat-map": ["concat-map@0.0.1", "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], @@ -1325,6 +1371,10 @@ "events": ["events@3.3.0", "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + "eventsource": ["eventsource@2.0.2", "", {}, "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA=="], + + "expect": ["expect@30.4.1", "", { "dependencies": { "@jest/expect-utils": "30.4.1", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.4.1", "jest-message-util": "30.4.1", "jest-mock": "30.4.1", "jest-util": "30.4.1" } }, "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA=="], + "expect-type": ["expect-type@1.3.0", "https://registry.npmmirror.com/expect-type/-/expect-type-1.3.0.tgz", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "extension-port-stream": ["extension-port-stream@3.0.0", "https://registry.npmmirror.com/extension-port-stream/-/extension-port-stream-3.0.0.tgz", { "dependencies": { "readable-stream": "^3.6.2 || ^4.4.2", "webextension-polyfill": ">=0.10.0 <1.0" } }, "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw=="], @@ -1353,6 +1403,8 @@ "fdir": ["fdir@6.4.6", "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + "feaxios": ["feaxios@0.0.23", "", { "dependencies": { "is-retry-allowed": "^3.0.0" } }, "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g=="], + "fetch-retry": ["fetch-retry@6.0.0", "https://registry.npmmirror.com/fetch-retry/-/fetch-retry-6.0.0.tgz", {}, "sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag=="], "file-entry-cache": ["file-entry-cache@8.0.0", "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], @@ -1411,6 +1463,8 @@ "gopd": ["gopd@1.2.0", "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "h3": ["h3@1.15.11", "https://registry.npmmirror.com/h3/-/h3-1.15.11.tgz", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], "has-bigints": ["has-bigints@1.1.0", "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], @@ -1515,6 +1569,8 @@ "is-regex": ["is-regex@1.2.1", "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + "is-retry-allowed": ["is-retry-allowed@3.0.0", "", {}, "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A=="], + "is-set": ["is-set@2.0.3", "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], @@ -1543,6 +1599,18 @@ "jackspeak": ["jackspeak@3.4.3", "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + "jest-diff": ["jest-diff@30.4.1", "", { "dependencies": { "@jest/diff-sequences": "30.4.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.4.1" } }, "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA=="], + + "jest-matcher-utils": ["jest-matcher-utils@30.4.1", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.4.1", "pretty-format": "30.4.1" } }, "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A=="], + + "jest-message-util": ["jest-message-util@30.4.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-util": "30.4.1", "picomatch": "^4.0.3", "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ=="], + + "jest-mock": ["jest-mock@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "jest-util": "30.4.1" } }, "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw=="], + + "jest-regex-util": ["jest-regex-util@30.4.0", "", {}, "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg=="], + + "jest-util": ["jest-util@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw=="], + "jiti": ["jiti@1.21.7", "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], "jose": ["jose@6.0.11", "https://registry.npmmirror.com/jose/-/jose-6.0.11.tgz", {}, "sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg=="], @@ -1847,6 +1915,8 @@ "radix3": ["radix3@1.1.2", "https://registry.npmmirror.com/radix3/-/radix3-1.1.2.tgz", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + "react": ["react@19.2.4", "https://registry.npmmirror.com/react/-/react-19.2.4.tgz", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], "react-day-picker": ["react-day-picker@8.10.1", "https://registry.npmmirror.com/react-day-picker/-/react-day-picker-8.10.1.tgz", { "peerDependencies": { "date-fns": "^2.28.0 || ^3.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA=="], @@ -1859,6 +1929,10 @@ "react-is": ["react-is@18.3.1", "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "react-is-18": ["react-is@18.3.1", "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "react-is-19": ["react-is@19.2.7", "", {}, "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A=="], + "react-promise-suspense": ["react-promise-suspense@0.3.4", "https://registry.npmmirror.com/react-promise-suspense/-/react-promise-suspense-0.3.4.tgz", { "dependencies": { "fast-deep-equal": "^2.0.1" } }, "sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ=="], "react-remove-scroll": ["react-remove-scroll@2.7.1", "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA=="], @@ -1937,6 +2011,8 @@ "semver": ["semver@7.7.2", "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "server-only": ["server-only@0.0.1", "", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="], + "set-blocking": ["set-blocking@2.0.0", "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], "set-cookie-parser": ["set-cookie-parser@2.7.2", "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], @@ -1971,6 +2047,8 @@ "signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + "slow-redact": ["slow-redact@0.3.2", "https://registry.npmmirror.com/slow-redact/-/slow-redact-0.3.2.tgz", {}, "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw=="], "socket.io-client": ["socket.io-client@4.8.1", "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-4.8.1.tgz", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ=="], @@ -1991,6 +2069,8 @@ "stable-hash": ["stable-hash@0.0.5", "https://registry.npmmirror.com/stable-hash/-/stable-hash-0.0.5.tgz", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + "stackback": ["stackback@0.0.2", "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], "std-env": ["std-env@3.10.0", "https://registry.npmmirror.com/std-env/-/std-env-3.10.0.tgz", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], @@ -2085,6 +2165,8 @@ "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + "tough-cookie": ["tough-cookie@5.1.2", "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.1.2.tgz", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="], "tr46": ["tr46@5.1.1", "https://registry.npmmirror.com/tr46/-/tr46-5.1.1.tgz", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="], @@ -2133,6 +2215,8 @@ "uri-js": ["uri-js@4.4.1", "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "urijs": ["urijs@1.19.11", "", {}, "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="], + "use-callback-ref": ["use-callback-ref@1.3.3", "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], "use-sidecar": ["use-sidecar@1.1.3", "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.3.tgz", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], @@ -2473,10 +2557,14 @@ "@solana/sysvars/@solana/rpc-types": ["@solana/rpc-types@6.1.0", "https://registry.npmmirror.com/@solana/rpc-types/-/rpc-types-6.1.0.tgz", { "dependencies": { "@solana/addresses": "6.1.0", "@solana/codecs-core": "6.1.0", "@solana/codecs-numbers": "6.1.0", "@solana/codecs-strings": "6.1.0", "@solana/errors": "6.1.0", "@solana/nominal-types": "6.1.0" }, "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-lR+Cb3v5Rpl49HsXWASy++TSE1AD86eRKabY+iuWnbBMYVGI4MamAvYwgBiygsCNc30nyO2TFNj9STMeSD/gAg=="], + "@stellar/stellar-base/@noble/curves": ["@noble/curves@1.9.7", "https://registry.npmmirror.com/@noble/curves/-/curves-1.9.7.tgz", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@testing-library/jest-dom/aria-query": ["aria-query@5.3.2", "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], "@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], + "@types/jest/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "@typescript-eslint/parser/debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -2593,6 +2681,12 @@ "is-bun-module/semver": ["semver@7.7.4", "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "jest-diff/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="], + + "jest-matcher-utils/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="], + + "jest-message-util/pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="], + "json-rpc-engine/@metamask/safe-event-emitter": ["@metamask/safe-event-emitter@2.0.0", "https://registry.npmmirror.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", {}, "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q=="], "keccak/readable-stream": ["readable-stream@3.6.2", "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -2621,6 +2715,8 @@ "socket.io-parser/debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + "string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -2629,6 +2725,8 @@ "styled-components/postcss": ["postcss@8.4.49", "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + "sucrase/commander": ["commander@4.1.1", "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + "unstorage/chokidar": ["chokidar@4.0.3", "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], "viem/ws": ["ws@8.18.2", "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" } }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], @@ -2849,8 +2947,6 @@ "@solana/sysvars/@solana/errors/chalk": ["chalk@5.6.2", "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "@solana/sysvars/@solana/errors/commander": ["commander@14.0.3", "https://registry.npmmirror.com/commander/-/commander-14.0.3.tgz", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], - "@solana/sysvars/@solana/rpc-types/@solana/addresses": ["@solana/addresses@6.1.0", "https://registry.npmmirror.com/@solana/addresses/-/addresses-6.1.0.tgz", { "dependencies": { "@solana/assertions": "6.1.0", "@solana/codecs-core": "6.1.0", "@solana/codecs-strings": "6.1.0", "@solana/errors": "6.1.0", "@solana/nominal-types": "6.1.0" }, "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-QT04Vie4iICaalQQRJFMGj/P56IxXiwFtVuZHu1qjZUNmuGTOvX6G98b27RaGtLzpJ3NIku/6OtKxLUBqAKAyQ=="], "@solana/sysvars/@solana/rpc-types/@solana/codecs-core": ["@solana/codecs-core@6.1.0", "https://registry.npmmirror.com/@solana/codecs-core/-/codecs-core-6.1.0.tgz", { "dependencies": { "@solana/errors": "6.1.0" }, "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-5rNnDOOm2GRFMJbd9imYCPNvGOrQ+TZ53NCkFFWbbB7f+L9KkLeuuAsDMFN1lCziJFlymvN785YtDnMeWj2W+g=="], diff --git a/lib/risk-helpers.ts b/lib/risk-helpers.ts index dae64c3..782362f 100644 --- a/lib/risk-helpers.ts +++ b/lib/risk-helpers.ts @@ -1,4 +1,3 @@ -import mongoose from "mongoose" /** * 1. Late Repayments @@ -54,7 +53,7 @@ export const buildRepeatedFailedTransactionsPipeline = (options?: { }, }, { - $sort: { failedCount: -1 }, + $sort: { failedCount: -1 as const }, }, ] } @@ -117,7 +116,7 @@ export const buildUnderperformingPoolsPipeline = (options?: { }, }, { - $sort: { performanceRatio: 1 }, + $sort: { performanceRatio: 1 as const }, }, ] } diff --git a/package.json b/package.json index d431b63..6563b2e 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "@types/node": "^22", "@types/react": "^19", "@types/react-dom": "^19", + "@types/use-sync-external-store": "^1.5.0", "eslint": "^9.39.2", "eslint-config-next": "^16.2.3", "jsdom": "^25.0.1",