# we-cdk
we-cdk [](https://crates.io/crates/we-cdk)
cargo-we [](https://crates.io/crates/cargo-we)
Toolkit for development WASM smart-contracts on Waves Enterprise ecosystem.
## Usage
A prerequisite for compiling smart contracts is to have Rust and Cargo installed. Here's [an installation guide](https://doc.rust-lang.org/cargo/getting-started/installation.html).
To work with the contract it is necessary to install `cargo-we`. It's a CLI tool which helps set up and manage WASM smart contracts.
```
cargo install cargo-we --force
```
Use the `--force` to ensure you are updated to the most recent `cargo-we` version.
And there is also an option to install the CLI tool from this project folder.
```
cargo install --path ./crates/cargo-we/ --force
```
In order to initialize a new project you can use:
```
cargo we new flipper
```
This will create a folder `flipper` in your work directory.
The folder contains a scaffold `Cargo.toml` and a `lib.rs`, which both contain the necessary building blocks for using WASM smart-contract.
The `lib.rs` contains our hello world contract ‒ the `Flipper`, which we explain in the next section.
In order to build the contract just execute this command in the `flipper` folder:
```
cargo we build
```
As a result you'll get a `target/we/flipper.wasm` file and a `flipper.json` file in the `target/we` folder of your contract.
## Create & Update contract
With `cargo-we` can also send `CreateContract` and `UpdateContract` transactions directly to a network node.
To do this, create a file with a description of access to the node and the transaction to be sent.
To send a transaction, all you need to do is execute the command:
```
cargo we tx --send <path_json>
```
Example JSON file:
```json
{
"nodeUrl": "http://localhost:6862",
"apiKey": "we",
"transaction": {
"type" : 103,
"version" : 7,
"sender" : "3NA9hBGoVPfJVybremiFgWN8REi9oiDydEF",
"password": "",
"contractName": "flipper",
"params": [
{
"type": "boolean",
"key": "init_value",
"value": false
}
],
"isConfidential": false,
"fee" : 100000000,
"payments" : [ ],
"feeAssetId" : null,
"validationPolicy" : {
"type": "any"
},
"groupOwners" : [ ],
"groupParticipants" : [ ]
}
}
```
## Hello, World! ‒ The Flipper
The `Flipper` contract is a simple contract containing only a single `bool` value.
It provides method flip its value from `true` to `false` (and vice versa).
Below you can see the code using CDK.
```rust
#![no_std]
#![no_main]
use we_cdk::*;
// Declaring a function available for calling.
// `#[action]` keyword is used for this purpose.
// _constructor mandatory method that is called during CreateContract Transaction.
#[action]
fn _constructor(init_value: Boolean) {
// Write the obtained value as an argument of the function into contract state.
set_storage!(boolean :: "value" => init_value);
}
#[action]
fn flip() {
// Read the value from the contract state.
let value: Boolean = get_storage!(boolean :: "value");
// Write the inverted value to the contract state.
set_storage!(boolean :: "value" => !value);
}
```