diff --git a/src/sakia/gui/widgets/context_menu.py b/src/sakia/gui/widgets/context_menu.py index 084ac3c263243b44e70c33de59074572007962ec..029468bd845896f5e923bccb4fa2a6db3f435370 100644 --- a/src/sakia/gui/widgets/context_menu.py +++ b/src/sakia/gui/widgets/context_menu.py @@ -5,6 +5,7 @@ from PyQt5.QtWidgets import QMenu, QAction, QApplication, QMessageBox from duniterpy.constants import PUBKEY_REGEX from duniterpy.documents.crc_pubkey import CRCPubkey +from duniterpy.grammars.output import Condition, SIG from sakia.app import Application from sakia.data.entities import Identity, Transaction, Dividend, Connection, Source @@ -106,7 +107,7 @@ class ContextMenu(QObject): menu.qmenu.addAction(copy_selfcert) @staticmethod - def _add_transfer_actions(menu, transfer): + def _add_transfer_actions(menu, transfer: Transaction): """ :param ContextMenu menu: the qmenu to add actions to :param Transfer transfer: the transfer @@ -137,9 +138,18 @@ class ContextMenu(QObject): if transfer.conditions is not None or ( transfer.pubkey in transfer.receivers and menu._app.parameters.expert_mode ): - # get source from conditions and transaction hash + conditions = ( + transfer.conditions + if transfer.conditions + else Condition.token(SIG.token(transfer.pubkey)).compose(Condition()) + ) + # get source from transfer infos source = menu._app.sources_service.get_one( - identifier=transfer.sha_hash, conditions=transfer.conditions + currency=transfer.currency, + identifier=transfer.sha_hash, + conditions=conditions, + type=Source.TYPE_TRANSACTION, + pubkey=menu._connection.pubkey, ) if source: # add send as source menu @@ -191,7 +201,9 @@ class ContextMenu(QObject): if menu._app.parameters.expert_mode: # get dividend source from block number and type source = menu._app.sources_service.get_one( - noffset=dividend.block_number, type=Source.TYPE_DIVIDEND + noffset=dividend.block_number, + type=Source.TYPE_DIVIDEND, + pubkey=menu._connection.pubkey, ) if source: # add send as source menu diff --git a/tests/unit/data/test_transactions_from_doc.py b/tests/unit/data/test_transactions_from_doc.py new file mode 100644 index 0000000000000000000000000000000000000000..80699ae9f4d47bb0aa703474842f476364c3d540 --- /dev/null +++ b/tests/unit/data/test_transactions_from_doc.py @@ -0,0 +1,74 @@ +import json + +from sakia.data.entities.transaction import Transaction, parse_transaction_doc +from duniterpy.documents.transaction import Transaction as TransactionDoc +from duniterpy.documents.transaction import reduce_base + + +def test_parse_transaction_doc(): + + bma_response = json.loads( + """{ + "version": 10, + "locktime": 0, + "blockstamp": "310818-000002B26A7B623915E4955C633FB710D90758AA1D778B2D557518EA55B1F5FE", + "blockstampTime": 1585901723, + "issuers": [ + "EAHgNyYsxmS7YSfuQsEzEWwKnD2UyMzwVTuBnstMSk3e" + ], + "inputs": [ + "1016:0:D:EAHgNyYsxmS7YSfuQsEzEWwKnD2UyMzwVTuBnstMSk3e:310568", + "120:0:T:26DC6DD90DB2C7EE6068F307DB95D5E41DA8C56E95843FD4976F70A303D3BBF0:27", + "30060:0:T:3A1AABA9977CBCE4E25E0F0BA49539BE21AE94048C1DCDE72560BF89D5FAEFBF:1" + ], + "outputs": [ + "20000:0:SIG(7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ)", + "11196:0:SIG(EAHgNyYsxmS7YSfuQsEzEWwKnD2UyMzwVTuBnstMSk3e)" + ], + "unlocks": [ + "0:SIG(0)", + "1:SIG(0)", + "2:SIG(0)" + ], + "signatures": [ + "FPimg3/Xmb/qRIGP3ZjwV8yH/cbqb6AIgZ49lnwcQ2S9cIj1BDCdhKpDKfm3nFkLoGZUZXXkmGXSoTehtx5JDQ==" + ], + "comment": "pour le ssb de scuttlebutt dans duniterpy", + "hash": "50976B6D16DAC4FE8D255CCA9EBA9D9E508C23EE824124DF988BA9B76A4DCC98", + "time": 1585902265, + "block_number": 310820, + "received": null + } + """ + ) + txdoc = TransactionDoc.from_bma_history("testcurrency", bma_response) + + # fixme: from_bma_history() return a bad hash (from signed raw)... So why there is a good hash (without signatures) in db ? + # assert txdoc.sha_hash == "50976B6D16DAC4FE8D255CCA9EBA9D9E508C23EE824124DF988BA9B76A4DCC98" + + transaction = parse_transaction_doc( + txdoc, "7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ", 310820, 1585901723, 0 + ) + + assert transaction.currency == "testcurrency" + # assert ( + # transaction.sha_hash + # == "50976B6D16DAC4FE8D255CCA9EBA9D9E508C23EE824124DF988BA9B76A4DCC98" + # ) + assert transaction.written_block == 310820 + assert transaction.blockstamp.number == 310818 + assert ( + transaction.blockstamp.sha_hash + == "000002B26A7B623915E4955C633FB710D90758AA1D778B2D557518EA55B1F5FE" + ) + assert transaction.timestamp == 1585901723 + assert ( + transaction.signatures[0] + == "FPimg3/Xmb/qRIGP3ZjwV8yH/cbqb6AIgZ49lnwcQ2S9cIj1BDCdhKpDKfm3nFkLoGZUZXXkmGXSoTehtx5JDQ==" + ) + assert transaction.amount == 2 + assert transaction.amount_base == 4 + assert transaction.issuers[0] == "EAHgNyYsxmS7YSfuQsEzEWwKnD2UyMzwVTuBnstMSk3e" + assert transaction.receivers[0] == "7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ" + assert transaction.comment == "pour le ssb de scuttlebutt dans duniterpy" + assert transaction.txid == 0