From e0dd19e3716116f60756b0c8c3ecb8659a4331ef Mon Sep 17 00:00:00 2001 From: Useless Guru <30080938+UselessGuru@users.noreply.github.com> Date: Tue, 26 Dec 2023 11:33:35 +0100 Subject: [PATCH] v5.0.2.5 Changes: - Remove all references to NemosMiner web page and rig monitor (web page is down, cannot contact Nemo) Enhancements: - Core: Minor speed optimizations Fixes: - Core: Benchmarking / Power consumption measuring miner count incorrect (Regression from 5.0.2.3) - Core: Error 'Miner data reader exited unexpectedly' (no more thread jobs available) - Main text window: Fix hash rate formatting of previously run miners - Legay GUI: Fix hash rate formatting of previously run miners Miner changes: - OneZeroMiner-v1.2.8 - TeamRedMiner-v0.10.15 - Wildrig-v0.40.4 --- Balances/HashCryptos.ps1 | 4 +- Balances/HiveON.ps1 | 4 +- Balances/MiningDutch.ps1 | 4 +- Balances/MiningPoolHub.ps1 | 4 +- Balances/NiceHash External.ps1 | 4 +- Balances/NiceHash Internal.ps1 | 4 +- Balances/ProHashing.ps1 | 4 +- Balances/ZergPool.ps1 | 4 +- Balances/Zpool.ps1 | 4 +- Brains/HashCryptos.ps1 | 2 +- Brains/MiningDutch.ps1 | 2 +- Brains/ProHashing.ps1 | 2 +- Brains/ZPool.ps1 | 2 +- Brains/ZergPool.ps1 | 2 +- ChangeLog.txt | 24 +- Data/Algorithms.json | 1 + Data/CoinNames.json | 3 + Data/CurrencyAlgorithm.json | 3 + Data/DagData.json | 456 ++--- Data/UnprofitableAlgorithms.json | 1 - Includes/APIServer.psm1 | 4 +- Includes/BalancesTracker.ps1 | 2 +- Includes/Core.ps1 | 17 +- Includes/Core_dev.ps1 | 1502 +++++++++++++++++ Includes/Downloader.ps1 | 4 +- Includes/Include.psm1 | 26 +- Includes/LegacyGUI.ps1 | 115 +- Includes/MinerAPIs/BzMiner.ps1 | 4 +- Includes/MinerAPIs/Ccminer.ps1 | 4 +- Includes/MinerAPIs/EthMiner.ps1 | 4 +- Includes/MinerAPIs/FireIce.ps1 | 4 +- Includes/MinerAPIs/Gminer.ps1 | 4 +- Includes/MinerAPIs/HellMiner.ps1 | 4 +- Includes/MinerAPIs/MiniZ.ps1 | 4 +- Includes/MinerAPIs/NBMiner.ps1 | 4 +- Includes/MinerAPIs/NanoMiner.ps1 | 4 +- Includes/MinerAPIs/OneZero.ps1 | 4 +- Includes/MinerAPIs/Rigel.ps1 | 4 +- Includes/MinerAPIs/SRBMiner.ps1 | 4 +- Includes/MinerAPIs/TeamBlackMiner.ps1 | 4 +- Includes/MinerAPIs/Trex.ps1 | 4 +- Includes/MinerAPIs/Xgminer.ps1 | 6 +- Includes/MinerAPIs/XmRig.ps1 | 4 +- Includes/MinerAPIs/lolMiner.ps1 | 4 +- Miners/BzMiner-v19.0.1.ps1 | 4 +- Miners/CcminerAlexis78-v1.5.2.ps1 | 4 +- Miners/CcminerDyn-v1.0.2.ps1 | 4 +- Miners/CcminerKlausT-v8.25.ps1 | 4 +- Miners/CcminerKlausT-v8.26x2.ps1 | 4 +- Miners/CcminerLyra2z330-v8.21r9.ps1 | 4 +- Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 | 4 +- Miners/CcminerMemeHash-v2.5.5.9.ps1 | 4 +- Miners/CcminerNeoscryptXaya-v0.2.ps1 | 4 +- Miners/CcminerVerusCpu-v3.8.3.ps1 | 6 +- Miners/CcminerVerusGpu-v3.8.3.ps1 | 4 +- Miners/ClaymoreDualME-v2.7.ps1 | 4 +- Miners/ClaymoreNeoscrypt-v1.2.ps1 | 4 +- Miners/CpuMiner-v1.4.ps1 | 4 +- Miners/CryptoDredge-v0.16.0.ps1 | 4 +- Miners/CryptoDredge-v0.27.0.ps1 | 4 +- Miners/EthMiner-v0.19.0.18.ps1 | 4 +- Miners/EvrProgPow-v1p3p0.ps1 | 4 +- Miners/GMiner-v2.75.ps1 | 4 +- Miners/GMiner-v3.43.ps1 | 4 +- Miners/HellMiner-v0.59.1.ps1 | 4 +- Miners/JayddeeCpu-v23.15.ps1 | 4 +- Miners/KawpowMiner-v1.2.4cl.ps1 | 4 +- Miners/KawpowMiner-v1.2.4cuda.ps1 | 4 +- Miners/Kudaraidee-v1.2.0a.ps1 | 4 +- Miners/MiniZ-v2.2c.ps1 | 4 +- Miners/NBMiner-v42.3.ps1 | 4 +- Miners/NSFMiner-v1.3.14.ps1 | 4 +- Miners/NanoMiner-v3.8.6.ps1 | 6 +- Miners/Ninjarig-1.0.3.ps1 | 4 +- Miners/NosuchCpu-v3.8.8.1.ps1 | 4 +- Miners/OneZeroMiner-v1.2.5.ps1 | 4 +- Miners/OneZeroMiner-v1.2.8.ps1 | 77 + Miners/PhoenixMiner-v6.2c.ps1 | 4 +- Miners/Radiator-v1.0.0.ps1 | 4 +- Miners/Raptor3umCpu-v2.0.ps1 | 4 +- Miners/Rigel-v1.11.0.ps1 | 4 +- Miners/RplantCpu-v5.0.34.ps1 | 6 +- Miners/RplantCpu-v5.0.36.ps1 | 6 +- Miners/RrkzCpu-v4.2.ps1 | 4 +- Miners/SRBMinerMulti-v0.9.4.ps1 | 4 +- Miners/SRBMinerMulti-v2.4.4.ps1 | 6 +- Miners/SgMinerFancyIX-v0.9.4.ps1 | 4 +- Miners/Suprminer-v2.31v2.ps1 | 4 +- Miners/TTMiner-v2023.4.3.ps1 | 4 +- Miners/TTMiner-v5.0.3.ps1 | 4 +- Miners/TeamBlackMiner-v2.16.ps1 | 4 +- Miners/TeamRedMiner-v0.10.14.ps1 | 148 -- Miners/TeamRedMiner-v0.10.15.ps1 | 148 ++ Miners/Trex-v0.26.8.ps1 | 4 +- ...ldrig-v0.40.2a.ps1 => Wildrig-v0.40.4.ps1} | 10 +- Miners/XmRig-v6.20.0.ps1 | 8 +- Miners/XmrStak-v2.10.8.ps1 | 8 +- Miners/ZealotEnemy-v2.6.2.ps1 | 4 +- Miners/ZealotEnemy-v2.6.3.ps1 | 4 +- Miners/lolMiner-v1.81.ps1 | 4 +- NemosMiner.ps1 | 40 +- Pools/HashCryptos.ps1 | 2 +- Pools/HiveON.ps1 | 2 +- Pools/MiningDutch.ps1 | 2 +- Pools/MiningPoolHub.ps1 | 2 +- Pools/NiceHash.ps1 | 2 +- Pools/ProHashing.ps1 | 2 +- Pools/ZPool.ps1 | 2 +- Pools/ZergPool.ps1 | 2 +- Version.txt | 2 +- Web/APIdocs.html | 8 +- Web/parts/head.html | 4 +- Web/poolsall.html | 6 + Web/poolsbest.html | 6 + Web/poolsunavailable.html | 6 + Web/scripts/demo.ps1 | 4 +- 116 files changed, 2309 insertions(+), 666 deletions(-) create mode 100644 Includes/Core_dev.ps1 create mode 100644 Miners/OneZeroMiner-v1.2.8.ps1 delete mode 100644 Miners/TeamRedMiner-v0.10.14.ps1 create mode 100644 Miners/TeamRedMiner-v0.10.15.ps1 rename Miners/{Wildrig-v0.40.2a.ps1 => Wildrig-v0.40.4.ps1} (99%) diff --git a/Balances/HashCryptos.ps1 b/Balances/HashCryptos.ps1 index d3f1e96d30..e790484147 100644 --- a/Balances/HashCryptos.ps1 +++ b/Balances/HashCryptos.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\HashCryptos.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/HiveON.ps1 b/Balances/HiveON.ps1 index e678e4768f..a516806e19 100644 --- a/Balances/HiveON.ps1 +++ b/Balances/HiveON.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\Hiveon.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/MiningDutch.ps1 b/Balances/MiningDutch.ps1 index 79cb30adab..5d2e55357d 100644 --- a/Balances/MiningDutch.ps1 +++ b/Balances/MiningDutch.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\MiningDutch.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/MiningPoolHub.ps1 b/Balances/MiningPoolHub.ps1 index 099765fff0..9b1c0ea595 100644 --- a/Balances/MiningPoolHub.ps1 +++ b/Balances/MiningPoolHub.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\MiningPoolHub.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/NiceHash External.ps1 b/Balances/NiceHash External.ps1 index 88045f2d4d..9b39f66949 100644 --- a/Balances/NiceHash External.ps1 +++ b/Balances/NiceHash External.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\NiceHash Internal.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/NiceHash Internal.ps1 b/Balances/NiceHash Internal.ps1 index 7a3fe1b550..5df6e01c92 100644 --- a/Balances/NiceHash Internal.ps1 +++ b/Balances/NiceHash Internal.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\NiceHash Internal.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/ProHashing.ps1 b/Balances/ProHashing.ps1 index 5907774ede..788fa58eac 100644 --- a/Balances/ProHashing.ps1 +++ b/Balances/ProHashing.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\ProHashing.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/ZergPool.ps1 b/Balances/ZergPool.ps1 index d557d4fb32..30e57f1206 100644 --- a/Balances/ZergPool.ps1 +++ b/Balances/ZergPool.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\ZergPool.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Balances/Zpool.ps1 b/Balances/Zpool.ps1 index 67d89c00fc..1faf3b9e1e 100644 --- a/Balances/Zpool.ps1 +++ b/Balances/Zpool.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Balances\Zpool.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Brains/HashCryptos.ps1 b/Brains/HashCryptos.ps1 index f97f5fa355..1283b68296 100644 --- a/Brains/HashCryptos.ps1 +++ b/Brains/HashCryptos.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Brains\MiningDutch.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Brains/MiningDutch.ps1 b/Brains/MiningDutch.ps1 index 635cd5e55f..ae9cf1998c 100644 --- a/Brains/MiningDutch.ps1 +++ b/Brains/MiningDutch.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Brains\MiningDutch.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Brains/ProHashing.ps1 b/Brains/ProHashing.ps1 index c923555597..52a3e5eb40 100644 --- a/Brains/ProHashing.ps1 +++ b/Brains/ProHashing.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Brains\ProHashing.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Brains/ZPool.ps1 b/Brains/ZPool.ps1 index 0e8687ba46..bbc0a19acb 100644 --- a/Brains/ZPool.ps1 +++ b/Brains/ZPool.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Brains\ZPool.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 08 July 2023 #> diff --git a/Brains/ZergPool.ps1 b/Brains/ZergPool.ps1 index 6c9ff4c716..ae0b27fe3d 100644 --- a/Brains/ZergPool.ps1 +++ b/Brains/ZergPool.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Brains\ZergPool.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/ChangeLog.txt b/ChangeLog.txt index dd4d9d26f7..60262a1477 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -9,11 +9,32 @@ If you are coming from 3.8.x.x it is highly recommended that you install NemosMi Known issues: - Balance Tracker / Earnings Graph: Date change take does not respect local time zone (accumulated data is calculated in UTC time) +ChangeLog NemosMiner 5.0.2.5 2023/12/26 +======================================= + +Changes: +- Remove all references to NemosMiner web page and rig monitor (web page is down, cannot contact Nemo) + +Enhancements: +- Core: Minor speed optimizations + +Fixes: +- Core: Benchmarking / Power consumption measuring miner count incorrect (Regression from 5.0.2.3) +- Core: Error 'Miner data reader exited unexpectedly' (no more thread jobs available) +- Main text window: Fix hash rate formatting of previously run miners +- Legay GUI: Fix hash rate formatting of previously run miners + +Miner changes: +- OneZeroMiner-v1.2.8 +- TeamRedMiner-v0.10.15 +- Wildrig-v0.40.4 + + ChangeLog NemosMiner 5.0.2.4 2023/12/20 ======================================= Enhancements: -- Pool: Add 'PoolUri' property with link to algorithms web page +- Pools: Add 'PoolUri' property with link to algorithms web page Fixes: - PhoenixMiner: Did not create single algorithm miner objects (Regression from 5.0.0.0) @@ -21,6 +42,7 @@ Fixes: Miner updates: - lolMiner-v1.81 - Rigel-v1.11.0 +- SRBMinerMulti-v2.4.4 - TeamBlackMiner-v2.16 - Wildrig-v0.40.2a diff --git a/Data/Algorithms.json b/Data/Algorithms.json index 74acc81123..b60a6047b6 100644 --- a/Data/Algorithms.json +++ b/Data/Algorithms.json @@ -27,6 +27,7 @@ "blake2bbtcc": "Blake2bBtcc", "blake2bglt": "Blake2bGlt", "blake2bsha3": "Blake2bSha3", + "blake3decred": "Decred", "blake3ironfish": "Ironfish", "chainox": "0x10", "chukwa": "Argon2Chukwa", diff --git a/Data/CoinNames.json b/Data/CoinNames.json index 1c8a833b3c..8a86344881 100644 --- a/Data/CoinNames.json +++ b/Data/CoinNames.json @@ -3,6 +3,7 @@ "ACM": "Actinium", "ADOT": "Alterdot", "AE": "Aeternity", + "AIPG": "Aipowergrid", "AKA": "AKA", "ALPH": "Alephium", "ALT": "Altcoinchain", @@ -68,6 +69,7 @@ "CURVE": "Curve", "CY": "Cyberyen", "DASH": "Dash", + "DCR": "Decred", "DEM": "DeutscheEmark", "DGB": "Digibyte", "DGC": "Digital", @@ -79,6 +81,7 @@ "DMS": "Documentchain", "DNX": "DynexCoin", "DOGE": "DogeCoin", + "DOGETHER": "Dogether", "DVT": "Devault", "DYN": "Dynamic", "EAC": "EarthCoin", diff --git a/Data/CurrencyAlgorithm.json b/Data/CurrencyAlgorithm.json index 69b5594c12..a4aac64302 100644 --- a/Data/CurrencyAlgorithm.json +++ b/Data/CurrencyAlgorithm.json @@ -4,6 +4,7 @@ "ADOT": "Argon2d16000", "AE": "Cuckoo29", "AIB": "Scrypt", + "AIPG": "KawPow", "AKA": "Ethash", "ALPH": "Blake3", "ALT": "Ethash", @@ -74,6 +75,7 @@ "D": "Tribus", "DASH": "X11", "DBIX": "Ethash", + "DCR": "Decred", "DEM": "SHA256", "DGB": "Qubit", "DGC": "X11", @@ -85,6 +87,7 @@ "DMS": "YescryptR32", "DNX": "DynexSolve", "DOGE": "Scrypt", + "DOGETHER": "Ethash", "DVT": "SHA256", "DYN": "Argon2dDyn", "DYNAMO": "DynamoCoin", diff --git a/Data/DagData.json b/Data/DagData.json index 143c95ac87..41dc6d1f39 100644 --- a/Data/DagData.json +++ b/Data/DagData.json @@ -1,28 +1,28 @@ { "Algorithm": { "Autolykos2": { - "BlockHeight": 1159484, + "BlockHeight": 1164233, "CoinName": "ERG", "DAGsize": 3558121875, - "Epoch": 727 + "Epoch": 731 }, "EtcHash": { - "BlockHeight": 18948128, + "BlockHeight": 18986961, "CoinName": "ETC", - "DAGsize": 3732925568, - "Epoch": 317 + "DAGsize": 3741318016, + "Epoch": 318 }, "Ethash": { - "BlockHeight": 18564951, + "BlockHeight": 18609772, "CoinName": "ETHF", - "DAGsize": 6274676864, - "Epoch": 620 + "DAGsize": 6291454336, + "Epoch": 622 }, "EthashB3": { - "BlockHeight": 1505793, + "BlockHeight": 1565198, "CoinName": "HYP", - "DAGsize": 1509948032, - "Epoch": 52 + "DAGsize": 1526726528, + "Epoch": 54 }, "EvrProgPow": { "BlockHeight": 0, @@ -31,80 +31,89 @@ "Epoch": 2 }, "FiroPow": { - "BlockHeight": 802906, + "BlockHeight": 806393, "CoinName": "FIRO", - "DAGsize": 6266287744, - "Epoch": 619 + "DAGsize": 6291454336, + "Epoch": 622 }, "FiroPowSCC": { - "BlockHeight": 802906, + "BlockHeight": 806393, "CoinName": "FIRO", - "DAGsize": 6266287744, - "Epoch": 619 + "DAGsize": 6291454336, + "Epoch": 622 }, "KawPow": { - "BlockHeight": 3112676, + "BlockHeight": 3121268, "CoinName": "RVN", - "DAGsize": 4571790208, - "Epoch": 417 + "DAGsize": 4580174464, + "Epoch": 418 }, "Octopus": { - "BlockHeight": 85778067, + "BlockHeight": 86222967, "CoinName": "CFX", - "DAGsize": 7063207168, - "Epoch": 165 + "DAGsize": 7079974144, + "Epoch": 166 }, "ProgPowSero": { - "BlockHeight": 11640347, + "BlockHeight": 11684672, "CoinName": "SERO", - "DAGsize": 4345295488, - "Epoch": 390 + "DAGsize": 4353687424, + "Epoch": 391 }, "ProgPowZ": { - "BlockHeight": 2422444, + "BlockHeight": 2431041, "CoinName": "ZANO", - "DAGsize": 1761606272, - "Epoch": 82 + "DAGsize": 1769995904, + "Epoch": 83 }, "UbqHash": { - "BlockHeight": 4689593, + "BlockHeight": 4714765, "CoinName": "UBQ", - "DAGsize": 2399139968, - "Epoch": 158 + "DAGsize": 2407530368, + "Epoch": 159 } }, "Currency": { "*": { - "BlockHeight": 85778067, + "BlockHeight": 86222967, "CoinName": "*", - "DAGsize": 7063207168, - "Epoch": 727 + "DAGsize": 7079974144, + "Epoch": 731 + }, + "AIPG": { + "Algorithm": "KawPow", + "BlockHeight": 24694, + "CoinName": "Aipowergrid", + "DAGsize": 1115684224, + "Date": "2023-12-26T09:41:36.8488729Z", + "Epoch": 5, + "Url": "https://zergpool.com/api/currencies" }, "AKA": { "Algorithm": "Ethash", - "BlockHeight": 10882453, + "BlockHeight": 10924154, "CoinName": "AKA", - "DAGsize": 4127194496, - "Date": "2023-12-19T18:14:33.9546405Z", - "Epoch": 364, + "DAGsize": 4143971968, + "Date": "2023-12-26T08:53:20.4092115Z", + "Epoch": 366, "Url": "https://minerstat.com/dag-size-calculator" }, "ALT": { "Algorithm": "Ethash", - "BlockHeight": 2500405, + "BlockHeight": 2540597, "CoinName": "Altcoinchain", - "DAGsize": 1786772864, - "Date": "2023-12-20T09:26:13.0074179Z", - "Epoch": 85, + "DAGsize": 1795157888, + "Date": "2023-12-26T09:41:36.9589704Z", + "Epoch": 86, "Url": "https://zergpool.com/api/currencies" }, "AVS": { "Algorithm": "Ethash", - "BlockHeight": 2539984, + "BlockHeight": 2580212, "CoinName": "Aves", - "DAGsize": 1795157888, - "Date": "2023-12-20T09:26:13.0521586Z", - "Epoch": 86, + "DAGsize": 1811937664, + "Date": "2023-12-26T09:41:37.0230314Z", + "Epoch": 88, "Url": "https://zergpool.com/api/currencies" }, "BLACK": { @@ -118,83 +127,92 @@ }, "BTN": { "Algorithm": "Ethash", - "BlockHeight": 1082499, + "BlockHeight": 1122722, "CoinName": "Bitnetmoney", - "DAGsize": 1392507008, - "Date": "2023-12-20T09:26:13.0935012Z", - "Epoch": 38, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1400897408, + "Date": "2023-12-26T09:41:37.3719159Z", + "Epoch": 39, + "Url": "https://whattomine.com/coins.json" }, "CAU": { "Algorithm": "Ethash", - "BlockHeight": 2334653, + "BlockHeight": 2394505, "CoinName": "Canxium", - "DAGsize": 1736434816, - "Date": "2023-12-20T09:26:13.1899918Z", - "Epoch": 79, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1753218944, + "Date": "2023-12-26T09:41:37.336545Z", + "Epoch": 81, + "Url": "https://whattomine.com/coins.json" }, "CFX": { "Algorithm": "Octopus", - "BlockHeight": 85778067, + "BlockHeight": 86222967, "CoinName": "Conflux", - "DAGsize": 7063207168, - "Date": "2023-12-19T18:14:31.7347202Z", - "Epoch": 165, - "Url": "https://whattomine.com/coins.json" + "DAGsize": 7079974144, + "Date": "2023-12-26T09:41:40.1505083Z", + "Epoch": 166, + "Url": "https://prohashing.com/api/v1/currencies" }, "CLO": { "Algorithm": "Ethash", - "BlockHeight": 13795338, + "BlockHeight": 13835591, "CoinName": "Callisto", - "DAGsize": 4940889728, - "Date": "2023-12-20T09:26:13.2431631Z", - "Epoch": 461, + "DAGsize": 4957666432, + "Date": "2023-12-26T09:41:37.1800298Z", + "Epoch": 463, "Url": "https://zergpool.com/api/currencies" }, "CLORE": { "Algorithm": "KawPow", - "BlockHeight": 537588, + "BlockHeight": 546155, "CoinName": "Clore", - "DAGsize": 1686109312, - "Date": "2023-12-20T09:26:13.2672281Z", - "Epoch": 73, + "DAGsize": 1694497664, + "Date": "2023-12-26T09:41:36.4402845Z", + "Epoch": 74, + "Url": "https://whattomine.com/coins.json" + }, + "DOGETHER": { + "Algorithm": "Ethash", + "BlockHeight": 64181, + "CoinName": "Dogether", + "DAGsize": 1107293056, + "Date": "2023-12-26T09:41:37.2234136Z", + "Epoch": 4, "Url": "https://zergpool.com/api/currencies" }, "EGAZ": { "Algorithm": "EtcHash", - "BlockHeight": 4096665, + "BlockHeight": 4140304, "CoinName": "Etica", - "DAGsize": 2231367808, - "Date": "2023-12-19T18:14:33.3095647Z", - "Epoch": 138, + "DAGsize": 2248145024, + "Date": "2023-12-26T09:41:37.7833868Z", + "Epoch": 140, "Url": "https://whattomine.com/coins.json" }, "EGEM": { "Algorithm": "Ethash", - "BlockHeight": 14550978, + "BlockHeight": 14597858, "CoinName": "Ethergem", - "DAGsize": 5158993024, - "Date": "2023-12-19T18:14:32.8607684Z", - "Epoch": 487, + "DAGsize": 5167382144, + "Date": "2023-12-26T09:41:38.0425766Z", + "Epoch": 488, "Url": "https://whattomine.com/coins.json" }, "ELH": { "Algorithm": "Ethash", - "BlockHeight": 1517374, + "BlockHeight": 1557280, "CoinName": "Elhereum", - "DAGsize": 1509948032, - "Date": "2023-12-20T09:26:13.3008294Z", - "Epoch": 52, + "DAGsize": 1518337664, + "Date": "2023-12-26T09:41:37.2634754Z", + "Epoch": 53, "Url": "https://zergpool.com/api/currencies" }, "ERG": { "Algorithm": "Autolykos2", - "BlockHeight": 1159484, + "BlockHeight": 1164233, "CoinName": "Ergo", "DAGsize": 3558121875, - "Date": "2023-12-19T18:14:35.907547Z", - "Epoch": 727, + "Date": "2023-12-26T09:41:39.913379Z", + "Epoch": 731, "Url": "https://prohashing.com/api/v1/currencies" }, "ESN": { @@ -202,52 +220,52 @@ "BlockHeight": 6408009, "CoinName": "Ethersocial", "DAGsize": 2877286784, - "Date": "2023-12-19T18:14:34.2383367Z", + "Date": "2023-12-26T09:41:38.5547853Z", "Epoch": 215, "Url": "https://minerstat.com/dag-size-calculator" }, "ETC": { "Algorithm": "EtcHash", - "BlockHeight": 18948128, + "BlockHeight": 18986961, "CoinName": "EthereumClassic", - "DAGsize": 3732925568, - "Date": "2023-12-20T09:26:13.3668549Z", - "Epoch": 317, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 3741318016, + "Date": "2023-12-26T09:41:37.8810307Z", + "Epoch": 318, + "Url": "https://whattomine.com/coins.json" }, "ETHF": { "Algorithm": "Ethash", - "BlockHeight": 18564951, + "BlockHeight": 18609772, "CoinName": "EthereumFair", - "DAGsize": 6274676864, - "Date": "2023-12-19T18:14:33.6568724Z", - "Epoch": 620, - "Url": "https://minerstat.com/dag-size-calculator" + "DAGsize": 6291454336, + "Date": "2023-12-26T09:41:37.5230223Z", + "Epoch": 622, + "Url": "https://whattomine.com/coins.json" }, "ETHO": { "Algorithm": "Ethash", - "BlockHeight": 13094419, + "BlockHeight": 13133935, "CoinName": "EthoProtocol", - "DAGsize": 4747951744, - "Date": "2023-12-20T09:26:13.4497498Z", - "Epoch": 438, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 4756340608, + "Date": "2023-12-26T09:41:37.5912744Z", + "Epoch": 439, + "Url": "https://whattomine.com/coins.json" }, "ETHW": { "Algorithm": "Ethash", - "BlockHeight": 18518707, + "BlockHeight": 18557557, "CoinName": "EthereumPow", - "DAGsize": 6266287744, - "Date": "2023-12-20T09:26:13.5132882Z", - "Epoch": 619, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 6274676864, + "Date": "2023-12-26T09:41:37.7083497Z", + "Epoch": 620, + "Url": "https://whattomine.com/coins.json" }, "ETP": { "Algorithm": "Ethash", "BlockHeight": 8700191, "CoinName": "Metaverse", "DAGsize": 3523213952, - "Date": "2023-12-19T18:14:34.1637052Z", + "Date": "2023-12-26T09:41:38.479262Z", "Epoch": 292, "Url": "https://minerstat.com/dag-size-calculator" }, @@ -271,30 +289,30 @@ }, "FIRO": { "Algorithm": "FiroPow", - "BlockHeight": 802906, + "BlockHeight": 806393, "CoinName": "Firo", - "DAGsize": 6266287744, - "Date": "2023-12-20T09:26:13.5641925Z", - "Epoch": 619, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 6291454336, + "Date": "2023-12-26T09:41:37.1308456Z", + "Epoch": 622, + "Url": "https://whattomine.com/coins.json" }, "FLORA": { "Algorithm": "Ethash", "BlockHeight": 789635, "CoinName": "", "DAGsize": 1308619904, - "Date": "2023-12-19T18:14:34.6614903Z", + "Date": "2023-12-26T09:41:38.6298809Z", "Epoch": 28, "Url": "https://minerstat.com/dag-size-calculator" }, "FREN": { "Algorithm": "KawPow", - "BlockHeight": 646612, + "BlockHeight": 663829, "CoinName": "FrenCoin", - "DAGsize": 1811937664, - "Date": "2023-12-20T09:26:13.6217817Z", - "Epoch": 88, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1828711552, + "Date": "2023-12-26T09:41:36.6709946Z", + "Epoch": 90, + "Url": "https://whattomine.com/coins.json" }, "FTC": { "Algorithm": "EvrProgPow", @@ -307,102 +325,102 @@ }, "GPN": { "Algorithm": "KawPow", - "BlockHeight": 335539, + "BlockHeight": 344079, "CoinName": "Gamepass", - "DAGsize": 1459615616, - "Date": "2023-12-20T09:26:13.6973265Z", - "Epoch": 46, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1468006016, + "Date": "2023-12-26T09:41:36.5058087Z", + "Epoch": 47, + "Url": "https://whattomine.com/coins.json" }, "HVQ": { "Algorithm": "KawPow", - "BlockHeight": 1391169, + "BlockHeight": 1399740, "CoinName": "HiveCoin", - "DAGsize": 2642407552, - "Date": "2023-12-20T09:26:13.7943915Z", - "Epoch": 187, + "DAGsize": 2650796416, + "Date": "2023-12-26T09:41:37.5148246Z", + "Epoch": 188, "Url": "https://zergpool.com/api/currencies" }, "HYP": { "Algorithm": "EthashB3", - "BlockHeight": 1505793, + "BlockHeight": 1565198, "CoinName": "Hypra", - "DAGsize": 1509948032, - "Date": "2023-12-20T09:26:13.8357202Z", - "Epoch": 52, + "DAGsize": 1526726528, + "Date": "2023-12-26T09:41:37.549369Z", + "Epoch": 54, "Url": "https://zergpool.com/api/currencies" }, "KIIRO": { "Algorithm": "FiroPow", - "BlockHeight": 88854, + "BlockHeight": 92182, "CoinName": "KiiroCoin", - "DAGsize": 1660943488, - "Date": "2023-12-20T09:26:13.911466Z", - "Epoch": 70, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1677721216, + "Date": "2023-12-26T09:41:36.7183016Z", + "Epoch": 72, + "Url": "https://whattomine.com/coins.json" }, "MEWC": { "Algorithm": "KawPow", - "BlockHeight": 673160, + "BlockHeight": 681752, "CoinName": "MeowCoin", - "DAGsize": 1837102976, - "Date": "2023-12-20T09:26:14.0222152Z", - "Epoch": 91, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1845488768, + "Date": "2023-12-26T09:41:37.0559496Z", + "Epoch": 92, + "Url": "https://whattomine.com/coins.json" }, "MOAC": { "Algorithm": "Ethash", - "BlockHeight": 13069954, + "BlockHeight": 13104674, "CoinName": "", - "DAGsize": 4739562368, - "Date": "2023-12-19T18:14:33.8503976Z", - "Epoch": 437, + "DAGsize": 4747951744, + "Date": "2023-12-26T09:41:38.3328587Z", + "Epoch": 438, "Url": "https://minerstat.com/dag-size-calculator" }, "NEOX": { "Algorithm": "KawPow", - "BlockHeight": 830878, + "BlockHeight": 839496, "CoinName": "Neoxa", - "DAGsize": 2013262208, - "Date": "2023-12-20T09:26:14.1865775Z", - "Epoch": 112, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 2021653888, + "Date": "2023-12-26T09:41:36.540155Z", + "Epoch": 113, + "Url": "https://whattomine.com/coins.json" }, "NILU": { "Algorithm": "Ethash", - "BlockHeight": 6239398, + "BlockHeight": 6239664, "CoinName": "", "DAGsize": 2826959488, - "Date": "2023-12-19T18:14:34.3113766Z", + "Date": "2023-12-26T08:53:21.7334068Z", "Epoch": 209, "Url": "https://minerstat.com/dag-size-calculator" }, "NUKO": { "Algorithm": "Ethash", - "BlockHeight": 8830114, + "BlockHeight": 8832526, "CoinName": "", "DAGsize": 3556763264, - "Date": "2023-12-19T18:14:34.1166887Z", + "Date": "2023-12-26T09:41:38.4265047Z", "Epoch": 296, "Url": "https://minerstat.com/dag-size-calculator" }, "OCTA": { "Algorithm": "Ethash", - "BlockHeight": 3657876, + "BlockHeight": 3698047, "CoinName": "Octaspace", - "DAGsize": 2105539712, - "Date": "2023-12-20T09:26:14.2525017Z", - "Epoch": 123, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 2122315136, + "Date": "2023-12-26T09:41:37.4557806Z", + "Epoch": 125, + "Url": "https://whattomine.com/coins.json" }, "PAPRY": { "Algorithm": "KawPow", - "BlockHeight": 435594, + "BlockHeight": 444136, "CoinName": "Paprika", - "DAGsize": 1577056384, - "Date": "2023-12-20T09:26:14.309639Z", - "Epoch": 60, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1585446272, + "Date": "2023-12-26T09:41:37.1832464Z", + "Epoch": 61, + "Url": "https://whattomine.com/coins.json" }, "PGC": { "Algorithm": "Ethash", @@ -415,21 +433,21 @@ }, "PRCO": { "Algorithm": "KawPow", - "BlockHeight": 800580, + "BlockHeight": 809202, "CoinName": "ProcyonCoin", - "DAGsize": 1979707264, - "Date": "2023-12-20T09:26:14.4263344Z", - "Epoch": 108, + "DAGsize": 1988093056, + "Date": "2023-12-26T09:41:37.780533Z", + "Epoch": 109, "Url": "https://zergpool.com/api/currencies" }, "QKC": { "Algorithm": "Ethash", - "BlockHeight": 14932830, + "BlockHeight": 14991420, "CoinName": "Quarkchain", - "DAGsize": 5259654016, - "Date": "2023-12-19T18:14:33.7926493Z", - "Epoch": 499, - "Url": "https://minerstat.com/dag-size-calculator" + "DAGsize": 5276434304, + "Date": "2023-12-26T09:41:37.9608797Z", + "Epoch": 501, + "Url": "https://whattomine.com/coins.json" }, "REDE": { "Algorithm": "KawPow", @@ -442,11 +460,11 @@ }, "REDEV2": { "Algorithm": "Ethash", - "BlockHeight": 1188866, + "BlockHeight": 1228912, "CoinName": "Redev2", - "DAGsize": 1417673344, - "Date": "2023-12-20T09:26:14.4842734Z", - "Epoch": 41, + "DAGsize": 1426062464, + "Date": "2023-12-26T09:41:37.8243988Z", + "Epoch": 42, "Url": "https://zergpool.com/api/currencies" }, "RTH": { @@ -460,38 +478,38 @@ }, "RVN": { "Algorithm": "KawPow", - "BlockHeight": 3112676, + "BlockHeight": 3121268, "CoinName": "RavenCoin", - "DAGsize": 4571790208, - "Date": "2023-12-20T09:26:14.5634663Z", - "Epoch": 417, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 4580174464, + "Date": "2023-12-26T09:41:40.0040332Z", + "Epoch": 418, + "Url": "https://prohashing.com/api/v1/currencies" }, "SATOX": { "Algorithm": "KawPow", - "BlockHeight": 486563, + "BlockHeight": 495149, "CoinName": "Sato", - "DAGsize": 1627386752, - "Date": "2023-12-20T09:26:14.6121167Z", - "Epoch": 66, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1644164224, + "Date": "2023-12-26T09:41:36.4750341Z", + "Epoch": 68, + "Url": "https://whattomine.com/coins.json" }, "SCC": { "Algorithm": "FiroPowSCC", - "BlockHeight": 802906, + "BlockHeight": 806393, "CoinName": "StakeCubeCoin", - "DAGsize": 6266287744, - "Date": "2023-12-20T09:26:13.5641925Z", - "Epoch": 619, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 6291454336, + "Date": "2023-12-26T09:41:37.1308456Z", + "Epoch": 622, + "Url": "https://whattomine.com/coins.json" }, "SERO": { "Algorithm": "ProgPowSero", - "BlockHeight": 11640347, + "BlockHeight": 11684672, "CoinName": "Sero", - "DAGsize": 4345295488, - "Date": "2023-12-19T18:14:32.6437537Z", - "Epoch": 390, + "DAGsize": 4353687424, + "Date": "2023-12-26T09:41:37.2976459Z", + "Epoch": 391, "Url": "https://whattomine.com/coins.json" }, "SLX": { @@ -505,46 +523,46 @@ }, "UBQ": { "Algorithm": "UbqHash", - "BlockHeight": 4689593, + "BlockHeight": 4714765, "CoinName": "Ubiq", - "DAGsize": 2399139968, - "Date": "2023-12-20T09:26:15.1059904Z", - "Epoch": 158, + "DAGsize": 2407530368, + "Date": "2023-12-26T09:41:37.9529776Z", + "Epoch": 159, "Url": "https://zergpool.com/api/currencies" }, "XNA": { "Algorithm": "KawPow", - "BlockHeight": 352078, + "BlockHeight": 360682, "CoinName": "Neurai", - "DAGsize": 1476394112, - "Date": "2023-12-20T09:26:15.5898043Z", - "Epoch": 48, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1493171584, + "Date": "2023-12-26T09:41:36.373289Z", + "Epoch": 50, + "Url": "https://whattomine.com/coins.json" }, "XPB": { "Algorithm": "Ethash", - "BlockHeight": 684738, + "BlockHeight": 724192, "CoinName": "Powblocks", - "DAGsize": 1275067264, - "Date": "2023-12-20T09:26:15.6165177Z", - "Epoch": 24, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1291844992, + "Date": "2023-12-26T09:41:37.4195572Z", + "Epoch": 26, + "Url": "https://whattomine.com/coins.json" }, "ZANO": { "Algorithm": "ProgPowZ", - "BlockHeight": 2422444, + "BlockHeight": 2431041, "CoinName": "Zano", - "DAGsize": 1761606272, - "Date": "2023-12-20T09:26:15.6602269Z", - "Epoch": 82, - "Url": "https://zergpool.com/api/currencies" + "DAGsize": 1769995904, + "Date": "2023-12-26T09:41:36.4133048Z", + "Epoch": 83, + "Url": "https://whattomine.com/coins.json" } }, "Updated": { "https://evr.cryptoscope.io/api/getblockcount": "2023-12-03T10:02:57.2420652Z", - "https://minerstat.com/dag-size-calculator": "2023-12-19T18:14:34.6921969Z", - "https://prohashing.com/api/v1/currencies": "2023-12-19T18:14:35.9495145Z", - "https://whattomine.com/coins.json": "2023-12-19T18:14:33.3978571Z", - "https://zergpool.com/api/currencies": "2023-12-20T09:26:15.660556Z" + "https://minerstat.com/dag-size-calculator": "2023-12-26T09:41:38.6718501Z", + "https://prohashing.com/api/v1/currencies": "2023-12-26T09:41:40.1509445Z", + "https://whattomine.com/coins.json": "2023-12-26T09:41:38.0429425Z", + "https://zergpool.com/api/currencies": "2023-12-26T09:41:37.9533476Z" } } diff --git a/Data/UnprofitableAlgorithms.json b/Data/UnprofitableAlgorithms.json index 9c58cd3d47..ac3431913c 100644 --- a/Data/UnprofitableAlgorithms.json +++ b/Data/UnprofitableAlgorithms.json @@ -15,7 +15,6 @@ "CryptonightR": "*", "Cuckatoo31": "*", "Cuckatoo32": "*", - "Decred": "1", "Dedal": "*", "Eaglesong": "1", "Equihash2009": "*", diff --git a/Includes/APIServer.psm1 b/Includes/APIServer.psm1 index 201bb00e8e..4954cb3db0 100644 --- a/Includes/APIServer.psm1 +++ b/Includes/APIServer.psm1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\APIServer.psm1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/BalancesTracker.ps1 b/Includes/BalancesTracker.ps1 index a78423d2e5..2cd646acde 100644 --- a/Includes/BalancesTracker.ps1 +++ b/Includes/BalancesTracker.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\BalancesTracker.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/Core.ps1 b/Includes/Core.ps1 index 4adef85858..2f94c91cc5 100644 --- a/Includes/Core.ps1 +++ b/Includes/Core.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: Core.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -429,7 +429,7 @@ Do { ) } ) - Remove-Variable Name, Pool, PoolGroup, PoolGroups -ErrorAction Ignore + Remove-Variable Key, Name, Pool, PoolGroup, PoolGroups -ErrorAction Ignore If ($Variables.CycleStarts.Count -ge $Config.SyncWindow) { # Remove Pools that have not been updated for 1 day $Pools = @($Pools.Where({ $_.Updated -ge ([DateTime]::Now).ToUniversalTime().AddDays(-1) })) @@ -935,7 +935,7 @@ Do { DownloadList = $DownloadList Variables = $Variables } - $Variables.Downloader = Start-ThreadJob -Name Downloader -StreamingHost $null -FilePath ".\Includes\Downloader.ps1" -InitializationScript ([scriptblock]::Create("Set-Location '$($Variables.MainPath)'")) -ArgumentList $Downloader_Parameters + $Variables.Downloader = Start-ThreadJob -Name Downloader -StreamingHost $null -FilePath ".\Includes\Downloader.ps1" -InitializationScript ([scriptblock]::Create("Set-Location '$($Variables.MainPath)'")) -ArgumentList $Downloader_Parameters -ThrottleLimit (2 * $Variables.Devices.Count + 2) Remove-Variable Downloader_Parameters } ElseIf (-not $Miners.Where({ $_.Available })) { @@ -1008,10 +1008,10 @@ Do { $Variables.BasePowerCost = [Double]($Variables.PowerConsumptionIdleSystemW / 1000 * 24 * $Variables.PowerPricekWh / $Variables.Rates."BTC".($Config.MainCurrency)) - $Variables.MiningEarning = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object Earning -Sum | Select-Object -ExpandProperty Sum) + $Variables.MiningEarning = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object Earning_Bias -Sum | Select-Object -ExpandProperty Sum) $Variables.MiningPowerCost = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object PowerCost -Sum | Select-Object -ExpandProperty Sum) $Variables.MiningPowerConsumption = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object PowerConsumption -Sum | Select-Object -ExpandProperty Sum) - $Variables.MiningProfit = [Double](($Variables.MinersBestPerDevice_Combo | Measure-Object Profit -Sum | Select-Object -ExpandProperty Sum) - $Variables.BasePowerCost) + $Variables.MiningProfit = [Double](($Variables.MinersBestPerDevice_Combo | Measure-Object Profit_Bias -Sum | Select-Object -ExpandProperty Sum) - $Variables.BasePowerCost) } Else { $Variables.MiningEarning = $Variables.MiningProfit = $Variables.MiningPowerCost = $Variables.MiningPowerConsumption = [Double]0 @@ -1313,13 +1313,12 @@ Do { # Display benchmarking progress If ($MinersDeviceGroupNeedingBenchmark) { - $Count = ($MinersDeviceGroupNeedingBenchmark | Select-Object -Property { $_.Algorithms, $_.Name } -Unique).Count + $Count = ($MinersDeviceGroupNeedingBenchmark | Select-Object -Property { $_.Algorithms }, { $_.Name } -Unique).Count Write-Message -Level Info "Benchmarking for '$($_.Name)' in progress. $Count miner$(If ($Count -gt 1) { 's' }) left to complete benchmark." } - $Count = ($MinersDeviceGroupNeedingBenchmark | Select-Object -Property { $_.Algorithms, $_.Name } -Unique).Count # Display power consumption measurement progress - $Count = ($MinersDeviceGroupNeedingPowerConsumptionMeasurement | Select-Object -Property { $_.Algorithms, $_.Name } -Unique).Count If ($MinersDeviceGroupNeedingPowerConsumptionMeasurement) { + $Count = ($MinersDeviceGroupNeedingPowerConsumptionMeasurement | Select-Object -Property { $_.Algorithms }, { $_.Name } -Unique).Count Write-Message -Level Info "Power consumption measurement for '$($_.Name)' in progress. $Count miner$(If ($Count -gt 1) { 's' }) left to complete measuring." } } @@ -1363,7 +1362,7 @@ Do { } ElseIf ($Miner.DataReaderJob.State -ne [MinerStatus]::Running) { # Miner data reader process failed - $Miner.StatusInfo = "Error: '$($Miner.Info)' Miner data reader exited unexpectedly" + $Miner.StatusInfo = "Error: '$($Miner.Info)' miner data reader exited unexpectedly" $Miner.SetStatus([MinerStatus]::Failed) $Variables.FailedMiners += $Miner } diff --git a/Includes/Core_dev.ps1 b/Includes/Core_dev.ps1 new file mode 100644 index 0000000000..abb5c52145 --- /dev/null +++ b/Includes/Core_dev.ps1 @@ -0,0 +1,1502 @@ +<# +Copyright (c) 2018-2023 Nemo, MrPlus & UselessGuru + + +NemosMiner is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +NemosMiner is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +#> + +<# +Product: NemosMiner +File: Core.ps1 +Version: 5.0.2.5 +Version date: 2023/12/20 +#> + +using module .\Include.psm1 +using module .\APIServer.psm1 + +If ($Config.Transcript) { Start-Transcript -Path ".\Debug\$((Get-Item $MyInvocation.MyCommand.Path).BaseName)-Transcript_$(Get-Date -Format "yyyy-MM-dd_HH-mm-ss").log" } + +Do { + If ($LegacyGUIForm) { $LegacyGUIForm.Text = "$($Variables.Branding.ProductLabel) $($Variables.Branding.Version) - Runtime: {0:dd} days {0:hh} hrs {0:mm} mins - Path: $($Variables.Mainpath)" -f [TimeSpan](([DateTime]::Now).ToUniversalTime() - $Variables.ScriptStartTime) } + + Try { + # Set master timer + $Variables.Timer = ([DateTime]::Now).ToUniversalTime() + + (Get-ChildItem -Path ".\Includes\MinerAPIs" -File).ForEach({ . $_.FullName }) + + # Internet connection check when no new pools + If (-not $Variables.PoolsNew) { + If (-not ($Variables.MyIP = (Get-NetIPAddress -InterfaceIndex ((Get-NetRoute).Where({ $_.DestinationPrefix -eq "0.0.0.0/0" }) | Get-NetIPInterface).Where({ $_.ConnectionState -eq "Connected" }).ifIndex -AddressFamily IPV4).IPAddress)) { + $Variables.MyIP = $null + Write-Message -Level Error "No internet connection - will retry in 60 seconds..." + #Stop all miners + ForEach ($Miner in $Variables.Miners.Where({ $_.Status -ne [MinerStatus]::Idle })) { + $Miner.SetStatus([MinerStatus]::Idle) + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + Remove-Variable Miner -ErrorAction Ignore + $Variables.RunningMiners = [Miner[]]@() + $Variables.BenchmarkingOrMeasuringMiners = [Miner[]]@() + $Variables.FailedMiners = [Miner[]]@() + $Variables.MinersBestPerDevice_Combos = [Miner[]]@() + Start-Sleep -Seconds 60 + Continue + } + } + + $Variables.PoolsConfig = $Config.PoolsConfig.Clone() + + If ($Config.IdleDetection) { + If (-not $Variables.IdleRunspace) { + Start-IdleDetection + } + If ($Variables.IdleRunspace.MiningStatus -eq "Idle") { + # Stop all miners + ForEach ($Miner in $Variables.Miners.Where({ $_.Status -ne [MinerStatus]::Idle })) { + $Miner.SetStatus([MinerStatus]::Idle) + $Miner.StatusInfo = "Waiting for system to become idle '$($Miner.Info)'" + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + Remove-Variable Miner -ErrorAction Ignore + $Variables.RunningMiners = [Miner[]]@() + $Variables.BenchmarkingOrMeasuringMiners = [Miner[]]@() + $Variables.FailedMiners = [Miner[]]@() + $Variables.Summary = "Mining is suspended until system is idle
again for $($Config.IdleSec) second$(If ($Config.IdleSec -ne 1) { "s" })..." + Write-Message -Level Verbose ($Variables.Summary -replace '
', ' ') + $Variables.IdleRunspace | Add-Member MiningStatus "Idle" -Force + + While ($Variables.NewMiningStatus -eq "Running" -and $Config.IdleDetection -and $Variables.IdleRunspace.MiningStatus -eq "Idle") { Start-Sleep -Seconds 1 } + + If ($Config.IdleDetection) { Write-Message -Level Info "Started new cycle (System was idle for $($Config.IdleSec) seconds)." } + } + } + Else { + If ($Variables.IdleRunspace) { Stop-IdleDetection } + Write-Message -Level Info "Started new cycle." + } + + # Use values from config + $Variables.PoolName = $Config.PoolName + $Variables.NiceHashWalletIsInternal = $Config.NiceHashWalletIsInternal + $Variables.PoolTimeout = [Math]::Floor($Config.PoolTimeout) + + # Update enabled devices + $Variables.EnabledDevices = [Device[]]@($Variables.Devices.Where({ $_.State -ne [DeviceState]::Unsupported -and $_.Name -notin $Config.ExcludeDeviceName }).ForEach({ Copy-Object $_ })) + If ($Variables.EnabledDevices) { + $Variables.EnabledDevices.ForEach( + { + # Miner name must not contain spaces + $_.Model = $_.Model -replace ' ' + If ($_.Type -eq "GPU") { + # For GPUs set type equal to vendor + $_.Type = $_.Vendor + # Remove model information from devices -> will create only one miner instance + If (-not $Config.MinerInstancePerDeviceModel) { $_.Model = $_.Vendor } + } + } + ) + + # Skip some stuff when previous cycle was shorter than half of what it should + If ($Variables.BenchmarkingOrMeasuringMiners -or -not $Variables.Miners -or -not $Variables.BeginCycleTime -or (Compare-Object @($Config.PoolName | Select-Object) @($Variables.PoolName | Select-Object)) -or $Variables.BeginCycleTime.AddSeconds([Math]::Floor($Config.Interval / 2)) -lt ([DateTime]::Now).ToUniversalTime() -or ((Compare-Object @($Config.ExtraCurrencies | Select-Object) @($Variables.AllCurrencies | Select-Object)).Where({ $_.SideIndicator -eq "<=" }))) { + $Variables.BeginCycleTime = $Variables.Timer + $Variables.EndCycleTime = $Variables.Timer.AddSeconds($Config.Interval) + + $Variables.CycleStarts += $Variables.Timer + $Variables.CycleStarts = @($Variables.CycleStarts | Sort-Object -Bottom (3, ($Config.SyncWindow + 1) | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum)) + + # Set minimum Watchdog count 3 + $Variables.WatchdogCount = (3, $Config.WatchdogCount | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) + $Variables.WatchdogReset = $Variables.WatchdogCount * $Variables.WatchdogCount * $Variables.WatchdogCount * $Variables.WatchdogCount * $Config.Interval + + # Expire watchdog timers + If ($Config.Watchdog) { $Variables.WatchdogTimers = @($Variables.WatchdogTimers.Where({ $_.Kicked -ge $Variables.Timer.AddSeconds( - $Variables.WatchdogReset) })) } + Else { $Variables.WatchdogTimers = @() } + + # Check for new version + If ($Config.AutoUpdateCheckInterval -and $Variables.CheckedForUpdate -lt ([DateTime]::Now).AddDays(-$Config.AutoUpdateCheckInterval)) { Get-NMVersion } + + If ($Config.Donation -gt 0) { + If (-not $Variables.DonationStart) { + # Re-Randomize donation start once per day, do not donate if remaing time for today is less than donation duration + If (($Variables.DonationLog.Start | Sort-Object -Bottom 1).Date -ne [DateTime]::Today) { + If ($Config.Donation -lt (1440 - [Math]::Floor(([DateTime]::Now).TimeOfDay.TotalMinutes))) { + $Variables.DonationStart = ([DateTime]::Now).AddMinutes((Get-Random -Minimum 0 -Maximum (1440 - [Math]::Floor(([DateTime]::Now).TimeOfDay.TotalMinutes) - $Config.Donation))) + } + } + } + If ($Variables.DonationStart -and ([DateTime]::Now) -ge $Variables.DonationStart) { + If (-not $Variables.DonationEnd) { + $Variables.DonationStart = Get-Date + # Ensure full donation period + $Variables.DonationEnd = $Variables.DonationStart.AddMinutes($Config.Donation) + $Variables.EndCycleTime = ($Variables.DonationEnd).ToUniversalTime() + # Add pool config to config (in-memory only) + $Variables.DonationRandomPoolsConfig = Get-RandomDonationPoolsConfig + # Activate donation + $Variables.PoolName = $Variables.DonationRandomPoolsConfig.psBase.Keys + $Variables.PoolsConfig = $Variables.DonationRandomPoolsConfig + $Variables.NiceHashWalletIsInternal = $false + Write-Message -Level Info "Donation run: Mining for '$($Variables.DonationRandom.Name)' for the next $(If (($Config.Donation - (([DateTime]::Now) - $Variables.DonationStart).Minutes) -gt 1) { "$($Config.Donation - (([DateTime]::Now) - $Variables.DonationStart).Minutes) minutes" } Else { "minute" }). While donating $($Variables.Branding.ProductLabel) will use pools '$($Variables.PoolName -join ', ')'." + $Variables.DonationRunning = $true + } + } + } + + If ($Variables.DonationRunning -and ([DateTime]::Now) -gt $Variables.DonationEnd) { + $Variables.DonationLog = $Variables.DonationLog | Select-Object -Last 365 # Keep data for one year + [Array]$Variables.DonationLog += [PSCustomObject]@{ + Start = $Variables.DonationStart + End = $Variables.DonationEnd + Name = $Variables.DonationRandom.Name + } + $Variables.DonationLog | ConvertTo-Json | Out-File -LiteralPath ".\Logs\DonateLog.json" -Force -ErrorAction Ignore + $Variables.DonationRandomPoolsConfig = $null + $Variables.DonationStart = $null + $Variables.DonationEnd = $null + $Variables.PoolsConfig = $Config.PoolsConfig.Clone() + Write-Message -Level Info "Donation run complete - thank you! Mining for you again. :-)" + $Variables.DonationRunning = $false + } + + # Stop / Start brain background jobs + [Void](Stop-Brain @($Variables.Brains.psBase.Keys.Where({ $_ -notin @(Get-PoolBaseName $Variables.PoolName) }))) + [Void](Start-Brain @(Get-PoolBaseName $Variables.PoolName)) + + # Wait for pool data messaage + If ($Variables.PoolName) { + If ($Variables.Brains.psBase.Keys.Where({ $Variables.Brains[$_].StartTime -gt $Variables.Timer.AddSeconds(- $Config.Interval) })) { + # Newly started brains, allow extra time for brains to get ready + $Variables.PoolTimeout = 60 + Write-Message -Level Info "Requesting initial pool data from '$((Get-PoolBaseName $Variables.PoolName) -join ', ')'...
This may take up to $($Variables.PoolTimeout) seconds." + } + Else { + Write-Message -Level Info "Requesting pool data from '$((Get-PoolBaseName $Variables.PoolName) -join ', ')'..." + } + } + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + # Remove stats that have been deleted from disk + Try { + If ($StatFiles = [String[]](Get-ChildItem -Path "Stats" -File).BaseName) { + If ($Keys = [String[]]($Stats.psBase.Keys)) { + (Compare-Object $StatFiles $Keys -PassThru).Where({ $_.SideIndicator -eq "=>"}).ForEach( + { + # Remove stat if deleted on disk + $Stats.Remove($_) + } + ) + } + } + } Catch {} + Remove-Variable Keys, StatFiles -ErrorAction Ignore + + # Load currency exchange rates + [Void](Get-Rate) + + # Get DAG data + [Void](Update-DAGdata) + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + # Power cost preparations + $Variables.CalculatePowerCost = $Config.CalculatePowerCost + If ($Config.CalculatePowerCost) { + If ($Variables.EnabledDevices.Count -ge 1) { + # HWiNFO64 verification + $RegKey = "HKCU:\Software\HWiNFO64\VSB" + If ($RegValue = Get-ItemProperty -Path $RegKey -ErrorAction Ignore) { + If ([String]$Variables.HWInfo64RegValue -eq [String]$RegValue) { + Write-Message -Level Warn "Power consumption data in registry has not been updated [HWiNFO64 not running???] - disabling power consumption and profit calculations." + $Variables.CalculatePowerCost = $false + } + Else { + $PowerConsumptionData = @{ } + $DeviceName = "" + $RegValue.PSObject.Properties.Where({ $_.Name -match '^Label[0-9]+$' -and (Compare-Object @($_.Value -split ' ' | Select-Object) @($Variables.EnabledDevices.Name) -IncludeEqual -ExcludeDifferent) }).ForEach( + { + $DeviceName = ($_.Value -split ' ') | Select-Object -Last 1 + Try { + $PowerConsumptionData[$DeviceName] = $RegValue.($_.Name -replace 'Label', 'Value') + } + Catch { + Write-Message -Level Warn "HWiNFO64 sensor naming is invalid [duplicate sensor for $DeviceName] - disabling power consumption and profit calculations." + $Variables.CalculatePowerCost = $false + } + } + ) + # Add configured power consumption + $Variables.Devices.Name.ForEach( + { + $DeviceName = $_ + If ($ConfiguredPowerConsumption = $Config.PowerConsumption.$_ -as [Double]) { + If ($_ -in @($Variables.EnabledDevices.Name) -and -not $PowerConsumptionData.$_) { Write-Message -Level Warn "HWiNFO64 cannot read power consumption data for device ($_). Using configured value of $ConfiguredPowerConsumption) W." } + $PowerConsumptionData[$_] = "$ConfiguredPowerConsumption W" + } + $Variables.EnabledDevices.Where({ $_.Name -eq $DeviceName }).ForEach({ $_.ConfiguredPowerConsumption = $ConfiguredPowerConsumption }) + $Variables.Devices.Where({ $_.Name -eq $DeviceName }).ForEach({ $_.ConfiguredPowerConsumption = $ConfiguredPowerConsumption }) + } + ) + If ($DeviceNamesMissingSensor = (Compare-Object @($Variables.EnabledDevices.Name) @($PowerConsumptionData.psBase.Keys) -PassThru).Where({ $_.SideIndicator -eq "<=" })) { + Write-Message -Level Warn "HWiNFO64 sensor naming is invalid [missing sensor configuration for $($DeviceNamesMissingSensor -join ', ')] - disabling power consumption and profit calculations." + $Variables.CalculatePowerCost = $false + } + Remove-Variable DeviceNamesMissingSensor + + # Enable read power consumption for configured devices + $Variables.EnabledDevices.ForEach({ $_.ReadPowerConsumption = $_.Name -in @($PowerConsumptionData.psBase.Keys) }) + Remove-Variable ConfiguredPowerConsumption, DeviceName, PowerConsumptionData -ErrorAction Ignore + } + } + Else { + Write-Message -Level Warn "Cannot read power consumption data from registry [Key '$RegKey' does not exist - HWiNFO64 not running???] - disabling power consumption and profit calculations." + $Variables.CalculatePowerCost = $false + } + Remove-Variable RegKey, RegValue -ErrorAction Ignore + } + Else { $Variables.CalculatePowerCost = $false } + } + If (-not $Variables.CalculatePowerCost) { + $Variables.EnabledDevices.ForEach({ $_.ReadPowerConsumption = $false }) + } + + # Power price + If (-not $Config.PowerPricekWh.psBase.Keys) { $Config.PowerPricekWh."00:00" = 0 } + ElseIf ($null -eq $Config.PowerPricekWh."00:00") { + # 00:00h power price is the same as the latest price of the previous day + $Config.PowerPricekWh."00:00" = $Config.PowerPricekWh.($Config.PowerPricekWh.psBase.Keys | Sort-Object -Bottom 1) + } + $Variables.PowerPricekWh = [Double]($Config.PowerPricekWh.($Config.PowerPricekWh.psBase.Keys.Where({ $_ -le (Get-Date -Format HH:mm).ToString() }) | Sort-Object -Bottom 1)) + $Variables.PowerCostBTCperW = [Double](1 / 1000 * 24 * $Variables.PowerPricekWh / $Variables.Rates."BTC".($Config.MainCurrency)) + + # Load unprofitable algorithms + Try { + If (-not $Variables.UnprofitableAlgorithms -or (Get-ChildItem -Path ".\Data\UnprofitableAlgorithms.json").LastWriteTime -gt $Variables.Timer.AddSeconds( - $Config.Interval)) { + $Variables.UnprofitableAlgorithms = Get-Content -Path ".\Data\UnprofitableAlgorithms.json" | ConvertFrom-Json -ErrorAction Stop -AsHashtable | Get-SortedObject + Write-Message -Level Info "Loaded list of unprofitable algorithms ($($Variables.UnprofitableAlgorithms.Count) $(If ($Variables.UnprofitableAlgorithms.Count -ne 1) { "entries" } Else { "entry" }))." + } + } + Catch { + Write-Message -Level Error "Error loading list of unprofitable algorithms. File '.\Data\UnprofitableAlgorithms.json' is not a valid $($Variables.Branding.ProductLabel) JSON data file. Please restore it from your original download." + $Variables.UnprofitableAlgorithms = @{ } + } + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + $PoolTimestamp = If ($Variables.MinerDataCollectedTimeStamp) { $Variables.MinerDataCollectedTimeStamp } Else { $Variables.ScriptStartTime } + + # Wait for all brains + While (([DateTime]::Now).ToUniversalTime() -lt $Variables.Timer.AddSeconds($Variables.PoolTimeout) -and ($Variables.Brains.psBase.Keys.Where({ $Variables.Brains[$_] -and $Variables.Brains[$_].Updated -lt $PoolTimestamp }))) { + Start-Sleep -Seconds 1 + } + + # Collect pool data + $Variables.PoolsCount = $Variables.Pools.Count + If ($Variables.PoolName) { + $Variables.PoolsNew = ($Variables.PoolName.ForEach( + { + $PoolName = Get-PoolBaseName $_ + If (Test-Path -LiteralPath ".\Pools\$PoolName.ps1") { + Try { + & ".\Pools\$PoolName.ps1" -Config $Config -PoolVariant $_ -Variables $Variables + } + Catch { + Write-Message -Level Error "Error in pool file '$PoolName.ps1'." + "$(Get-Date -Format "yyyy-MM-dd_HH:mm:ss")" >> "Logs\Error_Dev.txt" + $_.Exception | Format-List -Force >> "Logs\Error_Dev.txt" + $_.InvocationInfo | Format-List -Force >> "Logs\Error_Dev.txt" + } + } + }).Where({ + $_.Updated -gt $PoolTimestamp + }).ForEach( + { + Try { + $Pool = [Pool]$_ + $Pool.Fee = If ($Config.IgnorePoolFee -or $Pool.Fee -lt 0 -or $Pool.Fee -gt 1) { 0 } Else { $Pool.Fee } + $Factor = $Pool.EarningsAdjustmentFactor * (1 - $Pool.Fee) + $Pool.Price *= $Factor + $Pool.Price_Bias = $Pool.Price * $Pool.Accuracy + $Pool.StablePrice *= $Factor + $Pool.CoinName = $Variables.CoinNames[$Pool.Currency] + $Pool + } + Catch { + Write-Message -Level Error "Failed to add pool '$($Pool.Variant) [$($Pool.Algorithm)]' ($($Pool | ConvertTo-Json -Compress))" + } + } + ) + ) + Remove-Variable Factor, Pool, PoolName, PoolTimestamp -ErrorAction Ignore + + If ($Variables.PoolNoData = @(Compare-Object @($Variables.PoolName) @($Variables.PoolsNew.Variant | Sort-Object -Unique) -PassThru)) { + Write-Message -Level Warn "No data received from pool$(If ($Variables.PoolNoData.Count -gt 1) { "s" }) '$($Variables.PoolNoData -join ', ')'." + } + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Remove de-configured pools + $PoolsDeconfigured = @($Variables.Pools.Where({ $_.Variant -notin $Variables.PoolName })) + $Pools = @($Variables.Pools.Where({ $_.Variant -in $Variables.PoolName })) + + If ($ComparePools = @(Compare-Object @($Variables.PoolsNew | Select-Object) @($Pools | Select-Object) -Property Algorithm, MiningCurrency, Variant -IncludeEqual -PassThru)) { + # Find added & updated pools + $Variables.PoolsAdded = @($ComparePools.Where({ $_.SideIndicator -eq "<=" })) + $Variables.PoolsUpdated = @($ComparePools.Where({ $_.SideIndicator -eq "==" })) + # Clear reasons for gone pools + $ComparePools.Where({ $_.SideIndicator -eq "=>" }).ForEach({ $_.Reasons = [System.Collections.Generic.List[String]]@() }) + $Pools += $Variables.PoolsAdded + Remove-Variable ComparePools + + # Update all pools, make smaller groups for faster update + $PoolGroups = $Variables.PoolsUpdated | Group-Object -Property Name + ($Pools | Group-Object -Property Name).ForEach( + { + $Name = $_.Name + $PoolGroup = $PoolGroups.Where({ $_.Name -eq $Name }).Group + $_.Group.ForEach( + { + $Key = $_.Key + + $_.Available = $true + $_.Best = $false + $_.Prioritize = $false + + # Update existing pools + If ($Pool = $PoolGroup.Where({ $_.Key -eq $Key })) { + $_.Accuracy = $Pool[0].Accuracy + $_.Disabled = $Pool[0].Disabled + $_.EarningsAdjustmentFactor = $Pool[0].EarningsAdjustmentFactor + $_.Fee = $Pool[0].Fee + $_.Host = $Pool[0].Host + $_.Pass = $Pool[0].Pass + $_.Port = $Pool[0].Port + $_.PortSSL = $Pool[0].PortSSL + $_.PoolUri = $Pool[0].PoolUri + $_.Price = $Pool[0].Price + $_.Price_Bias = $Pool[0].Price_Bias + $_.Protocol = $Pool[0].Protocol + $_.Reasons = $Pool[0].Reasons + $_.Region = $Pool[0].Region + $_.SendHashrate = $Pool[0].SendHashrate + $_.SSLSelfSignedCertificate = $Pool[0].SSLSelfSignedCertificate + $_.StablePrice = $Pool[0].StablePrice + $_.Updated = $Pool[0].Updated + $_.User = $Pool[0].User + $_.Workers = $Pool[0].Workers + $_.WorkerName = $Pool[0].WorkerName + } + If (-not $Variables.PoolData.($_.Name).ProfitSwitching -and $Variables.DAGdata.Currency.($_.Currency).BlockHeight) { + $_.BlockHeight = $Variables.DAGdata.Currency.($_.Currency).BlockHeight + $_.Epoch = $Variables.DAGdata.Currency.($_.Currency).Epoch + $_.DAGSizeGiB = $Variables.DAGdata.Currency.($_.Currency).DAGsize / 1GB + $_.AlgorithmVariant = "$($_.Algorithm)-$([Math]::Ceiling($_.DAGSizeGiB))GiB" + } + ElseIf ($Variables.DAGdata.Algorithm.($_.Algorithm).BlockHeight) { + $_.BlockHeight = $Variables.DAGdata.Algorithm.($_.Algorithm).BlockHeight + $_.Epoch = $Variables.DAGdata.Algorithm.($_.Algorithm).Epoch + $_.DAGSizeGiB = $Variables.DAGdata.Algorithm.($_.Algorithm).DAGsize / 1GB + $_.AlgorithmVariant = "$($_.Algorithm)-$([Math]::Ceiling($_.DAGSizeGiB))GiB" + } + Else { + $_.AlgorithmVariant = "$($_.Algorithm)" + } + + # PoolPorts[0] = non-SSL, PoolPorts[1] = SSL + $_.PoolPorts = @($(If ($Config.SSL -ne "Always" -and $_.Port) { [UInt16]$_.Port } Else { $null }), $(If ($Config.SSL -ne "Never" -and $_.PortSSL) { [UInt16]$_.PortSSL } Else { $null })) + } + ) + } + ) + Remove-Variable Key, Name, Pool, PoolGroup, PoolGroups -ErrorAction Ignore + If ($Variables.CycleStarts.Count -ge $Config.SyncWindow) { + # Remove Pools that have not been updated for 1 day + $Pools = @($Pools.Where({ $_.Updated -ge ([DateTime]::Now).ToUniversalTime().AddDays(-1) })) + + $MaxPoolAgeMinutes = $Config.SyncWindow * $Config.SyncWindow * $Config.SyncWindow * ($Variables.CycleStarts[-1] - $Variables.CycleStarts[0]).TotalMinutes + $Pools.Where({ $_.Updated -lt $Variables.CycleStarts[0] }).ForEach( + { + # Pool data is older than earliest CycleStart + If ([Math]::Floor(($Variables.CycleStarts[-1] - $_.Updated).TotalMinutes) -gt $MaxPoolAgeMinutes) { $_.Reasons.Add("Data too old") } + Else { $_.Price_Bias *= [Math]::Pow(0.9, ($Variables.CycleStarts[0] - $_.Updated).TotalMinutes) } + } + ) + Remove-Variable MaxPoolAgeMinutes + } + # No username or wallet + $Pools.Where({ -not $_.User }).ForEach({ $_.Reasons.Add("No username or wallet") }) + # Pool disabled by stat file + $Pools.Where({ $_.Disabled }).ForEach({ $_.Reasons.Add("Disabled (by Stat file)") }) + # Min accuracy not reached + $Pools.Where({ $_.Accuracy -LT $Config.MinAccuracy }).ForEach({ $_.Reasons.Add("MinAccuracy ($($Config.MinAccuracy * 100)%) not reached") }) + # Filter unavailable algorithms + If ($Config.MinerSet -lt 3) { $Pools.Where({ $Variables.UnprofitableAlgorithms[$_.Algorithm] -eq "*" }).ForEach({ $_.Reasons.Add("Unprofitable Algorithm") }) } + # Pool price 0 + $Pools.Where({ $_.Price -eq 0 }).ForEach({ $_.Reasons.Add("Price -eq 0") }) + $Pools.Where({ $_.Price_Bias -eq 0 }).ForEach({ $_.Reasons.Add("Price bias -eq 0") }) + # No price data + $Pools.Where({ $_.Price -eq [Double]::NaN }).ForEach({ $_.Reasons.Add("No price data") }) + # Ignore pool if price is more than $Config.UnrealPoolPriceFactor higher than average of all pools with same algorithm & currency; NiceHash & MiningPoolHub are always right + If ($Config.UnrealPoolPriceFactor -gt 1 -and ($Pools.Name | Sort-Object -Unique).Count -gt 1) { + ($Pools.Where({ $_.Price_Bias -gt 0 }) | Group-Object -Property Algorithm, Currency).Where({ $_.Count -ge 2 }).ForEach( + { + If ($PriceThreshold = (($_.Group.Price_Bias | Measure-Object -Average | Select-Object -ExpandProperty Average) * $Config.UnrealPoolPriceFactor)) { + $_.Group.Where({ $_.Name -notin @("NiceHash|MiningPoolHub") }).Where({ $_.Price_Bias -gt $PriceThreshold }).ForEach({ $_.Reasons.Add("Unreal price ($($Config.UnrealPoolPriceFactor)x higher than average price)") }) + } + } + ) + Remove-Variable PriceThreshold + } + If ($Config.Algorithm -like "+*") { + # Filter non-enabled algorithms + $Pools.Where({ $Config.Algorithm -notcontains "+$($_.Algorithm)" }).ForEach({ $_.Reasons.Add("Algorithm not enabled in generic config") }) + $Pools.Where({ $Variables.PoolsConfig[$_.Name].Algorithm -like "+*" }).Where({ $Variables.PoolsConfig.$($_.Name).Algorithm -notcontains "+$($_.Algorithm)" }).ForEach({ $_.Reasons.Add("Algorithm not enabled in $($_.Name) pool config") }) + } + Else { + # Filter disabled algorithms + $Pools.Where({ $Config.Algorithm -contains "-$($_.Algorithm)" }).ForEach({ $_.Reasons.Add("Algorithm disabled (``-$($_.Algorithm)`` in generic config)") }) + $Pools.Where({ $Variables.PoolsConfig[$_.Name].Algorithm -contains "-$($_.Algorithm)" }).ForEach({ $_.Reasons.Add("Algorithm disabled (``-$($_.Algorithm)`` in $($_.Name) pool config)") }) + } + If ($Config.Currency -like "+*") { + # Filter non-enabled currencies + $Pools.Where({ $Config.Currency -notcontains "+$($_.Currency)" }).ForEach({ $_.Reasons.Add("Currency not enabled in generic config") }) + $Pools.Where({ $Variables.PoolsConfig[$_.Name].Currency -like "+*" }).Where({ $Variables.PoolsConfig.$($_.Name).Currency -notcontains "+$($_.Currency)" }).ForEach({ $_.Reasons.Add("Currency not enabled in $($_.Name) pool config") }) + } + Else { + # Filter disabled currencies + $Pools.Where({ $Config.Currency -contains "-$($_.Currency)" }).ForEach({ $_.Reasons.Add("Currency disabled (``-$($_.Currency)`` in generic config)") }) + $Pools.Where({ $Variables.PoolsConfig[$_.Name].Currency -contains "-$($_.Currency)" }).ForEach({ $_.Reasons.Add("Currency disabled (``-$($_.Currency)`` in $($_.Name) pool config)") }) + } + # MinWorkers + $Pools.Where({ $null -ne $_.Workers -and $_.Workers -lt $Variables.PoolsConfig[$_.Name].MinWorker }).ForEach({ $_.Reasons.Add("Not enough workers at pool (MinWorker ``$($Variables.PoolsConfig[$_.Name].MinWorker)`` in $($_.BaseName) pool config)") }) + $Pools.Where({ $null -ne $_.Workers -and $_.Workers -lt $Config.MinWorker }).ForEach({ $_.Reasons.Add("Not enough workers at pool (MinWorker ``$($Config.MinWorker)`` in generic config)") }) + # SSL + If ($Config.SSL -eq "Never") { $Pools.Where({ -not $_.PoolPorts[0] }).ForEach({ $_.Reasons.Add("Non-SSL port not available (Config.SSL -eq 'Never')") }) } + If ($Config.SSL -eq "Always") {$Pools.Where({ -not $_.PoolPorts[1] }).ForEach({ $_.Reasons.Add("SSL port not available (Config.SSL -eq 'Always')") }) } + # SSL Allow selfsigned certificate + If (-not $Config.SSLAllowSelfSignedCertificate) { $Pools.Where({ $_.SSLSelfSignedCertificate }).ForEach({ $_.Reasons.Add("Pool uses self signed certificate (Config.SSLAllowSelfSignedCertificate -eq '`$false')") }) } + + # Apply watchdog to pools + If ($Config.Watchdog) { + ($Pools.Where({ $_.Available }) | Group-Object -Property Name).ForEach( + { + # Suspend pool if more than 50% of all algorithms@pool failed + $PoolName = $_.Name + $WatchdogCount = ($Variables.WatchdogCount, ($Variables.WatchdogCount * $_.Group.Count / 2), (($Variables.Miners.Where({ $_.Best -and $_.Workers.Pool.Name -eq $PoolName })).count) | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) + If ($PoolsToSuspend = $_.Group.Where({ @($Variables.WatchdogTimers.Where({ $_.PoolName -eq $PoolName -and $_.Kicked -lt $Variables.Timer })).Count -gt $WatchdogCount })) { + $PoolsToSuspend.ForEach( + { + $_.Available = $false + $_.Reasons.Add("Pool suspended by watchdog") + } + ) + Write-Message -Level Warn "Pool '$PoolName' is suspended by watchdog until $((($Variables.WatchdogTimers.Where({ $_.PoolName -eq $PoolName -and $_.Kicked -lt $Variables.Timer })).Kicked | Sort-Object -Top 1).AddSeconds($Variables.WatchdogReset).ToLocalTime().ToString("T"))." + } + } + ) + ($Pools.Where({ $_.Available }) | Group-Object -Property Algorithm, Name).ForEach( + { + # Suspend algorithm@pool if more than 50% of all possible miners for algorithm failed + $WatchdogCount = ($Variables.WatchdogCount, (($Variables.Miners | Where-Object Algorithms -contains $_.Group[0].Algorithm).Count / 2) | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) + 1 + If ($PoolsToSuspend = $_.Group | Where-Object { @($Variables.WatchdogTimers | Where-Object Algorithm -EQ $_.Algorithm | Where-Object PoolName -EQ $_.Name | Where-Object Kicked -LT $Variables.CycleStarts[-2]).Count -gt $WatchdogCount }) { + $PoolsToSuspend.ForEach({ $_.Reasons.Add("Algorithm@Pool suspended by watchdog") }) + Write-Message -Level Warn "Algorithm@Pool '$($_.Group[0].Algorithm)@$($_.Group[0].Name)' is suspended by watchdog until $((($Variables.WatchdogTimers | Where-Object Algorithm -EQ $_.Group[0].Algorithm | Where-Object PoolName -EQ $_.Group[0].Name | Where-Object Kicked -LT $Variables.Timer).Kicked | Sort-Object -Top 1).AddSeconds($Variables.WatchdogReset).ToLocalTime().ToString("T"))." + } + } + ) + Remove-Variable PoolName, PoolsToSuspend, WatchdogCount -ErrorAction Ignore + } + + # Make pools unavailable + $Pools.Where({ $_.Reasons }).ForEach({ $_.Available = $false }) + + # Filter pools on miner set + If ($Config.MinerSet -lt 2) { + $Pools.Where({ $Variables.UnprofitableAlgorithms[$_.Algorithm] -eq 1 }).ForEach({ $_.Reasons.Add("Unprofitable primary algorithm") }) + $Pools.Where({ $Variables.UnprofitableAlgorithms[$_.Algorithm] -eq 2 }).ForEach({ $_.Reasons.Add("Unprofitable secondary algorithm") }) + } + $Pools.Where({ $_.Reasons }).ForEach({ $_.Reasons = $_.Reasons | Sort-Object -Unique }) + + If ($Variables.Pools.Count -gt 0) { + Write-Message -Level Info "Had $($Variables.PoolsCount) pool$(If ($Variables.PoolsCount -ne 1) { "s" })$(If ($PoolsDeconfigured) { ", removed $($PoolsDeconfigured.Count) deconfigured pool$(If ($PoolsDeconfigured.Count -ne 1) { "s" } )" })$(If ($Variables.PoolsAdded.Count) { ", found $($Variables.PoolsAdded.Count) new pool$(If ($Variables.PoolsAdded.Count -ne 1) { "s" })" }), updated $($Variables.PoolsUpdated.Count) pool$(If ($Variables.PoolsUpdated.Count -ne 1) { "s" })$(If ($Pools.Where({ -not $_.Available })) { ", filtered out $(@($Pools.Where({ -not $_.Available })).Count) pool$(If (@($Pools.Where({ -not $_.Available })).Count -ne 1) { "s" })" }). $(@($Pools.Where({ $_.Available })).Count) available pool$(If (@($Pools.Where({ $_.Available })).Count -ne 1) { "s" }) remain$(If (@($Pools.Where({ $_.Available })).Count -eq 1) { "s" })." + } + Else { + Write-Message -Level Info "Found $($Variables.PoolsNew.Count) pool$(If ($Variables.PoolsNew.Count -ne 1) { "s" }), filtered out $(@($Pools.Where({ -not $_.Available })).Count) pool$(If (@($Pools.Where({ -not $_.Available })).Count -ne 1) { "s" }). $(@($Pools.Where({ $_.Available })).Count) available pool$(If (@($Pools.Where({ $_.Available })).Count -ne 1) { "s" }) remain$(If (@($Pools.Where({ $_.Available})).Count -eq 1) { "s" })." + } + + # Keep pool balances alive; force mining at pool even if it is not the best for the algo + If ($Config.BalancesKeepAlive -and $BalancesTrackerRunspace -and $Variables.PoolsLastEarnings.Count -gt 0 -and $Variables.PoolsLastUsed) { + $Variables.PoolNamesToKeepBalancesAlive = @() + ForEach ($Pool in @($Pools.Where({ $_.Name -notin $Config.BalancesTrackerExcludePool }) | Sort-Object -Property Name -Unique)) { + If ($Variables.PoolsLastEarnings[$Pool.Name] -and $Variables.PoolsConfig[$Pool.Name].BalancesKeepAlive -gt 0 -and (([DateTime]::Now).ToUniversalTime() - $Variables.PoolsLastEarnings[$Pool.Name]).Days -ge ($Variables.PoolsConfig[$Pool.Name].BalancesKeepAlive - 10)) { + $Variables.PoolNamesToKeepBalancesAlive += $PoolName + Write-Message -Level Warn "Pool '$($Pool.Name)' prioritized to avoid forfeiting balance (pool would clear balance in 10 days)." + } + } + If ($Variables.PoolNamesToKeepBalancesAlive) { + $Pools.ForEach( + { + If ($_.Name -in $Variables.PoolNamesToKeepBalancesAlive) { $_.Available = $true; $_.Prioritize = $true; $_.Reasons = [System.Collections.Generic.List[String]]@("Prioritized by BalancesKeepAlive") } + Else { $_.Reasons.Add("BalancesKeepAlive prioritizes other pools") } + } + ) + } + } + + # Mark best pools, allow all DAG pools (optimal pool might not fit in GPU memory) + ($Pools.Where({ $_.Available }) | Group-Object Algorithm).ForEach({ ($_.Group | Sort-Object { $_.Prioritize }, { $_.Price_Bias } -Bottom $(If ($Config.MinerUseBestPoolsOnly -or $_.Group.Algorithm -notmatch $Variables.RegexAlgoHasDAG) { 1 } Else { $_.Group.Count })).ForEach({ $_.Best = $true }) }) + } + + # Update data in API + $Variables.Pools = $Pools + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + } + Else { + # No configuired pools, clear all pools + $Variables.Pools = [Pool[]]@() + } + Remove-Variable Pools, PoolsDeconfigured, PoolsNew, PoolTimestamp -ErrorAction Ignore + + $Variables.PoolsBest = $Variables.Pools.Where({ $_.Best }) | Sort-Object -Property Algorithm + + # Tuning parameters require local admin rights + $Variables.UseMinerTweaks = [Boolean]($Variables.IsLocalAdmin -and $Config.UseMinerTweaks) + } + Else { + $Variables.EndCycleTime = $Variables.EndCycleTime.AddSeconds([Math]::Floor($Config.Interval / 2)) + } + + # Ensure we get the hashrate for running miners prior looking for best miner + ForEach ($Miner in $Variables.MinersBestPerDevice_Combo | Sort-Object { ($_.Name -Split '-')[2] }) { + If ($Miner.DataReaderJob.HasMoreData -and $Miner.Status -ne [MinerStatus]::DryRun) { + $Miner.Data = @($Miner.Data | Select-Object -Last ($Miner.MinDataSample * 5)) # Reduce data to MinDataSample * 5 + If ($Samples = @($Miner.DataReaderJob | Receive-Job | Select-Object)) { + $Sample = $Samples | Select-Object -Last 1 + $Miner.Hashrates_Live = $Sample.Hashrate.PSObject.Properties.Value + # Hashrate from primary algorithm is relevant + If ($Sample.Hashrate.($Miner.Algorithms[0])) { + $Miner.DataSampleTimestamp = $Sample.Date + } + } + Remove-Variable Sample, Samples -ErrorAction Ignore + } + + If ($Miner.Status -in @([MinerStatus]::Running, [MinerStatus]::DryRun)) { + If ($Miner.Status -eq [MinerStatus]::DryRun -or $Miner.GetStatus() -eq [MinerStatus]::Running) { + $Miner.ContinousCycle ++ + If ($Config.Watchdog) { + ForEach ($Worker in $Miner.WorkersRunning) { + If ($WatchdogTimer = $Variables.WatchdogTimers.Where({ $_.MinerName -eq $Miner.Name -and $_.PoolName -eq $Worker.Pool.Name -and $_.PoolRegion -eq $Worker.Pool.Region -and $_.Algorithm -eq $Worker.Pool.Algorithm }) | Sort-Object -Property Kicked -Bottom 1) { + # Update watchdog timers + $WatchdogTimer.Kicked = ([DateTime]::Now).ToUniversalTime() + } + Else { + # Create watchdog timer + $Variables.WatchdogTimers += [PSCustomObject]@{ + Algorithm = $Worker.Pool.Algorithm + AlgorithmVariant = $Worker.Pool.AlgorithmVariant + DeviceNames = $Miner.DeviceNames + Kicked = ([DateTime]::Now).ToUniversalTime() + MinerBaseName = $Miner.BaseName + MinerName = $Miner.Name + MinerVersion = $Miner.Version + PoolName = $Worker.Pool.Name + PoolRegion = $Worker.Pool.Region + PoolVariant = $Worker.Pool.Variant + } + } + } + Remove-Variable Worker -ErrorAction Ignore + } + If ($Config.BadShareRatioThreshold -gt 0) { + If ($LatestMinerSharesData = ($Miner.Data | Select-Object -Last 1 -ErrorAction Ignore).Shares) { + ForEach ($Algorithm in $Miner.Algorithms) { + If ($LatestMinerSharesData.$Algorithm -and $LatestMinerSharesData.$Algorithm[1] -gt 0 -and $LatestMinerSharesData.$Algorithm[3] -gt [Math]::Floor(1 / $Config.BadShareRatioThreshold) -and $LatestMinerSharesData.$Algorithm[1] / $LatestMinerSharesData.$Algorithm[3] -gt $Config.BadShareRatioThreshold) { + $Miner.StatusInfo = "Error: '$($Miner.Info)' stopped. Too many bad shares (Shares Total = $($LatestMinerSharesData.$Algorithm[3]), Rejected = $($LatestMinerSharesData.$Algorithm[1]))" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + } + Remove-Variable Algorithm + } + } + } + Else { + $Miner.StatusInfo = "Error: '$($Miner.Info)' exited unexpectedly" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + } + + # Do not save data if stat just got removed (Miner.Activated < 1, set by API) + If ($Miner.Activated -gt 0 -and $Miner.Status -ne [MinerStatus]::DryRun) { + $Miner_Hashrates = @{ } + If ($Miner.Data.Count) { + # Collect hashrate from miner, returns an array of two values (safe, unsafe) + $Miner.Hashrates_Live = @() + ForEach ($Algorithm in $Miner.Algorithms) { + $CollectedHashrate = $Miner.CollectHashrate($Algorithm, (-not $Miner.Benchmark -and $Miner.Data.Count -lt $Miner.MinDataSample)) + $Miner.Hashrates_Live += [Double]($CollectedHashrate[1]) + $Miner_Hashrates.$Algorithm = [Double]($CollectedHashrate[0]) + } + If ($Miner.ReadPowerConsumption) { + # Collect power consumption from miner, returns an array of two values (safe, unsafe) + $CollectedPowerConsumption = $Miner.CollectPowerConsumption(-not $Miner.MeasurePowerConsumption -and $Miner.Data.Count -lt $Miner.MinDataSample) + $Miner.PowerConsumption_Live = [Double]($CollectedPowerConsumption[1]) + $Miner_PowerConsumption = [Double]($CollectedPowerConsumption[0]) + } + } + + # We don't want to store hashrates if we have less than $MinDataSample + If ($Miner.Data.Count -ge $Miner.MinDataSample -or $Miner.Activated -gt $Variables.WatchdogCount) { + $Miner.StatEnd = ([DateTime]::Now).ToUniversalTime() + $Stat_Span = [TimeSpan]($Miner.StatEnd - $Miner.StatStart) + + ForEach ($Worker in $Miner.Workers) { + $Algorithm = $Worker.Pool.AlgorithmVariant + $Factor = 1 + $LatestMinerSharesData = ($Miner.Data | Select-Object -Last 1 -ErrorAction Ignore).Shares + If ($Miner.Data.Count -gt $Miner.MinDataSample -and -not $Miner.Benchmark -and $Config.SubtractBadShares -and $LatestMinerSharesData.$Algorithm -gt 0) { # Need $Miner.MinDataSample shares before adjusting hashrate + $Factor = (1 - $LatestMinerSharesData.$Algorithm[1] / $LatestMinerSharesData.$Algorithm[3]) + $Miner_Hashrates.$Algorithm *= $Factor + } + $Stat_Name = "$($Miner.Name)_$($Worker.Pool.AlgorithmVariant)_Hashrate" + $Stat = Set-Stat -Name $Stat_Name -Value $Miner_Hashrates.$Algorithm -Duration $Stat_Span -FaultDetection ($Miner.Data.Count -lt $Miner.MinDataSample -or $Miner.Activated -lt $Variables.WatchdogCount) -ToleranceExceeded ($Variables.WatchdogCount + 1) + If ($Stat.Updated -gt $Miner.StatStart) { + Write-Message -Level Info "Saved hashrate for '$($Stat_Name -replace '_Hashrate$')': $(($Miner_Hashrates.$Algorithm | ConvertTo-Hash) -replace ' ')$(If ($Factor -le 0.999) { " (adjusted by factor $($Factor.ToString('N3')) [Shares total: $($LatestMinerSharesData.$Algorithm[2]), rejected: $($LatestMinerSharesData.$Algorithm[1])])" })$(If ($Miner.Benchmark) { " [Benchmark done] ($($Miner.Data.Count) Sample$(If ($Miner.Data.Count -ne 1) { "s" }))" })." + $Miner.StatStart = $Miner.StatEnd + $Variables.AlgorithmsLastUsed.($Worker.Pool.Algorithm) = @{ Updated = $Stat.Updated; Benchmark = $Miner.Benchmark; MinerName = $Miner.Name } + $Variables.PoolsLastUsed.($Worker.Pool.Name) = $Stat.Updated # most likely this will count at the pool to keep balances alive + } + ElseIf ($Miner_Hashrates.$Algorithm -gt 0 -and $Miner.Status -eq [MinerStatus]::Running -and $Stat.Week -and ($Miner_Hashrates.$Algorithm -gt $Stat.Week * 2 -or $Miner_Hashrates.$Algorithm -lt $Stat.Week / 2)) { # Stop miner if new value is outside ±200% of current value + $Miner.StatusInfo = "Error: '$($Miner.Info)'' Reported hashrate is unreal ($($Algorithm): $(($Miner_Hashrates.$Algorithm | ConvertTo-Hash) -replace ' ') is not within ±200% of stored value of $(($Stat.Week | ConvertTo-Hash) -replace ' '))" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + } + Remove-Variable Factor -ErrorAction Ignore + } + If ($Miner.ReadPowerConsumption) { + # We don't want to store power consumption if we have less than $MinDataSample, store even when fluctuating hash rates were recorded + If ($Miner.Data.Count -ge $Miner.MinDataSample -or $Miner.Activated -gt $Variables.WatchdogCount) { + If ([Double]::IsNaN($Miner_PowerConsumption )) { $Miner_PowerConsumption = 0 } + $Stat_Name = "$($Miner.Name)$(If ($Miner.Workers.Count -eq 1) { "_$($Miner.Workers[0].Pool.AlgorithmVariant)" })_PowerConsumption" + # Always update power consumption when benchmarking + $Stat = Set-Stat -Name $Stat_Name -Value $Miner_PowerConsumption -Duration $Stat_Span -FaultDetection (-not $Miner.Benchmark -and ($Miner.Data.Count -lt $Miner.MinDataSample -or $Miner.Activated -lt $Variables.WatchdogCount)) -ToleranceExceeded ($Variables.WatchdogCount + 1) + If ($Stat.Updated -gt $Miner.StatStart) { + Write-Message -Level Info "Saved power consumption for '$($Stat_Name -replace '_PowerConsumption$')': $($Stat.Live.ToString("N2"))W$(If ($Miner.MeasurePowerConsumption) { " [Power consumption measurement done] ($($Miner.Data.Count) Sample$(If ($Miner.Data.Count -ne 1) { "s" }))" })." + } + ElseIf ($Miner_PowerConsumption -gt 0 -and $Miner.Status -eq [MinerStatus]::Running -and $Stat.Week -and ($Miner_PowerConsumption -gt $Stat.Week * 2 -or $Miner_PowerConsumption -lt $Stat.Week / 2)) { + # Stop miner if new value is outside ±200% of current value + $Miner.StatusInfo = "Error: '$($Miner.Info)' Reported power consumption is unreal ($($PowerConsumption.ToString("N2"))W is not within ±200% of stored value of $(([Double]$Stat.Week).ToString("N2"))W)" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + } + } + Remove-Variable Algorithm, CollectedHashrateFactor, CollectedPowerConsumption, LatestMinerSharesData, Miner_Hashrates, Miner_PowerConsumption, Stat, Stat_Name, Stat_Span, Worker -ErrorAction Ignore + } + } + Remove-Variable Miner -ErrorAction Ignore + + # Update pools last used, required for BalancesKeepAlive + If ($Variables.PoolsLastUsed.values -gt $Variables.BeginCycleTime) { $Variables.PoolsLastUsed | Get-SortedObject | ConvertTo-Json | Out-File -LiteralPath ".\Data\PoolsLastUsed.json" -Force } + If ($Variables.AlgorithmsLastUsed.Values.Updated -gt $Variables.BeginCycleTime) { $Variables.AlgorithmsLastUsed | Get-SortedObject | ConvertTo-Json | Out-File -LiteralPath ".\Data\AlgorithmsLastUsed.json" -Force } + + # Send data to monitoring server + If ($Config.ReportToServer) { Write-MonitoringData } + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + # Much faster + $Miners = $Variables.Miners.Clone() + + # Get new miners + If ($AvailableMinerPools = If ($Config.MinerUseBestPoolsOnly) { $Variables.Pools.Where({ $_.Available -and ($_.Best -or $_.Prioritize) }) } Else { $Variables.Pools.Where({ $_.Available }) }) { + # $AvailableMinerPools = ($AvailableMinerPools | Group-Object Variant, AlgorithmVariant, MiningCurrency).ForEach({ $_.Group | Sort-Object -Property Updated -Bottom 1 }) + $MinerPools = @([Ordered]@{ "" = "" }, [Ordered]@{ "" = "" } ) + ($AvailableMinerPools.Where({ $_.Reasons -notcontains "Unprofitable primary algorithm" }) | Group-Object Algorithm).ForEach({ $MinerPools[0][$_.Name] = @($_.Group | Sort-Object -Property Price_Bias -Descending) }) + ($AvailableMinerPools.Where({ $_.Reasons -notcontains "Unprofitable secondary algorithm" }) | Group-Object Algorithm).ForEach({ $MinerPools[1][$_.Name] = @($_.Group | Sort-Object -Property Price_Bias -Descending) }) + + Write-Message -Level Info "Loading miners...$(If (-not $Variables.Miners) { "
This may take a while." })" + $MinersNew = (Get-ChildItem -Path ".\Miners\*.ps1").ForEach( + { + $MinerFileName = $_.Name + Try { + & $_.FullName + } + Catch { + Write-Message -Level Error "Error in miner file '$MinerFileName': $_." + "$(Get-Date -Format "yyyy-MM-dd_HH:mm:ss")" >> "Logs\Error_Dev.txt" + $_.Exception | Format-List -Force >> "Logs\Error_Dev.txt" + $_.InvocationInfo | Format-List -Force >> "Logs\Error_Dev.txt" + } + } + ).ForEach( + { + Try { + $Miner = $_ + $Miner | Add-Member MinDataSample $Config.MinDataSample + $Miner | Add-Member ProcessPriority $(If ($_.Type -eq "CPU") { $Config.CPUMinerProcessPriority } Else { $Config.GPUMinerProcessPriority }) + ForEach ($Worker in $Miner.Workers) { + $Miner.Workers[$Miner.Workers.IndexOf($Worker)].Fee = If ($Config.IgnoreMinerFee) { 0 } Else { $Miner.Fee[$Miner.Workers.IndexOf($Worker)] } + } + $Miner.PSObject.Properties.Remove("Fee") + $Miner | Add-Member Algorithms $Miner.Workers.Pool.AlgorithmVariant + $Miner | Add-Member Info "$(($Miner.Name -split '-')[0..2] -join '-') {$($Miner.Workers.ForEach({ "$($_.Pool.AlgorithmVariant)$(If ($_.Pool.MiningCurrency) { "[$($_.Pool.MiningCurrency)]" })", $_.Pool.Name -join '@' }) -join ' & ')}$(If (($Miner.Name -split '-')[4]) { " (Dual Intensity $(($Miner.Name -split '-')[4]))"})" + If ($Config.UseAllPoolAlgoCombos) { $Miner.Name = $Miner.Info -replace "\{", "(" -replace "\}", ")" -replace " " } + $Miner -as $_.API + } + Catch { + Write-Message -Level Error "Failed to add Miner '$($Miner.Name)' as '$($Miner.API)' ($($Miner | ConvertTo-Json -Compress))" + "$(Get-Date -Format "yyyy-MM-dd_HH:mm:ss")" >> "Logs\Error_Dev.txt" + $_.Exception | Format-List -Force >> "Logs\Error_Dev.txt" + $_.InvocationInfo | Format-List -Force >> "Logs\Error_Dev.txt" + } + } + ) + Remove-Variable Algorithm, Miner, MinerFileName, MinerPools -ErrorAction Ignore + } + Remove-Variable AvailableMinerPools -ErrorAction Ignore + + $CompareMiners = Compare-Object @($Miners | Select-Object) @($MinersNew | Select-Object) -Property Info -IncludeEqual -PassThru + # Properties that need to be set only once because they are not dependent on any config or pool information + $MinerDevices = @($Variables.EnabledDevices | Select-Object -Property Bus, ConfiguredPowerConsumption, Name, ReadPowerConsumption, Status) + ForEach ($Miner in $CompareMiners.Where({ $_.SideIndicator -eq "=>" })) { + $Miner.BaseName, $Miner.Version, $null = $Miner.Name -split '-' + $Miner.Devices = @($MinerDevices.Where({ $_.Name -in $Miner.DeviceNames })) + } + Remove-Variable Miner, MinerDevices -ErrorAction Ignore + $Miners = [Miner[]]@($CompareMiners.Where({ $_.SideIndicator -ne "<=" })) + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Make smaller groups for faster update + $MinerGroups = $MinersNew | Group-Object -Property Name + ($Miners | Group-Object -Property Name).ForEach( + { + Try { + $Name = $_.Name + $MinerGroup = $MinerGroups.Where({ $Name -eq $_.Name }).Group + $_.Group.ForEach( + { + If ($_.KeepRunning = ($_.Status -in @([MinerStatus]::Running, [MinerStatus]::DryRun)) -and -not ($_.Benchmark -or $_.MeasurePowerConsumption -or $Variables.DonationRunning) -and $_.ContinousCycle -lt $Config.MinCycle ) { # Minimum numbers of full cycles not yet reached + $_.Restart = $false + } + Else { + $Info = $_.Info + If ($Miner = $MinerGroup.Where({ $Info -eq $_.Info })[0]) { + # Update existing miners + If ($_.Restart = $_.Arguments -ne $Miner.Arguments) { + $_.Arguments = $Miner.Arguments + $_.Port = $Miner.Port + } + $_.CommandLine = $Miner.GetCommandLine().Replace("$PWD\", "") + $_.PrerequisitePath = $Miner.PrerequisitePath + $_.PrerequisiteURI = $Miner.PrerequisiteURI + $_.WarmupTimes = $Miner.WarmupTimes + } + } + $_.Refresh($Variables.PowerCostBTCperW, $Variables.CalculatePowerCost) + $_.WindowStyle = If ($Config.MinerWindowStyleNormalWhenBenchmarking -and $_.Benchmark) { "normal" } Else { $Config.MinerWindowStyle } + } + ) + } + Catch { + Start-Sleep 0 + } + } + ) + Remove-Variable Info, Miner, MinerGroup, MinerGroups, MinersNew, Name -ErrorAction Ignore + + $Variables.MinerDataCollectedTimeStamp = ([DateTime]::Now).ToUniversalTime() + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + If ($Miners) { + # Filter miners + $Miners.Where({ $_.Disabled }).ForEach({ $_.Reasons.Add("Disabled by user"); $_.Status = [MinerStatus]::Disabled }) + If ($Config.ExcludeMinerName.Count) { $Miners.Where({ (Compare-Object @($Config.ExcludeMinerName | Select-Object) @($_.BaseName, "$($_.BaseName)-$($_.Version)", $_.Name | Select-Object -Unique) -IncludeEqual -ExcludeDifferent | Measure-Object).Count -gt 0 }).ForEach({ $_.Reasons.Add("ExcludeMinerName ($($Config.ExcludeMinerName -join ', '))") }) } + $Miners.Where({ $_.Earning -eq 0 }).ForEach({ $_.Reasons.Add("Earning -eq 0") }) + If ($Config.DisableMinersWithFee) { $Miners.Where({ $_.Workers.Fee }).ForEach({ $_.Reasons.Add("Config.DisableMinersWithFee") }) } + If ($Config.DisableDualAlgoMining) { $Miners.Where({ $_.Workers.Count -eq 2 }).ForEach({ $_.Reasons.Add("Config.DisableDualAlgoMining") }) } + ElseIf ($Config.DisableSingleAlgoMining) { $Miners.Where({ $_.Workers.Count -eq 1 }).ForEach({ $_.Reasons.Add("Config.DisableSingleAlgoMining") }) } + + # Disable CPU miners when running on battery + If ($Config.DisableCpuMiningOnBattery -and (Get-CimInstance Win32_Battery).BatteryStatus -eq 1) { $Miners.Where( { $_.Type -eq "CPU" }).ForEach({ $_.Reasons.Add("Config.DisableCpuMiningOnBattery") }) } + + # Detect miners with unreal earning (> x times higher than average of the next best 10% or at least 5 miners) + If ($Config.UnrealMinerEarningFactor -gt 1) { + ($Miners.Where({ -not $_.Reasons }) | Group-Object { [String]$_.DeviceNames }).ForEach( + { + If ($ReasonableEarning = [Double]($_.Group | Sort-Object -Descending -Property Earning_Bias | Select-Object -Skip 1 -First (5, [Math]::Floor($_.Group.Count / 10) | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) | Measure-Object Earning -Average).Average * $Config.UnrealMinerEarningFactor) { + ($_.Group.Where({ $_.Earning -GT $ReasonableEarning })).ForEach( + { $_.Reasons.Add("Unreal profit data (-gt $($Config.UnrealMinerEarningFactor)x higher than the next best miners available miners)") } + ) + } + } + ) + } + + $Bias = If ($Variables.CalculatePowerCost -and -not $Config.IgnorePowerCost) { "Profit_Bias" } Else { "Earning_Bias" } + If ($Config.UseAllPoolAlgoCombos) { + # Use best miner per algorithm family + $Miners.Where({ -not $_.Reasons }) | Group-Object { [String]$_.DeviceNames }, { [String]$_.Workers.Pool.Name }, { [String]$_.Workers.Pool.Algorithm } | ForEach-Object { + $_.Group | Select-Object -Skip 1 | ForEach-Object { + $_.Reasons.Add("Not best miner in algorithm family") + } + } + } + + $Miners.Where({ $_.Workers[0].Hashrate -eq 0 }).ForEach({ $_.Reasons.Add("0 H/s Stat file") }) + + $Variables.MinersMissingBinary = @() + $Miners.Where({ -not $_.Reasons -and -not (Test-Path -LiteralPath $_.Path -Type Leaf) }).ForEach( + { + $_.Reasons.Add("Binary missing") + $Variables.MinersMissingBinary += $_ + } + ) + + $Variables.MinersMissingPrerequisite = @() + $Miners.Where({ -not $_.Reasons -and $_.PrerequisitePath }).ForEach( + { + $_.Reasons.Add("Prerequisite missing ($(Split-Path -Path $_.PrerequisitePath -Leaf))") + $Variables.MinersMissingPrerequisite += $_ + } + ) + + # Apply watchdog to miners + If ($Config.Watchdog) { + ($Miners.Where({ -not $_.Reasons }) | Group-Object -Property { "$($_.BaseName)-$($_.Version)" }).ForEach( + { + # Suspend miner if more than 50% of all available algorithms failed + $WatchdogMinerCount = ($Variables.WatchdogCount, [Math]::Floor($Variables.WatchdogCount * $_.Group.Count / 2) | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) + If ($MinersToSuspend = @($_.Group.Where({ @($Variables.WatchdogTimers | Where-Object MinerName -EQ $_.Name | Where-Object MinerVersion -EQ $_.Version | Where-Object Kicked -LT $Variables.Timer).Count -gt $WatchdogMinerCount }))) { + $MinersToSuspend.ForEach({ $_.Reasons.Add("Miner suspended by watchdog (all algorithms)") }) + Write-Message -Level Warn "Miner '$($_.Group[0].BaseName)-$($_.Group[0].Version) [all algorithms]' is suspended by watchdog until $((($Variables.WatchdogTimers | Where-Object MinerBaseName -EQ $_.Group[0].BaseName | Where-Object MinerVersion -EQ $_.Group[0].Version | Where-Object Kicked -LT $Variables.Timer).Kicked | Sort-Object -Bottom 1).AddSeconds($Variables.WatchdogReset).ToLocalTime().ToString("T"))." + } + Remove-Variable MinersToSuspend, WatchdogMinerCount + } + ) + $Miners.Where({ -not $_.Reasons }).Where( + { @($Variables.WatchdogTimers | Where-Object MinerName -EQ $_.Name | Where-Object DeviceNames -EQ $_.DeviceNames | Where-Object Algorithm -EQ $_.Algorithm | Where-Object Kicked -LT $Variables.Timer).Count -ge $Variables.WatchdogCount } + ).ForEach( + { + $_.Reasons.Add("Miner suspended by watchdog (Algorithm $($_.Algorithm))") + Write-Message -Level Warn "Miner '$($_.Name) [$($_.Algorithm)]' is suspended by watchdog until $((($Variables.WatchdogTimers | Where-Object MinerName -EQ $_.Name | Where-Object DeviceNames -EQ $_.DeviceNames | Where-Object Algorithm -EQ $_.Algorithm | Where-Object Kicked -LT $Variables.Timer).Kicked | Sort-Object -Bottom 1).AddSeconds($Variables.WatchdogReset).ToLocalTime().ToString("T"))." + } + ) + } + + $Miners.Where({ $_.Reasons }).ForEach({ $_.Reasons = [System.Collections.Generic.List[String]]@($_.Reasons | Sort-Object -Unique); $_.Available = $false }) + + Write-Message -Level Info "Loaded $($Miners.Count) miner$(If ($Miners.Count -ne 1) { 's' }), filtered out $($Miners.Where({ -not $_.Available }).Count) miner$(If ($Miners.Where({ -not $_.Available }).Count -ne 1) { 's' }). $($Miners.Where({ $_.Available }).Count) available miner$(If ($Miners.Where({ $_.Available }).Count -ne 1) { 's' }) remain$(If ($Miners.Where({ $_.Available }).Count -eq 1) { 's' })." + + $DownloadList = @($Variables.MinersMissingPrerequisite | Select-Object @{ Name = "URI"; Expression = { $_.PrerequisiteURI } }, @{ Name = "Path"; Expression = { $_.PrerequisitePath } }, @{ Name = "Searchable"; Expression = { $false } }) + @($Variables.MinersMissingBinary | Select-Object URI, Path, @{ Name = "Searchable"; Expression = { $false } }) | Select-Object * -Unique + If ($DownloadList) { + If ($Variables.Downloader.State -ne "Running") { + # Download miner binaries + Write-Message -Level Info "Some miners binaries are missing ($($DownloadList.Count) item$(If ($DownloadList.Count -ne 1) { "s" })), starting downloader..." + $Downloader_Parameters = @{ + Config = $Config + DownloadList = $DownloadList + Variables = $Variables + } + $Variables.Downloader = Start-ThreadJob -Name Downloader -StreamingHost $null -FilePath ".\Includes\Downloader.ps1" -InitializationScript ([scriptblock]::Create("Set-Location '$($Variables.MainPath)'")) -ArgumentList $Downloader_Parameters -ThrottleLimit (2 * $Variables.Devices.Count + 2) + Remove-Variable Downloader_Parameters + } + ElseIf (-not $Miners.Where({ $_.Available })) { + Write-Message -Level Info "Waiting 30 seconds for downloader to install binaries..." + } + } + Remove-Variable DownloadList + + # Open firewall ports for all miners + If ($Config.OpenFirewallPorts) { + If (Get-Command "Get-MpPreference") { + If ((Get-Command "Get-MpComputerStatus") -and (Get-MpComputerStatus)) { + If (Get-Command "Get-NetFirewallRule") { + If ($MissingMinerFirewallRules = (Compare-Object @(Get-NetFirewallApplicationFilter | Select-Object -ExpandProperty Program -Unique) @($Miners | Select-Object -ExpandProperty Path -Unique) -PassThru).Where({ $_.SideIndicator -eq "=>" })) { + Start-Process "pwsh" ("-Command Import-Module NetSecurity; ('$($MissingMinerFirewallRules | ConvertTo-Json -Compress)' | ConvertFrom-Json) | ForEach-Object { New-NetFirewallRule -DisplayName (Split-Path `$_ | Split-Path -leaf) -Program `$_ -Description 'Inbound rule added by $($Variables.Branding.ProductLabel) $($Variables.Branding.Version) on $(([DateTime]::Now).ToString())' -Group '$($Variables.Branding.ProductLabel)' }" -replace '"', '\"') -Verb runAs + } + Remove-Variable MissingMinerFirewallRules + } + } + } + } + } + Else { + $Miners.ForEach({ $_.Available = $false }) + } + $Variables.MinersMostProfitable = $Variables.MinersBestPerDevice = $Variables.Miners_Device_Combos = $Variables.MinersBestPerDevice_Combos = $Variables.MinersBestPerDevice_Combo = [Miner[]]@() + + If ($Miners.Where({ $_.Available })) { + Write-Message -Level Info "Selecting best miner$(If (@($Variables.EnabledDevices.Model | Select-Object -Unique).Count -gt 1) { "s" }) based on$(If ($Variables.CalculatePowerCost) { " profit (power cost $($Config.MainCurrency) $($Variables.PowerPricekWh)/kWâ‹…h)" } Else { " earning" })..." + + If ($Miners.Where({ $_.Available }).Count -eq 1) { + $Variables.MinersBestPerDevice_Combo = $Variables.MinersBestPerDevice = $Variables.MinersMostProfitable = $Miners + } + Else { + # Add running miner bonus + $RunningMinerBonusFactor = 1 + $Config.MinerSwitchingThreshold / 100 + $Miners.Where({ $_.Status -eq [MinerStatus]::Running }).ForEach({ $_.$Bias *= $RunningMinerBonusFactor }) + + # Get most profitable miners per algorithm and device + $Variables.MinersMostProfitable = @(($Miners.Where({ $_.Available }) | Group-Object { [String]$_.DeviceNames }, { [String]$_.Algorithms }).ForEach({ ($_.Group | Sort-Object -Descending -Property Benchmark, MeasurePowerConsumption, KeepRunning, Prioritize, $Bias, Activated, @{ Expression = { $_.WarmupTimes[1] + $_.MinDataSample }; Descending = $true }, @{ Expression = { [String]$_.Algorithms }; Descending = $false } -Top 1).ForEach({ $_.MostProfitable = $true; $_ }) })) + # Get the best miners per device + $Variables.MinersBestPerDevice = @(($Miners.Where({ $_.Available }) | Group-Object { [String]$_.DeviceNames }).ForEach({ $_.Group | Sort-Object -Descending -Property Benchmark, MeasurePowerConsumption, KeepRunning, Prioritize, $Bias, Activated, @{ Expression = { $_.WarmupTimes[1] + $_.MinDataSample }; Descending = $true } -Top 1 })) + $Variables.Miners_Device_Combos = @((Get-Combination @($Variables.MinersBestPerDevice | Select-Object DeviceNames -Unique)).Where({ (Compare-Object ($_.Combination | Select-Object -ExpandProperty DeviceNames -Unique) ($_.Combination | Select-Object -ExpandProperty DeviceNames) | Measure-Object).Count -eq 0 })) + + # Get most best miner combination i.e. AMD+NVIDIA+CPU + $Variables.MinersBestPerDevice_Combos = @( + $Variables.Miners_Device_Combos.ForEach( + { + $Miner_Device_Combo = $_.Combination + [PSCustomObject]@{ + Combination = $Miner_Device_Combo.ForEach( + { + $Miner_Device_Count = $_.DeviceNames.Count + [Regex]$Miner_Device_Regex = "^(" + (($_.DeviceNames.ForEach({ [Regex]::Escape($_) })) -join '|') + ")$" + $Variables.MinersBestPerDevice.Where({ ([Array]$_.DeviceNames -notmatch $Miner_Device_Regex).Count -eq 0 -and ([Array]$_.DeviceNames -match $Miner_Device_Regex).Count -eq $Miner_Device_Count }) + } + ) + } + } + ) + ) + $Variables.MinersBestPerDevice_Combo = @(($Variables.MinersBestPerDevice_Combos | Sort-Object -Descending { @($_.Combination.Where({ [Double]::IsNaN($_.$Bias) })).Count }, { ($_.Combination | Measure-Object $Bias -Sum | Select-Object -ExpandProperty Sum) }, { ($_.Combination.Where({ $_.$Bias -ne 0 }) | Measure-Object).Count } -Top 1).Combination) + + # Revert running miner bonus + $Miners.Where({ $_.Status -eq [MinerStatus]::Running }).ForEach({ $_.$Bias /= $RunningMinerBonusFactor }) + Remove-Variable Bias, Miner_Device_Combo, Miner_Device_Count, Miner_Device_Regex, RunningMinerBonusFactor -ErrorAction Ignore + } + + $Variables.PowerConsumptionIdleSystemW = (($Config.PowerConsumptionIdleSystemW - ($Variables.MinersBestPerDevice_Combo.Where({ $_.Type -eq "CPU" }) | Measure-Object PowerConsumption -Sum | Select-Object -ExpandProperty Sum)), 0 | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) + + $Variables.BasePowerCost = [Double]($Variables.PowerConsumptionIdleSystemW / 1000 * 24 * $Variables.PowerPricekWh / $Variables.Rates."BTC".($Config.MainCurrency)) + + $Variables.MiningEarning = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object Earning_Bias -Sum | Select-Object -ExpandProperty Sum) + $Variables.MiningPowerCost = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object PowerCost -Sum | Select-Object -ExpandProperty Sum) + $Variables.MiningPowerConsumption = [Double]($Variables.MinersBestPerDevice_Combo | Measure-Object PowerConsumption -Sum | Select-Object -ExpandProperty Sum) + $Variables.MiningProfit = [Double](($Variables.MinersBestPerDevice_Combo | Measure-Object Profit_Bias -Sum | Select-Object -ExpandProperty Sum) - $Variables.BasePowerCost) + } + Else { + $Variables.MiningEarning = $Variables.MiningProfit = $Variables.MiningPowerCost = $Variables.MiningPowerConsumption = [Double]0 + } + } + + $Variables.MinersNeedingBenchmark = @($Miners.Where({ $_.Available -and $_.Benchmark }) | Sort-Object -Property { [String]$_.Algorithms, $_.Name } -Unique) + $Variables.MinersNeedingPowerConsumptionMeasurement = @($Miners.Where({ $_.Available -and $_.MeasurePowerConsumption }) | Sort-Object -Property { [String]$_.Algorithms, $_.Name } -Unique) + + # ProfitabilityThreshold check - OK to run miners? + If ($Variables.DonationRunning -or (-not $Config.CalculatePowerCost -and $Variables.MiningEarning -ge ($Config.ProfitabilityThreshold / $Variables.Rates.BTC.($Config.MainCurrency))) -or ($Config.CalculatePowerCost -and $Variables.MiningProfit -ge ($Config.ProfitabilityThreshold / $Variables.Rates.BTC.($Config.MainCurrency))) -or $Variables.MinersNeedingBenchmark -or $Variables.MinersNeedingPowerConsumptionMeasurement) { + $Variables.MinersBestPerDevice_Combo.ForEach({ $_.Best = $true }) + If ($Variables.Rates."BTC") { + If ($Variables.MinersNeedingBenchmark.Count) { + $Variables.Summary = "Earning / day: n/a (Benchmarking: $($Variables.MinersNeedingBenchmark.Count) $(If ($Variables.MinersNeedingBenchmark.Count -eq 1) { "miner" } Else { "miners" }) left$(If (($Variables.EnabledDevices | Sort-Object -Property { $_.DeviceNames }).Count -gt 1) { " [$((($Variables.MinersNeedingBenchmark | Group-Object -Property { $_.DeviceNames } | Sort-Object -Property Name).ForEach({ "$($_.Name): $($_.Count)" })) -join ', ')]"}))" + } + ElseIf ($Variables.MiningEarning -gt 0) { + $Variables.Summary = "Earning / day: {0:n} {1}" -f ($Variables.MiningEarning * $Variables.Rates."BTC".($Config.MainCurrency)), $Config.MainCurrency + } + Else { + $Variables.Summary = "" + } + + If ($Variables.CalculatePowerCost -and $Variables.PoolsBest) { + If ($Variables.Summary -ne "") { $Variables.Summary += "   " } + + If ($Variables.MinersNeedingPowerConsumptionMeasurement.Count -or [Double]::IsNaN($Variables.MiningPowerCost)) { + $Variables.Summary += "Profit / day: n/a (Measuring power consumption: $($Variables.MinersNeedingPowerConsumptionMeasurement.Count) $(If ($Variables.MinersNeedingPowerConsumptionMeasurement.Count -eq 1) { "miner" } Else { "miners" }) left$(If (($Variables.EnabledDevices | Sort-Object -Property { $_.DeviceNames }).Count -gt 1) { " [$((($Variables.MinersNeedingPowerConsumptionMeasurement | Group-Object -Property { $_.DeviceNames } | Sort-Object -Property Name).ForEach({ "$($_.Name): $($_.Count)" })) -join ', ')]"}))" + } + ElseIf ($Variables.MinersNeedingBenchmark.Count) { + $Variables.Summary += "Profit / day: n/a" + } + ElseIf ($Variables.MiningPowerConsumption -gt 0) { + $Variables.Summary += "Profit / day: {0:n} {1}" -f ($Variables.MiningProfit * $Variables.Rates."BTC".($Config.MainCurrency)), $Config.MainCurrency + } + Else { + $Variables.Summary += "Profit / day: n/a (no power data)" + } + + If ($Variables.CalculatePowerCost) { + If ($Variables.Summary -ne "") { $Variables.Summary += "   " } + + If ([Double]::IsNaN($Variables.MiningEarning) -or [Double]::IsNaN($Variables.MiningPowerCost)) { + $Variables.Summary += "Power Cost / day: n/a [Miner$(If ($Variables.MinersBestPerDevice_Combo.Count -ne 1) { "s" }): n/a; Base: {1:n} {0} ({2:n2} W)]" -f $Config.MainCurrency, ($Variables.BasePowerCost * $Variables.Rates."BTC".($Config.MainCurrency)), $Variables.PowerConsumptionIdleSystemW + } + ElseIf ($Variables.MiningPowerConsumption -gt 0) { + $Variables.Summary += "Power Cost / day: {1:n} {0} [Miner$(If ($Variables.MinersBestPerDevice_Combo.Count -ne 1) { "s" }): {2:n} {0} ({3:n2} W); Base: {4:n} {0} ({5:n2} W)]" -f $Config.MainCurrency, (($Variables.MiningPowerCost + $Variables.BasePowerCost) * $Variables.Rates."BTC".($Config.MainCurrency)), ($Variables.MiningPowerCost * $Variables.Rates."BTC".($Config.MainCurrency)), $Variables.MiningPowerConsumption, ($Variables.BasePowerCost * $Variables.Rates."BTC".($Config.MainCurrency)), $Variables.PowerConsumptionIdleSystemW + } + Else { + $Variables.Summary += "Power Cost / day: n/a [Miner: n/a; Base: {1:n} {0} ({2:n2} W)]" -f $Config.MainCurrency, ($Variables.BasePowerCost * $Variables.Rates.BTC.($Config.MainCurrency)), $Variables.PowerConsumptionIdleSystemW + } + } + } + If ($Variables.Summary -ne "") { $Variables.Summary += "
" } + + # Add currency conversion rates + @((@(If ($Config.UsemBTC) { "mBTC" } Else { "BTC" }) + @($Config.ExtraCurrencies)) | Select-Object -Unique).Where({ $Variables.Rates.$_.($Config.MainCurrency) }).ForEach( + { + $Variables.Summary += "1 $_ = {0:N$(Get-DecimalsFromValue -Value $Variables.Rates.$_.($Config.MainCurrency) -DecimalsMax $Config.DecimalsMax)} $($Config.MainCurrency)   " -f $Variables.Rates.$_.($Config.MainCurrency) + } + ) + } + Else { + $Variables.Summary = "Error:
Could not get BTC exchange rate from min-api.cryptocompare.com" + } + } + Else { + # Mining earning/profit is below threshold + $Variables.MinersBestPerDevice_Combo = [Miner[]]@() + If ($Config.CalculatePowerCost) { + $Variables.Summary = "Mining profit {0} {1:n$($Config.DecimalsMax)} / day is below the configured threshold of {0} {2:n$($Config.DecimalsMax)} / day. Mining is suspended until threshold is reached." -f $Config.MainCurrency, (($Variables.MiningEarning - $Variables.MiningPowerCost - $Variables.BasePowerCost) * $Variables.Rates."BTC".($Config.MainCurrency)), $Config.ProfitabilityThreshold + } + Else { + $Variables.Summary = "Mining earning {0} {1:n$($Config.DecimalsMax)} / day is below the configured threshold of {0} {2:n$($Config.DecimalsMax)} / day. Mining is suspended until threshold is reached." -f $Config.MainCurrency, ($Variables.MiningEarning * $Variables.Rates."BTC".($Config.MainCurrency)), $Config.ProfitabilityThreshold + } + Write-Message -Level Warn ($Variables.Summary -replace '
', ' ' -replace ' / day', '/day') + If ($Variables.Rates) { + # Add currency conversion rates + If ($Variables.Summary -ne "") { $Variables.Summary += "
" } + @((@(If ($Config.UsemBTC) { "mBTC" } Else { "BTC" }) + @($Config.ExtraCurrencies)) | Select-Object -Unique).Where({ $Variables.Rates.$_.($Config.MainCurrency) }).ForEach( + { + $Variables.Summary += "1 $_ = {0:N$(Get-DecimalsFromValue -Value $Variables.Rates.$_.($Config.MainCurrency) -DecimalsMax $Config.DecimalsMax)} $($Config.MainCurrency)   " -f $Variables.Rates.$_.($Config.MainCurrency) + } + ) + } + } + + If (-not $Variables.MinersBestPerDevice_Combo -and $Miners) { $Miners.ForEach({ $_.Best = $false }) } + + # Stop running miners + ForEach ($Miner in @($CompareMiners.Where({ $_.WorkersRunning }) | Sort-Object { ($_.Name -Split '-')[2] })) { + If ($Miner.Status -ne [MinerStatus]::DryRun -and $Miner.GetStatus() -ne [MinerStatus]::Running) { + $Miner.StatusInfo = "Error: '$($Miner.Info)' exited unexpectedly" + $Miner.SetStatus([MinerStatus]::Failed) + } + Else { + If ($Config.DryRun -and $Miner.GetStatus() -eq [MinerStatus]::Running) { $Miner.Restart = $true } + If (-not $Config.DryRun -and $Miner.Status -eq [MinerStatus]::DryRun) { $Miner.Restart = $true } + If ($Miner.Benchmark -or $Miner.MeasurePowerConsumption) { $Miner.Restart = $true } + If (-not $Miner.Best -or $Miner.Restart -or $Miner.SideIndicator -eq "<=" -or $Variables.NewMiningStatus -ne "Running") { + ForEach ($Worker in $Miner.WorkersRunning) { + If ($WatchdogTimers = @($Variables.WatchdogTimers.Where({ $_.MinerName -eq $Miner.Name -and $_.PoolName -eq $Worker.Pool.Name -and $_.PoolRegion -eq $Worker.Pool.Region -and $_.Algorithm -eq $Worker.Pool.Algorithm -and $_.DeviceNames -eq $Miner.DeviceNames }))) { + # Remove Watchdog timers + $Variables.WatchdogTimers = @($Variables.WatchdogTimers.Where({ $_ -notin $WatchdogTimers })) + } + } + Remove-Variable WatchdogTimers, Worker -ErrorAction Ignore + $Miner.SetStatus([MinerStatus]::Idle) + } + } + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + Remove-Variable CompareMiners, Miner, WatchdogTimers, Worker -ErrorAction Ignore + + # Kill stuck miners on subsequent cycles when not in dry run mode + If (-not $Config.DryRun -or $Variables.CycleStarts.Count -eq 1 -or $Variables.MinersNeedingBenchmark -or $Variables.MinersNeedingPowerConsumptionMeasurement) { + $Loops = 0 + While ($StuckMinerProcessIDs = @((Get-CimInstance CIM_Process).Where({ $_.ExecutablePath -and ($Miners.Path | Sort-Object -Unique) -contains $_.ExecutablePath -and $Miners.ProcessID -notcontains $_.ProcessID }) | Select-Object -ExpandProperty ProcessID)) { + $StuckMinerProcessIDs.ForEach( + { + If ($Miner = $Miners | Where-Object ProcessID -EQ $_) { Write-Message -Level Verbose "Killing stuck miner '$($Miner.Name)'." } + Stop-Process -Id $_ -Force -ErrorAction Ignore + } + ) + Start-Sleep -Milliseconds 500 + $Loops ++ + If ($Loops -gt 100) { + $Message = "Cannot stop all miners graciously." + If ($Config.AutoReboot) { + Write-Message -Level Error "$Message Restarting computer in 30 seconds..." + shutdown.exe /r /t 30 /c "$($Variables.Branding.ProductLabel) detected stuck miner$(If ($StuckMinerProcessIDs.Count -ne 1) { "s" }) and will reboot the computer in 30 seconds." + Start-Sleep -Seconds 60 + } + Else { + Write-Message -Level Error $Message + Start-Sleep -Seconds 30 + } + } + } + Remove-Variable Loops, Message, Miner, StuckMinerProcessIDs -ErrorAction Ignore + } + + $Miners.ForEach( + { + $_.PSObject.Properties.Remove("SideIndicator") + If ($_.Reasons -and $_.Status -ne [MinerStatus]::Disabled) { + $_.Status = "Unavailable" + $_.SubStatus = "Unavailable" + } + ElseIf ($_.Status -eq [MinerStatus]::Idle) { + $_.SubStatus = "Idle" + } + ElseIf ($_.Status -eq [MinerStatus]::Unavailable) { + $_.Status = "Idle" + $_.SubStatus = "Idle" + } + } + ) + + If (-not ($Variables.EnabledDevices -and $Miners.Where({ $_.Available }))) { + $Variables.Miners.ForEach({ $_.Status = [MinerStatus]::Idle; $_.StatusInfo = "Idle" }) + $Variables.Devices.Where({ $_.State -eq [DeviceState]::Enabled }).ForEach({ $_.Status = [MinerStatus]::Idle; $_.StatusInfo = "Idle" }) + $Variables.Miners = [Miner[]]@() + If (-not $Variables.EnabledDevices) { + Write-Message -Level Warn "No enabled devices - retrying in $($Config.Interval) seconds..." + Start-Sleep -Seconds $Config.Interval + Write-Message -Level Info "Ending cycle (No enabled devices)." + } + ElseIf (-not $Variables.PoolName) { + Write-Message -Level Warn "No configured pools - retrying in $($Config.Interval) seconds..." + Start-Sleep -Seconds $Config.Interval + Write-Message -Level Info "Ending cycle (No configured pools)." + } + ElseIf (-not $Variables.PoolsBest) { + Write-Message -Level Warn "No available pools - retrying in $($Config.Interval) seconds..." + Start-Sleep -Seconds $Config.Interval + Write-Message -Level Info "Ending cycle (No available pools)." + } + Else { + Write-Message -Level Warn "No available miners - retrying in $($Config.Interval) seconds..." + Start-Sleep -Seconds $Config.Interval + Write-Message -Level Info "Ending cycle (No available miners)." + } + Continue + } + ElseIf (-not $Variables.MinersBestPerDevice_Combo) { + $Variables.Miners.ForEach({ $_.Status = [MinerStatus]::Idle; $_.StatusInfo = "Idle" }) + $Variables.Devices.Where({ $_.State -eq [DeviceState]::Enabled }).ForEach({ $_.Status = [MinerStatus]::Idle; $_.StatusInfo = "Idle" }) + Write-Message -Level Warn "No profitable miners - retrying in $($Config.Interval) seconds..." + Start-Sleep -Seconds $Config.Interval + Write-Message -Level Info "Ending cycle (No profitable miners)." + Continue + } + + # Update data in API + $Variables.Miners = $Miners + Remove-Variable Miners + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + # Faster shutdown + If ($Variables.NewMiningStatus -ne "Running" -or $Variables.IdleRunspace.MiningStatus -eq "Idle") { Continue } + + # Optional delay to avoid blue screens + Start-Sleep -Seconds $Config.Delay + + ForEach ($Miner in ($Variables.MinersBestPerDevice_Combo | Sort-Object { ($_.Name -Split '-')[2] })) { + + If ($Miner.Status -ne [MinerStatus]::DryRun -and $Miner.GetStatus() -ne [MinerStatus]::Running) { + If ($Miner.Status -ne [MinerStatus]::DryRun) { + # Launch prerun if exists + If ($Miner.Type -eq "AMD" -and (Test-Path -LiteralPath ".\Utils\Prerun\AMDPrerun.bat" -PathType Leaf)) { + Start-Process ".\Utils\Prerun\AMDPrerun.bat" -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + } + ElseIf ($Miner.Type -eq "CPU" -and (Test-Path -LiteralPath ".\Utils\Prerun\CPUPrerun.bat" -PathType Leaf)) { + Start-Process ".\Utils\Prerun\CPUPrerun.bat" -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + } + ElseIf ($Miner.Type -eq "INTEL" -and (Test-Path -LiteralPath ".\Utils\Prerun\INTELPrerun.bat" -PathType Leaf)) { + Start-Process ".\Utils\Prerun\INTELPrerun.bat" -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + } + ElseIf ($Miner.Type -eq "NVIDIA" -and (Test-Path -LiteralPath ".\Utils\Prerun\NVIDIAPrerun.bat" -PathType Leaf)) { + Start-Process ".\Utils\Prerun\NVIDIAPrerun.bat" -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + } + $MinerAlgorithmPrerunName = ".\Utils\Prerun\$($Miner.Name)$(If ($Miner.Algorithms.Count -eq 1) { "_$($Miner.Algorithms[0])" }).bat" + $AlgorithmPrerunName = ".\Utils\Prerun\$($Miner.Algorithms -join '-').bat" + $DefaultPrerunName = ".\Utils\Prerun\default.bat" + If (Test-Path -LiteralPath $MinerAlgorithmPrerunName -PathType Leaf) { + Write-Message -Level Info "Launching Prerun: $MinerAlgorithmPrerunName" + Start-Process $MinerAlgorithmPrerunName -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + Start-Sleep -Seconds 2 + } + ElseIf (Test-Path -LiteralPath $AlgorithmPrerunName -PathType Leaf) { + Write-Message -Level Info "Launching Prerun: $AlgorithmPrerunName" + Start-Process $AlgorithmPrerunName -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + Start-Sleep -Seconds 2 + } + ElseIf (Test-Path -LiteralPath $DefaultPrerunName -PathType Leaf) { + Write-Message -Level Info "Launching Prerun: $DefaultPrerunName" + Start-Process $DefaultPrerunName -WorkingDirectory ".\Utils\Prerun" -WindowStyle hidden + Start-Sleep -Seconds 2 + } + Remove-Variable AlgorithmPrerunName, DefaultPrerunName, MinerAlgorithmPrerunName -ErrorAction Ignore + } + + # Add extra time when CPU mining and miner requires DAG creation + If ($Miner.Workers.Pool.DAGSizeGiB -and $Variables.MinersBestPerDevice_Combo.Type -contains "CPU") { $Miner.WarmupTimes[0] += 15 <# seconds #>} + # Add extra time when notebook runs on battery + If ($Miner.Workers.Pool.DAGSizeGiB -and (Get-CimInstance Win32_Battery).BatteryStatus -eq 1) { $Miner.WarmupTimes[0] += 90 <# seconds #>} + + If ($Config.DryRun -and -not ($Miner.Benchmark -or $Miner.MeasurePowerConsumption)) { + $Miner.SetStatus([MinerStatus]::DryRun) + } + Else { + $Miner.SetStatus([MinerStatus]::Running) + } + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + + # Add watchdog timer + If ($Config.Watchdog) { + ForEach ($Worker in $Miner.Workers) { + $Variables.WatchdogTimers += [PSCustomObject]@{ + Algorithm = $Worker.Pool.Algorithm + AlgorithmVariant = $Worker.Pool.AlgorithmVariant + DeviceNames = $Miner.DeviceNames + Kicked = ([DateTime]::Now).ToUniversalTime() + MinerBaseName = $Miner.BaseName + MinerName = $Miner.Name + MinerVersion = $Miner.Version + PoolName = $Worker.Pool.Name + PoolRegion = $Worker.Pool.Region + PoolVariant = $Worker.Pool.Variant + CommandLine = $Miner.CommandLine + } + } + Remove-Variable Worker -ErrorAction Ignore + } + } + Else { + $DataCollectInterval = If ($Miner.Benchmark -or $Miner.MeasurePowerConsumption) { 1 } Else { 5 } + If ($Miner.DataCollectInterval -ne $DataCollectInterval) { + $Miner.DataCollectInterval = $DataCollectInterval + $Miner.RestartDataReader() + } + } + + $Message = "$(If ($Miner.Benchmark) { "Benchmark" })$(If ($Miner.Benchmark -and $Miner.MeasurePowerConsumption) { " and " })$(If($Miner.MeasurePowerConsumption) { "Power consumption measurement" })" + If ($Message) { + $Message = $Message.Substring(0, 1).toUpper() + $Message.Substring(1).toLower() + Write-Message -Level Verbose "$Message for miner '$($Miner.Info)' in progress [Attempt $($Miner.Activated) of $($Variables.WatchdogCount + 1); min. $($Miner.MinDataSample) samples]..." + } + } + Remove-Variable Miner, Message -ErrorAction Ignore + + ($Variables.Miners.Where({ $_.Available }) | Group-Object { ($_.Name -Split '-|\(')[2] }).ForEach( + { + $MinersDeviceGroupNeedingBenchmark = $_.Group.Where({ $_.Benchmark }) + $MinersDeviceGroupNeedingPowerConsumptionMeasurement = $_.Group.Where({ $_.MeasurePowerConsumption }) + + # Display benchmarking progress + If ($MinersDeviceGroupNeedingBenchmark) { + $Count = ($MinersDeviceGroupNeedingBenchmark | Select-Object -Property { $_.Algorithms }, { $_.Name } -Unique).Count + Write-Message -Level Info "Benchmarking for '$($_.Name)' in progress. $Count miner$(If ($Count -gt 1) { 's' }) left to complete benchmark." + } + # Display power consumption measurement progress + If ($MinersDeviceGroupNeedingPowerConsumptionMeasurement) { + $Count = ($MinersDeviceGroupNeedingPowerConsumptionMeasurement | Select-Object -Property { $_.Algorithms }, { $_.Name } -Unique).Count + Write-Message -Level Info "Power consumption measurement for '$($_.Name)' in progress. $Count miner$(If ($Count -gt 1) { 's' }) left to complete measuring." + } + } + ) + Remove-Variable Count, MinersDeviceGroupNeedingBenchmark, MinersDeviceGroupNeedingPowerConsumptionMeasurement -ErrorAction Ignore + + Get-Job -State "Completed" | Receive-Job | Out-Null + Get-Job -State "Completed" | Remove-Job -Force -ErrorAction Ignore | Out-Null + Get-Job -State "Failed" | Receive-Job | Out-Null + Get-Job -State "Failed" | Remove-Job -Force -ErrorAction Ignore | Out-Null + Get-Job -State "Stopped" | Receive-Job | Out-Null + Get-Job -State "Stopped" | Remove-Job -Force -ErrorAction Ignore | Out-Null + + If ($Variables.CycleStarts.Count -eq 1) { + # Ensure a full cycle on first loop + $Variables.EndCycleTime = ([DateTime]::Now).ToUniversalTime().AddSeconds($Config.Interval) + } + + $Variables.RunningMiners = @($Variables.MinersBestPerDevice_Combo | Sort-Object -Descending -Property Benchmark, MeasurePowerConsumption) + $Variables.BenchmarkingOrMeasuringMiners = [Miner[]]@() + $Variables.FailedMiners = [Miner[]]@() + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + $Variables.EndCycleMessage = "" + $Variables.RefreshTimestamp = ([DateTime]::Now).ToUniversalTime() + $Variables.RefreshNeeded = $true + + Write-Message -Level Info "Collecting miner data while waiting for next cycle..." + + Do { + Start-Sleep -Milliseconds 100 + ForEach ($Miner in $Variables.RunningMiners.Where({ $_.Status -ne [MinerStatus]::DryRun })) { + Try { + If ($DebugMinerGetData) { + [Void]$Miner.GetMinerData() + } + If ($Miner.GetStatus() -ne [MinerStatus]::Running) { + # Miner crashed + $Miner.StatusInfo = "Error: '$($Miner.Info)' exited unexpectedly" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.FailedMiners += $Miner + } + ElseIf ($Miner.DataReaderJob.State -ne [MinerStatus]::Running) { + # Miner data reader process failed + $Miner.StatusInfo = "Error: '$($Miner.Info)' miner data reader exited unexpectedly" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.FailedMiners += $Miner + } + Else { + If ($Samples = @($Miner.DataReaderJob | Receive-Job | Select-Object)) { + $Sample = $Samples | Select-Object -Last 1 + $Miner.Hashrates_Live = $Sample.Hashrate.PSObject.Properties.Value + $Miner.DataSampleTimestamp = $Sample.Date + If ($Miner.ReadPowerConsumption) { $Miner.PowerConsumption_Live = $Sample.PowerConsumption } + If ($Sample.Hashrate.PSObject.Properties.Value -notcontains 0) { + # Need hashrates for all algorithms to count as a valid sample + If ($Miner.ValidDataSampleTimestamp -eq [DateTime]0) { + $Miner.ValidDataSampleTimestamp = $Sample.Date.AddSeconds($Miner.WarmupTimes[1]) + } + If ([Math]::Floor(($Sample.Date - $Miner.ValidDataSampleTimestamp).TotalSeconds) -ge 0) { + $Miner.Data += $Samples + Write-Message -Level Verbose "$($Miner.Name) data sample retrieved [$(($Sample.Hashrate.PSObject.Properties.Name.ForEach({ "$($_): $(($Sample.Hashrate.$_ | ConvertTo-Hash) -replace ' ')$(If ($Config.BadShareRatioThreshold) { " / Shares Total: $($Sample.Shares.$_[3]), Rejected: $($Sample.Shares.$_[1]), Ignored: $($Sample.Shares.$_[2])" })" })) -join ' & ')$(If ($Sample.PowerConsumption) { " / Power consumption: $($Sample.PowerConsumption.ToString("N2"))W" })] ($($Miner.Data.Count) Sample$(If ($Miner.Data.Count -ne 1) { "s" }))" + If ($Miner.Benchmark -or $Miner.MeasurePowerConsumption) { + $Miner.SubStatus = "Benchmarking" + $Miner.StatusInfo = "$($(If ($Miner.Benchmark) { "Benchmarking" }), $(If ($Miner.Benchmark -and $Miner.MeasurePowerConsumption) { " and " }), $(If ($Miner.MeasurePowerConsumption) { "Measuring power consumption" }) -join '') '$($Miner.Info)'" + } + Else { + $Miner.SubStatus = "Running" + $Miner.StatusInfo = "Mining '$($Miner.Info)'" + } + } + Else { + Write-Message -Level Verbose "$($Miner.Name) data sample discarded [$(($Sample.Hashrate.PSObject.Properties.Name.ForEach({ "$($_): $(($Sample.Hashrate.$_ | ConvertTo-Hash) -replace ' ')$(If ($Config.BadShareRatioThreshold) { " / Shares Total: $($Sample.Shares.$_[3]), Rejected: $($Sample.Shares.$_[1]), Ignored: $($Sample.Shares.$_[2])" })" })) -join ' & ')$(If ($Sample.PowerConsumption) { " / Power consumption: $($Sample.PowerConsumption.ToString("N2"))W" })] (Miner is warming up [$((([DateTime]::Now).ToUniversalTime() - $Miner.ValidDataSampleTimestamp).TotalSeconds.ToString("0")) sec])" + $Miner.SubStatus = "WarmingUp" + $Miner.StatusInfo = "Warming up '$($Miner.Info)'" + } + } + } + ElseIf ($Variables.NewMiningStatus -eq "Running") { + # Stop miner, it has not provided hash rate on time + If ($Miner.ValidDataSampleTimestamp -eq [DateTime]0 -and ([DateTime]::Now).ToUniversalTime() -gt $Miner.BeginTime.AddSeconds($Miner.WarmupTimes[0])) { + $Miner.StatusInfo = "Error: '$($Miner.Info)' has not provided first valid data sample in $($Miner.WarmupTimes[0]) seconds" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.FailedMiners += $Miner + } + # Miner stuck - no sample received in last few data collect intervals + ElseIf ($Miner.ValidDataSampleTimestamp -gt [DateTime]0 -and ([DateTime]::Now).ToUniversalTime() -gt $Miner.DataSampleTimestamp.AddSeconds((($Miner.DataCollectInterval * 5), 10 | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) * $Miner.Algorithms.Count)) { + $Miner.StatusInfo = "Error: '$($Miner.Info)' has not updated data for more than $((($Miner.DataCollectInterval * 5), 10 | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum) * $Miner.Algorithms.Count) seconds" + $Miner.SetStatus([MinerStatus]::Failed) + $Variables.FailedMiners += $Miner + } + } + Try { + # Set miner priority, some miners reset priority on their own + $Miner.Process.PriorityClass = $Global:PriorityNames.($Miner.ProcessPriority) + + # Set window title + [Void][Win32]::SetWindowText($Miner.Process.MainWindowHandle, $Miner.StatusInfo) + } Catch { } + } + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) + } + Catch { + "$(Get-Date -Format "yyyy-MM-dd_HH:mm:ss")" >> "Logs\Error_Dev.txt" + $_.Exception | Format-List -Force >> "Logs\Error_Dev.txt" + $_.InvocationInfo | Format-List -Force >> "Logs\Error_Dev.txt" + } + } + Remove-Variable Miner, Sample, Samples -ErrorAction Ignore + + $Variables.RunningMiners = @($Variables.RunningMiners.Where({ $_ -notin $Variables.FailedMiners })) + $Variables.BenchmarkingOrMeasuringMiners = @($Variables.RunningMiners.Where({ $_.Activated -gt 0 -and ($_.Benchmark -or $_.MeasurePowerConsumption) })) + + If ($Variables.FailedMiners -and -not $Variables.BenchmarkingOrMeasuringMiners) { + # A miner crashed and we're not benchmarking, exit loop immediately + $Variables.EndCycleMessage = " prematurely (Miner failed)" + } + ElseIf ($Variables.BenchmarkingOrMeasuringMiners -and -not ($Variables.BenchmarkingOrMeasuringMiners.Where({ $_.Data.Count -lt $_.MinDataSample }))) { + # Enough samples collected for this loop, exit loop immediately + $Variables.EndCycleMessage = " (All running$(If ($Variables.BenchmarkingOrMeasuringMiners.Where({ $_.Benchmark })) { " benchmarking" })$(If ($Variables.BenchmarkingOrMeasuringMiners.Where({ $_.Benchmark -and $_.MeasurePowerConsumption })) { " and" })$(If ($Variables.BenchmarkingOrMeasuringMiners.Where({ $_.MeasurePowerConsumption })) { " power consumption measuring" }) miners have collected enough samples for this cycle)" + } + + # Core suspended with P in MainLoop + While ($Variables.SuspendCycle) { Start-Sleep -Seconds 1 } + + # Exit loop when + # - a miner crashed (and no other miners are benchmarking or measuring power consumption) + # - all benchmarking miners have collected enough samples + # - WarmupTimes[0] is reached (no readout from miner) + # - Interval time is over + } While (-not $Variables.EndCycleMessage -and $Variables.NewMiningStatus -eq "Running" -and $Variables.IdleRunspace.MiningStatus -ne "Idle" -and (([DateTime]::Now).ToUniversalTime() -le $Variables.EndCycleTime -or $Variables.BenchmarkingOrMeasuringMiners)) + + If ($Variables.IdleRunspace.MiningStatus -eq "Idle") { $Variables.EndCycleMessage = " (System activity detected)" } + + # Expire brains loop to collect data + If ($Variables.EndCycleMessage) { + $Variables.EndCycleTime = ([DateTime]::Now).ToUniversalTime() + Start-Sleep -Seconds 1 + } + } + Catch { + Write-Message -Level Error "Error in file $(($_.InvocationInfo.ScriptName -split "\\" | Select-Object -Last 2) -join "\") line $($_.InvocationInfo.ScriptLineNumber) detected. Restarting core..." + "$(Get-Date -Format "yyyy-MM-dd_HH:mm:ss")" >> "Logs\Error_Dev.txt" + $_.Exception | Format-List -Force >> "Logs\Error_Dev.txt" + $_.InvocationInfo | Format-List -Force >> "Logs\Error_Dev.txt" + $Variables.EndCycleTime = $Variables.StartCycleTime.AddSeconds($Config.Interval) # Reset timers + Continue + } + + $Error.Clear() + [System.GC]::Collect() + + Write-Message -Level Info "Ending cycle$($Variables.EndCycleMessage)." + + If ($Variables.NewMiningStatus -eq "Running") { + # Read config only if config files have changed + If ($Variables.ConfigFileTimestamp -ne (Get-Item -Path $Variables.ConfigFile).LastWriteTime -or $Variables.PoolsConfigFileTimestamp -ne (Get-Item -Path $Variables.PoolsConfigFile).LastWriteTime) { + [Void](Read-Config -ConfigFile $Variables.ConfigFile) + Write-Message -Level Verbose "Activated changed configuration." + } + } + + $Variables.RestartCycle = $true + +} While ($Variables.NewMiningStatus -eq "Running") + +# Stop all running miners +ForEach ($Miner in $Variables.Miners.Where({ $_.Status -ne [MinerStatus]::Idle })) { + $Miner.SetStatus([MinerStatus]::Idle) + $Variables.Devices.Where({ $_.Name -in $Miner.DeviceNames }).ForEach({ $_.Status = $Miner.Status; $_.StatusInfo = $Miner.StatusInfo; $_.SubStatus = $Miner.SubStatus }) +} +$Variables.RunningMiners = [Miner[]]@() +$Variables.BenchmarkingOrMeasuringMiners = [Miner[]]@() +$Variables.FailedMiners = [Miner[]]@() +Remove-Variable Miner -ErrorAction Ignore + +$Variables.RestartCycle = $true \ No newline at end of file diff --git a/Includes/Downloader.ps1 b/Includes/Downloader.ps1 index d6b3947847..3f3d214df9 100644 --- a/Includes/Downloader.ps1 +++ b/Includes/Downloader.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\Downloader.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/Include.psm1 b/Includes/Include.psm1 index bcc03f14c8..54b42e2179 100644 --- a/Includes/Include.psm1 +++ b/Includes/Include.psm1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\include.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -289,7 +289,6 @@ Class Miner { # Start Miner data reader, devices property required for GetPowerConsumption/ConfiguredPowerConsumption $this.DataReaderJob = Start-ThreadJob -Name "$($this.Name)_DataReader" -StreamingHost $null -InitializationScript ([ScriptBlock]::Create("Set-Location('$(Get-Location)')")) -ScriptBlock $ScriptBlock -ArgumentList ($this.API), ($this | Select-Object -Property Algorithms, DataCollectInterval, Devices, Name, Path, Port, ReadPowerConsumption | ConvertTo-Json -Depth 5 -WarningAction Ignore) - # $this.DataReaderJob = Start-Job -Name "$($this.Name)_DataReader" -InitializationScript ([ScriptBlock]::Create("Set-Location('$(Get-Location)')")) -ScriptBlock $ScriptBlock -ArgumentList ($this.API), ($this | Select-Object -Property Algorithms, DataCollectInterval, Devices, Name, Path, Port, ReadPowerConsumption | ConvertTo-Json -Depth 5 -WarningAction Ignore) Remove-Variable ScriptBlock -ErrorAction Ignore } @@ -536,7 +535,7 @@ Class Miner { $Hashrate_Samples = @($this.Data.Where({ $_.Hashrate.$Algorithm })) # Do not use 0 valued samples $Hashrate_Average = ($Hashrate_Samples.Hashrate.$Algorithm | Measure-Object -Average | Select-Object -ExpandProperty Average) - $Hashrate_Variance = ($Hashrate_Samples.Hashrate.$Algorithm | Measure-Object -Average -Minimum -Maximum).ForEach({ If ($_.Average) { ($_.Maximum - $_.Minimum) / $_.Average } }) + $Hashrate_Variance = $Hashrate_Samples.Hashrate.$Algorithm | Measure-Object -Average -Minimum -Maximum | ForEach-Object { If ($_.Average) { ($_.Maximum - $_.Minimum) / $_.Average } } If ($Safe) { If ($Hashrate_Samples.Count -lt 10 -or $Hashrate_Variance -gt 0.1) { @@ -559,7 +558,7 @@ Class Miner { $PowerConsumption_Samples = @($this.Data.Where({ $_.PowerConsumption})) # Do not use 0 valued samples $PowerConsumption_Average = ($PowerConsumption_Samples.PowerConsumption | Measure-Object -Average | Select-Object -ExpandProperty Average) - ($PowerConsumption_Variance = $PowerConsumption_Samples.PowerConsumption | Measure-Object -Average -Minimum -Maximum).ForEach({ If ($_.Average) { ($_.Maximum - $_.Minimum) / $_.Average } }) + $PowerConsumption_Variance = $PowerConsumption_Samples.PowerUsage | Measure-Object -Average -Minimum -Maximum | ForEach-Object { If ($_.Average) { ($_.Maximum - $_.Minimum) / $_.Average } } If ($Safe) { If ($PowerConsumption_Samples.Count -lt 10 -or $PowerConsumption_Variance -gt 0.1) { @@ -1922,7 +1921,7 @@ Function Set-Stat { If ($Value -gt 0 -and $Stat.ToleranceExceeded -gt 0 -and $Stat.ToleranceExceeded -lt $ToleranceExceeded -and $Stat.Week -gt 0) { If ($Name -match '.+_Hashrate$') { - Write-Message -Level Warn "Error saving hashrate for '$($Name -replace '_Hashrate$')'. $(($Value | ConvertTo-Hash) -replace '\s+', ' ') is outside fault tolerance ($(($ToleranceMin | ConvertTo-Hash) -replace '\s+', ' ') to $(($ToleranceMax | ConvertTo-Hash) -replace '\s+', ' ')) [Iteration $($Stats.($Stat.Name).ToleranceExceeded) of $ToleranceExceeded until enforced update]." + Write-Message -Level Warn "Error saving hashrate for '$($Name -replace '_Hashrate$')'. $(($Value | ConvertTo-Hash)) is outside fault tolerance ($(($ToleranceMin | ConvertTo-Hash)) to $(($ToleranceMax | ConvertTo-Hash))) [Iteration $($Stats.($Stat.Name).ToleranceExceeded) of $ToleranceExceeded until enforced update]." } ElseIf ($Name -match '.+_PowerConsumption') { Write-Message -Level Warn "Error saving power consumption for '$($Name -replace '_PowerConsumption$')'. $($Value.ToString("N2"))W is outside fault tolerance ($($ToleranceMin.ToString("N2"))W to $($ToleranceMax.ToString("N2"))W) [Iteration $($Stats.($Stat.Name).ToleranceExceeded) of $ToleranceExceeded until enforced update]." @@ -1933,7 +1932,7 @@ Function Set-Stat { If (-not $Stat.Disabled -and ($Value -eq 0 -or $Stat.ToleranceExceeded -ge $ToleranceExceeded -or $Stat.Week_Fluctuation -ge 1)) { If ($Value -gt 0 -and $Stat.ToleranceExceeded -ge $ToleranceExceeded) { If ($Name -match '.+_Hashrate$') { - Write-Message -Level Warn "Hashrate '$($Name -replace '_Hashrate$')' was forcefully updated. $(($Value | ConvertTo-Hash) -replace '\s+', ' ') was outside fault tolerance ($(($ToleranceMin | ConvertTo-Hash) -replace '\s+', ' ') to $(($ToleranceMax | ConvertTo-Hash) -replace '\s+', ' '))$(If ($Stat.Week_Fluctuation -lt 1) { " for $($Stats.($Stat.Name).ToleranceExceeded) times in a row." })" + Write-Message -Level Warn "Hashrate '$($Name -replace '_Hashrate$')' was forcefully updated. $(($Value | ConvertTo-Hash)) was outside fault tolerance ($(($ToleranceMin | ConvertTo-Hash)) to $(($ToleranceMax | ConvertTo-Hash)))$(If ($Stat.Week_Fluctuation -lt 1) { " for $($Stats.($Stat.Name).ToleranceExceeded) times in a row." })" } ElseIf ($Name -match '.+_PowerConsumption$') { Write-Message -Level Warn "Power consumption for '$($Name -replace '_PowerConsumption$')' was forcefully updated. $($Value.ToString("N2"))W was outside fault tolerance ($($ToleranceMin.ToString("N2"))W to $($ToleranceMax.ToString("N2"))W)$(If ($Stat.Week_Fluctuation -lt 1) { " for $($Stats.($Stat.Name).ToleranceExceeded) times in a row." })" @@ -2393,7 +2392,7 @@ Function Get-Device { "Intel" { "INTEL" } "NVIDIA" { "NVIDIA" } "AMD" { "AMD" } - Default { $Device_CIM.Manufacturer -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' -replace '\s+', ' ' } + Default { $Device_CIM.Manufacturer -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' } } ) Memory = $null @@ -2455,7 +2454,7 @@ Function Get-Device { "Intel" { "INTEL" } "NVIDIA" { "NVIDIA" } "AMD" { "AMD" } - Default { $Device_CIM.AdapterCompatibility -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' -replace '\s+', ' ' } + Default { $Device_CIM.AdapterCompatibility -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' } } ) Memory = [Math]::Max(([UInt64]$Device_CIM.AdapterRAM), ([uInt64]$Device_Reg.'HardwareInformation.qwMemorySize')) @@ -2516,7 +2515,7 @@ Function Get-Device { Switch -Regex ([String]$Device_OpenCL.Type) { "CPU" { "CPU" } "GPU" { "GPU" } - Default { [String]$Device_OpenCL.Type -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' -replace '\s+', ' ' } + Default { [String]$Device_OpenCL.Type -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' } } ) Bus = $( @@ -2530,7 +2529,7 @@ Function Get-Device { "Intel" { "INTEL" } "NVIDIA" { "NVIDIA" } "AMD" { "AMD" } - Default { [String]$Device_OpenCL.Vendor -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' -replace '\s+', ' ' } + Default { [String]$Device_OpenCL.Vendor -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9]' } } ) Memory = [UInt64]$Device_OpenCL.GlobalMemSize @@ -2553,7 +2552,7 @@ Function Get-Device { Else { $Device.Name = "$($Device.Type)#$('{0:D2}' -f $UnsupportedGPUVendorID ++)" } - $Device.Model = ((($Device.Model -split ' ' -replace 'Processor', 'CPU' -replace 'Graphics', 'GPU') -notmatch $Device.Type -notmatch $Device.Vendor -notmatch "$([UInt64]($Device.Memory/1GB))GB") + "$([UInt64]($Device.Memory/1GB))GB") -join ' ' -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9 ]' -replace '\s+', ' ' + $Device.Model = ((($Device.Model -split ' ' -replace 'Processor', 'CPU' -replace 'Graphics', 'GPU') -notmatch $Device.Type -notmatch $Device.Vendor -notmatch "$([UInt64]($Device.Memory/1GB))GB") + "$([UInt64]($Device.Memory/1GB))GB") -join ' ' -replace '\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel' -replace '[^A-Z0-9 ]' If (-not $Type_Vendor_Id.($Device.Type)) { $Type_Vendor_Id.($Device.Type) = @{ } @@ -2667,7 +2666,7 @@ Function Get-Device { Filter ConvertTo-Hash { - $Units = " kMGTPEZY" # k(ilo) in small letters, see https://en.wikipedia.org/wiki/Metric_prefix + $Units = "kMGTPEZY" # k(ilo) in small letters, see https://en.wikipedia.org/wiki/Metric_prefix If ( $_ -eq $null -or [Double]::IsNaN($_)) { Return 'n/a' } $Base1000 = [Math]::Truncate([Math]::Log([Math]::Abs([Double]$_), [Math]::Pow(1000, 1))) @@ -2755,7 +2754,6 @@ Function Invoke-CreateProcess { ) $Job = Start-ThreadJob -Name $JobName -StreamingHost $null -ArgumentList $BinaryPath, $ArgumentList, $WorkingDirectory, $EnvBlock, $CreationFlags, $WindowStyle, $StartF, $PID { - # $Job = Start-Job -Name $JobName -ArgumentList $BinaryPath, $ArgumentList, $WorkingDirectory, $EnvBlock, $CreationFlags, $WindowStyle, $StartF, $PID { Param($BinaryPath, $ArgumentList, $WorkingDirectory, $EnvBlock, $CreationFlags, $WindowStyle, $StartF, $ControllerProcessID) $ControllerProcess = Get-Process -Id $ControllerProcessID diff --git a/Includes/LegacyGUI.ps1 b/Includes/LegacyGUI.ps1 index 79e7298666..5bbac53499 100644 --- a/Includes/LegacyGUI.ps1 +++ b/Includes/LegacyGUI.ps1 @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\LegacyGUI.psm1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -160,7 +160,7 @@ Function Update-TabControl { @{ Name = "Power Consumption"; Expression = { If (-not $_.MeasurePowerConsumption) { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "$($_.PowerConsumption.ToString("N2")) W"} } Else { If ($_.Status -eq "Running") { "Measuring..." } Else { "Unmeasured" } } } } @{ Name = "Algorithm(s)"; Expression = { $_.Algorithms -join ' & ' } }, @{ Name = "Pool(s)"; Expression = { $_.WorkersRunning.Pool.Name -join ' & ' } } - @{ Name = "Hashrate(s)"; Expression = { If (-not $_.Benchmark) { ($_.Workers.ForEach({ "$($_.Hashrate | ConvertTo-Hash)/s" -replace '\s+', ' ' })) -join ' & ' } Else { If ($_.Status -eq "Running") { "Benchmarking..." } Else { "Benchmark pending" } } } } + @{ Name = "Hashrate(s)"; Expression = { If (-not $_.Benchmark) { $_.Workers.ForEach({ $_.Hashrate | ConvertTo-Hash }) -join ' & ' } Else { If ($_.Status -eq "Running") { "Benchmarking..." } Else { "Benchmark pending" } } } } @{ Name = "Running Time`r(hhh:mm:ss)"; Expression = { "{0}:{1:mm}:{1:ss}" -f [Math]::floor((([DateTime]::Now).ToUniversalTime() - $_.BeginTime).TotalDays * 24), (([DateTime]::Now).ToUniversalTime() - $_.BeginTime) } } @{ Name = "Total active`r(hhh:mm:ss)"; Expression = { "{0}:{1:mm}:{1:ss}" -f [Math]::floor($_.TotalMiningDuration.TotalDays * 24), $_.TotalMiningDuration } } If ($RadioButtonPoolsUnavailable.checked) { @{ Name = "Reason"; Expression = { $_.Reasons -join ', ' } } } @@ -371,7 +371,7 @@ Function Update-TabControl { @{ Name = "Power Consumption"; Expression = { If (-not $_.MeasurePowerConsumption) { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "$($_.PowerConsumption.ToString("N2")) W"} } Else { If ($_.Status -eq "Running") { "Measuring..." } Else { "Unmeasured" } } } } @{ Name = "Algorithm(s)"; Expression = { $_.Algorithms -join ' & ' } }, @{ Name = "Pool(s)"; Expression = { $_.Workers.Pool.Name -join ' & ' } }, - @{ Name = "Hashrate(s)"; Expression = { If (-not $_.Benchmark) { ($_.Workers.ForEach({ "$($_.Hashrate | ConvertTo-Hash)/s" -replace '\s+', ' ' })) -join ' & ' } Else { If ($_.Status -eq "Running") { "Benchmarking..." } Else { "Benchmark pending" } } } } + @{ Name = "Hashrate(s)"; Expression = { If (-not $_.Benchmark) { $_.Workers.ForEach({ $_.Hashrate | ConvertTo-Hash }) -join ' & ' } Else { If ($_.Status -eq "Running") { "Benchmarking..." } Else { "Benchmark pending" } } } } If ($RadioButtonMinersUnavailable.checked -or $RadioButtonMiners.checked) { @{ Name = "Reason(s)"; Expression = { $_.Reasons -join ', '} } } ) | Sort-Object @{ Expression = { $_.Best }; Descending = $true }, "Device(s)", Miner | Out-DataTable If ($MinersDGV.Columns) { @@ -458,59 +458,59 @@ Function Update-TabControl { } Break } - "Rig Monitor" { - $WorkersDGV.Visible = $Config.ShowWorkerStatus - $EditMonitoringLink.Visible = $Variables.APIRunspace.APIPort - - If ($Config.ShowWorkerStatus) { - - Read-MonitoringData | Out-Null - - If ($Variables.Workers) { - $WorkersLabel.Text = "Worker Status - Updated $($Variables.WorkersLastUpdated.ToString())" - - $nl = "`n" # Must use variable, cannot join with '`n' directly - - $WorkersDGV.BeginInit() - $WorkersDGV.ClearSelection() - $WorkersDGV.DataSource = $Variables.Workers | Select-Object @( - @{ Name = "Worker"; Expression = { $_.worker } }, - @{ Name = "Status"; Expression = { $_.status } }, - @{ Name = "Last seen"; Expression = { (Get-TimeSince $_.date) } }, - @{ Name = "Version"; Expression = { $_.version } }, - @{ Name = "Currency"; Expression = { $_.data.Currency | Select-Object -Unique } }, - @{ Name = "Estimated Earning/day"; Expression = { If ($null -ne $_.Data) { "{0:n$($Config.DecimalsMax)}" -f (($_.Data.Earning.Where({ -not [Double]::IsNaN($_) }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum) * $Variables.Rates.BTC.($_.data.Currency | Select-Object -Unique)) } } }, - @{ Name = "Estimated Profit/day"; Expression = { If ($null -ne $_.Data) { " {0:n$($Config.DecimalsMax)}" -f (($_.Data.Profit.Where({ -not [Double]::IsNaN($_) }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum) * $Variables.Rates.BTC.($_.data.Currency | Select-Object -Unique)) } } }, - @{ Name = "Miner(s)"; Expression = { $_.data.Name -join $nl } }, - @{ Name = "Pool(s)"; Expression = { $_.data.ForEach({ $_.Pool -split "," -join ' & ' }) -join $nl } }, - @{ Name = "Algorithm(s)"; Expression = { $_.data.ForEach({ $_.Algorithm -split "," -join ' & ' }) -join $nl } }, - @{ Name = "Live Hashrate(s)"; Expression = { $_.data.ForEach({ ($_.CurrentSpeed.ForEach({ If ([Double]::IsNaN($_)) { "n/a" } Else { "$($_ | ConvertTo-Hash)/s" -replace '\s+' } })) -join ' & ' }) -join $nl } }, - @{ Name = "Benchmark Hashrate(s)"; Expression = { $_.data.ForEach({ ($_.EstimatedSpeed.ForEach({ If ([Double]::IsNaN($_)) { "n/a" } Else { "$($_ | ConvertTo-Hash)/s" -replace '\s+' } })) -join ' & ' }) -join $nl } } - ) | Sort-Object -Property "Worker" | Out-DataTable - If ($WorkersDGV.Columns) { - $WorkersDGV.Columns[0].FillWeight = 70 - $WorkersDGV.Columns[1].FillWeight = 60 - $WorkersDGV.Columns[2].FillWeight = 80 - $WorkersDGV.Columns[3].FillWeight = 70 - $WorkersDGV.Columns[4].FillWeight = 40 - $WorkersDGV.Columns[5].FillWeight = 65; $WorkersDGV.Columns[5].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[5].HeaderCell.Style.Alignment = "MiddleRight" - $WorkersDGV.Columns[6].FillWeight = 65; $WorkersDGV.Columns[6].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[6].HeaderCell.Style.Alignment = "MiddleRight" - $WorkersDGV.Columns[7].FillWeight = 150 - $WorkersDGV.Columns[8].FillWeight = 95 - $WorkersDGV.Columns[9].FillWeight = 75 - $WorkersDGV.Columns[10].FillWeight = 65; $WorkersDGV.Columns[10].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[10].HeaderCell.Style.Alignment = "MiddleRight" - $WorkersDGV.Columns[11].FillWeight = 65; $WorkersDGV.Columns[11].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[11].HeaderCell.Style.Alignment = "MiddleRight" - } - Set-WorkerColor - $WorkersDGV.EndInit() - } - Else { $WorkersLabel.Text = "Worker Status - no workers" } - } - Else { - $WorkersLabel.Text = "Worker status reporting is disabled$(If (-not $Variables.APIRunspace) { " (Configuration item 'ShowWorkerStatus' -eq `$false)" })." - } - Break - } + # "Rig Monitor" { + # $WorkersDGV.Visible = $Config.ShowWorkerStatus + # $EditMonitoringLink.Visible = $Variables.APIRunspace.APIPort + + # If ($Config.ShowWorkerStatus) { + + # Read-MonitoringData | Out-Null + + # If ($Variables.Workers) { + # $WorkersLabel.Text = "Worker Status - Updated $($Variables.WorkersLastUpdated.ToString())" + + # $nl = "`n" # Must use variable, cannot join with '`n' directly + + # $WorkersDGV.BeginInit() + # $WorkersDGV.ClearSelection() + # $WorkersDGV.DataSource = $Variables.Workers | Select-Object @( + # @{ Name = "Worker"; Expression = { $_.worker } }, + # @{ Name = "Status"; Expression = { $_.status } }, + # @{ Name = "Last seen"; Expression = { (Get-TimeSince $_.date) } }, + # @{ Name = "Version"; Expression = { $_.version } }, + # @{ Name = "Currency"; Expression = { $_.data.Currency | Select-Object -Unique } }, + # @{ Name = "Estimated Earning/day"; Expression = { If ($null -ne $_.Data) { "{0:n$($Config.DecimalsMax)}" -f (($_.Data.Earning.Where({ -not [Double]::IsNaN($_) }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum) * $Variables.Rates.BTC.($_.data.Currency | Select-Object -Unique)) } } }, + # @{ Name = "Estimated Profit/day"; Expression = { If ($null -ne $_.Data) { " {0:n$($Config.DecimalsMax)}" -f (($_.Data.Profit.Where({ -not [Double]::IsNaN($_) }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum) * $Variables.Rates.BTC.($_.data.Currency | Select-Object -Unique)) } } }, + # @{ Name = "Miner(s)"; Expression = { $_.data.Name -join $nl } }, + # @{ Name = "Pool(s)"; Expression = { $_.data.ForEach({ $_.Pool -split "," -join ' & ' }) -join $nl } }, + # @{ Name = "Algorithm(s)"; Expression = { $_.data.ForEach({ $_.Algorithm -split "," -join ' & ' }) -join $nl } }, + # @{ Name = "Live Hashrate(s)"; Expression = { $_.data.ForEach({ $_.CurrentSpeed.ForEach({ If ([Double]::IsNaN($_)) { "n/a" } Else { $_ | ConvertTo-Hash } }) -join ' & ' }) -join $nl } }, + # @{ Name = "Benchmark Hashrate(s)"; Expression = { $_.data.ForEach({ $_.EstimatedSpeed.ForEach({ If ([Double]::IsNaN($_)) { "n/a" } Else { $_ | ConvertTo-Hash } }) -join ' & ' }) -join $nl } } + # ) | Sort-Object -Property "Worker" | Out-DataTable + # If ($WorkersDGV.Columns) { + # $WorkersDGV.Columns[0].FillWeight = 70 + # $WorkersDGV.Columns[1].FillWeight = 60 + # $WorkersDGV.Columns[2].FillWeight = 80 + # $WorkersDGV.Columns[3].FillWeight = 70 + # $WorkersDGV.Columns[4].FillWeight = 40 + # $WorkersDGV.Columns[5].FillWeight = 65; $WorkersDGV.Columns[5].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[5].HeaderCell.Style.Alignment = "MiddleRight" + # $WorkersDGV.Columns[6].FillWeight = 65; $WorkersDGV.Columns[6].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[6].HeaderCell.Style.Alignment = "MiddleRight" + # $WorkersDGV.Columns[7].FillWeight = 150 + # $WorkersDGV.Columns[8].FillWeight = 95 + # $WorkersDGV.Columns[9].FillWeight = 75 + # $WorkersDGV.Columns[10].FillWeight = 65; $WorkersDGV.Columns[10].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[10].HeaderCell.Style.Alignment = "MiddleRight" + # $WorkersDGV.Columns[11].FillWeight = 65; $WorkersDGV.Columns[11].DefaultCellStyle.Alignment = "MiddleRight"; $WorkersDGV.Columns[11].HeaderCell.Style.Alignment = "MiddleRight" + # } + # Set-WorkerColor + # $WorkersDGV.EndInit() + # } + # Else { $WorkersLabel.Text = "Worker Status - no workers" } + # } + # Else { + # $WorkersLabel.Text = "Worker status reporting is disabled$(If (-not $Variables.APIRunspace) { " (Configuration item 'ShowWorkerStatus' -eq `$false)" })." + # } + # Break + # } "Switching Log" { $CheckShowSwitchingCPU.Enabled = [Boolean]($Variables.Devices.Where({ $_.State -ne [DeviceState]::Unsupported -and $_.Name -notin $Config.ExcludeDeviceName -and $_.Type -EQ "CPU" })) $CheckShowSwitchingAMD.Enabled = [Boolean]($Variables.Devices.Where({ $_.State -ne [DeviceState]::Unsupported -and $_.Name -notin $Config.ExcludeDeviceName -and $_.Type -EQ "GPU" -and $_.Vendor -EQ "AMD" })) @@ -1599,7 +1599,8 @@ $TabControl.Name = "TabControl" $TabControl.ShowToolTips = $true $TabControl.Height = 0 $TabControl.Width = 0 -$TabControl.Controls.AddRange(@($RunPage, $EarningsPage, $MinersPage, $PoolsPage, $RigMonitorPage, $SwitchingPage, $WatchdogTimersPage)) +# $TabControl.Controls.AddRange(@($RunPage, $EarningsPage, $MinersPage, $PoolsPage, $RigMonitorPage, $SwitchingPage, $WatchdogTimersPage)) +$TabControl.Controls.AddRange(@($RunPage, $EarningsPage, $MinersPage, $PoolsPage, $SwitchingPage, $WatchdogTimersPage)) $TabControl.Add_Click({ Update-TabControl }) $LegacyGUIForm.Controls.Add($TabControl) diff --git a/Includes/MinerAPIs/BzMiner.ps1 b/Includes/MinerAPIs/BzMiner.ps1 index 4a9aabb1ff..a872fdafcd 100644 --- a/Includes/MinerAPIs/BzMiner.ps1 +++ b/Includes/MinerAPIs/BzMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\BzMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/Ccminer.ps1 b/Includes/MinerAPIs/Ccminer.ps1 index 573d04d145..acb71b3aaa 100644 --- a/Includes/MinerAPIs/Ccminer.ps1 +++ b/Includes/MinerAPIs/Ccminer.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\CCminer.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/EthMiner.ps1 b/Includes/MinerAPIs/EthMiner.ps1 index cdcfe0b6bd..acdf557294 100644 --- a/Includes/MinerAPIs/EthMiner.ps1 +++ b/Includes/MinerAPIs/EthMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\EthMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/FireIce.ps1 b/Includes/MinerAPIs/FireIce.ps1 index 0f70639797..9915b7154b 100644 --- a/Includes/MinerAPIs/FireIce.ps1 +++ b/Includes/MinerAPIs/FireIce.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\FireIce.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/Gminer.ps1 b/Includes/MinerAPIs/Gminer.ps1 index de91a350af..a84ffe0dfe 100644 --- a/Includes/MinerAPIs/Gminer.ps1 +++ b/Includes/MinerAPIs/Gminer.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\GMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/HellMiner.ps1 b/Includes/MinerAPIs/HellMiner.ps1 index 5eff9e03a6..a729e5fbec 100644 --- a/Includes/MinerAPIs/HellMiner.ps1 +++ b/Includes/MinerAPIs/HellMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\lolMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/MiniZ.ps1 b/Includes/MinerAPIs/MiniZ.ps1 index 90ef15c6f0..b4301fc20e 100644 --- a/Includes/MinerAPIs/MiniZ.ps1 +++ b/Includes/MinerAPIs/MiniZ.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\MiniZ.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/NBMiner.ps1 b/Includes/MinerAPIs/NBMiner.ps1 index d2768e9462..ed12caea86 100644 --- a/Includes/MinerAPIs/NBMiner.ps1 +++ b/Includes/MinerAPIs/NBMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\NBMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/NanoMiner.ps1 b/Includes/MinerAPIs/NanoMiner.ps1 index 2ccdee16c9..7cd177ceeb 100644 --- a/Includes/MinerAPIs/NanoMiner.ps1 +++ b/Includes/MinerAPIs/NanoMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\NanoMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/OneZero.ps1 b/Includes/MinerAPIs/OneZero.ps1 index 8351583a57..78fccd8458 100644 --- a/Includes/MinerAPIs/OneZero.ps1 +++ b/Includes/MinerAPIs/OneZero.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\Trex.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/Rigel.ps1 b/Includes/MinerAPIs/Rigel.ps1 index aee22f6ccd..394e68d030 100644 --- a/Includes/MinerAPIs/Rigel.ps1 +++ b/Includes/MinerAPIs/Rigel.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\Rigel.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/SRBMiner.ps1 b/Includes/MinerAPIs/SRBMiner.ps1 index 9d05a57ea4..bec12d79eb 100644 --- a/Includes/MinerAPIs/SRBMiner.ps1 +++ b/Includes/MinerAPIs/SRBMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\SRBminer.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/TeamBlackMiner.ps1 b/Includes/MinerAPIs/TeamBlackMiner.ps1 index 20589f350f..cab51fc49e 100644 --- a/Includes/MinerAPIs/TeamBlackMiner.ps1 +++ b/Includes/MinerAPIs/TeamBlackMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\lolMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/Trex.ps1 b/Includes/MinerAPIs/Trex.ps1 index 5979f955c2..2c3db1454f 100644 --- a/Includes/MinerAPIs/Trex.ps1 +++ b/Includes/MinerAPIs/Trex.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\Trex.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/Xgminer.ps1 b/Includes/MinerAPIs/Xgminer.ps1 index 89c1a183fd..bc62c11bce 100644 --- a/Includes/MinerAPIs/Xgminer.ps1 +++ b/Includes/MinerAPIs/Xgminer.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\Xgminer.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -93,7 +93,7 @@ Class XgMiner : Miner { $Shares_Rejected = [Int64]$DataSummary.rejected $Shares_Invalid = [Int64]$DataSummary.stale $Shares | Add-Member @{ $HashRate_Name = @($Shares_Accepted, $Shares_Rejected, $Shares_Invalid, ($Shares_Accepted + $Shares_Rejected + $Shares_Invalid)) } - } + } $PowerConsumption = [Double]0 diff --git a/Includes/MinerAPIs/XmRig.ps1 b/Includes/MinerAPIs/XmRig.ps1 index 9e150e2098..44bbb3510e 100644 --- a/Includes/MinerAPIs/XmRig.ps1 +++ b/Includes/MinerAPIs/XmRig.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\XmRig.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Includes/MinerAPIs/lolMiner.ps1 b/Includes/MinerAPIs/lolMiner.ps1 index 56e54fc185..b4e772cb0f 100644 --- a/Includes/MinerAPIs/lolMiner.ps1 +++ b/Includes/MinerAPIs/lolMiner.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Includes\MinerAPIs\lolMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/BzMiner-v19.0.1.ps1 b/Miners/BzMiner-v19.0.1.ps1 index 9cb69dcad8..3c064d05ed 100644 --- a/Miners/BzMiner-v19.0.1.ps1 +++ b/Miners/BzMiner-v19.0.1.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerAlexis78-v1.5.2.ps1 b/Miners/CcminerAlexis78-v1.5.2.ps1 index 7ac5f73d4b..ea663f752d 100644 --- a/Miners/CcminerAlexis78-v1.5.2.ps1 +++ b/Miners/CcminerAlexis78-v1.5.2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerDyn-v1.0.2.ps1 b/Miners/CcminerDyn-v1.0.2.ps1 index 00c48426fc..e33f3b6e2e 100644 --- a/Miners/CcminerDyn-v1.0.2.ps1 +++ b/Miners/CcminerDyn-v1.0.2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerKlausT-v8.25.ps1 b/Miners/CcminerKlausT-v8.25.ps1 index 82b44f0e3f..bd2b3924b5 100644 --- a/Miners/CcminerKlausT-v8.25.ps1 +++ b/Miners/CcminerKlausT-v8.25.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerKlausT-v8.26x2.ps1 b/Miners/CcminerKlausT-v8.26x2.ps1 index c75b7f7061..3761f906b0 100644 --- a/Miners/CcminerKlausT-v8.26x2.ps1 +++ b/Miners/CcminerKlausT-v8.26x2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerLyra2z330-v8.21r9.ps1 b/Miners/CcminerLyra2z330-v8.21r9.ps1 index d52ac84d1c..f09ea68902 100644 --- a/Miners/CcminerLyra2z330-v8.21r9.ps1 +++ b/Miners/CcminerLyra2z330-v8.21r9.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 b/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 index c0161e0ef0..377b5f7fc6 100644 --- a/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 +++ b/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerMemeHash-v2.5.5.9.ps1 b/Miners/CcminerMemeHash-v2.5.5.9.ps1 index 8711a1f283..4f8b5e542c 100644 --- a/Miners/CcminerMemeHash-v2.5.5.9.ps1 +++ b/Miners/CcminerMemeHash-v2.5.5.9.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerNeoscryptXaya-v0.2.ps1 b/Miners/CcminerNeoscryptXaya-v0.2.ps1 index aedfe8a5b2..d751aff628 100644 --- a/Miners/CcminerNeoscryptXaya-v0.2.ps1 +++ b/Miners/CcminerNeoscryptXaya-v0.2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CcminerVerusCpu-v3.8.3.ps1 b/Miners/CcminerVerusCpu-v3.8.3.ps1 index a3ded36694..b7a1e69659 100644 --- a/Miners/CcminerVerusCpu-v3.8.3.ps1 +++ b/Miners/CcminerVerusCpu-v3.8.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -29,7 +29,7 @@ $Path = "$PWD\Bin\$Name\ccminer.exe" $DeviceEnumerator = "Type_Vendor_Index" $Algorithms = @( - [PSCustomObject]@{ Algorithm = "VerusHash"; Minerset = 1; WarmupTimes = @(90, 300); ExcludePools = @("NiceHash"); Arguments = " --algo verus" } # SRBMinerMulti-v2.4.3 is fastest, but has 0.85% miner fee + [PSCustomObject]@{ Algorithm = "VerusHash"; Minerset = 1; WarmupTimes = @(90, 300); ExcludePools = @("NiceHash"); Arguments = " --algo verus" } # SRBMinerMulti-v2.4.4 is fastest, but has 0.85% miner fee ) $Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) diff --git a/Miners/CcminerVerusGpu-v3.8.3.ps1 b/Miners/CcminerVerusGpu-v3.8.3.ps1 index a9a969e27a..b6b8cb369b 100644 --- a/Miners/CcminerVerusGpu-v3.8.3.ps1 +++ b/Miners/CcminerVerusGpu-v3.8.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/ClaymoreDualME-v2.7.ps1 b/Miners/ClaymoreDualME-v2.7.ps1 index 7542122dda..d0fce30251 100644 --- a/Miners/ClaymoreDualME-v2.7.ps1 +++ b/Miners/ClaymoreDualME-v2.7.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/ClaymoreNeoscrypt-v1.2.ps1 b/Miners/ClaymoreNeoscrypt-v1.2.ps1 index 39584dc907..7425cc8bc5 100644 --- a/Miners/ClaymoreNeoscrypt-v1.2.ps1 +++ b/Miners/ClaymoreNeoscrypt-v1.2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CpuMiner-v1.4.ps1 b/Miners/CpuMiner-v1.4.ps1 index 0e4bfe8473..3ab8bbc8e8 100644 --- a/Miners/CpuMiner-v1.4.ps1 +++ b/Miners/CpuMiner-v1.4.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CryptoDredge-v0.16.0.ps1 b/Miners/CryptoDredge-v0.16.0.ps1 index 3ce3783650..25144a8101 100644 --- a/Miners/CryptoDredge-v0.16.0.ps1 +++ b/Miners/CryptoDredge-v0.16.0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/CryptoDredge-v0.27.0.ps1 b/Miners/CryptoDredge-v0.27.0.ps1 index 1684d5a768..7edcf85d81 100644 --- a/Miners/CryptoDredge-v0.27.0.ps1 +++ b/Miners/CryptoDredge-v0.27.0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/EthMiner-v0.19.0.18.ps1 b/Miners/EthMiner-v0.19.0.18.ps1 index 55edd95aca..625ac0fc99 100644 --- a/Miners/EthMiner-v0.19.0.18.ps1 +++ b/Miners/EthMiner-v0.19.0.18.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/EvrProgPow-v1p3p0.ps1 b/Miners/EvrProgPow-v1p3p0.ps1 index 2379fd3b7b..2bdbe92c8c 100644 --- a/Miners/EvrProgPow-v1p3p0.ps1 +++ b/Miners/EvrProgPow-v1p3p0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/GMiner-v2.75.ps1 b/Miners/GMiner-v2.75.ps1 index 4198ffc330..2d489ec2c2 100644 --- a/Miners/GMiner-v2.75.ps1 +++ b/Miners/GMiner-v2.75.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/GMiner-v3.43.ps1 b/Miners/GMiner-v3.43.ps1 index ef3aae79ff..23df53e750 100644 --- a/Miners/GMiner-v3.43.ps1 +++ b/Miners/GMiner-v3.43.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/HellMiner-v0.59.1.ps1 b/Miners/HellMiner-v0.59.1.ps1 index 2fffc292fb..e2a86ecb4c 100644 --- a/Miners/HellMiner-v0.59.1.ps1 +++ b/Miners/HellMiner-v0.59.1.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/JayddeeCpu-v23.15.ps1 b/Miners/JayddeeCpu-v23.15.ps1 index b844bf8cf3..698984d7df 100644 --- a/Miners/JayddeeCpu-v23.15.ps1 +++ b/Miners/JayddeeCpu-v23.15.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/KawpowMiner-v1.2.4cl.ps1 b/Miners/KawpowMiner-v1.2.4cl.ps1 index 6d3614f3eb..59b244a718 100644 --- a/Miners/KawpowMiner-v1.2.4cl.ps1 +++ b/Miners/KawpowMiner-v1.2.4cl.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/KawpowMiner-v1.2.4cuda.ps1 b/Miners/KawpowMiner-v1.2.4cuda.ps1 index adfdef6f5e..5807c2f599 100644 --- a/Miners/KawpowMiner-v1.2.4cuda.ps1 +++ b/Miners/KawpowMiner-v1.2.4cuda.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/Kudaraidee-v1.2.0a.ps1 b/Miners/Kudaraidee-v1.2.0a.ps1 index 6efddba908..cb9c942586 100644 --- a/Miners/Kudaraidee-v1.2.0a.ps1 +++ b/Miners/Kudaraidee-v1.2.0a.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/MiniZ-v2.2c.ps1 b/Miners/MiniZ-v2.2c.ps1 index f64cd8e72b..adbeff72c8 100644 --- a/Miners/MiniZ-v2.2c.ps1 +++ b/Miners/MiniZ-v2.2c.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/NBMiner-v42.3.ps1 b/Miners/NBMiner-v42.3.ps1 index 3736080ab7..fcafdc722f 100644 --- a/Miners/NBMiner-v42.3.ps1 +++ b/Miners/NBMiner-v42.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/NSFMiner-v1.3.14.ps1 b/Miners/NSFMiner-v1.3.14.ps1 index fa8ea4f5da..db9a793ff3 100644 --- a/Miners/NSFMiner-v1.3.14.ps1 +++ b/Miners/NSFMiner-v1.3.14.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/NanoMiner-v3.8.6.ps1 b/Miners/NanoMiner-v3.8.6.ps1 index 774f169459..2c2eb910bd 100644 --- a/Miners/NanoMiner-v3.8.6.ps1 +++ b/Miners/NanoMiner-v3.8.6.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -39,7 +39,7 @@ $Algorithms = @( [PSCustomObject]@{ Algorithms = @("EthashB3", "kHeavyHash"); Type = "AMD"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; Minerset = 2; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN4"); Arguments = @(" -algo EthashB3", " -algo Kaspa") } # https://github.com/nanopool/nanominer/issues/406 [PSCustomObject]@{ Algorithms = @("EvrProgPow"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 1.08; Minerset = 1; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo Evrprogpow") } [PSCustomObject]@{ Algorithms = @("FiroPow"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; Minerset = 1; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo FiroPow") } - [PSCustomObject]@{ Algorithms = @("KawPow"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 1.08; Minerset = 2; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 0); ExcludePools = @(@("ProHashing"), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo KawPow") } # TeamRedMiner-v0.10.14 is fastest + [PSCustomObject]@{ Algorithms = @("KawPow"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 1.08; Minerset = 2; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 0); ExcludePools = @(@("ProHashing"), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo KawPow") } # TeamRedMiner-v0.10.15 is fastest [PSCustomObject]@{ Algorithms = @("kHeavyHash"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 2; Minerset = 2; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo Kaspa") } [PSCustomObject]@{ Algorithms = @("UbqHash"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; Minerset = 1; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo Ubqhash") } # PhoenixMiner-v6.2c is fastest [PSCustomObject]@{ Algorithms = @("VertHash"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 3; Minerset = 1; Tuning = " -coreClocks +20 -memClocks +100 -memTweak 2"; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = @(" -algo Verthash") } diff --git a/Miners/Ninjarig-1.0.3.ps1 b/Miners/Ninjarig-1.0.3.ps1 index d666cb262b..59ad9b4cf6 100644 --- a/Miners/Ninjarig-1.0.3.ps1 +++ b/Miners/Ninjarig-1.0.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/NosuchCpu-v3.8.8.1.ps1 b/Miners/NosuchCpu-v3.8.8.1.ps1 index 3f873fe101..74d03130a2 100644 --- a/Miners/NosuchCpu-v3.8.8.1.ps1 +++ b/Miners/NosuchCpu-v3.8.8.1.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/OneZeroMiner-v1.2.5.ps1 b/Miners/OneZeroMiner-v1.2.5.ps1 index 19addfac09..b45950d5c1 100644 --- a/Miners/OneZeroMiner-v1.2.5.ps1 +++ b/Miners/OneZeroMiner-v1.2.5.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/OneZeroMiner-v1.2.8.ps1 b/Miners/OneZeroMiner-v1.2.8.ps1 new file mode 100644 index 0000000000..e7294725d2 --- /dev/null +++ b/Miners/OneZeroMiner-v1.2.8.ps1 @@ -0,0 +1,77 @@ +<# +Copyright (c) 2018-2023 Nemo, MrPlus & UselessGuru + +NemosMiner is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +NemosMiner is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +#> + +<# +Product: NemosMiner +Version: 5.0.2.5 +Version date: 2023/12/20 +#> + +If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "NVIDIA" -and $_.OpenCL.DriverVersion -ge [Version]"450.80.02" }))) { Return } + +$URI = "https://github.com/OneZeroMiner/onezerominer/releases/download/v1.2.8/onezerominer-win64-1.2.8.zip" +$Name = (Get-Item $MyInvocation.MyCommand.Path).BaseName +$Path = "$PWD\Bin\$Name\onezerominer.exe" +$DeviceEnumerator = "Type_Vendor_Slot" + +$Algorithms = @( + [PSCustomObject]@{ Algorithm = "DynexSolve"; Fee = @(0.03); MinMemGiB = 2; Minerset = 0; WarmupTimes = @(180, 0); ExcludeGPUArchitecture = @(); ExcludePools = @("ZergPool"); Arguments = @(" --algo dynex") } +) + +$Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) +$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithm] }) +$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithm].Name -notin $_.ExcludePools }) + +If ($Algorithms) { + + ($Devices | Select-Object Model -Unique).ForEach( + { + $Miner_Devices = @($Devices | Where-Object Model -EQ $_.Model) + $MinerAPIPort = $Config.APIPort + ($Miner_Devices.Id | Sort-Object -Top 1) + 1 + + $Algorithms.ForEach( + { + $ExcludePools = $_.ExcludePools + ForEach ($Pool in ($MinerPools[0][$_.Algorithm].Where({ $_.Name -notin $ExcludePools }))) { + + $ExcludeArchitecture = $_.ExcludeArchitecture + $MinMemGiB = $_.MinMemGiB + If ($AvailableMiner_Devices = $Miner_Devices.Where({ $_.MemoryGiB -ge $MinMemGiB -and $_.Architecture -notin $ExcludeArchitecture })) { + + $Miner_Name = "$Name-$($AvailableMiner_Devices.Count)x$($AvailableMiner_Devices.Model | Select-Object -Unique)" + + [PSCustomObject]@{ + API = "OneZero" + Arguments = "$($_.Arguments) --pool $(If ($Pool.PoolPorts[1]) { "ssl://"} )$($Pool.Host):$($Pool.PoolPorts[0] | Select-Object -Last 1) --wallet $($Pool.User) --pass $($Pool.Pass)$(If ($Pool.PoolPorts[1] -and $Config.SSLAllowSelfSignedCertificate) { " --no-cert-validation" } ) --api-port $MinerAPIPort --devices $(($AvailableMiner_Devices.$DeviceEnumerator | Sort-Object -Unique).ForEach({ '{0:x}' -f $_ }) -join ',')" + DeviceNames = $AvailableMiner_Devices.Name + Fee = $_.Fee # Dev fee + MinerSet = $_.MinerSet + Name = $Miner_Name + Path = $Path + Port = $MinerAPIPort + Type = "NVIDIA" + URI = $Uri + WarmupTimes = $_.WarmupTimes # First value: Seconds until miner must send first sample, if no sample is received miner will be marked as failed; Second value: Seconds from first sample until miner sends stable hashrates that will count for benchmarking + Workers = @(@{ Pool = $Pool }) + } + } + } + } + ) + } + ) +} \ No newline at end of file diff --git a/Miners/PhoenixMiner-v6.2c.ps1 b/Miners/PhoenixMiner-v6.2c.ps1 index 54a8376cc2..1faca3cd7f 100644 --- a/Miners/PhoenixMiner-v6.2c.ps1 +++ b/Miners/PhoenixMiner-v6.2c.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/Radiator-v1.0.0.ps1 b/Miners/Radiator-v1.0.0.ps1 index 45cf2353de..2bee525e95 100644 --- a/Miners/Radiator-v1.0.0.ps1 +++ b/Miners/Radiator-v1.0.0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/10/06 #> diff --git a/Miners/Raptor3umCpu-v2.0.ps1 b/Miners/Raptor3umCpu-v2.0.ps1 index fb593aced7..f985268e6d 100644 --- a/Miners/Raptor3umCpu-v2.0.ps1 +++ b/Miners/Raptor3umCpu-v2.0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/10/06 #> diff --git a/Miners/Rigel-v1.11.0.ps1 b/Miners/Rigel-v1.11.0.ps1 index 39ed4b441f..cf6044c374 100644 --- a/Miners/Rigel-v1.11.0.ps1 +++ b/Miners/Rigel-v1.11.0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/RplantCpu-v5.0.34.ps1 b/Miners/RplantCpu-v5.0.34.ps1 index 48b196ccf5..d778aa17fb 100644 --- a/Miners/RplantCpu-v5.0.34.ps1 +++ b/Miners/RplantCpu-v5.0.34.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -51,7 +51,7 @@ $Algorithms = @( # [PSCustomObject]@{ Algorithm = "CpuPower"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo cpupower" } # ASIC [PSCustomObject]@{ Algorithm = "CryptoVantaA"; Minerset = 2; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo cryptovantaa" } # [PSCustomObject]@{ Algorithm = "CurveHash"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --algo curvehash" } # reported hashrates too high (https://github.com/rplant8/cpuminer-opt-rplant/issues/21) -# [PSCustomObject]@{ Algorithm = "Decred"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo Decred" } # ASIC, No hashrate in time +# [PSCustomObject]@{ Algorithm = "Decred"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo Decred" } # ASIC, No hashrate in time, algo is now using Blake3d # [PSCustomObject]@{ Algorithm = "DMDGr"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo dmd-gr" } # ASIC [PSCustomObject]@{ Algorithm = "Ghostrider"; MinerSet = 0; WarmupTimes = @(180, 60); ExcludePools = @(); Arguments = " --algo gr" } # [PSCustomObject]@{ Algorithm = "Groestl"; Minerset = 3; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --algo groestl" } # ASIC diff --git a/Miners/RplantCpu-v5.0.36.ps1 b/Miners/RplantCpu-v5.0.36.ps1 index 2c04e7070d..27a6416b6a 100644 --- a/Miners/RplantCpu-v5.0.36.ps1 +++ b/Miners/RplantCpu-v5.0.36.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -53,7 +53,7 @@ $Algorithms = @( # [PSCustomObject]@{ Algorithm = "CpuPower"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo cpupower" } # ASIC [PSCustomObject]@{ Algorithm = "CryptoVantaA"; Minerset = 2; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo cryptovantaa" } # [PSCustomObject]@{ Algorithm = "CurveHash"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --algo curvehash" } # reported hashrates too high (https://github.com/rplant8/cpuminer-opt-rplant/issues/21) -# [PSCustomObject]@{ Algorithm = "Decred"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo Decred" } # ASIC, No hashrate in time +# [PSCustomObject]@{ Algorithm = "Decred"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo Decred" } # ASIC, No hashrate in time, algo is now using Blake3d # [PSCustomObject]@{ Algorithm = "DMDGr"; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(); Arguments = " --algo dmd-gr" } # ASIC [PSCustomObject]@{ Algorithm = "Ghostrider"; MinerSet = 0; WarmupTimes = @(180, 60); ExcludePools = @(); Arguments = " --algo gr" } # [PSCustomObject]@{ Algorithm = "Groestl"; Minerset = 3; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --algo groestl" } # ASIC diff --git a/Miners/RrkzCpu-v4.2.ps1 b/Miners/RrkzCpu-v4.2.ps1 index 919f2702d2..85b07f7afb 100644 --- a/Miners/RrkzCpu-v4.2.ps1 +++ b/Miners/RrkzCpu-v4.2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/SRBMinerMulti-v0.9.4.ps1 b/Miners/SRBMinerMulti-v0.9.4.ps1 index 5712ce1b63..0f391f54a5 100644 --- a/Miners/SRBMinerMulti-v0.9.4.ps1 +++ b/Miners/SRBMinerMulti-v0.9.4.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/SRBMinerMulti-v2.4.4.ps1 b/Miners/SRBMinerMulti-v2.4.4.ps1 index a15ccec03a..6d6ebf53d8 100644 --- a/Miners/SRBMinerMulti-v2.4.4.ps1 +++ b/Miners/SRBMinerMulti-v2.4.4.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -52,7 +52,7 @@ $Algorithms = @( [PSCustomObject]@{ Algorithms = @("CryptonightGpu"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm cryptonight_gpu") } [PSCustomObject]@{ Algorithms = @("CryptonightHeavyXhv"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(30, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm cryptonight_xhv") } [PSCustomObject]@{ Algorithms = @("CryptonightTalleo"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; Minerset = 2; WarmupTimes = @(60, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm cryptonight_talleo") } - [PSCustomObject]@{ Algorithms = @("CryptonightTurtle"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; Minerset = 2; WarmupTimes = @(30, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm cryptonight_turtle") } # TeamRedMiner-v0.10.14 is fastest + [PSCustomObject]@{ Algorithms = @("CryptonightTurtle"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; Minerset = 2; WarmupTimes = @(30, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm cryptonight_turtle") } # TeamRedMiner-v0.10.15 is fastest [PSCustomObject]@{ Algorithms = @("CryptonightUpx"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm cryptonight_upx") } [PSCustomObject]@{ Algorithms = @("CurveHash"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 2; Minerset = 1; WarmupTimes = @(60, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm curvehash") } [PSCustomObject]@{ Algorithms = @("Decred"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(30, 30); ExcludeGPUArchitecture = @(); ExcludePools = @(@(), @()); Arguments = @(" --gpu-auto-tune 2 --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm blake3d_decred") } diff --git a/Miners/SgMinerFancyIX-v0.9.4.ps1 b/Miners/SgMinerFancyIX-v0.9.4.ps1 index f7af6114b8..ac2d06e455 100644 --- a/Miners/SgMinerFancyIX-v0.9.4.ps1 +++ b/Miners/SgMinerFancyIX-v0.9.4.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/Suprminer-v2.31v2.ps1 b/Miners/Suprminer-v2.31v2.ps1 index 35c7557fc1..c4e722c721 100644 --- a/Miners/Suprminer-v2.31v2.ps1 +++ b/Miners/Suprminer-v2.31v2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/TTMiner-v2023.4.3.ps1 b/Miners/TTMiner-v2023.4.3.ps1 index e129c2d392..356e3385d8 100644 --- a/Miners/TTMiner-v2023.4.3.ps1 +++ b/Miners/TTMiner-v2023.4.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/TTMiner-v5.0.3.ps1 b/Miners/TTMiner-v5.0.3.ps1 index 3c7f645542..fe7be60747 100644 --- a/Miners/TTMiner-v5.0.3.ps1 +++ b/Miners/TTMiner-v5.0.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/TeamBlackMiner-v2.16.ps1 b/Miners/TeamBlackMiner-v2.16.ps1 index 9b76b4606a..e3cabbea8c 100644 --- a/Miners/TeamBlackMiner-v2.16.ps1 +++ b/Miners/TeamBlackMiner-v2.16.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/TeamRedMiner-v0.10.14.ps1 b/Miners/TeamRedMiner-v0.10.14.ps1 deleted file mode 100644 index b3d92eb703..0000000000 --- a/Miners/TeamRedMiner-v0.10.14.ps1 +++ /dev/null @@ -1,148 +0,0 @@ -<# -Copyright (c) 2018-2023 Nemo, MrPlus & UselessGuru - -NemosMiner is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -NemosMiner is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -#> - -<# -Product: NemosMiner -Version: 5.0.2.4 -Version date: 2023/12/20 -#> - -If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 2.0" }))) { Return } - -$URI = "https://github.com/Minerx117/miners/releases/download/TeamRedMiner/teamredminer-v0.10.14-win.zip" -$Name = (Get-Item $MyInvocation.MyCommand.Path).BaseName -$Path = "$PWD\Bin\$Name\teamredminer.exe" -$DeviceEnumerator = "Type_Vendor_Slot" - -$Algorithms = @( - [PSCustomObject]@{ Algorithms = @("Autolykos2"); Fee = @(0.025); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=autolykos2" } - [PSCustomObject]@{ Algorithms = @("Autolykos2", "kHeavyHash"); Fee = @(0.025, 0.025); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=autolykos2" } - [PSCustomObject]@{ Algorithms = @("Autolykos2", "IronFish"); Fee = @(0.025, 0.025); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=autolykos2" } # Pools with support at this time are Herominers, Flexpool and Kryptex - [PSCustomObject]@{ Algorithms = @("Chukwa"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=trtl_chukwa" } - [PSCustomObject]@{ Algorithms = @("Chukwa2"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=trtl_chukwa2" } - [PSCustomObject]@{ Algorithms = @("CryptonightCcx"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_conceal --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } # SRBMinerMulti-v2.4.3 is fastest - [PSCustomObject]@{ Algorithms = @("CryptonightHeavy"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_heavy --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CryptonightHaven"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_haven --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CryptonightHeavyTube"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_saber --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } -# [PSCustomObject]@{ Algorithms = @("CryptonightR"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 3; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnr --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } # ASIC - [PSCustomObject]@{ Algorithms = @("CryptonightV1"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8 --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CryptonightDouble"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_dbl --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } # XmRig-v6.20.0 is fastest - [PSCustomObject]@{ Algorithms = @("CryptonightHalf"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_half --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CryptonightTurtle"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_trtl --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CryptonightRwz"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_rwz --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CryptonightUpx"); Fee = @(0.025); MinMemGiB = 3.0; Minerset = 1; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_upx2 --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } - [PSCustomObject]@{ Algorithms = @("CuckarooD29"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cuckarood29_grin" } # 2GB is not enough -# [PSCustomObject]@{ Algorithms = @("Cuckatoo31"); Fee = @(0.025); MinMemGiB = 3.0; Minerset = 3; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cuckatoo31_grin" } # ASIC - [PSCustomObject]@{ Algorithms = @("EtcHash"); Fee = @(0.01); MinMemGiB = 0.77; Minerset = 1; WarmupTimes = @(45, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=etchash" } # PhoenixMiner-v6.2c is fastest - [PSCustomObject]@{ Algorithms = @("Ethash"); Fee = @(0.01); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=ethash" } # PhoenixMiner-v6.2c is fastest - [PSCustomObject]@{ Algorithms = @("Ethash", "kHeavyHash"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=ethash" } # PhoenixMiner-v6.2c is fastest -# [PSCustomObject]@{ Algorithms = @("Ethash", "IronFish"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=ethash" } # Pools with support at this time are Herominers, Flexpool and Kryptex - [PSCustomObject]@{ Algorithms = @("FiroPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA3"); Arguments = " --algo=firopow" } # Wildrig-v0.40.2a is fastest on Polaris - [PSCustomObject]@{ Algorithms = @("IronFish"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=ironfish" } # Pools with support at this time are Herominers, Flexpool and Kryptex - [PSCustomObject]@{ Algorithms = @("KawPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludePools = @(@("MiningPoolHub"), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA3"); Arguments = " --algo=kawpow" } # Wildrig-v0.40.2a is fastest on Polaris - [PSCustomObject]@{ Algorithms = @("kHeavyHash"); Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2"); Arguments = " --algo=kas" } -# [PSCustomObject]@{ Algorithms = @("Lyra2Z"); Fee = @(0.03); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=lyra2z" } # ASIC -# [PSCustomObject]@{ Algorithms = @("Lyra2RE3"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=lyra2rev3" } # ASIC - [PSCustomObject]@{ Algorithms = @("MTP"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(45, 45); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA3"); Arguments = " --algo=mtp" } # Algorithm is dead - [PSCustomObject]@{ Algorithms = @("Nimiq"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA3"); Arguments = " --algo=nimiq" } - [PSCustomObject]@{ Algorithms = @("Phi2"); Fee = @(0.03); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=phi2" } - [PSCustomObject]@{ Algorithms = @("VertHash"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 1; WarmupTimes = @(75, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA3"); Arguments = " --algo=verthash --verthash_file=..\.$($Variables.VerthashDatPath)" } -# [PSCustomObject]@{ Algorithms = @("X16r"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16r" } # ASIC - [PSCustomObject]@{ Algorithms = @("X16rv2"); Fee = @(0.025); MinMemGiB = 4.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16rv2" } - [PSCustomObject]@{ Algorithms = @("X16s"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16s" } - [PSCustomObject]@{ Algorithms = @("X16rt"); Fee = @(0.025); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "GCN2", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16rt" } # FPGA -) - -$Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) -$Algorithms.Where({ -not $_.Algorithms[1] }) | ForEach-Object { $_.Algorithms += "" } -$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithms[0]] -and ($_.Algorithms[1] -eq "" -or $MinerPools[1][$_.Algorithms[1]]) }) -$Algorithms = $Algorithms.Where({ $Config.SSL -ne "Always" -or ($MinerPools[0][$_.Algorithms[0]].SSLSelfSignedCertificate -eq $false -and (-not $_.Algorithms[1] -or $MinerPools[1][$_.Algorithms[1]].SSLSelfSignedCertificate -ne $true)) }) -$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithms[0]].Name -notin $_.ExcludePools[0] }) -$Algorithms = $Algorithms.Where({ $MinerPools[1][$_.Algorithms[1]].Name -notin $_.ExcludePools[1] }) - -If ($Algorithms) { - - ($Devices | Select-Object Model -Unique).ForEach( - { - $Miner_Devices = $Devices | Where-Object Model -EQ $_.Model - $MinerAPIPort = $Config.APIPort + ($Miner_Devices.Id | Sort-Object -Top 1) + 1 - - $Algorithms.ForEach( - { - $ExcludePools = $_.ExcludePools - ForEach ($Pool0 in ($MinerPools[0][$_.Algorithms[0]].Where({ $_.Name -notin $ExcludePools[0] -and ($Config.SSL -ne "Always" -or $_.SSLSelfSignedCertificate -ne $true) }))) { - ForEach ($Pool1 in ($MinerPools[1][$_.Algorithms[1]].Where({ $_.Name -notin $ExcludePools[1] -and ($Config.SSL -ne "Always" -or $_.SSLSelfSignedCertificate -ne $true) }))) { - - $ExcludeGPUArchitecture = $_.ExcludeGPUArchitecture - $MinMemGiB = $_.MinMemGiB + $Pool0.DAGSizeGiB + $Pool1.DAGSizeGiB - If ($AvailableMiner_Devices = $Miner_Devices.Where({ $_.MemoryGiB -ge $MinMemGiB -and $_.Architecture -notin $ExcludeGPUArchitecture })) { - - $Miner_Name = "$Name-$($AvailableMiner_Devices.Count)x$($AvailableMiner_Devices.Model | Select-Object -Unique)$(If ($_.Algorithms[1]) { "-$($_.Algorithms[0])&$($_.Algorithms[1])" })" - - $Arguments = $_.Arguments - $Arguments += " --pool_force_ensub --url=$(If ($Pool0.PoolPorts[1]) { "stratum+ssl" } Else { "stratum+tcp" })://$($Pool0.Host):$($Pool0.PoolPorts | Select-Object -Last 1)" - $Arguments += Switch ($Pool0.Protocol) { - "ethstratumnh" { " --eth_stratum_mode=nicehash" } - } - $Arguments += " --user=$($Pool0.User)$(If ($Pool0.WorkerName -and $Pool0.User -notmatch "\.$($Pool0.WorkerName)$") { ".$($Pool0.WorkerName)" })" - $Arguments += " --pass=$($Pool0.Pass)" - - If ($_.Algorithms[1] -eq "IronFish") { $Arguments += " --iron" } - If ($_.Algorithms[1] -eq "kHeavyHash") { $Arguments += " --kas" } - If ($_.Algorithms[1]) { - $Arguments += " --url=$(If ($Pool1.PoolPorts[1]) { "stratum+ssl" } Else { "stratum+tcp" })://$($Pool1.Host):$($Pool1.PoolPorts | Select-Object -Last 1)" - $Arguments += " --user=$($Pool1.User)$(If ($Pool1.WorkerName -and $Pool1.User -notmatch "\.$($Pool1.WorkerName)$") { ".$($Pool1.WorkerName)" })" - $Arguments += " --pass=$($Pool1.Pass)" - } - If ($_.Algorithms[1] -eq "IronFish") { $Arguments += " --iron_end" } - If ($_.Algorithms[1] -eq "kHeavyHash") { $Arguments += " --kas_end" } - - If ($_.Algorithms[0] -match '^Et(c)hash.+' -and $AvailableMiner_Devices.Model -notmatch "^Radeon RX [0-9]{3} ") { $_.Fee = @(0.0075) } # Polaris cards 0.75% - - If ($_.Algorithms -contains "VertHash" -and (Get-Item -Path $Variables.VerthashDatPath -ErrorAction Ignore).length -ne 1283457024) { - $PrerequisitePath = $Variables.VerthashDatPath - $PrerequisiteURI = "https://github.com/Minerx117/miners/releases/download/Verthash.Dat/VertHash.dat" - } - Else { - $PrerequisitePath = "" - $PrerequisiteURI = "" - } - - [PSCustomObject]@{ - API = "Xgminer" - Arguments = "$Arguments --watchdog_script --no_gpu_monitor --init_style=3 --hardware=gpu --platform=$($AvailableMiner_Devices.PlatformId | Sort-Object -Unique) --api_listen=127.0.0.1:$MinerAPIPort --devices=$(($AvailableMiner_Devices.$DeviceEnumerator | Sort-Object -Unique).ForEach({ '{0:d}' -f $_ }) -join ',')" - DeviceNames = $AvailableMiner_Devices.Name - Fee = $_.Fee # Dev fee - MinerSet = $_.MinerSet - Name = $Miner_Name - Path = $Path - Port = $MinerAPIPort - PrerequisitePath = $PrerequisitePath - PrerequisiteURI = $PrerequisiteURI - Type = "AMD" - URI = $Uri - WarmupTimes = $_.WarmupTimes # First value: Seconds until miner must send first sample, if no sample is received miner will be marked as failed; Second value: Seconds from first sample until miner sends stable hashrates that will count for benchmarking - Workers = @(($Pool0, $Pool1).Where({ $_ }) | ForEach-Object { @{ Pool = $_ } }) - } - } - } - } - } - ) - } - ) -} \ No newline at end of file diff --git a/Miners/TeamRedMiner-v0.10.15.ps1 b/Miners/TeamRedMiner-v0.10.15.ps1 new file mode 100644 index 0000000000..abed7f2303 --- /dev/null +++ b/Miners/TeamRedMiner-v0.10.15.ps1 @@ -0,0 +1,148 @@ +<# +Copyright (c) 2018-2023 Nemo, MrPlus & UselessGuru + +NemosMiner is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +NemosMiner is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +#> + +<# +Product: NemosMiner +Version: 5.0.2.5 +Version date: 2023/12/20 +#> + +If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 2.0" }))) { Return } + +$URI = "https://github.com/todxx/teamredminer/releases/download/v0.10.15/teamredminer-v0.10.15-win.zip" +$Name = (Get-Item $MyInvocation.MyCommand.Path).BaseName +$Path = "$PWD\Bin\$Name\teamredminer.exe" +$DeviceEnumerator = "Type_Vendor_Slot" + +$Algorithms = @( + [PSCustomObject]@{ Algorithms = @("Autolykos2"); Fee = @(0.025); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=autolykos2" } + [PSCustomObject]@{ Algorithms = @("Autolykos2", "kHeavyHash"); Fee = @(0.025, 0.025); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=autolykos2" } + [PSCustomObject]@{ Algorithms = @("Autolykos2", "IronFish"); Fee = @(0.025, 0.025); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @("NiceHash")); ExcludeGPUArchitecture = @(); Arguments = " --algo=autolykos2" } # Pools with support at this time are Herominers, Flexpool and Kryptex + [PSCustomObject]@{ Algorithms = @("Chukwa"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=trtl_chukwa" } + [PSCustomObject]@{ Algorithms = @("Chukwa2"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=trtl_chukwa2" } + [PSCustomObject]@{ Algorithms = @("CryptonightCcx"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_conceal --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } # SRBMinerMulti-v2.4.4 is fastest + [PSCustomObject]@{ Algorithms = @("CryptonightHeavy"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_heavy --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CryptonightHaven"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_haven --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CryptonightHeavyTube"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cn_saber --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } +# [PSCustomObject]@{ Algorithms = @("CryptonightR"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 3; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnr --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } # ASIC + [PSCustomObject]@{ Algorithms = @("CryptonightV1"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8 --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CryptonightDouble"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_dbl --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } # XmRig-v6.20.0 is fastest + [PSCustomObject]@{ Algorithms = @("CryptonightHalf"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_half --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CryptonightTurtle"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_trtl --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CryptonightRwz"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_rwz --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CryptonightUpx"); Fee = @(0.025); MinMemGiB = 3.0; Minerset = 1; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cnv8_upx2 --auto_tune=QUICK --auto_tune_runs=2 --allow_large_alloc --no_lean" } + [PSCustomObject]@{ Algorithms = @("CuckarooD29"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cuckarood29_grin" } # 2GB is not enough +# [PSCustomObject]@{ Algorithms = @("Cuckatoo31"); Fee = @(0.025); MinMemGiB = 3.0; Minerset = 3; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=cuckatoo31_grin" } # ASIC + [PSCustomObject]@{ Algorithms = @("EtcHash"); Fee = @(0.01); MinMemGiB = 0.77; Minerset = 1; WarmupTimes = @(45, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=etchash" } # PhoenixMiner-v6.2c is fastest + [PSCustomObject]@{ Algorithms = @("Ethash"); Fee = @(0.01); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=ethash" } # PhoenixMiner-v6.2c is fastest + [PSCustomObject]@{ Algorithms = @("Ethash", "kHeavyHash"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=ethash" } # PhoenixMiner-v6.2c is fastest +# [PSCustomObject]@{ Algorithms = @("Ethash", "IronFish"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; Minerset = 2; WarmupTimes = @(60, 60); ExcludePools = @(@(), @("NiceHash")); ExcludeGPUArchitecture = @(); Arguments = " --algo=ethash" } # Pools with support at this time are Herominers, Flexpool and Kryptex + [PSCustomObject]@{ Algorithms = @("FiroPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("RDNA3"); Arguments = " --algo=firopow" } # Wildrig-v0.40.4 is fastest on Polaris + [PSCustomObject]@{ Algorithms = @("IronFish"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@("NiceHash"), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=ironfish" } # Pools with support at this time are Herominers, Flexpool and Kryptex + [PSCustomObject]@{ Algorithms = @("KawPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("RDNA3"); Arguments = " --algo=kawpow" } # Wildrig-v0.40.4 is fastest on Polaris + [PSCustomObject]@{ Algorithms = @("kHeavyHash"); Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @(); Arguments = " --algo=kas" } +# [PSCustomObject]@{ Algorithms = @("Lyra2Z"); Fee = @(0.03); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=lyra2z" } # ASIC +# [PSCustomObject]@{ Algorithms = @("Lyra2RE3"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=lyra2rev3" } # ASIC + [PSCustomObject]@{ Algorithms = @("MTP"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(45, 45); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA3"); Arguments = " --algo=mtp" } # Algorithm is dead + [PSCustomObject]@{ Algorithms = @("Nimiq"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA3"); Arguments = " --algo=nimiq" } + [PSCustomObject]@{ Algorithms = @("Phi2"); Fee = @(0.03); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=phi2" } + [PSCustomObject]@{ Algorithms = @("VertHash"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 1; WarmupTimes = @(75, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1"); Arguments = " --algo=verthash --verthash_file=..\.$($Variables.VerthashDatPath)" } +# [PSCustomObject]@{ Algorithms = @("X16r"); Fee = @(0.025); MinMemGiB = 4.0; Minerset = 3; WarmupTimes = @(60, 60); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16r" } # ASIC + [PSCustomObject]@{ Algorithms = @("X16rv2"); Fee = @(0.025); MinMemGiB = 4.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16rv2" } + [PSCustomObject]@{ Algorithms = @("X16s"); Fee = @(0.025); MinMemGiB = 2.0; Minerset = 2; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16s" } + [PSCustomObject]@{ Algorithms = @("X16rt"); Fee = @(0.025); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludePools = @(@(), @()); ExcludeGPUArchitecture = @("GCN1", "RDNA1", "RDNA2", "RDNA3"); Arguments = " --algo=x16rt" } # FPGA +) + +$Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) +$Algorithms.Where({ -not $_.Algorithms[1] }) | ForEach-Object { $_.Algorithms += "" } +$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithms[0]] -and ($_.Algorithms[1] -eq "" -or $MinerPools[1][$_.Algorithms[1]]) }) +$Algorithms = $Algorithms.Where({ $Config.SSL -ne "Always" -or ($MinerPools[0][$_.Algorithms[0]].SSLSelfSignedCertificate -eq $false -and (-not $_.Algorithms[1] -or $MinerPools[1][$_.Algorithms[1]].SSLSelfSignedCertificate -ne $true)) }) +$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithms[0]].Name -notin $_.ExcludePools[0] }) +$Algorithms = $Algorithms.Where({ $MinerPools[1][$_.Algorithms[1]].Name -notin $_.ExcludePools[1] }) + +If ($Algorithms) { + + ($Devices | Select-Object Model -Unique).ForEach( + { + $Miner_Devices = $Devices | Where-Object Model -EQ $_.Model + $MinerAPIPort = $Config.APIPort + ($Miner_Devices.Id | Sort-Object -Top 1) + 1 + + $Algorithms.ForEach( + { + $ExcludePools = $_.ExcludePools + ForEach ($Pool0 in ($MinerPools[0][$_.Algorithms[0]].Where({ $_.Name -notin $ExcludePools[0] -and ($Config.SSL -ne "Always" -or $_.SSLSelfSignedCertificate -ne $true) }))) { + ForEach ($Pool1 in ($MinerPools[1][$_.Algorithms[1]].Where({ $_.Name -notin $ExcludePools[1] -and ($Config.SSL -ne "Always" -or $_.SSLSelfSignedCertificate -ne $true) }))) { + + $ExcludeGPUArchitecture = $_.ExcludeGPUArchitecture + $MinMemGiB = $_.MinMemGiB + $Pool0.DAGSizeGiB + $Pool1.DAGSizeGiB + If ($AvailableMiner_Devices = $Miner_Devices.Where({ $_.MemoryGiB -ge $MinMemGiB -and $_.Architecture -notin $ExcludeGPUArchitecture })) { + + $Miner_Name = "$Name-$($AvailableMiner_Devices.Count)x$($AvailableMiner_Devices.Model | Select-Object -Unique)$(If ($_.Algorithms[1]) { "-$($_.Algorithms[0])&$($_.Algorithms[1])" })" + + $Arguments = $_.Arguments + $Arguments += " --pool_force_ensub --url=$(If ($Pool0.PoolPorts[1]) { "stratum+ssl" } Else { "stratum+tcp" })://$($Pool0.Host):$($Pool0.PoolPorts | Select-Object -Last 1)" + $Arguments += Switch ($Pool0.Protocol) { + "ethstratumnh" { " --eth_stratum_mode=nicehash" } + } + $Arguments += " --user=$($Pool0.User)$(If ($Pool0.WorkerName -and $Pool0.User -notmatch "\.$($Pool0.WorkerName)$") { ".$($Pool0.WorkerName)" })" + $Arguments += " --pass=$($Pool0.Pass)" + + If ($_.Algorithms[1] -eq "IronFish") { $Arguments += " --iron" } + If ($_.Algorithms[1] -eq "kHeavyHash") { $Arguments += " --kas" } + If ($_.Algorithms[1]) { + $Arguments += " --url=$(If ($Pool1.PoolPorts[1]) { "stratum+ssl" } Else { "stratum+tcp" })://$($Pool1.Host):$($Pool1.PoolPorts | Select-Object -Last 1)" + $Arguments += " --user=$($Pool1.User)$(If ($Pool1.WorkerName -and $Pool1.User -notmatch "\.$($Pool1.WorkerName)$") { ".$($Pool1.WorkerName)" })" + $Arguments += " --pass=$($Pool1.Pass)" + } + If ($_.Algorithms[1] -eq "IronFish") { $Arguments += " --iron_end" } + If ($_.Algorithms[1] -eq "kHeavyHash") { $Arguments += " --kas_end" } + + If ($_.Algorithms[0] -match '^Et(c)hash.+' -and $AvailableMiner_Devices.Model -notmatch "^Radeon RX [0-9]{3} ") { $_.Fee = @(0.0075) } # Polaris cards 0.75% + + If ($_.Algorithms -contains "VertHash" -and (Get-Item -Path $Variables.VerthashDatPath -ErrorAction Ignore).length -ne 1283457024) { + $PrerequisitePath = $Variables.VerthashDatPath + $PrerequisiteURI = "https://github.com/Minerx117/miners/releases/download/Verthash.Dat/VertHash.dat" + } + Else { + $PrerequisitePath = "" + $PrerequisiteURI = "" + } + + [PSCustomObject]@{ + API = "Xgminer" + Arguments = "$Arguments --watchdog_script --no_gpu_monitor --init_style=3 --hardware=gpu --platform=$($AvailableMiner_Devices.PlatformId | Sort-Object -Unique) --api_listen=127.0.0.1:$MinerAPIPort --devices=$(($AvailableMiner_Devices.$DeviceEnumerator | Sort-Object -Unique).ForEach({ '{0:d}' -f $_ }) -join ',')" + DeviceNames = $AvailableMiner_Devices.Name + Fee = $_.Fee # Dev fee + MinerSet = $_.MinerSet + Name = $Miner_Name + Path = $Path + Port = $MinerAPIPort + PrerequisitePath = $PrerequisitePath + PrerequisiteURI = $PrerequisiteURI + Type = "AMD" + URI = $Uri + WarmupTimes = $_.WarmupTimes # First value: Seconds until miner must send first sample, if no sample is received miner will be marked as failed; Second value: Seconds from first sample until miner sends stable hashrates that will count for benchmarking + Workers = @(($Pool0, $Pool1).Where({ $_ }) | ForEach-Object { @{ Pool = $_ } }) + } + } + } + } + } + ) + } + ) +} \ No newline at end of file diff --git a/Miners/Trex-v0.26.8.ps1 b/Miners/Trex-v0.26.8.ps1 index 736bf64e8b..e056b39f5c 100644 --- a/Miners/Trex-v0.26.8.ps1 +++ b/Miners/Trex-v0.26.8.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/Wildrig-v0.40.2a.ps1 b/Miners/Wildrig-v0.40.4.ps1 similarity index 99% rename from Miners/Wildrig-v0.40.2a.ps1 rename to Miners/Wildrig-v0.40.4.ps1 index 865e90cdf8..f8e6fd535b 100644 --- a/Miners/Wildrig-v0.40.2a.ps1 +++ b/Miners/Wildrig-v0.40.4.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,13 +17,13 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ ($_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 1.2") -or $_.Type -eq "INTEL" -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge [Version]"452.39.00") }))) { Return } -$URI = "https://github.com/andru-kun/wildrig-multi/releases/download/0.40.2a/wildrig-multi-windows-0.40.2a.zip" +$URI = "https://github.com/andru-kun/wildrig-multi/releases/download/0.40.4/wildrig-multi-windows-0.40.4.zip" $Name = (Get-Item $MyInvocation.MyCommand.Path).BaseName $Path = "$PWD\Bin\$Name\wildrig.exe" $DeviceEnumerator = "Type_Slot" @@ -51,7 +51,7 @@ $Algorithms = @( [PSCustomObject]@{ Algorithm = "Hex"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo hex" } [PSCustomObject]@{ Algorithm = "HMQ1725"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo hmq1725" } # CryptoDredge-v0.27.0 is fastest [PSCustomObject]@{ Algorithm = "JeongHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo glt-jeonghash" } - [PSCustomObject]@{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; Minerset = 1; WarmupTimes = @(45, 0); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo kawpow" } # TeamRedMiner-v0.10.14 is fastest on Navi + [PSCustomObject]@{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; Minerset = 1; WarmupTimes = @(45, 0); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo kawpow" } # TeamRedMiner-v0.10.15 is fastest on Navi # [PSCustomObject]@{ Algorithm = "Lyra2RE2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo lyra2v2" } # ASIC # [PSCustomObject]@{ Algorithm = "Lyra2RE3"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo lyra2v3" } # ASIC [PSCustomObject]@{ Algorithm = "Lyra2TDC"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo lyra2tdc" } @@ -99,7 +99,7 @@ $Algorithms = @( [PSCustomObject]@{ Algorithm = "X16s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x16s" } # FPGA [PSCustomObject]@{ Algorithm = "X17"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x17" } [PSCustomObject]@{ Algorithm = "X18"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x18" } - [PSCustomObject]@{ Algorithm = "X21s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x21s" } # TeamRedMiner-v0.10.14 is fastest + [PSCustomObject]@{ Algorithm = "X21s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x21s" } # TeamRedMiner-v0.10.15 is fastest [PSCustomObject]@{ Algorithm = "X22"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(60, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x22" } [PSCustomObject]@{ Algorithm = "X22i"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(60, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x22i" } [PSCustomObject]@{ Algorithm = "X25x"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; Minerset = 2; WarmupTimes = @(60, 15); ExcludeGPUArchitecture = @(); ExcludeGPUModel = ""; ExcludePools = @(); Arguments = " --algo x25x" } diff --git a/Miners/XmRig-v6.20.0.ps1 b/Miners/XmRig-v6.20.0.ps1 index 6c5078b965..4b4dce7b38 100644 --- a/Miners/XmRig-v6.20.0.ps1 +++ b/Miners/XmRig-v6.20.0.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -47,7 +47,7 @@ $DeviceEnumerator = "PlatformId_Index" $Algorithms = @( [PSCustomObject]@{ Algorithm = "Cryptonight"; Type = "AMD"; MinMemGiB = 2; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo cn/0" } - [PSCustomObject]@{ Algorithm = "CryptonightCcx"; Type = "AMD"; MinMemGiB = 2; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo cn/ccx" } # SRBMinerMulti-v2.4.3 is fastest, but has 0.85% miner fee + [PSCustomObject]@{ Algorithm = "CryptonightCcx"; Type = "AMD"; MinMemGiB = 2; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo cn/ccx" } # SRBMinerMulti-v2.4.4 is fastest, but has 0.85% miner fee [PSCustomObject]@{ Algorithm = "CryptonightDouble"; Type = "AMD"; MinMemGiB = 2; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo cn/double" } [PSCustomObject]@{ Algorithm = "CryptonightFast"; Type = "AMD"; MinMemGiB = 2; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo cn/fast" } [PSCustomObject]@{ Algorithm = "CryptonightLite"; Type = "AMD"; MinMemGiB = 1; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo cn-lite/0" } @@ -103,7 +103,7 @@ $Algorithms = @( [PSCustomObject]@{ Algorithm = "RandomxArq"; Type = "CPU"; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/arq" } # FPGA [PSCustomObject]@{ Algorithm = "RandomxKeva"; Type = "CPU"; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/keva" } [PSCustomObject]@{ Algorithm = "RandomxLoki"; Type = "CPU"; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/loki" } - [PSCustomObject]@{ Algorithm = "RandomxSfx"; Type = "CPU"; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/sfx" } # SRBMinerMulti-v2.4.3 is fastest, but has 0.85% miner fee + [PSCustomObject]@{ Algorithm = "RandomxSfx"; Type = "CPU"; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/sfx" } # SRBMinerMulti-v2.4.4 is fastest, but has 0.85% miner fee [PSCustomObject]@{ Algorithm = "RandomxWow"; Type = "CPU"; Minerset = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/wow" } [PSCustomObject]@{ Algorithm = "Uplexa"; Type = "CPU"; Minerset = 0; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo rx/upx2" } diff --git a/Miners/XmrStak-v2.10.8.ps1 b/Miners/XmrStak-v2.10.8.ps1 index 998eb7f595..a8e044a410 100644 --- a/Miners/XmrStak-v2.10.8.ps1 +++ b/Miners/XmrStak-v2.10.8.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -30,12 +30,12 @@ $DeviceEnumerator = "Type_Vendor_Index" $Algorithms = @( [PSCustomObject]@{ Algorithm = "CryptonightBittube2"; MinMemGiB = 4; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } - [PSCustomObject]@{ Algorithm = "CryptonightGpu"; MinMemGiB = 2; Type = "AMD"; Minerset = 1; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # SRBMinerMulti-v2.4.3 is fastest, but has 0.85% miner fee + [PSCustomObject]@{ Algorithm = "CryptonightGpu"; MinMemGiB = 2; Type = "AMD"; Minerset = 1; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # SRBMinerMulti-v2.4.4 is fastest, but has 0.85% miner fee [PSCustomObject]@{ Algorithm = "CryptonightLite"; MinMemGiB = 1; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } [PSCustomObject]@{ Algorithm = "CryptonightLiteV1"; MinMemGiB = 1; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } [PSCustomObject]@{ Algorithm = "CryptonightLiteItbc"; MinMemGiB = 1; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } [PSCustomObject]@{ Algorithm = "CryptonightHeavy"; MinMemGiB = 1; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # XmRig-v6.20.0 is fastest -# [PSCustomObject]@{ Algorithm = "CryptonightHeavyXhv"; MinMemGiB = 4; Type = "AMD"; Minerset = 1; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # PARSE error: Invalid job length; SRBMinerMulti-v2.4.3 is fastest, but has 0.85% miner fee +# [PSCustomObject]@{ Algorithm = "CryptonightHeavyXhv"; MinMemGiB = 4; Type = "AMD"; Minerset = 1; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # PARSE error: Invalid job length; SRBMinerMulti-v2.4.4 is fastest, but has 0.85% miner fee [PSCustomObject]@{ Algorithm = "CryptonightMsr"; MinMemGiB = 2; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # [PSCustomObject]@{ Algorithm = "CryptonightR"; MinMemGiB = 2; Type = "AMD"; Minerset = 3; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # ASIC [PSCustomObject]@{ Algorithm = "CryptonightDouble"; MinMemGiB = 2; Type = "AMD"; Minerset = 2; WarmupTimes = @(90, 15); ExcludePools = @(); Arguments = " --noCPU --noNVIDIA --amd" } # XmRig-v6.20.0 is fastest diff --git a/Miners/ZealotEnemy-v2.6.2.ps1 b/Miners/ZealotEnemy-v2.6.2.ps1 index 51434da058..1c56ab1106 100644 --- a/Miners/ZealotEnemy-v2.6.2.ps1 +++ b/Miners/ZealotEnemy-v2.6.2.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/ZealotEnemy-v2.6.3.ps1 b/Miners/ZealotEnemy-v2.6.3.ps1 index e1831d78de..94d0e5ca4f 100644 --- a/Miners/ZealotEnemy-v2.6.3.ps1 +++ b/Miners/ZealotEnemy-v2.6.3.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Miners/lolMiner-v1.81.ps1 b/Miners/lolMiner-v1.81.ps1 index 5794fa6f57..89ddf60a56 100644 --- a/Miners/lolMiner-v1.81.ps1 +++ b/Miners/lolMiner-v1.81.ps1 @@ -8,7 +8,7 @@ the Free Software Foundation, either version 3 of the License, or NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -17,7 +17,7 @@ along with this program. If not, see . <# Product: NemosMiner -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/NemosMiner.ps1 b/NemosMiner.ps1 index 9e255043a7..1d0f5987bc 100644 --- a/NemosMiner.ps1 +++ b/NemosMiner.ps1 @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: NemosMiner File: NemosMiner.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> @@ -295,7 +295,7 @@ $Variables.Branding = [PSCustomObject]@{ BrandName = "NemosMiner" BrandWebSite = "https://nemosminer.com" ProductLabel = "NemosMiner" - Version = [System.Version]"5.0.2.4" + Version = [System.Version]"5.0.2.5" } $WscriptShell = New-Object -ComObject Wscript.Shell @@ -493,9 +493,9 @@ If ((Get-Content -Path ".\Cache\DriverVersion.json" | ConvertFrom-Json | Convert $Variables.VerthashDatPath = ".\Cache\VertHash.dat" If (Test-Path -LiteralPath $Variables.VerthashDatPath -PathType Leaf) { Write-Message -Level Verbose "Verifying integrity of VertHash data file '$($Variables.VerthashDatPath)'..." - $VertHashDatCheckJob = Start-Job -ScriptBlock { (Get-FileHash -Path ".\Cache\VertHash.dat").Hash -eq "A55531E843CD56B010114AAF6325B0D529ECF88F8AD47639B6EDEDAFD721AA48" } - $VertHashDatCheckJob = Start-ThreadJob -ScriptBlock { (Get-FileHash -Path ".\Cache\VertHash.dat").Hash -eq "A55531E843CD56B010114AAF6325B0D529ECF88F8AD47639B6EDEDAFD721AA48" } -StreamingHost $null -ThrottleLimit (2 * $Variables.Devices.Count + 1) } +# Alwas run thread job to set throttle limit +$VertHashDatCheckJob = Start-ThreadJob -ScriptBlock { (Get-FileHash -Path ".\Cache\VertHash.dat").Hash -eq "A55531E843CD56B010114AAF6325B0D529ECF88F8AD47639B6EDEDAFD721AA48" } -StreamingHost $null -ThrottleLimit (2 * $Variables.Devices.Count + 2) # Start API server If ($Config.WebGUI) { Start-APIServer } @@ -503,15 +503,16 @@ If ($Config.WebGUI) { Start-APIServer } # Rename existing switching log If (Test-Path -LiteralPath ".\Logs\SwitchingLog.csv" -PathType Leaf) { Get-ChildItem -Path ".\Logs\SwitchingLog.csv" -File | Rename-Item -NewName { "SwitchingLog$($_.LastWriteTime.toString('_yyyy-MM-dd_HH-mm-ss')).csv" } } -If (Test-Path -LiteralPath $Variables.VerthashDatPath -PathType Leaf) { - If ($VertHashDatCheckJob | Wait-Job -Timeout 60 | Receive-Job -Wait -AutoRemoveJob) { - Write-Message -Level Verbose "VertHash data file integrity check: OK." - } - Else { +If ($VertHashDatCheckJob | Wait-Job -Timeout 60 | Receive-Job -Wait -AutoRemoveJob) { + Write-Message -Level Verbose "VertHash data file integrity check: OK." +} +Else { + If (Test-Path -LiteralPath $Variables.VerthashDatPath -PathType Leaf -ErrorAction Ignore) { Remove-Item -Path $Variables.VerthashDatPath -Force Write-Message -Level Warn "VertHash data file '$($Variables.VerthashDatPath)' is corrupt -> file deleted. It will be re-downloaded if needed." } } +Remove-Variable VertHashDatCheckJob If ($Variables.FreshConfig) { $Variables.Summary = "Change your settings and apply the configuration.
Then Click the 'Start mining' button." @@ -664,7 +665,7 @@ Function MainLoop { } "f" { $Variables.ShowPoolFee = -not $Variables.ShowPoolFee - Write-Host "'Pool "-NoNewline; Write-Host "f" -ForegroundColor Cyan -NoNewline; Write-Host "ees' column visibility set to " -NoNewline; If ($Variables.ShowPoolFee) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "." + Write-Host "'Pool "-NoNewline; Write-Host "F" -ForegroundColor Cyan -NoNewline; Write-Host "ees' column visibility set to " -NoNewline; If ($Variables.ShowPoolFee) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "." Start-Sleep -Seconds 2 $Variables.RefreshNeeded = $true Break @@ -851,7 +852,7 @@ Function MainLoop { If ($Variables.ShowEarning) { @{ Label = "Earning"; Expression = { If ([Double]::IsNaN($_.Earning)) { "n/a" } Else { "{0:n$($Config.DecimalsMax)}" -f ($_.Earning * $Variables.Rates.BTC.($Config.MainCurrency)) } }; Align = "right" } } If ($Config.IgnorePowerCost -and $Variables.ShowProfitBias -and $Config.CalculatePowerCost -and $Variables.MiningPowerCost) { @{ Label = "ProfitBias"; Expression = { If ([Double]::IsNaN($_.Profit_Bias)) { "n/a" } Else { "{0:n$($Config.DecimalsMax)}" -f ($_.Profit_Bias * $Variables.Rates.BTC.($Config.MainCurrency)) } }; Align = "right" } } If ($Config.IgnorePowerCost -and $Variables.ShowProfit -and $Config.CalculatePowerCost -and $Variables.MiningPowerCost) { @{ Label = "Profit"; Expression = { If ([Double]::IsNaN($_.Profit)) { "n/a" } Else { "{0:n$($Config.DecimalsMax)}" -f ($_.Profit * $Variables.Rates.BTC.($Config.MainCurrency)) } }; Align = "right" } } - If ($Variables.ShowPowerConsumption -and $Config.CalculatePowerCost) { @{ Label = "PowerConsumption"; Expression = { If (-not $_.MeasurePowerConsumption) { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "$($_.PowerConsumption.ToString("N2")) W"} } Else { If ($_.Status -eq "Running") { "Measuring..." } Else { "Unmeasured" } } }; Align = "right" } } + If ($Variables.ShowPowerConsumption -and $Config.CalculatePowerCost) { @{ Label = "Power Consumption"; Expression = { If (-not $_.MeasurePowerConsumption) { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "$($_.PowerConsumption.ToString("N2")) W"} } Else { If ($_.Status -eq "Running") { "Measuring..." } Else { "Unmeasured" } } }; Align = "right" } } If ($Variables.ShowPowerCost -and $Config.CalculatePowerCost -and $Variables.MiningPowerCost) { @{ Label = "PowerCost"; Expression = { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "-{0:n$($Config.DecimalsMax)}" -f ($_.PowerCost * $Variables.Rates.($Config.PayoutCurrency).($Config.MainCurrency)) } }; Align = "right" } } If ($Variables.ShowAccuracy) { @{ Label = "Accuracy"; Expression = { $_.Workers.Pool.Accuracy.ForEach({ "{0:P0}" -f [Double]$_ }) }; Align = "right" } } @{ Label = "Algorithm"; Expression = { $_.Workers.Pool.Algorithm -join ' & ' } } @@ -859,7 +860,7 @@ Function MainLoop { If ($Variables.ShowPool) { @{ Label = "Pool"; Expression = { $_.Workers.Pool.Name -join ' & ' } } } If ($Variables.ShowUser) { @{ Label = "User"; Expression = { $_.Workers.Pool.User -join ' & ' } } } If ($Variables.ShowPoolFee -and ($Variables.Miners.Workers.Pool.Fee)) { @{ Label = "Fee"; Expression = { $_.Workers.Pool.Fee.ForEach({ "{0:P2}" -f [Double]$_ }) }; Align = "right" } } - @{ Label = "Hashrate"; Expression = { If (-not $_.Benchmark) { $_.Workers.ForEach({ "$($_.Hashrate | ConvertTo-Hash)/s" }) } Else { If ($_.Status -eq "Running") { "Benchmarking..." } Else { "Benchmark pending" } } }; Align = "right" } + @{ Label = "Hashrate"; Expression = { If (-not $_.Benchmark) { $_.Workers.ForEach({ $_.Hashrate | ConvertTo-Hash }) } Else { If ($_.Status -eq "Running") { "Benchmarking..." } Else { "Benchmark pending" } } }; Align = "right" } If ($Variables.ShowCurrency) { @{ Label = "Currency"; Expression = { If ($_.Workers.Pool.Currency) { $_.Workers.Pool.Currency } } } } If ($Variables.ShowCoinName) { @{ Label = "CoinName"; Expression = { If ($_.Workers.Pool.CoinName) { $_.Workers.Pool.CoinName } } } } ) @@ -896,7 +897,7 @@ Function MainLoop { If ($Variables.MinersBestPerDevice_Combo) { Write-Host "`nRunning $(If ($Variables.MinersBestPerDevice_Combo.Count -eq 1) { "miner:" } Else { "miners: $($Variables.MinersBestPerDevice_Combo.Count)" })" [System.Collections.ArrayList]$Miner_Table = @( - @{ Label = "Hashrate(s)"; Expression = { (($_.Hashrates_Live.ForEach({ If ([Double]::IsNaN($_)) { "n/a" } Else { "$($_ | ConvertTo-Hash)/s" } })) -join ' & ') -replace '\s+', ' ' }; Align = "right" } + @{ Label = "Hashrate("; Expression = { $_.Hashrates_Live.ForEach({ If ([Double]::IsNaN($_)) { "n/a" } Else { $_ | ConvertTo-Hash } }) -join ' & ' }; Align = "right" } If ($Config.CalculatePowerCost -and $Variables.ShowPowerConsumption) { @{ Label = "Power Consumption"; Expression = { If ([Double]::IsNaN($_.PowerConsumption_Live)) { "n/a" } Else { "$($_.PowerConsumption_Live.ToString("N2")) W" } }; Align = "right" } } @{ Label = "Active (this run)"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f (([DateTime]::Now).ToUniversalTime() - $_.BeginTime) } } @{ Label = "Active (total)"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f ($_.TotalMiningDuration) } } @@ -910,12 +911,12 @@ Function MainLoop { } If ($Variables.UIStyle -eq "full" -or $Variables.MinersNeedingBenchmark -or $Variables.MinersNeedingPowerConsumptionMeasurement) { - If ($ProcessesIdle = @($Variables.Miners.Where({ $_.Activated -and $_.Status -eq "Idle" -and $_.GetActiveLast().ToLocalTime().AddHours(24) -gt ([DateTime]::Now) }))) { + If ($ProcessesIdle = @($Variables.Miners.Where({ $_.Activated -and $_.Status -eq "Idle" -and $_.GetActiveLast().ToLocalTime().AddHours(24) -gt [DateTime]::Now }))) { Write-Host "$($ProcessesIdle.Count) previously executed miner$(If ($ProcessesIdle.Count -ne 1) { "s" }) in the past 24 hrs:" [System.Collections.ArrayList]$Miner_Table = @( - @{ Label = "Hashrate(s)"; Expression = { (($_.Workers.Hashrate.ForEach({ "$($_ | ConvertTo-Hash)/s" })) -join ' & ') -replace '\s+', ' ' }; Align = "right" } + @{ Label = "Hashrate"; Expression = { $_.Workers.Hashrate.ForEach({ $_ | ConvertTo-Hash }) -join ' & ' }; Align = "right" } If ($Config.CalculatePowerCost -and $Variables.ShowPowerConsumption) { @{ Label = "Power Consumption"; Expression = { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "$($_.PowerConsumption.ToString("N2")) W" } }; Align = "right" } } - @{ Label = "Time since last run"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f $(([DateTime]::Now) - $_.GetActiveLast().ToLocalTime()) } } + @{ Label = "Time since last run"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f $([DateTime]::Now - $_.GetActiveLast().ToLocalTime()) } } @{ Label = "Active (total)"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f $_.TotalMiningDuration } } @{ Label = "Cnt"; Expression = { Switch ($_.Activated) { 0 { "Never" } 1 { "Once" } Default { "$_" } } } } @{ Label = "Device(s)"; Expression = { $_.DeviceNames -join ',' } } @@ -927,12 +928,12 @@ Function MainLoop { } Remove-Variable ProcessesIdle - If ($ProcessesFailed = @($Variables.Miners.Where({ $_.Activated -and $_.Status -eq "Failed" -and $_.GetActiveLast().ToLocalTime().AddHours(24) -gt ([DateTime]::Now)}))) { + If ($ProcessesFailed = @($Variables.Miners.Where({ $_.Activated -and $_.Status -eq "Failed" -and $_.GetActiveLast().ToLocalTime().AddHours(24) -gt [DateTime]::Now }))) { Write-Host -ForegroundColor Red "$($ProcessesFailed.Count) failed $(If ($ProcessesFailed.Count -eq 1) { "miner" } Else { "miners" }) in the past 24 hrs:" [System.Collections.ArrayList]$Miner_Table = @( - @{ Label = "Hashrate(s)"; Expression = { (($_.Workers.Hashrate.ForEach({ "$($_ | ConvertTo-Hash)/s" })) -join ' & ') -replace '\s+', ' ' }; Align = "right" } + @{ Label = "Hashrate"; Expression = { $_.Workers.Hashrate.ForEach({ $_ | ConvertTo-Hash }) -join ' & ' }; Align = "right" } If ($Config.CalculatePowerCost -and $Variables.ShowPowerConsumption) { @{ Label = "Power Consumption"; Expression = { If ([Double]::IsNaN($_.PowerConsumption)) { "n/a" } Else { "$($_.PowerConsumption.ToString("N2")) W" } }; Align = "right" } } - @{ Label = "Time since last fail"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f $(([DateTime]::Now) - $_.GetActiveLast().ToLocalTime()) } } + @{ Label = "Time since last fail"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f $([DateTime]::Now - $_.GetActiveLast().ToLocalTime()) } } @{ Label = "Active (total)"; Expression = { "{0:dd}d {0:hh}h {0:mm}m {0:ss}s" -f $_.TotalMiningDuration } } @{ Label = "Cnt"; Expression = { Switch ($_.Activated) { 0 { "Never" } 1 { "Once" } Default { "$_" } } } } @{ Label = "Device(s)"; Expression = { $_.DeviceNames -join ',' } } @@ -940,6 +941,7 @@ Function MainLoop { @{ Label = "Command"; Expression = { $_.CommandLine } } ) $ProcessesFailed | Sort-Object { If ($_.Process) { $_.Process.StartTime } Else { [DateTime]0 } } | Format-Table $Miner_Table -Wrap | Out-Host + Remove-Variable Miner_Table } Remove-Variable ProcessesFailed diff --git a/Pools/HashCryptos.ps1 b/Pools/HashCryptos.ps1 index 758180d66e..67e987e6d7 100644 --- a/Pools/HashCryptos.ps1 +++ b/Pools/HashCryptos.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\HashCryptos.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/HiveON.ps1 b/Pools/HiveON.ps1 index faf2be88fe..34a60b0bf0 100644 --- a/Pools/HiveON.ps1 +++ b/Pools/HiveON.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\Hiveon.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/MiningDutch.ps1 b/Pools/MiningDutch.ps1 index cad1dffa81..ab4607ad5c 100644 --- a/Pools/MiningDutch.ps1 +++ b/Pools/MiningDutch.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\MiningDutch.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/MiningPoolHub.ps1 b/Pools/MiningPoolHub.ps1 index b106807c5f..0a927120da 100644 --- a/Pools/MiningPoolHub.ps1 +++ b/Pools/MiningPoolHub.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\MiningPoolHub.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/NiceHash.ps1 b/Pools/NiceHash.ps1 index d1959c1a4f..97118db8b2 100644 --- a/Pools/NiceHash.ps1 +++ b/Pools/NiceHash.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\NiceHash.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/ProHashing.ps1 b/Pools/ProHashing.ps1 index 4fc86a3694..1313d37c03 100644 --- a/Pools/ProHashing.ps1 +++ b/Pools/ProHashing.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\ProHashing.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/ZPool.ps1 b/Pools/ZPool.ps1 index 939abbdf35..8a63e97bae 100644 --- a/Pools/ZPool.ps1 +++ b/Pools/ZPool.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\ZPool.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Pools/ZergPool.ps1 b/Pools/ZergPool.ps1 index bdc0df3ccb..5d8c3ccc98 100644 --- a/Pools/ZergPool.ps1 +++ b/Pools/ZergPool.ps1 @@ -19,7 +19,7 @@ along with this program. If not, see . <# Product: NemosMiner File: \Pools\ZergPool.ps1 -Version: 5.0.2.4 +Version: 5.0.2.5 Version date: 2023/12/20 #> diff --git a/Version.txt b/Version.txt index 82720acb89..bffc466071 100644 --- a/Version.txt +++ b/Version.txt @@ -1,6 +1,6 @@ { "Product": "NemosMiner", - "Version": "5.0.2.4", + "Version": "5.0.2.5", "AutoUpdate": true, "RequireRestart": true, "Uri": "https://github.com/Minerx117/NemosMiner/archive/refs/heads/master.zip", diff --git a/Web/APIdocs.html b/Web/APIdocs.html index 130fef805b..80b8a3930b 100644 --- a/Web/APIdocs.html +++ b/Web/APIdocs.html @@ -7,7 +7,7 @@ NemosMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License @@ -16,7 +16,7 @@ Product: NemosMiner File: API.psm1 -version: 5.0.2.4 +version: 5.0.2.5 version date: 2023/12/20--> @@ -274,7 +274,7 @@

Functions


/functions/config/set
Write full config
Parameters: full config (JSON) -
e.g.: /functions/config/set?{"Algorithm"%3A%5B%5D%2C"APILogfile"%3A""%2C"APIPort"%3A3999%2C"AutoReboot"%3Atrue%2C"AutoUpdate"%3Atrue%2C"AutoUpdateCheckInterval"%3A1%2C"BackupOnAutoUpdate"%3Atrue%2C"BadShareRatioThreshold"%3A0.05%2C"BalancesKeepAlive"%3Atrue%2C"BalancesShowInAllCurrencies"%3Atrue%2C"BalancesTrackerExcludePool"%3A%5B%5D%2C"BalancesTrackerLog"%3Afalse%2C"BalancesTrackerPollInterval"%3A10%2C"CalculatePowerCost"%3Atrue%2C"ConfigFileVersion"%3A"5.0.2.4"%2C"CPUMinerProcessPriority"%3A-2%2C"Currency"%3A"CHF"%2C"DecimalsMax"%3A6%2C"Delay"%3A0%2C"DisableDualAlgoMining"%3Afalse%2C"DisableMinerFee"%3Afalse%2C"DisableMinersWithFee"%3Afalse%2C"DisableSingleAlgoMining"%3Afalse%2C"Donate"%3A13%2C"EarningsAdjustmentFactor"%3A1%2C"ExcludeDeviceName"%3A%5B%5D%2C"ExcludeMinerName"%3A%5B%5D%2C"ExtraCurrencies"%3A%5B"ETC"%2C"ETH"%2C"mBTC"%5D%2C"GPUMinerProcessPriority"%3A-1%2C"IdleDetection"%3Afalse%2C"IdleSec"%3A120%2C"IgnoreMinerFee"%3Afalse%2C"IgnorePoolFee"%3Afalse%2C"IgnorePowerCost"%3Afalse%2C"Interval"%3A90%2C"LogBalanceAPIResponse"%3Afalse%2C"LogToFile"%3A%5B"Info"%2C"Warn"%2C"Error"%2C"Verbose"%5D%2C"LogToScreen"%3A%5B"Info"%2C"Warn"%2C"Error"%2C"Verbose"%5D%2C"MinAccuracy"%3A0.5%2C"MinDataSample"%3A20%2C"MinDataSampleAlgoMultiplier"%3A{"X16r"%3A3}%2C"MinerInstancePerDeviceModel"%3Afalse%2C"MinerSet"%3A1%2C"MinerSwitchingThreshold"%3A10%2C"MinerWindowStyle"%3A"minimized"%2C"MinerWindowStyleNormalWhenBenchmarking"%3Atrue%2C"MiningPoolHubAPIKey"%3A""%2C"MiningPoolHubUserName"%3A"Nemo"%2C"MinInterval"%3A1%2C"MinWorker"%3A25%2C"MonitoringServer"%3A"https%3A%2F%2Fnemosminer.com"%2C"MonitoringUser"%3A""%2C"NiceHashAPIKey"%3A""%2C"NiceHashAPISecret"%3A""%2C"NiceHashOrganizationId"%3A""%2C"NiceHashWallet"%3A""%2C"NiceHashWalletIsInternal"%3Afalse%2C"OpenFirewallPorts"%3Atrue%2C"PayoutCurrency"%3A"BTC"%2C"PoolAPIAllowedFailureCount"%3A3%2C"PoolAPIRetryInterval"%3A3%2C"PoolAPITimeout"%3A20%2C"PoolName"%3A%5B"MiningPoolHubCoins"%2C"NiceHash"%5D%2C"PoolsConfigFile"%3A".%5C%5CConfig%5C%5CPoolsConfig.json"%2C"PoolTimeout"%3A20%2C"PowerPricekWh"%3A{"00%3A00"%3A0.26%2C"12%3A00"%3A0.3}%2C"PowerUsage"%3A{}%2C"PowerUsageIdleSystemW"%3A60%2C"ProfitabilityThreshold"%3A-99%2C"ProHashingAPIKey"%3A""%2C"ProHashingMiningMode"%3A"PPS"%2C"ProHashingUserName"%3A"UselessGuru"%2C"Proxy"%3A""%2C"Region"%3A"Europe"%2C"ReportToServer"%3Afalse%2C"ShowAccuracy"%3Atrue%2C"ShowAllMiners"%3Afalse%2C"ShowChangeLog"%3Afalse%2C"ShowCoinName"%3Atrue%2C"ShowCurrency"%3Atrue%2C"ShowEarning"%3Atrue%2C"ShowEarningBias"%3Atrue%2C"ShowMinerFee"%3Atrue%2C"ShowPoolBalances"%3Afalse%2C"ShowPoolFee"%3Atrue%2C"ShowPowerCost"%3Atrue%2C"ShowPowerUsage"%3Atrue%2C"ShowProfit"%3Atrue%2C"ShowProfitBias"%3Atrue%2C"ShowUser"%3Afalse%2C"ShowWorkerStatus"%3Atrue%2C"SnakeTailConfig"%3A".%5C%5CUtils%5C%5CNemosMiner_LogReader.xml"%2C"SnakeTailExe"%3A".%5C%5CUtils%5C%5CSnakeTail.exe"%2C"SSL"%3A"prefer"%2C"StartGUIMinimized"%3Atrue%2C"StartupMode"%3A"Idle"%2C"SubtractBadShares"%3Atrue%2C"SyncWindow"%3A3%2C"Transcript"%3Afalse%2C"UIStyle"%3A"light"%2C"UnrealMinerEarningFactor"%3A5%2C"UnrealPoolPriceFactor"%3A1.5%2C"UseAnycast"%3Atrue%2C"UsemBTC"%3Atrue%2C"UseMinerTweaks"%3Afalse%2C"Wallets"%3A{"BTC"%3A"1GPSq8txFnyrYdXL8t6S94mYdF8cGqVQJF"%2C"ETC"%3A""%2C"ETH"%3A""}%2C"Watchdog"%3Atrue%2C"WatchdogCount"%3A3%2C"WebGUI"%3Atrue%2C"UseColorForMinerStatus"%3Atrue%2C"WorkerName"%3A"BLACKBOX"} +
e.g.: /functions/config/set?{"Algorithm"%3A%5B%5D%2C"APILogfile"%3A""%2C"APIPort"%3A3999%2C"AutoReboot"%3Atrue%2C"AutoUpdate"%3Atrue%2C"AutoUpdateCheckInterval"%3A1%2C"BackupOnAutoUpdate"%3Atrue%2C"BadShareRatioThreshold"%3A0.05%2C"BalancesKeepAlive"%3Atrue%2C"BalancesShowInAllCurrencies"%3Atrue%2C"BalancesTrackerExcludePool"%3A%5B%5D%2C"BalancesTrackerLog"%3Afalse%2C"BalancesTrackerPollInterval"%3A10%2C"CalculatePowerCost"%3Atrue%2C"ConfigFileVersion"%3A"5.0.2.5"%2C"CPUMinerProcessPriority"%3A-2%2C"Currency"%3A"CHF"%2C"DecimalsMax"%3A6%2C"Delay"%3A0%2C"DisableDualAlgoMining"%3Afalse%2C"DisableMinerFee"%3Afalse%2C"DisableMinersWithFee"%3Afalse%2C"DisableSingleAlgoMining"%3Afalse%2C"Donate"%3A13%2C"EarningsAdjustmentFactor"%3A1%2C"ExcludeDeviceName"%3A%5B%5D%2C"ExcludeMinerName"%3A%5B%5D%2C"ExtraCurrencies"%3A%5B"ETC"%2C"ETH"%2C"mBTC"%5D%2C"GPUMinerProcessPriority"%3A-1%2C"IdleDetection"%3Afalse%2C"IdleSec"%3A120%2C"IgnoreMinerFee"%3Afalse%2C"IgnorePoolFee"%3Afalse%2C"IgnorePowerCost"%3Afalse%2C"Interval"%3A90%2C"LogBalanceAPIResponse"%3Afalse%2C"LogToFile"%3A%5B"Info"%2C"Warn"%2C"Error"%2C"Verbose"%5D%2C"LogToScreen"%3A%5B"Info"%2C"Warn"%2C"Error"%2C"Verbose"%5D%2C"MinAccuracy"%3A0.5%2C"MinDataSample"%3A20%2C"MinDataSampleAlgoMultiplier"%3A{"X16r"%3A3}%2C"MinerInstancePerDeviceModel"%3Afalse%2C"MinerSet"%3A1%2C"MinerSwitchingThreshold"%3A10%2C"MinerWindowStyle"%3A"minimized"%2C"MinerWindowStyleNormalWhenBenchmarking"%3Atrue%2C"MiningPoolHubAPIKey"%3A""%2C"MiningPoolHubUserName"%3A"Nemo"%2C"MinInterval"%3A1%2C"MinWorker"%3A25%2C"MonitoringServer"%3A"https%3A%2F%2Fnemosminer.com"%2C"MonitoringUser"%3A""%2C"NiceHashAPIKey"%3A""%2C"NiceHashAPISecret"%3A""%2C"NiceHashOrganizationId"%3A""%2C"NiceHashWallet"%3A""%2C"NiceHashWalletIsInternal"%3Afalse%2C"OpenFirewallPorts"%3Atrue%2C"PayoutCurrency"%3A"BTC"%2C"PoolAPIAllowedFailureCount"%3A3%2C"PoolAPIRetryInterval"%3A3%2C"PoolAPITimeout"%3A20%2C"PoolName"%3A%5B"MiningPoolHubCoins"%2C"NiceHash"%5D%2C"PoolsConfigFile"%3A".%5C%5CConfig%5C%5CPoolsConfig.json"%2C"PoolTimeout"%3A20%2C"PowerPricekWh"%3A{"00%3A00"%3A0.26%2C"12%3A00"%3A0.3}%2C"PowerUsage"%3A{}%2C"PowerUsageIdleSystemW"%3A60%2C"ProfitabilityThreshold"%3A-99%2C"ProHashingAPIKey"%3A""%2C"ProHashingMiningMode"%3A"PPS"%2C"ProHashingUserName"%3A"UselessGuru"%2C"Proxy"%3A""%2C"Region"%3A"Europe"%2C"ReportToServer"%3Afalse%2C"ShowAccuracy"%3Atrue%2C"ShowAllMiners"%3Afalse%2C"ShowChangeLog"%3Afalse%2C"ShowCoinName"%3Atrue%2C"ShowCurrency"%3Atrue%2C"ShowEarning"%3Atrue%2C"ShowEarningBias"%3Atrue%2C"ShowMinerFee"%3Atrue%2C"ShowPoolBalances"%3Afalse%2C"ShowPoolFee"%3Atrue%2C"ShowPowerCost"%3Atrue%2C"ShowPowerUsage"%3Atrue%2C"ShowProfit"%3Atrue%2C"ShowProfitBias"%3Atrue%2C"ShowUser"%3Afalse%2C"ShowWorkerStatus"%3Atrue%2C"SnakeTailConfig"%3A".%5C%5CUtils%5C%5CNemosMiner_LogReader.xml"%2C"SnakeTailExe"%3A".%5C%5CUtils%5C%5CSnakeTail.exe"%2C"SSL"%3A"prefer"%2C"StartGUIMinimized"%3Atrue%2C"StartupMode"%3A"Idle"%2C"SubtractBadShares"%3Atrue%2C"SyncWindow"%3A3%2C"Transcript"%3Afalse%2C"UIStyle"%3A"light"%2C"UnrealMinerEarningFactor"%3A5%2C"UnrealPoolPriceFactor"%3A1.5%2C"UseAnycast"%3Atrue%2C"UsemBTC"%3Atrue%2C"UseMinerTweaks"%3Afalse%2C"Wallets"%3A{"BTC"%3A"1GPSq8txFnyrYdXL8t6S94mYdF8cGqVQJF"%2C"ETC"%3A""%2C"ETH"%3A""}%2C"Watchdog"%3Atrue%2C"WatchdogCount"%3A3%2C"WebGUI"%3Atrue%2C"UseColorForMinerStatus"%3Atrue%2C"WorkerName"%3A"BLACKBOX"}

/functions/file/edit @@ -339,7 +339,7 @@

Functions


/functions/stat/set
Set miner hashrate value, not useful for pool stats:
Parameters: (JSON, pool list as array, requires properties Name=StatName, Algorithm=Algorithm(s), Type=Hashrate, Value (0=failed; -1=disabled)) -
e.g.: /functions/stat/set?Miners%3D%5B{"Name"%3A"SRBMinerMulti-v2.4.3-1xRadeonRX5700XT8GB"%2C"Algorithms"%3A%5B"Argon2d16000"%5D}%5D%26Type%3DHashrate%26Value%3D-1 +
e.g.: /functions/stat/set?Miners%3D%5B{"Name"%3A"SRBMinerMulti-v2.4.4-1xRadeonRX5700XT8GB"%2C"Algorithms"%3A%5B"Argon2d16000"%5D}%5D%26Type%3DHashrate%26Value%3D-1

/functions/pool/enable
Enable disabled pool diff --git a/Web/parts/head.html b/Web/parts/head.html index 34834e010a..60e2000d2a 100644 --- a/Web/parts/head.html +++ b/Web/parts/head.html @@ -279,11 +279,11 @@