From b840341a77de76f5869ab15c9eb1204c26983880 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 4 Feb 2021 20:06:00 +0100 Subject: [PATCH] Remove the storage associated with decimals (#2502) * Removing the storage associated with decimals * changelog entry * changelog link to new issue number * Update contracts/token/ERC20/ERC20.sol Co-authored-by: Francisco Giordano * Update contracts/token/ERC20/ERC20.sol Co-authored-by: Francisco Giordano * Update CHANGELOG.md Co-authored-by: Francisco Giordano Co-authored-by: Francisco Giordano --- CHANGELOG.md | 1 + contracts/mocks/ERC20DecimalsMock.sol | 10 ++++++++-- contracts/token/ERC20/ERC20.sol | 25 ++++++------------------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdc5834e927..02dddae05a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * 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. * `Context`: making `_msgData` return `bytes calldata` instead of `bytes memory` ([#2492](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2492)) +* `ERC20`: Removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502)) ## 3.4.0 (2021-02-02) diff --git a/contracts/mocks/ERC20DecimalsMock.sol b/contracts/mocks/ERC20DecimalsMock.sol index 141daf758ab..ef48eb1da76 100644 --- a/contracts/mocks/ERC20DecimalsMock.sol +++ b/contracts/mocks/ERC20DecimalsMock.sol @@ -5,7 +5,13 @@ pragma solidity ^0.8.0; import "../token/ERC20/ERC20.sol"; contract ERC20DecimalsMock is ERC20 { - constructor (string memory name, string memory symbol, uint8 decimals) ERC20(name, symbol) { - _setupDecimals(decimals); + uint8 immutable private _decimals; + + constructor (string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) { + _decimals = decimals_; + } + + function decimals() public view virtual override returns (uint8) { + return _decimals; } } diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index 03515b92c87..9d0c2825ee0 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -38,13 +38,12 @@ contract ERC20 is Context, IERC20 { string private _name; string private _symbol; - uint8 private _decimals; /** - * @dev Sets the values for {name} and {symbol}, initializes {decimals} with - * a default value of 18. + * @dev Sets the values for {name} and {symbol}. * - * To select a different value for {decimals}, use {_setupDecimals}. + * The defaut value of {decimals} is 18. To select a different value for + * {decimals} you should overload it. * * All three of these values are immutable: they can only be set once during * construction. @@ -52,7 +51,6 @@ contract ERC20 is Context, IERC20 { constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; - _decimals = 18; } /** @@ -76,15 +74,15 @@ contract ERC20 is Context, IERC20 { * 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. + * Ether and Wei. This is the value {ERC20} uses, unless this function is + * overloaded; * * 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 virtual returns (uint8) { - return _decimals; + return 18; } /** @@ -283,17 +281,6 @@ contract ERC20 is Context, IERC20 { emit Approval(owner, spender, amount); } - /** - * @dev 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. - */ - function _setupDecimals(uint8 decimals_) internal virtual { - _decimals = decimals_; - } - /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning.