Skip to content

Commit

Permalink
throw error in init if status already finish (#116)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alladin9393 authored and roman-tik committed Dec 13, 2019
1 parent 214d900 commit 2df66d8
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 29 deletions.
12 changes: 8 additions & 4 deletions contracts/contracts/rem.swap/include/rem.swap/rem.swap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ namespace eosio {
*/
class [[eosio::contract("rem.swap")]] swap : public contract {
public:
swap(name receiver, name code, datastream<const char *> ds);
swap(name receiver, name code, datastream<const char*> ds)
:contract(receiver, code, ds),
swap_table(get_self(), get_self().value),
swap_params_table(get_self(), get_self().value),
chains_table(get_self(), get_self().value) {}

/**
* Initiate token swap action.
Expand Down Expand Up @@ -202,9 +206,9 @@ namespace eosio {
};

struct [[eosio::table]] swapparams {
string chain_id = "0";
string eth_swap_contract_address = "0";
string eth_return_chainid = "0";
string chain_id;
string eth_swap_contract_address;
string eth_return_chainid;

// explicit serialization macro is not necessary, used here only to improve compilation time
EOSLIB_SERIALIZE( swapparams, (chain_id)(eth_swap_contract_address)(eth_return_chainid) )
Expand Down
39 changes: 15 additions & 24 deletions contracts/contracts/rem.swap/src/rem.swap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,6 @@ namespace eosio {

using eosiosystem::system_contract;

swap::swap(name receiver, name code, datastream<const char*> ds) : contract(receiver, code, ds),
swap_table(get_self(), get_self().value),
swap_params_table(get_self(), get_self().value),
chains_table(get_self(), get_self().value) {
if (!swap_params_table.exists()) {
swap_params_table.set(swapparams{}, system_account);
}
swap_params_data = swap_params_table.get();
}

void swap::init(const name &rampayer, const string &txid, const string &swap_pubkey,
const asset &quantity, const string &return_address, const string &return_chain_id,
const block_timestamp &swap_timestamp)
Expand All @@ -29,6 +19,7 @@ namespace eosio {

const asset min_account_stake = get_min_account_stake();
const asset producers_reward = get_producers_reward(name(return_chain_id));
swap_params_data = swap_params_table.get();

check_pubkey_prefix(swap_pubkey);
check(quantity.is_valid(), "invalid quantity");
Expand Down Expand Up @@ -59,22 +50,19 @@ namespace eosio {
s.status = static_cast<int8_t>(swap_status::INITIALIZED);
if (is_producer) s.provided_approvals.push_back(rampayer);
});
} else {

if (is_producer) {
check(is_producer, "block producer authorization required");
check(swap_hash_it->status != static_cast<int8_t>(swap_status::CANCELED), "swap already canceled");
} else if (is_producer) {
check(is_producer, "block producer authorization required");
check(swap_hash_it->status != static_cast<int8_t>(swap_status::CANCELED), "swap already canceled");
check(swap_hash_it->status != static_cast<int8_t>(swap_status::FINISHED), "swap already finished");

const vector <name> &approvals = swap_hash_it->provided_approvals;
bool is_already_approved = std::find(approvals.begin(), approvals.end(), rampayer) == approvals.end();
const vector <name> &approvals = swap_hash_it->provided_approvals;
bool is_already_approved = std::find(approvals.begin(), approvals.end(), rampayer) == approvals.end();

check(is_already_approved, "approval already exists");

swap_table.modify(*swap_hash_it, rampayer, [&](auto &s) {
s.provided_approvals.push_back(rampayer);
});
}
check(is_already_approved, "approval already exists");

swap_table.modify(*swap_hash_it, rampayer, [&](auto &s) {
s.provided_approvals.push_back(rampayer);
});
}
// moved out, because existing case when the majority of the active producers = 1
if (is_producer) {
Expand Down Expand Up @@ -218,7 +206,8 @@ namespace eosio {
swap_params_data.eth_swap_contract_address = eth_swap_contract_address;
swap_params_data.eth_return_chainid = eth_return_chainid;

swap_params_table.set(swap_params_data, same_payer);
name payer = swap_params_table.exists() ? same_payer : system_account;
swap_params_table.set(swap_params_data, payer);
}

void swap::addchain(const name &chain_id, const bool &input, const bool &output,
Expand Down Expand Up @@ -252,6 +241,7 @@ namespace eosio {
const block_timestamp &swap_timestamp)
{
time_point swap_timepoint = swap_timestamp.to_time_point();
swap_params_data = swap_params_table.get();

string swap_payload = join({swap_pubkey_str.substr(3), txid, swap_params_data.chain_id, quantity.to_string(),
return_address, return_chain_id, std::to_string(swap_timepoint.sec_since_epoch())});
Expand All @@ -265,6 +255,7 @@ namespace eosio {
const string &return_chain_id, const block_timestamp &swap_timestamp)
{
time_point swap_timepoint = swap_timestamp.to_time_point();
swap_params_data = swap_params_table.get();

string payload = join({txid, swap_params_data.chain_id, quantity.to_string(), return_address,
return_chain_id, std::to_string(swap_timepoint.sec_since_epoch())});
Expand Down
2 changes: 1 addition & 1 deletion contracts/contracts/rem.swap/src/system_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ namespace eosio {

bool swap::is_swap_confirmed( const vector<name>& provided_approvals ) const
{
vector<name> _producers = get_producers();
vector<name> _producers = eosio::get_active_producers();
uint8_t quantity_active_appr = 0;
for (const auto& producer: provided_approvals) {
auto prod_appr = std::find(_producers.begin(), _producers.end(), producer);
Expand Down

0 comments on commit 2df66d8

Please sign in to comment.