diff --git a/Balances/HashCryptos.ps1 b/Balances/HashCryptos.ps1 index 86b074c7..39c22492 100644 --- a/Balances/HashCryptos.ps1 +++ b/Balances/HashCryptos.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\HashCryptos.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Balances/HiveON.ps1 b/Balances/HiveON.ps1 index 96fcda3a..69dc52af 100644 --- a/Balances/HiveON.ps1 +++ b/Balances/HiveON.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\Hiveon.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Balances/MiningDutch.ps1 b/Balances/MiningDutch.ps1 index 779a3c2f..35eb7da0 100644 --- a/Balances/MiningDutch.ps1 +++ b/Balances/MiningDutch.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\MiningDutch.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Balances/MiningPoolHub.ps1 b/Balances/MiningPoolHub.ps1 index 7cbce34b..fc2dec93 100644 --- a/Balances/MiningPoolHub.ps1 +++ b/Balances/MiningPoolHub.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\MiningPoolHub.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Balances/NiceHash.ps1 b/Balances/NiceHash.ps1 index f4296dee..47c5058f 100644 --- a/Balances/NiceHash.ps1 +++ b/Balances/NiceHash.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\NiceHash.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If ($Config.NiceHashWallet) { diff --git a/Balances/ProHashing.ps1 b/Balances/ProHashing.ps1 index 84a89fc0..d1ddb844 100644 --- a/Balances/ProHashing.ps1 +++ b/Balances/ProHashing.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\ProHashing.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Balances/ZergPool.ps1 b/Balances/ZergPool.ps1 index 0b75f85d..9f89a3f5 100644 --- a/Balances/ZergPool.ps1 +++ b/Balances/ZergPool.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\ZergPool.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Balances/Zpool.ps1 b/Balances/Zpool.ps1 index 4375181a..dc395795 100644 --- a/Balances/Zpool.ps1 +++ b/Balances/Zpool.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Balances\Zpool.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName diff --git a/Brains/HashCryptos.ps1 b/Brains/HashCryptos.ps1 index 8cc633ba..d88e773a 100644 --- a/Brains/HashCryptos.ps1 +++ b/Brains/HashCryptos.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Brains\MiningDutch.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module ..\Includes\Include.psm1 diff --git a/Brains/MiningDutch.ps1 b/Brains/MiningDutch.ps1 index 0d2ef5f1..03aed9ad 100644 --- a/Brains/MiningDutch.ps1 +++ b/Brains/MiningDutch.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Brains\MiningDutch.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module ..\Includes\Include.psm1 diff --git a/Brains/ProHashing.ps1 b/Brains/ProHashing.ps1 index 09c67284..ee4fd1cb 100644 --- a/Brains/ProHashing.ps1 +++ b/Brains/ProHashing.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Brains\ProHashing.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module ..\Includes\Include.psm1 diff --git a/Brains/ZPool.ps1 b/Brains/ZPool.ps1 index 56c15156..655652c3 100644 --- a/Brains/ZPool.ps1 +++ b/Brains/ZPool.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Brains\ZPool.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module ..\Includes\Include.psm1 diff --git a/Brains/ZergPool.ps1 b/Brains/ZergPool.ps1 index 4a3c36bb..dde44ca3 100644 --- a/Brains/ZergPool.ps1 +++ b/Brains/ZergPool.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Brains\ZergPool.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module ..\Includes\Include.psm1 diff --git a/Changelog.txt b/Changelog.txt index b23dd090..6ffbcefb 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,6 +3,25 @@ Known issues: - UG-Miner has issues with new Windows Terminal when the default terminal application is set to 'Let windows decide' or 'Windows Terminal'. -> It is recommended to set it to 'Windows Console Host' +Changelog UG-Miner 6.3.23 2025/01/01 +==================================== + +Fixes: +- Core: Environment variables not set in miner process +- Core: Gone miners not stopping in some scenarios + +Improvements: +- Remove obsolete code & minor code optimizations + +Miner updates: +- BzMiner-v22.0.0 +- JayddeeCpu-v24.8 +- lolMiner-v1.93 +- MiniZ-v2.4e +- SRBMinerMulti-v2.7.4 +- Wildrig-v0.41.9 (keep Wildrig-v0.41.7 for old algorithms) + + Changelog UG-Miner 6.3.22 2024/12/21 ==================================== diff --git a/Data/Algorithms.json b/Data/Algorithms.json index 7fdfaca8..4b9d1e93 100644 --- a/Data/Algorithms.json +++ b/Data/Algorithms.json @@ -15,6 +15,7 @@ "argon2wkrz": "Argon2WKZR", "astralhash": "AstralHash", "astrixhash": "AstrixHash", + "astrobwtv3": "AstroBWTv3", "autolykos": "Autolykos2", "bcd": "BCD", "beamv2": "BeamV2", @@ -186,6 +187,7 @@ "neoscrypt": "Neoscrypt", "neoscryptxaya": "NeoscryptXaya", "novo": "SHA256dt", + "nxlhash": "NxlHash", "obtc": "HeavyHash", "octa": "OctaSpace", "octaspace": "OctaSpace", diff --git a/Data/CoinNames.json b/Data/CoinNames.json index 763e7b89..b75bdc14 100644 --- a/Data/CoinNames.json +++ b/Data/CoinNames.json @@ -15,6 +15,7 @@ "AVN": "Avian", "BBC": "Baba", "BBTC": "BlakeBitcoin", + "BCA": "Atom", "BCH": "Bitcash", "BEAM": "Beam", "BEL": "Bells", @@ -52,6 +53,7 @@ "CURVE": "Curve", "CY": "Cyberyen", "DASH": "Dash", + "DERO": "Dero", "DGB": "Digibyte", "DGC": "Digital", "DIAC": "Diabase", @@ -157,7 +159,7 @@ "NMC": "Name", "NTL": "Nautilus", "NVOL": "Nvolve", - "NXL": "NexelAi", + "NXL": "NexellAi", "NYC": "Newyork", "OBTC": "Optical", "OCTA": "Octaspace", diff --git a/Data/CurrencyAlgorithm.json b/Data/CurrencyAlgorithm.json index d334b11e..34b4a58a 100644 --- a/Data/CurrencyAlgorithm.json +++ b/Data/CurrencyAlgorithm.json @@ -93,6 +93,7 @@ "DBIX": "Ethash", "DCR": "Decred", "DEM": "SHA256", + "DERO": "AstroBWTv3", "DGB": "Qubit", "DGC": "Scrypt", "DIAC": "X11", @@ -254,7 +255,7 @@ "NUKO": "Ethash", "NVC": "Scrypt", "NVOL": "KeccakC", - "NXL": "Heavyhashkaspa", + "NXL": "NxlHash", "NYC": "Scrypt", "NYX": "Neoscrypt", "OBN": "Scrypt", diff --git a/Data/DagData.json b/Data/DagData.json index 797b3ecf..477e99b0 100644 --- a/Data/DagData.json +++ b/Data/DagData.json @@ -1,7 +1,7 @@ { "Algorithm": { "Autolykos2": { - "BlockHeight": 1421911, + "BlockHeight": 1429732, "CoinName": [ "Ergo" ], @@ -9,65 +9,65 @@ "ERG" ], "DAGsize": 4541157915, - "Epoch": 983 + "Epoch": 991 }, "EtcHash": { - "BlockHeight": 21316669, + "BlockHeight": 21386695, "CoinName": [ "EthereumClassic" ], "Currency": [ "ETC" ], - "DAGsize": 4068472448, - "Epoch": 357 + "DAGsize": 4076862848, + "Epoch": 358 }, "Ethash": { - "BlockHeight": 20912022, + "BlockHeight": 20983713, "CoinName": [ "EthereumPow" ], "Currency": [ "ETHW" ], - "DAGsize": 6937377152, - "Epoch": 699 + "DAGsize": 6954149248, + "Epoch": 701 }, "EthashB3": { - "BlockHeight": 5129715, + "BlockHeight": 5156013, "CoinName": [ "Hypra" ], "Currency": [ "HYP" ], - "DAGsize": 2516582272, - "Epoch": 172 + "DAGsize": 2524970368, + "Epoch": 173 }, "EvrProgPow": { - "BlockHeight": 1119300, + "BlockHeight": 1134966, "CoinName": [ "Evrmore" ], "Currency": [ "EVR" ], - "DAGsize": 4018141312, - "Epoch": 95 + "DAGsize": 4026530432, + "Epoch": 96 }, "FiroPow": { - "BlockHeight": 1013640, + "BlockHeight": 1020103, "CoinName": [ "Firo" ], "Currency": [ "FIRO" ], - "DAGsize": 7625244544, - "Epoch": 781 + "DAGsize": 7667187328, + "Epoch": 786 }, "FishHash": { - "BlockHeight": 882959, + "BlockHeight": 898774, "CoinName": [ "Ironfish" ], @@ -78,7 +78,7 @@ "Epoch": 448 }, "HeavyHashKarlsenV2": { - "BlockHeight": 35598597, + "BlockHeight": 36546873, "CoinName": [ "Karlsen" ], @@ -86,18 +86,18 @@ "KLS" ], "DAGsize": 4831838208, - "Epoch": 1188 + "Epoch": 1220 }, "KawPow": { - "BlockHeight": 3637851, + "BlockHeight": 3653530, "CoinName": [ "Raven" ], "Currency": [ "RVN" ], - "DAGsize": 5158993024, - "Epoch": 487 + "DAGsize": 5175769472, + "Epoch": 489 }, "MeowPow": { "BlockHeight": 971453, @@ -111,40 +111,40 @@ "Epoch": 131 }, "Octopus": { - "BlockHeight": 112088423, + "BlockHeight": 112881265, "CoinName": [ "Conflux" ], "Currency": [ "CFX" ], - "DAGsize": 7902064384, - "Epoch": 215 + "DAGsize": 7935618304, + "Epoch": 217 }, "ProgPowSero": { - "BlockHeight": 14080815, + "BlockHeight": 14152840, "CoinName": [ "Sero" ], "Currency": [ "SERO" ], - "DAGsize": 5024763776, - "Epoch": 471 + "DAGsize": 5041544576, + "Epoch": 473 }, "ProgPowTelestai": { - "BlockHeight": 200527, + "BlockHeight": 216202, "CoinName": [ "Telestai" ], "Currency": [ "TLS" ], - "DAGsize": 1224732032, - "Epoch": 18 + "DAGsize": 1241513344, + "Epoch": 20 }, "ProgPowZ": { - "BlockHeight": 2950851, + "BlockHeight": 2966579, "CoinName": [ "Zano" ], @@ -155,15 +155,15 @@ "Epoch": 100 }, "SCCpow": { - "BlockHeight": 1058236, + "BlockHeight": 1066109, "CoinName": [ "StakeCubeCoin" ], "Currency": [ "SCC" ], - "DAGsize": 3825204608, - "Epoch": 328 + "DAGsize": 3850370432, + "Epoch": 331 }, "UbqHash": { "BlockHeight": 5517628, @@ -185,36 +185,36 @@ }, "Currency": { "*": { - "BlockHeight": 112088423, + "BlockHeight": 112881265, "Currency": "*", - "DAGsize": 7902064384, - "Epoch": 1188 + "DAGsize": 7935618304, + "Epoch": 1220 }, "AIDP": { "Algorithm": "KawPow", - "BlockHeight": 341862, + "BlockHeight": 357551, "CoinName": "AiDepin", - "DAGsize": 1468006016, - "Date": "2024-12-21T08:51:26.8130292Z", - "Epoch": 47, + "DAGsize": 1484782976, + "Date": "2025-01-01T08:06:02.5815263Z", + "Epoch": 49, "Url": "https://whattomine.com/coins.json" }, "AIPG": { "Algorithm": "KawPow", - "BlockHeight": 540609, + "BlockHeight": 556304, "CoinName": "Aipowergrid", - "DAGsize": 1694497664, - "Date": "2024-12-21T08:51:26.8448738Z", - "Epoch": 74, + "DAGsize": 1711274624, + "Date": "2025-01-01T08:06:03.0552512Z", + "Epoch": 76, "Url": "https://whattomine.com/coins.json" }, "AITT": { "Algorithm": "KawPow", - "BlockHeight": 1680322, + "BlockHeight": 1742969, "CoinName": "AittCoin", - "DAGsize": 2969565568, - "Date": "2024-12-21T08:51:26.8865218Z", - "Epoch": 226, + "DAGsize": 3036675968, + "Date": "2025-01-01T08:06:03.3250942Z", + "Epoch": 234, "Url": "https://whattomine.com/coins.json" }, "AKA": { @@ -237,11 +237,11 @@ }, "ANOK": { "Algorithm": "KawPow", - "BlockHeight": 356142, + "BlockHeight": 370052, "CoinName": "Anokas", - "DAGsize": 1484782976, - "Date": "2024-12-21T08:51:26.8041429Z", - "Epoch": 49, + "DAGsize": 1501559168, + "Date": "2025-01-01T08:06:03.0634237Z", + "Epoch": 51, "Url": "https://whattomine.com/coins.json" }, "AVS": { @@ -255,20 +255,20 @@ }, "BLOCX": { "Algorithm": "Autolykos2", - "BlockHeight": 433500, + "BlockHeight": 448539, "CoinName": "Blocx", "DAGsize": 2147483648, - "Date": "2024-12-21T08:51:28.5317349Z", + "Date": "2025-01-01T08:06:05.8802322Z", "Epoch": 0, "Url": "https://api-explorer.blocxscan.com/api/getblockcount" }, "BTN": { "Algorithm": "Ethash", - "BlockHeight": 3530041, + "BlockHeight": 3603672, "CoinName": "BitnetBtn", - "DAGsize": 2071981952, - "Date": "2024-12-21T08:51:26.8750401Z", - "Epoch": 119, + "DAGsize": 2097149056, + "Date": "2025-01-01T08:06:03.244165Z", + "Epoch": 122, "Url": "https://whattomine.com/coins.json" }, "CAU": { @@ -282,11 +282,11 @@ }, "CFX": { "Algorithm": "Octopus", - "BlockHeight": 112088423, + "BlockHeight": 112881265, "CoinName": "Conflux", - "DAGsize": 7902064384, - "Date": "2024-12-21T08:51:28.1343175Z", - "Epoch": 215, + "DAGsize": 7935618304, + "Date": "2025-01-01T08:06:04.9244228Z", + "Epoch": 217, "Url": "https://prohashing.com/api/v1/currencies" }, "CLO": { @@ -300,11 +300,11 @@ }, "CLORE": { "Algorithm": "KawPow", - "BlockHeight": 1062720, + "BlockHeight": 1078389, "CoinName": "Clore", - "DAGsize": 2273312128, - "Date": "2024-12-21T08:51:26.8183938Z", - "Epoch": 143, + "DAGsize": 2290086272, + "Date": "2025-01-01T08:06:02.9706779Z", + "Epoch": 145, "Url": "https://whattomine.com/coins.json" }, "CMS": { @@ -336,11 +336,11 @@ }, "EGAZ": { "Algorithm": "EtcHash", - "BlockHeight": 6555648, + "BlockHeight": 6629216, "CoinName": "Etica", - "DAGsize": 2919234688, - "Date": "2024-12-21T08:51:26.8792982Z", - "Epoch": 220, + "DAGsize": 2936011648, + "Date": "2025-01-01T08:06:03.3015287Z", + "Epoch": 222, "Url": "https://whattomine.com/coins.json" }, "EGEM": { @@ -363,11 +363,11 @@ }, "ERG": { "Algorithm": "Autolykos2", - "BlockHeight": 1421911, + "BlockHeight": 1429732, "CoinName": "Ergo", "DAGsize": 4541157915, - "Date": "2024-12-21T08:51:28.1273349Z", - "Epoch": 983, + "Date": "2025-01-01T08:06:04.8972815Z", + "Epoch": 991, "Url": "https://prohashing.com/api/v1/currencies" }, "ESN": { @@ -381,11 +381,11 @@ }, "ETC": { "Algorithm": "EtcHash", - "BlockHeight": 21316669, + "BlockHeight": 21386695, "CoinName": "EthereumClassic", - "DAGsize": 4068472448, - "Date": "2024-12-21T08:51:28.1364479Z", - "Epoch": 357, + "DAGsize": 4076862848, + "Date": "2025-01-01T08:06:04.9291084Z", + "Epoch": 358, "Url": "https://prohashing.com/api/v1/currencies" }, "ETHF": { @@ -408,11 +408,11 @@ }, "ETHW": { "Algorithm": "Ethash", - "BlockHeight": 20912022, + "BlockHeight": 20983713, "CoinName": "EthereumPow", - "DAGsize": 6937377152, - "Date": "2024-12-21T08:51:28.1313093Z", - "Epoch": 699, + "DAGsize": 6954149248, + "Date": "2025-01-01T08:06:04.911971Z", + "Epoch": 701, "Url": "https://prohashing.com/api/v1/currencies" }, "ETNT": { @@ -435,11 +435,11 @@ }, "EVR": { "Algorithm": "EvrProgPow", - "BlockHeight": 1119300, + "BlockHeight": 1134966, "CoinName": "Evrmore", - "DAGsize": 4018141312, - "Date": "2024-12-21T08:51:28.6623878Z", - "Epoch": 95, + "DAGsize": 4026530432, + "Date": "2025-01-01T08:06:06.0571924Z", + "Epoch": 96, "Url": "https://evr.cryptoscope.io/api/getblockcount" }, "EXP": { @@ -453,11 +453,11 @@ }, "FIRO": { "Algorithm": "FiroPow", - "BlockHeight": 1013640, + "BlockHeight": 1020103, "CoinName": "Firo", - "DAGsize": 7625244544, - "Date": "2024-12-21T08:51:26.8342543Z", - "Epoch": 781, + "DAGsize": 7667187328, + "Date": "2025-01-01T08:06:03.0226476Z", + "Epoch": 786, "Url": "https://whattomine.com/coins.json" }, "FLORA": { @@ -471,11 +471,11 @@ }, "FREN": { "Algorithm": "KawPow", - "BlockHeight": 1696175, + "BlockHeight": 1727571, "CoinName": "Fren", - "DAGsize": 2986338944, - "Date": "2024-12-21T08:51:26.8373377Z", - "Epoch": 228, + "DAGsize": 3019895936, + "Date": "2025-01-01T08:06:02.5648919Z", + "Epoch": 232, "Url": "https://whattomine.com/coins.json" }, "GPN": { @@ -498,47 +498,47 @@ }, "HYP": { "Algorithm": "EthashB3", - "BlockHeight": 5129715, + "BlockHeight": 5156013, "CoinName": "Hypra", - "DAGsize": 2516582272, - "Date": "2024-12-21T08:51:26.8643066Z", - "Epoch": 172, + "DAGsize": 2524970368, + "Date": "2024-12-24T19:59:16.1456716Z", + "Epoch": 173, "Url": "https://whattomine.com/coins.json" }, "IRON": { "Algorithm": "FishHash", - "BlockHeight": 882959, + "BlockHeight": 898774, "CoinName": "Ironfish", "DAGsize": 4831838208, - "Date": "2024-12-21T08:51:26.8394965Z", + "Date": "2025-01-01T08:06:02.9508266Z", "Epoch": 448, "Url": "https://whattomine.com/coins.json" }, "KIIRO": { "Algorithm": "FiroPow", - "BlockHeight": 298477, + "BlockHeight": 304905, "CoinName": "KiiroCoin", - "DAGsize": 3011508352, - "Date": "2024-12-21T08:51:26.8422987Z", - "Epoch": 231, + "DAGsize": 3053452928, + "Date": "2025-01-01T08:06:02.9334056Z", + "Epoch": 236, "Url": "https://whattomine.com/coins.json" }, "KLS": { "Algorithm": "HeavyHashKarlsenV2", - "BlockHeight": 35598597, + "BlockHeight": 36546873, "CoinName": "Karlsen", "DAGsize": 4831838208, - "Date": "2024-12-21T08:51:26.8297495Z", - "Epoch": 1188, + "Date": "2025-01-01T08:06:02.641726Z", + "Epoch": 1220, "Url": "https://whattomine.com/coins.json" }, "LRS": { "Algorithm": "Ethash", - "BlockHeight": 2299851, + "BlockHeight": 2373636, "CoinName": "Larissa", - "DAGsize": 1728047744, - "Date": "2024-12-21T08:51:26.8845224Z", - "Epoch": 78, + "DAGsize": 1753218944, + "Date": "2025-01-01T08:06:03.3079617Z", + "Epoch": 81, "Url": "https://whattomine.com/coins.json" }, "META": { @@ -570,11 +570,11 @@ }, "NEOX": { "Algorithm": "KawPow", - "BlockHeight": 1355870, + "BlockHeight": 1371565, "CoinName": "Neoxa", - "DAGsize": 2600467328, - "Date": "2024-12-21T08:51:26.8323322Z", - "Epoch": 182, + "DAGsize": 2617240448, + "Date": "2025-01-01T08:06:02.8001313Z", + "Epoch": 184, "Url": "https://whattomine.com/coins.json" }, "NILU": { @@ -588,11 +588,11 @@ }, "NIR": { "Algorithm": "ProgPowZ", - "BlockHeight": 976616, + "BlockHeight": 1008352, "CoinName": "Nirmata", - "DAGsize": 1358954368, - "Date": "2024-12-21T08:51:26.8208811Z", - "Epoch": 34, + "DAGsize": 1367339392, + "Date": "2025-01-01T08:06:02.5207914Z", + "Epoch": 35, "Url": "https://whattomine.com/coins.json" }, "NUKO": { @@ -606,11 +606,11 @@ }, "OCTA": { "Algorithm": "Ethash", - "BlockHeight": 6115903, + "BlockHeight": 6189461, "CoinName": "Octaspace", - "DAGsize": 2793401984, - "Date": "2024-12-21T08:51:26.8727815Z", - "Epoch": 205, + "DAGsize": 2818571648, + "Date": "2025-01-01T08:06:03.2545864Z", + "Epoch": 208, "Url": "https://whattomine.com/coins.json" }, "PAPRY": { @@ -642,11 +642,11 @@ }, "QKC": { "Algorithm": "Ethash", - "BlockHeight": 18169792, + "BlockHeight": 18266540, "CoinName": "Quarkchain", - "DAGsize": 6165624704, - "Date": "2024-12-21T08:51:26.8700405Z", - "Epoch": 607, + "DAGsize": 6190792064, + "Date": "2025-01-01T08:06:03.2961803Z", + "Epoch": 610, "Url": "https://whattomine.com/coins.json" }, "REDEV2": { @@ -669,38 +669,38 @@ }, "RVN": { "Algorithm": "KawPow", - "BlockHeight": 3637851, + "BlockHeight": 3653530, "CoinName": "Raven", - "DAGsize": 5158993024, - "Date": "2024-12-21T08:51:28.1328285Z", - "Epoch": 487, + "DAGsize": 5175769472, + "Date": "2025-01-01T08:06:04.9183652Z", + "Epoch": 489, "Url": "https://prohashing.com/api/v1/currencies" }, "SATOX": { "Algorithm": "KawPow", - "BlockHeight": 1011123, + "BlockHeight": 1026789, "CoinName": "Sato", - "DAGsize": 2214587264, - "Date": "2024-12-21T08:51:26.7910736Z", - "Epoch": 136, + "DAGsize": 2231367808, + "Date": "2025-01-01T08:06:02.9766658Z", + "Epoch": 138, "Url": "https://whattomine.com/coins.json" }, "SCC": { "Algorithm": "SCCpow", - "BlockHeight": 1058236, + "BlockHeight": 1066109, "CoinName": "StakeCubeCoin", - "DAGsize": 3825204608, - "Date": "2024-12-21T08:51:28.4151476Z", - "Epoch": 328, + "DAGsize": 3850370432, + "Date": "2025-01-01T08:06:05.16648Z", + "Epoch": 331, "Url": "https://scc.ccore.online/api/getblockcount" }, "SERO": { "Algorithm": "ProgPowSero", - "BlockHeight": 14080815, + "BlockHeight": 14152840, "CoinName": "Sero", - "DAGsize": 5024763776, - "Date": "2024-12-21T08:51:26.861804Z", - "Epoch": 471, + "DAGsize": 5041544576, + "Date": "2025-01-01T08:06:03.0898793Z", + "Epoch": 473, "Url": "https://whattomine.com/coins.json" }, "SLX": { @@ -714,11 +714,11 @@ }, "TLS": { "Algorithm": "ProgPowTelestai", - "BlockHeight": 200527, + "BlockHeight": 216202, "CoinName": "Telestai", - "DAGsize": 1224732032, - "Date": "2024-12-21T08:51:28.2857411Z", - "Epoch": 18, + "DAGsize": 1241513344, + "Date": "2025-01-01T08:06:05.0791669Z", + "Epoch": 20, "Url": "https://telestai.cryptoscope.io/api/getblockcount" }, "UBQ": { @@ -741,11 +741,11 @@ }, "XNA": { "Algorithm": "KawPow", - "BlockHeight": 876991, + "BlockHeight": 892670, "CoinName": "Neurai", - "DAGsize": 2063596672, - "Date": "2024-12-21T08:51:26.8144823Z", - "Epoch": 118, + "DAGsize": 2088762752, + "Date": "2025-01-01T08:06:02.9470415Z", + "Epoch": 121, "Url": "https://whattomine.com/coins.json" }, "XPB": { @@ -759,24 +759,24 @@ }, "ZANO": { "Algorithm": "ProgPowZ", - "BlockHeight": 2950851, + "BlockHeight": 2966579, "CoinName": "Zano", "DAGsize": 1912601216, - "Date": "2024-12-21T08:51:26.7942429Z", + "Date": "2025-01-01T08:06:02.5085608Z", "Epoch": 100, "Url": "https://whattomine.com/coins.json" } }, "Updated": { - "https://api-explorer.blocxscan.com/api/getblockcount": "2024-12-21T08:51:28.5320675Z", - "https://evr.cryptoscope.io/api/getblockcount": "2024-12-21T08:51:28.6627142Z", + "https://api-explorer.blocxscan.com/api/getblockcount": "2025-01-01T08:06:05.8805501Z", + "https://evr.cryptoscope.io/api/getblockcount": "2025-01-01T08:06:06.0575792Z", "https://mewc.cryptoscope.io/api/getblockcount": "2024-07-14T13:29:49.1181315Z", - "https://minerstat.com/dag-size-calculator": "2024-12-21T08:51:26.9687121Z", - "https://prohashing.com/api/v1/currencies": "2024-12-21T08:51:28.1368429Z", - "https://scc.ccore.online/api/getblockcount": "2024-12-21T08:51:28.4154783Z", - "https://telestai.cryptoscope.io/api/getblockcount": "2024-12-21T08:51:28.2860851Z", + "https://minerstat.com/dag-size-calculator": "2025-01-01T08:06:03.4136658Z", + "https://prohashing.com/api/v1/currencies": "2025-01-01T08:06:04.929466Z", + "https://scc.ccore.online/api/getblockcount": "2025-01-01T08:06:05.1668759Z", + "https://telestai.cryptoscope.io/api/getblockcount": "2025-01-01T08:06:05.0795681Z", "https://telestai.cryptoscope.io/api/getblockcount/": "2024-10-23T21:02:21.4975231Z", - "https://whattomine.com/coins.json": "2024-12-21T08:51:26.8869543Z", + "https://whattomine.com/coins.json": "2025-01-01T08:06:03.3254096Z", "https://www.coinexplorer.net/api/v1/SCC/getblockcount": "2024-09-02T06:05:35.3039058Z", "https://zergpool.com/api/currencies": "2024-08-26T19:03:15.0996499Z" } diff --git a/Data/Devices.json b/Data/Devices.json deleted file mode 100644 index a35c5478..00000000 --- a/Data/Devices.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "amd": { - "Type": "GPU", - "Vendor": "AMD", - "Id": "*", - "Type_Id": "*", - "Vendor_Id": "*", - "Type_Vendor_Id": "{1}" - }, - "cpu": { - "Type": "CPU", - "Vendor": "*", - "Id": "*", - "Type_Id": "{1}", - "Vendor_Id": "*", - "Type_Vendor_Id": "*" - }, - "device": { - "Type": "*", - "Vendor": "*", - "Id": "{1}", - "Type_Id": "*", - "Vendor_Id": "*", - "Type_Vendor_Id": "*" - }, - "gpu": { - "Type": "GPU", - "Vendor": "*", - "Id": "*", - "Type_Id": "{1}", - "Vendor_Id": "*", - "Type_Vendor_Id": "*" - }, - "intel": { - "Type": "GPU", - "Vendor": "INTEL", - "Id": "*", - "Type_Id": "*", - "Vendor_Id": "*", - "Type_Vendor_Id": "{1}" - }, - "nvidia": { - "Type": "GPU", - "Vendor": "NVIDIA", - "Id": "*", - "Type_Id": "*", - "Vendor_Id": "*", - "Type_Vendor_Id": "{1}" - }, - "opencl": { - "Type": "GPU", - "Vendor": "*", - "Index": "*", - "Type_Index": "*", - "Vendor_Index": "*", - "Type_Vendor_Index": "*", - "PlatformId": "{1}", - "PlatformId_Index": "*", - "Type_PlatformId_Index": "{2}" - }, - "slot": { - "Type": "GPU", - "Vendor": "*", - "Slot": "*", - "Type_Slot": "{1}", - "Vendor_Slot": "*", - "Type_Vendor_Slot": "*" - } -} \ No newline at end of file diff --git a/Data/DonationData.json b/Data/DonationData.json index bf8bce6b..b9f5d89a 100644 --- a/Data/DonationData.json +++ b/Data/DonationData.json @@ -2,13 +2,11 @@ { "Name": "uselessguru", "MiningDutchUserName": "UselessGuru", - "MiningPoolHubUserName": "UselessGuru", "ProHashingUserName": "UselessGuru", "PoolName": [ "HashCryptos", "Hiveon", "MiningDutch", - "NiceHash", "ProHashing", "ZergPool", "ZPool" diff --git a/Includes/APIServer.psm1 b/Includes/APIServer.psm1 index dba06b38..f8a83202 100644 --- a/Includes/APIServer.psm1 +++ b/Includes/APIServer.psm1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\APIServer.psm1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Function Start-APIServer { diff --git a/Includes/BalancesTracker.ps1 b/Includes/BalancesTracker.ps1 index 09df76c3..d3612288 100644 --- a/Includes/BalancesTracker.ps1 +++ b/Includes/BalancesTracker.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\BalancesTracker.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module .\Include.psm1 diff --git a/Includes/Core.ps1 b/Includes/Core.ps1 index 520e4a2d..80336f05 100644 --- a/Includes/Core.ps1 +++ b/Includes/Core.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: Core.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module .\Include.psm1 @@ -996,7 +996,7 @@ Try { $Miners.ForEach({ $_.Reasons = [System.Collections.Generic.List[String]]@($_.Reasons | Sort-Object -Unique); $_.Available = -not [Boolean]$_.Reasons }) # Gone miners are no longer available - $Miners.Where({ $_.SideIndicator -eq "<=" }).ForEach({ $_.Available = $false }) + $Miners.Where({ $_.SideIndicator -eq "<=" }).ForEach({ $_.Available = $false; $_.Best = $false }) Write-Message -Level Info "Loaded $($Miners.Where({ $_.SideIndicator -ne "<=" }).Count) miner$(If ($Miners.Where({ $_.SideIndicator -ne "<=" }).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" })." @@ -1070,7 +1070,7 @@ Try { If ($Variables.CalculatePowerCost -and $Variables.MiningProfit -lt ($Config.ProfitabilityThreshold / $Variables.Rates.BTC.($Config.FIATcurrency))) { # Mining earning/profit is below threshold $MinersBest = [Miner[]]@() - $Text = "Mining profit {0} {1:n} / day is below the configured threshold of {0} {2:n} / day. Mining is suspended until threshold is reached." -f $Config.FIATcurrency, ($Variables.MiningProfit * $Variables.Rates.($Config.PayoutCurrency).($Config.FIATcurrency)), $Config.ProfitabilityThreshold + $Text = "Mining profit of {0} {1:n} / day is below the configured threshold of {0} {2:n} / day. Mining is suspended until the threshold is reached." -f $Config.FIATcurrency, ($Variables.MiningProfit * $Variables.Rates.($Config.PayoutCurrency).($Config.FIATcurrency)), $Config.ProfitabilityThreshold Write-Message -Level Warn ($Text -replace " / day", "/day") $Summary += "$Text`n" Remove-Variable Text @@ -1157,31 +1157,28 @@ Try { # Kill stuck miners on subsequent cycles when not in dry run mode If (-not $Config.DryRun) { + $MinerPaths = ($Miners.Path | Sort-Object -Unique).ForEach({ "$PWD\$($_)" }) $Loops = 0 - # Some miners, e.g. BzMiner spawn a second executable - While ($StuckMinerProcessIDs = (Get-CimInstance CIM_Process).Where({ $_.ExecutablePath -and ($Miners.Path | Sort-Object -Unique) -contains $_.ExecutablePath -and (Get-CimInstance win32_process -Filter "ParentProcessId = $($_.ProcessId)") -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)'." } - If ($ChildProcessID = (Get-CimInstance win32_process -Filter "ParentProcessId = $_").ProcessID) { Stop-Process -Id $ChildProcessID -Force -ErrorAction Ignore } - Stop-Process -Id $_ -Force -ErrorAction Ignore | Out-Null - } - ) - Start-Sleep -Milliseconds 500 + While ($StuckMinerProcesses = (Get-CimInstance CIM_Process).Where({ $_.ExecutablePath -and $MinerPaths -contains $_.ExecutablePath -and $Miners.ProcessID -notcontains $_.ProcessID -and $Miners.ProcessID -notcontains $_.ParentProcessID})) { + ForEach ($StuckMinerProcess in $StuckMinerProcesses) { + If ($Miner = $Miners.Where({ $_.ProcessID -eq $StuckMinerProcess.ProcessId })) { Write-Message -Level Verbose "Killing stuck miner '$($Miner.Name)'." } + Stop-Process -Id $StuckMinerProcess.ProcessId -Force -ErrorAction Ignore | Out-Null + } + Start-Sleep -Milliseconds 1000 $Loops ++ If ($Loops -gt 50) { If ($Config.AutoReboot) { - Write-Message -Level Error "$(If ($StuckMinerProcessIDs.Count -eq 1) { "A miner " } Else { "Some miners are" }) stuck and cannot get stopped graciously. 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." + Write-Message -Level Error "$(If ($StuckMinerProcesses.Count -eq 1) { "A miner " } Else { "Some miners are" }) stuck and cannot get stopped graciously. Restarting computer in 30 seconds..." + shutdown.exe /r /t 30 /c "$($Variables.Branding.ProductLabel) detected stuck miner$(If ($StuckMinerProcesses.Count -ne 1) { "s" }) and will reboot the computer in 30 seconds." Start-Sleep -Seconds 60 } Else { - Write-Message -Level Error "$(If ($StuckMinerProcessIDs.Count -eq 1) { "A miner " } Else { "Some miners are" }) stuck and cannot get stopped graciously. It is recommended to restart the computer." + Write-Message -Level Error "$(If ($StuckMinerProcesses.Count -eq 1) { "A miner " } Else { "Some miners are" }) stuck and cannot get stopped graciously. It is recommended to restart the computer." Start-Sleep -Seconds 30 } } } - Remove-Variable ChildProcessID, Loops, Message, Miner, StuckMinerProcessIDs -ErrorAction Ignore + Remove-Variable ChildProcess, ChildProcesses, Loops, Message, Miner, MinerPaths, StuckMinerProcess, StuckMinerProcesses -ErrorAction Ignore } $Miners.ForEach( @@ -1403,7 +1400,7 @@ Try { $Samples.Where({ $_.Date -ge $Miner.ValidDataSampleTimestamp -and $_.Hashrate.PSObject.Properties.Value -notcontains 0 }).ForEach({ $Miner.Data.Add($_) }) Write-Message -Level Verbose "$($Miner.Name) data sample collected [$(($Sample.Hashrate.PSObject.Properties.Name.ForEach({ "$($_): $(($Sample.Hashrate.$_ | ConvertTo-Hash) -replace " ")$(If ($Config.ShowShares) { " (Shares: A$($Sample.Shares.$_[0])+R$($Sample.Shares.$_[1])+I$($Sample.Shares.$_[2])=T$($Sample.Shares.$_[3]))" })" })) -join " & ")$(If ($Sample.PowerConsumption) { " | Power: $($Sample.PowerConsumption.ToString("N2"))W" })] ($($Miner.Data.Count) Sample$(If ($Miner.Data.Count -ne 1) { "s" }))" If ($Miner.Activated -gt 0 -and ($Miner.Benchmark -or $Miner.MeasurePowerConsumption)) { - $Miner.StatusInfo = " '$($Miner.Info)' is $(If ($Miner.Benchmark) { "benchmarking" })$(If ($Miner.Benchmark -and $Miner.MeasurePowerConsumption) { " and measuring power consumption" } ElseIf ($Miner.MeasurePowerConsumption) { "measuring power consumption" })" + $Miner.StatusInfo = "$($Miner.Info) is $(If ($Miner.Benchmark) { "benchmarking" })$(If ($Miner.Benchmark -and $Miner.MeasurePowerConsumption) { " and measuring power consumption" } ElseIf ($Miner.MeasurePowerConsumption) { "measuring power consumption" })" $Miner.SubStatus = "benchmarking" } Else { diff --git a/Includes/Downloader.ps1 b/Includes/Downloader.ps1 index c44c483e..a8905411 100644 --- a/Includes/Downloader.ps1 +++ b/Includes/Downloader.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\Downloader.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module .\Includes\Include.psm1 diff --git a/Includes/Include.psm1 b/Includes/Include.psm1 index fac91272..cc7eb9ee 100644 --- a/Includes/Include.psm1 +++ b/Includes/Include.psm1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\include.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> $Global:DebugPreference = "SilentlyContinue" @@ -425,6 +425,7 @@ Class Miner : IDisposable { Else { Write-Message -Level Info "Starting miner '$($this.Info)'..." $this.StatusInfo = "$($this.Info) is starting" + $this.SubStatus = "starting" } Write-Message -Level Verbose $this.CommandLine @@ -466,7 +467,6 @@ Class Miner : IDisposable { $this.Activated ++ $this.DataSampleTimestamp = [DateTime]0 $this.Status = [MinerStatus]::Running - $this.SubStatus = "starting" $this.StatStart = $this.BeginTime = [DateTime]::Now.ToUniversalTime() $this.Process = Get-Process -Id $this.ProcessId -ErrorAction SilentlyContinue $this.StartDataReader() @@ -495,11 +495,6 @@ Class Miner : IDisposable { $this.EndTime = [DateTime]::Now.ToUniversalTime() - If ($this.ProcessId) { - If (Get-Process -Id $this.ProcessId -ErrorAction Ignore) { Stop-Process -Id $this.ProcessId -Force -ErrorAction Ignore | Out-Null } - If (-not (Get-Process -Id $this.ProcessId -ErrorAction Ignore)) { $this.ProcessId = $null } - } - If ($this.Process) { [Void]$this.Process.CloseMainWindow() [Void]$this.Process.WaitForExit(100) @@ -508,6 +503,13 @@ Class Miner : IDisposable { $this.Process = $null } + If ($this.ProcessId) { + If (Get-Process -Id $this.ProcessId -ErrorAction Ignore) { + Stop-Process -Id $this.ProcessId -Force -ErrorAction Ignore | Out-Null + } + $this.ProcessId = $null + } + If ($this.ProcessJob) { Try { $this.Active += $this.ProcessJob.PSEndTime - $this.ProcessJob.PSBeginTime } Catch { } # Jobs are getting removed in core loop (stopping immediately after stopping process here may take several seconds) @@ -2243,45 +2245,6 @@ Function Get-GPUArchitectureNvidia { Function Get-Device { - Param ( - [Parameter(Mandatory = $false)] - [String[]]$Name = @(), - [Parameter(Mandatory = $false)] - [String[]]$ExcludeName = @() - ) - - If ($Name) { - $DeviceList = [System.IO.File]::ReadAllLines("$PWD\Data\Devices.json") | ConvertFrom-Json - $Name_Devices = $Name.ForEach( - { - $Name_Split = $_ -split "#" - $Name_Split = @($Name_Split | Select-Object -First 1) + @(($Name_Split | Select-Object -Skip 1).ForEach({ [Int]$_ })) - $Name_Split += @("*") * (100 - $Name_Split.Count) - - $Name_Device = $DeviceList.("{0}" -f $Name_Split) | Select-Object * - ($Name_Device | Get-Member -MemberType NoteProperty).Name.ForEach({ $Name_Device.$_ = $Name_Device.$_ -f $Name_Split }) - - $Name_Device - } - ) - } - - If ($ExcludeName) { - If (-not $DeviceList) { $DeviceList = [System.IO.File]::ReadAllLines("$PWD\Data\Devices.json") | ConvertFrom-Json } - $ExcludeName_Devices = $ExcludeName.ForEach( - { - $ExcludeName_Split = $_ -split "#" - $ExcludeName_Split = @($ExcludeName_Split | Select-Object -First 1) + @(($ExcludeName_Split | Select-Object -Skip 1).ForEach({ [Int]$_ })) - $ExcludeName_Split += @("*") * (100 - $ExcludeName_Split.Count) - - $ExcludeName_Device = $DeviceList.("{0}" -f $ExcludeName_Split) | Select-Object * - ($ExcludeName_Device | Get-Member -MemberType NoteProperty).Name.ForEach({ $ExcludeName_Device.$_ = $ExcludeName_Device.$_ -f $ExcludeName_Split }) - - $ExcludeName_Device - } - ) - } - $Devices = @() $Id = 0 @@ -2552,11 +2515,7 @@ Function Get-Device { $Device.Bus_Vendor_Index = @($Devices.Where({ $_.Vendor -eq $Device.Vendor }).Bus | Sort-Object).IndexOf([Int]$Device.Bus) $Device.Bus_Platform_Index = @($Devices.Where({ $_.Platform -eq $Device.Platform }).Bus | Sort-Object).IndexOf([Int]$Device.Bus) - If (-not $Name -or ($Name_Devices.Where({ ($Device | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) -like ($_ | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) }))) { - If (-not $ExcludeName -or -not ($ExcludeName_Devices.Where({ ($Device | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) -like ($_ | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) }))) { - $Device - } - } + $Device } ) } @@ -2705,7 +2664,7 @@ public static class Kernel32 } # Set local environment - ($EnvBlock | Select-Object).ForEach({ Set-Item -Path "Env:$(($_ -split "=")[0])" "$(($_ -split "=")[1])" -Force }) + ($EnvBlock | Select-Object).ForEach({ New-Item -Path "Env:\$(($_ -split "=")[0])" -Value "$(($_ -split "=")[1])" -Force | Out-Null }) # StartupInfo struct $StartupInfo = New-Object STARTUPINFO @@ -2731,7 +2690,6 @@ public static class Kernel32 [PSCustomObject]@{ ProcessId = $null } Return } - [PSCustomObject]@{ ProcessId = $Proc.Id } $ControllerProcess.Handle | Out-Null @@ -2744,6 +2702,12 @@ public static class Kernel32 [Void]$Proc.Kill() [Void]$Proc.Dispose() $Proc = $null + # Some miners, e.g. BzMiner spawn a second executable + If ($ParentProcessId = (Get-CimInstance win32_process -Filter "ProcessId = $($this.ProcessId)")[0].ParentProcessId) { + If ($ParentProcess = (Get-CimInstance win32_process -Filter "ProcessId = $ParentProcessId")) { + If ($ParentProcess.Name -ne "pwsh.exe") { Stop-Process -Id $ParentProcess.ProcessId -Force } + } + } } } While ($Proc.HasExited -eq $false) } diff --git a/Includes/Include.psm1.bak b/Includes/Include.psm1.bak new file mode 100644 index 00000000..8b7c5454 --- /dev/null +++ b/Includes/Include.psm1.bak @@ -0,0 +1,3846 @@ +<# +Copyright (c) 2018-2024 UselessGuru + +UG-Miner 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. + +UG-Miner 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: UG-Miner +File: \Includes\include.ps1 +Version: 6.3.23 +Version date: 2025/01/01 +#> + +$Global:DebugPreference = "SilentlyContinue" +$Global:ErrorActionPreference = "SilentlyContinue" +$Global:InformationPreference = "SilentlyContinue" +$Global:ProgressPreference = "SilentlyContinue" +$Global:WarningPreference = "SilentlyContinue" +$Global:VerbosePreference = "SilentlyContinue" + +# Fix TLS Version erroring +[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" + +# No native way to check how long the system has been idle in PowerShell. Have to use .NET code. +Add-Type -TypeDefinition @' +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace PInvoke.Win32 { + + public static class UserInput { + + [DllImport("user32.dll", SetLastError=false)] + private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + + [StructLayout(LayoutKind.Sequential)] + private struct LASTINPUTINFO { + public uint cbSize; + public int dwTime; + } + + public static DateTime LastInput { + get { + DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); + DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); + return lastInput; + } + } + + public static TimeSpan IdleTime { + get { + return DateTime.UtcNow.Subtract(LastInput); + } + } + + public static int LastInputTicks { + get { + LASTINPUTINFO lii = new LASTINPUTINFO(); + lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); + GetLastInputInfo(ref lii); + return lii.dwTime; + } + } + } +} +'@ + +# Registry key info +# Based on https://community.nexthink.com/s/question/0D52p00008n4ORKCA2/get-the-timestamp-of-any-path-or-key-in-the-registry +$RegData = Add-Type -Name GetRegData -Namespace RegQueryInfoKey -Using System.Text -PassThru -MemberDefinition ' +[DllImport("advapi32.dll", CharSet = CharSet.Auto)] + +public static extern Int32 RegQueryInfoKey( + Microsoft.Win32.SafeHandles.SafeRegistryHandle hKey, + StringBuilder lpClass, + Int32 lpCls, Int32 spare, Int32 subkeys, + Int32 skLen, Int32 mcLen, Int32 values, + Int32 vNLen, Int32 mvLen, Int32 secDesc, + out System.Runtime.InteropServices.ComTypes.FILETIME lpftLastWriteTime +);' + +Function Get-RegTime { + Param ( + [Parameter(Mandatory = $true)] + [String]$RegistryPath + ) + + $Reg = Get-Item $RegistryPath -Force + If ($Reg.handle) { + $Time = New-Object System.Runtime.InteropServices.ComTypes.FILETIME + $Result = $RegData::RegQueryInfoKey($Reg.Handle, $null, 0, 0, 0, 0, 0, 0, 0, 0, 0, [ref]$Time) + If ($Result -eq 0) { + $Low = [UInt32]0 -bor $Time.dwLowDateTime + $High = [UInt32]0 -bor $Time.dwHighDateTime + $TimeValue = ([Int64]$High -shl 32) -bor $Low + Return [DateTime]::FromFileTime($TimeValue) + } + } +} + +# Window handling +Add-Type -TypeDefinition @" +using System; +using System.Runtime.InteropServices; + +public static class Win32 { + [DllImport("user32.dll")] + public static extern int SetWindowText(IntPtr hWnd, string strTitle); + + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); + + [DllImport("user32.dll")] + public static extern int SetForegroundWindow(IntPtr hwnd); + + [DllImport("user32.dll")] + public static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); +} +"@ + +# .Net methods for hiding/showing the console in the background +# https://stackoverflow.com/questions/40617800/opening-powershell-script-and-hide-command-prompt-but-not-the-gui +Add-Type -Name Window -Namespace Console -MemberDefinition ' +[DllImport("Kernel32.dll")] +public static extern IntPtr GetConsoleWindow(); + +[DllImport("user32.dll")] +public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); +' + +$Global:PriorityNames = [PSCustomObject]@{ -2 = "Idle"; -1 = "BelowNormal"; 0 = "Normal"; 1 = "AboveNormal"; 2 = "High"; 3 = "RealTime" } + +[NoRunspaceAffinity()] # https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes?view=powershell-7.4#example-4---class-definition-with-and-without-runspace-affinity +Class Device { + [String]$Architecture + [Int64]$Bus + [Int]$Bus_Index + [Int]$Bus_Type_Index + [Int]$Bus_Platform_Index + [Int]$Bus_Vendor_Index + [PSCustomObject]$CIM + [System.Version]$CUDAversion + [Double]$ConfiguredPowerConsumption = 0 # Workaround if device does not expose power consumption + [PSCustomObject]$CPUfeatures + [Int]$Id + [Int]$Index = 0 + [Int64]$Memory + [String]$Model + [Double]$MemoryGiB + [String]$Name + [PSCustomObject]$OpenCL + [Int]$PlatformId = 0 + [Int]$PlatformId_Index + # [PSCustomObject]$PNP + [Boolean]$ReadPowerConsumption = $false + # [PSCustomObject]$Reg + [Int]$Slot = 0 + [DeviceState]$State = [DeviceState]::Enabled + [String]$Status = "Idle" + [String]$StatusInfo = "" + [String]$SubStatus + [String]$Type + [Int]$Type_Id + [Int]$Type_Index + [Int]$Type_PlatformId_Index + [Int]$Type_Slot + [Int]$Type_Vendor_Id + [Int]$Type_Vendor_Index + [Int]$Type_Vendor_Slot + [String]$Vendor + [Int]$Vendor_Id + [Int]$Vendor_Index + [Int]$Vendor_Slot +} + +Enum DeviceState { + Enabled + Disabled + Unsupported +} + +[NoRunspaceAffinity()] +Class Pool : IDisposable { + [Double]$Accuracy + [String]$Algorithm + [String]$AlgorithmVariant + [Boolean]$Available = $true + [Boolean]$Best = $false + [Nullable[Int64]]$BlockHeight = $null + [String]$CoinName + [String]$Currency + [Nullable[Double]]$DAGSizeGiB = $null + [Boolean]$Disabled = $false + [Double]$EarningsAdjustmentFactor = 1 + [Nullable[UInt16]]$Epoch = $null + [Double]$Fee + [String]$Host + # [String[]]$Hosts # To be implemented for pool failover + [String]$Key + [String]$Name + [String]$Pass + $PoolPorts = @() # Cannot define nullable array + [UInt16]$Port + [UInt16]$PortSSL + [String]$PoolUri # Link to pool algorithm web page + [Double]$Price + [Double]$Price_Bias + [Boolean]$Prioritize = $false # derived from BalancesKeepAlive + [String]$Protocol + [System.Collections.Generic.List[String]]$Reasons + [String]$Region + [Boolean]$SendHashrate # If true miner will send hashrate to pool + [Boolean]$SSLselfSignedCertificate + [Double]$StablePrice + [DateTime]$Updated = [DateTime]::Now.ToUniversalTime() + [String]$User + [String]$Variant + [String]$WorkerName = "" + [Nullable[UInt]]$Workers + [String]$ZAPcurrency + + Dispose() { + $this = $null + } +} + +[NoRunspaceAffinity()] +Class Worker : IDisposable { + [Boolean]$Disabled = $false + [Double]$Earning = [Double]::NaN + [Double]$Earning_Bias = [Double]::NaN + [Double]$Earning_Accuracy = [Double]::NaN + [Double]$Fee = 0 + [Double]$Hashrate = [Double]::NaN + [Pool]$Pool + [TimeSpan]$TotalMiningDuration = [TimeSpan]0 + [DateTime]$Updated = [DateTime]::Now.ToUniversalTime() + + Dispose() { + $this = $null + } +} + +Enum MinerStatus { + Disabled + DryRun + Failed + Idle + Running + Unavailable +} + +[NoRunspaceAffinity()] +Class Miner : IDisposable { + [Int]$Activated + [TimeSpan]$Active = [TimeSpan]::Zero + [String[]]$Algorithms = @() # derived from workers, required for GetDataReader & Web GUI + [String]$API + [String]$Arguments + [Boolean]$Available = $true + [String]$BaseName + [String]$BaseName_Version + [String]$BaseName_Version_Device + [DateTime]$BeginTime # UniversalTime + [Boolean]$Benchmark = $false # derived from stats + [Boolean]$Best = $false + [String]$CommandLine + [UInt]$ContinousCycle = 0 # Counter, miner has been running continously for n loops + [Double]$DataCollectInterval = 5 # Seconds, allow fractions of seconds + [DateTime]$DataSampleTimestamp = 0 # Newest sample + [String[]]$DeviceNames = @() # derived from devices + [PSCustomObject[]]$Devices + [Boolean]$Disabled = $false + [Double]$Earning = [Double]::NaN # derived from pool and stats + [Double]$Earning_Bias = [Double]::NaN # derived from pool and stats + [Double]$Earning_Accuracy = 0 # derived from pool and stats + [DateTime]$EndTime # UniversalTime + [String[]]$EnvVars = @() + [Double[]]$Hashrates_Live = @() + [String]$Info + [Boolean]$KeepRunning = $false # do not stop miner even if not best (MinInterval) + [String]$LogFile + [Boolean]$MeasurePowerConsumption = $false + [UInt16]$MinDataSample # for safe hashrate values + [UInt16]$MinerSet + [String]$MinerUri + [String]$Name + [Bool]$Optimal = $false + [String]$Path + [String]$PrerequisitePath + [String]$PrerequisiteURI + [UInt16]$Port + [Double]$PowerCost = [Double]::NaN + [Double]$PowerConsumption = [Double]::NaN + [Double]$PowerConsumption_Live = [Double]::NaN + [Boolean]$Prioritize = $false # derived from BalancesKeepAlive + [UInt32]$ProcessId = 0 + [Int]$ProcessPriority = -1 + [Double]$Profit = [Double]::NaN + [Double]$Profit_Bias = [Double]::NaN + [Boolean]$ReadPowerConsumption + [System.Collections.Generic.List[String]]$Reasons = @() # Why is a miner not available? + [Boolean]$Restart = $false + hidden [DateTime]$StatStart + hidden [DateTime]$StatEnd + [MinerStatus]$Status = [MinerStatus]::Idle + [String]$StatusInfo = "" + [String]$SubStatus = [MinerStatus]::Idle + [TimeSpan]$TotalMiningDuration # derived from pool and stats + [String]$Type + [DateTime]$Updated # derived from stats + [String]$URI + [DateTime]$ValidDataSampleTimestamp = 0 + [String]$Version + [UInt16[]]$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 + [String]$WindowStyle + [Worker[]]$Workers = @() + [Worker[]]$WorkersRunning = @() + + hidden [System.Collections.Generic.List[PSCustomObject]]$Data = @() # To store data samples (speed & power consumtion) + hidden [System.Management.Automation.Job]$DataReaderJob = $null + hidden [System.Management.Automation.Job]$ProcessJob = $null + hidden [System.Diagnostics.Process]$Process = $null + + Dispose() { + $this = $null + } + + [String[]]GetProcessNames() { + Return @(([IO.FileInfo]($this.Path | Split-Path -Leaf)).BaseName) + } + + [String]GetCommandLineParameters() { + If ($this.Arguments -and (Test-Json -Json $this.Arguments -ErrorAction Ignore)) { + Return ($this.Arguments | ConvertFrom-Json).Arguments + } + Else { + Return $this.Arguments + } + } + + [String]GetCommandLine() { + Return "$($this.Path)$($this.GetCommandLineParameters())" + } + + hidden [Void]StartDataReader() { + $ScriptBlock = { + $ScriptBody = "using module .\Includes\Include.psm1"; $Script = [ScriptBlock]::Create($ScriptBody); . $Script + + Try { + # Load miner API file + . ".\Includes\MinerAPIs\$($args[0]).ps1" + $ProgressPreference = "SilentlyContinue" + $Miner = ($args[1] | ConvertFrom-Json) -as $args[0] + Start-Sleep -Seconds 2 + + While ($true) { + $LoopEnd = [DateTime]::Now.AddSeconds($Miner.DataCollectInterval) + $Miner.GetMinerData() + While ([DateTime]::Now -lt $LoopEnd) { Start-Sleep -Milliseconds 50 } + } + } + Catch { + Return $_ + } + Remove-Variable Miner, LoopEnd -ErrorAction Ignore + } + + # Start Miner data reader, devices property required for GetPowerConsumption/ConfiguredPowerConsumption + $this.DataReaderJob = Start-ThreadJob -InformationVariable $null -WarningVariable $null -Name "$($this.NameAndDevice)_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) + + Remove-Variable ScriptBlock -ErrorAction Ignore + } + + hidden [Void]StopDataReader() { + If ($this.DataReaderJob) { + $this.DataReaderJob | Stop-Job + # Get data before removing read data + If ($this.Status -eq [MinerStatus]::Running -and $this.DataReaderJob.HasMoreData) { ($this.DataReaderJob | Receive-Job).Where({ $_.Date }).ForEach({ $this.Data.Add($_) }) } + $this.DataReaderJob | Remove-Job -Force -ErrorAction Ignore | Out-Null + $this.DataReaderJob = $null + } + } + + hidden [Void]RestartDataReader() { + $this.StopDataReader() + $this.StartDataReader() + } + + hidden [Void]StartMining() { + If ($this.Arguments -and (Test-Json $this.Arguments -ErrorAction Ignore)) { $this.CreateConfigFiles() } + + # Stat just got removed (Miner.Activated < 1, set by API) + If ($this.Activated -le 0) { $this.Activated = 0 } + If ($this.Benchmark -or $this.MeasurePowerConsumption) { $this.Data = @() } + + $this.ContinousCycle = 0 + $this.DataSampleTimestamp = [DateTime]0 + $this.ValidDataSampleTimestamp = [DateTime]0 + + $this.Hashrates_Live = @($this.Workers.ForEach({ [Double]::NaN })) + $this.PowerConsumption_Live = [Double]::NaN + + If ($this.Status -eq [MinerStatus]::DryRun) { + Write-Message -Level Info "Dry run for miner '$($this.Info)'..." + $this.StatusInfo = "$($this.Info) (Dry run)" + $this.SubStatus = "idle" + $this.StatStart = $this.BeginTime = [DateTime]::Now.ToUniversalTime() + } + Else { + Write-Message -Level Info "Starting miner '$($this.Info)'..." + $this.StatusInfo = "$($this.Info) is starting" + } + + Write-Message -Level Verbose $this.CommandLine + + # Log switching information to .\Logs\SwitchingLog.csv + [PSCustomObject]@{ + DateTime = (Get-Date -Format o) + Action = If ($this.Status -eq [MinerStatus]::DryRun) { "DryRun" } Else { "Launched" } + Name = $this.Name + Accounts = $this.Workers.Pool.User -join " " + Activated = $this.Activated + Algorithms = $this.Workers.Pool.AlgorithmVariant -join " " + Benchmark = $this.Benchmark + CommandLine = $this.CommandLine + Cycle = "" + DeviceNames = $this.DeviceNames -join " " + Duration = "" + Earning = $this.Earning + Earning_Bias = $this.Earning_Bias + Hashrates = "" + LastDataSample = $null + MeasurePowerConsumption = $this.MeasurePowerConsumption + Pools = ($this.Workers.Pool.Name | Select-Object -Unique) -join " " + Profit = $this.Profit + Profit_Bias = $this.Profit_Bias + PowerConsumption = "" + Reason = "" + Type = $this.Type + } | Export-Csv -Path ".\Logs\SwitchingLog.csv" -Append -NoTypeInformation + + If ($this.Status -ne [MinerStatus]::DryRun) { + + $this.ProcessJob = Invoke-CreateProcess -InformationVariable $null -WarningVariable $null -BinaryPath "$PWD\$($this.Path)" -ArgumentList $this.GetCommandLineParameters() -WorkingDirectory (Split-Path "$PWD\$($this.Path)") -WindowStyle $this.WindowStyle -EnvBlock $this.EnvVars -JobName $this.Name -LogFile $this.LogFile -Status $this.StatusInfo + + # Sometimes the process cannot be found instantly + $Loops = 100 + Do { + If ($this.ProcessId = ($this.ProcessJob | Receive-Job | Select-Object -ExpandProperty ProcessId)) { + $this.Activated ++ + $this.DataSampleTimestamp = [DateTime]0 + $this.Status = [MinerStatus]::Running + $this.SubStatus = "starting" + $this.StatStart = $this.BeginTime = [DateTime]::Now.ToUniversalTime() + $this.Process = Get-Process -Id $this.ProcessId -ErrorAction SilentlyContinue + $this.StartDataReader() + Break + } + $Loops -- + Start-Sleep -Milliseconds 50 + } While ($Loops -gt 0) + Remove-Variable Loops + } + + $this.WorkersRunning = $this.Workers + } + + hidden [Void]StopMining() { + If ([MinerStatus]::Running, [MinerStatus]::Disabled, [MinerStatus]::DryRun -contains $this.Status) { + Write-Message -Level Info "Stopping miner '$($this.Info)'..." + $this.StatusInfo = "$($this.Info) is stopping..." + } + Else { + $this.SubStatus = [MinerStatus]::Failed + Write-Message -Level Error $this.StatusInfo + } + + $this.StopDataReader() + + $this.EndTime = [DateTime]::Now.ToUniversalTime() + + If ($this.ProcessId) { + If (Get-Process -Id $this.ProcessId -ErrorAction Ignore) { Stop-Process -Id $this.ProcessId -Force -ErrorAction Ignore | Out-Null } + If (-not (Get-Process -Id $this.ProcessId -ErrorAction Ignore)) { $this.ProcessId = $null } + } + + If ($this.Process) { + [Void]$this.Process.CloseMainWindow() + [Void]$this.Process.WaitForExit(100) + [Void]$this.Process.Kill() + [Void]$this.Process.Dispose() + $this.Process = $null + } + + If ($this.ProcessJob) { + Try { $this.Active += $this.ProcessJob.PSEndTime - $this.ProcessJob.PSBeginTime } Catch { } + # Jobs are getting removed in core loop (stopping immediately after stopping process here may take several seconds) + $this.ProcessJob = $null + } + + $this.Status = If ([MinerStatus]::Running, [MinerStatus]::DryRun -contains $this.Status) { [MinerStatus]::Idle } Else { [MinerStatus]::Failed } + + # Log switching information to .\Logs\SwitchingLog + [PSCustomObject]@{ + DateTime = (Get-Date -Format o) + Action = If ($this.Status -eq [MinerStatus]::Idle) { "Stopped" } Else { "Failed" } + Name = $this.Name + Activated = $this.Activated + Accounts = $this.WorkersRunning.Pool.User -join " " + Algorithms = $this.WorkersRunning.Pool.AlgorithmVariant -join " " + Benchmark = $this.Benchmark + CommandLine = $this.CommandLine + Cycle = $this.ContinousCycle + DeviceNames = $this.DeviceNames -join " " + Duration = "{0:hh\:mm\:ss}" -f ($this.EndTime - $this.BeginTime) + Earning = $this.Earning + Earning_Bias = $this.Earning_Bias + Hashrates = $this.Workers.Hashrate.ForEach({ $_ | ConvertTo-Hash }) -join " & " + LastDataSample = If ($this.Data.Count -ge 1) { $this.Data.Item($this.Data.Count - 1 ) | ConvertTo-Json -Compress } Else { "" } + MeasurePowerConsumption = $this.MeasurePowerConsumption + Pools = ($this.WorkersRunning.Pool.Name | Select-Object -Unique) -join " " + PowerConsumption = "$($this.PowerConsumption.ToString("N2"))W" + Profit = $this.Profit + Profit_Bias = $this.Profit_Bias + Reason = If ($this.Status -eq [MinerStatus]::Failed) { + $this.StatusInfo = $this.StatusInfo.Replace("'$($this.Name)' ", "") -replace '.+stopped. ' -replace '.+sample.*\) ' + $this.StatusInfo.substring(0, 1).toUpper() + $this.StatusInfo.substring(1) + } Else { "" } + Type = $this.Type + } | Export-Csv -Path ".\Logs\SwitchingLog.csv" -Append -NoTypeInformation + + $this.StatusInfo = "Idle" + $this.SubStatus = $this.Status + $this.WorkersRunning = [Worker[]]@() + } + + [MinerStatus]GetStatus() { + If ($this.ProcessJob.State -eq "Running" -and $this.ProcessId -and (Get-Process -Id $this.ProcessId -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProcessName)) { + # Use ProcessName, some crashed miners are dead, but may still be found by their processId + Return [MinerStatus]::Running + } + ElseIf ($this.Status -eq [MinerStatus]::Running) { + Return [MinerStatus]::Failed + } + Else { + Return $this.Status + } + } + + [Void]SetStatus([MinerStatus]$Status) { + Switch ($Status) { + "DryRun" { + $this.Status = [MinerStatus]::DryRun + $this.StartMining() + Break + } + "Idle" { + $this.StopMining() + Break + } + "Running" { + $this.StartMining() + Break + } + Default { + $this.Status = [MinerStatus]::Failed + $this.StopMining() + } + } + } + + [DateTime]GetActiveLast() { + If ($this.Process.BeginTime -and $this.Process.EndTime) { + Return $this.Process.EndTime + } + ElseIf ($this.Process.BeginTime) { + Return [DateTime]::Now.ToUniversalTime() + } + ElseIf ($this.EndTime) { + Return $this.EndTime + } + Else { + Return [DateTime]::MinValue + } + } + + [TimeSpan]GetActiveTime() { + If ($this.Process.BeginTime -and $this.Process.EndTime) { + Return $this.Active + $this.Process.EndTime - $this.Process.BeginTime + } + ElseIf ($this.Process.BeginTime) { + Return $this.Active + [DateTime]::Now - $this.Process.BeginTime + } + Else { + Return $this.Active + } + } + + [Double]GetPowerConsumption() { + $TotalPowerConsumption = [Double]0 + + # Read power consumption from HwINFO64 reg key, otherwise use hardconfigured value + $RegistryData = Get-ItemProperty "HKCU:\Software\HWiNFO64\VSB" + ForEach ($Device in $this.Devices) { + If ($RegistryEntry = $RegistryData.PSObject.Properties.Where({ $_.Value -split " " -contains $Device.Name })) { + $TotalPowerConsumption += [Double](($RegistryData.($RegistryEntry.Name -replace "Label", "Value") -split " ")[0]) + } + Else { + $TotalPowerConsumption += [Double]$Device.ConfiguredPowerConsumption + } + } + Return $TotalPowerConsumption + } + + [Double[]]CollectHashrate([String]$Algorithm = [String]$this.Algorithm, [Boolean]$Safe = $this.Benchmark) { + # Returns an array of two values (safe, unsafe) + $HashrateAverage = [Double]0 + $HashrateVariance = [Double]0 + + $HashrateSamples = @($this.Data.Where({ $_.Hashrate.$Algorithm })) # Do not use 0 valued samples + + $HashrateAverage = ($HashrateSamples.Hashrate.$Algorithm | Measure-Object -Average).Average + $HashrateVariance = $HashrateSamples.Hashrate.$Algorithm | Measure-Object -Average -Minimum -Maximum | ForEach-Object { If ($_.Average) { ($_.Maximum - $_.Minimum) / $_.Average } } + + If ($Safe) { + If ($HashrateSamples.Count -lt 10 -or $HashrateVariance -gt 0.1) { + Return 0, $HashrateAverage + } + Else { + Return ($HashrateAverage * (1 + $HashrateVariance / 2)), $HashrateAverage + } + } + Else { + Return $HashrateAverage, $HashrateAverage + } + } + + [Double[]]CollectPowerConsumption([Boolean]$Safe = $this.MeasurePowerConsumption) { + # Returns an array of two values (safe, unsafe) + $PowerConsumptionAverage = [Double]0 + $PowerConsumptionVariance = [Double]0 + + $PowerConsumptionSamples = @($this.Data.Where({ $_.PowerConsumption })) # Do not use 0 valued samples + + $PowerConsumptionAverage = ($PowerConsumptionSamples.PowerConsumption | Measure-Object -Average).Average + $PowerConsumptionVariance = $PowerConsumptionSamples.Powerusage | Measure-Object -Average -Minimum -Maximum | ForEach-Object { If ($_.Average) { ($_.Maximum - $_.Minimum) / $_.Average } } + + If ($Safe) { + If ($PowerConsumptionSamples.Count -lt 10 -or $PowerConsumptionVariance -gt 0.1) { + Return 0, $PowerConsumptionAverage + } + Else { + Return ($PowerConsumptionAverage * (1 + $PowerConsumptionVariance / 2)), $PowerConsumptionAverage + } + } + Else { + Return $PowerConsumptionAverage, $PowerConsumptionAverage + } + } + + [Void]Refresh([Double]$PowerCostBTCperW, [Hashtable]$Config) { + $this.Best = $false + $this.MinDataSample = $Config.MinDataSample + $this.Prioritize = [Boolean]($this.Workers.Where({ $_.Pool.Prioritize })) + $this.ProcessPriority = If ($this.Type -eq "CPU") { $Config.CPUMinerProcessPriority } Else { $Config.GPUMinerProcessPriority } + $this.Reasons = [System.Collections.Generic.List[String]]@() + If ($this.ReadPowerConsumption -ne $this.Devices.ReadPowerConsumption -notcontains $false) { $this.Restart = $true } + $this.ReadPowerConsumption = $this.Devices.ReadPowerConsumption -notcontains $false + $this.Updated = ($this.Workers.Updated | Measure-Object -Minimum).Minimum + $this.TotalMiningDuration = ($this.Workers.TotalMiningDuration | Measure-Object -Minimum).Minimum + $this.WindowStyle = If ($Config.MinerWindowStyleNormalWhenBenchmarking -and $this.Benchmark) { "normal" } Else { $Config.MinerWindowStyle } + + $this.Workers.ForEach( + { + If ($Stat = Get-Stat -Name "$($this.Name)_$($_.Pool.Algorithm)_Hashrate") { + $_.Disabled = $Stat.Disabled + $_.Hashrate = $Stat.Hour + $Factor = $_.Hashrate * (1 - $_.Fee - $_.Pool.Fee) + $_.Earning = $_.Pool.Price * $Factor + $_.Earning_Accuracy = $_.Pool.Accuracy + $_.Earning_Bias = $_.Pool.Price_Bias * $Factor + $_.TotalMiningDuration = $Stat.Duration + $_.Updated = $Stat.Updated + } + Else { + $_.Disabled = $false + $_.Earning = [Double]::NaN + $_.Earning_Accuracy = [Double]::NaN + $_.Earning_Bias = [Double]::NaN + $_.Fee = 0 + $_.Hashrate = [Double]::NaN + $_.TotalMiningDuration = [TimeSpan]0 + } + } + ) + $this.Benchmark = [Boolean]($this.Workers.Hashrate -match [Double]::NaN) + $this.Disabled = $this.Workers.Disabled -contains $true + + If ($this.Benchmark -eq $true) { + $this.Earning = [Double]::NaN + $this.Earning_Accuracy = [Double]::NaN + $this.Earning_Bias = [Double]::NaN + } + Else { + $this.Earning = 0 + $this.Earning_Bias = 0 + $this.Workers.ForEach({ + $this.Earning += $_.Earning + $this.Earning_Bias += $_.Earning_Bias + }) + $this.Earning_Accuracy = 0 + If ($this.Earning) { $this.Workers.ForEach({ $this.Earning_Accuracy += $_.Earning_Accuracy * $_.Earning / $this.Earning }) } + } + + If ($Stat = Get-Stat -Name "$($this.Name)_PowerConsumption") { + $this.PowerConsumption = $Stat.Week + $this.PowerCost = $this.PowerConsumption * $PowerCostBTCperW + $this.Profit = $this.Earning - $this.PowerCost + $this.Profit_Bias = $this.Earning_Bias - $this.PowerCost + $this.MeasurePowerConsumption = $false + } + Else { + $this.PowerConsumption = [Double]::NaN + $this.PowerCost = [Double]::NaN + $this.Profit = [Double]::NaN + $this.Profit_Bias = [Double]::NaN + } + } +} + +Function Open-CoreRunspace { + + If (-not $Global:CoreRunspace) { + $Global:CoreRunspace = [RunspaceFactory]::CreateRunspace() + $Global:CoreRunspace.ApartmentState = "STA" + $Global:CoreRunspace.Name = "Core" + $Global:CoreRunspace.ThreadOptions = "ReuseThread" + $Global:CoreRunspace.Open() + + $Global:CoreRunspace.SessionStateProxy.SetVariable("Config", $Config) + $Global:CoreRunspace.SessionStateProxy.SetVariable("Stats", $Stats) + $Global:CoreRunspace.SessionStateProxy.SetVariable("Variables", $Variables) + [Void]$Global:CoreRunspace.SessionStateProxy.Path.SetLocation($Variables.MainPath) + + $PowerShell = [PowerShell]::Create() + $PowerShell.Runspace = $Global:CoreRunspace + [Void]$Powershell.AddScript("$($Variables.MainPath)\Includes\Core.ps1") + $Global:CoreRunspace | Add-Member PowerShell $PowerShell + } +} + +Function Close-CoreRunspace { + + If ($Global:CoreRunspace) { + + Stop-Core + + $Variables.Pools.ForEach({ $_.Dispose() }) + $Variables.Pools = [Pool[]]@() + $Variables.PoolsAdded = [Pool[]]@() + $Variables.PoolsExpired = [Pool[]]@() + $Variables.PoolsNew = [Pool[]]@() + $Variables.PoolsUpdated = [Pool[]]@() + + $Variables.Miners.ForEach({ $_.Dispose() }) + $Variables.Miners = [Miner[]]@() + $Variables.MinersBenchmarkingOrMeasuring = [Miner[]]@() + $Variables.MinersBest = [Miner[]]@() + $Variables.MinersBestPerDevice = [Miner[]]@() + $Variables.MinerDeviceNamesCombinations = [Miner[]]@() + $Variables.MinersFailed = [Miner[]]@() + $Variables.MinersMissingBinary = [Miner[]]@() + $Variables.MinerMissingFirewallRule = [Miner[]]@() + $Variables.MinersMissingPrerequisite = [Miner[]]@() + $Variables.MinersOptimal = [Miner[]]@() + $Variables.MinersRunning = [Miner[]]@() + + $Variables.MiningEarning = [Double]0 + $Variables.MiningPowerConsumption = [Double]0 + $Variables.MiningPowerCost = [Double]0 + $Variables.MiningProfit = [Double]0 + + $Global:CoreRunspace.PSObject.Properties.Remove("Job") + + # Must close runspace after miners were stopped, otherwise methods don't work any longer + $Global:CoreRunspace.PowerShell.Dispose() + $Global:CoreRunspace.PowerShell = $null + $Global:CoreRunspace.Close() + $Global:CoreRunspace.Dispose() + + Remove-Variable CoreRunspace -Scope global + + [System.GC]::Collect() + } +} + +Function Start-Core { + + Try { + Open-CoreRunspace + + If ($Global:CoreRunspace.Job.IsCompleted -ne $false) { + $Global:CoreRunspace | Add-Member Job ($Global:CoreRunspace.PowerShell.BeginInvoke()) -Force + $Global:CoreRunspace | Add-Member StartTime ([DateTime]::Now.ToUniversalTime()) -Force + } + } + Catch { + Write-Message -Level Error "Failed to start core [$($Error[0])]." + } +} + +Function Stop-Core { + + If ($Global:CoreRunspace.Job.IsCompleted -eq $false) { + + $Global:CoreRunspace.PowerShell.Stop() + $Variables.Remove("EndCycleTime") + If ($Variables.Timer) { Write-Message -Level Info "Ending cycle." } + + $Variables.Remove("Timer") + $Global:CoreRunspace.PSObject.Properties.Remove("StartTime") + + } + + If ($Variables.Miners) { + ForEach ($Miner in $Variables.Miners.Where({ [MinerStatus]::Running, [MinerStatus]::DryRun -contains $_.Status })) { + 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 $_.AlgorithmVariant -eq $Worker.Pool.AlgorithmVariant -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) + } + + [System.GC]::Collect() + } +} + +Function Start-Brain { + + Param ( + [Parameter(Mandatory = $false)] + [String[]]$Name + ) + + If (Test-Path -LiteralPath ".\Brains" -PathType Container) { + + # Starts Brains if necessary + $BrainsStarted = @() + $Name.ForEach( + { + If ($Config.PoolsConfig.$_.BrainConfig -and -not $Variables.Brains.$_) { + $BrainScript = ".\Brains\$($_).ps1" + If (Test-Path -LiteralPath $BrainScript -PathType Leaf) { + $Variables.Brains.$_ = [RunspaceFactory]::CreateRunspace() + $Variables.Brains.$_.ApartmentState = "STA" + $Variables.Brains.$_.Name = "Brain_$($_)" + $Variables.Brains.$_.ThreadOptions = "ReuseThread" + $Variables.Brains.$_.Open() + + $Variables.Brains.$_.SessionStateProxy.SetVariable("Config", $Config) + $Variables.Brains.$_.SessionStateProxy.SetVariable("Stats", $Stats) + $Variables.Brains.$_.SessionStateProxy.SetVariable("Variables", $Variables) + [Void]$Variables.Brains.$_.SessionStateProxy.Path.SetLocation($Variables.MainPath) + + $PowerShell = [PowerShell]::Create() + $PowerShell.Runspace = $Variables.Brains.$_ + $Variables.Brains.$_ | Add-Member Job ($Powershell.AddScript($BrainScript).BeginInvoke()) + $Variables.Brains.$_ | Add-Member PowerShell $PowerShell + $Variables.Brains.$_ | Add-Member StartTime ([DateTime]::Now.ToUniversalTime()) + + $BrainsStarted += $_ + } + } + } + ) + If ($BrainsStarted.Count -gt 0) { Write-Message -Level Info "Pool brain backgound job$(If ($BrainsStarted.Count -gt 1) { "s" }) for $($BrainsStarted -join ", " -replace ",([^,]*)$", ' &$1') started." } + } + Else { + Write-Message -Level Error "Failed to start Pool brain backgound jobs. Directory '.\Brains' is missing." + } +} + +Function Stop-Brain { + + Param ( + [Parameter(Mandatory = $false)] + [String[]]$Name = $Variables.Brains.psBase.Keys + ) + + If ($Name) { + + $BrainsStopped = @() + + $Name.Where({ $Variables.Brains.$_ }).ForEach( + { + # Stop Brains + $Variables.Brains[$_].PowerShell.Stop() + $Variables.Brains[$_].PowerShell.Runspace.Dispose() + $Variables.Brains[$_].PowerShell.Dispose() + $Variables.Brains[$_].Close() + $Variables.Brains[$_].Dispose() + + $Variables.Brains[$_].PSObject.Properties.Remove("Job") + $Variables.Brains[$_].PSObject.Properties.Remove("PowerShell") + $Variables.Brains[$_].PSObject.Properties.Remove("StartTime") + + $Variables.Brains.Remove($_) + $Variables.BrainData.Remove($_) + + $BrainsStopped += $_ + } + ) + If ($BrainsStopped.Count -gt 0) { Write-Message -Level Info "Pool brain backgound job$(If ($BrainsStopped.Count -gt 1) { "s" }) for $(($BrainsStopped | Sort-Object) -join ", " -replace ",([^,]*)$", ' &$1') stopped." } + + [System.GC]::Collect() + } +} + +Function Open-BalancesTrackerRunspace { + + If (Test-Path -LiteralPath ".\Balances" -PathType Container) { + If (-not $Global:BalancesTrackerRunspace) { + $Global:BalancesTrackerRunspace = [RunspaceFactory]::CreateRunspace() + $Global:BalancesTrackerRunspace.ApartmentState = "STA" + $Global:BalancesTrackerRunspace.Name = "BalancesTracker" + $Global:BalancesTrackerRunspace.ThreadOptions = "ReuseThread" + $Global:BalancesTrackerRunspace.Open() + + $Global:BalancesTrackerRunspace.SessionStateProxy.SetVariable("Config", $Config) + $Global:BalancesTrackerRunspace.SessionStateProxy.SetVariable("Stats", $Stats) + $Global:BalancesTrackerRunspace.SessionStateProxy.SetVariable("Variables", $Variables) + [Void]$Global:BalancesTrackerRunspace.SessionStateProxy.Path.SetLocation($Variables.MainPath) + + $PowerShell = [PowerShell]::Create() + $PowerShell.Runspace = $Global:BalancesTrackerRunspace + [Void]$Powershell.AddScript("$($Variables.MainPath)\Includes\BalancesTracker.ps1") + $Global:BalancesTrackerRunspace | Add-Member PowerShell $PowerShell + } + } + Else { + Write-Message -Level Error "Failed to start Balances tracker. Directory '.\Balances' is missing." + } +} + +Function Close-BalancesTrackerRunspace { + + If ($Global:BalancesTrackerRunspace) { + + Stop-BalancesTracker + + $Global:BalancesTrackerRunspace.PSObject.Properties.Remove("Job") + + $Global:BalancesTrackerRunspace.PowerShell.Dispose() + $Global:BalancesTrackerRunspace.PowerShell = $null + $Global:BalancesTrackerRunspace.Close() + $Global:BalancesTrackerRunspace.Dispose() + + Remove-Variable BalancesTrackerRunspace -Scope global + + [System.GC]::Collect() + } +} + +Function Start-BalancesTracker { + + Open-BalancesTrackerRunspace + + If ($Global:BalancesTrackerRunspace) { + Try { + + If ($Global:BalancesTrackerRunspace.Job.IsCompleted -ne $false) { + $Global:BalancesTrackerRunspace | Add-Member Job ($Global:BalancesTrackerRunspace.PowerShell.BeginInvoke()) -Force + $Global:BalancesTrackerRunspace | Add-Member StartTime ([DateTime]::Now.ToUniversalTime()) -Force + + $Variables.Summary = "Balances tracker background process started." + Write-Message -Level Info $Variables.Summary + } + } + Catch { + Write-Message -Level Error "Failed to start Balances tracker [$($Error[0])]." + } + } +} + +Function Stop-BalancesTracker { + + If ($Global:BalancesTrackerRunspace.Job.IsCompleted -eq $false) { + + $Global:BalancesTrackerRunspace.PowerShell.Stop() + + $Global:BalancesTrackerRunspace.PSObject.Properties.Remove("StartTime") + + $Variables.BalancesTrackerRunning = $false + + $Variables.Summary = "Balances tracker background process stopped." + Write-Message -Level Info $Variables.Summary + + [System.GC]::Collect() + } +} + +Function Get-Rate { + + $RatesCacheFileName = "$($Variables.MainPath)\Cache\Rates.json" + + # Use stored currencies from last run + If (-not $Variables.BalancesCurrencies -and $Config.BalancesTrackerPollInterval) { $Variables.BalancesCurrencies = $Variables.Rates.PSObject.Properties.Name -creplace "^m" } + + $Variables.AllCurrencies = @(@(@($Config.FIATcurrency) + @($Config.Wallets.psBase.Keys) + @($Variables.PoolData.Keys.ForEach({ $Variables.PoolData.$_.GuaranteedPayoutCurrencies })) + @($Config.ExtraCurrencies) + @($Variables.BalancesCurrencies) | Select-Object) -replace "mBTC", "BTC" | Sort-Object -Unique) + + Try { + $TSymBatches = @() + $TSyms = "BTC" + $Variables.AllCurrencies.Where({ $_ -notin @("BTC", "INVALID") }).ForEach( + { + If (($TSyms.Length + $_.Length) -lt 99) { + $TSyms = "$TSyms,$($_)" + } + Else { + $TSymBatches += $TSyms + $TSyms = $_ + } + } + ) + $TSymBatches += $TSyms + + $Rates = [PSCustomObject]@{ BTC = [PSCustomObject]@{ } } + $TSymBatches.ForEach( + { + $Response = Invoke-RestMethod -Uri "https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC&tsyms=$($_)$(If ($Config.CryptoCompareAPIKeyParam) { "&api_key=$($Config.CryptoCompareAPIKeyParam)" })&extraParams=$($Variables.Branding.BrandWebSite) Version $($Variables.Branding.Version)" -TimeoutSec 5 -ErrorAction Ignore + If ($Response.BTC) { + $Response.BTC.ForEach( + { + $_.PSObject.Properties.ForEach({ $Rates.BTC | Add-Member @{ "$($_.Name)" = $_.Value } -Force }) + } + ) + } + Else { + If ($Response.Message -eq "You are over your rate limit please upgrade your account!") { + Write-Message -Level Error "min-api.cryptocompare.com API rate exceeded. You need to register an account with cryptocompare.com and add the API key as 'CryptoCompareAPIKeyParam' to the configuration file '$($Variables.ConfigFile.Replace("$(Convert-Path ".\")\", ".\"))'." + } + } + } + ) + + If ($Currencies = $Rates.BTC.PSObject.Properties.Name) { + $Currencies.Where({ $_ -ne "BTC" }).ForEach( + { + $Currency = $_ + $Rates | Add-Member $Currency $Rates.BTC.PSObject.Copy() -Force + $Rates.$Currency.PSObject.Properties.Name.ForEach( + { + $Rates.$Currency | Add-Member $_ ([Double]($Rates.BTC.$_ / $Rates.BTC.$Currency)) -Force + } + ) + } + ) + + # Add mBTC + If ($Config.UsemBTC) { + $Currencies.ForEach( + { + $Currency = $_ + $mCurrency = "m$Currency" + $Rates | Add-Member $mCurrency $Rates.$Currency.PSObject.Copy() -Force + $Rates.$mCurrency.PSOBject.Properties.Name.ForEach({ $Rates.$mCurrency | Add-Member $_ ([Double]$Rates.$Currency.$_ / 1000) -Force }) + } + ) + $Rates.PSOBject.Properties.Name.ForEach( + { + $Currency = $_ + $Rates.PSOBject.Properties.Name.Where({ $Currencies -contains $_ }).ForEach( + { + $mCurrency = "m$($_)" + $Rates.$Currency | Add-Member $mCurrency ([Double]$Rates.$Currency.$_ * 1000) -Force + } + ) + } + ) + } + Write-Message -Level Info "Loaded currency exchange rates from 'min-api.cryptocompare.com'.$(If ($Variables.RatesMissingCurrencies = Compare-Object @($Currencies | Select-Object) @($Variables.AllCurrencies | Select-Object) -PassThru) { " API does not provide rates for $($Variables.RatesMissingCurrencies -join ", " -replace ",([^,]*)$", ' &$1'). $($Variables.Branding.ProductLabel) cannot calculate FIAT or BTC value for $(If ($Variables.RatesMissingCurrencies.Count -ne 1) { "these currencies" } Else { "this currency" })." })" + $Variables.Rates = $Rates + $Variables.RatesUpdated = [DateTime]::Now.ToUniversalTime() + + $Variables.Rates | ConvertTo-Json -Depth 5 | Out-File -LiteralPath $RatesCacheFileName -Force -ErrorAction Ignore + } + } + Catch { + # Read exchange rates from min-api.cryptocompare.com, use stored data as fallback + $RatesCache = ([System.IO.File]::ReadAllLines($RatesCacheFileName) | ConvertFrom-Json -ErrorAction Ignore) + If ($RatesCache.PSObject.Properties.Name) { + $Variables.Rates = $RatesCache + Write-Message -Level Warn "Could not load exchange rates from 'min-api.cryptocompare.com'. Using cached data from $((Get-Item -Path $RatesCacheFileName).LastWriteTime)." + } + Else { + Write-Message -Level Warn "Could not load exchange rates from 'min-api.cryptocompare.com'." + } + } +} + +Function Write-Message { + + Param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [String]$Message, + [Parameter(Mandatory = $false)] + [String]$Level = "Info" + ) + + $Message = $Message -replace "
", " " -replace " ", " " + + # Make sure we are in main script + If ($Host.Name -eq "ConsoleHost" -and (-not $Config.Keys -or $Config.LogToScreen -contains $Level)) { + # Write to console + Switch ($Level) { + "Debug" { Write-Host $Message -ForegroundColor "Blue" } + "Error" { Write-Host $Message -ForegroundColor "Red" } + "Info" { Write-Host $Message -ForegroundColor "White" } + "MemDbg" { Write-Host $Message -ForegroundColor "Cyan" } + "Verbose" { Write-Host $Message -ForegroundColor "Yello" } + "Warn" { Write-Host $Message -ForegroundColor "Magenta" } + } + } + + Switch ($Level) { + "Debug" { $Message = "[DEBUG ] $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") $Message" } + "Error" { $Message = "[ERROR ] $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") $Message" } + "Info" { $Message = "[INFO ] $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") $Message" } + "MemDbg" { $Message = "[MEMDBG ] $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") $Message" } + "Verbose" { $Message = "[VERBOSE] $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") $Message" } + "Warn" { $Message = "[WARN ] $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") $Message" } + } + + If ($Variables.TextBoxSystemLog) { + # Ignore error when legacy GUI gets closed + Try { + If (-not $Config.Keys.Count -or $Config.LogToScreen -contains $Level) { + $SelectionLength = $Variables.TextBoxSystemLog.SelectionLength + $SelectionStart = $Variables.TextBoxSystemLog.SelectionStart + $TextLength = $Variables.TextBoxSystemLog.TextLength + + If ($Variables.TextBoxSystemLog.Lines.Count -gt 250) { + # Keep only 200 lines, more lines impact performance + $Variables.TextBoxSystemLog.Lines = $Variables.TextBoxSystemLog.Lines | Select-Object -Last 200 + } + + $SelectionStart += ($Variables.TextBoxSystemLog.TextLength - $TextLength) + If ($SelectionLength -and $SelectionStart -ge 0) { + $Variables.TextBoxSystemLog.Lines += $Message + $Variables.TextBoxSystemLog.Select($SelectionStart, $SelectionLength) + $Variables.TextBoxSystemLog.ScrollToCaret() + } + Else { + $Variables.TextBoxSystemLog.AppendText("`r`n$Message") + } + } + } + Catch { } + } + + If (-not $Config.Keys.Count -or $Config.LogToFile -contains $Level) { + + $Variables.LogFile = "$($Variables.MainPath)\Logs\$($Variables.Branding.ProductLabel)_$(Get-Date -Format "yyyy-MM-dd").log" + + # Get mutex. Mutexes are shared across all threads and processes. + # This lets us ensure only one thread is trying to write to the file at a time. + $Mutex = New-Object System.Threading.Mutex($false, "$($Variables.Branding.ProductLabel)_Write-Message") + + # Attempt to aquire mutex, waiting up to 1 second if necessary + If ($Mutex.WaitOne(1000)) { + $Message | Out-File -LiteralPath $Variables.LogFile -Append -ErrorAction Ignore + $Mutex.ReleaseMutex() + } + } +} + +Function Write-MonitoringData { + + # Updates a remote monitoring server, sending this worker's data and pulling data about other workers + + # Skip If server and user aren't filled out + If (-not $Config.MonitoringServer) { Return } + If (-not $Config.MonitoringUser) { Return } + + # Build object with just the data we need to send, and make sure to use relative paths so we don't accidentally + # reveal someone's windows username or other system information they might not want sent + # For the ones that can be an array, comma separate them + $Data = @( + ($Variables.Miners.Where({ $_.Status -eq [MinerStatus]::DryRun -or $_.Status -eq [MinerStatus]::Running }) | Sort-Object { [String]$_.DeviceNames }).ForEach( + { + [PSCustomObject]@{ + Algorithm = $_.WorkersRunning.Pool.Algorithm -join "," + Currency = $Config.FIATcurrency + CurrentSpeed = $_.Hashrates_Live + Earning = ($_.WorkersRunning.Earning | Measure-Object -Sum | Select-Object -ExpandProperty Sum) + EstimatedSpeed = $_.WorkersRunning.Hashrate + Name = $_.Name + Path = Resolve-Path -Relative $_.Path + Pool = $_.WorkersRunning.Pool.Name -join "," + Profit = If ($_.Profit) { $_.Profit } ElseIf ($Variables.CalculatePowerCost) { ($_.WorkersRunning.Profit | Measure-Object -Sum | Select-Object -ExpandProperty Sum) - $_.PowerConsumption_Live * $Variables.PowerCostBTCperW } Else { [Double]::Nan } + Type = $_.Type + } + } + ) + ) + + $Body = @{ + user = $Config.MonitoringUser + worker = $Config.WorkerName + version = "$($Variables.Branding.ProductLabel) $($Variables.Branding.Version.ToString())" + status = $Variables.NewMiningStatus + profit = If ([Double]::IsNaN($Variables.MiningProfit)) { "n/a" } Else { [String]$Variables.MiningProfit } # Earnings is NOT profit! Needs to be changed in mining monitor server + data = ConvertTo-Json $Data + } + + # Send the request + Try { + $Response = Invoke-RestMethod -Uri "$($Config.MonitoringServer)/api/report.php" -Method Post -Body $Body -TimeoutSec 10 -ErrorAction Stop + If ($Response -eq "Success") { + Write-Message -Level Verbose "Reported worker status to monitoring server '$($Config.MonitoringServer)' [ID $($Config.MonitoringUser)]." + } + Else { + Write-Message -Level Verbose "Reporting worker status to monitoring server '$($Config.MonitoringServer)' failed: [$($Response)]." + } + } + Catch { + Write-Message -Level Warn "Monitoring: Unable to send status to monitoring server '$($Config.MonitoringServer)' [ID $($Config.MonitoringUser)]." + } +} + +Function Read-MonitoringData { + + If ($Config.ShowWorkerStatus -and $Config.MonitoringUser -and $Config.MonitoringServer -and $Variables.WorkersLastUpdated -lt [DateTime]::Now.AddSeconds(-30)) { + Try { + $Workers = Invoke-RestMethod -Uri "$($Config.MonitoringServer)/api/workers.php" -Method Post -Body @{ user = $Config.MonitoringUser } -TimeoutSec 10 -ErrorAction Stop + # Calculate some additional properties and format others + $Workers.ForEach( + { + # Convert the unix timestamp to a datetime object, taking into account the local time zone + $_ | Add-Member @{ date = [TimeZone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($_.lastseen)) } -Force + + # If a machine hasn't reported in for more than 10 minutes, mark it as offline + If ((New-TimeSpan -Start $_.date -End ([DateTime]::Now)).TotalMinutes -gt 10) { $_.status = "Offline" } + } + ) + $Variables.Workers = $Workers + $Variables.WorkersLastUpdated = ([DateTime]::Now) + + Write-Message -Level Verbose "Retrieved worker status from '$($Config.MonitoringServer)' [ID $($Config.MonitoringUser)]." + } + Catch { + Write-Message -Level Warn "Monitoring: Unable to retrieve worker data from '$($Config.MonitoringServer)' [ID $($Config.MonitoringUser)]." + } + } +} + +Function Get-TimeSince { + # Show friendly time since in days, hours, minutes and seconds + + Param ( + [Parameter(Mandatory = $true)] + [DateTime]$TimeStamp + ) + + $TimeSpan = New-TimeSpan -Start $TimeStamp -End ([DateTime]::Now) + $TimeSince = "" + + If ($TimeSpan.Days -ge 1) { $TimeSince += " {0:n0} day$(If ($TimeSpan.Days -ne 1) { "s" })" -f $TimeSpan.Days } + If ($TimeSpan.Hours -ge 1) { $TimeSince += " {0:n0} hour$(If ($TimeSpan.Hours -ne 1) { "s" })" -f $TimeSpan.Hours } + If ($TimeSpan.Minutes -ge 1) { $TimeSince += " {0:n0} minute$(If ($TimeSpan.Minutes -ne 1) { "s" })" -f $TimeSpan.Minutes } + If ($TimeSpan.Seconds -ge 1) { $TimeSince += " {0:n0} second$(If ($TimeSpan.Seconds -ne 1) { "s" })" -f $TimeSpan.Seconds } + If ($TimeSince) { $TimeSince += " ago" } Else { $TimeSince = "just now" } + + Return $TimeSince +} + +Function Merge-Hashtable { + + Param ( + [Parameter(Mandatory = $true)] + [Hashtable]$HT1, + [Parameter(Mandatory = $true)] + [Hashtable]$HT2, + [Parameter(Mandatory = $false)] + [Boolean]$Unique = $false + ) + + $HT2.psBase.Keys.ForEach( + { + If ($HT1.$_ -is [Hashtable]) { + $HT1[$_] = Merge-Hashtable -HT1 $HT1[$_] -Ht2 $HT2.$_ -Unique $Unique + } + ElseIf ($HT1.$_ -is [Array]) { + If ($HT2.$_) { + $HT1.$_ += $HT2.$_ + If ($Unique) { $HT1.$_ = ($HT1.$_ | Sort-Object -Unique) -as [Array] } + } + } + Else { + $HT1.$_ = $HT2.$_ -as $HT2.$_.GetType() + } + } + ) + Return $HT1 +} + +Function Get-RandomDonationPoolsConfig { + # Randomize donation data + # Build pool config with available donation data, not all devs have the same set of wallets available + + $Variables.DonationRandom = $Variables.DonationData | Get-Random + $DonationRandomPoolsConfig = [Ordered]@{ } + ((Get-ChildItem .\Pools\*.ps1 -File).BaseName | Sort-Object -Unique).Where({ $Variables.DonationRandom.PoolName -contains $_ }).ForEach( + { + $PoolConfig = $Config.PoolsConfig[$_] | ConvertTo-Json -Depth 99 -Compress | ConvertFrom-Json -AsHashtable + $PoolConfig.EarningsAdjustmentFactor = 1 + $PoolConfig.Region = $Config.PoolsConfig[$_].Region + $PoolConfig.WorkerName = "$($Variables.Branding.ProductLabel)-$($Variables.Branding.Version.ToString())-donate$($Config.Donation)" + Switch -regex ($_) { + "^MiningDutch$|^ProHashing$" { + If ($Variables.DonationRandom."$($_)UserName") { + # not all devs have a known HashCryptos, MiningDutch or ProHashing account + $PoolConfig.UserName = $Variables.DonationRandom."$($_)UserName" + $PoolConfig.Variant = $Config.PoolsConfig[$_].Variant + $DonationRandomPoolsConfig.$_ = $PoolConfig + } + Break + } + Default { + # not all devs have a known ETC or ETH address + If (Compare-Object @($Variables.PoolData.$_.GuaranteedPayoutCurrencies | Select-Object) @($Variables.DonationRandom.Wallets.PSObject.Properties.Name | Select-Object) -IncludeEqual -ExcludeDifferent) { + $PoolConfig.Variant = If ($Config.PoolsConfig[$_].Variant) { $Config.PoolsConfig[$_].Variant } Else { $Config.PoolName -match $_ } + $PoolConfig.Wallets = $Variables.DonationRandom.Wallets | ConvertTo-Json | ConvertFrom-Json -AsHashtable + $DonationRandomPoolsConfig.$_ = $PoolConfig + } + } + } + } + ) + Return $DonationRandomPoolsConfig +} + +Function Read-Config { + + Param ( + [Parameter(Mandatory = $true)] + [String]$ConfigFile + ) + + Function Get-DefaultConfig { + + $DefaultConfig = @{ } + + $DefaultConfig.ConfigFileVersion = $Variables.Branding.Version.ToString() + $Variables.FreshConfig = $true + + # Add default config items + $Variables.AllCommandLineParameters.psBase.Keys.Where({ $_ -notin $DefaultConfig.psBase.Keys }).ForEach( + { + $Value = $Variables.AllCommandLineParameters.$_ + If ($Value -is [Switch]) { $Value = [Boolean]$Value } + $DefaultConfig.$_ = $Value + } + ) + + $RandomDonationData = $Variables.DonationData | Get-Random + $DefaultConfig.MiningDutchUserName = $RandomDonationData.MiningDutchUserName + $DefaultConfig.NiceHashWallet = $RandomDonationData.Wallets.BTC + $DefaultConfig.ProHashingUserName = $RandomDonationData.ProHashingUserName + $DefaultConfig.Wallets.BTC = $RandomDonationData.Wallets.BTC + + Return $DefaultConfig + } + + Function Get-PoolsConfig { + + # Load pool data + If (-not $Variables.PoolData) { + $Variables.PoolData = [System.IO.File]::ReadAllLines("$PWD\Data\PoolData.json") | ConvertFrom-Json -AsHashtable | Get-SortedObject + $Variables.PoolVariants = @(($Variables.PoolData.psBase.Keys.ForEach({ $Variables.PoolData.$_.Variant.psBase.Keys }).Where({ Test-Path -LiteralPath "$PWD\Pools\$(Get-PoolBaseName $_).ps1" })) | Sort-Object -Unique) + If (-not $Variables.PoolVariants) { + Write-Message -Level Error "Terminating Error - Cannot continue! File '.\Data\PoolData.json' is not a valid $($Variables.Branding.ProductLabel) JSON data file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\PoolData.json' is not a valid $($Variables.Branding.ProductLabel) JSON data file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + } + + # Build in memory pool config + $PoolsConfig = @{ } + ((Get-ChildItem .\Pools\*.ps1 -File).BaseName | Sort-Object -Unique).ForEach( + { + $PoolName = $_ + If ($PoolConfig = $Variables.PoolData.$PoolName | Get-SortedObject) { + # Generic algorithm disabling is done in pool files + $PoolConfig.Remove("Algorithm") + + If ($CustomPoolConfig = $Variables.PoolsConfigData.$PoolName) { + # Merge default config data with custom pool config + $PoolConfig = Merge-Hashtable -HT1 $PoolConfig -HT2 $CustomPoolConfig -Unique $true + } + + If (-not $PoolConfig.EarningsAdjustmentFactor) { + $PoolConfig.EarningsAdjustmentFactor = $ConfigFromFile.EarningsAdjustmentFactor + } + If ($PoolConfig.EarningsAdjustmentFactor -le 0 -or $PoolConfig.EarningsAdjustmentFactor -gt 10) { + $PoolConfig.EarningsAdjustmentFactor = $ConfigFromFile.EarningsAdjustmentFactor + Write-Message -Level Warn "Earnings adjustment factor (value: $($PoolConfig.EarningsAdjustmentFactor)) for pool '$PoolName' is not within supported range (0 - 10); using default value $($PoolConfig.EarningsAdjustmentFactor)." + } + + If (-not $PoolConfig.WorkerName) { $PoolConfig.WorkerName = $ConfigFromFile.WorkerName } + If (-not $PoolConfig.BalancesKeepAlive) { $PoolConfig.BalancesKeepAlive = $PoolData.$PoolName.BalancesKeepAlive } + + $PoolConfig.Region = $PoolConfig.Region.Where({ (Get-Region $_) -notin @($PoolConfig.ExcludeRegion) }) + + Switch ($PoolName) { + "Hiveon" { + If (-not $PoolConfig.Wallets) { + $PoolConfig.Wallets = [Ordered]@{ } + $ConfigFromFile.Wallets.GetEnumerator().Name.Where({ $PoolConfig.PayoutCurrencies -contains $_ }).ForEach({ $PoolConfig.Wallets.$_ = $ConfigFromFile.Wallets.$_ }) + } + Break + } + "MiningDutch" { + If ((-not $PoolConfig.PayoutCurrency) -or $PoolConfig.PayoutCurrency -eq "[Default]") { $PoolConfig.PayoutCurrency = $ConfigFromFile.PayoutCurrency } + If (-not $PoolConfig.UserName) { $PoolConfig.UserName = $ConfigFromFile.MiningDutchUserName } + Break + } + "MiningPoolHub" { + If (-not $PoolConfig.UserName) { $PoolConfig.UserName = $ConfigFromFile.MiningPoolHubUserName } + Break + } + "NiceHash" { + If ($ConfigFromFile.NiceHashWallet) { $PoolConfig.Wallets = [Ordered]@{ "BTC" = $ConfigFromFile.NiceHashWallet } } + Break + } + "ProHashing" { + If (-not $PoolConfig.UserName) { $PoolConfig.UserName = $ConfigFromFile.ProHashingUserName } + If (-not $PoolConfig.MiningMode) { $PoolConfig.MiningMode = $ConfigFromFile.ProHashingMiningMode } + Break + } + Default { + If ((-not $PoolConfig.PayoutCurrency) -or $PoolConfig.PayoutCurrency -eq "[Default]") { $PoolConfig.PayoutCurrency = $ConfigFromFile.PayoutCurrency } + If (-not $PoolConfig.Wallets) { $PoolConfig.Wallets = $ConfigFromFile.Wallets } + } + } + If ($PoolConfig.Algorithm) { $PoolConfig.Algorithm = @($PoolConfig.Algorithm -replace " " -split ",") } + } + $PoolsConfig.$PoolName = $PoolConfig + } + ) + Return $PoolsConfig + } + + # Load the configuration + $ConfigFromFile = @{ } + If (Test-Path -LiteralPath $ConfigFile -PathType Leaf) { + $ConfigFromFile = [System.IO.File]::ReadAllLines($ConfigFile) | ConvertFrom-Json -AsHashtable | Get-SortedObject + If ($ConfigFromFile.psBase.Keys.Count -eq 0) { + $CorruptConfigFile = "$($ConfigFile)_$(Get-Date -Format "yyyy-MM-dd_HH-mm-ss").corrupt" + Move-Item -Path $ConfigFile $CorruptConfigFile -Force + $Message = "Configuration file '$ConfigFile' is corrupt and was renamed to '$CorruptConfigFile'." + Write-Message -Level Warn $Message + $ConfigFromFile = Get-DefaultConfig + } + Else { + $Variables.ConfigFileTimestamp = (Get-Item -Path $Variables.ConfigFile).LastWriteTime + ($Variables.AllCommandLineParameters.psBase.Keys | Sort-Object).ForEach( + { + If ($ConfigFromFile.psBase.Keys -contains $_) { + # Upper / lower case conversion of variable keys (Web GUI is case sensitive) + $Value = $ConfigFromFile.$_ + $ConfigFromFile.Remove($_) + If ($Variables.AllCommandLineParameters.$_ -is [Switch]) { + $ConfigFromFile.$_ = [Boolean]$Value + } + ElseIf ($Variables.AllCommandLineParameters.$_ -is [Array]) { + $ConfigFromFile.$_ = [Array]$Value + } + Else { + $ConfigFromFile.$_ = $Value -as $Variables.AllCommandLineParameters.$_.GetType().Name + } + } + Else { + # Config parameter not in config file - use hardcoded value + $Value = $Variables.AllCommandLineParameters.$_ + If ($Value -is [Switch]) { $Value = [Boolean]$Value } + $ConfigFromFile.$_ = $Value + } + } + ) + } + If ($ConfigFromFile.EarningsAdjustmentFactor -le 0 -or $ConfigFromFile.EarningsAdjustmentFactor -gt 10) { + $ConfigFromFile.EarningsAdjustmentFactor = 1 + Write-Message -Level Warn "Default Earnings adjustment factor (value: $($ConfigFromFile.EarningsAdjustmentFactor)) is not within supported range (0 - 10); using default value $($ConfigFromFile.EarningsAdjustmentFactor)." + } + } + Else { + $ConfigFromFile = Get-DefaultConfig + } + + # Build custom pools configuration, create case insensitive hashtable (https://stackoverflow.com/questions/24054147/powershell-hash-tables-double-key-error-a-and-a) + If ($Variables.PoolsConfigFile -and (Test-Path -LiteralPath $Variables.PoolsConfigFile -PathType Leaf)) { + Try { + $Variables.PoolsConfigData = [System.IO.File]::ReadAllLines($Variables.PoolsConfigFile) | ConvertFrom-Json -AsHashtable | Get-SortedObject + $Variables.PoolsConfigFileTimestamp = (Get-Item -Path $Variables.PoolsConfigFile).LastWriteTime + } + Catch { + $Variables.PoolsConfigData = [Ordered]@{ } + Write-Message -Level Warn "Pools configuration file '$($Variables.PoolsConfigFile.Replace("$(Convert-Path ".\")\", ".\"))' is corrupt and will be ignored." + } + } + + $ConfigFromFile.PoolsConfig = Get-PoolsConfig + + # Must update existing thread safe variable. Reassignment breaks updates to instances in other threads + $ConfigFromFile.psBase.Keys.ForEach({ $Global:Config.$_ = $ConfigFromFile.$_ }) + + $Variables.ShowAccuracy = $Config.ShowAccuracy + $Variables.ShowAllMiners = $Config.ShowAllMiners + $Variables.ShowCoinName = $Config.ShowCoinName + $Variables.ShowCurrency = $Config.ShowCurrency + $Variables.ShowEarning = $Config.ShowEarning + $Variables.ShowEarningBias = $Config.ShowEarningBias + $Variables.ShowHashrate = $Config.ShowHashrate + $Variables.ShowMinerFee = $Config.ShowMinerFee + $Variables.ShowPool = $Config.ShowPool + $Variables.ShowPoolBalances = $Config.ShowPoolBalances + $Variables.ShowPoolFee = $Config.ShowPoolFee + $Variables.ShowProfit = $Config.ShowProfit + $Variables.ShowProfitBias = $Config.ShowProfitBias + $Variables.ShowPowerConsumption = $Config.ShowPowerConsumption + $Variables.ShowPowerCost = $Config.ShowPowerCost + $Variables.ShowUser = $Config.ShowUser + $Variables.UIStyle = $Config.UIStyle + + $Variables.ConfigReadTimestamp = [DateTime]::Now.ToUniversalTime() +} + +Function Update-ConfigFile { + + Param ( + [Parameter(Mandatory = $true)] + [String]$ConfigFile + ) + + $Variables.ConfigurationHasChangedDuringUpdate = [System.Collections.Generic.List[String]]@() + + # NiceHash Internal is no longer available as of November 12, 2024 + If ($Config.PoolName -contains "NiceHash") { + If ($null -ne $Config.NiceHashWalletIsInternal -and -not $Config.NiceHashWalletIsInternal) { + Write-Message -Level Warn "Pool configuration changed during update (NiceHash [External] removed - to mine with NiceHash you must register)." + $Variables.ConfigurationHasChangedDuringUpdate.Add("- Pool 'NiceHash' [External] removed") + $Config.PoolName = $Config.PoolName -notmatch "NiceHash" + $Config.Remove("NiceHashWallet") + } + } + $Config.Remove("NiceHashWalletIsInternal") + + # MiningPoolHub is no longer available + If ($Config.PoolName -contains "MiningPoolHub") { + Write-Message -Level Warn "Pool configuration changed during update (MiningPoolHub removed)." + $Variables.ConfigurationHasChangedDuringUpdate.Add("- Pool 'MiningPoolHub' removed") + $Config.PoolName = $Config.PoolName -notmatch "MiningPoolHub" + } + + # ZergPoolCoins is no longer available + If ($Config.PoolName -like "ZergPoolCoins*") { + Write-Message -Level Warn "Pool configuration changed during update ($($Config.PoolName.Where({ $_ -like '*Coins*' })) -> $($Config.PoolName.Where({ $_ -like '*Coins*' }) -replace 'Coins' ))." + $Variables.ConfigurationHasChangedDuringUpdate.Add("- Pool configuration changed ($($Config.PoolName.Where({ $_ -like '*Coins*' })) -> $($Config.PoolName.Where({ $_ -like '*Coins*' }) -replace 'Coins' ))") + $Config.PoolName = $Config.PoolName -replace 'Coins' + } + + # Available regions have changed + If ((Get-Region $Config.Region -List) -notcontains $Config.Region) { + $OldRegion = $Config.Region + # Write message about new mining regions + $Config.Region = Switch ($OldRegion) { + "Brazil" { "USA West" } + "Europe East" { "Europe" } + "Europe North" { "Europe" } + "India" { "Asia" } + "US" { "USA West" } + Default { "Europe" } + } + Write-Message -Level Warn "Available mining locations have changed during update ($OldRegion -> $($Config.Region))". + $Variables.ConfigurationHasChangedDuringUpdate.Add("- Mining locations have changed ($OldRegion -> $($Config.Region))") + } + + # Changed config items + ($Config.GetEnumerator().Name | Sort-Object).ForEach( + { + Switch ($_) { + # "OldParameterName" { $Config.NewParameterName = $Config.$_; $Config.Remove($_) } + "BalancesShowInMainCurrency" { $Config.BalancesShowInFIATcurrency = $Config.$_; $Config.Remove($_) } + "MainCurrency" { $Config.FIATcurrency = $Config.$_; $Config.Remove($_) } + "MinerInstancePerDeviceModel" { $Config.Remove($_) } + Default { If ($_ -notin @(@($Variables.AllCommandLineParameters.psBase.Keys) + @("CryptoCompareAPIKeyParam") + @("DryRun") + @("PoolsConfig") + @("PoolsConfig"))) { $Config.Remove($_) } } # Remove unsupported config items + } + } + ) + + $Config.ConfigFileVersion = $Variables.Branding.Version.ToString() + Write-Config -ConfigFile $ConfigFile -Config $Config + Write-Message -Level Verbose "Updated configuration file '$($ConfigFile)' to version $($Variables.Branding.Version.ToString())." +} + +Function Write-Config { + + Param ( + [Parameter(Mandatory = $true)] + [String]$ConfigFile, + [Parameter(Mandatory = $true)] + [PSCustomObject]$Config + ) + + If (Test-Path -LiteralPath $ConfigFile -PathType Leaf) { + Copy-Item -Path $ConfigFile -Destination "$($ConfigFile)_$(Get-Date -Format "yyyy-MM-dd_HH-mm-ss").backup" + Get-ChildItem -Path "$($ConfigFile)_*.backup" -File | Sort-Object -Property LastWriteTime | Select-Object -SkipLast 10 | Remove-Item -Force -Recurse # Keep 10 backup copies + } + + $NewConfig = $Config.Clone() + + $NewConfig.Remove("ConfigFile") + $NewConfig.Remove("PoolsConfig") + + $Header = +"// This file was generated by $($Variables.Branding.ProductLabel) +// $($Variables.Branding.ProductLabel) will automatically add / convert / rename / update new settings when updating to a new version +" + "$Header$($NewConfig | Get-SortedObject | ConvertTo-Json -Depth 10)" | Out-File -LiteralPath $ConfigFile -Force + + $Variables.ShowAccuracy = $Config.ShowAccuracy + $Variables.ShowAllMiners = $Config.ShowAllMiners + $Variables.ShowCoinName = $Config.ShowCoinName + $Variables.ShowCurrency = $Config.ShowCurrency + $Variables.ShowEarning = $Config.ShowEarning + $Variables.ShowEarningBias = $Config.ShowEarningBias + $Variables.ShowHashrate = $Config.ShowHashrate + $Variables.ShowMinerFee = $Config.ShowMinerFee + $Variables.ShowMinerFee = $Config.ShowMinerFee + $Variables.ShowPool = $Config.ShowPool + $Variables.ShowPoolBalances = $Config.ShowPoolBalances + $Variables.ShowPoolFee = $Config.ShowPoolFee + $Variables.ShowPowerCost = $Config.ShowPowerCost + $Variables.ShowProfit = $Config.ShowProfit + $Variables.ShowProfitBias = $Config.ShowProfitBias + $Variables.ShowShares = $Config.ShowShares + $Variables.ShowUser = $Config.ShowUser + $Variables.UIStyle = $Config.UIStyle +} + +Function Edit-File { + # Opens file in notepad. Notepad will remain in foreground until closed. + + Param ( + [Parameter(Mandatory = $false)] + [String]$FileName + ) + + $FileWriteTime = (Get-Item -Path $FileName).LastWriteTime + If (-not $FileWriteTime) { + If ($FileName -eq $Variables.PoolsConfigFile -and (Test-Path -LiteralPath ".\Data\PoolsConfig-Template.json" -PathType Leaf)) { + Copy-Item ".\Data\PoolsConfig-Template.json" $FileName + } + } + + If (-not ($NotepadProcess = (Get-CimInstance CIM_Process).Where({ $_.CommandLine -Like "*\Notepad.exe* $($FileName)" }))) { + $NotepadProcess = Start-Process -FilePath Notepad.exe -ArgumentList $FileName -PassThru + } + # Check if the window is not already in foreground + While ($NotepadProcess = (Get-CimInstance CIM_Process).Where({ $_.CommandLine -Like "*\Notepad.exe* $($FileName)" })) { + Try { + If ($MainWindowHandle = (Get-Process -Id $NotepadProcess.ProcessId).MainWindowHandle) { + $FGWindowPid = [IntPtr]::Zero + [Win32]::GetWindowThreadProcessId([Win32]::GetForegroundWindow(), [ref]$FGWindowPid) | Out-Null + If ($NotepadProcess.ProcessId -ne $FGWindowPid) { + If ([Win32]::GetForegroundWindow() -ne $MainWindowHandle) { + [Win32]::ShowWindowAsync($MainWindowHandle, 6) | Out-Null # SW_MINIMIZE + [Win32]::ShowWindowAsync($MainWindowHandle, 9) | Out-Null # SW_RESTORE + } + } + Start-Sleep -Milliseconds 100 + } + } + Catch { } + } + + If ($FileWriteTime -ne (Get-Item -Path $FileName).LastWriteTime) { + Write-Message -Level Verbose "Saved '$FileName'. Changes will become active in the next cycle." + Return "Saved '$FileName'.`nChanges will become active in the next cycle." + } + Else { + Return "No changes to '$FileName' made." + } +} + +Function Get-SortedObject { + + Param ( + [Parameter(Mandatory = $false, ValueFromPipeline = $true)] + [Object]$Object + ) + + Switch -Regex ($Object.GetType().Name) { + "PSCustomObject" { + $SortedObject = [PSCustomObject]@{ } + ($Object.PSObject.Properties.Name | Sort-Object).ForEach( + { + If ($Object.$_ -is [Hashtable] -or $Object.$_ -is [PSCustomObject]) { $SortedObject | Add-Member $_ (Get-SortedObject $Object.$_) } + ElseIf ($Object.$_ -is [Array]) { $SortedObject | Add-Member $_ @($Object.$_ | Sort-Object) } + Else { $SortedObject | Add-Member $_ $Object.$_ } + } + ) + } + "Hashtable|OrderedDictionary|SyncHashtable" { + $SortedObject = [Ordered]@{ } + ($Object.GetEnumerator().Name | Sort-Object).ForEach( + { + If ($Object[$_] -is [Hashtable] -or $Object[$_] -is [PSCustomObject]) { $SortedObject[$_] = Get-SortedObject $Object[$_] } + ElseIf ($Object.$_ -is [Array]) { $SortedObject[$_] = @($Object[$_] | Sort-Object) } + Else { $SortedObject[$_] = $Object[$_] } + } + ) + } + Default { + $SortedObject = $Object + } + } + + Return $SortedObject +} + +Function Enable-Stat { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Name + ) + + If ($Stat = Get-Stat -Name $Name) { + + $Path = "Stats\$Name.txt" + $Stat.Disabled = $false + + @{ + Live = [Double]$Stat.Live + Minute = [Double]$Stat.Minute + Minute_Fluctuation = [Double]$Stat.Minute_Fluctuation + Minute_5 = [Double]$Stat.Minute_5 + Minute_5_Fluctuation = [Double]$Stat.Minute_5_Fluctuation + Minute_10 = [Double]$Stat.Minute_10 + Minute_10_Fluctuation = [Double]$Stat.Minute_10_Fluctuation + Hour = [Double]$Stat.Hour + Hour_Fluctuation = [Double]$Stat.Hour_Fluctuation + Day = [Double]$Stat.Day + Day_Fluctuation = [Double]$Stat.Day_Fluctuation + Week = [Double]$Stat.Week + Week_Fluctuation = [Double]$Stat.Week_Fluctuation + Duration = [String]$Stat.Duration + Updated = [DateTime]$Stat.Updated + Disabled = [Boolean]$Stat.Disabled + } | ConvertTo-Json | Out-File -LiteralPath $Path -Force + } +} + +Function Disable-Stat { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Name + ) + + $Path = "Stats\$Name.txt" + $Stat = Get-Stat -Name $Name + If (-not $Stat) { $Stat = Set-Stat -Name $Name -Value 0 } + $Stat.Disabled = $true + + @{ + Live = [Double]$Stat.Live + Minute = [Double]$Stat.Minute + Minute_Fluctuation = [Double]$Stat.Minute_Fluctuation + Minute_5 = [Double]$Stat.Minute_5 + Minute_5_Fluctuation = [Double]$Stat.Minute_5_Fluctuation + Minute_10 = [Double]$Stat.Minute_10 + Minute_10_Fluctuation = [Double]$Stat.Minute_10_Fluctuation + Hour = [Double]$Stat.Hour + Hour_Fluctuation = [Double]$Stat.Hour_Fluctuation + Day = [Double]$Stat.Day + Day_Fluctuation = [Double]$Stat.Day_Fluctuation + Week = [Double]$Stat.Week + Week_Fluctuation = [Double]$Stat.Week_Fluctuation + Duration = [String]$Stat.Duration + Updated = [DateTime]$Stat.Updated + Disabled = [Boolean]$Stat.Disabled + } | ConvertTo-Json | Out-File -LiteralPath $Path -Force +} + +Function Set-Stat { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Name, + [Parameter(Mandatory = $true)] + [Double]$Value, + [Parameter(Mandatory = $false)] + [DateTime]$Updated = ([DateTime]::Now), + [Parameter(Mandatory = $false)] + [TimeSpan]$Duration, + [Parameter(Mandatory = $false)] + [Boolean]$FaultDetection = $true, + [Parameter(Mandatory = $false)] + [Boolean]$ChangeDetection = $false, + [Parameter(Mandatory = $false)] + [Int]$ToleranceExceeded = 3 + ) + + $Timer = $Updated = $Updated.ToUniversalTime() + + $Path = "Stats\$Name.txt" + $SmallestValue = 1E-20 + $Stat = Get-Stat -Name $Name + + If ($Stat -is [Hashtable] -and -not [Double]::IsNaN($Stat.Minute_Fluctuation)) { + If (-not $Stat.Timer) { $Stat.Timer = $Stat.Updated.AddMinutes(-1) } + If (-not $Duration) { $Duration = $Updated - $Stat.Timer } + If ($Duration -le 0) { Return $Stat } + + If ($ChangeDetection -and [Decimal]$Value -eq [Decimal]$Stat.Live) { $Updated = $Stat.Updated } + + If ($FaultDetection) { + $FaultFactor = If ($Name -match ".+_Hashrate$") { 0.1 } Else { 0.2 } + $ToleranceMin = $Stat.Week * (1 - $FaultFactor) + $ToleranceMax = $Stat.Week * (1 + $FaultFactor) + } + Else { + $ToleranceMin = $ToleranceMax = $Value + } + + If ($Value -lt $ToleranceMin -or $Value -gt $ToleranceMax) { $Stat.ToleranceExceeded ++ } + Else { $Stat.ToleranceExceeded = [UInt16]0 } + + 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 " ") is outside fault tolerance ($(($ToleranceMin | ConvertTo-Hash) -replace " ") to $(($ToleranceMax | ConvertTo-Hash) -replace " ")) [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]." + } + Return + } + Else { + 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 " ") was outside fault tolerance ($(($ToleranceMin | ConvertTo-Hash) -replace " ") to $(($ToleranceMax | ConvertTo-Hash) -replace " "))$(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." })" + } + } + + Remove-Stat -Name $Name + $Stat = Set-Stat -Name $Name -Value $Value + } + Else { + $Span_Minute = [Math]::Min($Duration.TotalMinutes / [Math]::Min($Stat.Duration.TotalMinutes, 1), 1) + $Span_Minute_5 = [Math]::Min(($Duration.TotalMinutes / 5) / [Math]::Min(($Stat.Duration.TotalMinutes / 5), 1), 1) + $Span_Minute_10 = [Math]::Min(($Duration.TotalMinutes / 10) / [Math]::Min(($Stat.Duration.TotalMinutes / 10), 1), 1) + $Span_Hour = [Math]::Min($Duration.TotalHours / [Math]::Min($Stat.Duration.TotalHours, 1), 1) + $Span_Day = [Math]::Min($Duration.TotalDays / [Math]::Min($Stat.Duration.TotalDays, 1), 1) + $Span_Week = [Math]::Min(($Duration.TotalDays / 7) / [Math]::Min(($Stat.Duration.TotalDays / 7), 1), 1) + + $Stat.Live = $Value + $Stat.Minute_Fluctuation = ((1 - $Span_Minute) * $Stat.Minute_Fluctuation) + ($Span_Minute * ([Math]::Abs($Value - $Stat.Minute) / [Math]::Max([Math]::Abs($Stat.Minute), $SmallestValue))) + $Stat.Minute = (1 - $Span_Minute) * $Stat.Minute + $Span_Minute * $Value + $Stat.Minute_5_Fluctuation = (1 - $Span_Minute_5) * $Stat.Minute_5_Fluctuation + $Span_Minute_5 * ([Math]::Abs($Value - $Stat.Minute_5) / [Math]::Max([Math]::Abs($Stat.Minute_5), $SmallestValue)) + $Stat.Minute_5 = (1 - $Span_Minute_5) * $Stat.Minute_5 + $Span_Minute_5 * $Value + $Stat.Minute_10_Fluctuation = (1 - $Span_Minute_10) * $Stat.Minute_10_Fluctuation + $Span_Minute_10 * ([Math]::Abs($Value - $Stat.Minute_10) / [Math]::Max([Math]::Abs($Stat.Minute_10), $SmallestValue)) + $Stat.Minute_10 = (1 - $Span_Minute_10) * $Stat.Minute_10 + $Span_Minute_10 * $Value + $Stat.Hour_Fluctuation = (1 - $Span_Hour) * $Stat.Hour_Fluctuation + $Span_Hour * ([Math]::Abs($Value - $Stat.Hour) / [Math]::Max([Math]::Abs($Stat.Hour), $SmallestValue)) + $Stat.Hour = (1 - $Span_Hour) * $Stat.Hour + $Span_Hour * $Value + $Stat.Day_Fluctuation = (1 - $Span_Day) * $Stat.Day_Fluctuation + $Span_Day * ([Math]::Abs($Value - $Stat.Day) / [Math]::Max([Math]::Abs($Stat.Day), $SmallestValue)) + $Stat.Day = (1 - $Span_Day) * $Stat.Day + $Span_Day * $Value + $Stat.Week_Fluctuation = (1 - $Span_Week) * $Stat.Week_Fluctuation + $Span_Week * ([Math]::Abs($Value - $Stat.Week) / [Math]::Max([Math]::Abs($Stat.Week), $SmallestValue)) + $Stat.Week = (1 - $Span_Week) * $Stat.Week + $Span_Week * $Value + $Stat.Duration = $Stat.Duration + $Duration + $Stat.Updated = $Updated + $Stat.Timer = $Timer + $Stat.ToleranceExceeded = [UInt16]0 + } + } + } + Else { + If (-not $Duration) { $Duration = [TimeSpan]::FromMinutes(1) } + + $Global:Stats[$Name] = $Stat = @{ + Name = $Name + Live = [Double]$Value + Minute = [Double]$Value + Minute_Fluctuation = [Double]0 + Minute_5 = [Double]$Value + Minute_5_Fluctuation = [Double]0 + Minute_10 = [Double]$Value + Minute_10_Fluctuation = [Double]0 + Hour = [Double]$Value + Hour_Fluctuation = [Double]0 + Day = [Double]$Value + Day_Fluctuation = [Double]0 + Week = [Double]$Value + Week_Fluctuation = [Double]0 + Duration = [TimeSpan]$Duration + Updated = [DateTime]$Updated + Disabled = [Boolean]$false + Timer = [DateTime]$Timer + ToleranceExceeded = [UInt16]0 + } + } + + @{ + Name = $Name + Live = [Double]$Stat.Live + Minute = [Double]$Stat.Minute + Minute_Fluctuation = [Double]$Stat.Minute_Fluctuation + Minute_5 = [Double]$Stat.Minute_5 + Minute_5_Fluctuation = [Double]$Stat.Minute_5_Fluctuation + Minute_10 = [Double]$Stat.Minute_10 + Minute_10_Fluctuation = [Double]$Stat.Minute_10_Fluctuation + Hour = [Double]$Stat.Hour + Hour_Fluctuation = [Double]$Stat.Hour_Fluctuation + Day = [Double]$Stat.Day + Day_Fluctuation = [Double]$Stat.Day_Fluctuation + Week = [Double]$Stat.Week + Week_Fluctuation = [Double]$Stat.Week_Fluctuation + Duration = [String]$Stat.Duration + Updated = [DateTime]$Stat.Updated + Disabled = [Boolean]$Stat.Disabled + } | ConvertTo-Json | Out-File -LiteralPath $Path -Force + + Return $Stat +} + +Function Get-Stat { + + Param ( + [Parameter(Mandatory = $false)] + [String[]]$Names = (Get-ChildItem $PWD\Stats).BaseName + ) + + $Names.ForEach( + { + $Name = $_ + + If ($Global:Stats[$Name] -isnot [Hashtable]) { + # Reduce number of errors + If (-not (Test-Path -LiteralPath "Stats\$Name.txt" -PathType Leaf)) { + Return + } + + Try { + $Stat = [System.IO.File]::ReadAllLines("$PWD\Stats\$Name.txt") | ConvertFrom-Json -ErrorAction Stop + $Global:Stats[$Name] = @{ + Name = $Name + Live = [Double]$Stat.Live + Minute = [Double]$Stat.Minute + Minute_Fluctuation = [Double]$Stat.Minute_Fluctuation + Minute_5 = [Double]$Stat.Minute_5 + Minute_5_Fluctuation = [Double]$Stat.Minute_5_Fluctuation + Minute_10 = [Double]$Stat.Minute_10 + Minute_10_Fluctuation = [Double]$Stat.Minute_10_Fluctuation + Hour = [Double]$Stat.Hour + Hour_Fluctuation = [Double]$Stat.Hour_Fluctuation + Day = [Double]$Stat.Day + Day_Fluctuation = [Double]$Stat.Day_Fluctuation + Week = [Double]$Stat.Week + Week_Fluctuation = [Double]$Stat.Week_Fluctuation + Duration = [TimeSpan]$Stat.Duration + Updated = [DateTime]$Stat.Updated + Disabled = [Boolean]$Stat.Disabled + ToleranceExceeded = [UInt16]0 + } + } + Catch { + Write-Message -Level Warn "Stat file '$Name' is corrupt and will be reset." + Remove-Stat $Name + } + } + + $Global:Stats[$Name] + } + ) +} + +Function Remove-Stat { + + Param ( + [Parameter(Mandatory = $true)] + [String[]]$Names + ) + + $Names.ForEach( + { + Remove-Item -LiteralPath "Stats\$_.txt" -Force -Confirm:$false -ErrorAction Ignore + $Global:Stats.Remove($_) + } + ) +} + +Function Invoke-TcpRequest { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Server, + [Parameter(Mandatory = $true)] + [String]$Port, + [Parameter(Mandatory = $true)] + [String]$Request, + [Parameter(Mandatory = $true)] + [Int]$Timeout, # seconds + [Parameter(Mandatory = $false)] + [Boolean]$ReadToEnd = $false + ) + + Try { + $Client = [Net.Sockets.TcpClient]::new() + $Client.SendTimeout = $Client.ReceiveTimeout = $Timeout * 1000 + $Client.Connect($Server, $Port) + $Stream = $Client.GetStream() + $Writer = [IO.StreamWriter]::new($Stream) + $Reader = [IO.StreamReader]::new($Stream) + $Writer.AutoFlush = $true + $Writer.WriteLine($Request) + $Response = If ($ReadToEnd) { $Reader.ReadToEnd() } Else { $Reader.ReadLine() } + } + Catch { $Error.Remove($Error[$Error.Count - 1]) } + Finally { + If ($Reader) { $Reader.Close() } + If ($Writer) { $Writer.Close() } + If ($Stream) { $Stream.Close() } + If ($Client) { $Client.Close() } + } + + Return $Response +} + +Function Get-CpuId { + # Brief : gets CPUID (CPU name and registers) + + # Name + $Name = "" # not implemented + # Vendor + $Vendor = "" # not implemented + + $Info = [CpuID]::Invoke(0) + # Convert 16 bytes to 4 ints for compatibility with existing code + $Info = [Int[]]@( + [BitConverter]::ToInt32($Info, 0 * 4) + [BitConverter]::ToInt32($Info, 1 * 4) + [BitConverter]::ToInt32($Info, 2 * 4) + [BitConverter]::ToInt32($Info, 3 * 4) + ) + + $nIds = $Info[0] + + $Info = [CpuID]::Invoke(0x80000000) + $nExIds = [BitConverter]::ToUInt32($Info, 0 * 4) # Not sure as to why 'nExIds' is unsigned; may not be necessary + # Convert 16 bytes to 4 ints for compatibility with existing code + $Info = [Int[]]@( + [BitConverter]::ToInt32($Info, 0 * 4) + [BitConverter]::ToInt32($Info, 1 * 4) + [BitConverter]::ToInt32($Info, 2 * 4) + [BitConverter]::ToInt32($Info, 3 * 4) + ) + + # Detect Features + $Features = @{ } + If ($nIds -ge 0x00000001) { + + $Info = [CpuID]::Invoke(0x00000001) + # convert 16 bytes to 4 ints for compatibility with existing code + $Info = [Int[]]@( + [BitConverter]::ToInt32($Info, 0 * 4) + [BitConverter]::ToInt32($Info, 1 * 4) + [BitConverter]::ToInt32($Info, 2 * 4) + [BitConverter]::ToInt32($Info, 3 * 4) + ) + + $Features.MMX = ($Info[3] -band ([Int]1 -shl 23)) -ne 0 + $Features.SSE = ($Info[3] -band ([Int]1 -shl 25)) -ne 0 + $Features.SSE2 = ($Info[3] -band ([Int]1 -shl 26)) -ne 0 + $Features.SSE3 = ($Info[2] -band ([Int]1 -shl 00)) -ne 0 + + $Features.SSSE3 = ($Info[2] -band ([Int]1 -shl 09)) -ne 0 + $Features.SSE41 = ($Info[2] -band ([Int]1 -shl 19)) -ne 0 + $Features.SSE42 = ($Info[2] -band ([Int]1 -shl 20)) -ne 0 + $Features.AES = ($Info[2] -band ([Int]1 -shl 25)) -ne 0 + + $Features.AVX = ($Info[2] -band ([Int]1 -shl 28)) -ne 0 + $Features.FMA3 = ($Info[2] -band ([Int]1 -shl 12)) -ne 0 + + $Features.RDRAND = ($Info[2] -band ([Int]1 -shl 30)) -ne 0 + } + + If ($nIds -ge 0x00000007) { + + $Info = [CpuID]::Invoke(0x00000007) + # Convert 16 bytes to 4 ints for compatibility with existing code + $Info = [Int[]]@( + [BitConverter]::ToInt32($Info, 0 * 4) + [BitConverter]::ToInt32($Info, 1 * 4) + [BitConverter]::ToInt32($Info, 2 * 4) + [BitConverter]::ToInt32($Info, 3 * 4) + ) + + $Features.AVX2 = ($Info[1] -band ([Int]1 -shl 05)) -ne 0 + + $Features.BMI1 = ($Info[1] -band ([Int]1 -shl 03)) -ne 0 + $Features.BMI2 = ($Info[1] -band ([Int]1 -shl 08)) -ne 0 + $Features.ADX = ($Info[1] -band ([Int]1 -shl 19)) -ne 0 + $Features.MPX = ($Info[1] -band ([Int]1 -shl 14)) -ne 0 + $Features.SHA = ($Info[1] -band ([Int]1 -shl 29)) -ne 0 + $Features.RDSEED = ($Info[1] -band ([Int]1 -shl 18)) -ne 0 + $Features.PREFETCHWT1 = ($Info[2] -band ([Int]1 -shl 00)) -ne 0 + $Features.RDPID = ($Info[2] -band ([Int]1 -shl 22)) -ne 0 + + $Features.AVX512_F = ($Info[1] -band ([Int]1 -shl 16)) -ne 0 + $Features.AVX512_CD = ($Info[1] -band ([Int]1 -shl 28)) -ne 0 + $Features.AVX512_PF = ($Info[1] -band ([Int]1 -shl 26)) -ne 0 + $Features.AVX512_ER = ($Info[1] -band ([Int]1 -shl 27)) -ne 0 + + $Features.AVX512_VL = ($Info[1] -band ([Int]1 -shl 31)) -ne 0 + $Features.AVX512_BW = ($Info[1] -band ([Int]1 -shl 30)) -ne 0 + $Features.AVX512_DQ = ($Info[1] -band ([Int]1 -shl 17)) -ne 0 + + $Features.AVX512_IFMA = ($Info[1] -band ([Int]1 -shl 21)) -ne 0 + $Features.AVX512_VBMI = ($Info[2] -band ([Int]1 -shl 01)) -ne 0 + + $Features.AVX512_VPOPCNTDQ = ($Info[2] -band ([Int]1 -shl 14)) -ne 0 + $Features.AVX512_4FMAPS = ($Info[3] -band ([Int]1 -shl 02)) -ne 0 + $Features.AVX512_4VNNIW = ($Info[3] -band ([Int]1 -shl 03)) -ne 0 + + $Features.AVX512_VNNI = ($Info[2] -band ([Int]1 -shl 11)) -ne 0 + + $Features.AVX512_VBMI2 = ($Info[2] -band ([Int]1 -shl 06)) -ne 0 + $Features.GFNI = ($Info[2] -band ([Int]1 -shl 08)) -ne 0 + $Features.VAES = ($Info[2] -band ([Int]1 -shl 09)) -ne 0 + $Features.AVX512_VPCLMUL = ($Info[2] -band ([Int]1 -shl 10)) -ne 0 + $Features.AVX512_BITALG = ($Info[2] -band ([Int]1 -shl 12)) -ne 0 + } + + If ($nExIds -ge 0x80000001) { + + $Info = [CpuID]::Invoke(0x80000001) + # Convert 16 bytes to 4 ints for compatibility with existing code + $Info = [Int[]]@( + [BitConverter]::ToInt32($Info, 0 * 4) + [BitConverter]::ToInt32($Info, 1 * 4) + [BitConverter]::ToInt32($Info, 2 * 4) + [BitConverter]::ToInt32($Info, 3 * 4) + ) + + $Features.x64 = ($Info[3] -band ([Int]1 -shl 29)) -ne 0 + $Features.ABM = ($Info[2] -band ([Int]1 -shl 05)) -ne 0 + $Features.SSE4a = ($Info[2] -band ([Int]1 -shl 06)) -ne 0 + $Features.FMA4 = ($Info[2] -band ([Int]1 -shl 16)) -ne 0 + $Features.XOP = ($Info[2] -band ([Int]1 -shl 11)) -ne 0 + $Features.PREFETCHW = ($Info[2] -band ([Int]1 -shl 08)) -ne 0 + } + + # Wrap data into PSObject + Return [PSCustomObject]@{ + Vendor = $Vendor + Name = $Name + Features = $Features.psBase.Keys.ForEach{ If ($Features.$_) { $_ } } + } +} + +Function Get-GPUArchitectureAMD { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Model, + [Parameter(Mandatory = $false)] + [String]$Architecture = "" + ) + + $Model = $Model -replace "[^A-Z0-9]" + $Architecture = $Architecture -replace ":.+$" -replace "[^A-Za-z0-9]+" + + ForEach ($GPUArchitecture in $Variables.GPUArchitectureDbAMD.PSObject.Properties) { + If ($Architecture -match $GPUArchitecture.Value) { + Return $GPUArchitecture.Name + } + } + + Return $Architecture +} + +Function Get-GPUArchitectureNvidia { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Model, + [Parameter(Mandatory = $false)] + [String]$ComputeCapability = "" + ) + + $Model = $Model -replace "[^A-Z0-9]" + $ComputeCapability = $ComputeCapability -replace "[^\d\.]" + + ForEach ($GPUArchitecture in $Variables.GPUArchitectureDbNvidia.PSObject.Properties) { + If ($GPUArchitecture.Value.Compute -contains $ComputeCapability) { + Return $GPUArchitecture.Name + } + } + + ForEach ($GPUArchitecture in $GPUArchitectureDbNvidia.PSObject.Properties) { + If ($Model -match $GPUArchitecture.Value.Model) { + Return $GPUArchitecture.Name + } + } + + Return "Other" +} + +Function Get-Device { + + Param ( + [Parameter(Mandatory = $false)] + [String[]]$Name = @(), + [Parameter(Mandatory = $false)] + [String[]]$ExcludeName = @() + ) + + If ($Name) { + $DeviceList = [System.IO.File]::ReadAllLines("$PWD\Data\Devices.json") | ConvertFrom-Json + $Name_Devices = $Name.ForEach( + { + $Name_Split = $_ -split "#" + $Name_Split = @($Name_Split | Select-Object -First 1) + @(($Name_Split | Select-Object -Skip 1).ForEach({ [Int]$_ })) + $Name_Split += @("*") * (100 - $Name_Split.Count) + + $Name_Device = $DeviceList.("{0}" -f $Name_Split) | Select-Object * + ($Name_Device | Get-Member -MemberType NoteProperty).Name.ForEach({ $Name_Device.$_ = $Name_Device.$_ -f $Name_Split }) + + $Name_Device + } + ) + } + + If ($ExcludeName) { + If (-not $DeviceList) { $DeviceList = [System.IO.File]::ReadAllLines("$PWD\Data\Devices.json") | ConvertFrom-Json } + $ExcludeName_Devices = $ExcludeName.ForEach( + { + $ExcludeName_Split = $_ -split "#" + $ExcludeName_Split = @($ExcludeName_Split | Select-Object -First 1) + @(($ExcludeName_Split | Select-Object -Skip 1).ForEach({ [Int]$_ })) + $ExcludeName_Split += @("*") * (100 - $ExcludeName_Split.Count) + + $ExcludeName_Device = $DeviceList.("{0}" -f $ExcludeName_Split) | Select-Object * + ($ExcludeName_Device | Get-Member -MemberType NoteProperty).Name.ForEach({ $ExcludeName_Device.$_ = $ExcludeName_Device.$_ -f $ExcludeName_Split }) + + $ExcludeName_Device + } + ) + } + + $Devices = @() + + $Id = 0 + $Type_Id = @{ } + $Vendor_Id = @{ } + $Type_Vendor_Id = @{ } + + $Slot = 0 + $Type_Slot = @{ } + $Vendor_Slot = @{ } + $Type_Vendor_Slot = @{ } + + $Index = 0 + $Type_Index = @{ } + $Vendor_Index = @{ } + $Type_Vendor_Index = @{ } + + $PlatformId = 0 + $PlatformId_Index = @{ } + $Type_PlatformId_Index = @{ } + + $UnsupportedCPUVendorID = 100 + $UnsupportedGPUVendorID = 100 + + # Get WDDM data + Try { + (Get-CimInstance CIM_Processor).ForEach( + { + $Device_CIM = [CimInstance]::new($_) + + # Add normalised values + $Devices += $Device = [Device]@{ + Name = $null + Model = $Device_CIM.Name + Type = "CPU" + Bus = $null + Vendor = $( + Switch -Regex ($Device_CIM.Manufacturer) { + "Advanced Micro Devices" { "AMD" } + "AMD" { "AMD" } + "Intel" { "INTEL" } + "NVIDIA" { "NVIDIA" } + "Microsoft" { "MICROSOFT" } + Default { $Device_CIM.Manufacturer -replace "\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel" -replace "[^A-Z0-9]" } + } + ) + Memory = $null + MemoryGiB = $null + } + + $Device.Id = [Int]$Id + $Device.Type_Id = [Int]$Type_Id.($Device.Type) + $Device.Vendor_Id = [Int]$Vendor_Id.($Device.Vendor) + $Device.Type_Vendor_Id = [Int]$Type_Vendor_Id.($Device.Type).($Device.Vendor) + + $Device.Name = "$($Device.Type)#$('{0:D2}' -f $Device.Type_Id)" + $Device.Model = (($Device.Model -split " " -replace "Processor", "CPU" -replace "Graphics", "GPU") -notmatch $Device.Type -notmatch $Device.Vendor) -join " " -replace "\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel"-replace "^\s*" -replace "[^ A-Z0-9\.]" -replace "\s+", " " -replace "\s*$" + + If (-not $Type_Vendor_Id.($Device.Type)) { $Type_Vendor_Id.($Device.Type) = @{ } } + + $Id ++ + $Vendor_Id.($Device.Vendor) ++ + $Type_Vendor_Id.($Device.Type).($Device.Vendor) ++ + If ($Variables."Supported$($Device.Type)DeviceVendors" -contains $Device.Vendor) { $Type_Id.($Device.Type) ++ } + + # Read CPU features + $Device.CPUfeatures = $Variables.CPUfeatures + + # Add raw data + $Device.CIM = $Device_CIM + + } + ) + + (Get-CimInstance CIM_VideoController).ForEach( + { + $Device_CIM = [CimInstance]::new($_) + $Device_PNP = [PSCustomObject]@{ } + + (Get-PnpDevice $Device_CIM.PNPDeviceID | Get-PnpDeviceProperty).ForEach({ $Device_PNP | Add-Member $_.KeyName $_.Data }) + $Device_PNP = $Device_PNP.PSObject.Copy() + $Device_Reg = (Get-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\$($Device_PNP.DEVPKEY_Device_Driver)").PSObject.Copy() + $Devices += $Device = [Device]@{ + Name = $null + Model = $Device_CIM.Name + Type = "GPU" + Bus = $( + If ($Device_PNP.DEVPKEY_Device_BusNumber -is [UInt64] -or $Device_PNP.DEVPKEY_Device_BusNumber -is [UInt32]) { + [Int64]$Device_PNP.DEVPKEY_Device_BusNumber + } + ) + Vendor = $( + Switch -Regex ([String]$Device_CIM.AdapterCompatibility) { + "Advanced Micro Devices" { "AMD" } + "AMD" { "AMD" } + "Intel" { "INTEL" } + "NVIDIA" { "NVIDIA" } + "Microsoft" { "MICROSOFT" } + 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') + MemoryGiB = [Double]([Math]::Round([Math]::Max([UInt64]$Device_CIM.AdapterRAM, [uInt64]$Device_Reg.'HardwareInformation.qwMemorySize') / 0.05GB) / 20) # Round to nearest 50MB + } + + $Device.Id = [Int]$Id + $Device.Type_Id = [Int]$Type_Id.($Device.Type) + $Device.Vendor_Id = [Int]$Vendor_Id.($Device.Vendor) + $Device.Type_Vendor_Id = [Int]$Type_Vendor_Id.($Device.Type).($Device.Vendor) + + #Unsupported devices start with DeviceID 100 (to not disrupt device order when running in a Citrix or RDP session) + If ($Variables."Supported$($Device.Type)DeviceVendors" -contains $Device.Vendor) { $Device.Name = "$($Device.Type)#$('{0:D2}' -f $Device.Type_Id)" } + ElseIf ($Device.Type -eq "CPU") { $Device.Name = "$($Device.Type)#$('{0:D2}' -f $UnsupportedCPUVendorID ++)" } + 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 "^\s*" -replace "[^ A-Z0-9\.]" -replace "\s+", " " -replace "\s*$" + + If (-not $Type_Vendor_Id.($Device.Type)) { $Type_Vendor_Id.($Device.Type) = @{ } } + + $Id ++ + $Vendor_Id.($Device.Vendor) ++ + $Type_Vendor_Id.($Device.Type).($Device.Vendor) ++ + If ($Variables."Supported$($Device.Type)DeviceVendors" -contains $Device.Vendor) { $Type_Id.($Device.Type) ++ } + + # Add raw data + $Device.CIM = $Device_CIM + # $Device.PNP = $Device_PNP + # $Device.Reg = $Device_Reg + } + ) + } + Catch { + Write-Message -Level Warn "WDDM device detection has failed." + } + Remove-Variable Device, Device_CIM, Device_PNP, Device_Reg -ErrorAction Ignore + + # Get OpenCL data + [OpenCl.Platform]::GetPlatformIDs().ForEach( + { + Try { + $OpenCLplatform = $_ + # Skip devices with negative PCIbus + ([OpenCl.Device]::GetDeviceIDs($_, [OpenCl.DeviceType]::All).Where({ $_.PCIbus -ge 0 }).ForEach({ $_ | ConvertTo-Json -EnumsAsStrings -WarningAction SilentlyContinue }) | Select-Object -Unique).ForEach( + { + $Device_OpenCL = $_ | ConvertFrom-Json + + # Add normalised values + $Device = [Device]@{ + Name = $null + Model = $Device_OpenCL.Name + Type = $( + 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]" } + } + ) + Bus = $( + If ($Device_OpenCL.PCIBus -is [Int64] -or $Device_OpenCL.PCIBus -is [Int32]) { + [Int64]$Device_OpenCL.PCIBus + } + ) + Vendor = $( + Switch -Regex ([String]$Device_OpenCL.Vendor) { + "Advanced Micro Devices" { "AMD" } + "AMD" { "AMD" } + "Intel" { "INTEL" } + "NVIDIA" { "NVIDIA" } + "Microsoft" { "MICROSOFT" } + Default { [String]$Device_OpenCL.Vendor -replace "\(R\)|\(TM\)|\(C\)|Series|GeForce|Radeon|Intel" -replace "[^A-Z0-9]" } + } + ) + Memory = [UInt64]$Device_OpenCL.GlobalMemSize + MemoryGiB = [Double]([Math]::Round($Device_OpenCL.GlobalMemSize / 0.05GB) / 20) # Round to nearest 50MB + } + + $Device.Id = [Int]$Id + $Device.Type_Id = [Int]$Type_Id.($Device.Type) + $Device.Vendor_Id = [Int]$Vendor_Id.($Device.Vendor) + $Device.Type_Vendor_Id = [Int]$Type_Vendor_Id.($Device.Type).($Device.Vendor) + + #Unsupported devices get DeviceID 100 (to not disrupt device order when running in a Citrix or RDP session) + If ($Variables."Supported$($Device.Type)DeviceVendors" -contains $Device.Vendor) { $Device.Name = "$($Device.Type)#$('{0:D2}' -f $Device.Type_Id)" } + ElseIf ($Device.Type -eq "CPU") { $Device.Name = "$($Device.Type)#$('{0:D2}' -f $UnsupportedCPUVendorID ++)" } + 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 "^\s*" -replace "[^ A-Z0-9\.]" -replace "\s+", " " -replace "\s*$" + + If (-not $Type_Vendor_Id.($Device.Type)) { $Type_Vendor_Id.($Device.Type) = @{ } } + + If ($Devices.Where({ $_.Type -eq $Device.Type -and $_.Bus -eq $Device.Bus })) { $Device = [Device]($Devices.Where({ $_.Type -eq $Device.Type -and $_.Bus -eq $Device.Bus }) | Select-Object) } + ElseIf ($Device.Type -eq "GPU" -and $Variables.SupportedGPUDeviceVendors -contains $Device.Vendor) { + $Devices += $Device + + If (-not $Type_Vendor_Index.($Device.Type)) { $Type_Vendor_Index.($Device.Type) = @{ } } + + $Id ++ + $Vendor_Id.($Device.Vendor) ++ + $Type_Vendor_Id.($Device.Type).($Device.Vendor) ++ + $Type_Id.($Device.Type) ++ + } + + # Add OpenCL specific data + $Device.Index = [Int]$Index + $Device.Type_Index = [Int]$Type_Index.($Device.Type) + $Device.Vendor_Index = [Int]$Vendor_Index.($Device.Vendor) + $Device.Type_Vendor_Index = [Int]$Type_Vendor_Index.($Device.Type).($Device.Vendor) + $Device.PlatformId = [Int]$PlatformId + $Device.PlatformId_Index = [Int]$PlatformId_Index.($PlatformId) + $Device.Type_PlatformId_Index = [Int]$Type_PlatformId_Index.($Device.Type).($PlatformId) + + # Add raw data + $Device.OpenCL = $Device_OpenCL + + If ($Device.OpenCL.PlatForm.Name -eq "NVIDIA CUDA") { $Device.CUDAversion = ([System.Version]($Device.OpenCL.PlatForm.Version -replace '.+CUDA ')) } + + If (-not $Type_Vendor_Index.($Device.Type)) { $Type_Vendor_Index.($Device.Type) = @{ } } + If (-not $Type_PlatformId_Index.($Device.Type)) { $Type_PlatformId_Index.($Device.Type) = @{ } } + + $Index ++ + $Type_Index.($Device.Type) ++ + $Vendor_Index.($Device.Vendor) ++ + $Type_Vendor_Index.($Device.Type).($Device.Vendor) ++ + $PlatformId_Index.($PlatformId) ++ + $Type_PlatformId_Index.($Device.Type).($PlatformId) ++ + } + ) + $PlatformId ++ + } + Catch { + Write-Message -Level Warn "Device detection for OpenCL platform '$($OpenCLplatform.Version)' has failed. $" + "$(Get-Date -Format "yyyy-MM-dd_HH:mm:ss")" >> $ErrorLogFile + $_.Exception | Format-List -Force >> $ErrorLogFile + $_.InvocationInfo | Format-List -Force >> $ErrorLogFile + } + } + ) + Remove-Variable OpenCLplatform -ErrorAction Ignore + + ($Devices.Where({ $_.Model -ne "Remote Display Adapter 0GB" -and $_.Vendor -ne "CitrixSystemsInc" -and $_.Bus -Is [Int64] }) | Sort-Object -Property Bus).ForEach( + { + If ($_.Type -eq "GPU") { + If ($_.Vendor -eq "NVIDIA") { $_.Architecture = (Get-GPUArchitectureNvidia -Model $_.Model -ComputeCapability $_.OpenCL.DeviceCapability) } + ElseIf ($_.Vendor -eq "AMD") { $_.Architecture = (Get-GPUArchitectureAMD -Model $_.Model -Architecture $_.OpenCL.Architecture) } + Else { $_.Architecture = "Other" } + } + + $_.Slot = [Int]$Slot + $_.Type_Slot = [Int]$Type_Slot.($_.Type) + $_.Vendor_Slot = [Int]$Vendor_Slot.($_.Vendor) + $_.Type_Vendor_Slot = [Int]$Type_Vendor_Slot.($_.Type).($_.Vendor) + + If (-not $Type_Vendor_Slot.($_.Type)) { $Type_Vendor_Slot.($_.Type) = @{ } } + + $Slot ++ + $Type_Slot.($_.Type) ++ + $Vendor_Slot.($_.Vendor) ++ + $Type_Vendor_Slot.($_.Type).($_.Vendor) ++ + } + ) + + $Devices.ForEach( + { + $Device = $_ + + $Device.Bus_Index = @($Devices.Bus | Sort-Object).IndexOf([Int]$Device.Bus) + $Device.Bus_Type_Index = @($Devices.Where({ $_.Type -eq $Device.Type }).Bus | Sort-Object).IndexOf([Int]$Device.Bus) + $Device.Bus_Vendor_Index = @($Devices.Where({ $_.Vendor -eq $Device.Vendor }).Bus | Sort-Object).IndexOf([Int]$Device.Bus) + $Device.Bus_Platform_Index = @($Devices.Where({ $_.Platform -eq $Device.Platform }).Bus | Sort-Object).IndexOf([Int]$Device.Bus) + + If (-not $Name -or ($Name_Devices.Where({ ($Device | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) -like ($_ | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) }))) { + If (-not $ExcludeName -or -not ($ExcludeName_Devices.Where({ ($Device | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) -like ($_ | Select-Object (($_ | Get-Member -MemberType NoteProperty).Name)) }))) { + $Device + } + } + } + ) +} + +Filter ConvertTo-Hash { + + $Units = " kMGTPEZY" # k(ilo) in small letters, see https://en.wikipedia.org/wiki/Metric_prefix + + If ( $null -eq $_ -or [Double]::IsNaN($_)) { Return "n/a" } + ElseIf ($_ -eq 0) { Return "0H/s " } + $Base1000 = [Math]::Max([Double]0, [Math]::Min([Math]::Truncate([Math]::Log([Math]::Abs([Double]$_), [Math]::Pow(1000, 1))), $Units.Length - 1)) + $UnitValue = $_ / [Math]::Pow(1000, $Base1000) + $Digits = If ($UnitValue -lt 10) { 3 } Else { 2 } + "{0:n$($Digits)} $($Units[$Base1000])H/s" -f $UnitValue +} + +Function Get-DecimalsFromValue { + # Used to limit absolute length of number + # The larger the value, the less decimal digits are returned + # Maximal $DecimalsMax decimals are returned + + Param ( + [Parameter(Mandatory = $true)] + [Double]$Value, + [Parameter(Mandatory = $true)] + [Int]$DecimalsMax + ) + + $Decimals = 1 + $DecimalsMax - [Math]::Floor([Math]::Abs($Value)).ToString().Length + If ($Decimals -gt $DecimalsMax) { $Decimals = 0 } + + Return $Decimals +} + +Function Get-Combination { + + Param ( + [Parameter(Mandatory = $true)] + [Array]$Value, + [Parameter(Mandatory = $false)] + [Int]$SizeMax = $Value.Count, + [Parameter(Mandatory = $false)] + [Int]$SizeMin = 1 + ) + + $Combination = [PSCustomObject]@{ } + + For ($I = 0; $I -lt $Value.Count; $I ++) { + $Combination | Add-Member @{ [Math]::Pow(2, $I) = $Value[$I] } + } + + $CombinationKeys = ($Combination | Get-Member -MemberType NoteProperty).Name + + For ($I = $SizeMin; $I -le $SizeMax; $I ++) { + $X = [Math]::Pow(2, $I) - 1 + + While ($X -le [Math]::Pow(2, $Value.Count) - 1) { + [PSCustomObject]@{ + Combination = ($CombinationKeys.Where({ $_ -band $X })).ForEach({ $Combination.$_ }) + } + $Smallest = ($X -band - $X) + $Ripple = $X + $Smallest + $NewSmallest = ($Ripple -band - $Ripple) + $Ones = (($NewSmallest / $Smallest) -shr 1) - 1 + $X = $Ripple -bor $Ones + } + } +} + +Function Invoke-CreateProcess { + # Based on https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Invoke-CreateProcess.ps1 + + Param ( + [Parameter(Mandatory = $true)] + [String]$BinaryPath, + [Parameter(Mandatory = $false)] + [String]$ArgumentList = "", + [Parameter(Mandatory = $false)] + [String]$WorkingDirectory = "", + [Parameter(Mandatory = $false)] + [String[]]$EnvBlock, + [Parameter(Mandatory = $false)] + [String]$CreationFlags = 0x00000010, # CREATE_NEW_CONSOLE + [Parameter(Mandatory = $false)] + [String]$WindowStyle = "minimized", + [Parameter(Mandatory = $false)] + [String]$StartF = 0x00003001, # STARTF_USESHOWWINDOW, STARTF_TITLEISAPPID, STARTF_PREVENTPINNING + [Parameter(Mandatory = $false)] + [String]$JobName, + [Parameter(Mandatory = $false)] + [String]$LogFile, + [Parameter(Mandatory = $false)] + [String]$StatusInfo + ) + + # Cannot use Start-ThreadJob, $ControllerProcess.WaitForExit(500) would not work and miners remain running + Start-Job -InformationVariable $null -WarningVariable $null -Name $JobName -ArgumentList $BinaryPath, $ArgumentList, $WorkingDirectory, $EnvBlock, $CreationFlags, $WindowStyle, $StartF, $PID, $StatusInfo { + Param ($BinaryPath, $ArgumentList, $WorkingDirectory, $EnvBlock, $CreationFlags, $WindowStyle, $StartF, $ControllerProcessID, $StatusInfo) + + $ControllerProcess = Get-Process -Id $ControllerProcessID + If ($null -eq $ControllerProcess) { Return } + + # Define all the structures for CreateProcess + Add-Type -TypeDefinition @" +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +[StructLayout(LayoutKind.Sequential)] +public struct PROCESS_INFORMATION +{ + public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; +} + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] +public struct STARTUPINFO +{ + public uint cb; public string lpReserved; public string lpDesktop; [MarshalAs(UnmanagedType.LPUTF8Str)] public string lpTitle; + public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; + public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; + public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; + public IntPtr hStdError; +} + +[StructLayout(LayoutKind.Sequential)] +public struct SECURITY_ATTRIBUTES +{ + public int length; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; +} + +public static class Kernel32 +{ + [DllImport("kernel32.dll", SetLastError=true)] + public static extern bool CreateProcess( + string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, + ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, + IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, + out PROCESS_INFORMATION lpProcessInformation); +} +"@ + + $ShowWindow = Switch ($WindowStyle) { + "hidden" { "0x0000" } # SW_HIDE + "normal" { "0x0001" } # SW_SHOWNORMAL + Default { "0x0007" } # SW_SHOWMINNOACTIVE + } + + # Set local environment + ($EnvBlock | Select-Object).ForEach({ Set-Item -Path "Env:$(($_ -split "=")[0])" "$(($_ -split "=")[1])" -Force }) + + # StartupInfo struct + $StartupInfo = New-Object STARTUPINFO + $StartupInfo.dwFlags = $StartF # StartupInfo.dwFlag + $StartupInfo.wShowWindow = $ShowWindow # StartupInfo.ShowWindow + $StartupInfo.lpTitle = $StatusInfo + $StartupInfo.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($StartupInfo) # Struct size + + # SECURITY_ATTRIBUTES Struct (Process & Thread) + $SecAttr = New-Object SECURITY_ATTRIBUTES + $SecAttr.Length = [System.Runtime.InteropServices.Marshal]::SizeOf($SecAttr) + + # CreateProcess --> lpCurrentDirectory + If (-not $WorkingDirectory) { $WorkingDirectory = [IntPtr]::Zero } + + # ProcessInfo struct + $ProcessInfo = New-Object PROCESS_INFORMATION + + # Call CreateProcess + [Void][Kernel32]::CreateProcess($BinaryPath, "$BinaryPath$ArgumentList", [ref]$SecAttr, [ref]$SecAttr, $false, $CreationFlags, [IntPtr]::Zero, $WorkingDirectory, [ref]$StartupInfo, [ref]$ProcessInfo) + $Proc = Get-Process -Id $ProcessInfo.dwProcessId + If ($null -eq $Proc) { + [PSCustomObject]@{ ProcessId = $null } + Return + } + + [PSCustomObject]@{ ProcessId = $Proc.Id } + + $ControllerProcess.Handle | Out-Null + $Proc.Handle | Out-Null + + Do { + If ($ControllerProcess.WaitForExit(1000)) { + [Void]$Proc.CloseMainWindow() + [Void]$Proc.WaitForExit(100) + [Void]$Proc.Kill() + [Void]$Proc.Dispose() + $Proc = $null + } + } While ($Proc.HasExited -eq $false) + } +} + +Function Expand-WebRequest { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Uri, + [Parameter(Mandatory = $false)] + [String]$Path = "" + ) + + # Set current path used by .net methods to the same as the script's path + [Environment]::CurrentDirectory = $ExecutionContext.SessionState.Path.CurrentFileSystemLocation + + If (-not $Path) { $Path = Join-Path ".\Downloads" ([IO.FileInfo](Split-Path $Uri -Leaf)).BaseName } + If (-not (Test-Path -LiteralPath ".\Downloads" -PathType Container)) { New-Item "Downloads" -ItemType "directory" | Out-Null } + $FileName = Join-Path ".\Downloads" (Split-Path $Uri -Leaf) + + If (Test-Path -LiteralPath $FileName -PathType Leaf) { Remove-Item $FileName } + Invoke-WebRequest -Uri $Uri -OutFile $FileName -TimeoutSec 5 + + If (".msi", ".exe" -contains ([IO.FileInfo](Split-Path $Uri -Leaf)).Extension) { + Start-Process $FileName "-qb" -Wait | Out-Null + } + Else { + $Path_Old = (Join-Path (Split-Path (Split-Path $Path)) ([IO.FileInfo](Split-Path $Uri -Leaf)).BaseName) + $Path_New = Split-Path $Path + + If (Test-Path -LiteralPath $Path_Old -PathType Container) { Remove-Item $Path_Old -Recurse -Force } + Start-Process ".\Utils\7z" "x `"$([IO.Path]::GetFullPath($FileName))`" -o`"$([IO.Path]::GetFullPath($Path_Old))`" -y -spe" -Wait -WindowStyle Hidden | Out-Null + + If (Test-Path -LiteralPath $Path_New -PathType Container) { Remove-Item $Path_New -Recurse -Force } + + # use first (topmost) directory, some miners, e.g. ClaymoreDual_v11.9, contain multiple miner binaries for different driver versions in various sub dirs + $Path_Old = ((Get-ChildItem -Path $Path_Old -File -Recurse).Where({ $_.Name -eq $(Split-Path $Path -Leaf) })).Directory | Select-Object -First 1 + + If ($Path_Old) { + (Move-Item $Path_Old $Path_New -PassThru).ForEach({ $_.LastWriteTime = [DateTime]::Now }) + $Path_Old = (Join-Path (Split-Path (Split-Path $Path)) ([IO.FileInfo](Split-Path $Uri -Leaf)).BaseName) + If (Test-Path -LiteralPath $Path_Old -PathType Container) { Remove-Item -Path $Path_Old -Recurse -Force } + } + Else { + Throw "Error: Cannot find '$Path'." + } + } +} + +Function Get-Algorithm { + + Param ( + [Parameter(Mandatory = $false)] + [String]$Algorithm + ) + + $Algorithm = $Algorithm -replace "[^a-z0-9]+" + + If ($Variables.Algorithms[$Algorithm]) { Return $Variables.Algorithms[$Algorithm] } + + Return (Get-Culture).TextInfo.ToTitleCase($Algorithm.ToLower()) +} + +Function Get-Region { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Region, + [Parameter(Mandatory = $false)] + [Switch]$List = $false + ) + + If ($List) { Return $Variables.Regions[$Region] } + + If ($Variables.Regions[$Region]) { Return $($Variables.Regions[$Region] | Select-Object -First 1) } + + Return $Region +} + +Function Add-CoinName { + + Param ( + [Parameter(Mandatory = $true)] + [String]$Algorithm, + [Parameter(Mandatory = $true)] + [String]$Currency, + [Parameter(Mandatory = $true)] + [String]$CoinName + ) + + If (-not ($Variables.CoinNames[$Currency] -and $Variables.CurrencyAlgorithm[$Currency])) { + + # Get mutex. Mutexes are shared across all threads and processes. + # This lets us ensure only one thread is trying to write to the file at a time. + $Mutex = New-Object System.Threading.Mutex($false, "$($Variables.Branding.ProductLabel)_DataFiles") + + If (-not $Variables.CurrencyAlgorithm[$Currency]) { + $Variables.CurrencyAlgorithm[$Currency] = Get-Algorithm $Algorithm + # Attempt to aquire mutex, waiting up to 1 second if necessary. If aquired, update the file and release mutex + If ($Mutex.WaitOne(1000)) { + $Variables.CurrencyAlgorithm | Get-SortedObject | ConvertTo-Json | Out-File -Path ".\Data\CurrencyAlgorithm.json" -ErrorAction Ignore -Force + $Mutex.ReleaseMutex() + } + } + If (-not $Variables.CoinNames[$Currency]) { + If ($CoinName = ((Get-Culture).TextInfo.ToTitleCase($CoinName.Trim().ToLower()) -replace "[^A-Z0-9\$\.]" -replace "coin$", "Coin" -replace "bitcoin$", "Bitcoin")) { + $Variables.CoinNames[$Currency] = $CoinName + # Attempt to aquire mutex, waiting up to 1 second if necessary. If aquired, update the file and release mutex + If ($Mutex.WaitOne(1000)) { + $Variables.CoinNames | Get-SortedObject | ConvertTo-Json | Out-File -Path ".\Data\CoinNames.json" -ErrorAction Ignore -Force + $Mutex.ReleaseMutex() + } + } + } + } +} + +Function Get-AlgorithmFromCurrency { + + Param ( + [Parameter(Mandatory = $false)] + [String]$Currency + ) + + If ($Currency -and $Currency -ne "*") { + If ($Variables.CurrencyAlgorithm[$Currency]) { + Return $Variables.CurrencyAlgorithm[$Currency] + } + + # Get mutex. Mutexes are shared across all threads and processes. + # This lets us ensure only one thread is trying to write to the file at a time. + $Mutex = New-Object System.Threading.Mutex($false, "$($Variables.Branding.ProductLabel)_DataFiles") + + # Attempt to aquire mutex, waiting up to 1 second if necessary. If aquired, update the coin names file and release mutex + If ($Mutex.WaitOne(1000)) { + $Variables.CurrencyAlgorithm = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\CurrencyAlgorithm.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.CurrencyAlgorithm[$_.Name] = $_.Value }) + $Mutex.ReleaseMutex() + } + + If ($Variables.CurrencyAlgorithm[$Currency]) { Return $Variables.CurrencyAlgorithm[$Currency] } + } + + Return $null +} + +Function Get-CurrencyFromAlgorithm { + + Param ( + [Parameter(Mandatory = $false)] + [String]$Algorithm + ) + + If ($Algorithm) { + If ($Currencies = @($Variables.CurrencyAlgorithm.psBase.Keys.Where({ $Variables.CurrencyAlgorithm[$_] -eq $Algorithm }))) { + Return $Currencies + } + } + + Return $null +} + +Function Get-EquihashCoinPers { + + Param ( + [Parameter(Mandatory = $false)] + [String]$Command = "", + [Parameter(Mandatory = $false)] + [String]$Currency = "", + [Parameter(Mandatory = $false)] + [String]$DefaultCommand = "" + ) + + If ($Currency) { + If ($Variables.EquihashCoinPers[$Currency]) { + Return "$($Command)$($Variables.EquihashCoinPers[$Currency])" + } + + $Variables.EquihashCoinPers = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\EquihashCoinPers.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.EquihashCoinPers[$_.Name] = $_.Value }) + + If ($Variables.EquihashCoinPers[$Currency]) { + Return "$($Command)$($Variables.EquihashCoinPers[$Currency])" + } + } + + Return $DefaultCommand +} + +Function Get-PoolBaseName { + + Param ( + [Parameter(Mandatory = $false)] + [String[]]$PoolNames + ) + + Return ($PoolNames -replace "24hr$|coins$|coins24hr$|coinsplus$|plus$") +} + +Function Get-Version { + Try { + $UpdateVersion = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/UselessGuru/UG-Miner/main/Version.txt" -TimeoutSec 15 -SkipCertificateCheck -Headers @{ "Cache-Control" = "no-cache" }).Content | ConvertFrom-Json + + $Variables.CheckedForUpdate = [DateTime]::Now + + If ($Variables.Branding.ProductLabel -and [System.Version]$UpdateVersion.Version -gt $Variables.Branding.Version) { + If ($UpdateVersion.AutoUpdate) { + If ($Config.AutoUpdate) { + Write-Message -Level Verbose "Version checker: New version $($UpdateVersion.Version) found. Starting update..." + Initialize-Autoupdate -UpdateVersion $UpdateVersion + } + Else { + Write-Message -Level Verbose "Version checker: New version $($UpdateVersion.Version) found. Auto Update is disabled in config - You must update manually." + } + } + Else { + Write-Message -Level Verbose "Version checker: New version is available. $($UpdateVersion.Version) does not support auto-update. You must update manually." + } + If ($Config.ShowChangeLog) { + Start-Process "https://github.com/UselessGuru/UG-Miner/releases/tag/v$($UpdateVersion.Version)" + } + } + Else { + Write-Message -Level Verbose "Version checker: $($Variables.Branding.ProductLabel) $($Variables.Branding.Version) is current - no update available." + } + } + Catch { + Write-Message -Level Warn "Version checker could not contact update server." + } +} + +Function Initialize-Autoupdate { + + Param ( + [Parameter(Mandatory = $true)] + [PSCustomObject]$UpdateVersion + ) + + Set-Location $Variables.MainPath + If (-not (Test-Path -LiteralPath ".\AutoUpdate" -PathType Container)) { New-Item -Path . -Name "AutoUpdate" -ItemType Directory | Out-Null } + If (-not (Test-Path -LiteralPath ".\Logs" -PathType Container)) { New-Item -Path . -Name "Logs" -ItemType Directory | Out-Null } + + $UpdateScriptURL = "https://github.com/UselessGuru/UG-Miner-Extras/releases/download/AutoUpdate/Autoupdate.ps1" + $UpdateScript = ".\AutoUpdate\AutoUpdate.ps1" + $UpdateLog = ".\Logs\AutoUpdateLog_$(Get-Date -Format "yyyy-MM-dd_HH-mm-ss").txt" + + # Download update script + "Downloading update script..." | Tee-Object -FilePath $UpdateLog -Append | Write-Message -Level Verbose + Try { + Invoke-WebRequest -Uri $UpdateScriptURL -OutFile $UpdateScript -TimeoutSec 15 + "Executing update script..." | Tee-Object -FilePath $UpdateLog -Append | Write-Message -Level Verbose + . $UpdateScript + } + Catch { + "Downloading update script failed. Cannot complete auto-update :-(" | Tee-Object -FilePath $UpdateLog -Append | Write-Message -Level Error + } +} + +Function Start-LogReader { + + If ((Test-Path -LiteralPath $Config.LogViewerExe -PathType Leaf) -and (Test-Path -LiteralPath $Config.LogViewerConfig -PathType Leaf)) { + $Variables.LogViewerConfig = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Config.LogViewerConfig) + $Variables.LogViewerExe = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Config.LogViewerExe) + If ($SnaketailProcess = (Get-CimInstance CIM_Process).Where({ $_.CommandLine -eq """$($Variables.LogViewerExe)"" $($Variables.LogViewerConfig)" })) { + # Activate existing Snaketail window + $LogViewerMainWindowHandle = (Get-Process -Id $SnaketailProcess.ProcessId).MainWindowHandle + If (@($LogViewerMainWindowHandle).Count -eq 1) { + Try { + [Win32]::ShowWindowAsync($LogViewerMainWindowHandle, 6) | Out-Null # SW_MINIMIZE + [Win32]::ShowWindowAsync($LogViewerMainWindowHandle, 9) | Out-Null # SW_RESTORE + } + Catch { } + } + } + Else { + [Void](& $($Variables.LogViewerExe) $($Variables.LogViewerConfig)) + } + } +} + +Function Get-ObsoleteMinerStats { + + $StatFiles = @(Get-ChildItem ".\Stats\*" -Include "*_Hashrate.txt", "*_PowerConsumption.txt").BaseName + $MinerNames = @(Get-ChildItem ".\Miners\*.ps1").BaseName + + Return @($StatFiles.Where({ (($_ -split "-")[0, 1] -join "-") -notin $MinerNames })) +} + +Function Update-PoolWatchdog { + + Param ( + [Parameter(Mandatory = $true)] + [Pool[]]$Pools + ) + + # Apply watchdog to pools + If ($Config.Watchdog) { + # We assume that miner is up and running, so watchdog timer is not relevant + If ($RelevantWatchdogTimers = $Variables.WatchdogTimers.Where({ $_.MinerName -notin $Variables.MinersRunning })) { + # Only pools with a corresponding watchdog timer object are of interest + If ($RelevantPools = $Pools.Where({ $RelevantWatchdogTimers.PoolName -contains $_.Name })) { + + # Add miner reason "Pool suspended by watchdog 'all algorithms'" + ($RelevantWatchdogTimers | Group-Object -Property PoolName).ForEach( + { + If ($_.Count -ge (2 * $Variables.WatchdogCount * ($_.Group.DeviceNames | Sort-Object -Unique).Count + 1)) { + $Group = $_.Group + If ($PoolsToSuspend = $RelevantPools.Where({ $_.Name -eq $Group[0].PoolName })) { + $PoolsToSuspend.ForEach({ $_.Reasons.Add("Pool suspended by watchdog [all algorithms]") }) + Write-Message -Level Warn "Pool '$($Group[0].PoolName) [all algorithms]' is suspended by watchdog until $(($Group.Kicked | Sort-Object -Top 1).AddSeconds($Variables.WatchdogReset).ToLocalTime().ToString("T"))." + } + } + } + ) + Remove-Variable Group, PoolsToSuspend -ErrorAction Ignore + + If ($RelevantPools = $RelevantPools.Where({ -not ($_.Reasons -match "Pool suspended by watchdog .+") })) { + # Add miner reason "Pool suspended by watchdog 'Algorithm [Algorithm]'" + ($RelevantWatchdogTimers | Group-Object -Property PoolName, Algorithm).ForEach( + { + If ($_.Count -ge 2 * $Variables.WatchdogCount * ($_.Group.DeviceNames | Sort-Object -Unique).Count - 1) { + $Group = $_.Group + If ($PoolsToSuspend = $RelevantPools.Where({ $_.Name -eq $Group[0].PoolName -and $_.Algorithm -eq $Group[0].Algorithm })) { + $PoolsToSuspend.ForEach({ $_.Reasons.Add("Pool suspended by watchdog [Algorithm $($Group[0].Algorithm)]") }) + Write-Message -Level Warn "Pool '$($Group[0].PoolName) [Algorithm $($Group[0].Algorithm)]' is suspended by watchdog until $(($Group.Kicked | Sort-Object -Top 1).AddSeconds($Variables.WatchdogReset).ToLocalTime().ToString("T"))." + } + } + } + ) + Remove-Variable Group, PoolsToSuspend -ErrorAction Ignore + } + } + Remove-Variable RelevantPools + } + Remove-Variable RelevantWatchdogTimers + } + + Return $Pools +} + +Function Test-Prime { + + Param ( + [Parameter(Mandatory = $true)] + [Double]$Number + ) + + If ($Number -lt 2) { Return $false } + If ($Number -eq 2) { Return $true } + + $PowNumber = [Int64][Math]::Pow($Number, 0.5) + For ([Int64]$I = 3; $I -lt $PowNumber; $I += 2) { + If ($Number % $I -eq 0) { Return $false } + } + + Return $true +} + +Function Get-AllDAGdata { + + Param ( + [Parameter(Mandatory = $false)] + [PSCustomObject]$DAGdata = [PSCustomObject]@{ } + ) + + If (-not $DAGdata."Algorithm") { $DAGdata | Add-Member "Algorithm" ([PSCustomObject]@{ }) } + If (-not $DAGdata."Currency") { $DAGdata | Add-Member "Currency" ([PSCustomObject]@{ }) } + If (-not $DAGdata."Updated") { $DAGdata | Add-Member "Updated" ([PSCustomObject]@{ }) } + + # Update on script start, once every 24hrs or if unable to get data from source + $Url = "https://whattomine.com/coins.json" + If ($DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data for from whattomine.com + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 5 + + If ($CurrencyDAGdataResponse.coins.PSObject.Properties.Name) { + $CurrencyDAGdataResponse.coins.PSObject.Properties.Name.Where({ $CurrencyDAGdataResponse.coins.$_.tag -ne "NICEHASH" }).ForEach( + { + $AlgorithmNorm = Get-Algorithm $CurrencyDAGdataResponse.coins.$_.algorithm + $Currency = $CurrencyDAGdataResponse.coins.$_.tag + If (-not $Variables.CoinNames[$Currency]) { [Void](Add-CoinName -Algorithm $AlgorithmNorm -Currency $Currency -CoinName $_) } + If ($AlgorithmNorm -match $Variables.RegexAlgoHasDAG) { + If ($CurrencyDAGdataResponse.coins.$_.last_block -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse.coins.$_.last_block -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.BlockHeight -and $CurrencyDAGdata.Algorithm -match $Variables.RegexAlgoHasDAG) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + } + ) + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # Update on script start, once every 24hrs or if unable to get data from source + $Url = "https://minerstat.com/dag-size-calculator" + If ($DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from Minerstat + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-WebRequest -Uri $Url -TimeoutSec 5 # PWSH 6+ no longer supports basic parsing -> parse text + If ($CurrencyDAGdataResponse.statuscode -eq 200) { + (($CurrencyDAGdataResponse.Content -split "\n" -replace '"', "'").Where({ $_ -like "
.*$" + If ($Currency -notin @("ETF")) { + # ETF has invalid DAG data of 444GiB + $BlockHeight = [Math]::Floor(($_ -replace "^
" -replace "
")) + If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $BlockHeight -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $BlockHeight -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.Epoch -and $CurrencyDAGdata.Algorithm -match $Variables.RegexAlgoHasDAG) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + } + ) + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # Update on script start, once every 24hrs or if unable to get data from source + $Url = "https://prohashing.com/api/v1/currencies" + If ($DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from ProHashing + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 5 + + If ($CurrencyDAGdataResponse.code -eq 200) { + $CurrencyDAGdataResponse.data.PSObject.Properties.Name.Where({ $CurrencyDAGdataResponse.data.$_.enabled -and $CurrencyDAGdataResponse.data.$_.height -and ($Variables.RegexAlgoHasDAG -match (Get-Algorithm $CurrencyDAGdataResponse.data.$_.algo) -or $DAGdata.Currency.psBase.Keys -contains $_) }).ForEach( + { + If (Get-AlgorithmFromCurrency -Currency $_) { + If ($CurrencyDAGdataResponse.data.$_.height -gt $DAGdata.Currency.$_.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse.data.$_.height -Currency $_ -EpochReserve 2 + If ($CurrencyDAGdata.Epoch -and $CurrencyDAGdata.Algorithm -match $Variables.RegexAlgoHasDAG) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $_ $CurrencyDAGdata -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$_' from '$Url'." + } + } + } + } + ) + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # Update on script start, once every 24hrs or if unable to get data from source + $Currency = "TLS" + $Url = "https://telestai.cryptoscope.io/api/getblockcount" + If (-not $DAGdata.Currency.$Currency.BlockHeight -or $DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from StakeCube block explorer + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 15 -SkipCertificateCheck + If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $CurrencyDAGdataResponse.blockcount -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse.blockcount -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.Epoch) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # Update on script start, once every 24hrs or if unable to get data from source + $Currency = "SCC" + $Url = "https://scc.ccore.online/api/getblockcount" + If (-not $DAGdata.Currency.$Currency.BlockHeight -or $DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from StakeCube block explorer + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 15 -SkipCertificateCheck + If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $CurrencyDAGdataResponse -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.Epoch) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # Update on script start, once every 24hrs or if unable to get data from source + $Currency = "BLOCX" + $Url = "https://api-explorer.blocxscan.com/api/getblockcount" + If (-not $DAGdata.Currency.$Currency.BlockHeight -or $DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from BLOCX block explorer + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 15 -SkipCertificateCheck + If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $CurrencyDAGdataResponse -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.DAGsize) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # Update on script start, once every 24hrs or if unable to get data from source + $Currency = "EVR" + $Url = "https://evr.cryptoscope.io/api/getblockcount" + If (-not $DAGdata.Currency.$Currency.BlockHeight -or $DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from EVR block explorer + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 15 -SkipCertificateCheck + If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $CurrencyDAGdataResponse.blockcount -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse.blockcount -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.Epoch) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + + # # Update on script start, once every 24hrs or if unable to get data from source + # $Currency = "PHI" + # $Url = "https://explorer.phicoin.net/api/getblockcount" + # If (-not $DAGdata.Currency.$Currency.BlockHeight -or $DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # # Get block data from EVR block explorer + # Try { + # Write-Message -Level Info "Loading DAG data from '$Url'..." + # $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 15 -SkipCertificateCheck + # If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $CurrencyDAGdataResponse.blockcount -ge $DAGdata.Currency.$Currency.BlockHeight) { + # $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse.blockcount -Currency $Currency -EpochReserve 2 + # If ($CurrencyDAGdata.Epoch) { + # $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + # $CurrencyDAGdata | Add-Member Url $Url -Force + # $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + # $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + # } + # Else { + # Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + # } + # } + # } + # Catch { + # Write-Message -Level Warn "Failed to load DAG data from '$Url'." + # } + # } + + # ZergPool (Coins) also supplies MEWC DAG data + If ($Variables.PoolName -match "ZergPoolCoins.*") { + $Currency = "MEWC" + $Url = "https://mewc.cryptoscope.io/api/getblockcount" + If (-not $DAGdata.Currency.$Currency.BlockHeight -or $DAGdata.Updated.$Url -lt $Variables.ScriptStartTime -or $DAGdata.Updated.$Url -lt [DateTime]::Now.ToUniversalTime().AddDays(-1)) { + # Get block data from MeowCoin block explorer + Try { + Write-Message -Level Info "Loading DAG data from '$Url'..." + $CurrencyDAGdataResponse = Invoke-RestMethod -Uri $Url -TimeoutSec 15 -SkipCertificateCheck + If ((Get-AlgorithmFromCurrency -Currency $Currency) -and $CurrencyDAGdataResponse.blockcount -ge $DAGdata.Currency.$Currency.BlockHeight) { + $CurrencyDAGdata = Get-DAGdata -BlockHeight $CurrencyDAGdataResponse.blockcount -Currency $Currency -EpochReserve 2 + If ($CurrencyDAGdata.Epoch) { + $CurrencyDAGdata | Add-Member Date ([DateTime]::Now.ToUniversalTime()) -Force + $CurrencyDAGdata | Add-Member Url $Url -Force + $DAGdata.Currency | Add-Member $Currency $CurrencyDAGdata -Force + $DAGdata.Updated | Add-Member $Url ([DateTime]::Now.ToUniversalTime()) -Force + } + Else { + Write-Message -Level Warn "Failed to load DAG data for '$Currency' from '$Url'." + } + } + } + Catch { + Write-Message -Level Warn "Failed to load DAG data from '$Url'." + } + } + } + + If ($DAGdata.Updated.PSObject.Properties.Name.Where({ $DAGdata.Updated.$_ -gt $Variables.Timer })) { + #At least one DAG was updated, get maximum DAG size per algorithm + $CurrencyDAGdataKeys = @($DAGdata.Currency.PSObject.Properties.Name) # Store as array to avoid error 'An error occurred while enumerating through a collection: Collection was modified; enumeration operation may not execute.' + + ForEach ($Algorithm in @($CurrencyDAGdataKeys.ForEach({ $DAGdata.Currency.$_.Algorithm }) | Select-Object -Unique)) { + Try { + $DAGdata.Algorithm | Add-Member $Algorithm ( + [PSCustomObject]@{ + BlockHeight = [Int]($CurrencyDAGdataKeys.Where({ $DAGdata.Currency.$_.Algorithm -eq $Algorithm }).ForEach({ $DAGdata.Currency.$_.BlockHeight }) | Measure-Object -Maximum).Maximum + DAGsize = [Int64]($CurrencyDAGdataKeys.Where({ $DAGdata.Currency.$_.Algorithm -eq $Algorithm }).ForEach({ $DAGdata.Currency.$_.DAGsize }) | Measure-Object -Maximum).Maximum + Epoch = [Int]($CurrencyDAGdataKeys.Where({ $DAGdata.Currency.$_.Algorithm -eq $Algorithm }).ForEach({ $DAGdata.Currency.$_.Epoch }) | Measure-Object -Maximum).Maximum + } + ) -Force + $DAGdata.Algorithm.$Algorithm | Add-Member Currency ($CurrencyDAGdataKeys.Where({ $DAGdata.Currency.$_.DAGsize -eq $DAGdata.Algorithm.$Algorithm.DAGsize -and $DAGdata.Currency.$_.Algorithm -eq $Algorithm })) -Force + $DAGdata.Algorithm.$Algorithm | Add-Member CoinName ($Variables.CoinNames[$DAGdata.Algorithm.$Algorithm.Currency]) -Force + } + Catch { + Start-Sleep 0 + } + } + + # Add default '*' (equal to highest) + $DAGdata.Currency | Add-Member "*" ( + [PSCustomObject]@{ + BlockHeight = [Int]($CurrencyDAGdataKeys.ForEach({ $DAGdata.Currency.$_.BlockHeight }) | Measure-Object -Maximum).Maximum + Currency = "*" + DAGsize = [Int64]($CurrencyDAGdataKeys.ForEach({ $DAGdata.Currency.$_.DAGsize }) | Measure-Object -Maximum).Maximum + Epoch = [Int]($CurrencyDAGdataKeys.ForEach({ $DAGdata.Currency.$_.Epoch }) | Measure-Object -Maximum).Maximum + } + ) -Force + $DAGdata = $DAGdata | Get-SortedObject + $DAGdata | ConvertTo-Json -Depth 5 | Out-File -LiteralPath ".\Data\DAGdata.json" -Force + } + + Return $DAGdata +} + +Function Get-DAGdata { + + Param ( + [Parameter(Mandatory = $true)] + [Double]$BlockHeight, + [Parameter(Mandatory = $true)] + [String]$Currency, + [Parameter(Mandatory = $false)] + [Int16]$EpochReserve = 0 + ) + + If ($Currency -eq "BLOCX") { + Return [PSCustomObject]@{ + Algorithm = Get-AlgorithmFromCurrency $Currency + BlockHeight = [Int]$BlockHeight + CoinName = [String]$Variables.CoinNames[$Currency] + DAGsize = [Int64]2GB + Epoch = [UInt16]0 + } + } + ElseIf ($Algorithm = Get-AlgorithmFromCurrency $Currency) { + $Epoch = Get-DAGepoch -BlockHeight $BlockHeight -Algorithm $Algorithm -EpochReserve $EpochReserve + + Return [PSCustomObject]@{ + Algorithm = $Algorithm + BlockHeight = [Int]$BlockHeight + CoinName = [String]$Variables.CoinNames[$Currency] + DAGsize = [Int64](Get-DAGSize -Epoch $Epoch -Currency $Currency) + Epoch = [UInt16]$Epoch + } + } + Return $null +} + +Function Get-DAGsize { + + Param ( + [Parameter(Mandatory = $true)] + [Double]$Epoch, + [Parameter(Mandatory = $true)] + [String]$Currency + ) + + Switch ($Currency) { + "CFX" { + $DatasetBytesInit = 4294967296 + $DatasetBytesGrowth = 16777216 + $MixBytes = 256 + $Size = ($DatasetBytesInit + $DatasetBytesGrowth * $Epoch) - $MixBytes + While (-not (Test-Prime ($Size / $MixBytes))) { + $Size -= 2 * $MixBytes + } + Break + } + "ERG" { + # https://github.com/RainbowMiner/RainbowMiner/issues/2102 + $Size = [Math]::Pow(2, 26) + $BlockHeight = [Math]::Min($BlockHeight, 4198400) + If ($BlockHeight -ge 614400) { + $P = [Math]::Floor(($BlockHeight - 614400) / 51200) + 1 + While ($P-- -gt 0) { + $Size = [Math]::Floor($Size / 100) * 105 + } + } + $Size *= 31 + Break + } + "EVR" { + $DatasetBytesInit = 3GB + $DatasetBytesGrowth = 8MB + $MixBytes = 128 + $Size = ($DatasetBytesInit + $DatasetBytesGrowth * $Epoch) - $MixBytes + While (-not (Test-Prime ($Size / $MixBytes))) { + $Size -= 2 * $MixBytes + } + Break + } + "IRON" { + # IRON (FishHash) has a static DAG size of 4608MB (Ethash epoch 448, https://github.com/iron-fish/fish-hash/blob/main/FishHash.pdf Chapter 4) + $Size = 4608MB + Break + } + "KLS" { + # KLS (KarlsenHash) is based on FishHash and has a static DAG size of 4608MB (Ethash epoch 448, https://github.com/iron-fish/fish-hash/blob/main/FishHash.pdf Chapter 4) + $Size = 4608MB + Break + } + "MEWC" { + If ($Epoch -ge 110) { $Epoch *= 4 } # https://github.com/Meowcoin-Foundation/meowpowminer/blob/6e1f38c1550ab23567960699ba1c05aad3513bcd/libcrypto/ethash.hpp#L48 & https://github.com/Meowcoin-Foundation/meowpowminer/blob/6e1f38c1550ab23567960699ba1c05aad3513bcd/libcrypto/ethash.cpp#L249C1-L254C6 + $DatasetBytesInit = 1GB + $DatasetBytesGrowth = 8MB + $MixBytes = 128 + $Size = ($DatasetBytesInit + $DatasetBytesGrowth * $Epoch) - $MixBytes + While (-not (Test-Prime ($Size / $MixBytes))) { + $Size -= 2 * $MixBytes + } + Break + } + # "PHI" { + # If ($Epoch -ge 110) { $Epoch *= 4 } # https://phicoin.net/docs/Phicoin/algorithm#improved-dag-growth-mechanism + # $DatasetBytesInit = 1GB + # $DatasetBytesGrowth = 8MB + # $MixBytes = 128 + # $Size = ($DatasetBytesInit + $DatasetBytesGrowth * $Epoch) - $MixBytes + # While (-not (Test-Prime ($Size / $MixBytes))) { + # $Size -= 2 * $MixBytes + # } + # Break + # } + Default { + $DatasetBytesInit = 1GB + $DatasetBytesGrowth = 8MB + $MixBytes = 128 + $Size = ($DatasetBytesInit + $DatasetBytesGrowth * $Epoch) - $MixBytes + While (-not (Test-Prime ($Size / $MixBytes))) { + $Size -= 2 * $MixBytes + } + } + } + + Return [Int64]$Size +} + +Function Get-DAGepoch { + + Param ( + [Parameter(Mandatory = $true)] + [Double]$BlockHeight, + [Parameter(Mandatory = $true)] + [String]$Algorithm, + [Parameter(Mandatory = $true)] + [UInt16]$EpochReserve + ) + + Switch ($Algorithm) { + "Autolykos2" { $BlockHeight -= 416768 } # Epoch 0 starts @ 417792 + "FishHash" { Return 448 } # IRON (FishHash) has static DAG size of 4608MB (Ethash epoch 448, https://github.com/iron-fish/fish-hash/blob/main/FishHash.pdf Chapter 4) + # "PhiHash" { } + Default { } + } + + Return [Math]::Floor($BlockHeight / (Get-DAGepochLength -BlockHeight $BlockHeight -Algorithm $Algorithm)) + $EpochReserve +} + +Function Get-DAGepochLength { + + Param ( + [Parameter(Mandatory = $true)] + [Double]$BlockHeight, + [Parameter(Mandatory = $true)] + [String]$Algorithm + ) + + Switch ($Algorithm) { + "Autolykos2" { Return 1024 } + "EtcHash" { If ($BlockHeight -ge 11700000) { Return 60000 } Else { Return 30000 } } + "EthashSHA256" { Return 4000 } + "EvrProgPow" { Return 12000 } + "FiroPow" { Return 1300 } + "KawPow" { Return 7500 } + "MeowPow" { Return 7500 } # https://github.com/Meowcoin-Foundation/meowpowminer/blob/6e1f38c1550ab23567960699ba1c05aad3513bcd/libcrypto/ethash.hpp#L32 + "Octopus" { Return 524288 } + "SCCpow" { Return 3240 } # https://github.com/stakecube/sccminer/commit/16bdfcaccf9cba555f87c05f6b351e1318bd53aa#diff-200991710fe4ce846f543388b9b276e959e53b9bf5c7b7a8154b439ae8c066aeR32 + "ProgPowTelestai" { Return 12000 } + Default { Return 30000 } + } +} +Function Out-DataTable { + # based on http://thepowershellguy.com/blogs/posh/archive/2007/01/21/powershell-gui-scripblock-monitor-script.aspx + + [CmdletBinding()] + Param ( + [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)] + [PSObject[]]$InputObject + ) + + Begin { + $DataTable = New-Object Data.DataTable + $First = $true + } + Process { + ForEach ($Object in $InputObject) { + $DataRow = $DataTable.NewRow() + ForEach ($Property in $Object.PSObject.Properties) { + If ($First) { + $Col = New-Object Data.DataColumn + $Col.ColumnName = $Property.Name.ToString() + $DataTable.Columns.Add($Col) + } + $DataRow.Item($Property.Name) = $Property.Value + } + $DataTable.Rows.Add($DataRow) + $First = $false + } + } + End { + Return @(, $DataTable) + } +} + +Function Get-Median { + + Param ( + [Parameter(Mandatory = $true)] + [Double[]]$Numbers + ) + + $Numbers = $Numbers | Sort-Object + $Count = $Numbers.Count + + If ($Count % 2 -eq 0) { + # Even number of elements, median is the average of the two middle elements + Return ($Numbers[$Count / 2] + $Numbers[$Count / 2 - 1]) / 2 + } + Else { + # Odd number of elements, median is the middle element + Return $Numbers[$Count / 2] + } +} + +Function Hide-Console { + # https://stackoverflow.com/questions/3571627/show-hide-the-console-window-of-a-c-sharp-console-application + If ($host.Name -eq "ConsoleHost") { + If ($ConsoleWindowHandle = [Console.Window]::GetConsoleWindow()) { + # 0 = SW_HIDE + [Console.Window]::ShowWindow($ConsoleWindowHandle, 0) | Out-Null + } + } +} + +Function Show-Console { + # https://stackoverflow.com/questions/3571627/show-hide-the-console-window-of-a-c-sharp-console-application + If ($host.Name -eq "ConsoleHost") { + If ($ConsoleWindowHandle = [Console.Window]::GetConsoleWindow()) { + # 5 = SW_SHOW + [Console.Window]::ShowWindow($ConsoleWindowHandle, 5) | Out-Null + } + } +} + +Function Get-MemoryUsage { + + $MemUsageByte = [System.GC]::GetTotalMemory("forcefullcollection") + $MemUsageMB = $MemUsageByte / 1MB + $DiffBytes = $MemUsageByte - $Script:LastMemoryUsageByte + $DiffText = "" + $Sign = "" + + If ( $Script:LastMemoryUsageByte -ne 0) { + If ($DiffBytes -ge 0) { + $Sign = "+" + } + $DiffText = ", $Sign$DiffBytes" + } + + # Save last value in script global variable + $Script:LastMemoryUsageByte = $MemUsageByte + + Return ("Memory usage {0:n1} MB ({1:n0} Bytes{2})" -f $MemUsageMB, $MemUsageByte, $Difftext) +} + +Function Initialize-Environment { + + # Check if all required files are present + If (-not (Get-ChildItem -LiteralPath $PWD\Balances)) { + Write-Error "Terminating Error - Cannot continue! No files in folder '\Balances'. Please restore the folder from your original download." + $Global:WscriptShell.Popup("No files in folder '\Balances'.`nPlease restore the folder from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + If (-not (Get-ChildItem -LiteralPath $PWD\Brains)) { + Write-Error "Terminating Error - Cannot continue! No files in folder '\Brains'. Please restore the folder from your original download." + $Global:WscriptShell.Popup("No files in folder '\Brains'.`nPlease restore the folder from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + If (-not (Get-ChildItem -LiteralPath $PWD\Data)) { + Write-Error "Terminating Error - Cannot continue! No files in folder '\Data'. Please restore the folder from your original download." + $Global:WscriptShell.Popup("No files in folder '\Data'.`nPlease restore the folder from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + If (-not (Get-ChildItem -LiteralPath $PWD\Miners)) { + Write-Error "Terminating Error - Cannot continue! No files in folder '\Miners'. Please restore the folder from your original download." + $Global:WscriptShell.Popup("No files in folder '\Miners'.`nPlease restore the folder from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + If (-not (Get-ChildItem -LiteralPath $PWD\Pools)) { + Write-Error "Terminating Error - Cannot continue! No files in folder '\Pools'. Please restore the folder from your original download." + $Global:WscriptShell.Popup("No files in folder '\Pools'.`nPlease restore the folder from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + If (-not (Get-ChildItem -LiteralPath $PWD\Web)) { + Write-Error "Terminating Error - Cannot continue! No files in folder '\Web'. Please restore the folder from your original download." + $Global:WscriptShell.Popup("No files in folder '\Web'.`nPlease restore the folder from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + + # Verify donation data + $Variables.DonationData = [System.IO.File]::ReadAllLines("$PWD\Data\DonationData.json") | ConvertFrom-Json -NoEnumerate + If (-not $Variables.DonationData) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\DonationData.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\DonationData.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Write-Host "Loaded donation data." + + # Load donation log + $Variables.DonationLog = @([System.IO.File]::ReadAllLines("$PWD\Logs\DonationLog.csv") | ConvertFrom-Csv -ErrorAction Ignore) + If (-not $Variables.DonationLog) { $Variables.DonationLog = @() } + Else { Write-Host "Loaded donation log." } + + # Load algorithm list + $Variables.Algorithms = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\Algorithms.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.Algorithms[$_.Name] = $_.Value }) + If (-not $Variables.Algorithms.Keys) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\Algorithms.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\Algorithms.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + + # Load coin names + $Variables.CoinNames = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\CoinNames.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.CoinNames[$_.Name] = $_.Value }) + If (-not $Variables.CoinNames.Keys) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\CoinNames.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\CoinNames.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + + # Load currency algorithm data + $Variables.CurrencyAlgorithm = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\CurrencyAlgorithm.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.CurrencyAlgorithm[$_.Name] = $_.Value }) + If (-not $Variables.CurrencyAlgorithm.Keys) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\CurrencyAlgorithm.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\CurrencyAlgorithm.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Start-Sleep -Seconds 10 + Exit + } + + # Load EquihashCoinPers data + $Variables.EquihashCoinPers = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\EquihashCoinPers.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.EquihashCoinPers[$_.Name] = $_.Value }) + If (-not $Variables.EquihashCoinPers) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\EquihashCoinPers.json' is not a valid JSON file. Please restore it from your original download." + $WscriptShell.Popup("File '.\Data\EquihashCoinPers.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Write-Host "Loaded algorithm & coin database." + + # Load regions list + $Variables.Regions = [Ordered]@{ } # as case insensitive hash table + (([System.IO.File]::ReadAllLines("$PWD\Data\Regions.json") | ConvertFrom-Json).PSObject.Properties).ForEach({ $Variables.Regions[$_.Name] = @($_.Value) }) + If (-not $Variables.Regions.Keys) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\Regions.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\Regions.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Write-Host "Loaded regions database." + + # Load FIAT currencies list + $Variables.FIATcurrencies = [System.IO.File]::ReadAllLines("$PWD\Data\FIATcurrencies.json") | ConvertFrom-Json -AsHashtable | Get-SortedObject + If (-not $Variables.FIATcurrencies) { + Write-Error "Terminating Error - Cannot continue! File '.\Data\FIATcurrencies.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\FIATcurrencies.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Write-Host "Loaded fiat currencies database." + + # Load unprofitable algorithms + $Variables.UnprofitableAlgorithms = [System.IO.File]::ReadAllLines("$PWD\Data\UnprofitableAlgorithms.json") | ConvertFrom-Json -ErrorAction Stop -AsHashtable | Get-SortedObject + If (-not $Variables.UnprofitableAlgorithms.Count) { + Write-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." + $Global:WscriptShell.Popup("File '.\Data\UnprofitableAlgorithms.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Write-Host "Loaded list of unprofitable algorithms." + + # Load DAG data, if not available it will get recreated + $Variables.DAGdata = [System.IO.File]::ReadAllLines("$PWD\Data\DAGdata.json") | ConvertFrom-Json | Get-SortedObject + If ($Variables.DAGdata) { Write-Host "Loaded DAG database." } + + # Load PoolsLastUsed data + $Variables.PoolsLastUsed = [System.IO.File]::ReadAllLines("$PWD\Data\PoolsLastUsed.json") | ConvertFrom-Json -AsHashtable + If (-not $Variables.PoolsLastUsed.psBase.Keys) { $Variables.PoolsLastUsed = @{ } } + Else { Write-Host "Loaded pools last used data." } + + # Load AlgorithmsLastUsed data + $Variables.AlgorithmsLastUsed = [System.IO.File]::ReadAllLines("$PWD\Data\AlgorithmsLastUsed.json") | ConvertFrom-Json -AsHashtable + If (-not $Variables.AlgorithmsLastUsed.psBase.Keys) { $Variables.AlgorithmsLastUsed = @{ } } + Else { Write-Host "Loaded algorithm last used data." } + + # Load EarningsChart data to make it available early in GUI + If (Test-Path -LiteralPath ".\Data\EarningsChartData.json" -PathType Leaf) { $Variables.EarningsChartData = [System.IO.File]::ReadAllLines("$PWD\Data\EarningsChartData.json") | ConvertFrom-Json } + Else { Write-Host "Loaded earnings chart data." } + + # Load Balances data to make it available early in GUI + If (Test-Path -LiteralPath ".\Data\Balances.json" -PathType Leaf) { $Variables.Balances = [System.IO.File]::ReadAllLines("$PWD\Data\Balances.json") | ConvertFrom-Json } + Else { Write-Host "Loaded balances data." } + + # Load NVidia GPU architecture table + $Variables.GPUArchitectureDbNvidia = [System.IO.File]::ReadAllLines("$PWD\Data\GPUArchitectureNvidia.json") | ConvertFrom-Json -ErrorAction Ignore + If (-not $Variables.GPUArchitectureDbNvidia) { + Write-Message -Level Error "Terminating Error - Cannot continue! File '.\Data\GPUArchitectureNvidia.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\GPUArchitectureNvidia.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Else { Write-Host "Loaded NVidia GPU architecture table." } + + # Load AMD GPU architecture table + $Variables.GPUArchitectureDbAMD = [System.IO.File]::ReadAllLines("$PWD\Data\GPUArchitectureAMD.json") | ConvertFrom-Json -ErrorAction Ignore + If (-not $Variables.GPUArchitectureDbAMD) { + Write-Message -Level Error "Terminating Error - Cannot continue! File '.\Data\GPUArchitectureAMD.json' is not a valid JSON file. Please restore it from your original download." + $Global:WscriptShell.Popup("File '.\Data\GPUArchitectureAMD.json' is not a valid JSON file.`nPlease restore it from your original download.", 0, "Terminating error - Cannot continue!", 4112) | Out-Null + Exit + } + Else { Write-Host "Loaded AMD GPU architecture table." } + + $Variables.BalancesCurrencies = @($Variables.Balances.PSObject.Properties.Name.ForEach({ $Variables.Balances.$_.Currency }) | Sort-Object -Unique) + + Write-Host "" +} \ No newline at end of file diff --git a/Includes/LegacyGUI.ps1 b/Includes/LegacyGUI.ps1 index 9c4ce0bf..3cde1c3c 100644 --- a/Includes/LegacyGUI.ps1 +++ b/Includes/LegacyGUI.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\LegacyGUI.psm1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> [Void][System.Reflection.Assembly]::Load("System.Windows.Forms") diff --git a/Includes/MinerAPIs/BzMiner.ps1 b/Includes/MinerAPIs/BzMiner.ps1 index a4a6f17e..4cc34109 100644 --- a/Includes/MinerAPIs/BzMiner.ps1 +++ b/Includes/MinerAPIs/BzMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\BzMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class BzMiner : Miner { diff --git a/Includes/MinerAPIs/Ccminer.ps1 b/Includes/MinerAPIs/Ccminer.ps1 index ca8b0f87..881f6ada 100644 --- a/Includes/MinerAPIs/Ccminer.ps1 +++ b/Includes/MinerAPIs/Ccminer.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\CCminer.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class CcMiner : Miner { diff --git a/Includes/MinerAPIs/EthMiner.ps1 b/Includes/MinerAPIs/EthMiner.ps1 index 818e5373..30bff7d1 100644 --- a/Includes/MinerAPIs/EthMiner.ps1 +++ b/Includes/MinerAPIs/EthMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\EthMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class EthMiner : Miner { diff --git a/Includes/MinerAPIs/FireIce.ps1 b/Includes/MinerAPIs/FireIce.ps1 index ba426475..b04ba008 100644 --- a/Includes/MinerAPIs/FireIce.ps1 +++ b/Includes/MinerAPIs/FireIce.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\FireIce.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class Fireice : Miner { diff --git a/Includes/MinerAPIs/Gminer.ps1 b/Includes/MinerAPIs/Gminer.ps1 index 25ea1a22..e9525d38 100644 --- a/Includes/MinerAPIs/Gminer.ps1 +++ b/Includes/MinerAPIs/Gminer.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\GMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class GMiner : Miner { diff --git a/Includes/MinerAPIs/HellMiner.ps1 b/Includes/MinerAPIs/HellMiner.ps1 index 480d9f07..8239f632 100644 --- a/Includes/MinerAPIs/HellMiner.ps1 +++ b/Includes/MinerAPIs/HellMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\lolMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class HellMiner : Miner { diff --git a/Includes/MinerAPIs/MiniZ.ps1 b/Includes/MinerAPIs/MiniZ.ps1 index bbd81b79..2e1192bf 100644 --- a/Includes/MinerAPIs/MiniZ.ps1 +++ b/Includes/MinerAPIs/MiniZ.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\MiniZ.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class MiniZ : Miner { diff --git a/Includes/MinerAPIs/NanoMiner.ps1 b/Includes/MinerAPIs/NanoMiner.ps1 index 478ba30c..7e2e2fec 100644 --- a/Includes/MinerAPIs/NanoMiner.ps1 +++ b/Includes/MinerAPIs/NanoMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\NanoMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class NanoMiner : Miner { diff --git a/Includes/MinerAPIs/OneZero.ps1 b/Includes/MinerAPIs/OneZero.ps1 index d61787ad..f49727b0 100644 --- a/Includes/MinerAPIs/OneZero.ps1 +++ b/Includes/MinerAPIs/OneZero.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\Trex.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class OneZero : Miner { diff --git a/Includes/MinerAPIs/Rigel.ps1 b/Includes/MinerAPIs/Rigel.ps1 index 7929b271..562b7f37 100644 --- a/Includes/MinerAPIs/Rigel.ps1 +++ b/Includes/MinerAPIs/Rigel.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\Rigel.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class Rigel : Miner { diff --git a/Includes/MinerAPIs/SRBMiner.ps1 b/Includes/MinerAPIs/SRBMiner.ps1 index 7ec7864a..20273c2d 100644 --- a/Includes/MinerAPIs/SRBMiner.ps1 +++ b/Includes/MinerAPIs/SRBMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\SRBminer.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class SRBMiner : Miner { diff --git a/Includes/MinerAPIs/TeamBlackMiner.ps1 b/Includes/MinerAPIs/TeamBlackMiner.ps1 index 861c3090..8d43142a 100644 --- a/Includes/MinerAPIs/TeamBlackMiner.ps1 +++ b/Includes/MinerAPIs/TeamBlackMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\lolMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class TeamBlackMiner : Miner { diff --git a/Includes/MinerAPIs/Trex.ps1 b/Includes/MinerAPIs/Trex.ps1 index 2f5f60ab..bc5042d2 100644 --- a/Includes/MinerAPIs/Trex.ps1 +++ b/Includes/MinerAPIs/Trex.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\Trex.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class Trex : Miner { diff --git a/Includes/MinerAPIs/Xgminer.ps1 b/Includes/MinerAPIs/Xgminer.ps1 index 708be012..2f8d0780 100644 --- a/Includes/MinerAPIs/Xgminer.ps1 +++ b/Includes/MinerAPIs/Xgminer.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\Xgminer.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class XgMiner : Miner { diff --git a/Includes/MinerAPIs/XmRig.ps1 b/Includes/MinerAPIs/XmRig.ps1 index 863c57d2..2cdbff37 100644 --- a/Includes/MinerAPIs/XmRig.ps1 +++ b/Includes/MinerAPIs/XmRig.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\XmRig.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class XmRig : Miner { diff --git a/Includes/MinerAPIs/lolMiner.ps1 b/Includes/MinerAPIs/lolMiner.ps1 index b8b4f3d8..200a768d 100644 --- a/Includes/MinerAPIs/lolMiner.ps1 +++ b/Includes/MinerAPIs/lolMiner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Includes\MinerAPIs\lolMiner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Class lolMiner : Miner { diff --git a/Miners/BzMiner-v21.5.3.ps1 b/Miners/BzMiner-v22.0.0.ps1 similarity index 98% rename from Miners/BzMiner-v21.5.3.ps1 rename to Miners/BzMiner-v22.0.0.ps1 index 0a62fe4a..de159b3b 100644 --- a/Miners/BzMiner-v21.5.3.ps1 +++ b/Miners/BzMiner-v22.0.0.ps1 @@ -18,19 +18,19 @@ along with this program. If not, see . <# Product: UG-Miner Version: 6.3.22 -Version date: 2024/12/21 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ "AMD", "INTEL" -contains $_.Type -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge [System.Version]"460.27.03") }))) { Return } -$URI = "https://github.com/UselessGuru/UG-Miner-Binaries/releases/download/BzMiner/bzminer_v21.5.3_windows.zip" +$URI = "https://github.com/UselessGuru/UG-Miner-Binaries/releases/download/BzMiner/bzminer_v22.0.0_windows.zip" $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName $Path = "Bin\$Name\bzminer.exe" $DeviceEnumerator = "Bus" $Algorithms = @( @{ Algorithms = @("Autolykos2"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = ""; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" -a ergo") } - @{ Algorithms = @("Blake3"); Type = "AMD"; Fee = @(0.005); MinMemGiB = 2; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a alph") } #https://github.com/bzminer/bzminer/issues + @{ Algorithms = @("Blake3"); Type = "AMD"; Fee = @(0.005); MinMemGiB = 2; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a alph") } @{ Algorithms = @("DynexSolve"); Type = "AMD"; Fee = @(0.005); MinMemGiB = 2; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a dynex") } @{ Algorithms = @("EtcHash"); Type = "AMD"; Fee = @(0.005); MinMemGiB = 1.08; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 20); ExcludeGPUarchitectures = @("GCN4"); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a etchash") } # https://github.com/bzminer/bzminer/issues/264 @{ Algorithms = @("Ethash"); Type = "AMD"; Fee = @(0.005); MinMemGiB = 1.08; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(60, 20); ExcludeGPUarchitectures = @("GCN4"); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a ethash") } # https://github.com/bzminer/bzminer/issues/264 @@ -63,6 +63,7 @@ $Algorithms = @( @{ Algorithms = @("Autolykos2"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = ""; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" -a ergo") } # @{ Algorithms = @("Autolykos2", "HeavyHashKaspa"); Type = "NVIDIA"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = "^MX[1|2]\d+"; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" -a ergo", " --a2 kaspa") } # ASIC + @{ Algorithms = @("Autolykos2", "DynexSolve"); Type = "NVIDIA"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = "^MX[1|2]\d+"; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" -a ergo", " --a2 dynex") } @{ Algorithms = @("Autolykos2", "SHA512256d"); Type = "NVIDIA"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = "^MX[1|2]\d+"; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" -a ergo", " --a2 radiant") } # @{ Algorithms = @("Blake3"); Type = "NVIDIA"; Fee = @(0.005); MinMemGiB = 2; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 5); ExcludeGPUarchitectures = @(); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a alph") } # https://github.com/bzminer/bzminer/issues @{ Algorithms = @("DynexSolve"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 1; Tuning = " --oc_mem_tweak 2"; WarmupTimes = @(45, 20); ExcludeGPUarchitectures = @("Other"); ExcludeGPUmodel = ""; ExcludePools = @(@(), @()); Arguments = @(" -a dynex") } diff --git a/Miners/CcminerAlexis78-v1.5.2.ps1 b/Miners/CcminerAlexis78-v1.5.2.ps1 index 50db4583..182a821c 100644 --- a/Miners/CcminerAlexis78-v1.5.2.ps1 +++ b/Miners/CcminerAlexis78-v1.5.2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.1" }))) { Return } diff --git a/Miners/CcminerDyn-v1.0.2.ps1 b/Miners/CcminerDyn-v1.0.2.ps1 index d945c676..4a486c84 100644 --- a/Miners/CcminerDyn-v1.0.2.ps1 +++ b/Miners/CcminerDyn-v1.0.2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } # Cuda error in func 'argon2d_hash_cuda' at line 89 : an illegal instruction was encountered on GTX 750 diff --git a/Miners/CcminerKlausT-v8.25.ps1 b/Miners/CcminerKlausT-v8.25.ps1 index 7978f6fb..acf540c8 100644 --- a/Miners/CcminerKlausT-v8.25.ps1 +++ b/Miners/CcminerKlausT-v8.25.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -and $_.OpenCL.ComputeCapability -lt "6.0" -and $_.Architecture -ne "Other" }))) { Return } diff --git a/Miners/CcminerKlausT-v8.26x2.ps1 b/Miners/CcminerKlausT-v8.26x2.ps1 index e86bc7f8..622d70d6 100644 --- a/Miners/CcminerKlausT-v8.26x2.ps1 +++ b/Miners/CcminerKlausT-v8.26x2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge [System.Version]"6.0" }))) { Return } diff --git a/Miners/CcminerLyra2z330-v8.21r9.ps1 b/Miners/CcminerLyra2z330-v8.21r9.ps1 index 1c4e76f8..a4de5914 100644 --- a/Miners/CcminerLyra2z330-v8.21r9.ps1 +++ b/Miners/CcminerLyra2z330-v8.21r9.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.1" }))) { Return } diff --git a/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 b/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 index eaf81cfb..759fdd47 100644 --- a/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 +++ b/Miners/CcminerLyraYesscrypt-v8.21r18v5.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.1" }))) { Return } diff --git a/Miners/CcminerMemeHash-v2.5.5.9.ps1 b/Miners/CcminerMemeHash-v2.5.5.9.ps1 index ffa6064c..acc4c2de 100644 --- a/Miners/CcminerMemeHash-v2.5.5.9.ps1 +++ b/Miners/CcminerMemeHash-v2.5.5.9.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/CcminerNeoscryptXaya-v0.2.ps1 b/Miners/CcminerNeoscryptXaya-v0.2.ps1 index 8c7133f1..c718321e 100644 --- a/Miners/CcminerNeoscryptXaya-v0.2.ps1 +++ b/Miners/CcminerNeoscryptXaya-v0.2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" -and $_.Architecture -ne "Other" }))) { Return } # Cuda error in func 'neoscrypt_hash_k4' at line 1518 : an illegal instruction was encountered on GTX 750 diff --git a/Miners/CcminerVerusCpu-v3.8.3.ps1 b/Miners/CcminerVerusCpu-v3.8.3.ps1 index bc093a7d..e7e9f4d4 100644 --- a/Miners/CcminerVerusCpu-v3.8.3.ps1 +++ b/Miners/CcminerVerusCpu-v3.8.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } @@ -29,7 +29,7 @@ $Path = "Bin\$Name\ccminer.exe" $DeviceEnumerator = "Type_Vendor_Index" $Algorithms = @( - @{ Algorithm = "VerusHash"; MinerSet = 1; WarmupTimes = @(90, 0); ExcludePools = @("NiceHash"); Arguments = " --algo verus" } # SRBMinerMulti-v2.7.2 is fastest, but has 0.85% miner fee + @{ Algorithm = "VerusHash"; MinerSet = 1; WarmupTimes = @(90, 0); ExcludePools = @("NiceHash"); Arguments = " --algo verus" } # SRBMinerMulti-v2.7.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 80c306f6..ee1b3f73 100644 --- a/Miners/CcminerVerusGpu-v3.8.3.ps1 +++ b/Miners/CcminerVerusGpu-v3.8.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "7.5" }))) { Return } diff --git a/Miners/ClaymoreNeoscrypt-v1.2.ps1 b/Miners/ClaymoreNeoscrypt-v1.2.ps1 index 873aa6b0..96ce2b08 100644 --- a/Miners/ClaymoreNeoscrypt-v1.2.ps1 +++ b/Miners/ClaymoreNeoscrypt-v1.2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -and $Variables.DriverVersion.CIM.AMD -lt [System.Version]"26.20.15011.10003" }))) { Return } diff --git a/Miners/CpuMiner-v1.4.ps1 b/Miners/CpuMiner-v1.4.ps1 index 62787fd6..0edc3121 100644 --- a/Miners/CpuMiner-v1.4.ps1 +++ b/Miners/CpuMiner-v1.4.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } diff --git a/Miners/CpuMinerAurum-v3.23.1.ps1 b/Miners/CpuMinerAurum-v3.23.1.ps1 index b157fb7e..41dd8d64 100644 --- a/Miners/CpuMinerAurum-v3.23.1.ps1 +++ b/Miners/CpuMinerAurum-v3.23.1.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } diff --git a/Miners/CryptoDredge-v0.16.0.ps1 b/Miners/CryptoDredge-v0.16.0.ps1 index 024ab28f..f9aa8c6e 100644 --- a/Miners/CryptoDredge-v0.16.0.ps1 +++ b/Miners/CryptoDredge-v0.16.0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/CryptoDredge-v0.27.0.ps1 b/Miners/CryptoDredge-v0.27.0.ps1 index 549681b4..93d2052f 100644 --- a/Miners/CryptoDredge-v0.27.0.ps1 +++ b/Miners/CryptoDredge-v0.27.0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" -and $_.Architecture -ne "Other" }))) { Return } diff --git a/Miners/EthMiner-v0.19.0.18.ps1 b/Miners/EthMiner-v0.19.0.18.ps1 index b626d654..0b4d99ee 100644 --- a/Miners/EthMiner-v0.19.0.18.ps1 +++ b/Miners/EthMiner-v0.19.0.18.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.CUDAversion -ge [System.Version]"9.1") }))) { Return } diff --git a/Miners/EvrProgPow-v1p3p0.ps1 b/Miners/EvrProgPow-v1p3p0.ps1 index 556b6d35..4d5f6483 100644 --- a/Miners/EvrProgPow-v1p3p0.ps1 +++ b/Miners/EvrProgPow-v1p3p0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/FrkHashMiner-v1.3.14.ps1 b/Miners/FrkHashMiner-v1.3.14.ps1 index 7d62d4bd..cc4ab65e 100644 --- a/Miners/FrkHashMiner-v1.3.14.ps1 +++ b/Miners/FrkHashMiner-v1.3.14.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" -and $_.CUDAversion -ge [System.Version]"9.1" }))) { Return } diff --git a/Miners/GMiner-v2.75.ps1 b/Miners/GMiner-v2.75.ps1 index c39a2c0b..c07e77c7 100644 --- a/Miners/GMiner-v2.75.ps1 +++ b/Miners/GMiner-v2.75.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ ($_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 1.2") -or $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/GMiner-v3.44.ps1 b/Miners/GMiner-v3.44.ps1 index b223fe2e..2642b0af 100644 --- a/Miners/GMiner-v3.44.ps1 +++ b/Miners/GMiner-v3.44.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ ($_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 1.2") -or $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } @@ -31,12 +31,13 @@ $DeviceEnumerator = "Type_Vendor_Slot" $Algorithms = @( # @{ Algorithms = @("Autolykos2"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; Tuning = ""; MinerSet = 2; WarmupTimes = @(30, 0); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo autolykos2 --cuda 0 --opencl 1" } # Algorithm not yet supported # @{ Algorithms = @("Cuckatoo32"); Type = "AMD"; Fee = @(0.05); MinMemGiB = 8.0; Tuning = ""; MinerSet = 3; WarmupTimes = @(30, 0); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo cuckatoo32 --cuda 0 --opencl 1" } # ASIC - @{ Algorithms = @("Equihash1254"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 2.1; Tuning = ""; MinerSet = 0; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo equihash125_4 --cuda 0 --opencl 1" } # lolMiner-v1.88 is fastest + @{ Algorithms = @("Equihash1254"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 2.1; Tuning = ""; MinerSet = 0; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo equihash125_4 --cuda 0 --opencl 1" } # lolMiner-v1.93 is fastest # @{ Algorithms = @("Equihash1445"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 1.8; Tuning = ""; MinerSet = 0; WarmupTimes = @(45, 0); ExcludePools = @(@("ProHashing"), @()); AutoCoinPers = " --pers auto"; Arguments = " --algo equihash144_5 --cuda 0 --opencl 1" } # FPGA # https://github.com/develsoftware/GMinerRelease/issues/906 @{ Algorithms = @("Equihash2109"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 2.8; Tuning = ""; MinerSet = 2; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo equihash210_9 --cuda 0 --opencl 1" } @{ Algorithms = @("Ethash"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; Tuning = ""; MinerSet = 1; WarmupTimes = @(45, 0); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo ethash --cuda 0 --opencl 1" } # PhoenixMiner-v6.2c may be faster, but I see lower speed at the pool @{ Algorithms = @("KawPow"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; Tuning = ""; MinerSet = 2; WarmupTimes = @(45, 30); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo kawpow --cuda 0 --opencl 1" } + @{ Algorithms = @("AstroBWTv3"); Type = "NVIDIA"; Fee = @(0.05); MinMemGiB = 13.0; Tuning = " --mt 2"; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo dero --cuda 1 --opencl 0" } @{ Algorithms = @("Autolykos2"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; Tuning = " --mt 2"; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo autolykos2 --cuda 1 --opencl 0" } # @{ Algorithms = @("Autolykos2", "HeavyHashKaspa"); Type = "NVIDIA"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; Tuning = " --mt 2"; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @("NiceHash")); AutoCoinPers = ""; Arguments = " --algo autolykos2 --dalgo kheavyhash --cuda 1 --opencl 0" } # ASIC @{ Algorithms = @("Autolykos2", "SHA512256d"); Type = "NVIDIA"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; Tuning = " --mt 2"; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo autolykos2 --dalgo radiant --cuda 1 --opencl 0" } @@ -44,7 +45,7 @@ $Algorithms = @( # @{ Algorithms = @("Cuckatoo32"); Type = "NVIDIA"; Fee = @(0.05); MinMemGiB = 8.0; Tuning = " --mt 2"; MinerSet = 3; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo cuckatoo32 --cuda 1 --opencl 0" } # ASIC @{ Algorithms = @("Cuckaroo30CTX"); Type = "NVIDIA"; Fee = @(0.05); MinMemGiB = 8.0; Tuning = " --mt 2"; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo cortex --cuda 1 --opencl 0" } @{ Algorithms = @("Cuckoo29"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 6.0; Tuning = " --mt 2"; MinerSet = 0; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo aeternity --cuda 1 --opencl 0" } - @{ Algorithms = @("Equihash1254"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 3.0; Tuning = " --mt 2"; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo equihash125_4 --cuda 1 --opencl 0" } # MiniZ-v2.4.d is fastest + @{ Algorithms = @("Equihash1254"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 3.0; Tuning = " --mt 2"; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo equihash125_4 --cuda 1 --opencl 0" } # MiniZ-v2.4e is fastest @{ Algorithms = @("Equihash1445"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2.1; Tuning = " --mt 2"; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@("ProHashing"), @()); AutoCoinPers = " --pers auto"; Arguments = " --algo equihash144_5 --cuda 1 --opencl 0" } # FPGA @{ Algorithms = @("Equihash2109"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 1.0; Tuning = " --mt 2"; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); AutoCoinPers = ""; Arguments = " --algo equihash210_9 --cuda 1 --opencl 0" } @{ Algorithms = @("EtcHash"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; Tuning = " --mt 2"; MinerSet = 0; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @("NiceHash")); AutoCoinPers = ""; Arguments = " --algo etchash --cuda 1 --opencl 0" } # PhoenixMiner-v6.2c may be faster, but I see lower speed at the pool diff --git a/Miners/HellMiner-v0.59.1.ps1 b/Miners/HellMiner-v0.59.1.ps1 index 17b33ace..4d98f039 100644 --- a/Miners/HellMiner-v0.59.1.ps1 +++ b/Miners/HellMiner-v0.59.1.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } diff --git a/Miners/JayddeeCpu-v24.7.ps1 b/Miners/JayddeeCpu-v24.8.ps1 similarity index 99% rename from Miners/JayddeeCpu-v24.7.ps1 rename to Miners/JayddeeCpu-v24.8.ps1 index 097a712c..dcfad9b8 100644 --- a/Miners/JayddeeCpu-v24.7.ps1 +++ b/Miners/JayddeeCpu-v24.8.ps1 @@ -17,13 +17,13 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } -$URI = "https://github.com/JayDDee/cpuminer-opt/releases/download/v27.4/cpuminer-opt-24.7-windows.zip" +$URI = "https://github.com/JayDDee/cpuminer-opt/releases/download/v24.8/cpuminer-opt-24.8-windows.zip" $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName $Path = "Bin\$Name\cpuminer-aes-sse42.exe" # Intel diff --git a/Miners/KawpowMiner-v1.2.4cl.ps1 b/Miners/KawpowMiner-v1.2.4cl.ps1 index 208f1598..323e3b75 100644 --- a/Miners/KawpowMiner-v1.2.4cl.ps1 +++ b/Miners/KawpowMiner-v1.2.4cl.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" }))) { Return } diff --git a/Miners/KawpowMiner-v1.2.4cuda.ps1 b/Miners/KawpowMiner-v1.2.4cuda.ps1 index b2f0972b..4dbbf0e8 100644 --- a/Miners/KawpowMiner-v1.2.4cuda.ps1 +++ b/Miners/KawpowMiner-v1.2.4cuda.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/Kudaraidee-v1.2.0a.ps1 b/Miners/Kudaraidee-v1.2.0a.ps1 index 75a40d9d..c3e81e06 100644 --- a/Miners/Kudaraidee-v1.2.0a.ps1 +++ b/Miners/Kudaraidee-v1.2.0a.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or ($_.Type -eq "NVIDIA" -and $_.CUDAversion -ge [System.Version]"10.2") }))) { Return } diff --git a/Miners/MeowPowMiner-v2.0.0cl.ps1 b/Miners/MeowPowMiner-v2.0.0cl.ps1 index 31d58159..d96447a3 100644 --- a/Miners/MeowPowMiner-v2.0.0cl.ps1 +++ b/Miners/MeowPowMiner-v2.0.0cl.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" }))) { Return } diff --git a/Miners/MeowPowMiner-v2.0.0cuda.ps1 b/Miners/MeowPowMiner-v2.0.0cuda.ps1 index 82f3538b..20f6a9ff 100644 --- a/Miners/MeowPowMiner-v2.0.0cuda.ps1 +++ b/Miners/MeowPowMiner-v2.0.0cuda.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/MiniZ-v2.4d.ps1 b/Miners/MiniZ-v2.4e.ps1 similarity index 91% rename from Miners/MiniZ-v2.4d.ps1 rename to Miners/MiniZ-v2.4e.ps1 index 542c2da6..4e3c4334 100644 --- a/Miners/MiniZ-v2.4d.ps1 +++ b/Miners/MiniZ-v2.4e.ps1 @@ -17,13 +17,13 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } -$URI = "https://github.com/UselessGuru/UG-Miner-Binaries/releases/download/MiniZ/miniZ_v2.4d_win-x64.zip" +$URI = "https://github.com/UselessGuru/UG-Miner-Binaries/releases/download/MiniZ/miniZ_v2.4e_win-x64.zip" $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName $Path = "Bin\$Name\miniZ.exe" $DeviceEnumerator = "Type_Vendor_Slot" @@ -39,9 +39,8 @@ $Algorithms = @( @{ Algorithm = "EthashB3"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludePools = @( ); AutoCoinPers = ""; Arguments = " --amd --par=ethashb3 --dag-fix" } @{ Algorithm = "EvrProgPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @("GCN1", "GCN2", "GCN3"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --pers=EVRMORE-PROGPOW --dag-fix" } @{ Algorithm = "FiroPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(55, 45); ExcludeGPUarchitectures = @( ); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --algo=firo" } - @{ Algorithm = "HeavyHashKarlsen"; Type = "AMD"; Fee = @(0.008); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(45, 10); ExcludeGPUarchitectures = @("GCN1"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --pers=kls" } - @{ Algorithm = "HeavyHashPyrin"; Type = "AMD"; Fee = @(0.008); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(45, 10); ExcludeGPUarchitectures = @("GCN1"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --pers=pyr" } - @{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(45, 35); ExcludeGPUarchitectures = @("GCN1", "GCN2", "GCN3"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --par=kawpow --dag-fix --pers=RAVENCOINKAWPOW" } + @{ Algorithm = "FishHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(55, 45); ExcludeGPUarchitectures = @( ); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --algo=firo" } + @{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(60, 35); ExcludeGPUarchitectures = @("GCN1", "GCN2", "GCN3"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --par=kawpow --dag-fix --pers=RAVENCOINKAWPOW" } @{ Algorithm = "ProgPowSero"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = @("GCN1", "GCN2", "GCN3"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --par=progpow --pers=sero" } @{ Algorithm = "ProgPowVeil"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 8.0; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = @("GCN1", "GCN2", "GCN3", "RDNA1"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --par=progpow --pers=veil" } @{ Algorithm = "ProgPowVeriblock"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = @("GCN1", "GCN2", "GCN3", "RDNA1"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --amd --par=progpow --pers=VeriBlock" } @@ -59,9 +58,7 @@ $Algorithms = @( @{ Algorithm = "EthashB3"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --par=ethashb3 --dag-fix" } @{ Algorithm = "EvrProgPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --pers=EVRMORE-PROGPOW --dag-fix" } @{ Algorithm = "FiroPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.08; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(55, 45); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --algo=firo" } - @{ Algorithm = "HeavyHashKarlsen"; Type = "NVIDIA"; Fee = @(0.008); MinMemGiB = 2.0; MinerSet = 0; Tuning = " --ocX"; WarmupTimes = @(45, 10); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --pers=kls" } - @{ Algorithm = "HeavyHashPyrin"; Type = "NVIDIA"; Fee = @(0.008); MinMemGiB = 2.0; MinerSet = 0; Tuning = " --ocX"; WarmupTimes = @(45, 10); ExcludeGPUarchitectures = @("Other"); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --pers=pyr" } - @{ Algorithm = "KawPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(45, 35); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --par=kawpow --dag-fix --pers=RAVENCOINKAWPOW" } + @{ Algorithm = "KawPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(60, 35); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --par=kawpow --dag-fix --pers=RAVENCOINKAWPOW" } @{ Algorithm = "Octopus"; Type = "NVIDIA"; Fee = @(0.03); MinMemGiB = 1.24; Minerset = 0; Tuning = " --ocX"; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --par=octopus" } @{ Algorithm = "ProgPowSero"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.08; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --pers=sero" } @{ Algorithm = "ProgPowVeil"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 8.0; MinerSet = 2; Tuning = " --ocX"; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(); AutoCoinPers = ""; Arguments = " --nvidia --pers=veil" } diff --git a/Miners/NSFMiner-v1.3.14.ps1 b/Miners/NSFMiner-v1.3.14.ps1 index 66c5dc66..7449d1eb 100644 --- a/Miners/NSFMiner-v1.3.14.ps1 +++ b/Miners/NSFMiner-v1.3.14.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.CUDAversion -ge [System.Version]"9.1") }))) { Return } diff --git a/Miners/NanoMiner-v3.9.3.ps1 b/Miners/NanoMiner-v3.9.3.ps1 index 3851457d..3d8f64de 100644 --- a/Miners/NanoMiner-v3.9.3.ps1 +++ b/Miners/NanoMiner-v3.9.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" -or @("AMD", "INTEL") -contains $_.Type -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge [System.Version]"455.23") }))) { Return } diff --git a/Miners/Ninjarig-1.0.3.ps1 b/Miners/Ninjarig-1.0.3.ps1 index 9bc7b777..07aa1031 100644 --- a/Miners/Ninjarig-1.0.3.ps1 +++ b/Miners/Ninjarig-1.0.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/NosuchCpu-v3.8.8.1.ps1 b/Miners/NosuchCpu-v3.8.8.1.ps1 index c71e41e6..276af3db 100644 --- a/Miners/NosuchCpu-v3.8.8.1.ps1 +++ b/Miners/NosuchCpu-v3.8.8.1.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } diff --git a/Miners/OneZeroMiner-v1.4.3.ps1 b/Miners/OneZeroMiner-v1.4.3.ps1 index 25ce5271..11117042 100644 --- a/Miners/OneZeroMiner-v1.4.3.ps1 +++ b/Miners/OneZeroMiner-v1.4.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or ($_.Type -eq "NVIDIA" -and $_.OpenCL.ComputeCapability -ge "6.0" -and $_.OpenCL.DriverVersion -ge [System.Version]"450.80.02") }))) { Return } diff --git a/Miners/PhoenixMiner-v6.2c.ps1 b/Miners/PhoenixMiner-v6.2c.ps1 index 819edaef..edf1930f 100644 --- a/Miners/PhoenixMiner-v6.2c.ps1 +++ b/Miners/PhoenixMiner-v6.2c.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/Radiator-v1.0.0.ps1 b/Miners/Radiator-v1.0.0.ps1 index f64c313d..2d2a3004 100644 --- a/Miners/Radiator-v1.0.0.ps1 +++ b/Miners/Radiator-v1.0.0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/Raptor3umCpu-v2.0.ps1 b/Miners/Raptor3umCpu-v2.0.ps1 index 72cab7cf..bf539f22 100644 --- a/Miners/Raptor3umCpu-v2.0.ps1 +++ b/Miners/Raptor3umCpu-v2.0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } diff --git a/Miners/Rigel-v1.19.1.ps1 b/Miners/Rigel-v1.19.1.ps1 index 8ebdb145..54dc46f5 100644 --- a/Miners/Rigel-v1.19.1.ps1 +++ b/Miners/Rigel-v1.19.1.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> # Return diff --git a/Miners/RplantCpu-v5.0.41.ps1 b/Miners/RplantCpu-v5.0.41.ps1 index b1f8968b..4a87d6c8 100644 --- a/Miners/RplantCpu-v5.0.41.ps1 +++ b/Miners/RplantCpu-v5.0.41.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } @@ -108,7 +108,7 @@ $Algorithms = @( @{ Algorithm = "YespowerRes"; MinerSet = 2; WarmupTimes = @(45, 0); ExcludePools = @(); Arguments = " --algo yespowerRes" } @{ Algorithm = "YespowerSugar"; MinerSet = 1; WarmupTimes = @(45, 15); ExcludePools = @(); Arguments = " --algo yespowerSugar" } # SRBMminerMulti is fastest, but has 0.85% miner fee @{ Algorithm = "YespowerTIDE"; MinerSet = 0; WarmupTimes = @(45, 5); ExcludePools = @(); Arguments = " --algo yespowerTIDE" } - @{ Algorithm = "YespowerUrx"; MinerSet = 2; WarmupTimes = @(45, 5); ExcludePools = @(); Arguments = " --algo yespowerURX" } # JayddeeCpu-v24.7 is faster, SRBMminerMulti is fastest, but has 0.85% miner fee + @{ Algorithm = "YespowerUrx"; MinerSet = 2; WarmupTimes = @(45, 5); ExcludePools = @(); Arguments = " --algo yespowerURX" } # JayddeeCpu-v24.8 is faster, SRBMminerMulti is fastest, but has 0.85% miner fee ) $Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) diff --git a/Miners/RrkzCpu-v4.2.ps1 b/Miners/RrkzCpu-v4.2.ps1 index 212cf192..219d62d5 100644 --- a/Miners/RrkzCpu-v4.2.ps1 +++ b/Miners/RrkzCpu-v4.2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($AvailableMinerDevices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" }))) { Return } diff --git a/Miners/SCCminer-v1.1.0.ps1 b/Miners/SCCminer-v1.1.0.ps1 index 44e57eaa..74018ea0 100644 --- a/Miners/SCCminer-v1.1.0.ps1 +++ b/Miners/SCCminer-v1.1.0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Return # Bad shares diff --git a/Miners/SRBMinerMulti-v0.9.4.ps1 b/Miners/SRBMinerMulti-v0.9.4.ps1 index a85d59f6..43be94eb 100644 --- a/Miners/SRBMinerMulti-v0.9.4.ps1 +++ b/Miners/SRBMinerMulti-v0.9.4.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> # Support for Pitcairn, Tahiti, Hawaii, Fiji and Tonga was removed in later versions diff --git a/Miners/SRBMinerMulti-v2.6.8.ps1 b/Miners/SRBMinerMulti-v2.6.8.ps1 index 053c4e57..351f656a 100644 --- a/Miners/SRBMinerMulti-v2.6.8.ps1 +++ b/Miners/SRBMinerMulti-v2.6.8.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" -or $_.Type -eq "INTEL" -or ($_.Type -eq "AMD" -and $_.Model -notmatch "^GCN[1-3]" -and $_.OpenCL.ClVersion -ge "OpenCL C 2.0") -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge "510.00") }))) { Return } diff --git a/Miners/SRBMinerMulti-v2.7.2.ps1 b/Miners/SRBMinerMulti-v2.7.4.ps1 similarity index 98% rename from Miners/SRBMinerMulti-v2.7.2.ps1 rename to Miners/SRBMinerMulti-v2.7.4.ps1 index 6b27312b..6fe53481 100644 --- a/Miners/SRBMinerMulti-v2.7.2.ps1 +++ b/Miners/SRBMinerMulti-v2.7.4.ps1 @@ -17,13 +17,13 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "CPU" -or $_.Type -eq "INTEL" -or ($_.Type -eq "AMD" -and $_.Model -notmatch "^GCN[1-3]" -and $_.OpenCL.ClVersion -ge "OpenCL C 2.0") -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge "510.00") }))) { Return } -$URI = "https://github.com/doktor83/SRBMiner-Multi/releases/download/2.7.2/SRBMiner-Multi-2-7-2-win64.zip" +$URI = "https://github.com/doktor83/SRBMiner-Multi/releases/download/2.7.4/SRBMiner-Multi-2-7-4-win64.zip" $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName $Path = "Bin\$Name\SRBMiner-MULTI.exe" $DeviceEnumerator = "Type_Vendor_Slot" @@ -64,10 +64,10 @@ $Algorithms = @( @{ Algorithms = @("FishHash", "Decred"); Type = "AMD"; Fee = @(0.0085, 0.01); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm fishhash", " --algorithm blake3_decred") } @{ Algorithms = @("FishHash", "HooHash"); Type = "AMD"; Fee = @(0.0085, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm fishhash", " --algorithm hoohash") } @{ Algorithms = @("HeavyHash"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm heavyhash") } # FPGA - @{ Algorithms = @("HeavyHashKarlsenV2"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm karlsenhashv2") } - @{ Algorithms = @("HeavyHashKarlsenV2", "Decred"); Type = "AMD"; Fee = @(0.01, 0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm blake3_decred") } - @{ Algorithms = @("HeavyHashKarlsenV2", "HooHash"); Type = "AMD"; Fee = @(0.01, 0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm hoohash") } - @{ Algorithms = @("HeavyHashKaspa"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm nxlhash") } + @{ Algorithms = @("HeavyHashKarlsenV2"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm karlsenhashv2") } + @{ Algorithms = @("HeavyHashKarlsenV2", "Decred"); Type = "AMD"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm blake3_decred") } + @{ Algorithms = @("HeavyHashKarlsenV2", "HooHash"); Type = "AMD"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm hoohash") } + @{ Algorithms = @("NxlHash"); Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = "^Other$|^GCN\d$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm nxlhash") } @{ Algorithms = @("HooHash"); Type = "AMD"; Fee = @(0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm hoohash") } @{ Algorithms = @("KawPow"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash", "ProHashing"), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm kawpow") } @{ Algorithms = @("Lyra2v2Webchain"); Type = "AMD"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 2; WarmupTimes = @(30, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-intel --disable-gpu-nvidia --algorithm lyra2v2_webchain") } @@ -152,11 +152,11 @@ $Algorithms = @( @{ Algorithms = @("FishHash", "Decred"); Type = "INTEL"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm fishhash", " --algorithm blake3_decred") } @{ Algorithms = @("FishHash", "HooHash"); Type = "INTEL"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm fishhash", " --algorithm hoohash") } @{ Algorithms = @("HeavyHash"); Type = "INTEL"; Fee = @(0.0085); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm heavyhash") } # FPGA - @{ Algorithms = @("HeavyHashKarlsenV2"); Type = "INTEL"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(30, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm karlsenhashv2") } + @{ Algorithms = @("HeavyHashKarlsenV2"); Type = "INTEL"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm karlsenhashv2") } + @{ Algorithms = @("HeavyHashKarlsenV2", "Decred"); Type = "INTEL"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm blake3_decred") } + @{ Algorithms = @("HeavyHashKarlsenV2", "HooHash"); Type = "INTEL"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm hoohash") } @{ Algorithms = @("HeavyHashKaspa"); Type = "INTEL"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm nxlhash") } @{ Algorithms = @("HooHash"); Type = "INTEL"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm hoohash") } - @{ Algorithms = @("HeavyHashKarlsenV2", "Decred"); Type = "INTEL"; Fee = @(0.01, 0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm blake3_decred") } - @{ Algorithms = @("HeavyHashKarlsenV2", "HooHash"); Type = "INTEL"; Fee = @(0.01, 0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm karlsenhashv2", " --algorithm hoohash") } @{ Algorithms = @("KawPow"); Type = "INTEL"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash", "ProHashing"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm kawpow") } @{ Algorithms = @("MeowPow"); Type = "INTEL"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(@("ProHashing"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm meowpow") } @{ Algorithms = @("ProgPowEpic"); Type = "INTEL"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-nvidia --algorithm progpow_epic") } @@ -196,10 +196,10 @@ $Algorithms = @( @{ Algorithms = @("FishHash", "Decred"); Type = "NVIDIA"; Fee = @(0.01, 0.01); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm fishhash", " --algorithm blake3_decred") } @{ Algorithms = @("FishHash", "HooHash"); Type = "NVIDIA"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 20); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm fishhash", " --algorithm hoohash") } @{ Algorithms = @("HeavyHash"); Type = "NVIDIA"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 20); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm heavyhash") } # FPGA - @{ Algorithms = @("HeavyHashKarlsenV2"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm karlsenhashv2") } - @{ Algorithms = @("HeavyHashKarlsenV2", "Decred"); Type = "NVIDIA"; Fee = @(0.01, 0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 20); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm karlsenhashv2", " --algorithm blake3_decred") } - @{ Algorithms = @("HeavyHashKarlsenV2", "HooHash"); Type = "NVIDIA"; Fee = @(0.01, 0.02); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 20); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm karlsenhashv2", " --algorithm hoohash") } - @{ Algorithms = @("HeavyHashKaspa"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm nxlhash") } + @{ Algorithms = @("HeavyHashKarlsenV2"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm karlsenhashv2") } + @{ Algorithms = @("HeavyHashKarlsenV2", "Decred"); Type = "NVIDIA"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 20); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm karlsenhashv2", " --algorithm blake3_decred") } + @{ Algorithms = @("HeavyHashKarlsenV2", "HooHash"); Type = "NVIDIA"; Fee = @(0.01, 0.02); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 20); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm karlsenhashv2", " --algorithm hoohash") } + @{ Algorithms = @("NxlHash"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm nxlhash") } @{ Algorithms = @("HooHash"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm hoohash") } @{ Algorithms = @("KawPow"); Type = "NVIDIA"; Fee = @(0.0085); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 20); ExcludeGPUarchitectures = " "; ExcludePools = @(@("NiceHash", "ProHashing"), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm kawpow") } @{ Algorithms = @("Lyra2v2Webchain"); Type = "NVIDIA"; Fee = @(0.0085); MinMemGiB = 1; MinerSet = 2; WarmupTimes = @(30, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = @(" --disable-cpu --disable-gpu-amd --disable-gpu-intel --algorithm lyra2v2_webchain") } diff --git a/Miners/SgMinerFancyIX-v0.9.4.ps1 b/Miners/SgMinerFancyIX-v0.9.4.ps1 index f225d21f..7026c9c6 100644 --- a/Miners/SgMinerFancyIX-v0.9.4.ps1 +++ b/Miners/SgMinerFancyIX-v0.9.4.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" }))) { Return } diff --git a/Miners/Suprminer-v2.31v2.ps1 b/Miners/Suprminer-v2.31v2.ps1 index bb2ecf8b..a7161692 100644 --- a/Miners/Suprminer-v2.31v2.ps1 +++ b/Miners/Suprminer-v2.31v2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/TTMiner-v2024.3.2.ps1 b/Miners/TTMiner-v2024.3.2.ps1 index bcb557c7..9f7e46fa 100644 --- a/Miners/TTMiner-v2024.3.2.ps1 +++ b/Miners/TTMiner-v2024.3.2.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> # TT needs avx2 and aes https://github.com/TrailingStop/TT-Miner-beta/issues/7#issuecomment-2158058291 diff --git a/Miners/TTMiner-v2024.3.3b5.ps1 b/Miners/TTMiner-v2024.3.3b5.ps1 new file mode 100644 index 00000000..522047b0 --- /dev/null +++ b/Miners/TTMiner-v2024.3.3b5.ps1 @@ -0,0 +1,160 @@ +<# +Copyright (c) 2018-2024 UselessGuru + +UG-Miner 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. + +UG-Miner 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: UG-Miner +Version: 6.3.23 +Version date: 2025/01/01 +#> + +# TT needs avx2 and aes https://github.com/TrailingStop/TT-Miner-beta/issues/7#issuecomment-2158058291 +If (($Variables.CPUfeatures -match "^AES$|^AVX2$").count -ne 2) { Return } +If (-not ($Devices = $Variables.EnabledDevices.Where({ ($_.Type -eq "NVIDIA" -and $_.OpenCL.ComputeCapability -gt "5.0") -or "AMD", "NVIDIA" -contains $_.Type }))) { Return } + +$URI = Switch ($Variables.DriverVersion.CUDA) { + { $_ -ge [System.Version]"11.0" } { "https://github.com/TrailingStop/TT-Miner-beta/releases/download/2024.3.3-beta5/TT-Miner-2024.3.3b5.zip" } + Default { Return } +} +$Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName +$Path = "Bin\$Name\TT-Miner.exe" +$DeviceEnumerator = "Type_Index" + +$Algorithms = @( + @{ Algorithm = "Blake3"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Blake3" } + @{ Algorithm = "EtcHash"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a EtcHash" } + @{ Algorithm = "Ethash"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.00; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Ethash" } + @{ Algorithm = "EthashB3"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.00; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a EthashB3" } + @{ Algorithm = "EvrProPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a EvrProgPow" } + @{ Algorithm = "FiroPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a FiroPow" } + @{ Algorithm = "FishHash"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a fishhash" } + @{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(75, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a KawPow" } + @{ Algorithm = "MeowPow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(120, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a meowpow" } + @{ Algorithm = "ProgPowEpic"; Type = "AMD"; Fee = @(0.02); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c EPIC" } + @{ Algorithm = "ProgPowSero"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c SERO" } + @{ Algorithm = "ProgPowVeil"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c VEIL" } + @{ Algorithm = "ProgPowZ"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c ZANO" } + @{ Algorithm = "ProgPowVeriblock"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a vProgPow" } + @{ Algorithm = "SCCpow"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c SCC" } +# @{ Algorithm = "SHA256d"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA256D" } # ASIC + @{ Algorithm = "SHA256dt"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA256DT" } + @{ Algorithm = "SHA3D"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Sha3D" } +# @{ Algorithm = "SHA512256d"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @("GCN4"); ExcludePools = @(); Arguments = " -a SHA512256D" } # https://github.com/TrailingStop/TT-Miner-beta/issues/12 + @{ Algorithm = "SHA3Solidity"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA3SOL" } + @{ Algorithm = "UbqHash"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a UbqHash" } + + @{ Algorithm = "Ghostrider"; Type = "CPU"; Fee = @(0.01); MinerSet = 0; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Ghostrider" } + @{ Algorithm = "Flex"; Type = "CPU"; Fee = @(0.01); MinerSet = 0; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Flex" } + @{ Algorithm = "SpectreX"; Type = "CPU"; Fee = @(0.01); MinerSet = 1; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SpectreX" } + @{ Algorithm = "XelisHash"; Type = "CPU"; Fee = @(0.01); MinerSet = 0; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Xelis" } + + @{ Algorithm = "Blake3"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Blake3" } + @{ Algorithm = "EtcHash"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a EtcHash" } + @{ Algorithm = "Ethash"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.00; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Ethash" } + @{ Algorithm = "EthashB3"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.00; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a EthashB3" } + @{ Algorithm = "EvrProPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a EvrProgPow" } + @{ Algorithm = "FiroPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a FiroPow" } + @{ Algorithm = "FishHash"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a FishHash" } + @{ Algorithm = "Ghostrider"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(300, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Ghostrider" } + @{ Algorithm = "KawPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(75, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a KawPow" } + @{ Algorithm = "MeowPow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(120, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a meowpow" } + @{ Algorithm = "ProgPowEpic"; Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c EPIC" } + @{ Algorithm = "ProgPowSero"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c SERO" } + @{ Algorithm = "ProgPowVeil"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c VEIL" } + @{ Algorithm = "ProgPowZ"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c ZANO" } + @{ Algorithm = "ProgPowVeriblock"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 2; WarmupTimes = @(60, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a vProgPow" } + @{ Algorithm = "SCCpow"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -c SCC" } +# @{ Algorithm = "SHA256d"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA256D" } # ASIC + @{ Algorithm = "SHA256dt"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA256DT" } + @{ Algorithm = "SHA3D"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a Sha3D" } + @{ Algorithm = "SHA512256d"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA512256D" } + @{ Algorithm = "SHA3Solidity"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 1; WarmupTimes = @(30, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a SHA3SOL" } + @{ Algorithm = "UbqHash"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = @(); ExcludePools = @(); Arguments = " -a UbqHash" } +) + +$Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) +$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithm] }) + +If ($Algorithms) { + + ($Devices | Sort-Object -Property Type, Model -Unique).ForEach( + { + $Model = $_.Model + $Type = $_.Type + $MinerDevices = $Devices.Where({ $_.Model -eq $Model -and $_.Type -eq $Type}) + $MinerAPIPort = $Config.APIPort + ($MinerDevices.Id | Sort-Object -Top 1) + 1 + + $Algorithms.Where({ $_.Type -eq $Type }).ForEach( + { + $ExcludeGPUarchitectures = $_.ExcludeGPUarchitectures + If ($SupportedMinerDevices = $MinerDevices.Where({ $ExcludeGPUarchitectures -notcontains $_.Architecture })) { + + # $ExcludePools = $_.ExcludePools + # ForEach ($Pool in $MinerPools[0][$_.Algorithm].Where({ $_.PoolPorts[0] -and $ExcludePools -notcontains $_.Name })) { + ForEach ($Pool in $MinerPools[0][$_.Algorithm].Where({ $_.PoolPorts[0] })) { + + $MinMemGiB = $_.MinMemGiB + $Pool.DAGSizeGiB + If ($AvailableMinerDevices = $SupportedMinerDevices.Where({ $_.MemoryGiB -ge $MinMemGiB })) { + + $MinerName = "$Name-$($AvailableMinerDevices.Count)x$Model-$($Pool.AlgorithmVariant)" + + If ("AKA", "ALPH", "ALT", "ARL", "AVS", "BBC", "BCH", "BLACK", "BNBTC", "BTC", "BTRM", "BUT", "CLO", "CLORE", "EGAZ", "EGEM", "ELH", "EPIC", "ETC", "ETHF", "ETHO", "ETHW", "ETI", "ETP", "EVOX", "EVR", "EXP", "FiroPowFIRO", "FITA", "FRENS", "GRAMS", "GSPC", "HVQ", "IRON", "JGC", "KAW", "KCN", "KIIRO", "LAB", "LTR", "MEOW", "MEWC", "NAPI", "NEOX", "NOVO", "OCTA", "PAPRY", "PRCO", "REDE", "RTH", "RTM", "RVN", "RXD", "SATO", "SATOX", "SCC", "SERO", "THOON", "TTM", "UBQ", "VBK", "VEIL", "VKAX", "VTE", "XNA", "YERB", "ZANO", "ZELS", "ZIL", "ZKBTC" -contains $Pool.Currency) { + $Arguments = "$($_.Arguments -replace ' -[a|c] \w+') -c $($Pool.Currency)" + } + Else { + $Arguments = $_.Arguments + } + If ($AvailableMinerDevices.Where({ $_.MemoryGiB -le 2 })) { $Arguments = $Arguments -replace " -intensity [0-9]+" } + $Arguments += " -o " + Switch ($Pool.Protocol) { + "ethstratum1" { $Arguments += "stratum+" } + "ethstratum2" { $Arguments += "stratum+" } + "ethstratumnh" { $Arguments += "stratum+" } + # Default { $Arguments += "stratum+" } + } + $Arguments += "$(If ($Pool.PoolPorts[1]) { "ssl://" } Else { "tcp://" })$($Pool.Host):$($Pool.PoolPorts | Select-Object -Last 1)" + $Arguments += " -u $($Pool.User)" + If ($Pool.Pass) { $Arguments += " -p $($Pool.Pass)" } + If ($Pool.WorkerName) { $Arguments += " -w $($Pool.WorkerName)" } + + + # Allow more time to build larger DAGs, must use type cast to keep values in $_ + $WarmupTimes = [UInt16[]]$_.WarmupTimes + $WarmupTimes[0] += [UInt16]($Pool.DAGSizeGiB * 5) + + [PSCustomObject]@{ + API = "EthMiner" + Arguments = "$Arguments -report-average 5 -report-interval 5$(If ($_.Algorithm -match $Variables.RegexAlgoHasDAG) { " -daginfo" }) -b 127.0.0.1:$($MinerAPIPort)$(If ($_.Type -eq "CPU") { " -cpu $AvailableMinerDevices.$($AvailableMinerDevices.CIM.NumberOfLogicalProcessors -$($Config.CPUMiningReserveCPUcore))" } Else { " -d $(($AvailableMinerDevices.$DeviceEnumerator | Sort-Object -Unique).ForEach({ '{0:x}' -f $_ }) -join ',')" })" + DeviceNames = $AvailableMinerDevices.Name + Fee = $_.Fee # Dev fee + MinerSet = $_.MinerSet + MinerUri = "http://127.0.0.1:$($MinerAPIPort)" + Name = $MinerName + Path = $Path + Port = $MinerAPIPort + Type = $_.Type + 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 }) + } + } + } + } + } + ) + } + ) +} diff --git a/Miners/TTMiner-v5.0.3.ps1 b/Miners/TTMiner-v5.0.3.ps1 index 29bfc9c6..ade8d12d 100644 --- a/Miners/TTMiner-v5.0.3.ps1 +++ b/Miners/TTMiner-v5.0.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/TeamBlackMiner-v2.25.ps1 b/Miners/TeamBlackMiner-v2.25.ps1 index 98b7fc27..d4ed398f 100644 --- a/Miners/TeamBlackMiner-v2.25.ps1 +++ b/Miners/TeamBlackMiner-v2.25.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.CUDAversion -ge [System.Version]"11.6" -and $_.CUDAversion -lt [System.Version]"12.6" }))) { Return } diff --git a/Miners/TeamBlackMiner-v2.27.ps1 b/Miners/TeamBlackMiner-v2.27.ps1 index de6662b0..f98e8fef 100644 --- a/Miners/TeamBlackMiner-v2.27.ps1 +++ b/Miners/TeamBlackMiner-v2.27.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.CUDAversion -ge [System.Version]"12.6") }))) { Return } diff --git a/Miners/TeamRedMiner-v0.10.21.ps1 b/Miners/TeamRedMiner-v0.10.21.ps1 index aa18e961..bf495106 100644 --- a/Miners/TeamRedMiner-v0.10.21.ps1 +++ b/Miners/TeamRedMiner-v0.10.21.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 2.0" }))) { Return } @@ -69,9 +69,9 @@ $Algorithms = @( # @{ Algorithms = @("EthashSHA256", "HeavyHashKaspa"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; MinerSet = 2; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=abel" } # ASIC @{ Algorithms = @("EthashSHA256", "HeavyHashPyrin"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; MinerSet = 2; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=abel" } @{ Algorithms = @("EthashSHA256", "FishHash"); Fee = @(0.01, 0.01); MinMemGiB = 0.77; MinerSet = 2; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @("NiceHash")); Arguments = " --algo=abel" } - @{ Algorithms = @("FiroPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @("RDNA3"); ExcludePools = @(@(), @()); Arguments = " --algo=firopow" } # Wildrig-v0.41.7 is fastest on Polaris + @{ Algorithms = @("FiroPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @("RDNA3"); ExcludePools = @(@(), @()); Arguments = " --algo=firopow" } # Wildrig-v0.41.9 is fastest on Polaris @{ Algorithms = @("FishHash"); Fee = @(0.01); MinMemGiB = 0.77; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(@("NiceHash"), @()); Arguments = " --algo=ironfish" } # Pools with support at this time are Herominers, Flexpool and Kryptex - @{ Algorithms = @("KawPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=kawpow" } # Wildrig-v0.41.7 is fastest on Polaris + @{ Algorithms = @("KawPow"); Fee = @(0.02); MinMemGiB = 0.77; MinerSet = 0; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=kawpow" } # Wildrig-v0.41.9 is fastest on Polaris @{ Algorithms = @("HeavyHashKarlsen"); Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=karlsen" } # @{ Algorithms = @("HeavyHashKaspa"); Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=kas" } # ASIC @{ Algorithms = @("HeavyHashPyrin"); Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = @(); ExcludePools = @(@(), @()); Arguments = " --algo=pyrin" } diff --git a/Miners/TeleMerakiMiner-v1.5.0.ps1 b/Miners/TeleMerakiMiner-v1.5.0.ps1 index b72c4723..b0810b24 100644 --- a/Miners/TeleMerakiMiner-v1.5.0.ps1 +++ b/Miners/TeleMerakiMiner-v1.5.0.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/Trex-v0.26.8.ps1 b/Miners/Trex-v0.26.8.ps1 index 28a718f7..e5088179 100644 --- a/Miners/Trex-v0.26.8.ps1 +++ b/Miners/Trex-v0.26.8.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/Wildrig-v0.41.7.ps1 b/Miners/Wildrig-v0.41.7.ps1 index c146e803..5cb45e74 100644 --- a/Miners/Wildrig-v0.41.7.ps1 +++ b/Miners/Wildrig-v0.41.7.ps1 @@ -18,7 +18,7 @@ along with this program. If not, see . <# Product: UG-Miner Version: 6.3.22 -Version date: 2024/12/21 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ ($_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 1.2" -and $_.Architecture -notmatch "^GCN1$") -or $_.Type -eq "INTEL" -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge [System.Version]"452.39.00") }))) { Return } @@ -30,247 +30,57 @@ $DeviceEnumerator = "Type_Vendor_Slot" $Algorithms = @( @{ Algorithm = "Aergo"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo aergo" } - @{ Algorithm = "Anime"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo anime" } @{ Algorithm = "AstralHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-astralhash" } # @{ Algorithm = "BCD"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bcd" } # ASIC @{ Algorithm = "Blake2bBtcc"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2b-btcc" } @{ Algorithm = "Blake2bGlt"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2b-glt" } -# @{ Algorithm = "Blake2s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2s" } # ASIC @{ Algorithm = "Blake3"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo blake3" } -# @{ Algorithm = "Bmw512"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bmw512" } # ASIC - @{ Algorithm = "C11"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo c11" } - @{ Algorithm = "CurveHash"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = "^GCN\d$"; ExcludePools = @(); Arguments = " --algo curvehash" } @{ Algorithm = "Dedal"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo dedal" } # CryptoDredge-v0.27.0 is fastest - @{ Algorithm = "EvrProgPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo evrprogpow" } - @{ Algorithm = "FiroPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(15, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo firopow" } - @{ Algorithm = "Ghostrider"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(180, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo ghostrider" } @{ Algorithm = "GlobalHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-globalhash" } - @{ Algorithm = "HashX7"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7" } - @{ Algorithm = "HeavyHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo heavyhash" } # FPGA - @{ Algorithm = "Hex"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hex" } - @{ Algorithm = "HMQ1725"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hmq1725" } # CryptoDredge-v0.27.0 is fastest @{ Algorithm = "JeongHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-jeonghash" } - @{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo kawpow" } # TeamRedMiner-v0.10.21 is fastest on Navi -# @{ Algorithm = "Lyra2RE2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v2" } # ASIC # @{ Algorithm = "Lyra2RE3"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v3" } # ASIC @{ Algorithm = "Lyra2TDC"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2tdc" } @{ Algorithm = "Lyra2vc0ban"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2vc0ban" } - @{ Algorithm = "MegaBtx"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo megabtx" } - @{ Algorithm = "MemeHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo memehash" } - @{ Algorithm = "MeowPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo meowpow" } - @{ Algorithm = "Mike"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo mike" } - @{ Algorithm = "NexaPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = "^GCN\d$"; ExcludePools = @("NiceHash"); Arguments = " --algo nexapow" } # https://github.com/andru-kun/wildrig-multi/issues/255 & https://github.com/andru-kun/wildrig-multi/issues/277 -# @{ Algorithm = "Nist5"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo nist5" } # ASIC @{ Algorithm = "PadiHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-padihash" } @{ Algorithm = "PawelHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-pawelhash" } -# @{ Algorithm = "Phi"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi" } # ASIC -# @{ Algorithm = "PhiHash" Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phihash" } # Cannot calculate DAG size # @{ Algorithm = "Phi5"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi5" } # Algorithm is dead - @{ Algorithm = "ProgPowEthercore"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-ethercore" } - @{ Algorithm = "ProgPowQuai"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-quai" } - @{ Algorithm = "ProgPowSero"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-sero" } - @{ Algorithm = "ProgPowTelestai"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-telestai" } - @{ Algorithm = "ProgPowVeil"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-veil" } - @{ Algorithm = "ProgPowVeriblock"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo vprogpow" } - @{ Algorithm = "ProgPowZ"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpowz" } -# @{ Algorithm = "Pufferfish2BMB"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 8; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo pufferfish2" } # waiting for coin to resurrect @{ Algorithm = "RWAHash"; Type = "AMD"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo rwahash" } -# @{ Algorithm = "Quark"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo quark" } # ASIC -# @{ Algorithm = "Quibit"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo qui" } # ASIC -# @{ Algorithm = "SHA256"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256" } # ASIC -# @{ Algorithm = "SHA256d"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256d" } # ASIC - @{ Algorithm = "SHAndwich256"; Type = "AMD"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skydoge" } - @{ Algorithm = "SHA256csm"; Type = "AMD"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256csm" } - @{ Algorithm = "SHA256t"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256t" } # Takes too long until it starts mining - @{ Algorithm = "SHA256q"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256q" } - @{ Algorithm = "SHA512256d"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha512256d" } - @{ Algorithm = "Skein2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skein2" } - @{ Algorithm = "SkunkHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skunkhash" } # Algorithm is dead - @{ Algorithm = "Timetravel"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel" } - @{ Algorithm = "Timetravel10"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel10" } - @{ Algorithm = "Tribus"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo tribus" } - @{ Algorithm = "X7"; Type = "AMD"; Fee = @(0.05); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7" } # ASIC -# @{ Algorithm = "X11"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11" } # ASIC -# @{ Algorithm = "X11ghost"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11ghost" } # ASIC - @{ Algorithm = "X11k"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11k" } -# @{ Algorithm = "X12"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x12" } # ASIC -# @{ Algorithm = "X13"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x13" } # ASIC -# @{ Algorithm = "X14"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x14" } # ASIC -# @{ Algorithm = "X15"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x15" } # ASIC -# @{ Algorithm = "X16r"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(30, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16r" } # ASIC - @{ Algorithm = "X16rt"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rt" } # FPGA - @{ Algorithm = "X16rv2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rv2" } - @{ Algorithm = "X16s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16s" } # FPGA - @{ Algorithm = "X17"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x17" } - @{ Algorithm = "X18"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x18" } - @{ Algorithm = "X21s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x21s" } # TeamRedMiner-v0.10.21 is fastest - @{ Algorithm = "X22"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22" } - @{ Algorithm = "X22i"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22i" } - @{ Algorithm = "X25x"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x25x" } - @{ Algorithm = "X33"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x33" } @{ Algorithm = "Xevan"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo xevan --gpu-threads 1" } # No hashrate on time for old GPUs @{ Algorithm = "Aergo"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo aergo --watchdog" } - @{ Algorithm = "Anime"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo anime --watchdog" } @{ Algorithm = "AstralHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-astralhash --watchdog" } @{ Algorithm = "BCD"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bcd --watchdog" } # ASIC @{ Algorithm = "Blake2bBtcc"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2b-btcc --watchdog" } @{ Algorithm = "Blake2bGlt"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2b-glt --watchdog" } -# @{ Algorithm = "Blake2s"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2s" } # ASIC @{ Algorithm = "Blake3"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo blake3" } -# @{ Algorithm = "Bmw512"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bmw512 --watchdog" } # ASIC - @{ Algorithm = "C11"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo c11 --watchdog" } - @{ Algorithm = "CurveHash"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo curvehash --watchdog" } @{ Algorithm = "Dedal"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo dedal --watchdog" } # CryptoDredge-v0.27.0 is fastest - @{ Algorithm = "EvrProgPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo evrprogpow --watchdog" } - @{ Algorithm = "FiroPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(15, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo firopow --watchdog" } - @{ Algorithm = "Ghostrider"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(180, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo ghostrider --watchdog" } @{ Algorithm = "GlobalHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-globalhash --watchdog" } - @{ Algorithm = "HashX7"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7 --watchdog" } - @{ Algorithm = "Hex"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hex --watchdog" } -# @{ Algorithm = "HeavyHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo heavyhash" } # FPGA, Not yet supported on Nvidia - @{ Algorithm = "HMQ1725"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hmq1725 --watchdog" } # CryptoDredge-v0.27.0 is fastest @{ Algorithm = "JeongHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-jeonghash --watchdog" } # Trex-v0.26.8 is fastest - @{ Algorithm = "KawPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.90; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo kawpow --watchdog" } -# @{ Algorithm = "Lyra2RE2"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v2 --watchdog" } # ASIC # @{ Algorithm = "Lyra2RE3"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v3 --watchdog" } # ASIC @{ Algorithm = "Lyra2TDC"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2tdc --watchdog" } @{ Algorithm = "Lyra2vc0ban"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2vc0ban --watchdog" } - @{ Algorithm = "MegaBtx"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo megabtx --watchdog" } - @{ Algorithm = "MemeHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo memehash --watchdog" } - @{ Algorithm = "MeowPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo meowpow --watchdog" } - @{ Algorithm = "Mike"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo mike --watchdog" } - @{ Algorithm = "NexaPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo nexapow --watchdog" } # https://github.com/andru-kun/wildrig-multi/issues/277 -# @{ Algorithm = "Nist5"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo nist5 --watchdog" } @{ Algorithm = "PadiHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-padihash --watchdog" } @{ Algorithm = "PawelHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-pawelhash --watchdog" } # Trex-v0.26.8 is fastest -# @{ Algorithm = "Phi"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi --watchdog" } # ASIC -# @{ Algorithm = "PhiHash" Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phihash" } # Cannot calculate DAG size # @{ Algorithm = "Phi5"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi5 --watchdog" } # Algorithm is dead - @{ Algorithm = "ProgPowEthercore"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-ethercore --watchdog" } - @{ Algorithm = "ProgPowQuai"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-quai --watchdog" } - @{ Algorithm = "ProgPowSero"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-sero --watchdog" } - @{ Algorithm = "ProgPowTelestai"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-telestai --watchdog" } - @{ Algorithm = "ProgPowVeil"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-veil --watchdog" } - @{ Algorithm = "ProgPowVeriblock"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo vprogpow --watchdog" } - @{ Algorithm = "ProgPowZ"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpowz --watchdog" } -# @{ Algorithm = "Pufferfish2BMB"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 8; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo pufferfish2 --watchdog" } # waiting for coin to resurrect @{ Algorithm = "RWAHash"; Type = "INTEL"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo rwahash --watchdog" } -# @{ Algorithm = "Quark"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo quark" } # ASIC -# @{ Algorithm = "Quibit"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo qui" } # ASIC -# @{ Algorithm = "SHA256"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256" } # ASIC -# @{ Algorithm = "SHA256d"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256d" } # ASIC - @{ Algorithm = "SHAndwich256"; Type = "INTEL"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skydoge --watchdog" } # Trex-v0.26.8 is fastest - @{ Algorithm = "SHA256csm"; Type = "INTEL"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256csm --watchdog" } - @{ Algorithm = "SHA256t"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256t --watchdog" } - @{ Algorithm = "SHA256q"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256q --watchdog" } - @{ Algorithm = "SHA512256d"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha512256d --watchdog" } - @{ Algorithm = "Skein2"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skein2 --watchdog" } # CcminerAlexis78-v1.5.2 is fastest - @{ Algorithm = "SkunkHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skunkhash --watchdog" } # Algorithm is dead - @{ Algorithm = "Timetravel"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel --watchdog" } - @{ Algorithm = "Timetravel10"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel10 --watchdog" } -# @{ Algorithm = "Tribus"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo tribus --watchdog" } # ASIC - @{ Algorithm = "X7"; Type = "INTEL"; Fee = @(0.05); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7 --watchdog" } # ASIC -# @{ Algorithm = "X11"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11 --watchdog" } # ASIC -# @{ Algorithm = "X11ghost"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11ghost --watchdog" } # ASIC - @{ Algorithm = "X11k"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11k --watchdog" } -# @{ Algorithm = "X12"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x12 --watchdog" } # ASIC -# @{ Algorithm = "X13"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x13 --watchdog" } # ASIC -# @{ Algorithm = "X14"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x14 --watchdog" } # ASIC -# @{ Algorithm = "X15"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x15 --watchdog" } # ASIC -# @{ Algorithm = "X16r"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16r --watchdog" } # ASIC - @{ Algorithm = "X16rt"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rt --watchdog" } # FPGA - @{ Algorithm = "X16rv2"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rv2 --watchdog" } - @{ Algorithm = "X16s"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16s --watchdog" } # FPGA - @{ Algorithm = "X17"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x17 --watchdog" } - @{ Algorithm = "X18"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x18 --watchdog" } - @{ Algorithm = "X21s"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x21s --watchdog" } # Trex-v0.26.8 is fastest - @{ Algorithm = "X22"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22 --watchdog" } - @{ Algorithm = "X22i"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22i --watchdog" } - @{ Algorithm = "X25x"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x25x --watchdog" } - @{ Algorithm = "X33"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x33 --watchdog" } @{ Algorithm = "Xevan"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo xevan --watchdog" } @{ Algorithm = "Aergo"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo aergo --watchdog" } - @{ Algorithm = "Anime"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo anime --watchdog" } @{ Algorithm = "AstralHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-astralhash --watchdog" } @{ Algorithm = "BCD"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bcd --watchdog" } # ASIC @{ Algorithm = "Blake2bBtcc"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2b-btcc --watchdog" } @{ Algorithm = "Blake2bGlt"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2b-glt --watchdog" } -# @{ Algorithm = "Blake2s"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2s --watchdog" } # ASIC @{ Algorithm = "Blake3"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo blake3 --watchdog" } -# @{ Algorithm = "Bmw512"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bmw512 --watchdog" } # ASIC - @{ Algorithm = "C11"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo c11 --watchdog" } - @{ Algorithm = "CurveHash"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo curvehash --watchdog" } @{ Algorithm = "Dedal"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo dedal --watchdog" } # CryptoDredge-v0.27.0 is fastest - @{ Algorithm = "EvrProgPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo evrprogpow --watchdog" } - @{ Algorithm = "FiroPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(15, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo firopow --watchdog" } - @{ Algorithm = "Ghostrider"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(180, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo ghostrider --watchdog" } @{ Algorithm = "GlobalHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-globalhash --watchdog" } - @{ Algorithm = "HashX7"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7 --watchdog" } - @{ Algorithm = "HeavyHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo heavyhash --watchdog" } # FPGA - @{ Algorithm = "Hex"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hex --watchdog" } - @{ Algorithm = "HMQ1725"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hmq1725 --watchdog" } # CryptoDredge-v0.27.0 is fastest @{ Algorithm = "JeongHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-jeonghash --watchdog" } # Trex-v0.26.8 is fastest - @{ Algorithm = "KawPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo kawpow --watchdog" } -# @{ Algorithm = "Lyra2RE2"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v2 --watchdog" } # ASIC # @{ Algorithm = "Lyra2RE3"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v3 --watchdog" } # ASIC @{ Algorithm = "Lyra2TDC"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2tdc --watchdog" } @{ Algorithm = "Lyra2vc0ban"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2vc0ban --watchdog" } - @{ Algorithm = "MegaBtx"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo megabtx --watchdog" } - @{ Algorithm = "MemeHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo memehash --watchdog" } - @{ Algorithm = "MeowPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo meowpow --watchdog" } - @{ Algorithm = "Mike"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo mike --watchdog" } - @{ Algorithm = "NexaPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo nexapow --watchdog" } # https://github.com/andru-kun/wildrig-multi/issues/277 -# @{ Algorithm = "Nist5"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo nist5 --watchdog" } # ASIC @{ Algorithm = "PadiHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-padihash --watchdog" } @{ Algorithm = "PawelHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo glt-pawelhash --watchdog" } # Trex-v0.26.8 is fastest -# @{ Algorithm = "Phi"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi --watchdog" } # ASIC -# @{ Algorithm = "PhiHash" Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phihash" } # Cannot calculate DAG size # @{ Algorithm = "Phi5"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi5 --watchdog" } # Algorithm is dead - @{ Algorithm = "ProgPowEthercore"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-ethercore --watchdog" } - @{ Algorithm = "ProgPowQuai"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-quai --watchdog" } - @{ Algorithm = "ProgPowSero"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-sero --watchdog" } - @{ Algorithm = "ProgPowTelestai"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(); Arguments = " --algo progpow-telestai --watchdog" } - @{ Algorithm = "ProgPowVeil"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-veil --watchdog" } - @{ Algorithm = "ProgPowVeriblock"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo vprogpow --watchdog" } - @{ Algorithm = "ProgPowZ"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpowz --watchdog" } -# @{ Algorithm = "Pufferfish2BMB"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 8; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo pufferfish2 --watchdog" } # waiting for coin to resurrect @{ Algorithm = "RWAHash"; Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo rwahash --watchdog" } -# @{ Algorithm = "Quark"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo quark --watchdog" } # ASIC -# @{ Algorithm = "Quibit"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo qui --watchdog" } # ASIC -# @{ Algorithm = "SHA256"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256 --watchdog" } # ASIC -# @{ Algorithm = "SHA256d"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256d --watchdog" } # ASIC - @{ Algorithm = "SHAndwich256"; Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skydoge --watchdog" } # Trex-v0.26.8 is fastest - @{ Algorithm = "SHA256csm"; Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256csm --watchdog" } - @{ Algorithm = "SHA256t"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256t --watchdog" } - @{ Algorithm = "SHA256q"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256q --watchdog" } - @{ Algorithm = "SHA512256d"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha512256d --watchdog" } - @{ Algorithm = "Skein2"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skein2 --watchdog" } # CcminerAlexis78-v1.5.2 is fastest - @{ Algorithm = "SkunkHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skunkhash --watchdog" } # Algorithm is dead - @{ Algorithm = "Timetravel"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel --watchdog" } - @{ Algorithm = "Timetravel10"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel10 --watchdog" } -# @{ Algorithm = "Tribus"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo tribus --watchdog" } # ASIC - @{ Algorithm = "X7"; Type = "NVIDIA"; Fee = @(0.05); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7 --watchdog" } # ASIC -# @{ Algorithm = "X11"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11 --watchdog" } # ASIC -# @{ Algorithm = "X11ghost"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11ghost --watchdog" } # ASIC - @{ Algorithm = "X11k"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11k --watchdog" } -# @{ Algorithm = "X12"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x12 --watchdog" } # ASIC -# @{ Algorithm = "X13"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x13 --watchdog" } # ASIC -# @{ Algorithm = "X14"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x14 --watchdog" } # ASIC -# @{ Algorithm = "X15"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x15 --watchdog" } # ASIC -# @{ Algorithm = "X16r"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16r --watchdog" } # ASIC - @{ Algorithm = "X16rt"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rt --watchdog" } # FPGA - @{ Algorithm = "X16rv2"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rv2 --watchdog" } - @{ Algorithm = "X16s"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16s --watchdog" } # FPGA - @{ Algorithm = "X17"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x17 --watchdog" } - @{ Algorithm = "X18"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x18 --watchdog" } # ASIC - @{ Algorithm = "X20r"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x20r --watchdog" } # ASIC - @{ Algorithm = "X21s"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x21s --watchdog" } # Trex-v0.26.8 is fastest - @{ Algorithm = "X22"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22 --watchdog" } - @{ Algorithm = "X22i"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22i --watchdog" } # Not yet supported on Nvidia - @{ Algorithm = "X25x"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x25x --watchdog" } # Not yet supported on Nvidia - @{ Algorithm = "X33"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x33 --watchdog" } @{ Algorithm = "Xevan"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo xevan --watchdog" } ) diff --git a/Miners/Wildrig-v0.41.9.ps1 b/Miners/Wildrig-v0.41.9.ps1 new file mode 100644 index 00000000..fec41765 --- /dev/null +++ b/Miners/Wildrig-v0.41.9.ps1 @@ -0,0 +1,270 @@ +<# +Copyright (c) 2018-2024 UselessGuru + +UG-Miner 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. + +UG-Miner 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: UG-Miner +Version: 6.3.23 +Version date: 2025/01/01 +#> + +If (-not ($Devices = $Variables.EnabledDevices.Where({ ($_.Type -eq "AMD" -and $_.OpenCL.ClVersion -ge "OpenCL C 1.2" -and $_.Architecture -notmatch "^GCN1$") -or $_.Type -eq "INTEL" -or ($_.OpenCL.ComputeCapability -ge "5.0" -and $_.OpenCL.DriverVersion -ge [System.Version]"452.39.00") }))) { Return } + +$URI = "https://github.com/andru-kun/wildrig-multi/releases/download/0.41.9/wildrig-multi-windows-0.41.9.zip" +$Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName +$Path = "Bin\$Name\wildrig.exe" +$DeviceEnumerator = "Type_Slot" + +$Algorithms = @( + @{ Algorithm = "Anime"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo anime" } +# @{ Algorithm = "Blake2s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2s" } # ASIC +# @{ Algorithm = "Bmw512"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bmw512" } # ASIC + @{ Algorithm = "C11"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo c11" } + @{ Algorithm = "CurveHash"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = "^GCN\d$"; ExcludePools = @(); Arguments = " --algo curvehash" } + @{ Algorithm = "EvrProgPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo evrprogpow" } + @{ Algorithm = "FiroPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo firopow" } + @{ Algorithm = "Ghostrider"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(180, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo ghostrider" } + @{ Algorithm = "HeavyHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo heavyhash" } # FPGA + @{ Algorithm = "Hex"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hex" } + @{ Algorithm = "HMQ1725"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hmq1725" } # CryptoDredge-v0.27.0 is fastest + @{ Algorithm = "KawPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo kawpow" } # TeamRedMiner-v0.10.21 is fastest on Navi +# @{ Algorithm = "Lyra2RE2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v2" } # ASIC + @{ Algorithm = "MegaBtx"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo megabtx" } + @{ Algorithm = "MemeHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo memehash" } + @{ Algorithm = "MeowPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo meowpow" } + @{ Algorithm = "Mike"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo mike" } + @{ Algorithm = "NexaPow"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = "^GCN\d$"; ExcludePools = @("NiceHash"); Arguments = " --algo nexapow" } # https://github.com/andru-kun/wildrig-multi/issues/255 & https://github.com/andru-kun/wildrig-multi/issues/277 +# @{ Algorithm = "Nist5"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo nist5" } # ASIC +# @{ Algorithm = "Phi"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi" } # ASIC +# @{ Algorithm = "PhiHash" Type = "AMD"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phihash" } # Cannot calculate DAG size + @{ Algorithm = "ProgPowEthercore"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-ethercore" } + @{ Algorithm = "ProgPowQuai"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-quai" } + @{ Algorithm = "ProgPowSero"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-sero" } + @{ Algorithm = "ProgPowTelestai"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-telestai" } + @{ Algorithm = "ProgPowVeil"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-veil" } + @{ Algorithm = "ProgPowVeriblock"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo vprogpow" } + @{ Algorithm = "ProgPowZ"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpowz" } +# @{ Algorithm = "Pufferfish2BMB"; Type = "AMD"; Fee = @(0.01); MinMemGiB = 8; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo pufferfish2" } # waiting for coin to resurrect +# @{ Algorithm = "Quark"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo quark" } # ASIC +# @{ Algorithm = "Quibit"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo qui" } # ASIC +# @{ Algorithm = "SHA256"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256" } # ASIC +# @{ Algorithm = "SHA256d"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256d" } # ASIC + @{ Algorithm = "SHAndwich256"; Type = "AMD"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skydoge" } + @{ Algorithm = "SHA256csm"; Type = "AMD"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256csm" } + @{ Algorithm = "SHA256t"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256t" } # Takes too long until it starts mining + @{ Algorithm = "SHA256q"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256q" } + @{ Algorithm = "SHA512256d"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha512256d" } + @{ Algorithm = "Skein2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skein2" } + @{ Algorithm = "SkunkHash"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skunkhash" } # Algorithm is dead + @{ Algorithm = "Timetravel"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel" } + @{ Algorithm = "Timetravel10"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel10" } + @{ Algorithm = "Tribus"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo tribus" } +# @{ Algorithm = "X11"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11" } # ASIC +# @{ Algorithm = "X11ghost"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11ghost" } # ASIC + @{ Algorithm = "X11k"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11k" } +# @{ Algorithm = "X12"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x12" } # ASIC +# @{ Algorithm = "X13"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x13" } # ASIC +# @{ Algorithm = "X14"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x14" } # ASIC +# @{ Algorithm = "X15"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x15" } # ASIC +# @{ Algorithm = "X16r"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(30, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16r" } # ASIC + @{ Algorithm = "X16rt"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rt" } # FPGA + @{ Algorithm = "X16rv2"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rv2" } + @{ Algorithm = "X16s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16s" } # FPGA + @{ Algorithm = "X17"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x17" } + @{ Algorithm = "X18"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x18" } + @{ Algorithm = "X21s"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x21s" } # TeamRedMiner-v0.10.21 is fastest + @{ Algorithm = "X22"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22" } + @{ Algorithm = "X22i"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22i" } + @{ Algorithm = "X25x"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x25x" } + @{ Algorithm = "X33"; Type = "AMD"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x33" } + @{ Algorithm = "X7"; Type = "AMD"; Fee = @(0.05); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7" } # ASIC + + @{ Algorithm = "Anime"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo anime --watchdog" } +# @{ Algorithm = "Blake2s"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2s" } # ASIC +# @{ Algorithm = "Bmw512"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bmw512 --watchdog" } # ASIC + @{ Algorithm = "C11"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo c11 --watchdog" } + @{ Algorithm = "CurveHash"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo curvehash --watchdog" } + @{ Algorithm = "EvrProgPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo evrprogpow --watchdog" } + @{ Algorithm = "FiroPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo firopow --watchdog" } + @{ Algorithm = "Ghostrider"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(180, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo ghostrider --watchdog" } + @{ Algorithm = "Hex"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hex --watchdog" } +# @{ Algorithm = "HeavyHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo heavyhash" } # FPGA, Not yet supported on Nvidia + @{ Algorithm = "HMQ1725"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hmq1725 --watchdog" } # CryptoDredge-v0.27.0 is fastest + @{ Algorithm = "KawPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.90; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo kawpow --watchdog" } +# @{ Algorithm = "Lyra2RE2"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v2 --watchdog" } # ASIC + @{ Algorithm = "MegaBtx"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo megabtx --watchdog" } + @{ Algorithm = "MemeHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo memehash --watchdog" } + @{ Algorithm = "MeowPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo meowpow --watchdog" } + @{ Algorithm = "Mike"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo mike --watchdog" } + @{ Algorithm = "NexaPow"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo nexapow --watchdog" } # https://github.com/andru-kun/wildrig-multi/issues/277 +# @{ Algorithm = "Nist5"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo nist5 --watchdog" } +# @{ Algorithm = "Phi"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi --watchdog" } # ASIC +# @{ Algorithm = "PhiHash" Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phihash" } # Cannot calculate DAG size + @{ Algorithm = "ProgPowEthercore"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-ethercore --watchdog" } + @{ Algorithm = "ProgPowQuai"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-quai --watchdog" } + @{ Algorithm = "ProgPowSero"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-sero --watchdog" } + @{ Algorithm = "ProgPowTelestai"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-telestai --watchdog" } + @{ Algorithm = "ProgPowVeil"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-veil --watchdog" } + @{ Algorithm = "ProgPowVeriblock"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo vprogpow --watchdog" } + @{ Algorithm = "ProgPowZ"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpowz --watchdog" } +# @{ Algorithm = "Pufferfish2BMB"; Type = "INTEL"; Fee = @(0.01); MinMemGiB = 8; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo pufferfish2 --watchdog" } # waiting for coin to resurrect +# @{ Algorithm = "Quark"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo quark" } # ASIC +# @{ Algorithm = "Quibit"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo qui" } # ASIC +# @{ Algorithm = "SHA256"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256" } # ASIC +# @{ Algorithm = "SHA256d"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256d" } # ASIC + @{ Algorithm = "SHAndwich256"; Type = "INTEL"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skydoge --watchdog" } # Trex-v0.26.8 is fastest + @{ Algorithm = "SHA256csm"; Type = "INTEL"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256csm --watchdog" } + @{ Algorithm = "SHA256t"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256t --watchdog" } + @{ Algorithm = "SHA256q"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256q --watchdog" } + @{ Algorithm = "SHA512256d"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha512256d --watchdog" } + @{ Algorithm = "Skein2"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skein2 --watchdog" } # CcminerAlexis78-v1.5.2 is fastest + @{ Algorithm = "SkunkHash"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skunkhash --watchdog" } # Algorithm is dead + @{ Algorithm = "Timetravel"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel --watchdog" } + @{ Algorithm = "Timetravel10"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel10 --watchdog" } +# @{ Algorithm = "Tribus"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo tribus --watchdog" } # ASIC +# @{ Algorithm = "X11"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11 --watchdog" } # ASIC +# @{ Algorithm = "X11ghost"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11ghost --watchdog" } # ASIC + @{ Algorithm = "X11k"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11k --watchdog" } +# @{ Algorithm = "X12"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x12 --watchdog" } # ASIC +# @{ Algorithm = "X13"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x13 --watchdog" } # ASIC +# @{ Algorithm = "X14"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x14 --watchdog" } # ASIC +# @{ Algorithm = "X15"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x15 --watchdog" } # ASIC +# @{ Algorithm = "X16r"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16r --watchdog" } # ASIC + @{ Algorithm = "X16rt"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rt --watchdog" } # FPGA + @{ Algorithm = "X16rv2"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rv2 --watchdog" } + @{ Algorithm = "X16s"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16s --watchdog" } # FPGA + @{ Algorithm = "X17"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x17 --watchdog" } + @{ Algorithm = "X18"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x18 --watchdog" } + @{ Algorithm = "X21s"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x21s --watchdog" } # Trex-v0.26.8 is fastest + @{ Algorithm = "X22"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22 --watchdog" } + @{ Algorithm = "X22i"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22i --watchdog" } + @{ Algorithm = "X25x"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x25x --watchdog" } + @{ Algorithm = "X33"; Type = "INTEL"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x33 --watchdog" } + @{ Algorithm = "X7"; Type = "INTEL"; Fee = @(0.05); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7 --watchdog" } # ASIC + + @{ Algorithm = "Anime"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo anime --watchdog" } +# @{ Algorithm = "Blake2s"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo blake2s --watchdog" } # ASIC +# @{ Algorithm = "Bmw512"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo bmw512 --watchdog" } # ASIC + @{ Algorithm = "C11"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo c11 --watchdog" } + @{ Algorithm = "CurveHash"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo curvehash --watchdog" } + @{ Algorithm = "EvrProgPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo evrprogpow --watchdog" } + @{ Algorithm = "FiroPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo firopow --watchdog" } + @{ Algorithm = "Ghostrider"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(180, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo ghostrider --watchdog" } + @{ Algorithm = "HeavyHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo heavyhash --watchdog" } # FPGA + @{ Algorithm = "Hex"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hex --watchdog" } + @{ Algorithm = "HMQ1725"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 1; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo hmq1725 --watchdog" } # CryptoDredge-v0.27.0 is fastest + @{ Algorithm = "KawPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 1; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo kawpow --watchdog" } +# @{ Algorithm = "Lyra2RE2"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo lyra2v2 --watchdog" } # ASIC + @{ Algorithm = "MegaBtx"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo megabtx --watchdog" } + @{ Algorithm = "MemeHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo memehash --watchdog" } + @{ Algorithm = "MeowPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo meowpow --watchdog" } + @{ Algorithm = "Mike"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 1; MinerSet = 0; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo mike --watchdog" } + @{ Algorithm = "NexaPow"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @("NiceHash"); Arguments = " --algo nexapow --watchdog" } # https://github.com/andru-kun/wildrig-multi/issues/277 +# @{ Algorithm = "Nist5"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo nist5 --watchdog" } # ASIC +# @{ Algorithm = "Phi"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phi --watchdog" } # ASIC +# @{ Algorithm = "PhiHash" Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 1.24; MinerSet = 2; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo phihash" } # Cannot calculate DAG size + @{ Algorithm = "ProgPowEthercore"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-ethercore --watchdog" } + @{ Algorithm = "ProgPowQuai"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-quai --watchdog" } + @{ Algorithm = "ProgPowSero"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-sero --watchdog" } + @{ Algorithm = "ProgPowTelestai"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = "^Other$|^Pascal$"; ExcludePools = @(); Arguments = " --algo progpow-telestai --watchdog" } + @{ Algorithm = "ProgPowVeil"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpow-veil --watchdog" } + @{ Algorithm = "ProgPowVeriblock"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo vprogpow --watchdog" } + @{ Algorithm = "ProgPowZ"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 0.62; MinerSet = 1; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo progpowz --watchdog" } +# @{ Algorithm = "Pufferfish2BMB"; Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 8; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo pufferfish2 --watchdog" } # waiting for coin to resurrect +# @{ Algorithm = "Quark"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo quark --watchdog" } # ASIC +# @{ Algorithm = "Quibit"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo qui --watchdog" } # ASIC +# @{ Algorithm = "SHA256"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256 --watchdog" } # ASIC +# @{ Algorithm = "SHA256d"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256d --watchdog" } # ASIC + @{ Algorithm = "SHAndwich256"; Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skydoge --watchdog" } # Trex-v0.26.8 is fastest + @{ Algorithm = "SHA256csm"; Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256csm --watchdog" } + @{ Algorithm = "SHA256t"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(60, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256t --watchdog" } + @{ Algorithm = "SHA256q"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha256q --watchdog" } + @{ Algorithm = "SHA512256d"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo sha512256d --watchdog" } + @{ Algorithm = "Skein2"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skein2 --watchdog" } # CcminerAlexis78-v1.5.2 is fastest + @{ Algorithm = "SkunkHash"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(90, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo skunkhash --watchdog" } # Algorithm is dead + @{ Algorithm = "Timetravel"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel --watchdog" } + @{ Algorithm = "Timetravel10"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo timetravel10 --watchdog" } +# @{ Algorithm = "Tribus"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo tribus --watchdog" } # ASIC +# @{ Algorithm = "X11"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11 --watchdog" } # ASIC +# @{ Algorithm = "X11ghost"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11ghost --watchdog" } # ASIC + @{ Algorithm = "X11k"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x11k --watchdog" } +# @{ Algorithm = "X12"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x12 --watchdog" } # ASIC +# @{ Algorithm = "X13"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x13 --watchdog" } # ASIC +# @{ Algorithm = "X14"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x14 --watchdog" } # ASIC +# @{ Algorithm = "X15"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x15 --watchdog" } # ASIC +# @{ Algorithm = "X16r"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 3; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16r --watchdog" } # ASIC + @{ Algorithm = "X16rt"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rt --watchdog" } # FPGA + @{ Algorithm = "X16rv2"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 3; MinerSet = 0; WarmupTimes = @(45, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16rv2 --watchdog" } + @{ Algorithm = "X16s"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x16s --watchdog" } # FPGA + @{ Algorithm = "X17"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x17 --watchdog" } + @{ Algorithm = "X18"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x18 --watchdog" } # ASIC + @{ Algorithm = "X20r"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x20r --watchdog" } # ASIC + @{ Algorithm = "X21s"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 0; WarmupTimes = @(120, 45); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x21s --watchdog" } # Trex-v0.26.8 is fastest + @{ Algorithm = "X22"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22 --watchdog" } + @{ Algorithm = "X22i"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x22i --watchdog" } # Not yet supported on Nvidia + @{ Algorithm = "X25x"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x25x --watchdog" } # Not yet supported on Nvidia + @{ Algorithm = "X33"; Type = "NVIDIA"; Fee = @(0.0075); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x33 --watchdog" } + @{ Algorithm = "X7"; Type = "NVIDIA"; Fee = @(0.05); MinMemGiB = 2; MinerSet = 2; WarmupTimes = @(30, 15); ExcludeGPUarchitectures = " "; ExcludePools = @(); Arguments = " --algo x7 --watchdog" } # ASIC +) + +$Algorithms = $Algorithms.Where({ $_.MinerSet -le $Config.MinerSet }) +$Algorithms = $Algorithms.Where({ $MinerPools[0][$_.Algorithm] }) + +If ($Algorithms) { + + ($Devices | Sort-Object -Property Type, Model -Unique).ForEach( + { + $Model = $_.Model + $Type = $_.Type + $MinerDevices = $Devices.Where({ $_.Type -eq $Type -and $_.Model -eq $Model }) + $MinerAPIPort = $Config.APIPort + ($MinerDevices.Id | Sort-Object -Top 1) + 1 + + $Algorithms.Where({ $_.Type -eq $Type }).ForEach( + { + $ExcludeGPUarchitectures = $_.ExcludeGPUarchitectures + If ($SupportedMinerDevices = $MinerDevices.Where({ $_.Architecture -notmatch $ExcludeGPUarchitectures })) { + + $ExcludePools = $_.ExcludePools + ForEach ($Pool in $MinerPools[0][$_.Algorithm].Where({ $ExcludePools -notcontains $_.Name })) { + + $MinMemGiB = $_.MinMemGiB + $Pool.DAGSizeGiB + If ($AvailableMinerDevices = $SupportedMinerDevices.Where({ $_.MemoryGiB -ge $MinMemGiB })) { + + $MinerName = "$Name-$($AvailableMinerDevices.Count)x$Model-$($Pool.AlgorithmVariant)" + + [PSCustomObject]@{ + API = "XmRig" + Arguments = "$($_.Arguments) --api-port $MinerAPIPort --url $(If ($Pool.PoolPorts[1]) { "stratum+tcps" } Else { "stratum+tcp" })://$($Pool.Host):$($Pool.PoolPorts | Select-Object -Last 1) --user $($Pool.User) --pass $($Pool.Pass) --multiple-instance --opencl-devices $(($AvailableMinerDevices.$DeviceEnumerator | Sort-Object -Unique).ForEach({ '{0:x}' -f $_ }) -join ',')" + DeviceNames = $AvailableMinerDevices.Name + Fee = $_.Fee # Dev fee + MinerSet = $_.MinerSet + MinerUri = "http://127.0.0.1:$($MinerAPIPort)" + Name = $MinerName + Path = $Path + Port = $MinerAPIPort + Type = $_.Type + 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/XLArig-v5.2.4.ps1 b/Miners/XLArig-v5.2.4.ps1 index 2bca2331..036f4501 100644 --- a/Miners/XLArig-v5.2.4.ps1 +++ b/Miners/XLArig-v5.2.4.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> # https://github.com/scala-network/XLArig/issues/59; Need to remove temp fix in \Includes\MinerAPIs\XMrig.psm1 when resolved diff --git a/Miners/XmRig-v6.22.0.3.ps1 b/Miners/XmRig-v6.22.0.3.ps1 index efe9a4b8..e1c454dd 100644 --- a/Miners/XmRig-v6.22.0.3.ps1 +++ b/Miners/XmRig-v6.22.0.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ "AMD", "CPU", "INTEL" -contains $_.Type -or $_.OpenCL.ComputeCapability -gt "5.0" }))) { Return } diff --git a/Miners/XmrStak-v2.10.8.ps1 b/Miners/XmrStak-v2.10.8.ps1 index 9232a382..73661737 100644 --- a/Miners/XmrStak-v2.10.8.ps1 +++ b/Miners/XmrStak-v2.10.8.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -ne "NVIDIA" -or $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/ZealotEnemy-v2.6.3.ps1 b/Miners/ZealotEnemy-v2.6.3.ps1 index 2c36be92..ed18d18c 100644 --- a/Miners/ZealotEnemy-v2.6.3.ps1 +++ b/Miners/ZealotEnemy-v2.6.3.ps1 @@ -17,8 +17,8 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.OpenCL.ComputeCapability -ge "5.0" }))) { Return } diff --git a/Miners/lolMiner-v1.92.ps1 b/Miners/lolMiner-v1.93.ps1 similarity index 99% rename from Miners/lolMiner-v1.92.ps1 rename to Miners/lolMiner-v1.93.ps1 index fb4f1d77..b45fe46f 100644 --- a/Miners/lolMiner-v1.92.ps1 +++ b/Miners/lolMiner-v1.93.ps1 @@ -17,13 +17,13 @@ along with this program. If not, see . <# Product: UG-Miner -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> If (-not ($Devices = $Variables.EnabledDevices.Where({ $_.Type -eq "INTEL" -or ($_.Type -eq "AMD" -and $_.Architecture -match "GCN4|RDNA[1|2|3]") -or $_.OpenCL.ComputeCapability -ge "6.0" }))) { Return } -$URI = "https://github.com/Lolliedieb/lolMiner-releases/releases/download/1.92/lolMiner_v1.92_Win64.zip" +$URI = "https://github.com/Lolliedieb/lolMiner-releases/releases/download/1.93/lolMiner_v1.93_Win64.zip" $Name = [String](Get-Item $MyInvocation.MyCommand.Path).BaseName $Path = "Bin\$Name\lolminer.exe" $DeviceEnumerator = "Bus" @@ -83,7 +83,7 @@ $Algorithms = @( @{ Algorithms = @("Cuckaroo30CTX"); Type = "NVIDIA"; Fee = @(0.025); MinMemGiB = 8.0; MinerSet = 2; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo C30CTX" } # @{ Algorithms = @("Cuckatoo31"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 4.0; MinerSet = 3; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo C31" } # ASIC # @{ Algorithms = @("Cuckatoo32"); Type = "NVIDIA"; Fee = @(0.02); MinMemGiB = 4.0; MinerSet = 3; WarmupTimes = @(60, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo C32" } # ASIC - @{ Algorithms = @("Equihash1254"); Type = "NVIDIA"; Fee = @(0.015); MinMemGiB = 3.0; MinerSet = 1; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo ZEL --pers ZelProof" } # MiniZ-v2.4.d is fastest, but has 2% miner fee + @{ Algorithms = @("Equihash1254"); Type = "NVIDIA"; Fee = @(0.015); MinMemGiB = 3.0; MinerSet = 1; WarmupTimes = @(45, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo ZEL --pers ZelProof" } # MiniZ-v2.4e is fastest, but has 2% miner fee @{ Algorithms = @("Equihash1445"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 3.0; MinerSet = 1; WarmupTimes = @(30, 60); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo EQUI144_5" } # FPGA @{ Algorithms = @("Equihash2109"); Type = "NVIDIA"; Fee = @(0.01); MinMemGiB = 2.0; MinerSet = 2; WarmupTimes = @(45, 30); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo EQUI210_9" } @{ Algorithms = @("EtcHash"); Type = "NVIDIA"; Fee = @(0.007); MinMemGiB = 1.24; MinerSet = 0; WarmupTimes = @(45, 0); ExcludeGPUarchitectures = " "; ExcludePools = @(@(), @()); Arguments = " --algo ETCHASH" } # PhoenixMiner-v6.2c is faster diff --git a/Pools/HashCryptos.ps1 b/Pools/HashCryptos.ps1 index bbf70538..7d755f2d 100644 --- a/Pools/HashCryptos.ps1 +++ b/Pools/HashCryptos.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\HashCryptos.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/Pools/HiveON.ps1 b/Pools/HiveON.ps1 index 8c22e529..f93e5892 100644 --- a/Pools/HiveON.ps1 +++ b/Pools/HiveON.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\Hiveon.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/Pools/MiningDutch.ps1 b/Pools/MiningDutch.ps1 index e81a8d76..4c8ed8d8 100644 --- a/Pools/MiningDutch.ps1 +++ b/Pools/MiningDutch.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\MiningDutch.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/Pools/NiceHash.ps1 b/Pools/NiceHash.ps1 index d83fdd05..8e9f753d 100644 --- a/Pools/NiceHash.ps1 +++ b/Pools/NiceHash.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\NiceHash.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/Pools/ProHashing.ps1 b/Pools/ProHashing.ps1 index 907e3d6a..202e5a49 100644 --- a/Pools/ProHashing.ps1 +++ b/Pools/ProHashing.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\ProHashing.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/Pools/ZPool.ps1 b/Pools/ZPool.ps1 index 76d3437c..239ff832 100644 --- a/Pools/ZPool.ps1 +++ b/Pools/ZPool.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\ZPool.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/Pools/ZergPool.ps1 b/Pools/ZergPool.ps1 index 63ce9fe0..76f70ecc 100644 --- a/Pools/ZergPool.ps1 +++ b/Pools/ZergPool.ps1 @@ -19,8 +19,8 @@ along with this program. If not, see . <# Product: UG-Miner File: \Pools\ZergPool.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> Param( diff --git a/README.md b/README.md index b3c3ffd5..cb25ee4b 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ UG-Miner monitors mining pools in real-time in order to find the most profitable algorithm and runs the most profitable miner. -Version 6.3.22 / Updated 2024/12/21 +Version 6.3.23 / Updated 2025/01/01 -Copyright (c) 2018-2024 UselessGuru +Copyright (c) 2018-2025 UselessGuru This is free software, and you are welcome to redistribute it under certain conditions. https://github.com/UselessGuru/UG-Miner/blob/master/LICENSE diff --git a/UG-Miner.ps1 b/UG-Miner.ps1 index 276ea3da..949c54e5 100644 --- a/UG-Miner.ps1 +++ b/UG-Miner.ps1 @@ -18,8 +18,8 @@ along with this program. If not, see . <# Product: UG-Miner File: UG-Miner.ps1 -Version: 6.3.22 -Version date: 2024/12/21 +Version: 6.3.23 +Version date: 2025/01/01 #> using module .\Includes\Include.psm1 @@ -317,7 +317,7 @@ $Variables.Branding = [PSCustomObject]@{ BrandName = "UG-Miner" BrandWebSite = "https://github.com/UselessGuru/UG-Miner" ProductLabel = "UG-Miner" - Version = [System.Version]"6.3.22" + Version = [System.Version]"6.3.23" } $Global:WscriptShell = New-Object -ComObject Wscript.Shell @@ -381,7 +381,7 @@ If (-not $Variables.MyIP) { # Start transcript log If ($Config.Transcript) { Start-Transcript -Path ".\Debug\$((Get-Item $MyInvocation.MyCommand.Path).BaseName)-Transcript_$(Get-Date -Format "yyyy-MM-dd_HH-mm-ss").log" } -# Start Log reader (SnakeTail) [https://github.com/snakefoot/snaketail-net] +# Start log reader (SnakeTail) [https://github.com/snakefoot/snaketail-net] Start-LogReader # Update config file to include all new config items @@ -444,7 +444,7 @@ If ( -not (Get-Command Get-PnpDevice)) { Write-Message -Level Verbose "Pre-requisites verification OK - Running PWSH version $($PSVersionTable.PSVersion)$(If ($PSVersionTable.PSVersion -lt $RecommendedPWSHversion) { " (recommended version is $($RecommendedPWSHversion))"})." Remove-Variable RecommendedPWSHversion -# Check if new version is available +# Check if a new version is available Get-Version $Variables.VerthashDatPath = ".\Cache\VertHash.dat" @@ -544,7 +544,7 @@ If ((Test-Path -LiteralPath ".\Cache\DriverVersion.json" -PathType Leaf) -and ([ $Variables.DriverVersion | ConvertTo-Json | Out-File -LiteralPath ".\Cache\DriverVersion.json" -Force # 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 ".\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 ($VertHashDatCheckJob | Wait-Job -Timeout 60 | Receive-Job -Wait -AutoRemoveJob) { Write-Message -Level Verbose "VertHash data file integrity check: OK." @@ -735,7 +735,7 @@ Function MainLoop { "c" { If ($Variables.CalculatePowerCost) { $Variables.ShowPowerCost = -not $Variables.ShowPowerCost - Write-Host "`n'Power " -NoNewline; Write-Host "C" -ForegroundColor Cyan -NoNewline; Write-Host "ost' column visibility set to [" -NoNewline; If ($Variables.ShowPowerCost) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" + Write-Host "`n'Power " -NoNewline; Write-Host "c" -ForegroundColor Cyan -NoNewline; Write-Host "ost' column visibility set to [" -NoNewline; If ($Variables.ShowPowerCost) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Start-Sleep -Seconds 2 $Variables.RefreshNeeded = $true } @@ -750,7 +750,7 @@ Function MainLoop { } "f" { $Variables.ShowPoolFee = -not $Variables.ShowPoolFee - Write-Host "`n'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 "`nPool '"-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 @@ -768,7 +768,7 @@ Function MainLoop { Write-Host "e: Toggle '" -NoNewline; Write-Host "E" -ForegroundColor Cyan -NoNewline; Write-Host "arnings' column visibility [" -NoNewline; If ($Variables.ShowEarning) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Write-Host "f: Toggle pool '" -NoNewline; Write-Host "F" -ForegroundColor Cyan -NoNewline; Write-Host "ees' column visibility [" -NoNewline; If ($Variables.ShowPoolFee) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Write-Host "i: Toggle 'Earning b" -NoNewline; Write-Host "i" -ForegroundColor Cyan -NoNewline; Write-Host "as' column visibility [" -NoNewline; If ($Variables.ShowEarningBias) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" - Write-Host "m: Toggle " -NoNewline; Write-Host "m" -ForegroundColor Cyan -NoNewline; Write-Host "iner 'fees' column visibility [" -NoNewline; If ($Variables.ShowMinerFee) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" + Write-Host "m: Toggle " -NoNewline; Write-Host "m" -ForegroundColor Cyan -NoNewline; Write-Host "iner 'Fees' column visibility [" -NoNewline; If ($Variables.ShowMinerFee) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Write-Host "n: Toggle 'Coin" -NoNewline; Write-Host "N" -ForegroundColor Cyan -NoNewline; Write-Host "ame' column visibility [" -NoNewline; If ($Variables.ShowCoinName) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Write-Host "p: Toggle '" -NoNewline; Write-Host "P" -ForegroundColor Cyan -NoNewline; Write-Host "ool' column visibility [" -NoNewline; If ($Variables.ShowPool) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" If ($Variables.CalculatePowerCost) { @@ -780,7 +780,7 @@ Function MainLoop { } Write-Host "u: Toggle '" -NoNewline; Write-Host "U" -ForegroundColor Cyan -NoNewline; Write-Host "ser' column visibility [" -NoNewline; If ($Variables.ShowUser) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" If ($Variables.CalculatePowerCost) { - Write-Host "w: Toggle 'Po" -NoNewline; Write-Host "w" -ForegroundColor Cyan -NoNewline; Write-Host "er consumption' column visibility [" -NoNewline; If ($Config.CalculatePowerCost -and $Variables.ShowPowerConsumption) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" + Write-Host "w: Toggle 'Po" -NoNewline; Write-Host "w" -ForegroundColor Cyan -NoNewline; Write-Host "er (W)' column visibility [" -NoNewline; If ($Config.CalculatePowerCost -and $Variables.ShowPowerConsumption) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" } Write-Host "y: Toggle 'Currenc" -NoNewline; Write-Host "y" -ForegroundColor Cyan -NoNewline; Write-Host "' column visibility [" -NoNewline; If ($Variables.ShowCurrency) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Break @@ -848,7 +848,7 @@ Function MainLoop { "w" { If ($Variables.CalculatePowerCost) { $Variables.ShowPowerConsumption = -not $Variables.ShowPowerConsumption - Write-Host "`n'Po" -NoNewline; Write-Host "w" -ForegroundColor Cyan -NoNewline; Write-Host "er consumption' column visibility set to [" -NoNewline; If ($Variables.ShowPowerConsumption) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" + Write-Host "`n'Po" -NoNewline; Write-Host "w" -ForegroundColor Cyan -NoNewline; Write-Host "er (W)' column visibility set to [" -NoNewline; If ($Variables.ShowPowerConsumption) { Write-Host "on" -ForegroundColor Green -NoNewline } Else { Write-Host "off" -ForegroundColor Red -NoNewline }; Write-Host "]" Start-Sleep -Seconds 2 $Variables.RefreshNeeded = $true } diff --git a/Version.txt b/Version.txt index 75b23202..106ab29c 100644 --- a/Version.txt +++ b/Version.txt @@ -1,6 +1,6 @@ { "Product": "UG-Miner", - "Version": "6.3.22", + "Version": "6.3.23", "AutoUpdate": true, "Uri": "https://github.com/UselessGuru/UG-Miner/archive/refs/heads/master.zip", "Message": "https://github.com/UselessGuru/UG-Miner/releases" diff --git a/Web/APIdocs.html b/Web/APIdocs.html index 7d217125..5585ba12 100644 --- a/Web/APIdocs.html +++ b/Web/APIdocs.html @@ -296,8 +296,8 @@

Functions



/functions/getminerdetail
Get full miner object -
Parameters: [URI]::EscapeDataString("BzMiner-v21.5.1-1xGTX1660SUPER6GB-Ethash&kHeavyHash {Ethash-4GiB[EXP]@ZergPool & kHeavyHash[KAS]@NiceHash}") -
e.g.: /functions/getminerdetail?BzMiner-v21.5.1-1xGTX1660SUPER6GB-Ethash%26kHeavyHash%20%7BEthash-4GiB%5BEXP%5D%40ZergPool%20%26%20kHeavyHash%5BKAS%5D%40NiceHash%7D +
Parameters: [URI]::EscapeDataString("BzMiner-v22.0.0-1xGTX1660SUPER6GB-Ethash&kHeavyHash {Ethash-4GiB[EXP]@ZergPool & kHeavyHash[KAS]@NiceHash}") +
e.g.: /functions/getminerdetail?BzMiner-v22.0.0-1xGTX1660SUPER6GB-Ethash%26kHeavyHash%20%7BEthash-4GiB%5BEXP%5D%40ZergPool%20%26%20kHeavyHash%5BKAS%5D%40NiceHash%7D
Returns: miner object with all properties

/functions/log/get diff --git a/Web/parts/head.html b/Web/parts/head.html index 3483f58f..ab6b079e 100644 --- a/Web/parts/head.html +++ b/Web/parts/head.html @@ -58,11 +58,6 @@