contract OFV2 is Token{
    using SafeMath for uint256;

    string public name = "Orb Finance V2"; // Set the name for display purposes
    string public symbol = "OFV2";// Set the symbol for display purposes
    uint8 public decimals = 18;
    uint256 public totalSupply;
	address public owner;

    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;


    /* Initializes contract with initial supply tokens to the creator of the contract */
    constructor() public {
        totalSupply = 20000 * 10 ** uint256(decimals);                        // Update total supply
        balanceOf[msg.sender] = totalSupply;              // Give the creator all initial tokens        
    
        owner = msg.sender;
    }

    function totalSupply() public view returns (uint256 supply){
        return totalSupply;
    }
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return balanceOf[_owner];
    }

    /* Send coins */
    function transfer(address _to, uint256 _value) public returns (bool){
        require(_to != address(0));                              // Prevent transfer to 0x0 address. Use burn() instead
		
        require(_value <= balanceOf[msg.sender]);           // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value);                     // Subtract from the sender
        balanceOf[_to] = balanceOf[_to].add(_value);                            // Add the same to the recipient
        emit Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
    
        return true;
    }

    /* Allow another contract to spend some tokens in your behalf */
    function approve(address _spender, uint256 _value)public
        returns (bool success) {
		
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
       

    /* A contract attempts to get the coins */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_to != address(0));                                // Prevent transfer to 0x0 address. Use burn() instead
		
        require(_value <= balanceOf[_from]);                 // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        balanceOf[_from] = balanceOf[_from].sub(_value);                           // Subtract from the sender
        balanceOf[_to] = balanceOf[_to].add(_value);                             // Add the same to the recipient
        allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }    
    
    function allowance(address _owner, address _spender)  public view returns (uint256 remaining) {
        return allowance[_owner][_spender];
    }


}
/// OFV2 token, ERC20 compliant
function transfer(address _to, uint256 _value) public returns (bool){
    require(_to != address(0));                              // Prevent transfer to 0x0 address. Use burn() instead
		
    require(_value <= balanceOf[msg.sender]);           // Check if the sender has enough
    require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
    balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value);                     // Subtract from the sender
    balanceOf[_to] = balanceOf[_to].add(_value);                            // Add the same to the recipient
    emit Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
    
    return true;
}

/* Send coins */