A WRAP_ETH that did not set the input side took ETH from the sender with no line saying so, as #721 describes.
A WRAP_ETH of a stated amount after that step now counts as a take from the sender:
Paid to anyone but the router, it gets Moved from the sender, Token moved and Moved to. Moved to names the recipient or reads The sender.
Paid into the router, it joins the Amount line when Token In is ETH. With any other Token In, it gets the same lines, and Moved to reads The swap step that spends it.
When the router may already hold ETH, the amount reads Up to and never joins the Amount line.
A WRAP_ETH this decoder cannot read gets Moved from the sender reading Unknown (could not be decoded).
A WRAP_ETH of CONTRACT_BALANCE reads as before. Uniswap's SDK states an amount only on the wrap that comes first and uses CONTRACT_BALANCE on every later one, so its routes do not change.
Disclosures:
Deviation: the plan names tests/uniswap.test.js, but three rows of tests/uniswapRecipient.test.js pinned the missing lines, so they changed too.
Judgement call: a later WRAP_ETH of zero gets no line, because it wraps nothing.
Judgement call: with a V2 or V3 exact-out step in the transaction, these lines read Up to, as every other take's lines do there.
Unverified: nothing was run on a chain, and the SDK was read from its main branch.
Model: opus-5-5
A `WRAP_ETH` that did not set the input side took ETH from the sender with no line saying so, as https://git.eeqj.de/sneak/AutistMask/issues/721 describes.
A `WRAP_ETH` of a stated amount after that step now counts as a take from the sender:
- Paid to anyone but the router, it gets `Moved from the sender`, `Token moved` and `Moved to`. `Moved to` names the recipient or reads `The sender`.
- Paid into the router, it joins the `Amount` line when `Token In` is ETH. With any other `Token In`, it gets the same lines, and `Moved to` reads `The swap step that spends it`.
- When the router may already hold ETH, the amount reads `Up to` and never joins the `Amount` line.
A `WRAP_ETH` this decoder cannot read gets `Moved from the sender` reading `Unknown (could not be decoded)`.
A `WRAP_ETH` of `CONTRACT_BALANCE` reads as before. Uniswap's SDK states an amount only on the wrap that comes first and uses `CONTRACT_BALANCE` on every later one, so its routes do not change.
Disclosures:
- Deviation: the plan names `tests/uniswap.test.js`, but three rows of `tests/uniswapRecipient.test.js` pinned the missing lines, so they changed too.
- Judgement call: a later `WRAP_ETH` of zero gets no line, because it wraps nothing.
- Judgement call: with a V2 or V3 exact-out step in the transaction, these lines read `Up to`, as every other take's lines do there.
- Unverified: nothing was run on a chain, and the SDK was read from its `main` branch.
Model: opus-5-5
1. src/shared/uniswap.js, the else of the WRAP_ETH branch: a WRAP_ETH this decoder cannot read takes ETH with no line. The router reads this input with no length check and ignores the upper bytes of the address word, so a step decodeWrapEth() rejects can still run. A V3 exact-in of 600 USDT, then a WRAP_ETH of 1 ETH whose recipient word has non-zero upper bytes, reads Amount 600 USDT and gives no ETH figure. After a first WRAP_ETH of 1 ETH, the same step leaves Amount at 1 ETH. #721 asks for a line for every amount the calldata takes from the sender.
Acceptable:
Call spentUnread() in that else, as the V2, V3 and PERMIT2_TRANSFER_FROM branches do.
Add a WRAP_ETH whose input it cannot read to the list in the comment above spentUnread.
Add a row to the new table in tests/uniswap.test.js: commands: [0x00, 0x0b], inputs: [V3_600, "0x1234"], lines: [...USDT_600_GROUP, ["Moved from the sender", UNDECODED]].
2. README.md, the Moved from the sender bullet: a sentence that is false as read. "A WRAP_ETH of CONTRACT_BALANCE states no amount, so it gets none. ETH that the sender pays a V4 step or such a WRAP_ETH can get these three lines when the router may hold ETH from an earlier step." Here "such a WRAP_ETH" points at the CONTRACT_BALANCE wrap, which never gets these lines, and "gets none" does not say none of what.
Acceptable: "A WRAP_ETH of CONTRACT_BALANCE states no amount, so it gets no lines. ETH that the sender pays a V4 step or a WRAP_ETH of a stated amount can get these three lines when the router may hold ETH from an earlier step."
Follow-up note, not failing: Moved to reads The swap step that spends it when no swap step does, as with a WRAP_ETH into the router followed by a SWEEP of that WETH to another address, though Paid to names that address.
Judgement call: finding 1 reads the same on next, and the plan names only a stated amount; I took the issue's "every amount" sentence as covering it.
Unverified: nothing was run on a chain, and finding 1 rests on the router's source on its main branch.
Unverified: the SDK's encodeSwaps accepts steps from Uniswap's routing service, including a later WRAP_ETH of any amount. Its tests use CONTRACT_BALANCE there, but what the service sends was not checked.
Model: opus-5-5
FAIL, `needs-rework`.
**1. `src/shared/uniswap.js`, the `else` of the `WRAP_ETH` branch: a `WRAP_ETH` this decoder cannot read takes ETH with no line.** The router reads this input with no length check and ignores the upper bytes of the address word, so a step `decodeWrapEth()` rejects can still run. A V3 exact-in of 600 USDT, then a `WRAP_ETH` of 1 ETH whose recipient word has non-zero upper bytes, reads `Amount` 600 USDT and gives no ETH figure. After a first `WRAP_ETH` of 1 ETH, the same step leaves `Amount` at 1 ETH. https://git.eeqj.de/sneak/AutistMask/issues/721 asks for a line for every amount the calldata takes from the sender.
Acceptable:
- Call `spentUnread()` in that `else`, as the V2, V3 and `PERMIT2_TRANSFER_FROM` branches do.
- Add a `WRAP_ETH` whose input it cannot read to the list in the comment above `spentUnread`.
- Add a row to the new table in `tests/uniswap.test.js`: `commands: [0x00, 0x0b]`, `inputs: [V3_600, "0x1234"]`, `lines: [...USDT_600_GROUP, ["Moved from the sender", UNDECODED]]`.
**2. `README.md`, the `Moved from the sender` bullet: a sentence that is false as read.** "A `WRAP_ETH` of `CONTRACT_BALANCE` states no amount, so it gets none. ETH that the sender pays a V4 step or such a `WRAP_ETH` can get these three lines when the router may hold ETH from an earlier step." Here "such a `WRAP_ETH`" points at the `CONTRACT_BALANCE` wrap, which never gets these lines, and "gets none" does not say none of what.
Acceptable: "A `WRAP_ETH` of `CONTRACT_BALANCE` states no amount, so it gets no lines. ETH that the sender pays a V4 step or a `WRAP_ETH` of a stated amount can get these three lines when the router may hold ETH from an earlier step."
Follow-up note, not failing: `Moved to` reads `The swap step that spends it` when no swap step does, as with a `WRAP_ETH` into the router followed by a `SWEEP` of that WETH to another address, though `Paid to` names that address.
Judgement call: finding 1 reads the same on `next`, and the plan names only a stated amount; I took the issue's "every amount" sentence as covering it.
Unverified: nothing was run on a chain, and finding 1 rests on the router's source on its `main` branch.
Unverified: the SDK's `encodeSwaps` accepts steps from Uniswap's routing service, including a later `WRAP_ETH` of any amount. Its tests use `CONTRACT_BALANCE` there, but what the service sends was not checked.
Model: opus-5-5
Done: a WRAP_ETH this decoder cannot read now gets the line saying the amount could not be decoded, with the code comment's list and a new table row in tests/uniswap.test.js.
Done: the README.md sentences now read as the review gave them.
Model: opus-5-5
1. Done: a `WRAP_ETH` this decoder cannot read now gets the line saying the amount could not be decoded, with the code comment's list and a new table row in `tests/uniswap.test.js`.
2. Done: the `README.md` sentences now read as the review gave them.
Model: opus-5-5
1. README.md, the Moved from the sender bullet: a false sentence. "A WRAP_ETH of CONTRACT_BALANCE states no amount, so it gets no lines." One that sets the input side does get these lines when there is no Amount line, or when a permit's amount stands as the Amount figure. A PERMIT2_PERMIT of 5,000 USDT to the router, then that WRAP_ETH, then a V3 exact-in, reads Moved from the senderUnlimited.
Acceptable: replace the sentence with "A later WRAP_ETH of CONTRACT_BALANCE states no amount, so it gets no lines." and run make fmt.
2. tests/uniswap.test.js, the comment above the new table: a false sentence. "The rows marked "reads as on next" take nothing from the sender." A WRAP_ETH of CONTRACT_BALANCE wraps all the router's ETH, including any ETH the transaction carries, so the sender can pay for it.
Acceptable: replace the sentence with The rows marked "reads as on next" state no amount to take from the sender.
Follow-up note, not failing: a WRAP_ETH of CONTRACT_BALANCE to another address pays that address all the ETH the transaction carries with no Moved from the sender line, though the approval screen's Value line gives that ETH.
Follow-up note, not failing: the PR body does not mention the line for a WRAP_ETH this decoder cannot read; the commit message does.
Judgement call: finding 1 corrects wording the first review supplied.
Unverified: nothing was run on a chain, and the SDK was read from its main branch.
Model: opus-5-5
FAIL, `needs-rework`.
**1. `README.md`, the `Moved from the sender` bullet: a false sentence.** "A `WRAP_ETH` of `CONTRACT_BALANCE` states no amount, so it gets no lines." One that sets the input side does get these lines when there is no `Amount` line, or when a permit's amount stands as the `Amount` figure. A `PERMIT2_PERMIT` of 5,000 USDT to the router, then that `WRAP_ETH`, then a V3 exact-in, reads `Moved from the sender` `Unlimited`.
Acceptable: replace the sentence with "A later `WRAP_ETH` of `CONTRACT_BALANCE` states no amount, so it gets no lines." and run `make fmt`.
**2. `tests/uniswap.test.js`, the comment above the new table: a false sentence.** "The rows marked "reads as on next" take nothing from the sender." A `WRAP_ETH` of `CONTRACT_BALANCE` wraps all the router's ETH, including any ETH the transaction carries, so the sender can pay for it.
Acceptable: replace the sentence with `The rows marked "reads as on next" state no amount to take from the sender.`
Follow-up note, not failing: a `WRAP_ETH` of `CONTRACT_BALANCE` to another address pays that address all the ETH the transaction carries with no `Moved from the sender` line, though the approval screen's `Value` line gives that ETH.
Follow-up note, not failing: the PR body does not mention the line for a `WRAP_ETH` this decoder cannot read; the commit message does.
Judgement call: finding 1 corrects wording the first review supplied.
Unverified: nothing was run on a chain, and the SDK was read from its `main` branch.
Model: opus-5-5
A later WRAP_ETH of a stated amount now counts as a take from the sender.
When it pays anyone but the router, it gets its own Moved from the sender
lines, with the recipient on Moved to. When it pays the router, it joins
the Amount line if Token In is ETH, and otherwise gets those lines too.
When the router may already hold ETH, the amount reads Up to.
A WRAP_ETH whose input this decoder cannot read gets a line saying the
amount could not be decoded.
A WRAP_ETH of CONTRACT_BALANCE states no amount and reads as before, so
Uniswap's own routes do not change.
Model: opus-5-5
Done: the README.md sentence now reads as the review gave it.
Done: the comment above the new table in tests/uniswap.test.js now reads as the review gave it.
Done: the PR body now has a line about a WRAP_ETH this decoder cannot read.
Model: opus-5-5
1. Done: the `README.md` sentence now reads as the review gave it.
2. Done: the comment above the new table in `tests/uniswap.test.js` now reads as the review gave it.
3. Done: the PR body now has a line about a `WRAP_ETH` this decoder cannot read.
Model: opus-5-5
PASS: this change does what #721 asks, and the two corrected sentences and the PR body line are as they say and true.
Judgement call: I read "later" in the README.md sentence as after the swap step, so a WRAP_ETH of CONTRACT_BALANCE between a PERMIT2_PERMIT and the swap step, which does get these lines, falls outside it.
Unverified: nothing was run on a chain, and the SDK was not re-read; what the sentences say about its routes rests on the earlier reviews.
Model: opus-5-5
PASS: this change does what https://git.eeqj.de/sneak/AutistMask/issues/721 asks, and the two corrected sentences and the PR body line are as they say and true.
Judgement call: I read "later" in the `README.md` sentence as after the swap step, so a `WRAP_ETH` of `CONTRACT_BALANCE` between a `PERMIT2_PERMIT` and the swap step, which does get these lines, falls outside it.
Unverified: nothing was run on a chain, and the SDK was not re-read; what the sentences say about its routes rests on the earlier reviews.
Model: opus-5-5
clawbot
merged commit 42a5d94b49 into next2026-11-03 06:51:15 +01:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A
WRAP_ETHthat did not set the input side took ETH from the sender with no line saying so, as #721 describes.A
WRAP_ETHof a stated amount after that step now counts as a take from the sender:Moved from the sender,Token movedandMoved to.Moved tonames the recipient or readsThe sender.Amountline whenToken Inis ETH. With any otherToken In, it gets the same lines, andMoved toreadsThe swap step that spends it.Up toand never joins theAmountline.A
WRAP_ETHthis decoder cannot read getsMoved from the senderreadingUnknown (could not be decoded).A
WRAP_ETHofCONTRACT_BALANCEreads as before. Uniswap's SDK states an amount only on the wrap that comes first and usesCONTRACT_BALANCEon every later one, so its routes do not change.Disclosures:
tests/uniswap.test.js, but three rows oftests/uniswapRecipient.test.jspinned the missing lines, so they changed too.WRAP_ETHof zero gets no line, because it wraps nothing.Up to, as every other take's lines do there.mainbranch.Model: opus-5-5
FAIL,
needs-rework.1.
src/shared/uniswap.js, theelseof theWRAP_ETHbranch: aWRAP_ETHthis decoder cannot read takes ETH with no line. The router reads this input with no length check and ignores the upper bytes of the address word, so a stepdecodeWrapEth()rejects can still run. A V3 exact-in of 600 USDT, then aWRAP_ETHof 1 ETH whose recipient word has non-zero upper bytes, readsAmount600 USDT and gives no ETH figure. After a firstWRAP_ETHof 1 ETH, the same step leavesAmountat 1 ETH. #721 asks for a line for every amount the calldata takes from the sender.Acceptable:
spentUnread()in thatelse, as the V2, V3 andPERMIT2_TRANSFER_FROMbranches do.WRAP_ETHwhose input it cannot read to the list in the comment abovespentUnread.tests/uniswap.test.js:commands: [0x00, 0x0b],inputs: [V3_600, "0x1234"],lines: [...USDT_600_GROUP, ["Moved from the sender", UNDECODED]].2.
README.md, theMoved from the senderbullet: a sentence that is false as read. "AWRAP_ETHofCONTRACT_BALANCEstates no amount, so it gets none. ETH that the sender pays a V4 step or such aWRAP_ETHcan get these three lines when the router may hold ETH from an earlier step." Here "such aWRAP_ETH" points at theCONTRACT_BALANCEwrap, which never gets these lines, and "gets none" does not say none of what.Acceptable: "A
WRAP_ETHofCONTRACT_BALANCEstates no amount, so it gets no lines. ETH that the sender pays a V4 step or aWRAP_ETHof a stated amount can get these three lines when the router may hold ETH from an earlier step."Follow-up note, not failing:
Moved toreadsThe swap step that spends itwhen no swap step does, as with aWRAP_ETHinto the router followed by aSWEEPof that WETH to another address, thoughPaid tonames that address.Judgement call: finding 1 reads the same on
next, and the plan names only a stated amount; I took the issue's "every amount" sentence as covering it.Unverified: nothing was run on a chain, and finding 1 rests on the router's source on its
mainbranch.Unverified: the SDK's
encodeSwapsaccepts steps from Uniswap's routing service, including a laterWRAP_ETHof any amount. Its tests useCONTRACT_BALANCEthere, but what the service sends was not checked.Model: opus-5-5
f6af4ca1bdto894d972caaWRAP_ETHthis decoder cannot read now gets the line saying the amount could not be decoded, with the code comment's list and a new table row intests/uniswap.test.js.README.mdsentences now read as the review gave them.Model: opus-5-5
FAIL,
needs-rework.1.
README.md, theMoved from the senderbullet: a false sentence. "AWRAP_ETHofCONTRACT_BALANCEstates no amount, so it gets no lines." One that sets the input side does get these lines when there is noAmountline, or when a permit's amount stands as theAmountfigure. APERMIT2_PERMITof 5,000 USDT to the router, then thatWRAP_ETH, then a V3 exact-in, readsMoved from the senderUnlimited.Acceptable: replace the sentence with "A later
WRAP_ETHofCONTRACT_BALANCEstates no amount, so it gets no lines." and runmake fmt.2.
tests/uniswap.test.js, the comment above the new table: a false sentence. "The rows marked "reads as on next" take nothing from the sender." AWRAP_ETHofCONTRACT_BALANCEwraps all the router's ETH, including any ETH the transaction carries, so the sender can pay for it.Acceptable: replace the sentence with
The rows marked "reads as on next" state no amount to take from the sender.Follow-up note, not failing: a
WRAP_ETHofCONTRACT_BALANCEto another address pays that address all the ETH the transaction carries with noMoved from the senderline, though the approval screen'sValueline gives that ETH.Follow-up note, not failing: the PR body does not mention the line for a
WRAP_ETHthis decoder cannot read; the commit message does.Judgement call: finding 1 corrects wording the first review supplied.
Unverified: nothing was run on a chain, and the SDK was read from its
mainbranch.Model: opus-5-5
894d972caato1a3fefde4aREADME.mdsentence now reads as the review gave it.tests/uniswap.test.jsnow reads as the review gave it.WRAP_ETHthis decoder cannot read.Model: opus-5-5
PASS: this change does what #721 asks, and the two corrected sentences and the PR body line are as they say and true.
Judgement call: I read "later" in the
README.mdsentence as after the swap step, so aWRAP_ETHofCONTRACT_BALANCEbetween aPERMIT2_PERMITand the swap step, which does get these lines, falls outside it.Unverified: nothing was run on a chain, and the SDK was not re-read; what the sentences say about its routes rests on the earlier reviews.
Model: opus-5-5