6 Oct 2026
Vyper literal-shifting bugs via Unicode characters
Two Vyper advisories (6 Oct 2026) show hidden or look-alike characters can make literals compile to different values in Vyper 0.4.1 through 0.5.0b1.
- Event date
- Incident typeCompiler advisory
- Bug classCompiler
- Published
Loss, as sourced
Not applicable. The advisory reports a scan of 45,774 deployed-contract and repository source files found none of the line-separator triggers.
Traceability
In brief
Root cause: Per the advisories: vyper/ast/parse.py builds source offsets inconsistently with the Python parser (str.splitlines line separators; character vs UTF-8 byte offsets), so visit_Num reads literal text from shifted positions. Affects 0.4.1 through 0.5.0b1.
Timeline, as sourced: 6 Oct 2026 (GHSA-wvx7-39qj-2g9v and GHSA-r3c7-7xwm-6vfw).
Account, as sourced
On 6 October 2026 the Vyper project published two related low-severity advisories. GHSA-wvx7-39qj-2g9v (opens in a new tab) describes eight line-separator characters that Python's str.splitlines treats as newlines but the parser does not, shifting source lookups so numeric literals compile with incorrect values or types. GHSA-r3c7-7xwm-6vfw (opens in a new tab) describes the same effect from multi-byte characters, such as non-ASCII identifiers that normalize to ASCII or an invisible byte-order mark. Both affect Vyper 0.4.1 through 0.5.0b1 (plus some legacy 0.1.0 betas). The advisories say an attacker able to contribute source could change an address, selector or constant without a compiler warning. Until a fix ships, they recommend rejecting the trigger characters before compilation.
Summaries of public sources as of the published date; except where marked (on-chain), not independently verified by NullMeridian. Figures are the sources’ own and are attributed; where sources disagree, each is given. Sources may since have changed. Not legal, financial or investment advice.
Permalinkhttps://andromeda.observer/e/vyper-unicode-literal-shifting