From 24993ff98682a72a896fbfc754ce37e4b95da602 Mon Sep 17 00:00:00 2001 From: Ivan Adamov Date: Thu, 5 Sep 2024 16:54:45 -0700 Subject: [PATCH] added a test for storage of a zero --- contracts/issues/Ndev3234.sol | 24 ++++++ integration/tests/neon_evm/bugs/__init__.py | 0 .../neon_evm/bugs/test_storage_cell_zero.py | 86 +++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 contracts/issues/Ndev3234.sol create mode 100644 integration/tests/neon_evm/bugs/__init__.py create mode 100644 integration/tests/neon_evm/bugs/test_storage_cell_zero.py diff --git a/contracts/issues/Ndev3234.sol b/contracts/issues/Ndev3234.sol new file mode 100644 index 0000000000..4656a79938 --- /dev/null +++ b/contracts/issues/Ndev3234.sol @@ -0,0 +1,24 @@ +pragma solidity 0.8.12; + +contract saveZeros { + + bytes32[64] public b; // prefills the contract storage + bytes32 public number; + mapping(uint256 => uint256) public intMapping; + + function saveZeroToVar() public returns (bytes32) { // should not create a new account + number = bytes32(0); + return number; + } + + function saveZeroToMapping() public { // should not create a new account + intMapping[0] = 0; + } + + function saveZeroToMappingCycle() public { // should not create a new account + for (uint i = 0; i < 10; i++) { + intMapping[i] = 0; + } + } + +} diff --git a/integration/tests/neon_evm/bugs/__init__.py b/integration/tests/neon_evm/bugs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/integration/tests/neon_evm/bugs/test_storage_cell_zero.py b/integration/tests/neon_evm/bugs/test_storage_cell_zero.py new file mode 100644 index 0000000000..f99e826155 --- /dev/null +++ b/integration/tests/neon_evm/bugs/test_storage_cell_zero.py @@ -0,0 +1,86 @@ +import pytest +from solana.keypair import Keypair +from solana.transaction import Signature + +from integration.tests.neon_evm.utils.contract import deploy_contract +from integration.tests.neon_evm.utils.neon_api_client import NeonApiClient +from utils.accounts import EthAccounts +from utils.evm_loader import EvmLoader +from utils.helpers import wait_condition +from utils.solana_client import SolanaClient +from utils.types import Contract, Caller, TreasuryPool +from utils.web3client import NeonChainWeb3Client + + +@pytest.mark.parametrize( + "function_signature", + [ + "saveZeroToVar", + "saveZeroToMapping", + "saveZeroToMappingCycle", + ], +) +class TestStorageCells: + + def test_emulate_save_zero( + self, + operator_keypair: Keypair, + user_account: Caller, + evm_loader: EvmLoader, + treasury_pool: TreasuryPool, + neon_api_client: NeonApiClient, + sol_client: SolanaClient, + function_signature: str, + ): + contract: Contract = deploy_contract( + operator=operator_keypair, + user=user_account, + contract_file_name="issues/Ndev3234.sol", + evm_loader=evm_loader, + treasury_pool=treasury_pool, + contract_name="saveZeros", + version="0.8.12", + ) + + emulate_result = neon_api_client.emulate_contract_call( + sender=user_account.eth_address.hex(), + contract=contract.eth_address.hex(), + function_signature=function_signature + "()", + ) + + accounts_count = len(emulate_result["solana_accounts"]) + assert accounts_count == 2, f"{accounts_count - 2} new account(s) created" + + def test_save_zero( + self, + web3_client: NeonChainWeb3Client, + function_signature: str, + accounts: EthAccounts, + sol_client: SolanaClient, + ): + account = accounts[0] + contract, _ = web3_client.deploy_and_get_contract( + contract="issues/Ndev3234.sol", + version="0.8.12", + account=account, + contract_name="saveZeros", + ) + + raw_eth_tx = self.web3_client.make_raw_tx(from_=account) + instruction_tx = getattr(contract.functions, function_signature)().build_transaction(raw_eth_tx) + receipt = self.web3_client.send_transaction(account, instruction_tx) + assert receipt.status == 1 + solana_tx_hash = web3_client.get_solana_trx_by_neon(receipt.transactionHash.hex())["result"][0] + solana_tx = wait_condition( + func_cond=lambda: sol_client.get_transaction( + tx_sig=Signature.from_string(solana_tx_hash), + max_supported_transaction_version=0, + ), + check_success=lambda tx: tx.value is not None, + ) + if solana_tx.value.transaction.transaction.message.address_table_lookups: + alt = solana_tx.value.transaction.transaction.message.address_table_lookups + accounts_count = len(alt[0].writable_indexes) + len(alt[0].readonly_indexes) + else: + accounts_count = len(solana_tx.value.transaction.transaction.message.account_keys) + assert accounts_count == 9, f"{accounts_count - 9} new account(s) created"