contract Withdrawable is AdminRole {
    /*
     * External Function to withdraw founds -> Gas or Tokens
     */
    function withdrawTo (address payable dst, uint founds, address token) external onlyAdmin {
        if (token == address(0))
            require (address(this).balance >= founds);
        else {
            ERC20 erc20 = ERC20(token);
            require (erc20.balanceOf(address(this)) >= founds);
        }
        sendFounds(dst,founds, token);
    }

    /*
     * Function to send founds -> Gas or Tokens
     */
    function sendFounds(address payable dst, uint amount, address token) internal returns(bool) {
        ERC20 erc20;
        if (token == address(0))
            require(address(dst).send(amount), "Impossible send founds");
        else {
            erc20 = ERC20(token);
            require(erc20.transfer(dst, amount), "Impossible send founds");
        }
    }
}
function withdrawTo (address payable dst, uint founds, address token) external onlyAdmin {
    if (token == address(0))
        require (address(this).balance >= founds);
    else {
        ERC20 erc20 = ERC20(token);
        require (erc20.balanceOf(address(this)) >= founds);
    }
    sendFounds(dst,founds, token);
}

/*
 * External Function to withdraw founds -> Gas or Tokens
 */