Release Notes

v0.3.6

Date released: 2022-08-07

Bugfixes:

  • Fix in expressions when list members are variables (#3035)

v0.3.5

Date released: 2022-08-05

Non-breaking changes and improvements:

  • Add blueprint deployer output format (#3001)

  • Allow arbitrary data to be passed to create_from_blueprint (#2996)

  • Add CBOR length to bytecode for decoders (#3010)

  • Fix compiler panic when accessing enum storage vars via self (#2998)

  • Fix: allow empty() in constant definitions and in default argument position (#3008)

  • Fix: disallow self address in pure functions (#3027)

v0.3.4

Date released: 2022-07-27

Non-breaking changes and improvements:

  • Add enum types (#2874, #2915, #2925, #2977)

  • Add _abi_decode builtin (#2882)

  • Add create_from_blueprint and create_copy_of builtins (#2895)

  • Add default_return_value kwarg for calls (#2839)

  • Add min_value and max_value builtins for numeric types (#2935)

  • Add uint2str builtin (#2879)

  • Add vyper signature to bytecode (#2860)

Other fixes and improvements:

  • Call internal functions from constructor (#2496)

  • Arithmetic for new int types (#2843)

  • Allow msg.data in raw_call without slice (#2902)

  • Per-method calldatasize checks (#2911)

  • Type inference and annotation of arguments for builtin functions (#2817)

  • Allow varargs for print (#2833)

  • Add error_map output format for tooling consumption (#2939)

  • Multiple evaluation of contract address in call (GHSA-4v9q-cgpw-cf38)

  • Improve ast output (#2824)

  • Allow @nonreentrant on view functions (#2921)

  • Add shift() support for signed integers (#2964)

  • Enable dynarrays of strings (#2922)

  • Fix off-by-one bounds check in certain safepow cases (#2983)

  • Optimizer improvements (#2647, #2868, #2914, #2843, #2944)

  • Reverse order in which exceptions are reported (#2838)

  • Fix compile-time blowup for large contracts (#2981)

  • Rename vyper-ir binary to fang (#2936)

Many other small bugfixes, optimizations and refactoring also made it into this release! Special thanks to @tserg and @pandadefi for contributing several important bugfixes, refactoring and features to this release!

v0.3.3

Date released: 2022-04-22

This is a bugfix release. It patches an off-by-one error in the storage allocation mechanism for dynamic arrays reported by @haltman-at in #2820

Other fixes and improvements:

  • Add a print built-in which allows printing debugging messages in hardhat. (#2818)

  • Fix various error messages (#2798, #2805)

v0.3.2

Date released: 2022-04-17

Breaking changes:

  • Increase the bounds of the decimal type (#2730)

  • Generalize and simplify the semantics of the convert builtin (#2694)

  • Restrict hex and bytes literals (#2736, #2872)

Non-breaking changes and improvements:

  • Implement dynamic arrays (#2556, #2606, #2615)

  • Support all ABIv2 integer and bytes types (#2705)

  • Add storage layout override mechanism (#2593)

  • Support <address>.code attribute (#2583)

  • Add tx.gasprice builtin (#2624)

  • Allow structs as constant variables (#2617)

  • Implement skip_contract_check kwarg (#2551)

  • Support EIP-2678 ethPM manifest files (#2628)

  • Add metadata output format (#2597)

  • Allow msg.* variables in internal functions (#2632)

  • Add unsafe_ arithmetic builtins (#2629)

  • Add subroutines to Vyper IR (#2598)

  • Add select opcode to Vyper IR (#2690)

  • Allow lists of any type as loop variables (#2616)

  • Improve suggestions in error messages (#2806)

Notable Fixes:

Lots of optimizations, refactoring and other fixes made it into this release! For the full list, please see the changelog.

Special thanks to @tserg for typechecker fixes and significant testing of new features! Additional contributors to this release include @abdullathedruid, @hi-ogawa, @skellet0r, @fubuloubu, @onlymaresia, @SwapOperator, @hitsuzen-eth, @Sud0u53r, @davidhq.

v0.3.1

Date released: 2021-12-01

Breaking changes:

  • Disallow changes to decimal precision when used as a library (#2479)

Non-breaking changes and improvements:

  • Add immutable variables (#2466)

  • Add uint8 type (#2477)

  • Add gaslimit and basefee env variables (#2495)

  • Enable checkable raw_call (#2482)

  • Propagate revert data when external call fails (#2531)

  • Improve LLL annotations (#2486)

  • Optimize short-circuiting boolean operations (#2467, #2493)

  • Optimize identity precompile usage (#2488)

  • Remove loaded limits for int128 and address (#2506)

  • Add machine readable ir_json format (#2510)

  • Optimize raw_call for the common case when the input is in memory (#2481)

  • Remove experimental OVM transpiler (#2532)

  • Add CLI flag to disable optimizer (#2522)

  • Add docs for LLL syntax and semantics (#2494)

Fixes:

  • Allow non-constant revert reason strings (#2509)

  • Allow slices of complex expressions (#2500)

  • Remove seq_unchecked from LLL codegen (#2485)

  • Fix external calls with default parameters (#2526)

  • Enable lists of structs as function arguments (#2515)

  • Fix .balance on constant addresses (#2533)

  • Allow variable indexing into constant/literal arrays (#2534)

  • Fix allocation of unused storage slots (#2439, #2514)

Special thanks to @skellet0r for some major features in this release!

v0.3.0

Date released: 2021-10-04

Breaking changes:

  • Change ABI encoding of single-struct return values to be compatible with Solidity (#2457)

  • Drop Python 3.6 support (#2462)

Non-breaking changes and improvements:

  • Rewrite internal calling convention (#2447)

  • Allow any ABI-encodable type as function arguments and return types (#2154, #2190)

  • Add support for deterministic deployment of minimal proxies using CREATE2 (#2460)

  • Optimize code for certain copies (#2468)

  • Add -o CLI flag to redirect output to a file (#2452)

  • Other docs updates (#2450)

Fixes:

  • _abi_encode builtin evaluates arguments multiple times (#2459)

  • ABI length is too short for nested tuples (#2458)

  • Returndata is not clamped for certain numeric types (#2454)

  • __default__ functions do not respect nonreentrancy keys (#2455)

  • Clamps for bytestrings in initcode are broken (#2456)

  • Missing clamps for decimal args in external functions (GHSA-c7pr-343r-5c46)

  • Memory corruption when returning a literal struct with a private function call inside of it (GHSA-xv8x-pr4h-73jv)

Special thanks to contributions from @skellet0r and @benjyz for this release!

v0.2.16

Date released: 2021-08-27

Non-breaking changes and improvements:

  • Expose _abi_encode as a user-facing builtin (#2401)

  • Export the storage layout as a compiler output option (#2433)

  • Add experimental OVM backend (#2416)

  • Allow any ABI-encodable type as event arguments (#2403)

  • Optimize int128 clamping (#2411)

  • Other docs updates (#2405, #2422, #2425)

Fixes:

  • Disallow nonreentrant decorator on constructors (#2426)

  • Fix bounds checks when handling msg.data (#2419)

  • Allow interfaces in lists, structs and maps (#2397)

  • Fix trailing newline parse bug (#2412)

Special thanks to contributions from @skellet0r, @sambacha and @milancermak for this release!

v0.2.15

Date released: 23-07-2021

Non-breaking changes and improvements - Optimization when returning nested tuples (#2392)

Fixes: - Annotated kwargs for builtins (#2389) - Storage slot allocation bug (#2391)

v0.2.14

Date released: 20-07-2021

Non-breaking changes and improvements: - Reduce bytecode by sharing code for clamps (#2387)

Fixes: - Storage corruption from re-entrancy locks (#2379)

v0.2.13

THIS RELEASE HAS BEEN PULLED

Date released: 06-07-2021

Non-breaking changes and improvements:

  • Add the abs builtin function (#2356)

  • Streamline the location of arrays within storage (#2361)

v0.2.12

Date released: 16-04-2021

This release fixes a memory corruption bug (#2345) that was introduced in the v0.2.x series and was not fixed in VVE-2020-0004. Read about it further in VVE-2021-0001.

Non-breaking changes and improvements:

  • Optimize calldataload (#2352)

  • Add the int256 signed integer type (#2351)

  • EIP2929 opcode repricing and Berlin support (#2350)

  • Add msg.data environment variable #2343 (#2343)

  • Full support for Python 3.9 (#2233)

v0.2.11

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

v0.2.10

THIS RELEASE HAS BEEN PULLED

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

v0.2.9

THIS RELEASE HAS BEEN PULLED

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)!

v0.2.8

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)

Fixes:

  • 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)

v0.2.7

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)

Fixes:

  • Ensure internal variables are always placed sequentially within memory (#2196)

  • Bugfixes around memory de-allocation (#2197)

v0.2.6

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)

Fixes:

  • 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)

v0.2.5

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)

Fixes:

  • 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)

v0.2.4

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)

Fixes:

  • 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)

v0.2.3

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)

Fixes:

  • 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)

v0.2.2

Date released: 04-07-2020

Fixes:

  • Do not fold exponentiation to a negative power (#2089)

  • Add repr for mappings (#2090)

  • Literals are only validated once (#2093)

v0.2.1

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.

v0.1.0-beta.17

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.

v0.1.0-beta.16

Date released: 09-01-2020

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

v0.1.0-beta.15

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!

v0.1.0-beta.14

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)

v0.1.0-beta.13

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)

v0.1.0-beta.12

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!

v0.1.0-beta.11

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!

v0.1.0-beta.10

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.

v0.1.0-beta.9

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