fix: a V4 step of chained swap actions shows what the user receives (closes #563)
check / check (push) Canceled after 0s
e2e / e2e-chrome (push) Canceled after 0s
e2e / e2e-firefox (push) Canceled after 0s

A V4 step's input side is now the currency its SETTLE or SETTLE_ALL
names, and its output side the currency its TAKE or TAKE_ALL names. A
side none of them names comes from the swap actions, put in the order
the currencies pass through them: each exact-in action after the ones
before it, each exact-out action in front of them, since the router runs
exact-out actions from the output end. The input and Amount come from
the first action in that order, the output and Min. received from the
last. SETTLE_ALL and TAKE_ALL were not read before, and the first swap
action set both sides, so a chain showed the first one's output.

Model: opus-5-5
This commit is contained in:
2026-10-18 19:35:29 +00:00
parent e48308c5b6
commit f4f2c549f5
3 changed files with 405 additions and 144 deletions
+26 -13
View File
@@ -1164,8 +1164,9 @@ read:
amount of one step that names an input token or amount: the last
`PERMIT2_PERMIT` step if there is one, otherwise the first V2 or V3 exact-in,
V2 exact-out, `WRAP_ETH` or V4 swap step. A V2 exact-out step gives its
`amountInMax`, and a V4 swap step the `amountIn` of its first readable
exact-in action.
`amountInMax`, and a V4 swap step the `amountIn` of the swap action that
spends what the user pays (see below), or none when that action is exact-out
or could not be read.
- `Whatever an earlier step sent to the pair (V2 already paid)`: the swap's
`Amount` line, when the amount it shows is a V2 exact-in `amountIn` of zero.
The router reads that zero as "the pair already holds the input tokens": the
@@ -1186,17 +1187,29 @@ 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, or `Unknown (could not be decoded)` instead when a V4 swap action in
the transaction could not be read (see Transaction Decoding below). A V4 step
whose swap action could not be read still sets each side as a swap step does,
and a side its `SETTLE` or `TAKE` did not name is then unknown: no other step's
token or figure is shown for it. 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 transaction could not be read (see Transaction Decoding below). A V4 step's
input side is the currency its `SETTLE` or `SETTLE_ALL` names, and its output
side the currency its `TAKE` or `TAKE_ALL` names. A side none of them names
comes from the step's swap actions, put in the order the currencies pass through
them, from what the user pays to what the user receives. The router runs
exact-in actions from the input end, so each one goes after the actions before
it, whose output it spends. It runs exact-out actions from the output end, so
the first one buys what the user receives and each later one goes in front of
the actions before it, buying what they spend. The input side and `Amount` come
from the first action in that order, and the output side and `Min. received`
from the last; the decoder reads no amount from an exact-out action. A swap
action that could not be read keeps its place in that order and states nothing,
so a side or figure that would come from it is unknown, while one from a
readable action is shown. Such a step still sets each side as a swap step does,
and no other step's token or figure is shown for an unknown one. 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