feat: Add better covenant display
All checks were successful
Build Docker / BuildImage (push) Successful in 38s
Check Code Quality / RuffCheck (push) Successful in 49s

This commit is contained in:
2025-11-21 13:24:21 +11:00
parent b6662f400a
commit eea558361c
2 changed files with 97 additions and 10 deletions

View File

@@ -469,7 +469,7 @@
<div style="display: flex; justify-content: space-between; margin-top: 0.5rem; font-size: 0.85rem; color: #b0b0b0;">
<span>Height: ${coin.height.toLocaleString()}</span>
<span>Coinbase: ${coin.coinbase ? 'Yes' : 'No'}</span>
<span>Covenant: ${coin.covenant.action}</span>
<span>Covenant: <span data-covenant-action="${coin.covenant.action}" data-covenant="${encodeURIComponent(JSON.stringify(coin.covenant))}">${coin.covenant.action}</span></span>
</div>
</div>
`).join('')}
@@ -521,7 +521,7 @@
</div>
<div class="info-item">
<label>Covenant:</label>
<span>${coin.covenant.action}</span>
<span data-covenant-action="${coin.covenant.action}" data-covenant="${encodeURIComponent(JSON.stringify(coin.covenant))}">${coin.covenant.action}</span>
</div>
</div>
</div>
@@ -861,7 +861,7 @@
<span class="tx-io-value">${input.coin ? formatValue(input.coin.value) : 'Unknown'}</span>
</div>
<div class="tx-io-address">${input.coin ? input.coin.address : (input.address || 'Unknown')}</div>
${input.coin && input.coin.covenant.action !== 'NONE' ? `<div class="tx-covenant">Covenant: ${input.coin.covenant.action}</div>` : ''}
${input.coin && input.coin.covenant.action !== 'NONE' ? `<div class="tx-covenant" data-covenant-action="${input.coin.covenant.action}" data-covenant="${encodeURIComponent(JSON.stringify(input.coin.covenant))}">Covenant: ${input.coin.covenant.action}</div>` : ''}
</div>
`;
}
@@ -879,7 +879,7 @@
<span class="tx-io-value">${formatValue(output.value)}</span>
</div>
<div class="tx-io-address">${output.address}</div>
${output.covenant.action !== 'NONE' ? `<div class="tx-covenant">Covenant: ${output.covenant.action}</div>` : ''}
${output.covenant.action !== 'NONE' ? `<div class="tx-covenant" data-covenant-action="${output.covenant.action}" data-covenant="${encodeURIComponent(JSON.stringify(output.covenant))}">Covenant: ${output.covenant.action}</div>` : ''}
</div>
`).join('')}
</div>
@@ -919,6 +919,7 @@
</div>
`;
document.body.appendChild(modal);
if (!data.error) updateCovenants();
}
// Display helper
@@ -940,6 +941,66 @@
}
}
// Update covenant information from API
async function updateCovenants() {
const elements = document.querySelectorAll('[data-covenant-action]');
const cache = {};
for (const el of elements) {
const action = el.dataset.covenantAction;
if (action === 'NONE') continue;
// Skip if already updated
if (el.dataset.covenantUpdated) continue;
// Get full covenant data
let covenantData = null;
if (el.dataset.covenant) {
try {
covenantData = JSON.parse(decodeURIComponent(el.dataset.covenant));
} catch (e) {
console.error('Failed to parse covenant data:', e);
}
}
if (!covenantData) continue;
// Create a cache key based on the full covenant data
const cacheKey = JSON.stringify(covenantData);
let display = action;
if (cache[cacheKey]) {
display = cache[cacheKey];
} else {
try {
const res = await fetch(`/api/v1/covenant`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(covenantData)
});
if (res.ok) {
const data = await res.json();
display = data.display || action;
cache[cacheKey] = display;
}
} catch (e) {
console.error('Failed to fetch covenant info:', e);
}
}
// Check if it's the .tx-covenant div which includes "Covenant: " text
if (el.classList.contains('tx-covenant')) {
el.innerHTML = `Covenant: ${display}`;
} else {
el.textContent = display;
}
el.dataset.covenantUpdated = "true";
}
}
// Show loading animation
function showLoading(elementId) {
const element = document.getElementById(elementId);
@@ -1031,6 +1092,7 @@
resultElement.innerHTML = `<div class="error">Error: ${data.error}</div>`;
} else {
resultElement.innerHTML = formatTransactionData(data);
updateCovenants();
}
}
@@ -1106,6 +1168,7 @@
resultElement.innerHTML = `<div class="error">Error: ${data.error}</div>`;
} else {
resultElement.innerHTML = formatAddressCoins(data);
updateCovenants();
}
}