caplib
Version:
Credentialless Authentication Protocol Library for Web Applications
1 lines • 50 kB
Source Map (JSON)
{"version":3,"sources":["../src/react/components/OnboardingForm.tsx","../src/react/assets/zerocat-logo.ts","../src/react/components/CapAuth.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Button,\n Flex,\n FormControl,\n FormLabel,\n Heading,\n Input,\n Radio,\n RadioGroup,\n Select,\n Stack,\n Text,\n VStack,\n useToast,\n FormErrorMessage,\n Image,\n} from '@chakra-ui/react';\nimport type { User, UserDetails } from '../../types';\n\n// Import the logo directly\n// This will be bundled with the library during build\nimport ZeroCatLogo from '../assets/zerocat-logo';\n\ninterface OnboardingFormProps {\n walletAddress: string;\n onComplete: (user: User) => void;\n onBack: () => void;\n theme?: {\n primary: string;\n secondary: string;\n };\n customStyles?: {\n container?: string;\n card?: string;\n button?: string;\n input?: string;\n select?: string;\n };\n}\n\ntype AccountType = 'human' | 'entity';\n\nexport function OnboardingForm({\n walletAddress,\n onComplete,\n onBack,\n theme = { primary: 'blue', secondary: 'teal' },\n}: OnboardingFormProps) {\n const toast = useToast();\n const [loading, setLoading] = useState(false);\n const [accountType, setAccountType] = useState<AccountType>('human');\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [availableRoles, setAvailableRoles] = useState<string[]>(['User']);\n const [defaultRole, setDefaultRole] = useState<string>('User');\n\n const [details, setDetails] = useState<UserDetails>({\n first_name: '',\n last_name: '',\n entity_name: '',\n email: '',\n role: 'User',\n });\n\n // Fetch available roles from the API\n useEffect(() => {\n const fetchRoles = async () => {\n try {\n const response = await fetch('/api/roles');\n if (response.ok) {\n const data = await response.json();\n if (data.roles && Array.isArray(data.roles) && data.roles.length > 0) {\n setAvailableRoles(data.roles);\n \n if (data.defaultRole) {\n setDefaultRole(data.defaultRole);\n setDetails(prev => ({\n ...prev,\n role: data.defaultRole\n }));\n }\n }\n }\n } catch (error) {\n console.error('Failed to fetch roles:', error);\n // Fall back to hardcoded roles\n }\n };\n\n fetchRoles();\n }, []);\n\n const handleDetailsChange = <K extends keyof UserDetails>(\n key: K,\n value: UserDetails[K]\n ) => {\n setDetails((prev) => ({\n ...prev,\n [key]: value,\n }));\n\n if (errors[key]) {\n setErrors((prev) => {\n const newErrors = { ...prev };\n delete newErrors[key];\n return newErrors;\n });\n }\n };\n\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (accountType === 'human') {\n if (!details.first_name.trim()) {\n newErrors.first_name = 'First name is required';\n }\n if (!details.last_name.trim()) {\n newErrors.last_name = 'Last name is required';\n }\n } else {\n if (!details.entity_name.trim()) {\n newErrors.entity_name = 'Entity name is required';\n }\n }\n\n if (!details.email.trim()) {\n newErrors.email = 'Email is required';\n } else if (!/\\S+@\\S+\\.\\S+/.test(details.email)) {\n newErrors.email = 'Email is invalid';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n setLoading(true);\n\n try {\n const payload = {\n wallet_address: walletAddress,\n first_name: accountType === 'human' ? details.first_name : '',\n last_name: accountType === 'human' ? details.last_name : 'ENTITY',\n entity_name: accountType === 'entity' ? details.entity_name : '',\n email: details.email,\n role: details.role,\n account_type: accountType,\n };\n\n const createResponse = await fetch('/api/users/create', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!createResponse.ok) {\n throw new Error('Failed to create profile');\n }\n\n const data = await createResponse.json();\n onComplete(data.user);\n\n toast({\n title: 'Profile created',\n description: 'Your profile has been successfully created.',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n } catch (error) {\n console.error('Registration error:', error);\n\n toast({\n title: 'Registration failed',\n description: error instanceof Error ? error.message : 'Failed to create account',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Box width=\"100%\" p={6} position=\"relative\">\n <VStack spacing={6} align=\"stretch\">\n <Box textAlign=\"center\" mb={6}>\n <Flex justifyContent=\"center\" mb={4}>\n <Image \n src={ZeroCatLogo} \n alt=\"ZEROCAT\" \n height=\"32px\"\n width=\"80px\"\n objectFit=\"contain\"\n />\n </Flex>\n <Heading\n as=\"h1\"\n size=\"xl\"\n bgGradient={`linear(to-r, ${theme.primary}.400, ${theme.secondary}.400)`}\n backgroundClip=\"text\"\n mb={2}\n >\n Complete Your Profile\n </Heading>\n <Text color=\"whiteAlpha.700\">Tell us a bit about yourself</Text>\n </Box>\n\n <form onSubmit={handleSubmit}>\n <VStack spacing={6} align=\"stretch\">\n <FormControl as=\"fieldset\">\n <FormLabel as=\"legend\" fontWeight=\"medium\">\n Account Type\n </FormLabel>\n <RadioGroup\n defaultValue=\"human\"\n onChange={(value: string) => setAccountType(value as AccountType)}\n value={accountType}\n >\n <Stack direction=\"row\" spacing={5}>\n <Radio value=\"human\">Individual</Radio>\n <Radio value=\"entity\">Entity/Organization</Radio>\n </Stack>\n </RadioGroup>\n </FormControl>\n\n {accountType === 'human' ? (\n <Stack direction={{ base: 'column', md: 'row' }} spacing={4}>\n <FormControl isInvalid={!!errors.first_name}>\n <FormLabel>First Name</FormLabel>\n <Input\n value={details.first_name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleDetailsChange('first_name', e.target.value)}\n placeholder=\"John\"\n />\n <FormErrorMessage>{errors.first_name}</FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.last_name}>\n <FormLabel>Last Name</FormLabel>\n <Input\n value={details.last_name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleDetailsChange('last_name', e.target.value)}\n placeholder=\"Doe\"\n />\n <FormErrorMessage>{errors.last_name}</FormErrorMessage>\n </FormControl>\n </Stack>\n ) : (\n <FormControl isInvalid={!!errors.entity_name}>\n <FormLabel>Organization Name</FormLabel>\n <Input\n value={details.entity_name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleDetailsChange('entity_name', e.target.value)}\n placeholder=\"Company or Organization Name\"\n />\n <FormErrorMessage>{errors.entity_name}</FormErrorMessage>\n </FormControl>\n )}\n\n <FormControl isInvalid={!!errors.email}>\n <FormLabel>Email</FormLabel>\n <Input\n type=\"email\"\n value={details.email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleDetailsChange('email', e.target.value)}\n placeholder=\"you@example.com\"\n />\n <FormErrorMessage>{errors.email}</FormErrorMessage>\n </FormControl>\n\n <FormControl>\n <FormLabel>Role</FormLabel>\n <Select\n value={details.role}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => handleDetailsChange('role', e.target.value)}\n >\n {availableRoles.map(role => (\n <option key={role} value={role}>{role}</option>\n ))}\n </Select>\n </FormControl>\n\n <Flex gap={3} pt={4}>\n <Button\n flex=\"1\"\n variant=\"outline\"\n onClick={onBack}\n isDisabled={loading}\n >\n Back\n </Button>\n <Button\n flex=\"1\"\n variant=\"gradient\"\n type=\"submit\"\n isLoading={loading}\n loadingText=\"Creating...\"\n >\n Complete\n </Button>\n </Flex>\n </VStack>\n </form>\n </VStack>\n \n {/* Footer with ZEROCAT branding */}\n <Flex \n justifyContent=\"center\" \n alignItems=\"center\" \n position=\"absolute\"\n bottom=\"0\"\n left=\"0\"\n right=\"0\"\n p={2}\n borderTop=\"1px\"\n borderColor=\"whiteAlpha.100\"\n bg=\"whiteAlpha.50\"\n >\n <Text fontSize=\"xs\" color=\"whiteAlpha.600\" mr={1}>Powered by</Text>\n <Image\n src={ZeroCatLogo}\n alt=\"ZEROCAT\"\n height=\"12px\"\n width=\"28px\"\n />\n </Flex>\n </Box>\n );\n}","let logoUrl = '';\n\ntry {\n // Try to load from assets in production build\n logoUrl = new URL('./zerocat.png', import.meta.url).href;\n} catch (e) {\n // Fallback for older environments or when import.meta.url is not supported\n try {\n // Check if we're in a browser environment\n if (typeof window !== 'undefined') {\n logoUrl = '/zerocat.png'; // Fallback to root path\n }\n } catch (err) {\n console.warn('Failed to load Zerocat logo:', err);\n }\n}\n\nexport default logoUrl;","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { QRCodeSVG } from 'qrcode.react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport {\n Box,\n Button,\n Center,\n Flex,\n Heading,\n HStack,\n Icon,\n IconButton,\n Image,\n Spinner,\n Step,\n StepIcon,\n StepIndicator,\n StepNumber,\n StepSeparator,\n StepStatus,\n StepTitle,\n Stepper,\n Text,\n useSteps,\n VStack,\n useToast,\n} from '@chakra-ui/react';\nimport { PhoneIcon, CheckIcon, CloseIcon, RepeatIcon } from '@chakra-ui/icons';\nimport type { CapAuthProps, User } from '../../types';\nimport { OnboardingForm } from './OnboardingForm';\nimport ZeroCatLogo from '../assets/zerocat-logo';\n\nconst fadeIn = {\n hidden: { opacity: 0 },\n visible: { opacity: 1, transition: { duration: 0.3 } },\n exit: { opacity: 0, transition: { duration: 0.2 } },\n};\n\nconst slideRight = {\n hidden: { x: -30, opacity: 0 },\n visible: { x: 0, opacity: 1, transition: { duration: 0.4 } },\n exit: { x: 30, opacity: 0, transition: { duration: 0.3 } },\n};\n\nconst steps = [\n { title: 'Prepare' },\n { title: 'Scan' },\n { title: 'Verify' },\n { title: 'Profile' },\n];\n\nexport function CapAuth({\n onAuthenticated,\n config,\n onError,\n}: CapAuthProps) {\n const toast = useToast();\n const { activeStep, setActiveStep } = useSteps({\n index: 0,\n count: steps.length,\n });\n\n const [stage, setStage] = useState<'intro' | 'qr' | 'polling' | 'onboarding'>('intro');\n const [qrData, setQrData] = useState<string | null>(null);\n const [qrUri, setQrUri] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [nonce, setNonce] = useState<string | null>(null);\n const [walletAddress, setWalletAddress] = useState<string | null>(null);\n const [isPollingActive, setIsPollingActive] = useState(true);\n\n const pollingIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const timeoutIdRef = useRef<NodeJS.Timeout | null>(null);\n const isAuthenticatedRef = useRef<boolean>(false);\n\n const cleanupTimers = () => {\n if (pollingIntervalRef.current) {\n clearInterval(pollingIntervalRef.current);\n pollingIntervalRef.current = null;\n }\n if (timeoutIdRef.current) {\n clearTimeout(timeoutIdRef.current);\n timeoutIdRef.current = null;\n }\n };\n\n useEffect(() => {\n return () => cleanupTimers();\n }, []);\n\n useEffect(() => {\n if (stage === 'polling' && nonce && isPollingActive && !isAuthenticatedRef.current) {\n const interval = setInterval(async () => {\n try {\n const response = await fetch('/api/auth', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ nonce }),\n });\n\n if (!response.ok) throw new Error('Verification failed');\n\n const data = await response.json();\n if (data.authenticated && data.userAddress) {\n isAuthenticatedRef.current = true;\n setIsPollingActive(false);\n cleanupTimers();\n\n if (data.user) {\n onAuthenticated(data.user);\n toast({\n title: \"Authentication successful\",\n status: \"success\",\n duration: 3000,\n isClosable: true,\n });\n } else {\n setActiveStep(3);\n setWalletAddress(data.userAddress);\n setStage('onboarding');\n }\n }\n } catch (error) {\n console.error('Polling error:', error);\n }\n }, config.timeouts?.polling || 3000);\n\n pollingIntervalRef.current = interval;\n\n const timeout = setTimeout(() => {\n cleanupTimers();\n setError('Authentication timeout. Please try again.');\n setStage('intro');\n setActiveStep(0);\n }, config.timeouts?.authentication || 300000);\n\n timeoutIdRef.current = timeout;\n\n return () => cleanupTimers();\n }\n }, [stage, nonce, isPollingActive, config, onAuthenticated, toast, setActiveStep]);\n\n const generateQR = async () => {\n try {\n setError(null);\n setActiveStep(1);\n\n const response = await fetch('/api/auth');\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.error || 'Failed to generate authentication code');\n }\n\n const receiverAddr = process.env.NEXT_PUBLIC_SERVER_WALLET_ADDRESS || '';\n const contractId = process.env.NEXT_PUBLIC_AUTH_CONTRACT_ID || '';\n const tokenId = process.env.NEXT_PUBLIC_TOKEN_ID || '';\n\n const txDetails = `smart_contract_auth_${contractId},nonce_${data.nonce}`;\n\n const txParams = `amount=0,recipientAddress=${receiverAddr},senderAddress=customer_,timestamp=${new Date().toISOString()},tokenId=${tokenId},transactionCost=0,transactionDetails=${txDetails},transactionId=transaction_`;\n\n setQrData(txParams);\n setQrUri(`zerowallet://transaction?${txParams}`);\n setNonce(data.nonce);\n setStage('qr');\n } catch (error) {\n console.error('QR generation error:', error);\n setError('Failed to generate authentication code. Please try again.');\n\n toast({\n title: \"Error\",\n description: \"Failed to generate authentication code. Please try again.\",\n status: \"error\",\n duration: 5000,\n isClosable: true,\n });\n\n if (onError && error instanceof Error) {\n onError(error);\n }\n }\n };\n\n const handleOpenMobileWallet = () => {\n if (config.enableMobileWallet && qrUri) {\n window.location.href = qrUri;\n }\n };\n\n const proceedToVerification = () => {\n setActiveStep(2);\n setStage('polling');\n setIsPollingActive(true);\n };\n\n const handleRetry = () => {\n cleanupTimers();\n setError(null);\n setQrData(null);\n setQrUri(null);\n setNonce(null);\n setWalletAddress(null);\n setStage('intro');\n setActiveStep(0);\n setIsPollingActive(true);\n isAuthenticatedRef.current = false;\n };\n\n const handleOnboardingComplete = (user: User) => {\n setIsPollingActive(false);\n isAuthenticatedRef.current = true;\n\n if (walletAddress) {\n onAuthenticated(user);\n toast({\n title: \"Profile completed\",\n description: \"You're now successfully signed in.\",\n status: \"success\",\n duration: 3000,\n isClosable: true,\n });\n }\n };\n\n const {\n theme = { primary: 'blue', secondary: 'teal' },\n } = config;\n\n return (\n <Box\n width={{ base: \"90vw\", sm: \"100%\" }}\n maxW=\"md\"\n borderRadius=\"xl\"\n overflow=\"hidden\"\n bg=\"dark.200\"\n borderWidth=\"1px\"\n borderColor=\"whiteAlpha.200\"\n boxShadow=\"xl\"\n position=\"relative\"\n >\n <Box p={{ base: 2, sm: 4 }} bg=\"whiteAlpha.50\">\n <Stepper index={activeStep} colorScheme=\"brand\" size=\"sm\">\n {steps.map((step, index) => (\n <Step key={index}>\n <StepIndicator>\n <StepStatus\n complete={<StepIcon />}\n incomplete={<StepNumber />}\n active={<StepNumber />}\n />\n </StepIndicator>\n <Box flexShrink={0}>\n <StepTitle fontSize={{ base: \"xs\", sm: \"sm\" }}>{step.title}</StepTitle>\n </Box>\n <StepSeparator />\n </Step>\n ))}\n </Stepper>\n </Box>\n\n <AnimatePresence mode=\"wait\">\n {stage === 'intro' && (\n <motion.div\n key=\"intro\"\n variants={fadeIn}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n >\n <VStack spacing={{ base: 4, sm: 6 }} p={{ base: 4, sm: 6 }}>\n <Box textAlign=\"center\">\n <Heading\n as=\"h1\"\n size={{ base: \"lg\", sm: \"xl\" }}\n bgGradient={`linear(to-r, ${theme.primary}.400, ${theme.secondary}.400)`}\n backgroundClip=\"text\"\n mb={2}\n >\n {config.appName}\n </Heading>\n <Text color=\"whiteAlpha.700\" fontSize={{ base: \"sm\", sm: \"md\" }}>\n {config.appDescription}\n </Text>\n </Box>\n\n <VStack spacing={4} w=\"full\">\n <Flex\n align=\"flex-start\"\n gap={4}\n p={4}\n bg=\"whiteAlpha.50\"\n borderRadius=\"lg\"\n w=\"full\"\n >\n <Box color=\"blue.400\" mt={1}>\n <PhoneIcon boxSize={{ base: 4, sm: 5 }} />\n </Box>\n <Box>\n <Text fontWeight=\"medium\" fontSize={{ base: \"sm\", sm: \"md\" }}>Get Your Wallet Ready</Text>\n <Text fontSize={{ base: \"xs\", sm: \"sm\" }} color=\"whiteAlpha.700\">\n Ensure you have ZeroWallet installed and ready\n </Text>\n </Box>\n </Flex>\n\n <Flex\n align=\"flex-start\"\n gap={4}\n p={4}\n bg=\"whiteAlpha.50\"\n borderRadius=\"lg\"\n w=\"full\"\n >\n <Box color=\"teal.400\" mt={1}>\n <Icon\n viewBox=\"0 0 24 24\"\n boxSize={{ base: 4, sm: 5 }}\n >\n <path\n fill=\"currentColor\"\n d=\"M3 11h8V3H3v8zm2-6h4v4H5V5zm8-2v8h8V3h-8zm6 6h-4V5h4v4zM3 21h8v-8H3v8zm2-6h4v4H5v-4zm13-2h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4z\"\n />\n </Icon>\n </Box>\n <Box>\n <Text fontWeight=\"medium\" fontSize={{ base: \"sm\", sm: \"md\" }}>Credentialless Auth</Text>\n <Text fontSize={{ base: \"xs\", sm: \"sm\" }} color=\"whiteAlpha.700\">\n Scan QR code with your phone to open ZeroWallet\n </Text>\n </Box>\n </Flex>\n </VStack>\n\n <Button\n w=\"full\"\n variant=\"gradient\"\n size={{ base: \"md\", sm: \"lg\" }}\n onClick={generateQR}\n rightIcon={<Icon viewBox=\"0 0 24 24\" boxSize={{ base: 4, sm: 5 }}>\n <path\n fill=\"currentColor\"\n d=\"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z\"\n />\n </Icon>}\n >\n Start Authentication\n </Button>\n </VStack>\n </motion.div>\n )}\n\n {stage === 'qr' && qrData && (\n <motion.div\n key=\"qr\"\n variants={slideRight}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n >\n <VStack spacing={{ base: 4, sm: 6 }} p={{ base: 4, sm: 6 }}>\n <Box textAlign=\"center\">\n <Heading as=\"h2\" size={{ base: \"md\", sm: \"lg\" }} mb={2}>Scan QR Code</Heading>\n <Text color=\"whiteAlpha.700\" fontSize={{ base: \"xs\", sm: \"sm\" }}>\n Open your camera app and scan this code\n </Text>\n </Box>\n\n <Center py={{ base: 4, sm: 6 }}>\n <Box p={{ base: 3, sm: 4 }} bg=\"white\" borderRadius=\"xl\" boxShadow=\"xl\">\n <QRCodeSVG\n value={qrUri || ''}\n size={Math.min(220, window.innerWidth * 0.6)}\n level=\"M\"\n includeMargin={true}\n />\n </Box>\n </Center>\n\n <VStack spacing={4} w=\"full\">\n {config.enableMobileWallet && (\n <Button\n w=\"full\"\n variant=\"outline\"\n onClick={handleOpenMobileWallet}\n leftIcon={<PhoneIcon />}\n size={{ base: \"sm\", sm: \"md\" }}\n >\n Open in ZeroWallet\n </Button>\n )}\n\n <Button\n w=\"full\"\n variant=\"gradient\"\n onClick={proceedToVerification}\n rightIcon={<CheckIcon />}\n size={{ base: \"sm\", sm: \"md\" }}\n >\n I've Completed the Transaction\n </Button>\n </VStack>\n </VStack>\n </motion.div>\n )}\n\n {stage === 'polling' && (\n <motion.div\n key=\"polling\"\n variants={fadeIn}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n >\n <VStack spacing={6} p={{ base: 6, sm: 8 }} textAlign=\"center\">\n <Spinner\n thickness=\"4px\"\n speed=\"0.65s\"\n emptyColor=\"whiteAlpha.200\"\n color=\"brand.500\"\n size={{ base: \"lg\", sm: \"xl\" }}\n />\n\n <Box>\n <Heading as=\"h2\" size={{ base: \"md\", sm: \"lg\" }} mb={2}>Verifying</Heading>\n <Text color=\"whiteAlpha.700\" fontSize={{ base: \"sm\", sm: \"md\" }}>\n Please wait while we confirm your transaction...\n </Text>\n </Box>\n </VStack>\n </motion.div>\n )}\n\n {stage === 'onboarding' && walletAddress && (\n <motion.div\n key=\"onboarding\"\n variants={slideRight}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n >\n <OnboardingForm\n walletAddress={walletAddress}\n onComplete={handleOnboardingComplete}\n onBack={handleRetry}\n theme={theme}\n />\n </motion.div>\n )}\n </AnimatePresence>\n\n {error && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n >\n <Box p={{ base: 3, sm: 4 }} bg=\"red.900\" color=\"white\" mt={2}>\n <VStack spacing={{ base: 3, sm: 4 }}>\n <Text color=\"red.200\" textAlign=\"center\" fontSize={{ base: \"sm\", sm: \"md\" }}>{error}</Text>\n <Button\n leftIcon={<RepeatIcon />}\n colorScheme=\"red\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRetry}\n >\n Try Again\n </Button>\n </VStack>\n </Box>\n </motion.div>\n )}\n\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n p={2}\n borderTop=\"1px\"\n borderColor=\"whiteAlpha.100\"\n bg=\"whiteAlpha.50\"\n >\n <Text fontSize=\"xs\" color=\"whiteAlpha.600\" mr={1}>Powered by</Text>\n <Image\n src={ZeroCatLogo}\n alt=\"ZEROCAT\"\n height={{ base: \"10px\", sm: \"12px\" }}\n width={{ base: \"24px\", sm: \"28px\" }}\n />\n </Flex>\n </Box>\n );\n}"],"mappings":"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","names":["useState","useEffect","Box","Button","Flex","Heading","Image","Text","VStack","useToast","jsx","jsxs","useToast","useState","useEffect","error","Box","VStack","Heading","Text","Flex