diff --git a/docs/miners/supported_types.md b/docs/miners/supported_types.md
index 8fede7e9..6d40e4f1 100644
--- a/docs/miners/supported_types.md
+++ b/docs/miners/supported_types.md
@@ -77,6 +77,7 @@ Supported miner types are here on this list. If your miner (or miner version) i
M31S+
- VE20
+ - V30
- V40
- V60
- V80
diff --git a/docs/miners/whatsminer/M3X.md b/docs/miners/whatsminer/M3X.md
index ca0a4313..2c69f90f 100644
--- a/docs/miners/whatsminer/M3X.md
+++ b/docs/miners/whatsminer/M3X.md
@@ -130,6 +130,14 @@
show_root_heading: false
heading_level: 4
+## M31S+V30
+
+::: pyasic.miners.whatsminer.btminer.M3X.M31S_Plus.BTMinerM31SPlusV30
+ handler: python
+ options:
+ show_root_heading: false
+ heading_level: 4
+
## M31S+V40
::: pyasic.miners.whatsminer.btminer.M3X.M31S_Plus.BTMinerM31SPlusV40
diff --git a/pyasic/miners/_types/whatsminer/M3X/M31S_Plus.py b/pyasic/miners/_types/whatsminer/M3X/M31S_Plus.py
index ba530793..c9362cab 100644
--- a/pyasic/miners/_types/whatsminer/M3X/M31S_Plus.py
+++ b/pyasic/miners/_types/whatsminer/M3X/M31S_Plus.py
@@ -33,6 +33,15 @@ class M31SPlusVE20(BaseMiner):
self.fan_count = 2
+class M31SPlusV30(BaseMiner):
+ def __init__(self, ip: str):
+ super().__init__()
+ self.ip = ip
+ self.model = "M31S+ V30"
+ self.nominal_chips = 17
+ self.fan_count = 2
+
+
class M31SPlusV40(BaseMiner):
def __init__(self, ip: str):
super().__init__()
diff --git a/pyasic/miners/_types/whatsminer/M3X/__init__.py b/pyasic/miners/_types/whatsminer/M3X/__init__.py
index a7cd2b15..85cceed8 100644
--- a/pyasic/miners/_types/whatsminer/M3X/__init__.py
+++ b/pyasic/miners/_types/whatsminer/M3X/__init__.py
@@ -25,6 +25,7 @@ from .M31S import M31S
from .M31S_Plus import (
M31SPlus,
M31SPlusVE20,
+ M31SPlusV30,
M31SPlusV40,
M31SPlusV80,
M31SPlusV60,
diff --git a/pyasic/miners/miner_factory.py b/pyasic/miners/miner_factory.py
index 83544542..52a59a44 100644
--- a/pyasic/miners/miner_factory.py
+++ b/pyasic/miners/miner_factory.py
@@ -197,6 +197,7 @@ MINER_CLASSES = {
"Default": BTMinerM31SPlus,
"BTMiner": BTMinerM31SPlus,
"E20": BTMinerM31SPlusVE20,
+ "30": BTMinerM31SPlusV30,
"40": BTMinerM31SPlusV40,
"60": BTMinerM31SPlusV60,
"80": BTMinerM31SPlusV80,
diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py
index d357c4df..142be4a8 100644
--- a/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py
+++ b/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py
@@ -16,6 +16,7 @@ from pyasic.miners._backends import BTMiner # noqa - Ignore access to _module
from pyasic.miners._types import (
M31SPlus,
M31SPlusVE20,
+ M31SPlusV30,
M31SPlusV40,
M31SPlusV60,
M31SPlusV80,
@@ -35,6 +36,12 @@ class BTMinerM31SPlusVE20(BTMiner, M31SPlusVE20):
self.ip = ip
+class BTMinerM31SPlusV30(BTMiner, M31SPlusV30):
+ def __init__(self, ip: str) -> None:
+ super().__init__(ip)
+ self.ip = ip
+
+
class BTMinerM31SPlusV40(BTMiner, M31SPlusV40):
def __init__(self, ip: str) -> None:
super().__init__(ip)
diff --git a/pyasic/miners/whatsminer/btminer/M3X/__init__.py b/pyasic/miners/whatsminer/btminer/M3X/__init__.py
index 8941ad7a..53f85bc7 100644
--- a/pyasic/miners/whatsminer/btminer/M3X/__init__.py
+++ b/pyasic/miners/whatsminer/btminer/M3X/__init__.py
@@ -36,6 +36,7 @@ from .M31S import BTMinerM31S
from .M31S_Plus import (
BTMinerM31SPlus,
BTMinerM31SPlusVE20,
+ BTMinerM31SPlusV30,
BTMinerM31SPlusV40,
BTMinerM31SPlusV60,
BTMinerM31SPlusV80,