Create a Rust project

Smart contracts are Rust library crates. We will start with creating one:

$ cargo new --lib ./contract

You created a simple Rust library, but it is not yet ready to be a smart contract. The first thing to do is to update the Cargo.toml file:

[package]
name = "contract"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
cosmwasm-std = { version = "2.0.4", features = ["staking"] }
sylvia = "1.1.0"
schemars = "0.8.16"
cosmwasm-schema = "2.0.4"
serde = { version = "1.0.198", default-features = false, features = ["derive"] }

As you can see, I added a crate-type field for the library section. Generating the cdylib is required to create a proper web assembly binary. The downside of this is that such a library cannot be used as a dependency for other Rust crates - for now, it is not needed, but later we will show how to approach reusing contracts as dependencies.

Additionally, we added some core dependencies for smart contracts:

  • cosmwasm-std - Crate that is a standard library for smart contracts. It provides essential utilities for communication with the outside world, helper functions, and types. Every smart contract we will build will use this dependency.
  • sylvia - Crate, we will learn in this book. It provides us with three procedural macros: entry_points, contract and interface. I will expand on them later in the book.
  • schemars - Crate used to create JSON schema documents for our contracts. It is automatically derived on types generated by sylvia and will be later used to provide concise API for blockchain users, who might not be Rust developers.
  • cosmwasm-schema - Similar to schemars. This crate expands on schemars and provides us with trait QueryResponses which ties query variants to their responses. I will expand on that later in the book.
  • serde - Framework for serializing and deserializing Rust data structures efficiently and generically.