Vyper is a pythonic Smart Contract Language for the Ethereum virtual machine. Starting in version 0.3.8 and prior to version 0.4.0b1, when looping over a range
of the form range(start, start + N)
, if start
is negative, the execution will always revert. This issue is caused by an incorrect assertion inserted by the code generation of the range stmt.parse_For_range()
. The issue arises when start
is signed, instead of using sle
, le
is used and start
is interpreted as an unsigned integer for the comparison. If it is a negative number, its 255th bit is set to 1
and is hence interpreted as a very large unsigned integer making the assertion always fail. Any contract having a range(start, start + N)
where start
is a signed integer with the possibility for start
to be negative is affected. If a call goes through the loop while supplying a negative start
the execution will revert. Version 0.4.0b1 fixes the issue.
When converting from one data type to another, such as long to integer, data can be omitted or translated in a way that produces unexpected values. If the resulting values are used in a sensitive context, then dangerous behaviors may occur.