Blockchain Investment Risk Assessment Tool

Blockchain Investment Risk Assessment

Quantify the risks of cryptocurrency and blockchain projects.

${assessmentData.finalScore}/100 (${assessmentData.riskLabel})

Personal Profile Match

${assessmentData.profileMatch}

`; }; const downloadPDF = () => { if (!assessmentData) { alert('Please run an assessment first on the "Risk Dashboard" tab.'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' }); const theme = document.querySelector('input[name="theme"]:checked').value; const page = { width: doc.internal.pageSize.getWidth(), height: doc.internal.pageSize.getHeight() }; const margin = 50; let y = 0; const colors = theme === 'formal' ? { bg: '#111827', text: '#FFFFFF', primary: '#1f2937', secondary: '#4b5563', accent: '#374151' } : { bg: '#1e40af', text: '#FFFFFF', primary: '#111827', secondary: '#374151', accent: '#2563eb' }; // --- Header --- doc.setFillColor(colors.bg); doc.rect(0, 0, page.width, 90, 'F'); doc.setFont('helvetica', 'bold'); doc.setFontSize(22); doc.setTextColor(colors.text); doc.text('Blockchain Investment Risk Report', margin, 55); doc.setFontSize(12); doc.text(`Project: ${assessmentData.inputs.projectName}`, margin, 75); y = 130; // --- Overall Score --- doc.setFont('helvetica', 'normal'); doc.setFontSize(12); doc.setTextColor(colors.secondary); doc.text('Overall Risk Score', page.width / 2, y, { align: 'center' }); y += 45; doc.setFont('helvetica', 'bold'); doc.setFontSize(48); doc.setTextColor(assessmentData.riskHexColor); doc.text(`${assessmentData.finalScore}/100`, page.width / 2, y, { align: 'center' }); y += 25; doc.setFontSize(18); doc.text(assessmentData.riskLabel, page.width / 2, y, { align: 'center' }); y += 40; // --- Section Helper --- const addSection = (title, textContent) => { const textLines = doc.splitTextToSize(textContent, page.width - margin * 2); if (y + textLines.length * 12 + 40 > page.height - margin) { doc.addPage(); y = margin; } doc.setFont('helvetica', 'bold'); doc.setFontSize(14); doc.setTextColor(colors.primary); doc.text(title, margin, y); y += 10; doc.setDrawColor(colors.accent); doc.setLineWidth(1.5); doc.line(margin, y, page.width - margin, y); y += 20; doc.setFont('helvetica', 'normal'); doc.setFontSize(10); doc.setTextColor(colors.secondary); doc.text(textLines, margin, y); y += textLines.length * 12 + 20; }; addSection('Assessment Summary', assessmentData.riskAdvice); addSection('Personal Profile Match', `Finding: ${assessmentData.profileMatch}. ${assessmentData.profileAdvice}`); // --- Chart --- if (y > page.height - 250) { doc.addPage(); y = margin; } const chartImage = riskChart.toBase64Image(); doc.addImage(chartImage, 'PNG', (page.width / 2) - 150, y, 300, 300); y += 320; doc.save(`risk-report-${assessmentData.inputs.projectName.replace(/\s+/g, '-')}.pdf`); }; // --- Event Listeners --- tabs.forEach((tab, index) => tab.addEventListener('click', () => showTab(index))); prevBtn.addEventListener('click', () => navigateTab(-1)); nextBtn.addEventListener('click', () => navigateTab(1)); assessBtn.addEventListener('click', runAssessment); downloadPdfBtn.addEventListener('click', downloadPDF); // --- Initialization --- showTab(0); });
Scroll to Top