diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index b7c8978..b609920 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -1,8 +1,5 @@ "use client"; - - - import { useState } from "react"; import DashboardHome from "@/components/dashboard/tabs/dashboard"; import QrPayment from "@/components/dashboard/tabs/qr-payment"; @@ -22,15 +19,15 @@ import { MobileBottomNav } from "@/components/dashboard/mobile-bottom-nav"; import SendFunds from "@/components/dashboard/tabs/send-funds"; import { ToastContainer } from "@/components/modals/toastContainer"; import { useNotifications } from "@/components/hooks/useNotifications"; +import TopUp from "@/components/dashboard/tabs/top-up"; export default function Dashboard() { const [activeTab, setActiveTab] = useState("Dashboard"); - const { toasts, removeToast } = useNotifications(); + const { toasts, removeToast } = useNotifications(); return (
-
@@ -38,13 +35,12 @@ export default function Dashboard() {
- {activeTab === "Dashboard" && ( )} - + - {activeTab === "Qr Payment" && } + {activeTab === "QR Payment" && } {activeTab === "Payment split" && } {activeTab === "Swap" && } {activeTab === "profile" && } @@ -55,14 +51,13 @@ export default function Dashboard() { {activeTab === "Notification" && } {activeTab === "Help" && } {activeTab === "Send" && } - + {activeTab === "Top Up" && }
-
); } diff --git a/components/context/AuthContext.tsx b/components/context/AuthContext.tsx index bbc2b3f..3a556ec 100644 --- a/components/context/AuthContext.tsx +++ b/components/context/AuthContext.tsx @@ -88,6 +88,7 @@ interface AuthContextType { ) => Promise; // Deposit check function checkDeposits: () => Promise; + checkDeploy: () => Promise; // Send transaction function sendTransaction: (request: SendMoneyRequest) => Promise; createSplitPayment: ( @@ -118,7 +119,15 @@ interface AuthContextType { page?: number; limit?: number; }) => Promise; - fetchStatus: () => Promise; + getMerchantPaymentStats: () => Promise<{ + stats: { + total: number; + pending: number; + completed: number; + cancelled: number; + totalAmount: string; + }; + }>; } const AuthContext = createContext(undefined); @@ -476,7 +485,6 @@ export const AuthProvider: React.FC = ({ children }) => { } const data = await response.json(); - if (data.addresses && Array.isArray(data.addresses)) { return data.addresses; } else { @@ -919,6 +927,33 @@ export const AuthProvider: React.FC = ({ children }) => { throw error; } }; + const checkDeploy = async (): Promise => { + if (!token) { + throw new Error("Authentication required to check deplow"); + } + + try { + const response = await fetch( + "https://velo-node-backend.onrender.com/checkdeploy/balances/testnet/deploy", + { + method: "GET", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + } + ); + + if (!response.ok) { + throw new Error(`Failed to check deploy: ${response.status}`); + } + + return await response.json(); + } catch (error) { + console.error("Error checking deploy:", error); + throw error; + } + }; const createSplitPayment = async ( data: CreateSplitPaymentRequest @@ -1077,14 +1112,16 @@ export const AuthProvider: React.FC = ({ children }) => { } }; - const createMerchantPayment = async (requestBody: any): Promise => { + const createMerchantPayment = async ( + requestBody: CreateMerchantPaymentRequest + ): Promise => { if (!token) { throw new Error("Authentication required to create merchant payment"); } try { const response = await fetch( - "https://velo-node-backend.onrender.com/merchant/create", + "https://velo-node-backend.onrender.com/merchant/payments", { method: "POST", headers: { @@ -1108,16 +1145,21 @@ export const AuthProvider: React.FC = ({ children }) => { } }; - const getMerchantPaymentStatus = async (paymentId: string): Promise => { + const getMerchantPaymentStatus = async ( + paymentId: string + ): Promise => { if (!token) { throw new Error("Authentication required to get merchant payment status"); } try { + // Clean up the payment ID - remove any spaces + const cleanPaymentId = paymentId.replace(/\s+/g, ""); + const response = await fetch( - `https://velo-node-backend.onrender.com/merchant/payment/${paymentId}`, + `https://velo-node-backend.onrender.com/merchant/payments/${cleanPaymentId}/monitor`, { - method: "GET", + method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", @@ -1131,7 +1173,8 @@ export const AuthProvider: React.FC = ({ children }) => { ); } - return await response.json(); + const data = await response.json(); + return data; } catch (error) { console.error("Error getting merchant payment status:", error); throw error; @@ -1175,7 +1218,7 @@ export const AuthProvider: React.FC = ({ children }) => { status?: string; page?: number; limit?: number; - }): Promise => { + }): Promise => { if (!token) { throw new Error( "Authentication required to get merchant payment history" @@ -1214,14 +1257,22 @@ export const AuthProvider: React.FC = ({ children }) => { } }; - const fetchStatus = async (): Promise => { + const getMerchantPaymentStats = async (): Promise<{ + stats: { + total: number; + pending: number; + completed: number; + cancelled: number; + totalAmount: string; + }; + }> => { if (!token) { - throw new Error("Authentication required to check deposits"); + throw new Error("Authentication required to get merchant payment stats"); } try { const response = await fetch( - "https://velo-node-backend.onrender.com/merchant/my-payments", + "https://velo-node-backend.onrender.com/merchant/payments/stats", { method: "GET", headers: { @@ -1232,12 +1283,14 @@ export const AuthProvider: React.FC = ({ children }) => { ); if (!response.ok) { - throw new Error(`Failed to check Status: ${response.status}`); + throw new Error( + `Failed to get merchant payment stats: ${response.status}` + ); } - console.log("Payment Status", response); + return await response.json(); } catch (error) { - console.error("Error checking deposits:", error); + console.error("Error getting merchant payment stats:", error); throw error; } }; @@ -1274,7 +1327,8 @@ export const AuthProvider: React.FC = ({ children }) => { getMerchantPaymentStatus, payMerchantInvoice, getMerchantPaymentHistory, - fetchStatus, + checkDeploy, + getMerchantPaymentStats, }; return {children}; diff --git a/components/dashboard/mobile-bottom-nav.tsx b/components/dashboard/mobile-bottom-nav.tsx index 194a09e..c1e8a25 100644 --- a/components/dashboard/mobile-bottom-nav.tsx +++ b/components/dashboard/mobile-bottom-nav.tsx @@ -11,7 +11,7 @@ interface MobileBottomNavProps { const navItems = [ { icon: Home, label: "Dashboard", active: true }, - { icon: QrCode, label: "Qr Payment", active: false }, + { icon: QrCode, label: "QR Payment", active: false }, { icon: Send, label: "Send", active: false }, { icon: ArrowDownToLine, label: "Receive funds", active: false }, { icon: History, label: "History", active: false }, diff --git a/components/dashboard/quick-actions.tsx b/components/dashboard/quick-actions.tsx index 27537e5..5e2d9c7 100644 --- a/components/dashboard/quick-actions.tsx +++ b/components/dashboard/quick-actions.tsx @@ -1,15 +1,14 @@ +import { QrCode, Users, Send, ArrowDownToLine } from "lucide-react"; +import { Card, CardContent, CardHeader, CardTitle } from "../ui/cards"; +import { Button } from "../ui/buttons"; +import { Dispatch, SetStateAction } from "react"; -import { QrCode, Users, Send, ArrowDownToLine } from "lucide-react" -import { Card, CardContent, CardHeader, CardTitle } from "../ui/cards" -import { Button } from "../ui/buttons" -import { Dispatch, SetStateAction } from "react" - -interface quickActionProps { -setTab: Dispatch> +interface quickActionProps { + setTab: Dispatch>; } const actions = [ { - title: "Qr Payment", + title: "QR Payment", description: "Scan or generate QR codes", icon: QrCode, gradient: "from-primary to-accent", @@ -32,9 +31,15 @@ const actions = [ icon: ArrowDownToLine, gradient: "from-accent to-primary", }, -] + { + title: "Top Up", + description: "Buy crypto with NGN", + icon: ArrowDownToLine, + gradient: "from-primary to-accent", + }, +]; -export function QuickActions({setTab}: quickActionProps) { +export function QuickActions({ setTab }: quickActionProps) { return ( @@ -43,26 +48,30 @@ export function QuickActions({setTab}: quickActionProps) {
{actions.map((action) => { - const Icon = action.icon + const Icon = action.icon; return ( - ) + ); })}
- ) + ); } diff --git a/components/dashboard/side-nav.tsx b/components/dashboard/side-nav.tsx index 93bf169..d7d126f 100644 --- a/components/dashboard/side-nav.tsx +++ b/components/dashboard/side-nav.tsx @@ -25,10 +25,11 @@ import Link from "next/link"; const navigation = [ { name: "Dashboard", icon: LayoutDashboard, current: true }, { name: "Receive funds", icon: ArrowDownToLine, current: false }, - { name: "Qr Payment", icon: CreditCard, current: false }, + { name: "QR Payment", icon: CreditCard, current: false }, { name: "Send", icon: Send, current: false }, { name: "Payment split", icon: Split, current: false }, { name: "Swap", icon: ArrowLeftRight, current: false }, + { name: "Top Up", icon: ArrowDownToLine, current: false }, { name: "History", icon: History, current: false }, { name: "Help", icon: HelpCircle, current: false }, ] diff --git a/components/dashboard/stats-cards.tsx b/components/dashboard/stats-cards.tsx index 8d5083d..b3d473f 100644 --- a/components/dashboard/stats-cards.tsx +++ b/components/dashboard/stats-cards.tsx @@ -23,7 +23,7 @@ export function StatsCards({ const { totalBalance, loading, error } = useTotalBalance(); const { notifications } = useNotifications(); const totalTransactions = notifications.filter((notification) => { - return notification.title === "Deposit Received" || notification.title === "Token Sent"; + return notification.title === "Deposit Received" || notification.title === "Tokens Sent"; }); const split = notifications.filter((notification) => { diff --git a/components/dashboard/tabs/qr-payment.tsx b/components/dashboard/tabs/qr-payment.tsx index e5175d0..369c664 100644 --- a/components/dashboard/tabs/qr-payment.tsx +++ b/components/dashboard/tabs/qr-payment.tsx @@ -9,6 +9,7 @@ import { useWalletAddresses } from "@/components/hooks/useAddresses"; import useExchangeRates from "@/components/hooks/useExchangeRate"; import { QRCodeDisplay } from "@/components/modals/qr-code-display"; import { useAuth } from "@/components/context/AuthContext"; +import { address } from "bitcoinjs-lib"; // Utility function to normalize Starknet addresses const normalizeStarknetAddress = (address: string, chain: string): string => { @@ -21,21 +22,26 @@ const normalizeStarknetAddress = (address: string, chain: string): string => { }; // QR code format generators for different cryptocurrencies -const generateQRData = (chain: string, address: string, amount: string | null = null, label: string | null = null): string => { +const generateQRData = ( + chain: string, + address: string, + amount: string | null = null, + label: string | null = null +): string => { switch (chain.toLowerCase()) { - case 'bitcoin': - case 'btc': + case "bitcoin": + case "btc": let bitcoinUri = `bitcoin:${address}`; const bitcoinParams = []; if (amount) bitcoinParams.push(`amount=${amount}`); if (label) bitcoinParams.push(`label=${encodeURIComponent(label)}`); if (bitcoinParams.length > 0) { - bitcoinUri += `?${bitcoinParams.join('&')}`; + bitcoinUri += `?${bitcoinParams.join("&")}`; } return bitcoinUri; - case 'ethereum': - case 'eth': + case "ethereum": + case "eth": let ethereumUri = `ethereum:${address}`; const ethereumParams = []; if (amount) { @@ -44,23 +50,23 @@ const generateQRData = (chain: string, address: string, amount: string | null = } if (label) ethereumParams.push(`label=${encodeURIComponent(label)}`); if (ethereumParams.length > 0) { - ethereumUri += `?${ethereumParams.join('&')}`; + ethereumUri += `?${ethereumParams.join("&")}`; } return ethereumUri; - case 'solana': - case 'sol': + case "solana": + case "sol": let solanaUri = `solana:${address}`; const solanaParams = []; if (amount) solanaParams.push(`amount=${amount}`); if (label) solanaParams.push(`label=${encodeURIComponent(label)}`); if (solanaParams.length > 0) { - solanaUri += `?${solanaParams.join('&')}`; + solanaUri += `?${solanaParams.join("&")}`; } return solanaUri; - case 'starknet': - case 'strk': + case "starknet": + case "strk": let starknetUri = `starknet:${address}`; const starknetParams = []; if (amount) { @@ -69,13 +75,13 @@ const generateQRData = (chain: string, address: string, amount: string | null = } if (label) starknetParams.push(`label=${encodeURIComponent(label)}`); if (starknetParams.length > 0) { - starknetUri += `?${starknetParams.join('&')}`; + starknetUri += `?${starknetParams.join("&")}`; } return starknetUri; - case 'usdt_erc20': + case "usdt_erc20": return `ethereum:${address}`; - case 'usdt_trc20': + case "usdt_trc20": return `tron:${address}`; default: @@ -94,7 +100,7 @@ const generateCompatibleQRCode = async ( margin?: number; darkColor?: string; lightColor?: string; - errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H'; + errorCorrectionLevel?: "L" | "M" | "Q" | "H"; } = {} ) => { const { @@ -104,7 +110,7 @@ const generateCompatibleQRCode = async ( margin = 2, darkColor = "#000000", lightColor = "#FFFFFF", - errorCorrectionLevel = 'M' + errorCorrectionLevel = "M", } = options; try { @@ -113,7 +119,7 @@ const generateCompatibleQRCode = async ( width, margin, errorCorrectionLevel, - type: 'image/png' as 'image/png' | 'image/jpeg' | 'image/webp', + type: "image/png" as "image/png" | "image/jpeg" | "image/webp", color: { dark: darkColor, light: lightColor, @@ -123,7 +129,7 @@ const generateCompatibleQRCode = async ( return { dataUrl: qrCodeDataUrl, rawData: qrData, - format: getQRFormat(chain) + format: getQRFormat(chain), }; } catch (error) { console.error("Error generating compatible QR code:", error); @@ -134,24 +140,24 @@ const generateCompatibleQRCode = async ( // Helper function to get the format description const getQRFormat = (chain: string): string => { switch (chain.toLowerCase()) { - case 'bitcoin': - case 'btc': - return 'BIP21 Bitcoin URI'; - case 'ethereum': - case 'eth': - return 'EIP681 Ethereum URI'; - case 'solana': - case 'sol': - return 'Solana URI Scheme'; - case 'starknet': - case 'strk': - return 'Ethereum-compatible URI'; - case 'usdt_erc20': - return 'ERC-20 Token URI'; - case 'usdt_trc20': - return 'TRC-20 Token URI'; + case "bitcoin": + case "btc": + return "BIP21 Bitcoin URI"; + case "ethereum": + case "eth": + return "EIP681 Ethereum URI"; + case "solana": + case "sol": + return "Solana URI Scheme"; + case "starknet": + case "strk": + return "Ethereum-compatible URI"; + case "usdt_erc20": + return "ERC-20 Token URI"; + case "usdt_trc20": + return "TRC-20 Token URI"; default: - return 'Plain Address'; + return "Plain Address"; } }; @@ -166,11 +172,11 @@ export default function QrPayment() { const [isProcessing, setIsProcessing] = useState(false); const [loading, setLoading] = useState(false); const [paymentId, setPaymentId] = useState(""); - const [merchantId, setMerchantId] = useState(""); const [localError, setLocalError] = useState(null); - const [paymentStatus, setPaymentStatus] = useState<"pending" | "idle" | "success" | "error">("pending") + const [paymentStatus, setPaymentStatus] = useState(""); + + console.log("amount", amount); - console.log("payment Status 02", paymentStatus) const tokenRate = (token: string) => { if (token === "ETHEREUM") return "ETH"; if (token === "BITCOIN") return "BTC"; @@ -178,25 +184,12 @@ export default function QrPayment() { if (token === "STARKNET") return "STRK"; if (token === "USDT_TRC20") return "USDT"; if (token === "USDT_ERC20") return "USDT"; + return "USDT"; }; const { addresses, loading: addressesLoading } = useWalletAddresses(); const { rates, isLoading: ratesLoading } = useExchangeRates(); - const { createMerchantPayment, user, fetchStatus } = useAuth(); - - const handleCheckStatus = async () => { - try { - console.log("checking status..."); - const result = await fetchStatus(); - console.log(result); - } catch (error) { - console.error("Failed to check deposits:", error); - } - }; - - setInterval(() => { - handleCheckStatus() - }, 60000); - + const { createMerchantPayment, user } = useAuth(); +console.log("All addresses", addresses) const tokens = useMemo( () => [ "ETHEREUM", @@ -221,6 +214,9 @@ export default function QrPayment() { return chainMap[token] || "ethereum"; }, [token]); +const singleAddress = addresses.filter(a => a.chain === token.toLowerCase()) +console.log("single address", singleAddress) + const currentReceiverAddress = useMemo((): string => { if (!addresses || addresses.length === 0) return ""; @@ -231,80 +227,116 @@ export default function QrPayment() { return normalizeStarknetAddress(addr.address, chain); }, [addresses, getTokenChain]); + + const calculateTokenAmount = useCallback((): string => { const ngnAmount = parseFloat(amount) || 0; const rateKey = tokenRate(token); const rate = rateKey ? rates[rateKey] : 1; - const tokenAmount = ngnAmount / (rate || 1); + + if (!rate || rate === 0) { + console.log("Using fallback rate for calculation"); + return (ngnAmount / 1500).toFixed(6); + } + + const tokenAmount = ngnAmount / rate; + return tokenAmount.toFixed(6); }, [amount, rates, token]); - const handleTokenSelect = (tkn: string) => { + const handleTokenSelect = (tkn: string,) => { setToken(tkn); setShowTokenDropdown(false); }; - const handleCreatePaymentRequest = async () => { - if (!amount || !currentReceiverAddress) { - setLocalError( - "Please enter an amount and ensure wallet address is available" - ); - return; - } + const handleCreatePaymentRequest = async () => { + if (!amount || !currentReceiverAddress) { + setLocalError( + "Please enter an amount and ensure wallet address is available" + ); + return; + } - setIsProcessing(true); - setLocalError(null); + setIsProcessing(true); + setLocalError(null); + + try { + const tokenAmount = calculateTokenAmount(); + const chain = getTokenChain(); + const network = addresses.find((a) => a); - try { - const tokenAmount = calculateTokenAmount(); - const chain = getTokenChain(); - const network = addresses.find((a) => a.chain === chain); - if (!network) return ""; - - const qrResult = await generateCompatibleQRCode( - chain, - currentReceiverAddress, - { - amount: tokenAmount, - // label: description || customerEmail || "Payment Request", - width: 200, - margin: 2, - errorCorrectionLevel: 'M', - } - ); - - const requestBody = { + if (!network) return ""; + + const qrResult = await generateCompatibleQRCode( + chain, + currentReceiverAddress, + { amount: tokenAmount, - btcAddress: currentReceiverAddress, - chain: chain, - network: network.network, - }; - - const response = await createMerchantPayment(requestBody); - - if (response && response.payment) { - const payment = response.payment; - setPaymentId(response.payment.paymentId || ""); - setMerchantId(response.payment.merchantId || user?.id || ""); - // setPaymentStatus(response.payment.status) - setQrData(qrResult.dataUrl); - setShowQR(true); - } else { - throw new Error("Invalid response from server"); + width: 200, + margin: 2, + errorCorrectionLevel: "M", } - } catch (error: any) { - console.error("Error creating payment request:", error); - setLocalError(error.message || "Failed to create payment request"); - } finally { - setIsProcessing(false); + ); + // Create the correct request body based on the chain + const requestBody: any = { + amount: parseFloat(tokenAmount), + chain: chain, + network: "testnet", + description: description || "QR Payment request", + }; + + + switch (chain.toLowerCase()) { + case "bitcoin": + requestBody.btcAddress = currentReceiverAddress; + break; + case "ethereum": + requestBody.ethAddress = currentReceiverAddress; + break; + case "solana": + requestBody.solAddress = currentReceiverAddress; + break; + case "starknet": + requestBody.strkAddress = currentReceiverAddress; + break; + case "usdt_erc20": + requestBody.usdtErc20Address = currentReceiverAddress; + break; + case "usdt_trc20": + requestBody.usdtTrc20Address = currentReceiverAddress; + break; + default: + requestBody.address = currentReceiverAddress; } - }; + + console.log(" Sending request body:", requestBody); + + const response = await createMerchantPayment(requestBody); + + console.log(" Received response:", response); + + if (response && response.payment) { + setPaymentId(response.payment.id || ""); + setPaymentStatus(response.payment.status); + setQrData(qrResult.dataUrl); + setShowQR(true); + console.log(" Payment created with ID:", response.payment.id); + console.log(" Payment status:", response.payment.status); + } else { + throw new Error("Invalid response from server - no payment data"); + } + } catch (error: any) { + console.error(" Error creating payment request:", error); + setLocalError(error.message || "Failed to create payment request"); + } finally { + setIsProcessing(false); + } +}; const handleCloseQR = () => { setShowQR(false); setQrData(""); setPaymentId(""); - setMerchantId(""); setLocalError(null); setAmount(""); }; @@ -519,11 +551,10 @@ export default function QrPayment() { calculatedAmount={calculateTokenAmount()} receiverAddress={currentReceiverAddress} paymentId={paymentId} - merchantId={merchantId} onClose={handleCloseQR} paymentStatus={paymentStatus} /> )} ); -} \ No newline at end of file +} diff --git a/components/dashboard/tabs/send-funds.tsx b/components/dashboard/tabs/send-funds.tsx index 0168e0a..a94b84f 100644 --- a/components/dashboard/tabs/send-funds.tsx +++ b/components/dashboard/tabs/send-funds.tsx @@ -42,9 +42,24 @@ export default function SendFunds() { }>({ type: null, message: "" }); const { addresses, loading: addressesLoading } = useWalletAddresses(); - const { sendTransaction, } = useAuth(); + const { sendTransaction, checkDeploy } = useAuth(); const { breakdown, loading: balanceLoading } = useTotalBalance(); - const { rates, } = useExchangeRates(); + const { rates } = useExchangeRates(); + + const handlecheckDeploy = async () => { + try { + console.log("checking deposits..."); + const result = await checkDeploy(); + console.log(result.message); + } catch (error) { + console.error("Failed to check deposits:", error); + } + }; + + // Automatically start checking deposits when component mounts + useEffect(() => { + handlecheckDeploy(); + }, []); // Token options based on available addresses const tokenOptions: TokenOption[] = useMemo(() => { @@ -86,6 +101,39 @@ export default function SendFunds() { return nameMap[chain] || chain.charAt(0).toUpperCase() + chain.slice(1); } + // Normalize and validate Starknet address + const normalizeStarknetAddress = (address: string): string => { + // Remove whitespace + let normalized = address.trim(); + + // Add 0x prefix if missing + if (!normalized.startsWith("0x")) { + normalized = "0x" + normalized; + } + + // Remove 0x for validation and padding + const hexPart = normalized.slice(2); + + // Validate hex characters only + if (!/^[0-9a-fA-F]*$/.test(hexPart)) { + throw new Error( + "Address contains invalid characters. Only hexadecimal characters (0-9, a-f, A-F) are allowed." + ); + } + + // Pad to 64 characters (without 0x) + const paddedHex = hexPart.padStart(64, "0"); + + // Check if address is too long after padding + if (paddedHex.length > 64) { + throw new Error( + "Address is too long. Maximum length is 66 characters (including 0x prefix)." + ); + } + + return "0x" + paddedHex; + }; + const selectedTokenData = tokenOptions.find( (token) => token.chain === selectedToken ); @@ -186,10 +234,32 @@ export default function SendFunds() { setTxStatus({ type: null, message: "" }); try { + let normalizedToAddress = toAddress.trim(); + let normalizedFromAddress = currentWalletAddress.trim(); + + // Special handling for Starknet addresses + if (selectedToken === "starknet") { + try { + normalizedToAddress = normalizeStarknetAddress(toAddress); + normalizedFromAddress = + normalizeStarknetAddress(currentWalletAddress); + console.log("Normalized Starknet address:", normalizedToAddress); + } catch (error) { + throw new Error( + error instanceof Error + ? `Invalid Starknet address: ${error.message}` + : "Invalid Starknet address format" + ); + } + } + + console.log("current wallet address:", normalizedFromAddress); + console.log("current chain:", selectedToken); + console.log("current network:", currentNetwork); const response = await sendTransaction({ chain: selectedToken, network: currentNetwork, - toAddress: toAddress.trim(), + toAddress: normalizedToAddress, amount: amount, fromAddress: currentWalletAddress, }); @@ -200,15 +270,15 @@ export default function SendFunds() { txHash: response.txHash, }); - // Reset form after 3 seconds + // Reset form after 10 seconds setTimeout(() => { resetForm(); }, 10000); } catch (error: any) { console.error("Transaction error:", error); - + let errorMessage = "Failed to send transaction. Please try again."; - + if (error.message) { errorMessage = error.message; } else if (typeof error === "string") { @@ -257,7 +327,9 @@ export default function SendFunds() { // Get block explorer URL const getExplorerUrl = (txHash: string): string => { - const explorerUrls: { [key: string]: { testnet: string; mainnet: string } } = { + const explorerUrls: { + [key: string]: { testnet: string; mainnet: string }; + } = { ethereum: { testnet: `https://sepolia.etherscan.io/tx/${txHash}`, mainnet: `https://etherscan.io/tx/${txHash}`, @@ -342,7 +414,9 @@ export default function SendFunds() { )} {txStatus.type === "success" ? "Success" : "Error"} @@ -505,6 +579,12 @@ export default function SendFunds() { className="w-full p-3 rounded-lg bg-background border border-border placeholder:text-muted-foreground focus:outline-none focus:border-primary transition-colors font-mono text-sm" disabled={!hasWalletForSelectedToken || isSending} /> + {selectedToken === "starknet" && toAddress && ( +

+ Tip: Address will be automatically formatted with 0x prefix and + proper padding +

+ )} {/* Amount */} @@ -582,13 +662,18 @@ export default function SendFunds() {
  • Transactions are irreversible once confirmed
  • Double-check addresses before sending
  • {selectedToken === "starknet" && ( -
  • - Starknet wallets may need deployment (auto-handled) -
  • + <> +
  • + Starknet wallets may need deployment (auto-handled) +
  • +
  • + Addresses will be auto-formatted with 0x prefix and padding +
  • + )} ); -} \ No newline at end of file +} diff --git a/components/dashboard/tabs/top-up.tsx b/components/dashboard/tabs/top-up.tsx new file mode 100644 index 0000000..b2ebbad --- /dev/null +++ b/components/dashboard/tabs/top-up.tsx @@ -0,0 +1,127 @@ +"use client"; + +import { useState } from "react"; +import { Card } from "@/components/ui/Card"; +import { ChevronLeft } from "lucide-react"; +import TokenSelection from "@/components/modals/token-selection"; +import AmountEntry from "@/components/modals/amount-entry"; +import Confirmation from "@/components/modals/confirmation"; + +type TopUpStep = "selection" | "amount" | "confirmation"; + +export default function TopUp() { + const [currentStep, setCurrentStep] = useState("selection"); + const [selectedToken, setSelectedToken] = useState(""); + const [amountData, setAmountData] = useState({ + ngnAmount: "", + cryptoAmount: "", + }); + + const handleTokenSelect = (token: string) => { + setSelectedToken(token); + setCurrentStep("amount"); + }; + + const handleAmountSubmit = (ngnAmount: string, cryptoAmount: string) => { + setAmountData({ ngnAmount, cryptoAmount }); + setCurrentStep("confirmation"); + }; + + const handleBack = () => { + if (currentStep === "amount") { + setCurrentStep("selection"); + } else if (currentStep === "confirmation") { + setCurrentStep("amount"); + } + }; + + const handleComplete = () => { + // Reset flow after completion + setCurrentStep("selection"); + setSelectedToken(""); + setAmountData({ ngnAmount: "", cryptoAmount: "" }); + }; + + return ( +
    + + {/* Header */} +
    + {currentStep !== "selection" && ( + + )} +
    +

    Buy Crypto

    +

    + {currentStep === "selection" && "Select cryptocurrency to buy"} + {currentStep === "amount" && "Enter amount to buy"} + {currentStep === "confirmation" && "Confirm your purchase"} +

    +
    +
    + + {/* Progress Steps */} +
    + {["selection", "amount", "confirmation"].map((step, index) => ( +
    +
    + {index + 1} +
    + {index < 2 && ( +
    + )} +
    + ))} +
    + + {/* Step Content */} +
    + {currentStep === "selection" && ( + + )} + {currentStep === "amount" && ( + + )} + {currentStep === "confirmation" && ( + + )} +
    + +
    + ); +} diff --git a/components/modals/amount-entry.tsx b/components/modals/amount-entry.tsx new file mode 100644 index 0000000..0dc5ca9 --- /dev/null +++ b/components/modals/amount-entry.tsx @@ -0,0 +1,183 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { Card } from "@/components/ui/Card"; +import { Button } from "@/components/ui/buttons"; +import useExchangeRates from "@/components/hooks/useExchangeRate"; +import { Loader2 } from "lucide-react"; + +interface AmountEntryProps { + selectedToken: string; + onAmountSubmit: (ngnAmount: string, cryptoAmount: string) => void; + onBack: () => void; +} + +export default function AmountEntry({ selectedToken, onAmountSubmit, onBack }: AmountEntryProps) { + const [ngnAmount, setNgnAmount] = useState(""); + const [cryptoAmount, setCryptoAmount] = useState(""); + const [isCalculating, setIsCalculating] = useState(false); + const { rates, isLoading: ratesLoading } = useExchangeRates(); + + const calculateCryptoAmount = useCallback((amount: string) => { + if (!amount || !rates[selectedToken as keyof typeof rates]) return ""; + + const ngnValue = parseFloat(amount); + const tokenRate = rates[selectedToken as keyof typeof rates] || 1; + + if (tokenRate === 0) return "0"; + + const calculated = (ngnValue / tokenRate).toFixed(6); + return calculated; + }, [selectedToken, rates]); + + useEffect(() => { + if (ngnAmount && !isCalculating) { + const calculated = calculateCryptoAmount(ngnAmount); + setCryptoAmount(calculated); + } + }, [ngnAmount, calculateCryptoAmount, isCalculating]); + + const handleNgnAmountChange = (e: React.ChangeEvent) => { + const value = e.target.value; + if (/^\d*\.?\d*$/.test(value)) { + setNgnAmount(value); + } + }; + + const handleQuickSelect = (amount: string) => { + setNgnAmount(amount); + }; + + const handleSubmit = () => { + if (!ngnAmount || parseFloat(ngnAmount) <= 0) return; + onAmountSubmit(ngnAmount, cryptoAmount); + }; + + const quickAmounts = ["1000", "5000", "10000", "20000", "50000"]; + + if (ratesLoading) { + return ( +
    + +

    Loading exchange rates...

    +
    + ); + } + + const currentRate = rates[selectedToken as keyof typeof rates] || 1; + + return ( +
    + {/* Selected Token Display */} + +
    +
    +

    You're buying

    +

    {selectedToken}

    +
    +
    +

    Current Rate

    +

    + ₦{currentRate.toLocaleString()} +

    +
    +
    +
    + + {/* Amount Input */} +
    +
    + +
    + +
    + NGN +
    +
    +
    + + {/* Quick Select Buttons */} +
    +

    Quick select

    +
    + {quickAmounts.map((amount) => ( + + ))} +
    +
    + + {/* Crypto Amount Display */} + {cryptoAmount && ( + +
    +

    You'll receive

    +

    + {parseFloat(cryptoAmount).toFixed(6)} {selectedToken} +

    +

    + ≈ ₦{parseFloat(ngnAmount).toLocaleString()} +

    +
    +
    + )} +
    + + {/* Action Buttons */} +
    + + +
    + + {/* Fee Information */} +
    +

    + Fee Information +

    +
    +
    + Exchange Rate: + 1 {selectedToken} = ₦{currentRate.toLocaleString()} +
    +
    + Processing Fee: + 0.5% +
    +
    + Network Fee: + Included +
    +
    +
    +
    + ); +} \ No newline at end of file diff --git a/components/modals/confirmation.tsx b/components/modals/confirmation.tsx new file mode 100644 index 0000000..acd3d1d --- /dev/null +++ b/components/modals/confirmation.tsx @@ -0,0 +1,215 @@ +"use client"; + +import { useState } from "react"; +import { Card } from "@/components/ui/Card"; +import { Button } from "@/components/ui/buttons"; +import { Check, Copy, Loader2 } from "lucide-react"; +import { useAuth } from "@/components/context/AuthContext"; + +interface ConfirmationProps { + selectedToken: string; + ngnAmount: string; + cryptoAmount: string; + onComplete: () => void; + onBack: () => void; +} + +export default function Confirmation({ + selectedToken, + ngnAmount, + cryptoAmount, + onComplete, + onBack +}: ConfirmationProps) { + const [isProcessing, setIsProcessing] = useState(false); + const [isSuccess, setIsSuccess] = useState(false); + const [copied, setCopied] = useState(false); + const { user } = useAuth(); + + const processingFee = parseFloat(ngnAmount) * 0.005; + const totalAmount = parseFloat(ngnAmount) + processingFee; + + const handleConfirmPurchase = async () => { + setIsProcessing(true); + + try { + await new Promise(resolve => setTimeout(resolve, 3000)); + setIsSuccess(true); + } catch (error) { + console.error('Purchase failed:', error); + } finally { + setIsProcessing(false); + } + }; + + const handleCopyReference = () => { + const reference = `VELO-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + navigator.clipboard.writeText(reference); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + if (isSuccess) { + return ( +
    +
    + +
    + +
    +

    + Purchase Successful! +

    +

    + Your {selectedToken} will be delivered to your wallet shortly. +

    +
    + + +
    +
    + Amount: + {cryptoAmount} {selectedToken} +
    +
    + Reference: +
    + + VELO-{Date.now().toString().slice(-8)} + + +
    +
    +
    +
    + + +
    + ); + } + + return ( +
    + {/* Order Summary */} + +

    + Order Summary +

    + +
    +
    + Cryptocurrency: + {selectedToken} +
    + +
    + Amount: + {cryptoAmount} {selectedToken} +
    + +
    + NGN Amount: + ₦{parseFloat(ngnAmount).toLocaleString()} +
    + +
    + Processing Fee (0.5%): + ₦{processingFee.toLocaleString()} +
    + +
    +
    + Total: + ₦{totalAmount.toLocaleString()} +
    +
    +
    +
    + + {/* Payment Method */} + +

    Payment Method

    +
    +
    + +
    +
    +

    Naira Bank Transfer

    +

    + Transfer to VELO dedicated account +

    +
    +
    +
    + + {/* Bank Details */} + +

    Transfer Details

    +
    +
    + Bank: + Velo Bank +
    +
    + Account Number: + 1234567890 +
    +
    + Account Name: + VELO TECHNOLOGIES LTD +
    +
    + Reference: + VELO-{user?.id.slice(-8)} +
    +
    +
    + + {/* Instructions */} +
    +

    + 📝 Important Instructions +

    +
      +
    • • Transfer exactly ₦{totalAmount.toLocaleString()}
    • +
    • • Use the reference number provided
    • +
    • • Payment will be processed within 15 minutes
    • +
    • • Contact support if you encounter any issues
    • +
    +
    + + {/* Action Buttons */} +
    + + +
    +
    + ); +} \ No newline at end of file diff --git a/components/modals/qr-code-display.tsx b/components/modals/qr-code-display.tsx index 3a0f203..b285a4f 100644 --- a/components/modals/qr-code-display.tsx +++ b/components/modals/qr-code-display.tsx @@ -2,11 +2,12 @@ import { Check, Copy, TriangleAlert, X } from "lucide-react"; import Image from "next/image"; -import { useState } from "react"; +import { useState, useEffect } from "react"; +import { useAuth } from "../context/AuthContext"; interface QRCodeDisplayProps { qrData: string; - paymentStatus: "idle" | "pending" | "success" | "error"; + paymentStatus: string; error?: string | null; amount: string; token: string; @@ -14,22 +15,23 @@ interface QRCodeDisplayProps { receiverAddress: string; onClose: () => void; paymentId: string; - merchantId: string; } export function QRCodeDisplay({ qrData, - paymentStatus, - error, + paymentStatus: initialPaymentStatus, amount, token, calculatedAmount, receiverAddress, onClose, paymentId, - merchantId, }: QRCodeDisplayProps) { const [copied, setCopied] = useState(false); + const [currentPaymentStatus, setCurrentPaymentStatus] = useState(initialPaymentStatus); + const [statusError, setStatusError] = useState(null); + + const { getMerchantPaymentStatus } = useAuth(); const handleCopyAddress = async () => { try { @@ -41,6 +43,47 @@ export function QRCodeDisplay({ } }; + const fetchPaymentStatus = async () => { + if (!paymentId) return; + + try { + // console.log(" Fetching payment status for:", paymentId); + const response = await getMerchantPaymentStatus(paymentId); + console.log("responses" ,response) + if (response && response.payment) { + const newStatus = response.payment.status; + // console.log(" Payment status:", newStatus); + setCurrentPaymentStatus(newStatus); + setStatusError(null); + + if (newStatus === "completed") { + // console.log(" Payment completed!"); + } + } else { + throw new Error("Invalid response format"); + } + } catch (err: any) { + console.error(" Error fetching payment status:", err); + setStatusError(err.message || "Failed to fetch payment status"); + } + }; + + useEffect(() => { + if (!paymentId) return; + + // Fetch status immediately when component mounts + fetchPaymentStatus(); + + const intervalId = setInterval(() => { + fetchPaymentStatus(); + }, 5000); + + // Cleanup interval on unmount + return () => { + clearInterval(intervalId); + }; + }, [paymentId]); + if (!qrData) return null; return ( @@ -58,7 +101,9 @@ export function QRCodeDisplay({
    {/* Header */}
    -

    Payment Request

    +

    + Payment Request +

    Scan the QR code to pay

    @@ -66,12 +111,7 @@ export function QRCodeDisplay({ {/* QR Code */}
    - QR Code + QR Code
    {/* Payment Details */} @@ -95,10 +135,31 @@ export function QRCodeDisplay({
    )} + {/* Status Display */} +
    +
    + {currentPaymentStatus === "pending" && ( +
    + )} + {currentPaymentStatus === "completed" && ( + + )} + + {currentPaymentStatus || "unknown"} + +
    +
    + {/* Wallet Address */}
    - Wallet Address: + + Wallet Address: +
    - {/* Fee Info */} -
    -
    - Network Fee: - 0.5% -
    -
    - - {/* Status */} - {paymentStatus === "pending" && ( -
    -
    -
    -

    Waiting for payment...

    -
    -
    - )} - - {paymentStatus === "success" && ( -
    - -

    Payment Successful!

    -
    - )} - - {paymentStatus === "error" && ( -
    -
    - -
    -

    Payment Failed

    -
    + {/* Error Display */} + {statusError && ( +
    +
    + +

    {statusError}

    - {error && ( -

    - {error} -

    - )}
    )} @@ -158,7 +188,7 @@ export function QRCodeDisplay({ onClick={onClose} className="w-full p-3 bg-muted/50 text-foreground rounded-lg hover:bg-muted transition-colors font-medium" > - {paymentStatus === "success" ? "Done" : "Close"} + {currentPaymentStatus === "completed" ? "Done" : "Close"}
    diff --git a/components/modals/token-selection.tsx b/components/modals/token-selection.tsx new file mode 100644 index 0000000..c22298e --- /dev/null +++ b/components/modals/token-selection.tsx @@ -0,0 +1,101 @@ +"use client"; + +import { Card } from "@/components/ui/Card"; +import Image from "next/image"; + +interface TokenSelectionProps { + onTokenSelect: (token: string) => void; +} + +const tokens = [ + { + symbol: "BTC", + name: "Bitcoin", + icon: "/bitcoin.svg", + }, + { + symbol: "ETH", + name: "Ethereum", + icon: "/ethereum.svg", + }, + { + symbol: "STRK", + name: "Starknet", + icon: "/starknet.svg", + }, + { + symbol: "SOL", + name: "Solana", + icon: "/solana.svg", + }, + { + symbol: "USDT TRC_20", + name: "Tether", + icon: "/usdt_trc20.svg", + }, + { + symbol: "USDT ERC_20", + name: "USD Coin", + icon: "/usdt_erc20.svg", + } +]; + +export default function TokenSelection({ onTokenSelect }: TokenSelectionProps) { + return ( +
    +
    +

    + Select Cryptocurrency +

    +

    + Choose which cryptocurrency you want to buy +

    +
    + +
    + {tokens.map((token) => ( + onTokenSelect(token.symbol)} + > +
    +
    + {token.name} { + (e.target as HTMLImageElement).style.display = 'none'; + }} + /> +
    +
    +

    + {token.symbol} +

    +

    + {token.name} +

    +
    +
    + +
    + ))} +
    + +
    +

    + Buying Tips +

    +
      +
    • • Prices update in real-time
    • +
    • • No hidden fees
    • +
    • • Instant delivery to your wallet
    • +
    +
    +
    + ); +} \ No newline at end of file diff --git a/components/modals/topUp-payment-status.tsx b/components/modals/topUp-payment-status.tsx new file mode 100644 index 0000000..81d3be0 --- /dev/null +++ b/components/modals/topUp-payment-status.tsx @@ -0,0 +1,98 @@ +"use client"; + +import { Card } from "@/components/ui/Card"; +import { Button } from "@/components/ui/buttons"; +import { Check, Clock, AlertCircle } from "lucide-react"; + +interface PaymentStatusProps { + status: 'pending' | 'completed' | 'failed'; + amount: string; + token: string; + reference: string; + onClose: () => void; +} + +export default function PaymentStatus({ + status, + amount, + token, + reference, + onClose +}: PaymentStatusProps) { + const statusConfig = { + pending: { + icon: Clock, + color: 'text-yellow-500', + bgColor: 'bg-yellow-500/10', + title: 'Payment Pending', + description: 'Waiting for your bank transfer' + }, + completed: { + icon: Check, + color: 'text-green-500', + bgColor: 'bg-green-500/10', + title: 'Payment Completed', + description: 'Your crypto has been delivered' + }, + failed: { + icon: AlertCircle, + color: 'text-red-500', + bgColor: 'bg-red-500/10', + title: 'Payment Failed', + description: 'Please try again or contact support' + } + }; + + const config = statusConfig[status]; + const Icon = config.icon; + + return ( + +
    +
    + +
    + +
    +

    + {config.title} +

    +

    + {config.description} +

    +
    + + +
    +
    + Amount: + {amount} {token} +
    +
    + Reference: + {reference} +
    +
    + Status: + + {status} + +
    +
    +
    + + {status === 'pending' && ( +
    +

    + Please complete your bank transfer within 24 hours. Your crypto will be delivered automatically once we receive your payment. +

    +
    + )} + + +
    +
    + ); +} \ No newline at end of file diff --git a/components/ui/notification.tsx b/components/ui/notification.tsx index 44acb90..c0a3351 100644 --- a/components/ui/notification.tsx +++ b/components/ui/notification.tsx @@ -1,5 +1,4 @@ import React, { useEffect, useState, useCallback, useRef } from "react"; -import { Card } from "./Card"; import { Bell } from "lucide-react"; import { useAuth } from "../context/AuthContext"; import { useNotifications } from "../hooks/useNotifications"; diff --git a/data/velo-endpoint.json b/data/velo-endpoint.json deleted file mode 100644 index a621795..0000000 --- a/data/velo-endpoint.json +++ /dev/null @@ -1,240 +0,0 @@ - { - "meta": { - "format": "httpie", - "version": "1.0.0", - "contentType": "collection", - "schema": "https://schema.httpie.io/1.0.0.json", - "docs": "https://httpie.io/r/help/export-from-httpie", - "source": "HTTPie Desktop 2025.2.0" - }, - "entry": { - "name": "Velo", - "icon": { - "name": "default", - "color": "gray" - }, - "auth": { - "type": "none" - }, - "requests": [ - { - "name": "register", - "url": "http://localhost:5500/auth/register", - "method": "POST", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "inherited" - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "{ \"email\": \"test1@example.com\", \"password\": \"Test1234\" \n}", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - }, - { - "name": "login", - "url": "http://localhost:5500/auth/login", - "method": "POST", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "inherited" - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "{ \"email\": \"test@example.com\", \"password\": \"Test1234\" }", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - }, - { - "name": "Verify OTP", - "url": "http://localhost:5500/auth/verify-otp", - "method": "POST", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "inherited" - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "{ \"email\": \"test@example.com\", \"otp\": \"279140\" }", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - }, - { - "name": "resend otp", - "url": "http://localhost:5500/auth/resend-otp", - "method": "POST", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "inherited" - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "{ \"email\": \"test@example.com\" }\n", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - }, - { - "name": "getprofile", - "url": "http://localhost:5500/user/profile", - "method": "GET", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "bearer", - "target": "headers", - "credentials": { - "username": "", - "password": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJlN2RkZThhZS02OWNjLTQ5NzYtYjI5Ni02OTRlM2RjYjI4MzgiLCJlbWFpbCI6InRlc3RAZXhhbXBsZS5jb20iLCJpYXQiOjE3NTc2OTAyNDcsImV4cCI6MTc1NzY5MTE0N30.sD2-NJzmeaE10J40Dc2Qc15KMKHEqioL_m58iS9W1pY" - } - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - }, - { - "name": "Update profile", - "url": "http://localhost:5500/user/profile", - "method": "PUT", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "bearer", - "target": "headers", - "credentials": { - "username": "", - "password": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJlN2RkZThhZS02OWNjLTQ5NzYtYjI5Ni02OTRlM2RjYjI4MzgiLCJlbWFpbCI6InRlc3RAZXhhbXBsZS5jb20iLCJpYXQiOjE3NTc2OTAyNDcsImV4cCI6MTc1NzY5MTE0N30.sD2-NJzmeaE10J40Dc2Qc15KMKHEqioL_m58iS9W1pY" - } - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "{ \"firstName\": \"Test\", \"lastName\": \"User\", \"phoneNumber\": \"+1234567890\" }", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - }, - { - "name": "", - "url": "http://localhost:5500/user/address", - "method": "POST", - "headers": [], - "queryParams": [], - "pathParams": [], - "auth": { - "type": "bearer", - "target": "headers", - "credentials": { - "username": "", - "password": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJlN2RkZThhZS02OWNjLTQ5NzYtYjI5Ni02OTRlM2RjYjI4MzgiLCJlbWFpbCI6InRlc3RAZXhhbXBsZS5jb20iLCJpYXQiOjE3NTc2OTAyNDcsImV4cCI6MTc1NzY5MTE0N30.sD2-NJzmeaE10J40Dc2Qc15KMKHEqioL_m58iS9W1pY" - } - }, - "body": { - "type": "text", - "file": { - "name": "" - }, - "text": { - "value": "{ \"chain\": \"ethereum\", \"address\": \"0x123...\" }\n", - "format": "application/json" - }, - "form": { - "isMultipart": false, - "fields": [] - }, - "graphql": { - "query": "", - "variables": "" - } - } - } - ] - } - } \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index c4d0377..5ee2c2e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,3 @@ - import { dirname } from "path"; import { fileURLToPath } from "url"; import { FlatCompat } from "@eslint/eslintrc"; @@ -22,11 +21,13 @@ const eslintConfig = [ ], }, { - rules: { - "@typescript-eslint/no-explicit-any": "off" - } - } + "@typescript-eslint/no-explicit-any": "off", + "react-hooks/exhaustive-deps": "off", + "@typescript-eslint/no-unused-vars": "off", + "react/no-unescaped-entities": "off", + }, + }, ]; -export default eslintConfig; \ No newline at end of file +export default eslintConfig; diff --git a/package-lock.json b/package-lock.json index 74a350c..54b88d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3145,204 +3145,615 @@ } }, "node_modules/@reown/appkit": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.8.7.tgz", - "integrity": "sha512-lzTDfC15DFd2zF6DfBGXJrNdBohdb7rgMnPF9A/b3O55SkbA+vb3wogWMThSTekEbaJXXUDLl2a+cO7z2/b4Aw==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.8.9.tgz", + "integrity": "sha512-e3N2DAzf3Xv3jnoD8IsUo0/Yfwuhk7npwJBe1+9rDJIRwgPsyYcCLD4gKPDFC5IUIfOLqK7YtGOh9oPEUnIWpw==", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.7", - "@reown/appkit-controllers": "1.8.7", - "@reown/appkit-pay": "1.8.7", - "@reown/appkit-polyfills": "1.8.7", - "@reown/appkit-scaffold-ui": "1.8.7", - "@reown/appkit-ui": "1.8.7", - "@reown/appkit-utils": "1.8.7", - "@reown/appkit-wallet": "1.8.7", - "@walletconnect/universal-provider": "2.21.7", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-pay": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", + "@reown/appkit-scaffold-ui": "1.8.9", + "@reown/appkit-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "@walletconnect/universal-provider": "2.21.9", "bs58": "6.0.0", "semver": "7.7.2", "valtio": "2.1.7", - "viem": ">=2.37.2" + "viem": ">=2.37.9" }, "optionalDependencies": { "@lit/react": "1.0.8" } }, "node_modules/@reown/appkit-common": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.7.tgz", - "integrity": "sha512-OJPAKBU8XETPXanNVWWI9nb08r16+rySU/O5MHiGOMMTQ1CiWyLTD63dVvSeS5ECGW27jAhg4X6yPyNuGKnQ6w==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.9.tgz", + "integrity": "sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "big.js": "6.2.2", "dayjs": "1.11.13", - "viem": ">=2.37.2" + "viem": ">=2.37.9" } }, "node_modules/@reown/appkit-controllers": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.8.7.tgz", - "integrity": "sha512-UZ5XcO38KLfza6ZeNxaghq2CfNuIz05sFDW31l3UJR78p8rNDYtXSbWoanj8lELZhKilwY7whFyX+7EIi+P5mA==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.8.9.tgz", + "integrity": "sha512-/8hgFAgiYCTDG3gSxJr8hXy6GnO28UxN8JOXFUEi5gOODy7d3+3Jwm+7OEghf7hGKrShDedibsXdXKdX1PUT+g==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.7", - "@reown/appkit-wallet": "1.8.7", - "@walletconnect/universal-provider": "2.21.7", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "@walletconnect/universal-provider": "2.21.9", "valtio": "2.1.7", - "viem": ">=2.37.2" + "viem": ">=2.37.9" } }, - "node_modules/@reown/appkit-pay": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.8.7.tgz", - "integrity": "sha512-agKrLhiK0ahLOMuaR9njq0+855AZ6IkbYSFH+/jsfq+g3/KJaoO6FBXLENlZo053dOelN+bWK9mggeHTL9r0Sg==", - "license": "SEE LICENSE IN LICENSE.md", + "node_modules/@reown/appkit-controllers/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/@reown/appkit-controllers/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", "dependencies": { - "@reown/appkit-common": "1.8.7", - "@reown/appkit-controllers": "1.8.7", - "@reown/appkit-ui": "1.8.7", - "@reown/appkit-utils": "1.8.7", - "lit": "3.3.0", - "valtio": "2.1.7" + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit-polyfills": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.8.7.tgz", - "integrity": "sha512-ZzPFM/mBo676rAJsjVoWbOKOwQFvzoHnPY1Gm0omXk3RM11CP+KhVnGQDy+fN5ZXZ1VSUQSDsjN7sofIlvytXw==", + "node_modules/@reown/appkit-controllers/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "buffer": "6.0.3" + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.39.3", + "events": "3.3.0", + "uint8arrays": "3.1.1" + }, + "engines": { + "node": ">=18.20.8" } }, - "node_modules/@reown/appkit-scaffold-ui": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.7.tgz", - "integrity": "sha512-gx3uogqpw9k6AJ5smowdrGdFg7WjbYtnOiDw/jwDi9zmEd8T0BDmCl6xX9QN0s26943VX2mh2bLVWpX6Agk47A==", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.7", - "@reown/appkit-controllers": "1.8.7", - "@reown/appkit-ui": "1.8.7", - "@reown/appkit-utils": "1.8.7", - "@reown/appkit-wallet": "1.8.7", - "lit": "3.3.0" + "@walletconnect/core": "2.21.9", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "events": "3.3.0" } }, - "node_modules/@reown/appkit-ui": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.8.7.tgz", - "integrity": "sha512-VBTFA0SiPBq9HOfuOXNiOtNmMeCCv84HfhEILglNWtk+RiGM56mxQoCQJ1t/dQb/xGqwpXo+24czbliDUyZK6Q==", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/types": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@phosphor-icons/webcomponents": "2.1.5", - "@reown/appkit-common": "1.8.7", - "@reown/appkit-controllers": "1.8.7", - "@reown/appkit-wallet": "1.8.7", - "lit": "3.3.0", - "qrcode": "1.5.3" + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" } }, - "node_modules/@reown/appkit-ui/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "es-toolkit": "1.39.3", + "events": "3.3.0" } }, - "node_modules/@reown/appkit-ui/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@msgpack/msgpack": "3.1.2", + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.7", + "@noble/hashes": "1.8.0", + "@scure/base": "1.2.6", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "blakejs": "1.2.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "uint8arrays": "3.1.1", + "viem": "2.36.0" } }, - "node_modules/@reown/appkit-ui/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@noble/curves": "1.9.6", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.0.8", + "isows": "1.0.7", + "ox": "0.9.1", + "ws": "8.18.3" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@reown/appkit-ui/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@noble/hashes": "1.8.0" }, "engines": { - "node": ">=6" + "node": "^14.21.3 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit-ui/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@reown/appkit-controllers/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" + "funding": { + "url": "https://github.com/sponsors/wevm" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } } }, - "node_modules/@reown/appkit-ui/node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "node_modules/@reown/appkit-controllers/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit-ui/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@reown/appkit-controllers/node_modules/ox": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.1.tgz", + "integrity": "sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.8", + "eventemitter3": "5.0.1" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@reown/appkit-ui/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/@reown/appkit-controllers/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/unstorage": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", + "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-controllers/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", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-pay": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.8.9.tgz", + "integrity": "sha512-AEmaPqxnzjawSRFenyiTtq0vjKM5IPb2CTD9wa+OMXFpe6FissO+1Eg1H47sfdrycZCvUizSRmQmYqkJaI8BCw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", + "lit": "3.3.0", + "valtio": "2.1.7" + } + }, + "node_modules/@reown/appkit-polyfills": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.8.9.tgz", + "integrity": "sha512-33YCU8dxe4UkpNf9qCAaHx5crSoEu6tbmZxE/0eEPCYRDRXoiH9VGiN7xwTDOVduacg/U8H6/32ibmYZKnRk5Q==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/@reown/appkit-scaffold-ui": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.9.tgz", + "integrity": "sha512-F7PSM1nxvlvj2eu8iL355GzvCNiL8RKiCqT1zag8aB4QpxjU24l+vAF6debtkg4HY8nJOyDifZ7Z1jkKrHlIDQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-ui": "1.8.9", + "@reown/appkit-utils": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "lit": "3.3.0" + } + }, + "node_modules/@reown/appkit-ui": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.8.9.tgz", + "integrity": "sha512-WR17ql77KOMKfyDh7RW4oSfmj+p5gIl0u8Wmopzbx5Hd0HcPVZ5HmTDpwOM9WCSxYcin0fsSAoI+nVdvrhWNtw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@phosphor-icons/webcomponents": "2.1.5", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-wallet": "1.8.9", + "lit": "3.3.0", + "qrcode": "1.5.3" + } + }, + "node_modules/@reown/appkit-ui/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/@reown/appkit-ui/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@reown/appkit-ui/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@reown/appkit-ui/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@reown/appkit-ui/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@reown/appkit-ui/node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@reown/appkit-ui/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@reown/appkit-ui/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "license": "ISC" }, "node_modules/@reown/appkit-ui/node_modules/yargs": { @@ -3381,44 +3792,866 @@ } }, "node_modules/@reown/appkit-utils": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.8.7.tgz", - "integrity": "sha512-OW5Y8GDNZ2OGeLepnQuppf1b+2rjEPF/e416yOORDG4Ha2jlNOEWPbPhaurvxMRDdER4w/2X59Ekc+R+PzEuUw==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.8.9.tgz", + "integrity": "sha512-U9hx4h7tIE7ha/QWKjZpZc/imaLumdwe0QNdku9epjp/npXVjGuwUrW5mj8yWNSkjtQpY/BEItNdDAUKZ7rrjw==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.7", - "@reown/appkit-controllers": "1.8.7", - "@reown/appkit-polyfills": "1.8.7", - "@reown/appkit-wallet": "1.8.7", + "@reown/appkit-common": "1.8.9", + "@reown/appkit-controllers": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", + "@reown/appkit-wallet": "1.8.9", "@wallet-standard/wallet": "1.1.0", "@walletconnect/logger": "2.1.2", - "@walletconnect/universal-provider": "2.21.7", + "@walletconnect/universal-provider": "2.21.9", "valtio": "2.1.7", - "viem": ">=2.37.2" + "viem": ">=2.37.9" }, "peerDependencies": { "valtio": "2.1.7" } }, - "node_modules/@reown/appkit-wallet": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.8.7.tgz", - "integrity": "sha512-ExvQ4u68W0BuM9i+tptH6k/DMInM+MWeLexB35WJRnAa9mQAT1EZbFhFA5hOm8YiEmWrG6nBLMv5/zRChVf9hw==", - "license": "SEE LICENSE IN LICENSE.md", + "node_modules/@reown/appkit-utils/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/@reown/appkit-utils/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.39.3", + "events": "3.3.0", + "uint8arrays": "3.1.1" + }, + "engines": { + "node": ">=18.20.8" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/core": "2.21.9", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/types": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "es-toolkit": "1.39.3", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@msgpack/msgpack": "3.1.2", + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.7", + "@noble/hashes": "1.8.0", + "@scure/base": "1.2.6", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "blakejs": "1.2.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "uint8arrays": "3.1.1", + "viem": "2.36.0" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.6", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.0.8", + "isows": "1.0.7", + "ox": "0.9.1", + "ws": "8.18.3" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/ox": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.1.tgz", + "integrity": "sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.8", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-utils/node_modules/unstorage": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", + "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-utils/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", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@reown/appkit-wallet": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.8.9.tgz", + "integrity": "sha512-rcAXvkzOVG4941eZVCGtr2dSJAMOclzZGSe+8hnOUnhK4zxa5svxiP6K9O5SMBp3MrAS3WNsRj5hqx6+JHb7iA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@reown/appkit-common": "1.8.9", + "@reown/appkit-polyfills": "1.8.9", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" + } + }, + "node_modules/@reown/appkit-wallet/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@reown/appkit/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/@reown/appkit/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/core": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.9.tgz", + "integrity": "sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.39.3", + "events": "3.3.0", + "uint8arrays": "3.1.1" + }, + "engines": { + "node": ">=18.20.8" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.9.tgz", + "integrity": "sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/core": "2.21.9", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/types": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.9.tgz", + "integrity": "sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.9.tgz", + "integrity": "sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@reown/appkit-common": "1.8.7", - "@reown/appkit-polyfills": "1.8.7", + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", - "zod": "3.22.4" + "@walletconnect/sign-client": "2.21.9", + "@walletconnect/types": "2.21.9", + "@walletconnect/utils": "2.21.9", + "es-toolkit": "1.39.3", + "events": "3.3.0" } }, - "node_modules/@reown/appkit-wallet/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "node_modules/@reown/appkit/node_modules/@walletconnect/utils": { + "version": "2.21.9", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.9.tgz", + "integrity": "sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@msgpack/msgpack": "3.1.2", + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.7", + "@noble/hashes": "1.8.0", + "@scure/base": "1.2.6", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.9", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "blakejs": "1.2.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "uint8arrays": "3.1.1", + "viem": "2.36.0" + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", + "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.6", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.0.8", + "isows": "1.0.7", + "ox": "0.9.1", + "ws": "8.18.3" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "license": "MIT", "funding": { - "url": "https://github.com/sponsors/colinhacks" + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/ox": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.1.tgz", + "integrity": "sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.8", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/unstorage": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", + "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/@reown/appkit/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", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@rometools/cli-darwin-arm64": { @@ -15377,9 +16610,9 @@ } }, "node_modules/viem": { - "version": "2.37.8", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.37.8.tgz", - "integrity": "sha512-mL+5yvCQbRIR6QvngDQMfEiZTfNWfd+/QL5yFaOoYbpH3b1Q2ddwF7YG2eI2AcYSh9LE1gtUkbzZLFUAVyj4oQ==", + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.38.0.tgz", + "integrity": "sha512-YU5TG8dgBNeYPrCMww0u9/JVeq2ZCk9fzk6QybrPkBooFysamHXL1zC3ua10aLPt9iWoA/gSVf1D9w7nc5B1aA==", "funding": [ { "type": "github", diff --git a/types/authContext.ts b/types/authContext.ts index bb12caa..2d8a7a4 100644 --- a/types/authContext.ts +++ b/types/authContext.ts @@ -293,7 +293,7 @@ export type CreateMerchantPaymentRequest = { export type CreateMerchantPaymentResponse = { message: string; payment: { - paymentId: string; + id: string; merchantId: string; amount: string; currency: string;