From 22c582c3de4336fcf6f5757d6a31ab8d5b54b801 Mon Sep 17 00:00:00 2001 From: andrei-neon <169074588+andrei-neon@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:02:01 +0200 Subject: [PATCH] NDEV-3237 check accounts data (#439) * NDEV-3237 check accounts data * change_Hetzner_region --------- Co-authored-by: Sergei Bondar --- deploy/hetzner/vars.tf | 2 +- .../tests/neon_evm/test_neon_core_rest_api.py | 70 +++++++++++++------ .../tests/neon_evm/utils/neon_api_client.py | 4 +- 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/deploy/hetzner/vars.tf b/deploy/hetzner/vars.tf index 90549c2ee6..dddc3d9ad2 100644 --- a/deploy/hetzner/vars.tf +++ b/deploy/hetzner/vars.tf @@ -4,7 +4,7 @@ variable "server_type" { variable "location" { type = string - default = "nbg1" + default = "hel1" } variable "run_number" { diff --git a/integration/tests/neon_evm/test_neon_core_rest_api.py b/integration/tests/neon_evm/test_neon_core_rest_api.py index ceaaa90667..fe37b8c8a4 100644 --- a/integration/tests/neon_evm/test_neon_core_rest_api.py +++ b/integration/tests/neon_evm/test_neon_core_rest_api.py @@ -1,8 +1,13 @@ +import base58 +import pytest from eth_utils import abi, to_text from .utils.contract import deploy_contract, get_contract_bin +def decode_pubkey(pubkey): + return base58.b58encode(bytes(pubkey)).decode("utf-8") + def test_get_storage_at(neon_api_client, operator_keypair, user_account, evm_loader, treasury_pool): contract = deploy_contract(operator_keypair, user_account, "hello_world", evm_loader, treasury_pool) @@ -10,49 +15,70 @@ def test_get_storage_at(neon_api_client, operator_keypair, user_account, evm_loa zero_array = [0 for _ in range(31)] assert storage == zero_array + [5] - storage = neon_api_client.get_storage_at(contract.eth_address.hex(), index='0x2')["value"] + storage = neon_api_client.get_storage_at(contract.eth_address.hex(), index="0x2")["value"] assert storage == zero_array + [0] def test_get_balance(neon_api_client, user_account, evm_loader): - result = neon_api_client.get_balance(user_account.eth_address.hex())['value'] + result = neon_api_client.get_balance(user_account.eth_address.hex())["value"] assert str(user_account.balance_account_address) == result[0]["solana_address"] assert evm_loader.get_account_info(user_account.solana_account.pubkey()).value is not None -def test_emulate_transfer(neon_api_client, user_account, session_user): - result = neon_api_client.emulate(user_account.eth_address.hex(), - session_user.eth_address.hex()) - assert result['exit_status'] == 'succeed', f"The 'exit_status' field is not succeed. Result: {result}" - assert result['steps_executed'] == 1, f"Steps executed amount is not 1. Result: {result}" - assert result['used_gas'] > 0, f"Used gas is less than 0. Result: {result}" +@pytest.mark.parametrize("account_info", [None, "Changed", "All"]) +def test_emulate_transfer(neon_api_client, user_account, session_user, account_info): + result = neon_api_client.emulate( + user_account.eth_address.hex(), session_user.eth_address.hex(), provide_account_info=account_info + ) + assert result["exit_status"] == "succeed", f"The 'exit_status' field is not succeed. Result: {result}" + assert result["steps_executed"] == 1, f"Steps executed amount is not 1. Result: {result}" + assert result["used_gas"] > 0, f"Used gas is less than 0. Result: {result}" + assert "accounts_data" in result + + if account_info is None: + assert result["accounts_data"] is None + + if account_info in ["Changed", "All"]: + assert len(result["accounts_data"]) > 0 + assert len(result["solana_accounts"]) > 0 + + all_accounts = [str(session_user.solana_account_address), str(user_account.balance_account_address)] + writable_accounts = [str(user_account.balance_account_address)] + + actual_accounts = [decode_pubkey(account["pubkey"]) for account in result["accounts_data"]] + + if account_info == "Changed": + assert set(actual_accounts) == set(writable_accounts) + assert set(actual_accounts) != set(all_accounts) + assert set(actual_accounts).issubset(set(all_accounts)) + elif account_info == "All": + assert set(actual_accounts) == set(all_accounts) def test_emulate_contract_deploy(neon_api_client, user_account): contract_code = get_contract_bin("hello_world") - result = neon_api_client.emulate(user_account.eth_address.hex(), - contract=None, data=contract_code) - assert result['exit_status'] == 'succeed', f"The 'exit_status' field is not succeed. Result: {result}" - assert result['steps_executed'] > 100, f"Steps executed amount is wrong. Result: {result}" - assert result['used_gas'] > 0, f"Used gas is less than 0. Result: {result}" + result = neon_api_client.emulate(user_account.eth_address.hex(), contract=None, data=contract_code) + assert result["exit_status"] == "succeed", f"The 'exit_status' field is not succeed. Result: {result}" + assert result["steps_executed"] > 100, f"Steps executed amount is wrong. Result: {result}" + assert result["used_gas"] > 0, f"Used gas is less than 0. Result: {result}" def test_emulate_call_contract_function(neon_api_client, operator_keypair, treasury_pool, evm_loader, user_account): contract = deploy_contract(operator_keypair, user_account, "hello_world", evm_loader, treasury_pool) assert contract.eth_address - data = abi.function_signature_to_4byte_selector('call_hello_world()') + data = abi.function_signature_to_4byte_selector("call_hello_world()") - result = neon_api_client.emulate(user_account.eth_address.hex(), - contract=contract.eth_address.hex(), data=data) + result = neon_api_client.emulate(user_account.eth_address.hex(), contract=contract.eth_address.hex(), data=data) - assert result['exit_status'] == 'succeed', f"The 'exit_status' field is not succeed. Result: {result}" - assert result['steps_executed'] > 0, f"Steps executed amount is 0. Result: {result}" - assert result['used_gas'] > 0, f"Used gas is less than 0. Result: {result}" + assert result["exit_status"] == "succeed", f"The 'exit_status' field is not succeed. Result: {result}" + assert result["steps_executed"] > 0, f"Steps executed amount is 0. Result: {result}" + assert result["used_gas"] > 0, f"Used gas is less than 0. Result: {result}" assert "Hello World" in to_text(result["result"]) def test_emulate_with_small_amount_of_steps(neon_api_client, evm_loader, user_account): contract_code = get_contract_bin("hello_world") - result = neon_api_client.emulate(user_account.eth_address.hex(), - contract=None, data=contract_code, max_steps_to_execute=10) - assert result['exit_status'] == 'revert', f"The 'exit_status' field is not revert. Result: {result}" + result = neon_api_client.emulate( + user_account.eth_address.hex(), contract=None, data=contract_code, max_steps_to_execute=10 + ) + assert result["exit_status"] == "revert", f"The 'exit_status' field is not revert. Result: {result}" diff --git a/integration/tests/neon_evm/utils/neon_api_client.py b/integration/tests/neon_evm/utils/neon_api_client.py index b98b845c5e..c0242338af 100644 --- a/integration/tests/neon_evm/utils/neon_api_client.py +++ b/integration/tests/neon_evm/utils/neon_api_client.py @@ -11,7 +11,7 @@ def __init__(self, url): self.url = url self.headers = {"Content-Type": "application/json"} - def emulate(self, sender, contract, data=bytes(), chain_id=CHAIN_ID, value='0x0', max_steps_to_execute=500000): + def emulate(self, sender, contract, data=bytes(), chain_id=CHAIN_ID, value='0x0', max_steps_to_execute=500000, provide_account_info=None): if isinstance(data, bytes): data = data.hex() body = { @@ -24,7 +24,7 @@ def emulate(self, sender, contract, data=bytes(), chain_id=CHAIN_ID, value='0x0' "value": value }, "accounts": [], - "provide_account_info": None + "provide_account_info": provide_account_info } resp = requests.post(url=f"{self.url}/emulate", json=body, headers=self.headers) if resp.status_code == 200: