# "Additive EOF" -- Fusaka Proposal *See also [EOF Fusaka Options](https://notes.ethereum.org/@ipsilon/eof_fusaka_options).* This proposal aims to improve the EVM by **adding valuable functionality** while **minimizing breakage**. It recognizes the most likely outcome that EOF will indefinitely coexist with Legacy EVM, and as a result **does not attempt to remove abilities** that EOF contracts would nonetheless be able to work around. ### General Arguments for EOF - Structured containers are a better foundation for tooling than unstructured bytecode and unreliable heuristics. - Structured control flow is significantly better for static analysis. - Stack and code validation at deploy time reduce EVM runtime overhead. - Higher level constructs (functions, subcontainers, data), relative jumps, and expanded stack access make compilers simpler and easier to implement. - Instructions with immediates can provide rich functionality efficiently. *(Some disagree that immediates require EOF.)* - Non-introspectable contract code grants more flexibility for VM upgrades. ### Selection Criteria for this Proposal - The upgrade should contribute to the benefits listed above. - Developers should be incentivized to migrate to EOF by improved tooling as a result of the upgrade. - Use and maintenance of Legacy code must remain viable. Existing libraries and tools should be able to support both Legacy and EOF in the medium term without too high a maintenance burden. - Compilers for high level languages (Solidity, Vyper) should be able to implement an EOF target in addition to the current Legacy target. - Contract code written for Legacy may require minimal changes to be compiled for EOF. - It should be possible to write contract libraries that (with a single codebase) can be compiled for both targets with equivalent semantics. - Legacy instructions/abilities may be made unavailable to EOF contracts only if they are not recoverable by dispatching to Legacy code, so that the effort has a real payoff. ### Specification #### Included - EIP-3540: EOF - EVM Object Format v1 - EIP-3670: EOF - Code Validation - Only banned instructions: `JUMP`, `JUMPI`, `PC`, `CODESIZE`, `CODECOPY` - EIP-4200: EOF - Static relative jumps - EIP-4750: EOF - Functions - EIP-5450: EOF - Stack Validation - EIP-6206: EOF - `JUMPF` and non-returning functions - EIP-7480: EOF - Data section access instructions - EIP-663: `SWAPN`, `DUPN` and `EXCHANGE` instructions - `EXCHANGE` could be excluded - EIP-7620: EOF - Contract Creation - EIP-7834: Separate Metadata Section for EOF - Nice to have but could be excluded - EIP-7873: EOF - TXCREATE and InitcodeTransaction type #### Excluded - Since gas introspection (`GAS` and `CALL` instructions) remain available: - EIP-7069: Revamped `CALL` instructions - EIP-5920: `PAY` opcode - Since `EXTCODECOPY/HASH` remain available: - EIP-7761: `EXTCODETYPE` instruction - EIP-7880: EOF - `EXTCODEADDRESS` instruction - EIP-7698: EOF - Creation transaction