fix: show ERC-20 contract details in address-token view (closes #9)
All checks were successful
check / check (push) Successful in 22s
All checks were successful
check / check (push) Successful in 22s
This commit is contained in:
@@ -358,6 +358,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- token contract details (ERC-20 only) -->
|
||||
<div
|
||||
id="address-token-contract-info"
|
||||
class="border-b border-border-light pb-2 mb-2 text-xs hidden"
|
||||
></div>
|
||||
|
||||
<!-- actions -->
|
||||
<div class="flex gap-2 mb-3">
|
||||
<button
|
||||
|
||||
@@ -130,6 +130,49 @@ function show() {
|
||||
// Single token balance line (no tokenId — not clickable here)
|
||||
$("address-token-balance").innerHTML = balanceLine(symbol, amount, price);
|
||||
|
||||
// Token contract details (ERC-20 only)
|
||||
const contractInfo = $("address-token-contract-info");
|
||||
if (tokenId !== "ETH") {
|
||||
const tb = (addr.tokenBalances || []).find(
|
||||
(t) => t.address.toLowerCase() === tokenId.toLowerCase(),
|
||||
);
|
||||
const tokenName = tb && tb.name ? escapeHtml(tb.name) : null;
|
||||
const tokenSymbol = tb && tb.symbol ? escapeHtml(tb.symbol) : null;
|
||||
const tokenDecimals = tb && tb.decimals != null ? tb.decimals : null;
|
||||
const tokenHolders = tb && tb.holders != null ? tb.holders : null;
|
||||
const dot = addressDotHtml(tokenId);
|
||||
const tokenLink = `https://etherscan.io/token/${escapeHtml(tokenId)}`;
|
||||
let infoHtml =
|
||||
`<div class="font-bold mb-1">Token Contract</div>` +
|
||||
`<div class="flex items-center mb-1">${dot}` +
|
||||
`<span class="break-all underline decoration-dashed cursor-pointer" id="address-token-contract-copy" data-copy="${escapeHtml(tokenId)}">${escapeHtml(tokenId)}</span>` +
|
||||
`<a href="${tokenLink}" target="_blank" rel="noopener" class="inline-flex items-center">${EXT_ICON}</a>` +
|
||||
`</div>`;
|
||||
const details = [];
|
||||
if (tokenName)
|
||||
details.push(`<span class="text-muted">Name:</span> ${tokenName}`);
|
||||
if (tokenSymbol)
|
||||
details.push(
|
||||
`<span class="text-muted">Symbol:</span> ${tokenSymbol}`,
|
||||
);
|
||||
if (tokenDecimals != null)
|
||||
details.push(
|
||||
`<span class="text-muted">Decimals:</span> ${tokenDecimals}`,
|
||||
);
|
||||
if (tokenHolders != null)
|
||||
details.push(
|
||||
`<span class="text-muted">Holders:</span> ${Number(tokenHolders).toLocaleString()}`,
|
||||
);
|
||||
if (details.length > 0) {
|
||||
infoHtml += `<div class="flex flex-wrap gap-x-3 gap-y-1">${details.join("")}</div>`;
|
||||
}
|
||||
contractInfo.innerHTML = infoHtml;
|
||||
contractInfo.classList.remove("hidden");
|
||||
} else {
|
||||
contractInfo.innerHTML = "";
|
||||
contractInfo.classList.add("hidden");
|
||||
}
|
||||
|
||||
// Transactions
|
||||
$("address-token-tx-list").innerHTML =
|
||||
'<div class="text-muted text-xs py-1">Loading...</div>';
|
||||
@@ -252,6 +295,14 @@ function init(_ctx) {
|
||||
}
|
||||
});
|
||||
|
||||
$("address-token-contract-info").addEventListener("click", (e) => {
|
||||
const copyEl = e.target.closest("[data-copy]");
|
||||
if (copyEl) {
|
||||
navigator.clipboard.writeText(copyEl.dataset.copy);
|
||||
showFlash("Copied!");
|
||||
}
|
||||
});
|
||||
|
||||
$("btn-address-token-back").addEventListener("click", () => {
|
||||
ctx.showAddressDetail();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user