`;
inputsHtml += `
Yield Farming Scenario Inputs:
Platform: ${inputs.yf.platformName}, Asset: ${inputs.yf.farmedAsset}
Est. Farm APY: ${yflp_formatPercentage(inputs.yf.farmApy)}
Platform Fee on Rewards: ${yflp_formatPercentage(inputs.yf.platformFeePercent)}
Tx Fees: ${yflp_formatUsd(inputs.yf.txFeesFixed)}
Reward Token Volatility: ${inputs.yf.rewardTokenVolatility}
Compounding: ${inputs.yf.compoundingStrategy}
`;
const comparisonTableHtml = `
| Metric | LP Scenario | Yield Farming |
| Initial Investment (USD) | ${yflp_formatUsd(inputs.initialInvestmentUsd)} | ${yflp_formatUsd(inputs.initialInvestmentUsd)} |
| Est. Net Gains (USD) | ${yflp_formatUsd(lp.netGains)} | ${yflp_formatUsd(yf.netGains)} |
| Est. Net Final Value (USD) | ${yflp_formatUsd(lp.netFinalValue)} | ${yflp_formatUsd(yf.netFinalValue)} |
| Est. Overall ROI (%) | ${yflp_formatPercentage(lp.roi)} | ${yflp_formatPercentage(yf.roi)} |
| Est. Annualized ROI (CAGR %) | ${yflp_formatPercentage(lp.cagr)} | ${yflp_formatPercentage(yf.cagr)} |
`;
let conclusionTextPdf = "Based on inputs: ";
if (Math.abs(lp.netFinalValue - yf.netFinalValue) < 0.01) conclusionTextPdf += "Both strategies estimate similar final values.";
else if (lp.netFinalValue > yf.netFinalValue) conclusionTextPdf += `Liquidity Provisioning appears to project a higher net final value.`;
else conclusionTextPdf += `Yield Farming appears to project a higher net final value.`;
const qualitativePdfHtml = document.getElementById('yflp_qualitativeSummaryContainer').innerHTML
.replace(/
/g, '
').replace(/<\/h4>/g, '
')
.replace(//g, '
').replace(//g,'');
const disclaimer_pdf = `Estimates are based on user inputs and are highly speculative. DeFi involves substantial risks (smart contracts, IL, platform failure, reward token volatility, high gas fees). This is NOT financial advice. DYOR.`;
pdfContentEl.innerHTML = `
DeFi Yield Strategy Analyzer Report
I. Input Parameters
${inputsHtml}
II. Projected Financial Comparison (Over ${inputs.durationMonths} Months)
${conclusionTextPdf}
III. Qualitative Considerations Summary
${qualitativePdfHtml}
Disclaimer: ${disclaimer_pdf}
`;
document.body.appendChild(pdfContentEl);
html2canvas(pdfContentEl, { scale: 2, useCORS: true, logging:true, windowWidth: pdfContentEl.scrollWidth, windowHeight: pdfContentEl.scrollHeight }).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const pdfWidth = pdf.internal.pageSize.getWidth();
const pdfHeight = pdf.internal.pageSize.getHeight();
const imgProps = pdf.getImageProperties(imgData);
let numPages = Math.ceil(imgProps.height / ( (pdfHeight - 40) * (imgProps.width / (pdfWidth - 40)) ) );
let pageCanvasHeight = (pdfHeight - 40) * (imgProps.width / (pdfWidth - 40));
for (let i = 0; i < numPages; i++) {
if (i > 0) pdf.addPage();
let sourceY = i * pageCanvasHeight;
let sourceHeight = Math.min(pageCanvasHeight, imgProps.height - sourceY);
const tempCanvas = document.createElement('canvas');
tempCanvas.width = imgProps.width;
tempCanvas.height = sourceHeight;
const ctx = tempCanvas.getContext('2d');
ctx.drawImage(canvas, 0, sourceY, imgProps.width, sourceHeight, 0, 0, imgProps.width, sourceHeight);
const pageImgData = tempCanvas.toDataURL('image/png');
const pageImgHeight = (sourceHeight * (pdfWidth - 40)) / imgProps.width;
pdf.addImage(pageImgData, 'PNG', 20, 20, pdfWidth - 40, pageImgHeight, undefined, 'FAST');
}
pdf.save('DeFi_Yield_Comparison.pdf');
if(document.body.contains(pdfContentEl)) document.body.removeChild(pdfContentEl);
}).catch(err => {
console.error("YFLP PDF Error:", err); alert("Error generating PDF. See console.");
if(document.body.contains(pdfContentEl)) document.body.removeChild(pdfContentEl);
});
}
document.addEventListener('DOMContentLoaded', function() {
yflp_openTab({}, 'yflp_tab_common');
// Set default values
const initialInvInput = document.getElementById('yflp_initialInvestmentUsd');
if (initialInvInput && !initialInvInput.value) initialInvInput.value = '1000';
const durationInput = document.getElementById('yflp_durationMonths');
if (durationInput && !durationInput.value) durationInput.value = '12';
if (!document.getElementById('yflp_initialInvestmentUsd')) {
console.error("Critical input 'yflp_initialInvestmentUsd' not found.");
}
});