From 961936245c38433e1bf3ae66ae44a6614e183e8a Mon Sep 17 00:00:00 2001 From: pooler Date: Sun, 30 Apr 2017 09:48:52 +0200 Subject: [PATCH] Allow multiple P2SH address versions --- lib/coins.py | 42 ++++++++++++++++++------------------- tests/lib/test_addresses.py | 4 ++-- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/coins.py b/lib/coins.py index d4a0c24..e81ffd4 100644 --- a/lib/coins.py +++ b/lib/coins.py @@ -170,7 +170,7 @@ class Coin(object): def P2SH_address_from_hash160(cls, hash160): '''Return a coin address given a hash160.''' assert len(hash160) == 20 - return Base58.encode_check(cls.P2SH_VERBYTE + hash160) + return Base58.encode_check(cls.P2SH_VERBYTES[0] + hash160) @classmethod def multisig_address(cls, m, pubkeys): @@ -213,7 +213,7 @@ class Coin(object): if verbyte == cls.P2PKH_VERBYTE: return ScriptPubKey.P2PKH_script(hash_bytes) - if verbyte == cls.P2SH_VERBYTE: + if verbyte in cls.P2SH_VERBYTES: return ScriptPubKey.P2SH_script(hash_bytes) raise CoinError('invalid address: {}'.format(address)) @@ -318,7 +318,7 @@ class Bitcoin(Coin): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("00") - P2SH_VERBYTE = bytes.fromhex("05") + P2SH_VERBYTES = [bytes.fromhex("05")] WIF_BYTE = bytes.fromhex("80") GENESIS_HASH = ('000000000019d6689c085ae165831e93' '4ff763ae46a2a6c172b3f1b60a8ce26f') @@ -353,7 +353,7 @@ class BitcoinTestnet(Bitcoin): XPUB_VERBYTES = bytes.fromhex("043587cf") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("6f") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("ef") GENESIS_HASH = ('000000000933ea01ad0ee984209779ba' 'aec3ced90fa3f408719526f8d77f4943') @@ -413,7 +413,7 @@ class Litecoin(Coin): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("30") - P2SH_VERBYTE = bytes.fromhex("05") + P2SH_VERBYTES = [bytes.fromhex("32"), bytes.fromhex("05")] WIF_BYTE = bytes.fromhex("b0") GENESIS_HASH = ('12a765e31ffd4059bada1e25190f6e98' 'c99d9714d334efa41a195a7e7e04bfe2') @@ -444,7 +444,7 @@ class LitecoinTestnet(Litecoin): XPUB_VERBYTES = bytes.fromhex("043587cf") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("6f") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("3a"), bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("ef") GENESIS_HASH = ('4966625a4b2851d9fdee139e56211a0d' '88575f59ed816ff5e6a63deb4e3e29a0') @@ -467,7 +467,7 @@ class Viacoin(CoinAuxPow): XPUB_VERBYTES = bytes.fromhex("0488B21E") XPRV_VERBYTES = bytes.fromhex("0488ADE4") P2PKH_VERBYTE = bytes.fromhex("47") - P2SH_VERBYTE = bytes.fromhex("21") + P2SH_VERBYTES = [bytes.fromhex("21")] WIF_BYTE = bytes.fromhex("c7") GENESIS_HASH = ('4e9b54001f9976049830128ec0331515' 'eaabe35a70970d79971da1539a400ba1') @@ -492,7 +492,7 @@ class ViacoinTestnet(Viacoin): XPUB_VERBYTES = bytes.fromhex("043587CF") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("7f") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("ff") GENESIS_HASH = ('00000007199508e34a9ff81e6ec0c477' 'a4cccff2a4767a8eee39c11db367b008') @@ -519,7 +519,7 @@ class Namecoin(CoinAuxPow): XPUB_VERBYTES = bytes.fromhex("d7dd6370") XPRV_VERBYTES = bytes.fromhex("d7dc6e31") P2PKH_VERBYTE = bytes.fromhex("34") - P2SH_VERBYTE = bytes.fromhex("0d") + P2SH_VERBYTES = [bytes.fromhex("0d")] WIF_BYTE = bytes.fromhex("e4") GENESIS_HASH = ('000000000062b72c5e2ceb45fbc8587e' '807c155b0da735e6483dfba2f0a9c770') @@ -537,7 +537,7 @@ class NamecoinTestnet(Namecoin): XPUB_VERBYTES = bytes.fromhex("043587cf") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("6f") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("ef") GENESIS_HASH = ('00000007199508e34a9ff81e6ec0c477' 'a4cccff2a4767a8eee39c11db367b008') @@ -550,7 +550,7 @@ class Dogecoin(CoinAuxPow): XPUB_VERBYTES = bytes.fromhex("02facafd") XPRV_VERBYTES = bytes.fromhex("02fac398") P2PKH_VERBYTE = bytes.fromhex("1e") - P2SH_VERBYTE = bytes.fromhex("16") + P2SH_VERBYTES = [bytes.fromhex("16")] WIF_BYTE = bytes.fromhex("9e") GENESIS_HASH = ('1a91e3dace36e2be3bf030a65679fe82' '1aa1d6ef92e7c9902eb318182c355691') @@ -569,7 +569,7 @@ class DogecoinTestnet(Dogecoin): XPUB_VERBYTES = bytes.fromhex("043587cf") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("71") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("f1") GENESIS_HASH = ('bb0a78264637406b6360aad926284d54' '4d7049f45189db5664f3c4d07350559e') @@ -585,7 +585,7 @@ class Dash(Coin): GENESIS_HASH = ('00000ffd590b1485b3caadc19b22e637' '9c733355108f107a430458cdf3407ab6') P2PKH_VERBYTE = bytes.fromhex("4c") - P2SH_VERBYTE = bytes.fromhex("10") + P2SH_VERBYTES = [bytes.fromhex("10")] WIF_BYTE = bytes.fromhex("cc") TX_COUNT_HEIGHT = 569399 TX_COUNT = 2157510 @@ -617,7 +617,7 @@ class DashTestnet(Dash): GENESIS_HASH = ('00000bafbc94add76cb75e2ec9289483' '7288a481e5c005f6563d91623bf8bc2c') P2PKH_VERBYTE = bytes.fromhex("8c") - P2SH_VERBYTE = bytes.fromhex("13") + P2SH_VERBYTES = [bytes.fromhex("13")] WIF_BYTE = bytes.fromhex("ef") TX_COUNT_HEIGHT = 101619 TX_COUNT = 132681 @@ -637,7 +637,7 @@ class Argentum(CoinAuxPow): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("17") - P2SH_VERBYTE = bytes.fromhex("05") + P2SH_VERBYTES = [bytes.fromhex("05")] WIF_BYTE = bytes.fromhex("97") GENESIS_HASH = ('88c667bc63167685e4e4da058fffdfe8' 'e007e5abffd6855de52ad59df7bb0bb2') @@ -655,7 +655,7 @@ class ArgentumTestnet(Argentum): XPUB_VERBYTES = bytes.fromhex("043587cf") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("6f") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("ef") REORG_LIMIT = 2000 @@ -667,7 +667,7 @@ class DigiByte(Coin): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("1E") - P2SH_VERBYTE = bytes.fromhex("05") + P2SH_VERBYTES = [bytes.fromhex("05")] WIF_BYTE = bytes.fromhex("80") GENESIS_HASH = ('7497ea1b465eb39f1c8f507bc877078f' 'e016d6fcb6dfad3a64c98dcc6e1e8496') @@ -684,7 +684,7 @@ class DigiByteTestnet(DigiByte): XPUB_VERBYTES = bytes.fromhex("043587cf") XPRV_VERBYTES = bytes.fromhex("04358394") P2PKH_VERBYTE = bytes.fromhex("6f") - P2SH_VERBYTE = bytes.fromhex("c4") + P2SH_VERBYTES = [bytes.fromhex("c4")] WIF_BYTE = bytes.fromhex("ef") GENESIS_HASH = ('b5dca8039e300198e5fe7cd23bdd1728' 'e2a444af34c447dbd0916fa3430a68c2') @@ -701,7 +701,7 @@ class FairCoin(Coin): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("5f") - P2SH_VERBYTE = bytes.fromhex("24") + P2SH_VERBYTES = [bytes.fromhex("24")] WIF_BYTE = bytes.fromhex("df") GENESIS_HASH = ('1f701f2b8de1339dc0ec908f3fb6e9b0' 'b870b6f20ba893e120427e42bbc048d7') @@ -750,7 +750,7 @@ class Zcash(Coin): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("1CB8") - P2SH_VERBYTE = bytes.fromhex("1CBD") + P2SH_VERBYTES = [bytes.fromhex("1CBD")] WIF_BYTE = bytes.fromhex("80") GENESIS_HASH = ('00040fe8ec8471911baa1db1266ea15d' 'd06b4a8a5c453883c000b031973dce08') @@ -798,7 +798,7 @@ class Einsteinium(Coin): XPUB_VERBYTES = bytes.fromhex("0488b21e") XPRV_VERBYTES = bytes.fromhex("0488ade4") P2PKH_VERBYTE = bytes.fromhex("21") - P2SH_VERBYTE = bytes.fromhex("05") + P2SH_VERBYTES = [bytes.fromhex("05")] WIF_BYTE = bytes.fromhex("a1") GENESIS_HASH = ('4e56204bb7b8ac06f860ff1c845f03f9' '84303b5b97eb7b42868f714611aed94b') diff --git a/tests/lib/test_addresses.py b/tests/lib/test_addresses.py index be560d0..1e4ecce 100644 --- a/tests/lib/test_addresses.py +++ b/tests/lib/test_addresses.py @@ -36,7 +36,7 @@ addresses = [ "a773db925b09add367dcc253c1f9bbc1d11ec6fd", "062d8515e50cb92b8a3a73"), (Litecoin, "LNBAaWuZmipg29WXfz5dtAm1pjo8FEH8yg", "206168f5322583ff37f8e55665a4789ae8963532", "b8cb80b26e8932f5b12a7e"), - (Litecoin, "3GxRZWkJufR5XA8hnNJgQ2gkASSheoBcmW", + (Litecoin, "MPAZsQAGrnGWKfQbtFJ2Dfw9V939e7D3E2", "a773db925b09add367dcc253c1f9bbc1d11ec6fd", "062d8515e50cb92b8a3a73"), (Zcash, "t1LppKe1sfPNDMysGSGuTjxoAsBcvvSYv5j", "206168f5322583ff37f8e55665a4789ae8963532", "b8cb80b26e8932f5b12a7e"), @@ -64,7 +64,7 @@ def test_address_from_hash160(address): verbyte, hash_bytes = raw[:verlen], raw[verlen:] if coin.P2PKH_VERBYTE == verbyte: assert coin.P2PKH_address_from_hash160(bytes.fromhex(hash)) == addr - elif coin.P2SH_VERBYTE == verbyte: + elif verbyte in coin.P2SH_VERBYTES: assert coin.P2SH_address_from_hash160(bytes.fromhex(hash)) == addr else: raise Exception("Unknown version byte")