ERC20标准USDT智能合约

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

pragma solidity ^0.4.17;
library SafeMath {
    
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
        if (a == 0) {
    
    
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
        uint256 c = a / b;
        return c;
    }

    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) {
    
    
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}


// 确定发布者
contract Ownable {
    
    
    address public owner;
    // 构造函数,一部署就确定了发布者是谁
    function Ownable() public {
    
    
        owner = msg.sender;
    }
    modifier onlyOwner() {
    
    
        require(msg.sender == owner);
        _;
    }
    function transferOwnership(address newOwner) public onlyOwner {
    
    
        if (newOwner != address(0)) {
    
    
            owner = newOwner;
        }
    }

}

// ERC20基础
/**有一下功能
1.变量:记录总量
2.参看总量函数
3.查看账户余额函数
4.转账函数
5.转账事件
 */
contract ERC20Basic {
    
    
    uint public _totalSupply;
    function totalSupply() public constant returns (uint);
    function balanceOf(address who) public constant returns (uint);
    function transfer(address to, uint value) public;
    event Transfer(address indexed from, address indexed to, uint value);
}

// ERC20升级版,在ERC20基础,添加授权关系函数,转账函数,授权数量函数
contract ERC20 is ERC20Basic {
    
    
    function allowance(address owner, address spender) public constant returns (uint);
    function transferFrom(address from, address to, uint value) public;
    function approve(address spender, uint value) public;
    event Approval(address indexed owner, address indexed spender, uint value);
}

contract BasicToken is Ownable, ERC20Basic {
    
    
    using SafeMath for uint;

    mapping(address => uint) public balances;
    // 基础手续费
    uint public basisPointsRate = 0;
    // 最大手续费
    uint public maximumFee = 0;
    // 防止短地址攻击
    modifier onlyPayloadSize(uint size) {
    
    
        require(!(msg.data.length < size + 4));
        _;
    }
    
    function transfer(address _to, uint _value) public onlyPayloadSize(2 * 32) {
    
    
        // 手续费计算
        uint fee = (_value.mul(basisPointsRate)).div(10000);
        // 手续费大于最大手续费,取最大手续费
        if (fee > maximumFee) {
    
    
            fee = maximumFee;
        }
        // 扣掉手续费应转的钱
        uint sendAmount = _value.sub(fee);
        // 发送的人扣掉实际转的钱
        balances[msg.sender] = balances[msg.sender].sub(_value);
        // 接收的人收到 扣掉手续费后的钱
        balances[_to] = balances[_to].add(sendAmount);
        // 如果有手续费
        if (fee > 0) {
    
    
            // 手续费给这个合约的部署者
            balances[owner] = balances[owner].add(fee);
            Transfer(msg.sender, owner, fee);
        }
        Transfer(msg.sender, _to, sendAmount);
    }
    // 查询余额
    function balanceOf(address _owner) public constant returns (uint balance) {
    
    
        return balances[_owner];
    }

}

// 标准
contract StandardToken is BasicToken, ERC20 {
    
    

    mapping (address => mapping (address => uint)) public allowed;

    uint public constant MAX_UINT = 2**256 - 1;
    // 转账函数
    function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
    
    
        var _allowance = allowed[_from][msg.sender];

        uint fee = (_value.mul(basisPointsRate)).div(10000);
        if (fee > maximumFee) {
    
    
            fee = maximumFee;
        }
        // allowed 中要减掉 _value
        if (_allowance < MAX_UINT) {
    
    
            allowed[_from][msg.sender] = _allowance.sub(_value);
        }
        uint sendAmount = _value.sub(fee);
        // _from 也要减掉 _value
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(sendAmount);
        if (fee > 0) {
    
    
            balances[owner] = balances[owner].add(fee);
            Transfer(_from, owner, fee);
        }
        Transfer(_from, _to, sendAmount);
    }
    // 授权,msg.sender 给 _spender 授权 _value
    function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {
    
    
        require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
    }
    // 建立授权关系
    function allowance(address _owner, address _spender) public constant returns (uint remaining) {
    
    
        return allowed[_owner][_spender];
    }
}
// 停用
contract Pausable is Ownable {
    
    
  event Pause();
  event Unpause();

  bool public paused = false;
  modifier whenNotPaused() {
    
    
    require(!paused);
    _;
  }
  modifier whenPaused() {
    
    
    require(paused);
    _;
  }
  function pause() onlyOwner whenNotPaused public {
    
    
    paused = true;
    Pause();
  }
  function unpause() onlyOwner whenPaused public {
    
    
    paused = false;
    Unpause();
  }
}

