/** * Source Code first verified at https://etherscan.io on Monday, March 18, 2019 (UTC) */ pragma solidity ^0.4.23; contract CoinBtgl // @eachvar { // ======== 初始化代币相关逻辑 ============== // 地址信息 address public admin_address = 0x2ae3c94a773595c9432892e8bb567ec200395221; // @eachvar address public account_address = 0x2ae3c94a773595c9432892e8bb567ec200395221; // @eachvar 初始化后转入代币的地址 // 定义账户余额 mapping(address => uint256) balances; // solidity 会自动为 public 变量添加方法,有了下边这些变量,就能获得代币的基本信息了 string public name = "Bitdog Coin"; // @eachvar string public symbol = "BTGL"; // @eachvar uint8 public decimals = 2; // @eachvar uint256 initSupply = 10000000000; // @eachvar uint256 public totalSupply = 0; // @eachvar // 生成代币,并转入到 account_address 地址 constructor() payable public { totalSupply = mul(initSupply, 10**uint256(decimals)); balances[account_address] = totalSupply; } function balanceOf( address _addr ) public view returns ( uint ) { return balances[_addr]; } // ========== 转账相关逻辑 ==================== event Transfer( address indexed from, address indexed to, uint256 value ); function transfer( address _to, uint256 _value ) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); balances[msg.sender] = sub(balances[msg.sender],_value); balances[_to] = add(balances[_to], _value); emit Transfer(msg.sender, _to, _value); return true; } // ========= 授权转账相关逻辑 ============= mapping (address => mapping (address => uint256)) internal allowed; event Approval( address indexed owner, address indexed spender, uint256 value ); function transferFrom( address _from, address _to, uint256 _value ) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = sub(balances[_from], _value); balances[_to] = add(balances[_to], _value); allowed[_from][msg.sender] = sub(allowed[_from][msg.sender], _value); emit Transfer(_from, _to, _value); return true; } function approve( address _spender, uint256 _value ) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function allowance( address _owner, address _spender ) public view returns (uint256) { return allowed[_owner][_spender]; } function increaseApproval( address _spender, uint256 _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = add(allowed[msg.sender][_spender], _addedValue); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } function decreaseApproval( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = sub(oldValue, _subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } // ========== 代码销毁相关逻辑 ================ event Burn(address indexed burner, uint256 value); function burn(uint256 _value) public { _burn(msg.sender, _value); } function _burn(address _who, uint256 _value) internal { require(_value <= balances[_who]); balances[_who] = sub(balances[_who], _value); totalSupply = sub(totalSupply, _value); emit Burn(_who, _value); emit Transfer(_who, address(0), _value); } // ============== admin 相关函数 ================== modifier admin_only() { require(msg.sender==admin_address); _; } function setAdmin( address new_admin_address ) public admin_only returns (bool) { require(new_admin_address != address(0)); admin_address = new_admin_address; return true; } // 虽然没有开启直投,但也可能转错钱的,给合约留一个提现口总是好的 function withDraw() public admin_only { require(address(this).balance > 0); admin_address.transfer(address(this).balance); } // ====================================== /// 默认函数 function () external payable { } // ========== 公用函数 =============== // 主要就是 safemath function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } }