ERC-20 Token Standard | ethereum.org

ERC-20 Token Standard

Last edit :

, Invalid DateTime

Edit page

(opens in a new tab)

Introduction

What is a Token?

Tokens can represent virtually anything in Ethereum:

  • reputation points in an online platform
  • skills of a character in a game
  • lottery tickets
  • financial assets like a share in a company
  • a fiat currency like USD
  • an ounce of gold
  • and more…

Such a powerful feature of Ethereum must be handled by a robust standard, right? That’s exactly
where the ERC-20 plays its role! This standard allows developers to build token applications that are interoperable with other products and services.

What is ERC-20?

The ERC-20 introduces a standard for Fungible Tokens, in other words, they have a property that makes each Token be exactly
the same (in type and value) as another Token. For example, an ERC-20 Token acts just like the ETH, meaning that 1 Token
is and will always be equal to all the other Tokens.

Prerequisites

Body

The ERC-20 (Ethereum Request for Comments 20), proposed by Fabian Vogelsteller in November 2015, is a Token Standard that
implements an API for tokens within Smart Contracts.

Example functionalities ERC-20 provides:

  • transfer tokens from one account to another
  • get the current token balance of an account
  • get the total supply of the token available on the network
  • approve whether an amount of token from an account can be spent by a third-party account

If a Smart Contract implements the following methods and events it can be called an ERC-20 Token Contract and, once deployed, it
will be responsible to keep track of the created tokens on Ethereum.

From EIP-20(opens in a new tab)↗:

Methods

1

function name() public view returns (string)

2

function symbol() public view returns (string)

3

function decimals() public view returns (uint8)

4

function totalSupply() public view returns (uint256)

5

function balanceOf(address _owner) public view returns (uint256 balance)

6

function transfer(address _to, uint256 _value) public returns (bool success)

7

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

8

function approve(address _spender, uint256 _value) public returns (bool success)

9

function allowance(address _owner, address _spender) public view returns (uint256 remaining)

10

Show all

📋

Copy

Events

1

event Transfer(address indexed _from, address indexed _to, uint256 _value)

2

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

3

📋

Copy

Examples

Let’s see how a Standard is so important to make things simple for us to inspect any ERC-20 Token Contract on Ethereum.
We just need the Contract Application Binary Interface (ABI) to create an interface to any ERC-20 Token. As you can
see below we will use a simplified ABI, to make it a low friction example.

Web3.py Example

First, make sure you have installed Web3.py(opens in a new tab)↗ Python library:

1

pip install web3

2

1

from

web3

import

Web3

2

3

4

w3

=

Web3

(

Web3

.

HTTPProvider

(

"https://cloudflare-eth.com"

)

)

5

6

dai_token_addr

=

"0x6B175474E89094C44Da98b954EedeAC495271d0F"

7

weth_token_addr

=

"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"

8

9

acc_address

=

"0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11"

10

11

12

13

simplified_abi

=

[

14

{

15

'inputs'

:

[

{

'internalType'

:

'address'

,

'name'

:

'account'

,

'type'

:

'address'

}

]

,

16

'name'

:

'balanceOf'

,

17

'outputs'

:

[

{

'internalType'

:

'uint256'

,

'name'

:

''

,

'type'

:

'uint256'

}

]

,

18

'stateMutability'

:

'view'

,

'type'

:

'function'

,

'constant'

:

True

19

}

,

20

{

21

'inputs'

:

[

]

,

22

'name'

:

'decimals'

,

23

'outputs'

:

[

{

'internalType'

:

'uint8'

,

'name'

:

''

,

'type'

:

'uint8'

}

]

,

24

'stateMutability'

:

'view'

,

'type'

:

'function'

,

'constant'

:

True

25

}

,

26

{

27

'inputs'

:

[

]

,

28

'name'

:

'symbol'

,

29

'outputs'

:

[

{

'internalType'

:

'string'

,

'name'

:

''

,

'type'

:

'string'

}

]

,

30

'stateMutability'

:

'view'

,

'type'

:

'function'

,

'constant'

:

True

31

}

,

32

{

33

'inputs'

:

[

]

,

34

'name'

:

'totalSupply'

,

35

'outputs'

:

[

{

'internalType'

:

'uint256'

,

'name'

:

''

,

'type'

:

'uint256'

}

]

,

36

'stateMutability'

:

'view'

,

'type'

:

'function'

,

'constant'

:

True

37

}

38

]

39

40

dai_contract

=

w3

.

eth

.

contract

(

address

=

w3

.

to_checksum_address

(

dai_token_addr

)

,

abi

=

simplified_abi

)

41

symbol

=

dai_contract

.

functions

.

symbol

(

)

.

call

(

)

42

decimals

=

dai_contract

.

functions

.

decimals

(

)

.

call

(

)

43

totalSupply

=

dai_contract

.

functions

.

totalSupply

(

)

.

call

(

)

/

10

**

decimals

44

addr_balance

=

dai_contract

.

functions

.

balanceOf

(

acc_address

)

.

call

(

)

/

10

**

decimals

45

46

47

print

(

"===== %s ====="

%

symbol

)

48

print

(

"Total Supply:"

,

totalSupply

)

49

print

(

"Addr Balance:"

,

addr_balance

)

50

51

weth_contract

=

w3

.

eth

.

contract

(

address

=

w3

.

to_checksum_address

(

weth_token_addr

)

,

abi

=

simplified_abi

)

52

symbol

=

weth_contract

.

functions

.

symbol

(

)

.

call

(

)

53

decimals

=

weth_contract

.

functions

.

decimals

(

)

.

call

(

)

54

totalSupply

=

weth_contract

.

functions

.

totalSupply

(

)

.

call

(

)

/

10

**

decimals

55

addr_balance

=

weth_contract

.

functions

.

balanceOf

(

acc_address

)

.

call

(

)

/

10

**

decimals

56

57

58

print

(

"===== %s ====="

%

symbol

)

59

print

(

"Total Supply:"

,

totalSupply

)

60

print

(

"Addr Balance:"

,

addr_balance

)

61

Show all

📋

Copy

Further reading

Was this article helpful?