fix: TransactionDetail reads a transaction from the Blockscout of the network it was sent on (closes #623)
check / check (push) Canceled after 0s
e2e / e2e-chrome (push) Canceled after 0s
e2e / e2e-firefox (push) Canceled after 0s

TransactionDetail read the block, network details and calldata from the
active network's Blockscout and decoded the calldata for the active network,
so after a network switch a transaction sent on the other network showed none
of them. It now reads them from the Blockscout Settings has for the network
the transaction was sent on, and decodes the calldata for that network.
reviewedNetworkEndpoints() in the shared view helpers gives that network's RPC
and Blockscout URLs, picked as reviewedNetworkProvider() picked its node;
reviewedNetworkProvider() now uses it.

Model: opus-5-5
This commit is contained in:
2026-10-19 22:58:47 +00:00
parent 5376723c41
commit f8101b559e
6 changed files with 90 additions and 37 deletions
+14 -10
View File
@@ -18,10 +18,11 @@ const {
copyableHtml,
etherscanLinkHtml,
explorerUrl,
reviewedNetworkEndpoints,
displaySymbol,
goBack,
} = require("./helpers");
const { state, currentNetwork } = require("../../shared/state");
const { state } = require("../../shared/state");
const { nativeCurrencyByChainId } = require("../../shared/networks");
const { formatEther, formatUnits } = require("ethers");
const { log, debugFetch } = require("../../shared/log");
@@ -84,9 +85,10 @@ function show(tx) {
contractAddress: tx.contractAddress || null,
// The network the history entry was read from. The type line and
// the fee are in its native currency, not the active network's,
// and the links open its explorer: the active network can change,
// in Settings or when the user approves a site's request, before
// a later popup shows this screen again.
// the links open its explorer, and the block, network details and
// calldata are read from its Blockscout: the active network can
// change, in Settings or when the user approves a site's request,
// before a later popup shows this screen again.
chainId: tx.chainId,
},
};
@@ -189,7 +191,7 @@ function render() {
if (el) el.classList.add("hidden");
}
loadFullTxDetails(tx.hash, tx.chainId);
loadFullTxDetails(tx);
const isoStr = isoDate(tx.timestamp);
$("tx-detail-time").innerHTML =
@@ -301,7 +303,8 @@ function populateOnChainDetails(txData, chainId) {
}
}
async function loadFullTxDetails(txHash, chainId) {
async function loadFullTxDetails(tx) {
const chainId = tx.chainId;
const section = $("tx-detail-calldata-section");
const actionEl = $("tx-detail-calldata-action");
const detailsEl = $("tx-detail-calldata-details");
@@ -311,8 +314,9 @@ async function loadFullTxDetails(txHash, chainId) {
if (!section || !actionEl || !detailsEl) return;
try {
const { blockscoutUrl } = reviewedNetworkEndpoints(tx);
const resp = await debugFetch(
state.blockscoutUrl + "/transactions/" + txHash,
blockscoutUrl + "/transactions/" + tx.hash,
);
if (!resp.ok) return;
const txData = await resp.json();
@@ -326,12 +330,12 @@ async function loadFullTxDetails(txHash, chainId) {
// Decoded against the address the transaction was sent to, as the
// explorer reports it, not the history entry's `to`: for a token
// transfer that is the transfer's recipient, not the token contract.
// On the active network, the one whose explorer was just asked, and
// from the sender it reports.
// On the network the transaction was sent on, whose Blockscout was
// just asked, and from the sender it reports.
const decoded = decodeCalldata(
inputData,
txData.to?.hash || "",
currentNetwork().chainId,
chainId,
txData.from?.hash || "",
);
if (decoded) {