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
andinterface
. 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 toschemars
. This crate expands onschemars
and provides us with traitQueryResponses
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.