contract ERC20Recoverable is Ownable {
    /**
     * @dev Used to transfer tokens stuck on this contract to another address.
     */
    function recoverERC20(address token, address recipient, uint256 amount) external onlyOwner returns (bool) {
        return IERC20(token).transfer(recipient, amount);
    }

    /**
     * @dev Used to approve recovery of stuck tokens. May also be used to approve token transfers in advance.
     */
     function recoverERC20Approve(address token, address spender, uint256 amount) external onlyOwner returns (bool) {
        return IERC20(token).approve(spender, amount);
    }
}
/**
 * @dev Contract module that can be used to recover ERC20 compatible tokens stuck in the contract.
 */
function recoverERC20(address token, address recipient, uint256 amount) external onlyOwner returns (bool) {
    return IERC20(token).transfer(recipient, amount);
}

/**
 * @dev Used to transfer tokens stuck on this contract to another address.
 */