Trang chủ » blog » How to Create an ERC20 Token the Simple Way

How to Create an ERC20 Token the Simple Way

The goal of this article is to demonstrate how to create an ERC20 nominal in deoxyadenosine monophosphate fiddling time as potential .
Let ’ s begin with the basics : What is an ERC20 nominal ?
In recent years, the ERC20 token stipulation has become the defacto standard for Ethereum tokens. In other words, most Ethereum contracts out there nowadays are ERC20-compliant. This article will detail how you can create your own Ethereum keepsake, but before we get started, let ’ s take a closer look at the ERC20 standard .
ERC20 token illustration

What makes ERC20 tokens so attractive and successful ? There are several factors in play :

  1. ERC20 tokens are simple and easy to deploy, as you will see in this tutorial.
  2. The ERC20 standard solves a significant problem, as blockchain-based marketplaces and crypto-wallets need a single, standardized set of commands to communicate with the range of tokens they manage. This includes interaction rules between different tokens, as well as token purchase rules.
  3. It was the first popular specification to offer Ethereum token standardization. It was not by any means the first, but thanks to its popularity, it quickly became the industry standard.

just like early Ethereum tokens, ERC20 tokens are implemented as smart contracts and executed on the Ethereum Virtual Machine ( EVM ) in a decentralized manner .

Solidity: the Smart Contract Programming Language

Ethereum bright contracts are written in Solidity. While there are alternative languages, barely anyone uses them for this purpose. Solidity is similar to JavaScript, so if you have some cognition of JavaScript, or even Java and other C-like languages, you should have no worry figuring out that a objet d’art of code in Solidity does, even before you actually master Solidity adequate to use it .
This is where the fun starts, as you should be able to start creating a simpleton ERC20 compress in no prison term. This is a aboveboard tax, simple enough that this article will demonstrate how you can write and deploy an ERC20 keepsake in under an hour .
The token we will be creating in this demonstration will be a bare-bones ERC20 execution, without excessively many bells and whistles. however, I have seen many similarly bare tokens in the very populace, and they tend to do quite well .

Overview of ERC20 Token Standard

What is ERC20?

Put merely, the ERC20 standard defines a set of functions to be implemented by all ERC20 tokens sol as to allow integration with other contracts, wallets, or marketplaces. This arrange of functions is quite short and basic .

function totalSupply() public view returns (uint256);
function balanceOf(address tokenOwner) public view returns (uint);
function allowance(address tokenOwner, address spender)
public view returns (uint);
function transfer(address to, uint tokens) public returns (bool);
function approve(address spender, uint tokens)  public returns (bool);
function transferFrom(address from, address to, uint tokens) public returns (bool);

ERC20 functions allow an external user, say a crypto-wallet app, to find out a exploiter ’ mho balance and transfer funds from one drug user to another with proper authority .
The smart condense defines two specifically define events :

event Approval(address indexed tokenOwner, address indexed spender,
 uint tokens);
event Transfer(address indexed from, address indexed to,
 uint tokens);

These events will be invoked or emitted when a user is granted rights to withdraw tokens from an account, and after the tokens are actually transferred .
In addition to standard ERC20 functions, many ERC20 tokens besides feature extra fields and some have become a de-facto share of the ERC20 standard, if not in writing then in practice. here are a few examples of such fields .

string public constant name;
string public constant symbol;
uint8 public constant decimals;

here are a few points regarding ERC20 and Solidity terminology :

  • A public function can be accessed outside of the contract itself
  • view basically means constant, i.e. the contract’s internal state will not be changed by the function
  • An event is Solidity’s way of allowing clients e.g. your application frontend to be notified on specific occurrences within the contract

Most Solidity linguistic process constructs should be clean if you already possess substantive Java/JavaScript skills .

Writing an ERC20 Token in Solidity

ERC20 tokens in solidity
now that we ’ ve outlined the basics and explained what it takes to create an ERC20 nominal, it is time to start writing some logic .
first, we need to define two map objects. This is the Solidity notion for an associative or key/value align :

mapping(address => uint256) balances;
mapping(address => mapping (address => uint256)) allowed;

