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.
Beautiful and elegant
The syntax of Fe is largely inspired by 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. Equipped with traits and generics you write clean code without sacrificing compile-time guarantees.
Efficient
While currently YUL is used as IR, in the near future Fe will use the new LLVM-inspired compiler backend sonatina, which enables much more aggressive optimizations.
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.
// Structs can be emitted as events
struct Signed {
pub book_msg: String<100>
}
// 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>>
// Context is a struct provided by the standard library
// that gives access to various features of the EVM
pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
// All storage access is explicit using `self.<some-key>`
self.messages[ctx.msg_sender()] = book_msg
// Emit the `Signed` event.
ctx.emit(Signed(book_msg))
}
pub fn get_msg(self, 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.