Merge branch 'master' into update_firmware_2
This commit is contained in:
@@ -49,6 +49,8 @@ def backend_str(backend: MinerTypes) -> str:
|
|||||||
return "LuxOS Firmware Miners"
|
return "LuxOS Firmware Miners"
|
||||||
case MinerTypes.MARATHON:
|
case MinerTypes.MARATHON:
|
||||||
return "Mara Firmware Miners"
|
return "Mara Firmware Miners"
|
||||||
|
case MinerTypes.BITAXE:
|
||||||
|
return "Stock Firmware BitAxe Miners"
|
||||||
|
|
||||||
|
|
||||||
def create_url_str(mtype: str):
|
def create_url_str(mtype: str):
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X15 Models
|
## X15 Models
|
||||||
|
|
||||||
## Z15
|
## Z15 (Stock)
|
||||||
::: pyasic.miners.antminer.cgminer.X15.Z15.CGMinerZ15
|
::: pyasic.miners.antminer.cgminer.X15.Z15.CGMinerZ15
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,49 +1,49 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X17 Models
|
## X17 Models
|
||||||
|
|
||||||
## S17
|
## S17 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17
|
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S17+
|
## S17+ (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17Plus
|
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17Plus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S17 Pro
|
## S17 Pro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17Pro
|
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17Pro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S17e
|
## S17e (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17e
|
::: pyasic.miners.antminer.bmminer.X17.S17.BMMinerS17e
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T17
|
## T17 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17
|
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T17+
|
## T17+ (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17Plus
|
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17Plus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T17e
|
## T17e (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17e
|
::: pyasic.miners.antminer.bmminer.X17.T17.BMMinerT17e
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,224 +1,231 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X19 Models
|
## X19 Models
|
||||||
|
|
||||||
## S19
|
## S19 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19L
|
## S19L (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19L
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19L
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 Pro
|
## S19 Pro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Pro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Pro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j
|
## S19j (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19j
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19j
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19i
|
## S19i (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19i
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19i
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19+
|
## S19+ (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Plus
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Plus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j No PIC
|
## S19j No PIC (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jNoPIC
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jNoPIC
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 Pro+
|
## S19 Pro+ (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProPlus
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProPlus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j Pro
|
## S19j Pro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jPro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19jPro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 XP
|
## S19 XP (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19XP
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19XP
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19a
|
## S19a (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19a
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19a
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19a Pro
|
## S19a Pro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19aPro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19aPro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 Hydro
|
## S19 Hydro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Hydro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19Hydro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 Pro Hydro
|
## S19 Pro Hydro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProHydro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProHydro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 Pro+ Hydro
|
## S19 Pro+ Hydro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProPlusHydro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19ProPlusHydro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19K Pro
|
## S19K Pro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19KPro
|
::: pyasic.miners.antminer.bmminer.X19.S19.BMMinerS19KPro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T19
|
## T19 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X19.T19.BMMinerT19
|
::: pyasic.miners.antminer.bmminer.X19.T19.BMMinerT19
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19
|
## S19 (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19+
|
## S19+ (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19Plus
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19Plus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 Pro
|
## S19 Pro (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19Pro
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19Pro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19a
|
## S19a (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19a
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19a
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19a Pro
|
## S19a Pro (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19aPro
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19aPro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j
|
## S19j (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19j
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19j
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j No PIC
|
## S19j No PIC (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jNoPIC
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jNoPIC
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j Pro
|
## S19j Pro (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jPro
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jPro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j Pro No PIC
|
## S19j Pro No PIC (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProNoPIC
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProNoPIC
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j Pro+
|
## S19j Pro+ (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProPlus
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProPlus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j Pro+
|
## S19j Pro+ (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProPlus
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProPlus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19j Pro+ No PIC
|
## S19j Pro+ No PIC (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProPlusNoPIC
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19jProPlusNoPIC
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19k Pro No PIC
|
## S19k Pro No PIC (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19kProNoPIC
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19kProNoPIC
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S19 XP
|
## S19k Pro No PIC (BOS+)
|
||||||
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19kProNoPIC
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
|
## S19 XP (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19XP
|
::: pyasic.miners.antminer.bosminer.X19.S19.BOSMinerS19XP
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T19
|
## T19 (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X19.T19.BOSMinerT19
|
::: pyasic.miners.antminer.bosminer.X19.T19.BOSMinerT19
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,27 +1,34 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X21 Models
|
## X21 Models
|
||||||
|
|
||||||
## S21
|
## S21 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X21.S21.BMMinerS21
|
::: pyasic.miners.antminer.bmminer.X21.S21.BMMinerS21
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T21
|
## T21 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X21.T21.BMMinerT21
|
::: pyasic.miners.antminer.bmminer.X21.T21.BMMinerT21
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S21
|
## S21 (BOS+)
|
||||||
::: pyasic.miners.antminer.bosminer.X21.S21.BOSMinerS21
|
::: pyasic.miners.antminer.bosminer.X21.S21.BOSMinerS21
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
|
## S21 (VNish)
|
||||||
|
::: pyasic.miners.antminer.vnish.X21.S21.VNishS21
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
## S21 (ePIC)
|
## S21 (ePIC)
|
||||||
::: pyasic.miners.antminer.epic.X21.S21.ePICS21
|
::: pyasic.miners.antminer.epic.X21.S21.ePICS21
|
||||||
handler: python
|
handler: python
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X3 Models
|
## X3 Models
|
||||||
|
|
||||||
## D3
|
## D3 (Stock)
|
||||||
::: pyasic.miners.antminer.cgminer.X3.D3.CGMinerD3
|
::: pyasic.miners.antminer.cgminer.X3.D3.CGMinerD3
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## HS3
|
## HS3 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X3.HS3.BMMinerHS3
|
::: pyasic.miners.antminer.bmminer.X3.HS3.BMMinerHS3
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## L3+
|
## L3+ (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X3.L3.BMMinerL3Plus
|
::: pyasic.miners.antminer.bmminer.X3.L3.BMMinerL3Plus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X5 Models
|
## X5 Models
|
||||||
|
|
||||||
## DR5
|
## DR5 (Stock)
|
||||||
::: pyasic.miners.antminer.cgminer.X5.DR5.CGMinerDR5
|
::: pyasic.miners.antminer.cgminer.X5.DR5.CGMinerDR5
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X7 Models
|
## X7 Models
|
||||||
|
|
||||||
## L7
|
## L7 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X7.L7.BMMinerL7
|
::: pyasic.miners.antminer.bmminer.X7.L7.BMMinerL7
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X9 Models
|
## X9 Models
|
||||||
|
|
||||||
## E9Pro
|
## E9Pro (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X9.E9.BMMinerE9Pro
|
::: pyasic.miners.antminer.bmminer.X9.E9.BMMinerE9Pro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S9
|
## S9 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9
|
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S9i
|
## S9i (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9i
|
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9i
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## S9j
|
## S9j (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9j
|
::: pyasic.miners.antminer.bmminer.X9.S9.BMMinerS9j
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T9
|
## T9 (Stock)
|
||||||
::: pyasic.miners.antminer.bmminer.X9.T9.BMMinerT9
|
::: pyasic.miners.antminer.bmminer.X9.T9.BMMinerT9
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## T9 (Hive)
|
## T9 (Stock)
|
||||||
::: pyasic.miners.antminer.hiveon.X9.T9.HiveonT9
|
::: pyasic.miners.antminer.hiveon.X9.T9.HiveonT9
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## AD Models
|
## AD Models
|
||||||
|
|
||||||
## AT1500
|
## AT1500 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AD.AT1.AuradineFluxAT1500
|
::: pyasic.miners.auradine.flux.AD.AT1.AuradineFluxAT1500
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## AT2860
|
## AT2860 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AD.AT2.AuradineFluxAT2860
|
::: pyasic.miners.auradine.flux.AD.AT2.AuradineFluxAT2860
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## AT2880
|
## AT2880 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AD.AT2.AuradineFluxAT2880
|
::: pyasic.miners.auradine.flux.AD.AT2.AuradineFluxAT2880
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## AI Models
|
## AI Models
|
||||||
|
|
||||||
## AI2500
|
## AI2500 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AI.AI2.AuradineFluxAI2500
|
::: pyasic.miners.auradine.flux.AI.AI2.AuradineFluxAI2500
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## AI3680
|
## AI3680 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AI.AI3.AuradineFluxAI3680
|
::: pyasic.miners.auradine.flux.AI.AI3.AuradineFluxAI3680
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## AT Models
|
## AT Models
|
||||||
|
|
||||||
## AD2500
|
## AD2500 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AT.AD2.AuradineFluxAD2500
|
::: pyasic.miners.auradine.flux.AT.AD2.AuradineFluxAD2500
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## AD3500
|
## AD3500 (Stock)
|
||||||
::: pyasic.miners.auradine.flux.AT.AD3.AuradineFluxAD3500
|
::: pyasic.miners.auradine.flux.AT.AD3.AuradineFluxAD3500
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A10X Models
|
## A10X Models
|
||||||
|
|
||||||
## Avalon 1026
|
## Avalon 1026 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A10X.A1026.CGMinerAvalon1026
|
::: pyasic.miners.avalonminer.cgminer.A10X.A1026.CGMinerAvalon1026
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## Avalon 1047
|
## Avalon 1047 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A10X.A1047.CGMinerAvalon1047
|
::: pyasic.miners.avalonminer.cgminer.A10X.A1047.CGMinerAvalon1047
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## Avalon 1066
|
## Avalon 1066 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A10X.A1066.CGMinerAvalon1066
|
::: pyasic.miners.avalonminer.cgminer.A10X.A1066.CGMinerAvalon1066
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A11X Models
|
## A11X Models
|
||||||
|
|
||||||
## Avalon 1166 Pro
|
## Avalon 1166 Pro (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A11X.A1166.CGMinerAvalon1166Pro
|
::: pyasic.miners.avalonminer.cgminer.A11X.A1166.CGMinerAvalon1166Pro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A12X Models
|
## A12X Models
|
||||||
|
|
||||||
## Avalon 1246
|
## Avalon 1246 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A12X.A1246.CGMinerAvalon1246
|
::: pyasic.miners.avalonminer.cgminer.A12X.A1246.CGMinerAvalon1246
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A7X Models
|
## A7X Models
|
||||||
|
|
||||||
## Avalon 721
|
## Avalon 721 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A7X.A721.CGMinerAvalon721
|
::: pyasic.miners.avalonminer.cgminer.A7X.A721.CGMinerAvalon721
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## Avalon 741
|
## Avalon 741 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A7X.A741.CGMinerAvalon741
|
::: pyasic.miners.avalonminer.cgminer.A7X.A741.CGMinerAvalon741
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## Avalon 761
|
## Avalon 761 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A7X.A761.CGMinerAvalon761
|
::: pyasic.miners.avalonminer.cgminer.A7X.A761.CGMinerAvalon761
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A8X Models
|
## A8X Models
|
||||||
|
|
||||||
## Avalon 821
|
## Avalon 821 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A8X.A821.CGMinerAvalon821
|
::: pyasic.miners.avalonminer.cgminer.A8X.A821.CGMinerAvalon821
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## Avalon 841
|
## Avalon 841 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A8X.A841.CGMinerAvalon841
|
::: pyasic.miners.avalonminer.cgminer.A8X.A841.CGMinerAvalon841
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## Avalon 851
|
## Avalon 851 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A8X.A851.CGMinerAvalon851
|
::: pyasic.miners.avalonminer.cgminer.A8X.A851.CGMinerAvalon851
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A9X Models
|
## A9X Models
|
||||||
|
|
||||||
## Avalon 921
|
## Avalon 921 (Stock)
|
||||||
::: pyasic.miners.avalonminer.cgminer.A9X.A921.CGMinerAvalon921
|
::: pyasic.miners.avalonminer.cgminer.A9X.A921.CGMinerAvalon921
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
24
docs/miners/bitaxe/BM.md
Normal file
24
docs/miners/bitaxe/BM.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# pyasic
|
||||||
|
## BM Models
|
||||||
|
|
||||||
|
## Supra (Stock)
|
||||||
|
::: pyasic.miners.bitaxe.espminer.BM.BM1368.BitAxeSupra
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
|
## Ultra (Stock)
|
||||||
|
::: pyasic.miners.bitaxe.espminer.BM.BM1366.BitAxeUltra
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
|
## Max (Stock)
|
||||||
|
::: pyasic.miners.bitaxe.espminer.BM.BM1397.BitAxeMax
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
17
docs/miners/blockminer/blockminer.md
Normal file
17
docs/miners/blockminer/blockminer.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# pyasic
|
||||||
|
## blockminer Models
|
||||||
|
|
||||||
|
## BlockMiner 520i (ePIC)
|
||||||
|
::: pyasic.miners.blockminer.epic.blockminer.blockminer.ePICBlockMiner520i
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
|
## BlockMiner 720i (ePIC)
|
||||||
|
::: pyasic.miners.blockminer.epic.blockminer.blockminer.ePICBlockMiner720i
|
||||||
|
handler: python
|
||||||
|
options:
|
||||||
|
show_root_heading: false
|
||||||
|
heading_level: 4
|
||||||
|
|
||||||
@@ -1,21 +1,21 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## X5 Models
|
## X5 Models
|
||||||
|
|
||||||
## CK5
|
## CK5 (Stock)
|
||||||
::: pyasic.miners.goldshell.bfgminer.X5.CK5.GoldshellCK5
|
::: pyasic.miners.goldshell.bfgminer.X5.CK5.GoldshellCK5
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## HS5
|
## HS5 (Stock)
|
||||||
::: pyasic.miners.goldshell.bfgminer.X5.HS5.GoldshellHS5
|
::: pyasic.miners.goldshell.bfgminer.X5.HS5.GoldshellHS5
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## KD5
|
## KD5 (Stock)
|
||||||
::: pyasic.miners.goldshell.bfgminer.X5.KD5.GoldshellKD5
|
::: pyasic.miners.goldshell.bfgminer.X5.KD5.GoldshellKD5
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## XBox Models
|
## XBox Models
|
||||||
|
|
||||||
## KD Box II
|
## KD Box II (Stock)
|
||||||
::: pyasic.miners.goldshell.bfgminer.XBox.KDBox.GoldshellKDBoxII
|
::: pyasic.miners.goldshell.bfgminer.XBox.KDBox.GoldshellKDBoxII
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## KD Box Pro
|
## KD Box Pro (Stock)
|
||||||
::: pyasic.miners.goldshell.bfgminer.XBox.KDBox.GoldshellKDBoxPro
|
::: pyasic.miners.goldshell.bfgminer.XBox.KDBox.GoldshellKDBoxPro
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## XMax Models
|
## XMax Models
|
||||||
|
|
||||||
## KD Max
|
## KD Max (Stock)
|
||||||
::: pyasic.miners.goldshell.bfgminer.XMax.KDMax.GoldshellKDMax
|
::: pyasic.miners.goldshell.bfgminer.XMax.KDMax.GoldshellKDMax
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## A10X Models
|
## A10X Models
|
||||||
|
|
||||||
## A10X
|
## A10X (Stock)
|
||||||
::: pyasic.miners.innosilicon.cgminer.A10X.A10X.InnosiliconA10X
|
::: pyasic.miners.innosilicon.cgminer.A10X.A10X.InnosiliconA10X
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## T3X Models
|
## T3X Models
|
||||||
|
|
||||||
## T3H+
|
## T3H+ (Stock)
|
||||||
::: pyasic.miners.innosilicon.cgminer.T3X.T3H.InnosiliconT3HPlus
|
::: pyasic.miners.innosilicon.cgminer.T3X.T3H.InnosiliconT3HPlus
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -18,78 +18,78 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>X3 Series:</summary>
|
<summary>X3 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X3#d3">D3</a></li>
|
<li><a href="../antminer/X3#d3-stock">D3 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X3#hs3">HS3</a></li>
|
<li><a href="../antminer/X3#hs3-stock">HS3 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X3#l3_1">L3+</a></li>
|
<li><a href="../antminer/X3#l3_1-stock">L3+ (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X5 Series:</summary>
|
<summary>X5 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X5#dr5">DR5</a></li>
|
<li><a href="../antminer/X5#dr5-stock">DR5 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X7 Series:</summary>
|
<summary>X7 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X7#l7">L7</a></li>
|
<li><a href="../antminer/X7#l7-stock">L7 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X9 Series:</summary>
|
<summary>X9 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X9#e9pro">E9Pro</a></li>
|
<li><a href="../antminer/X9#e9pro-stock">E9Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#s9">S9</a></li>
|
<li><a href="../antminer/X9#s9-stock">S9 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#s9i">S9i</a></li>
|
<li><a href="../antminer/X9#s9i-stock">S9i (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#s9j">S9j</a></li>
|
<li><a href="../antminer/X9#s9j-stock">S9j (Stock)</a></li>
|
||||||
<li><a href="../antminer/X9#t9">T9</a></li>
|
<li><a href="../antminer/X9#t9-stock">T9 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X15 Series:</summary>
|
<summary>X15 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X15#z15">Z15</a></li>
|
<li><a href="../antminer/X15#z15-stock">Z15 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X17 Series:</summary>
|
<summary>X17 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X17#s17">S17</a></li>
|
<li><a href="../antminer/X17#s17-stock">S17 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X17#s17_1">S17+</a></li>
|
<li><a href="../antminer/X17#s17_1-stock">S17+ (Stock)</a></li>
|
||||||
<li><a href="../antminer/X17#s17-pro">S17 Pro</a></li>
|
<li><a href="../antminer/X17#s17-pro-stock">S17 Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X17#s17e">S17e</a></li>
|
<li><a href="../antminer/X17#s17e-stock">S17e (Stock)</a></li>
|
||||||
<li><a href="../antminer/X17#t17">T17</a></li>
|
<li><a href="../antminer/X17#t17-stock">T17 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X17#t17_1">T17+</a></li>
|
<li><a href="../antminer/X17#t17_1-stock">T17+ (Stock)</a></li>
|
||||||
<li><a href="../antminer/X17#t17e">T17e</a></li>
|
<li><a href="../antminer/X17#t17e-stock">T17e (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X19 Series:</summary>
|
<summary>X19 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X19#s19">S19</a></li>
|
<li><a href="../antminer/X19#s19-stock">S19 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19l">S19L</a></li>
|
<li><a href="../antminer/X19#s19l-stock">S19L (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro">S19 Pro</a></li>
|
<li><a href="../antminer/X19#s19-pro-stock">S19 Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j">S19j</a></li>
|
<li><a href="../antminer/X19#s19j-stock">S19j (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19i">S19i</a></li>
|
<li><a href="../antminer/X19#s19i-stock">S19i (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19_1">S19+</a></li>
|
<li><a href="../antminer/X19#s19_1-stock">S19+ (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-no-pic">S19j No PIC</a></li>
|
<li><a href="../antminer/X19#s19j-no-pic-stock">S19j No PIC (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro_1">S19 Pro+</a></li>
|
<li><a href="../antminer/X19#s19-pro_1-stock">S19 Pro+ (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro">S19j Pro</a></li>
|
<li><a href="../antminer/X19#s19j-pro-stock">S19j Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-xp">S19 XP</a></li>
|
<li><a href="../antminer/X19#s19-xp-stock">S19 XP (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a">S19a</a></li>
|
<li><a href="../antminer/X19#s19a-stock">S19a (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a-pro">S19a Pro</a></li>
|
<li><a href="../antminer/X19#s19a-pro-stock">S19a Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-hydro">S19 Hydro</a></li>
|
<li><a href="../antminer/X19#s19-hydro-stock">S19 Hydro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro-hydro">S19 Pro Hydro</a></li>
|
<li><a href="../antminer/X19#s19-pro-hydro-stock">S19 Pro Hydro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro_1-hydro">S19 Pro+ Hydro</a></li>
|
<li><a href="../antminer/X19#s19-pro_1-hydro-stock">S19 Pro+ Hydro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#s19k-pro">S19K Pro</a></li>
|
<li><a href="../antminer/X19#s19k-pro-stock">S19K Pro (Stock)</a></li>
|
||||||
<li><a href="../antminer/X19#t19">T19</a></li>
|
<li><a href="../antminer/X19#t19-stock">T19 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X21 Series:</summary>
|
<summary>X21 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X21#s21">S21</a></li>
|
<li><a href="../antminer/X21#s21-stock">S21 (Stock)</a></li>
|
||||||
<li><a href="../antminer/X21#t21">T21</a></li>
|
<li><a href="../antminer/X21#t21-stock">T21 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -100,234 +100,234 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>M2X Series:</summary>
|
<summary>M2X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../whatsminer/M2X#m20-v10">M20 V10</a></li>
|
<li><a href="../whatsminer/M2X#m20-v10-stock">M20 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m20s-v10">M20S V10</a></li>
|
<li><a href="../whatsminer/M2X#m20s-v10-stock">M20S V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m20s-v20">M20S V20</a></li>
|
<li><a href="../whatsminer/M2X#m20s-v20-stock">M20S V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m20s-v30">M20S V30</a></li>
|
<li><a href="../whatsminer/M2X#m20s-v30-stock">M20S V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m20p-v10">M20P V10</a></li>
|
<li><a href="../whatsminer/M2X#m20p-v10-stock">M20P V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m20p-v30">M20P V30</a></li>
|
<li><a href="../whatsminer/M2X#m20p-v30-stock">M20P V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m20s_1-v30">M20S+ V30</a></li>
|
<li><a href="../whatsminer/M2X#m20s_1-v30-stock">M20S+ V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m21-v10">M21 V10</a></li>
|
<li><a href="../whatsminer/M2X#m21-v10-stock">M21 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m21s-v20">M21S V20</a></li>
|
<li><a href="../whatsminer/M2X#m21s-v20-stock">M21S V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m21s-v60">M21S V60</a></li>
|
<li><a href="../whatsminer/M2X#m21s-v60-stock">M21S V60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m21s-v70">M21S V70</a></li>
|
<li><a href="../whatsminer/M2X#m21s-v70-stock">M21S V70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m21s_1-v20">M21S+ V20</a></li>
|
<li><a href="../whatsminer/M2X#m21s_1-v20-stock">M21S+ V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M2X#m29-v10">M29 V10</a></li>
|
<li><a href="../whatsminer/M2X#m29-v10-stock">M29 V10 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>M3X Series:</summary>
|
<summary>M3X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../whatsminer/M3X#m30-v10">M30 V10</a></li>
|
<li><a href="../whatsminer/M3X#m30-v10-stock">M30 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30-v20">M30 V20</a></li>
|
<li><a href="../whatsminer/M3X#m30-v20-stock">M30 V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30k-v10">M30K V10</a></li>
|
<li><a href="../whatsminer/M3X#m30k-v10-stock">M30K V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30l-v10">M30L V10</a></li>
|
<li><a href="../whatsminer/M3X#m30l-v10-stock">M30L V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v10">M30S V10</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v10-stock">M30S V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v20">M30S V20</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v20-stock">M30S V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v30">M30S V30</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v30-stock">M30S V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v40">M30S V40</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v40-stock">M30S V40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v50">M30S V50</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v50-stock">M30S V50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v60">M30S V60</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v60-stock">M30S V60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v70">M30S V70</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v70-stock">M30S V70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-v80">M30S V80</a></li>
|
<li><a href="../whatsminer/M3X#m30s-v80-stock">M30S V80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve10">M30S VE10</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve10-stock">M30S VE10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve20">M30S VE20</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve20-stock">M30S VE20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve30">M30S VE30</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve30-stock">M30S VE30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve40">M30S VE40</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve40-stock">M30S VE40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve50">M30S VE50</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve50-stock">M30S VE50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve60">M30S VE60</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve60-stock">M30S VE60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-ve70">M30S VE70</a></li>
|
<li><a href="../whatsminer/M3X#m30s-ve70-stock">M30S VE70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vf10">M30S VF10</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vf10-stock">M30S VF10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vf20">M30S VF20</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vf20-stock">M30S VF20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vf30">M30S VF30</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vf30-stock">M30S VF30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vg10">M30S VG10</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vg10-stock">M30S VG10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vg20">M30S VG20</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vg20-stock">M30S VG20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vg30">M30S VG30</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vg30-stock">M30S VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vg40">M30S VG40</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vg40-stock">M30S VG40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vh10">M30S VH10</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vh10-stock">M30S VH10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vh20">M30S VH20</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vh20-stock">M30S VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vh30">M30S VH30</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vh30-stock">M30S VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vh40">M30S VH40</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vh40-stock">M30S VH40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vh50">M30S VH50</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vh50-stock">M30S VH50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vh60">M30S VH60</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vh60-stock">M30S VH60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s-vi20">M30S VI20</a></li>
|
<li><a href="../whatsminer/M3X#m30s-vi20-stock">M30S VI20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v10">M30S+ V10</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v10-stock">M30S+ V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v20">M30S+ V20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v20-stock">M30S+ V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v30">M30S+ V30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v30-stock">M30S+ V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v40">M30S+ V40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v40-stock">M30S+ V40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v50">M30S+ V50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v50-stock">M30S+ V50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v60">M30S+ V60</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v60-stock">M30S+ V60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v70">M30S+ V70</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v70-stock">M30S+ V70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v80">M30S+ V80</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v80-stock">M30S+ V80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v90">M30S+ V90</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v90-stock">M30S+ V90 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-v100">M30S+ V100</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-v100-stock">M30S+ V100 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve30">M30S+ VE30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve30-stock">M30S+ VE30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve40">M30S+ VE40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve40-stock">M30S+ VE40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve50">M30S+ VE50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve50-stock">M30S+ VE50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve60">M30S+ VE60</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve60-stock">M30S+ VE60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve70">M30S+ VE70</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve70-stock">M30S+ VE70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve80">M30S+ VE80</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve80-stock">M30S+ VE80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve90">M30S+ VE90</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve90-stock">M30S+ VE90 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-ve100">M30S+ VE100</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-ve100-stock">M30S+ VE100 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vf20">M30S+ VF20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vf20-stock">M30S+ VF20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vf30">M30S+ VF30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vf30-stock">M30S+ VF30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vg20">M30S+ VG20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vg20-stock">M30S+ VG20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vg30">M30S+ VG30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vg30-stock">M30S+ VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vg40">M30S+ VG40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vg40-stock">M30S+ VG40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vg50">M30S+ VG50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vg50-stock">M30S+ VG50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vg60">M30S+ VG60</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vg60-stock">M30S+ VG60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vh10">M30S+ VH10</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vh10-stock">M30S+ VH10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vh20">M30S+ VH20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vh20-stock">M30S+ VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vh30">M30S+ VH30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vh30-stock">M30S+ VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vh40">M30S+ VH40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vh40-stock">M30S+ VH40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vh50">M30S+ VH50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vh50-stock">M30S+ VH50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1-vh60">M30S+ VH60</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1-vh60-stock">M30S+ VH60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-v10">M30S++ V10</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-v10-stock">M30S++ V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-v20">M30S++ V20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-v20-stock">M30S++ V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-ve30">M30S++ VE30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-ve30-stock">M30S++ VE30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-ve40">M30S++ VE40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-ve40-stock">M30S++ VE40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-ve50">M30S++ VE50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-ve50-stock">M30S++ VE50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vf40">M30S++ VF40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vf40-stock">M30S++ VF40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vg30">M30S++ VG30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vg30-stock">M30S++ VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vg40">M30S++ VG40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vg40-stock">M30S++ VG40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vg50">M30S++ VG50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vg50-stock">M30S++ VG50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh10">M30S++ VH10</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh10-stock">M30S++ VH10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh20">M30S++ VH20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh20-stock">M30S++ VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh30">M30S++ VH30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh30-stock">M30S++ VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh40">M30S++ VH40</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh40-stock">M30S++ VH40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh50">M30S++ VH50</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh50-stock">M30S++ VH50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh60">M30S++ VH60</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh60-stock">M30S++ VH60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh70">M30S++ VH70</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh70-stock">M30S++ VH70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh80">M30S++ VH80</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh80-stock">M30S++ VH80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh90">M30S++ VH90</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh90-stock">M30S++ VH90 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vh100">M30S++ VH100</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vh100-stock">M30S++ VH100 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vj20">M30S++ VJ20</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vj20-stock">M30S++ VJ20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30s_1_1-vj30">M30S++ VJ30</a></li>
|
<li><a href="../whatsminer/M3X#m30s_1_1-vj30-stock">M30S++ VJ30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31-v10">M31 V10</a></li>
|
<li><a href="../whatsminer/M3X#m31-v10-stock">M31 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31-v20">M31 V20</a></li>
|
<li><a href="../whatsminer/M3X#m31-v20-stock">M31 V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31h-v10">M31H V10</a></li>
|
<li><a href="../whatsminer/M3X#m31h-v10-stock">M31H V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31h-v40">M31H V40</a></li>
|
<li><a href="../whatsminer/M3X#m31h-v40-stock">M31H V40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m30l-v10">M30L V10</a></li>
|
<li><a href="../whatsminer/M3X#m30l-v10-stock">M30L V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v10">M31S V10</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v10-stock">M31S V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v20">M31S V20</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v20-stock">M31S V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v30">M31S V30</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v30-stock">M31S V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v40">M31S V40</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v40-stock">M31S V40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v50">M31S V50</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v50-stock">M31S V50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v60">M31S V60</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v60-stock">M31S V60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v70">M31S V70</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v70-stock">M31S V70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v80">M31S V80</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v80-stock">M31S V80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-v90">M31S V90</a></li>
|
<li><a href="../whatsminer/M3X#m31s-v90-stock">M31S V90 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-ve10">M31S VE10</a></li>
|
<li><a href="../whatsminer/M3X#m31s-ve10-stock">M31S VE10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-ve20">M31S VE20</a></li>
|
<li><a href="../whatsminer/M3X#m31s-ve20-stock">M31S VE20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s-ve30">M31S VE30</a></li>
|
<li><a href="../whatsminer/M3X#m31s-ve30-stock">M31S VE30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31se-v10">M31SE V10</a></li>
|
<li><a href="../whatsminer/M3X#m31se-v10-stock">M31SE V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31se-v20">M31SE V20</a></li>
|
<li><a href="../whatsminer/M3X#m31se-v20-stock">M31SE V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31se-v30">M31SE V30</a></li>
|
<li><a href="../whatsminer/M3X#m31se-v30-stock">M31SE V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v10">M31S+ V10</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v10-stock">M31S+ V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v20">M31S+ V20</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v20-stock">M31S+ V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v30">M31S+ V30</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v30-stock">M31S+ V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v40">M31S+ V40</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v40-stock">M31S+ V40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v50">M31S+ V50</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v50-stock">M31S+ V50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v60">M31S+ V60</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v60-stock">M31S+ V60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v80">M31S+ V80</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v80-stock">M31S+ V80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v90">M31S+ V90</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v90-stock">M31S+ V90 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-v100">M31S+ V100</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-v100-stock">M31S+ V100 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve10">M31S+ VE10</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve10-stock">M31S+ VE10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve20">M31S+ VE20</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve20-stock">M31S+ VE20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve30">M31S+ VE30</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve30-stock">M31S+ VE30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve40">M31S+ VE40</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve40-stock">M31S+ VE40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve50">M31S+ VE50</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve50-stock">M31S+ VE50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve60">M31S+ VE60</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve60-stock">M31S+ VE60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-ve80">M31S+ VE80</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-ve80-stock">M31S+ VE80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-vf20">M31S+ VF20</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-vf20-stock">M31S+ VF20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-vf30">M31S+ VF30</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-vf30-stock">M31S+ VF30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-vg20">M31S+ VG20</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-vg20-stock">M31S+ VG20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m31s_1-vg30">M31S+ VG30</a></li>
|
<li><a href="../whatsminer/M3X#m31s_1-vg30-stock">M31S+ VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m32-v10">M32 V10</a></li>
|
<li><a href="../whatsminer/M3X#m32-v10-stock">M32 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m32-v20">M32 V20</a></li>
|
<li><a href="../whatsminer/M3X#m32-v20-stock">M32 V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33-v10">M33 V10</a></li>
|
<li><a href="../whatsminer/M3X#m33-v10-stock">M33 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33-v20">M33 V20</a></li>
|
<li><a href="../whatsminer/M3X#m33-v20-stock">M33 V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33-v30">M33 V30</a></li>
|
<li><a href="../whatsminer/M3X#m33-v30-stock">M33 V30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s-vg30">M33S VG30</a></li>
|
<li><a href="../whatsminer/M3X#m33s-vg30-stock">M33S VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s_1-vg20">M33S+ VG20</a></li>
|
<li><a href="../whatsminer/M3X#m33s_1-vg20-stock">M33S+ VG20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s_1-vh20">M33S+ VH20</a></li>
|
<li><a href="../whatsminer/M3X#m33s_1-vh20-stock">M33S+ VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s_1-vh30">M33S+ VH30</a></li>
|
<li><a href="../whatsminer/M3X#m33s_1-vh30-stock">M33S+ VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s_1_1-vh20">M33S++ VH20</a></li>
|
<li><a href="../whatsminer/M3X#m33s_1_1-vh20-stock">M33S++ VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s_1_1-vh30">M33S++ VH30</a></li>
|
<li><a href="../whatsminer/M3X#m33s_1_1-vh30-stock">M33S++ VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m33s_1_1-vg40">M33S++ VG40</a></li>
|
<li><a href="../whatsminer/M3X#m33s_1_1-vg40-stock">M33S++ VG40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m34s_1-ve10">M34S+ VE10</a></li>
|
<li><a href="../whatsminer/M3X#m34s_1-ve10-stock">M34S+ VE10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m36s-ve10">M36S VE10</a></li>
|
<li><a href="../whatsminer/M3X#m36s-ve10-stock">M36S VE10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m36s_1-vg30">M36S+ VG30</a></li>
|
<li><a href="../whatsminer/M3X#m36s_1-vg30-stock">M36S+ VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m36s_1_1-vh30">M36S++ VH30</a></li>
|
<li><a href="../whatsminer/M3X#m36s_1_1-vh30-stock">M36S++ VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m39-v10">M39 V10</a></li>
|
<li><a href="../whatsminer/M3X#m39-v10-stock">M39 V10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m39-v20">M39 V20</a></li>
|
<li><a href="../whatsminer/M3X#m39-v20-stock">M39 V20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M3X#m39-v30">M39 V30</a></li>
|
<li><a href="../whatsminer/M3X#m39-v30-stock">M39 V30 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>M5X Series:</summary>
|
<summary>M5X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../whatsminer/M5X#m50-ve30">M50 VE30</a></li>
|
<li><a href="../whatsminer/M5X#m50-ve30-stock">M50 VE30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vg30">M50 VG30</a></li>
|
<li><a href="../whatsminer/M5X#m50-vg30-stock">M50 VG30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh10">M50 VH10</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh10-stock">M50 VH10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh20">M50 VH20</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh20-stock">M50 VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh30">M50 VH30</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh30-stock">M50 VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh40">M50 VH40</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh40-stock">M50 VH40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh50">M50 VH50</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh50-stock">M50 VH50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh60">M50 VH60</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh60-stock">M50 VH60 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh70">M50 VH70</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh70-stock">M50 VH70 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vh80">M50 VH80</a></li>
|
<li><a href="../whatsminer/M5X#m50-vh80-stock">M50 VH80 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vj10">M50 VJ10</a></li>
|
<li><a href="../whatsminer/M5X#m50-vj10-stock">M50 VJ10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vj20">M50 VJ20</a></li>
|
<li><a href="../whatsminer/M5X#m50-vj20-stock">M50 VJ20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50-vj30">M50 VJ30</a></li>
|
<li><a href="../whatsminer/M5X#m50-vj30-stock">M50 VJ30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vj10">M50S VJ10</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vj10-stock">M50S VJ10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vj20">M50S VJ20</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vj20-stock">M50S VJ20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vj30">M50S VJ30</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vj30-stock">M50S VJ30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vh10">M50S VH10</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vh10-stock">M50S VH10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vh20">M50S VH20</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vh20-stock">M50S VH20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vh30">M50S VH30</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vh30-stock">M50S VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vh40">M50S VH40</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vh40-stock">M50S VH40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s-vh50">M50S VH50</a></li>
|
<li><a href="../whatsminer/M5X#m50s-vh50-stock">M50S VH50 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1-vh30">M50S+ VH30</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1-vh30-stock">M50S+ VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1-vh40">M50S+ VH40</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1-vh40-stock">M50S+ VH40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1-vj30">M50S+ VJ30</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1-vj30-stock">M50S+ VJ30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1-vk20">M50S+ VK20</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1-vk20-stock">M50S+ VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1_1-vk10">M50S++ VK10</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1_1-vk10-stock">M50S++ VK10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1_1-vk20">M50S++ VK20</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1_1-vk20-stock">M50S++ VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m50s_1_1-vk30">M50S++ VK30</a></li>
|
<li><a href="../whatsminer/M5X#m50s_1_1-vk30-stock">M50S++ VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m53-vh30">M53 VH30</a></li>
|
<li><a href="../whatsminer/M5X#m53-vh30-stock">M53 VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m53s-vh30">M53S VH30</a></li>
|
<li><a href="../whatsminer/M5X#m53s-vh30-stock">M53S VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m53s-vj40">M53S VJ40</a></li>
|
<li><a href="../whatsminer/M5X#m53s-vj40-stock">M53S VJ40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m53s_1-vj30">M53S+ VJ30</a></li>
|
<li><a href="../whatsminer/M5X#m53s_1-vj30-stock">M53S+ VJ30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m53s_1_1-vk10">M53S++ VK10</a></li>
|
<li><a href="../whatsminer/M5X#m53s_1_1-vk10-stock">M53S++ VK10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m56-vh30">M56 VH30</a></li>
|
<li><a href="../whatsminer/M5X#m56-vh30-stock">M56 VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m56s-vh30">M56S VH30</a></li>
|
<li><a href="../whatsminer/M5X#m56s-vh30-stock">M56S VH30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m56s_1-vj30">M56S+ VJ30</a></li>
|
<li><a href="../whatsminer/M5X#m56s_1-vj30-stock">M56S+ VJ30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M5X#m59-vh30">M59 VH30</a></li>
|
<li><a href="../whatsminer/M5X#m59-vh30-stock">M59 VH30 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>M6X Series:</summary>
|
<summary>M6X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../whatsminer/M6X#m60-vk10">M60 VK10</a></li>
|
<li><a href="../whatsminer/M6X#m60-vk10-stock">M60 VK10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60-vk20">M60 VK20</a></li>
|
<li><a href="../whatsminer/M6X#m60-vk20-stock">M60 VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60-vk30">M60 VK30</a></li>
|
<li><a href="../whatsminer/M6X#m60-vk30-stock">M60 VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60-vk40">M60 VK40</a></li>
|
<li><a href="../whatsminer/M6X#m60-vk40-stock">M60 VK40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60s-vk10">M60S VK10</a></li>
|
<li><a href="../whatsminer/M6X#m60s-vk10-stock">M60S VK10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60s-vk20">M60S VK20</a></li>
|
<li><a href="../whatsminer/M6X#m60s-vk20-stock">M60S VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60s-vk30">M60S VK30</a></li>
|
<li><a href="../whatsminer/M6X#m60s-vk30-stock">M60S VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m60s-vk40">M60S VK40</a></li>
|
<li><a href="../whatsminer/M6X#m60s-vk40-stock">M60S VK40 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m63-vk10">M63 VK10</a></li>
|
<li><a href="../whatsminer/M6X#m63-vk10-stock">M63 VK10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m63-vk20">M63 VK20</a></li>
|
<li><a href="../whatsminer/M6X#m63-vk20-stock">M63 VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m63-vk30">M63 VK30</a></li>
|
<li><a href="../whatsminer/M6X#m63-vk30-stock">M63 VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m63s-vk10">M63S VK10</a></li>
|
<li><a href="../whatsminer/M6X#m63s-vk10-stock">M63S VK10 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m63s-vk20">M63S VK20</a></li>
|
<li><a href="../whatsminer/M6X#m63s-vk20-stock">M63S VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m63s-vk30">M63S VK30</a></li>
|
<li><a href="../whatsminer/M6X#m63s-vk30-stock">M63S VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m66-vk20">M66 VK20</a></li>
|
<li><a href="../whatsminer/M6X#m66-vk20-stock">M66 VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m66-vk30">M66 VK30</a></li>
|
<li><a href="../whatsminer/M6X#m66-vk30-stock">M66 VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m66s-vk20">M66S VK20</a></li>
|
<li><a href="../whatsminer/M6X#m66s-vk20-stock">M66S VK20 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m66s-vk30">M66S VK30</a></li>
|
<li><a href="../whatsminer/M6X#m66s-vk30-stock">M66S VK30 (Stock)</a></li>
|
||||||
<li><a href="../whatsminer/M6X#m66s-vk40">M66S VK40</a></li>
|
<li><a href="../whatsminer/M6X#m66s-vk40-stock">M66S VK40 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -338,43 +338,43 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>A7X Series:</summary>
|
<summary>A7X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/A7X#avalon-721">Avalon 721</a></li>
|
<li><a href="../avalonminer/A7X#avalon-721-stock">Avalon 721 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/A7X#avalon-741">Avalon 741</a></li>
|
<li><a href="../avalonminer/A7X#avalon-741-stock">Avalon 741 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/A7X#avalon-761">Avalon 761</a></li>
|
<li><a href="../avalonminer/A7X#avalon-761-stock">Avalon 761 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>A8X Series:</summary>
|
<summary>A8X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/A8X#avalon-821">Avalon 821</a></li>
|
<li><a href="../avalonminer/A8X#avalon-821-stock">Avalon 821 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/A8X#avalon-841">Avalon 841</a></li>
|
<li><a href="../avalonminer/A8X#avalon-841-stock">Avalon 841 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/A8X#avalon-851">Avalon 851</a></li>
|
<li><a href="../avalonminer/A8X#avalon-851-stock">Avalon 851 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>A9X Series:</summary>
|
<summary>A9X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/A9X#avalon-921">Avalon 921</a></li>
|
<li><a href="../avalonminer/A9X#avalon-921-stock">Avalon 921 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>A10X Series:</summary>
|
<summary>A10X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/A10X#avalon-1026">Avalon 1026</a></li>
|
<li><a href="../avalonminer/A10X#avalon-1026-stock">Avalon 1026 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/A10X#avalon-1047">Avalon 1047</a></li>
|
<li><a href="../avalonminer/A10X#avalon-1047-stock">Avalon 1047 (Stock)</a></li>
|
||||||
<li><a href="../avalonminer/A10X#avalon-1066">Avalon 1066</a></li>
|
<li><a href="../avalonminer/A10X#avalon-1066-stock">Avalon 1066 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>A11X Series:</summary>
|
<summary>A11X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/A11X#avalon-1166-pro">Avalon 1166 Pro</a></li>
|
<li><a href="../avalonminer/A11X#avalon-1166-pro-stock">Avalon 1166 Pro (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>A12X Series:</summary>
|
<summary>A12X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../avalonminer/A12X#avalon-1246">Avalon 1246</a></li>
|
<li><a href="../avalonminer/A12X#avalon-1246-stock">Avalon 1246 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -385,13 +385,13 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>T3X Series:</summary>
|
<summary>T3X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../innosilicon/T3X#t3h_1">T3H+</a></li>
|
<li><a href="../innosilicon/T3X#t3h_1-stock">T3H+ (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>A10X Series:</summary>
|
<summary>A10X Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../innosilicon/A10X#a10x">A10X</a></li>
|
<li><a href="../innosilicon/A10X#a10x-stock">A10X (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -402,22 +402,22 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>X5 Series:</summary>
|
<summary>X5 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../goldshell/X5#ck5">CK5</a></li>
|
<li><a href="../goldshell/X5#ck5-stock">CK5 (Stock)</a></li>
|
||||||
<li><a href="../goldshell/X5#hs5">HS5</a></li>
|
<li><a href="../goldshell/X5#hs5-stock">HS5 (Stock)</a></li>
|
||||||
<li><a href="../goldshell/X5#kd5">KD5</a></li>
|
<li><a href="../goldshell/X5#kd5-stock">KD5 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>XMax Series:</summary>
|
<summary>XMax Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../goldshell/XMax#kd-max">KD Max</a></li>
|
<li><a href="../goldshell/XMax#kd-max-stock">KD Max (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>XBox Series:</summary>
|
<summary>XBox Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../goldshell/XBox#kd-box-ii">KD Box II</a></li>
|
<li><a href="../goldshell/XBox#kd-box-ii-stock">KD Box II (Stock)</a></li>
|
||||||
<li><a href="../goldshell/XBox#kd-box-pro">KD Box Pro</a></li>
|
<li><a href="../goldshell/XBox#kd-box-pro-stock">KD Box Pro (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -446,27 +446,28 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>X19 Series:</summary>
|
<summary>X19 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X19#s19">S19</a></li>
|
<li><a href="../antminer/X19#s19-bos_1">S19 (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19_1">S19+</a></li>
|
<li><a href="../antminer/X19#s19_1-bos_1">S19+ (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-pro">S19 Pro</a></li>
|
<li><a href="../antminer/X19#s19-pro-bos_1">S19 Pro (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a">S19a</a></li>
|
<li><a href="../antminer/X19#s19a-bos_1">S19a (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19a-pro">S19a Pro</a></li>
|
<li><a href="../antminer/X19#s19a-pro-bos_1">S19a Pro (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j">S19j</a></li>
|
<li><a href="../antminer/X19#s19j-bos_1">S19j (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-no-pic">S19j No PIC</a></li>
|
<li><a href="../antminer/X19#s19j-no-pic-bos_1">S19j No PIC (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro">S19j Pro</a></li>
|
<li><a href="../antminer/X19#s19j-pro-bos_1">S19j Pro (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro-no-pic">S19j Pro No PIC</a></li>
|
<li><a href="../antminer/X19#s19j-pro-no-pic-bos_1">S19j Pro No PIC (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro_1">S19j Pro+</a></li>
|
<li><a href="../antminer/X19#s19j-pro_1-bos_1">S19j Pro+ (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro_1">S19j Pro+</a></li>
|
<li><a href="../antminer/X19#s19j-pro_1-bos_1">S19j Pro+ (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19j-pro_1-no-pic">S19j Pro+ No PIC</a></li>
|
<li><a href="../antminer/X19#s19j-pro_1-no-pic-bos_1">S19j Pro+ No PIC (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19k-pro-no-pic">S19k Pro No PIC</a></li>
|
<li><a href="../antminer/X19#s19k-pro-no-pic-bos_1">S19k Pro No PIC (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#s19-xp">S19 XP</a></li>
|
<li><a href="../antminer/X19#s19k-pro-no-pic-bos_1">S19k Pro No PIC (BOS+)</a></li>
|
||||||
<li><a href="../antminer/X19#t19">T19</a></li>
|
<li><a href="../antminer/X19#s19-xp-bos_1">S19 XP (BOS+)</a></li>
|
||||||
|
<li><a href="../antminer/X19#t19-bos_1">T19 (BOS+)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>X21 Series:</summary>
|
<summary>X21 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X21#s21">S21</a></li>
|
<li><a href="../antminer/X21#s21-bos_1">S21 (BOS+)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -507,6 +508,12 @@ details {
|
|||||||
<li><a href="../antminer/X19#t19-vnish">T19 (VNish)</a></li>
|
<li><a href="../antminer/X19#t19-vnish">T19 (VNish)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>X21 Series:</summary>
|
||||||
|
<ul>
|
||||||
|
<li><a href="../antminer/X21#s21-vnish">S21 (VNish)</a></li>
|
||||||
|
</ul>
|
||||||
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
@@ -546,7 +553,7 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>X9 Series:</summary>
|
<summary>X9 Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../antminer/X9#t9-hive">T9 (Hive)</a></li>
|
<li><a href="../antminer/X9#t9-stock">T9 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -586,23 +593,23 @@ details {
|
|||||||
<details>
|
<details>
|
||||||
<summary>AD Series:</summary>
|
<summary>AD Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../auradine/AD#at1500">AT1500</a></li>
|
<li><a href="../auradine/AD#at1500-stock">AT1500 (Stock)</a></li>
|
||||||
<li><a href="../auradine/AD#at2860">AT2860</a></li>
|
<li><a href="../auradine/AD#at2860-stock">AT2860 (Stock)</a></li>
|
||||||
<li><a href="../auradine/AD#at2880">AT2880</a></li>
|
<li><a href="../auradine/AD#at2880-stock">AT2880 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>AI Series:</summary>
|
<summary>AI Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../auradine/AI#ai2500">AI2500</a></li>
|
<li><a href="../auradine/AI#ai2500-stock">AI2500 (Stock)</a></li>
|
||||||
<li><a href="../auradine/AI#ai3680">AI3680</a></li>
|
<li><a href="../auradine/AI#ai3680-stock">AI3680 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>AT Series:</summary>
|
<summary>AT Series:</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="../auradine/AT#ad2500">AD2500</a></li>
|
<li><a href="../auradine/AT#ad2500-stock">AD2500 (Stock)</a></li>
|
||||||
<li><a href="../auradine/AT#ad3500">AD3500</a></li>
|
<li><a href="../auradine/AT#ad3500-stock">AD3500 (Stock)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -630,4 +637,17 @@ details {
|
|||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</ul>
|
</ul>
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>Stock Firmware BitAxe Miners:</summary>
|
||||||
|
<ul>
|
||||||
|
<details>
|
||||||
|
<summary>BM Series:</summary>
|
||||||
|
<ul>
|
||||||
|
<li><a href="../bitaxe/BM#supra-stock">Supra (Stock)</a></li>
|
||||||
|
<li><a href="../bitaxe/BM#ultra-stock">Ultra (Stock)</a></li>
|
||||||
|
<li><a href="../bitaxe/BM#max-stock">Max (Stock)</a></li>
|
||||||
|
</ul>
|
||||||
|
</details>
|
||||||
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
@@ -1,91 +1,91 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## M2X Models
|
## M2X Models
|
||||||
|
|
||||||
## M20 V10
|
## M20 V10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20.BTMinerM20V10
|
::: pyasic.miners.whatsminer.btminer.M2X.M20.BTMinerM20V10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M20S V10
|
## M20S V10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV10
|
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M20S V20
|
## M20S V20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV20
|
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M20S V30
|
## M20S V30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV30
|
::: pyasic.miners.whatsminer.btminer.M2X.M20S.BTMinerM20SV30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M20P V10
|
## M20P V10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20P.BTMinerM20PV10
|
::: pyasic.miners.whatsminer.btminer.M2X.M20P.BTMinerM20PV10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M20P V30
|
## M20P V30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20P.BTMinerM20PV30
|
::: pyasic.miners.whatsminer.btminer.M2X.M20P.BTMinerM20PV30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M20S+ V30
|
## M20S+ V30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M20S_Plus.BTMinerM20SPlusV30
|
::: pyasic.miners.whatsminer.btminer.M2X.M20S_Plus.BTMinerM20SPlusV30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M21 V10
|
## M21 V10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M21.BTMinerM21V10
|
::: pyasic.miners.whatsminer.btminer.M2X.M21.BTMinerM21V10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M21S V20
|
## M21S V20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV20
|
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M21S V60
|
## M21S V60 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV60
|
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV60
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M21S V70
|
## M21S V70 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV70
|
::: pyasic.miners.whatsminer.btminer.M2X.M21S.BTMinerM21SV70
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M21S+ V20
|
## M21S+ V20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M21S_Plus.BTMinerM21SPlusV20
|
::: pyasic.miners.whatsminer.btminer.M2X.M21S_Plus.BTMinerM21SPlusV20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M29 V10
|
## M29 V10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M2X.M29.BTMinerM29V10
|
::: pyasic.miners.whatsminer.btminer.M2X.M29.BTMinerM29V10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,259 +1,259 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## M5X Models
|
## M5X Models
|
||||||
|
|
||||||
## M50 VE30
|
## M50 VE30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VE30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VE30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VG30
|
## M50 VG30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VG30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VG30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH10
|
## M50 VH10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH20
|
## M50 VH20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH30
|
## M50 VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH40
|
## M50 VH40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH50
|
## M50 VH50 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH50
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH60
|
## M50 VH60 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH60
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH60
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH70
|
## M50 VH70 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH70
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH70
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VH80
|
## M50 VH80 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH80
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VH80
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VJ10
|
## M50 VJ10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VJ20
|
## M50 VJ20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50 VJ30
|
## M50 VJ30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50.BTMinerM50VJ30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VJ10
|
## M50S VJ10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VJ20
|
## M50S VJ20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VJ30
|
## M50S VJ30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVJ30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VH10
|
## M50S VH10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VH20
|
## M50S VH20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VH30
|
## M50S VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VH40
|
## M50S VH40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S VH50
|
## M50S VH50 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH50
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S.BTMinerM50SVH50
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S+ VH30
|
## M50S+ VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S+ VH40
|
## M50S+ VH40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH40
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVH40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S+ VJ30
|
## M50S+ VJ30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVJ30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S+ VK20
|
## M50S+ VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus.BTMinerM50SPlusVK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S++ VK10
|
## M50S++ VK10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S++ VK20
|
## M50S++ VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK20
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M50S++ VK30
|
## M50S++ VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK30
|
::: pyasic.miners.whatsminer.btminer.M5X.M50S_Plus_Plus.BTMinerM50SPlusPlusVK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M53 VH30
|
## M53 VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53.BTMinerM53VH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M53S VH30
|
## M53S VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M53S VJ40
|
## M53S VJ40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVJ40
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S.BTMinerM53SVJ40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M53S+ VJ30
|
## M53S+ VJ30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus.BTMinerM53SPlusVJ30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M53S++ VK10
|
## M53S++ VK10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK10
|
::: pyasic.miners.whatsminer.btminer.M5X.M53S_Plus_Plus.BTMinerM53SPlusPlusVK10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M56 VH30
|
## M56 VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56.BTMinerM56VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56.BTMinerM56VH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M56S VH30
|
## M56S VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S.BTMinerM56SVH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M56S+ VJ30
|
## M56S+ VJ30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVJ30
|
::: pyasic.miners.whatsminer.btminer.M5X.M56S_Plus.BTMinerM56SPlusVJ30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M59 VH30
|
## M59 VH30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M5X.M59.BTMinerM59VH30
|
::: pyasic.miners.whatsminer.btminer.M5X.M59.BTMinerM59VH30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,133 +1,133 @@
|
|||||||
# pyasic
|
# pyasic
|
||||||
## M6X Models
|
## M6X Models
|
||||||
|
|
||||||
## M60 VK10
|
## M60 VK10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60 VK20
|
## M60 VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60 VK30
|
## M60 VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60 VK40
|
## M60 VK40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60.BTMinerM60VK40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60S VK10
|
## M60S VK10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60S VK20
|
## M60S VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60S VK30
|
## M60S VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M60S VK40
|
## M60S VK40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M60S.BTMinerM60SVK40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M63 VK10
|
## M63 VK10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M63 VK20
|
## M63 VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M63 VK30
|
## M63 VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63.BTMinerM63VK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M63S VK10
|
## M63S VK10 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK10
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK10
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M63S VK20
|
## M63S VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M63S VK30
|
## M63S VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M63S.BTMinerM63SVK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M66 VK20
|
## M66 VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M66 VK30
|
## M66 VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66.BTMinerM66VK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M66S VK20
|
## M66S VK20 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK20
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK20
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M66S VK30
|
## M66S VK30 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK30
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK30
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
show_root_heading: false
|
show_root_heading: false
|
||||||
heading_level: 4
|
heading_level: 4
|
||||||
|
|
||||||
## M66S VK40
|
## M66S VK40 (Stock)
|
||||||
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK40
|
::: pyasic.miners.whatsminer.btminer.M6X.M66S.BTMinerM66SVK40
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
jinja2<3.1.4
|
jinja2<3.1.4
|
||||||
mkdocs
|
mkdocs
|
||||||
mkdocstrings[python]
|
mkdocstrings[python]
|
||||||
|
zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ nav:
|
|||||||
- Auradine AD: "miners/auradine/AD.md"
|
- Auradine AD: "miners/auradine/AD.md"
|
||||||
- Auradine AI: "miners/auradine/AI.md"
|
- Auradine AI: "miners/auradine/AI.md"
|
||||||
- Auradine AT: "miners/auradine/AT.md"
|
- Auradine AT: "miners/auradine/AT.md"
|
||||||
|
- Blockminer: "miners/blockminer/blockminer.md"
|
||||||
|
- BitAxe BM: "miners/bitaxe/BM.md"
|
||||||
- Base Miner: "miners/base_miner.md"
|
- Base Miner: "miners/base_miner.md"
|
||||||
- Settings:
|
- Settings:
|
||||||
- Settings: "settings/settings.md"
|
- Settings: "settings/settings.md"
|
||||||
|
|||||||
@@ -140,6 +140,14 @@ class MinerConfig:
|
|||||||
**self.pools.as_mara(user_suffix=user_suffix),
|
**self.pools.as_mara(user_suffix=user_suffix),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def as_bitaxe(self, user_suffix: str = None) -> dict:
|
||||||
|
return {
|
||||||
|
**self.fan_mode.as_bitaxe(),
|
||||||
|
**self.temperature.as_bitaxe(),
|
||||||
|
**self.mining_mode.as_bitaxe(),
|
||||||
|
**self.pools.as_bitaxe(user_suffix=user_suffix),
|
||||||
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_dict(cls, dict_conf: dict) -> "MinerConfig":
|
def from_dict(cls, dict_conf: dict) -> "MinerConfig":
|
||||||
"""Constructs a MinerConfig object from a dictionary."""
|
"""Constructs a MinerConfig object from a dictionary."""
|
||||||
@@ -235,3 +243,10 @@ class MinerConfig:
|
|||||||
fan_mode=FanModeConfig.from_mara(web_miner_config),
|
fan_mode=FanModeConfig.from_mara(web_miner_config),
|
||||||
mining_mode=MiningModeConfig.from_mara(web_miner_config),
|
mining_mode=MiningModeConfig.from_mara(web_miner_config),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_bitaxe(cls, web_system_info: dict) -> "MinerConfig":
|
||||||
|
return cls(
|
||||||
|
pools=PoolConfig.from_bitaxe(web_system_info),
|
||||||
|
fan_mode=FanModeConfig.from_bitaxe(web_system_info),
|
||||||
|
)
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ class MinerConfigOption(Enum):
|
|||||||
def as_mara(self) -> dict:
|
def as_mara(self) -> dict:
|
||||||
return self.value.as_mara()
|
return self.value.as_mara()
|
||||||
|
|
||||||
|
def as_bitaxe(self) -> dict:
|
||||||
|
return self.value.as_bitaxe()
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
return self.value(*args, **kwargs)
|
return self.value(*args, **kwargs)
|
||||||
|
|
||||||
@@ -119,6 +122,9 @@ class MinerConfigValue:
|
|||||||
def as_mara(self) -> dict:
|
def as_mara(self) -> dict:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
def as_bitaxe(self) -> dict:
|
||||||
|
return {}
|
||||||
|
|
||||||
def __getitem__(self, item):
|
def __getitem__(self, item):
|
||||||
try:
|
try:
|
||||||
return getattr(self, item)
|
return getattr(self, item)
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ class FanModeNormal(MinerConfigValue):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def as_bitaxe(self) -> dict:
|
||||||
|
return {"autoFanspeed": 1}
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class FanModeManual(MinerConfigValue):
|
class FanModeManual(MinerConfigValue):
|
||||||
@@ -138,6 +141,9 @@ class FanModeManual(MinerConfigValue):
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def as_bitaxe(self) -> dict:
|
||||||
|
return {"autoFanspeed": 0, "fanspeed": self.speed}
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class FanModeImmersion(MinerConfigValue):
|
class FanModeImmersion(MinerConfigValue):
|
||||||
@@ -291,3 +297,10 @@ class FanModeConfig(MinerConfigOption):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return cls.default()
|
return cls.default()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_bitaxe(cls, web_system_info: dict):
|
||||||
|
if web_system_info["autofanspeed"] == 1:
|
||||||
|
return cls.normal()
|
||||||
|
else:
|
||||||
|
return cls.manual(speed=web_system_info["fanspeed"])
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
from pyasic.config.base import MinerConfigOption, MinerConfigValue
|
from pyasic.config.base import MinerConfigOption, MinerConfigValue
|
||||||
|
|||||||
@@ -127,6 +127,13 @@ class Pool(MinerConfigValue):
|
|||||||
}
|
}
|
||||||
return {"url": self.url, "user": self.user, "pass": self.password}
|
return {"url": self.url, "user": self.user, "pass": self.password}
|
||||||
|
|
||||||
|
def as_bitaxe(self, user_suffix: str = None) -> dict:
|
||||||
|
return {
|
||||||
|
"stratumURL": self.url,
|
||||||
|
"stratumUser": f"{self.user}{user_suffix}",
|
||||||
|
"stratumPassword": self.password,
|
||||||
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_dict(cls, dict_conf: dict | None) -> "Pool":
|
def from_dict(cls, dict_conf: dict | None) -> "Pool":
|
||||||
return cls(
|
return cls(
|
||||||
@@ -194,6 +201,15 @@ class Pool(MinerConfigValue):
|
|||||||
password=web_pool["pass"],
|
password=web_pool["pass"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_bitaxe(cls, web_system_info: dict) -> "Pool":
|
||||||
|
url = f"stratum+tcp://{web_system_info['stratumURL']}:{web_system_info['stratumPort']}"
|
||||||
|
return cls(
|
||||||
|
url=url,
|
||||||
|
user=web_system_info["stratumUser"],
|
||||||
|
password=web_system_info.get("stratumPassword", ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class PoolGroup(MinerConfigValue):
|
class PoolGroup(MinerConfigValue):
|
||||||
@@ -287,6 +303,9 @@ class PoolGroup(MinerConfigValue):
|
|||||||
def as_mara(self, user_suffix: str = None) -> list:
|
def as_mara(self, user_suffix: str = None) -> list:
|
||||||
return [p.as_mara(user_suffix=user_suffix) for p in self.pools]
|
return [p.as_mara(user_suffix=user_suffix) for p in self.pools]
|
||||||
|
|
||||||
|
def as_bitaxe(self, user_suffix: str = None) -> dict:
|
||||||
|
return self.pools[0].as_bitaxe(user_suffix=user_suffix)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_dict(cls, dict_conf: dict | None) -> "PoolGroup":
|
def from_dict(cls, dict_conf: dict | None) -> "PoolGroup":
|
||||||
cls_conf = {}
|
cls_conf = {}
|
||||||
@@ -360,6 +379,10 @@ class PoolGroup(MinerConfigValue):
|
|||||||
def from_mara(cls, web_config_pools: dict) -> "PoolGroup":
|
def from_mara(cls, web_config_pools: dict) -> "PoolGroup":
|
||||||
return cls(pools=[Pool.from_mara(pool_conf) for pool_conf in web_config_pools])
|
return cls(pools=[Pool.from_mara(pool_conf) for pool_conf in web_config_pools])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_bitaxe(cls, web_system_info: dict) -> "PoolGroup":
|
||||||
|
return cls(pools=[Pool.from_bitaxe(web_system_info)])
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class PoolConfig(MinerConfigValue):
|
class PoolConfig(MinerConfigValue):
|
||||||
@@ -456,6 +479,9 @@ class PoolConfig(MinerConfigValue):
|
|||||||
return {"pools": self.groups[0].as_mara(user_suffix=user_suffix)}
|
return {"pools": self.groups[0].as_mara(user_suffix=user_suffix)}
|
||||||
return {"pools": []}
|
return {"pools": []}
|
||||||
|
|
||||||
|
def as_bitaxe(self, user_suffix: str = None) -> dict:
|
||||||
|
return self.groups[0].as_bitaxe(user_suffix=user_suffix)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_api(cls, api_pools: dict) -> "PoolConfig":
|
def from_api(cls, api_pools: dict) -> "PoolConfig":
|
||||||
try:
|
try:
|
||||||
@@ -514,3 +540,7 @@ class PoolConfig(MinerConfigValue):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def from_mara(cls, web_config: dict) -> "PoolConfig":
|
def from_mara(cls, web_config: dict) -> "PoolConfig":
|
||||||
return cls(groups=[PoolGroup.from_mara(web_config["pools"])])
|
return cls(groups=[PoolGroup.from_mara(web_config["pools"])])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_bitaxe(cls, web_system_info: dict) -> "PoolConfig":
|
||||||
|
return cls(groups=[PoolGroup.from_bitaxe(web_system_info)])
|
||||||
|
|||||||
@@ -1,4 +1,35 @@
|
|||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
|
from enum import Enum
|
||||||
|
from typing import Optional
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
|
||||||
|
class Scheme(Enum):
|
||||||
|
STRATUM_V1 = "stratum+tcp"
|
||||||
|
STRATUM_V2 = "stratum2+tcp"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PoolUrl:
|
||||||
|
scheme: Scheme
|
||||||
|
host: str
|
||||||
|
port: int
|
||||||
|
pubkey: Optional[str] = None
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
if self.scheme == Scheme.STRATUM_V2 and self.pubkey:
|
||||||
|
return f"{self.scheme.value}://{self.host}:{self.port}/{self.pubkey}"
|
||||||
|
else:
|
||||||
|
return f"{self.scheme.value}://{self.host}:{self.port}"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_str(cls, url: str) -> "PoolUrl":
|
||||||
|
parsed_url = urlparse(url)
|
||||||
|
scheme = Scheme(parsed_url.scheme)
|
||||||
|
host = parsed_url.hostname
|
||||||
|
port = parsed_url.port
|
||||||
|
pubkey = parsed_url.path.lstrip("/") if scheme == Scheme.STRATUM_V2 else None
|
||||||
|
return cls(scheme=scheme, host=host, port=port, pubkey=pubkey)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -19,13 +50,13 @@ class PoolMetrics:
|
|||||||
pool_stale_percent: Percentage of stale shares by the pool.
|
pool_stale_percent: Percentage of stale shares by the pool.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
url: PoolUrl
|
||||||
accepted: int = None
|
accepted: int = None
|
||||||
rejected: int = None
|
rejected: int = None
|
||||||
get_failures: int = None
|
get_failures: int = None
|
||||||
remote_failures: int = None
|
remote_failures: int = None
|
||||||
active: bool = None
|
active: bool = None
|
||||||
alive: bool = None
|
alive: bool = None
|
||||||
url: str = None
|
|
||||||
index: int = None
|
index: int = None
|
||||||
user: str = None
|
user: str = None
|
||||||
pool_rejected_percent: float = field(init=False)
|
pool_rejected_percent: float = field(init=False)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class MinerMake(str, Enum):
|
|||||||
GOLDSHELL = "Goldshell"
|
GOLDSHELL = "Goldshell"
|
||||||
AURADINE = "Auradine"
|
AURADINE = "Auradine"
|
||||||
EPIC = "ePIC"
|
EPIC = "ePIC"
|
||||||
|
BITAXE = "BitAxe"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.value
|
return self.value
|
||||||
|
|||||||
@@ -329,6 +329,15 @@ class AuradineModels(str, Enum):
|
|||||||
return self.value
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxeModels(str, Enum):
|
||||||
|
BM1366 = "Ultra"
|
||||||
|
BM1368 = "Supra"
|
||||||
|
BM1397 = "Max"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
class MinerModel:
|
class MinerModel:
|
||||||
ANTMINER = AntminerModels
|
ANTMINER = AntminerModels
|
||||||
WHATSMINER = WhatsminerModels
|
WHATSMINER = WhatsminerModels
|
||||||
@@ -337,3 +346,4 @@ class MinerModel:
|
|||||||
GOLDSHELL = GoldshellModels
|
GOLDSHELL = GoldshellModels
|
||||||
AURADINE = AuradineModels
|
AURADINE = AuradineModels
|
||||||
EPIC = ePICModels
|
EPIC = ePICModels
|
||||||
|
BITAXE = BitAxeModels
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from pyasic.miners.device.models import (
|
|||||||
S19jPro,
|
S19jPro,
|
||||||
S19NoPIC,
|
S19NoPIC,
|
||||||
S19Pro,
|
S19Pro,
|
||||||
|
S19ProHydro,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -57,3 +58,7 @@ class VNishS19j(VNish, S19j):
|
|||||||
|
|
||||||
class VNishS19jPro(VNish, S19jPro):
|
class VNishS19jPro(VNish, S19jPro):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class VNishS19ProHydro(VNish, S19ProHydro):
|
||||||
|
pass
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ from .S19 import (
|
|||||||
VNishS19jPro,
|
VNishS19jPro,
|
||||||
VNishS19NoPIC,
|
VNishS19NoPIC,
|
||||||
VNishS19Pro,
|
VNishS19Pro,
|
||||||
|
VNishS19ProHydro,
|
||||||
VNishS19XP,
|
VNishS19XP,
|
||||||
)
|
)
|
||||||
from .T19 import VNishT19
|
from .T19 import VNishT19
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ from typing import List, Optional, Union
|
|||||||
from pyasic.config import MinerConfig, MiningModeConfig
|
from pyasic.config import MinerConfig, MiningModeConfig
|
||||||
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
||||||
from pyasic.data.error_codes import MinerErrorData, X19Error
|
from pyasic.data.error_codes import MinerErrorData, X19Error
|
||||||
|
from pyasic.data.pools import PoolMetrics, PoolUrl
|
||||||
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.backends.bmminer import BMMiner
|
from pyasic.miners.backends.bmminer import BMMiner
|
||||||
from pyasic.miners.backends.cgminer import CGMiner
|
from pyasic.miners.backends.cgminer import CGMiner
|
||||||
from pyasic.miners.data import (
|
from pyasic.miners.data import (
|
||||||
@@ -31,8 +33,6 @@ from pyasic.miners.data import (
|
|||||||
from pyasic.rpc.antminer import AntminerRPCAPI
|
from pyasic.rpc.antminer import AntminerRPCAPI
|
||||||
from pyasic.ssh.antminer import AntminerModernSSH
|
from pyasic.ssh.antminer import AntminerModernSSH
|
||||||
from pyasic.web.antminer import AntminerModernWebAPI, AntminerOldWebAPI
|
from pyasic.web.antminer import AntminerModernWebAPI, AntminerOldWebAPI
|
||||||
from pyasic.data.pools import PoolMetrics
|
|
||||||
from pyasic.errors import APIError
|
|
||||||
|
|
||||||
ANTMINER_MODERN_DATA_LOC = DataLocations(
|
ANTMINER_MODERN_DATA_LOC = DataLocations(
|
||||||
**{
|
**{
|
||||||
@@ -95,7 +95,7 @@ class AntminerModern(BMMiner):
|
|||||||
web: AntminerModernWebAPI
|
web: AntminerModernWebAPI
|
||||||
|
|
||||||
_rpc_cls = AntminerRPCAPI
|
_rpc_cls = AntminerRPCAPI
|
||||||
web: AntminerRPCAPI
|
rpc: AntminerRPCAPI
|
||||||
|
|
||||||
_ssh_cls = AntminerModernSSH
|
_ssh_cls = AntminerModernSSH
|
||||||
ssh: AntminerModernSSH
|
ssh: AntminerModernSSH
|
||||||
@@ -156,7 +156,7 @@ class AntminerModern(BMMiner):
|
|||||||
await self.send_config(cfg)
|
await self.send_config(cfg)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def _get_hostname(self, web_get_system_info: dict = None) -> Union[str, None]:
|
async def _get_hostname(self, web_get_system_info: dict = None) -> Optional[str]:
|
||||||
if web_get_system_info is None:
|
if web_get_system_info is None:
|
||||||
try:
|
try:
|
||||||
web_get_system_info = await self.web.get_system_info()
|
web_get_system_info = await self.web.get_system_info()
|
||||||
@@ -169,7 +169,7 @@ class AntminerModern(BMMiner):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_mac(self, web_get_system_info: dict = None) -> Union[str, None]:
|
async def _get_mac(self, web_get_system_info: dict = None) -> Optional[str]:
|
||||||
if web_get_system_info is None:
|
if web_get_system_info is None:
|
||||||
try:
|
try:
|
||||||
web_get_system_info = await self.web.get_system_info()
|
web_get_system_info = await self.web.get_system_info()
|
||||||
@@ -264,7 +264,9 @@ class AntminerModern(BMMiner):
|
|||||||
pass
|
pass
|
||||||
return self.light
|
return self.light
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_stats: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
@@ -368,6 +370,8 @@ class AntminerModern(BMMiner):
|
|||||||
try:
|
try:
|
||||||
pools = rpc_pools.get("POOLS", [])
|
pools = rpc_pools.get("POOLS", [])
|
||||||
for pool_info in pools:
|
for pool_info in pools:
|
||||||
|
url = pool_info.get("URL")
|
||||||
|
pool_url = PoolUrl.from_str(url) if url else None
|
||||||
pool_data = PoolMetrics(
|
pool_data = PoolMetrics(
|
||||||
accepted=pool_info.get("Accepted"),
|
accepted=pool_info.get("Accepted"),
|
||||||
rejected=pool_info.get("Rejected"),
|
rejected=pool_info.get("Rejected"),
|
||||||
@@ -375,10 +379,9 @@ class AntminerModern(BMMiner):
|
|||||||
remote_failures=pool_info.get("Remote Failures"),
|
remote_failures=pool_info.get("Remote Failures"),
|
||||||
active=pool_info.get("Stratum Active"),
|
active=pool_info.get("Stratum Active"),
|
||||||
alive=pool_info.get("Status") == "Alive",
|
alive=pool_info.get("Status") == "Alive",
|
||||||
url=pool_info.get("URL"),
|
url=pool_url,
|
||||||
user=pool_info.get("User"),
|
user=pool_info.get("User"),
|
||||||
index=pool_info.get("POOL")
|
index=pool_info.get("POOL"),
|
||||||
|
|
||||||
)
|
)
|
||||||
pools_data.append(pool_data)
|
pools_data.append(pool_data)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
@@ -446,7 +449,7 @@ class AntminerOld(CGMiner):
|
|||||||
self.config = config
|
self.config = config
|
||||||
await self.web.set_miner_conf(config.as_am_old(user_suffix=user_suffix))
|
await self.web.set_miner_conf(config.as_am_old(user_suffix=user_suffix))
|
||||||
|
|
||||||
async def _get_mac(self) -> Union[str, None]:
|
async def _get_mac(self) -> Optional[str]:
|
||||||
try:
|
try:
|
||||||
data = await self.web.get_system_info()
|
data = await self.web.get_system_info()
|
||||||
if data:
|
if data:
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ class Auradine(StockFirmware):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ class AvalonMiner(CGMiner):
|
|||||||
except (KeyError, ValueError):
|
except (KeyError, ValueError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_devs: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_devs: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_devs is None:
|
if rpc_devs is None:
|
||||||
try:
|
try:
|
||||||
rpc_devs = await self.rpc.devs()
|
rpc_devs = await self.rpc.devs()
|
||||||
@@ -238,7 +238,9 @@ class AvalonMiner(CGMiner):
|
|||||||
|
|
||||||
return hashboards
|
return hashboards
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_stats: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ class BFGMiner(StockFirmware):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
# get hr from API
|
# get hr from API
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
@@ -207,7 +207,9 @@ class BFGMiner(StockFirmware):
|
|||||||
|
|
||||||
return fans
|
return fans
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_stats: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
# X19 method, not sure compatibility
|
# X19 method, not sure compatibility
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
189
pyasic/miners/backends/bitaxe.py
Normal file
189
pyasic/miners/backends/bitaxe.py
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
from pyasic import APIError, MinerConfig
|
||||||
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
||||||
|
from pyasic.device import MinerFirmware
|
||||||
|
from pyasic.miners.base import BaseMiner
|
||||||
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
||||||
|
from pyasic.web.bitaxe import BitAxeWebAPI
|
||||||
|
|
||||||
|
BITAXE_DATA_LOC = DataLocations(
|
||||||
|
**{
|
||||||
|
str(DataOptions.HASHRATE): DataFunction(
|
||||||
|
"_get_hashrate",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.WATTAGE): DataFunction(
|
||||||
|
"_get_wattage",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.UPTIME): DataFunction(
|
||||||
|
"_get_uptime",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.HASHBOARDS): DataFunction(
|
||||||
|
"_get_hashboards",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.HOSTNAME): DataFunction(
|
||||||
|
"_get_hostname",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.FANS): DataFunction(
|
||||||
|
"_get_fans",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.FW_VERSION): DataFunction(
|
||||||
|
"_get_fw_ver",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
str(DataOptions.API_VERSION): DataFunction(
|
||||||
|
"_get_api_ver",
|
||||||
|
[WebAPICommand("web_system_info", "system/info")],
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxe(BaseMiner):
|
||||||
|
"""Handler for BitAxe"""
|
||||||
|
|
||||||
|
web: BitAxeWebAPI
|
||||||
|
_web_cls = BitAxeWebAPI
|
||||||
|
|
||||||
|
firmware = MinerFirmware.STOCK
|
||||||
|
|
||||||
|
data_locations = BITAXE_DATA_LOC
|
||||||
|
|
||||||
|
async def reboot(self) -> bool:
|
||||||
|
await self.web.restart()
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def get_config(self) -> MinerConfig:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
return MinerConfig.from_bitaxe(web_system_info)
|
||||||
|
|
||||||
|
async def send_config(self, config: MinerConfig, user_suffix: str = None) -> None:
|
||||||
|
await self.web.update_settings(**config.as_bitaxe())
|
||||||
|
|
||||||
|
async def _get_wattage(self, web_system_info: dict = None) -> Optional[int]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return round(web_system_info["power"])
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_hashrate(
|
||||||
|
self, web_system_info: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return AlgoHashRate.SHA256(
|
||||||
|
web_system_info["hashRate"], HashUnit.SHA256.GH
|
||||||
|
).into(self.algo.unit.default)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_uptime(self, web_system_info: dict = None) -> Optional[int]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["uptimeSeconds"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_hashboards(self, web_system_info: dict = None) -> List[HashBoard]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return [
|
||||||
|
HashBoard(
|
||||||
|
hashrate=AlgoHashRate.SHA256(
|
||||||
|
web_system_info["hashRate"], HashUnit.SHA256.GH
|
||||||
|
).into(self.algo.unit.default),
|
||||||
|
chip_temp=web_system_info.get("temp"),
|
||||||
|
temp=web_system_info.get("vrTemp"),
|
||||||
|
chips=web_system_info.get("asicCount", 1),
|
||||||
|
expected_chips=self.expected_chips,
|
||||||
|
missing=False,
|
||||||
|
active=True,
|
||||||
|
voltage=web_system_info.get("voltage"),
|
||||||
|
)
|
||||||
|
]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return []
|
||||||
|
|
||||||
|
async def _get_fans(self, web_system_info: dict = None) -> List[Fan]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return [Fan(speed=web_system_info["fanrpm"])]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return []
|
||||||
|
|
||||||
|
async def _get_hostname(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["hostname"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_api_ver(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["version"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def _get_fw_ver(self, web_system_info: dict = None) -> Optional[str]:
|
||||||
|
if web_system_info is None:
|
||||||
|
try:
|
||||||
|
web_system_info = await self.web.system_info()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if web_system_info is not None:
|
||||||
|
try:
|
||||||
|
return web_system_info["version"]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
@@ -109,7 +109,7 @@ class BMMiner(StockFirmware):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
# get hr from API
|
# get hr from API
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
@@ -223,7 +223,9 @@ class BMMiner(StockFirmware):
|
|||||||
|
|
||||||
return fans
|
return fans
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_stats: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
# X19 method, not sure compatibility
|
# X19 method, not sure compatibility
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ from pyasic.config import MinerConfig
|
|||||||
from pyasic.config.mining import MiningModePowerTune
|
from pyasic.config.mining import MiningModePowerTune
|
||||||
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
||||||
from pyasic.data.error_codes import BraiinsOSError, MinerErrorData
|
from pyasic.data.error_codes import BraiinsOSError, MinerErrorData
|
||||||
|
from pyasic.data.pools import PoolMetrics, PoolUrl
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.data import (
|
from pyasic.miners.data import (
|
||||||
DataFunction,
|
DataFunction,
|
||||||
@@ -39,7 +40,6 @@ from pyasic.rpc.bosminer import BOSMinerRPCAPI
|
|||||||
from pyasic.ssh.braiins_os import BOSMinerSSH
|
from pyasic.ssh.braiins_os import BOSMinerSSH
|
||||||
from pyasic.web.braiins_os import BOSerWebAPI, BOSMinerWebAPI
|
from pyasic.web.braiins_os import BOSerWebAPI, BOSMinerWebAPI
|
||||||
from pyasic.web.braiins_os.proto.braiins.bos.v1 import SaveAction
|
from pyasic.web.braiins_os.proto.braiins.bos.v1 import SaveAction
|
||||||
from pyasic.data.pools import PoolMetrics
|
|
||||||
|
|
||||||
BOSMINER_DATA_LOC = DataLocations(
|
BOSMINER_DATA_LOC = DataLocations(
|
||||||
**{
|
**{
|
||||||
@@ -349,7 +349,7 @@ class BOSMiner(BraiinsOSFirmware):
|
|||||||
return None
|
return None
|
||||||
return hostname
|
return hostname
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -525,7 +525,9 @@ class BOSMiner(BraiinsOSFirmware):
|
|||||||
except (TypeError, AttributeError):
|
except (TypeError, AttributeError):
|
||||||
return self.light
|
return self.light
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_devs: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_devs: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_devs is None:
|
if rpc_devs is None:
|
||||||
try:
|
try:
|
||||||
rpc_devs = await self.rpc.devs()
|
rpc_devs = await self.rpc.devs()
|
||||||
@@ -590,6 +592,8 @@ class BOSMiner(BraiinsOSFirmware):
|
|||||||
try:
|
try:
|
||||||
pools = rpc_pools.get("POOLS", [])
|
pools = rpc_pools.get("POOLS", [])
|
||||||
for pool_info in pools:
|
for pool_info in pools:
|
||||||
|
url = pool_info.get("URL")
|
||||||
|
pool_url = PoolUrl.from_str(url) if url else None
|
||||||
pool_data = PoolMetrics(
|
pool_data = PoolMetrics(
|
||||||
accepted=pool_info.get("Accepted"),
|
accepted=pool_info.get("Accepted"),
|
||||||
rejected=pool_info.get("Rejected"),
|
rejected=pool_info.get("Rejected"),
|
||||||
@@ -597,17 +601,15 @@ class BOSMiner(BraiinsOSFirmware):
|
|||||||
remote_failures=pool_info.get("Remote Failures"),
|
remote_failures=pool_info.get("Remote Failures"),
|
||||||
active=pool_info.get("Stratum Active"),
|
active=pool_info.get("Stratum Active"),
|
||||||
alive=pool_info.get("Status") == "Alive",
|
alive=pool_info.get("Status") == "Alive",
|
||||||
url=pool_info.get("URL"),
|
url=pool_url,
|
||||||
user=pool_info.get("User"),
|
user=pool_info.get("User"),
|
||||||
index=pool_info.get("POOL"),
|
index=pool_info.get("POOL"),
|
||||||
|
|
||||||
)
|
)
|
||||||
pools_data.append(pool_data)
|
pools_data.append(pool_data)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
return pools_data
|
return pools_data
|
||||||
|
|
||||||
|
|
||||||
async def upgrade_firmware(self, file: Path):
|
async def upgrade_firmware(self, file: Path):
|
||||||
"""
|
"""
|
||||||
Upgrade the firmware of the BOSMiner device.
|
Upgrade the firmware of the BOSMiner device.
|
||||||
@@ -866,7 +868,7 @@ class BOSer(BraiinsOSFirmware):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -883,7 +885,7 @@ class BOSer(BraiinsOSFirmware):
|
|||||||
|
|
||||||
async def _get_expected_hashrate(
|
async def _get_expected_hashrate(
|
||||||
self, grpc_miner_details: dict = None
|
self, grpc_miner_details: dict = None
|
||||||
) -> Optional[float]:
|
) -> Optional[AlgoHashRate]:
|
||||||
if grpc_miner_details is None:
|
if grpc_miner_details is None:
|
||||||
try:
|
try:
|
||||||
grpc_miner_details = await self.web.get_miner_details()
|
grpc_miner_details = await self.web.get_miner_details()
|
||||||
|
|||||||
@@ -15,9 +15,10 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from typing import List, Optional
|
|
||||||
import aiofiles
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
import aiofiles
|
||||||
|
|
||||||
from pyasic.config import MinerConfig, MiningModeConfig
|
from pyasic.config import MinerConfig, MiningModeConfig
|
||||||
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
||||||
@@ -388,7 +389,7 @@ class BTMiner(StockFirmware):
|
|||||||
|
|
||||||
return hostname
|
return hostname
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -564,7 +565,9 @@ class BTMiner(StockFirmware):
|
|||||||
pass
|
pass
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_summary: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -675,17 +678,24 @@ class BTMiner(StockFirmware):
|
|||||||
|
|
||||||
result = await self.rpc.update_firmware(upgrade_contents)
|
result = await self.rpc.update_firmware(upgrade_contents)
|
||||||
|
|
||||||
logging.info("Firmware upgrade process completed successfully for Whatsminer.")
|
logging.info(
|
||||||
|
"Firmware upgrade process completed successfully for Whatsminer."
|
||||||
|
)
|
||||||
return result
|
return result
|
||||||
except FileNotFoundError as e:
|
except FileNotFoundError as e:
|
||||||
logging.error(f"File not found during the firmware upgrade process: {e}")
|
logging.error(f"File not found during the firmware upgrade process: {e}")
|
||||||
raise
|
raise
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
logging.error(f"Validation error occurred during the firmware upgrade process: {e}")
|
logging.error(
|
||||||
|
f"Validation error occurred during the firmware upgrade process: {e}"
|
||||||
|
)
|
||||||
raise
|
raise
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
logging.error(f"OS error occurred during the firmware upgrade process: {e}")
|
logging.error(f"OS error occurred during the firmware upgrade process: {e}")
|
||||||
raise
|
raise
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"An unexpected error occurred during the firmware upgrade process: {e}", exc_info=True)
|
logging.error(
|
||||||
|
f"An unexpected error occurred during the firmware upgrade process: {e}",
|
||||||
|
exc_info=True,
|
||||||
|
)
|
||||||
raise
|
raise
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ class CGMiner(StockFirmware):
|
|||||||
|
|
||||||
return self.fw_ver
|
return self.fw_ver
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
|
|||||||
@@ -14,14 +14,15 @@
|
|||||||
# limitations under the License. -
|
# limitations under the License. -
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
||||||
from pyasic.data.error_codes import MinerErrorData, X19Error
|
from pyasic.data.error_codes import MinerErrorData, X19Error
|
||||||
|
from pyasic.data.pools import PoolMetrics
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.logger import logger
|
from pyasic.logger import logger
|
||||||
from pyasic.data.pools import PoolMetrics
|
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand
|
||||||
from pyasic.miners.device.firmware import ePICFirmware
|
from pyasic.miners.device.firmware import ePICFirmware
|
||||||
from pyasic.web.epic import ePICWebAPI
|
from pyasic.web.epic import ePICWebAPI
|
||||||
@@ -220,7 +221,7 @@ class ePIC(ePICFirmware):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self, web_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, web_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
web_summary = await self.web.summary()
|
web_summary = await self.web.summary()
|
||||||
@@ -239,7 +240,9 @@ class ePIC(ePICFirmware):
|
|||||||
except (LookupError, ValueError, TypeError):
|
except (LookupError, ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, web_summary: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, web_summary: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if web_summary is None:
|
if web_summary is None:
|
||||||
try:
|
try:
|
||||||
web_summary = await self.web.summary()
|
web_summary = await self.web.summary()
|
||||||
@@ -449,4 +452,18 @@ class ePIC(ePICFirmware):
|
|||||||
)
|
)
|
||||||
return pool_data
|
return pool_data
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
async def upgrade_firmware(self, file: Path | str, keep_settings: bool = True) -> bool:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Upgrade the firmware of the ePIC miner device.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file (Path | str): The local file path of the firmware to be uploaded.
|
||||||
|
keep_settings (bool): Whether to keep the current settings after the update.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: Whether the firmware update succeeded.
|
||||||
|
"""
|
||||||
|
return await self.web.system_update(file=file, keep_settings=keep_settings)
|
||||||
@@ -169,7 +169,7 @@ class Innosilicon(CGMiner):
|
|||||||
|
|
||||||
async def _get_hashrate(
|
async def _get_hashrate(
|
||||||
self, rpc_summary: dict = None, web_get_all: dict = None
|
self, rpc_summary: dict = None, web_get_all: dict = None
|
||||||
) -> Optional[float]:
|
) -> Optional[AlgoHashRate]:
|
||||||
if web_get_all:
|
if web_get_all:
|
||||||
web_get_all = web_get_all["all"]
|
web_get_all = web_get_all["all"]
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ from typing import List, Optional
|
|||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, HashUnit
|
||||||
|
from pyasic.data.pools import PoolMetrics, PoolUrl
|
||||||
from pyasic.errors import APIError
|
from pyasic.errors import APIError
|
||||||
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand
|
||||||
from pyasic.miners.device.firmware import LuxOSFirmware
|
from pyasic.miners.device.firmware import LuxOSFirmware
|
||||||
@@ -51,6 +52,9 @@ LUXMINER_DATA_LOC = DataLocations(
|
|||||||
str(DataOptions.UPTIME): DataFunction(
|
str(DataOptions.UPTIME): DataFunction(
|
||||||
"_get_uptime", [RPCAPICommand("rpc_stats", "stats")]
|
"_get_uptime", [RPCAPICommand("rpc_stats", "stats")]
|
||||||
),
|
),
|
||||||
|
str(DataOptions.POOLS): DataFunction(
|
||||||
|
"_get_pools", [RPCAPICommand("rpc_pools", "pools")]
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -162,7 +166,7 @@ class LUXMiner(LuxOSFirmware):
|
|||||||
|
|
||||||
return mac
|
return mac
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
rpc_summary = await self.rpc.summary()
|
rpc_summary = await self.rpc.summary()
|
||||||
@@ -263,7 +267,9 @@ class LUXMiner(LuxOSFirmware):
|
|||||||
fans.append(Fan())
|
fans.append(Fan())
|
||||||
return fans
|
return fans
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, rpc_stats: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, rpc_stats: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if rpc_stats is None:
|
if rpc_stats is None:
|
||||||
try:
|
try:
|
||||||
rpc_stats = await self.rpc.stats()
|
rpc_stats = await self.rpc.stats()
|
||||||
@@ -295,3 +301,33 @@ class LUXMiner(LuxOSFirmware):
|
|||||||
return int(rpc_stats["STATS"][1]["Elapsed"])
|
return int(rpc_stats["STATS"][1]["Elapsed"])
|
||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
async def _get_pools(self, rpc_pools: dict = None) -> List[PoolMetrics]:
|
||||||
|
if rpc_pools is None:
|
||||||
|
try:
|
||||||
|
rpc_pools = await self.rpc.pools()
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
pools_data = []
|
||||||
|
if rpc_pools is not None:
|
||||||
|
try:
|
||||||
|
pools = rpc_pools.get("POOLS", [])
|
||||||
|
for pool_info in pools:
|
||||||
|
url = pool_info.get("URL")
|
||||||
|
pool_url = PoolUrl.from_str(url) if url else None
|
||||||
|
pool_data = PoolMetrics(
|
||||||
|
accepted=pool_info.get("Accepted"),
|
||||||
|
rejected=pool_info.get("Rejected"),
|
||||||
|
get_failures=pool_info.get("Get Failures"),
|
||||||
|
remote_failures=pool_info.get("Remote Failures"),
|
||||||
|
active=pool_info.get("Stratum Active"),
|
||||||
|
alive=pool_info.get("Status") == "Alive",
|
||||||
|
url=pool_url,
|
||||||
|
user=pool_info.get("User"),
|
||||||
|
index=pool_info.get("POOL"),
|
||||||
|
)
|
||||||
|
pools_data.append(pool_data)
|
||||||
|
except LookupError:
|
||||||
|
pass
|
||||||
|
return pools_data
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ class MaraMiner(MaraFirmware):
|
|||||||
except LookupError:
|
except LookupError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self, web_brief: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, web_brief: dict = None) -> Optional[AlgoHashRate]:
|
||||||
if web_brief is None:
|
if web_brief is None:
|
||||||
try:
|
try:
|
||||||
web_brief = await self.web.brief()
|
web_brief = await self.web.brief()
|
||||||
@@ -271,7 +271,9 @@ class MaraMiner(MaraFirmware):
|
|||||||
pass
|
pass
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def _get_expected_hashrate(self, web_brief: dict = None) -> Optional[float]:
|
async def _get_expected_hashrate(
|
||||||
|
self, web_brief: dict = None
|
||||||
|
) -> Optional[AlgoHashRate]:
|
||||||
if web_brief is None:
|
if web_brief is None:
|
||||||
try:
|
try:
|
||||||
web_brief = await self.web.brief()
|
web_brief = await self.web.brief()
|
||||||
@@ -288,7 +290,7 @@ class MaraMiner(MaraFirmware):
|
|||||||
|
|
||||||
async def _get_wattage_limit(
|
async def _get_wattage_limit(
|
||||||
self, web_miner_config: dict = None
|
self, web_miner_config: dict = None
|
||||||
) -> Optional[float]:
|
) -> Optional[AlgoHashRate]:
|
||||||
if web_miner_config is None:
|
if web_miner_config is None:
|
||||||
try:
|
try:
|
||||||
web_miner_config = await self.web.get_miner_config()
|
web_miner_config = await self.web.get_miner_config()
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
from typing import List, Optional, Tuple
|
from typing import List, Optional, Tuple
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import Fan, HashBoard
|
from pyasic.data import AlgoHashRate, Fan, HashBoard
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
from pyasic.data.error_codes import MinerErrorData
|
||||||
from pyasic.miners.base import BaseMiner
|
from pyasic.miners.base import BaseMiner
|
||||||
from pyasic.rpc.unknown import UnknownRPCAPI
|
from pyasic.rpc.unknown import UnknownRPCAPI
|
||||||
@@ -80,7 +80,7 @@ class UnknownMiner(BaseMiner):
|
|||||||
async def _get_hostname(self) -> Optional[str]:
|
async def _get_hostname(self) -> Optional[str]:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def _get_hashrate(self) -> Optional[float]:
|
async def _get_hashrate(self) -> Optional[AlgoHashRate]:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def _get_hashboards(self) -> List[HashBoard]:
|
async def _get_hashboards(self) -> List[HashBoard]:
|
||||||
@@ -113,7 +113,7 @@ class UnknownMiner(BaseMiner):
|
|||||||
async def _get_fault_light(self) -> bool:
|
async def _get_fault_light(self) -> bool:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def _get_expected_hashrate(self) -> Optional[float]:
|
async def _get_expected_hashrate(self) -> Optional[AlgoHashRate]:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
async def _is_mining(self, *args, **kwargs) -> Optional[bool]:
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ class VNish(VNishFirmware, BMMiner):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[float]:
|
async def _get_hashrate(self, rpc_summary: dict = None) -> Optional[AlgoHashRate]:
|
||||||
# get hr from API
|
# get hr from API
|
||||||
if rpc_summary is None:
|
if rpc_summary is None:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -29,4 +29,4 @@ class M3X(BTMiner):
|
|||||||
|
|
||||||
|
|
||||||
class M2X(BTMiner):
|
class M2X(BTMiner):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import warnings
|
|||||||
from typing import List, Optional, Protocol, Tuple, Type, TypeVar, Union
|
from typing import List, Optional, Protocol, Tuple, Type, TypeVar, Union
|
||||||
|
|
||||||
from pyasic.config import MinerConfig
|
from pyasic.config import MinerConfig
|
||||||
from pyasic.data import Fan, HashBoard, MinerData
|
from pyasic.data import AlgoHashRate, Fan, HashBoard, MinerData
|
||||||
from pyasic.data.device import DeviceInfo
|
from pyasic.data.device import DeviceInfo
|
||||||
from pyasic.data.error_codes import MinerErrorData
|
from pyasic.data.error_codes import MinerErrorData
|
||||||
from pyasic.data.pools import PoolMetrics
|
from pyasic.data.pools import PoolMetrics
|
||||||
@@ -238,7 +238,7 @@ class MinerProtocol(Protocol):
|
|||||||
"""
|
"""
|
||||||
return await self._get_hostname()
|
return await self._get_hostname()
|
||||||
|
|
||||||
async def get_hashrate(self) -> Optional[float]:
|
async def get_hashrate(self) -> Optional[AlgoHashRate]:
|
||||||
"""Get the hashrate of the miner and return it as a float in TH/s.
|
"""Get the hashrate of the miner and return it as a float in TH/s.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -318,7 +318,7 @@ class MinerProtocol(Protocol):
|
|||||||
"""
|
"""
|
||||||
return await self._get_fault_light()
|
return await self._get_fault_light()
|
||||||
|
|
||||||
async def get_expected_hashrate(self) -> Optional[float]:
|
async def get_expected_hashrate(self) -> Optional[AlgoHashRate]:
|
||||||
"""Get the nominal hashrate from factory if available.
|
"""Get the nominal hashrate from factory if available.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -362,7 +362,7 @@ class MinerProtocol(Protocol):
|
|||||||
async def _get_hostname(self) -> Optional[str]:
|
async def _get_hostname(self) -> Optional[str]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashrate(self) -> Optional[float]:
|
async def _get_hashrate(self) -> Optional[AlgoHashRate]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_hashboards(self) -> List[HashBoard]:
|
async def _get_hashboards(self) -> List[HashBoard]:
|
||||||
@@ -392,7 +392,7 @@ class MinerProtocol(Protocol):
|
|||||||
async def _get_fault_light(self) -> Optional[bool]:
|
async def _get_fault_light(self) -> Optional[bool]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _get_expected_hashrate(self) -> Optional[float]:
|
async def _get_expected_hashrate(self) -> Optional[AlgoHashRate]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def _is_mining(self) -> Optional[bool]:
|
async def _is_mining(self) -> Optional[bool]:
|
||||||
@@ -574,4 +574,4 @@ class BaseMiner(MinerProtocol):
|
|||||||
"""
|
"""
|
||||||
return False
|
return False
|
||||||
|
|
||||||
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)
|
AnyMiner = TypeVar("AnyMiner", bound=BaseMiner)
|
||||||
|
|||||||
1
pyasic/miners/bitaxe/__init__.py
Normal file
1
pyasic/miners/bitaxe/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .espminer import *
|
||||||
6
pyasic/miners/bitaxe/espminer/BM/BM1366.py
Normal file
6
pyasic/miners/bitaxe/espminer/BM/BM1366.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from pyasic.miners.backends.bitaxe import BitAxe
|
||||||
|
from pyasic.miners.device.models.bitaxe import Ultra
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxeUltra(BitAxe, Ultra):
|
||||||
|
pass
|
||||||
6
pyasic/miners/bitaxe/espminer/BM/BM1368.py
Normal file
6
pyasic/miners/bitaxe/espminer/BM/BM1368.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from pyasic.miners.backends.bitaxe import BitAxe
|
||||||
|
from pyasic.miners.device.models.bitaxe import Supra
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxeSupra(BitAxe, Supra):
|
||||||
|
pass
|
||||||
6
pyasic/miners/bitaxe/espminer/BM/BM1397.py
Normal file
6
pyasic/miners/bitaxe/espminer/BM/BM1397.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from pyasic.miners.backends.bitaxe import BitAxe
|
||||||
|
from pyasic.miners.device.models.bitaxe import Max
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxeMax(BitAxe, Max):
|
||||||
|
pass
|
||||||
3
pyasic/miners/bitaxe/espminer/BM/__init__.py
Normal file
3
pyasic/miners/bitaxe/espminer/BM/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from .BM1366 import BitAxeUltra
|
||||||
|
from .BM1368 import BitAxeSupra
|
||||||
|
from .BM1397 import BitAxeMax
|
||||||
1
pyasic/miners/bitaxe/espminer/__init__.py
Normal file
1
pyasic/miners/bitaxe/espminer/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .BM import *
|
||||||
@@ -44,3 +44,7 @@ class AuradineMake(BaseMiner):
|
|||||||
|
|
||||||
class ePICMake(BaseMiner):
|
class ePICMake(BaseMiner):
|
||||||
make = MinerMake.EPIC
|
make = MinerMake.EPIC
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxeMake(BaseMiner):
|
||||||
|
make = MinerMake.BITAXE
|
||||||
|
|||||||
@@ -18,6 +18,6 @@ from pyasic.miners.device.makes import AntMinerMake
|
|||||||
|
|
||||||
|
|
||||||
class L3Plus(AntMinerMake):
|
class L3Plus(AntMinerMake):
|
||||||
raw_model = MinerModel.ANTMINER
|
raw_model = MinerModel.ANTMINER.L3Plus
|
||||||
|
|
||||||
expected_chips = 72
|
expected_chips = 72
|
||||||
|
|||||||
10
pyasic/miners/device/models/bitaxe/BM/BM1366.py
Normal file
10
pyasic/miners/device/models/bitaxe/BM/BM1366.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from pyasic.device.models import MinerModel
|
||||||
|
from pyasic.miners.device.makes import BitAxeMake
|
||||||
|
|
||||||
|
|
||||||
|
class Ultra(BitAxeMake):
|
||||||
|
raw_model = MinerModel.BITAXE.BM1366
|
||||||
|
|
||||||
|
expected_hashboards = 1
|
||||||
|
expected_chips = 1
|
||||||
|
expected_fans = 1
|
||||||
10
pyasic/miners/device/models/bitaxe/BM/BM1368.py
Normal file
10
pyasic/miners/device/models/bitaxe/BM/BM1368.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from pyasic.device.models import MinerModel
|
||||||
|
from pyasic.miners.device.makes import BitAxeMake
|
||||||
|
|
||||||
|
|
||||||
|
class Supra(BitAxeMake):
|
||||||
|
raw_model = MinerModel.BITAXE.BM1368
|
||||||
|
|
||||||
|
expected_hashboards = 1
|
||||||
|
expected_chips = 1
|
||||||
|
expected_fans = 1
|
||||||
10
pyasic/miners/device/models/bitaxe/BM/BM1397.py
Normal file
10
pyasic/miners/device/models/bitaxe/BM/BM1397.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from pyasic.device.models import MinerModel
|
||||||
|
from pyasic.miners.device.makes import BitAxeMake
|
||||||
|
|
||||||
|
|
||||||
|
class Max(BitAxeMake):
|
||||||
|
raw_model = MinerModel.BITAXE.BM1397
|
||||||
|
|
||||||
|
expected_hashboards = 1
|
||||||
|
expected_chips = 1
|
||||||
|
expected_fans = 1
|
||||||
3
pyasic/miners/device/models/bitaxe/BM/__init__.py
Normal file
3
pyasic/miners/device/models/bitaxe/BM/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from .BM1366 import Ultra
|
||||||
|
from .BM1368 import Supra
|
||||||
|
from .BM1397 import Max
|
||||||
1
pyasic/miners/device/models/bitaxe/__init__.py
Normal file
1
pyasic/miners/device/models/bitaxe/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .BM import *
|
||||||
@@ -31,8 +31,10 @@ from pyasic.miners.antminer import *
|
|||||||
from pyasic.miners.auradine import *
|
from pyasic.miners.auradine import *
|
||||||
from pyasic.miners.avalonminer import *
|
from pyasic.miners.avalonminer import *
|
||||||
from pyasic.miners.backends import *
|
from pyasic.miners.backends import *
|
||||||
|
from pyasic.miners.backends.bitaxe import BitAxe
|
||||||
from pyasic.miners.backends.unknown import UnknownMiner
|
from pyasic.miners.backends.unknown import UnknownMiner
|
||||||
from pyasic.miners.base import AnyMiner
|
from pyasic.miners.base import AnyMiner
|
||||||
|
from pyasic.miners.bitaxe import *
|
||||||
from pyasic.miners.blockminer import *
|
from pyasic.miners.blockminer import *
|
||||||
from pyasic.miners.device.makes import *
|
from pyasic.miners.device.makes import *
|
||||||
from pyasic.miners.goldshell import *
|
from pyasic.miners.goldshell import *
|
||||||
@@ -53,6 +55,7 @@ class MinerTypes(enum.Enum):
|
|||||||
EPIC = 9
|
EPIC = 9
|
||||||
AURADINE = 10
|
AURADINE = 10
|
||||||
MARATHON = 11
|
MARATHON = 11
|
||||||
|
BITAXE = 12
|
||||||
|
|
||||||
|
|
||||||
MINER_CLASSES = {
|
MINER_CLASSES = {
|
||||||
@@ -383,6 +386,7 @@ MINER_CLASSES = {
|
|||||||
"ANTMINER S19J PRO": VNishS19jPro,
|
"ANTMINER S19J PRO": VNishS19jPro,
|
||||||
"ANTMINER S19A": VNishS19a,
|
"ANTMINER S19A": VNishS19a,
|
||||||
"ANTMINER S19A PRO": VNishS19aPro,
|
"ANTMINER S19A PRO": VNishS19aPro,
|
||||||
|
"ANTMINER S19 PRO HYD.": VNishS19ProHydro,
|
||||||
"ANTMINER T19": VNishT19,
|
"ANTMINER T19": VNishT19,
|
||||||
"ANTMINER S21": VNishS21,
|
"ANTMINER S21": VNishS21,
|
||||||
},
|
},
|
||||||
@@ -438,6 +442,12 @@ MINER_CLASSES = {
|
|||||||
"ANTMINER S21": MaraS21,
|
"ANTMINER S21": MaraS21,
|
||||||
"ANTMINER T21": MaraT21,
|
"ANTMINER T21": MaraT21,
|
||||||
},
|
},
|
||||||
|
MinerTypes.BITAXE: {
|
||||||
|
None: BitAxe,
|
||||||
|
"BM1368": BitAxeSupra,
|
||||||
|
"BM1366": BitAxeUltra,
|
||||||
|
"BM1397": BitAxeMax,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -514,6 +524,7 @@ class MinerFactory:
|
|||||||
MinerTypes.LUX_OS: self.get_miner_model_luxos,
|
MinerTypes.LUX_OS: self.get_miner_model_luxos,
|
||||||
MinerTypes.AURADINE: self.get_miner_model_auradine,
|
MinerTypes.AURADINE: self.get_miner_model_auradine,
|
||||||
MinerTypes.MARATHON: self.get_miner_model_marathon,
|
MinerTypes.MARATHON: self.get_miner_model_marathon,
|
||||||
|
MinerTypes.BITAXE: self.get_miner_model_bitaxe,
|
||||||
}
|
}
|
||||||
fn = miner_model_fns.get(miner_type)
|
fn = miner_model_fns.get(miner_type)
|
||||||
|
|
||||||
@@ -595,6 +606,8 @@ class MinerFactory:
|
|||||||
return MinerTypes.WHATSMINER
|
return MinerTypes.WHATSMINER
|
||||||
if "Braiins OS" in web_text:
|
if "Braiins OS" in web_text:
|
||||||
return MinerTypes.BRAIINS_OS
|
return MinerTypes.BRAIINS_OS
|
||||||
|
if "AxeOS" in web_text:
|
||||||
|
return MinerTypes.BITAXE
|
||||||
if "cloud-box" in web_text:
|
if "cloud-box" in web_text:
|
||||||
return MinerTypes.GOLDSHELL
|
return MinerTypes.GOLDSHELL
|
||||||
if "AnthillOS" in web_text:
|
if "AnthillOS" in web_text:
|
||||||
@@ -1008,6 +1021,18 @@ class MinerFactory:
|
|||||||
except (TypeError, LookupError):
|
except (TypeError, LookupError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
async def get_miner_model_bitaxe(self, ip: str) -> str | None:
|
||||||
|
web_json_data = await self.send_web_command(ip, "/api/system/info")
|
||||||
|
|
||||||
|
try:
|
||||||
|
miner_model = web_json_data["ASICModel"]
|
||||||
|
if miner_model == "":
|
||||||
|
return None
|
||||||
|
|
||||||
|
return miner_model
|
||||||
|
except (TypeError, LookupError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
miner_factory = MinerFactory()
|
miner_factory = MinerFactory()
|
||||||
|
|
||||||
|
|||||||
@@ -92,4 +92,4 @@ class BOSMinerSSH(BaseSSH):
|
|||||||
Returns:
|
Returns:
|
||||||
str: Status of the LED.
|
str: Status of the LED.
|
||||||
"""
|
"""
|
||||||
return await self.send_command("cat /sys/class/leds/'Red LED'/delay_off")
|
return await self.send_command("cat /sys/class/leds/'Red LED'/delay_off")
|
||||||
|
|||||||
96
pyasic/web/bitaxe.py
Normal file
96
pyasic/web/bitaxe.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import json
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from pyasic import APIError, settings
|
||||||
|
from pyasic.web.base import BaseWebAPI
|
||||||
|
|
||||||
|
|
||||||
|
class BitAxeWebAPI(BaseWebAPI):
|
||||||
|
async def send_command(
|
||||||
|
self,
|
||||||
|
command: str | bytes,
|
||||||
|
ignore_errors: bool = False,
|
||||||
|
allow_warning: bool = True,
|
||||||
|
privileged: bool = False,
|
||||||
|
**parameters: Any,
|
||||||
|
) -> dict:
|
||||||
|
url = f"http://{self.ip}:{self.port}/api/{command}"
|
||||||
|
try:
|
||||||
|
async with httpx.AsyncClient(
|
||||||
|
transport=settings.transport(),
|
||||||
|
) as client:
|
||||||
|
if parameters.get("post", False):
|
||||||
|
parameters.pop("post")
|
||||||
|
data = await client.post(
|
||||||
|
url,
|
||||||
|
timeout=settings.get("api_function_timeout", 3),
|
||||||
|
json=parameters,
|
||||||
|
)
|
||||||
|
elif parameters.get("patch", False):
|
||||||
|
parameters.pop("patch")
|
||||||
|
data = await client.patch(
|
||||||
|
url,
|
||||||
|
timeout=settings.get("api_function_timeout", 3),
|
||||||
|
json=parameters,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
data = await client.get(url)
|
||||||
|
except httpx.HTTPError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if data.status_code == 200:
|
||||||
|
try:
|
||||||
|
return data.json()
|
||||||
|
except json.decoder.JSONDecodeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def multicommand(
|
||||||
|
self, *commands: str, ignore_errors: bool = False, allow_warning: bool = True
|
||||||
|
) -> dict:
|
||||||
|
"""Execute multiple commands simultaneously on the BitAxe miner.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*commands (str): Commands to execute.
|
||||||
|
ignore_errors (bool): Whether to ignore errors during command execution.
|
||||||
|
allow_warning (bool): Whether to proceed despite warnings.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: A dictionary containing responses for all commands executed.
|
||||||
|
"""
|
||||||
|
tasks = {}
|
||||||
|
# send all commands individually
|
||||||
|
for cmd in commands:
|
||||||
|
tasks[cmd] = asyncio.create_task(
|
||||||
|
self.send_command(cmd, allow_warning=allow_warning)
|
||||||
|
)
|
||||||
|
|
||||||
|
await asyncio.gather(*[tasks[cmd] for cmd in tasks], return_exceptions=True)
|
||||||
|
|
||||||
|
data = {"multicommand": True}
|
||||||
|
for cmd in tasks:
|
||||||
|
try:
|
||||||
|
result = tasks[cmd].result()
|
||||||
|
if result is None or result == {}:
|
||||||
|
result = {}
|
||||||
|
data[cmd] = result
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
async def system_info(self):
|
||||||
|
return await self.send_command("system/info")
|
||||||
|
|
||||||
|
async def swarm_info(self):
|
||||||
|
return await self.send_command("swarm/info")
|
||||||
|
|
||||||
|
async def restart(self):
|
||||||
|
return await self.send_command("system/restart", post=True)
|
||||||
|
|
||||||
|
async def update_settings(self, **config):
|
||||||
|
return await self.send_command("system", patch=True, **config)
|
||||||
@@ -15,9 +15,12 @@
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
import json
|
import json
|
||||||
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
import aiofiles
|
||||||
import httpx
|
import httpx
|
||||||
|
|
||||||
from pyasic import settings
|
from pyasic import settings
|
||||||
@@ -46,6 +49,14 @@ class ePICWebAPI(BaseWebAPI):
|
|||||||
async with httpx.AsyncClient(transport=settings.transport()) as client:
|
async with httpx.AsyncClient(transport=settings.transport()) as client:
|
||||||
for retry_cnt in range(settings.get("get_data_retries", 1)):
|
for retry_cnt in range(settings.get("get_data_retries", 1)):
|
||||||
try:
|
try:
|
||||||
|
if parameters.get("form") is not None:
|
||||||
|
form_data = parameters["form"]
|
||||||
|
form_data.add_field("password", self.pwd)
|
||||||
|
response = await client.post(
|
||||||
|
f"http://{self.ip}:{self.port}/{command}",
|
||||||
|
timeout=5,
|
||||||
|
data=form_data,
|
||||||
|
)
|
||||||
if post:
|
if post:
|
||||||
response = await client.post(
|
response = await client.post(
|
||||||
f"http://{self.ip}:{self.port}/{command}",
|
f"http://{self.ip}:{self.port}/{command}",
|
||||||
@@ -135,3 +146,22 @@ class ePICWebAPI(BaseWebAPI):
|
|||||||
|
|
||||||
async def capabilities(self) -> dict:
|
async def capabilities(self) -> dict:
|
||||||
return await self.send_command("capabilities")
|
return await self.send_command("capabilities")
|
||||||
|
|
||||||
|
async def system_update(self, file: Path | str, keep_settings: bool = True):
|
||||||
|
"""Perform a system update by uploading a firmware file and sending a
|
||||||
|
command to initiate the update."""
|
||||||
|
|
||||||
|
# calculate the SHA256 checksum of the firmware file
|
||||||
|
sha256_hash = hashlib.sha256()
|
||||||
|
async with aiofiles.open(str(file), "rb") as f:
|
||||||
|
while chunk := await f.read(8192):
|
||||||
|
sha256_hash.update(chunk)
|
||||||
|
checksum = sha256_hash.hexdigest()
|
||||||
|
|
||||||
|
# prepare the multipart/form-data request
|
||||||
|
form_data = aiohttp.FormData()
|
||||||
|
form_data.add_field("checksum", checksum)
|
||||||
|
form_data.add_field("keepsettings", str(keep_settings).lower())
|
||||||
|
form_data.add_field("update.zip", open(file, "rb"), filename="update.zip")
|
||||||
|
|
||||||
|
await self.send_command("systemupdate", form=form_data)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "pyasic"
|
name = "pyasic"
|
||||||
version = "0.57.6"
|
version = "0.58.1"
|
||||||
description = "A simplified and standardized interface for Bitcoin ASICs."
|
description = "A simplified and standardized interface for Bitcoin ASICs."
|
||||||
authors = ["UpstreamData <brett@upstreamdata.ca>"]
|
authors = ["UpstreamData <brett@upstreamdata.ca>"]
|
||||||
repository = "https://github.com/UpstreamData/pyasic"
|
repository = "https://github.com/UpstreamData/pyasic"
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ class MinersTest(unittest.TestCase):
|
|||||||
"expected_hashrate",
|
"expected_hashrate",
|
||||||
"uptime",
|
"uptime",
|
||||||
"wattage",
|
"wattage",
|
||||||
"voltage",
|
|
||||||
"wattage_limit",
|
"wattage_limit",
|
||||||
"pools",
|
"pools",
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user