def f_read_wallet(self): addr_list = [] if os.path.isfile('./wallet.dat') is False: printL(( '[info] Creating new wallet file..this could take up to a minute' )) SEED = None # For AWS test only if os.path.isfile('./mnemonic'): with open('./mnemonic', 'r') as f: SEED = f.read() SEED = mnemonic_to_seed(SEED.strip()) addr_list.append(self.getnewaddress(4096, 'XMSS', SEED=SEED)) with open("./wallet.dat", "a" ) as myfile: # add in a new call to create random_otsmss pickle.dump(addr_list, myfile) while True: try: with open('./wallet.dat', 'r') as myfile: return pickle.load(myfile) except: printL(('Wallet.dat corrupted')) printL(('Trying to recover')) if self.recover_wallet(): continue printL(('Failed to Recover Wallet')) sys.exit()
def recover_wallet(): data = None try: with open('./wallet.info', 'r') as myfile: data = pickle.load(myfile) if data and len(data[0]) != 5: printL(('wallet.info is also corrupted, cannot recover')) return False except: printL(('Wallet.info is corrupted')) return False with open("./wallet.dat", "w+") as myfile: pass chain.my = [] for wallets in data: words = wallets[0] addr = getnewaddress(type='XMSS', SEED=mnemonic_to_seed(words)) f_append_wallet(addr, True) return True
def parse_cmd(self, data): data = data.split() args = data[1:] if len(data) != 0: if data[0] in self.cmd_list: if data[0] == 'getnewaddress': self.getnewaddress(args) return if data[0] == 'hexseed': for x in self.factory.chain.my: if type(x[1]) == list: pass else: if x[1].type == 'XMSS': self.transport.write('Address: ' + x[1].address + '\r\n') self.transport.write('Recovery seed: ' + x[1].hexSEED + '\r\n') return if data[0] == 'seed': for x in self.factory.chain.my: if type(x[1]) == list: pass else: if x[1].type == 'XMSS': self.transport.write('Address: ' + x[1].address + '\r\n') self.transport.write('Recovery seed: ' + x[1].mnemonic + '\r\n') return elif data[0] == 'search': if not args: self.transport.write( '>>> Usage: search <txhash or Q-address>' + '\r\n') return for result in self.factory.chain.search_telnet(args[0], long=0): self.transport.write(result + '\r\n') return elif data[0] == 'json_search': if not args: self.transport.write( '>>>Usage: search <txhash or Q-address>' + '\r\n') return for result in self.factory.chain.search_telnet(args[0], long=1): self.transport.write(result + '\r\n') return elif data[0] == 'json_block': if not args: # chain.json_printL(((chain.m_get_last_block()) self.transport.write( helper.json_print_telnet( self.factory.chain.m_get_last_block()) + '\r\n') return try: int(args[0]) except: self.transport.write( '>>> Try "json_block <block number>" ' + '\r\n') return if int(args[0]) > self.factory.chain.m_blockheight(): self.transport.write('>>> Block > Blockheight' + '\r\n') return self.transport.write( helper.json_print_telnet( self.factory.chain.m_get_block(int(args[0]))) + '\r\n') return elif data[0] == 'savenewaddress': self.savenewaddress() elif data[0] == 'recoverfromhexseed': if not args or not hexseed_to_seed(args[0]): self.transport.write( '>>> Usage: recoverfromhexseed <paste in hexseed>' + '\r\n') self.transport.write( '>>> Could take up to a minute..' + '\r\n') self.transport.write( '>>> savenewaddress if Qaddress matches expectations..' + '\r\n') return self.transport.write( '>>> trying.. this could take up to a minute..' + '\r\n') addr = self.factory.chain.wallet.getnewaddress( type='XMSS', SEED=hexseed_to_seed(args[0])) self.factory.newaddress = addr self.transport.write('>>> Recovery address: ' + addr[1].address + '\r\n') self.transport.write('>>> Recovery seed phrase: ' + addr[1].mnemonic + '\r\n') self.transport.write('>>> hexSEED confirm: ' + addr[1].hexSEED + '\r\n') self.transport.write( '>>> savenewaddress if Qaddress matches expectations..' + '\r\n') return elif data[0] == 'recoverfromwords': if not args: self.transport.write( '>>> Usage: recoverfromwords <paste in 32 mnemonic words>' + '\r\n') return self.transport.write( '>>> trying..this could take up to a minute..' + '\r\n') if len(args) != 32: self.transport.write( '>>> Usage: recoverfromwords <paste in 32 mnemonic words>' + '\r\n') return args = ' '.join(args) addr = self.factory.chain.wallet.getnewaddress( type='XMSS', SEED=mnemonic_to_seed(args)) self.factory.newaddress = addr self.transport.write('>>> Recovery address: ' + addr[1].address + '\r\n') self.transport.write('>>> Recovery hexSEED: ' + addr[1].hexSEED + '\r\n') self.transport.write('>>> Mnemonic confirm: ' + addr[1].mnemonic + '\r\n') self.transport.write( '>>> savenewaddress if Qaddress matches expectations..' + '\r\n') return elif data[0] == 'stake': self.transport.write( '>> Toggling stake from: ' + str(self.factory.p2pFactory.stake) + ' to: ' + str(not self.factory.p2pFactory.stake) + '\r\n') self.factory.p2pFactory.stake = not self.factory.p2pFactory.stake printL(('STAKING set to: ', self.factory.p2pFactory.stake)) return elif data[0] == 'stakenextepoch': self.transport.write( '>>> Sending a stake transaction for address: ' + self.factory.chain.mining_address + ' to activate next epoch(' + str(c.blocks_per_epoch - (self.factory.chain.m_blockchain[-1].blockheader. blocknumber - (self.factory.chain.m_blockchain[-1].blockheader. epoch * c.blocks_per_epoch))) + ' blocks time)' + '\r\n') printL(('STAKE for address:', self.factory.chain.mining_address)) self.factory.p2pFactory.send_st_to_peers( StakeTransaction().create_stake_transaction( self.factory.chain.mining_address, self.factory.chain.block_chain_buffer.height() + 1, self.factory.chain.my[0][1], balance=self.factory.chain.state.state_balance( self.factory.chain.mining_address))) return elif data[0] == 'send': self.send_tx(args) elif data[0] == 'mempool': self.transport.write( '>>> Number of transactions in memory pool: ' + str(len(self.factory.chain.transaction_pool)) + '\r\n') elif data[0] == 'help': self.transport.write( '>>> QRL ledger help: try quit, wallet, send, getnewaddress, search, recoverfromhexseed, recoverfromwords, stake, stakenextepoch, mempool, json_block, json_search, seed, hexseed, getinfo, peers, or blockheight' + '\r\n') # removed 'hrs, hrs_check,' elif data[0] == 'quit' or data[0] == 'exit': self.transport.loseConnection() elif data[0] == 'listaddresses': addresses, num_sigs, types = self.factory.chain.wallet.inspect_wallet( ) for x in range(len(addresses)): self.transport.write( str(x) + ', ' + addresses[x] + '\r\n') elif data[0] == 'wallet': self.wallet() elif data[0] == 'getinfo': self.transport.write('>>> Version: ' + self.factory.chain.version_number + '\r\n') self.transport.write('>>> Uptime: ' + str(time.time() - self.factory.start_time) + '\r\n') self.transport.write( '>>> Nodes connected: ' + str(len(self.factory.p2pFactory.peers)) + '\r\n') self.transport.write('>>> Staking set to: ' + str(self.factory.p2pFactory.stake) + '\r\n') self.transport.write( '>>> Sync status: ' + self.factory.p2pFactory.nodeState.state + '\r\n') elif data[0] == 'blockheight': self.transport.write( '>>> Blockheight: ' + str(self.factory.chain.m_blockheight()) + '\r\n') self.transport.write('>>> Headerhash: ' + self.factory.chain.m_blockchain[-1]. blockheader.headerhash + '\r\n') elif data[0] == 'peers': self.transport.write('>>> Connected Peers:\r\n') for peer in self.factory.p2pFactory.peers: self.transport.write('>>> ' + peer.identity + " [" + peer.version + "] blockheight: " + str(peer.blockheight) + '\r\n') elif data[0] == 'reboot': if len(args) < 1: self.transport.write('>>> reboot <password>\r\n') self.transport.write('>>> or\r\n') self.transport.write( '>>> reboot <password> <nonce>\r\n') self.transport.write('>>> or\r\n') self.transport.write( '>>> reboot <password> <nonce> <trim_blocknum>\r\n' ) return json_hash, err = None, None if len(args) == 3: json_hash, status = self.factory.chain.generate_reboot_hash( args[0], args[1], args[2]) self.transport.write( str(args[0]) + str(args[1]) + str(args[2])) elif len(args) == 2: json_hash, status = self.factory.chain.generate_reboot_hash( args[0], args[1]) else: json_hash, status = self.factory.chain.generate_reboot_hash( args[0]) if json_hash: self.factory.p2pFactory.send_reboot(json_hash) #self.factory.state.update('synced') self.transport.write(status) else: return False return True