@@ -10,6 +10,7 @@ import "../extension/Multicall.sol";
1010import "../extension/Ownable.sol " ;
1111import "../extension/PrimarySale.sol " ;
1212import "../extension/DropSinglePhase.sol " ;
13+ import "../extension/interface/IBurnableERC20.sol " ;
1314
1415import "../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 ();
0 commit comments