fix: TransactionDetail reads a transaction from the Blockscout of the network it was sent on (closes #623)
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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user