mirror of https://github.com/lukechilds/docs.git
6 changed files with 25 additions and 223 deletions
@ -1,175 +0,0 @@ |
|||
--- |
|||
layout: core |
|||
description: "Blockstack Clarity: Token Tutorial" |
|||
permalink: /:collection/:path.html |
|||
--- |
|||
# Tutorial: Token |
|||
|
|||
| Experience | | **Advanced** | |
|||
| Duration | | **30 minutes** | |
|||
|
|||
In this tutorial, you learn ... By the end of this tutorial, you will ... |
|||
|
|||
* |
|||
|
|||
## Overview |
|||
|
|||
* TOC |
|||
{:toc} |
|||
|
|||
<div class="uk-card uk-card-default uk-card-body"> |
|||
<h5>Early Release</h5> |
|||
<p>Clarity and its accompanying toolset are in early release. If you encounter issues with or have feature requests regarding Clarity, please create an issue on the <a href='https://github.com/blockstack/stacks-blockchain/issues' target='_blank'>blockstack/stacks-blockchain</a> repository. To read previous or join ongoing discussions about smart contracts in general and Clarity in particular, visit the <strong><a href='https://forum.blockstack.org/c/clarity' target='_blank'>Smart Contracts</a></strong> topic in the Blockstack Forum. |
|||
</p> |
|||
</div> |
|||
|
|||
## Pre-requisites |
|||
|
|||
Before you get started with this tutorial, you should complete the [Hello World](tutorial.html) and the [Counter](tutorial-counter.html) tutorials. |
|||
|
|||
## Step 1: Download token tutorial project |
|||
|
|||
1. Initialize a starter project with additional token tutorial files: |
|||
|
|||
```bash |
|||
npm init clarity-starter --token-tutorial |
|||
``` |
|||
|
|||
2. Confirm the new project name: |
|||
|
|||
```bash |
|||
? Project name (clarity-token-project) |
|||
``` |
|||
|
|||
## Step 2: Running tests |
|||
|
|||
Just like in the Counter tutorial, we will use test-driven development to implement our Token smart contract. Let's run the tests and review the results: |
|||
|
|||
1. Run the following command: |
|||
|
|||
```bash |
|||
npm test |
|||
``` |
|||
|
|||
You should see the following response: |
|||
|
|||
```bash |
|||
... |
|||
``` |
|||
|
|||
## Step 3: Developing the smart contract |
|||
|
|||
Let's get familiar with the tests to understand what the new smart contract should look like |
|||
|
|||
1. Take a quick look at the test file associated with the counter smart contract: |
|||
|
|||
```shell |
|||
cat test/counter.ts |
|||
``` |
|||
|
|||
You should be familiar with the test set up from the Hello World tutorial. Notice how the instance of the smart contract is created on line 8: |
|||
|
|||
```js |
|||
counterClient = new Client("SP3GWX3NE58KXHESRYE4DYQ1S31PQJTCRXB3PE9SB.counter", "sample/counter", provider); |
|||
``` |
|||
|
|||
That tells us that the new smart contract is named `counter` and that we need to start by creating a new file for the smart contract: `contracts/sample/counter.clar`. Note that the `contracts` folder is assumed as the base folder and that every Clarity file has the suffix `.clar`. |
|||
|
|||
2. Let's create the new file: |
|||
|
|||
```shell |
|||
touch contracts/sample/counter.clar |
|||
``` |
|||
|
|||
3. With the editor of your choice, open the file and add the following lines of code: |
|||
|
|||
```cl |
|||
(define-data-var counter int 0) |
|||
|
|||
(define-public (get-counter) |
|||
(ok (var-get counter)) |
|||
) |
|||
``` |
|||
|
|||
The first line initializes a new integer variable `counter` with the value set to `0` using the [`define-data-var`](https://docs.blockstack.org/core/smart/clarityref#define-data-var) statement. It is important to note that all definition statements in Clarity need to be at the top of the file. |
|||
|
|||
To provide access to the variable from outside of the current smart contract, we need to declare a public get method for this variable. The last lines of the code add a public `get-counter` method. The [`var-get`](https://docs.blockstack.org/core/smart/clarityref#var-get) statement looks for a variable in the contract's data map and returns it. |
|||
|
|||
With that, you are ready to rerun the tests! |
|||
|
|||
4. Run the tests and review the results: |
|||
|
|||
```shell |
|||
npm test |
|||
``` |
|||
|
|||
You should now only see 2 failing tests! `should start at zero` is passing, and you successfully build your first part of the contract. Congrats! |
|||
|
|||
However, we don't stop here. Let's implement increment and decrement methods. |
|||
|
|||
5. Add the following lines to the bottom of the `counter.clar` file and take a few seconds to review them: |
|||
|
|||
```cl |
|||
(define-public (increment) |
|||
(begin |
|||
(var-set counter (+ (var-get counter) 1)) |
|||
(ok (var-get counter)) |
|||
) |
|||
) |
|||
``` |
|||
|
|||
First, the [`begin`](https://docs.blockstack.org/core/smart/clarityref#begin) statement evaluates the multi-line expressions and returns the value of the last expression. In this case, it is used to set a new value and return the new value. |
|||
|
|||
Next, a [`var-set`](https://docs.blockstack.org/core/smart/clarityref#var-set) is used to set a new value for the `counter` variable. The new value is constructed using the [`+`](https://docs.blockstack.org/core/smart/clarityref#-add) (add) statement. This statement takes a number of integers and returns the result. Along with add, Clarity provides statements to subtract, multiply, and divide integers. Find more details in the [Clarity language reference](https://docs.blockstack.org/core/smart/clarityref). |
|||
|
|||
6. Finally, take a few minutes and implement a new public method `decrement` to subtract `1` from the `counter` variable. You should have all knowledge needed to succeed at this! |
|||
|
|||
Done? Great! Run the tests and make sure all of them are passing. You are looking for 7 successful tests: |
|||
|
|||
```shell |
|||
counter contract test suite |
|||
✓ should have a valid syntax |
|||
deploying an instance of the contract |
|||
✓ should start at zero |
|||
✓ should increment (95ms) |
|||
✓ should decrement (92ms) |
|||
|
|||
hello world contract test suite |
|||
✓ should have a valid syntax |
|||
deploying an instance of the contract |
|||
✓ should return 'hello world' |
|||
✓ should echo number |
|||
|
|||
|
|||
7 passing (518ms) |
|||
``` |
|||
|
|||
**Congratulations! You just implemented your first Clarity smart contract.** |
|||
|
|||
7. Here is how the final smart contract file should look like. Note that you can find the `decrement` method in here - in case you want to compare with your own implementation: |
|||
|
|||
```cl |
|||
(define-data-var counter int 0) |
|||
(define-public (increment) |
|||
(begin |
|||
(var-set counter (+ (var-get counter) 1)) |
|||
(ok (var-get counter)) |
|||
) |
|||
) |
|||
(define-public (decrement) |
|||
(begin |
|||
(var-set counter (- (var-get counter) 1)) |
|||
(ok (var-get counter)) |
|||
) |
|||
) |
|||
(define-public (get-counter) |
|||
(ok (var-get counter)) |
|||
) |
|||
``` |
|||
|
|||
## Where to go next |
|||
|
|||
{:.no_toc} |
|||
|
|||
* <a href="tutorial-token.html">Next tutorial: Writing a token management smart contract</a> |
|||
* <a href="clarityRef.html">Clarity language reference</a> |
Loading…
Reference in new issue