{
  "name": "inscriptions-components-bsv21mintbutton",
  "type": "registry:component",
  "dependencies": [
    "@bsv/sdk",
    "@radix-ui/react-icons",
    "js-1sat-ord"
  ],
  "devDependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "components/inscriptions/components/BSV21MintButton.tsx",
      "type": "registry:component",
      "content": "/**\n * BSV21MintButton Component\n *\n * Component for deploying BSV-21 NFT tokens with icon inscriptions\n * BSV-21 is the NFT standard that requires an icon image\n */\n\nimport { PrivateKey } from \"@bsv/sdk\";\nimport { ImageIcon, InfoCircledIcon, PlusIcon } from \"@radix-ui/react-icons\";\nimport type {\n\tDeployBsv21TokenConfig,\n\tIconInscription,\n\tImageContentType,\n} from \"js-1sat-ord\";\nimport { deployBsv21Token } from \"js-1sat-ord\";\nimport { useCallback, useState } from \"react\";\nimport { useBitcoinAuth } from \"../../../hooks/useBitcoinAuth.js\";\nimport { DropZone } from \"../../ui-components/DropZone.js\";\nimport { ErrorDisplay } from \"../../ui-components/ErrorDisplay.js\";\nimport { LoadingButton } from \"../../ui-components/LoadingButton.js\";\nimport { Modal } from \"../../ui-components/Modal.js\";\nimport {\n\tTransactionProgress,\n\tTransactionStatus,\n} from \"../../ui-components/TransactionProgress.js\";\nimport { Badge } from \"../../ui/badge.js\";\nimport { Button } from \"../../ui/button.js\";\nimport { Input } from \"../../ui/input.js\";\n\nexport interface BSV21Token {\n\t/** Token symbol/ticker */\n\tsymbol: string;\n\t/** Icon image file */\n\ticon: File | null;\n\t/** Maximum supply */\n\tmaxSupply: number;\n\t/** Number of decimal places */\n\tdecimals?: number;\n}\n\nexport interface BSV21MintButtonProps {\n\t/** Pre-filled token data */\n\ttoken?: Partial<BSV21Token>;\n\t/** Button text */\n\tbuttonText?: string;\n\t/** Dialog title */\n\tdialogTitle?: string;\n\t/** Button variant */\n\tvariant?: \"solid\" | \"soft\" | \"outline\" | \"ghost\";\n\t/** Button size */\n\tsize?: \"1\" | \"2\" | \"3\" | \"4\";\n\t/** Button color */\n\tcolor?: \"blue\" | \"green\" | \"red\" | \"gray\";\n\t/** Additional CSS classes */\n\tclassName?: string;\n\t/** Whether button is disabled */\n\tdisabled?: boolean;\n\t/** Show fee estimate */\n\tshowFeeEstimate?: boolean;\n\t/** Success callback */\n\tonSuccess?: (txid: string, token: BSV21Token) => void;\n\t/** Error callback */\n\tonError?: (error: Error) => void;\n}\n\nconst SUPPORTED_IMAGE_TYPES = [\n\t\"image/png\",\n\t\"image/jpeg\",\n\t\"image/jpg\",\n\t\"image/gif\",\n\t\"image/webp\",\n];\nconst MAX_IMAGE_SIZE = 100 * 1024; // 100KB\nconst MAX_IMAGE_DIMENSION = 400; // 400x400px\n\nexport function BSV21MintButton({\n\ttoken: initialToken,\n\tbuttonText = \"Deploy BSV-21 Token\",\n\tdialogTitle = \"Deploy BSV-21 NFT Token\",\n\tvariant = \"solid\",\n\tsize = \"2\",\n\tclassName = \"\",\n\tdisabled = false,\n\tonSuccess,\n\tonError,\n}: BSV21MintButtonProps) {\n\tconst { walletExtension } = useBitcoinAuth();\n\tconst [open, setOpen] = useState(false);\n\tconst [loading, setLoading] = useState(false);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [txid, setTxid] = useState<string | null>(null);\n\n\t// Form state\n\tconst [symbol, setSymbol] = useState(initialToken?.symbol || \"\");\n\tconst [maxSupply, setMaxSupply] = useState<number>(\n\t\tNumber(initialToken?.maxSupply) || 0,\n\t);\n\tconst [decimals, setDecimals] = useState<number>(initialToken?.decimals || 0);\n\tconst [iconFile, setIconFile] = useState<File | null>(\n\t\tinitialToken?.icon || null,\n\t);\n\tconst [iconPreview, setIconPreview] = useState<string | null>(null);\n\n\t// Validation errors\n\tconst [errors, setErrors] = useState<Record<string, string>>({});\n\n\t// Handle icon file selection - using onFileSelect for single file\n\tconst handleIconSelect = useCallback((file: File) => {\n\t\tconst newErrors: Record<string, string> = {};\n\n\t\t// Validate file type\n\t\tif (!SUPPORTED_IMAGE_TYPES.includes(file.type)) {\n\t\t\tnewErrors.icon =\n\t\t\t\t\"Unsupported image type. Please use PNG, JPEG, GIF, or WebP.\";\n\t\t\tsetErrors(newErrors);\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate file size\n\t\tif (file.size > MAX_IMAGE_SIZE) {\n\t\t\tnewErrors.icon = \"Image too large. Maximum size is 100KB.\";\n\t\t\tsetErrors(newErrors);\n\t\t\treturn;\n\t\t}\n\n\t\t// Create preview and validate dimensions\n\t\tconst reader = new FileReader();\n\t\treader.onload = (e) => {\n\t\t\tconst img = new Image();\n\t\t\timg.onload = () => {\n\t\t\t\t// Check if image is square\n\t\t\t\tif (img.width !== img.height) {\n\t\t\t\t\tnewErrors.icon = \"Image must be square (same width and height).\";\n\t\t\t\t\tsetErrors(newErrors);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check dimensions\n\t\t\t\tif (\n\t\t\t\t\timg.width > MAX_IMAGE_DIMENSION ||\n\t\t\t\t\timg.height > MAX_IMAGE_DIMENSION\n\t\t\t\t) {\n\t\t\t\t\tnewErrors.icon = `Image too large. Maximum dimensions are ${MAX_IMAGE_DIMENSION}x${MAX_IMAGE_DIMENSION}px.`;\n\t\t\t\t\tsetErrors(newErrors);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// All validations passed\n\t\t\t\tsetIconFile(file);\n\t\t\t\tsetIconPreview(e.target?.result as string);\n\t\t\t\tsetErrors((prev) => ({ ...prev, icon: \"\" }));\n\t\t\t};\n\t\t\timg.src = e.target?.result as string;\n\t\t};\n\t\treader.readAsDataURL(file);\n\t}, []);\n\n\t// Validate form\n\tconst validateForm = useCallback((): boolean => {\n\t\tconst newErrors: Record<string, string> = {};\n\n\t\tif (!symbol || symbol.length < 1 || symbol.length > 255) {\n\t\t\tnewErrors.symbol = \"Symbol must be 1-255 characters\";\n\t\t}\n\n\t\tif (!maxSupply || maxSupply <= 0) {\n\t\t\tnewErrors.maxSupply = \"Max supply must be greater than 0\";\n\t\t}\n\n\t\tif (!iconFile) {\n\t\t\tnewErrors.icon = \"Icon image is required\";\n\t\t}\n\n\t\tif (decimals !== undefined && (decimals < 0 || decimals > 18)) {\n\t\t\tnewErrors.decimals = \"Decimals must be 0-18\";\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn Object.keys(newErrors).length === 0;\n\t}, [symbol, maxSupply, iconFile, decimals]);\n\n\t// Handle token deployment\n\tconst handleDeploy = useCallback(async () => {\n\t\tif (!walletExtension) {\n\t\t\tsetError(new Error(\"Wallet not connected\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif (!validateForm()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!iconFile) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetLoading(true);\n\t\tsetError(null);\n\n\t\ttry {\n\t\t\t// Get UTXOs\n\t\t\tconst utxos = walletExtension.utxos || [];\n\t\t\tif (utxos.length === 0) {\n\t\t\t\tthrow new Error(\"No UTXOs available for deployment\");\n\t\t\t}\n\n\t\t\t// Read icon file\n\t\t\tconst iconData = await iconFile.arrayBuffer();\n\t\t\tconst icon: IconInscription = {\n\t\t\t\tdataB64: Buffer.from(iconData).toString(\"base64\"),\n\t\t\t\tcontentType: iconFile.type as ImageContentType,\n\t\t\t};\n\n\t\t\t// Create deployment config\n\t\t\tconst config: DeployBsv21TokenConfig = {\n\t\t\t\tpaymentPk: PrivateKey.fromWif(walletExtension.paymentKey || \"\"),\n\t\t\t\tsymbol: symbol.toUpperCase(),\n\t\t\t\ticon,\n\t\t\t\tutxos: utxos.map((u) => ({ ...u, script: u.script || \"\" })),\n\t\t\t\tinitialDistribution: {\n\t\t\t\t\taddress: walletExtension.ordinalAddress || \"\",\n\t\t\t\t\ttokens: Number(maxSupply),\n\t\t\t\t},\n\t\t\t\tdestinationAddress: walletExtension.ordinalAddress || \"\",\n\t\t\t\tdecimals: decimals || undefined,\n\t\t\t};\n\n\t\t\t// Deploy token\n\t\t\tconst { tx } = await deployBsv21Token(config);\n\t\t\tconst deployTxid = tx.id(\"hex\");\n\n\t\t\tsetTxid(deployTxid);\n\n\t\t\t// Success callback\n\t\t\tconst tokenData: BSV21Token = {\n\t\t\t\tsymbol: symbol.toUpperCase(),\n\t\t\t\ticon: iconFile,\n\t\t\t\tmaxSupply,\n\t\t\t\tdecimals: decimals || 0,\n\t\t\t};\n\t\t\tonSuccess?.(deployTxid, tokenData);\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(\"Deployment failed\");\n\t\t\tsetError(error);\n\t\t\tonError?.(error);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [\n\t\twalletExtension,\n\t\tvalidateForm,\n\t\ticonFile,\n\t\tsymbol,\n\t\tmaxSupply,\n\t\tdecimals,\n\t\tonSuccess,\n\t\tonError,\n\t]);\n\n\t// Reset form\n\tconst resetForm = useCallback(() => {\n\t\tsetSymbol(\"\");\n\t\tsetMaxSupply(0);\n\t\tsetDecimals(0);\n\t\tsetIconFile(null);\n\t\tsetIconPreview(null);\n\t\tsetErrors({});\n\t\tsetError(null);\n\t\tsetTxid(null);\n\t}, []);\n\n\t// Handle dialog close\n\tconst handleClose = useCallback(() => {\n\t\tsetOpen(false);\n\t\t// Reset after animation\n\t\tsetTimeout(resetForm, 200);\n\t}, [resetForm]);\n\n\treturn (\n\t\t<>\n\t\t\t<Button\n\t\t\t\tvariant={\n\t\t\t\t\tvariant === \"solid\"\n\t\t\t\t\t\t? \"default\"\n\t\t\t\t\t\t: variant === \"soft\"\n\t\t\t\t\t\t\t? \"secondary\"\n\t\t\t\t\t\t\t: variant\n\t\t\t\t}\n\t\t\t\tsize={\n\t\t\t\t\tsize === \"1\"\n\t\t\t\t\t\t? \"sm\"\n\t\t\t\t\t\t: size === \"2\"\n\t\t\t\t\t\t\t? \"default\"\n\t\t\t\t\t\t\t: size === \"3\"\n\t\t\t\t\t\t\t\t? \"lg\"\n\t\t\t\t\t\t\t\t: \"icon\"\n\t\t\t\t}\n\t\t\t\tclassName={className}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonClick={() => setOpen(true)}\n\t\t\t>\n\t\t\t\t<PlusIcon />\n\t\t\t\t{buttonText}\n\t\t\t</Button>\n\n\t\t\t<Modal isOpen={open} onClose={handleClose} title={dialogTitle} size=\"md\">\n\t\t\t\t{!txid ? (\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t{/* Symbol input */}\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">Token Symbol</span>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tplaceholder=\"e.g., MYNFT\"\n\t\t\t\t\t\t\t\tvalue={symbol}\n\t\t\t\t\t\t\t\tonChange={(e) => setSymbol(e.target.value.toUpperCase())}\n\t\t\t\t\t\t\t\tstyle={{ textTransform: \"uppercase\" }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{errors.symbol && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-destructive\">\n\t\t\t\t\t\t\t\t\t{errors.symbol}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Icon upload */}\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">Token Icon</span>\n\t\t\t\t\t\t\t{iconPreview ? (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col items-center gap-2 p-3\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tborder: \"1px solid var(--border)\",\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"calc(var(--radius) * 0.75)\",\n\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: \"var(--card)\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\tsrc={iconPreview}\n\t\t\t\t\t\t\t\t\t\t\talt=\"Token icon preview\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100px\",\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"100px\",\n\t\t\t\t\t\t\t\t\t\t\t\tobjectFit: \"contain\",\n\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"calc(var(--radius) * 0.5)\",\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{iconFile?.name}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetIconFile(null);\n\t\t\t\t\t\t\t\t\t\t\t\tsetIconPreview(null);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<DropZone\n\t\t\t\t\t\t\t\t\tonFileSelect={handleIconSelect}\n\t\t\t\t\t\t\t\t\taccept={SUPPORTED_IMAGE_TYPES.join(\",\")}\n\t\t\t\t\t\t\t\t\tmaxSize={MAX_IMAGE_SIZE}\n\t\t\t\t\t\t\t\t\tmultiple={false}\n\t\t\t\t\t\t\t\t\ticon={<ImageIcon width=\"32\" height=\"32\" />}\n\t\t\t\t\t\t\t\t\ttitle=\"Drop image here or click to browse\"\n\t\t\t\t\t\t\t\t\tdescription={`Square image, max ${MAX_IMAGE_DIMENSION}x${MAX_IMAGE_DIMENSION}px, under 100KB`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{errors.icon && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-destructive\">{errors.icon}</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Max supply input */}\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">Maximum Supply</span>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tplaceholder=\"e.g., 10000\"\n\t\t\t\t\t\t\t\tvalue={maxSupply.toString()}\n\t\t\t\t\t\t\t\tonChange={(e) => setMaxSupply(Number(e.target.value))}\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{errors.maxSupply && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-destructive\">\n\t\t\t\t\t\t\t\t\t{errors.maxSupply}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tTotal number of tokens that can exist\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Decimals input */}\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">Decimals (Optional)</span>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t\t\t\tvalue={decimals.toString()}\n\t\t\t\t\t\t\t\tonChange={(e) => setDecimals(Number(e.target.value))}\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\tmin=\"0\"\n\t\t\t\t\t\t\t\tmax=\"18\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{errors.decimals && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-destructive\">\n\t\t\t\t\t\t\t\t\t{errors.decimals}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tNumber of decimal places (0 for whole tokens)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Info box */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-start gap-2 p-3\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tbackgroundColor: \"var(--blue-2)\",\n\t\t\t\t\t\t\t\tborderRadius: \"calc(var(--radius) * 0.75)\",\n\t\t\t\t\t\t\t\tborder: \"1px solid var(--blue-6)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<InfoCircledIcon style={{ marginTop: 2, flexShrink: 0 }} />\n\t\t\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t\t\t\tBSV-21 Token Deployment\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tBSV-21 tokens are NFTs with an inscribed icon. The entire\n\t\t\t\t\t\t\t\t\tsupply is minted to your address upon deployment. Note: BSV-21\n\t\t\t\t\t\t\t\t\ttokens require a $100 indexing fee paid in BSV.\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Error display */}\n\t\t\t\t\t\t{error && <ErrorDisplay error={error.message} />}\n\n\t\t\t\t\t\t{/* Action buttons */}\n\t\t\t\t\t\t<div className=\"flex gap-2 justify-end\">\n\t\t\t\t\t\t\t<Button variant=\"secondary\" onClick={handleClose}>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<LoadingButton\n\t\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\t\tdisabled={!symbol || !maxSupply || !iconFile}\n\t\t\t\t\t\t\t\tonClick={handleDeploy}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDeploy Token\n\t\t\t\t\t\t\t</LoadingButton>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t<TransactionProgress\n\t\t\t\t\t\t\tstatus={TransactionStatus.Confirmed}\n\t\t\t\t\t\t\ttxid={txid}\n\t\t\t\t\t\t\tshowDetails={true}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t\t\tclassName=\"bg-green-500 hover:bg-green-600\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tBSV-21 Token Deployed Successfully!\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tToken Symbol: {symbol.toUpperCase()}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tMax Supply: {Number(maxSupply).toLocaleString()}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<Button variant=\"default\" onClick={handleClose}>\n\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t</>\n\t);\n}\n",
      "target": "<%- config.aliases.components %>/bsv21mintbutton.tsx"
    }
  ]
}