Smart Contract Tutorial (3) — CosmWasm

Jaher
Haderech_DEV
Published in
2 min readMay 3, 2022

There are several ways to create a smart contract on cosmos

  • Agoric Swingset : Javascript
  • CosmWasm : Rust
  • Ethermint : Solidity

In this tutorial, we will deploy contract on Local testnet by CosmWasm.

Run Local Testnet

Installation

$ git clone <https://github.com/CosmWasm/wasmd.git> && cd wasmd
$ git checkout v0.23.0
$ make install
$ CHAIN_ID="my-chain"
$ TXFLAG="--chain-id $CHAIN_ID --gas-prices 0.025stake --gas auto --gas-adjustment 1.3"

Initialize

$ wasmd init my-node --chain-id $CHAIN_ID
$ wasmd keys add main
$ wasmd keys add validator
$ wasmd add-genesis-account $(wasmd keys show main -a) 10000000000stake
$ wasmd add-genesis-account $(wasmd keys show validator -a) 10000000000stake
$ wasmd gentx validator 1000000000stake --chain-id $CHAIN_ID
$ wasmd collect-gentxs
$ wasmd validate-genesis
$ wasmd start

Deploy Contract

Get contract example & build

$ git clone <https://github.com/CosmWasm/cw-examples>
$ cd cw-examples
$ cd contracts/nameservice
$ RUSTFLAGS='-C link-arg=-s' cargo wasm
# Optimize to reduce gas
$ docker run --rm -v "$(pwd)":/code \\
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \\
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \\
cosmwasm/rust-optimizer:0.12.4

Upload contract

$ wasmd tx wasm store artifacts/cw_nameservice.wasm --from main $TXFLAG -y -b block

Check contract on chain

$ wasmd query wasm list-code
code_infos:
- code_id: "1"
creator: wasm1a4w3vwxa8zhy57nyy9kw7zhdasr4ue4wld0zpn
data_hash: DF3C9BC1341322810523AABCA28CC3FCDCA021C85061743967CE3D20F5580093
pagination: {}
# download wasm and diff with origin
$ CODE_ID=$(wasmd query wasm list-code --output json | jq -r '.code_infos[0].code_id')
$ wasmd query wasm code $CODE_ID download.wasm
$ diff artifacts/cw_nameservice.wasm download.wasm

Instantiate contract

$ INIT='{"purchase_price":{"amount":"100","denom":"stake"},"transfer_price":{"amount":"999","denom":"stake"}}'
$ wasmd tx wasm instantiate 1 "$INIT" --from main --chain-id my-chain --label "awesome name service" --no-admin
$ CONTRACT=$(wasmd query wasm list-contract-by-code $CODE_ID --output json | jq -r '.contracts[-1]')# check contract state
$ wasmd query wasm contract $CONTRACT
address: wasm14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s0phg4d
contract_info:
code_id: "1"
creator: wasm1a4w3vwxa8zhy57nyy9kw7zhdasr4ue4wld0zpn
label: awesome name service

Interacting with the contract

# purchase name
$ wasmd tx wasm execute $CONTRACT '{"register":{"name":"myName"}}' --amount 100stake --from main $TXFLAG -y
# query registered name
$ NAME_QUERY='{"resolve_record": {"name": "myName"}}'
$ wasmd query wasm contract-state smart $CONTRACT "$NAME_QUERY" --output json
{"data":{"address":"wasm1a4w3vwxa8zhy57nyy9kw7zhdasr4ue4wld0zpn"}}
# Transfer name to another account
$ TRANSFER='{"transfer":{"name":"myName","to":"wasm197wa2y42zp3sy84d8y4tkvztpuq5etqpq7q30h"}}'
$ wasmd tx wasm execute $CONTRACT --amount 1000stake --from main $TXFLAG
# you can find the owner address is changed
$ wasmd query wasm contract-state smart $CONTRACT "$NAME_QUERY" --output json
{"data":{"address":"wasm197wa2y42zp3sy84d8y4tkvztpuq5etqpq7q30h"}}

References

https://docs.cosmwasm.com/docs/1.0/
https://hub.cosmos.network/main/hub-tutorials/deploy-testnet.html
https://docs.rs/cosmwasm-std/latest/cosmwasm_std/

--

--