The construction mapping(address => uint256) defines an associative array whose keys are of type address — a total used to denote score addresses, and whose values are of type uint256  — a 256-bit integer typically used to store token balances .
The first map aim, balances, will hold the nominal libra of each owner account .
The second function aim, allowed, will include all of the accounts approved to withdraw from a given report together with the withdrawal sum allowed for each .
As you can see, the value sphere of the admit map is by itself a mapping plotting account address to its approved withdrawal sum .
These mappings together with all early contract fields will be stored in the blockchain and will be mined resulting in changes being propagated to all net drug user nodes .
Blockchain repositing is expensive and users of your condense will need to pay for, one way or another. Therefore you should always try to minimize repositing size and writes into the blockchain .
immediately that we have the required datum structures in home, we can start to actually write the ERC20 logic into the allow functions .

Setting the Number of ICO Tokens

How do we set the number of ICO tokens ? well, there are a issue of ways of setting the maximal number of ICO tokens and this matter might be worth a drawn-out discussion by itself .
For the needs of our ECR20 tutorial, we shall use the simplest approach : Set the total come of tokens at sign creation time and initially assign all of them to the “ contract owner ” i.e. the history that deployed the smart contract :

uint256 totalSupply_;
constructor(uint256 total) public {
   totalSupply_ = total;
   balances[msg.sender] = _totalSupply;

A builder is a special function mechanically called by Ethereum good after the shrink is deployed. It is typically used to initialize the token ’ sulfur express using parameters passed by the contract ’ sulfur deploying bill .
msg is a ball-shaped variable declared and populated by Ethereum itself. It contains important data for performing the contract. The field we are using here : msg.sender contains the Ethereum report executing the current sign serve .
entirely the deploying bill can enter a contract ’ sulfur builder. When the condense is started up, this function allocates available tokens to the ‘ contract owner ’ account .

Get Total Token Supply

function totalSupply() public view returns (uint256) {
  return totalSupply_;

This function will return the number of all tokens allocated by this contract careless of owner .

Get Token Balance of Owner

function balanceOf(address tokenOwner) public view returns (uint) {
  return balances[tokenOwner];

balanceOf will return the stream nominal balance of an account, identified by its owner ’ s address .

Transfer Tokens to Another Account

function transfer(address receiver,
                 uint numTokens) public returns (bool) {
  require(numTokens <= balances[msg.sender]);
  balances[msg.sender] = balances[msg.sender] — numTokens;
  balances[receiver] = balances[receiver] + numTokens;
  emit Transfer(msg.sender, receiver, numTokens);
  return true;

As its list suggests, the transfer function is used to move numTokens sum of tokens from the owner ’ s balance to that of another drug user, or receiver. The transplant owner is msg.sender i.e. the one executing the affair, which implies that entirely the owner of the tokens can transfer them to others.

Solidity ’ south direction of asserting a predicate is require. In this case that the remove account has a sufficient balance to execute the transfer. If a require instruction fails, the transaction is immediately rolled back with no changes written into the blockchain .
right before exiting, the affair fires ERC20 event Transfer allowing registered listeners to react to its completion .

Approve Delegate to Withdraw Tokens

This function is most often used in a keepsake marketplace scenario .

function approve(address delegate,
                uint numTokens) public returns (bool) {
  allowed[msg.sender][delegate] = numTokens;
  emit Approval(msg.sender, delegate, numTokens);
  return true;

What approve does is to allow an owner i.e. msg.sender to approve a delegate explanation — possibly the marketplace itself — to withdraw tokens from his bill and to transfer them to other accounts .
As you can see, this function is used for scenarios where owners are offering tokens on a market. It allows the market to finalize the transaction without waiting for anterior approval .
At the end of its execution, this function fires an Approval event .

Get Number of Tokens Approved for Withdrawal

function allowance(address owner,
                  address delegate) public view returns (uint) {
  return allowed[owner][delegate];

This function returns the current approved total of tokens by an owner to a specific delegate, as set in the approve function .

Transfer Tokens by Delegate

The transferFrom serve is the peer of the approve function, which we discussed previously. It allows a delegate approved for withdrawal to transfer owner funds to a third-party account .

function transferFrom(address owner, address buyer,
                     uint numTokens) public returns (bool) {
  require(numTokens <= balances[owner]);
  require(numTokens <= allowed[owner][msg.sender]);
  balances[owner] = balances[owner] — numTokens;
  allowed[owner][msg.sender] =
        allowed[from][msg.sender] — numTokens;
  balances[buyer] = balances[buyer] + numTokens;
  Transfer(owner, buyer, numTokens);
  return true;

The two require statements at function startle are to verify that the transaction is legitimate, i.e. that the owner has enough tokens to transfer and that the delegate has approval for ( at least ) numTokens to withdraw .
In addition to transferring the numTokens sum from owner to buyer, this function besides subtracts numTokens from the delegate ’ second allowance. This basically allows a delegate with a given allowance to break it into several branch withdrawals, which is distinctive market behavior .
We could stop here and have a valid ERC20 implementation. however, we want to go a gradation further, as we want an industrial military capability token. This requires us to make our code a bite more secure, though we will still be able to keep the token relatively simple, if not basic .

SafeMath Solidity Library

SafeMath is a Solidity library aimed at dealing with one way hackers have been known to break contracts : integer bubble over attack. In such an approach, the hacker forces the contract to use wrong numeric values by passing parameters that will take the relevant integers past their maximal values .
Safemath library in Solidity: illustration
SafeMath protects against this by testing for overflow before performing the arithmetical natural process, therefore removing the danger of bubble over attack. The library is thus little that the impact on contract size is minimal, incurring no performance and little storage cost penalties .
Let ’ s add SafeMath to our code :

library SafeMath { // Only relevant functions
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
  assert(b <= a);
  return a — b;
function add(uint256 a, uint256 b) internal pure returns (uint256)   {
  uint256 c = a + b;
  assert(c >= a);
  return c;

SafeMath uses assert statements to verify the correctness of the authorize parameters. Should assert fail, the affair performance will be immediately stopped and all blockchain changes shall be rolled back .
following, let us add the following argument introducing the library to the Solidity compiler :
using SafeMath for uint256;
then, we replace the naive arithmetics we used at the beginning with SafeMath functions :

balances[msg.sender] = balances[msg.sender].sub(numTokens);
balances[receiver] = balances[receiver].add(numTokens);
balances[buyer] = balances[buyer].add(numTokens);
balances[owner] = balances[owner].sub(numTokens);

Packing it all Together

In Solidity, a smart contract ’ s functions and events are wrapped into an entity called a contract which you can mutely translate to a “ blockchain class. ” Below is the ERC20-compatible contract we created, including a kernel of our code. The name and symbol fields can be changed at will. Most token keep the decimal value at 18, so we will do the same .

Ethereum Contract Deployment

The time has come to deploy our narrow to the blockchain. Following deployment, our compress will be transferred to all nodes participating in the net. Any and all changes made to the contract will be propagated to all participating nodes .
Ethereum developers normally employ deployment tools such as Truffle. even Truffle is overkill for the limited needs of this article, and a simple on-line tool called Remix will suffice .
To use it, you will need to install the MetaMask plugin on your browser and a Rinkeby ( Ethereum test network ) report with at least some Rinkeby Ether in it. These are relatively simple steps, so we won ’ deoxythymidine monophosphate go into detail .
In lawsuit you don ’ t have either, read/write head over to MetaMask and Rinkeby for download links and to get clear installation and use directions .
now that we have all the build blocks in rate, we will head over to Remix and paste the code above, including the pragma line and the SafeMath library, into the on-line editor .
then, we will hop over to the moment tab to the right called “ Run ” and suction stop “ Deploy. ” A MetaMask popup will appear asking us to confirm the transaction. Of course, we ’ ll approve it .
image alt text

  • Green box: Make sure you’re on Rinkeby
  • Blue box: Set your total token supply
  • Red box: Deploy!

Gist : hypertext transfer protocol : // # file-basicerc20-sol
Congrats! You have barely deployed your first ERC20 keepsake, like a true Ethereum professional. As promised, the keepsake is simple and lightweight, however amply functional, ERC20 standard compliant, and secured with MathSafe. It is ready to be purchased, paid with, and transferred throughout the Blockchain.

Is that all there is to smart contracts?

No, not even close, as our brief demonstration barely scratches the open and deals entirely with one view of chic contract development .
smart contracts can be much more complex depending on your business logic, your model of the user interaction, whether or not you allow token mint and electrocution, lifecycle changes you introduce into the contract, the indigence for admin-level capabilities which normally comes with an admin-authorized set of functions, and so on. You get the picture .
silent, if you can replicate what we did here, that is a solid foundation to expand your cognition and move on to more complex contracts when necessary .

informant :
Category : Economy

Post navigation

Leave a Comment

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *