Skip to content

Commit 4b8a610

Browse files
committed
Add support for DeSo
- New entries in cryptocurrencies.py; - New {public,private}_key_base58check fields.
1 parent 01aa683 commit 4b8a610

File tree

3 files changed

+120
-1
lines changed

3 files changed

+120
-1
lines changed

hdwallet/cryptocurrencies.py

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class Cryptocurrency(NestedNamespace):
6363
COIN_TYPE: CoinType
6464

6565
SCRIPT_ADDRESS: int
66-
PUBLIC_KEY_ADDRESS: int
66+
PUBLIC_KEY_ADDRESS: int = 0
67+
PRIVATE_KEY_ADDRESS: int = 0
6768
SEGWIT_ADDRESS: SegwitAddress
6869

6970
EXTENDED_PRIVATE_KEY: ExtendedPrivateKey
@@ -714,6 +715,47 @@ class BitcoinMainnet(Cryptocurrency):
714715
WIF_SECRET_KEY = 0x80
715716

716717

718+
class DeSoMainnet(Cryptocurrency):
719+
720+
NAME = "DeSo"
721+
SYMBOL = "DESO"
722+
NETWORK = "mainnet"
723+
SOURCE_CODE = "https://github.com/deso-protocol"
724+
COIN_TYPE = CoinType({
725+
"INDEX": 0,
726+
"HARDENED": True
727+
})
728+
729+
SCRIPT_ADDRESS = 0x05
730+
PUBLIC_KEY_ADDRESS = 0xCD1400
731+
PRIVATE_KEY_ADDRESS = 0x350000
732+
SEGWIT_ADDRESS = SegwitAddress({
733+
"HRP": "bc",
734+
"VERSION": 0x00
735+
})
736+
737+
EXTENDED_PRIVATE_KEY = ExtendedPrivateKey({
738+
"P2PKH": 0x0488ade4,
739+
"P2SH": 0x0488ade4,
740+
"P2WPKH": 0x04b2430c,
741+
"P2WPKH_IN_P2SH": 0x049d7878,
742+
"P2WSH": 0x02aa7a99,
743+
"P2WSH_IN_P2SH": 0x0295b005
744+
})
745+
EXTENDED_PUBLIC_KEY = ExtendedPublicKey({
746+
"P2PKH": 0x0488b21e,
747+
"P2SH": 0x0488b21e,
748+
"P2WPKH": 0x04b24746,
749+
"P2WPKH_IN_P2SH": 0x049d7cb2,
750+
"P2WSH": 0x02aa7ed3,
751+
"P2WSH_IN_P2SH": 0x0295b43f
752+
})
753+
754+
MESSAGE_PREFIX = "\x18DeSo Signed Message:\n"
755+
DEFAULT_PATH = f"m/44'/{str(COIN_TYPE)}/0'/0/0"
756+
WIF_SECRET_KEY = 0x80
757+
758+
717759
class BitcoinPlusMainnet(Cryptocurrency):
718760

719761
NAME = "Bitcoin Plus"
@@ -834,6 +876,47 @@ class BitcoinTestnet(Cryptocurrency):
834876
WIF_SECRET_KEY = 0xef
835877

836878

