2020-07-20 07:25:29 +00:00
<!--
2021-08-24 00:20:44 +00:00
order: 3
2020-07-20 07:25:29 +00:00
-->
2021-08-24 00:20:44 +00:00
# Truffle: Deploying a Smart Contract
2020-07-20 07:25:29 +00:00
2021-08-24 00:20:44 +00:00
Learn how to deploy a simple Solidity-based smart contract to Ethermint using the Truffle environment {synopsis}
2020-07-20 07:25:29 +00:00
## Pre-requisite Readings
- [Installation ](./../quickstart/installation.md ) {prereq}
- [Run a node ](./../quickstart/run_node.md ) {prereq}
2021-08-24 00:20:44 +00:00
[Truffle ](https://www.trufflesuite.com/truffle ) is a development framework for deploying and managing [Solidity ](https://github.com/ethereum/solidity ) smart contracts.
2020-07-20 07:25:29 +00:00
2021-08-24 00:20:44 +00:00
## Install Dependencies
2020-07-20 07:25:29 +00:00
First, install the latest Truffle version on your machine globally.
```bash
2020-09-22 08:09:11 +00:00
yarn install truffle -g
2020-07-20 07:25:29 +00:00
```
2021-08-24 00:20:44 +00:00
::: tip
If you haven't already, you will also need to install Ethermint if you plan on deploying your smart contracts locally. Check this [document ](./../../quickstart/installation.md ) for the full instructions.
:::
2020-07-20 07:25:29 +00:00
## Create Truffle Project
In this step we will create a simple counter contract. Feel free to skip this step if you already have your own compiled contract.
2021-08-24 00:20:44 +00:00
Create a new directory to host the contracts and initialize it:
2020-07-20 07:25:29 +00:00
2021-08-24 00:20:44 +00:00
```console
2020-07-20 07:25:29 +00:00
mkdir ethermint-truffle
cd ethermint-truffle
```
Initialize the Truffle suite with:
```bash
truffle init
```
Create `contracts/Counter.sol` containing the following contract:
```javascript
2021-08-24 00:20:44 +00:00
pragma solidity >=0.7.0 < 0.9.0 ;
2020-07-20 07:25:29 +00:00
contract Counter {
uint256 counter = 0;
function add() public {
counter++;
}
function subtract() public {
counter--;
}
function getCounter() public view returns (uint256) {
return counter;
}
}
```
Compile the contract using the `compile` command:
```bash
truffle compile
```
Create `test/counter_test.js` containing the following tests in Javascript using [Mocha ](https://mochajs.org/ ):
```javascript
const Counter = artifacts.require("Counter")
contract('Counter', accounts => {
const from = accounts[0]
let counter
before(async() => {
counter = await Counter.new()
})
it('should add', async() => {
await counter.add()
let count = await counter.getCounter()
assert(count == 1, `count was ${count}` )
})
})
```
## Truffle configuration
Open `truffle-config.js` and uncomment the `development` section in `networks` :
```javascript
development: {
2021-08-24 00:20:44 +00:00
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
2020-07-20 07:25:29 +00:00
},
```
This will allow your contract to connect to your Ethermint local node.
2021-08-03 17:35:31 +00:00
## Start Node
2020-07-20 07:25:29 +00:00
Start your local node using the following command on the Terminal
```bash
2021-08-24 00:20:44 +00:00
# from the ~/ethermint/ directory
$ init.sh
2020-07-20 07:25:29 +00:00
```
::: tip
2021-08-24 00:20:44 +00:00
For further information on how to run a node, please refer to the [quickstart guide ](./../../quickstart/run_node.md ).
2020-07-20 07:25:29 +00:00
:::
## Deploy contract
2021-08-24 00:20:44 +00:00
In the Truffle terminal, migrate the contract using:
2020-07-20 07:25:29 +00:00
```bash
truffle migrate --network development
```
2021-08-03 17:35:31 +00:00
You should see incoming deployment logs in the Ethermint daemon Terminal tab for each transaction (one to deploy `Migrations.sol` and the other to deploy `Counter.sol` ).
2020-07-20 07:25:29 +00:00
```bash
2021-08-24 00:20:44 +00:00
$ I[2020-07-15|17:35:59.934] Added good transaction module=mempool tx=22245B935689918D332F58E82690F02073F0453D54D5944B6D64AAF1F21974E2 res="& {CheckTx:log:\"[]\" gas_wanted:6721975 }" height=3 total=1
2020-07-20 07:25:29 +00:00
I[2020-07-15|17:36:02.065] Executed block module=state height=4 validTxs=1 invalidTxs=0
I[2020-07-15|17:36:02.068] Committed state module=state height=4 txs=1 appHash=76BA85365F10A59FE24ADCA87544191C2D72B9FB5630466C5B71E878F9C0A111
I[2020-07-15|17:36:02.981] Added good transaction module=mempool tx=84516B4588CBB21E6D562A6A295F1F8876076A0CFF2EF1B0EC670AD8D8BB5425 res="& {CheckTx:log:\"[]\" gas_wanted:6721975 }" height=4 total=1
```
## Run Truffle tests
Now, you can run the Truffle tests using the Ethermint node using the `test` command:
```bash
2021-08-24 00:20:44 +00:00
$ truffle test --network development
2020-07-20 07:25:29 +00:00
Using network 'development'.
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Contract: Counter
✓ should add (5036ms)
1 passing (10s)
```