41 lines
1.1 KiB
Solidity
41 lines
1.1 KiB
Solidity
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
pragma solidity ^0.6.0;
|
||
|
|
||
|
import "../../GSN/Context.sol";
|
||
|
import "./ERC20.sol";
|
||
|
|
||
|
/**
|
||
|
* @dev Extension of {ERC20} that allows token holders to destroy both their own
|
||
|
* tokens and those that they have an allowance for, in a way that can be
|
||
|
* recognized off-chain (via event analysis).
|
||
|
*/
|
||
|
abstract contract ERC20Burnable is Context, ERC20 {
|
||
|
/**
|
||
|
* @dev Destroys `amount` tokens from the caller.
|
||
|
*
|
||
|
* See {ERC20-_burn}.
|
||
|
*/
|
||
|
function burn(uint256 amount) public virtual {
|
||
|
_burn(_msgSender(), amount);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
|
||
|
* allowance.
|
||
|
*
|
||
|
* See {ERC20-_burn} and {ERC20-allowance}.
|
||
|
*
|
||
|
* Requirements:
|
||
|
*
|
||
|
* - the caller must have allowance for ``accounts``'s tokens of at least
|
||
|
* `amount`.
|
||
|
*/
|
||
|
function burnFrom(address account, uint256 amount) public virtual {
|
||
|
uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");
|
||
|
|
||
|
_approve(account, _msgSender(), decreasedAllowance);
|
||
|
_burn(account, amount);
|
||
|
}
|
||
|
}
|