fix: a V4 swap action not in the deployed shape is shown as not decoded (closes #358)
check / check (push) Successful in 5m24s
e2e / e2e-chrome (push) Failing after 14m28s
e2e / e2e-firefox (push) Canceled after 0s

The four V4 swap actions are read only as the parameter structs deployed
on mainnet and Sepolia. ethers decoded the newer v4-periphery structs,
which add minHopPriceX36, as the deployed ones without an error, and the
newer multi-hop exact-in struct showed the offset of its hop-price array
as the swap amount. A decode now counts only when encoding it again gives
back the same bytes. When a swap action fails that, its step is listed as
"V4 Swap (could not be decoded)", and a token line left without a
currency reads "Unknown (could not be decoded)" rather than "not named in
the calldata". The README records both.

Model: opus-5-5
This commit is contained in:
2026-10-14 09:03:49 +00:00
parent b4059af827
commit ec1254204c
4 changed files with 259 additions and 29 deletions
+15 -9
View File
@@ -1110,14 +1110,16 @@ read:
The swap's `Token In` and `Token Out` lines name a currency, not an amount; each
reads `Unknown (not named in the calldata)` when the decoder found no token for
that side. An `UNWRAP_WETH` step makes `Token Out` ETH only when the output side
is WETH, on mainnet or Sepolia, or when no step set the output side; a WETH
`Min. received` figure then reads in ETH. Otherwise `Token Out` and
`Min. received` keep the output side's own token and figure, whether the swap
was paid in ETH or in a token: a V2 exact-out swap that buys USDC and then
unwraps the WETH it did not spend shows USDC. The token permission warning on
the signature screen has its own amount wording, including `Unknown`; the
SignApproval section below describes it.
that side, or `Unknown (could not be decoded)` instead when a V4 swap action in
the transaction could not be read (see Transaction Decoding below). An
`UNWRAP_WETH` step makes `Token Out` ETH only when the output side is WETH, on
mainnet or Sepolia, or when no step set the output side; a WETH `Min. received`
figure then reads in ETH. Otherwise `Token Out` and `Min. received` keep the
output side's own token and figure, whether the swap was paid in ETH or in a
token: a V2 exact-out swap that buys USDC and then unwraps the WETH it did not
spend shows USDC. The token permission warning on the signature screen has its
own amount wording, including `Unknown`; the SignApproval section below
describes it.
The swap's `Deadline` line is the router's deadline as a UTC date and time, e.g.
`2026-02-27 08:25:51`. A JavaScript date reaches only to 275760-09-13 00:00:00
@@ -2690,7 +2692,11 @@ Currently supported:
or recipient, and amount.
- **Uniswap Universal Router**: `execute()` calls — shows swap direction (e.g.
"Swap USDT → ETH"), token addresses, amounts, execution steps, and deadline.
Decodes Permit2, V2/V3/V4 swaps, wrap/unwrap, and balance checks.
Decodes Permit2, V2/V3/V4 swaps, wrap/unwrap, and balance checks. A V4 swap
action is read only in the parameter shape deployed on mainnet and Sepolia,
not in the newer one on `v4-periphery` `main`, which adds a `minHopPriceX36`
field. An action in any other shape is not read, and its step is listed as
`V4 Swap (could not be decoded)`.
### Non-Goals Forever