How to Create and Deploy an XRC20 Token Using Hardhat and TypeScript
Use TypeScript and Hardhat to deploy an XRC20 Token.
🧭 Table of contents
📰 Overview
Hardhat is a development environment to compile, deploy, test, and debug your Ethereum software. Get Solidity stack traces & console.log.
TypeScript is a strongly typed programming language that builds on TypeScript.
What you will learn
In this tutorial, you will learn how to set up Hardhat and use it to build, test, and deploy a XRC20 token on both the XDC Network mainnet and XDC Apothem testnet.
What you will do
Install and setup Hardhat
Create an XRC20 token
Compile the XRC20 token
Deploy the XRC20 token
Interact with the XRC20 token
Check the deployment status on xinfin.network
📰 About XRC20 Tokens
XRC20 is a set of rules to standardize assets on the XinFin network. Every XRC20 token must be able to execute the following methods:
totalSupply()
balanceOf(address account)
allowance(address owner, address spender)
transfer(address recipient, uint amount)
approve(address spender, uint amount)
transferFrom(address sender, address recipient, uint amount)
These are the minimum required methods that allow an asset on the XDC Network to be called an XRC20 token. Also, a XRC20 token must be able to emit the following Events
on the blockchain:
Approval(address indexed tokenOwner, address indexed spender, uint tokens)
Transfer(address indexed from, address indexed to, uint tokens)
Events come in handy in the exhaustive labor of indexing state changes, and they are essential for off-chain applications to find relevant data on the blockchain. By mapping all Transfer
events, for example, we can fetch all the historic data on token transfers more easily.
In addition, a few contract constants that are public that are also very important to have are:
name
symbol
decimals
Without these public constants, it would be impossible to label tokens on block explorers, for example. In this tutorial, we will deploy a XRC20 token that have all the Methods
, Events
, and Constants
mentioned above.
⚒ Starting a new Hardhat Project
There are a few technical requirements before we start. Please install the following:
Node.js v8+ LTS and npm (comes with Node)
Next, set up your folder. As we are creating a project called XRC20
, create a new XRC20
folder by running the following on terminal:
We can get started with Hardhat by running:
The following message will show on your console. Hit y
to continue or just press ENTER
:
The following message should log on your console:
Press ↓
and ENTER
to get started with a new TypeScript Hardhat Project. You will then be presented with the following options:
The standard Hardhat project comes with a pre-created Lock.sol
contract and deploy.ts
script. You should clean up your working environment before moving forward:
Your folder files will look like this:
⚒ Configuring XDC Mainnet and Apothem Testnet on Hardhat
In order to get started deploying new contracts on XDC Mainnet and/or Apothem, we need to install a new dependency called dotenv
that will be used in the hardhat.config.ts
file:
You will need to configure a .env
file with XDC Mainnet and Apothem Testnet RPC endpoints, plus the Private Key of the wallet we are using for deployment. Lets start by running:
Next, write the following info in your .env file:
🚨 Do not use the Private Key in the example above in production or you can risk losing your assets! 🚨
Finally, we can configure the hardhat.config.ts
file for both Apothem and XinFin Networks by writting:
⚒ Adding Testnet XDC to Development Wallet
Now check your Signer's address on Hardhat by accessing the Hardhat console:
If you get an error that hardhat is not installed locally and are running on a Windows OS, you will need to execute:
Once the hardhat console CLI opens, you can run:
This account is on the Ethereum standard format starting with 0x
, but you can simply switch 0x
for xdc
. In this example, our signer wallet address is: xdcA4e66f4Cc17752f331eaC6A20C00756156719519
.
With this account in hand, we can head to the Apothem Faucet and claim some TXDC for development purposes:
💵 Writing our first XRC20 Token
The source code for the XRC20 token used in this tutorial is available here: XRC20 Contract Folder. But we will address all Events
, Methods
, and Constants
mentioned in the section 📰 About XRC20 Tokens.
Start by creating the XRC20.sol
file:
Write the shell of your smart contract as shown here:
💵 Constants
Inside contract XRC20Token
, you will instantiate name
, symbol
and decimals
as public variables, as well as a private _totalSupply
that will be used on our totalSupply()
method later on. You will also have two mapping variables, balances
and allowances
, which are key/value variables that maps user balances and approved spending allowances to other users:
💵 Events
As mentioned in 📰 About XRC20 Tokens, events are very important part of a smart contract logic. Events have indexed
variables that are variables that can be filtered by off-chain interfaces. We might be tempted to index all the variables that are tied to an on-chain event, but Solidity has a maximum of 3 indexed variable limitation for events. Here is how you'll write both Approval
and Transfer
events:
💵 Methods
You'll need to create the six methods mentioned in 📰 About XRC20 Tokens (totalSupply
, balanceOf
, allowance
, transfer
, approve
and transferFrom
) and a constructor
that is a function used only once, when the contract is deployed, where we can attach information such as the token name, decimals and/or initial token supply:
Now, you have implemented everything necessary to make your token compliant with the XRC20 Standard. Of course, there are more features that you can implement to this contract, such as the SafeMath library that replace naive mathematical operations for methods that will avoid underflows
and overflows
, and supply management methods such as mint
and burn
.
💵 Compiling and Deploying
Now you can compile your XRC20.sol
by running:
If everything is correctly configured and there are no errors, you will see the following message on your console:
Your folder should look like this:
In order to deploy your newly-compiled contract artifacts to the blockchain, you'll need to create a deployment script into the script folder:
Next, you'll need to write the following script to the deploy.ts
file:
If the deployment script has no errors, you can go ahead and run the following command for deployment of the XDC Mainnet:
Or this command, for deployment of the XDC Apothem Testnet:
In either case, you must have enough funds to pay for gas fees on the address that is being used for development.
If the deployment is sucessful, the console should log the following message after migrations complete processing:
🔍 Veryfing Contracts on the Block Explorer
Once you have successfully deployed your smart contract to the blockchain, it might be interesting to verify you contract on XinFin Block Explorer.
Now grab the XRC20.sol
address from the previous step. This address is in the Ethereum standard, but you can simply swap the 0x
prefix for xdc
. After this prefix swap, search for our newly deployed contract on XinFin Block Explorer:
Click on the Verify And Publish
option.
You will be redirected to the contract verification page where you'll need to fill out:
Contract Name: XRC20Token
Compiler: Check your
hardhat-config.ts
file for Compiler VersionContract Code: Just paste everything from your
XRC20.sol
file
Once everything is filled out, press Submit!
If everything is correctly filled out, your contract page on the block explorer should display a new tab called Contract
:
🔍 Interacting with your contract on the Block Explorer
With your XDCPay wallet, it is possible to interact with verified Smart Contracts on the XinFin Network Block Explorer. You can read from, write to, or simply read the information tied to your Smart Contract on the blockchain.
Now head to the Contract
tab on the explorer, choose Write Contract
, and click in Connect to Web3
to connect your XDCPay wallet.
Try transfering 500 MTK
tokens that you have just created to a new wallet xdc0431d52fe37f3839895018272dfa3ba189fce07e
. Fill out the recipient
field with the new wallet address, and fill out the amout
field with 500 * 10 ^ 18
. Remember that your token has 18 decimals. When you write numbers to the blockchain you must to account for the decimals as the virtual machine does not understand floating numbers the way humans do:
After clicking in Write
, you'll need to confirm the transaction on the XDCPay wallet:
You can check your successful transaction on the Block Explorer!
For more information about Hardhat, Please Visit Hardhat Documentation. For more information about XinFin Network, Please Visit XDC Network Documentation on GitBook. Resources used during the deployment of the XRC20 Token can be found at XRC20 Contract Folder.
Last updated