diff --git a/CHANGELOG.md b/CHANGELOG.md index c9b418e3f8a..ad10ef77e18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + + * `IERC20Metadata`: Add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561)) + ## Unreleased * Now targeting the 0.8.x line of Solidity compilers. For 0.6.x (resp 0.7.x) support, use version 3.4.0 (resp 3.4.0-solc-0.7) of OpenZeppelin. diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index c92df85a10e..edb5778bd57 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "./IERC20.sol"; +import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** @@ -29,7 +30,7 @@ import "../../utils/Context.sol"; * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ -contract ERC20 is Context, IERC20 { +contract ERC20 is Context, IERC20, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; @@ -56,7 +57,7 @@ contract ERC20 is Context, IERC20 { /** * @dev Returns the name of the token. */ - function name() public view virtual returns (string memory) { + function name() public view virtual override returns (string memory) { return _name; } @@ -64,7 +65,7 @@ contract ERC20 is Context, IERC20 { * @dev Returns the symbol of the token, usually a shorter version of the * name. */ - function symbol() public view virtual returns (string memory) { + function symbol() public view virtual override returns (string memory) { return _symbol; } @@ -81,7 +82,7 @@ contract ERC20 is Context, IERC20 { * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ - function decimals() public view virtual returns (uint8) { + function decimals() public view virtual override returns (uint8) { return 18; } diff --git a/contracts/token/ERC20/README.adoc b/contracts/token/ERC20/README.adoc index b8bfb00ca62..223208c8b84 100644 --- a/contracts/token/ERC20/README.adoc +++ b/contracts/token/ERC20/README.adoc @@ -10,6 +10,7 @@ TIP: For an overview of ERC20 tokens and a walk through on how to create a token There a few core contracts that implement the behavior specified in the EIP: * {IERC20}: the interface all ERC20 implementations should conform to. +* {IERC20Metadata}: the extended ERC20 interface including the <>, <> and <> functions. * {ERC20}: the implementation of the ERC20 interface, including the <>, <> and <> optional standard extension to the base interface. Additionally there are multiple custom extensions, including: @@ -36,6 +37,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel {{IERC20}} +{{IERC20Metadata}} + {{ERC20}} == Extensions diff --git a/contracts/token/ERC20/extensions/IERC20Metadata.sol b/contracts/token/ERC20/extensions/IERC20Metadata.sol new file mode 100644 index 00000000000..5bc7860695d --- /dev/null +++ b/contracts/token/ERC20/extensions/IERC20Metadata.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../IERC20.sol"; + +/** + * @dev Interface for the optional metadata functions from the ERC20 standard. + */ +interface IERC20Metadata is IERC20 { + /** + * @dev Returns the name of the token. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the symbol of the token. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +}