Skip to content

Commit

Permalink
NDEV-3237 check accounts data (#439)
Browse files Browse the repository at this point in the history
* NDEV-3237 check accounts data

* change_Hetzner_region


---------

Co-authored-by: Sergei Bondar <mr.bondsv@gmail.com>
  • Loading branch information
andrei-neon and Sergei Bondar authored Oct 10, 2024
1 parent d8900ff commit 22c582c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 25 deletions.
2 changes: 1 addition & 1 deletion deploy/hetzner/vars.tf
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ variable "server_type" {

variable "location" {
type = string
default = "nbg1"
default = "hel1"
}

variable "run_number" {
Expand Down
70 changes: 48 additions & 22 deletions integration/tests/neon_evm/test_neon_core_rest_api.py
Original file line number Diff line number Diff line change
@@ -1,58 +1,84 @@
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)
storage = neon_api_client.get_storage_at(contract.eth_address.hex())["value"]
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}"
4 changes: 2 additions & 2 deletions integration/tests/neon_evm/utils/neon_api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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:
Expand Down

0 comments on commit 22c582c

Please sign in to comment.