Skip to content

Commit

Permalink
admin action: change addopenbal interface
Browse files Browse the repository at this point in the history
  • Loading branch information
elmato committed Sep 5, 2023
1 parent 8814949 commit ab0d990
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 21 deletions.
2 changes: 1 addition & 1 deletion contract/include/evm_runtime/evm_contract.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class [[eosio::contract]] evm_contract : public contract
[[eosio::action]] void setkvstore(uint64_t account_id, const bytes& key, const std::optional<bytes>& value);
[[eosio::action]] void rmaccount(uint64_t id);
[[eosio::action]] void addevmbal(uint64_t id, const bytes& delta, bool subtract);
[[eosio::action]] void addopenbal(name account, const asset& delta);
[[eosio::action]] void addopenbal(name account, const bytes& delta, bool subtract);
[[eosio::action]] void freezeaccnt(uint64_t id, bool value);
#endif

Expand Down
11 changes: 7 additions & 4 deletions contract/src/admin_actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,20 @@ namespace evm_runtime {
});
}

[[eosio::action]] void evm_contract::addopenbal(name account, const asset& delta) {
[[eosio::action]] void evm_contract::addopenbal(name account, const bytes& delta, bool subtract) {
eosio::require_auth(get_self());
balances open_balances(get_self(), get_self().value);
auto itr = open_balances.find(account.value);
eosio::check(itr != open_balances.end(), "account not found");

auto res = itr->balance.balance + delta;
eosio::check(res.amount >= 0, "negative final balance");
auto d = to_uint256(delta);

open_balances.modify(*itr, eosio::same_payer, [&](auto& row){
row.balance.balance = res;
if(subtract) {
row.balance-=d;
} else {
row.balance+=d;
}
});
}

Expand Down
26 changes: 13 additions & 13 deletions contract/tests/admin_actions_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ BOOST_FIXTURE_TEST_CASE(addevmbal_add_tests, admin_action_tester) try {
BOOST_REQUIRE_THROW(check_balances(), std::runtime_error);

// We need to substract 0.0001 from the open balance of `evm_account_name`
addopenbal(evm_account_name, make_asset(-1));
addopenbal(evm_account_name, minimum_natively_representable, true);

check_balances();

Expand All @@ -402,24 +402,24 @@ BOOST_FIXTURE_TEST_CASE(addevmbal_add_tests, admin_action_tester) try {
BOOST_FIXTURE_TEST_CASE(addopenbal_tests, admin_action_tester) try {
open("alice"_n);
transfer_token("alice"_n, evm_account_name, make_asset(100'0000), "alice");

BOOST_REQUIRE_EXCEPTION(addopenbal("beto"_n, make_asset(100'0000), "alice"_n),

intx::uint256 minimum_natively_representable = intx::exp(10_u256, intx::uint256(18 - 4));

BOOST_REQUIRE_EXCEPTION(addopenbal("beto"_n, intx::uint256(100'0000)*minimum_natively_representable, false, "alice"_n),
missing_auth_exception, eosio::testing::fc_exception_message_starts_with("missing authority"));

BOOST_REQUIRE_EXCEPTION(addopenbal("beto"_n, make_asset(100'0000)),
BOOST_REQUIRE_EXCEPTION(addopenbal("beto"_n, intx::uint256(100'0000)*minimum_natively_representable, false),
eosio_assert_message_exception, eosio_assert_message_is("account not found"));

BOOST_REQUIRE_EXCEPTION(addopenbal("alice"_n, make_asset(-100'0001)),
eosio_assert_message_exception, eosio_assert_message_is("negative final balance"));
BOOST_REQUIRE_EXCEPTION(addopenbal("alice"_n, intx::uint256(100'0001)*minimum_natively_representable, true),
eosio_assert_message_exception, eosio_assert_message_is("decrementing more than available"));

BOOST_REQUIRE_EXCEPTION(addopenbal("alice"_n, make_asset(asset::max_amount-99'9999)),
eosio_assert_message_exception, eosio_assert_message_is("addition overflow"));
BOOST_REQUIRE_EXCEPTION(addopenbal("alice"_n, std::numeric_limits<intx::uint256>::max()-intx::uint256(99'9999)*minimum_natively_representable, false),
eosio_assert_message_exception, eosio_assert_message_is("accumulation overflow"));

check_balances();

intx::uint256 minimum_natively_representable = intx::exp(10_u256, intx::uint256(18 - 4));

addopenbal("alice"_n, make_asset(-1));
addopenbal("alice"_n, minimum_natively_representable, true);
BOOST_REQUIRE(intx::uint256(vault_balance("alice"_n)) == intx::uint256(99'9999)*minimum_natively_representable);

// This will fail since the eosio.token balance of `evm_account_name` is 0.0001 greater than the sum of all balances (evm + open balances)
Expand All @@ -430,7 +430,7 @@ BOOST_FIXTURE_TEST_CASE(addopenbal_tests, admin_action_tester) try {

check_balances();

addopenbal("alice"_n, make_asset(1));
addopenbal("alice"_n, minimum_natively_representable, false);
BOOST_REQUIRE(intx::uint256(vault_balance("alice"_n)) == intx::uint256(100'0000)*minimum_natively_representable);

// This will fail since the eosio.token balance of `evm_account_name` is 0.0001 less than the sum of all balances (evm + open balances)
Expand All @@ -439,7 +439,7 @@ BOOST_FIXTURE_TEST_CASE(addopenbal_tests, admin_action_tester) try {

// This combination is to adjust just the eosio.token EOS balance of the `evm_account_name`
transfer_token("alice"_n, evm_account_name, make_asset(1), evm_account_name.to_string());
addopenbal(evm_account_name, make_asset(-1));
addopenbal(evm_account_name, minimum_natively_representable, true);

check_balances();

Expand Down
5 changes: 3 additions & 2 deletions contract/tests/basic_evm_tester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -350,9 +350,10 @@ transaction_trace_ptr basic_evm_tester::addevmbal(uint64_t id, const intx::uint2
mvo()("id", id)("delta",d)("subtract",subtract));
}

transaction_trace_ptr basic_evm_tester::addopenbal(name account, const asset& delta, name actor) {
transaction_trace_ptr basic_evm_tester::addopenbal(name account, const intx::uint256& delta, bool subtract, name actor) {
auto d = to_bytes(delta);
return basic_evm_tester::push_action(evm_account_name, "addopenbal"_n, actor,
mvo()("account", account)("delta",delta));
mvo()("account", account)("delta",d)("subtract",subtract));
}

void basic_evm_tester::pushtx(const silkworm::Transaction& trx, name miner)
Expand Down
2 changes: 1 addition & 1 deletion contract/tests/basic_evm_tester.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ class basic_evm_tester : public testing::validating_tester
transaction_trace_ptr rmaccount(uint64_t id, name actor=evm_account_name);
transaction_trace_ptr freezeaccnt(uint64_t id, bool value, name actor=evm_account_name);
transaction_trace_ptr addevmbal(uint64_t id, const intx::uint256& delta, bool subtract, name actor=evm_account_name);
transaction_trace_ptr addopenbal(name account, const asset& delta, name actor=evm_account_name);
transaction_trace_ptr addopenbal(name account, const intx::uint256& delta, bool subtract, name actor=evm_account_name);

void open(name owner);
void close(name owner);
Expand Down

0 comments on commit ab0d990

Please sign in to comment.