mirror of https://github.com/lukechilds/docs.git
Patrick Gray
4 years ago
committed by
Patrick Gray
3 changed files with 205 additions and 5 deletions
@ -0,0 +1,198 @@ |
|||
--- |
|||
title: Developing with Clarinet |
|||
description: Develop smart contracts locally with the Clarinet REPL and testing harness |
|||
--- |
|||
|
|||
## Introduction |
|||
|
|||
[Clarinet][] is a local Clarity runtime packaged as a command-line application. It's designed to facilitate rapid smart |
|||
contract development, testing, and deployment. Clarinet consists of a Clarity REPL and a testing harness, which, when |
|||
used together, allow you to rapidly develop and test a Clarity smart contract, without the need to deploy the contract |
|||
to a local mocknet or testnet. |
|||
|
|||
The local Clarity REPL is advantageous, because when learning Clarity or when developing a new smart contract, it's |
|||
useful to be able to exercise a contract without needing to wait for block times in a live blockchain. Clarinet allows |
|||
you to instantly initialize wallets and populate them with tokens, so that you can interactively or programmatically |
|||
test the behavior of the smart contract. Blocks are mined instantly, and you can control the number of blocks that |
|||
are mined between testing transactions. |
|||
|
|||
Clarinet is a useful tool for developing smart contracts, and should be used as part of a larger development strategy |
|||
that involves building and testing the contract locally, deploying the final draft contract to a testnet environment |
|||
and testing on a live blockchain, and deploying the final contract to the mainnet. |
|||
|
|||
## Installing Clarinet |
|||
|
|||
The best way to install Clarinet is through the Rust package manager, Cargo. If you have a working installation of |
|||
[Rust](https://www.rust-lang.org/tools/install), use the following command to install Clarinet. |
|||
|
|||
```sh |
|||
cargo install clarinet --locked |
|||
``` |
|||
|
|||
## Developing a Clarity smart contract |
|||
|
|||
Once you have installed Clarinet, you can begin a new Clarinet project with the command: |
|||
|
|||
```sh |
|||
clarinet new my-contract && cd my-project |
|||
``` |
|||
|
|||
This command creates a new directory and populates it with boilerplate configuration and testing files. The `toml` files |
|||
located in the `settings` directory control the Clarinet environment. For example, the `Development.toml` file contains |
|||
definitions for wallets in the local REPL environment, and their starting balances (in STX). |
|||
|
|||
```toml |
|||
... |
|||
[accounts.deployer] |
|||
mnemonic = "fetch outside black test wash cover just actual execute nice door want airport betray quantum stamp fish act pen trust portion fatigue scissors vague" |
|||
balance = 1_000_000 |
|||
|
|||
[accounts.wallet_1] |
|||
mnemonic = "spoil sock coyote include verify comic jacket gain beauty tank flush victory illness edge reveal shallow plug hobby usual juice harsh pact wreck eight" |
|||
balance = 1_000_000 |
|||
|
|||
[accounts.wallet_2] |
|||
mnemonic = "arrange scale orient half ugly kid bike twin magnet joke hurt fiber ethics super receive version wreck media fluid much abstract reward street alter" |
|||
balance = 1_000_000 |
|||
... |
|||
``` |
|||
|
|||
You can create a new contract in the project with the command: |
|||
|
|||
```sh |
|||
clarinet contract new my-contract |
|||
``` |
|||
|
|||
This command creates a new `my-contract.clar` file in the `contracts` directory, and a `my-contract_test.ts` in the |
|||
`test` directory. Additionally, it adds the contract to the `Clarinet.toml` configuration file. |
|||
|
|||
```toml |
|||
[contracts.my-contract] |
|||
path = "contracts/my-contract.clar" |
|||
depends_on = [] |
|||
``` |
|||
|
|||
At this point, you can begin editing your smart contract in the `contracts` directory. At any point while you are |
|||
developing, you can use the command `clarinet check` to check the syntax of your smart contract. |
|||
|
|||
## Testing with Clarinet |
|||
|
|||
Clarinet provides several powerful methods to test and interact with your smart contracts. As mentioned in the previous |
|||
section, you can always check your Clarity syntax using the `clarinet check` command. This validates any smart contracts |
|||
you are currently developing in the active project. |
|||
|
|||
There are two methods in Clarinet you can use to test smart contracts: the [console][], an interactive Clarity REPL, and |
|||
the [test harness][], a testing framework written in Typescript. |
|||
|
|||
### Testing with the console |
|||
|
|||
The Clarinet console is an interactive Clarity REPL that runs in-memory. Any contracts configured in the current project |
|||
are automatically loaded into memory. Additionally, wallets defined in the `settings/Development.toml` file are |
|||
initialized with STX tokens for testing purposes. When the console runs, it provides a summary of the deployed |
|||
contracts, their public functions, as well as wallet addresses and balances. |
|||
|
|||
``` |
|||
clarity-repl v0.11.0 |
|||
Enter "::help" for usage hints. |
|||
Connected to a transient in-memory database. |
|||
Initialized contracts |
|||
+-------------------------------------------------------+-------------------------+ |
|||
| Contract identifier | Public functions | |
|||
+-------------------------------------------------------+-------------------------+ |
|||
| ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE.my-contract | (echo-number (val int)) | |
|||
| | (say-hi) | |
|||
+-------------------------------------------------------+-------------------------+ |
|||
|
|||
Initialized balances |
|||
+------------------------------------------------------+---------+ |
|||
| Address | STX | |
|||
+------------------------------------------------------+---------+ |
|||
| ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE (deployer) | 1000000 | |
|||
+------------------------------------------------------+---------+ |
|||
| ST1J4G6RR643BCG8G8SR6M2D9Z9KXT2NJDRK3FBTK (wallet_1) | 1000000 | |
|||
+------------------------------------------------------+---------+ |
|||
... |
|||
``` |
|||
|
|||
You can use the `::help` command for valid console commands. |
|||
|
|||
``` |
|||
>> ::help |
|||
::help Display help |
|||
::list_functions Display all the native functions available in Clarity |
|||
::describe_function <function> Display documentation for a given native function fn-name |
|||
::mint_stx <principal> <amount> Mint STX balance for a given principal |
|||
::set_tx_sender <principal> Set tx-sender variable to principal |
|||
::get_assets_maps Get assets maps for active accounts |
|||
::get_costs <expr> Display the cost analysis |
|||
::get_contracts Get contracts |
|||
::get_block_height Get current block height |
|||
::advance_chain_tip <count> Simulate mining of <count> blocks |
|||
``` |
|||
|
|||
The console commands control the state of the REPL chain, and let you get information about it and advance the chain |
|||
tip. Additionally, you can enter Clarity commands into the console and observe the result of the command. The |
|||
`::list_functions` console command prints a cheat sheet of Clarity commands. For example, in the example contract, |
|||
you could use the REPL to call the `echo-number` function in the contract with the following command: |
|||
|
|||
``` |
|||
>> (contract-call? .my-contract echo-number 42) |
|||
(ok 42) |
|||
``` |
|||
|
|||
Note that by default commands are always executed as the `deployer` address, which means you can use the shorthand |
|||
`.my-contract` without specifying a full address to the contract. If you changed the transaction address with the |
|||
`::set_tx_sender` command, you would need to provide the full address to the contract in the contract call |
|||
(`ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE.my-contract`). |
|||
|
|||
You can refer to the [Clarity language reference][] for a complete overview of all Clarity functions. |
|||
|
|||
### Testing with the test harness |
|||
|
|||
The test harness is a Deno testing library that can simulate the blockchain, exercise functions of the contract, and |
|||
make testing assertions about the state of the contract or chain. |
|||
|
|||
You can run any tests configured in the `tests` directory with the command |
|||
|
|||
```sh |
|||
clarinet test |
|||
``` |
|||
|
|||
When you create a new contract, a test suite is automatically created for it. You can populate the test suite with |
|||
unit tests as you develop the contract. |
|||
|
|||
An example unit test for the `echo-number` function is provided below: |
|||
|
|||
```ts |
|||
Clarinet.test({ |
|||
name: 'the echo-number function returns the input value ok', |
|||
async fn(chain: Chain) { |
|||
const testNum = '42'; |
|||
let block = chain.mineBlock([ |
|||
Tx.contractCall( |
|||
'ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE.my-contract', |
|||
'echo-number', |
|||
[testNum], |
|||
'ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE' |
|||
), |
|||
]); |
|||
assertEquals(block.receipts.length, 1); // assert that the block received a single tx |
|||
assertEquals(block.receipts[0].result, `(ok ${testNum})`); // assert that the result of the tx was ok and the input number |
|||
assertEquals(block.height, 2); // assert that only a single block was mined |
|||
}, |
|||
}); |
|||
``` |
|||
|
|||
For more information on assertions, review [asserts][] in the Deno standard library. For more information on the available |
|||
Clarity calls in Deno, review the [Deno Clarity library][]. |
|||
|
|||
## Additional reading |
|||
|
|||
- [Clarinet README](https://github.com/hirosystems/clarinet#clarinet) |
|||
|
|||
[clarinet]: https://github.com/hirosystems/clarinet |
|||
[console]: #testing-with-the-console |
|||
[test harness]: #testing-with-the-test-harness |
|||
[clarity language reference]: http://localhost:3000/references/language-functions |
|||
[asserts]: https://deno.land/std@0.90.0/testing/asserts.ts |
|||
[Deno Clarity library]: https://deno.land/x/clarinet@v0.6.0/index.ts |
Loading…
Reference in new issue