From 3ebd304441e11e1baba165e600f1734f04caafa1 Mon Sep 17 00:00:00 2001 From: feyishola Date: Fri, 27 Mar 2026 22:13:20 +0100 Subject: [PATCH] notification and toast system architecture implemented --- apps/web/app/layout.tsx | 7 +- apps/web/components/transaction-example.tsx | 172 ++++ apps/web/components/ui/toast-provider.tsx | 33 + apps/web/hooks/use-transaction-toast.ts | 102 +++ apps/web/lib/error-mapper.ts | 266 ++++++ apps/web/lib/toast.tsx | 181 ++++ apps/web/package-lock.json | 867 +------------------- apps/web/package.json | 4 +- 8 files changed, 787 insertions(+), 845 deletions(-) create mode 100644 apps/web/components/transaction-example.tsx create mode 100644 apps/web/components/ui/toast-provider.tsx create mode 100644 apps/web/hooks/use-transaction-toast.ts create mode 100644 apps/web/lib/error-mapper.ts create mode 100644 apps/web/lib/toast.tsx diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index f7fa87eb..c0c31280 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import { ToastProvider } from "@/components/ui/toast-provider"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -13,8 +14,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Lance - Decentralized Freelance Marketplace", + description: "Stellar-native freelance marketplace with AI-powered dispute resolution", }; export default function RootLayout({ @@ -27,7 +28,7 @@ export default function RootLayout({ - {children} + {children} ); diff --git a/apps/web/components/transaction-example.tsx b/apps/web/components/transaction-example.tsx new file mode 100644 index 00000000..7b8a6f05 --- /dev/null +++ b/apps/web/components/transaction-example.tsx @@ -0,0 +1,172 @@ +"use client"; + +import { useTransactionToast } from "@/hooks/use-transaction-toast"; +import { toast } from "@/lib/toast"; + +export function TransactionExample() { + const { executeTransaction, showLoading, updateToSuccess, updateToError } = + useTransactionToast(); + + const handleSimpleToast = () => { + toast.info({ + title: "Information", + description: "This is a simple info toast", + }); + }; + + const handleSuccessToast = () => { + toast.success({ + title: "Success!", + description: "Your action was completed successfully", + txHash: "a1b2c3d4e5f6g7h8i9j0", + }); + }; + + const handleErrorToast = () => { + toast.error({ + title: "Error Occurred", + description: "Something went wrong with your request", + }); + }; + + const handleWarningToast = () => { + toast.warning({ + title: "Warning", + description: "Please review your inputs before proceeding", + }); + }; + + const handleSimulatedTransaction = async () => { + await executeTransaction( + async () => { + await new Promise((resolve) => setTimeout(resolve, 3000)); + return { txHash: "simulated_tx_hash_12345" }; + }, + { + loadingMessage: "Creating escrow deposit...", + successMessage: "Escrow deposit confirmed!", + errorMessage: "Failed to create escrow deposit", + }, + { + onSuccess: (txHash) => { + console.log("Transaction succeeded:", txHash); + }, + onError: (error) => { + console.error("Transaction failed:", error); + }, + } + ); + }; + + const handleSimulatedError = async () => { + await executeTransaction( + async () => { + await new Promise((_, reject) => + setTimeout(() => reject(new Error("tx_insufficient_balance")), 2000) + ); + return { txHash: "" }; + }, + { + loadingMessage: "Processing payment...", + successMessage: "Payment completed!", + errorMessage: "Payment failed", + } + ); + }; + + const handleManualFlow = async () => { + const loadingToast = showLoading( + "Submitting job...", + "Please wait while we process your job posting" + ); + + try { + await new Promise((resolve) => setTimeout(resolve, 2000)); + + updateToSuccess( + loadingToast, + "Job Posted!", + "Your job has been successfully posted to the marketplace", + "job_tx_abc123" + ); + } catch { + updateToError( + loadingToast, + "Failed to Post Job", + "There was an error posting your job. Please try again." + ); + } + }; + + return ( +
+

Toast Notification Examples

+ +
+ + + + + + + +
+ +

Transaction Flows

+ +
+ + + + + +
+ +
+

Features demonstrated:

+
    +
  • Five toast types: info, success, error, warning, loading
  • +
  • Automatic transaction hash linking to Stellar Explorer
  • +
  • Error code mapping from Stellar SDK to human-readable messages
  • +
  • Async toast updates (loading → success/error)
  • +
  • Auto-timeout with appropriate durations per toast type
  • +