// 黑名单
contract BlackList is Ownable, BasicToken {
    
    
    // 根据地址,获取改地址在BlackListed的状态
    function getBlackListStatus(address _maker) external constant returns (bool) {
    
    
        return isBlackListed[_maker];
    }

    function getOwner() external constant returns (address) {
    
    
        return owner;
    }

    mapping (address => bool) public isBlackListed;
    // 添加进黑名单
    function addBlackList (address _evilUser) public onlyOwner {
    
    
        isBlackListed[_evilUser] = true;
        AddedBlackList(_evilUser);
    }
    // 从黑名单中移除
    function removeBlackList (address _clearedUser) public onlyOwner {
    
    
        isBlackListed[_clearedUser] = false;
        RemovedBlackList(_clearedUser);
    }
    // 没收黑名单资产
    function destroyBlackFunds (address _blackListedUser) public onlyOwner {
    
    
        require(isBlackListed[_blackListedUser]);
        uint dirtyFunds = balanceOf(_blackListedUser);
        balances[_blackListedUser] = 0;
        _totalSupply -= dirtyFunds;
        DestroyedBlackFunds(_blackListedUser, dirtyFunds);
    }

    event DestroyedBlackFunds(address _blackListedUser, uint _balance);

    event AddedBlackList(address _user);

    event RemovedBlackList(address _user);

}

// 标准Token升级版
contract UpgradedStandardToken is StandardToken{
    
    
    // 这些方法由遗弃合约调用
    // 他们必须确保 msg.sender 是合约地址
    function transferByLegacy(address from, address to, uint value) public;
    function transferFromByLegacy(address sender, address from, address spender, uint value) public;
    function approveByLegacy(address from, address spender, uint value) public;
}

// Token
contract TetherToken is Pausable, StandardToken, BlackList {
    
    

    string public name;
    string public symbol;
    uint public decimals;
    address public upgradedAddress;
    bool public deprecated;

    function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
    
    
        _totalSupply = _initialSupply;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        balances[owner] = _initialSupply;
        // 弃用开关,初始值为 false
        deprecated = false;
    }

    function transfer(address _to, uint _value) public whenNotPaused {
    
    
        require(!isBlackListed[msg.sender]);
        if (deprecated) {
    
    
            return UpgradedStandardToken(upgradedAddress).transferByLegacy(msg.sender, _to, _value);
        } else {
    
    
            return super.transfer(_to, _value);
        }
    }
    
    function transferFrom(address _from, address _to, uint _value) public whenNotPaused {
    
    
        require(!isBlackListed[_from]);
        if (deprecated) {
    
    
            return UpgradedStandardToken(upgradedAddress).transferFromByLegacy(msg.sender, _from, _to, _value);
        } else {
    
    
            return super.transferFrom(_from, _to, _value);
        }
    }
    
    function balanceOf(address who) public constant returns (uint) {
    
    
        if (deprecated) {
    
    
            return UpgradedStandardToken(upgradedAddress).balanceOf(who);
        } else {
    
    
            return super.balanceOf(who);
        }
    }
    
    function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {
    
    
        if (deprecated) {
    
    
            return UpgradedStandardToken(upgradedAddress).approveByLegacy(msg.sender, _spender, _value);
        } else {
    
    
            return super.approve(_spender, _value);
        }
    }
    
    function allowance(address _owner, address _spender) public constant returns (uint remaining) {
    
    
        if (deprecated) {
    
    
            return StandardToken(upgradedAddress).allowance(_owner, _spender);
        } else {
    
    
            return super.allowance(_owner, _spender);
        }
    }
    
    function deprecate(address _upgradedAddress) public onlyOwner {
    
    
        deprecated = true;
        upgradedAddress = _upgradedAddress;
        Deprecate(_upgradedAddress);
    }
    
    function totalSupply() public constant returns (uint) {
    
    
        if (deprecated) {
    
    
            return StandardToken(upgradedAddress).totalSupply();
        } else {
    
    
            return _totalSupply;
        }
    }
    // 增发
    function issue(uint amount) public onlyOwner {
    
    
        require(_totalSupply + amount > _totalSupply);
        require(balances[owner] + amount > balances[owner]);

        balances[owner] += amount;
        _totalSupply += amount;
        Issue(amount);
    }
    
    // 销毁
    function redeem(uint amount) public onlyOwner {
    
    
        require(_totalSupply >= amount);
        require(balances[owner] >= amount);

        _totalSupply -= amount;
        balances[owner] -= amount;
        Redeem(amount);
    }

    function setParams(uint newBasisPoints, uint newMaxFee) public onlyOwner {
    
    
        require(newBasisPoints < 20);
        require(newMaxFee < 50);

        basisPointsRate = newBasisPoints;
        maximumFee = newMaxFee.mul(10**decimals);

        Params(basisPointsRate, maximumFee);
    }
    event Issue(uint amount);
    
    event Redeem(uint amount);
    
    event Deprecate(address newAddress);
    
    event Params(uint feeBasisPoints, uint maxFee);
}

猜你喜欢

转载自blog.csdn.net/wjl__ai__/article/details/121361123