fix: a zero-minimum balance check never sets the output side (closes #649)
A BALANCE_CHECK_ERC20 of the sender with a zero minimum guarantees nothing, and neither does one the router lets fail. Such a check set Token Out and the minimum whenever the output side held no minimum. After an UNWRAP_WETH that drops the minimum, a zero check of USDC named USDC as Token Out. Such a check now sets neither line. A check with a positive minimum is unchanged. Model: opus-5-5
This commit is contained in:
@@ -1277,22 +1277,18 @@ see Transaction Decoding), do not always read as a number. They can read:
|
||||
step pays nothing itself and swaps whatever an earlier step sent to the pair,
|
||||
so the calldata states no quantity. A V3 exact-in `amountIn` of zero has no
|
||||
such meaning and is shown as a zero.
|
||||
- `None (no minimum guaranteed)`: the swap's `Min. received` line, when the
|
||||
minimum it shows is zero, whether a V2, V3 or V4 swap's minimum or a
|
||||
`BALANCE_CHECK_ERC20` step's `minBalance`. Before
|
||||
[#359](https://git.eeqj.de/sneak/AutistMask/issues/359), a zero `minBalance`
|
||||
read `0.0000` when the token's scale was known. The router passes a balance
|
||||
check whenever the balance is at least `minBalance`, so a zero `minBalance`
|
||||
guarantees nothing: it sets `Token Out` and `Min. received` only when the
|
||||
output side holds no minimum, not even a zero one, at the point the check is
|
||||
reached, and otherwise leaves the current token and figure in place. A nonzero
|
||||
`minBalance` sets both lines, as a swap step does. Only a check of the
|
||||
transaction's sender's own balance sets either line; a check of any other
|
||||
address sets neither (see Transaction Decoding). A `BALANCE_CHECK_ERC20` step
|
||||
that the router lets fail without reverting the transaction (see Transaction
|
||||
Decoding) guarantees nothing either, whatever its `minBalance`, and is read as
|
||||
one whose `minBalance` is zero. A minimum stated by a V4 swap step the router
|
||||
lets fail is likewise read as zero.
|
||||
- `None (no minimum guaranteed)`: the swap's `Min. received` line, when it shows
|
||||
a V2, V3 or V4 swap's minimum of zero. The router passes a
|
||||
`BALANCE_CHECK_ERC20` step whenever the balance is at least `minBalance`, so a
|
||||
zero `minBalance` guarantees nothing. A check with a zero `minBalance` sets
|
||||
neither `Token Out` nor `Min. received`. A nonzero `minBalance` sets both
|
||||
lines, as a swap step does. Only a check of the transaction's sender's own
|
||||
balance sets either line; a check of any other address sets neither (see
|
||||
Transaction Decoding). A `BALANCE_CHECK_ERC20` step that the router lets fail
|
||||
without reverting the transaction (see Transaction Decoding) guarantees
|
||||
nothing either, whatever its `minBalance`, and is read as one whose
|
||||
`minBalance` is zero. A minimum stated by a V4 swap step the router lets fail
|
||||
is likewise read as zero.
|
||||
|
||||
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
|
||||
@@ -3397,7 +3393,8 @@ Currently supported:
|
||||
`Balance Check (of another address)`. A check whose input does not decode,
|
||||
such as one whose owner word has a nonzero top byte (the router reads the
|
||||
owner from the word's last 20 bytes), likewise sets neither, and it is listed
|
||||
as `Balance Check (could not be decoded)`. When a swap step, `TAKE` or
|
||||
as `Balance Check (could not be decoded)`. A check with a zero `minBalance`
|
||||
sets neither `Token Out` nor the minimum. When a swap step, `TAKE` or
|
||||
`TAKE_PORTION` pays the router any token, the swap's output or another, a
|
||||
`WRAP_ETH` pays it WETH, or an `UNWRAP_WETH` into the router turns WETH a step
|
||||
paid it into ETH, that token stays in the router unless a later step pays out
|
||||
|
||||
Reference in New Issue
Block a user