From 0dab2c5d1f2c96c1384a6c5d2811c731b82d4ce0 Mon Sep 17 00:00:00 2001 From: overcat <4catcode@gmail.com> Date: Wed, 4 Aug 2021 23:01:41 +0800 Subject: [PATCH] test(python/stellar): add test cases for Stellar transactions in TransactionV1 format. --- python/tests/test_stellar.py | 1214 ++++++++++++++++++++++++++++++---- 1 file changed, 1090 insertions(+), 124 deletions(-) diff --git a/python/tests/test_stellar.py b/python/tests/test_stellar.py index 7b06ecf808..a66d88a148 100644 --- a/python/tests/test_stellar.py +++ b/python/tests/test_stellar.py @@ -31,7 +31,7 @@ def test_stellar_parse_operation_simple_v0(): base_fee = 200 source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -44,10 +44,9 @@ def test_stellar_parse_operation_simple_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start is None assert parsed_tx.timebounds_end is None @@ -69,7 +68,7 @@ def test_stellar_parse_transaction_memo_text_v0(): base_fee = 200 source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -83,10 +82,9 @@ def test_stellar_parse_transaction_memo_text_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start is None assert parsed_tx.timebounds_end is None @@ -97,45 +95,6 @@ def test_stellar_parse_transaction_memo_text_v0(): assert len(parsed_operations) == 1 -def test_stellar_parse_transaction_memo_text_displayable_v0(): - network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE - tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" - sequence = 123456 - data_name = "Trezor" - data_value = b"Hello, Stellar" - memo_text = b"\xd68\xe0\x88\xfc\xf2p\xb0\xe3\xab" # This is possible on the stellar network. - operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" - base_fee = 200 - - source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( - TransactionBuilder( - source_account=source_account, - network_passphrase=network_passphrase, - base_fee=base_fee, - v1=False, - ) - .add_text_memo(memo_text=memo_text) - .append_manage_data_op( - data_name=data_name, data_value=data_value, source=operation_source - ) - .build() - ) - - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) - assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee - assert parsed_tx.sequence_number == sequence + 1 - assert parsed_tx.timebounds_start is None - assert parsed_tx.timebounds_end is None - assert parsed_tx.memo_type == stellar.MEMO_TYPE_TEXT - assert parsed_tx.memo_text == "Unable to display the text memo" - assert parsed_tx.memo_id is None - assert parsed_tx.memo_hash is None - assert len(parsed_operations) == 1 - - def test_stellar_parse_transaction_bytes_memo_id_v0(): network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" @@ -147,7 +106,7 @@ def test_stellar_parse_transaction_bytes_memo_id_v0(): base_fee = 200 source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -161,10 +120,9 @@ def test_stellar_parse_transaction_bytes_memo_id_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start is None assert parsed_tx.timebounds_end is None @@ -186,7 +144,7 @@ def test_stellar_parse_transaction_memo_hash_v0(): base_fee = 200 source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -200,10 +158,9 @@ def test_stellar_parse_transaction_memo_hash_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start is None assert parsed_tx.timebounds_end is None @@ -225,7 +182,7 @@ def test_stellar_parse_transaction_memo_return_hash_v0(): base_fee = 200 source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -239,10 +196,9 @@ def test_stellar_parse_transaction_memo_return_hash_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start is None assert parsed_tx.timebounds_end is None @@ -265,7 +221,7 @@ def test_stellar_parse_transaction_time_bounds_v0(): base_fee = 200 source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -279,10 +235,9 @@ def test_stellar_parse_transaction_time_bounds_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start == min_time assert parsed_tx.timebounds_end == max_time @@ -308,7 +263,7 @@ def test_stellar_parse_operation_multiple_operations_v0(): operation2_source = "GBHWKBPP3O4H2BUUKSFXE4PK5WHLQYVZIZUNUJ4AU5VUZZEVBDMXISAS" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -328,10 +283,9 @@ def test_stellar_parse_operation_multiple_operations_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert parsed_tx.source_account == tx_source - assert parsed_tx.fee == tx.transaction.fee + assert parsed_tx.fee == envelope.transaction.fee assert parsed_tx.sequence_number == sequence + 1 assert parsed_tx.timebounds_start is None assert parsed_tx.timebounds_end is None @@ -362,7 +316,7 @@ def test_stellar_parse_operation_create_account_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -377,8 +331,7 @@ def test_stellar_parse_operation_create_account_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarCreateAccountOp) @@ -398,7 +351,7 @@ def test_stellar_parse_operation_payment_native_asset_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -415,8 +368,7 @@ def test_stellar_parse_operation_payment_native_asset_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarPaymentOp) @@ -439,7 +391,7 @@ def test_stellar_parse_operation_payment_alpha4_asset_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -456,8 +408,7 @@ def test_stellar_parse_operation_payment_alpha4_asset_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarPaymentOp) @@ -480,7 +431,7 @@ def test_stellar_parse_operation_payment_alpha12_asset_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -497,8 +448,7 @@ def test_stellar_parse_operation_payment_alpha12_asset_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarPaymentOp) @@ -530,7 +480,7 @@ def test_stellar_parse_operation_path_payment_strict_receive_v0(): ) source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -551,8 +501,7 @@ def test_stellar_parse_operation_path_payment_strict_receive_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] @@ -587,7 +536,7 @@ def test_stellar_parse_operation_path_payment_strict_receive_empty_path_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -608,8 +557,7 @@ def test_stellar_parse_operation_path_payment_strict_receive_empty_path_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarPathPaymentOp) @@ -636,7 +584,7 @@ def test_stellar_parse_operation_manage_sell_offer_new_offer_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -655,8 +603,7 @@ def test_stellar_parse_operation_manage_sell_offer_new_offer_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarManageOfferOp) @@ -685,7 +632,7 @@ def test_stellar_parse_operation_manage_sell_offer_update_offer_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -705,8 +652,7 @@ def test_stellar_parse_operation_manage_sell_offer_update_offer_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarManageOfferOp) @@ -734,7 +680,7 @@ def test_stellar_parse_operation_create_passive_sell_offer_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -753,8 +699,7 @@ def test_stellar_parse_operation_create_passive_sell_offer_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarCreatePassiveOfferOp) @@ -783,7 +728,7 @@ def test_stellar_parse_operation_set_options_v0(): home_domain = "example.com" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -804,8 +749,7 @@ def test_stellar_parse_operation_set_options_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarSetOptionsOp) @@ -832,7 +776,7 @@ def test_stellar_parse_operation_set_options_ed25519_signer_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -845,8 +789,7 @@ def test_stellar_parse_operation_set_options_ed25519_signer_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarSetOptionsOp) @@ -875,7 +818,7 @@ def test_stellar_parse_operation_set_options_pre_auth_tx_signer_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -888,8 +831,7 @@ def test_stellar_parse_operation_set_options_pre_auth_tx_signer_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarSetOptionsOp) @@ -918,7 +860,7 @@ def test_stellar_parse_operation_set_options_hashx_signer_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -929,8 +871,7 @@ def test_stellar_parse_operation_set_options_hashx_signer_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarSetOptionsOp) @@ -958,7 +899,7 @@ def test_stellar_parse_operation_change_trust_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -974,8 +915,7 @@ def test_stellar_parse_operation_change_trust_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarChangeTrustOp) @@ -995,7 +935,7 @@ def test_stellar_parse_operation_allow_trust_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -1011,8 +951,7 @@ def test_stellar_parse_operation_allow_trust_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarAllowTrustOp) @@ -1030,7 +969,7 @@ def test_stellar_parse_operation_account_merge_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -1041,8 +980,7 @@ def test_stellar_parse_operation_account_merge_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarAccountMergeOp) @@ -1059,7 +997,7 @@ def test_stellar_parse_operation_manage_data_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -1072,8 +1010,7 @@ def test_stellar_parse_operation_manage_data_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarManageDataOp) @@ -1091,7 +1028,7 @@ def test_stellar_parse_operation_manage_data_remove_data_entity_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -1104,8 +1041,7 @@ def test_stellar_parse_operation_manage_data_remove_data_entity_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarManageDataOp) @@ -1122,7 +1058,7 @@ def test_stellar_parse_operation_bump_sequence_v0(): operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" source_account = Account(account_id=tx_source, sequence=sequence) - tx = ( + envelope = ( TransactionBuilder( source_account=source_account, network_passphrase=network_passphrase, @@ -1133,8 +1069,1038 @@ def test_stellar_parse_operation_bump_sequence_v0(): .build() ) - tx_xdr = tx.to_xdr() - parsed_tx, parsed_operations = stellar.parse_transaction(tx_xdr, network_passphrase) + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarBumpSequenceOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.bump_to == bump_to + + +def test_stellar_parse_operation_simple_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + base_fee = 200 + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + ) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start is None + assert parsed_tx.timebounds_end is None + assert parsed_tx.memo_type == stellar.MEMO_TYPE_NONE + assert parsed_tx.memo_text is None + assert parsed_tx.memo_id is None + assert parsed_tx.memo_hash is None + assert len(parsed_operations) == 1 + + +def test_stellar_parse_transaction_memo_text_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + memo_text = b"Have a nice day!" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + base_fee = 200 + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + ) + .add_text_memo(memo_text=memo_text) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start is None + assert parsed_tx.timebounds_end is None + assert parsed_tx.memo_type == stellar.MEMO_TYPE_TEXT + assert parsed_tx.memo_text == memo_text.decode("utf-8") + assert parsed_tx.memo_id is None + assert parsed_tx.memo_hash is None + assert len(parsed_operations) == 1 + + +def test_stellar_parse_transaction_bytes_memo_id_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + memo_id = 123456789 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + base_fee = 200 + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + ) + .add_id_memo(memo_id) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start is None + assert parsed_tx.timebounds_end is None + assert parsed_tx.memo_type == stellar.MEMO_TYPE_ID + assert parsed_tx.memo_text is None + assert parsed_tx.memo_id == memo_id + assert parsed_tx.memo_hash is None + assert len(parsed_operations) == 1 + + +def test_stellar_parse_transaction_memo_hash_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + memo_hash = "b77cd735095e1b58da2d7415c1f51f423a722b34d7d5002d8896608a9130a74b" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + base_fee = 200 + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + ) + .add_hash_memo(memo_hash) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start is None + assert parsed_tx.timebounds_end is None + assert parsed_tx.memo_type == stellar.MEMO_TYPE_HASH + assert parsed_tx.memo_text is None + assert parsed_tx.memo_id is None + assert parsed_tx.memo_hash.hex() == memo_hash + assert len(parsed_operations) == 1 + + +def test_stellar_parse_transaction_memo_return_hash_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + memo_return = "b77cd735095e1b58da2d7415c1f51f423a722b34d7d5002d8896608a9130a74b" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + base_fee = 200 + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + ) + .add_return_hash_memo(memo_return) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start is None + assert parsed_tx.timebounds_end is None + assert parsed_tx.memo_type == stellar.MEMO_TYPE_RETURN + assert parsed_tx.memo_text is None + assert parsed_tx.memo_id is None + assert parsed_tx.memo_hash.hex() == memo_return + assert len(parsed_operations) == 1 + + +def test_stellar_parse_transaction_time_bounds_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + min_time = 1628089098 + max_time = 1628090000 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + base_fee = 200 + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + v1=False, + ) + .add_time_bounds(min_time=min_time, max_time=max_time) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start == min_time + assert parsed_tx.timebounds_end == max_time + assert parsed_tx.memo_type == stellar.MEMO_TYPE_NONE + assert parsed_tx.memo_text is None + assert parsed_tx.memo_id is None + assert parsed_tx.memo_hash is None + assert len(parsed_operations) == 1 + + +def test_stellar_parse_operation_multiple_operations_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + base_fee = 200 + data_name = "Trezor" + data_value = b"Hello, Stellar" + operation1_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + amount = "50.0111" + asset_code = "XLM" + asset_issuer = None + operation2_source = "GBHWKBPP3O4H2BUUKSFXE4PK5WHLQYVZIZUNUJ4AU5VUZZEVBDMXISAS" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=base_fee, + ) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation1_source + ) + .append_payment_op( + destination=destination, + amount=amount, + asset_code=asset_code, + asset_issuer=asset_issuer, + source=operation2_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert parsed_tx.source_account == tx_source + assert parsed_tx.fee == envelope.transaction.fee + assert parsed_tx.sequence_number == sequence + 1 + assert parsed_tx.timebounds_start is None + assert parsed_tx.timebounds_end is None + assert parsed_tx.memo_type == stellar.MEMO_TYPE_NONE + assert parsed_tx.memo_text is None + assert parsed_tx.memo_id is None + assert parsed_tx.memo_hash is None + assert len(parsed_operations) == 2 + assert isinstance(parsed_operations[0], messages.StellarManageDataOp) + assert parsed_operations[0].source_account == operation1_source + assert parsed_operations[0].key == data_name + assert parsed_operations[0].value == data_value + assert isinstance(parsed_operations[1], messages.StellarPaymentOp) + assert parsed_operations[1].source_account == operation2_source + assert parsed_operations[1].destination_account == destination + assert parsed_operations[1].asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operations[1].asset.code is None + assert parsed_operations[1].asset.issuer is None + assert parsed_operations[1].amount == 500111000 + + +def test_stellar_parse_operation_create_account_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + starting_balance = "100.0333" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_create_account_op( + destination=destination, + starting_balance=starting_balance, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarCreateAccountOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.new_account == destination + assert parsed_operation.starting_balance == 1000333000 + + +def test_stellar_parse_operation_payment_native_asset_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + amount = "50.0111" + asset_code = "XLM" + asset_issuer = None + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_payment_op( + destination=destination, + amount=amount, + asset_code=asset_code, + asset_issuer=asset_issuer, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarPaymentOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.destination_account == destination + assert parsed_operation.asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operation.asset.code is None + assert parsed_operation.asset.issuer is None + assert parsed_operation.amount == 500111000 + + +def test_stellar_parse_operation_payment_alpha4_asset_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + amount = "50.0111" + asset_code = "USD" + asset_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_payment_op( + destination=destination, + amount=amount, + asset_code=asset_code, + asset_issuer=asset_issuer, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarPaymentOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.destination_account == destination + assert parsed_operation.asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.asset.code == asset_code + assert parsed_operation.asset.issuer == asset_issuer + assert parsed_operation.amount == 500111000 + + +def test_stellar_parse_operation_payment_alpha12_asset_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + amount = "50.0111" + asset_code = "BANANA" + asset_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_payment_op( + destination=destination, + amount=amount, + asset_code=asset_code, + asset_issuer=asset_issuer, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarPaymentOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.destination_account == destination + assert parsed_operation.asset.type == stellar.ASSET_TYPE_ALPHA12 + assert parsed_operation.asset.code == asset_code + assert parsed_operation.asset.issuer == asset_issuer + assert parsed_operation.amount == 500111000 + + +def test_stellar_parse_operation_path_payment_strict_receive_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + send_max = "50.0111" + dest_amount = "100" + send_code = "XLM" + send_issuer = None + dest_code = "USD" + dest_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + path_asset1 = Asset( + "JPY", "GD6PV7DXQJX7AGVXFQ2MTCLTCH6LR3E6IO2EO2YDZD7F7IOZZCCB5DSQ" + ) + path_asset2 = Asset( + "BANANA", "GC7EKO37HNSKQ3V6RZ274EO7SFOWASQRHLX3OR5FIZK6UMV6LIEDXHGZ" + ) + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_path_payment_strict_receive_op( + destination=destination, + send_code=send_code, + send_issuer=send_issuer, + send_max=send_max, + dest_code=dest_code, + dest_issuer=dest_issuer, + dest_amount=dest_amount, + path=[path_asset1, path_asset2], + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + + assert isinstance(parsed_operation, messages.StellarPathPaymentOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.destination_account == destination + assert parsed_operation.send_asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operation.send_max == 500111000 + assert parsed_operation.destination_asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.destination_asset.code == dest_code + assert parsed_operation.destination_asset.issuer == dest_issuer + assert len(parsed_operation.paths) == 2 + assert parsed_operation.paths[0].type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.paths[0].code == path_asset1.code + assert parsed_operation.paths[0].issuer == path_asset1.issuer + assert parsed_operation.paths[1].type == stellar.ASSET_TYPE_ALPHA12 + assert parsed_operation.paths[1].code == path_asset2.code + assert parsed_operation.paths[1].issuer == path_asset2.issuer + + +def test_stellar_parse_operation_path_payment_strict_receive_empty_path_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + send_max = "50.0111" + dest_amount = "100" + send_code = "XLM" + send_issuer = None + dest_code = "USD" + dest_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_path_payment_strict_receive_op( + destination=destination, + send_code=send_code, + send_issuer=send_issuer, + send_max=send_max, + dest_code=dest_code, + dest_issuer=dest_issuer, + dest_amount=dest_amount, + path=[], + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarPathPaymentOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.destination_account == destination + assert parsed_operation.send_asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operation.send_max == 500111000 + assert parsed_operation.destination_asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.destination_asset.code == dest_code + assert parsed_operation.destination_asset.issuer == dest_issuer + assert len(parsed_operation.paths) == 0 + + +def test_stellar_parse_operation_manage_sell_offer_new_offer_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + price = "0.5" + amount = "50.0111" + selling_code = "XLM" + selling_issuer = None + buying_code = "USD" + buying_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_manage_sell_offer_op( + selling_code=selling_code, + selling_issuer=selling_issuer, + buying_code=buying_code, + buying_issuer=buying_issuer, + amount=amount, + price=price, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarManageOfferOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.selling_asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operation.buying_asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.buying_asset.code == buying_code + assert parsed_operation.buying_asset.issuer == buying_issuer + assert parsed_operation.amount == 500111000 + assert parsed_operation.price_n == 1 + assert parsed_operation.price_d == 2 + assert parsed_operation.offer_id == 0 # indicates a new offer + + +def test_stellar_parse_operation_manage_sell_offer_update_offer_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + price = "0.5" + amount = "50.0111" + selling_code = "XLM" + selling_issuer = None + buying_code = "USD" + buying_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + offer_id = 12345 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_manage_sell_offer_op( + selling_code=selling_code, + selling_issuer=selling_issuer, + buying_code=buying_code, + buying_issuer=buying_issuer, + amount=amount, + price=price, + offer_id=offer_id, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarManageOfferOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.selling_asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operation.buying_asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.buying_asset.code == buying_code + assert parsed_operation.buying_asset.issuer == buying_issuer + assert parsed_operation.amount == 500111000 + assert parsed_operation.price_n == 1 + assert parsed_operation.price_d == 2 + assert parsed_operation.offer_id == offer_id + + +def test_stellar_parse_operation_create_passive_sell_offer_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + price = "0.5" + amount = "50.0111" + selling_code = "XLM" + selling_issuer = None + buying_code = "USD" + buying_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_create_passive_sell_offer_op( + selling_code=selling_code, + selling_issuer=selling_issuer, + buying_code=buying_code, + buying_issuer=buying_issuer, + amount=amount, + price=price, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarCreatePassiveOfferOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.selling_asset.type == stellar.ASSET_TYPE_NATIVE + assert parsed_operation.buying_asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.buying_asset.code == buying_code + assert parsed_operation.buying_asset.issuer == buying_issuer + assert parsed_operation.amount == 500111000 + assert parsed_operation.price_n == 1 + assert parsed_operation.price_d == 2 + + +def test_stellar_parse_operation_set_options_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + inflation_dest = "GAXN7HZQTHIPW7N2HGPAXMR42LPJ5VLYXMCCOX4D3JC4CQZGID3UYUPF" + clear_flags = 1 + set_flags = 6 + master_weight = 255 + low_threshold = 10 + med_threshold = 20 + high_threshold = 30 + home_domain = "example.com" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_set_options_op( + inflation_dest=inflation_dest, + clear_flags=clear_flags, + set_flags=set_flags, + master_weight=master_weight, + low_threshold=low_threshold, + med_threshold=med_threshold, + high_threshold=high_threshold, + home_domain=home_domain, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarSetOptionsOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.inflation_destination_account == inflation_dest + assert parsed_operation.clear_flags == clear_flags + assert parsed_operation.set_flags == set_flags + assert parsed_operation.master_weight == master_weight + assert parsed_operation.low_threshold == low_threshold + assert parsed_operation.medium_threshold == med_threshold + assert parsed_operation.high_threshold == high_threshold + assert parsed_operation.home_domain == home_domain + assert parsed_operation.signer_type is None + assert parsed_operation.signer_key is None + assert parsed_operation.signer_weight is None + + +def test_stellar_parse_operation_set_options_ed25519_signer_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + signer = "GAXN7HZQTHIPW7N2HGPAXMR42LPJ5VLYXMCCOX4D3JC4CQZGID3UYUPF" + weight = 10 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_ed25519_public_key_signer( + account_id=signer, weight=weight, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarSetOptionsOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.inflation_destination_account is None + assert parsed_operation.clear_flags is None + assert parsed_operation.set_flags is None + assert parsed_operation.master_weight is None + assert parsed_operation.low_threshold is None + assert parsed_operation.medium_threshold is None + assert parsed_operation.high_threshold is None + assert parsed_operation.home_domain is None + assert parsed_operation.signer_type == 0 + assert parsed_operation.signer_key == StrKey.decode_ed25519_public_key(signer) + assert parsed_operation.signer_weight == weight + + +def test_stellar_parse_operation_set_options_pre_auth_tx_signer_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + signer = bytes.fromhex( + "2db4b22ca018119c5027a80578813ffcf582cda4aa9e31cd92b43cfa4fc5a000" + ) + weight = 30 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_pre_auth_tx_signer( + pre_auth_tx_hash=signer, weight=weight, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarSetOptionsOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.inflation_destination_account is None + assert parsed_operation.clear_flags is None + assert parsed_operation.set_flags is None + assert parsed_operation.master_weight is None + assert parsed_operation.low_threshold is None + assert parsed_operation.medium_threshold is None + assert parsed_operation.high_threshold is None + assert parsed_operation.home_domain is None + assert parsed_operation.signer_type == 1 + assert parsed_operation.signer_key == signer + assert parsed_operation.signer_weight == weight + + +def test_stellar_parse_operation_set_options_hashx_signer_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + signer = bytes.fromhex( + "3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8000" + ) + weight = 20 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_hashx_signer(sha256_hash=signer, weight=weight, source=operation_source) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarSetOptionsOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.inflation_destination_account is None + assert parsed_operation.clear_flags is None + assert parsed_operation.set_flags is None + assert parsed_operation.master_weight is None + assert parsed_operation.low_threshold is None + assert parsed_operation.medium_threshold is None + assert parsed_operation.high_threshold is None + assert parsed_operation.home_domain is None + assert parsed_operation.signer_type == 2 + assert parsed_operation.signer_key == signer + assert parsed_operation.signer_weight == weight + + +def test_stellar_parse_operation_change_trust_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + asset_code = "USD" + asset_issuer = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + limit = "1000" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_change_trust_op( + asset_code=asset_code, + asset_issuer=asset_issuer, + limit=limit, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarChangeTrustOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.asset.type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.asset.code == asset_code + assert parsed_operation.asset.issuer == asset_issuer + assert parsed_operation.limit == 10000000000 + + +def test_stellar_parse_operation_allow_trust_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + asset_code = "USD" + trustor = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_allow_trust_op( + trustor=trustor, + asset_code=asset_code, + authorize=TrustLineEntryFlag.AUTHORIZED_FLAG, + source=operation_source, + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarAllowTrustOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.asset_type == stellar.ASSET_TYPE_ALPHA4 + assert parsed_operation.asset_code == asset_code + assert parsed_operation.trusted_account == trustor + + +def test_stellar_parse_operation_account_merge_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + destination = "GDNSSYSCSSJ76FER5WEEXME5G4MTCUBKDRQSKOYP36KUKVDB2VCMERS6" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_account_merge_op(destination=destination, source=operation_source) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarAccountMergeOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.destination_account == destination + + +def test_stellar_parse_operation_manage_data_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = b"Hello, Stellar" + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarManageDataOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.key == data_name + assert parsed_operation.value == data_value + + +def test_stellar_parse_operation_manage_data_remove_data_entity_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + data_name = "Trezor" + data_value = None # remove data entity + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_manage_data_op( + data_name=data_name, data_value=data_value, source=operation_source + ) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) + assert len(parsed_operations) == 1 + parsed_operation = parsed_operations[0] + assert isinstance(parsed_operation, messages.StellarManageDataOp) + assert parsed_operation.source_account == operation_source + assert parsed_operation.key == data_name + assert parsed_operation.value is None + + +def test_stellar_parse_operation_bump_sequence_v1(): + network_passphrase = Network.TESTNET_NETWORK_PASSPHRASE + tx_source = "GCSJ7MFIIGIRMAS4R3VT5FIFIAOXNMGDI5HPYTWS5X7HH74FSJ6STSGF" + sequence = 123456 + bump_to = 143487250972278900 + operation_source = "GAEB4MRKRCONK4J7MVQXAHTNDPAECUCCCNE7YC5CKM34U3OJ673A4D6V" + + source_account = Account(account_id=tx_source, sequence=sequence) + envelope = ( + TransactionBuilder( + source_account=source_account, + network_passphrase=network_passphrase, + base_fee=100, + ) + .append_bump_sequence_op(bump_to=bump_to, source=operation_source) + .build() + ) + + parsed_tx, parsed_operations = stellar.from_envelope(envelope) assert len(parsed_operations) == 1 parsed_operation = parsed_operations[0] assert isinstance(parsed_operation, messages.StellarBumpSequenceOp)