Skip to content

Commit

Permalink
reviewed: notify the contract when burning a non-empty box #314
Browse files Browse the repository at this point in the history
  • Loading branch information
kaynarov committed Mar 13, 2020
1 parent 4417490 commit f8df584
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 6 deletions.
1 change: 1 addition & 0 deletions common/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ static const auto worker_name = "cyber.worker"_n;
static const auto names_name = "cyber.names"_n;
static const auto producers_name = "cyber.prods"_n;
static const auto internal_name = "cyber"_n;
static const auto null_name = "cyber.null"_n;

// permissions
static const auto code_name = "cyber.code"_n;
Expand Down
5 changes: 4 additions & 1 deletion cyber.box/src/cyber.box.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@ void box::erase_box(name contract, name treasurer, name title, name owner) {
eosio::check(box_itr != boxes_idx.end(), "box does not exist");
eosio::check(!owner || owner == box_itr->owner, "incorrect owner");
eosio::check(!owner || !box_itr->empty, "cannot unpack an empty box");
if (!box_itr->empty) {
require_recipient(contract);
}
require_auth(box_itr->owner);
boxes_idx.erase(box_itr);
}

void box::unpack(name contract, name treasurer, name title, name owner) {
require_recipient(contract);
eosio::check(static_cast<bool>(owner), "owner not specified");
erase_box(contract, treasurer, title, owner);
}

Expand Down
2 changes: 2 additions & 0 deletions cyber.stake/include/cyber.stake/cyber.stake.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ struct structures {
void set_suspense(name ram_payer, susps& susps_table, susps_idx_t& susps_idx, symbol_code token_code, name account, name action_name, int delay);

void send_checkstake(name account, symbol_code token_code);
void erase_box(name contract, name treasurer, name title, name owner);

public:

Expand Down Expand Up @@ -444,5 +445,6 @@ struct structures {

[[eosio::action]] void constrain(name treasurer, name title, asset quantity);
[[eosio::on_notify(CYBER_BOX"::unpack")]] void on_unpack(name contract, name treasurer, name title, name owner);
[[eosio::on_notify(CYBER_BOX"::burn")]] void on_burn(name contract, name treasurer, name title);
};
} /// namespace cyber
10 changes: 9 additions & 1 deletion cyber.stake/src/cyber.stake.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,7 @@ void stake::constrain(name treasurer, name title, asset quantity) {
).send();
}

void stake::on_unpack(name contract, name treasurer, name title, name owner) {
void stake::erase_box(name contract, name treasurer, name title, name owner) {
eosio::check(contract == _self, "SYSTEM: incorrect contract");

boxes boxes_table(_self, treasurer.value);
Expand Down Expand Up @@ -956,4 +956,12 @@ void stake::on_unpack(name contract, name treasurer, name title, name owner) {
{_self, owner, quantity, "unpacked tokens"});
}

void stake::on_unpack(name contract, name treasurer, name title, name owner) {
erase_box(contract, treasurer, title, owner);
}

void stake::on_burn(name contract, name treasurer, name title) {
erase_box(contract, treasurer, title, config::null_name);
}

} /// namespace cyber
10 changes: 7 additions & 3 deletions tests/cyber.box_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ class cyber_box_tester : public golos_tester {

const string no_balance = amsg("owner balance does not exist");
const string not_owner = amsg("only the owner can do it");
const string owner_not_specified = amsg("owner not specified");
const string incorrect_owner = amsg("incorrect owner");


string missing_authority(name acc) { return "missing authority of " + std::string(acc); };

} err;
Expand Down Expand Up @@ -189,12 +189,16 @@ BOOST_FIXTURE_TEST_CASE(stake_in_box_tests, cyber_box_tester) try {
BOOST_CHECK_EQUAL(stake.get_agent(_whale, token._symbol)["balance"], 0);
BOOST_CHECK_EQUAL(stake.get_agent(_whale, token._symbol)["proxied"], staked - alice_box - bob_box);

BOOST_CHECK_EQUAL(err.owner_not_specified, box.unpack(stake_account_name, _whale, N(whalebox), name(), _whale));
BOOST_CHECK_EQUAL(success(), box.unpack(stake_account_name, _whale, N(whalebox), _whale, _whale));
BOOST_CHECK_EQUAL(stake.get_agent(_whale, token._symbol)["balance"], 0);
BOOST_CHECK_EQUAL(stake.get_agent(_whale, token._symbol)["proxied"], staked - alice_box - bob_box);

BOOST_CHECK_EQUAL(success(), box.unpack(stake_account_name, _whale, N(carolbox), _carol, _carol));
BOOST_CHECK_EQUAL(carol_box, token.get_account(_carol)["balance"].as<asset>().get_amount());
BOOST_CHECK_EQUAL(err.no_balance, box.burn(stake_account_name, _whale, N(carolbox), _carol));
BOOST_CHECK_EQUAL(success(), token.open(cfg::null_name, token._symbol, _carol));
BOOST_CHECK_EQUAL(success(), box.burn(stake_account_name, _whale, N(carolbox), _carol));
BOOST_CHECK_EQUAL(0, token.get_account(_carol)["balance"].as<asset>().get_amount());
BOOST_CHECK_EQUAL(carol_box, token.get_account(cfg::null_name)["balance"].as<asset>().get_amount());
BOOST_CHECK_EQUAL(stake.get_agent(_whale, token._symbol)["balance"], 0);
BOOST_CHECK_EQUAL(stake.get_agent(_whale, token._symbol)["proxied"], staked - alice_box - bob_box - carol_box);

Expand Down
2 changes: 1 addition & 1 deletion tests/cyber.token_test_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct cyber_token_api: base_contract_api {
}

action_result open(account_name owner, symbol symbol, account_name payer) {
return push(N(open), owner, args()
return push(N(open), payer, args()
("owner", owner)
("symbol", symbol)
("ram_payer", payer)
Expand Down

0 comments on commit f8df584

Please sign in to comment.