-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
94 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
{ | ||
"setup-environment": "Environment setup", | ||
"cw-contract": "CosmWasm Contract" | ||
"cw-contract": "CosmWasm Contract", | ||
"sylvia-contract": "Sylvia Contract" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# Sylvia contract writting tutorial | ||
|
||
This section is a step-by-step guide on how to write a Sylvia contract. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"contract-creation": "Contract creation" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
--- | ||
tags: ["tutorial", "sylvia"] | ||
--- | ||
|
||
import { Callout } from "nextra/components"; | ||
|
||
# Create a Rust project | ||
|
||
The easiest and recommended way to start working on a new [Sylvia](https://crates.io/crates/sylvia) | ||
contract is to generate it from the | ||
[`sylvia-template`](https://github.com/CosmWasm/sylvia-template). | ||
|
||
```shell copy filename="TERMINAL" | ||
cargo generate CosmWasm/sylvia-template | ||
``` | ||
|
||
The [`sylvia-template`](https://github.com/CosmWasm/sylvia-template) will generate a lot of code for | ||
you. Because this tutorial aims to guide you step-by-step through the process of creating your first | ||
contract we will omit the use of the template and show you how to create it from the start. | ||
|
||
## New project | ||
|
||
Smart contracts are Rust library crates. We will start with creating one: | ||
|
||
```shell copy filename="TERMINAL" | ||
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: | ||
|
||
```toml copy filename="Cargo.toml" | ||
[package] | ||
name = "contract" | ||
version = "0.1.0" | ||
edition = "2021" | ||
|
||
[lib] | ||
crate-type = ["cdylib"] | ||
|
||
[dependencies] | ||
sylvia = "1.3.1" | ||
``` | ||
|
||
<Callout> | ||
Notice lack of `cosmwasm-std` dependency. Sylvia reexports it as well as other necessary crates | ||
for CosmWasm smart contracts. You can find list of reexported crates in the | ||
[documentation](https://docs.rs/sylvia/latest/sylvia/#reexports). | ||
</Callout> | ||
|
||
As you can see, I added a `crate-type` field for the library section. Generating the | ||
[`cdylib`](https://doc.rust-lang.org/reference/linkage.html) 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](https://docs.rs/cosmwasm-std/latest/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](https://docs.rs/sylvia/latest/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](https://docs.rs/schemars/latest/schemars/index.html) - 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](https://docs.rs/cosmwasm-schema/latest/cosmwasm_schema/) - Similar to | ||
`schemars`. This crate expands on `schemars` and provides us with trait | ||
[`QueryResponses`](https://docs.rs/cosmwasm-schema/latest/cosmwasm_schema/trait.QueryResponses.html) | ||
which ties query variants to their responses. I will expand on that later in the book. | ||
- [serde](https://docs.rs/serde/latest/serde/) - Framework for serializing and deserializing Rust | ||
data structures efficiently and generically. |