**StarkNet**:
* Contract (*breaking changes*):
* `external` and `view` functions should be imported directly by the main compiled file. Otherwise, they will not be usable as external functions
* Forbid using the same storage variable name in two modules
* New transaction version (version 1) for `invoke` and `declare` transactions:
* Transactions of version 0 are deprecated and will not be supported in StarkNet from the next version (v0.11.0). **Please update your systems to use the new version**
* Note that to use transactions of version 1 you will need to upgrade your account contracts
* Add `nonce` field to the transactions. Nonce validation is now part of the StarkNet protocol and is enforced to be executed sequentially
* Invoke:
* Split `__execute__` to two functions: `__validate__` (only validates the transaction) and `__execute__` (only executes the transaction)
* Remove the `selector` (which is now always `__execute__`) field, following the above change.
* Declare:
* `declare` transaction should now be sent from an account (and is validated using `__validate_declare__` in the account contract)
* Support fee for sending L1 messages. At this point, it's not mandatory and messages with no fee will still be handled. Starting from the next version it will become mandatory.
* Add a fee field to `LogMessageToL2` event in the L1 Core Contract
* New API and StarkNet CLI commands:
* `get_nonce` - Returns the next expected nonce of an account contract (see [here](https://www.starknet.io/docs/0.10.0/hello_starknet/cli.html#get-nonce))
* `simulate_transaction` - Simulates the transaction and returns the transaction trace and estimated fee (see [here](https://www.starknet.io/docs/0.10.0/hello_starknet/cli.html#simulate-transaction))
* `estimate_message_fee` - Estimates the message fee (see [here](https://www.starknet.io/docs/0.10.0/hello_starknet/l1l2.html#estimate-message-fee))
* API changes
* New fields in transaction trace: `validate_invocation` and `fee_transfer_invocation`.
* `get_block` and `get_transaction`:
* Add `nonce` and `version` fields to invoke transactions
* Add L1 handler type
* Onchain data:
* Remove the contract constructor arguments
* Add the new nonce
* See [here](https://github.com/starkware-libs/cairo-lang/blob/master/src/starkware/starknet/core/os/state.cairo)
* Support the `EC-op` builtin. This allows doing arbitrary elliptic curve operations on the STARK-friendly curve. In particular, it is now possible to verify that an ECDSA signature *fails*
* Add the solidity code of the StarkNet Core Contract to the repo
* Refactor StarkNet code to use an abstract class called `State`, which provides a cleaner definition of the StarkNet state interface.
**Cairo**:
* Syntax changes in Cairo (to make it more similar to rust and C++):
* **You can use the `cairo-migrate` script to convert old code to the new syntax**. Use the `-i` flag to apply the changes to the files
* End statements with `;`
* Note that new lines are still part of the language at this point, and you cannot put more than one instruction per line. This will change in Cairo1.0.
* Use `{ … }` for code blocks (instead of `:` and `end`)
* Add `()` around the condition of `if` statements
* Remove the `member` keyword in structs
* Change comment to use `//` instead of ``
* Use `..., ap++` instead of `...; ap++` in low level Cairo code
* Support return types that are not tuples. For example, `func foo() -> felt` (instead of `func foo() -> (r: felt)`)
* As a result, it's now mandatory to specify return types. `func foo() -> (res)` should be replaced by `func foo() -> (res: felt)`. The `cairo-migrate` tool does that automatically.
* Return statement accepts expressions, rather than only tuples. For example, you can write `let x = (5,); return x;`
* A few standard library functions were changed to return `felt`. The `cairo-migrate` script also fixes calls to those functions
* Support using functions as expressions
* This only applies to functions with `-> felt` signature, whose `ap` change is known at compile-time (e.g., recursive functions cannot be used this way)
* Bug fixes:
* Fix a bug in `uint256_unsigned_div_rem` which allowed a malicious prover to return a wrong result. Contracts using this function or any other function which uses it (`uint256_signed_div_rem` or `uint256_shr` for the standard library) should be recompiled & redeployed with version >= 0.10.0.
* Fix a bug in the secp signature verification code that allowed a malicious prover to ignore the value of `v` (this does not let the prover fake a signature, but allows it to claim that a valid signature is invalid).
* Add Cairo code for the recursive STARK verifier
Technical changes:
* Move from `python3.7` to `python3.9`