Whether the verify_code response rejected the submitted code, read from the
enter-code screen's rejection global state.
Reads the raw screen layout, not the transport-parsed extract, and cannot do
otherwise: the marker is identified by its semantic data.key
(layout.bloks_payload.data[].data.key), and the extractor drops data.key
— running the exact evidence payload through the transport extract yields an
empty ast/dicts/literals. The key is reachable only through the layout,
exactly as readAacGlobalState (packages/mobile/src/caa.bloks/) documents
for its own key. Anchored on the semantic key alone — never on the (empty
observed) value, the wire type or an opcode name.
The key marks the enter-code slot as errored regardless of its value, so
every rejection reason — wrong code, expired code, too many attempts — reads
as the same signal here and surfaces as TwoFactorBloksInvalidCodeError; the
caller's retry loop treats them all as "ask for the code again".
Whether the verify_code response rejected the submitted code, read from the enter-code screen's rejection global state.
Reads the raw screen layout, not the transport-parsed extract, and cannot do otherwise: the marker is identified by its semantic
data.key(layout.bloks_payload.data[].data.key), and the extractor dropsdata.key— running the exact evidence payload through the transport extract yields an emptyast/dicts/literals. The key is reachable only through the layout, exactly asreadAacGlobalState(packages/mobile/src/caa.bloks/) documents for its own key. Anchored on the semantic key alone — never on the (empty observed) value, the wiretypeor an opcode name.The key marks the enter-code slot as errored regardless of its value, so every rejection reason — wrong code, expired code, too many attempts — reads as the same signal here and surfaces as
TwoFactorBloksInvalidCodeError; the caller's retry loop treats them all as "ask for the code again".