contract Ownable {

  address public owner;//合约拥有者的地址变量
  address public COO; //设立首席运营官
  address public CTO; //设立首席技术官

//更换新的合约拥有者--事件通知
  event OwnershipTransferred(address indexed _owner, address indexed _newAddress);
//更换首席运营官--事件通知
  event COOTransferred(address indexed _COO, address indexed _newAddress);
//更换首席技术官--事件通知
  event CTOTransferred(address indexed _CTO, address indexed _newAddress);

  //永久取消合约拥有者的权限--事件通知
  event OwnershipRenounced(address indexed previousOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
   *
   * 可拥有的构造函数将合同的原始“所有者”设置为发送方帐户。
   */
  constructor() public {
    owner = msg.sender;  //把合约创建者的地址赋给 合约拥有者变量 owner
    COO = msg.sender;    //把合约创建者的地址赋给 首席运营官变量 COO
    CTO = msg.sender;    //把合约创建者的地址赋给 首席技术官变量 CTO
  }




  /**
   * @dev Throws if called by any account other than the owner.
   * // 如果由所有者以外的任何帐户调用，则抛出。
   */
      modifier onlyOwner() {
        require(msg.sender == owner);  //判断当前消息发送者，是否为合约拥有者
        _;  //替换符，发起者的函数代码，是放在这的
      }


      modifier onlyCOO() {
        //判断当前消息发送者，是否为首席运营官
        require(msg.sender == COO);
        _;  //替换符，发起者的函数代码，是放在这的
      }


      modifier onlyCTO() {
        //判断当前消息发送者，是否为首席技术官
        require(msg.sender == CTO);
        _;  //替换符，发起者的函数代码，是放在这的
      }


  /**
   //允许当前所有者将合同的控制转移给新所有者。
   */

   function transferAddress(address _newAddress,uint _type) public onlyOwner returns (bool) {
     require(_newAddress != address(0) && _type > 0  && _type < 4);                //判断是否为以太坊地址
         if( _type == 1 ){
               owner = _newAddress;                              //新的合约拥有者
               emit OwnershipTransferred(owner, _newAddress);    //事件通知
         }
         if ( _type == 2 ){
              COO = _newAddress;                              //新的首席运营官
              emit COOTransferred(COO, _newAddress);          //事件通知
         }
         if( _type == 3 ){
              CTO = _newAddress;                              //新的 首席技术官
              emit CTOTransferred(CTO, _newAddress);           //事件通知
         }
         return true;
   }



//永久取消合约拥有者的权限--不可逆的
  function renounceOwnership() public onlyOwner returns (bool){
    owner = address(0);   //把合约拥有者的地址变为 0x000000000格式的
    emit OwnershipRenounced(owner);   //事件通知

    return true;
    }


}
function renounceOwnership() public onlyOwner returns (bool){
  owner = address(0);   //把合约拥有者的地址变为 0x000000000格式的
  emit OwnershipRenounced(owner);   //事件通知

  return true;
  }

//永久取消合约拥有者的权限--不可逆的