Skip to content

Latest commit

 

History

History
203 lines (190 loc) · 8.79 KB

CHANGELOG.md

File metadata and controls

203 lines (190 loc) · 8.79 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Added

Changed

Removed

4.2.0 - 2020-01-15

Added

  • Allow separate entrypoint/function type signature and definition, and pattern matching in left-hand sides:
      function
        length : list('a) => int
        length([])      = 0
        length(x :: xs) = 1 + length(xs)
    
  • Allow pattern matching in list comprehension generators (filtering out match failures):
      function somes(xs : list(option('a))) : list('a) =
        [ x | Some(x) <- xs ]
    
  • Allow pattern matching in let-bindings (aborting on match failures):
      function test(m : map(int, int)) =
          let Some(x) = Map.lookup(m, 0)
          x
    

Changed

  • FATE code generator improvements.
  • Bug fix: Handle qualified constructors in patterns.
  • Bug fix: Allow switching also on negative numbers.

Removed

4.1.0 - 2019-11-26

Added

  • Support encoding and decoding bit fields in call arguments and results.

Changed

  • Various improvements to FATE code generator.

Removed

4.0.0 - 2019-10-11

Added

  • Address.to_contract - casts an address to a (any) contract type.
  • Pragma to check compiler version, e.g. @compiler >= 4.0.
  • Handle numeric escapes, i.e. "\x19Ethereum Signed Message:\n", and similar strings.
  • Bytes.concat and Bytes.split are added to be able to (de-)construct byte arrays.
  • [a..b] language construct, returning the list of numbers between a and b (inclusive). Returns the empty list if a > b.
  • [Standard libraries] (https://github.com/aeternity/protocol/blob/master/contracts/sophia_stdlib.md)
  • Checks that init is not called from other functions.
  • FATE backend - the compiler is able to produce VM code for both AEVM and FATE. Many of the APIs now take {backend, aevm | fate} to decide wich backend to produce artifacts for.
  • New builtin functions Crypto.ecrecover_secp256k1: (hash, bytes(65)) => option(bytes(20)) and Crypto.ecverify_secp256k1 : (hash, bytes(20), bytes(65)) => bool for recovering and verifying an Ethereum address for a message hash and a signature.
  • Sophia supports list comprehensions known from languages like Python, Haskell or Erlang. Example syntax:
[x + y | x <- [1,2,3,4,5], let k = x*x, if (k > 5), y <- [k, k+1, k+2]]
// yields [12,13,14,20,21,22,30,31,32]
  • A new contract, and endpoint, modifier payable is introduced. Contracts, and enpoints, that shall be able to receive funds should be marked as payable. Address.is_payable(a) can be used to check if an (contract) address is payable or not.

Changed

  • Nice type error if contract function is called as from a namespace.
  • Fail on function definitions in contracts other than the main contract.
  • Bug fix in variable optimization - don't discard writes to the store/state.
  • Bug fixes in error reporting.
  • Bug fix in variable liveness analysis for FATE.
  • Error messages are changed into a uniform format, and more helpful messages have been added.
  • Crypto.<hash_fun> and String.<hash_fun> for byte arrays now only hash the actual byte array - not the internal ABI format.
  • More strict checks for polymorphic oracles and higher order oracles and entrypoints.
  • AENS.claim is updated with a NameFee field - to be able to do name auctions within contracts.
  • Fixed a bug in Bytes.to_str for AEVM.
  • New syntax for tuple types. Now 0-tuple type is encoded as unit instead of () and regular tuples are encoded by interspersing inner types with *, for instance int * string. Parens are not necessary. Note it only affects the types, values remain as their were before, so (1, "a") : int * string
  • The AENS.transfer and AENS.revoke functions have been updated to take a name string instead of a name hash.
  • Fixed a bug where the AEVM backend complained about a missing init function when trying to generate calldata from an ACI-generated interface.
  • Compiler now returns the ABI-version in the compiler result map.
  • Renamed Crypto.ecverify and Crypto.ecverify_secp256k1 into Crypto.verify_sig and Crypto.verify_sig_secp256k1 respectively.

Removed

3.2.0 - 2019-06-28

Added

  • New builtin function require : (bool, string) => (). Defined as
    function require(b, err) = if(!b) abort(err)
    
  • New builtin functions
    Bytes.to_str : bytes(_) => string
    Bytes.to_int : bytes(_) => int
    
    for converting a byte array to a hex string and interpreting it as a big-endian encoded integer respectively.

Changed

  • Public contract functions must now be declared as entrypoints:
    contract Example =
      // Exported
      entrypoint exported_fun(x) = local_fun(x)
      // Not exported
      function local_fun(x) = x
    
    Functions in namespaces still use function (and private function for private functions).
  • The return type of Chain.block_hash(height) has changed, it used to be int, where 0 denoted an incorrect height. New return type is option(hash), where None represents an incorrect height.
  • Event name hashes now use BLAKE2b instead of Keccak256.
  • Fixed bugs when defining record types in namespaces.
  • Fixed a bug in include path handling when passing options to the compiler.

Removed

3.1.0 - 2019-06-03

Added

Changed

  • Keyword indexed is now optional for word typed (bool, int, address, ...) event arguments.
  • State variable pretty printing now produce 'a, 'b, ... instead of '1, '2, ....
  • ACI is restructured and improved:
    • state and event types (if present) now appear at the top level.
    • Namespaces and remote interfaces are no longer ignored.
    • All type definitions are included in the interface rendering.
    • API functions are renamed, new functions are contract_interface and render_aci_json.
  • Fixed a bug in create_calldata/to_sophia_value - it can now handle negative literals.

Removed

3.0.0 - 2019-05-21

Added

  • stateful annotations are now properly enforced. Functions must be marked stateful in order to update the state or spend tokens.
  • Primitives Contract.creator, Address.is_contract, Address.is_oracle, Oracle.check and Oracle.check_query has been added to Sophia.
  • A byte array type bytes(N) has been added to generalize hash (== bytes(32)) and signature (== bytes(64)) and allow for byte arrays of arbitrary fixed length.
  • Crypto.ecverify_secp256k1 has been added.

Changed

  • Address literals (+ Oracle, Oracle query and remote contracts) have been changed from #<hex> to address as ak_<base58check>, oracle ok_<base58check>, oracle query oq_<base58check> and remote contract ct_<base58check>.
  • The compilation and typechecking of letfun (e.g. let m(f, xs) = map(f, xs)) was not working properly and has been fixed.

Removed

  • let rec has been removed from the language, it has never worked.
  • The standalone CLI compiler is served in the repo aeternity/aesophia_cli and has been completely removed from aesophia.

2.1.0 - 2019-04-11

Added

  • Stubs (not yet wired up) for compilation to FATE
  • Add functions specific for Calldata decoding
  • Support for Auth.tx_hash, not available in AEVM until Fortuna release

Changed

  • Improvements to the ACI generator

2.0.0 - 2019-03-11

Added

  • Add Crypto.ecverify to the compiler.
  • Add Crypto.sha3, Crypto.blake2, Crypto.sha256, String.blake2 and String.sha256 to the compiler.
  • Add the bits type for working with bit fields in Sophia.
  • Add Namespaces to Sophia in order to simplify using library contracts, etc.
  • Add a missig type check on the init function - detects programmer errors earlier.
  • Add the ACI (Aeternity Contract Interface) generator.

Changed

  • Use native bit shift operations in builtin functions, reducing gas cost.
  • Improve type checking of record fields - generates more understandable error messages.
  • Improved, more coherent, error messages.
  • Simplify calldata creation - instead of passing a compiled contract, simply pass a (stubbed) contract string.