ERC20
Inherits: IERC20
State Variables
ERC20TOKEN_ERC1820_INTERFACE_ID
bytes32 private constant ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256("ERC20Token");
_balances
mapping(address => uint256) internal _balances;
_allowances
mapping(address => mapping(address => uint256)) internal _allowances;
_totalSupply
uint256 internal _totalSupply;
_name
string internal _name;
_symbol
string internal _symbol;
_decimals
uint8 internal _decimals;
Functions
constructor
Sets the values for name and {symbol}, initializes {decimals} with a default value of 18. To select a different value for {decimals}, use {_setupDecimals}. All three of these values are immutable: they can only be set once during construction.
constructor(string memory name_, string memory symbol_, uint8 decimals_);
name
Returns the name of the token.
function name() public view returns (string memory);
symbol
Returns the symbol of the token, usually a shorter version of the name.
function symbol() public view returns (string memory);
decimals
Returns the number of decimals used to get its user representation.
For example, if decimals
equals 2
, a balance of 505
tokens should
be displayed to a user as 5,05
(505 / 10 ** 2
).
Tokens usually opt for a value of 18, imitating the relationship between
Ether and Wei. This is the value ERC20 uses, unless {_setupDecimals} is
called.
NOTE: This information is only used for display purposes: it in
no way affects any of the arithmetic of the contract, including
{IERC20-balanceOf} and {IERC20-transfer}.
function decimals() public view returns (uint8);
totalSupply
See IERC20-totalSupply.
function totalSupply() public view override returns (uint256);
balanceOf
See IERC20-balanceOf.
function balanceOf(address account) public view virtual override returns (uint256);
transfer
*See IERC20-transfer. Requirements:
recipient
cannot be the zero address.- the caller must have a balance of at least
amount
.*
function transfer(address recipient, uint256 amount) public virtual override returns (bool);
allowance
See IERC20-allowance.
function allowance(address owner, address spender) public view virtual override returns (uint256);
approve
*See IERC20-approve. Requirements:
spender
cannot be the zero address.*
function approve(address spender, uint256 amount) public virtual override returns (bool);
transferFrom
*See IERC20-transferFrom. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements:
sender
andrecipient
cannot be the zero address.sender
must have a balance of at leastamount
.- the caller must have allowance for
sender
's tokens of at leastamount
.*
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool);
increaseAllowance
*Atomically increases the allowance granted to spender
by the caller.
This is an alternative to approve that can be used as a mitigation for
problems described in {IERC20-approve}.
Emits an {Approval} event indicating the updated allowance.
Requirements:
spender
cannot be the zero address.*
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool);
decreaseAllowance
*Atomically decreases the allowance granted to spender
by the caller.
This is an alternative to approve that can be used as a mitigation for
problems described in {IERC20-approve}.
Emits an {Approval} event indicating the updated allowance.
Requirements:
spender
cannot be the zero address.spender
must have allowance for the caller of at leastsubtractedValue
.*
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool);
_transfer
*Moves tokens amount
from sender
to recipient
.
This is internal function is equivalent to transfer, and can be used to
e.g. implement automatic token fees, slashing mechanisms, etc.
Emits a {Transfer} event.
Requirements:
sender
cannot be the zero address.recipient
cannot be the zero address.sender
must have a balance of at leastamount
.*
function _transfer(address sender, address recipient, uint256 amount) internal virtual;
_mint
*Creates amount
tokens and assigns them to account
, increasing
the total supply.
Emits a {Transfer} event with from
set to the zero address.
Requirements:
to
cannot be the zero address.*
function _mint(address account_, uint256 ammount_) internal virtual;
_burn
*Destroys amount
tokens from account
, reducing the
total supply.
Emits a {Transfer} event with to
set to the zero address.
Requirements:
account
cannot be the zero address.account
must have at leastamount
tokens.*
function _burn(address account, uint256 amount) internal virtual;
_approve
*Sets amount
as the allowance of spender
over the owner
s tokens.
This internal function is equivalent to approve
, and can be used to
e.g. set automatic allowances for certain subsystems, etc.
Emits an {Approval} event.
Requirements:
owner
cannot be the zero address.spender
cannot be the zero address.*
function _approve(address owner, address spender, uint256 amount) internal virtual;
_beforeTokenTransfer
Sets decimals to a value other than the default one of 18. WARNING: This function should only be called from the constructor. Most applications that interact with token contracts will not expect {decimals} to ever change, and may work incorrectly if it does.
*Hook that is called before any transfer of tokens. This includes minting and burning. Calling conditions:
- when
from
andto
are both non-zero,amount
offrom
's tokens will be to transferred toto
. - when
from
is zero,amount
tokens will be minted forto
. - when
to
is zero,amount
offrom
's tokens will be burned. from
andto
are never both zero. To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*
function _beforeTokenTransfer(address from_, address to_, uint256 amount_) internal virtual;