컴파일러
0.8.7+commit.e28d00a7
파일 1 / 3 : ERC20Token.sol
pragma solidity ^0.8.0;
import '../libraries/SafeMath.sol';
contract ERC20Token {
using SafeMath for uint;
string public name;
string public symbol;
uint8 public decimals;
uint public totalSupply;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint)) public allowance;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
function _transfer(address from, address to, uint value) internal {
require(balanceOf[from] >= value, 'ERC20Token: INSUFFICIENT_BALANCE');
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
if (to == address(0)) {
totalSupply = totalSupply.sub(value);
}
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external returns (bool) {
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external returns (bool) {
require(allowance[from][msg.sender] >= value, 'ERC20Token: INSUFFICIENT_ALLOWANCE');
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
_transfer(from, to, value);
return true;
}
}
파일 2 / 3 : MomocoToken.sol
pragma solidity ^0.8.0;
import './modules/ERC20Token.sol';
contract MomocoToken is ERC20Token {
using SafeMath for uint;
uint public constant MAXSUPPLY = 1e26;
address public owner;
address public admin;
address public team;
uint public teamRate;
mapping (address => uint) public funds;
event OwnerChanged(address indexed _user, address indexed _old, address indexed _new);
event AdminChanged(address indexed _user, address indexed _old, address indexed _new);
event TeamChanged(address indexed _user, address indexed _old, address indexed _new);
event TeamRateChanged(address indexed _user, uint indexed _old, uint indexed _new);
event FundChanged(address indexed _user, uint indexed _old, uint indexed _new);
event Mint(address indexed from, address indexed to, uint value);
modifier onlyOwner() {
require(msg.sender == owner, 'forbidden');
_;
}
modifier onlyAdmin() {
require(msg.sender == admin || msg.sender == owner, "forbidden");
_;
}
modifier onlyTeam() {
require(msg.sender == team || msg.sender == owner, "forbidden");
_;
}
constructor() {
decimals = 18;
name = 'Momoco Token';
symbol = 'MOMOCO';
owner = msg.sender;
admin = msg.sender;
team = msg.sender;
}
function changeOwner(address _user) external onlyOwner {
require(owner != _user, 'no change');
emit OwnerChanged(msg.sender, owner, _user);
owner = _user;
}
function changeAdmin(address _user) external onlyAdmin {
require(admin != _user, 'no change');
emit AdminChanged(msg.sender, admin, _user);
admin = _user;
}
function changeTeam(address _user) external onlyTeam {
require(team != _user, 'no change');
emit TeamChanged(msg.sender, team, _user);
team = _user;
}
function changeTeamRate(uint _teamRate) external onlyAdmin {
require(teamRate != _teamRate, 'no change');
emit TeamRateChanged(msg.sender, teamRate, _teamRate);
teamRate = _teamRate;
}
function increaseFund (address _user, uint _value) public onlyAdmin {
require(_value > 0, 'zero');
uint _old = funds[_user];
funds[_user] = _old.add(_value);
emit FundChanged(msg.sender, _old, funds[_user]);
}
function decreaseFund (address _user, uint _value) public onlyAdmin {
uint _old = funds[_user];
require(_value > 0, 'zero');
require(_old >= _value, 'insufficient');
funds[_user] = _old.sub(_value);
emit FundChanged(msg.sender, _old, funds[_user]);
}
function increaseFunds (address[] calldata _users, uint[] calldata _values) external onlyAdmin {
require(_users.length == _values.length, 'invalid parameters');
for (uint i=0; i<_users.length; i++){
increaseFund(_users[i], _values[i]);
}
}
function decreaseFunds (address[] calldata _users, uint[] calldata _values) external onlyAdmin {
require(_users.length == _values.length, 'invalid parameters');
for (uint i=0; i<_users.length; i++){
decreaseFund(_users[i], _values[i]);
}
}
function _mint(address to, uint value) internal returns (bool) {
balanceOf[to] = balanceOf[to].add(value);
totalSupply = totalSupply.add(value);
require(totalSupply <= MAXSUPPLY, 'over max supply');
emit Transfer(address(this), to, value);
emit Mint(msg.sender, to, value);
return true;
}
function mint(address to, uint value) external returns (bool) {
require(funds[msg.sender] >= value, "fund insufficient");
funds[msg.sender] = funds[msg.sender].sub(value);
_mint(to, value);
if(value > 0 && teamRate > 0 && team != to) {
uint reward = value.div(teamRate);
_mint(team, reward);
}
return true;
}
function burn(uint value) external returns (bool) {
_transfer(msg.sender, address(0), value);
return true;
}
function take() public view returns (uint) {
return funds[msg.sender];
}
}
파일 3 / 3 : SafeMath.sol
pragma solidity >=0.6.0;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"contracts/MomocoToken.sol": "MomocoToken"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 1000000
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_old","type":"address"},{"indexed":true,"internalType":"address","name":"_new","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"uint256","name":"_old","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"FundChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_old","type":"address"},{"indexed":true,"internalType":"address","name":"_new","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_old","type":"address"},{"indexed":true,"internalType":"address","name":"_new","type":"address"}],"name":"TeamChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"uint256","name":"_old","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"TeamRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAXSUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"changeTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_teamRate","type":"uint256"}],"name":"changeTeamRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"decreaseFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"funds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"increaseFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"take","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]