parser.add_option("-G", "--gap", dest="gap_limit", default=None, help="gap limit")
parser.add_option("-W", "--password", dest="password", default=None, help="set password for usage with commands (currently only implemented for create command, do not use it for longrunning gui session since the password is visible in /proc)")
parser.add_option("-1", "--oneserver", action="store_true", dest="oneserver", default=False, help="connect to one server only")
+ parser.add_option("--bip32", action="store_true", dest="bip32", default=False, help="bip32")
return parser
import PyQt4.QtCore as QtCore
from electrum.i18n import _
-from electrum import Wallet, mnemonic
+from electrum import Wallet
from seed_dialog import SeedDialog
from network_dialog import NetworkDialog
from version import ELECTRUM_VERSION
from util import format_satoshis, print_msg, print_json, print_error, set_verbosity
from wallet import WalletSynchronizer, WalletStorage
-from wallet_factory import WalletFactory as Wallet
+from wallet import Wallet
from verifier import TxVerifier
from network import Network, DEFAULT_SERVERS, DEFAULT_PORTS, pick_random_server
from interface import Interface
-ELECTRUM_VERSION = "2.0" # version of the client package
+ELECTRUM_VERSION = "1.9.8" # version of the client package
PROTOCOL_VERSION = '0.9' # protocol version requested
-SEED_VERSION = 6 # bump this every time the seed generation is modified
+NEW_SEED_VERSION = 6 # bip32 wallets
+OLD_SEED_VERSION = 4 # old electrum deterministic generation
SEED_PREFIX = '01' # the hash of the mnemonic seed must begin with this
def __init__(self, config):
self.lock = threading.Lock()
+ self.config = config
self.data = {}
self.file_exists = False
self.path = self.init_path(config)
-class Wallet:
+class NewWallet:
def __init__(self, storage):
self.gap_limit_for_change = 3 # constant
# saved fields
- self.seed_version = storage.get('seed_version', SEED_VERSION)
+ self.seed_version = storage.get('seed_version', NEW_SEED_VERSION)
self.gap_limit = storage.get('gap_limit', 5)
self.use_change = storage.get('use_change',True)
if self.seed:
raise Exception("a seed exists")
+ self.seed_version = NEW_SEED_VERSION
+
if not seed:
self.seed = self.make_seed()
- self.seed_version = SEED_VERSION
return
- self.seed_version = SEED_VERSION
self.seed = unicodedata.normalize('NFC', unicode(seed.strip()))
- return
-class OldWallet(Wallet):
+class OldWallet(NewWallet):
def init_seed(self, seed):
import mnemonic
raise Exception("a seed exists")
if not seed:
- raise
+ seed = random_seed(128)
- self.seed_version = 4
+ self.seed_version = OLD_SEED_VERSION
# see if seed was entered as hex
seed = seed.strip()
self.save_accounts()
def create_watching_only_wallet(self, K0):
- self.seed_version = 4
+ self.seed_version = OLD_SEED_VERSION
self.storage.put('seed_version', self.seed_version, True)
self.create_account(K0)
assert k == 0
return 'Main account'
+
+
+
+# former WalletFactory
+class Wallet(object):
+
+ def __new__(self, storage):
+ config = storage.config
+ if config.get('bitkey', False):
+ # if user requested support for Bitkey device,
+ # import Bitkey driver
+ from wallet_bitkey import WalletBitkey
+ return WalletBitkey(config)
+
+ if not storage.file_exists:
+ seed_version = NEW_SEED_VERSION if config.get('bip32') is True else OLD_SEED_VERSION
+ else:
+ seed_version = storage.get('seed_version')
+
+ if seed_version == OLD_SEED_VERSION:
+ return OldWallet(storage)
+ elif seed_version == NEW_SEED_VERSION:
+ return NewWallet(storage)
+ else:
+ msg = "This wallet seed is not supported."
+ if seed_version in [5]:
+ msg += "\nTo open this wallet, try 'git checkout seed_v%d'"%seed_version
+ print msg
+ sys.exit(1)
+
+
+
+
+ @classmethod
+ def from_seed(self, seed, storage):
+ import mnemonic
+ if not seed:
+ return
+
+ words = seed.strip().split()
+ try:
+ mnemonic.mn_decode(words)
+ uses_electrum_words = True
+ except Exception:
+ uses_electrum_words = False
+
+ try:
+ seed.decode('hex')
+ is_hex = True
+ except Exception:
+ is_hex = False
+
+ if is_hex or (uses_electrum_words and len(words) != 13):
+ print "old style wallet", len(words), words
+ w = OldWallet(storage)
+ w.init_seed(seed) #hex
+ else:
+ #assert is_seed(seed)
+ w = Wallet(storage)
+ w.init_seed(seed)
+
+
+ return w
+++ /dev/null
-from version import SEED_VERSION
-from wallet import OldWallet, Wallet
-
-class WalletFactory(object):
- def __new__(self, storage):
-
- if storage.get('bitkey', False):
- # if user requested support for Bitkey device,
- # import Bitkey driver
- from wallet_bitkey import WalletBitkey
- return WalletBitkey(config)
-
- seed_version = storage.get('seed_version', SEED_VERSION)
- if seed_version not in [4, 6]:
- msg = "This wallet seed is not supported."
- if seed_version in [5]:
- msg += "\nTo open this wallet, try 'git checkout seed_v%d'"%seed_version
- print msg
- sys.exit(1)
-
-
- if seed_version == 4:
- return OldWallet(storage)
- else:
- return Wallet(storage)
-
-
- @classmethod
- def from_seed(self, seed, storage):
- import mnemonic
- if not seed:
- return
-
- words = seed.strip().split()
- try:
- mnemonic.mn_decode(words)
- uses_electrum_words = True
- except Exception:
- uses_electrum_words = False
-
- try:
- seed.decode('hex')
- is_hex = True
- except Exception:
- is_hex = False
-
- if is_hex or (uses_electrum_words and len(words) != 13):
- print "old style wallet", len(words), words
- w = OldWallet(storage)
- w.init_seed(seed) #hex
- else:
- #assert is_seed(seed)
- w = Wallet(storage)
- w.init_seed(seed)
-
-
- return w