@@ -526,10 +526,9 @@ def _arg_shown(a):
526526 '0x transformERC20 raw disclosure' ,
527527 'A 1480-byte transformERC20 payload exceeds one 1024-byte chunk. The device must NOT '
528528 'clear-sign it as a token swap, because the bytes past the initial chunk are hashed '
529- 'without being decoded. With AdvancedMode on it falls to the raw path, where the byte '
530- 'count shown must be the FULL length (1480), not the chunk length (1024) - a short '
531- 'count would under-report what is being signed.' ,
532- ['Raw contract data screen showing the full byte count' ]),
529+ 'without being decoded. With AdvancedMode on it falls to the raw path, where the final '
530+ 'screen commits to all 1480 bytes with a Keccak-256 the user can compare to the host.' ,
531+ ['Complete contract-data Keccak-256 commitment' ]),
533532 ('J2' , 'test_msg_ethereum_erc20_0x_signtx' , 'test_sign_0x_swap_ERC20_to_ETH' ,
534533 '0x sellToUniswap names both assets' ,
535534 'Clear-signing is only honest when BOTH token words resolve to known assets. This '
@@ -538,18 +537,24 @@ def _arg_shown(a):
538537 ['Swap screen naming both assets and amounts' ]),
539538 ('J3' , 'test_msg_ethereum_erc20_0x_signtx' , 'test_sign_longdata_swap' ,
540539 'Long 0x calldata stays disclosed' ,
541- 'Calldata spanning multiple chunks must not silently lose its tail from the display '
542- 'while remaining inside the signature.' ,
543- ['Contract data screen' ]),
540+ 'Calldata spanning multiple chunks must not silently lose its tail from the user-visible '
541+ 'commitment while remaining inside the signature.' ,
542+ ['Complete contract-data Keccak-256 commitment' ]),
543+ ('J4' , 'test_msg_ethereum_signing_guards' ,
544+ 'test_streamed_calldata_tail_changes_user_commitment' ,
545+ 'A streamed tail changes the approval screens' ,
546+ 'Signs two equal-length payloads with identical initial 1024-byte chunks and a one-bit '
547+ 'difference in the final EthereumTxAck byte. Their ordered OLED frame sequences must '
548+ 'differ, proving the complete-calldata Keccak-256 -- not merely the visible prefix or '
549+ 'declared length -- reaches the user before either signature is emitted.' ,
550+ ['Complete contract-data Keccak-256 commitment' ]),
544551 ('J8' , 'test_msg_ethereum_signing_guards' ,
545552 'test_contract_handler_streamed_calldata_signs_full_data' ,
546553 'Streamed calldata is fully covered' ,
547- 'Calldata delivered across several chunks must be hashed in full and disclosed in full. '
548- 'This is the positive control for the chunk-completeness gate. NOTE: every test in '
549- 'test_msg_ethereum_signing_guards currently SKIPS in CI under requires_firmware, so no '
550- 'screen can be captured for it yet - the screenshot list stays empty until the gate '
551- 'opens, rather than declaring an expectation nothing can satisfy.' ,
552- []),
554+ 'Calldata delivered across several chunks must be hashed in full, and the final OLED '
555+ 'commitment must cover that same complete byte string. This is the positive control for '
556+ 'the chunk-completeness gate.' ,
557+ ['Complete contract-data Keccak-256 commitment' ]),
553558 ('J9' , 'test_msg_ethereum_signing_guards' , 'test_eip1559_requires_chain_id' ,
554559 'Omitted chain_id is refused before any screen' ,
555560 'Without a chain_id the device cannot name the network, and a signature would be '
@@ -1133,21 +1138,25 @@ def _arg_shown(a):
11331138 'Failure on the wire.' ,
11341139 []),
11351140 ('E17' , 'test_msg_ethereum_erc20_uniswap_liquidity' , 'test_sign_uni_approve_liquidity_ETH' ,
1136- 'Uniswap V2 add-liquidity approve (pending)' ,
1137- 'PENDING, disclosed: known emulator limitation — an approve to an unknown (non-registry) '
1138- 'token contract cannot complete against the kkemu emulator (matches the sibling '
1139- 'add/remove-liquidity skips below); the device-firmware path is not in question, only '
1140- 'CI emulator coverage. Real-device testing is unaffected.' ,
1141- []),
1141+ 'Uniswap V2 LP-token approval' ,
1142+ 'Approves the Uniswap V2 FOX/WETH LP token for the canonical router. The exact pool '
1143+ 'identity and full-LP allowance are shown before the generic fee review, and the fixed '
1144+ 'signature proves the reviewed transaction bytes are the bytes signed.' ,
1145+ ['Full LP allowance' , 'LP token and pool address' , 'Fee and final approval' ]),
11421146 ('E18' , 'test_msg_ethereum_erc20_uniswap_liquidity' , 'test_sign_uni_add_liquidity_ETH' ,
1143- 'Uniswap V2 add liquidity ETH+token (pending)' ,
1144- 'PENDING, disclosed: same emulator limitation as E17 — a daily-driver LP-deposit flow '
1145- 'with no PDF proof on this build; tracked for real-device verification.' ,
1146- []),
1147+ 'Uniswap V2 add liquidity ETH+token' ,
1148+ 'Clear-signs both desired/minimum FOX and ETH amounts, the signed recipient, and the '
1149+ 'deadline before the final fee review. The fixed signature binds those confirmations '
1150+ 'to the complete addLiquidityETH calldata.' ,
1151+ ['FOX desired amount' , 'FOX minimum' , 'Recipient' , 'ETH desired amount' ,
1152+ 'ETH minimum' , 'Deadline' , 'Fee and final approval' ]),
11471153 ('E19' , 'test_msg_ethereum_erc20_uniswap_liquidity' , 'test_sign_uni_remove_liquidity_ETH' ,
1148- 'Uniswap V2 remove liquidity ETH+token (pending)' ,
1149- 'PENDING, disclosed: same emulator limitation as E17.' ,
1150- []),
1154+ 'Uniswap V2 remove liquidity ETH+token' ,
1155+ 'Clear-signs the LP burn amount, minimum FOX and ETH outputs, the non-self signed '
1156+ 'recipient, and deadline before the final fee review. This is the regression for the '
1157+ 'recipient-confirmation path that previously cancelled after the user approved it.' ,
1158+ ['LP burn amount' , 'FOX minimum' , 'Recipient' , 'ETH minimum' , 'Deadline' ,
1159+ 'Fee and final approval' ]),
11511160 ('E20' , 'test_msg_ethereum_thorchain_deposit' , 'test_deposit_legacy_selector' ,
11521161 'THORChain router deposit() (legacy selector)' ,
11531162 'Cross-chain swap via the THORChain router contract — a daily-driver EVM<->THORChain '
@@ -2930,7 +2939,7 @@ def _arg_shown(a):
29302939 'f2cee375...912090f and messageHash c52c0ee5...4b371e, both published, both matched on '
29312940 'hardware and in the emulator.' ,
29322941 ['Domain name' , 'Domain version' , 'chainId' , 'verifyingContract (42 chars, in full)' ,
2933- 'Cow / wallet' , 'Bob / wallet' , 'contents' ]),
2942+ 'From name: Cow' , 'From wallet' , 'To name: Bob' , 'To wallet' , 'contents' ]),
29342943 ('TD2' , 'test_msg_eip712_streaming' , 'test_array_of_structs_walks' ,
29352944 'An array of structs walks and signs' ,
29362945 'Arrays hash WITHOUT a typeHash prefix -- enc(array) is the keccak of the concatenated '
0 commit comments