diff --git a/src/popup/index.html b/src/popup/index.html index 6922bcd..b8f6f4e 100644 --- a/src/popup/index.html +++ b/src/popup/index.html @@ -943,6 +943,23 @@
Transaction hash
+ + diff --git a/src/popup/views/transactionDetail.js b/src/popup/views/transactionDetail.js index 8ecbfe3..9961e28 100644 --- a/src/popup/views/transactionDetail.js +++ b/src/popup/views/transactionDetail.js @@ -12,6 +12,8 @@ const { timeAgo, } = require("./helpers"); const { state } = require("../../shared/state"); +const { TOKEN_BY_ADDRESS } = require("../../shared/tokenList"); +const { decodeCalldata } = require("../../shared/decodeCalldata"); const makeBlockie = require("ethereum-blockies-base64"); const EXT_ICON = @@ -85,6 +87,8 @@ function show(tx) { fromEns: tx.fromEns || null, toEns: tx.toEns || null, directionLabel: tx.directionLabel || null, + rawInput: tx.rawInput || null, + decoded: tx.decoded || null, }, }; render(); @@ -124,6 +128,58 @@ function render() { $("tx-detail-time").textContent = isoDate(tx.timestamp) + " (" + timeAgo(tx.timestamp) + ")"; $("tx-detail-status").textContent = tx.isError ? "Failed" : "Success"; + + // Decoded calldata section — matches approval screen format + const decodedEl = $("tx-detail-decoded"); + const rawDataEl = $("tx-detail-rawdata-section"); + const decoded = tx.decoded; + + if (decoded) { + $("tx-detail-action").textContent = decoded.name; + let detailsHtml = ""; + if (decoded.description) { + detailsHtml += `
${escapeHtml(decoded.description)}
`; + } + for (const d of decoded.details) { + detailsHtml += `
`; + detailsHtml += `
${escapeHtml(d.label)}
`; + if (d.address) { + if (d.isToken) { + const t = TOKEN_BY_ADDRESS.get(d.address.toLowerCase()); + const label = t ? t.symbol : "Unknown token"; + detailsHtml += `
${escapeHtml(label)}
`; + } + const dot = addressDotHtml(d.address); + const link = `https://etherscan.io/address/${d.address}`; + detailsHtml += + `
${dot}` + + `${escapeHtml(d.address)}` + + `${EXT_ICON}
`; + } else { + detailsHtml += `
${escapeHtml(d.value)}
`; + } + detailsHtml += `
`; + } + $("tx-detail-decoded-details").innerHTML = detailsHtml; + decodedEl.classList.remove("hidden"); + } else { + decodedEl.classList.add("hidden"); + } + + // Raw calldata section — shown for unknown contract calls (full, not truncated) + if (tx.rawInput && tx.rawInput !== "0x" && !decoded) { + $("tx-detail-rawdata").textContent = tx.rawInput; + rawDataEl.classList.remove("hidden"); + // Label as unknown contract call + $("tx-detail-action").textContent = "Unknown Contract Call"; + $("tx-detail-decoded-details").innerHTML = ""; + decodedEl.classList.remove("hidden"); + } else if (!decoded) { + rawDataEl.classList.add("hidden"); + } else { + rawDataEl.classList.add("hidden"); + } + showView("transaction"); document