Create Counter project
This short tutorial walks you through a simple counter project that increments upon request using CUDOS Blast.
- Create a new folder for the Counter project and initialise Blast.
mkdir Counter
cd Counter
blast init
Success! Sample project initialized in /Users/username/projects/myCudosDapp
- Open the project in your preferred IDE
Explore your project
When you open the project you see something similar to below:
Let's walk through each section.
Workspaces
Inside the contracts
folder are alpha
and beta
folders.
These are 2 example workspaces to use if one contract depends on another for example.
Let's enter the alpha
folder.
/src
directory
The /src
directory contains the smart contract source code in different files.
src/contract.rs - This contains the main smart contract logic and is where the functions instantiate(), execute() and query() are implemented.
src/state.rs - This defines how the smart contract state data is represented and how it will be stored.
src/msg.rs - This is where different types of messages and responses the smart contract can receive and return are defined.
src/error.rs - This is where the different error types are defined that can be returned by the smart contract.
src/lib.rs is where any previous modules are exposed and made accessible.
/scripts
directory
The /scripts
directory contains sample scripts
deploy.js - This is a sample script to deploy a compiled contract to the blockchain.
interact.js - This is a sample script to interact with your deployed contract on the blockchain.
/tests
directory
The /tests
directory contains sample testing scripts
blast.config.js
file
The blast.config.js is where connections and contract deployments can be configured.
cargo.toml
file
The cargo.toml file must be at the root of the project in order to compile. An artifacts folder is generated after compilation.
State.rs - This is the starting state
Open /src/state.rs

The starting template has the following state:
a singleton struct State containing:
a 32-bit integer (count)
an address (owner) a segwit address
In addition, the derive
attribute is applied to implement some useful traits:
Serialize
: provides serialization
Deserialize
: provides deserialization
Clone
: makes our struct copyable
Debug
: enables our struct to be printed to string
PartialEq
: gives us equality comparison
JsonSchema
: auto-generates a JSON schema for us
Msg.rs - InstantiateMsg
Open /src/msg.rs
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
pub count: i32,
}
This is the message received when an address seeks to instantiate a contract with MsgInstantiateContract
.
The message provides the contract with an initial configuration and state.
src/contract.rs
contains the main smart contract logic and is where the functionsinstantiate()
,execute()
andquery()
are implemented.
Now, we understand the contract, let's compile it.