Token Unlock Schedule Tracker

Add New Unlock Event

Tracked Unlock Events

  • No unlock events tracked yet.

Link: ${event.tokenomicsLink ? `View Docs` : 'N/A'}

${event.notes ? `
Notes:
${escapeHtml(event.notes)}
` : ''}
`; eventsList.appendChild(listItem); if (!timeInfo.past || timeInfo.status === 'unlocking') { const countdownElement = document.getElementById(`countdown-${event.id}`); const itemElement = listItem; // capture listItem for styling const intervalId = setInterval(() => { const newTimeInfo = getTimeDifferenceString(event.unlockDateTime); if (countdownElement) countdownElement.textContent = newTimeInfo.text; // Update status class if it changes (e.g., from upcoming to unlocking now) itemElement.className = 'tust-event-item'; // Reset classes itemElement.classList.add(`status-${newTimeInfo.status}`); if (newTimeInfo.past && newTimeInfo.status !== 'unlocking') { // If it moved to fully past clearInterval(intervalId); renderEvents(); // Re-render to sort and correctly display past events } }, 1000); countdownIntervals.push(intervalId); } }); } } if (addEventButton) { addEventButton.addEventListener('click', function() { const eventData = { id: Date.now() + '_' + Math.random().toString(36).substr(2, 9), // More unique ID tokenName: tokenNameInput.value.trim(), tokenSymbol: tokenSymbolInput.value.trim().toUpperCase(), projectName: projectNameInput.value.trim(), tokenomicsLink: tokenomicsLinkInput.value.trim(), eventName: eventNameInput.value.trim(), unlockDateTime: unlockDateTimeInput.value, unlockAmount: unlockAmountInput.value, totalSupply: totalSupplyInput.value, circulatingSupplyBefore: circulatingSupplyBeforeInput.value, recipientCategory: recipientCategorySelect.value, notes: notesInput.value.trim() }; if (!eventData.tokenName || !eventData.tokenSymbol || !eventData.eventName || !eventData.unlockDateTime || !eventData.unlockAmount || !eventData.totalSupply) { alert('Please fill in all required fields: Token Name, Symbol, Event Name, Unlock Date/Time, Unlock Amount, and Total Supply.'); return; } if (parseFloat(eventData.unlockAmount) <= 0 || parseFloat(eventData.totalSupply) <= 0) { alert('Unlock Amount and Total Supply must be positive numbers.'); return; } trackedEvents.push(eventData); saveEvents(); renderEvents(); // Clear form tokenNameInput.value = ''; tokenSymbolInput.value = ''; projectNameInput.value = ''; tokenomicsLinkInput.value = ''; eventNameInput.value = ''; unlockDateTimeInput.value = ''; unlockAmountInput.value = ''; totalSupplyInput.value = ''; circulatingSupplyBeforeInput.value = ''; recipientCategorySelect.value = 'Team'; notesInput.value = ''; }); } if (eventsList) { eventsList.addEventListener('click', function(event) { if (event.target.classList.contains('tust-remove-button')) { const itemToRemoveEl = event.target.closest('.tust-event-item'); if (itemToRemoveEl) { const eventId = itemToRemoveEl.getAttribute('data-id'); trackedEvents = trackedEvents.filter(ev => ev.id.toString() !== eventId); saveEvents(); renderEvents(); // Re-render to remove item and clear its interval } } }); } if (pdfButton) { pdfButton.addEventListener('click', function() { if (trackedEvents.length === 0) { alert("No events to export. Please add some first."); return; } window.print(); }); } const criticalElements = [tokenNameInput, tokenSymbolInput, eventNameInput, unlockDateTimeInput, unlockAmountInput, totalSupplyInput, addEventButton, eventsList, pdfButton, noEventsMessage]; if (criticalElements.some(el => !el)) { console.error("TokenUnlockScheduleTracker: One or more critical HTML elements are missing."); const appDiv = document.getElementById('tokenUnlockScheduleTrackerApp'); if(appDiv) appDiv.innerHTML = "

Error: Tool initialization failed. Required elements not found.

"; return; } loadEvents(); renderEvents(); // Initial render and start countdowns });
Scroll to Top