From 7c4d3a1e7e6bdf6f67861176cbf98a9da5940af2 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Sun, 15 Feb 2015 11:13:02 +0100 Subject: [PATCH] Fixed issue #66 --- src/cutecoin/core/transfer.py | 43 +++++++++++++++++++------------- src/cutecoin/core/wallet.py | 35 ++++++++++++++++---------- src/cutecoin/gui/currency_tab.py | 2 +- src/cutecoin/tools/exceptions.py | 6 +---- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/cutecoin/core/transfer.py b/src/cutecoin/core/transfer.py index 4960298e..5fa37f31 100644 --- a/src/cutecoin/core/transfer.py +++ b/src/cutecoin/core/transfer.py @@ -23,23 +23,30 @@ class Transfer(object): ''' Constructor ''' + assert('receiver' in metadata) + assert('block' in metadata) + assert('time' in metadata) + assert('issuer' in metadata) + assert('amount' in metadata) + assert('comment' in metadata) + self.txdoc = txdoc self.state = state - self.metadata = metadata + self._metadata = metadata @classmethod - def initiate(cls, block, time, amount, issuer, receiver, comment): - return cls(None, Transfer.TO_SEND, {'block': block, - 'time': time, - 'amount': amount, - 'issuer': issuer, - 'receiver': receiver, - 'comment': comment}) + def initiate(cls, metadata): + return cls(None, Transfer.TO_SEND, metadata) @classmethod def create_validated(cls, txdoc, metadata): + logging.debug("VALIDATED : {0}".format(metadata)) return cls(txdoc, Transfer.VALIDATED, metadata) + @property + def metadata(self): + return self._metadata + @classmethod def load(cls, data): if data['state'] is Transfer.TO_SEND: @@ -55,7 +62,7 @@ class Transfer(object): txraw = None return {'txdoc': txraw, 'state': self.state, - 'metadata': self.metadata} + 'metadata': self._metadata} def send(self, txdoc, community): try: @@ -68,20 +75,22 @@ class Transfer(object): self.state = Transfer.REFUSED raise finally: - self.metadata['block'] = community.current_blockid()['number'] - self.metadata['time'] = community.get_block().mediantime - - def check_registered(self, tx, metadata): + self._metadata['block'] = community.current_blockid()['number'] + self._metadata['time'] = community.get_block().mediantime - logging.debug("{0} > {1} ?".format(metadata['block'], - self.metadata['block'] + 15)) + def check_registered(self, tx, block, time): + logging.debug("REGISTERED : BEFORE : {0}".format(self._metadata)) if tx.signed_raw() == self.txdoc.signed_raw(): self.state = Transfer.VALIDATED - self.metadata = metadata + self._metadata['block'] = block + self._metadata['time'] = time + logging.debug("REGISTERED : AFTER : {0}".format(self._metadata)) def check_refused(self, block): - if block > self.metadata['block'] + 15: + logging.debug("REFUSED : BEFORE : {0}".format(self._metadata)) + if block > self._metadata['block'] + 15: self.state = Transfer.REFUSED + logging.debug("REFUSED : AFTER : {0}".format(self._metadata)) def drop(self): self.state = Transfer.DROPPED diff --git a/src/cutecoin/core/wallet.py b/src/cutecoin/core/wallet.py index c3dc6b63..47c3853e 100644 --- a/src/cutecoin/core/wallet.py +++ b/src/cutecoin/core/wallet.py @@ -65,9 +65,6 @@ class Cache(): # Lets look if transactions took too long to be validated awaiting = [t for t in self._transfers if t.state == Transfer.AWAITING] - for transfer in awaiting: - transfer.check_refused(current_block) - with_tx = community.request(bma.blockchain.TX) # We parse only blocks with transactions @@ -88,13 +85,15 @@ class Cache(): except: logging.debug("Error in {0}".format(block_number)) raise - metadata = {'block': block_number, - 'time': block_doc.mediantime} for tx in block_doc.transactions: - metadata['issuer'] = tx.issuers[0] + 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] + logging.debug("RECEIVER = {0}".format(metadata['receiver'])) in_issuers = len([i for i in tx.issuers if i == self.wallet.pubkey]) > 0 @@ -109,14 +108,14 @@ class Cache(): awaiting = [t for t in self._transfers if t.state == Transfer.AWAITING] awaiting_docs = [t.txdoc.signed_raw() for t in awaiting] - logging.debug(tx.signed_raw()) - logging.debug(awaiting_docs) if tx.signed_raw() not in awaiting_docs: - transfer = Transfer.create_validated(tx, metadata) + transfer = Transfer.create_validated(tx, + metadata.copy()) self._transfers.append(transfer) else: for transfer in awaiting: - transfer.check_registered(tx, metadata) + transfer.check_registered(tx, block_number, + block_doc.mediantime) else: outputs = [o for o in tx.outputs if o.pubkey == self.wallet.pubkey] @@ -125,10 +124,13 @@ class Cache(): for o in outputs: amount += o.amount metadata['amount'] = amount - self._transfers.append(Received(tx, metadata)) + self._transfers.append(Received(tx, + metadata.copy())) if current_block > self.latest_block: self.available_sources = self.wallet.sources(community) + for transfer in awaiting: + transfer.check_refused(current_block) except NoPeerAvailable: return @@ -253,8 +255,15 @@ class Wallet(object): key = SigningKey("{0}{1}".format(salt, self.walletid), password) logging.debug("Sender pubkey:{0}".format(key.pubkey)) - transfer = Transfer.initiate(block_number, time, amount, - key.pubkey, recipient, message) + metadata = {'block': block_number, + 'time': time, + 'amount': amount, + 'issuer': key.pubkey, + 'receiver': recipient, + 'comment': message + } + transfer = Transfer.initiate(metadata) + self.caches[community.currency]._transfers.append(transfer) result = self.tx_inputs(int(amount), community) diff --git a/src/cutecoin/gui/currency_tab.py b/src/cutecoin/gui/currency_tab.py index 7d3546b3..6e719290 100644 --- a/src/cutecoin/gui/currency_tab.py +++ b/src/cutecoin/gui/currency_tab.py @@ -176,7 +176,7 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): join_date = self.community.get_block(join_block).mediantime parameters = self.community.get_parameters() expiration_date = join_date + parameters['sigValidity'] - current_time = QDateTime().currentDateTime() + current_time = QDateTime().currentDateTime().toTime_t() sig_validity = self.community.get_parameters()['sigValidity'] warning_expiration_time = int(sig_validity / 3) will_expire_soon = (current_time > expiration_date*1000 - warning_expiration_time*1000) diff --git a/src/cutecoin/tools/exceptions.py b/src/cutecoin/tools/exceptions.py index 6813277f..d063899b 100644 --- a/src/cutecoin/tools/exceptions.py +++ b/src/cutecoin/tools/exceptions.py @@ -43,11 +43,7 @@ class PersonNotFoundError(Error): Constructor ''' super() .__init__( - "Person looked by " + - value + - " in " + - community + - " not found ") + "Person looked by {0} in {1} not found ".format(value, community)) class MembershipNotFoundError(Error): -- GitLab