123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- /**
- *Submitted for verification at Etherscan.io on 2021-12-20
- */
- // ----------------------------------------------------------------------------
- // MetaRare Contract
- // Name : MetaRare
- // Symbol : MTRA
- // Decimals : 18
- // InitialSupply : 300,000,000 MTRA
- // ----------------------------------------------------------------------------
- pragma solidity 0.5.8;
- interface IERC20 {
- function totalSupply() external view returns (uint256);
- function balanceOf(address account) external view returns (uint256);
- function transfer(address recipient, uint256 amount) external returns (bool);
- function allowance(address owner, address spender) external view returns (uint256);
- function approve(address spender, uint256 amount) external returns (bool);
- function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
- event Transfer(address indexed from, address indexed to, uint256 value);
- event Approval(address indexed owner, address indexed spender, uint256 value);
- }
- 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) {
- require(b <= a, "SafeMath: subtraction overflow");
- 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) {
- require(b > 0, "SafeMath: division by zero");
- uint256 c = a / b;
- return c;
- }
- function mod(uint256 a, uint256 b) internal pure returns (uint256) {
- require(b != 0, "SafeMath: modulo by zero");
- return a % b;
- }
- }
- contract ERC20 is IERC20 {
- using SafeMath for uint256;
- mapping (address => uint256) internal _balances;
- mapping (address => mapping (address => uint256)) private _allowances;
- uint256 private _totalSupply;
- function totalSupply() public view returns (uint256) {
- return _totalSupply;
- }
- function balanceOf(address account) public view returns (uint256) {
- return _balances[account];
- }
- function transfer(address recipient, uint256 amount) public returns (bool) {
- _transfer(msg.sender, recipient, amount);
- return true;
- }
- function allowance(address owner, address spender) public view returns (uint256) {
- return _allowances[owner][spender];
- }
- function approve(address spender, uint256 value) public returns (bool) {
- _approve(msg.sender, spender, value);
- return true;
- }
- function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
- _transfer(sender, recipient, amount);
- _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
- return true;
- }
- function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
- _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
- return true;
- }
- function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
- _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
- return true;
- }
- function _transfer(address sender, address recipient, uint256 amount) internal {
- require(sender != address(0), "ERC20: transfer from the zero address");
- require(recipient != address(0), "ERC20: transfer to the zero address");
- _balances[sender] = _balances[sender].sub(amount);
- _balances[recipient] = _balances[recipient].add(amount);
- emit Transfer(sender, recipient, amount);
- }
- function _mint(address account, uint256 amount) internal {
- require(account != address(0), "ERC20: mint to the zero address");
- _totalSupply = _totalSupply.add(amount);
- _balances[account] = _balances[account].add(amount);
- emit Transfer(address(0), account, amount);
- }
- function _burn(address owner, uint256 value) internal {
- require(owner != address(0), "ERC20: burn from the zero address");
- _totalSupply = _totalSupply.sub(value);
- _balances[owner] = _balances[owner].sub(value);
- emit Transfer(owner, address(0), value);
- }
- function _approve(address owner, address spender, uint256 value) internal {
- require(owner != address(0), "ERC20: approve from the zero address");
- require(spender != address(0), "ERC20: approve to the zero address");
- _allowances[owner][spender] = value;
- emit Approval(owner, spender, value);
- }
- function _burnFrom(address owner, uint256 amount) internal {
- _burn(owner, amount);
- _approve(owner, msg.sender, _allowances[owner][msg.sender].sub(amount));
- }
- }
- contract MetaRare is ERC20 {
- string public constant name = "MetaRare";
- string public constant symbol = "MTRA";
- uint8 public constant decimals = 18;
- uint256 public constant initialSupply = 300000000 * (10 ** uint256(decimals));
-
- constructor() public {
- super._mint(msg.sender, initialSupply);
- owner = msg.sender;
- }
- address public owner;
- event OwnershipRenounced(address indexed previousOwner);
- event OwnershipTransferred(
- address indexed previousOwner,
- address indexed newOwner
- );
- modifier onlyOwner() {
- require(msg.sender == owner, "Not owner");
- _;
- }
- function transferOwnership(address _newOwner) public onlyOwner {
- _transferOwnership(_newOwner);
- }
- function _transferOwnership(address _newOwner) internal {
- require(_newOwner != address(0), "Already Owner");
- emit OwnershipTransferred(owner, _newOwner);
- owner = _newOwner;
- }
- function transfer(
- address _to,
- uint256 _value
- )
- public
- returns (bool)
- {
- releaseLock(msg.sender);
- return super.transfer(_to, _value);
- }
- function transferFrom(
- address _from,
- address _to,
- uint256 _value
- )
- public
- returns (bool)
- {
- releaseLock(_from);
- return super.transferFrom(_from, _to, _value);
- }
- event Burn(address indexed burner, uint256 value);
- function burn(uint256 _value) public onlyOwner {
- require(_value <= super.balanceOf(owner), "Balance is too small.");
- _burn(owner, _value);
- emit Burn(owner, _value);
- }
- struct LockInfo {
- uint256 releaseTime;
- uint256 balance;
- }
- mapping(address => LockInfo[]) internal lockInfo;
- event Lock(address indexed holder, uint256 value, uint256 releaseTime);
- event Unlock(address indexed holder, uint256 value);
- function balanceOf(address _holder) public view returns (uint256 balance) {
- uint256 lockedBalance = 0;
- for(uint256 i = 0; i < lockInfo[_holder].length ; i++ ) {
- lockedBalance = lockedBalance.add(lockInfo[_holder][i].balance);
- }
- return super.balanceOf(_holder).add(lockedBalance);
- }
- function releaseLock(address _holder) internal {
- for(uint256 i = 0; i < lockInfo[_holder].length ; i++ ) {
- if (lockInfo[_holder][i].releaseTime <= now) {
- _balances[_holder] = _balances[_holder].add(lockInfo[_holder][i].balance);
- emit Unlock(_holder, lockInfo[_holder][i].balance);
- lockInfo[_holder][i].balance = 0;
- if (i != lockInfo[_holder].length - 1) {
- lockInfo[_holder][i] = lockInfo[_holder][lockInfo[_holder].length - 1];
- i--;
- }
- lockInfo[_holder].length--;
- }
- }
- }
- function lockCount(address _holder) public view returns (uint256) {
- return lockInfo[_holder].length;
- }
- function lockState(address _holder, uint256 _idx) public view returns (uint256, uint256) {
- return (lockInfo[_holder][_idx].releaseTime, lockInfo[_holder][_idx].balance);
- }
- function lock(address _holder, uint256 _amount, uint256 _releaseTime) public onlyOwner {
- require(super.balanceOf(_holder) >= _amount, "Balance is too small.");
- require(block.timestamp <= _releaseTime, "TokenTimelock: release time is before current time");
-
- _balances[_holder] = _balances[_holder].sub(_amount);
- lockInfo[_holder].push(
- LockInfo(_releaseTime, _amount)
- );
- emit Lock(_holder, _amount, _releaseTime);
- }
- function unlock(address _holder, uint256 i) public onlyOwner {
- require(i < lockInfo[_holder].length, "No lock information.");
- _balances[_holder] = _balances[_holder].add(lockInfo[_holder][i].balance);
- emit Unlock(_holder, lockInfo[_holder][i].balance);
- lockInfo[_holder][i].balance = 0;
- if (i != lockInfo[_holder].length - 1) {
- lockInfo[_holder][i] = lockInfo[_holder][lockInfo[_holder].length - 1];
- }
- lockInfo[_holder].length--;
- }
- function transferWithLock(address _to, uint256 _value, uint256 _releaseTime) public onlyOwner returns (bool) {
- require(_to != address(0), "wrong address");
- require(_value <= super.balanceOf(owner), "Not enough balance");
- require(block.timestamp <= _releaseTime, "TokenTimelock: release time is before current time");
- _balances[owner] = _balances[owner].sub(_value);
- lockInfo[_to].push(
- LockInfo(_releaseTime, _value)
- );
- emit Transfer(owner, _to, _value);
- emit Lock(_to, _value, _releaseTime);
- return true;
- }
- }
|