From 3caaa225c5c3f4e9f835a27fb012a5ed6a8c45d7 Mon Sep 17 00:00:00 2001 From: yarkin Date: Thu, 31 Aug 2023 09:58:42 +0800 Subject: [PATCH] Test nonce against 0 when account is not opened. Minor change in argument names. --- include/evm_runtime/evm_contract.hpp | 2 +- src/actions.cpp | 11 ++++++++--- tests/basic_evm_tester.cpp | 6 +++--- tests/basic_evm_tester.hpp | 2 +- tests/call_tests.cpp | 9 +++++++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/evm_runtime/evm_contract.hpp b/include/evm_runtime/evm_contract.hpp index 5fb5382a..b1e695f3 100644 --- a/include/evm_runtime/evm_contract.hpp +++ b/include/evm_runtime/evm_contract.hpp @@ -91,7 +91,7 @@ class [[eosio::contract]] evm_contract : public contract [[eosio::action]] void bridgereg(eosio::name receiver, const eosio::asset& min_fee); [[eosio::action]] void bridgeunreg(eosio::name receiver); - [[eosio::action]] void assertnonce(eosio::name receiver, uint64_t nonce); + [[eosio::action]] void assertnonce(eosio::name account, uint64_t next_nonce); #ifdef WITH_TEST_ACTIONS [[eosio::action]] void testtx(const std::optional& orlptx, const evm_runtime::test::block_info& bi); diff --git a/src/actions.cpp b/src/actions.cpp index e0584833..a0c1cf63 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -736,11 +736,16 @@ void evm_contract::bridgeunreg(eosio::name receiver) { } -void evm_contract::assertnonce(eosio::name receiver, uint64_t nonce) { +void evm_contract::assertnonce(eosio::name account, uint64_t next_nonce) { nextnonces nextnonce_table(get_self(), get_self().value); - const nextnonce& next_nonce = nextnonce_table.get(receiver.value, "caller account has not been opened"); - eosio::check(nonce == next_nonce.next_nonce, "wrong nonce"); + auto next_nonce_iter = nextnonce_table.find(account.value); + if (next_nonce_iter == nextnonce_table.end()) { + eosio::check(0 == next_nonce, "wrong nonce"); + } + else { + eosio::check(next_nonce_iter->next_nonce == next_nonce, "wrong nonce"); + } } #ifdef WITH_TEST_ACTIONS diff --git a/tests/basic_evm_tester.cpp b/tests/basic_evm_tester.cpp index 0e9d1722..fc1c5d2a 100644 --- a/tests/basic_evm_tester.cpp +++ b/tests/basic_evm_tester.cpp @@ -344,9 +344,9 @@ transaction_trace_ptr basic_evm_tester::bridgeunreg(name receiver) { mvo()("receiver", receiver)); } -transaction_trace_ptr basic_evm_tester::assertnonce(name receiver, uint64_t nonce) { - return basic_evm_tester::push_action(evm_account_name, "assertnonce"_n, receiver, - mvo()("receiver", receiver)("nonce", nonce)); +transaction_trace_ptr basic_evm_tester::assertnonce(name account, uint64_t next_nonce) { + return basic_evm_tester::push_action(evm_account_name, "assertnonce"_n, account, + mvo()("account", account)("next_nonce", next_nonce)); } transaction_trace_ptr basic_evm_tester::pushtx(const silkworm::Transaction& trx, name miner) diff --git a/tests/basic_evm_tester.hpp b/tests/basic_evm_tester.hpp index d13667c3..9adc416e 100644 --- a/tests/basic_evm_tester.hpp +++ b/tests/basic_evm_tester.hpp @@ -222,7 +222,7 @@ class basic_evm_tester : public testing::validating_tester transaction_trace_ptr bridgereg(name receiver, asset min_fee, vector extra_signers={evm_account_name}); transaction_trace_ptr bridgeunreg(name receiver); transaction_trace_ptr exec(const exec_input& input, const std::optional& callback); - transaction_trace_ptr assertnonce(name receiver, uint64_t nonce); + transaction_trace_ptr assertnonce(name account, uint64_t next_nonce); transaction_trace_ptr pushtx(const silkworm::Transaction& trx, name miner = evm_account_name); void call(name from, const evmc::bytes& to, const evmc::bytes& value, evmc::bytes& data, uint64_t gas_limit, name actor); void admincall(const evmc::bytes& from, const evmc::bytes& to, const evmc::bytes& value, evmc::bytes& data, uint64_t gas_limit, name actor); diff --git a/tests/call_tests.cpp b/tests/call_tests.cpp index e14e57b1..9fcad062 100644 --- a/tests/call_tests.cpp +++ b/tests/call_tests.cpp @@ -499,8 +499,13 @@ BOOST_FIXTURE_TEST_CASE(deploy_contract_function, call_evm_tester) try { BOOST_FIXTURE_TEST_CASE(assetnonce_test, call_evm_tester) try { auto alice_addr = make_reserved_address("alice"_n.to_uint64_t()); - BOOST_REQUIRE_EXCEPTION(assertnonce("alice"_n, 0), - eosio_assert_message_exception, eosio_assert_message_is("caller account has not been opened")); + // nonce for not opened account is zero. + assertnonce("alice"_n, 0); + BOOST_REQUIRE_EXCEPTION(assertnonce("alice"_n, 1), + eosio_assert_message_exception, eosio_assert_message_is("wrong nonce")); + + // Advance block so we do not generate same transaction. + produce_block(); open("alice"_n); transfer_token("alice"_n, evm_account_name, make_asset(1000000), "alice");