First example of counter contract for Nil
This commit is contained in:
commit
7d7dad1e70
2 changed files with 86 additions and 0 deletions
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Literate examples for Nil
|
||||||
|
|
||||||
|
It's a collection of executable org-mode files that demonstrate how to write different kinds of smart contracts for Nil.
|
83
contracts.org
Normal file
83
contracts.org
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
#+title: Playing with smart contracts in org-mode
|
||||||
|
|
||||||
|
* Simple counter contract in Solidity
|
||||||
|
|
||||||
|
Nothing fancy really. A function to increment a value,
|
||||||
|
and a function to read a value.
|
||||||
|
|
||||||
|
#+name: simple_storage
|
||||||
|
#+begin_example solidity
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity ^0.8.0;
|
||||||
|
|
||||||
|
contract SimpleStorage {
|
||||||
|
int32 private value;
|
||||||
|
|
||||||
|
function increment() public {
|
||||||
|
value += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get() public view returns(int32) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
* Compile the contract
|
||||||
|
|
||||||
|
Using off-the-shelf ~solc~, the default Solidity compiler.
|
||||||
|
We feed in the code from the previous slide.
|
||||||
|
|
||||||
|
#+begin_src bash :var contract=simple_storage
|
||||||
|
mkdir -p contract
|
||||||
|
echo "$contract" | solc -o contract/ --bin --abi --overwrite -
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
* Initialize the config and create a wallet
|
||||||
|
|
||||||
|
Because without a wallet we are powerless.
|
||||||
|
|
||||||
|
#+name: wallet
|
||||||
|
#+begin_src bash
|
||||||
|
mkdir -p ~/.config/nil/
|
||||||
|
rm -rf ~/.config/nil/*
|
||||||
|
touch ~/.config/nil/config.yaml
|
||||||
|
|
||||||
|
nil_cli config set rpc_endpoint "http://127.0.0.1:8529" 2> /dev/null
|
||||||
|
nil_cli keygen new 2> /dev/null
|
||||||
|
nil_cli wallet new 2> /dev/null
|
||||||
|
|
||||||
|
wallet=$(nil_cli wallet info 2>&1 | grep -oP 'Address: \K\w+')
|
||||||
|
echo $wallet
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* Top-up the wallet
|
||||||
|
|
||||||
|
Gimme some tokens. Display new balance.
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
nil_cli wallet top-up 100000000 2> /dev/null
|
||||||
|
nil_cli wallet balance 2>&1 | grep -oP 'balance: \K\w+'
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* Deploy the contract
|
||||||
|
|
||||||
|
Save the address and reuse it later.
|
||||||
|
|
||||||
|
#+name: contract
|
||||||
|
#+begin_src bash
|
||||||
|
nil_cli wallet deploy ./contract/SimpleStorage.bin 2>&1 | grep -oP 'address: \K\w+'
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* Call the contract
|
||||||
|
|
||||||
|
Notice that we use ~$address~ from the previous execution of ~nil_cli~.
|
||||||
|
|
||||||
|
#+begin_src bash :var address=contract
|
||||||
|
nil_cli wallet send-message "$address" increment --abi ./contract/SimpleStorage.abi 2>&1 | grep -oP 'Transaction hash: \K\w+'
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src bash :var address=contract
|
||||||
|
nil_cli contract call-readonly "$address" get --abi ./contract/SimpleStorage.abi 2>&1 | grep -oP 'Call result: \K\w+'
|
||||||
|
#+end_src
|
Loading…
Reference in a new issue