fix: SuccessTx and ErrorTx link to the explorer of the network the transaction was sent on (closes #622)
SuccessTx and ErrorTx built their recipient, block, hash and decoded-action address links for the active network. After a network switch, WaitTx now finds a transaction on the network it was sent on and moves on to these screens, whose links then opened an explorer where the transaction does not exist. Both screens now keep the transaction's chain id with their view data and build every link for that network, as WaitTx does. A stored SuccessTx or ErrorTx whose chain id names no network is refused on restore, as a stored transaction already is. Model: opus-5-5
This commit was merged in pull request #624.
This commit is contained in:
+20
-18
@@ -64,8 +64,8 @@ function endWait() {
|
||||
}
|
||||
|
||||
// A contract creation reaches these screens with `to` as "" (approval.js
|
||||
// writes `to: toAddr || ""`). The link opens the explorer of the network with
|
||||
// `chainId`, or of the active network when none is given.
|
||||
// writes `to: toAddr || ""`). The links below open the explorer of the network
|
||||
// with `chainId`, or of the active network when none is given.
|
||||
function toAddressHtml(address, chainId) {
|
||||
if (!address) return escapeHtml(CONTRACT_CREATION_TEXT);
|
||||
const title = addressTitle(address, state.wallets);
|
||||
@@ -77,9 +77,9 @@ function txHashHtml(hash, chainId) {
|
||||
return copyableHtml(hash, "break-all") + etherscanLinkHtml(link);
|
||||
}
|
||||
|
||||
function blockNumberHtml(blockNumber) {
|
||||
function blockNumberHtml(blockNumber, chainId) {
|
||||
const num = String(blockNumber);
|
||||
const link = explorerUrl("block", num);
|
||||
const link = explorerUrl("block", num, chainId);
|
||||
return copyableHtml(num) + etherscanLinkHtml(link);
|
||||
}
|
||||
|
||||
@@ -95,11 +95,11 @@ function startWait(txInfo, txHash, broadcastTime, pollNow) {
|
||||
// native currency of txInfo.chainId, the network the transaction was sent
|
||||
// on, not the active network's: the active network can change, in
|
||||
// Settings or when the user approves a site's request, while this screen
|
||||
// is open or before a later popup resumes it. This screen's links open
|
||||
// that network's explorer, and its receipt is asked of that network's
|
||||
// node, for the same reason. A null token is a swap whose amount was not
|
||||
// decoded (see showTxApproval() in approval.js): the amount says so, and
|
||||
// no symbol follows it.
|
||||
// is open or before a later popup resumes it. The links on all three
|
||||
// screens open that network's explorer, and this screen's receipt is
|
||||
// asked of that network's node, for the same reason. A null token is a
|
||||
// swap whose amount was not decoded (see showTxApproval() in
|
||||
// approval.js): the amount says so, and no symbol follows it.
|
||||
let symbol = "";
|
||||
if (txInfo.token === "ETH") {
|
||||
symbol = nativeCurrencyByChainId(txInfo.chainId);
|
||||
@@ -258,12 +258,13 @@ function showSuccess(txInfo, txHash, blockNumber) {
|
||||
hash: txHash,
|
||||
blockNumber: blockNumber,
|
||||
decoded: txInfo.decoded || null,
|
||||
chainId: txInfo.chainId,
|
||||
};
|
||||
renderSuccess();
|
||||
ctx.doRefreshAndRender();
|
||||
}
|
||||
|
||||
function decodedDetailsHtml(decoded) {
|
||||
function decodedDetailsHtml(decoded, chainId) {
|
||||
if (!decoded || !decoded.details) return "";
|
||||
let html = `<div class="border border-border border-dashed p-2 mb-3">`;
|
||||
if (decoded.name) {
|
||||
@@ -281,9 +282,9 @@ function decodedDetailsHtml(decoded) {
|
||||
if (d.isToken) {
|
||||
const sym = tokenLabel(d.address) || "Unknown token";
|
||||
html += `<div class="font-bold">${escapeHtml(sym)}</div>`;
|
||||
html += toAddressHtml(d.address);
|
||||
html += toAddressHtml(d.address, chainId);
|
||||
} else {
|
||||
html += toAddressHtml(d.address);
|
||||
html += toAddressHtml(d.address, chainId);
|
||||
}
|
||||
} else {
|
||||
html += `<div class="font-bold">${escapeHtml(d.value)}</div>`;
|
||||
@@ -312,16 +313,16 @@ function renderSuccess() {
|
||||
toSection.classList.remove("hidden");
|
||||
$("success-tx-summary").textContent =
|
||||
d.amount + (d.symbol ? " " + d.symbol : "");
|
||||
$("success-tx-to").innerHTML = toAddressHtml(d.to);
|
||||
$("success-tx-to").innerHTML = toAddressHtml(d.to, d.chainId);
|
||||
}
|
||||
|
||||
$("success-tx-block").innerHTML = blockNumberHtml(d.blockNumber);
|
||||
$("success-tx-hash").innerHTML = txHashHtml(d.hash);
|
||||
$("success-tx-block").innerHTML = blockNumberHtml(d.blockNumber, d.chainId);
|
||||
$("success-tx-hash").innerHTML = txHashHtml(d.hash, d.chainId);
|
||||
|
||||
// Show decoded calldata details if present
|
||||
const decodedEl = $("success-tx-decoded");
|
||||
if (decodedEl && hasDecoded) {
|
||||
decodedEl.innerHTML = decodedDetailsHtml(d.decoded);
|
||||
decodedEl.innerHTML = decodedDetailsHtml(d.decoded, d.chainId);
|
||||
decodedEl.classList.remove("hidden");
|
||||
} else if (decodedEl) {
|
||||
decodedEl.classList.add("hidden");
|
||||
@@ -347,6 +348,7 @@ function showError(txInfo, txHash, message) {
|
||||
to: txInfo.to,
|
||||
hash: txHash || null,
|
||||
message: message,
|
||||
chainId: txInfo.chainId,
|
||||
};
|
||||
renderError();
|
||||
}
|
||||
@@ -356,11 +358,11 @@ function renderError() {
|
||||
if (!d || !d.message) return;
|
||||
$("error-tx-summary").textContent =
|
||||
d.amount + (d.symbol ? " " + d.symbol : "");
|
||||
$("error-tx-to").innerHTML = toAddressHtml(d.to);
|
||||
$("error-tx-to").innerHTML = toAddressHtml(d.to, d.chainId);
|
||||
$("error-tx-message").textContent = d.message;
|
||||
|
||||
if (d.hash) {
|
||||
$("error-tx-hash").innerHTML = txHashHtml(d.hash);
|
||||
$("error-tx-hash").innerHTML = txHashHtml(d.hash, d.chainId);
|
||||
$("error-tx-hash-section").classList.remove("hidden");
|
||||
attachCopyHandlers("view-error-tx");
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user