DEX Liquidity Analyzer

Add New LP Analysis

Token A (e.g., ETH)

Token B (e.g., USDC)

Note: For accurate IL calculation for standard 50/50 pools, ensure (Deposited Qty A * Initial Price A) is roughly equal to (Deposited Qty B * Initial Price B).

Optional Pool Metrics

Saved LP Analyses

  • No analyses saved yet.

Blockchain: ${escapeHtml(item.data.blockchain)}

Pool Link: ${item.data.poolLink ? `View Pool` : 'N/A'}

Data Date: ${item.data.dataDate ? escapeHtml(new Date(item.data.dataDate + 'T00:00:00').toLocaleDateString()) : 'N/A'}

Tokens: ${escapeHtml(item.data.tokenASymbol)} / ${escapeHtml(item.data.tokenBSymbol)}

Initial Deposit Value: ${formatCurrency(metrics.initialDepositValueUSD)}

HODL Value (Current): ${formatCurrency(metrics.hodlValueUSD)}

LP Position Value (Current, pre-fees): ${formatCurrency(metrics.lpValueUSD)}

Impermanent Loss (USD): ${formatCurrency(metrics.ilUSD)}

Impermanent Loss (%): ${formatPercentage(metrics.ilPercent)}

User Pool Share: ${formatPercentage(metrics.userPoolSharePercent)}

Reported APY/Fees: ${escapeHtml(item.data.reportedAPY) || 'N/A'}

${item.data.notes ? `

Notes:

${escapeHtml(item.data.notes)}
` : ''}
`; analysesList.appendChild(listItem); }); } } if (addAnalysisButton) { addAnalysisButton.addEventListener('click', function() { const data = { analysisName: analysisNameInput.value.trim(), dexName: dexNameSelect.value, blockchain: blockchainSelect.value, poolLink: poolLinkInput.value.trim(), tokenASymbol: tokenASymbolInput.value.trim(), depositA: depositAInput.value, // Keep as string for calc function initialPriceA: initialPriceAInput.value, currentPriceA: currentPriceAInput.value, tokenBSymbol: tokenBSymbolInput.value.trim(), depositB: depositBInput.value, initialPriceB: initialPriceBInput.value, currentPriceB: currentPriceBInput.value, myLPTokens: myLPTokensInput.value, totalLPTokens: totalLPTokensInput.value, reportedAPY: reportedAPYInput.value.trim(), dataDate: dataDateInput.value, notes: notesInput.value.trim() }; if (!data.analysisName || !data.tokenASymbol || !data.tokenBSymbol || !data.depositA || !data.initialPriceA || !data.currentPriceA || !data.depositB || !data.initialPriceB || !data.currentPriceB) { alert('Please fill in all required fields for Token A, Token B (deposits and prices), and Analysis Name.'); return; } // Basic validation for positive numbers where expected for core IL calculation const depA = parseFloat(data.depositA), initPA = parseFloat(data.initialPriceA); const depB = parseFloat(data.depositB), initPB = parseFloat(data.initialPriceB); if (depA <= 0 || initPA <= 0 || depB <= 0 || initPB <= 0) { alert('Deposited quantities and initial prices must be greater than zero.'); return; } savedAnalyses.push({ data: data }); saveAnalyses(); renderAnalyses(); // Optionally clear form (or reset specific fields) analysisNameInput.value = ''; // ... reset other fields if desired if(dataDateInput) dataDateInput.valueAsDate = new Date(); // Reset date to today }); } if (analysesList) { analysesList.addEventListener('click', function(event) { if (event.target.classList.contains('dla-remove-button')) { const itemToRemove = event.target.closest('.dla-analysis-item'); if (itemToRemove) { const index = parseInt(itemToRemove.getAttribute('data-index'), 10); savedAnalyses.splice(index, 1); saveAnalyses(); renderAnalyses(); } } }); } if (pdfButton) { pdfButton.addEventListener('click', function() { if (savedAnalyses.length === 0) { alert("No analyses to export. Please add some first."); return; } window.print(); }); } // Initial load and render const criticalElements = [analysisNameInput, dexNameSelect, tokenASymbolInput, depositAInput, initialPriceAInput, currentPriceAInput, tokenBSymbolInput, depositBInput, initialPriceBInput, currentPriceBInput, addAnalysisButton, analysesList, pdfButton, noAnalysesMessage, dataDateInput]; if (criticalElements.some(el => !el)) { console.error("DEXLiquidityAnalyzer: One or more critical HTML elements are missing from the DOM."); const appDiv = document.getElementById('dexLiquidityAnalyzerApp'); if(appDiv) { appDiv.innerHTML = "

Error: Tool initialization failed. Required elements not found.

"; } return; } loadAnalyses(); renderAnalyses(); });
Scroll to Top