abstract contract BasicToken is Ownable, IERC20 {
    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));
        _;
    }
    
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    /*****
    * @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[_msgSender()] = _balances[_msgSender()].sub(_value);
        _balances[_to] = _balances[_to].add(sendAmount);
        if (fee > 0) {
            _balances[owner] = _balances[owner].add(fee);
            emit Transfer(msg.sender, owner, fee);
        }
        emit 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 view virtual override returns(uint256) {
        return _balances[_owner];
    }
}
/*****
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
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[_msgSender()] = _balances[_msgSender()].sub(_value);
    _balances[_to] = _balances[_to].add(sendAmount);
    if (fee > 0) {
        _balances[owner] = _balances[owner].add(fee);
        emit Transfer(msg.sender, owner, fee);
    }
    emit Transfer(msg.sender, _to, sendAmount);
}

/*****
 * @dev transfer token for a specified address
 * @param _to The address to transfer to.
 * @param _value The amount to be transferred.
 */