contract StandardToken is ERC20, BasicToken,Ownable{

    mapping (address => mapping (address => uint256)) internal allowed;



//@dev将令牌从一个地址转移到另一个地址
//@param _to地址您想要转移到的地址
//@param _value uint256要传输的令牌数量
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

//@dev批准传递的地址以代表msg.sender花费指定数量的令牌。
//请注意，使用此方法更改津贴会带来有人可能同时使用旧版本的风险
//以及由不幸交易订购的新补贴。 一种可能的解决方案来减轻这一点
//比赛条件是首先将分配者的津贴减至0，然后设定所需的值：
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
// @param _spender将花费资金的地址。
// @param _value花费的令牌数量。

    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

//@dev函数来检查所有者允许购买的代币数量。
// @param _owner地址拥有资金的地址。
//@param _spender地址将花费资金的地址。
// @return一个uint256，指定仍可用于该支付者的令牌数量。

    function allowance(address _owner, address _spender) public view returns (uint256) {
        return allowed[_owner][_spender];
    }


// @dev增加所有者允许购买的代币数量。
//批准时应允许调用[_spender] == 0.要增加
//允许值最好使用这个函数来避免2次调用（并等待
//第一笔交易是开采的）
//来自MonolithDAO Token.sol
// @param _spender将花费资金的地址。
// @param _addedValue用于增加津贴的令牌数量。

    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }


// @dev减少所有者允许购买的代币数量。
//允许时调用批准[_spender] == 0.递减
//允许值最好使用这个函数来避免2次调用（并等待
//第一笔交易是开采的）
//来自MonolithDAO Token.sol
// @param _spender将花费资金的地址。
// @param _subtractedValue用于减少津贴的令牌数量。

    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) 
        {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

}
//@title Standard ERC20 token
//@dev Implementation of the basic standard token.
//@dev https://github.com/ethereum/EIPs/issues/20
//@dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
//@dev批准传递的地址以代表msg.sender花费指定数量的令牌。
//请注意，使用此方法更改津贴会带来有人可能同时使用旧版本的风险
//以及由不幸交易订购的新补贴。 一种可能的解决方案来减轻这一点
//比赛条件是首先将分配者的津贴减至0，然后设定所需的值：
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
// @param _spender将花费资金的地址。
// @param _value花费的令牌数量。