ERC-20 Token Standard | ethereum.org
Mục lục bài viết
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
(
"===== %s ====="
%
symbol
)
48
(
"Total Supply:"
,
totalSupply
)
49
(
"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
(
"===== %s ====="
%
symbol
)
59
(
"Total Supply:"
,
totalSupply
)
60
(
"Addr Balance:"
,
addr_balance
)
61
Show all
Copy
Further reading
Was this article helpful?