Smart contract
// File: contracts/lib/SafeMath.sol
/*
Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0*/
pragma solidity 0.6.9;
/**
@title SafeMath
@author DODO Breeder
@notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; }
uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c;}
function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; }
function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } }
function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; }
function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; }
function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } }
// File: contracts/lib/InitializableOwnable.sol
/**
@title Ownable
@author DODO Breeder
@notice Ownership related functions */ contract InitializableOwnable { address public OWNER; address public NEW_OWNER; bool internal INITIALIZED;
// ============ Events ============
event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
// ============ Modifiers ============
modifier notInitialized() { require(!INITIALIZED, "DODO_INITIALIZED"); _; }
modifier onlyOwner() { require(msg.sender == OWNER, "NOT_OWNER"); _; }
// ============ Functions ============
function initOwner(address newOwner) public notInitialized { INITIALIZED = true; OWNER = newOwner; }
function transferOwnership(address newOwner) public onlyOwner { emit OwnershipTransferPrepared(OWNER, newOwner); NEW_OWNER = newOwner; }
function claimOwnership() public { require(msg.sender == NEW_OWNER, "INVALID_CLAIM"); emit OwnershipTransferred(OWNER, NEW_OWNER); OWNER = NEW_OWNER; NEW_OWNER = address(0); } }
// File: contracts/external/ERC20/CustomERC20.sol
contract CustomERC20 is InitializableOwnable { using SafeMath for uint256;
string public name; uint8 public decimals; string public symbol; uint256 public totalSupply; uint256 public tradeBurnRatio; uint256 public tradeFeeRatio; address public team; mapping(address => uint256) balances; mapping(address => mapping(address => uint256)) internal allowed; event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event ChangeTeam(address oldTeam, address newTeam); function init( address _creator, uint256 _totalSupply, string memory _name, string memory _symbol, uint8 _decimals, uint256 _tradeBurnRatio, uint256 _tradeFeeRatio, address _team ) public { initOwner(_creator); name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalSupply; balances[_creator] = _totalSupply; require(_tradeBurnRatio >= 0 && _tradeBurnRatio <= 5000, "TRADE_BURN_RATIO_INVALID"); require(_tradeFeeRatio >= 0 && _tradeFeeRatio <= 5000, "TRADE_FEE_RATIO_INVALID"); tradeBurnRatio = _tradeBurnRatio; tradeFeeRatio = _tradeFeeRatio; team = _team; emit Transfer(address(0), _creator, _totalSupply); } function transfer(address to, uint256 amount) public returns (bool) { _transfer(msg.sender,to,amount); return true; } function balanceOf(address owner) public view returns (uint256 balance) { return balances[owner]; } function transferFrom( address from, address to, uint256 amount ) public returns (bool) { require(amount <= allowed[from][msg.sender], "ALLOWANCE_NOT_ENOUGH"); _transfer(from,to,amount); allowed[from][msg.sender] = allowed[from][msg.sender].sub(amount); return true; } function approve(address spender, uint256 amount) public returns (bool) { allowed[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function allowance(address owner, address spender) public view returns (uint256) { return allowed[owner][spender]; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(balances[sender] >= amount, "ERC20: transfer amount exceeds balance"); balances[sender] = balances[sender].sub(amount); uint256 burnAmount; uint256 feeAmount; if(tradeBurnRatio > 0) { burnAmount = amount.mul(tradeBurnRatio).div(10000); balances[address(0)] = balances[address(0)].add(burnAmount); emit Transfer(sender, address(0), burnAmount); } if(tradeFeeRatio > 0) { feeAmount = amount.mul(tradeFeeRatio).div(10000); balances[team] = balances[team].add(feeAmount); emit Transfer(sender, team, feeAmount); } uint256 receiveAmount = amount.sub(burnAmount).sub(feeAmount); balances[recipient] = balances[recipient].add(receiveAmount); emit Transfer(sender, recipient, receiveAmount); } //=================== Ownable ====================== function changeTeamAccount(address newTeam) external onlyOwner { require(tradeFeeRatio > 0, "NOT_TRADE_FEE_TOKEN"); emit ChangeTeam(team,newTeam); team = newTeam; } function abandonOwnership(address zeroAddress) external onlyOwner { require(zeroAddress == address(0), "NOT_ZERO_ADDRESS"); emit OwnershipTransferred(_OWNER_, address(0)); _OWNER_ = address(0); }}
Last updated