This is a step-by-step tutorial on how to create a front end, deploy a Solidity smart contract, and connect them together. We will use Metamask, Remix IDE and Ethersjs.
By the end of this tutorial you will be able to create a simple HTML front end with buttons that can interact with smart contract functions. The tutorial takes place in 3 stages
- Create a basic html web page
- Create a basic solidity smart contract
- Connect the web page with the smart contracts using Ethersjs.
- Download and Install MetaMask
-
Never used Metamask? Watch this explainer video
The important bits for us are:
1:06 to 4:14
-
Change to the Ropsten Tesnet and get a Copy an account's wallet public address
-
-
Request some Ropsten Tesnet Ether from a faucet loaded into your Metamask Wallet.
-
Install a http server. Use any you like, but we recommend
lite-server
for beginners:- Install NPM (Download and Instructions)
- Install lite-server (with NPM in a terminal/command prompt):
npm install -g lite-server #install lite-server globally
The first step is to create a basic html page.
- Create a new folder (directory) in your terminal using
mkdir <directory name>
- In a code editor (e.g. atom, or visual studio), open the folder
- Create a new file called
index.html
- Open index.html
- Create html and body tags
<html>
<body>
</body>
</html>
We will create an app that simply reads and writes a value to the blockchain. We will need a label, an input, and buttons. 6. Inside the body tag, add some text, a label and input.
<body>
<h1>This is my dApp!</h1>
<p> Here we can set or get the mood: </p>
<label for="mood">Input Mood:</label> <br>
<input type="text" id="mood">
</body>
- Inside the body tag add some buttons.
<div>
<button onclick="getMood()"> get Mood </button>
</div>
<div>
<button onclick="setMood()"> set Mood</button>
</div>
-
Serve the webpage via terminal/command prompt from the directory that has
index.html
in it and run:lite-server
-
Go to http://127.0.0.1:3000/ in your browser to see your page!
-
Your front end is now complete!
Now it is time to create a solidity smart contract.
-
You can use any editor you like to make the contract. For this tutorial we recommend the online IDE [remix.ethereum.org]
- Never used remix before? Checkout This video
-
Go to remix.ethereum.org
-
Check out the "Solidity Compiler", and "Deploy and Run Transactions" tabs. If they are not present, enable them in the plugin manager
-
Create a new solidity file in remix, named
mood.sol
-
Write the contract
- Specify the solidity version
pragma solidity ^0.8.1;
- Define the contract
contract MoodDiary{ }
- Inside the contract create a variable called mood
string mood;
- Next, create Read and Write functions
//create a function that writes a mood to the smart contract function setMood(string memory _mood) public{ mood = _mood; } //create a function the reads the mood from the smart contract function getMood() public view returns(string memory){ return mood; }
- And that's it! your code like this
-
Deploy the contract on the Ropsten Testnet.
- Make sure your Metamask is connected to the Ropsten Testnet.
- Make sure you select the right compiler version to match the solidity contract. (In the compile tab)
- Compile the code using the "Solidity Compiler" tab. Note that it may take a moment to load the compiler
- Deploy the contract under the "Deploy and Run Transactions" tab
- Under the Deployed Contracts section, you can test out your functions on the Remix Run tab to make sure your contract works as expected!
<script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>
Be sure to deploy on Ropsten via Remix under the Injected Web3
environment and confirm the deployment transaction in Metamask
Make a new temporary file to hold:
- The deployed contract's address
- Copy it via the copy button next to the deployed contracts pulldown in remix's Run tab
- The contract ABI (what is that?)
- Copy it via the copy button under to the contract in remix's Compile tab (also in Details)
Back in your local text editor in index.html
, add the following code to your html page:
- Import the Ethersjs source into your
index.html
page inside a new set of script tags:
<script charset="utf-8"
src="https://cdn.ethers.io/scripts/ethers-v4.min.js"
type="text/javascript">
</script>
<script
////////////////////
//ADD YOUR CODE HERE
////////////////////
</script>
- Inside a new script tag, ensure ethereum is enabled:
window.ethereum.enable();
- Now, define an ethers provider. In our case it is Ropsten:
var provider = new ethers.providers.Web3Provider(web3.currentProvider,'ropsten');
- Import the contract ABI (what is that?) and specify the contract address on our provider's blockchain:
var MoodContractAddress = "<contract address>";
var MoodContractABI = <contract ABI>
var MoodContract
var signer
- Connect the signer to your metamask account (we use
[0]
as the defalut), and define the contract object using your contract address, ABI, and signer.
provider.listAccounts().then(function(accounts) {
signer = provider.getSigner(accounts[0]);
MoodContract = new ethers.Contract(MoodContractAddress, MoodContractABI, signer);
})
- Create asynchronous functions to call your smart contract functions
async function getMood(){
getMoodPromise = MoodContract.getMood();
var Mood = await getMoodPromise;
console.log(Mood);
}
async function setMood(){
let mood = document.getElementById("mood").value
setMoodPromise = MoodContract.setMood("patient");
await setMoodPromise;
}
- Connect your functions to your html buttons
<button onclick="getMood()"> get Mood </button>
<button onclick = "setMood()"> set Mood</button>
- Got your webserver up? Go to http://127.0.0.1:1337/ in your browser to see your page!
- Test your functions and approve the transactions as needed through Metamask. Note block times are ~15 seconds... so wait a bit to read the state of the blockchain 😎
- See your contract and transaction info via [https://ropsten.etherscan.io/]
- Open a console (
Ctrl + Shift + i
) in the browser to see see the magic happen as you press those buttons 🌠
Celebrate! You just made a webpage that interacted with a real live Ethereum testnet on the internet! That is not something many folks can say they have done! 🚀
git clone https://github.com/BlockDevsUnited/BasicFrontEndTutorial.git
cd BasicFrontEndTutorial
lite-server
Try and use the following information to interact with an existing contract we published on the Roptsen testnet:
-
We have a
MoodDiary
contract instance created at this transaction -
Here is the contract (on etherscan)
- We also verified our source code to ropsten.etherscan.io as an added measure for you to verify what the contract is exactly, and also the ABI is available to the world! 😁
-
The ABI is also in this file