pragma solidity ^0.4.23; // 0xf2bb016e8c9c8975654dcd62f318323a8a79d48e contract TrueTogetherToken { string public constant name = "TRUE Together Token"; //合约名称 string public constant symbol = "TTR"; // 合约符号 uint256 public constant decimals = 18; // 支持的最小单位 10^18 uint256 _totalSupply = 100000000 * 10 ** decimals; // 发行量 address public founder = 0x0; // founder地址 uint256 public voteEndTime; // 投票结束时间 uint256 airdropNum = 1 ether; // 空投数量 uint256 public distributed = 0; //分发的数量 mapping (address => bool) touched; // 是否已经改变了, 在空投的时候会用到 mapping (address => uint256) public balances; // 余额 mapping (address => uint256) public frozen; // 冻结的数量 mapping (address => uint256) public totalVotes; // 总票数 mapping (address => mapping (address => uint256)) public votingInfo; // 投票信息 mapping (address => mapping (address => uint256)) allowed; // 允许的数量 event Transfer(address indexed _from, address indexed _to, uint256 _value); event Vote(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); constructor() public { founder = msg.sender; voteEndTime = 1534348800; // 投票截止时间 2018-08-16 00:00:00 } function totalSupply() view public returns (uint256 supply) { return _totalSupply; // 发行量 } function balanceOf(address _owner) public returns (uint256 balance) { // 查询余额 // SafeMath.add(distributed, airdropNum) 相当于 distributed + airdropNum, SafeMath.add能避免溢出 // SafeMath.sub(a, b)相当于 a - b if (!touched[_owner] && SafeMath.add(distributed, airdropNum) < _totalSupply && now < voteEndTime) { touched[_owner] = true; // 修改 touched, 如果地址没 touched过, 发1个交易, touched过就不发交易了 distributed = SafeMath.add(distributed, airdropNum); balances[_owner] = SafeMath.add(balances[_owner], airdropNum); emit Transfer(this, _owner, airdropNum); // 发送1个token } return balances[_owner]; } function transfer(address _to, uint256 _value) public returns (bool success) { require (_to != 0x0); // 发送地址必须不等于0x0 if (now > voteEndTime) { // 截止日期已过 require((balances[msg.sender] >= _value)); // 检测地址余额必须大于等于发送的值 balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value); balances[_to] = SafeMath.add(balances[_to], _value); emit Transfer(msg.sender, _to, _value); return true; } else { // 没到截止日期 require(balances[msg.sender] >= SafeMath.add(frozen[msg.sender], _value)); // 地址余额必须大于等于(冻结的+要发送的值) balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value); balances[_to] = SafeMath.add(balances[_to], _value); emit Transfer(msg.sender, _to, _value); return true; } } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require (_to != 0x0); if (now > voteEndTime) { require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value); balances[_from] = SafeMath.sub(balances[_from], _value); balances[_to] = SafeMath.add(balances[_to], _value); emit Transfer(_from, _to, _value); return true; } else { require(balances[_from] >= SafeMath.add(frozen[_from], _value) && allowed[_from][msg.sender] >= _value); balances[_from] = SafeMath.sub(balances[_from], _value); balances[_to] = SafeMath.add(balances[_to], _value); emit Transfer(_from, _to, _value); return true; } } function approve(address _spender, uint256 _value) public returns (bool success) { // 批准 _spender 发送token allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function allowance(address _owner, address _spender) view public returns (uint256 remaining) { // 限额, 批准从本地转出一个最大特定数量的token return allowed[_owner][_spender]; } function distribute(address _to, uint256 _amount) public returns (bool success) { // 分发即空投 require(msg.sender == founder); require(SafeMath.add(distributed, _amount) <= _totalSupply); distributed = SafeMath.add(distributed, _amount); balances[_to] = SafeMath.add(balances[_to], _amount); touched[_to] = true; // 修改touched, 防止重复空投 emit Transfer(this, _to, _amount); return true; } function distributeMultiple(address[] _tos, uint256[] _values) public returns (bool success) { // 多个地址空投 require(msg.sender == founder); uint256 total = 0; uint256 i = 0; for (i = 0; i < _tos.length; i++) { total = SafeMath.add(total, _values[i]); } require(SafeMath.add(distributed, total) < _totalSupply); for (i = 0; i < _tos.length; i++) { distributed = SafeMath.add(distributed, _values[i]); balances[_tos[i]] = SafeMath.add(balances[_tos[i]], _values[i]); touched[_tos[i]] = true; emit Transfer(this, _tos[i], _values[i]); } return true; } function vote(address _to, uint256 _value) public returns (bool success) { // 投票 require(_to != 0x0 && now < voteEndTime); require(balances[msg.sender] >= SafeMath.add(frozen[msg.sender], _value)); frozen[msg.sender] = SafeMath.add(frozen[msg.sender], _value); totalVotes[_to] = SafeMath.add(totalVotes[_to], _value); votingInfo[_to][msg.sender] = SafeMath.add(votingInfo[_to][msg.sender], _value); emit Vote(msg.sender, _to, _value); return true; } function voteAll(address _to) public returns (bool success) { // 把票全投给某个地址 require(_to != 0x0 && now < voteEndTime); require(balances[msg.sender] > frozen[msg.sender]); uint256 votesNum = SafeMath.sub(balances[msg.sender], frozen[msg.sender]); frozen[msg.sender] = balances[msg.sender]; totalVotes[_to] = SafeMath.add(totalVotes[_to], votesNum); votingInfo[_to][msg.sender] = SafeMath.add(votingInfo[_to][msg.sender], votesNum); emit Vote(msg.sender, _to, votesNum); return true; } function setEndTime(uint256 _endTime) public { // 设定截止日期 require(msg.sender == founder); // 只有founder能设定, founder地址是0x0 voteEndTime = _endTime; } function ticketsOf(address _owner) view public returns (uint256 tickets) { // 获取票数 return SafeMath.sub(balances[_owner], frozen[_owner]); } function changeFounder(address newFounder) public { //改变Founder require(msg.sender == founder); founder = newFounder; } function kill() public { // 销毁合约 require(msg.sender == founder); selfdestruct(founder); } }
0.4.18