可以加上USDT源代码吗 #2

Description

@linaifeng

token:0xdac17f958d2ee523a2206206994597c13d831ec7
source:
/**
*Submitted for verification at Etherscan.io on 2017-11-28
*/

pragma solidity ^0.4.17;

/**

  • @title SafeMath

  • @dev Math operations with safety checks that throw on error
    */
    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) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    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;
    }
    }

/**

  • @title Ownable

  • @dev The Ownable contract has an owner address, and provides basic authorization control

  • functions, this simplifies the implementation of "user permissions".
    */
    contract Ownable {
    address public owner;

    /**

    • @dev The Ownable constructor sets the original owner of the contract to the sender
    • account.
      */
      function Ownable() public {
      owner = msg.sender;
      }

    /**

    • @dev Throws if called by any account other than the owner.
      */
      modifier onlyOwner() {
      require(msg.sender == owner);
      _;
      }

    /**

    • @dev Allows the current owner to transfer control of the contract to a newOwner.
    • @PARAM newOwner The address to transfer ownership to.
      */
      function transferOwnership(address newOwner) public onlyOwner {
      if (newOwner != address(0)) {
      owner = newOwner;
      }
      }

}

/**

  • @title ERC20Basic
  • @dev Simpler version of ERC20 interface
  • @dev see ERC: Token standard ethereum/EIPs#20
    */
    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);
    }

/**

  • @title ERC20 interface
  • @dev see ERC: Token standard ethereum/EIPs#20
    */
    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);
    }

/**

  • @title Basic token

  • @dev Basic version of StandardToken, with no allowances.
    */
    contract BasicToken is Ownable, ERC20Basic {
    using SafeMath for uint;

    mapping(address => uint) public balances;

    // additional variables for use if transaction fees ever became necessary
    uint public basisPointsRate = 0;
    uint public maximumFee = 0;

    /**

    • @dev Fix for the ERC20 short address attack.
      */
      modifier onlyPayloadSize(uint size) {
      require(!(msg.data.length < size + 4));
      _;
      }

    /**

    • @dev transfer token for a specified address
    • @PARAM _to The address to transfer to.
    • @PARAM _value The amount to be transferred.
      */
      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);
      }

    /**

    • @dev Gets the balance of the specified address.
    • @PARAM _owner The address to query the the balance of.
    • @return An uint representing the amount owned by the passed address.
      */
      function balanceOf(address _owner) public constant returns (uint balance) {
      return balances[_owner];
      }

}

/**

  • @title Standard ERC20 token

  • @dev Implementation of the basic standard token.

  • @devERC: Token standard ethereum/EIPs#20

  • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
    */
    contract StandardToken is BasicToken, ERC20 {

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

    uint public constant MAX_UINT = 2**256 - 1;

    /**

    • @dev Transfer tokens from one address to another

    • @PARAM _from address The address which you want to send tokens from

    • @PARAM _to address The address which you want to transfer to

    • @PARAM _value uint the amount of tokens to be transferred
      */
      function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
      var _allowance = allowed[_from][msg.sender];

      // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
      // if (_value > _allowance) throw;

      uint fee = (_value.mul(basisPointsRate)).div(10000);
      if (fee > maximumFee) {
      fee = maximumFee;
      }
      if (_allowance < MAX_UINT) {
      allowed[_from][msg.sender] = _allowance.sub(_value);
      }
      uint sendAmount = _value.sub(fee);
      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);
      }

    /**

    • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

    • @PARAM _spender The address which will spend the funds.

    • @PARAM _value The amount of tokens to be spent.
      */
      function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

      // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
      // already 0 to mitigate the race condition described here:
      // ERC: Token standard ethereum/EIPs#20 (comment)
      require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

      allowed[msg.sender][_spender] = _value;
      Approval(msg.sender, _spender, _value);
      }

    /**

    • @dev Function to check the amount of tokens than an owner allowed to a spender.
    • @PARAM _owner address The address which owns the funds.
    • @PARAM _spender address The address which will spend the funds.
    • @return A uint specifying the amount of tokens still available for the spender.
      */
      function allowance(address _owner, address _spender) public constant returns (uint remaining) {
      return allowed[_owner][_spender];
      }

}

/**

  • @title Pausable
  • @dev Base contract which allows children to implement an emergency stop mechanism.
    */
    contract Pausable is Ownable {
    event Pause();
    event Unpause();

bool public paused = false;

/**

  • @dev Modifier to make a function callable only when the contract is not paused.
    */
    modifier whenNotPaused() {
    require(!paused);
    _;
    }

/**

  • @dev Modifier to make a function callable only when the contract is paused.
    */
    modifier whenPaused() {
    require(paused);
    _;
    }

/**

  • @dev called by the owner to pause, triggers stopped state
    */
    function pause() onlyOwner whenNotPaused public {
    paused = true;
    Pause();
    }

/**

  • @dev called by the owner to unpause, returns to normal state
    */
    function unpause() onlyOwner whenPaused public {
    paused = false;
    Unpause();
    }
    }

contract BlackList is Ownable, BasicToken {

/////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
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);

}

contract UpgradedStandardToken is StandardToken{
// those methods are called by the legacy contract
// and they must ensure msg.sender to be the contract address
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;
}

