From 550bac86001dd1c7bb6900bd67fb22072c574d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Tue, 14 Jan 2025 18:41:24 +0000 Subject: [PATCH 01/11] Test initial setup. --- test/python/apps/aptos.py | 7 +++++ test/python/apps/cal.py | 2 ++ test/python/test_aptos.py | 65 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 test/python/apps/aptos.py create mode 100644 test/python/test_aptos.py diff --git a/test/python/apps/aptos.py b/test/python/apps/aptos.py new file mode 100644 index 00000000..b4516c9a --- /dev/null +++ b/test/python/apps/aptos.py @@ -0,0 +1,7 @@ +from ragger.utils import create_currency_config + +APTOS_CONF = create_currency_config("APT", "Aptos") +APTOS_DERIVATION_PATH = "m/44'/607'/0'/0'/0'/0'" +APTOS_PACKED_DERIVATION_PATH = pack_derivation_path(APTOS_DERIVATION_PATH) + +MAX_APDU_LEN: int = 255 \ No newline at end of file diff --git a/test/python/apps/cal.py b/test/python/apps/cal.py index 17c20c33..50d58aea 100644 --- a/test/python/apps/cal.py +++ b/test/python/apps/cal.py @@ -22,6 +22,7 @@ from .tron import TRX_PACKED_DERIVATION_PATH, TRX_CONF from .tron import TRX_USDT_CONF, TRX_USDC_CONF, TRX_TUSD_CONF, TRX_USDD_CONF from .cardano import ADA_BYRON_PACKED_DERIVATION_PATH, ADA_SHELLEY_PACKED_DERIVATION_PATH, ADA_CONF +from .aptos import APTOS_PACKED_DERIVATION_PATH, APTOS_CONF @dataclass class CurrencyConfiguration: @@ -57,6 +58,7 @@ def get_conf_for_ticker(self, overload_signer: Optional[SigningAuthority]=None) USDD_CURRENCY_CONFIGURATION = CurrencyConfiguration(ticker="USDD", conf=TRX_USDD_CONF, packed_derivation_path=TRX_PACKED_DERIVATION_PATH) ADA_BYRON_CURRENCY_CONFIGURATION = CurrencyConfiguration(ticker="ADA", conf=ADA_CONF, packed_derivation_path=ADA_BYRON_PACKED_DERIVATION_PATH) ADA_SHELLEY_CURRENCY_CONFIGURATION = CurrencyConfiguration(ticker="ADA", conf=ADA_CONF, packed_derivation_path=ADA_SHELLEY_PACKED_DERIVATION_PATH) +APTOS_CURRENCY_CONFIGURATION = CurrencyConfiguration(ticker="APT", conf=APTOS_CONF, packed_derivation_path=APTOS_PACKED_DERIVATION_PATH) # Helper that can be called from outside if we want to generate errors easily diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py new file mode 100644 index 00000000..7d3b3a09 --- /dev/null +++ b/test/python/test_aptos.py @@ -0,0 +1,65 @@ +import pytest +import os + +from .apps.ton_application_client.ton_transaction import Transaction, SendMode, CommentPayload, Payload, JettonTransferPayload, NFTTransferPayload, CustomUnsafePayload, JettonBurnPayload, AddWhitelistPayload, SingleNominatorWithdrawPayload, ChangeValidatorPayload, TonstakersDepositPayload, JettonDAOVotePayload, ChangeDNSWalletPayload, ChangeDNSPayload, TokenBridgePaySwapPayload +from .apps.ton_application_client.ton_command_sender import BoilerplateCommandSender, Errors +from .apps.ton_application_client.ton_response_unpacker import unpack_sign_tx_response +from .apps.ton_utils import check_signature_validity + +from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES +from .apps.aptos import SW_SWAP_FAILURE, APTOS_DERIVATION_PATH +from .apps import cal as cal + +# ExchangeTestRunner implementation for Ton +class AptosTests(ExchangeTestRunner): + currency_configuration = cal.APTOS_CURRENCY_CONFIGURATION + valid_destination_1 = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" + valid_destination_2 = "EQANxfGN1EgFPawYB1fhPqebKe1Nb6FIsaiekEecJ6R-3kYF" + # valid_refund = craft_address(Bounceability.NON_BOUNCEABLE, WorkchainID.BASE_CHAIN, DEVICE_PUBLIC_KEY).decode('utf-8') + valid_refund = "UQDWey_FGPhd3phmerdVXi-zUIujfyO4-29y_VT1yD0meY1n" + valid_send_amount_1 = 12345670000 + valid_send_amount_2 = 446739662 + valid_fees_1 = 100000000 + valid_fees_2 = 10000123 + fake_refund = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" + fake_payout = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" + wrong_method_error_code = SW_SWAP_FAILURE + wrong_destination_error_code = SW_SWAP_FAILURE + wrong_amount_error_code = SW_SWAP_FAILURE + + def perform_final_tx(self, destination, send_amount, fees, memo): + # Use the app interface instead of raw interface + client = BoilerplateCommandSender(self.backend) + + # First we need to get the public key of the device in order to build the transaction + pubkey = client.get_public_key(path=APTOS_DERIVATION_PATH).data + + # Create the transaction that will be sent to the device for signing + tx = Transaction(Address(destination), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, send_amount) + tx_bytes = tx.to_request_bytes() + + # Send the sign device instruction. + # As it requires on-screen validation, the function is asynchronous. + # It will yield the result when the navigation is done + with client.sign_tx(path=APTOS_DERIVATION_PATH, transaction=tx_bytes): + pass + + # The device as yielded the result, parse it and ensure that the signature is correct + response = client.get_async_response().data + sig, hash_b = unpack_sign_tx_response(response) + assert hash_b == tx.transfer_cell().bytes_hash() + assert check_signature_validity(pubkey, sig, hash_b) + + +# Use a class to reuse the same Speculos instance +class TestsAptos: + + @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) + def test_ton(self, backend, exchange_navigation_helper, test_to_run): + if backend.firmware.device == "nanos": + pytest.skip("Polkadot swap is not supported on NanoS device") + AptosTests(backend, exchange_navigation_helper).run_test(test_to_run) + + # @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) + # def test_ton_usdt(self, backend, exchange_navigation_helper, test_to_run): + # TonUSDTTests(backend, exchange_navigation_helper).run_test(test_to_run) From 9f371212d9d346ef8595240e9da01a8ebd25a43f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Tue, 14 Jan 2025 18:52:24 +0000 Subject: [PATCH 02/11] Fixing configs. --- test/python/conftest.py | 1 + test/python/test_aptos.py | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/test/python/conftest.py b/test/python/conftest.py index 5578ce14..e42beaee 100644 --- a/test/python/conftest.py +++ b/test/python/conftest.py @@ -12,6 +12,7 @@ # Please refer to ragger/conftest/configuration.py for their descriptions and accepted values configuration.OPTIONAL.SIDELOADED_APPS = { + "aptos": "Aptos", "bitcoin": "Bitcoin", "bitcoin_legacy": "Bitcoin Legacy", "ethereum": "Ethereum", diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py index 7d3b3a09..a420fb2c 100644 --- a/test/python/test_aptos.py +++ b/test/python/test_aptos.py @@ -1,11 +1,5 @@ import pytest import os - -from .apps.ton_application_client.ton_transaction import Transaction, SendMode, CommentPayload, Payload, JettonTransferPayload, NFTTransferPayload, CustomUnsafePayload, JettonBurnPayload, AddWhitelistPayload, SingleNominatorWithdrawPayload, ChangeValidatorPayload, TonstakersDepositPayload, JettonDAOVotePayload, ChangeDNSWalletPayload, ChangeDNSPayload, TokenBridgePaySwapPayload -from .apps.ton_application_client.ton_command_sender import BoilerplateCommandSender, Errors -from .apps.ton_application_client.ton_response_unpacker import unpack_sign_tx_response -from .apps.ton_utils import check_signature_validity - from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES from .apps.aptos import SW_SWAP_FAILURE, APTOS_DERIVATION_PATH from .apps import cal as cal From 026b0a5ff1870d9788bd056c6bfa91d335717edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Wed, 15 Jan 2025 16:42:08 +0000 Subject: [PATCH 03/11] Fixing import isssues. --- test/python/apps/aptos.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/python/apps/aptos.py b/test/python/apps/aptos.py index b4516c9a..92715e23 100644 --- a/test/python/apps/aptos.py +++ b/test/python/apps/aptos.py @@ -1,4 +1,5 @@ from ragger.utils import create_currency_config +from ragger.bip import pack_derivation_path APTOS_CONF = create_currency_config("APT", "Aptos") APTOS_DERIVATION_PATH = "m/44'/607'/0'/0'/0'/0'" From 18fd2a263ba05edbc6b8e964f5d9c09f1ae02bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Thu, 16 Jan 2025 12:55:24 +0000 Subject: [PATCH 04/11] Small updates. --- test/python/apps/aptos.py | 2 +- test/python/test_aptos.py | 48 +++++---------------------------------- 2 files changed, 7 insertions(+), 43 deletions(-) diff --git a/test/python/apps/aptos.py b/test/python/apps/aptos.py index 92715e23..65f93462 100644 --- a/test/python/apps/aptos.py +++ b/test/python/apps/aptos.py @@ -2,7 +2,7 @@ from ragger.bip import pack_derivation_path APTOS_CONF = create_currency_config("APT", "Aptos") -APTOS_DERIVATION_PATH = "m/44'/607'/0'/0'/0'/0'" +APTOS_DERIVATION_PATH = "m/44'/637'/0'/0'/0'/0'" APTOS_PACKED_DERIVATION_PATH = pack_derivation_path(APTOS_DERIVATION_PATH) MAX_APDU_LEN: int = 255 \ No newline at end of file diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py index a420fb2c..7985ff5e 100644 --- a/test/python/test_aptos.py +++ b/test/python/test_aptos.py @@ -1,59 +1,23 @@ import pytest import os from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES -from .apps.aptos import SW_SWAP_FAILURE, APTOS_DERIVATION_PATH +from .apps.aptos import APTOS_DERIVATION_PATH from .apps import cal as cal # ExchangeTestRunner implementation for Ton class AptosTests(ExchangeTestRunner): - currency_configuration = cal.APTOS_CURRENCY_CONFIGURATION - valid_destination_1 = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" - valid_destination_2 = "EQANxfGN1EgFPawYB1fhPqebKe1Nb6FIsaiekEecJ6R-3kYF" - # valid_refund = craft_address(Bounceability.NON_BOUNCEABLE, WorkchainID.BASE_CHAIN, DEVICE_PUBLIC_KEY).decode('utf-8') - valid_refund = "UQDWey_FGPhd3phmerdVXi-zUIujfyO4-29y_VT1yD0meY1n" - valid_send_amount_1 = 12345670000 - valid_send_amount_2 = 446739662 - valid_fees_1 = 100000000 - valid_fees_2 = 10000123 - fake_refund = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" - fake_payout = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" - wrong_method_error_code = SW_SWAP_FAILURE - wrong_destination_error_code = SW_SWAP_FAILURE - wrong_amount_error_code = SW_SWAP_FAILURE def perform_final_tx(self, destination, send_amount, fees, memo): - # Use the app interface instead of raw interface - client = BoilerplateCommandSender(self.backend) - - # First we need to get the public key of the device in order to build the transaction - pubkey = client.get_public_key(path=APTOS_DERIVATION_PATH).data - - # Create the transaction that will be sent to the device for signing - tx = Transaction(Address(destination), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, send_amount) - tx_bytes = tx.to_request_bytes() - - # Send the sign device instruction. - # As it requires on-screen validation, the function is asynchronous. - # It will yield the result when the navigation is done - with client.sign_tx(path=APTOS_DERIVATION_PATH, transaction=tx_bytes): - pass - - # The device as yielded the result, parse it and ensure that the signature is correct - response = client.get_async_response().data - sig, hash_b = unpack_sign_tx_response(response) - assert hash_b == tx.transfer_cell().bytes_hash() - assert check_signature_validity(pubkey, sig, hash_b) + assert False # Use a class to reuse the same Speculos instance class TestsAptos: @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) - def test_ton(self, backend, exchange_navigation_helper, test_to_run): - if backend.firmware.device == "nanos": - pytest.skip("Polkadot swap is not supported on NanoS device") + def test_aptos(self, backend, exchange_navigation_helper, test_to_run): AptosTests(backend, exchange_navigation_helper).run_test(test_to_run) - # @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) - # def test_ton_usdt(self, backend, exchange_navigation_helper, test_to_run): - # TonUSDTTests(backend, exchange_navigation_helper).run_test(test_to_run) + +def test_eval(): + assert False \ No newline at end of file From 5b6b645f0bcec482568826cbaec46f8307c4f6f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Thu, 16 Jan 2025 18:18:23 +0000 Subject: [PATCH 05/11] Fixed config on Aptos test. --- test/python/test_aptos.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py index 7985ff5e..868b2860 100644 --- a/test/python/test_aptos.py +++ b/test/python/test_aptos.py @@ -6,6 +6,21 @@ # ExchangeTestRunner implementation for Ton class AptosTests(ExchangeTestRunner): + currency_configuration = cal.APTOS_CURRENCY_CONFIGURATION + valid_destination_1 = "TNbtZSpknaQvC7jPCLU4znJMgm8fhuGTTY" + valid_destination_memo_1 = "" + valid_destination_2 = "TBoTZcARzWVgnNuB9SyE3S5g1RwsXoQL16" + valid_destination_memo_2 = "" + valid_refund = "TNbtZSpknaQvC7jPCLU4znJMgm8fhuGTTY" + valid_refund_memo = "" + valid_send_amount_1 = 1000000 + valid_send_amount_2 = 446739662 + valid_fees_1 = 0 + valid_fees_2 = 1 + fake_refund = "abcdabcd" + fake_refund_memo = "1" + fake_payout = "abcdabcd" + fake_payout_memo = "1" def perform_final_tx(self, destination, send_amount, fees, memo): assert False From 7ce6a95204fe2e917ade8ba89166de013c4f1f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Tue, 21 Jan 2025 10:15:50 +0000 Subject: [PATCH 06/11] Saving state. --- test/python/test_aptos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py index 868b2860..a95f5eb6 100644 --- a/test/python/test_aptos.py +++ b/test/python/test_aptos.py @@ -11,7 +11,7 @@ class AptosTests(ExchangeTestRunner): valid_destination_memo_1 = "" valid_destination_2 = "TBoTZcARzWVgnNuB9SyE3S5g1RwsXoQL16" valid_destination_memo_2 = "" - valid_refund = "TNbtZSpknaQvC7jPCLU4znJMgm8fhuGTTY" + valid_refund = "0xfa1bd3e70f8b3557c16224896943c36ec0a255efb48a44fd7e10a2b1710c925a" valid_refund_memo = "" valid_send_amount_1 = 1000000 valid_send_amount_2 = 446739662 From 093bfa3bc699f480c38d7e2f10697f9041320541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Thu, 23 Jan 2025 18:12:23 +0000 Subject: [PATCH 07/11] Updating the tests with right data. --- test/python/apps/aptos.py | 2 +- test/python/test_aptos.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/test/python/apps/aptos.py b/test/python/apps/aptos.py index 65f93462..caed9e4e 100644 --- a/test/python/apps/aptos.py +++ b/test/python/apps/aptos.py @@ -2,7 +2,7 @@ from ragger.bip import pack_derivation_path APTOS_CONF = create_currency_config("APT", "Aptos") -APTOS_DERIVATION_PATH = "m/44'/637'/0'/0'/0'/0'" +APTOS_DERIVATION_PATH = "m/44'/637'/0'" APTOS_PACKED_DERIVATION_PATH = pack_derivation_path(APTOS_DERIVATION_PATH) MAX_APDU_LEN: int = 255 \ No newline at end of file diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py index a95f5eb6..91f8a29d 100644 --- a/test/python/test_aptos.py +++ b/test/python/test_aptos.py @@ -1,7 +1,7 @@ import pytest import os + from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES -from .apps.aptos import APTOS_DERIVATION_PATH from .apps import cal as cal # ExchangeTestRunner implementation for Ton @@ -11,7 +11,7 @@ class AptosTests(ExchangeTestRunner): valid_destination_memo_1 = "" valid_destination_2 = "TBoTZcARzWVgnNuB9SyE3S5g1RwsXoQL16" valid_destination_memo_2 = "" - valid_refund = "0xfa1bd3e70f8b3557c16224896943c36ec0a255efb48a44fd7e10a2b1710c925a" + valid_refund = "0xA086916F061CACF341D97621751465C2B249DEBC02AB5E436467DE3784DE5B5F" valid_refund_memo = "" valid_send_amount_1 = 1000000 valid_send_amount_2 = 446739662 @@ -21,7 +21,6 @@ class AptosTests(ExchangeTestRunner): fake_refund_memo = "1" fake_payout = "abcdabcd" fake_payout_memo = "1" - def perform_final_tx(self, destination, send_amount, fees, memo): assert False From b7b4d735712448a106371d0b50750af98b91b3b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Fri, 24 Jan 2025 17:35:55 +0000 Subject: [PATCH 08/11] Small update. --- test/python/test_aptos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/python/test_aptos.py b/test/python/test_aptos.py index 91f8a29d..2296f558 100644 --- a/test/python/test_aptos.py +++ b/test/python/test_aptos.py @@ -11,7 +11,7 @@ class AptosTests(ExchangeTestRunner): valid_destination_memo_1 = "" valid_destination_2 = "TBoTZcARzWVgnNuB9SyE3S5g1RwsXoQL16" valid_destination_memo_2 = "" - valid_refund = "0xA086916F061CACF341D97621751465C2B249DEBC02AB5E436467DE3784DE5B5F" + valid_refund = "0x8F13F355F3AF444BD356ADEAAAF01235A7817D6A4417F5C9FA3D74A68F7B7AFD" valid_refund_memo = "" valid_send_amount_1 = 1000000 valid_send_amount_2 = 446739662 From de26bb3dc782a754199295b2c1e95888639d4a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Fri, 24 Jan 2025 17:52:00 +0000 Subject: [PATCH 09/11] Merging from develop. --- test/python/apps/cal.py | 3 - test/python/test_ton.py | 181 ++++++++++++++++++++-------------------- 2 files changed, 91 insertions(+), 93 deletions(-) diff --git a/test/python/apps/cal.py b/test/python/apps/cal.py index 5d6f7724..76af6a78 100644 --- a/test/python/apps/cal.py +++ b/test/python/apps/cal.py @@ -22,11 +22,8 @@ from .tron import TRX_PACKED_DERIVATION_PATH, TRX_CONF from .tron import TRX_USDT_CONF, TRX_USDC_CONF, TRX_TUSD_CONF, TRX_USDD_CONF from .cardano import ADA_BYRON_PACKED_DERIVATION_PATH, ADA_SHELLEY_PACKED_DERIVATION_PATH, ADA_CONF -<<<<<<< HEAD from .aptos import APTOS_PACKED_DERIVATION_PATH, APTOS_CONF -======= from .near import NEAR_PACKED_DERIVATION_PATH, NEAR_CONF ->>>>>>> develop @dataclass class CurrencyConfiguration: diff --git a/test/python/test_ton.py b/test/python/test_ton.py index 9114e406..f0eec419 100644 --- a/test/python/test_ton.py +++ b/test/python/test_ton.py @@ -1,90 +1,91 @@ -import pytest -import os - -from .apps.ton_application_client.ton_transaction import Transaction, SendMode, CommentPayload, Payload, JettonTransferPayload, NFTTransferPayload, CustomUnsafePayload, JettonBurnPayload, AddWhitelistPayload, SingleNominatorWithdrawPayload, ChangeValidatorPayload, TonstakersDepositPayload, JettonDAOVotePayload, ChangeDNSWalletPayload, ChangeDNSPayload, TokenBridgePaySwapPayload -from .apps.ton_application_client.ton_command_sender import BoilerplateCommandSender, Errors -from .apps.ton_application_client.ton_response_unpacker import unpack_sign_tx_response -from .apps.ton_utils import check_signature_validity - -from tonsdk.utils import Address - -from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES -from .apps.ton import DEVICE_PUBLIC_KEY, Bounceability, WorkchainID, craft_address, SW_SWAP_FAILURE, TON_DERIVATION_PATH -from .apps import cal as cal - -# ExchangeTestRunner implementation for Ton -class TonTests(ExchangeTestRunner): - currency_configuration = cal.TON_CURRENCY_CONFIGURATION - valid_destination_1 = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" - valid_destination_2 = "EQANxfGN1EgFPawYB1fhPqebKe1Nb6FIsaiekEecJ6R-3kYF" - # valid_refund = craft_address(Bounceability.NON_BOUNCEABLE, WorkchainID.BASE_CHAIN, DEVICE_PUBLIC_KEY).decode('utf-8') - valid_refund = "UQDWey_FGPhd3phmerdVXi-zUIujfyO4-29y_VT1yD0meY1n" - valid_send_amount_1 = 12345670000 - valid_send_amount_2 = 446739662 - valid_fees_1 = 100000000 - valid_fees_2 = 10000123 - fake_refund = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" - fake_payout = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" - wrong_method_error_code = SW_SWAP_FAILURE - wrong_destination_error_code = SW_SWAP_FAILURE - wrong_amount_error_code = SW_SWAP_FAILURE - - def perform_final_tx(self, destination, send_amount, fees, memo): - # Use the app interface instead of raw interface - client = BoilerplateCommandSender(self.backend) - - # First we need to get the public key of the device in order to build the transaction - pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data - - # Create the transaction that will be sent to the device for signing - tx = Transaction(Address(destination), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, send_amount) - tx_bytes = tx.to_request_bytes() - - # Send the sign device instruction. - # As it requires on-screen validation, the function is asynchronous. - # It will yield the result when the navigation is done - with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): - pass - - # The device as yielded the result, parse it and ensure that the signature is correct - response = client.get_async_response().data - sig, hash_b = unpack_sign_tx_response(response) - assert hash_b == tx.transfer_cell().bytes_hash() - assert check_signature_validity(pubkey, sig, hash_b) - -class TonUSDTTests(TonTests): - currency_configuration = cal.TON_CURRENCY_CONFIGURATION - def perform_final_tx(self, destination, send_amount, fees, memo): - # Use the app interface instead of raw interface - client = BoilerplateCommandSender(self.backend) - - # First we need to get the public key of the device in order to build the transaction - pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data - - payload = JettonTransferPayload(100, Address("0:" + "0" * 64), forward_amount=1) - - tx = Transaction(Address("0:" + "0" * 64), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, 100000000, payload=payload) - tx_bytes = tx.to_request_bytes() - - with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): - pass - - # The device as yielded the result, parse it and ensure that the signature is correct - response = client.get_async_response().data - sig, hash_b = unpack_sign_tx_response(response) - assert hash_b == tx.transfer_cell().bytes_hash() - assert check_signature_validity(pubkey, sig, hash_b) - - -# Use a class to reuse the same Speculos instance -class TestsTon: - - @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) - def test_ton(self, backend, exchange_navigation_helper, test_to_run): - if backend.firmware.device == "nanos": - pytest.skip("Polkadot swap is not supported on NanoS device") - TonTests(backend, exchange_navigation_helper).run_test(test_to_run) - - # @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) - # def test_ton_usdt(self, backend, exchange_navigation_helper, test_to_run): - # TonUSDTTests(backend, exchange_navigation_helper).run_test(test_to_run) +##import pytest +##import os +## +##from .apps.ton_application_client.ton_transaction import Transaction, SendMode, CommentPayload, Payload, JettonTransferPayload, NFTTransferPayload, CustomUnsafePayload, JettonBurnPayload, AddWhitelistPayload, SingleNominatorWithdrawPayload, ChangeValidatorPayload, TonstakersDepositPayload, JettonDAOVotePayload, ChangeDNSWalletPayload, ChangeDNSPayload, TokenBridgePaySwapPayload +##from .apps.ton_application_client.ton_command_sender import BoilerplateCommandSender, Errors +##from .apps.ton_application_client.ton_response_unpacker import unpack_sign_tx_response +##from .apps.ton_utils import check_signature_validity +## +##from tonsdk.utils import Address +## +##from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES +##from .apps.ton import DEVICE_PUBLIC_KEY, Bounceability, WorkchainID, craft_address, SW_SWAP_FAILURE, TON_DERIVATION_PATH +##from .apps import cal as cal +## +### ExchangeTestRunner implementation for Ton +##class TonTests(ExchangeTestRunner): +## currency_configuration = cal.TON_CURRENCY_CONFIGURATION +## valid_destination_1 = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" +## valid_destination_2 = "EQANxfGN1EgFPawYB1fhPqebKe1Nb6FIsaiekEecJ6R-3kYF" +## # valid_refund = craft_address(Bounceability.NON_BOUNCEABLE, WorkchainID.BASE_CHAIN, DEVICE_PUBLIC_KEY).decode('utf-8') +## valid_refund = "UQDWey_FGPhd3phmerdVXi-zUIujfyO4-29y_VT1yD0meY1n" +## valid_send_amount_1 = 12345670000 +## valid_send_amount_2 = 446739662 +## valid_fees_1 = 100000000 +## valid_fees_2 = 10000123 +## fake_refund = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" +## fake_payout = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" +## wrong_method_error_code = SW_SWAP_FAILURE +## wrong_destination_error_code = SW_SWAP_FAILURE +## wrong_amount_error_code = SW_SWAP_FAILURE +## +## def perform_final_tx(self, destination, send_amount, fees, memo): +## # Use the app interface instead of raw interface +## client = BoilerplateCommandSender(self.backend) +## +## # First we need to get the public key of the device in order to build the transaction +## pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data +## +## # Create the transaction that will be sent to the device for signing +## tx = Transaction(Address(destination), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, send_amount) +## tx_bytes = tx.to_request_bytes() +## +## # Send the sign device instruction. +## # As it requires on-screen validation, the function is asynchronous. +## # It will yield the result when the navigation is done +## with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): +## pass +## +## # The device as yielded the result, parse it and ensure that the signature is correct +## response = client.get_async_response().data +## sig, hash_b = unpack_sign_tx_response(response) +## assert hash_b == tx.transfer_cell().bytes_hash() +## assert check_signature_validity(pubkey, sig, hash_b) +## +##class TonUSDTTests(TonTests): +## currency_configuration = cal.TON_CURRENCY_CONFIGURATION +## def perform_final_tx(self, destination, send_amount, fees, memo): +## # Use the app interface instead of raw interface +## client = BoilerplateCommandSender(self.backend) +## +## # First we need to get the public key of the device in order to build the transaction +## pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data +## +## payload = JettonTransferPayload(100, Address("0:" + "0" * 64), forward_amount=1) +## +## tx = Transaction(Address("0:" + "0" * 64), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, 100000000, payload=payload) +## tx_bytes = tx.to_request_bytes() +## +## with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): +## pass +## +## # The device as yielded the result, parse it and ensure that the signature is correct +## response = client.get_async_response().data +## sig, hash_b = unpack_sign_tx_response(response) +## assert hash_b == tx.transfer_cell().bytes_hash() +## assert check_signature_validity(pubkey, sig, hash_b) +## +## +### Use a class to reuse the same Speculos instance +##class TestsTon: +## +## @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) +## def test_ton(self, backend, exchange_navigation_helper, test_to_run): +## if backend.firmware.device == "nanos": +## pytest.skip("Polkadot swap is not supported on NanoS device") +## TonTests(backend, exchange_navigation_helper).run_test(test_to_run) +## +## # @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) +## # def test_ton_usdt(self, backend, exchange_navigation_helper, test_to_run): +## # TonUSDTTests(backend, exchange_navigation_helper).run_test(test_to_run) +## \ No newline at end of file From 8caf799cf13b082c0a3111aa1a4998959425e3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Fri, 24 Jan 2025 17:53:37 +0000 Subject: [PATCH 10/11] Removing accident committed files. --- test/python/test_ton.py | 181 ++++++++++++++++++++-------------------- 1 file changed, 90 insertions(+), 91 deletions(-) diff --git a/test/python/test_ton.py b/test/python/test_ton.py index f0eec419..9114e406 100644 --- a/test/python/test_ton.py +++ b/test/python/test_ton.py @@ -1,91 +1,90 @@ -##import pytest -##import os -## -##from .apps.ton_application_client.ton_transaction import Transaction, SendMode, CommentPayload, Payload, JettonTransferPayload, NFTTransferPayload, CustomUnsafePayload, JettonBurnPayload, AddWhitelistPayload, SingleNominatorWithdrawPayload, ChangeValidatorPayload, TonstakersDepositPayload, JettonDAOVotePayload, ChangeDNSWalletPayload, ChangeDNSPayload, TokenBridgePaySwapPayload -##from .apps.ton_application_client.ton_command_sender import BoilerplateCommandSender, Errors -##from .apps.ton_application_client.ton_response_unpacker import unpack_sign_tx_response -##from .apps.ton_utils import check_signature_validity -## -##from tonsdk.utils import Address -## -##from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES -##from .apps.ton import DEVICE_PUBLIC_KEY, Bounceability, WorkchainID, craft_address, SW_SWAP_FAILURE, TON_DERIVATION_PATH -##from .apps import cal as cal -## -### ExchangeTestRunner implementation for Ton -##class TonTests(ExchangeTestRunner): -## currency_configuration = cal.TON_CURRENCY_CONFIGURATION -## valid_destination_1 = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" -## valid_destination_2 = "EQANxfGN1EgFPawYB1fhPqebKe1Nb6FIsaiekEecJ6R-3kYF" -## # valid_refund = craft_address(Bounceability.NON_BOUNCEABLE, WorkchainID.BASE_CHAIN, DEVICE_PUBLIC_KEY).decode('utf-8') -## valid_refund = "UQDWey_FGPhd3phmerdVXi-zUIujfyO4-29y_VT1yD0meY1n" -## valid_send_amount_1 = 12345670000 -## valid_send_amount_2 = 446739662 -## valid_fees_1 = 100000000 -## valid_fees_2 = 10000123 -## fake_refund = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" -## fake_payout = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" -## wrong_method_error_code = SW_SWAP_FAILURE -## wrong_destination_error_code = SW_SWAP_FAILURE -## wrong_amount_error_code = SW_SWAP_FAILURE -## -## def perform_final_tx(self, destination, send_amount, fees, memo): -## # Use the app interface instead of raw interface -## client = BoilerplateCommandSender(self.backend) -## -## # First we need to get the public key of the device in order to build the transaction -## pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data -## -## # Create the transaction that will be sent to the device for signing -## tx = Transaction(Address(destination), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, send_amount) -## tx_bytes = tx.to_request_bytes() -## -## # Send the sign device instruction. -## # As it requires on-screen validation, the function is asynchronous. -## # It will yield the result when the navigation is done -## with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): -## pass -## -## # The device as yielded the result, parse it and ensure that the signature is correct -## response = client.get_async_response().data -## sig, hash_b = unpack_sign_tx_response(response) -## assert hash_b == tx.transfer_cell().bytes_hash() -## assert check_signature_validity(pubkey, sig, hash_b) -## -##class TonUSDTTests(TonTests): -## currency_configuration = cal.TON_CURRENCY_CONFIGURATION -## def perform_final_tx(self, destination, send_amount, fees, memo): -## # Use the app interface instead of raw interface -## client = BoilerplateCommandSender(self.backend) -## -## # First we need to get the public key of the device in order to build the transaction -## pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data -## -## payload = JettonTransferPayload(100, Address("0:" + "0" * 64), forward_amount=1) -## -## tx = Transaction(Address("0:" + "0" * 64), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, 100000000, payload=payload) -## tx_bytes = tx.to_request_bytes() -## -## with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): -## pass -## -## # The device as yielded the result, parse it and ensure that the signature is correct -## response = client.get_async_response().data -## sig, hash_b = unpack_sign_tx_response(response) -## assert hash_b == tx.transfer_cell().bytes_hash() -## assert check_signature_validity(pubkey, sig, hash_b) -## -## -### Use a class to reuse the same Speculos instance -##class TestsTon: -## -## @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) -## def test_ton(self, backend, exchange_navigation_helper, test_to_run): -## if backend.firmware.device == "nanos": -## pytest.skip("Polkadot swap is not supported on NanoS device") -## TonTests(backend, exchange_navigation_helper).run_test(test_to_run) -## -## # @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) -## # def test_ton_usdt(self, backend, exchange_navigation_helper, test_to_run): -## # TonUSDTTests(backend, exchange_navigation_helper).run_test(test_to_run) -## \ No newline at end of file +import pytest +import os + +from .apps.ton_application_client.ton_transaction import Transaction, SendMode, CommentPayload, Payload, JettonTransferPayload, NFTTransferPayload, CustomUnsafePayload, JettonBurnPayload, AddWhitelistPayload, SingleNominatorWithdrawPayload, ChangeValidatorPayload, TonstakersDepositPayload, JettonDAOVotePayload, ChangeDNSWalletPayload, ChangeDNSPayload, TokenBridgePaySwapPayload +from .apps.ton_application_client.ton_command_sender import BoilerplateCommandSender, Errors +from .apps.ton_application_client.ton_response_unpacker import unpack_sign_tx_response +from .apps.ton_utils import check_signature_validity + +from tonsdk.utils import Address + +from .apps.exchange_test_runner import ExchangeTestRunner, ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES +from .apps.ton import DEVICE_PUBLIC_KEY, Bounceability, WorkchainID, craft_address, SW_SWAP_FAILURE, TON_DERIVATION_PATH +from .apps import cal as cal + +# ExchangeTestRunner implementation for Ton +class TonTests(ExchangeTestRunner): + currency_configuration = cal.TON_CURRENCY_CONFIGURATION + valid_destination_1 = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" + valid_destination_2 = "EQANxfGN1EgFPawYB1fhPqebKe1Nb6FIsaiekEecJ6R-3kYF" + # valid_refund = craft_address(Bounceability.NON_BOUNCEABLE, WorkchainID.BASE_CHAIN, DEVICE_PUBLIC_KEY).decode('utf-8') + valid_refund = "UQDWey_FGPhd3phmerdVXi-zUIujfyO4-29y_VT1yD0meY1n" + valid_send_amount_1 = 12345670000 + valid_send_amount_2 = 446739662 + valid_fees_1 = 100000000 + valid_fees_2 = 10000123 + fake_refund = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" + fake_payout = "EQD0sKn8DbS12U015TWOSpYmyJYYDC_7sxg1upaMxnBvTiX8" + wrong_method_error_code = SW_SWAP_FAILURE + wrong_destination_error_code = SW_SWAP_FAILURE + wrong_amount_error_code = SW_SWAP_FAILURE + + def perform_final_tx(self, destination, send_amount, fees, memo): + # Use the app interface instead of raw interface + client = BoilerplateCommandSender(self.backend) + + # First we need to get the public key of the device in order to build the transaction + pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data + + # Create the transaction that will be sent to the device for signing + tx = Transaction(Address(destination), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, send_amount) + tx_bytes = tx.to_request_bytes() + + # Send the sign device instruction. + # As it requires on-screen validation, the function is asynchronous. + # It will yield the result when the navigation is done + with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): + pass + + # The device as yielded the result, parse it and ensure that the signature is correct + response = client.get_async_response().data + sig, hash_b = unpack_sign_tx_response(response) + assert hash_b == tx.transfer_cell().bytes_hash() + assert check_signature_validity(pubkey, sig, hash_b) + +class TonUSDTTests(TonTests): + currency_configuration = cal.TON_CURRENCY_CONFIGURATION + def perform_final_tx(self, destination, send_amount, fees, memo): + # Use the app interface instead of raw interface + client = BoilerplateCommandSender(self.backend) + + # First we need to get the public key of the device in order to build the transaction + pubkey = client.get_public_key(path=TON_DERIVATION_PATH).data + + payload = JettonTransferPayload(100, Address("0:" + "0" * 64), forward_amount=1) + + tx = Transaction(Address("0:" + "0" * 64), SendMode.PAY_GAS_SEPARATLY, 0, 1686176000, True, 100000000, payload=payload) + tx_bytes = tx.to_request_bytes() + + with client.sign_tx(path=TON_DERIVATION_PATH, transaction=tx_bytes): + pass + + # The device as yielded the result, parse it and ensure that the signature is correct + response = client.get_async_response().data + sig, hash_b = unpack_sign_tx_response(response) + assert hash_b == tx.transfer_cell().bytes_hash() + assert check_signature_validity(pubkey, sig, hash_b) + + +# Use a class to reuse the same Speculos instance +class TestsTon: + + @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) + def test_ton(self, backend, exchange_navigation_helper, test_to_run): + if backend.firmware.device == "nanos": + pytest.skip("Polkadot swap is not supported on NanoS device") + TonTests(backend, exchange_navigation_helper).run_test(test_to_run) + + # @pytest.mark.parametrize('test_to_run', ALL_TESTS_EXCEPT_MEMO_THORSWAP_AND_FEES) + # def test_ton_usdt(self, backend, exchange_navigation_helper, test_to_run): + # TonUSDTTests(backend, exchange_navigation_helper).run_test(test_to_run) From d7a01a62e1b14c232ceeca1e22af5a2ac49c5350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Martins?= Date: Wed, 29 Jan 2025 18:36:44 +0000 Subject: [PATCH 11/11] Adding snapshots. --- .../test_aptos_fund_valid_1/review/00000.png | Bin 0 -> 13052 bytes .../test_aptos_fund_valid_1/review/00001.png | Bin 0 -> 13725 bytes .../test_aptos_fund_valid_1/review/00002.png | Bin 0 -> 13685 bytes .../test_aptos_swap_valid_1/review/00000.png | Bin 0 -> 12546 bytes .../test_aptos_swap_valid_1/review/00001.png | Bin 0 -> 13976 bytes .../test_aptos_swap_valid_1/review/00002.png | Bin 0 -> 13129 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/python/snapshots/flex/test_aptos_fund_valid_1/review/00000.png create mode 100644 test/python/snapshots/flex/test_aptos_fund_valid_1/review/00001.png create mode 100644 test/python/snapshots/flex/test_aptos_fund_valid_1/review/00002.png create mode 100644 test/python/snapshots/flex/test_aptos_swap_valid_1/review/00000.png create mode 100644 test/python/snapshots/flex/test_aptos_swap_valid_1/review/00001.png create mode 100644 test/python/snapshots/flex/test_aptos_swap_valid_1/review/00002.png diff --git a/test/python/snapshots/flex/test_aptos_fund_valid_1/review/00000.png b/test/python/snapshots/flex/test_aptos_fund_valid_1/review/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..21ea8a8fa3039c2978be6c16e967690c432979b1 GIT binary patch literal 13052 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 H2T%VS|A+6Z literal 0 HcmV?d00001 diff --git a/test/python/snapshots/flex/test_aptos_swap_valid_1/review/00001.png b/test/python/snapshots/flex/test_aptos_swap_valid_1/review/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbccb49af75bd740176eb7d2d468fc20c1eaa4f GIT binary patch literal 13976 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 literal 0 HcmV?d00001