879+
class DeSoTestnet(Cryptocurrency):
880+
881+
NAME = "DeSo"
882+
SYMBOL = "DESO"
883+
NETWORK = "mainnet"
884+
SOURCE_CODE = "https://github.com/deso-protocol"
885+
COIN_TYPE = CoinType({
886+
"INDEX": 0,
887+
"HARDENED": True
888+
})
889+
890+
SCRIPT_ADDRESS = 0x05
891+
PUBLIC_KEY_ADDRESS = 0x11C200
892+
PRIVATE_KEY_ADDRESS = 0x4F061B
893+
SEGWIT_ADDRESS = SegwitAddress({
894+
"HRP": "bc",
895+
"VERSION": 0x00
896+
})
897+
898+
EXTENDED_PRIVATE_KEY = ExtendedPrivateKey({
899+
"P2PKH": 0x0488ade4,
900+
"P2SH": 0x0488ade4,
901+
"P2WPKH": 0x04b2430c,
902+
"P2WPKH_IN_P2SH": 0x049d7878,
903+
"P2WSH": 0x02aa7a99,
904+
"P2WSH_IN_P2SH": 0x0295b005
905+
})
906+
EXTENDED_PUBLIC_KEY = ExtendedPublicKey({
907+
"P2PKH": 0x0488b21e,
908+
"P2SH": 0x0488b21e,
909+
"P2WPKH": 0x04b24746,
910+
"P2WPKH_IN_P2SH": 0x049d7cb2,
911+
"P2WSH": 0x02aa7ed3,
912+
"P2WSH_IN_P2SH": 0x0295b43f
913+
})
914+
915+
MESSAGE_PREFIX = "\x18DeSo Signed Message:\n"
916+
DEFAULT_PATH = f"m/44'/{str(COIN_TYPE)}/0'/0/0"
917+
WIF_SECRET_KEY = 0x80
918+
919+
837920
class BitcoinZMainnet(Cryptocurrency):
838921

839922
NAME = "BitcoinZ"

hdwallet/hdwallet.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ def __init__(self, symbol: str = "BTC", cryptocurrency: Any = None,
112112
self._private_key: Optional[bytes] = None
113113
self._public_key: Optional[str] = None
114114
self._chain_code: Optional[bytes] = None
115+
116+
self._private_key_base58check: Optional[str] = None
117+
self._public_key_base58check: Optional[str] = None
118+
115119
self._depth: int = 0
116120
self._index: int = 0
117121

@@ -211,6 +215,8 @@ def from_seed(self, seed: str) -> "HDWallet":
211215
if self._use_default_path:
212216
self.from_path(path=self._cryptocurrency.DEFAULT_PATH)
213217
self._public_key = self.compressed()
218+
self._public_key_base58check = self.public_key_base58check()
219+
self._private_key_base58check = self.private_key_base58check()
214220
if self._from_class:
215221
self.from_path(path=self._path_class)
216222
return self
@@ -251,6 +257,8 @@ def from_root_xprivate_key(self, xprivate_key: str, strict: bool = True) -> "HDW
251257
if self._from_class:
252258
self.from_path(path=self._path_class)
253259
self._public_key = self.compressed()
260+
self._public_key_base58check = self.public_key_base58check()
261+
self._private_key_base58check = self.private_key_base58check()
254262
return self
255263

256264
def from_root_xpublic_key(self, xpublic_key: str, strict: bool = True) -> "HDWallet":
@@ -289,6 +297,7 @@ def from_root_xpublic_key(self, xpublic_key: str, strict: bool = True) -> "HDWal
289297
if self._from_class:
290298
self.from_path(path=self._path_class)
291299
self._public_key = self.compressed()
300+
self._public_key_base58check = self.public_key_base58check()
292301
return self
293302

294303
def from_xprivate_key(self, xprivate_key: str) -> "HDWallet":
@@ -317,6 +326,8 @@ def from_xprivate_key(self, xprivate_key: str) -> "HDWallet":
317326
self._key = ecdsa.SigningKey.from_string(_deserialize_xprivate_key[5], curve=SECP256k1)
318327
self._verified_key = self._key.get_verifying_key()
319328
self._public_key = self.compressed()
329+
self._public_key_base58check = self.public_key_base58check()
330+
self._private_key_base58check = self.private_key_base58check()
320331
return self
321332

322333
def from_xpublic_key(self, xpublic_key: str) -> "HDWallet":
@@ -346,6 +357,7 @@ def from_xpublic_key(self, xpublic_key: str) -> "HDWallet":
346357
_deserialize_xpublic_key[5], curve=SECP256k1
347358
)
348359
self._public_key = self.compressed()
360+
self._public_key_base58check = self.public_key_base58check()
349361
return self
350362

351363
def from_wif(self, wif: str) -> "HDWallet":
@@ -372,6 +384,8 @@ def from_wif(self, wif: str) -> "HDWallet":
372384
self._key = ecdsa.SigningKey.from_string(self._private_key, curve=SECP256k1)
373385
self._verified_key = self._key.get_verifying_key()
374386
self._public_key = self.compressed()
387+
self._public_key_base58check = self.public_key_base58check()
388+
self._private_key_base58check = self.private_key_base58check()
375389
return self
376390