contract TetherToken is Pausable, StandardToken, BlackList {

string public name;
string public symbol;
uint public decimals;
address public upgradedAddress;
bool public deprecated;
// The contract can be initialized with a number of tokens
// All the tokens are deposited to the owner address
//
// @param _balance Initial supply of the contract
// @param _name Token Name
// @param _symbol Token symbol
// @param _decimals Token decimals
function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
_totalSupply = _initialSupply;
name = _name;
symbol = _symbol;
decimals = _decimals;
balances[owner] = _initialSupply;
deprecated = false;
}
// Forward ERC20 methods to upgraded contract if this one is deprecated
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);
}
}
// Forward ERC20 methods to upgraded contract if this one is deprecated
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);
}
}
// Forward ERC20 methods to upgraded contract if this one is deprecated
function balanceOf(address who) public constant returns (uint) {
if (deprecated) {
return UpgradedStandardToken(upgradedAddress).balanceOf(who);
} else {
return super.balanceOf(who);
}
}
// Forward ERC20 methods to upgraded contract if this one is deprecated
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);
}
}
// Forward ERC20 methods to upgraded contract if this one is deprecated
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);
}
}
// deprecate current contract in favour of a new one
function deprecate(address _upgradedAddress) public onlyOwner {
deprecated = true;
upgradedAddress = _upgradedAddress;
Deprecate(_upgradedAddress);
}
// deprecate current contract if favour of a new one
function totalSupply() public constant returns (uint) {
if (deprecated) {
return StandardToken(upgradedAddress).totalSupply();
} else {
return _totalSupply;
}
}
// Issue a new amount of tokens
// these tokens are deposited into the owner address
//
// @param _amount Number of tokens to be issued
function issue(uint amount) public onlyOwner {
require(_totalSupply + amount > _totalSupply);
require(balances[owner] + amount > balances[owner]);
balances[owner] += amount;
_totalSupply += amount;
Issue(amount);
}
// Redeem tokens.
// These tokens are withdrawn from the owner address
// if the balance must be enough to cover the redeem
// or the call will fail.
// @param _amount Number of tokens to be issued
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 {
// Ensure transparency by hardcoding limit beyond which fees can never be added
require(newBasisPoints < 20);
require(newMaxFee < 50);
basisPointsRate = newBasisPoints;
maximumFee = newMaxFee.mul(10**decimals);
Params(basisPointsRate, maximumFee);
}
// Called when new token are issued
event Issue(uint amount);
// Called when tokens are redeemed
event Redeem(uint amount);
// Called when contract is deprecated
event Deprecate(address newAddress);
// Called if contract ever adds fees
event Params(uint feeBasisPoints, uint maxFee);

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      可以加上USDT源代码吗 #2

      Description

      @linaifeng

      token:0xdac17f958d2ee523a2206206994597c13d831ec7
      source:
      /**
      *Submitted for verification at Etherscan.io on 2017-11-28
      */

      pragma solidity ^0.4.17;

      /**

      • @title SafeMath

      • @dev Math operations with safety checks that throw on error
        */
        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) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        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;
        }
        }

      /**

      • @title Ownable

      • @dev The Ownable contract has an owner address, and provides basic authorization control

      • functions, this simplifies the implementation of "user permissions".
        */
        contract Ownable {
        address public owner;

        /**

        • @dev The Ownable constructor sets the original owner of the contract to the sender
        • account.
          */
          function Ownable() public {
          owner = msg.sender;
          }

        /**

        • @dev Throws if called by any account other than the owner.
          */
          modifier onlyOwner() {
          require(msg.sender == owner);
          _;
          }

        /**

        • @dev Allows the current owner to transfer control of the contract to a newOwner.
        • @PARAM newOwner The address to transfer ownership to.
          */
          function transferOwnership(address newOwner) public onlyOwner {
          if (newOwner != address(0)) {
          owner = newOwner;
          }
          }

      }

      /**

      • @title ERC20Basic
      • @dev Simpler version of ERC20 interface
      • @dev see ERC: Token standard ethereum/EIPs#20
        */
        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);
        }

      /**

      • @title ERC20 interface
      • @dev see ERC: Token standard ethereum/EIPs#20
        */
        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);
        }

      /**

      • @title Basic token

      • @dev Basic version of StandardToken, with no allowances.
        */
        contract BasicToken is Ownable, ERC20Basic {
        using SafeMath for uint;

        mapping(address => uint) public balances;

        // additional variables for use if transaction fees ever became necessary
        uint public basisPointsRate = 0;
        uint public maximumFee = 0;

        /**

        • @dev Fix for the ERC20 short address attack.
          */
          modifier onlyPayloadSize(uint size) {
          require(!(msg.data.length < size + 4));
          _;
          }

        /**

        • @dev transfer token for a specified address
        • @PARAM _to The address to transfer to.
        • @PARAM _value The amount to be transferred.
          */
          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);
          }

        /**

        • @dev Gets the balance of the specified address.
        • @PARAM _owner The address to query the the balance of.
        • @return An uint representing the amount owned by the passed address.
          */
          function balanceOf(address _owner) public constant returns (uint balance) {
          return balances[_owner];
          }

      }

      /**

      • @title Standard ERC20 token

      • @dev Implementation of the basic standard token.

      • @devERC: Token standard ethereum/EIPs#20

      • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
        */
        contract StandardToken is BasicToken, ERC20 {

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

        uint public constant MAX_UINT = 2**256 - 1;

        /**

        • @dev Transfer tokens from one address to another

        • @PARAM _from address The address which you want to send tokens from

        • @PARAM _to address The address which you want to transfer to

        • @PARAM _value uint the amount of tokens to be transferred
          */
          function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
          var _allowance = allowed[_from][msg.sender];

          // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
          // if (_value > _allowance) throw;

          uint fee = (_value.mul(basisPointsRate)).div(10000);
          if (fee > maximumFee) {
          fee = maximumFee;
          }
          if (_allowance < MAX_UINT) {
          allowed[_from][msg.sender] = _allowance.sub(_value);
          }
          uint sendAmount = _value.sub(fee);
          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);
          }

        /**

        • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

        • @PARAM _spender The address which will spend the funds.

        • @PARAM _value The amount of tokens to be spent.
          */
          function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

          // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
          // already 0 to mitigate the race condition described here:
          // ERC: Token standard ethereum/EIPs#20 (comment)
          require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

          allowed[msg.sender][_spender] = _value;
          Approval(msg.sender, _spender, _value);
          }

        /**

        • @dev Function to check the amount of tokens than an owner allowed to a spender.
        • @PARAM _owner address The address which owns the funds.
        • @PARAM _spender address The address which will spend the funds.
        • @return A uint specifying the amount of tokens still available for the spender.
          */
          function allowance(address _owner, address _spender) public constant returns (uint remaining) {
          return allowed[_owner][_spender];
          }

      }

      /**

      • @title Pausable
      • @dev Base contract which allows children to implement an emergency stop mechanism.
        */
        contract Pausable is Ownable {
        event Pause();
        event Unpause();

      bool public paused = false;

      /**

      • @dev Modifier to make a function callable only when the contract is not paused.
        */
        modifier whenNotPaused() {
        require(!paused);
        _;
        }

      /**

      • @dev Modifier to make a function callable only when the contract is paused.
        */
        modifier whenPaused() {
        require(paused);
        _;
        }

      /**

      • @dev called by the owner to pause, triggers stopped state
        */
        function pause() onlyOwner whenNotPaused public {
        paused = true;
        Pause();
        }

      /**

      • @dev called by the owner to unpause, returns to normal state
        */
        function unpause() onlyOwner whenPaused public {
        paused = false;
        Unpause();
        }
        }

      contract BlackList is Ownable, BasicToken {

      /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
      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);
      

      }

      contract UpgradedStandardToken is StandardToken{
      // those methods are called by the legacy contract
      // and they must ensure msg.sender to be the contract address
      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;
      }

      contract TetherToken is Pausable, StandardToken, BlackList {

      string public name;
      string public symbol;
      uint public decimals;
      address public upgradedAddress;
      bool public deprecated;
      // The contract can be initialized with a number of tokens
      // All the tokens are deposited to the owner address
      //
      // @param _balance Initial supply of the contract
      // @param _name Token Name
      // @param _symbol Token symbol
      // @param _decimals Token decimals
      function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
      _totalSupply = _initialSupply;
      name = _name;
      symbol = _symbol;
      decimals = _decimals;
      balances[owner] = _initialSupply;
      deprecated = false;
      }
      // Forward ERC20 methods to upgraded contract if this one is deprecated
      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);
      }
      }
      // Forward ERC20 methods to upgraded contract if this one is deprecated
      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);
      }
      }
      // Forward ERC20 methods to upgraded contract if this one is deprecated
      function balanceOf(address who) public constant returns (uint) {
      if (deprecated) {
      return UpgradedStandardToken(upgradedAddress).balanceOf(who);
      } else {
      return super.balanceOf(who);
      }
      }
      // Forward ERC20 methods to upgraded contract if this one is deprecated
      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);
      }
      }
      // Forward ERC20 methods to upgraded contract if this one is deprecated
      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);
      }
      }
      // deprecate current contract in favour of a new one
      function deprecate(address _upgradedAddress) public onlyOwner {
      deprecated = true;
      upgradedAddress = _upgradedAddress;
      Deprecate(_upgradedAddress);
      }
      // deprecate current contract if favour of a new one
      function totalSupply() public constant returns (uint) {
      if (deprecated) {
      return StandardToken(upgradedAddress).totalSupply();
      } else {
      return _totalSupply;
      }
      }
      // Issue a new amount of tokens
      // these tokens are deposited into the owner address
      //
      // @param _amount Number of tokens to be issued
      function issue(uint amount) public onlyOwner {
      require(_totalSupply + amount > _totalSupply);
      require(balances[owner] + amount > balances[owner]);
      balances[owner] += amount;
      _totalSupply += amount;
      Issue(amount);
      }
      // Redeem tokens.
      // These tokens are withdrawn from the owner address
      // if the balance must be enough to cover the redeem
      // or the call will fail.
      // @param _amount Number of tokens to be issued
      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 {
      // Ensure transparency by hardcoding limit beyond which fees can never be added
      require(newBasisPoints < 20);
      require(newMaxFee < 50);
      basisPointsRate = newBasisPoints;
      maximumFee = newMaxFee.mul(10**decimals);
      Params(basisPointsRate, maximumFee);
      }
      // Called when new token are issued
      event Issue(uint amount);
      // Called when tokens are redeemed
      event Redeem(uint amount);
      // Called when contract is deprecated
      event Deprecate(address newAddress);
      // Called if contract ever adds fees
      event Params(uint feeBasisPoints, uint maxFee);
      

      }

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          可以加上USDT源代码吗 #2

          Description

          @linaifeng

          token:0xdac17f958d2ee523a2206206994597c13d831ec7
          source:
          /**
          *Submitted for verification at Etherscan.io on 2017-11-28
          */

          pragma solidity ^0.4.17;

          /**

          • @title SafeMath

          • @dev Math operations with safety checks that throw on error
            */
            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) {
            // assert(b > 0); // Solidity automatically throws when dividing by 0
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
            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;
            }
            }

          /**

          • @title Ownable

          • @dev The Ownable contract has an owner address, and provides basic authorization control

          • functions, this simplifies the implementation of "user permissions".
            */
            contract Ownable {
            address public owner;

            /**

            • @dev The Ownable constructor sets the original owner of the contract to the sender
            • account.
              */
              function Ownable() public {
              owner = msg.sender;
              }

            /**

            • @dev Throws if called by any account other than the owner.
              */
              modifier onlyOwner() {
              require(msg.sender == owner);
              _;
              }

            /**

            • @dev Allows the current owner to transfer control of the contract to a newOwner.
            • @PARAM newOwner The address to transfer ownership to.
              */
              function transferOwnership(address newOwner) public onlyOwner {
              if (newOwner != address(0)) {
              owner = newOwner;
              }
              }

          }

          /**

          • @title ERC20Basic
          • @dev Simpler version of ERC20 interface
          • @dev see ERC: Token standard ethereum/EIPs#20
            */
            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);
            }

          /**

          • @title ERC20 interface
          • @dev see ERC: Token standard ethereum/EIPs#20
            */
            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);
            }

          /**

          • @title Basic token

          • @dev Basic version of StandardToken, with no allowances.
            */
            contract BasicToken is Ownable, ERC20Basic {
            using SafeMath for uint;

            mapping(address => uint) public balances;

            // additional variables for use if transaction fees ever became necessary
            uint public basisPointsRate = 0;
            uint public maximumFee = 0;

            /**

            • @dev Fix for the ERC20 short address attack.
              */
              modifier onlyPayloadSize(uint size) {
              require(!(msg.data.length < size + 4));
              _;
              }

            /**

            • @dev transfer token for a specified address
            • @PARAM _to The address to transfer to.
            • @PARAM _value The amount to be transferred.
              */
              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);
              }

            /**

            • @dev Gets the balance of the specified address.
            • @PARAM _owner The address to query the the balance of.
            • @return An uint representing the amount owned by the passed address.
              */
              function balanceOf(address _owner) public constant returns (uint balance) {
              return balances[_owner];
              }

          }

          /**

          • @title Standard ERC20 token

          • @dev Implementation of the basic standard token.

          • @devERC: Token standard ethereum/EIPs#20

          • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
            */
            contract StandardToken is BasicToken, ERC20 {

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

            uint public constant MAX_UINT = 2**256 - 1;

            /**

            • @dev Transfer tokens from one address to another

            • @PARAM _from address The address which you want to send tokens from

            • @PARAM _to address The address which you want to transfer to

            • @PARAM _value uint the amount of tokens to be transferred
              */
              function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
              var _allowance = allowed[_from][msg.sender];

              // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
              // if (_value > _allowance) throw;

              uint fee = (_value.mul(basisPointsRate)).div(10000);
              if (fee > maximumFee) {
              fee = maximumFee;
              }
              if (_allowance < MAX_UINT) {
              allowed[_from][msg.sender] = _allowance.sub(_value);
              }
              uint sendAmount = _value.sub(fee);
              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);
              }

            /**

            • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

            • @PARAM _spender The address which will spend the funds.

            • @PARAM _value The amount of tokens to be spent.
              */
              function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

              // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
              // already 0 to mitigate the race condition described here:
              // ERC: Token standard ethereum/EIPs#20 (comment)
              require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

              allowed[msg.sender][_spender] = _value;
              Approval(msg.sender, _spender, _value);
              }

            /**

            • @dev Function to check the amount of tokens than an owner allowed to a spender.
            • @PARAM _owner address The address which owns the funds.
            • @PARAM _spender address The address which will spend the funds.
            • @return A uint specifying the amount of tokens still available for the spender.
              */
              function allowance(address _owner, address _spender) public constant returns (uint remaining) {
              return allowed[_owner][_spender];
              }

          }

          /**

          • @title Pausable
          • @dev Base contract which allows children to implement an emergency stop mechanism.
            */
            contract Pausable is Ownable {
            event Pause();
            event Unpause();

          bool public paused = false;

          /**

          • @dev Modifier to make a function callable only when the contract is not paused.
            */
            modifier whenNotPaused() {
            require(!paused);
            _;
            }

          /**

          • @dev Modifier to make a function callable only when the contract is paused.
            */
            modifier whenPaused() {
            require(paused);
            _;
            }

          /**

          • @dev called by the owner to pause, triggers stopped state
            */
            function pause() onlyOwner whenNotPaused public {
            paused = true;
            Pause();
            }

          /**

          • @dev called by the owner to unpause, returns to normal state
            */
            function unpause() onlyOwner whenPaused public {
            paused = false;
            Unpause();
            }
            }

          contract BlackList is Ownable, BasicToken {

          /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
          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);
          

          }

          contract UpgradedStandardToken is StandardToken{
          // those methods are called by the legacy contract
          // and they must ensure msg.sender to be the contract address
          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;
          }

          contract TetherToken is Pausable, StandardToken, BlackList {

          string public name;
          string public symbol;
          uint public decimals;
          address public upgradedAddress;
          bool public deprecated;
          // The contract can be initialized with a number of tokens
          // All the tokens are deposited to the owner address
          //
          // @param _balance Initial supply of the contract
          // @param _name Token Name
          // @param _symbol Token symbol
          // @param _decimals Token decimals
          function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
          _totalSupply = _initialSupply;
          name = _name;
          symbol = _symbol;
          decimals = _decimals;
          balances[owner] = _initialSupply;
          deprecated = false;
          }
          // Forward ERC20 methods to upgraded contract if this one is deprecated
          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);
          }
          }
          // Forward ERC20 methods to upgraded contract if this one is deprecated
          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);
          }
          }
          // Forward ERC20 methods to upgraded contract if this one is deprecated
          function balanceOf(address who) public constant returns (uint) {
          if (deprecated) {
          return UpgradedStandardToken(upgradedAddress).balanceOf(who);
          } else {
          return super.balanceOf(who);
          }
          }
          // Forward ERC20 methods to upgraded contract if this one is deprecated
          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);
          }
          }
          // Forward ERC20 methods to upgraded contract if this one is deprecated
          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);
          }
          }
          // deprecate current contract in favour of a new one
          function deprecate(address _upgradedAddress) public onlyOwner {
          deprecated = true;
          upgradedAddress = _upgradedAddress;
          Deprecate(_upgradedAddress);
          }
          // deprecate current contract if favour of a new one
          function totalSupply() public constant returns (uint) {
          if (deprecated) {
          return StandardToken(upgradedAddress).totalSupply();
          } else {
          return _totalSupply;
          }
          }
          // Issue a new amount of tokens
          // these tokens are deposited into the owner address
          //
          // @param _amount Number of tokens to be issued
          function issue(uint amount) public onlyOwner {
          require(_totalSupply + amount > _totalSupply);
          require(balances[owner] + amount > balances[owner]);
          balances[owner] += amount;
          _totalSupply += amount;
          Issue(amount);
          }
          // Redeem tokens.
          // These tokens are withdrawn from the owner address
          // if the balance must be enough to cover the redeem
          // or the call will fail.
          // @param _amount Number of tokens to be issued
          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 {
          // Ensure transparency by hardcoding limit beyond which fees can never be added
          require(newBasisPoints < 20);
          require(newMaxFee < 50);
          basisPointsRate = newBasisPoints;
          maximumFee = newMaxFee.mul(10**decimals);
          Params(basisPointsRate, maximumFee);
          }
          // Called when new token are issued
          event Issue(uint amount);
          // Called when tokens are redeemed
          event Redeem(uint amount);
          // Called when contract is deprecated
          event Deprecate(address newAddress);
          // Called if contract ever adds fees
          event Params(uint feeBasisPoints, uint maxFee);
          

          }

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              可以加上USDT源代码吗 #2

              Description

              @linaifeng

              token:0xdac17f958d2ee523a2206206994597c13d831ec7
              source:
              /**
              *Submitted for verification at Etherscan.io on 2017-11-28
              */

              pragma solidity ^0.4.17;

              /**

              • @title SafeMath

              • @dev Math operations with safety checks that throw on error
                */
                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) {
                // assert(b > 0); // Solidity automatically throws when dividing by 0
                uint256 c = a / b;
                // assert(a == b * c + a % b); // There is no case in which this doesn't hold
                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;
                }
                }

              /**

              • @title Ownable

              • @dev The Ownable contract has an owner address, and provides basic authorization control

              • functions, this simplifies the implementation of "user permissions".
                */
                contract Ownable {
                address public owner;

                /**

                • @dev The Ownable constructor sets the original owner of the contract to the sender
                • account.
                  */
                  function Ownable() public {
                  owner = msg.sender;
                  }

                /**

                • @dev Throws if called by any account other than the owner.
                  */
                  modifier onlyOwner() {
                  require(msg.sender == owner);
                  _;
                  }

                /**

                • @dev Allows the current owner to transfer control of the contract to a newOwner.
                • @PARAM newOwner The address to transfer ownership to.
                  */
                  function transferOwnership(address newOwner) public onlyOwner {
                  if (newOwner != address(0)) {
                  owner = newOwner;
                  }
                  }

              }

              /**

              • @title ERC20Basic
              • @dev Simpler version of ERC20 interface
              • @dev see ERC: Token standard ethereum/EIPs#20
                */
                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);
                }

              /**

              • @title ERC20 interface
              • @dev see ERC: Token standard ethereum/EIPs#20
                */
                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);
                }

              /**

              • @title Basic token

              • @dev Basic version of StandardToken, with no allowances.
                */
                contract BasicToken is Ownable, ERC20Basic {
                using SafeMath for uint;

                mapping(address => uint) public balances;

                // additional variables for use if transaction fees ever became necessary
                uint public basisPointsRate = 0;
                uint public maximumFee = 0;

                /**

                • @dev Fix for the ERC20 short address attack.
                  */
                  modifier onlyPayloadSize(uint size) {
                  require(!(msg.data.length < size + 4));
                  _;
                  }

                /**

                • @dev transfer token for a specified address
                • @PARAM _to The address to transfer to.
                • @PARAM _value The amount to be transferred.
                  */
                  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);
                  }

                /**

                • @dev Gets the balance of the specified address.
                • @PARAM _owner The address to query the the balance of.
                • @return An uint representing the amount owned by the passed address.
                  */
                  function balanceOf(address _owner) public constant returns (uint balance) {
                  return balances[_owner];
                  }

              }

              /**

              • @title Standard ERC20 token

              • @dev Implementation of the basic standard token.

              • @devERC: Token standard ethereum/EIPs#20

              • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
                */
                contract StandardToken is BasicToken, ERC20 {

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

                uint public constant MAX_UINT = 2**256 - 1;

                /**

                • @dev Transfer tokens from one address to another

                • @PARAM _from address The address which you want to send tokens from

                • @PARAM _to address The address which you want to transfer to

                • @PARAM _value uint the amount of tokens to be transferred
                  */
                  function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
                  var _allowance = allowed[_from][msg.sender];

                  // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
                  // if (_value > _allowance) throw;

                  uint fee = (_value.mul(basisPointsRate)).div(10000);
                  if (fee > maximumFee) {
                  fee = maximumFee;
                  }
                  if (_allowance < MAX_UINT) {
                  allowed[_from][msg.sender] = _allowance.sub(_value);
                  }
                  uint sendAmount = _value.sub(fee);
                  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);
                  }

                /**

                • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

                • @PARAM _spender The address which will spend the funds.

                • @PARAM _value The amount of tokens to be spent.
                  */
                  function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

                  // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
                  // already 0 to mitigate the race condition described here:
                  // ERC: Token standard ethereum/EIPs#20 (comment)
                  require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

                  allowed[msg.sender][_spender] = _value;
                  Approval(msg.sender, _spender, _value);
                  }

                /**

                • @dev Function to check the amount of tokens than an owner allowed to a spender.
                • @PARAM _owner address The address which owns the funds.
                • @PARAM _spender address The address which will spend the funds.
                • @return A uint specifying the amount of tokens still available for the spender.
                  */
                  function allowance(address _owner, address _spender) public constant returns (uint remaining) {
                  return allowed[_owner][_spender];
                  }

              }

              /**

              • @title Pausable
              • @dev Base contract which allows children to implement an emergency stop mechanism.
                */
                contract Pausable is Ownable {
                event Pause();
                event Unpause();

              bool public paused = false;

              /**

              • @dev Modifier to make a function callable only when the contract is not paused.
                */
                modifier whenNotPaused() {
                require(!paused);
                _;
                }

              /**

              • @dev Modifier to make a function callable only when the contract is paused.
                */
                modifier whenPaused() {
                require(paused);
                _;
                }

              /**

              • @dev called by the owner to pause, triggers stopped state
                */
                function pause() onlyOwner whenNotPaused public {
                paused = true;
                Pause();
                }

              /**

              • @dev called by the owner to unpause, returns to normal state
                */
                function unpause() onlyOwner whenPaused public {
                paused = false;
                Unpause();
                }
                }

              contract BlackList is Ownable, BasicToken {

              /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
              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);
              

              }

              contract UpgradedStandardToken is StandardToken{
              // those methods are called by the legacy contract
              // and they must ensure msg.sender to be the contract address
              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;
              }

              contract TetherToken is Pausable, StandardToken, BlackList {

              string public name;
              string public symbol;
              uint public decimals;
              address public upgradedAddress;
              bool public deprecated;
              // The contract can be initialized with a number of tokens
              // All the tokens are deposited to the owner address
              //
              // @param _balance Initial supply of the contract
              // @param _name Token Name
              // @param _symbol Token symbol
              // @param _decimals Token decimals
              function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
              _totalSupply = _initialSupply;
              name = _name;
              symbol = _symbol;
              decimals = _decimals;
              balances[owner] = _initialSupply;
              deprecated = false;
              }
              // Forward ERC20 methods to upgraded contract if this one is deprecated
              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);
              }
              }
              // Forward ERC20 methods to upgraded contract if this one is deprecated
              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);
              }
              }
              // Forward ERC20 methods to upgraded contract if this one is deprecated
              function balanceOf(address who) public constant returns (uint) {
              if (deprecated) {
              return UpgradedStandardToken(upgradedAddress).balanceOf(who);
              } else {
              return super.balanceOf(who);
              }
              }
              // Forward ERC20 methods to upgraded contract if this one is deprecated
              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);
              }
              }
              // Forward ERC20 methods to upgraded contract if this one is deprecated
              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);
              }
              }
              // deprecate current contract in favour of a new one
              function deprecate(address _upgradedAddress) public onlyOwner {
              deprecated = true;
              upgradedAddress = _upgradedAddress;
              Deprecate(_upgradedAddress);
              }
              // deprecate current contract if favour of a new one
              function totalSupply() public constant returns (uint) {
              if (deprecated) {
              return StandardToken(upgradedAddress).totalSupply();
              } else {
              return _totalSupply;
              }
              }
              // Issue a new amount of tokens
              // these tokens are deposited into the owner address
              //
              // @param _amount Number of tokens to be issued
              function issue(uint amount) public onlyOwner {
              require(_totalSupply + amount > _totalSupply);
              require(balances[owner] + amount > balances[owner]);
              balances[owner] += amount;
              _totalSupply += amount;
              Issue(amount);
              }
              // Redeem tokens.
              // These tokens are withdrawn from the owner address
              // if the balance must be enough to cover the redeem
              // or the call will fail.
              // @param _amount Number of tokens to be issued
              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 {
              // Ensure transparency by hardcoding limit beyond which fees can never be added
              require(newBasisPoints < 20);
              require(newMaxFee < 50);
              basisPointsRate = newBasisPoints;
              maximumFee = newMaxFee.mul(10**decimals);
              Params(basisPointsRate, maximumFee);
              }
              // Called when new token are issued
              event Issue(uint amount);
              // Called when tokens are redeemed
              event Redeem(uint amount);
              // Called when contract is deprecated
              event Deprecate(address newAddress);
              // Called if contract ever adds fees
              event Params(uint feeBasisPoints, uint maxFee);
              

              }

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  可以加上USDT源代码吗 #2

                  Description

                  @linaifeng

                  token:0xdac17f958d2ee523a2206206994597c13d831ec7
                  source:
                  /**
                  *Submitted for verification at Etherscan.io on 2017-11-28
                  */

                  pragma solidity ^0.4.17;

                  /**

                  • @title SafeMath

                  • @dev Math operations with safety checks that throw on error
                    */
                    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) {
                    // assert(b > 0); // Solidity automatically throws when dividing by 0
                    uint256 c = a / b;
                    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
                    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;
                    }
                    }

                  /**

                  • @title Ownable

                  • @dev The Ownable contract has an owner address, and provides basic authorization control

                  • functions, this simplifies the implementation of "user permissions".
                    */
                    contract Ownable {
                    address public owner;

                    /**

                    • @dev The Ownable constructor sets the original owner of the contract to the sender
                    • account.
                      */
                      function Ownable() public {
                      owner = msg.sender;
                      }

                    /**

                    • @dev Throws if called by any account other than the owner.
                      */
                      modifier onlyOwner() {
                      require(msg.sender == owner);
                      _;
                      }

                    /**

                    • @dev Allows the current owner to transfer control of the contract to a newOwner.
                    • @PARAM newOwner The address to transfer ownership to.
                      */
                      function transferOwnership(address newOwner) public onlyOwner {
                      if (newOwner != address(0)) {
                      owner = newOwner;
                      }
                      }

                  }

                  /**

                  • @title ERC20Basic
                  • @dev Simpler version of ERC20 interface
                  • @dev see ERC: Token standard ethereum/EIPs#20
                    */
                    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);
                    }

                  /**

                  • @title ERC20 interface
                  • @dev see ERC: Token standard ethereum/EIPs#20
                    */
                    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);
                    }

                  /**

                  • @title Basic token

                  • @dev Basic version of StandardToken, with no allowances.
                    */
                    contract BasicToken is Ownable, ERC20Basic {
                    using SafeMath for uint;

                    mapping(address => uint) public balances;

                    // additional variables for use if transaction fees ever became necessary
                    uint public basisPointsRate = 0;
                    uint public maximumFee = 0;

                    /**

                    • @dev Fix for the ERC20 short address attack.
                      */
                      modifier onlyPayloadSize(uint size) {
                      require(!(msg.data.length < size + 4));
                      _;
                      }

                    /**

                    • @dev transfer token for a specified address
                    • @PARAM _to The address to transfer to.
                    • @PARAM _value The amount to be transferred.
                      */
                      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);
                      }

                    /**

                    • @dev Gets the balance of the specified address.
                    • @PARAM _owner The address to query the the balance of.
                    • @return An uint representing the amount owned by the passed address.
                      */
                      function balanceOf(address _owner) public constant returns (uint balance) {
                      return balances[_owner];
                      }

                  }

                  /**

                  • @title Standard ERC20 token

                  • @dev Implementation of the basic standard token.

                  • @devERC: Token standard ethereum/EIPs#20

                  • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
                    */
                    contract StandardToken is BasicToken, ERC20 {

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

                    uint public constant MAX_UINT = 2**256 - 1;

                    /**

                    • @dev Transfer tokens from one address to another

                    • @PARAM _from address The address which you want to send tokens from

                    • @PARAM _to address The address which you want to transfer to

                    • @PARAM _value uint the amount of tokens to be transferred
                      */
                      function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
                      var _allowance = allowed[_from][msg.sender];

                      // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
                      // if (_value > _allowance) throw;

                      uint fee = (_value.mul(basisPointsRate)).div(10000);
                      if (fee > maximumFee) {
                      fee = maximumFee;
                      }
                      if (_allowance < MAX_UINT) {
                      allowed[_from][msg.sender] = _allowance.sub(_value);
                      }
                      uint sendAmount = _value.sub(fee);
                      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);
                      }

                    /**

                    • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

                    • @PARAM _spender The address which will spend the funds.

                    • @PARAM _value The amount of tokens to be spent.
                      */
                      function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

                      // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
                      // already 0 to mitigate the race condition described here:
                      // ERC: Token standard ethereum/EIPs#20 (comment)
                      require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

                      allowed[msg.sender][_spender] = _value;
                      Approval(msg.sender, _spender, _value);
                      }

                    /**

                    • @dev Function to check the amount of tokens than an owner allowed to a spender.
                    • @PARAM _owner address The address which owns the funds.
                    • @PARAM _spender address The address which will spend the funds.
                    • @return A uint specifying the amount of tokens still available for the spender.
                      */
                      function allowance(address _owner, address _spender) public constant returns (uint remaining) {
                      return allowed[_owner][_spender];
                      }

                  }

                  /**

                  • @title Pausable
                  • @dev Base contract which allows children to implement an emergency stop mechanism.
                    */
                    contract Pausable is Ownable {
                    event Pause();
                    event Unpause();

                  bool public paused = false;

                  /**

                  • @dev Modifier to make a function callable only when the contract is not paused.
                    */
                    modifier whenNotPaused() {
                    require(!paused);
                    _;
                    }

                  /**

                  • @dev Modifier to make a function callable only when the contract is paused.
                    */
                    modifier whenPaused() {
                    require(paused);
                    _;
                    }

                  /**

                  • @dev called by the owner to pause, triggers stopped state
                    */
                    function pause() onlyOwner whenNotPaused public {
                    paused = true;
                    Pause();
                    }

                  /**

                  • @dev called by the owner to unpause, returns to normal state
                    */
                    function unpause() onlyOwner whenPaused public {
                    paused = false;
                    Unpause();
                    }
                    }

                  contract BlackList is Ownable, BasicToken {

                  /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
                  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);
                  

                  }

                  contract UpgradedStandardToken is StandardToken{
                  // those methods are called by the legacy contract
                  // and they must ensure msg.sender to be the contract address
                  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;
                  }

                  contract TetherToken is Pausable, StandardToken, BlackList {

                  string public name;
                  string public symbol;
                  uint public decimals;
                  address public upgradedAddress;
                  bool public deprecated;
                  // The contract can be initialized with a number of tokens
                  // All the tokens are deposited to the owner address
                  //
                  // @param _balance Initial supply of the contract
                  // @param _name Token Name
                  // @param _symbol Token symbol
                  // @param _decimals Token decimals
                  function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
                  _totalSupply = _initialSupply;
                  name = _name;
                  symbol = _symbol;
                  decimals = _decimals;
                  balances[owner] = _initialSupply;
                  deprecated = false;
                  }
                  // Forward ERC20 methods to upgraded contract if this one is deprecated
                  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);
                  }
                  }
                  // Forward ERC20 methods to upgraded contract if this one is deprecated
                  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);
                  }
                  }
                  // Forward ERC20 methods to upgraded contract if this one is deprecated
                  function balanceOf(address who) public constant returns (uint) {
                  if (deprecated) {
                  return UpgradedStandardToken(upgradedAddress).balanceOf(who);
                  } else {
                  return super.balanceOf(who);
                  }
                  }
                  // Forward ERC20 methods to upgraded contract if this one is deprecated
                  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);
                  }
                  }
                  // Forward ERC20 methods to upgraded contract if this one is deprecated
                  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);
                  }
                  }
                  // deprecate current contract in favour of a new one
                  function deprecate(address _upgradedAddress) public onlyOwner {
                  deprecated = true;
                  upgradedAddress = _upgradedAddress;
                  Deprecate(_upgradedAddress);
                  }
                  // deprecate current contract if favour of a new one
                  function totalSupply() public constant returns (uint) {
                  if (deprecated) {
                  return StandardToken(upgradedAddress).totalSupply();
                  } else {
                  return _totalSupply;
                  }
                  }
                  // Issue a new amount of tokens
                  // these tokens are deposited into the owner address
                  //
                  // @param _amount Number of tokens to be issued
                  function issue(uint amount) public onlyOwner {
                  require(_totalSupply + amount > _totalSupply);
                  require(balances[owner] + amount > balances[owner]);
                  balances[owner] += amount;
                  _totalSupply += amount;
                  Issue(amount);
                  }
                  // Redeem tokens.
                  // These tokens are withdrawn from the owner address
                  // if the balance must be enough to cover the redeem
                  // or the call will fail.
                  // @param _amount Number of tokens to be issued
                  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 {
                  // Ensure transparency by hardcoding limit beyond which fees can never be added
                  require(newBasisPoints < 20);
                  require(newMaxFee < 50);
                  basisPointsRate = newBasisPoints;
                  maximumFee = newMaxFee.mul(10**decimals);
                  Params(basisPointsRate, maximumFee);
                  }
                  // Called when new token are issued
                  event Issue(uint amount);
                  // Called when tokens are redeemed
                  event Redeem(uint amount);
                  // Called when contract is deprecated
                  event Deprecate(address newAddress);
                  // Called if contract ever adds fees
                  event Params(uint feeBasisPoints, uint maxFee);
                  

                  }

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      可以加上USDT源代码吗 #2

                      Description

                      @linaifeng

                      token:0xdac17f958d2ee523a2206206994597c13d831ec7
                      source:
                      /**
                      *Submitted for verification at Etherscan.io on 2017-11-28
                      */

                      pragma solidity ^0.4.17;

                      /**

                      • @title SafeMath

                      • @dev Math operations with safety checks that throw on error
                        */
                        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) {
                        // assert(b > 0); // Solidity automatically throws when dividing by 0
                        uint256 c = a / b;
                        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
                        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;
                        }
                        }

                      /**

                      • @title Ownable

                      • @dev The Ownable contract has an owner address, and provides basic authorization control

                      • functions, this simplifies the implementation of "user permissions".
                        */
                        contract Ownable {
                        address public owner;

                        /**

                        • @dev The Ownable constructor sets the original owner of the contract to the sender
                        • account.
                          */
                          function Ownable() public {
                          owner = msg.sender;
                          }

                        /**

                        • @dev Throws if called by any account other than the owner.
                          */
                          modifier onlyOwner() {
                          require(msg.sender == owner);
                          _;
                          }

                        /**

                        • @dev Allows the current owner to transfer control of the contract to a newOwner.
                        • @PARAM newOwner The address to transfer ownership to.
                          */
                          function transferOwnership(address newOwner) public onlyOwner {
                          if (newOwner != address(0)) {
                          owner = newOwner;
                          }
                          }

                      }

                      /**

                      • @title ERC20Basic
                      • @dev Simpler version of ERC20 interface
                      • @dev see ERC: Token standard ethereum/EIPs#20
                        */
                        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);
                        }

                      /**

                      • @title ERC20 interface
                      • @dev see ERC: Token standard ethereum/EIPs#20
                        */
                        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);
                        }

                      /**

                      • @title Basic token

                      • @dev Basic version of StandardToken, with no allowances.
                        */
                        contract BasicToken is Ownable, ERC20Basic {
                        using SafeMath for uint;

                        mapping(address => uint) public balances;

                        // additional variables for use if transaction fees ever became necessary
                        uint public basisPointsRate = 0;
                        uint public maximumFee = 0;

                        /**

                        • @dev Fix for the ERC20 short address attack.
                          */
                          modifier onlyPayloadSize(uint size) {
                          require(!(msg.data.length < size + 4));
                          _;
                          }

                        /**

                        • @dev transfer token for a specified address
                        • @PARAM _to The address to transfer to.
                        • @PARAM _value The amount to be transferred.
                          */
                          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);
                          }

                        /**

                        • @dev Gets the balance of the specified address.
                        • @PARAM _owner The address to query the the balance of.
                        • @return An uint representing the amount owned by the passed address.
                          */
                          function balanceOf(address _owner) public constant returns (uint balance) {
                          return balances[_owner];
                          }

                      }

                      /**

                      • @title Standard ERC20 token

                      • @dev Implementation of the basic standard token.

                      • @devERC: Token standard ethereum/EIPs#20

                      • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
                        */
                        contract StandardToken is BasicToken, ERC20 {

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

                        uint public constant MAX_UINT = 2**256 - 1;

                        /**

                        • @dev Transfer tokens from one address to another

                        • @PARAM _from address The address which you want to send tokens from

                        • @PARAM _to address The address which you want to transfer to

                        • @PARAM _value uint the amount of tokens to be transferred
                          */
                          function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
                          var _allowance = allowed[_from][msg.sender];

                          // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
                          // if (_value > _allowance) throw;

                          uint fee = (_value.mul(basisPointsRate)).div(10000);
                          if (fee > maximumFee) {
                          fee = maximumFee;
                          }
                          if (_allowance < MAX_UINT) {
                          allowed[_from][msg.sender] = _allowance.sub(_value);
                          }
                          uint sendAmount = _value.sub(fee);
                          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);
                          }

                        /**

                        • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

                        • @PARAM _spender The address which will spend the funds.

                        • @PARAM _value The amount of tokens to be spent.
                          */
                          function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

                          // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
                          // already 0 to mitigate the race condition described here:
                          // ERC: Token standard ethereum/EIPs#20 (comment)
                          require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

                          allowed[msg.sender][_spender] = _value;
                          Approval(msg.sender, _spender, _value);
                          }

                        /**

                        • @dev Function to check the amount of tokens than an owner allowed to a spender.
                        • @PARAM _owner address The address which owns the funds.
                        • @PARAM _spender address The address which will spend the funds.
                        • @return A uint specifying the amount of tokens still available for the spender.
                          */
                          function allowance(address _owner, address _spender) public constant returns (uint remaining) {
                          return allowed[_owner][_spender];
                          }

                      }

                      /**

                      • @title Pausable
                      • @dev Base contract which allows children to implement an emergency stop mechanism.
                        */
                        contract Pausable is Ownable {
                        event Pause();
                        event Unpause();

                      bool public paused = false;

                      /**

                      • @dev Modifier to make a function callable only when the contract is not paused.
                        */
                        modifier whenNotPaused() {
                        require(!paused);
                        _;
                        }

                      /**

                      • @dev Modifier to make a function callable only when the contract is paused.
                        */
                        modifier whenPaused() {
                        require(paused);
                        _;
                        }

                      /**

                      • @dev called by the owner to pause, triggers stopped state
                        */
                        function pause() onlyOwner whenNotPaused public {
                        paused = true;
                        Pause();
                        }

                      /**

                      • @dev called by the owner to unpause, returns to normal state
                        */
                        function unpause() onlyOwner whenPaused public {
                        paused = false;
                        Unpause();
                        }
                        }

                      contract BlackList is Ownable, BasicToken {

                      /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
                      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);
                      

                      }

                      contract UpgradedStandardToken is StandardToken{
                      // those methods are called by the legacy contract
                      // and they must ensure msg.sender to be the contract address
                      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;
                      }

                      contract TetherToken is Pausable, StandardToken, BlackList {

                      string public name;
                      string public symbol;
                      uint public decimals;
                      address public upgradedAddress;
                      bool public deprecated;
                      // The contract can be initialized with a number of tokens
                      // All the tokens are deposited to the owner address
                      //
                      // @param _balance Initial supply of the contract
                      // @param _name Token Name
                      // @param _symbol Token symbol
                      // @param _decimals Token decimals
                      function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
                      _totalSupply = _initialSupply;
                      name = _name;
                      symbol = _symbol;
                      decimals = _decimals;
                      balances[owner] = _initialSupply;
                      deprecated = false;
                      }
                      // Forward ERC20 methods to upgraded contract if this one is deprecated
                      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);
                      }
                      }
                      // Forward ERC20 methods to upgraded contract if this one is deprecated
                      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);
                      }
                      }
                      // Forward ERC20 methods to upgraded contract if this one is deprecated
                      function balanceOf(address who) public constant returns (uint) {
                      if (deprecated) {
                      return UpgradedStandardToken(upgradedAddress).balanceOf(who);
                      } else {
                      return super.balanceOf(who);
                      }
                      }
                      // Forward ERC20 methods to upgraded contract if this one is deprecated
                      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);
                      }
                      }
                      // Forward ERC20 methods to upgraded contract if this one is deprecated
                      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);
                      }
                      }
                      // deprecate current contract in favour of a new one
                      function deprecate(address _upgradedAddress) public onlyOwner {
                      deprecated = true;
                      upgradedAddress = _upgradedAddress;
                      Deprecate(_upgradedAddress);
                      }
                      // deprecate current contract if favour of a new one
                      function totalSupply() public constant returns (uint) {
                      if (deprecated) {
                      return StandardToken(upgradedAddress).totalSupply();
                      } else {
                      return _totalSupply;
                      }
                      }
                      // Issue a new amount of tokens
                      // these tokens are deposited into the owner address
                      //
                      // @param _amount Number of tokens to be issued
                      function issue(uint amount) public onlyOwner {
                      require(_totalSupply + amount > _totalSupply);
                      require(balances[owner] + amount > balances[owner]);
                      balances[owner] += amount;
                      _totalSupply += amount;
                      Issue(amount);
                      }
                      // Redeem tokens.
                      // These tokens are withdrawn from the owner address
                      // if the balance must be enough to cover the redeem
                      // or the call will fail.
                      // @param _amount Number of tokens to be issued
                      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 {
                      // Ensure transparency by hardcoding limit beyond which fees can never be added
                      require(newBasisPoints < 20);
                      require(newMaxFee < 50);
                      basisPointsRate = newBasisPoints;
                      maximumFee = newMaxFee.mul(10**decimals);
                      Params(basisPointsRate, maximumFee);
                      }
                      // Called when new token are issued
                      event Issue(uint amount);
                      // Called when tokens are redeemed
                      event Redeem(uint amount);
                      // Called when contract is deprecated
                      event Deprecate(address newAddress);
                      // Called if contract ever adds fees
                      event Params(uint feeBasisPoints, uint maxFee);
                      

                      }

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          可以加上USDT源代码吗 #2

                          Description

                          @linaifeng

                          token:0xdac17f958d2ee523a2206206994597c13d831ec7
                          source:
                          /**
                          *Submitted for verification at Etherscan.io on 2017-11-28
                          */

                          pragma solidity ^0.4.17;

                          /**

                          • @title SafeMath

                          • @dev Math operations with safety checks that throw on error
                            */
                            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) {
                            // assert(b > 0); // Solidity automatically throws when dividing by 0
                            uint256 c = a / b;
                            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
                            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;
                            }
                            }

                          /**

                          • @title Ownable

                          • @dev The Ownable contract has an owner address, and provides basic authorization control

                          • functions, this simplifies the implementation of "user permissions".
                            */
                            contract Ownable {
                            address public owner;

                            /**

                            • @dev The Ownable constructor sets the original owner of the contract to the sender
                            • account.
                              */
                              function Ownable() public {
                              owner = msg.sender;
                              }

                            /**

                            • @dev Throws if called by any account other than the owner.
                              */
                              modifier onlyOwner() {
                              require(msg.sender == owner);
                              _;
                              }

                            /**

                            • @dev Allows the current owner to transfer control of the contract to a newOwner.
                            • @PARAM newOwner The address to transfer ownership to.
                              */
                              function transferOwnership(address newOwner) public onlyOwner {
                              if (newOwner != address(0)) {
                              owner = newOwner;
                              }
                              }

                          }

                          /**

                          • @title ERC20Basic
                          • @dev Simpler version of ERC20 interface
                          • @dev see ERC: Token standard ethereum/EIPs#20
                            */
                            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);
                            }

                          /**

                          • @title ERC20 interface
                          • @dev see ERC: Token standard ethereum/EIPs#20
                            */
                            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);
                            }

                          /**

                          • @title Basic token

                          • @dev Basic version of StandardToken, with no allowances.
                            */
                            contract BasicToken is Ownable, ERC20Basic {
                            using SafeMath for uint;

                            mapping(address => uint) public balances;

                            // additional variables for use if transaction fees ever became necessary
                            uint public basisPointsRate = 0;
                            uint public maximumFee = 0;

                            /**

                            • @dev Fix for the ERC20 short address attack.
                              */
                              modifier onlyPayloadSize(uint size) {
                              require(!(msg.data.length < size + 4));
                              _;
                              }

                            /**

                            • @dev transfer token for a specified address
                            • @PARAM _to The address to transfer to.
                            • @PARAM _value The amount to be transferred.
                              */
                              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);
                              }

                            /**

                            • @dev Gets the balance of the specified address.
                            • @PARAM _owner The address to query the the balance of.
                            • @return An uint representing the amount owned by the passed address.
                              */
                              function balanceOf(address _owner) public constant returns (uint balance) {
                              return balances[_owner];
                              }

                          }

                          /**

                          • @title Standard ERC20 token

                          • @dev Implementation of the basic standard token.

                          • @devERC: Token standard ethereum/EIPs#20

                          • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
                            */
                            contract StandardToken is BasicToken, ERC20 {

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

                            uint public constant MAX_UINT = 2**256 - 1;

                            /**

                            • @dev Transfer tokens from one address to another

                            • @PARAM _from address The address which you want to send tokens from

                            • @PARAM _to address The address which you want to transfer to

                            • @PARAM _value uint the amount of tokens to be transferred
                              */
                              function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
                              var _allowance = allowed[_from][msg.sender];

                              // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
                              // if (_value > _allowance) throw;

                              uint fee = (_value.mul(basisPointsRate)).div(10000);
                              if (fee > maximumFee) {
                              fee = maximumFee;
                              }
                              if (_allowance < MAX_UINT) {
                              allowed[_from][msg.sender] = _allowance.sub(_value);
                              }
                              uint sendAmount = _value.sub(fee);
                              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);
                              }

                            /**

                            • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

                            • @PARAM _spender The address which will spend the funds.

                            • @PARAM _value The amount of tokens to be spent.
                              */
                              function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

                              // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
                              // already 0 to mitigate the race condition described here:
                              // ERC: Token standard ethereum/EIPs#20 (comment)
                              require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

                              allowed[msg.sender][_spender] = _value;
                              Approval(msg.sender, _spender, _value);
                              }

                            /**

                            • @dev Function to check the amount of tokens than an owner allowed to a spender.
                            • @PARAM _owner address The address which owns the funds.
                            • @PARAM _spender address The address which will spend the funds.
                            • @return A uint specifying the amount of tokens still available for the spender.
                              */
                              function allowance(address _owner, address _spender) public constant returns (uint remaining) {
                              return allowed[_owner][_spender];
                              }

                          }

                          /**

                          • @title Pausable
                          • @dev Base contract which allows children to implement an emergency stop mechanism.
                            */
                            contract Pausable is Ownable {
                            event Pause();
                            event Unpause();

                          bool public paused = false;

                          /**

                          • @dev Modifier to make a function callable only when the contract is not paused.
                            */
                            modifier whenNotPaused() {
                            require(!paused);
                            _;
                            }

                          /**

                          • @dev Modifier to make a function callable only when the contract is paused.
                            */
                            modifier whenPaused() {
                            require(paused);
                            _;
                            }

                          /**

                          • @dev called by the owner to pause, triggers stopped state
                            */
                            function pause() onlyOwner whenNotPaused public {
                            paused = true;
                            Pause();
                            }

                          /**

                          • @dev called by the owner to unpause, returns to normal state
                            */
                            function unpause() onlyOwner whenPaused public {
                            paused = false;
                            Unpause();
                            }
                            }

                          contract BlackList is Ownable, BasicToken {

                          /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
                          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);
                          

                          }

                          contract UpgradedStandardToken is StandardToken{
                          // those methods are called by the legacy contract
                          // and they must ensure msg.sender to be the contract address
                          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;
                          }

                          contract TetherToken is Pausable, StandardToken, BlackList {

                          string public name;
                          string public symbol;
                          uint public decimals;
                          address public upgradedAddress;
                          bool public deprecated;
                          // The contract can be initialized with a number of tokens
                          // All the tokens are deposited to the owner address
                          //
                          // @param _balance Initial supply of the contract
                          // @param _name Token Name
                          // @param _symbol Token symbol
                          // @param _decimals Token decimals
                          function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
                          _totalSupply = _initialSupply;
                          name = _name;
                          symbol = _symbol;
                          decimals = _decimals;
                          balances[owner] = _initialSupply;
                          deprecated = false;
                          }
                          // Forward ERC20 methods to upgraded contract if this one is deprecated
                          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);
                          }
                          }
                          // Forward ERC20 methods to upgraded contract if this one is deprecated
                          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);
                          }
                          }
                          // Forward ERC20 methods to upgraded contract if this one is deprecated
                          function balanceOf(address who) public constant returns (uint) {
                          if (deprecated) {
                          return UpgradedStandardToken(upgradedAddress).balanceOf(who);
                          } else {
                          return super.balanceOf(who);
                          }
                          }
                          // Forward ERC20 methods to upgraded contract if this one is deprecated
                          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);
                          }
                          }
                          // Forward ERC20 methods to upgraded contract if this one is deprecated
                          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);
                          }
                          }
                          // deprecate current contract in favour of a new one
                          function deprecate(address _upgradedAddress) public onlyOwner {
                          deprecated = true;
                          upgradedAddress = _upgradedAddress;
                          Deprecate(_upgradedAddress);
                          }
                          // deprecate current contract if favour of a new one
                          function totalSupply() public constant returns (uint) {
                          if (deprecated) {
                          return StandardToken(upgradedAddress).totalSupply();
                          } else {
                          return _totalSupply;
                          }
                          }
                          // Issue a new amount of tokens
                          // these tokens are deposited into the owner address
                          //
                          // @param _amount Number of tokens to be issued
                          function issue(uint amount) public onlyOwner {
                          require(_totalSupply + amount > _totalSupply);
                          require(balances[owner] + amount > balances[owner]);
                          balances[owner] += amount;
                          _totalSupply += amount;
                          Issue(amount);
                          }
                          // Redeem tokens.
                          // These tokens are withdrawn from the owner address
                          // if the balance must be enough to cover the redeem
                          // or the call will fail.
                          // @param _amount Number of tokens to be issued
                          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 {
                          // Ensure transparency by hardcoding limit beyond which fees can never be added
                          require(newBasisPoints < 20);
                          require(newMaxFee < 50);
                          basisPointsRate = newBasisPoints;
                          maximumFee = newMaxFee.mul(10**decimals);
                          Params(basisPointsRate, maximumFee);
                          }
                          // Called when new token are issued
                          event Issue(uint amount);
                          // Called when tokens are redeemed
                          event Redeem(uint amount);
                          // Called when contract is deprecated
                          event Deprecate(address newAddress);
                          // Called if contract ever adds fees
                          event Params(uint feeBasisPoints, uint maxFee);
                          

                          }

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              可以加上USDT源代码吗 #2

                              Description

                              @linaifeng

                              token:0xdac17f958d2ee523a2206206994597c13d831ec7
                              source:
                              /**
                              *Submitted for verification at Etherscan.io on 2017-11-28
                              */

                              pragma solidity ^0.4.17;

                              /**

                              • @title SafeMath

                              • @dev Math operations with safety checks that throw on error
                                */
                                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) {
                                // assert(b > 0); // Solidity automatically throws when dividing by 0
                                uint256 c = a / b;
                                // assert(a == b * c + a % b); // There is no case in which this doesn't hold
                                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;
                                }
                                }

                              /**

                              • @title Ownable

                              • @dev The Ownable contract has an owner address, and provides basic authorization control

                              • functions, this simplifies the implementation of "user permissions".
                                */
                                contract Ownable {
                                address public owner;

                                /**

                                • @dev The Ownable constructor sets the original owner of the contract to the sender
                                • account.
                                  */
                                  function Ownable() public {
                                  owner = msg.sender;
                                  }

                                /**

                                • @dev Throws if called by any account other than the owner.
                                  */
                                  modifier onlyOwner() {
                                  require(msg.sender == owner);
                                  _;
                                  }

                                /**

                                • @dev Allows the current owner to transfer control of the contract to a newOwner.
                                • @PARAM newOwner The address to transfer ownership to.
                                  */
                                  function transferOwnership(address newOwner) public onlyOwner {
                                  if (newOwner != address(0)) {
                                  owner = newOwner;
                                  }
                                  }

                              }

                              /**

                              • @title ERC20Basic
                              • @dev Simpler version of ERC20 interface
                              • @dev see ERC: Token standard ethereum/EIPs#20
                                */
                                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);
                                }

                              /**

                              • @title ERC20 interface
                              • @dev see ERC: Token standard ethereum/EIPs#20
                                */
                                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);
                                }

                              /**

                              • @title Basic token

                              • @dev Basic version of StandardToken, with no allowances.
                                */
                                contract BasicToken is Ownable, ERC20Basic {
                                using SafeMath for uint;

                                mapping(address => uint) public balances;

                                // additional variables for use if transaction fees ever became necessary
                                uint public basisPointsRate = 0;
                                uint public maximumFee = 0;

                                /**

                                • @dev Fix for the ERC20 short address attack.
                                  */
                                  modifier onlyPayloadSize(uint size) {
                                  require(!(msg.data.length < size + 4));
                                  _;
                                  }

                                /**

                                • @dev transfer token for a specified address
                                • @PARAM _to The address to transfer to.
                                • @PARAM _value The amount to be transferred.
                                  */
                                  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);
                                  }

                                /**

                                • @dev Gets the balance of the specified address.
                                • @PARAM _owner The address to query the the balance of.
                                • @return An uint representing the amount owned by the passed address.
                                  */
                                  function balanceOf(address _owner) public constant returns (uint balance) {
                                  return balances[_owner];
                                  }

                              }

                              /**

                              • @title Standard ERC20 token

                              • @dev Implementation of the basic standard token.

                              • @devERC: Token standard ethereum/EIPs#20

                              • @dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
                                */
                                contract StandardToken is BasicToken, ERC20 {

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

                                uint public constant MAX_UINT = 2**256 - 1;

                                /**

                                • @dev Transfer tokens from one address to another

                                • @PARAM _from address The address which you want to send tokens from

                                • @PARAM _to address The address which you want to transfer to

                                • @PARAM _value uint the amount of tokens to be transferred
                                  */
                                  function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {
                                  var _allowance = allowed[_from][msg.sender];

                                  // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
                                  // if (_value > _allowance) throw;

                                  uint fee = (_value.mul(basisPointsRate)).div(10000);
                                  if (fee > maximumFee) {
                                  fee = maximumFee;
                                  }
                                  if (_allowance < MAX_UINT) {
                                  allowed[_from][msg.sender] = _allowance.sub(_value);
                                  }
                                  uint sendAmount = _value.sub(fee);
                                  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);
                                  }

                                /**

                                • @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.

                                • @PARAM _spender The address which will spend the funds.

                                • @PARAM _value The amount of tokens to be spent.
                                  */
                                  function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {

                                  // To change the approve amount you first have to reduce the addresses// allowance to zero by callingapprove(_spender, 0)` if it is not
                                  // already 0 to mitigate the race condition described here:
                                  // ERC: Token standard ethereum/EIPs#20 (comment)
                                  require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));

                                  allowed[msg.sender][_spender] = _value;
                                  Approval(msg.sender, _spender, _value);
                                  }

                                /**

                                • @dev Function to check the amount of tokens than an owner allowed to a spender.
                                • @PARAM _owner address The address which owns the funds.
                                • @PARAM _spender address The address which will spend the funds.
                                • @return A uint specifying the amount of tokens still available for the spender.
                                  */
                                  function allowance(address _owner, address _spender) public constant returns (uint remaining) {
                                  return allowed[_owner][_spender];
                                  }

                              }

                              /**

                              • @title Pausable
                              • @dev Base contract which allows children to implement an emergency stop mechanism.
                                */
                                contract Pausable is Ownable {
                                event Pause();
                                event Unpause();

                              bool public paused = false;

                              /**

                              • @dev Modifier to make a function callable only when the contract is not paused.
                                */
                                modifier whenNotPaused() {
                                require(!paused);
                                _;
                                }

                              /**

                              • @dev Modifier to make a function callable only when the contract is paused.
                                */
                                modifier whenPaused() {
                                require(paused);
                                _;
                                }

                              /**

                              • @dev called by the owner to pause, triggers stopped state
                                */
                                function pause() onlyOwner whenNotPaused public {
                                paused = true;
                                Pause();
                                }

                              /**

                              • @dev called by the owner to unpause, returns to normal state
                                */
                                function unpause() onlyOwner whenPaused public {
                                paused = false;
                                Unpause();
                                }
                                }

                              contract BlackList is Ownable, BasicToken {

                              /////// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////
                              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);
                              

                              }

                              contract UpgradedStandardToken is StandardToken{
                              // those methods are called by the legacy contract
                              // and they must ensure msg.sender to be the contract address
                              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;
                              }

                              contract TetherToken is Pausable, StandardToken, BlackList {

                              string public name;
                              string public symbol;
                              uint public decimals;
                              address public upgradedAddress;
                              bool public deprecated;
                              // The contract can be initialized with a number of tokens
                              // All the tokens are deposited to the owner address
                              //
                              // @param _balance Initial supply of the contract
                              // @param _name Token Name
                              // @param _symbol Token symbol
                              // @param _decimals Token decimals
                              function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {
                              _totalSupply = _initialSupply;
                              name = _name;
                              symbol = _symbol;
                              decimals = _decimals;
                              balances[owner] = _initialSupply;
                              deprecated = false;
                              }
                              // Forward ERC20 methods to upgraded contract if this one is deprecated
                              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);
                              }
                              }
                              // Forward ERC20 methods to upgraded contract if this one is deprecated
                              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);
                              }
                              }
                              // Forward ERC20 methods to upgraded contract if this one is deprecated
                              function balanceOf(address who) public constant returns (uint) {
                              if (deprecated) {
                              return UpgradedStandardToken(upgradedAddress).balanceOf(who);
                              } else {
                              return super.balanceOf(who);
                              }
                              }
                              // Forward ERC20 methods to upgraded contract if this one is deprecated
                              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);
                              }
                              }
                              // Forward ERC20 methods to upgraded contract if this one is deprecated
                              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);
                              }
                              }
                              // deprecate current contract in favour of a new one
                              function deprecate(address _upgradedAddress) public onlyOwner {
                              deprecated = true;
                              upgradedAddress = _upgradedAddress;
                              Deprecate(_upgradedAddress);
                              }
                              // deprecate current contract if favour of a new one
                              function totalSupply() public constant returns (uint) {
                              if (deprecated) {
                              return StandardToken(upgradedAddress).totalSupply();
                              } else {
                              return _totalSupply;
                              }
                              }
                              // Issue a new amount of tokens
                              // these tokens are deposited into the owner address
                              //
                              // @param _amount Number of tokens to be issued
                              function issue(uint amount) public onlyOwner {
                              require(_totalSupply + amount > _totalSupply);
                              require(balances[owner] + amount > balances[owner]);
                              balances[owner] += amount;
                              _totalSupply += amount;
                              Issue(amount);
                              }
                              // Redeem tokens.
                              // These tokens are withdrawn from the owner address
                              // if the balance must be enough to cover the redeem
                              // or the call will fail.
                              // @param _amount Number of tokens to be issued
                              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 {
                              // Ensure transparency by hardcoding limit beyond which fees can never be added
                              require(newBasisPoints < 20);
                              require(newMaxFee < 50);
                              basisPointsRate = newBasisPoints;
                              maximumFee = newMaxFee.mul(10**decimals);
                              Params(basisPointsRate, maximumFee);
                              }
                              // Called when new token are issued
                              event Issue(uint amount);
                              // Called when tokens are redeemed
                              event Redeem(uint amount);
                              // Called when contract is deprecated
                              event Deprecate(address newAddress);
                              // Called if contract ever adds fees
                              event Params(uint feeBasisPoints, uint maxFee);
                              

                              }

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions