forked from ibbtco/electrum-dash
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathcoins.py
73 lines (60 loc) · 2.67 KB
/
coins.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import sys
class Coin(object):
@classmethod
def static_header_offset(cls, height):
raise Exception('Not implemented')
class Firo(Coin):
PRE_MTP_BLOCKS = 117564
PRE_MTP_HEADER_SIZE = 80
MTP_HEADER_SIZE = 180
AFTER_PROGPOW_BLOCK_HEIGHT = 419264
PROGPOW_HEADER_SIZE = 120
PROGPOW_START_TIME = 1635228000
@classmethod
def static_header_offset(cls, height):
if height > cls.AFTER_PROGPOW_BLOCK_HEIGHT:
return cls.static_header_offset(cls.AFTER_PROGPOW_BLOCK_HEIGHT) + (height - cls.AFTER_PROGPOW_BLOCK_HEIGHT) * cls.PROGPOW_HEADER_SIZE
if height > cls.PRE_MTP_BLOCKS:
return cls.static_header_offset(cls.PRE_MTP_BLOCKS) + (height - cls.PRE_MTP_BLOCKS) * cls.MTP_HEADER_SIZE
return cls.PRE_MTP_HEADER_SIZE * height
def get_header_size(self, header: bytes):
hex_to_int = lambda s: int.from_bytes(s, byteorder='little')
if hex_to_int(header[68:72]) >= self.PROGPOW_START_TIME: #nTime
return self.PROGPOW_HEADER_SIZE
if not (hex_to_int(header[0:4]) & 0x1000): #nVersion
return self.PRE_MTP_HEADER_SIZE
return self.MTP_HEADER_SIZE
@classmethod
def get_header_size_height(cls, height: int):
if height >= cls.AFTER_PROGPOW_BLOCK_HEIGHT:
return cls.PROGPOW_HEADER_SIZE
if height >= cls.PRE_MTP_BLOCKS:
return cls.MTP_HEADER_SIZE
return cls.PRE_MTP_HEADER_SIZE
def check_header_size(self, header: bytes):
size = self.get_header_size(header)
header_len = len(header)
if header_len == self.PRE_MTP_HEADER_SIZE:
return True
if header_len == self.PROGPOW_HEADER_SIZE:
return True
if header_len == size:
return True
return False
@classmethod
def file_size_to_height(cls, fileSize: int):
preMtpSize = cls.static_header_offset(cls.PRE_MTP_BLOCKS)
if fileSize <= preMtpSize:
return fileSize // cls.PRE_MTP_HEADER_SIZE
preProgpowSize = cls.static_header_offset(cls.AFTER_PROGPOW_BLOCK_HEIGHT)
if fileSize <= preProgpowSize:
return cls.PRE_MTP_BLOCKS + (fileSize - preMtpSize) // cls.MTP_HEADER_SIZE
return cls.AFTER_PROGPOW_BLOCK_HEIGHT + (fileSize - preProgpowSize) // cls.PROGPOW_HEADER_SIZE
class FiroTestnet(Firo):
PRE_MTP_BLOCKS = 1
AFTER_PROGPOW_BLOCK_HEIGHT = 37305
PROGPOW_START_TIME = 1630069200
class FiroRegtest(Firo):
PRE_MTP_BLOCKS = 2147483647 # INT_MAX 0x7fffffff
AFTER_PROGPOW_BLOCK_HEIGHT = 2147483647 # INT_MAX 0x7fffffff
PROGPOW_START_TIME = 2147483647 # INT_MAX 0x7fffffff -- same as electrumX.coins.firo.regtest