From 9d11c1fd94c435da86e2093225ba1bf4a1d16a3a Mon Sep 17 00:00:00 2001 From: JoelVR17 Date: Fri, 13 Mar 2026 03:45:45 -0600 Subject: [PATCH 1/2] feat: investor implementation --- apps/backoffice-tokenization/.env.example | 9 +- .../src/lib/httpClient.ts | 6 + apps/core/package.json | 1 + .../src/investments/investments.controller.ts | 13 +- .../src/investments/investments.service.ts | 8 + apps/core/src/main.ts | 5 +- apps/core/src/prisma/prisma.service.ts | 14 + .../src/token-sale/token-sale.controller.ts | 2 +- apps/investor-tokenization/.env.example | 6 +- .../src/app/my-investments/page.tsx | 109 +++++- .../components/ui/apple-cards-carousel.tsx | 2 + .../claim-roi/services/claim.service.ts | 26 +- .../features/investments/InvestmentsView.tsx | 49 +-- .../investments/components/InvestmentCard.tsx | 249 +++++-------- .../hooks/useUserInvestments.hook.ts | 161 +------- .../services/investment.service.ts | 45 +++ .../roi/components/campaign-filter.tsx | 6 +- .../features/roi/constants/campaign-status.ts | 8 +- .../src/features/roi/data/mock-campaigns.ts | 9 +- .../src/features/roi/types/campaign.types.ts | 29 +- .../tokens/components/InvestDialog.tsx | 131 ++----- .../tokens/context/SelectedEscrowContext.tsx | 1 + .../features/tokens/services/token.service.ts | 27 +- .../src/features/transparency/ProjectCard.tsx | 40 +- .../src/features/transparency/ProjectList.tsx | 104 +++--- .../transparency/services/campaign.service.ts | 7 + .../src/features/transparency/types.ts | 1 + .../src/lib/httpClient.ts | 6 + package-lock.json | 349 +++++------------- packages/shared/package.json | 3 +- packages/shared/src/index.ts | 1 + packages/shared/src/lib/httpClient.ts | 15 + 32 files changed, 617 insertions(+), 825 deletions(-) create mode 100644 apps/backoffice-tokenization/src/lib/httpClient.ts create mode 100644 apps/investor-tokenization/src/features/transparency/services/campaign.service.ts create mode 100644 apps/investor-tokenization/src/features/transparency/types.ts create mode 100644 apps/investor-tokenization/src/lib/httpClient.ts create mode 100644 packages/shared/src/lib/httpClient.ts diff --git a/apps/backoffice-tokenization/.env.example b/apps/backoffice-tokenization/.env.example index e4465ea..aff2275 100644 --- a/apps/backoffice-tokenization/.env.example +++ b/apps/backoffice-tokenization/.env.example @@ -1,8 +1,11 @@ # Trustless Work API Configuration -NEXT_PUBLIC_API_KEY="" +NEXT_PUBLIC_API_KEY= # Server-side only (for contract deployment) -SOURCE_SECRET="" +SOURCE_SECRET= # Core API URL (NestJS backend) -NEXT_PUBLIC_CORE_API_URL="http://localhost:4000" \ No newline at end of file +NEXT_PUBLIC_CORE_API_URL=http://localhost:4000 + +# Core API Authentication +NEXT_PUBLIC_BACKOFFICE_API_KEY= diff --git a/apps/backoffice-tokenization/src/lib/httpClient.ts b/apps/backoffice-tokenization/src/lib/httpClient.ts new file mode 100644 index 0000000..6ff496d --- /dev/null +++ b/apps/backoffice-tokenization/src/lib/httpClient.ts @@ -0,0 +1,6 @@ +import { createHttpClient } from "@tokenization/shared/lib/httpClient"; + +export const httpClient = createHttpClient({ + baseURL: process.env.NEXT_PUBLIC_CORE_API_URL ?? "http://localhost:4000", + apiKey: process.env.NEXT_PUBLIC_BACKOFFICE_API_KEY ?? "", +}); diff --git a/apps/core/package.json b/apps/core/package.json index d80349a..84a7b14 100644 --- a/apps/core/package.json +++ b/apps/core/package.json @@ -32,6 +32,7 @@ "@stellar/stellar-sdk": "^14.6.1", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", + "dotenv": "^16.6.1", "prisma": "^6.19.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1" diff --git a/apps/core/src/investments/investments.controller.ts b/apps/core/src/investments/investments.controller.ts index fa5aa8f..28edfd7 100644 --- a/apps/core/src/investments/investments.controller.ts +++ b/apps/core/src/investments/investments.controller.ts @@ -4,16 +4,16 @@ import { CreateInvestmentDto } from './dto/create-investment.dto'; @Controller('investments') export class InvestmentsController { - constructor(private readonly investmentsService: InvestmentsService) {} + constructor(private readonly investmentsService: InvestmentsService) { } @Get() findAll() { return this.investmentsService.findAll(); } - @Get(':id') - findOne(@Param('id') id: string) { - return this.investmentsService.findOne(id); + @Get('investor/:address') + findByInvestor(@Param('address') address: string) { + return this.investmentsService.findByInvestor(address); } @Get('campaign/:campaignId') @@ -21,6 +21,11 @@ export class InvestmentsController { return this.investmentsService.findByCampaign(campaignId); } + @Get(':id') + findOne(@Param('id') id: string) { + return this.investmentsService.findOne(id); + } + @Post() create(@Body() dto: CreateInvestmentDto) { return this.investmentsService.create(dto); diff --git a/apps/core/src/investments/investments.service.ts b/apps/core/src/investments/investments.service.ts index d1e2dee..fee3208 100644 --- a/apps/core/src/investments/investments.service.ts +++ b/apps/core/src/investments/investments.service.ts @@ -24,6 +24,14 @@ export class InvestmentsService { return investment; } + findByInvestor(investorAddress: string) { + return this.prisma.investment.findMany({ + where: { investorAddress }, + orderBy: { createdAt: 'desc' }, + include: { campaign: true }, + }); + } + findByCampaign(campaignId: string) { return this.prisma.investment.findMany({ where: { campaignId }, diff --git a/apps/core/src/main.ts b/apps/core/src/main.ts index b0bfd45..5da6d98 100644 --- a/apps/core/src/main.ts +++ b/apps/core/src/main.ts @@ -1,3 +1,5 @@ +import 'dotenv/config'; + import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; @@ -10,11 +12,12 @@ async function bootstrap() { app.enableCors({ origin: ['http://localhost:3000', 'http://localhost:3001'], methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], - allowedHeaders: ['Content-Type', 'Authorization'], + allowedHeaders: ['Content-Type', 'Authorization', 'x-api-key'], }); app.useGlobalPipes(new ValidationPipe({ whitelist: true })); app.useGlobalGuards(new ApiKeyGuard()); await app.listen(process.env.PORT ?? 4000); + console.log(`Core API is running on port ${process.env.PORT ?? 4000}`); } bootstrap(); diff --git a/apps/core/src/prisma/prisma.service.ts b/apps/core/src/prisma/prisma.service.ts index 7ffd32d..7a0e616 100644 --- a/apps/core/src/prisma/prisma.service.ts +++ b/apps/core/src/prisma/prisma.service.ts @@ -1,11 +1,25 @@ import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; +function buildDatasourceUrl(): string | undefined { + const raw = process.env.DATABASE_URL; + if (!raw) return undefined; + if (raw.includes('pgbouncer=true')) return raw; + const separator = raw.includes('?') ? '&' : '?'; + return `${raw}${separator}pgbouncer=true`; +} + @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { + constructor() { + super({ + datasources: { db: { url: buildDatasourceUrl() } }, + }); + } + async onModuleInit() { await this.$connect(); } diff --git a/apps/core/src/token-sale/token-sale.controller.ts b/apps/core/src/token-sale/token-sale.controller.ts index e8a09c3..7c1705a 100644 --- a/apps/core/src/token-sale/token-sale.controller.ts +++ b/apps/core/src/token-sale/token-sale.controller.ts @@ -7,7 +7,7 @@ import { SetAdminDto } from './dto/set-admin.dto'; @Controller('token-sale') export class TokenSaleController { - constructor(private readonly tokenSaleService: TokenSaleService) {} + constructor(private readonly tokenSaleService: TokenSaleService) { } // ── POST endpoints (writes) ── diff --git a/apps/investor-tokenization/.env.example b/apps/investor-tokenization/.env.example index 04a49f1..278ad15 100644 --- a/apps/investor-tokenization/.env.example +++ b/apps/investor-tokenization/.env.example @@ -7,4 +7,8 @@ NEXT_PUBLIC_DEFAULT_USDC_ADDRESS= NEXT_PUBLIC_API_KEY= # Server-side only (for contract deployment) -SOURCE_SECRET= \ No newline at end of file +SOURCE_SECRET= + +# Core API Authentication +NEXT_PUBLIC_INVESTORS_API_KEY= +NEXT_PUBLIC_CORE_API_URL=http://localhost:4000 diff --git a/apps/investor-tokenization/src/app/my-investments/page.tsx b/apps/investor-tokenization/src/app/my-investments/page.tsx index 3492a56..ae48ad2 100644 --- a/apps/investor-tokenization/src/app/my-investments/page.tsx +++ b/apps/investor-tokenization/src/app/my-investments/page.tsx @@ -1,18 +1,57 @@ "use client"; -import { useState, useMemo } from "react"; +import { useState, useMemo, useCallback } from "react"; import { SectionTitle } from "@/components/shared/section-title"; import { CampaignToolbar } from "@/features/roi/components/campaign-toolbar"; import { CampaignList } from "@/features/roi/components/campaign-list"; -import { mockCampaigns } from "@/features/roi/data/mock-campaigns"; -import type { CampaignStatus } from "@/features/roi/types/campaign.types"; +import type { Campaign, CampaignStatus } from "@/features/roi/types/campaign.types"; +import { useUserInvestments } from "@/features/investments/hooks/useUserInvestments.hook"; +import type { InvestmentFromApi } from "@/features/investments/services/investment.service"; +import { ClaimROIService } from "@/features/claim-roi/services/claim.service"; +import { useWalletContext } from "@tokenization/tw-blocks-shared/src/wallet-kit/WalletProvider"; +import { signTransaction } from "@tokenization/tw-blocks-shared/src/wallet-kit/wallet-kit"; +import { SendTransactionService } from "@/lib/sendTransactionService"; +import { toastSuccessWithTx } from "@/lib/toastWithTx"; +import { toast } from "sonner"; + +function toCampaign(inv: InvestmentFromApi): Campaign { + return { + id: inv.campaign.id, + title: inv.campaign.name, + description: inv.campaign.description ?? "", + status: inv.campaign.status as CampaignStatus, + loansCompleted: 0, + minInvestCents: Number(inv.usdcAmount) * 100, + currency: "USD", + vaultId: inv.campaign.vaultId ?? null, + }; +} + +function deduplicateByCampaign(investments: InvestmentFromApi[]): Campaign[] { + const seen = new Set(); + const campaigns: Campaign[] = []; + for (const inv of investments) { + if (!seen.has(inv.campaign.id)) { + seen.add(inv.campaign.id); + campaigns.push(toCampaign(inv)); + } + } + return campaigns; +} export default function MyInvestmentsPage() { const [search, setSearch] = useState(""); const [filter, setFilter] = useState("all"); + const { data: investments, isLoading } = useUserInvestments(); + const { walletAddress } = useWalletContext(); + + const campaigns = useMemo( + () => deduplicateByCampaign(investments ?? []), + [investments], + ); const filteredCampaigns = useMemo(() => { - return mockCampaigns.filter((c) => { + return campaigns.filter((c) => { const matchesStatus = filter === "all" || c.status === filter; const matchesSearch = search.trim() === "" || @@ -20,7 +59,59 @@ export default function MyInvestmentsPage() { c.description.toLowerCase().includes(search.toLowerCase()); return matchesStatus && matchesSearch; }); - }, [search, filter]); + }, [campaigns, search, filter]); + + const handleClaimRoi = useCallback( + async (campaignId: string) => { + const campaign = campaigns.find((c) => c.id === campaignId); + + if (!campaign?.vaultId) { + toast.error("Vault contract not available for this campaign."); + return; + } + + if (!walletAddress) { + toast.error("Please connect your wallet to claim ROI."); + return; + } + + try { + const svc = new ClaimROIService(); + const claimResponse = await svc.claimROI({ + vaultContractId: campaign.vaultId, + beneficiaryAddress: walletAddress, + }); + + if (!claimResponse?.success || !claimResponse?.xdr) { + throw new Error( + claimResponse?.message ?? "Failed to build claim transaction.", + ); + } + + const signedTxXdr = await signTransaction({ + unsignedTransaction: claimResponse.xdr, + address: walletAddress, + }); + + const sender = new SendTransactionService(); + const submitResponse = await sender.sendTransaction({ + signedXdr: signedTxXdr, + }); + + if (submitResponse.status !== "SUCCESS") { + throw new Error( + submitResponse.message ?? "Transaction submission failed.", + ); + } + + toastSuccessWithTx("ROI claimed successfully!", submitResponse.hash); + } catch (e) { + const msg = e instanceof Error ? e.message : "Unexpected error while claiming ROI."; + toast.error(msg); + } + }, + [campaigns, walletAddress], + ); return (
@@ -32,7 +123,13 @@ export default function MyInvestmentsPage() { onSearchChange={setSearch} onFilterChange={setFilter} /> - + {isLoading ? ( +

+ Loading your investments... +

+ ) : ( + + )}
); } diff --git a/apps/investor-tokenization/src/components/ui/apple-cards-carousel.tsx b/apps/investor-tokenization/src/components/ui/apple-cards-carousel.tsx index 5116211..4e43e52 100644 --- a/apps/investor-tokenization/src/components/ui/apple-cards-carousel.tsx +++ b/apps/investor-tokenization/src/components/ui/apple-cards-carousel.tsx @@ -42,6 +42,7 @@ type Card = { tokenSale?: string; tokenFactory?: string; vaultContractId?: string; + campaignId?: string; src: string; content: React.ReactNode; }; @@ -400,6 +401,7 @@ export const Card = ({ escrowId: card.escrowId, tokenSaleContractId: card.tokenSale, imageSrc: card.src, + campaignId: card.campaignId, }} > diff --git a/apps/investor-tokenization/src/features/claim-roi/services/claim.service.ts b/apps/investor-tokenization/src/features/claim-roi/services/claim.service.ts index 0363415..7bfc7ca 100644 --- a/apps/investor-tokenization/src/features/claim-roi/services/claim.service.ts +++ b/apps/investor-tokenization/src/features/claim-roi/services/claim.service.ts @@ -1,4 +1,4 @@ -import axios, { AxiosInstance } from "axios"; +import { httpClient } from "@/lib/httpClient"; export type ClaimROIPayload = { vaultContractId: string; @@ -12,20 +12,20 @@ export type ClaimROIResponse = { }; export class ClaimROIService { - private readonly axios: AxiosInstance; - - constructor() { - this.axios = axios.create({ - baseURL: "/api", - }); - } - async claimROI(payload: ClaimROIPayload): Promise { - const response = await this.axios.post( - "/vault-contract/claim", - payload + const { data } = await httpClient.post<{ unsignedXdr: string }>( + "/vault/claim", + { + contractId: payload.vaultContractId, + beneficiary: payload.beneficiaryAddress, + callerPublicKey: payload.beneficiaryAddress, + }, ); - return response.data; + return { + success: true, + xdr: data.unsignedXdr, + message: "Transaction built successfully.", + }; } } diff --git a/apps/investor-tokenization/src/features/investments/InvestmentsView.tsx b/apps/investor-tokenization/src/features/investments/InvestmentsView.tsx index b670dc6..d66f5e6 100644 --- a/apps/investor-tokenization/src/features/investments/InvestmentsView.tsx +++ b/apps/investor-tokenization/src/features/investments/InvestmentsView.tsx @@ -20,7 +20,6 @@ export const InvestmentsView = () => { error, } = useUserInvestments(); - // Show connect wallet message if (!walletAddress) { return (
@@ -38,7 +37,6 @@ export const InvestmentsView = () => { ); } - // Show loading state if (isLoading) { return (
@@ -50,7 +48,6 @@ export const InvestmentsView = () => { ); } - // Show error state if (isError) { return (
@@ -66,21 +63,17 @@ export const InvestmentsView = () => { const investmentList = investments ?? []; - // Calculate summary statistics const totalInvested = React.useMemo(() => { - return investmentList.reduce((sum, inv) => { - // Estimate investment based on token balance - // This is a simplified calculation - you may want to track actual investment amounts - return sum + parseFloat(inv.tokenBalance || "0"); - }, 0); + return investmentList.reduce((sum, inv) => sum + Number(inv.usdcAmount), 0); }, [investmentList]); - const activeInvestments = investmentList.filter((inv) => inv.escrow.isActive).length; + const uniqueCampaigns = React.useMemo(() => { + return new Set(investmentList.map((inv) => inv.campaignId)).size; + }, [investmentList]); return (
- {/* Header */}

My Investments

@@ -88,7 +81,6 @@ export const InvestmentsView = () => {

- {/* Summary Cards */}
@@ -108,8 +100,8 @@ export const InvestmentsView = () => {
-

Active Investments

-

{activeInvestments}

+

Campaigns

+

{uniqueCampaigns}

@@ -120,44 +112,31 @@ export const InvestmentsView = () => {
-

Total Tokens Owned

+

Total Invested

- {totalInvested.toLocaleString(undefined, { + {totalInvested.toLocaleString("en-US", { minimumFractionDigits: 2, - maximumFractionDigits: 7, - })} + maximumFractionDigits: 2, + })}{" "} + USDC

- {totalInvested > 0 && ( -

- Across {investmentList.length} investment{investmentList.length !== 1 ? "s" : ""} -

- )}
- {/* Investments List */} {investmentList.length === 0 ? (

No Investments Yet

- You don't have any investments yet. Start investing in projects to see them here. + You don't have any investments yet. Start investing in projects to see them here.

) : (
{investmentList.map((investment) => ( - + ))}
)} @@ -165,5 +144,3 @@ export const InvestmentsView = () => {
); }; - - diff --git a/apps/investor-tokenization/src/features/investments/components/InvestmentCard.tsx b/apps/investor-tokenization/src/features/investments/components/InvestmentCard.tsx index 6aef0c1..bfa7235 100644 --- a/apps/investor-tokenization/src/features/investments/components/InvestmentCard.tsx +++ b/apps/investor-tokenization/src/features/investments/components/InvestmentCard.tsx @@ -2,193 +2,145 @@ import { Card, CardContent, CardHeader, CardTitle } from "@tokenization/ui/card"; import { Badge } from "@tokenization/ui/badge"; -import { BalanceProgressBar } from "@tokenization/tw-blocks-shared/src/escrows/indicators/balance-progress/bar/BalanceProgress"; import { - formatCurrency, - formatTimestamp, formatAddress, } from "@tokenization/tw-blocks-shared/src/helpers/format.helper"; -import { GetEscrowsFromIndexerResponse } from "@trustless-work/escrow/types"; -import { MultiReleaseMilestone } from "@trustless-work/escrow"; -import { Calendar, Wallet, ExternalLink } from "lucide-react"; +import { Calendar, DollarSign, ExternalLink, Coins } from "lucide-react"; import Link from "next/link"; +import type { InvestmentFromApi } from "../services/investment.service"; type InvestmentCardProps = { - escrow: GetEscrowsFromIndexerResponse; - tokenBalance: string; - tokenFactory?: string; - tokenName?: string; - tokenSymbol?: string; - tokenDecimals?: number; + investment: InvestmentFromApi; }; -export const InvestmentCard = ({ - escrow, - tokenBalance, - tokenFactory, - tokenName, - tokenSymbol, - tokenDecimals = 7, -}: InvestmentCardProps) => { - const isMultiRelease = escrow.type === "multi-release"; - const milestones = (escrow.milestones || []) as MultiReleaseMilestone[]; - - const totalAmount = isMultiRelease && milestones - ? milestones.reduce((acc, milestone) => acc + Number(milestone.amount), 0) - : Number(escrow.amount || 0); - - const currency = escrow.trustline?.symbol || "USDC"; - const rawBalance = parseFloat(tokenBalance || "0"); +const STATUS_VARIANT: Record = { + ACTIVE: "default", + FUNDRAISING: "default", + REPAYMENT: "secondary", + CLAIMABLE: "secondary", + CLOSED: "outline", + PAUSED: "destructive", + DRAFT: "outline", +}; - // Format balance using token decimals (similar to Stellar Expert) - const formattedBalance = rawBalance / Math.pow(10, tokenDecimals); - const displaySymbol = tokenSymbol || "TOKEN"; +export const InvestmentCard = ({ investment }: InvestmentCardProps) => { + const { campaign } = investment; + const usdcAmount = Number(investment.usdcAmount); + const tokenAmount = Number(investment.tokenAmount); + const createdAt = new Date(investment.createdAt); return (
- {escrow.title || "Untitled Investment"} + {campaign.name} - {escrow.isActive !== undefined && ( - - {escrow.isActive ? "Active" : "Inactive"} - - )} + + {campaign.status} +
- {escrow.description && ( + {campaign.description && (

- {escrow.description} + {campaign.description}

)}
- {/* Token Balance - Stellar Expert Style Display */} -
0 - ? "bg-gradient-to-br from-primary/10 via-primary/5 to-background border-primary/20" - : "bg-muted border-border" - }`}> -
-
-
- 0 ? "text-primary" : "text-muted-foreground"}`} /> -
-

0 ? "text-muted-foreground" : "text-muted-foreground" - }`}> - {tokenName || "Token"} Balance -

- {tokenSymbol && ( -

- {displaySymbol} -

- )} -
-
- {tokenFactory && ( - - - - )} +
+
+
+ + + Invested +
-
-

0 ? "text-foreground" : "text-muted-foreground" - }`}> - {formattedBalance.toLocaleString(undefined, { - minimumFractionDigits: 2, - maximumFractionDigits: tokenDecimals, - })} -

- {tokenSymbol && ( - - {displaySymbol} - - )} +

+ {usdcAmount.toLocaleString("en-US", { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} +

+

USDC

+
+ +
+
+ + + Tokens +
- {formattedBalance > 0 ? ( -
-

- Raw balance: {rawBalance.toLocaleString()} -

- {tokenFactory && ( - - View on Stellar Expert - - - )} -
- ) : ( -

- No tokens owned yet -

- )} +

+ {tokenAmount.toLocaleString("en-US", { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} +

+

Received

- {/* Progress Bar */} - {escrow.contractId && ( - - )} - - {/* Milestones Progress */} - {isMultiRelease && milestones && milestones.length > 0 && ( -
-

Milestones

-
- {milestones.map((milestone, index) => ( -
- - {milestone.description || `Milestone ${index + 1}`} - - - {milestone.status || "Pending"} - -
- ))} + {campaign.expectedReturn > 0 && ( +
+
+ Expected Return + + {Number(campaign.expectedReturn)}% +
+ {campaign.loanDuration > 0 && ( +
+ Duration + + {campaign.loanDuration} months + +
+ )}
)} - {/* Metadata */}
- Created + Invested on + + + {createdAt.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + })} - {formatTimestamp(escrow.createdAt)}
- {escrow.contractId && ( + +
+ Tx Hash + + {formatAddress(investment.txHash)} + + +
+ + {campaign.escrowId && (
- Contract ID - {formatAddress(escrow.contractId)} + Escrow + + {formatAddress(campaign.escrowId)} + +
)}
@@ -196,4 +148,3 @@ export const InvestmentCard = ({ ); }; - diff --git a/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts b/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts index 1e76853..a03d853 100644 --- a/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts +++ b/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts @@ -1,164 +1,17 @@ import { useQuery } from "@tanstack/react-query"; import { useWalletContext } from "@tokenization/tw-blocks-shared/src/wallet-kit/WalletProvider"; -import { useGetEscrowFromIndexerByContractIds } from "@trustless-work/escrow"; -import type { GetEscrowsFromIndexerResponse } from "@trustless-work/escrow/types"; -import { InvestmentService } from "../services/investment.service"; +import { + fetchMyInvestments, + type InvestmentFromApi, +} from "../services/investment.service"; -// Project data from ProjectList - includes tokenFactory addresses -const PROJECT_DATA = [ - { - escrowId: "CCZHTYVLK6R2QMIFBTEN65ZVCSFBD3L5TXYCZJT5WTXE63ABYXBBCSEB", - tokenSale: "CC2AGB3AW5IITDIPEZGVX6XT5RTDIVINRZL7F6KZPIHEWN2GRXL5CRCT", - tokenFactory: "CDJTII2GR2FY6Q4NDJGZI7NW2SHQ7GR5Y2H7B7Q253PTZZAZZ25TFYYU", - }, - { - escrowId: "CD775STBXITO4GNNIS7GO3KV6SYMFNBQXW536SWXOPUOO36Z64N3XBFI", - tokenFactory: "CCEFVY5PCQEO7KSNS52DUXOFXU7PXMQ4GPT25S5ZDYZQPWA74XXY5Y5N", - tokenSale: "CD64ILP3SXCCY67QIVPCOVUX5Z5Q42CMKU7LK4RNAPCWD5QGBS6G7LPA", - }, -]; - -export type UserInvestment = { - escrow: GetEscrowsFromIndexerResponse; - tokenBalance: string; - tokenFactory: string; - tokenSale: string; - tokenName?: string; - tokenSymbol?: string; - tokenDecimals?: number; -}; - -/** - * Hook to fetch user investments by checking token balances - * Returns escrows where the user has a token balance > 0 - */ export const useUserInvestments = () => { const { walletAddress } = useWalletContext(); - const { getEscrowByContractIds } = useGetEscrowFromIndexerByContractIds(); - const investmentService = new InvestmentService(); - return useQuery({ + return useQuery({ queryKey: ["user-investments", walletAddress], - queryFn: async () => { - if (!walletAddress) { - return []; - } - - // Get all escrows - const escrowIds = PROJECT_DATA.map((p) => p.escrowId); - const escrowsResult = await getEscrowByContractIds({ - contractIds: escrowIds, - validateOnChain: true, - }); - - // Handle both single object and array responses - const escrows = Array.isArray(escrowsResult) - ? escrowsResult - : escrowsResult - ? [escrowsResult] - : []; - - if (!escrows || escrows.length === 0) { - return []; - } - - // Check token balances for each escrow - const investments: UserInvestment[] = []; - - // Process escrows in parallel with Promise.allSettled for better performance - const balanceChecks = await Promise.allSettled( - escrows.map(async (escrow) => { - const projectData = PROJECT_DATA.find( - (p) => p.escrowId === escrow.contractId, - ); - - if (!projectData?.tokenFactory) { - return { - escrow, - hasBalance: false, - tokenBalance: "0", - tokenFactory: "", - tokenSale: "", - }; - } - - try { - // Check token balance and metadata in parallel - const [balanceResponse, metadataResponse] = await Promise.all([ - investmentService.getTokenBalance({ - tokenFactoryAddress: projectData.tokenFactory, - address: walletAddress, - }), - investmentService.getTokenMetadata({ - tokenFactoryAddress: projectData.tokenFactory, - }).catch(() => ({ - success: false, - name: undefined, - symbol: undefined, - decimals: 7, - })), - ]); - - const balance = balanceResponse.success - ? parseFloat(balanceResponse.balance || "0") - : 0; - - const hasBalance = balance > 0; - - return { - escrow, - hasBalance, - tokenBalance: balanceResponse.balance || "0", - tokenFactory: projectData.tokenFactory, - tokenSale: projectData.tokenSale, - tokenName: metadataResponse.success ? metadataResponse.name : undefined, - tokenSymbol: metadataResponse.success ? metadataResponse.symbol : undefined, - tokenDecimals: metadataResponse.success ? metadataResponse.decimals : 7, - }; - } catch (error) { - // If balance check fails, log but don't throw - console.warn( - `Failed to check balance for escrow ${escrow.contractId}:`, - error, - ); - return { - escrow, - hasBalance: false, - tokenBalance: "0", - tokenFactory: projectData.tokenFactory, - tokenSale: projectData.tokenSale, - tokenName: undefined, - tokenSymbol: undefined, - tokenDecimals: 7, - }; - } - }), - ); - - // Filter to only escrows with balance > 0 - balanceChecks.forEach((result) => { - if ( - result.status === "fulfilled" && - result.value.hasBalance && - result.value.tokenFactory && - result.value.tokenSale - ) { - investments.push({ - escrow: result.value.escrow, - tokenBalance: result.value.tokenBalance, - tokenFactory: result.value.tokenFactory, - tokenSale: result.value.tokenSale, - tokenName: result.value.tokenName, - tokenSymbol: result.value.tokenSymbol, - tokenDecimals: result.value.tokenDecimals, - }); - } - }); - - return investments; - }, + queryFn: () => fetchMyInvestments(walletAddress), enabled: Boolean(walletAddress), - staleTime: 1000 * 60 * 2, // 2 minutes + staleTime: 1000 * 60 * 2, }); }; - diff --git a/apps/investor-tokenization/src/features/investments/services/investment.service.ts b/apps/investor-tokenization/src/features/investments/services/investment.service.ts index a059150..99ca8db 100644 --- a/apps/investor-tokenization/src/features/investments/services/investment.service.ts +++ b/apps/investor-tokenization/src/features/investments/services/investment.service.ts @@ -1,4 +1,5 @@ import axios, { AxiosInstance } from "axios"; +import { httpClient } from "@/lib/httpClient"; export type TokenBalancePayload = { tokenFactoryAddress: string; @@ -23,6 +24,50 @@ export type TokenMetadataResponse = { error?: string; }; +export type CreateInvestmentPayload = { + campaignId: string; + investorAddress: string; + usdcAmount: number; + tokenAmount: number; + txHash: string; +}; + +export type InvestmentFromApi = { + id: string; + campaignId: string; + investorAddress: string; + usdcAmount: number; + tokenAmount: number; + txHash: string; + createdAt: string; + campaign: { + id: string; + name: string; + description: string | null; + status: string; + escrowId: string; + tokenFactoryId: string | null; + tokenSaleId: string | null; + vaultId: string | null; + expectedReturn: number; + loanDuration: number; + }; +}; + +export async function createInvestment(payload: CreateInvestmentPayload) { + const { data } = await httpClient.post("/investments", payload); + return data; +} + +export async function fetchMyInvestments( + investorAddress: string, +): Promise { + const { data } = await httpClient.get( + `/investments/investor/${investorAddress}`, + ); + return data; +} + export class InvestmentService { private readonly axios: AxiosInstance; diff --git a/apps/investor-tokenization/src/features/roi/components/campaign-filter.tsx b/apps/investor-tokenization/src/features/roi/components/campaign-filter.tsx index 8b3bdde..360c6c9 100644 --- a/apps/investor-tokenization/src/features/roi/components/campaign-filter.tsx +++ b/apps/investor-tokenization/src/features/roi/components/campaign-filter.tsx @@ -4,8 +4,10 @@ import type { CampaignStatus } from "../types/campaign.types"; const STATUS_OPTIONS: { value: CampaignStatus | "all"; label: string }[] = [ { value: "all", label: "All" }, - { value: "READY", label: "Ready" }, - { value: "PENDING", label: "Pending" }, + { value: "FUNDRAISING", label: "Fundraising" }, + { value: "ACTIVE", label: "Active" }, + { value: "REPAYMENT", label: "Repayment" }, + { value: "CLAIMABLE", label: "Claimable" }, { value: "CLOSED", label: "Closed" }, ]; diff --git a/apps/investor-tokenization/src/features/roi/constants/campaign-status.ts b/apps/investor-tokenization/src/features/roi/constants/campaign-status.ts index 5daf2d5..1ddf955 100644 --- a/apps/investor-tokenization/src/features/roi/constants/campaign-status.ts +++ b/apps/investor-tokenization/src/features/roi/constants/campaign-status.ts @@ -4,7 +4,11 @@ export const CAMPAIGN_STATUS_CONFIG: Record< CampaignStatus, { label: string; className: string } > = { - READY: { label: "Ready", className: "bg-success-bg text-success border-success/30" }, - PENDING: { label: "Pending", className: "bg-yellow-50 text-yellow-700 border-yellow-200" }, + DRAFT: { label: "Draft", className: "bg-secondary text-text-muted border-border" }, + FUNDRAISING: { label: "Fundraising", className: "bg-yellow-50 text-yellow-700 border-yellow-200" }, + ACTIVE: { label: "Active", className: "bg-success-bg text-success border-success/30" }, + REPAYMENT: { label: "Repayment", className: "bg-blue-50 text-blue-700 border-blue-200" }, + CLAIMABLE: { label: "Claimable", className: "bg-purple-50 text-purple-700 border-purple-200" }, CLOSED: { label: "Closed", className: "bg-secondary text-text-muted border-border" }, + PAUSED: { label: "Paused", className: "bg-orange-50 text-orange-700 border-orange-200" }, }; diff --git a/apps/investor-tokenization/src/features/roi/data/mock-campaigns.ts b/apps/investor-tokenization/src/features/roi/data/mock-campaigns.ts index 8f71ca8..45e8cad 100644 --- a/apps/investor-tokenization/src/features/roi/data/mock-campaigns.ts +++ b/apps/investor-tokenization/src/features/roi/data/mock-campaigns.ts @@ -6,29 +6,32 @@ export const mockCampaigns: Campaign[] = [ title: "Coffee Producers Cooperative", description: "Expanding sustainable harvest infrastructure in Antioquia. This project aims to implement water-saving processing systems for 50 local families.", - status: "READY", + status: "ACTIVE", loansCompleted: 10, minInvestCents: 25000, currency: "USD", + vaultId: null, }, { id: "2", title: "Artisan Ceramic Collective", description: "Supporting traditional pottery techniques and new kiln installations. The collective brings together 30 artisans from the region to scale production and reach new markets.", - status: "READY", + status: "ACTIVE", loansCompleted: 8, minInvestCents: 10000, currency: "USD", + vaultId: null, }, { id: "3", title: "Urban Agriculture Network", description: "Rooftop and community garden expansion in Medellín. This initiative creates green jobs and improves food security through urban farming training and shared infrastructure.", - status: "READY", + status: "CLAIMABLE", loansCompleted: 12, minInvestCents: 50000, currency: "USD", + vaultId: null, }, ]; diff --git a/apps/investor-tokenization/src/features/roi/types/campaign.types.ts b/apps/investor-tokenization/src/features/roi/types/campaign.types.ts index 6993e61..2e4d810 100644 --- a/apps/investor-tokenization/src/features/roi/types/campaign.types.ts +++ b/apps/investor-tokenization/src/features/roi/types/campaign.types.ts @@ -1,4 +1,30 @@ -export type CampaignStatus = "READY" | "PENDING" | "CLOSED"; +export type CampaignStatus = + | "DRAFT" + | "FUNDRAISING" + | "ACTIVE" + | "REPAYMENT" + | "CLAIMABLE" + | "CLOSED" + | "PAUSED"; + +export type CampaignFromApi = { + id: string; + name: string; + description: string | null; + status: CampaignStatus; + previousStatus: CampaignStatus | null; + issuerAddress: string; + escrowId: string; + poolSize: number; + loanDuration: number; + expectedReturn: number; + loanSize: number; + vaultId: string | null; + tokenSaleId: string | null; + tokenFactoryId: string | null; + createdAt: string; + updatedAt: string; +}; export type Campaign = { id: string; @@ -8,4 +34,5 @@ export type Campaign = { loansCompleted: number; minInvestCents: number; currency: string; + vaultId: string | null; }; diff --git a/apps/investor-tokenization/src/features/tokens/components/InvestDialog.tsx b/apps/investor-tokenization/src/features/tokens/components/InvestDialog.tsx index c00092c..0c89886 100644 --- a/apps/investor-tokenization/src/features/tokens/components/InvestDialog.tsx +++ b/apps/investor-tokenization/src/features/tokens/components/InvestDialog.tsx @@ -5,11 +5,8 @@ import { useForm } from "react-hook-form"; import { Dialog, DialogContent, - DialogHeader, DialogTitle, - DialogDescription, DialogTrigger, - DialogClose, } from "@tokenization/ui/dialog"; import { Form, @@ -30,16 +27,10 @@ import { SendTransactionService } from "@/lib/sendTransactionService"; import { useWalletContext } from "@tokenization/tw-blocks-shared/src/wallet-kit/WalletProvider"; import { signTransaction } from "@tokenization/tw-blocks-shared/src/wallet-kit/wallet-kit"; import { useSelectedEscrow } from "@/features/tokens/context/SelectedEscrowContext"; -import { InvestmentService } from "@/features/investments/services/investment.service"; -import { Card } from "@tokenization/ui/card"; -import { cn } from "@/lib/utils"; +import { createInvestment } from "@/features/investments/services/investment.service"; import { MultiReleaseMilestone } from "@trustless-work/escrow"; -import { BalanceProgressBar } from "@tokenization/tw-blocks-shared/src/escrows/indicators/balance-progress/bar/BalanceProgress"; -import { formatAddress } from "@tokenization/tw-blocks-shared/src/helpers/format.helper"; -import { CircleCheckBig } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; -import { Button as ShadButton } from "@tokenization/ui/button"; -import Link from "next/link"; +import { toast } from "sonner"; type InvestFormValues = { amount: number; @@ -59,10 +50,6 @@ export function InvestDialog({ const { walletAddress } = useWalletContext(); const [open, setOpen] = React.useState(false); const [submitting, setSubmitting] = React.useState(false); - const [successMessage, setSuccessMessage] = React.useState( - null - ); - const [txHash, setTxHash] = React.useState(null); const [errorMessage, setErrorMessage] = React.useState(null); const selected = useSelectedEscrow(); const queryClient = useQueryClient(); @@ -74,7 +61,6 @@ export function InvestDialog({ const onSubmit = async (values: InvestFormValues) => { setErrorMessage(null); - setSuccessMessage(null); if (!walletAddress) { setErrorMessage("Please connect your wallet to continue."); return; @@ -125,7 +111,20 @@ export function InvestDialog({ ); } - setTxHash(submitResponse.hash ?? null); + if (selected.campaignId && submitResponse.hash) { + try { + await createInvestment({ + campaignId: selected.campaignId, + investorAddress: walletAddress, + usdcAmount: values.amount, + tokenAmount: values.amount, + txHash: submitResponse.hash, + }); + } catch (dbError) { + console.error("Failed to save investment to database:", dbError); + } + } + // Refresh the escrow balance using TanStack Query const balanceQueryKey = ["escrows", [selected.escrowId]] as const; const singleEscrowKey = ["escrow", selected.escrowId] as const; @@ -142,8 +141,9 @@ export function InvestDialog({ await queryClient.invalidateQueries({ queryKey: ["escrows-by-ids"] }); await queryClient.refetchQueries({ queryKey: ["escrows-by-ids"] }); - setSuccessMessage("Your investment transaction was sent successfully."); + toast.success("Investment completed successfully."); form.reset({ amount: 0 }); + setOpen(false); } catch (err) { let message = err instanceof Error @@ -199,97 +199,9 @@ export function InvestDialog({ {triggerLabel} - - {successMessage ? ( -
-
- {/* Left Column: Image */} -
- {selected.imageSrc ? ( - { - ) : ( -
- - No image - -
- )} -
- - {/* Right Column: Information */} -
-

- {" "} - Investment Successful! -

-

- Your investment transaction was sent successfully. -

- -
- - - View Transaction - - -
- - {/* Title */} -
-

- {selected.escrow?.title || "No title"} -

-
- - {/* Description - Truncated */} - {selected.escrow?.description && ( -
-

- {selected.escrow?.description} -

-
- )} - - {/* Amount and Balance */} - - - {/* Metadata */} -
-

- ID:{" "} - {formatAddress(selected.escrowId)} -

- - {selected.tokenSaleContractId && ( -

- Contract Sale:{" "} - {formatAddress(selected.tokenSaleContractId)} -

- )} -
-
-
-
- ) : ( -
+ + Invest + - )}
); diff --git a/apps/investor-tokenization/src/features/tokens/context/SelectedEscrowContext.tsx b/apps/investor-tokenization/src/features/tokens/context/SelectedEscrowContext.tsx index d8972ba..0e039e1 100644 --- a/apps/investor-tokenization/src/features/tokens/context/SelectedEscrowContext.tsx +++ b/apps/investor-tokenization/src/features/tokens/context/SelectedEscrowContext.tsx @@ -8,6 +8,7 @@ export type SelectedEscrowValue = { escrowId: string; tokenSaleContractId?: string; imageSrc?: string; + campaignId?: string; }; const SelectedEscrowContext = createContext( diff --git a/apps/investor-tokenization/src/features/tokens/services/token.service.ts b/apps/investor-tokenization/src/features/tokens/services/token.service.ts index 9792ee6..bf0cc66 100644 --- a/apps/investor-tokenization/src/features/tokens/services/token.service.ts +++ b/apps/investor-tokenization/src/features/tokens/services/token.service.ts @@ -1,4 +1,4 @@ -import axios, { AxiosInstance } from "axios"; +import { httpClient } from "@/lib/httpClient"; export type BuyTokenPayload = { tokenSaleContractId: string; @@ -15,20 +15,23 @@ export type DeployTokenResponse = { }; export class TokenService { - private readonly axios: AxiosInstance; - - constructor() { - this.axios = axios.create({ - baseURL: "/api", - }); - } - async buyToken(payload: BuyTokenPayload): Promise { - const response = await this.axios.post( + const { data } = await httpClient.post<{ unsignedXdr: string }>( "/token-sale/buy", - payload, + { + contractId: payload.tokenSaleContractId, + usdcAddress: payload.usdcAddress, + payer: payload.payerAddress, + beneficiary: payload.beneficiaryAddress, + amount: payload.amount, + callerPublicKey: payload.payerAddress, + }, ); - return response.data; + return { + success: true, + xdr: data.unsignedXdr, + message: "Transaction built successfully.", + }; } } diff --git a/apps/investor-tokenization/src/features/transparency/ProjectCard.tsx b/apps/investor-tokenization/src/features/transparency/ProjectCard.tsx index 356c8db..8114a57 100644 --- a/apps/investor-tokenization/src/features/transparency/ProjectCard.tsx +++ b/apps/investor-tokenization/src/features/transparency/ProjectCard.tsx @@ -6,22 +6,18 @@ import { Button } from "@tokenization/ui/button"; import { CampaignCard as SharedCampaignCard } from "@tokenization/ui/campaign-card"; import { cn } from "@tokenization/shared/lib/utils"; import { ExternalLink, Rocket } from "lucide-react"; -import { - formatCurrency, -} from "@tokenization/tw-blocks-shared/src/helpers/format.helper"; import type { GetEscrowsFromIndexerResponse as Escrow, MultiReleaseMilestone, } from "@trustless-work/escrow/types"; import { InvestDialog } from "@/features/tokens/components/InvestDialog"; import { SelectedEscrowProvider } from "@/features/tokens/context/SelectedEscrowContext"; +import { CAMPAIGN_STATUS_CONFIG } from "@/features/roi/constants/campaign-status"; +import type { CampaignFromApi } from "./types"; export type ProjectCardProps = { - escrow: Escrow | undefined; - escrowId: string; - tokenSale?: string; - tokenFactory?: string; - imageSrc?: string; + campaign: CampaignFromApi; + escrow?: Escrow; isLoading?: boolean; }; @@ -65,51 +61,43 @@ function LoadingSkeleton() { } export const ProjectCard = ({ + campaign, escrow, - escrowId, - tokenSale, - imageSrc, isLoading = false, }: ProjectCardProps) => { - const title = escrow?.title ?? "Loading..."; - const description = escrow?.description ?? ""; + const { name, description, status, escrowId, tokenSaleId } = campaign; const progress = getProgress(escrow); - const isActive = escrow?.isActive === true; + const statusCfg = CAMPAIGN_STATUS_CONFIG[status]; const escrowExplorerUrl = `https://stellar.expert/explorer/testnet/contract/${escrowId}`; if (isLoading) { return ; } - const statusLabel = isActive ? "Active" : "Fundraising"; - const statusClassName = isActive - ? "bg-success-bg text-success border-success/30" - : "bg-yellow-50 text-yellow-700 border-yellow-200"; - return ( - {statusLabel} + {statusCfg.label} } actions={ - tokenSale ? ( + tokenSaleId ? ( diff --git a/apps/investor-tokenization/src/features/transparency/ProjectList.tsx b/apps/investor-tokenization/src/features/transparency/ProjectList.tsx index 23e65ba..a58b26f 100644 --- a/apps/investor-tokenization/src/features/transparency/ProjectList.tsx +++ b/apps/investor-tokenization/src/features/transparency/ProjectList.tsx @@ -5,15 +5,10 @@ import { useQuery } from "@tanstack/react-query"; import { useGetEscrowFromIndexerByContractIds } from "@trustless-work/escrow"; import type { GetEscrowsFromIndexerResponse } from "@trustless-work/escrow/types"; import { ProjectCard } from "./ProjectCard"; +import { fetchCampaigns } from "./services/campaign.service"; +import type { CampaignFromApi, CampaignStatus } from "./types"; -const data = [ - { - escrowId: "CCZHTYVLK6R2QMIFBTEN65ZVCSFBD3L5TXYCZJT5WTXE63ABYXBBCSEB", - tokenSale: "CC2AGB3AW5IITDIPEZGVX6XT5RTDIVINRZL7F6KZPIHEWN2GRXL5CRCT", - tokenFactory: "CDJTII2GR2FY6Q4NDJGZI7NW2SHQ7GR5Y2H7B7Q253PTZZAZZ25TFYYU", - src: "/escrows/car.png", - }, -]; +const HIDDEN_STATUSES: CampaignStatus[] = ["DRAFT", "PAUSED"]; interface ProjectListProps { search?: string; @@ -22,9 +17,23 @@ interface ProjectListProps { export const ProjectList = ({ search = "", filter = "all" }: ProjectListProps) => { const { getEscrowByContractIds } = useGetEscrowFromIndexerByContractIds(); - const escrowIds = data.map((d) => d.escrowId); - const { data: escrowsList, isLoading } = useQuery({ + const { data: campaigns = [], isLoading: isCampaignsLoading } = useQuery({ + queryKey: ["campaigns"], + queryFn: fetchCampaigns, + }); + + const visibleCampaigns = useMemo( + () => campaigns.filter((c) => !HIDDEN_STATUSES.includes(c.status)), + [campaigns], + ); + + const escrowIds = useMemo( + () => visibleCampaigns.map((c) => c.escrowId).filter(Boolean), + [visibleCampaigns], + ); + + const { data: escrowsList, isLoading: isEscrowsLoading } = useQuery({ queryKey: ["escrows-by-ids", escrowIds], queryFn: async () => { const result = await getEscrowByContractIds({ @@ -41,36 +50,35 @@ export const ProjectList = ({ search = "", filter = "all" }: ProjectListProps) = enabled: escrowIds.length > 0, }); - const escrowsById = - escrowsList && Array.isArray(escrowsList) - ? escrowsList.reduce( - (acc, item, idx) => { - const key = - (item as { contractId?: string })?.contractId ?? escrowIds[idx]; - if (key) acc[key] = item; - return acc; - }, - {} as Record - ) - : {}; + const escrowsById = useMemo(() => { + if (!escrowsList || !Array.isArray(escrowsList)) return {}; + return escrowsList.reduce( + (acc, item, idx) => { + const key = + (item as { contractId?: string })?.contractId ?? escrowIds[idx]; + if (key) acc[key] = item; + return acc; + }, + {} as Record, + ); + }, [escrowsList, escrowIds]); - const filteredData = useMemo(() => { - return data.filter((item) => { - const escrow = escrowsById[item.escrowId]; + const filteredCampaigns = useMemo(() => { + return visibleCampaigns.filter((campaign) => { if (search) { const q = search.toLowerCase(); - const title = (escrow?.title ?? "").toLowerCase(); - const desc = (escrow?.description ?? "").toLowerCase(); - if (!title.includes(q) && !desc.includes(q)) return false; + const name = (campaign.name ?? "").toLowerCase(); + const desc = (campaign.description ?? "").toLowerCase(); + if (!name.includes(q) && !desc.includes(q)) return false; } - if (filter === "READY") return escrow?.isActive === true; - if (filter === "PENDING") return !escrow?.isActive; - if (filter === "CLOSED") return false; + if (filter !== "all" && campaign.status !== filter) return false; return true; }); - }, [search, filter, escrowsById]); + }, [search, filter, visibleCampaigns]); + + const isLoading = isCampaignsLoading || isEscrowsLoading; - if (!isLoading && filteredData.length === 0) { + if (!isLoading && filteredCampaigns.length === 0) { return (

No campaigns available.

@@ -80,20 +88,22 @@ export const ProjectList = ({ search = "", filter = "all" }: ProjectListProps) = return (
- {filteredData.map((item) => { - const escrow = escrowsById[item.escrowId]; - return ( - - ); - })} + {isCampaignsLoading + ? Array.from({ length: 4 }).map((_, i) => ( + + )) + : filteredCampaigns.map((campaign) => ( + + ))}
); }; diff --git a/apps/investor-tokenization/src/features/transparency/services/campaign.service.ts b/apps/investor-tokenization/src/features/transparency/services/campaign.service.ts new file mode 100644 index 0000000..cc42ecb --- /dev/null +++ b/apps/investor-tokenization/src/features/transparency/services/campaign.service.ts @@ -0,0 +1,7 @@ +import { httpClient } from "@/lib/httpClient"; +import type { CampaignFromApi } from "../types"; + +export async function fetchCampaigns(): Promise { + const { data } = await httpClient.get("/campaigns"); + return data; +} diff --git a/apps/investor-tokenization/src/features/transparency/types.ts b/apps/investor-tokenization/src/features/transparency/types.ts new file mode 100644 index 0000000..821dcde --- /dev/null +++ b/apps/investor-tokenization/src/features/transparency/types.ts @@ -0,0 +1 @@ +export type { CampaignFromApi, CampaignStatus } from "@/features/roi/types/campaign.types"; diff --git a/apps/investor-tokenization/src/lib/httpClient.ts b/apps/investor-tokenization/src/lib/httpClient.ts new file mode 100644 index 0000000..5b47e77 --- /dev/null +++ b/apps/investor-tokenization/src/lib/httpClient.ts @@ -0,0 +1,6 @@ +import { createHttpClient } from "@tokenization/shared/lib/httpClient"; + +export const httpClient = createHttpClient({ + baseURL: process.env.NEXT_PUBLIC_CORE_API_URL ?? "http://localhost:4000", + apiKey: process.env.NEXT_PUBLIC_INVESTORS_API_KEY ?? "", +}); diff --git a/package-lock.json b/package-lock.json index 3146db7..ca4c745 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,6 +86,7 @@ "@stellar/stellar-sdk": "^14.6.1", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", + "dotenv": "^16.6.1", "prisma": "^6.19.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1" @@ -583,6 +584,7 @@ "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1562,6 +1564,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -1986,6 +1989,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2539,7 +2543,6 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-13.3.0.tgz", "integrity": "sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@stellar/stellar-base": "^13.1.0", "axios": "^1.8.4", @@ -2559,7 +2562,6 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", "integrity": "sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@stellar/js-xdr": "^3.1.2", "base32.js": "^0.1.0", @@ -4498,7 +4500,6 @@ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -4517,7 +4518,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4535,7 +4535,6 @@ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -4584,7 +4583,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4603,7 +4601,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4625,7 +4622,6 @@ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -4682,7 +4678,6 @@ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -4699,7 +4694,6 @@ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -4714,7 +4708,6 @@ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -4728,7 +4721,6 @@ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -4757,7 +4749,6 @@ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -4798,7 +4789,6 @@ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -4843,7 +4833,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4862,7 +4851,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4884,7 +4872,6 @@ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -4897,8 +4884,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/snapshot-utils": { "version": "30.3.0", @@ -4978,7 +4964,6 @@ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -4994,7 +4979,6 @@ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -5011,7 +4995,6 @@ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -5028,7 +5011,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -5056,7 +5038,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5074,7 +5055,6 @@ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -5093,7 +5073,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5367,7 +5346,6 @@ "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", @@ -5387,8 +5365,7 @@ "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 + "license": "Apache-2.0" }, "node_modules/@near-js/crypto": { "version": "1.4.2", @@ -5415,7 +5392,6 @@ "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" @@ -5426,7 +5402,6 @@ "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" @@ -5437,7 +5412,6 @@ "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" @@ -5448,7 +5422,6 @@ "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", @@ -5464,15 +5437,34 @@ "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 + "license": "Apache-2.0" + }, + "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, + "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", @@ -5484,7 +5476,6 @@ "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" }, @@ -5497,7 +5488,6 @@ "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", @@ -5511,8 +5501,7 @@ "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 + "license": "Apache-2.0" }, "node_modules/@near-js/types": { "version": "0.3.1", @@ -5537,7 +5526,6 @@ "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", @@ -5554,8 +5542,7 @@ "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 + "license": "Apache-2.0" }, "node_modules/@near-wallet-selector/core": { "version": "8.10.2", @@ -5588,6 +5575,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.16.tgz", "integrity": "sha512-JSIeW+USuMJkkcNbiOdcPkVCeI3TSnXstIVEPpp3HiaKnPRuSbUUKm9TY9o/XpIcPHWUOQItAtC5BiAwFdVITQ==", "license": "MIT", + "peer": true, "dependencies": { "file-type": "21.3.0", "iterare": "1.2.1", @@ -5620,6 +5608,7 @@ "integrity": "sha512-tXWXyCiqWthelJjrE0KLFjf0O98VEt+WPVx5CrqCf+059kIxJ8y1Vw7Cy7N4fwQafWNrmFL2AfN87DDMbVAY0w==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", @@ -5660,6 +5649,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.16.tgz", "integrity": "sha512-IOegr5+ZfUiMKgk+garsSU4MOkPRhm46e6w8Bp1GcO4vCdl9Piz6FlWAzKVfa/U3Hn/DdzSVJOW3TWcQQFdBDw==", "license": "MIT", + "peer": true, "dependencies": { "cors": "2.8.6", "express": "5.2.1", @@ -5974,6 +5964,7 @@ "resolved": "https://registry.npmjs.org/@ngneat/elf/-/elf-2.5.1.tgz", "integrity": "sha512-13BItNZFgHglTiXuP9XhisNczwQ5QSzH+imAv9nAPsdbCq/3ortqkIYRnlxB8DGPVcuIjLujQ4OcZa+9QWgZtw==", "license": "MIT", + "peer": true, "peerDependencies": { "rxjs": ">=7.0.0" } @@ -8237,7 +8228,6 @@ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -8522,6 +8512,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", @@ -8878,6 +8869,7 @@ "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", @@ -9000,6 +8992,7 @@ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -9210,6 +9203,7 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.0.3.tgz", "integrity": "sha512-mBxNArxWq4wKNJATPJpXB2vIRQ3vUzIvjMCloSsGbfKRrSy96ie8yy7DWh9vSOHV6tNwe85hd3v+p/shlyosqA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@noble/curves": "^1.9.6", "@stellar/js-xdr": "^3.1.2", @@ -9660,6 +9654,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.12.tgz", "integrity": "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/query-core": "5.90.12" }, @@ -9765,7 +9760,6 @@ "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.4.3.tgz", "integrity": "sha512-0o7gp7nfip8yjhAwP3R/Hcy5S8RfmZmYwpCcN0PbydWa5U5VMQ+T/iB/OpbpeV+8j13bf6i7++38nTCUNas0GA==", "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { "@trezor/env-utils": "1.4.3", "@trezor/utils": "9.4.3" @@ -9779,7 +9773,6 @@ "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" }, @@ -9792,7 +9785,6 @@ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.5.4.tgz", "integrity": "sha512-3Xki/2Vmr1/rKa5LF+Eb2/Qd5N9LqwyRL76+ycqe1KwqV7xK3XGMsqTH9FUUReRvGxrzAFonbOgADAJczhx81w==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@solana-program/compute-budget": "^0.8.0", "@solana-program/stake": "^0.2.1", @@ -9822,7 +9814,6 @@ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.4.4.tgz", "integrity": "sha512-B38LH4aniZ7gKbpSdMRiA4YriauoYPHgjhKEd+ybR0ca+liNlPAvMwSHJyMhL1eDIYEs16oOjTgT53WjRRZbMg==", "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { "@trezor/utils": "9.4.4", "@trezor/utxo-lib": "2.4.4" @@ -9836,7 +9827,6 @@ "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.4.4.tgz", "integrity": "sha512-8BZD6h5gs3ETPOG2Ri+GOyH44D38YQVeQj8n7oVOVQi21zx93JOpdL3fWS9RytkfmvB84WwVzYoHGlTs3T80Gw==", "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { "@mobily/ts-belt": "^3.13.1", "@stellar/stellar-sdk": "^13.3.0", @@ -9854,7 +9844,6 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", "integrity": "sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@stellar/js-xdr": "^3.1.2", "base32.js": "^0.1.0", @@ -9875,7 +9864,6 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-13.3.0.tgz", "integrity": "sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@stellar/stellar-base": "^13.1.0", "axios": "^1.8.4", @@ -9895,7 +9883,6 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", "integrity": "sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@stellar/js-xdr": "^3.1.2", "base32.js": "^0.1.0", @@ -9916,7 +9903,6 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-13.3.0.tgz", "integrity": "sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@stellar/stellar-base": "^13.1.0", "axios": "^1.8.4", @@ -9936,7 +9922,6 @@ "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.6.4.tgz", "integrity": "sha512-/N3hhOFIIhufvihCx92wvxd15Wy9XAJOSbTiV8rYG2N9uBvzejctNO2+LpwCRl/cBKle9rsp4S7C/zz++iDuOg==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@ethereumjs/common": "^10.0.0", "@ethereumjs/tx": "^10.0.0", @@ -9980,7 +9965,6 @@ "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.3.6.tgz", "integrity": "sha512-Skya46inItcjaahaqpeSsQmB2Xle70f/l+6eTTJYxKQdpMtuW5LRsRRiyMAQTp5RBycL2ngnsVtY+/83Bt5lUw==", "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { "@trezor/analytics": "1.4.3" }, @@ -9993,7 +9977,6 @@ "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.4.4.tgz", "integrity": "sha512-xG2CoPjgcldtO6HU0ZjNCvFdQ4hpl56qzU1VEF1/A1BL2zj2TwLGLmyr4E878go1mmfksNGY5a1tqnzAZ7pRLw==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@trezor/env-utils": "1.4.3", "@trezor/type-utils": "1.1.9", @@ -10351,15 +10334,13 @@ "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 + "license": "MIT" }, "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==", "license": "MIT", - "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -10369,7 +10350,6 @@ "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.1.5.tgz", "integrity": "sha512-Bp3L9MvzYy1OhPcNJIPIPu7kAH1lQyI1ZMuGnIo53nLDcU+t7cWO8z8xpyGW1BAnQ9wn+xaqrycLRf76I0TBtA==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "peerDependencies": { "tslib": "^2.6.2" } @@ -10378,15 +10358,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.1.4.tgz", "integrity": "sha512-hFC0nVnWVFaWx0IfCsoHGvBrh5SKsnTHwrX5pvBotwOw51lzTDMd43CkA7nHRybkhcc2JgX1Qq2UbYdwgEWhPg==", - "license": "See LICENSE.md in repo root", - "peer": true + "license": "See LICENSE.md in repo root" }, "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==", "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { "ua-parser-js": "^2.0.4" }, @@ -10413,7 +10391,6 @@ "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.4.4.tgz", "integrity": "sha512-+DwcXkio4qlMkPu6KxnEfhXv5PHTkKh2n6Fo88i5zishUHpYD3NhCS0pouzti8PIPyJE73HQ9MoisG44KQjbtg==", "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { "@trezor/schema-utils": "1.3.4", "long": "5.2.5", @@ -10428,7 +10405,6 @@ "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.10.tgz", "integrity": "sha512-Ek5bHu2s4OAWOaJU5ksd1kcpe/STyLWOtUVTq6Vn4oMT3++qtrjWRQx/aTN/UaTfNoZlKvFXCC/STGlgBv9CKQ==", "license": "See LICENSE.md in repo root", - "peer": true, "peerDependencies": { "tslib": "^2.6.2" } @@ -10451,7 +10427,6 @@ "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.5.4.tgz", "integrity": "sha512-3vGn2IEofbzhKMyLjzmTCwVTE5Wj0gkncLCNc66DU95IEW5WlwNGt/nXSJCg9TMBHK6qtlbY1HOBFuUzEW2Q7w==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@trezor/protobuf": "1.4.4", "@trezor/protocol": "1.2.10", @@ -10468,15 +10443,13 @@ "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==", - "license": "See LICENSE.md in repo root", - "peer": true + "license": "See LICENSE.md in repo root" }, "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==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "bignumber.js": "^9.3.1" }, @@ -10489,7 +10462,6 @@ "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.4.4.tgz", "integrity": "sha512-rccdH3+iqvBL/Nkso/wGCdIXAQY+M/ubLIf/i/hBbcpRH6JoOg8oyaoaHzegsYNE6yHKnykTOZWz5Q4MTG02Bw==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@trezor/utils": "9.4.4", "bech32": "^2.0.0", @@ -10517,15 +10489,13 @@ "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 + "license": "MIT" }, "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" } @@ -10535,7 +10505,6 @@ "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.2.4.tgz", "integrity": "sha512-UgU31gFX8gY0abeI5DjRVnH4RfbXqHcOb019ogkR51KlfjkiWXTvUWKRLLqwslWiUIMEAI3ZFeXQds84b7Uw/Q==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, "dependencies": { "@trezor/utils": "9.4.4", "ws": "^8.18.0" @@ -10749,6 +10718,7 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -10803,7 +10773,6 @@ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*" } @@ -10867,6 +10836,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -10897,6 +10867,7 @@ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -10907,6 +10878,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -11065,6 +11037,7 @@ "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", @@ -12213,6 +12186,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -12283,6 +12257,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12647,7 +12622,6 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "license": "MIT", - "peer": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -12658,8 +12632,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ast-types-flow": { "version": "0.0.8", @@ -12745,7 +12718,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -12768,7 +12740,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12786,7 +12757,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -12804,7 +12774,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -12822,7 +12791,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -12833,7 +12801,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -12850,6 +12817,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -12887,7 +12855,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -13184,7 +13151,6 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "license": "MIT", - "peer": true, "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -13199,7 +13165,6 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "license": "MIT", - "peer": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -13211,7 +13176,6 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "license": "MIT", - "peer": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -13224,7 +13188,6 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "license": "MIT", - "peer": true, "dependencies": { "bn.js": "^5.2.1", "randombytes": "^2.1.0", @@ -13239,7 +13202,6 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "license": "ISC", - "peer": true, "dependencies": { "bn.js": "^5.2.2", "browserify-rsa": "^4.1.1", @@ -13259,15 +13221,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13282,15 +13242,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/browserify-sign/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13299,8 +13257,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/browserslist": { "version": "4.28.1", @@ -13322,6 +13279,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -13433,22 +13391,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT", - "peer": true - }, - "node_modules/bufferutil": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", - "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } + "license": "MIT" }, "node_modules/bundle-require": { "version": "5.1.0", @@ -13641,7 +13584,6 @@ "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.11.tgz", "integrity": "sha512-vIwORDd/WyB8Nc23o2zNN5RrtFGlR6Fca61TtjkUXueI3Jf2DOZDl1zsshvBntZ3wZHBM9ztjnkXSmzQDaq3WA==", "license": "MIT", - "peer": true, "dependencies": { "nofilter": "^3.0.2" }, @@ -13724,7 +13666,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13757,20 +13698,21 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/class-transformer": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/class-validator": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.15.1.tgz", "integrity": "sha512-LqoS80HBBSCVhz/3KloUly0ovokxpdOLR++Al3J3+dHXWt9sTKlKd4eYtoxhxyUjoe5+UcIM+5k9MIxyBWnRTw==", "license": "MIT", + "peer": true, "dependencies": { "@types/validator": "^13.15.3", "libphonenumber-js": "^1.11.1", @@ -14079,7 +14021,6 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "license": "MIT", - "peer": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -14089,8 +14030,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", @@ -14125,7 +14065,6 @@ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -14148,7 +14087,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14167,7 +14105,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14189,7 +14126,6 @@ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -14284,7 +14220,6 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "license": "MIT", - "peer": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -14670,7 +14605,6 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -14761,7 +14695,6 @@ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -14771,7 +14704,6 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "license": "MIT", - "peer": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -14782,8 +14714,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dijkstrajs": { "version": "1.0.3", @@ -15191,6 +15122,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -15261,6 +15193,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -15361,6 +15294,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -15462,6 +15396,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -15859,7 +15794,6 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "license": "MIT", - "peer": true, "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -15901,7 +15835,6 @@ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -15922,7 +15855,6 @@ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -15938,8 +15870,7 @@ "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 + "license": "Apache-2.0" }, "node_modules/express": { "version": "5.2.1", @@ -16806,7 +16737,6 @@ "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" } @@ -16816,7 +16746,6 @@ "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" } @@ -17352,7 +17281,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -17369,7 +17297,6 @@ "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" } @@ -17378,8 +17305,7 @@ "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 + "license": "ISC" }, "node_modules/human-signals": { "version": "2.1.0", @@ -17420,7 +17346,8 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/ieee754": { "version": "1.2.1", @@ -17834,15 +17761,13 @@ "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 + "license": "MIT" }, "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==", "license": "MIT", - "peer": true, "dependencies": { "generate-function": "^2.0.0", "generate-object-property": "^1.1.0", @@ -17901,8 +17826,7 @@ "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 + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", @@ -18186,7 +18110,6 @@ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -18202,7 +18125,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -18357,7 +18279,6 @@ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -18373,7 +18294,6 @@ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -18406,7 +18326,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18424,7 +18343,6 @@ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -18459,7 +18377,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18477,7 +18394,6 @@ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -18494,7 +18410,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -18516,7 +18431,6 @@ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -18563,7 +18477,6 @@ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18582,7 +18495,6 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -18593,7 +18505,6 @@ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -18613,7 +18524,6 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -18624,7 +18534,6 @@ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -18641,7 +18550,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18659,7 +18567,6 @@ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -18673,7 +18580,6 @@ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -18691,7 +18597,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18709,7 +18614,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -18728,7 +18632,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -18739,7 +18642,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -18766,7 +18668,6 @@ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -18781,7 +18682,6 @@ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -18798,7 +18698,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18816,7 +18715,6 @@ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -18838,7 +18736,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18856,7 +18753,6 @@ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -18890,7 +18786,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -18901,7 +18796,6 @@ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -18923,7 +18817,6 @@ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -18938,7 +18831,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18956,7 +18848,6 @@ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -18990,7 +18881,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19008,7 +18898,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -19019,7 +18908,6 @@ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19031,7 +18919,6 @@ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -19066,7 +18953,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19085,7 +18971,6 @@ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -19107,7 +18992,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -19118,7 +19002,6 @@ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -19151,7 +19034,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19169,7 +19051,6 @@ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -19188,7 +19069,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19206,7 +19086,6 @@ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -19225,7 +19104,6 @@ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -19239,7 +19117,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19257,7 +19134,6 @@ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -19278,7 +19154,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19296,7 +19171,6 @@ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -19313,7 +19187,6 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -19453,7 +19326,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -19517,7 +19389,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -20026,8 +19897,7 @@ "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 + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", @@ -20179,7 +20049,6 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "license": "MIT", - "peer": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -20192,8 +20061,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", @@ -20443,7 +20311,6 @@ "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" } @@ -20453,7 +20320,6 @@ "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", @@ -20478,15 +20344,13 @@ "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 + "license": "Apache-2.0" }, "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" }, @@ -20684,7 +20548,6 @@ "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.19" } @@ -21067,7 +20930,6 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", "license": "ISC", - "peer": true, "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", @@ -21201,7 +21063,6 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "license": "MIT", - "peer": true, "dependencies": { "create-hash": "^1.2.0", "create-hmac": "^1.1.7", @@ -21483,6 +21344,7 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -21512,7 +21374,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -21528,7 +21389,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -21541,8 +21401,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/prisma": { "version": "6.19.2", @@ -21550,6 +21409,7 @@ "integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "6.19.2", "@prisma/engines": "6.19.2" @@ -21587,7 +21447,6 @@ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -21661,7 +21520,6 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "license": "MIT", - "peer": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21675,8 +21533,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", @@ -21811,7 +21668,6 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "license": "MIT", - "peer": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -21841,6 +21697,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21871,6 +21728,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -21883,6 +21741,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.68.0.tgz", "integrity": "sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -22084,7 +21943,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", @@ -22238,7 +22098,6 @@ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -22448,6 +22307,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -22574,6 +22434,7 @@ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -22714,8 +22575,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.12", @@ -22908,8 +22768,7 @@ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", @@ -23088,7 +22947,6 @@ "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" } @@ -23858,6 +23716,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23904,7 +23763,6 @@ "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" } @@ -24167,7 +24025,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsup": { "version": "8.5.1", @@ -24499,6 +24358,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24960,20 +24820,6 @@ "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, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -25220,7 +25066,6 @@ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -25235,7 +25080,6 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -25431,7 +25275,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -25445,14 +25288,14 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", - "peer": true + "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==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -25495,7 +25338,6 @@ "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" } @@ -25641,6 +25483,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/packages/shared/package.json b/packages/shared/package.json index e48b964..70bd35a 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -6,6 +6,7 @@ "exports": { ".": "./src/index.ts", "./lib/utils": "./src/lib/utils.ts", - "./lib/sendTransactionService": "./src/lib/sendTransactionService.ts" + "./lib/sendTransactionService": "./src/lib/sendTransactionService.ts", + "./lib/httpClient": "./src/lib/httpClient.ts" } } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 4c94ff8..d61b66c 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,2 +1,3 @@ export * from "./lib/utils"; export * from "./lib/sendTransactionService"; +export * from "./lib/httpClient"; diff --git a/packages/shared/src/lib/httpClient.ts b/packages/shared/src/lib/httpClient.ts new file mode 100644 index 0000000..8fad1c2 --- /dev/null +++ b/packages/shared/src/lib/httpClient.ts @@ -0,0 +1,15 @@ +import axios, { type AxiosInstance } from "axios"; + +interface HttpClientOptions { + baseURL: string; + apiKey: string; +} + +export function createHttpClient({ baseURL, apiKey }: HttpClientOptions): AxiosInstance { + return axios.create({ + baseURL, + headers: { + "x-api-key": apiKey, + }, + }); +} From 9b9cbce227c262374a5dd1492dad4b4e6738357f Mon Sep 17 00:00:00 2001 From: JoelVR17 Date: Fri, 13 Mar 2026 03:51:25 -0600 Subject: [PATCH 2/2] fix: build error --- .../src/features/investments/hooks/useUserInvestments.hook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts b/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts index a03d853..6a32853 100644 --- a/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts +++ b/apps/investor-tokenization/src/features/investments/hooks/useUserInvestments.hook.ts @@ -10,7 +10,7 @@ export const useUserInvestments = () => { return useQuery({ queryKey: ["user-investments", walletAddress], - queryFn: () => fetchMyInvestments(walletAddress), + queryFn: () => fetchMyInvestments(walletAddress!), enabled: Boolean(walletAddress), staleTime: 1000 * 60 * 2, });