Skip to content

Commit ddc540a

Browse files
Add interfaces to ERC20 base contracts (#371)
* add interfaces & add burnable extension * add burnable interface * add Burnable & Mintable interfaces * prettier
1 parent 8514b2f commit ddc540a

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

contracts/base/ERC20Base.sol

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import "../openzeppelin-presets/token/ERC20/extensions/ERC20Permit.sol";
88
import "../extension/ContractMetadata.sol";
99
import "../extension/Multicall.sol";
1010
import "../extension/Ownable.sol";
11+
import "../extension/interface/IMintableERC20.sol";
12+
import "../extension/interface/IBurnableERC20.sol";
1113

1214
/**
1315
* The `ERC20Base` smart contract implements the ERC20 standard.
@@ -24,7 +26,7 @@ import "../extension/Ownable.sol";
2426
* presenting a message signed by the account.
2527
*/
2628

27-
contract ERC20Base is ContractMetadata, Multicall, Ownable, ERC20Permit {
29+
contract ERC20Base is ContractMetadata, Multicall, Ownable, ERC20Permit, IMintableERC20, IBurnableERC20 {
2830
/*//////////////////////////////////////////////////////////////
2931
Constructor
3032
//////////////////////////////////////////////////////////////*/
@@ -62,6 +64,22 @@ contract ERC20Base is ContractMetadata, Multicall, Ownable, ERC20Permit {
6264
_burn(msg.sender, _amount);
6365
}
6466

67+
/**
68+
* @notice Lets an owner burn a given amount of an account's tokens.
69+
* @dev `_account` should own the `_amount` of tokens.
70+
*
71+
* @param _account The account to burn tokens from.
72+
* @param _amount The number of tokens to burn.
73+
*/
74+
function burnFrom(address _account, uint256 _amount) external virtual override {
75+
require(_canBurn(), "Not authorized to burn.");
76+
require(balanceOf(_account) >= _amount, "not enough balance");
77+
uint256 decreasedAllowance = allowance(_account, msg.sender) - _amount;
78+
_approve(_account, msg.sender, 0);
79+
_approve(_account, msg.sender, decreasedAllowance);
80+
_burn(_account, _amount);
81+
}
82+
6583
/*//////////////////////////////////////////////////////////////
6684
Internal (overrideable) functions
6785
//////////////////////////////////////////////////////////////*/
@@ -76,6 +94,11 @@ contract ERC20Base is ContractMetadata, Multicall, Ownable, ERC20Permit {
7694
return msg.sender == owner();
7795
}
7896

97+
/// @dev Returns whether tokens can be burned in the given execution context.
98+
function _canBurn() internal view virtual returns (bool) {
99+
return msg.sender == owner();
100+
}
101+
79102
/// @dev Returns whether owner can be set in the given execution context.
80103
function _canSetOwner() internal view virtual override returns (bool) {
81104
return msg.sender == owner();

contracts/base/ERC20Drop.sol

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import "../extension/Multicall.sol";
1010
import "../extension/Ownable.sol";
1111
import "../extension/PrimarySale.sol";
1212
import "../extension/DropSinglePhase.sol";
13+
import "../extension/interface/IBurnableERC20.sol";
1314

1415
import "../lib/CurrencyTransferLib.sol";
1516

@@ -33,7 +34,7 @@ import "../lib/CurrencyTransferLib.sol";
3334
*
3435
*/
3536

36-
contract ERC20Drop is ContractMetadata, Multicall, Ownable, ERC20Permit, PrimarySale, DropSinglePhase {
37+
contract ERC20Drop is ContractMetadata, Multicall, Ownable, ERC20Permit, PrimarySale, DropSinglePhase, IBurnableERC20 {
3738
/*//////////////////////////////////////////////////////////////
3839
Constructor
3940
//////////////////////////////////////////////////////////////*/
@@ -62,6 +63,22 @@ contract ERC20Drop is ContractMetadata, Multicall, Ownable, ERC20Permit, Primary
6263
_burn(msg.sender, _amount);
6364
}
6465

66+
/**
67+
* @notice Lets an owner burn a given amount of an account's tokens.
68+
* @dev `_account` should own the `_amount` of tokens.
69+
*
70+
* @param _account The account to burn tokens from.
71+
* @param _amount The number of tokens to burn.
72+
*/
73+
function burnFrom(address _account, uint256 _amount) external virtual override {
74+
require(_canBurn(), "Not authorized to burn.");
75+
require(balanceOf(_account) >= _amount, "not enough balance");
76+
uint256 decreasedAllowance = allowance(_account, msg.sender) - _amount;
77+
_approve(_account, msg.sender, 0);
78+
_approve(_account, msg.sender, decreasedAllowance);
79+
_burn(_account, _amount);
80+
}
81+
6582
/*//////////////////////////////////////////////////////////////
6683
Internal (overrideable) functions
6784
//////////////////////////////////////////////////////////////*/
@@ -114,6 +131,11 @@ contract ERC20Drop is ContractMetadata, Multicall, Ownable, ERC20Permit, Primary
114131
return msg.sender == owner();
115132
}
116133

134+
/// @dev Returns whether tokens can be burned in the given execution context.
135+
function _canBurn() internal view virtual returns (bool) {
136+
return msg.sender == owner();
137+
}
138+
117139
/// @dev Returns whether owner can be set in the given execution context.
118140
function _canSetOwner() internal view virtual override returns (bool) {
119141
return msg.sender == owner();

contracts/base/ERC20Vote.sol

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ pragma solidity ^0.8.0;
66
import "../openzeppelin-presets/token/ERC20/extensions/ERC20Votes.sol";
77

88
import "./ERC20Base.sol";
9+
import "../extension/interface/IMintableERC20.sol";
10+
import "../extension/interface/IBurnableERC20.sol";
911

1012
/**
1113
* The `ERC20Vote` smart contract implements the ERC20 standard and ERC20Votes.
@@ -24,7 +26,7 @@ import "./ERC20Base.sol";
2426
* presenting a message signed by the account.
2527
*/
2628

27-
contract ERC20Vote is ContractMetadata, Multicall, Ownable, ERC20Votes {
29+
contract ERC20Vote is ContractMetadata, Multicall, Ownable, ERC20Votes, IMintableERC20, IBurnableERC20 {
2830
/*//////////////////////////////////////////////////////////////
2931
Constructor
3032
//////////////////////////////////////////////////////////////*/
@@ -62,6 +64,22 @@ contract ERC20Vote is ContractMetadata, Multicall, Ownable, ERC20Votes {
6264
_burn(msg.sender, _amount);
6365
}
6466

67+
/**
68+
* @notice Lets an owner burn a given amount of an account's tokens.
69+
* @dev `_account` should own the `_amount` of tokens.
70+
*
71+
* @param _account The account to burn tokens from.
72+
* @param _amount The number of tokens to burn.
73+
*/
74+
function burnFrom(address _account, uint256 _amount) external virtual override {
75+
require(_canBurn(), "Not authorized to burn.");
76+
require(balanceOf(_account) >= _amount, "not enough balance");
77+
uint256 decreasedAllowance = allowance(_account, msg.sender) - _amount;
78+
_approve(_account, msg.sender, 0);
79+
_approve(_account, msg.sender, decreasedAllowance);
80+
_burn(_account, _amount);
81+
}
82+
6583
/*//////////////////////////////////////////////////////////////
6684
Internal (overrideable) functions
6785
//////////////////////////////////////////////////////////////*/
@@ -76,6 +94,11 @@ contract ERC20Vote is ContractMetadata, Multicall, Ownable, ERC20Votes {
7694
return msg.sender == owner();
7795
}
7896

97+
/// @dev Returns whether tokens can be burned in the given execution context.
98+
function _canBurn() internal view virtual returns (bool) {
99+
return msg.sender == owner();
100+
}
101+
79102
/// @dev Returns whether owner can be set in the given execution context.
80103
function _canSetOwner() internal view virtual override returns (bool) {
81104
return msg.sender == owner();

0 commit comments

Comments
 (0)