79 lines
2.5 KiB
Python
Executable file
79 lines
2.5 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
|
|
# Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
"""
|
|
addrgen: Address generation initialization code for the MMGen suite
|
|
"""
|
|
|
|
from .keygen import KeyGenerator # convenience import
|
|
|
|
# decorator for to_addr() and to_viewkey()
|
|
def check_data(orig_func):
|
|
def f(self,data):
|
|
assert data.pubkey_type == self.pubkey_type, 'addrgen.py:check_data() pubkey_type mismatch'
|
|
assert data.compressed == self.compressed,(
|
|
f'addrgen.py:check_data() expected compressed={self.compressed} but got compressed={data.compressed}'
|
|
)
|
|
return orig_func(self,data)
|
|
return f
|
|
|
|
class addr_generator:
|
|
|
|
class base:
|
|
|
|
def __init__(self,cfg,proto,addr_type):
|
|
self.proto = proto
|
|
self.pubkey_type = addr_type.pubkey_type
|
|
self.compressed = addr_type.compressed
|
|
self.desc = f'AddrGenerator {type(self).__name__!r}'
|
|
|
|
class keccak(base):
|
|
|
|
def __init__(self,cfg,proto,addr_type):
|
|
super().__init__(cfg,proto,addr_type)
|
|
from .util2 import get_keccak
|
|
self.keccak_256 = get_keccak(cfg)
|
|
|
|
def AddrGenerator(cfg,proto,addr_type):
|
|
"""
|
|
factory function returning an address generator for the specified address type
|
|
"""
|
|
|
|
package_map = {
|
|
'legacy': 'btc',
|
|
'compressed': 'btc',
|
|
'segwit': 'btc',
|
|
'bech32': 'btc',
|
|
'monero': 'xmr',
|
|
'ethereum': 'eth',
|
|
'zcash_z': 'zec',
|
|
}
|
|
|
|
from .addr import MMGenAddrType
|
|
|
|
if type(addr_type) is str:
|
|
addr_type = MMGenAddrType(proto=proto,id_str=addr_type)
|
|
elif type(addr_type) is MMGenAddrType:
|
|
assert addr_type in proto.mmtypes, f'{addr_type}: invalid address type for coin {proto.coin}'
|
|
else:
|
|
raise TypeError(f"{type(addr_type)}: incorrect argument type for 'addr_type' arg")
|
|
|
|
import importlib
|
|
return getattr(
|
|
importlib.import_module(f'mmgen.proto.{package_map[addr_type.name]}.addrgen'),
|
|
addr_type.name )(cfg,proto,addr_type)
|