altcoin.py: use namedtuples for CoinInfo entries

This commit is contained in:
The MMGen Project 2019-10-21 17:22:16 +00:00
commit 017abc3f8c
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
2 changed files with 212 additions and 209 deletions

View file

@ -34,171 +34,174 @@ altcoin.py - Coin constants for Bitcoin-derived altcoins
import sys
def msg(s): sys.stderr.write(s+'\n')
from collections import namedtuple
ce = namedtuple('CoinInfoEntry',
['name','symbol','wif_ver_num','p2pkh_info','p2sh_info','has_segwit','trust_level'])
class CoinInfo(object):
coin_constants = {}
coin_constants['mainnet'] = (
# NAME SYM WIF P2PKH P2SH SEGWIT TRUST
# trust levels: 0=untested 1=low 2=med 3=high -1=disable
# Trust levels: 0=untested 1=low 2=med 3=high -1=disable
# Fork coins must be disabled here to prevent generation from incorrect sub-seed
('Bitcoin', 'BTC', 0x80, (0x00,'1'), (0x05,'3'), True, -1),
('BitcoinSegwit2X', 'B2X', 0x80, (0x00,'1'), (0x05,'3'), True, -1),
('BitcoinGold', 'BCG', 0x80, (0x00,'1'), (0x05,'3'), True, -1),
('Bcash', 'BCH', 0x80, (0x00,'1'), (0x05,'3'), False,-1),
('2GiveCoin', '2GIVE', 0xa7, (0x27,('G','H')), None, False, 0),
('42Coin', '42', 0x88, (0x08,'4'), None, False, 1),
('ACoin', 'ACOIN', 0xe6, (0x17,'A'), None, False, 0),
('Alphacoin', 'ALF', 0xd2, (0x52,('Z','a')), None, False, 0),
('Anoncoin', 'ANC', 0x97, (0x17,'A'), None, False, 1),
('Apexcoin', 'APEX', 0x97, (0x17,'A'), None, False, 0),
('Aquariuscoin', 'ARCO', 0x97, (0x17,'A'), None, False, 0),
('Argentum', 'ARG', 0x97, (0x17,'A'), (0x05,'3'), False, 1),
('AsiaCoin', 'AC', 0x97, (0x17,'A'), (0x08,'4'), False, 1),
('Auroracoin', 'AUR', 0x97, (0x17,'A'), None, False, 1),
('BBQcoin', 'BQC', 0xd5, (0x55,'b'), None, False, 1),
('BitcoinDark', 'BTCD', 0xbc, (0x3c,'R'), (0x55,'b'), False, 1),
('BitcoinFast', 'BCF', 0xe0, (0x60,('f','g')), None, False, 0),
('BitQuark', 'BTQ', 0xba, (0x3a,'Q'), None, False, 0),
('Blackcoin', 'BLK', 0x99, (0x19,'B'), (0x55,'b'), False, 1),
('BlackmoonCrypto', 'BMC', 0x83, (0x03,'2'), None, False, 0),
('BlockCat', 'CAT', 0x95, (0x15,'9'), None, False, 0),
('CanadaECoin', 'CDN', 0x9c, (0x1c,'C'), (0x05,'3'), False, 1),
('CannabisCoin', 'CANN', 0x9c, (0x1c,'C'), None, False, 0),
('CannaCoin', 'CCN', 0x9c, (0x1c,'C'), (0x05,'3'), False, 1),
('Capricoin', 'CPC', 0x9c, (0x1c,'C'), None, False, 0),
('CashCoin', 'CASH', 0xa2, (0x22,('E','F')), None, False, 0),
('CashOut', 'CSH', 0xa2, (0x22,('E','F')), None, False, 0),
('ChainCoin', 'CHC', 0x9c, (0x1c,'C'), None, False, 0),
('Clams', 'CLAM', 0x85, (0x89,'x'), (0x0d,'6'), False, 1),
('CoinMagi', 'XMG', 0x94, (0x14,'9'), None, False, 0),
('Condensate', 'RAIN', 0xbc, (0x3c,'R'), None, False, 0),
('CryptoBullion', 'CBX', 0x8b, (0x0b,'5'), None, False, 0),
('Cryptonite', 'XCN', 0x80, (0x1c,'C'), None, False, 0),
('CryptoPennies', 'CRPS', 0xc2, (0x42,'T'), None, False, 0),
('Dash', 'DASH', 0xcc, (0x4c,'X'), (0x10,'7'), False, 1),
('Decred', 'DCR', 0x22de, (0x073f,'D'), (0x071a,'D'), False, 1),
('DeepOnion', 'ONION', 0x9f, (0x1f,'D'), None, False, 1),
('Defcoin', 'DFC', 0x9e, (0x1e,'D'), (0x05,'3'), False, 1),
('Devcoin', 'DVC', 0x80, (0x00,'1'), None, False, 1),
('DigiByte', 'DGB', 0x80, (0x1e,'D'), (0x05,'3'), False, 1),
('DigiCoin', 'DGC', 0x9e, (0x1e,'D'), (0x05,'3'), False, 1),
('DogecoinDark', 'DOGED', 0x9e, (0x1e,'D'), (0x21,'E'), False, 1),
('Dogecoin', 'DOGE', 0x9e, (0x1e,'D'), (0x16,('9','A')), False, 2),
('DopeCoin', 'DOPE', 0x88, (0x08,'4'), (0x05,'3'), False, 1),
('EGulden', 'EFL', 0xb0, (0x30,'L'), (0x05,'3'), False, 1),
('Emerald', 'EMD', 0xa2, (0x22,('E','F')), None, False, 0),
('Emercoin', 'EMC', 0x80, (0x21,'E'), (0x5c,'e'), False, 2),
('EnergyCoin', 'ENRG', 0xdc, (0x5c,'e'), None, False, 0),
('Espers', 'ESP', 0xa1, (0x21,'E'), None, False, 0),
('Faircoin', 'FAI', 0xdf, (0x5f,'f'), (0x24,'F'), False, 1),
('Fastcoin', 'FST', 0xe0, (0x60,('f','g')), None, False, 0),
('Feathercoin', 'FTC', 0x8e, (0x0e,('6','7')), (0x05,'3'), False, 2),
('Fibre', 'FIBRE', 0xa3, (0x23,'F'), None, False, 0),
('FlorinCoin', 'FLO', 0xb0, (0x23,'F'), None, False, 0),
('Fluttercoin', 'FLT', 0xa3, (0x23,'F'), None, False, 0),
('Fuel2Coin', 'FC2', 0x80, (0x24,'F'), None, False, 0),
('Fujicoin', 'FJC', 0xa4, (0x24,'F'), None, False, 0),
('Fujinto', 'NTO', 0xa4, (0x24,'F'), None, False, 0),
('GlobalBoost', 'BSTY', 0xa6, (0x26,'G'), None, False, 0),
('GlobalCurrencyReserve', 'GCR', 0x9a, (0x26,'G'), (0x61,'g'), False, 1),
('GoldenBird', 'XGB', 0xaf, (0x2f,('K','L')), None, False, 0),
('Goodcoin', 'GOOD', 0xa6, (0x26,'G'), None, False, 0),
('GridcoinResearch', 'GRC', 0xbe, (0x3e,('R','S')), None, False, 1),
('Gulden', 'NLG', 0xa6, (0x26,'G'), None, False, 1),
('Guncoin', 'GUN', 0xa7, (0x27,('G','H')), None, False, 1),
('HamRadioCoin', 'HAM', 0x80, (0x00,'1'), None, False, 1),
('HTML5Coin', 'HTML5', 0xa8, (0x28,'H'), None, False, 0),
('HyperStake', 'HYP', 0xf5, (0x75,'p'), None, False, 0),
('iCash', 'ICASH', 0xcc, (0x66,'i'), None, False, 0),
('ImperiumCoin', 'IPC', 0xb0, (0x30,'L'), None, False, 0),
('IncaKoin', 'NKA', 0xb5, (0x35,'N'), None, False, 0),
('Influxcoin', 'INFX', 0xe6, (0x66,'i'), None, False, 0),
('InPay', 'INPAY', 0xb7, (0x37,'P'), None, False, 0),
# ('iXcoin', 'IXC', 0x80, (0x8a,'x'), None, False, 1),
('Judgecoin', 'JUDGE', 0xab, (0x2b,'J'), None, False, 0),
('Jumbucks', 'JBS', 0xab, (0x2b,'J'), (0x69,'j'), False, 2),
('Lanacoin', 'LANA', 0xb0, (0x30,'L'), None, False, 0),
('Latium', 'LAT', 0x80, (0x17,'A'), None, False, 0),
('Litecoin', 'LTC', 0xb0, (0x30,'L'), (0x05,'3'), True, 3),
('LiteDoge', 'LDOGE', 0xab, (0x5a,'d'), None, False, 0),
('LomoCoin', 'LMC', 0xb0, (0x30,'L'), None, False, 0),
('Marscoin', 'MARS', 0xb2, (0x32,'M'), None, False, 0),
('MarsCoin', 'MRS', 0xb2, (0x32,'M'), None, False, 0),
('MartexCoin', 'MXT', 0xb2, (0x32,'M'), None, False, 0),
('MasterCar', 'MCAR', 0xe6, (0x17,'A'), None, False, 0),
('MazaCoin', 'MZC', 0xe0, (0x32,'M'), (0x09,('4','5')), False, 2),
('MegaCoin', 'MEC', 0xb2, (0x32,'M'), None, False, 1),
('MintCoin', 'MINT', 0xb3, (0x33,'M'), None, False, 0),
('Mobius', 'MOBI', 0x80, (0x00,'1'), None, False, 0),
('MonaCoin', 'MONA', 0xb0, (0x32,'M'), (0x05,'3'), False, 1),
('MonetaryUnit', 'MUE', 0x8f, (0x0f,'7'), (0x09,('4','5')), False, 1),
('MoonCoin', 'MOON', 0x83, (0x03,'2'), None, False, 0),
('MyriadCoin', 'MYR', 0xb2, (0x32,'M'), (0x09,('4','5')), False, 1),
('Myriadcoin', 'MYRIAD', 0xb2, (0x32,'M'), None, False, 1),
('Namecoin', 'NMC', 0xb4, (0x34,('M','N')), (0x0d,'6'), False, 1),
('Neoscoin', 'NEOS', 0xef, (0x3f,'S'), (0xbc,'2'), False, 1),
('NevaCoin', 'NEVA', 0xb1, (0x35,'N'), None, False, 0),
('Novacoin', 'NVC', 0x88, (0x08,'4'), (0x14,'9'), False, 1),
('OKCash', 'OK', 0xb7, (0x37,'P'), (0x1c,'C'), False, 1),
('Omnicoin', 'OMC', 0xf3, (0x73,'o'), None, False, 1),
('Omni', 'OMNI', 0xf3, (0x73,'o'), None, False, 0),
('Onix', 'ONX', 0x80, (0x8a,'x'), None, False, 0),
('PandaCoin', 'PND', 0xb7, (0x37,'P'), (0x16,('9','A')), False, 1),
('ParkByte', 'PKB', 0xb7, (0x37,'P'), (0x1c,'C'), False, 1),
('Particl', 'PART', 0x6c, (0x38,'P'), None, False, 0),
('Paycoin', 'CON', 0xb7, (0x37,'P'), None, False, 1),
('Peercoin', 'PPC', 0xb7, (0x37,'P'), (0x75,'p'), False, 1),
('PesetaCoin', 'PTC', 0xaf, (0x2f,('K','L')), None, False, 1),
('PhoenixCoin', 'PXC', 0xb8, (0x38,'P'), None, False, 0),
('PinkCoin', 'PINK', 0x83, (0x03,'2'), None, False, 1),
('PIVX', 'PIVX', 0xd4, (0x1e,'D'), None, False, 0),
('PokeChain', 'XPOKE', 0x9c, (0x1c,'C'), None, False, 0),
('Potcoin', 'POT', 0xb7, (0x37,'P'), (0x05,'3'), False, 1),
('Primecoin', 'XPM', 0x97, (0x17,'A'), (0x53,'a'), False, 1),
('Quark', 'QRK', 0xba, (0x3a,'Q'), None, False, 0),
('ReddCoin', 'RDD', 0xbd, (0x3d,'R'), None, False, 1),
('Riecoin', 'RIC', 0x80, (0x3c,'R'), (0x05,'3'), False, 2),
('Rimbit', 'RBT', 0xbc, (0x3c,'R'), None, False, 0),
('Rubycoin', 'RBY', 0xbd, (0x3d,'R'), (0x55,'b'), False, 1),
('ShadowCash', 'SDC', 0xbf, (0x3f,'S'), (0x7d,'s'), False, 1),
('Sibcoin', 'SIB', 0x80, (0x3f,'S'), None, False, 0),
('SixEleven', '611', 0x80, (0x34,('M','N')), None, False, 0),
('SmileyCoin', 'SMLY', 0x99, (0x19,'B'), None, False, 0),
('Songcoin', 'SONG', 0xbf, (0x3f,'S'), None, False, 0),
('Spreadcoin', 'SPR', 0xbf, (0x3f,'S'), None, False, 1),
('Startcoin', 'START', 0xfd, (0x7d,'s'), (0x05,'3'), False, 1),
('StealthCoin', 'XST', 0xbe, (0x3e,('R','S')), None, False, 0),
('SwagBucks', 'BUCKS', 0x99, (0x3f,'S'), None, False, 0),
('SysCoin', 'SYS', 0x80, (0x00,'1'), None, False, 0),
('TajCoin', 'TAJ', 0x6f, (0x41,'T'), None, False, 0),
('Templecoin', 'TPC', 0xc1, (0x41,'T'), (0x05,'3'), False, 1),
('Terracoin', 'TRC', 0x80, (0x00,'1'), None, False, 0),
('Titcoin', 'TIT', 0x80, (0x00,'1'), None, False, 0),
('TittieCoin', 'TTC', 0xc1, (0x41,'T'), None, False, 0),
('Transfer', 'TX', 0x99, (0x42,'T'), None, False, 0),
('Unobtanium', 'UNO', 0xe0, (0x82,'u'), (0x1e,'D'), False, 2),
('Vcash', 'XVC', 0xc7, (0x47,'V'), None, False, 0),
('Vertcoin', 'VTC', 0xc7, (0x47,'V'), (0x05,'3'), False, 1),
('Viacoin', 'VIA', 0xc7, (0x47,'V'), (0x21,'E'), False, 2),
('VpnCoin', 'VPN', 0xc7, (0x47,'V'), (0x05,'3'), False, 1),
('WankCoin', 'WKC', 0x80, (0x00,'1'), None, False, 1),
('WashingtonCoin', 'WASH', 0xc9, (0x49,'W'), None, False, 0),
('WeAreSatoshi', 'WSX', 0x97, (0x87,'w'), None, False, 0),
('WisdomCoin', 'WISC', 0x87, (0x49,'W'), None, False, 0),
('WorldCoin', 'WDC', 0xc9, (0x49,'W'), None, False, 1),
('XRealEstateDevcoin', 'XRED', 0x80, (0x00,'1'), None, False, 0),
('ZetaCoin', 'ZET', 0xe0, (0x50,'Z'), None, False, 0),
('ZiftrCoin', 'ZRC', 0xd0, (0x50,'Z'), (0x05,'3'), False, 1),
('ZLiteQubit', 'ZLQ', 0xe0, (0x26,'G'), None, False, 0),
('Zoomcoin', 'ZOOM', 0xe7, (0x67,'i'), (0x5c,'e'), False, 1),
ce('Bitcoin', 'BTC', 0x80, (0x00,'1'), (0x05,'3'), True, -1),
ce('BitcoinSegwit2X', 'B2X', 0x80, (0x00,'1'), (0x05,'3'), True, -1),
ce('BitcoinGold', 'BCG', 0x80, (0x00,'1'), (0x05,'3'), True, -1),
ce('Bcash', 'BCH', 0x80, (0x00,'1'), (0x05,'3'), False,-1),
ce('2GiveCoin', '2GIVE', 0xa7, (0x27,('G','H')), None, False, 0),
ce('42Coin', '42', 0x88, (0x08,'4'), None, False, 1),
ce('ACoin', 'ACOIN', 0xe6, (0x17,'A'), None, False, 0),
ce('Alphacoin', 'ALF', 0xd2, (0x52,('Z','a')), None, False, 0),
ce('Anoncoin', 'ANC', 0x97, (0x17,'A'), None, False, 1),
ce('Apexcoin', 'APEX', 0x97, (0x17,'A'), None, False, 0),
ce('Aquariuscoin', 'ARCO', 0x97, (0x17,'A'), None, False, 0),
ce('Argentum', 'ARG', 0x97, (0x17,'A'), (0x05,'3'), False, 1),
ce('AsiaCoin', 'AC', 0x97, (0x17,'A'), (0x08,'4'), False, 1),
ce('Auroracoin', 'AUR', 0x97, (0x17,'A'), None, False, 1),
ce('BBQcoin', 'BQC', 0xd5, (0x55,'b'), None, False, 1),
ce('BitcoinDark', 'BTCD', 0xbc, (0x3c,'R'), (0x55,'b'), False, 1),
ce('BitcoinFast', 'BCF', 0xe0, (0x60,('f','g')), None, False, 0),
ce('BitQuark', 'BTQ', 0xba, (0x3a,'Q'), None, False, 0),
ce('Blackcoin', 'BLK', 0x99, (0x19,'B'), (0x55,'b'), False, 1),
ce('BlackmoonCrypto', 'BMC', 0x83, (0x03,'2'), None, False, 0),
ce('BlockCat', 'CAT', 0x95, (0x15,'9'), None, False, 0),
ce('CanadaECoin', 'CDN', 0x9c, (0x1c,'C'), (0x05,'3'), False, 1),
ce('CannabisCoin', 'CANN', 0x9c, (0x1c,'C'), None, False, 0),
ce('CannaCoin', 'CCN', 0x9c, (0x1c,'C'), (0x05,'3'), False, 1),
ce('Capricoin', 'CPC', 0x9c, (0x1c,'C'), None, False, 0),
ce('CashCoin', 'CASH', 0xa2, (0x22,('E','F')), None, False, 0),
ce('CashOut', 'CSH', 0xa2, (0x22,('E','F')), None, False, 0),
ce('ChainCoin', 'CHC', 0x9c, (0x1c,'C'), None, False, 0),
ce('Clams', 'CLAM', 0x85, (0x89,'x'), (0x0d,'6'), False, 1),
ce('CoinMagi', 'XMG', 0x94, (0x14,'9'), None, False, 0),
ce('Condensate', 'RAIN', 0xbc, (0x3c,'R'), None, False, 0),
ce('CryptoBullion', 'CBX', 0x8b, (0x0b,'5'), None, False, 0),
ce('Cryptonite', 'XCN', 0x80, (0x1c,'C'), None, False, 0),
ce('CryptoPennies', 'CRPS', 0xc2, (0x42,'T'), None, False, 0),
ce('Dash', 'DASH', 0xcc, (0x4c,'X'), (0x10,'7'), False, 1),
ce('Decred', 'DCR', 0x22de, (0x073f,'D'), (0x071a,'D'), False, 1),
ce('DeepOnion', 'ONION', 0x9f, (0x1f,'D'), None, False, 1),
ce('Defcoin', 'DFC', 0x9e, (0x1e,'D'), (0x05,'3'), False, 1),
ce('Devcoin', 'DVC', 0x80, (0x00,'1'), None, False, 1),
ce('DigiByte', 'DGB', 0x80, (0x1e,'D'), (0x05,'3'), False, 1),
ce('DigiCoin', 'DGC', 0x9e, (0x1e,'D'), (0x05,'3'), False, 1),
ce('DogecoinDark', 'DOGED', 0x9e, (0x1e,'D'), (0x21,'E'), False, 1),
ce('Dogecoin', 'DOGE', 0x9e, (0x1e,'D'), (0x16,('9','A')), False, 2),
ce('DopeCoin', 'DOPE', 0x88, (0x08,'4'), (0x05,'3'), False, 1),
ce('EGulden', 'EFL', 0xb0, (0x30,'L'), (0x05,'3'), False, 1),
ce('Emerald', 'EMD', 0xa2, (0x22,('E','F')), None, False, 0),
ce('Emercoin', 'EMC', 0x80, (0x21,'E'), (0x5c,'e'), False, 2),
ce('EnergyCoin', 'ENRG', 0xdc, (0x5c,'e'), None, False, 0),
ce('Espers', 'ESP', 0xa1, (0x21,'E'), None, False, 0),
ce('Faircoin', 'FAI', 0xdf, (0x5f,'f'), (0x24,'F'), False, 1),
ce('Fastcoin', 'FST', 0xe0, (0x60,('f','g')), None, False, 0),
ce('Feathercoin', 'FTC', 0x8e, (0x0e,('6','7')), (0x05,'3'), False, 2),
ce('Fibre', 'FIBRE', 0xa3, (0x23,'F'), None, False, 0),
ce('FlorinCoin', 'FLO', 0xb0, (0x23,'F'), None, False, 0),
ce('Fluttercoin', 'FLT', 0xa3, (0x23,'F'), None, False, 0),
ce('Fuel2Coin', 'FC2', 0x80, (0x24,'F'), None, False, 0),
ce('Fujicoin', 'FJC', 0xa4, (0x24,'F'), None, False, 0),
ce('Fujinto', 'NTO', 0xa4, (0x24,'F'), None, False, 0),
ce('GlobalBoost', 'BSTY', 0xa6, (0x26,'G'), None, False, 0),
ce('GlobalCurrencyReserve', 'GCR', 0x9a, (0x26,'G'), (0x61,'g'), False, 1),
ce('GoldenBird', 'XGB', 0xaf, (0x2f,('K','L')), None, False, 0),
ce('Goodcoin', 'GOOD', 0xa6, (0x26,'G'), None, False, 0),
ce('GridcoinResearch', 'GRC', 0xbe, (0x3e,('R','S')), None, False, 1),
ce('Gulden', 'NLG', 0xa6, (0x26,'G'), None, False, 1),
ce('Guncoin', 'GUN', 0xa7, (0x27,('G','H')), None, False, 1),
ce('HamRadioCoin', 'HAM', 0x80, (0x00,'1'), None, False, 1),
ce('HTML5Coin', 'HTML5', 0xa8, (0x28,'H'), None, False, 0),
ce('HyperStake', 'HYP', 0xf5, (0x75,'p'), None, False, 0),
ce('iCash', 'ICASH', 0xcc, (0x66,'i'), None, False, 0),
ce('ImperiumCoin', 'IPC', 0xb0, (0x30,'L'), None, False, 0),
ce('IncaKoin', 'NKA', 0xb5, (0x35,'N'), None, False, 0),
ce('Influxcoin', 'INFX', 0xe6, (0x66,'i'), None, False, 0),
ce('InPay', 'INPAY', 0xb7, (0x37,'P'), None, False, 0),
# ce('iXcoin', 'IXC', 0x80, (0x8a,'x'), None, False, 1),
ce('Judgecoin', 'JUDGE', 0xab, (0x2b,'J'), None, False, 0),
ce('Jumbucks', 'JBS', 0xab, (0x2b,'J'), (0x69,'j'), False, 2),
ce('Lanacoin', 'LANA', 0xb0, (0x30,'L'), None, False, 0),
ce('Latium', 'LAT', 0x80, (0x17,'A'), None, False, 0),
ce('Litecoin', 'LTC', 0xb0, (0x30,'L'), (0x05,'3'), True, 3),
ce('LiteDoge', 'LDOGE', 0xab, (0x5a,'d'), None, False, 0),
ce('LomoCoin', 'LMC', 0xb0, (0x30,'L'), None, False, 0),
ce('Marscoin', 'MARS', 0xb2, (0x32,'M'), None, False, 0),
ce('MarsCoin', 'MRS', 0xb2, (0x32,'M'), None, False, 0),
ce('MartexCoin', 'MXT', 0xb2, (0x32,'M'), None, False, 0),
ce('MasterCar', 'MCAR', 0xe6, (0x17,'A'), None, False, 0),
ce('MazaCoin', 'MZC', 0xe0, (0x32,'M'), (0x09,('4','5')), False, 2),
ce('MegaCoin', 'MEC', 0xb2, (0x32,'M'), None, False, 1),
ce('MintCoin', 'MINT', 0xb3, (0x33,'M'), None, False, 0),
ce('Mobius', 'MOBI', 0x80, (0x00,'1'), None, False, 0),
ce('MonaCoin', 'MONA', 0xb0, (0x32,'M'), (0x05,'3'), False, 1),
ce('MonetaryUnit', 'MUE', 0x8f, (0x0f,'7'), (0x09,('4','5')), False, 1),
ce('MoonCoin', 'MOON', 0x83, (0x03,'2'), None, False, 0),
ce('MyriadCoin', 'MYR', 0xb2, (0x32,'M'), (0x09,('4','5')), False, 1),
ce('Myriadcoin', 'MYRIAD', 0xb2, (0x32,'M'), None, False, 1),
ce('Namecoin', 'NMC', 0xb4, (0x34,('M','N')), (0x0d,'6'), False, 1),
ce('Neoscoin', 'NEOS', 0xef, (0x3f,'S'), (0xbc,'2'), False, 1),
ce('NevaCoin', 'NEVA', 0xb1, (0x35,'N'), None, False, 0),
ce('Novacoin', 'NVC', 0x88, (0x08,'4'), (0x14,'9'), False, 1),
ce('OKCash', 'OK', 0xb7, (0x37,'P'), (0x1c,'C'), False, 1),
ce('Omnicoin', 'OMC', 0xf3, (0x73,'o'), None, False, 1),
ce('Omni', 'OMNI', 0xf3, (0x73,'o'), None, False, 0),
ce('Onix', 'ONX', 0x80, (0x8a,'x'), None, False, 0),
ce('PandaCoin', 'PND', 0xb7, (0x37,'P'), (0x16,('9','A')), False, 1),
ce('ParkByte', 'PKB', 0xb7, (0x37,'P'), (0x1c,'C'), False, 1),
ce('Particl', 'PART', 0x6c, (0x38,'P'), None, False, 0),
ce('Paycoin', 'CON', 0xb7, (0x37,'P'), None, False, 1),
ce('Peercoin', 'PPC', 0xb7, (0x37,'P'), (0x75,'p'), False, 1),
ce('PesetaCoin', 'PTC', 0xaf, (0x2f,('K','L')), None, False, 1),
ce('PhoenixCoin', 'PXC', 0xb8, (0x38,'P'), None, False, 0),
ce('PinkCoin', 'PINK', 0x83, (0x03,'2'), None, False, 1),
ce('PIVX', 'PIVX', 0xd4, (0x1e,'D'), None, False, 0),
ce('PokeChain', 'XPOKE', 0x9c, (0x1c,'C'), None, False, 0),
ce('Potcoin', 'POT', 0xb7, (0x37,'P'), (0x05,'3'), False, 1),
ce('Primecoin', 'XPM', 0x97, (0x17,'A'), (0x53,'a'), False, 1),
ce('Quark', 'QRK', 0xba, (0x3a,'Q'), None, False, 0),
ce('ReddCoin', 'RDD', 0xbd, (0x3d,'R'), None, False, 1),
ce('Riecoin', 'RIC', 0x80, (0x3c,'R'), (0x05,'3'), False, 2),
ce('Rimbit', 'RBT', 0xbc, (0x3c,'R'), None, False, 0),
ce('Rubycoin', 'RBY', 0xbd, (0x3d,'R'), (0x55,'b'), False, 1),
ce('ShadowCash', 'SDC', 0xbf, (0x3f,'S'), (0x7d,'s'), False, 1),
ce('Sibcoin', 'SIB', 0x80, (0x3f,'S'), None, False, 0),
ce('SixEleven', '611', 0x80, (0x34,('M','N')), None, False, 0),
ce('SmileyCoin', 'SMLY', 0x99, (0x19,'B'), None, False, 0),
ce('Songcoin', 'SONG', 0xbf, (0x3f,'S'), None, False, 0),
ce('Spreadcoin', 'SPR', 0xbf, (0x3f,'S'), None, False, 1),
ce('Startcoin', 'START', 0xfd, (0x7d,'s'), (0x05,'3'), False, 1),
ce('StealthCoin', 'XST', 0xbe, (0x3e,('R','S')), None, False, 0),
ce('SwagBucks', 'BUCKS', 0x99, (0x3f,'S'), None, False, 0),
ce('SysCoin', 'SYS', 0x80, (0x00,'1'), None, False, 0),
ce('TajCoin', 'TAJ', 0x6f, (0x41,'T'), None, False, 0),
ce('Templecoin', 'TPC', 0xc1, (0x41,'T'), (0x05,'3'), False, 1),
ce('Terracoin', 'TRC', 0x80, (0x00,'1'), None, False, 0),
ce('Titcoin', 'TIT', 0x80, (0x00,'1'), None, False, 0),
ce('TittieCoin', 'TTC', 0xc1, (0x41,'T'), None, False, 0),
ce('Transfer', 'TX', 0x99, (0x42,'T'), None, False, 0),
ce('Unobtanium', 'UNO', 0xe0, (0x82,'u'), (0x1e,'D'), False, 2),
ce('Vcash', 'XVC', 0xc7, (0x47,'V'), None, False, 0),
ce('Vertcoin', 'VTC', 0xc7, (0x47,'V'), (0x05,'3'), False, 1),
ce('Viacoin', 'VIA', 0xc7, (0x47,'V'), (0x21,'E'), False, 2),
ce('VpnCoin', 'VPN', 0xc7, (0x47,'V'), (0x05,'3'), False, 1),
ce('WankCoin', 'WKC', 0x80, (0x00,'1'), None, False, 1),
ce('WashingtonCoin', 'WASH', 0xc9, (0x49,'W'), None, False, 0),
ce('WeAreSatoshi', 'WSX', 0x97, (0x87,'w'), None, False, 0),
ce('WisdomCoin', 'WISC', 0x87, (0x49,'W'), None, False, 0),
ce('WorldCoin', 'WDC', 0xc9, (0x49,'W'), None, False, 1),
ce('XRealEstateDevcoin', 'XRED', 0x80, (0x00,'1'), None, False, 0),
ce('ZetaCoin', 'ZET', 0xe0, (0x50,'Z'), None, False, 0),
ce('ZiftrCoin', 'ZRC', 0xd0, (0x50,'Z'), (0x05,'3'), False, 1),
ce('ZLiteQubit', 'ZLQ', 0xe0, (0x26,'G'), None, False, 0),
ce('Zoomcoin', 'ZOOM', 0xe7, (0x67,'i'), (0x5c,'e'), False, 1),
)
coin_constants['testnet'] = (
('Dash', 'DASH', 0xef, (0x8c,'y'), (0x13,('8','9')), False, 1),
('Decred', 'DCR', 0x230e, (0x0f21,'T'), (0x0e6c,'S'), False, 1),
('Dogecoin', 'DOGE', 0xf1, (0x71,'n'), (0xc4,'2'), False, 2),
('Feathercoin', 'FTC', 0xc1, (0x41,'T'), (0xc4,'2'), False, 2),
('Viacoin', 'VIA', 0xff, (0x7f,'t'), (0xc4,'2'), False, 2),
('Emercoin', 'EMC', 0xef, (0x6f,('m','n')), (0xc4,'2'), False, 2),
ce('Dash', 'DASH', 0xef, (0x8c,'y'), (0x13,('8','9')), False, 1),
ce('Decred', 'DCR', 0x230e, (0x0f21,'T'), (0x0e6c,'S'), False, 1),
ce('Dogecoin', 'DOGE', 0xf1, (0x71,'n'), (0xc4,'2'), False, 2),
ce('Feathercoin', 'FTC', 0xc1, (0x41,'T'), (0xc4,'2'), False, 2),
ce('Viacoin', 'VIA', 0xff, (0x7f,'t'), (0xc4,'2'), False, 2),
ce('Emercoin', 'EMC', 0xef, (0x6f,('m','n')), (0xc4,'2'), False, 2),
)
coin_sources = (
@ -382,10 +385,10 @@ class CoinInfo(object):
'ZRC': ['lb','vg']
}
# data is one of the coin_constants lists above
# normalize ints to hex, format width, add missing leading letters, set trust level from external_tests
# Insert a coin entry from outside source, set leading letters to '?' and trust to 0, then run fix_table()
# segwit column is updated manually for now
# Data is one of the coin_constants lists above. Normalize ints to hex of correct width, add
# missing leading letters, set trust level from external_tests.
# Insert a coin entry from outside source, set version info leading letters to '?' and trust level
# to 0, then run CoinInfo.fix_table(data). 'has_segwit' field is updated manually for now.
@classmethod
def fix_table(cls,data):
import re
@ -393,20 +396,20 @@ class CoinInfo(object):
def myhex(n):
return '0x{:0{}x}'.format(n,2 if n < 256 else 4)
def fix_col(line,n):
line[n] = list(line[n])
line[n][0] = myhex(line[n][0])
s1 = cls.find_addr_leading_symbol(int(line[n][0][2:],16))
m = 'Fixing coin {} [in data: {!r}] [computed: {}]'.format(line[0],line[n][1],s1)
if line[n][1] != '?':
assert s1 == line[n][1],'First letters do not match! {}'.format(m)
def fix_ver_info(e,k):
e[k] = list(e[k])
e[k][0] = myhex(e[k][0])
s1 = cls.find_addr_leading_symbol(int(e[k][0][2:],16))
m = 'Fixing leading address letter for coin {} ({!r} --> {})'.format(e['symbol'],e[k][1],s1)
if e[k][1] != '?':
assert s1 == e[k][1],'First letters do not match! {}'.format(m)
else:
msg(m)
line[n][1] = s1
line[n] = tuple(line[n])
e[k][1] = s1
e[k] = tuple(e[k])
old_sym = None
for sym in sorted([e[1] for e in data]):
for sym in sorted([e.symbol for e in data]):
if sym == old_sym:
msg("'{}': duplicate coin symbol in data!".format(sym))
sys.exit(2)
@ -414,40 +417,40 @@ class CoinInfo(object):
tt = cls.create_trust_table()
w = max(len(e[0]) for e in data)
fs = '\t({{:{}}} {{:10}} {{:7}} {{:17}} {{:17}} {{:6}} {{}}),'.format(w+3)
for line in data:
line = list(line)
line[2] = myhex(line[2])
name_w = max(len(e.name) for e in data)
fs = '\t({:%s} {:10} {:7} {:17} {:17} {:6} {}),' % (name_w+3)
for e in data:
e = e._asdict()
e['wif_ver_num'] = myhex(e['wif_ver_num'])
sym,trust = e['symbol'],e['trust_level']
fix_col(line,3)
if type(line[4]) == tuple: fix_col(line,4)
fix_ver_info(e,'p2pkh_info')
if type(e['p2sh_info']) == tuple:
fix_ver_info(e,'p2sh_info')
sym,trust = line[1],line[6]
for n in range(len(line)):
line[n] = repr(line[n])
line[n] = re.sub(r"'0x(..)'",r'0x\1',line[n])
line[n] = re.sub(r"'0x(....)'",r'0x\1',line[n])
line[n] = re.sub(r' ',r'',line[n]) + ('',',')[n != len(line)-1]
for k in e.keys():
e[k] = repr(e[k])
e[k] = re.sub(r"'0x(..)'",r'0x\1',e[k])
e[k] = re.sub(r"'0x(....)'",r'0x\1',e[k])
e[k] = re.sub(r' ',r'',e[k]) + ('',',')[k != 'trust_level']
if trust != -1:
if sym in tt:
src = tt[sym]
if src != trust:
msg("Updating trust for coin '{}': {} -> {}".format(sym,trust,src))
line[6] = src
e['trust_level'] = src
else:
if trust != 0:
msg("Downgrading trust for coin '{}': {} -> {}".format(sym,trust,0))
line[6] = 0
e['trust_level'] = 0
if sym in cls.cross_checks:
if int(line[6]) == 0 and len(cls.cross_checks[sym]) > 1:
msg("Upgrading trust for coin '{}': {} -> {}".format(sym,line[6],1))
line[6] = 1
if int(e['trust_level']) == 0 and len(cls.cross_checks[sym]) > 1:
msg("Upgrading trust for coin '{}': {} -> {}".format(sym,e['trust_level'],1))
e['trust_level'] = 1
print(fs.format(*line))
print(fs.format(*e.values()))
msg('Processed {} entries'.format(len(data)))
@classmethod
@ -469,12 +472,12 @@ class CoinInfo(object):
@classmethod
def print_symbols(cls,include_names=False,reverse=False):
w = max(len(e[0]) for e in cls.coin_constants['mainnet'])
for line in cls.coin_constants['mainnet']:
for e in cls.coin_constants['mainnet']:
if reverse:
print('{:6} {}'.format(line[1],line[0]))
print('{:6} {}'.format(e.symbol,e.name))
else:
print(('','{:{}} '.format(line[0],w))[include_names] + line[1])
name_w = max(len(e.name) for e in cls.coin_constants['mainnet'])
print(('{:{}} '.format(e.name,name_w) if include_names else '') + e.symbol)
@classmethod
def create_trust_table(cls):

