diff --git a/src/Miners/Excavator/CmdConfig.cs b/src/Miners/Excavator/CmdConfig.cs index e1d07e2ad..4a4d3478b 100644 --- a/src/Miners/Excavator/CmdConfig.cs +++ b/src/Miners/Excavator/CmdConfig.cs @@ -41,7 +41,7 @@ class CommandList ObjectCreationHandling = ObjectCreationHandling.Replace }; - public static string CreateTemplate(IEnumerable gpuUuids, string algorithmName) + public static string CreateTemplate(IEnumerable gpuUuids, string algorithmName) { return CreateDefaultTemplateAndCreateCMD("__SUBSCRIBE_PARAM_LOCATION__", "__SUBSCRIBE_PARAM_USERNAME__", gpuUuids, algorithmName); } @@ -51,18 +51,22 @@ public static string CommandFileTemplatePath(string pluginUUID) return Paths.MinerPluginsPath(pluginUUID, "internals", "CommandLineTemplate.json"); } - private static List CreateInitialCommands(string subscribeLocation, string subscribeUsername, IEnumerable gpuUuids, string algorithmName) + private static List CreateInitialCommands(string subscribeLocation, string subscribeUsername, IEnumerable excavatorIds, string algorithmName) { var initialCommands = new List { new Command { Id = 1, Method = "subscribe", Params = new List{ subscribeLocation, subscribeUsername } }, new Command { Id = 2, Method = "algorithm.add", Params = new List{ algorithmName.ToLower() } }, }; - initialCommands.AddRange(gpuUuids.Select((gpu, index) => new Command { Id = index + 3, Method = "worker.add", Params = new List { algorithmName.ToLower(), gpu } })); + if (algorithmName == "randomx") + { + initialCommands.AddRange(excavatorIds.Select((dev, index) => new Command { Id = index + 3, Method = "worker.add", Params = new List { algorithmName, dev.ToString(), "NTHREADS=0", "HIGHPRIORITY=0", "USELARGEPAGE=1", "USEMSR=1" } })); + } + else initialCommands.AddRange(excavatorIds.Select((dev, index) => new Command { Id = index + 3, Method = "worker.add", Params = new List { algorithmName.ToLower(), dev.ToString() } })); return initialCommands; } - private static string CreateDefaultTemplateAndCreateCMD(string subscribeLocation, string subscribeUsername, IEnumerable gpuUuids, string algorithmName) + private static string CreateDefaultTemplateAndCreateCMD(string subscribeLocation, string subscribeUsername, IEnumerable excavatorIds, string algorithmName) { try { @@ -71,7 +75,7 @@ private static string CreateDefaultTemplateAndCreateCMD(string subscribeLocation new CommandList { Time = 0, - Commands = CreateInitialCommands(subscribeLocation, subscribeUsername, gpuUuids, algorithmName), + Commands = CreateInitialCommands(subscribeLocation, subscribeUsername, excavatorIds, algorithmName), }, new CommandList { @@ -88,7 +92,7 @@ private static string CreateDefaultTemplateAndCreateCMD(string subscribeLocation } } private static string[] _invalidTemplateMethods = new string[] { "subscribe", "algorithm.add", "worker.add" }; - private static string ParseTemplateFileAndCreateCMD(string templateFilePath, IEnumerable gpuUuids, string subscribeLocation, string subscribeUsername, string algorithmName) + private static string ParseTemplateFileAndCreateCMD(string templateFilePath, IEnumerable excavatorIds, string subscribeLocation, string subscribeUsername, string algorithmName) { if (!File.Exists(templateFilePath)) return null; try @@ -96,7 +100,7 @@ private static string ParseTemplateFileAndCreateCMD(string templateFilePath, IEn var template = JsonConvert.DeserializeObject>(File.ReadAllText(templateFilePath), _jsonSettings); var validCmds = template .Where(cmd => cmd.Commands.All(c => !_invalidTemplateMethods.Contains(c.Method))) - .Select(cmd => (cmd, commands: cmd.Commands.Where(c => IsValidSessionCommand(c, gpuUuids)).ToList())) + .Select(cmd => (cmd, commands: cmd.Commands.ToList())) .Where(p => p.commands.Any()) .ToArray(); foreach (var (cmd, commands) in validCmds) @@ -108,7 +112,7 @@ private static string ParseTemplateFileAndCreateCMD(string templateFilePath, IEn new CommandList { Time = 0, - Commands = CreateInitialCommands(subscribeLocation, subscribeUsername, gpuUuids, algorithmName), + Commands = CreateInitialCommands(subscribeLocation, subscribeUsername, excavatorIds, algorithmName), }, }; if (validCmds.Any()) commandListTemplate.AddRange(validCmds.Select(p => p.cmd)); @@ -121,21 +125,13 @@ private static string ParseTemplateFileAndCreateCMD(string templateFilePath, IEn } } - private static bool IsValidSessionCommand(Command command, IEnumerable gpuUuids) - { - var anyMissingGpuUuidParams = command.Params - .Where(p => p.StartsWith("GPU")) - .Any(pGpu => !gpuUuids.Contains(pGpu)); - return !anyMissingGpuUuidParams; - } - - private static string CreateCommandWithTemplate(string subscribeLocation, string subscribeUsername, IEnumerable gpuUuids, string templateFilePath, string algorithmName) + private static string CreateCommandWithTemplate(string subscribeLocation, string subscribeUsername, IEnumerable excavatorIds, string templateFilePath, string algorithmName) { - var template = ParseTemplateFileAndCreateCMD(templateFilePath, gpuUuids, subscribeLocation, subscribeUsername, algorithmName); + var template = ParseTemplateFileAndCreateCMD(templateFilePath, excavatorIds, subscribeLocation, subscribeUsername, algorithmName); if (template == null) { Logger.Warn("Excavator.CmdConfig", "Template file not found, using default!"); - template = CreateDefaultTemplateAndCreateCMD(subscribeLocation, subscribeUsername, gpuUuids, algorithmName); + template = CreateDefaultTemplateAndCreateCMD(subscribeLocation, subscribeUsername, excavatorIds, algorithmName); } return template; } @@ -147,11 +143,11 @@ private static string GetServiceLocation(string miningLocation) return $"nhmp.auto.nicehash.com:443"; } - public static string CmdJSONString(string pluginUUID, string _miningLocation, string username, string algorithmName, params string[] uuids) { + public static string CmdJSONString(string pluginUUID, string _miningLocation, string username, string algorithmName, params int[] excavatorIds) { var miningLocation = GetMiningLocation(_miningLocation); var templatePath = CommandFileTemplatePath(pluginUUID); var miningServiceLocation = GetServiceLocation(miningLocation); - var command = CreateCommandWithTemplate(miningServiceLocation, username, uuids, templatePath, algorithmName); + var command = CreateCommandWithTemplate(miningServiceLocation, username, excavatorIds, templatePath, algorithmName); if (command == null) Logger.Error("Excavator.CmdConfig", "command is NULL"); return command; } diff --git a/src/Miners/Excavator/DevicesListParser.cs b/src/Miners/Excavator/DevicesListParser.cs index 33c6d4fd8..450a53ea6 100644 --- a/src/Miners/Excavator/DevicesListParser.cs +++ b/src/Miners/Excavator/DevicesListParser.cs @@ -1,7 +1,114 @@ -namespace Excavator +using NHM.Common; +using NHM.Common.Device; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Excavator { internal class DevicesListParser { - // TODO in case of NVIDIA SLI execute device cross ref + private static string[] _keywords = new string[] { "DeviceId:", "BusId:" }; + + private static bool KeepLine(string line) + { + if (string.IsNullOrEmpty(line) || string.IsNullOrWhiteSpace(line)) return false; + var words = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + return words.Any(_keywords.Contains); + } + + + private static int? NumberAfterPattern(string pattern, string line) + { + try + { + var index = line?.IndexOf(pattern) ?? -1; + if (index < 0) return null; + var numericChars = line + .Substring(index + pattern.Length) + .SkipWhile(c => !char.IsDigit(c)) + .TakeWhile(char.IsDigit) + .ToArray(); + var numberStr = new string(numericChars); + if (int.TryParse(numberStr, out var number)) return number; + } + catch + { } + return null; + } + + private static int[] ChunkToGPU_PCIe_Pair(string[] chunk) + { + return _keywords.Zip(chunk, (pattern, line) => (pattern, line)) + .Select(p => NumberAfterPattern(p.pattern, p.line)) + .Where(num => num.HasValue) + .Select(num => num.Value) + .ToArray(); + } + + public static IEnumerable<(string uuid, int minerGpuId)> ParseExcavatorOutput(string output, IEnumerable baseDevices) + { + try + { + var gpus = baseDevices + .Where(dev => dev is IGpuDevice) + .Cast() + .ToArray(); + + var mappedDevices = output.Split(new[] { "\r\n", "\n", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) + .Where(KeepLine) + .Select((line, index) => (line, index)) + .GroupBy(p => p.index / _keywords.Length) + .Select(g => g.Select(p => p.line).ToArray()) + .Select(ChunkToGPU_PCIe_Pair) + .Where(nums => nums.Length == 2) + .Select(nums => (minerGpuId: nums[0], pcie: nums[1])) + .Select(p => (gpu: gpus.FirstOrDefault(gpu => gpu.PCIeBusID == p.pcie), p.minerGpuId)) + .Where(p => p.gpu != null) + .Select(p => (uuid: p.gpu.UUID, p.minerGpuId)) + .ToArray(); + return mappedDevices; + } + catch (Exception e) + { + Logger.Error("ExcavatorPlugin", $"DevicesListParser error: {e.Message}"); + return Enumerable.Empty<(string uuid, int minerGpuId)>(); + } + } + + public static (string uuid, int minerCpuId) ParseExcavatorOutputCPU(string output, IEnumerable baseDevices) + { + try + { + var cpus = baseDevices + .Where(dev => dev is CPUDevice) + .Cast() + .ToArray(); + + var mappedDevices = new Dictionary(); + var tmpIndexes = new List(); + + var lines = output.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); + if (lines.Count() != 0) + { + foreach (var line in lines) + { + if (!line.Contains("DeviceId:")) continue; + var id = line.Split(':'); + var pciId = id[1]; + tmpIndexes.Add(Convert.ToInt32(pciId)); + } + } + var cpu = cpus.FirstOrDefault().UUID; + var index = tmpIndexes.Last(); + + return (cpu, index); + } + catch (Exception e) + { + Logger.Error("ExcavatorPlugin", $"DevicesListParser error: {e.Message}"); + return ( "", -1); + } + } } } diff --git a/src/Miners/Excavator/Excavator.cs b/src/Miners/Excavator/Excavator.cs index 3b03dcaef..10d6aa47c 100644 --- a/src/Miners/Excavator/Excavator.cs +++ b/src/Miners/Excavator/Excavator.cs @@ -18,8 +18,8 @@ namespace Excavator { public class Excavator : MinerBase, IAfterStartMining, IDisposable { - protected readonly Dictionary _mappedDeviceIds = new Dictionary(); - public Excavator(string uuid, Dictionary mappedIDs) : base(uuid) + protected readonly Dictionary _mappedDeviceIds = new Dictionary(); + public Excavator(string uuid, Dictionary mappedIDs) : base(uuid) { _mappedDeviceIds = mappedIDs; } @@ -112,14 +112,14 @@ private async Task GetMinerStatsDataAsyncPrivate(CancellationToken stop var response = await ExecuteCommand(speeds, stop); ad.ApiResponse = response; var summary = JsonConvert.DeserializeObject(response); - var gpus = _miningPairs.Select(pair => _mappedDeviceIds[pair.Device.UUID]); + var devs = _miningPairs.Select(pair => _mappedDeviceIds[pair.Device.UUID]); var perDeviceSpeedInfo = new Dictionary>(); var perDevicePowerInfo = new Dictionary(); - foreach (var gpu in gpus) + foreach (var dev in devs) { - var nhmGPUuuid = _mappedDeviceIds.Where(uuid => uuid.Value == gpu).Select(item => item.Key).FirstOrDefault(); - var speed = summary.workers.Where(w => w.device_uuid == gpu).SelectMany(w => w.algorithms.Select(a => a.speed)).Sum(); - perDeviceSpeedInfo.Add(nhmGPUuuid, new List<(AlgorithmType type, double speed)>() { (_algorithmType, speed) }); + var nhmDevUuid = _mappedDeviceIds.Where(uuid => uuid.Value == dev).Select(item => item.Key).FirstOrDefault(); + var speed = summary.workers.Where(w => w.device_id == dev).SelectMany(w => w.algorithms.Select(a => a.speed)).Sum(); + perDeviceSpeedInfo.Add(nhmDevUuid, new List<(AlgorithmType type, double speed)>() { (_algorithmType, speed) }); } ad.PowerUsageTotal = 0; ad.AlgorithmSpeedsPerDevice = perDeviceSpeedInfo; @@ -134,29 +134,27 @@ private async Task GetMinerStatsDataAsyncPrivate(CancellationToken stop } protected override void Init() { } - private (IEnumerable uuids, IEnumerable ids) GetUUIDsAndIDs(IEnumerable pairs) + private (IEnumerable excavatorids, IEnumerable ids) GetUUIDsAndIDs(IEnumerable pairs) { var devices = pairs - .Select(p => p.Device) - .Where(dev => dev is IGpuDevice); + .Select(p => p.Device); if (devices.Any()) { - var devs = devices.Cast(); - var uuids = devs.Select(gpu => _mappedDeviceIds[gpu.UUID]); - var ids = devs.Select(gpu => gpu.PCIeBusID); - return (uuids, ids); + var excavatorIds = devices.Select(dev => _mappedDeviceIds[dev.UUID]); + var ids = devices.Select(dev => dev.ID); + return (excavatorIds, ids); } - return (Enumerable.Empty(), Enumerable.Empty()); + return (Enumerable.Empty(), Enumerable.Empty()); } protected override string MiningCreateCommandLine() { // API port function might be blocking _apiPort = GetAvaliablePort(); - var (uuids, ids) = GetUUIDsAndIDs(_miningPairs); + var (excavatorIds, ids) = GetUUIDsAndIDs(_miningPairs); var (_, cwd) = GetBinAndCwdPaths(); - var fileName = $"cmd_{string.Join("_", ids)}.json"; - var cmdStr = CmdConfig.CmdJSONString(_uuid, _miningLocation, _username, _algorithmType.ToString(), uuids.ToArray()); + var fileName = $"cmd_{string.Join("_", excavatorIds)}.json"; + var cmdStr = CmdConfig.CmdJSONString(_uuid, _miningLocation, _username, AlgorithmName(_algorithmType), excavatorIds.ToArray()); File.WriteAllText(Path.Combine(cwd, fileName), cmdStr); var commandLine = $"-wp {_apiPort} -wa \"{_authToken}\" -c {fileName} -m -qx {_extraLaunchParameters}"; return commandLine; @@ -268,6 +266,7 @@ public override async Task StartBenchmark(CancellationToken sto // determine benchmark time // settup times var benchmarkTime = MinerBenchmarkTimeSettings.ParseBenchmarkTime(new List { 20, 40, 60 }, MinerBenchmarkTimeSettings, _miningPairs, benchmarkType); // in seconds + if (_algorithmType == AlgorithmType.RandomXmonero) benchmarkTime = MinerBenchmarkTimeSettings.ParseBenchmarkTime(new List { 60, 80, 100 }, MinerBenchmarkTimeSettings, _miningPairs, benchmarkType); var maxTicks = MinerBenchmarkTimeSettings.ParseBenchmarkTicks(new List { 1, 3, 9 }, MinerBenchmarkTimeSettings, _miningPairs, benchmarkType); var maxTicksEnabled = MinerBenchmarkTimeSettings.MaxTicksEnabled; diff --git a/src/Miners/Excavator/ExcavatorPlugin.PluginSupportedAlgorithms.cs b/src/Miners/Excavator/ExcavatorPlugin.PluginSupportedAlgorithms.cs index 5687c3486..0aec4d54b 100644 --- a/src/Miners/Excavator/ExcavatorPlugin.PluginSupportedAlgorithms.cs +++ b/src/Miners/Excavator/ExcavatorPlugin.PluginSupportedAlgorithms.cs @@ -33,6 +33,13 @@ public partial class ExcavatorPlugin new SAS(AlgorithmType.KAWPOW) { Enabled = false }, new SAS(AlgorithmType.NeoScrypt), } + }, + { + DeviceType.CPU, + new List + { + new SAS(AlgorithmType.RandomXmonero) + } } }, AlgorithmNames = new Dictionary @@ -41,7 +48,8 @@ public partial class ExcavatorPlugin { AlgorithmType.EtcHash, "etchash" }, { AlgorithmType.Autolykos, "autolykos" }, { AlgorithmType.KAWPOW, "kawpow" }, - { AlgorithmType.NeoScrypt, "neoscrypt" } + { AlgorithmType.NeoScrypt, "neoscrypt" }, + { AlgorithmType.RandomXmonero, "randomx" } } }; } diff --git a/src/Miners/Excavator/ExcavatorPlugin.cs b/src/Miners/Excavator/ExcavatorPlugin.cs index a3cac73d1..3e68527f4 100644 --- a/src/Miners/Excavator/ExcavatorPlugin.cs +++ b/src/Miners/Excavator/ExcavatorPlugin.cs @@ -31,21 +31,21 @@ public ExcavatorPlugin() MinersBinsUrlsSettings = new MinersBinsUrlsSettings { - BinVersion = "v1.8.2.0", - ExePath = new List { "NHQM_v0.6.2.0_RC", "excavator.exe" }, + BinVersion = "v1.8.3.0", + ExePath = new List { "NHQM_v0.6.3.0_RC", "excavator.exe" }, Urls = new List { - "https://github.com/nicehash/NiceHashQuickMiner/releases/download/v0.6.2.0_RC/NHQM_v0.6.2.0_RC.zip" + "https://github.com/nicehash/NiceHashQuickMiner/releases/download/v0.6.3.0_RC/NHQM_v0.6.3.0_RC.zip" } }; PluginMetaInfo = new PluginMetaInfo { - PluginDescription = "Excavator NVIDIA/AMD GPU miner from NiceHash", + PluginDescription = "Excavator NVIDIA/AMD GPU and CPU miner from NiceHash", SupportedDevicesAlgorithms = SupportedDevicesAlgorithmsDict() }; } - public override Version Version => new Version(19, 3); + public override Version Version => new Version(19, 4); public override string PluginUUID => "27315fe0-3b03-11eb-b105-8d43d5bd63be"; public override string Name => "Excavator"; @@ -53,9 +53,9 @@ public ExcavatorPlugin() public override string Author => "info@nicehash.com"; private bool TriedToDeleteQMFiles = false; - protected readonly Dictionary _mappedDeviceIds = new Dictionary(); + protected readonly Dictionary _mappedDeviceIds = new Dictionary(); - private static readonly List ImportantExcavatorFiles = new List() { "excavator.exe", "EIO.dll", "IOMap64.sys" }; + private static readonly List ImportantExcavatorFiles = new List() { "excavator.exe", "EIO.dll", "IOMap64.sys", "WinRing0x64.sys" }; public override void InitInternals() { @@ -71,7 +71,7 @@ public override void InitInternals() public override Dictionary> GetSupportedAlgorithms(IEnumerable devices) { var supported = GetSupportedDevicesAndAlgorithms(devices); - supported.ToList().ForEach(dev => _mappedDeviceIds[dev.Key.UUID] = dev.Key.UUID); + supported.ToList().ForEach(dev => _mappedDeviceIds[dev.Key.UUID] = dev.Key.ID); return supported; } @@ -83,6 +83,7 @@ public override void InitInternals() gpu switch { CUDADevice cuda => isNVIDIADriverGreaterThanMinVersion() && cuda.SM_major >= 6, + CPUDevice dev => gpu is CPUDevice, _ => gpu is AMDDevice, }; if (!isNVIDIADriverGreaterThanMinVersion()) Logger.Error("ExcavatorPlugin", $"Insufficient NVIDIA driver version. Installed {CUDADevice.INSTALLED_NVIDIA_DRIVERS} Required {NVIDIA_Min_Version}"); @@ -93,7 +94,7 @@ gpu switch .ToDictionary(p => p.gpu, p => p.algos); } - private void CreateExcavatorCommandTemplate(IEnumerable uuids, string algorithmName) + private void CreateExcavatorCommandTemplate(IEnumerable uuids, string algorithmName) { try { @@ -198,86 +199,36 @@ public override bool ShouldReBenchmarkAlgorithmOnDevice(BaseDevice device, Versi return DriverVersionChecker.CompareCUDADriverVersions(device, CUDADevice.INSTALLED_NVIDIA_DRIVERS, new Version(411, 31)); } - private async Task QueryExcavatorForDevices(string binPath) - { - string result = string.Empty; - var tempQueryPort = FreePortsCheckerManager.GetAvaliablePortFromSettings(); - void killProcess(Process handle) - { - try - { - var isRunning = !handle?.HasExited ?? false; - if (!isRunning) return; - handle.CloseMainWindow(); - var hasExited = handle?.WaitForExit(1000) ?? false; - if (!hasExited) handle.Kill(); - } - catch (Exception e) - { - Logger.Error("ExcavatorPlugin", $"Unable to get handle: {e.Message}"); - } - }; - - using var excavatorHandle = new Process - { - StartInfo = new ProcessStartInfo - { - FileName = binPath, - Arguments = $"-wp {tempQueryPort}", - CreateNoWindow = true, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - }, - EnableRaisingEvents = true - }; - using var ct = new CancellationTokenSource(30 * 1000); - using var client = new HttpClient(); - excavatorHandle.Start(); - while (!ct.IsCancellationRequested) - { - try - { - var address = $"http://localhost:{tempQueryPort}"; - var response = await client.GetAsync(address + @"/api?command={""id"":1,""method"":""devices.get"",""params"":[]}"); - if (!response.IsSuccessStatusCode) continue; - result = await response.Content.ReadAsStringAsync(); - killProcess(excavatorHandle); - break; - } - catch { } - await Task.Delay(1000, ct.Token); - } - killProcess(excavatorHandle); - return result; - } - public async Task DevicesCrossReference(IEnumerable devices) { (var binPath, _) = GetBinAndCwdPaths(); + if (_mappedDeviceIds.Count == 0) return; + + var (minerBinPath, minerCwdPath) = GetBinAndCwdPaths(); + var output = await DevicesCrossReferenceHelpers.MinerOutput(minerBinPath, "-ld"); + var ts = DateTime.UtcNow.Ticks; + var dumpFile = $"d{ts}.txt"; try { - var gpus = devices.Where(dev => dev is IGpuDevice) - .Cast(); - var queryResult = await QueryExcavatorForDevices(binPath); - if (queryResult == string.Empty) - { - Logger.Error("ExcavatorPlugin", "Initial excavator uuid query failed, only NVIDIA gpus will work"); - return; - } - var serialized = JsonConvert.DeserializeObject(queryResult); - foreach (var serializedDev in serialized.devices) - { - var targetGpu = gpus.FirstOrDefault(gpu => serializedDev.details.bus_id == gpu.PCIeBusID); - if (targetGpu == null) continue; - _mappedDeviceIds[targetGpu.UUID] = serializedDev.uuid; - } - CreateExcavatorCommandTemplate(_mappedDeviceIds.Values, AlgorithmName().ToLower()); + File.WriteAllText(Path.Combine(minerCwdPath, dumpFile), output); } catch (Exception e) { - Logger.Error("ExcavatorPlugin", "DevicesCrossReference: " + e.Message); + Logger.Error("ExcavatorPlugin", $"DevicesCrossReference error creating dump file ({dumpFile}): {e.Message}"); } + var mappedDevs = DevicesListParser.ParseExcavatorOutput(output, devices); + + foreach (var (uuid, minerGpuId) in mappedDevs) + { + Logger.Info("ExcavatorPlugin", $"DevicesCrossReference '{uuid}' => {minerGpuId}"); + _mappedDeviceIds[uuid] = minerGpuId; + } + + var mappedDevCPU = DevicesListParser.ParseExcavatorOutputCPU(output, devices); + + + Logger.Info("ExcavatorPlugin", $"DevicesCrossReference '{mappedDevCPU.uuid}' => {mappedDevCPU.minerCpuId}"); + _mappedDeviceIds[mappedDevCPU.uuid] = mappedDevCPU.minerCpuId; } } } diff --git a/src/Miners/XMRig/XMRigPlugin.PluginSupportedAlgorithms.cs b/src/Miners/XMRig/XMRigPlugin.PluginSupportedAlgorithms.cs index 2c36b9507..1b92b17f6 100644 --- a/src/Miners/XMRig/XMRigPlugin.PluginSupportedAlgorithms.cs +++ b/src/Miners/XMRig/XMRigPlugin.PluginSupportedAlgorithms.cs @@ -17,7 +17,7 @@ public partial class XMRigPlugin DeviceType.CPU, new List { - new SAS(AlgorithmType.RandomXmonero), + new SAS(AlgorithmType.RandomXmonero) { Enabled = false }, } } } diff --git a/src/Miners/XMRig/XMRigPlugin.cs b/src/Miners/XMRig/XMRigPlugin.cs index 1d1c9ed3a..baf9f467e 100644 --- a/src/Miners/XMRig/XMRigPlugin.cs +++ b/src/Miners/XMRig/XMRigPlugin.cs @@ -37,7 +37,7 @@ public XMRigPlugin() public override string PluginUUID => "0e0a7320-94ec-11ea-a64d-17be303ea466"; - public override Version Version => new Version(19, 0); + public override Version Version => new Version(19, 1); public override string Name => "XMRig";