Compare commits
1 Commits
9a7aa1f4fc
...
fix/59-tra
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1df770d3b6 |
@@ -531,7 +531,6 @@
|
|||||||
<!-- ============ TX SUCCESS ============ -->
|
<!-- ============ TX SUCCESS ============ -->
|
||||||
<div id="view-success-tx" class="view hidden">
|
<div id="view-success-tx" class="view hidden">
|
||||||
<h2 class="font-bold mb-2">Transaction Confirmed</h2>
|
<h2 class="font-bold mb-2">Transaction Confirmed</h2>
|
||||||
<div id="success-tx-decoded" class="mb-3 hidden text-xs"></div>
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<div class="text-xs text-muted mb-1">Amount</div>
|
<div class="text-xs text-muted mb-1">Amount</div>
|
||||||
<div id="success-tx-summary" class="font-bold"></div>
|
<div id="success-tx-summary" class="font-bold"></div>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const {
|
|||||||
balanceLine,
|
balanceLine,
|
||||||
} = require("./helpers");
|
} = require("./helpers");
|
||||||
const { state, currentAddress, saveState } = require("../../shared/state");
|
const { state, currentAddress, saveState } = require("../../shared/state");
|
||||||
const { TOKEN_BY_ADDRESS, resolveSymbol } = require("../../shared/tokenList");
|
const { TOKEN_BY_ADDRESS } = require("../../shared/tokenList");
|
||||||
const {
|
const {
|
||||||
formatUsd,
|
formatUsd,
|
||||||
getPrice,
|
getPrice,
|
||||||
@@ -96,11 +96,14 @@ function show() {
|
|||||||
const tb = (addr.tokenBalances || []).find(
|
const tb = (addr.tokenBalances || []).find(
|
||||||
(t) => t.address.toLowerCase() === tokenId.toLowerCase(),
|
(t) => t.address.toLowerCase() === tokenId.toLowerCase(),
|
||||||
);
|
);
|
||||||
symbol = resolveSymbol(
|
const tracked = (state.trackedTokens || []).find(
|
||||||
tokenId,
|
(t) => t.address.toLowerCase() === tokenId.toLowerCase(),
|
||||||
addr.tokenBalances,
|
|
||||||
state.trackedTokens,
|
|
||||||
);
|
);
|
||||||
|
symbol =
|
||||||
|
(tb && tb.symbol) ||
|
||||||
|
(tracked && tracked.symbol) ||
|
||||||
|
(knownToken && knownToken.symbol) ||
|
||||||
|
"?";
|
||||||
amount = tb ? parseFloat(tb.balance || "0") : 0;
|
amount = tb ? parseFloat(tb.balance || "0") : 0;
|
||||||
price = getPrice(symbol);
|
price = getPrice(symbol);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,9 +167,11 @@ function showTxApproval(details) {
|
|||||||
tokenSymbol: token ? token.symbol : null,
|
tokenSymbol: token ? token.symbol : null,
|
||||||
};
|
};
|
||||||
|
|
||||||
// If this is an ERC-20 call, try to extract the real recipient and amount
|
// If this is an ERC-20 call or a swap, extract the real recipient, amount, and token info
|
||||||
const decoded = decodeCalldata(details.txParams.data, toAddr || "");
|
const decoded = decodeCalldata(details.txParams.data, toAddr || "");
|
||||||
if (decoded && decoded.details) {
|
if (decoded && decoded.details) {
|
||||||
|
let decodedTokenSymbol = null;
|
||||||
|
let decodedTokenAddress = null;
|
||||||
for (const d of decoded.details) {
|
for (const d of decoded.details) {
|
||||||
if (d.label === "Recipient" && d.address) {
|
if (d.label === "Recipient" && d.address) {
|
||||||
pendingTxDetails.to = d.address;
|
pendingTxDetails.to = d.address;
|
||||||
@@ -177,22 +179,22 @@ function showTxApproval(details) {
|
|||||||
if (d.label === "Amount") {
|
if (d.label === "Amount") {
|
||||||
pendingTxDetails.amount = d.rawValue || d.value;
|
pendingTxDetails.amount = d.rawValue || d.value;
|
||||||
}
|
}
|
||||||
|
if (d.label === "Token In" && !decodedTokenSymbol) {
|
||||||
|
// Extract token symbol and address from decoded details
|
||||||
|
decodedTokenSymbol = d.value;
|
||||||
|
if (d.address) decodedTokenAddress = d.address;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (token) {
|
if (token) {
|
||||||
pendingTxDetails.token = toAddr;
|
pendingTxDetails.token = toAddr;
|
||||||
pendingTxDetails.tokenSymbol = token.symbol;
|
pendingTxDetails.tokenSymbol = token.symbol;
|
||||||
|
} else if (decodedTokenAddress) {
|
||||||
|
// For swaps through routers: use the input token info
|
||||||
|
pendingTxDetails.token = decodedTokenAddress;
|
||||||
|
pendingTxDetails.tokenSymbol = decodedTokenSymbol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Carry decoded calldata info through to success/error views
|
|
||||||
if (decoded) {
|
|
||||||
pendingTxDetails.decoded = {
|
|
||||||
name: decoded.name,
|
|
||||||
description: decoded.description,
|
|
||||||
details: decoded.details,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
$("approve-tx-hostname").textContent = details.hostname;
|
$("approve-tx-hostname").textContent = details.hostname;
|
||||||
$("approve-tx-from").innerHTML = approvalAddressHtml(state.activeAddress);
|
$("approve-tx-from").innerHTML = approvalAddressHtml(state.activeAddress);
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const {
|
|||||||
const { state, currentAddress } = require("../../shared/state");
|
const { state, currentAddress } = require("../../shared/state");
|
||||||
let ctx;
|
let ctx;
|
||||||
const { getProvider } = require("../../shared/balances");
|
const { getProvider } = require("../../shared/balances");
|
||||||
const { KNOWN_SYMBOLS, resolveSymbol } = require("../../shared/tokenList");
|
const { KNOWN_SYMBOLS, TOKEN_BY_ADDRESS } = require("../../shared/tokenList");
|
||||||
|
|
||||||
const EXT_ICON =
|
const EXT_ICON =
|
||||||
`<span style="display:inline-block;width:10px;height:10px;margin-left:4px;vertical-align:middle">` +
|
`<span style="display:inline-block;width:10px;height:10px;margin-left:4px;vertical-align:middle">` +
|
||||||
@@ -73,11 +73,15 @@ function updateSendBalance() {
|
|||||||
const tb = (addr.tokenBalances || []).find(
|
const tb = (addr.tokenBalances || []).find(
|
||||||
(t) => t.address.toLowerCase() === token.toLowerCase(),
|
(t) => t.address.toLowerCase() === token.toLowerCase(),
|
||||||
);
|
);
|
||||||
const symbol = resolveSymbol(
|
const knownToken = TOKEN_BY_ADDRESS.get(token.toLowerCase());
|
||||||
token,
|
const tracked = (state.trackedTokens || []).find(
|
||||||
addr.tokenBalances,
|
(t) => t.address.toLowerCase() === token.toLowerCase(),
|
||||||
state.trackedTokens,
|
|
||||||
);
|
);
|
||||||
|
const symbol =
|
||||||
|
(tb && tb.symbol) ||
|
||||||
|
(tracked && tracked.symbol) ||
|
||||||
|
(knownToken && knownToken.symbol) ||
|
||||||
|
"?";
|
||||||
const bal = tb ? tb.balance || "0" : "0";
|
const bal = tb ? tb.balance || "0" : "0";
|
||||||
$("send-balance").textContent =
|
$("send-balance").textContent =
|
||||||
"Current balance: " + bal + " " + symbol;
|
"Current balance: " + bal + " " + symbol;
|
||||||
@@ -128,11 +132,15 @@ function init(_ctx) {
|
|||||||
const tb = (addr.tokenBalances || []).find(
|
const tb = (addr.tokenBalances || []).find(
|
||||||
(t) => t.address.toLowerCase() === token.toLowerCase(),
|
(t) => t.address.toLowerCase() === token.toLowerCase(),
|
||||||
);
|
);
|
||||||
tokenSymbol = resolveSymbol(
|
const knownTk = TOKEN_BY_ADDRESS.get(token.toLowerCase());
|
||||||
token,
|
const trackedTk = (state.trackedTokens || []).find(
|
||||||
addr.tokenBalances,
|
(t) => t.address.toLowerCase() === token.toLowerCase(),
|
||||||
state.trackedTokens,
|
|
||||||
);
|
);
|
||||||
|
tokenSymbol =
|
||||||
|
(tb && tb.symbol) ||
|
||||||
|
(trackedTk && trackedTk.symbol) ||
|
||||||
|
(knownTk && knownTk.symbol) ||
|
||||||
|
"?";
|
||||||
tokenBalance = tb ? tb.balance || "0" : "0";
|
tokenBalance = tb ? tb.balance || "0" : "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ const {
|
|||||||
addressTitle,
|
addressTitle,
|
||||||
escapeHtml,
|
escapeHtml,
|
||||||
} = require("./helpers");
|
} = require("./helpers");
|
||||||
const { TOKEN_BY_ADDRESS } = require("../../shared/tokenList");
|
|
||||||
const { state, saveState } = require("../../shared/state");
|
const { state, saveState } = require("../../shared/state");
|
||||||
const { getProvider } = require("../../shared/balances");
|
const { getProvider } = require("../../shared/balances");
|
||||||
const { log } = require("../../shared/log");
|
const { log } = require("../../shared/log");
|
||||||
@@ -122,51 +121,11 @@ function showSuccess(txInfo, txHash, blockNumber) {
|
|||||||
to: txInfo.to,
|
to: txInfo.to,
|
||||||
hash: txHash,
|
hash: txHash,
|
||||||
blockNumber: blockNumber,
|
blockNumber: blockNumber,
|
||||||
decoded: txInfo.decoded || null,
|
|
||||||
};
|
};
|
||||||
renderSuccess();
|
renderSuccess();
|
||||||
ctx.doRefreshAndRender();
|
ctx.doRefreshAndRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
function tokenLabel(address) {
|
|
||||||
const t = TOKEN_BY_ADDRESS.get(address.toLowerCase());
|
|
||||||
return t ? t.symbol : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function etherscanTokenLink(address) {
|
|
||||||
return `https://etherscan.io/token/${address}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function decodedDetailsHtml(decoded) {
|
|
||||||
if (!decoded || !decoded.details) return "";
|
|
||||||
let html = "";
|
|
||||||
if (decoded.name) {
|
|
||||||
html += `<div class="mb-2"><div class="text-xs text-muted mb-1">Action</div>`;
|
|
||||||
html += `<div class="font-bold">${escapeHtml(decoded.name)}</div></div>`;
|
|
||||||
}
|
|
||||||
if (decoded.description) {
|
|
||||||
html += `<div class="mb-2"><div class="text-xs text-muted mb-1">Description</div>`;
|
|
||||||
html += `<div>${escapeHtml(decoded.description)}</div></div>`;
|
|
||||||
}
|
|
||||||
for (const d of decoded.details) {
|
|
||||||
html += `<div class="mb-2">`;
|
|
||||||
html += `<div class="text-xs text-muted mb-1">${escapeHtml(d.label)}</div>`;
|
|
||||||
if (d.address) {
|
|
||||||
if (d.isToken) {
|
|
||||||
const sym = tokenLabel(d.address) || "Unknown token";
|
|
||||||
html += `<div class="font-bold">${escapeHtml(sym)}</div>`;
|
|
||||||
html += toAddressHtml(d.address);
|
|
||||||
} else {
|
|
||||||
html += toAddressHtml(d.address);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
html += `<div class="font-bold">${escapeHtml(d.value)}</div>`;
|
|
||||||
}
|
|
||||||
html += `</div>`;
|
|
||||||
}
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderSuccess() {
|
function renderSuccess() {
|
||||||
const d = state.viewData;
|
const d = state.viewData;
|
||||||
if (!d || !d.hash) return;
|
if (!d || !d.hash) return;
|
||||||
@@ -174,16 +133,6 @@ function renderSuccess() {
|
|||||||
$("success-tx-to").innerHTML = toAddressHtml(d.to);
|
$("success-tx-to").innerHTML = toAddressHtml(d.to);
|
||||||
$("success-tx-block").textContent = String(d.blockNumber);
|
$("success-tx-block").textContent = String(d.blockNumber);
|
||||||
$("success-tx-hash").innerHTML = txHashHtml(d.hash);
|
$("success-tx-hash").innerHTML = txHashHtml(d.hash);
|
||||||
|
|
||||||
// Show decoded calldata details if present
|
|
||||||
const decodedEl = $("success-tx-decoded");
|
|
||||||
if (decodedEl && d.decoded) {
|
|
||||||
decodedEl.innerHTML = decodedDetailsHtml(d.decoded);
|
|
||||||
decodedEl.classList.remove("hidden");
|
|
||||||
} else if (decodedEl) {
|
|
||||||
decodedEl.classList.add("hidden");
|
|
||||||
}
|
|
||||||
|
|
||||||
attachCopyHandlers("view-success-tx");
|
attachCopyHandlers("view-success-tx");
|
||||||
showView("success-tx");
|
showView("success-tx");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3645,27 +3645,10 @@ async function getTopTokenPrices(n) {
|
|||||||
return prices;
|
return prices;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve a token symbol from multiple sources, never returning "?".
|
|
||||||
function resolveSymbol(tokenAddress, tokenBalances, trackedTokens) {
|
|
||||||
const lower = (tokenAddress || "").toLowerCase();
|
|
||||||
const tb = (tokenBalances || []).find(
|
|
||||||
(t) => t.address.toLowerCase() === lower,
|
|
||||||
);
|
|
||||||
if (tb && tb.symbol) return tb.symbol;
|
|
||||||
const known = TOKEN_BY_ADDRESS.get(lower);
|
|
||||||
if (known && known.symbol) return known.symbol;
|
|
||||||
const tracked = (trackedTokens || []).find(
|
|
||||||
(t) => t.address.toLowerCase() === lower,
|
|
||||||
);
|
|
||||||
if (tracked && tracked.symbol) return tracked.symbol;
|
|
||||||
return lower.slice(0, 10) + "\u2026";
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
TOKENS,
|
TOKENS,
|
||||||
TOKEN_BY_ADDRESS,
|
TOKEN_BY_ADDRESS,
|
||||||
KNOWN_SYMBOLS,
|
KNOWN_SYMBOLS,
|
||||||
getTopTokens,
|
getTopTokens,
|
||||||
getTopTokenPrices,
|
getTopTokenPrices,
|
||||||
resolveSymbol,
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -445,12 +445,19 @@ function decode(data, toAddress) {
|
|||||||
const maxUint160 = BigInt(
|
const maxUint160 = BigInt(
|
||||||
"0xffffffffffffffffffffffffffffffffffffffff",
|
"0xffffffffffffffffffffffffffffffffffffffff",
|
||||||
);
|
);
|
||||||
|
const rawAmount =
|
||||||
|
inputAmount >= maxUint160
|
||||||
|
? "Unlimited"
|
||||||
|
: formatAmount(inputAmount, inInfo.decimals);
|
||||||
const amountStr =
|
const amountStr =
|
||||||
inputAmount >= maxUint160
|
inputAmount >= maxUint160
|
||||||
? "Unlimited"
|
? "Unlimited"
|
||||||
: formatAmount(inputAmount, inInfo.decimals) +
|
: rawAmount + (inSymbol ? " " + inSymbol : "");
|
||||||
(inSymbol ? " " + inSymbol : "");
|
details.push({
|
||||||
details.push({ label: "Amount", value: amountStr });
|
label: "Amount",
|
||||||
|
value: amountStr,
|
||||||
|
rawValue: rawAmount,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outSymbol) {
|
if (outSymbol) {
|
||||||
|
|||||||
Reference in New Issue
Block a user