## The next generation
smart contract language for Ethereum

Create decentralized applications in a powerful, future-proof and statically typed language that is easy to learn.

Get started
Download v{{FE_VERSION}} for Linux
Download v{{FE_VERSION}} for Mac
Download v{{FE_VERSION}}

Fe is alpha software and not ready for production use!

### Beautiful and elegant

The syntax of Fe is inspired by Python and Rust. It is easy to learn, even for those who have never dealt with the EVM before. Fe is designed to be safe and equipped with the tooling needed to validate contracts.

### Simple yet powerful

Fe seeks to restrict dynamic behavior without limiting expressiveness. Features like constant generics let you write clean code without sacrificing compile-time guarantees.

### Future proof

Fe uses the same intermediate language as Solidity (YUL), making it a great choice not only for the Ethereum mainnet, but also for many of the upcoming Layer 2 solutions like the OVM.

Explore some advanced contracts written in Fe

See examples →

## The next generation smart contract language.

Fe is an evolving smart contract language that strives to make EVM development safer, simpler and more fun.

###
Static typing

Statically typed and equipped with a powerful compiler, Fe guides us to write robust code and avoid bugs.

###
Improved decidability

Fe limits dynamic program behavior to improve decidability and allow more precise gas cost estimation.

###
Standard library

Fe aspires to offer a rich standard library to assist with common tasks of smart contract development.

                          1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23

    # The `contract` keyword defines a new contract type
    contract GuestBook:
        # Strings are generic over a constant number
        # that restricts its maximum size
        messages: Map<address, String<100>>

        # Events can be defined on contract or module level
        event Signed:
            book_msg: String<100>

        pub fn sign(book_msg: String<100>):
            # All storage access is explicit using `self.<some-key>`
            self.messages[msg.sender] = book_msg

            # Emit the `Signed` event
            emit Signed(book_msg=book_msg)

        pub fn get_msg(addr: address) -> String<100>:
            # Copying data from storage to memory
            # has to be done explicitly via `to_mem()`
            return self.messages[addr].to_mem()

## Get involved

Fe is evolving at a rapid pace. Now is a great time to get involved with the next generation smart contract language.

##### Read the docs →

Learn to write Fe smart contracts

##### Check examples →

Explore advanced contracts written in Fe

##### Contribute →

Help improve Fe

##### Discuss →

Discuss and explore with the community