View file

@ -455,7 +455,7 @@ class CoinProtocol(MMGenObject):
def get_valid_coins(cls,upcase=False):
from mmgen.altcoin import CoinInfo as ci
ret = sorted(set(
[e[1] for e in ci.coin_constants['mainnet'] if e[6] != -1]
[e.symbol for e in ci.coin_constants['mainnet'] if e.trust_level != -1]
+ list(cls.coins.keys())))
return [getattr(e,('lower','upper')[upcase])() for e in ret]
@ -473,12 +473,12 @@ def init_genonly_altcoins(usr_coin,trust_level=None):
if usr_coin.lower() in CoinProtocol.coins:
return CoinProtocol.coins[usr_coin.lower()][2]
usr_coin = usr_coin.upper()
mn_coins = [e[1] for e in ci.coin_constants['mainnet'] if e[6] != -1]
mn_coins = [e.symbol for e in ci.coin_constants['mainnet'] if e.trust_level != -1]
if usr_coin not in mn_coins: return None
trust_level = ci.coin_constants['mainnet'][mn_coins.index(usr_coin)][6]
trust_level = ci.coin_constants['mainnet'][mn_coins.index(usr_coin)].trust_level
data = {}
for k in ('mainnet','testnet'):
data[k] = [e for e in ci.coin_constants[k] if e[6] >= trust_level]
data[k] = [e for e in ci.coin_constants[k] if e.trust_level >= trust_level]
exec(make_init_genonly_altcoins_str(data),globals(),globals())
return trust_level
@ -486,7 +486,7 @@ def make_init_genonly_altcoins_str(data):
def make_proto(e,testnet=False):
tn_str = 'Testnet' if testnet else ''
proto,coin = '{}{}Protocol'.format(e[0],tn_str),e[1]
proto,coin = '{}{}Protocol'.format(e.name,tn_str),e.symbol
if proto[0] in '0123456789': proto = 'X_'+proto
if proto in globals(): return ''
if coin.lower() in CoinProtocol.coins: return ''
@ -496,13 +496,13 @@ def make_init_genonly_altcoins_str(data):
o = ['class {}(Bitcoin{}ProtocolAddrgen):'.format(proto,tn_str)]
o += ["base_coin = '{}'".format(coin)]
o += ["name = '{}'".format(e[0].lower())]
o += ["nameCaps = '{}'".format(e[0])]
a = "addr_ver_num = {{ 'p2pkh': ({},{!r})".format(num2hexstr(e[3][0]),e[3][1])
b = ", 'p2sh': ({},{!r})".format(num2hexstr(e[4][0]),e[4][1]) if e[4] else ''
o += ["name = '{}'".format(e.name.lower())]
o += ["nameCaps = '{}'".format(e.name)]
a = "addr_ver_num = {{ 'p2pkh': ({},{!r})".format(num2hexstr(e.p2pkh_info[0]),e.p2pkh_info[1])
b = ", 'p2sh': ({},{!r})".format(num2hexstr(e.p2sh_info[0]),e.p2sh_info[1]) if e.p2sh_info else ''
o += [a+b+' }']
o += ["wif_ver_num = {{ 'std': {} }}".format(num2hexstr(e[2]))]
o += ["mmtypes = ('L','C'{})".format(",'S'" if e[5] else '')]
o += ["wif_ver_num = {{ 'std': {} }}".format(num2hexstr(e.wif_ver_num))]
o += ["mmtypes = ('L','C'{})".format(",'S'" if e.has_segwit else '')]
o += ["dfl_mmtype = '{}'".format('L')]
return '\n\t'.join(o) + '\n'
@ -512,10 +512,10 @@ def make_init_genonly_altcoins_str(data):
for e in data['testnet']:
out += make_proto(e,testnet=True)
tn_coins = [e[1] for e in data['testnet']]
tn_coins = [e.symbol for e in data['testnet']]
fs = "CoinProtocol.coins['{}'] = ({}Protocol,{})\n"
for e in data['mainnet']:
proto,coin = e[0],e[1]
proto,coin = e.name,e.symbol
if proto[0] in '0123456789': proto = 'X_'+proto
if proto+'Protocol' in globals(): continue
if coin.lower() in CoinProtocol.coins: continue