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