+
+
+ ); +} diff --git a/apps/web/components/ui/toast-provider.tsx b/apps/web/components/ui/toast-provider.tsx new file mode 100644 index 00000000..a04acbb7 --- /dev/null +++ b/apps/web/components/ui/toast-provider.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { Toaster } from "sonner"; +import type { ReactNode } from "react"; + +interface ToastProviderProps { + children: ReactNode; +} + +export function ToastProvider({ children }: ToastProviderProps) { + return ( + <> + {children} + + + ); +} diff --git a/apps/web/hooks/use-transaction-toast.ts b/apps/web/hooks/use-transaction-toast.ts new file mode 100644 index 00000000..3c66b84a --- /dev/null +++ b/apps/web/hooks/use-transaction-toast.ts @@ -0,0 +1,102 @@ +"use client"; + +import { useCallback } from "react"; +import { toast, type ToastState } from "@/lib/toast"; +import { mapErrorToToast } from "@/lib/error-mapper"; + +export interface TransactionCallbacks { + onSuccess?: (txHash: string) => void; + onError?: (error: Error) => void; +} + +export interface TransactionConfig { + loadingMessage?: string; + successMessage?: string; + errorMessage?: string; +} + +export function useTransactionToast() { + const executeTransaction = useCallback( + async ( + operation: () => Promise, + config: TransactionConfig = {}, + callbacks?: TransactionCallbacks + ): Promise => { + const { + loadingMessage = "Processing transaction...", + successMessage = "Transaction completed successfully", + errorMessage = "Transaction failed", + } = config; + + const loadingToast = toast.loading({ + title: loadingMessage, + description: "Please wait while we confirm your transaction on the Stellar network", + }); + + try { + const result = await operation(); + + toast.update(loadingToast, "success", { + title: successMessage, + description: "Your transaction has been confirmed on the blockchain", + txHash: result.txHash, + }); + + if (result.txHash && callbacks?.onSuccess) { + callbacks.onSuccess(result.txHash); + } + + return result; + } catch (error) { + const errorToast = mapErrorToToast(error); + + toast.update(loadingToast, "error", { + title: errorToast.title || errorMessage, + description: errorToast.description, + }); + + if (callbacks?.onError && error instanceof Error) { + callbacks.onError(error); + } + + return null; + } + }, + [] + ); + + const showLoading = useCallback((title: string, description?: string): ToastState => { + return toast.loading({ title, description }); + }, []); + + const updateToSuccess = useCallback( + ( + state: ToastState, + title: string, + description?: string, + txHash?: string + ): void => { + toast.update(state, "success", { title, description, txHash }); + }, + [] + ); + + const updateToError = useCallback( + (state: ToastState, title: string, description?: string): void => { + toast.update(state, "error", { title, description }); + }, + [] + ); + + const dismiss = useCallback((state: ToastState): void => { + toast.dismiss(state); + }, []); + + return { + executeTransaction, + showLoading, + updateToSuccess, + updateToError, + dismiss, + }; +} diff --git a/apps/web/lib/error-mapper.ts b/apps/web/lib/error-mapper.ts new file mode 100644 index 00000000..a8751fad --- /dev/null +++ b/apps/web/lib/error-mapper.ts @@ -0,0 +1,266 @@ +export interface ErrorToast { + title: string; + description: string; +} + +interface StellarError { + response?: { + data?: { + extras?: { + result_codes?: { + transaction?: string | string[]; + operations?: string[]; + }; + }; + }; + status?: number; + statusText?: string; + }; + message?: string; +} + +const STELLAR_ERROR_MAP: Record = { + tx_bad_seq: { + title: "Transaction Sequence Error", + description: "Your wallet is out of sync. Please refresh the page and try again.", + }, + tx_insufficient_balance: { + title: "Insufficient Funds", + description: "Your wallet doesn't have enough XLM to complete this transaction.", + }, + tx_bad_auth: { + title: "Authentication Failed", + description: "Transaction signature is invalid. Please check your wallet connection.", + }, + tx_bad_auth_extra: { + title: "Extra Authentication Required", + description: "Additional signatures are needed for this transaction.", + }, + tx_fee_bump_inner_failed: { + title: "Fee Bump Failed", + description: "The inner transaction failed during fee bump processing.", + }, + tx_insufficient_fee: { + title: "Fee Too Low", + description: "The transaction fee offered is below the network minimum.", + }, + tx_no_source_account: { + title: "Source Account Not Found", + description: "The source account does not exist on the Stellar network.", + }, + tx_too_early: { + title: "Transaction Too Early", + description: "The transaction time bounds have not yet been reached.", + }, + tx_too_late: { + title: "Transaction Expired", + description: "The transaction time bounds have already passed.", + }, + tx_missing_operation: { + title: "Missing Operation", + description: "No operations were included in this transaction.", + }, + tx_bad_min_seq_age_or_gap: { + title: "Invalid Sequence Requirements", + description: "The minimum sequence age or gap conditions were not met.", + }, + tx_malformed: { + title: "Malformed Transaction", + description: "The transaction format is invalid. Please try again.", + }, + op_underfunded: { + title: "Insufficient Escrow Funds", + description: "The escrow account doesn't have enough funds for this operation.", + }, + op_over_source_max: { + title: "Exceeds Maximum Amount", + description: "The operation amount exceeds the specified maximum.", + }, + op_line_full: { + title: "Trust Line Full", + description: "The destination trust line has reached its limit.", + }, + op_no_trust: { + title: "No Trust Line", + description: "The destination account doesn't trust this asset.", + }, + op_not_authorized: { + title: "Not Authorized", + description: "You don't have permission to perform this operation.", + }, + op_low_reserve: { + title: "Low Reserve", + description: "This operation would drop the account below the minimum reserve.", + }, + op_cross_self: { + title: "Self Trade", + description: "This operation would result in a trade with yourself.", + }, + op_over_dest_max: { + title: "Exceeds Destination Maximum", + description: "The operation would exceed the destination maximum.", + }, + op_buy_no_trust: { + title: "No Trust Line for Buying", + description: "The buying account doesn't have a trust line for this asset.", + }, + op_sell_no_trust: { + title: "No Trust Line for Selling", + description: "The selling account doesn't have a trust line for this asset.", + }, + op_buy_not_authorized: { + title: "Not Authorized to Buy", + description: "The buying account is not authorized to hold this asset.", + }, + op_sell_not_authorized: { + title: "Not Authorized to Sell", + description: "The selling account is not authorized to hold this asset.", + }, + op_sponsor_not_sponsored: { + title: "Not Sponsored", + description: "The entry is not sponsored by any account.", + }, +}; + +const BACKEND_ERROR_MAP: Record = { + "401": { + title: "Not Authorized", + description: "You don't have permission to perform this action.", + }, + "403": { + title: "Access Denied", + description: "You don't have access to this resource.", + }, + "404": { + title: "Not Found", + description: "The requested resource could not be found.", + }, + "409": { + title: "Conflict", + description: "This action conflicts with the current state. Please refresh and try again.", + }, + "422": { + title: "Validation Error", + description: "The provided data is invalid. Please check your inputs and try again.", + }, + "429": { + title: "Rate Limited", + description: "Too many requests. Please wait a moment before trying again.", + }, + "500": { + title: "Server Error", + description: "Something went wrong on our end. Please try again later.", + }, + "502": { + title: "Service Unavailable", + description: "The service is temporarily unavailable. Please try again later.", + }, + "503": { + title: "Service Overloaded", + description: "The service is currently overloaded. Please try again in a moment.", + }, +}; + +const WALLET_ERROR_MAP: Record = { + "User declined access": { + title: "Wallet Connection Declined", + description: "You declined the wallet connection request. Please try again.", + }, + "User rejected the request": { + title: "Transaction Rejected", + description: "You rejected the transaction in your wallet.", + }, + "Wallet not connected": { + title: "Wallet Not Connected", + description: "Please connect your wallet first before performing this action.", + }, + "Freighter is not installed": { + title: "Freighter Not Found", + description: "Please install the Freighter wallet extension to continue.", + }, + "Network mismatch": { + title: "Network Mismatch", + description: "Your wallet is on a different network. Please switch to the correct network.", + }, +}; + +export function mapErrorToToast(error: unknown): ErrorToast { + if (error instanceof Error) { + const message = error.message; + + for (const [key, value] of Object.entries(WALLET_ERROR_MAP)) { + if (message.includes(key)) { + return value; + } + } + + for (const [key, value] of Object.entries(STELLAR_ERROR_MAP)) { + if (message.includes(key)) { + return value; + } + } + + const stellarError = error as StellarError; + if (stellarError.response?.data?.extras?.result_codes) { + const resultCodes = stellarError.response.data.extras.result_codes; + + if (typeof resultCodes.transaction === "string") { + const mapped = STELLAR_ERROR_MAP[resultCodes.transaction]; + if (mapped) return mapped; + } + + if (Array.isArray(resultCodes.transaction)) { + for (const code of resultCodes.transaction) { + const mapped = STELLAR_ERROR_MAP[code]; + if (mapped) return mapped; + } + } + + if (resultCodes.operations) { + for (const opCode of resultCodes.operations) { + const mapped = STELLAR_ERROR_MAP[opCode]; + if (mapped) return mapped; + } + } + } + + if (stellarError.response?.status) { + const statusCode = String(stellarError.response.status); + const mapped = BACKEND_ERROR_MAP[statusCode]; + if (mapped) return mapped; + } + + return { + title: "Transaction Failed", + description: message || "An unexpected error occurred. Please try again.", + }; + } + + if (typeof error === "string") { + for (const [key, value] of Object.entries(STELLAR_ERROR_MAP)) { + if (error.includes(key)) { + return value; + } + } + + return { + title: "Error", + description: error, + }; + } + + return { + title: "Unknown Error", + description: "An unexpected error occurred. Please try again.", + }; +} + +export function mapBackendError(statusCode: number, message?: string): ErrorToast { + const mapped = BACKEND_ERROR_MAP[String(statusCode)]; + if (mapped) return mapped; + + return { + title: "Request Failed", + description: message || `Request failed with status ${statusCode}`, + }; +} diff --git a/apps/web/lib/toast.tsx b/apps/web/lib/toast.tsx new file mode 100644 index 00000000..9e8597d4 --- /dev/null +++ b/apps/web/lib/toast.tsx @@ -0,0 +1,181 @@ +"use client"; + +import { toast as sonnerToast, type ToastT } from "sonner"; +import { Loader2, CheckCircle, XCircle, AlertCircle, Info } from "lucide-react"; +import type { ReactNode } from "react"; + +export type ToastType = "info" | "warning" | "success" | "error" | "loading"; + +export interface ToastOptions { + id?: string; + title: string; + description?: string; + duration?: number; + action?: { + label: string; + onClick: () => void; + }; +} + +interface ToastState { + id: string | number; + type: ToastType; +} + +const STELLAR_EXPLORER_URL = + process.env.NEXT_PUBLIC_STELLAR_NETWORK === "PUBLIC" + ? "https://stellar.expert/explorer/public/tx" + : "https://stellar.expert/explorer/testnet/tx"; + +function getIcon(type: ToastType): ReactNode { + switch (type) { + case "loading": + return ; + case "success": + return ; + case "error": + return ; + case "warning": + return ; + case "info": + default: + return ; + } +} + +function createToastContent( + type: ToastType, + title: string, + description?: string, + txHash?: string +): ReactNode { + return ( +
+
+ {getIcon(type)} + {title} +
+ {description && ( +

{description}

+ )} + {txHash && ( + e.stopPropagation()} + > + View on Stellar Explorer → + + )} +
+ ); +} + +export const toast = { + info: (options: ToastOptions): ToastState => { + const id = + options.id ?? + sonnerToast.info(createToastContent("info", options.title, options.description), { + duration: options.duration ?? 5000, + }); + return { id, type: "info" }; + }, + + warning: (options: ToastOptions): ToastState => { + const id = + options.id ?? + sonnerToast.warning( + createToastContent("warning", options.title, options.description), + { + duration: options.duration ?? 7000, + } + ); + return { id, type: "warning" }; + }, + + success: (options: ToastOptions & { txHash?: string }): ToastState => { + const id = + options.id ?? + sonnerToast.success( + createToastContent("success", options.title, options.description, options.txHash), + { + duration: options.duration ?? 5000, + } + ); + return { id, type: "success" }; + }, + + error: (options: ToastOptions): ToastState => { + const id = + options.id ?? + sonnerToast.error(createToastContent("error", options.title, options.description), { + duration: options.duration ?? 8000, + }); + return { id, type: "error" }; + }, + + loading: (options: ToastOptions): ToastState => { + const id = sonnerToast.loading( + createToastContent("loading", options.title, options.description), + { + duration: Infinity, + } + ); + return { id, type: "loading" }; + }, + + update: ( + state: ToastState, + newType: Exclude, + options: Omit & { txHash?: string } + ): void => { + sonnerToast.dismiss(state.id); + + switch (newType) { + case "success": + sonnerToast.success( + createToastContent("success", options.title, options.description, options.txHash), + { + duration: options.duration ?? 5000, + } + ); + break; + case "error": + sonnerToast.error( + createToastContent("error", options.title, options.description), + { + duration: options.duration ?? 8000, + } + ); + break; + case "warning": + sonnerToast.warning( + createToastContent("warning", options.title, options.description), + { + duration: options.duration ?? 7000, + } + ); + break; + case "info": + sonnerToast.info( + createToastContent("info", options.title, options.description), + { + duration: options.duration ?? 5000, + } + ); + break; + } + }, + + dismiss: (state: ToastState): void => { + sonnerToast.dismiss(state.id); + }, + + dismissAll: (): void => { + sonnerToast.dismiss(); + }, +}; + +export type { ToastState }; diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json index 1a2b4060..965b4eb3 100644 --- a/apps/web/package-lock.json +++ b/apps/web/package-lock.json @@ -9,9 +9,11 @@ "version": "0.1.0", "dependencies": { "@creit.tech/stellar-wallets-kit": "^2.0.1", + "lucide-react": "^1.7.0", "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "sonner": "^2.0.7" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -1462,34 +1464,6 @@ "@tybys/wasm-util": "^0.10.0" } }, - "node_modules/@near-js/accounts": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@near-js/accounts/-/accounts-1.4.1.tgz", - "integrity": "sha512-ni3QT9H3NdrbVVKyx56yvz93r89Dvpc/vgVtiIK2OdXjkK6jcj+UKMDRQ6F7rd9qJOInLkHZbVBtcR6j1CXLjw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/providers": "1.0.3", - "@near-js/signers": "0.2.2", - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "@noble/hashes": "1.7.1", - "borsh": "1.0.0", - "depd": "2.0.0", - "is-my-json-valid": "^2.20.6", - "lru_map": "0.4.1", - "near-abi": "0.2.0" - } - }, - "node_modules/@near-js/accounts/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@near-js/crypto": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-1.4.2.tgz", @@ -1510,132 +1484,6 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", "license": "Apache-2.0" }, - "node_modules/@near-js/keystores": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.2.2.tgz", - "integrity": "sha512-DLhi/3a4qJUY+wgphw2Jl4S+L0AKsUYm1mtU0WxKYV5OBwjOXvbGrXNfdkheYkfh3nHwrQgtjvtszX6LrRXLLw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/types": "0.3.1" - } - }, - "node_modules/@near-js/keystores-browser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@near-js/keystores-browser/-/keystores-browser-0.2.2.tgz", - "integrity": "sha512-Pxqm7WGtUu6zj32vGCy9JcEDpZDSB5CCaLQDTQdF3GQyL0flyRv2I/guLAgU5FLoYxU7dJAX9mslJhPW7P2Bfw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2" - } - }, - "node_modules/@near-js/keystores-node": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@near-js/keystores-node/-/keystores-node-0.1.2.tgz", - "integrity": "sha512-MWLvTszZOVziiasqIT/LYNhUyWqOJjDGlsthOsY6dTL4ZcXjjmhmzrbFydIIeQr+CcEl5wukTo68ORI9JrHl6g==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2" - } - }, - "node_modules/@near-js/providers": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@near-js/providers/-/providers-1.0.3.tgz", - "integrity": "sha512-VJMboL14R/+MGKnlhhE3UPXCGYvMd1PpvF9OqZ9yBbulV7QVSIdTMfY4U1NnDfmUC2S3/rhAEr+3rMrIcNS7Fg==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "borsh": "1.0.0", - "exponential-backoff": "^3.1.2" - }, - "optionalDependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@near-js/providers/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@near-js/providers/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@near-js/signers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.2.2.tgz", - "integrity": "sha512-M6ib+af9zXAPRCjH2RyIS0+RhCmd9gxzCeIkQ+I2A3zjgGiEDkBZbYso9aKj8Zh2lPKKSH7h+u8JGymMOSwgyw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2", - "@noble/hashes": "1.3.3" - } - }, - "node_modules/@near-js/signers/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@near-js/transactions": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@near-js/transactions/-/transactions-1.3.3.tgz", - "integrity": "sha512-1AXD+HuxlxYQmRTLQlkVmH+RAmV3HwkAT8dyZDu+I2fK/Ec9BQHXakOJUnOBws3ihF+akQhamIBS5T0EXX/Ylw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/signers": "0.2.2", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "@noble/hashes": "1.7.1", - "borsh": "1.0.0" - } - }, - "node_modules/@near-js/transactions/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@near-js/types": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.3.1.tgz", @@ -1654,31 +1502,6 @@ "mustache": "4.0.0" } }, - "node_modules/@near-js/wallet-account": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@near-js/wallet-account/-/wallet-account-1.3.3.tgz", - "integrity": "sha512-GDzg/Kz0GBYF7tQfyQQQZ3vviwV8yD+8F2lYDzsWJiqIln7R1ov0zaXN4Tii86TeS21KPn2hHAsVu3Y4txa8OQ==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/accounts": "1.4.1", - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2", - "@near-js/providers": "1.0.3", - "@near-js/signers": "0.2.2", - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "borsh": "1.0.0" - } - }, - "node_modules/@near-js/wallet-account/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@near-wallet-selector/core": { "version": "8.10.2", "resolved": "https://registry.npmjs.org/@near-wallet-selector/core/-/core-8.10.2.tgz", @@ -3499,244 +3322,6 @@ "tailwindcss": "4.2.1" } }, - "node_modules/@trezor/analytics": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.5.0.tgz", - "integrity": "sha512-evILW5XJEmfPlf0TY1duOLtGJ47pdGeSKVE3P75ODEUsRNxtPVqlkOUBPmYpCxPnzS8XDmkatT8lf9/DF0G6nA==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/env-utils": "1.5.0", - "@trezor/utils": "9.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.6.1.tgz", - "integrity": "sha512-SPwxkihOMI0o79BOy0RkfgVL2meuJhIe1yWHCeR8uoqf5KGblUyeXxvNCy6w8ckJ9LRpM1+bZhsUODuNs3083Q==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@solana-program/compute-budget": "^0.8.0", - "@solana-program/stake": "^0.2.1", - "@solana-program/token": "^0.5.1", - "@solana-program/token-2022": "^0.4.2", - "@solana/kit": "^2.3.0", - "@solana/rpc-types": "^2.3.0", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/blockchain-link-types": "1.5.0", - "@trezor/blockchain-link-utils": "1.5.1", - "@trezor/env-utils": "1.5.0", - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0", - "@trezor/websocket-client": "1.3.0", - "@types/web": "^0.0.197", - "crypto-browserify": "3.12.0", - "socks-proxy-agent": "8.0.5", - "stream-browserify": "^3.0.0", - "xrpl": "4.4.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-types": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.5.1.tgz", - "integrity": "sha512-Idavz6LwLBW8sXc69fh5AJEnl666EDl2Nt3io7updvBgOR0/P12I900DgjNhCKtiWuv66A33/5RE7zLcj3lfnw==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-utils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.5.2.tgz", - "integrity": "sha512-OSS5OEE98FMnYfjoEALPjBt7ebjC/FKnq3HOolHdEWXBpVlXZNN2+Vo1R9J6WbZUU087sHuUTJJy/GJYWY13Tg==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@mobily/ts-belt": "^3.13.1", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/env-utils": "1.5.0", - "@trezor/protobuf": "1.5.2", - "@trezor/utils": "9.5.0", - "xrpl": "4.4.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-utils/node_modules/@stellar/stellar-sdk": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz", - "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@stellar/stellar-base": "^14.0.1", - "axios": "^1.12.2", - "bignumber.js": "^9.3.1", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@stellar/stellar-sdk": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz", - "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@stellar/stellar-base": "^14.0.1", - "axios": "^1.12.2", - "bignumber.js": "^9.3.1", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@trezor/blockchain-link-types": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.5.0.tgz", - "integrity": "sha512-wD6FKKxNr89MTWYL+NikRkBcWXhiWNFR0AuDHW6GHmlCEHhKu/hAvQtcER8X5jt/Wd0hSKNZqtHBXJ1ZkpJ6rg==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@trezor/blockchain-link-utils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.5.1.tgz", - "integrity": "sha512-2tDGLEj5jzydjsJQONGTWVmCDDy6FTZ4ytr1/2gE6anyYEJU8MbaR+liTt3UvcP5jwZTNutwYLvZixRfrb8JpA==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@mobily/ts-belt": "^3.13.1", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/env-utils": "1.5.0", - "@trezor/protobuf": "1.5.1", - "@trezor/utils": "9.5.0", - "xrpl": "4.4.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@trezor/protobuf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.1.tgz", - "integrity": "sha512-nAkaCCAqLpErBd+IuKeG5MpbyLR/2RMgCw18TWc80m1Ws/XgQirhHY9Jbk6gLImTXb9GTrxP0+MDSahzd94rSA==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/schema-utils": "1.4.0", - "long": "5.2.5", - "protobufjs": "7.4.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect": { - "version": "9.7.2", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.7.2.tgz", - "integrity": "sha512-Sn6F4mNH+yi2vAHy29kwhs50bRLn92drg3znm3pkY+8yEBxI4MmuP8sKYjdgUEJnQflWh80KlcvEDeVa4olVRA==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@ethereumjs/common": "^10.1.0", - "@ethereumjs/tx": "^10.1.0", - "@fivebinaries/coin-selection": "3.0.0", - "@mobily/ts-belt": "^3.13.1", - "@noble/hashes": "^1.6.1", - "@scure/bip39": "^1.5.1", - "@solana-program/compute-budget": "^0.8.0", - "@solana-program/system": "^0.7.0", - "@solana-program/token": "^0.5.1", - "@solana-program/token-2022": "^0.4.2", - "@solana/kit": "^2.3.0", - "@trezor/blockchain-link": "2.6.1", - "@trezor/blockchain-link-types": "1.5.1", - "@trezor/blockchain-link-utils": "1.5.2", - "@trezor/connect-analytics": "1.4.0", - "@trezor/connect-common": "0.5.1", - "@trezor/crypto-utils": "1.2.0", - "@trezor/device-authenticity": "1.1.2", - "@trezor/device-utils": "1.2.0", - "@trezor/env-utils": "^1.5.0", - "@trezor/protobuf": "1.5.2", - "@trezor/protocol": "1.3.0", - "@trezor/schema-utils": "1.4.0", - "@trezor/transport": "1.6.2", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0", - "blakejs": "^1.2.1", - "bs58": "^6.0.0", - "bs58check": "^4.0.0", - "cbor": "^10.0.10", - "cross-fetch": "^4.0.0", - "jws": "^4.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-analytics": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.4.0.tgz", - "integrity": "sha512-hy2J2oeIhRC/e1bOWXo5dsVMVnDwO2UKnxhR6FD8PINR3jgM6PWAXc6k33WJsBcyiTzwMP7/xPysLcgNJH5o4w==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/analytics": "1.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-common": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.5.1.tgz", - "integrity": "sha512-wdpVCwdylBh4SBO5Ys40tB/d59UlfjmxgBHDkkLgaR+JcqkthCfiw5VlUrV9wu65lquejAZhA5KQL4mUUUhCow==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/env-utils": "1.5.0", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, "node_modules/@trezor/connect-plugin-stellar": { "version": "9.2.3", "resolved": "https://registry.npmjs.org/@trezor/connect-plugin-stellar/-/connect-plugin-stellar-9.2.3.tgz", @@ -4084,213 +3669,6 @@ "tslib": "^2.6.2" } }, - "node_modules/@trezor/crypto-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.2.0.tgz", - "integrity": "sha512-9i1NrfW1IE6JO910ut7xrx4u5LxE++GETbpJhWLj4P5xpuGDDSDLEn/MXaYisls2DpE897aOrGPaa1qyt8V6tw==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/device-authenticity": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@trezor/device-authenticity/-/device-authenticity-1.1.2.tgz", - "integrity": "sha512-313uSXYR4XKDv3CjtCpgHA+yEe9xxqN7EFl/D68FEn70SPsuWI0+2zUvjPPh6TIOh/EcLv7hCO/QTHUAGd7ZWQ==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@noble/curves": "^2.0.1", - "@trezor/crypto-utils": "1.2.0", - "@trezor/protobuf": "1.5.2", - "@trezor/schema-utils": "1.4.0", - "@trezor/utils": "9.5.0" - } - }, - "node_modules/@trezor/device-authenticity/node_modules/@noble/curves": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", - "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "2.0.1" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@trezor/device-authenticity/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@trezor/device-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.2.0.tgz", - "integrity": "sha512-Aqp7pIooFTx21zRUtTI6i1AS4d9Lrx7cclvksh2nJQF9WJvbzuCXshEGkLoOsHwhQrCl3IXfbGuMdA12yDenPA==", - "license": "See LICENSE.md in repo root", - "peer": true - }, - "node_modules/@trezor/env-utils": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz", - "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "ua-parser-js": "^2.0.4" - }, - "peerDependencies": { - "expo-constants": "*", - "expo-localization": "*", - "react-native": "*", - "tslib": "^2.6.2" - }, - "peerDependenciesMeta": { - "expo-constants": { - "optional": true - }, - "expo-localization": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@trezor/protobuf": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.2.tgz", - "integrity": "sha512-zViaL1jKue8DUTVEDg0C/lMipqNMd/Z3kr29/+MeZOoupjaXIQ2Lqp3WAMe8hvNTKKX8aNQH9JrbapJ6w9FMXw==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/schema-utils": "1.4.0", - "long": "5.2.5", - "protobufjs": "7.4.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/protocol": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.3.0.tgz", - "integrity": "sha512-rmrxbDrdgxTouBPbZcSeqU7ba/e5WVT1dxvxxEntHqRdTiDl7d3VK+BErCrlyol8EH5YCqEF3/rXt0crSOfoFw==", - "license": "See LICENSE.md in repo root", - "peer": true, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/schema-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.4.0.tgz", - "integrity": "sha512-K7upSeh7VDrORaIC4KAxYVW93XNlohmUnH5if/5GKYmTdQSRp1nBkO6Jm+Z4hzIthdnz/1aLgnbeN3bDxWLRxA==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.33.7", - "ts-mixer": "^6.0.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/transport": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.6.2.tgz", - "integrity": "sha512-w0HlD1fU+qTGO3tefBGHF/YS/ts/TWFja9FGIJ4+7+Z9NphvIG06HGvy2HzcD9AhJy9pvDeIsyoM2TTZTiyjkQ==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/protobuf": "1.5.2", - "@trezor/protocol": "1.3.0", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0", - "cross-fetch": "^4.0.0", - "usb": "^2.15.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/type-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.2.0.tgz", - "integrity": "sha512-+E2QntxkyQuYfQQyl8RvT01tq2i5Dp/LFUOXuizF+KVOqsZBjBY43j5hewcCO3+MokD7deDiPyekbUEN5/iVlw==", - "license": "See LICENSE.md in repo root", - "peer": true - }, - "node_modules/@trezor/utils": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.5.0.tgz", - "integrity": "sha512-kdyMyDbxzvOZmwBNvTjAK+C/kzyOz8T4oUbFvq+KaXn5mBFf1uf8rq5X2HkxgdYRPArtHS3PxLKsfkNCdhCYtQ==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "bignumber.js": "^9.3.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/utxo-lib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.5.0.tgz", - "integrity": "sha512-Fa2cZh0037oX6AHNLfpFIj65UR/OoX0ZJTocFuQASe77/1PjZHysf6BvvGfmzuFToKfrAQ+DM/1Sx+P/vnyNmA==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "bech32": "^2.0.0", - "bip66": "^2.0.0", - "bitcoin-ops": "^1.4.1", - "blake-hash": "^2.0.0", - "blakejs": "^1.2.1", - "bn.js": "^5.2.2", - "bs58": "^6.0.0", - "bs58check": "^4.0.0", - "cashaddrjs": "0.4.4", - "create-hmac": "^1.1.7", - "int64-buffer": "^1.1.0", - "pushdata-bitcoin": "^1.0.1", - "tiny-secp256k1": "^1.1.7", - "typeforce": "^1.18.0", - "varuint-bitcoin": "2.0.0", - "wif": "^5.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/websocket-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.3.0.tgz", - "integrity": "sha512-9KQSaVc3NtmM6rFFj1e+9bM0C5mVKVidbnxlfzuBJu7G2YMRdIdLPcAXhvmRZjs40uzDuBeApK+p547kODz2ug==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "ws": "^8.18.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -4322,6 +3700,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -4344,7 +3723,7 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -7803,13 +7182,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", @@ -7874,13 +7246,6 @@ "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", "license": "MIT" }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "license": "CC0-1.0", - "peer": true - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -8061,26 +7426,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-property": "^1.0.0" - } - }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -8448,40 +7793,6 @@ "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==", "license": "Apache-2.0" }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "license": "MIT", - "peer": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC", - "peer": true - }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -8837,27 +8148,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-my-ip-valid": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", - "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", - "license": "MIT", - "peer": true - }, - "node_modules/is-my-json-valid": { - "version": "2.20.6", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", - "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", - "license": "MIT", - "peer": true, - "dependencies": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^5.0.0", - "xtend": "^4.0.0" - } - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -8898,13 +8188,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT", - "peer": true - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -9284,16 +8567,6 @@ "node": ">=6" } }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -9715,13 +8988,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lru_map": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.4.1.tgz", - "integrity": "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==", - "license": "MIT", - "peer": true - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -9732,6 +8998,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.7.0.tgz", + "integrity": "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -9932,70 +9207,6 @@ "dev": true, "license": "MIT" }, - "node_modules/near-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/near-abi/-/near-abi-0.2.0.tgz", - "integrity": "sha512-kCwSf/3fraPU2zENK18sh+kKG4uKbEUEQdyWQkmW8ZofmLarObIz2+zAYjA1teDZLeMvEQew3UysnPDXgjneaA==", - "license": "(MIT AND Apache-2.0)", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.11" - } - }, - "node_modules/near-api-js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/near-api-js/-/near-api-js-5.1.1.tgz", - "integrity": "sha512-h23BGSKxNv8ph+zU6snicstsVK1/CTXsQz4LuGGwoRE24Hj424nSe4+/1tzoiC285Ljf60kPAqRCmsfv9etF2g==", - "license": "(MIT AND Apache-2.0)", - "peer": true, - "dependencies": { - "@near-js/accounts": "1.4.1", - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2", - "@near-js/keystores-browser": "0.2.2", - "@near-js/keystores-node": "0.1.2", - "@near-js/providers": "1.0.3", - "@near-js/signers": "0.2.2", - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "@near-js/wallet-account": "1.3.3", - "@noble/curves": "1.8.1", - "borsh": "1.0.0", - "depd": "2.0.0", - "http-errors": "1.7.2", - "near-abi": "0.2.0", - "node-fetch": "2.6.7" - } - }, - "node_modules/near-api-js/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/near-api-js/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/next": { "version": "16.1.6", "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", @@ -11321,13 +10532,6 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "license": "ISC", - "peer": true - }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", @@ -11581,6 +10785,16 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -11606,16 +10820,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -12029,16 +11233,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", @@ -12214,6 +11408,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -12947,16 +12142,6 @@ "node": ">=18.0.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -13074,7 +12259,7 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/apps/web/package.json b/apps/web/package.json index 5a20bdc9..d1993daa 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -10,9 +10,11 @@ }, "dependencies": { "@creit.tech/stellar-wallets-kit": "^2.0.1", + "lucide-react": "^1.7.0", "next": "16.1.6", "react": "19.2.3", - "react-dom": "19.2.3" + "react-dom": "19.2.3", + "sonner": "^2.0.7" }, "devDependencies": { "@tailwindcss/postcss": "^4",