Skip to main content

Basic Contract

Each contract should be in its own crate. In a folder, create two files:

  • Cargo.toml: The manifest.
  • lib.rs: The default library file.

Inside the Cargo.toml you will need to specify parameters in the [package], [dependencies], [lib] type, and [features] sections:

[package]
name = "my_contract"
version = "0.1.0"
authors = ["Your Name <name@email.com>"]
edition = "2021"

[dependencies]
ink = { version = "4.3", default-features = false}
ink_metadata = { version = "4.3", features = ["derive"], optional = true }

scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] }
scale-info = { version = "2.5", default-features = false, features = ["derive"], optional = true }

[dev-dependencies]
ink_e2e = { version = "4.3" }

[lib]
path = "lib.rs"

[features]
default = ["std"]
std = [
"ink/std",
"scale/std",
"scale-info/std"
]
ink-as-dependency = []
e2e-tests = []

In the library file - ink! has a few minimum requirements:

  • #![cfg_attr(not(feature = "std"), no_std, no_main)] at the beginning of each contract file.
  • a module with #[ink::contract].
  • a (storage) struct - that can be empty - with #[ink(storage)].
  • at least one constructor with #[ink(constructor)].
  • at least one fn with #[ink(message)].

In the lib.rs the minimum implementation is:

#![cfg_attr(not(feature = "std"), no_std)]

#[ink::contract]
mod my_contract {

#[ink(storage)]
pub struct MyContract {}

impl MyContract {
#[ink(constructor)]
pub fn new() -> Self {
Self {}
}

#[ink(message)]
pub fn do_something(&self) {
()
}
}
}

The flipper smart contract is the most basic example provided by ink! team.