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 @@