fix: history calls an execute or multicall a Swap only when sent to a router (closes #580)
check / check (push) Waiting to run
e2e / e2e-chrome (push) Waiting to run
e2e / e2e-firefox (push) Waiting to run

The history labelled any call named execute or multicall a Swap, whatever
contract it went to, so a multisig or smart account call showed as a Swap
in the list and on TransactionDetail's Type line. Such a call is now a Swap
only when sent to a Universal Router address listed for the network the
transaction is on, the list the approval screen uses (routerRelease(), now
exported from uniswap.js). Any other is labelled by its method name and its
Type line reads Contract Call. The named router swap methods keep their
label.

Model: opus-5-5
This commit was merged in pull request #643.
This commit is contained in:
2026-10-20 17:19:42 +02:00
parent 4109c4d44a
commit 4472746b89
4 changed files with 108 additions and 22 deletions
+10 -3
View File
@@ -20,6 +20,7 @@ const { toDecimals } = require("./transferAmount");
// truncation without the approval screens' nonzero floor: the transaction
// detail view is the authoritative record and already shows exact precision.
const { truncateAmount: formatTxValue } = require("./amountDisplay");
const { routerRelease } = require("./uniswap");
// Ethereum addresses are case-insensitive: EIP-55 mixed case is a checksum
// over the address, not part of its identity. Every address comparison in
@@ -51,7 +52,6 @@ function parseTx(tx, addrLower, chainId) {
}
// Map known DEX methods to "Swap" for cleaner display
const SWAP_METHODS = new Set([
"execute",
"swap",
"swapExactTokensForTokens",
"swapTokensForExactTokens",
@@ -59,9 +59,16 @@ function parseTx(tx, addrLower, chainId) {
"swapTokensForExactETH",
"swapExactTokensForETH",
"swapETHForExactTokens",
"multicall",
]);
const label = SWAP_METHODS.has(method)
// Multisigs, smart accounts and many other contracts also have an
// `execute` or `multicall` method, so either is a swap only when sent
// to a Universal Router on this transaction's network: the same
// addresses the approval screen decodes a swap for.
const isSwap =
SWAP_METHODS.has(method) ||
((method === "execute" || method === "multicall") &&
routerRelease(to, chainId) !== null);
const label = isSwap
? "Swap"
: method.charAt(0).toUpperCase() + method.slice(1);
direction = "contract";
+1 -1
View File
@@ -2237,4 +2237,4 @@ function decode(data, toAddress, chainId, sources, fromAddress) {
}
}
module.exports = { decode };
module.exports = { decode, routerRelease };