eth-erc20/solidity/GiftableToken.sol

104 lines
2.6 KiB
Solidity
Raw Permalink Normal View History

pragma solidity >0.6.11;
// SPDX-License-Identifier: GPL-3.0-or-later
contract GiftableToken {
address owner;
mapping(address => bool) minters;
2021-05-02 16:33:00 +02:00
// Implements ERC20
string public name;
2021-05-02 16:33:00 +02:00
// Implements ERC20
string public symbol;
2021-05-02 16:33:00 +02:00
// Implements ERC20
uint8 public decimals;
2021-05-02 16:33:00 +02:00
// Implements ERC20
uint256 public totalSupply;
2021-05-02 16:33:00 +02:00
// Implements ERC20
mapping (address => uint256) public balanceOf;
2021-05-02 16:33:00 +02:00
// Implements ERC20
2020-12-11 16:42:47 +01:00
mapping (address => mapping (address => uint256)) public allowance;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event TransferFrom(address indexed _from, address indexed _to, address indexed _spender, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
2021-05-02 16:33:00 +02:00
event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);
2020-12-06 17:39:47 +01:00
constructor(string memory _name, string memory _symbol, uint8 _decimals) public {
owner = msg.sender;
name = _name;
symbol = _symbol;
decimals = _decimals;
minters[msg.sender] = true;
}
2021-04-04 14:47:32 +02:00
function mintTo(address _to, uint256 _value) public returns (bool) {
require(minters[msg.sender]);
2021-04-04 14:47:32 +02:00
balanceOf[_to] += _value;
totalSupply += _value;
2021-05-02 16:33:00 +02:00
emit Mint(msg.sender, _to, _value);
return true;
}
function addMinter(address _minter) public returns (bool) {
require(msg.sender == owner);
minters[_minter] = true;
return true;
}
function removeMinter(address _minter) public returns (bool) {
require(msg.sender == owner || msg.sender == _minter);
minters[_minter] = false;
return true;
}
2021-05-02 16:33:00 +02:00
// Implements ERC20
function transfer(address _to, uint256 _value) public returns (bool) {
2020-12-06 17:37:50 +01:00
require(balanceOf[msg.sender] >= _value);
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
2021-05-02 16:33:00 +02:00
// Implements ERC20
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
2020-12-11 16:42:47 +01:00
require(allowance[_from][msg.sender] >= _value);
2020-12-06 17:37:50 +01:00
require(balanceOf[_from] >= _value);
2020-12-11 16:42:47 +01:00
allowance[_from][msg.sender] = allowance[_from][msg.sender] - _value;
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
emit TransferFrom(_from, _to, msg.sender, _value);
return true;
}
2021-05-02 16:33:00 +02:00
// Implements ERC20
function approve(address _spender, uint256 _value) public returns (bool) {
allowance[msg.sender][_spender] += _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
2021-05-02 16:33:00 +02:00
// Implements EIP165
function supportsInterface(bytes4 _sum) {
2021-05-02 16:33:00 +02:00
if (_sum == 0xc6bb4b70) { // ERC20
return true;
}
if (_sum == 0x449a52f8) { // Minter
return true;
}
if (_sum == 0x01ffc9a7) { // EIP165
return true;
}
return false;
}
}