Release Notes


Date released: 27-02-2021

This is a quick patch release to fix a memory corruption bug that was introduced in v0.2.9 (#2321) with excessive memory deallocation when releasing internal variables



Date released: 17-02-2021

This is a quick patch release to fix incorrect generated ABIs that was introduced in v0.2.9 (#2311) where storage variable getters were incorrectly marked as nonpayable instead of view



Date released: 16-02-2021

Non-breaking changes and improvements: - Add license to wheel, Anaconda support (#2265) - Consider events during type-check with implements: (#2283) - Refactor ABI generation (#2284) - Remove redundant checks in parser/signatures (#2288) - Streamling ABI-encoding logic for tuple return types (#2302) - Optimize function ordering within bytecode (#2303) - Assembly-level optimizations (#2304) - Optimize nonpayable assertion (#2307) - Optimize re-entrancy locks (#2308)

Fixes: - Change forwarder proxy bytecode to ERC-1167 (#2281) - Reserved keywords check update (#2286) - Incorrect type-check error in literal lists (#2309)

Tons of Refactoring work courtesy of (@iamdefinitelyahuman)!


Date released: 04-12-2020

Non-breaking changes and improvements:

  • AST updates to provide preliminary support for Python 3.9 (#2225)
  • Support for the not in comparator (#2232)
  • Lift restriction on calldata variables shadowing storage variables (#2226)
  • Optimize shift bytecode when 2nd arg is a literal (#2201)
  • Warn when EIP-170 size limit is exceeded (#2208)


  • Allow use of slice on a calldata bytes32 (#2227)
  • Explicitly disallow iteration of a list of structs (#2228)
  • Improved validation of address checksums (#2229)
  • Bytes are always represented as hex within the AST (#2231)
  • Allow empty as an argument within a function call (#2234)
  • Allow empty static-sized array as an argument within a log statement (#2235)
  • Compile-time issue with Bytes variables as a key in a mapping (#2239)


Date released: 10-14-2020

This is a quick patch release to fix a runtime error introduced in v0.2.6 (#2188) that could allow for memory corruption under certain conditions.

Non-breaking changes and improvements:

  • Optimizations around assert and raise (#2198)
  • Simplified internal handling of memory variables (#2194)


  • Ensure internal variables are always placed sequentially within memory (#2196)
  • Bugfixes around memory de-allocation (#2197)


Date released: 10-10-2020

Non-breaking changes and improvements:

  • Release and reuse memory slots within the same function (#2188)
  • Allow implicit use of uint256 as iterator type in range-based for loops (#2180)
  • Optimize clamping logic for int128 (#2179)
  • Calculate array index offsets at compile time where possible (#2187)
  • Improved exception for invalid use of dynamically sized struct (#2189)
  • Improved exception for incorrect arg count in function call (#2178)
  • Improved exception for invalid subscript (#2177)


  • Memory corruption issue when performing function calls inside a tuple or another function call (#2186)
  • Incorrect function output when using multidimensional arrays (#2184)
  • Reduced ambiguity bewteen address and Bytes[20] (#2191)


Date released: 30-09-2020

Non-breaking changes and improvements:

  • Improve exception on incorrect interface (#2131)
  • Standalone binary preparation (#2134)
  • Improve make freeze (#2135)
  • Remove Excessive Scoping Rules on Local Variables (#2166)
  • Optimize nonpayable check for contracts that do not accept ETH (#2172)
  • Optimize safemath on division-by-zero with a literal divisor (#2173)
  • Optimize multiple sequential memory-zeroings (#2174)
  • Optimize size-limit checks for address and bool types (#2175)


  • Constant folding on lhs of assignments (#2137)
  • ABI issue with bytes and string arrays inside tuples (#2140)
  • Returning struct from a external function gives error (#2143)
  • Error messages with struct display all members (#2160)
  • The returned struct value from the external call doesn’t get stored properly (#2164)
  • Improved exception on invalid function-scoped assignment (#2176)


Date released: 03-08-2020

Non-breaking changes and improvements:

  • Improve EOF Exceptions (#2115)
  • Improve exception messaging for type mismatches (#2119)
  • Ignore trailing newline tokens (#2120)


  • Fix ABI translations for structs that are returned from functions (#2114)
  • Raise when items that are not types are called (#2118)
  • Ensure hex and decimal AST nodes are serializable (#2123)


Date released: 16-07-2020

Non-breaking changes and improvements:

  • Show contract names in raised exceptions (#2103)
  • Adjust function offsets to not include decorators (#2102)
  • Raise certain exception types immediately during module-scoped type checking (#2101)


  • Pop for loop values from stack prior to returning (#2110)
  • Type checking non-literal array index values (#2108)
  • Meaningful output during for loop type checking (#2096)


Date released: 04-07-2020


  • Do not fold exponentiation to a negative power (#2089)
  • Add repr for mappings (#2090)
  • Literals are only validated once (#2093)


Date released: 03-07-2020

This is a major breaking release of the Vyper compiler and language. It is also the first release following our versioning scheme (#1887).

Breaking changes:

  • @public and @private function decorators have been renamed to @external and @internal (VIP #2065)
  • The @constant decorator has been renamed to @view (VIP #2040)
  • Type units have been removed (VIP #1881)
  • Event declaraion syntax now resembles that of struct declarations (VIP #1864)
  • log is now a statement (VIP #1864)
  • Mapping declaration syntax changed to HashMap[key_type, value_type] (VIP #1969)
  • Interfaces are now declared via the interface keyword instead of contract (VIP #1825)
  • bytes and string types are now written as Bytes and String (#2080)
  • bytes and string literals must now be bytes or regular strings, respectively. They are no longer interchangeable. (VIP #1876)
  • assert_modifiable has been removed, you can now directly perform assertions on calls (#2050)
  • value is no longer an allowable variable name in a function input (VIP #1877)
  • The slice builtin function expects uint256 for the start and length args (VIP #1986)
  • len return type is now uint256 (VIP #1979)
  • value and gas kwargs for external function calls must be given as uint256 (VIP #1878)
  • The outsize kwarg in raw_call has been renamed to max_outsize (#1977)
  • The type kwarg in extract32 has been renamed to output_type (#2036)
  • Public array getters now use uint256 for their input argument(s) (VIP #1983)
  • Public struct getters now return all values of a struct (#2064)
  • RLPList has been removed (VIP #1866)

The following non-breaking VIPs and features were implemented:

  • Implement boolean condition short circuiting (VIP #1817)
  • Add the empty builtin function for zero-ing a value (#1676)
  • Refactor of the compiler process resulting in an almost 5x performance boost! (#1962)
  • Support ABI State Mutability Fields in Interface Definitions (VIP #2042)
  • Support @pure decorator (VIP #2041)
  • Overflow checks for exponentiation (#2072)
  • Validate return data length via RETURNDATASIZE (#2076)
  • Improved constant folding (#1949)
  • Allow raise without reason string (VIP #1902)
  • Make the type argument in method_id optional (VIP #1980)
  • Hash complex types when used as indexed values in an event (#2060)
  • Ease restrictions on calls to self (#2059)
  • Remove ordering restrictions in module-scope of contract (#2057)
  • raw_call can now be used to perform a STATICCALL (#1973)
  • Optimize precompiles to use STATICCALL (#1930)

Some of the bug and stability fixes:

  • Arg clamping issue when using multidimensional arrays (#2071)
  • Support calldata arrays with the in comparator (#2070)
  • Prevent modification of a storage array during iteration via for loop (#2028)
  • Fix memory length of revert string (#1982)
  • Memory offset issue when returning tuples from private functions (#1968)
  • Issue with arrays as default function arguments (#2077)
  • Private function calls no longer generate a call signature (#2058)

Significant codebase refactor, thanks to (@iamdefinitelyahuman)!

NOTE: v0.2.0 was not used due to a conflict in PyPI with a previous release. Both tags v0.2.0 and v0.2.1 are identical.


Date released: 24-03-2020

The following VIPs and features were implemented for Beta 17:

  • raw_call and slice argument updates (VIP #1879)
  • NatSpec support (#1898)

Some of the bug and stability fixes:

  • ABI interface fixes (#1842)
  • Modifications to how ABI data types are represented (#1846)
  • Generate method identifier for struct return type (#1843)
  • Return tuple with fixed array fails to compile (#1838)
  • Also lots of refactoring and doc updates!

This release will be the last to follow our current release process. All future releases will be governed by the versioning scheme (#1887). The next release will be v0.2.0, and contain many breaking changes.


Date released: 09-01-2020

Beta 16 was a quick patch release to fix one issue: (#1829)


Date released: 06-01-2020

NOTE: we changed our license to Apache 2.0 (#1772)

The following VIPs were implemented for Beta 15:

Some of the bug and stability fixes:

  • Removed all traces of Javascript from the codebase (#1770)
  • Ensured sufficient gas stipend for precompiled calls (#1771)
  • Allow importing an interface that contains an implements statement (#1774)
  • Fixed how certain values compared when using min and max (#1790)
  • Removed unnecessary overflow checks on addmod and mulmod (#1786)
  • Check for state modification when using tuples (#1785)
  • Fix Windows path issue when importing interfaces (#1781)
  • Added Vyper grammar, currently used for fuzzing (#1768)
  • Modify modulus calculations for literals to be consistent with the EVM (#1792)
  • Explicitly disallow the use of exponentiation on decimal values (#1792)
  • Add compile-time checks for divide by zero and modulo by zero (#1792)
  • Fixed some issues with negating constants (#1791)
  • Allow relative imports beyond one parent level (#1784)
  • Implement SHL/SHR for bitshifting, using Constantinople rules (#1796)
  • vyper-json compatibility with solc settings (#1795)
  • Simplify the type check when returning lists (#1797)
  • Add branch coverage reporting (#1743)
  • Fix struct assignment order (#1728)
  • Added more words to reserved keyword list (#1741)
  • Allow scientific notation for literals (#1721)
  • Avoid overflow on sqrt of Decimal upper bound (#1679)
  • Refactor ABI encoder (#1723)
  • Changed opcode costs per EIP-1884 (#1764)

Special thanks to (@iamdefinitelyahuman) for lots of updates this release!


Date released: 13-11-2019

Some of the bug and stability fixes:

  • Mucho Documentation and Example cleanup!
  • Python 3.8 support (#1678)
  • Disallow scientific notation in literals, which previously parsed incorrectly (#1681)
  • Add implicit rewrite rule for bytes[32] -> bytes32 (#1718)
  • Support bytes32 in raw_log (#1719)
  • Fixed EOF parsing bug (#1720)
  • Cleaned up arithmetic expressions (#1661)
  • Fixed off-by-one in check for homogeneous list element types (#1673)
  • Fixed stack valency issues in if and for statements (#1665)
  • Prevent overflow when using sqrt on certain datatypes (#1679)
  • Prevent shadowing of internal variables (#1601)
  • Reject unary substraction on unsigned types (#1638)
  • Disallow orelse syntax in for loops (#1633)
  • Increased clarity and efficiency of zero-padding (#1605)


Date released: 27-09-2019

The following VIPs were implemented for Beta 13:

  • Add vyper-json compilation mode (VIP #1520)
  • Environment variables and constants can now be used as default parameters (VIP #1525)
  • Require unitialized memory be set on creation (VIP #1493)

Some of the bug and stability fixes:

  • Type check for default params and arrays (#1596)
  • Fixed bug when using assertions inside for loops (#1619)
  • Fixed zero padding error for ABI encoder (#1611)
  • Check calldatasize before calldataload for function selector (#1606)


Date released: 27-08-2019

The following VIPs were implemented for Beta 12:

  • Support for relative imports (VIP #1367)
  • Restricted use of environment variables in private functions (VIP #1199)

Some of the bug and stability fixes:

  • @nonreentrant/@constant logical inconsistency (#1544)
  • Struct passthrough issue (#1551)
  • Private underflow issue (#1470)
  • Constancy check issue (#1480)
  • Prevent use of conflicting method IDs (#1530)
  • Missing arg check for private functions (#1579)
  • Zero padding issue (#1563)
  • vyper.cli rearchitecture of scripts (#1574)
  • AST end offsets and Solidity-compatible compressed sourcemap (#1580)

Special thanks to (@iamdefinitelyahuman) for lots of updates this release!


Date released: 23-07-2019

Beta 11 brings some performance and stability fixes.

  • Using calldata instead of memory parameters. (#1499)
  • Reducing of contract size, for large parameter functions. (#1486)
  • Improvements for Windows users (#1486) (#1488)
  • Array copy optimisation (#1487)
  • Fixing @nonreentrant decorator for return statements (#1532)
  • sha3 builtin function removed (#1328)
  • Disallow conflicting method IDs (#1530)
  • Additional convert() supported types (#1524) (#1500)
  • Equality operator for strings and bytes (#1507)
  • Change in compile_codes interface function (#1504)

Thanks to all the contributors!


Date released: 24-05-2019

  • Lots of linting and refactoring!
  • Bugfix with regards to using arrays as parameters to private functions (#1418). Please check your contracts, and upgrade to latest version, if you do use this.
  • Slight shrinking in init produced bytecode. (#1399)
  • Additional constancy protection in the for .. range expression. (#1397)
  • Improved bug report (#1394)
  • Fix returning of External Contract from functions (#1376)
  • Interface unit fix (#1303)
  • Not Equal (!=) optimisation (#1303) 1386
  • New assert <condition>, UNREACHABLE statement. (#711)

Special thanks to (Charles Cooper), for some excellent contributions this release.


Date released: 12-03-2019

  • Add support for list constants (#1211)
  • Add sha256 function (#1327)
  • Renamed create_with_code_of to create_forwarder_to (#1177)
  • @nonreentrant Decorator (#1204)
  • Add opcodes and opcodes_runtime flags to compiler (#1255)
  • Improved External contract call interfaces (#885)

Prior to v0.1.0-beta.9

Prior to this release, we managed our change log in a different fashion. Here is the old changelog:

  • 2019.04.05: Add stricter checking of unbalanced return statements. (#590)
  • 2019.03.04: create_with_code_of has been renamed to create_forwarder_to. (#1177)
  • 2019.02.14: Assigning a persistent contract address can only be done using the bar_contact = ERC20(<address>) syntax.
  • 2019.02.12: ERC20 interface has to be imported using from vyper.interfaces import ERC20 to use.
  • 2019.01.30: Byte array literals need to be annoted using b"", strings are represented as “”.
  • 2018.12.12: Disallow use of None, disallow use of del, implemented clear() built-in function.
  • 2018.11.19: Change mapping syntax to use map(). (VIP564)
  • 2018.10.02: Change the convert style to use types instead of string. (VIP1026)
  • 2018.09.24: Add support for custom constants.
  • 2018.08.09: Add support for default parameters.
  • 2018.06.08: Tagged first beta.
  • 2018.05.23: Changed wei_value to be uint256.
  • 2018.04.03: Changed bytes declaration from bytes <= n to bytes[n].
  • 2018.03.27: Renaming signed256 to int256.
  • 2018.03.22: Add modifiable and static keywords for external contract calls.
  • 2018.03.20: Renaming __log__ to event.
  • 2018.02.22: Renaming num to int128, and num256 to uint256.
  • 2018.02.13: Ban functions with payable and constant decorators.
  • 2018.02.12: Division by num returns decimal type.
  • 2018.02.09: Standardize type conversions.
  • 2018.02.01: Functions cannot have the same name as globals.
  • 2018.01.27: Change getter from get_var to var.
  • 2018.01.11: Change version from 0.0.2 to 0.0.3
  • 2018.01.04: Types need to be specified on assignment (VIP545).
  • 2017.01.02 Change as_wei_value to use quotes for units.
  • 2017.12.25: Change name from Viper to Vyper.
  • 2017.12.22: Add continue for loops
  • 2017.11.29: @internal renamed to @private.
  • 2017.11.15: Functions require either @internal or @public decorators.
  • 2017.07.25: The def foo() -> num(const): ... syntax no longer works; you now need to do def foo() -> num: ... with a @constant decorator on the previous line.
  • 2017.07.25: Functions without a @payable decorator now fail when called with nonzero wei.
  • 2017.07.25: A function can only call functions that are declared above it (that is, A can call B only if B appears earlier in the code than A does). This was introduced