diff --git a/tests/documents/test_transaction.py b/tests/documents/test_transaction.py index 6c6fcf9453294938660489bf4c424e3ed5bcb732..cfb7166ebc7b3bcc8ba6edf0c674aa14c2017e0e 100644 --- a/tests/documents/test_transaction.py +++ b/tests/documents/test_transaction.py @@ -6,7 +6,7 @@ Created on 12 déc. 2014 import unittest import pypeg2 from ucoinpy.grammars import output -from ucoinpy.documents.transaction import Transaction, reduce_base +from ucoinpy.documents.transaction import Transaction, reduce_base, SimpleTransaction tx_compact = """TX:2:3:6:6:3:1:0 @@ -34,6 +34,15 @@ D:9WYHTavL1pmhunFCzUwiiq4pXwvgGG5ysjZnjz9H8yB:46 2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk """ +tx_compact_2 = """TX:2:1:1:1:2:0:0 +GNPdPNwSJAYw7ixkDeibo3YpdELgLmrZ2Q86HF4cyg92 +D:GNPdPNwSJAYw7ixkDeibo3YpdELgLmrZ2Q86HF4cyg92:471 +0:SIG(0) +90:0:SIG(5zDvFjJB1PGDQNiExpfzL9c1tQGs6xPA8mf1phr3VoVi) +10:0:SIG(GNPdPNwSJAYw7ixkDeibo3YpdELgLmrZ2Q86HF4cyg92) +XDQeEMcJDd+XVGaFIZc8d4kKRJgsPuWAPVNG5UKNk8mDZx2oE1kTP/hbxiFx6yDouBELCswuf/X6POK9ES7JCA== +""" + tx_raw = """Version: 2 Type: Transaction Currency: beta_brousouf @@ -132,6 +141,34 @@ class Test_Transaction(unittest.TestCase): self.assertEqual(tx.signatures[1], "2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX") self.assertEqual(tx.signatures[2], "2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk") + def test_fromcompact2(self): + tx = Transaction.from_compact("zeta_brousouf", tx_compact_2) + self.assertEqual(tx.version, 2) + self.assertEqual(tx.currency, "zeta_brousouf") + self.assertEqual(len(tx.issuers), 1) + self.assertEqual(len(tx.inputs), 1) + self.assertEqual(len(tx.unlocks), 1) + self.assertEqual(len(tx.outputs), 2) + + self.assertEqual(tx.issuers[0], "GNPdPNwSJAYw7ixkDeibo3YpdELgLmrZ2Q86HF4cyg92") + + self.assertEqual(tx.inputs[0].source, 'D') + self.assertEqual(tx.inputs[0].origin_id, "GNPdPNwSJAYw7ixkDeibo3YpdELgLmrZ2Q86HF4cyg92") + self.assertEqual(tx.inputs[0].index, 471) + + self.assertEqual(tx.unlocks[0].index, 0) + self.assertEqual(str(tx.unlocks[0].parameters[0]), "SIG(0)") + + self.assertEqual(tx.outputs[0].amount, 90) + self.assertEqual(tx.outputs[0].base, 0) + self.assertEqual(pypeg2.compose(tx.outputs[0].conditions, output.Condition), "SIG(5zDvFjJB1PGDQNiExpfzL9c1tQGs6xPA8mf1phr3VoVi)") + self.assertEqual(type(tx.outputs[0].conditions.left), output.SIG) + self.assertEqual(tx.outputs[1].amount, 10) + self.assertEqual(tx.outputs[1].base, 0) + self.assertEqual(pypeg2.compose(tx.outputs[1].conditions, output.Condition), "SIG(GNPdPNwSJAYw7ixkDeibo3YpdELgLmrZ2Q86HF4cyg92)") + self.assertEqual(type(tx.outputs[1].conditions.left), output.SIG) + self.assertEqual(tx.signatures[0], "XDQeEMcJDd+XVGaFIZc8d4kKRJgsPuWAPVNG5UKNk8mDZx2oE1kTP/hbxiFx6yDouBELCswuf/X6POK9ES7JCA==") + def test_fromraw(self): tx = Transaction.from_signed_raw(tx_raw) self.assertEqual(tx.version, 2) @@ -275,4 +312,11 @@ class Test_Transaction(unittest.TestCase): base = 4 computed = reduce_base(amount, base) self.assertEqual(computed[0], 12) - self.assertEqual(computed[1], 5) \ No newline at end of file + self.assertEqual(computed[1], 5) + + def test_is_simple(self): + tx = Transaction.from_compact("zeta_brousouf", tx_compact_2) + self.assertTrue(SimpleTransaction.is_simple(tx)) + + tx = Transaction.from_compact("zeta_brousouf", tx_compact) + self.assertFalse(SimpleTransaction.is_simple(tx)) diff --git a/ucoinpy/documents/transaction.py b/ucoinpy/documents/transaction.py index f8ccde34d840ba158c537d16774e6efa006a2f56..028ff116a2be3682d257f2d305711fc657585f74 100644 --- a/ucoinpy/documents/transaction.py +++ b/ucoinpy/documents/transaction.py @@ -290,8 +290,8 @@ COMMENT class SimpleTransaction(Transaction): """ -As transaction class, but for only one issuer. -... + As transaction class, but for only one issuer. + ... """ def __init__(self, version, currency, issuer, single_input, outputs, comment, signature): @@ -301,6 +301,32 @@ As transaction class, but for only one issuer. super().__init__(version, currency, [issuer], [single_input], outputs, comment, [signature]) + @staticmethod + def is_simple(tx): + """ + Filter a transaction and checks if it is a basic one + A simple transaction is a tx which has only one issuer + and two outputs maximum. The unlocks must be done with + simple "SIG" functions, and the outputs must be simple + SIG conditions. + :param ucoinpy.documents.Transaction tx: the transaction to check + :return: True if a simple transaction + """ + simple = True + if len(tx.issuers) != 1: + simple = False + for unlock in tx.unlocks: + if len(unlock.parameters) != 1: + simple = False + elif type(unlock.parameters[0]) is not SIGParameter: + simple = False + for o in tx.outputs: + if getattr('right', o.conditions, None): + simple = False + elif type(o.conditions.left) is not output.SIG: + simple = False + return simple + class InputSource: """