377391
def from_private_key(self, private_key: str) -> "HDWallet":
@@ -394,6 +408,8 @@ def from_private_key(self, private_key: str) -> "HDWallet":
394408
self._key = ecdsa.SigningKey.from_string(self._private_key, curve=SECP256k1)
395409
self._verified_key = self._key.get_verifying_key()
396410
self._public_key = self.compressed()
411+
self._public_key_base58check = self.public_key_base58check()
412+
self._private_key_base58check = self.private_key_base58check()
397413
return self
398414

399415
def from_public_key(self, public_key: str) -> "HDWallet":
@@ -416,6 +432,7 @@ def from_public_key(self, public_key: str) -> "HDWallet":
416432
unhexlify(public_key), curve=SECP256k1
417433
)
418434
self._public_key = self.compressed()
435+
self._public_key_base58check = self.public_key_base58check()
419436
return self
420437

421438
def from_path(self, path: Union[str, Derivation]) -> "HDWallet":
@@ -521,6 +538,7 @@ def _derive_key_by_index(self, index) -> Optional["HDWallet"]:
521538
)
522539
self._key = ecdsa.SigningKey.from_string(self._private_key, curve=SECP256k1)
523540
self._verified_key = self._key.get_verifying_key()
541+
self._private_key_base58check = self.private_key_base58check()
524542
else:
525543
key_point = S256Point.parse(unhexlify(self.public_key()))
526544
left_point = il_int * G
@@ -730,6 +748,7 @@ def clean_derivation(self) -> "HDWallet":
730748
self._private_key, self._chain_code = self._root_private_key
731749
self._key = ecdsa.SigningKey.from_string(self._private_key, curve=SECP256k1)
732750
self._verified_key = self._key.get_verifying_key()
751+
self._private_key_base58check = self.private_key_base58check()
733752
elif self._root_public_key:
734753
self._path, self._depth, self._parent_fingerprint, self._index = (
735754
"m", 0, b"\0\0\0\0", 0
@@ -847,6 +866,18 @@ def public_key(self, compressed: bool = True, private_key: Optional[str] = None)
847866
return hexlify(ck).decode() if compressed else self.uncompressed(compressed=hexlify(ck).decode())
848867
return self.compressed() if compressed else self.uncompressed()
849868

869+
def public_key_base58check(self) -> str:
870+
return base58.b58encode_check(
871+
_unhexlify(self._cryptocurrency.PUBLIC_KEY_ADDRESS) +
872+
unhexlify(self.public_key())
873+
)
874+
875+
def private_key_base58check(self) -> str:
876+
return base58.b58encode_check(
877+
_unhexlify(self._cryptocurrency.PRIVATE_KEY_ADDRESS) +
878+
unhexlify(self.private_key())
879+
)
880+
850881
def strength(self) -> Optional[int]:
851882
"""
852883
Get Entropy strength.
@@ -1281,6 +1312,8 @@ def dumps(self) -> dict:
12811312
semantic=self.semantic(),
12821313
path=self.path(),
12831314
hash=self.hash(),
1315+
public_key_base58check=self.public_key_base58check(),
1316+
private_key_base58check=self.private_key_base58check(),
12841317
addresses=dict(
12851318
p2pkh=self.p2pkh_address(),
12861319
p2sh=self.p2sh_address(),

hdwallet/symbols.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
DASH, DASHTEST = "DASH", "DASHTEST"
7171
# Deep Onion
7272
ONION = "ONION"
73+
# DeSo
74+
DESO, DESOTEST = "DESO", "DESOTEST"
7375
# Defcoin
7476
DFC = "DFC"
7577
# Denarius
@@ -316,6 +318,7 @@
316318
"CRAVE",
317319
"DASH", "DASHTEST",
318320
"ONION",
321+
"DESO", "DESOTEST",
319322
"DFC",
320323
"DNR",
321324
"DMD",

0 commit comments

Comments
 (0)