diff --git a/src/cutecoin/core/community.py b/src/cutecoin/core/community.py index 93451ef8f159969a1d0b6635d16dbc4908748635..1dedb8f8458ce2e7f9eac443fda7cd854030ba41 100644 --- a/src/cutecoin/core/community.py +++ b/src/cutecoin/core/community.py @@ -47,8 +47,6 @@ class Cache(): :return: The cache as a dict in json format ''' - #TODO: Change the requests caching because hashed keys are different - #from a cutecoin run to another data = {k: self.data[k] for k in self.data.keys() if k[0] in Cache._saved_requests} entries = [] diff --git a/src/cutecoin/core/wallet.py b/src/cutecoin/core/wallet.py index e7ef3d75cd1e417705747b06ebd91941c2d807d0..48ccfa6af1457c1c899d28169d9608fcefcd78c3 100644 --- a/src/cutecoin/core/wallet.py +++ b/src/cutecoin/core/wallet.py @@ -60,6 +60,73 @@ class Cache(): def transfers(self): return [t for t in self._transfers if t.state != Transfer.DROPPED] + def _parse_transaction(self, community, block_number, mediantime, tx): + + receivers = [o.pubkey for o in tx.outputs + if o.pubkey != tx.issuers[0]] + + metadata = {'block': block_number, + 'time': mediantime, + 'comment': tx.comment, + 'issuer': tx.issuers[0], + 'receiver': receivers[0]} + + in_issuers = len([i for i in tx.issuers + if i == self.wallet.pubkey]) > 0 + in_outputs = len([o for o in tx.outputs + if o.pubkey == self.wallet.pubkey]) > 0 + + # If the wallet pubkey is in the issuers we sent this transaction + if in_issuers: + outputs = [o for o in tx.outputs + if o.pubkey != self.wallet.pubkey] + amount = 0 + for o in outputs: + amount += o.amount + metadata['amount'] = amount + + awaiting = [t for t in self._transfers + if t.state == Transfer.AWAITING] + # We check if the transaction correspond to one we sent + if tx.signed_raw() not in [t.txdoc.signed_raw() for t in awaiting]: + transfer = Transfer.create_validated(tx, + metadata.copy()) + self._transfers.append(transfer) + # If we are not in the issuers, + # maybe it we are in the recipients of this transaction + elif in_outputs: + outputs = [o for o in tx.outputs + if o.pubkey == self.wallet.pubkey] + amount = 0 + for o in outputs: + amount += o.amount + metadata['amount'] = amount + + self._transfers.append(Received(tx, + metadata.copy())) + + def _parse_block(self, community, block_number): + block = community.request(bma.blockchain.Block, + req_args={'number': block_number}) + signed_raw = "{0}{1}\n".format(block['raw'], + block['signature']) + try: + block_doc = Block.from_signed_raw(signed_raw) + except: + logging.debug("Error in {0}".format(block_number)) + raise + for tx in block_doc.transactions: + self._parse_transaction(community, tx, block_number, block_doc.mediantime) + + awaiting = [t for t in self._transfers + if t.state == Transfer.AWAITING] + # After we checked all transactions, we check if + # sent transactions still waiting for validation + # have to be considered refused + for transfer in awaiting: + transfer.check_registered(tx, block_number, + block_doc.mediantime) + #TODO: Refactor to reduce this method size and split it to more methods def refresh(self, community): current_block = 0 @@ -82,60 +149,13 @@ class Cache(): self.wallet.refresh_progressed.emit(self.latest_block, current_block) for block_number in parsed_blocks: - block = community.request(bma.blockchain.Block, - req_args={'number': block_number}) - signed_raw = "{0}{1}\n".format(block['raw'], - block['signature']) - try: - block_doc = Block.from_signed_raw(signed_raw) - except: - logging.debug("Error in {0}".format(block_number)) - raise - for tx in block_doc.transactions: - metadata = {'block': block_number, - 'time': block_doc.mediantime, - 'comment': tx.comment, - 'issuer': tx.issuers[0]} - receivers = [o.pubkey for o in tx.outputs - if o.pubkey != metadata['issuer']] - metadata['receiver'] = receivers[0] - in_issuers = len([i for i in tx.issuers - if i == self.wallet.pubkey]) > 0 - if in_issuers: - outputs = [o for o in tx.outputs - if o.pubkey != self.wallet.pubkey] - amount = 0 - for o in outputs: - amount += o.amount - metadata['amount'] = amount - - awaiting = [t for t in self._transfers - if t.state == Transfer.AWAITING] - awaiting_docs = [t.txdoc.signed_raw() for t in awaiting] - if tx.signed_raw() not in awaiting_docs: - transfer = Transfer.create_validated(tx, - metadata.copy()) - self._transfers.append(transfer) - else: - for transfer in awaiting: - transfer.check_registered(tx, block_number, - block_doc.mediantime) - else: - outputs = [o for o in tx.outputs - if o.pubkey == self.wallet.pubkey] - if len(outputs) > 0: - amount = 0 - for o in outputs: - amount += o.amount - metadata['amount'] = amount - self._transfers.append(Received(tx, - metadata.copy())) - logging.debug("Receivers : {0}".format(self.wallet.receivers(self.wallet.refresh_progressed))) + self._parse_block(community, block_number) self.wallet.refresh_progressed.emit(current_block - block_number, current_block - self.latest_block) if current_block > self.latest_block: - self.available_sources = self.wallet.sources(community) + self.available_sources = self.wallet.sources(community) + for transfer in awaiting: transfer.check_refused(current_block)