From 03961263640cfc359a4a21741817bf080f8d83fa Mon Sep 17 00:00:00 2001 From: quyvo Date: Tue, 18 Feb 2020 14:19:20 +0700 Subject: [PATCH] feat/#10 add issue badge and config badge code when create badge --- community/Readme.md | 2 +- community/community.abi | 131 ++++++++++++ community/community.wasm | Bin 256805 -> 291728 bytes community/include/community.hpp | 43 +++- community/src/community.cpp | 365 +++++++++++++++++++++++++++++--- 5 files changed, 512 insertions(+), 29 deletions(-) diff --git a/community/Readme.md b/community/Readme.md index 322d8f4..127886f 100644 --- a/community/Readme.md +++ b/community/Readme.md @@ -601,7 +601,7 @@ $ cleos get table governance23 community241 codeexecrule ```bash // last parameter is identify set for amendment code (1 is set for amendment code, 0 is set for code) $ cleos convert pack_action_data governance23 setexectype '["community241", 2, 1, 0]' -108af0d94d2d254504000000000000000100 +208af0d94d2d254529000000000000000000 ``` 2. pack `setapprotype` action data to set approval type of code proposal (approval type 1 is approval consensus): diff --git a/community/community.abi b/community/community.abi index 010b62f..94dd14a 100644 --- a/community/community.abi +++ b/community/community.abi @@ -263,6 +263,76 @@ } ] }, + { + "name": "configbadge", + "base": "", + "fields": [ + { + "name": "community_account", + "type": "name" + }, + { + "name": "badge_id", + "type": "uint64" + }, + { + "name": "issue_type", + "type": "uint8" + }, + { + "name": "update_badge_proposal_name", + "type": "name" + }, + { + "name": "issue_exec_type", + "type": "uint8" + }, + { + "name": "issue_sole_right_accounts", + "type": "name[]" + }, + { + "name": "issue_sole_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_proposer_right_accounts", + "type": "name[]" + }, + { + "name": "issue_proposer_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_approval_type", + "type": "uint8" + }, + { + "name": "issue_approver_right_accounts", + "type": "name[]" + }, + { + "name": "issue_approver_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_voter_right_accounts", + "type": "name[]" + }, + { + "name": "issue_voter_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_pass_rule", + "type": "float64" + }, + { + "name": "issue_vote_duration", + "type": "uint64" + } + ] + }, { "name": "configpos", "base": "", @@ -377,9 +447,65 @@ "name": "community_account", "type": "name" }, + { + "name": "badge_id", + "type": "uint64" + }, + { + "name": "issue_type", + "type": "uint8" + }, { "name": "badge_propose_name", "type": "name" + }, + { + "name": "issue_exec_type", + "type": "uint8" + }, + { + "name": "issue_sole_right_accounts", + "type": "name[]" + }, + { + "name": "issue_sole_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_proposer_right_accounts", + "type": "name[]" + }, + { + "name": "issue_proposer_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_approval_type", + "type": "uint8" + }, + { + "name": "issue_approver_right_accounts", + "type": "name[]" + }, + { + "name": "issue_approver_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_voter_right_accounts", + "type": "name[]" + }, + { + "name": "issue_voter_right_pos_ids", + "type": "uint64[]" + }, + { + "name": "issue_pass_rule", + "type": "float64" + }, + { + "name": "issue_vote_duration", + "type": "uint64" } ] }, @@ -1059,6 +1185,11 @@ "type": "approvepos", "ricardian_contract": "" }, + { + "name": "configbadge", + "type": "configbadge", + "ricardian_contract": "" + }, { "name": "configpos", "type": "configpos", diff --git a/community/community.wasm b/community/community.wasm index f77a92bac7de8ea29be09e852ab76d8a8de1f79e..105c97c0687fa2b0426a408c4201aea480edb705 100755 GIT binary patch delta 69349 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 delta 41607 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 GrvC>cO_O{8 diff --git a/community/include/community.hpp b/community/include/community.hpp index 9e02948..a7d793b 100644 --- a/community/include/community.hpp +++ b/community/include/community.hpp @@ -56,6 +56,11 @@ CONTRACT community : public contract BADGE, }; + enum BadgeIssueType { + WITHOUT_CLAIM = 0, + CLAIM_APPROVE_BY_ISSUER, + }; + struct permission_level_weight { permission_level permission; uint16_t weight; @@ -193,7 +198,43 @@ CONTRACT community : public contract ACTION dismisspos(name community_account, uint64_t pos_id, name holder, const string& dismissal_reason); - ACTION createbadge(name community_account, name badge_propose_name); + ACTION createbadge( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + name badge_propose_name, + uint8_t issue_exec_type, + vector issue_sole_right_accounts, + vector issue_sole_right_pos_ids, + vector issue_proposer_right_accounts, + vector issue_proposer_right_pos_ids, + uint8_t issue_approval_type, + vector issue_approver_right_accounts, + vector issue_approver_right_pos_ids, + vector issue_voter_right_accounts, + vector issue_voter_right_pos_ids, + double issue_pass_rule, + uint64_t issue_vote_duration + ); + + ACTION configbadge( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + name update_badge_proposal_name, + uint8_t issue_exec_type, + vector issue_sole_right_accounts, + vector issue_sole_right_pos_ids, + vector issue_proposer_right_accounts, + vector issue_proposer_right_pos_ids, + uint8_t issue_approval_type, + vector issue_approver_right_accounts, + vector issue_approver_right_pos_ids, + vector issue_voter_right_accounts, + vector issue_voter_right_pos_ids, + double issue_pass_rule, + uint64_t issue_vote_duration + ); ACTION issuebadge(name community_account, name badge_propose_name); diff --git a/community/src/community.cpp b/community/src/community.cpp index 652b35e..4ead174 100644 --- a/community/src/community.cpp +++ b/community/src/community.cpp @@ -37,6 +37,7 @@ const name PO_Dismiss = "po.dismiss"_n; const name BA_Create = "ba.create"_n; const name BA_Issue = "ba.issue"_n; +const name BA_Claim = "ba.claim"_n; const name BA_Config = "ba.config"_n; const name BA_Adopt = "ba.adopt"_n; const name BA_Discard = "ba.discard"_n; @@ -652,46 +653,51 @@ ACTION community::createcode(name community_account, name code_name, name contra code_sole_decision_table _code_execution_rule(_self, community_account.value); amend_sole_decision_table _amend_execution_rule(_self, community_account.value); - bool admin_is_created = false; - position_table _positions(_self, community_account.value); + code_collective_decision_table _code_vote_rule(_self, community_account.value); + ammend_collective_decision_table _amend_vote_rule(_self, community_account.value); - auto pos_itr = _positions.find(pos_admin_id); - admin_is_created = pos_itr != _positions.end(); + position_table _positions(_self, community_account.value); RightHolder _init_right_holder; + auto getByCodeName = _codes.get_index<"by.code.name"_n>(); + auto co_amend_code = getByCodeName.find(CO_Amend.value); + // save new code to the table auto new_codes = _codes.emplace(community_account, [&](auto &row) { row.code_id = _codes.available_primary_key(); row.code_name = code_name; row.contract_name = contract_name; row.code_actions = code_actions; - row.code_exec_type = ExecutionType::SOLE_DECISION; - row.amendment_exec_type = ExecutionType::SOLE_DECISION; + row.code_exec_type = co_amend_code->code_exec_type; + row.amendment_exec_type = co_amend_code->amendment_exec_type; row.code_type = {NORMAL, 0}; }); - if (admin_is_created) - { - _init_right_holder.required_positions.push_back(pos_admin_id); + if (co_amend_code->code_exec_type != ExecutionType::COLLECTIVE_DECISION) { + auto co_amend_code_sole_decision = _code_execution_rule.find(co_amend_code->code_id); + if(co_amend_code_sole_decision != _code_execution_rule.end()) { + _amend_execution_rule.emplace(community_account, [&](auto &row) { + row.code_id = new_codes->code_id; + row.right_executor = co_amend_code_sole_decision->right_executor; + }); + } } - else - { - auto com_itr = _communitys.find(community_account.value); - check(com_itr != _communitys.end(), "ERR::CREATEPROP_NOT_EXIST::Community does not exist."); - _init_right_holder.accounts.push_back(com_itr->creator); + if (co_amend_code->code_exec_type != ExecutionType::SOLE_DECISION) { + auto co_amend_code_collective_decision = _code_vote_rule.find(co_amend_code->code_id); + if (co_amend_code_collective_decision != _code_vote_rule.end()) { + _amend_vote_rule.emplace(community_account, [&](auto &row) { + row.code_id = new_codes->code_id; + row.right_proposer = co_amend_code_collective_decision->right_proposer; + row.right_approver = co_amend_code_collective_decision->right_approver; + row.right_voter = co_amend_code_collective_decision->right_voter; + row.approval_type = co_amend_code_collective_decision->approval_type; + row.pass_rule = co_amend_code_collective_decision->pass_rule; + row.vote_duration = co_amend_code_collective_decision->vote_duration; + }); + } } - - _code_execution_rule.emplace(community_account, [&](auto &row) { - row.code_id = new_codes->code_id; - row.right_executor = _init_right_holder; - }); - - _amend_execution_rule.emplace(community_account, [&](auto &row) { - row.code_id = new_codes->code_id; - row.right_executor = _init_right_holder; - }); } ACTION community::setexectype(name community_account, uint64_t code_id, uint8_t exec_type, bool is_amend_code) { @@ -1402,6 +1408,7 @@ ACTION community::configpos(name community_account, uint64_t pos_id, string pos_ }); } + cancel_deferred(pos_id); eosio::transaction auto_execute; auto_execute.actions.emplace_back(eosio::permission_level{community_account, "active"_n}, _self, "approvepos"_n, std::make_tuple(community_account, pos_id)); auto_execute.delay_sec = votting_end_date - current_time_point().sec_since_epoch(); @@ -1579,8 +1586,24 @@ ACTION community::dismisspos(name community_account, uint64_t pos_id, name holde }); } -ACTION community::createbadge(name community_account, name badge_propose_name) -{ +ACTION community::createbadge( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + name badge_propose_name, + uint8_t issue_exec_type, + vector issue_sole_right_accounts, + vector issue_sole_right_pos_ids, + vector issue_proposer_right_accounts, + vector issue_proposer_right_pos_ids, + uint8_t issue_approval_type, + vector issue_approver_right_accounts, + vector issue_approver_right_pos_ids, + vector issue_voter_right_accounts, + vector issue_voter_right_pos_ids, + double issue_pass_rule, + uint64_t issue_vote_duration +) { // Todo: Verify badge param: action( permission_level{community_account, "active"_n}, @@ -1595,6 +1618,264 @@ ACTION community::createbadge(name community_account, name badge_propose_name) "exec"_n, std::make_tuple(cryptobadge_contract, badge_propose_name, community_account)) .send(); + + code_table _codes(_self, community_account.value); + + code_sole_decision_table _code_execution_rule(_self, community_account.value); + amend_sole_decision_table _amend_execution_rule(_self, community_account.value); + + code_collective_decision_table _code_vote_rule(_self, community_account.value); + ammend_collective_decision_table _amend_vote_rule(_self, community_account.value); + + position_table _positions(_self, community_account.value); + + auto getByCodeName = _codes.get_index<"by.code.name"_n>(); + auto ba_create_code = getByCodeName.find(BA_Create.value); + + vector code_actions; + code_actions.push_back("issuebadge"_n); + + name issue_badge_code_name; + if (issue_type == BadgeIssueType::WITHOUT_CLAIM) { + issue_badge_code_name = BA_Issue; + } else if (issue_type == BadgeIssueType::CLAIM_APPROVE_BY_ISSUER) { + issue_badge_code_name = BA_Claim; + } else { + check(false, "ERR::BADGE_ISSUE_TYPE_INVALID::Badge issue type is invalid"); + } + + // save new code to the table + auto issue_badge_code = _codes.emplace(community_account, [&](auto &row) { + row.code_id = _codes.available_primary_key(); + row.code_name = issue_badge_code_name; + row.contract_name = get_self(); + row.code_actions = code_actions; + row.code_exec_type = issue_exec_type; + row.code_type = {CodeTypeEnum::BADGE, badge_id}; + }); + + if (issue_exec_type != ExecutionType::COLLECTIVE_DECISION) { + RightHolder _right_holder; + _right_holder.accounts = issue_sole_right_accounts; + _right_holder.required_positions = issue_sole_right_pos_ids; + _code_execution_rule.emplace(community_account, [&](auto &row) { + row.code_id = issue_badge_code->code_id; + row.right_executor = _right_holder; + }); + } + + if (issue_exec_type != ExecutionType::SOLE_DECISION) { + RightHolder _right_proposer; + _right_proposer.accounts = issue_proposer_right_accounts; + _right_proposer.required_positions = issue_proposer_right_pos_ids; + RightHolder _right_approver; + _right_proposer.accounts = issue_approver_right_accounts; + _right_proposer.required_positions = issue_approver_right_pos_ids; + RightHolder _right_voter; + _right_proposer.accounts = issue_voter_right_accounts; + _right_proposer.required_positions = issue_voter_right_pos_ids; + _code_vote_rule.emplace(community_account, [&](auto &row) { + row.code_id = issue_badge_code->code_id; + row.right_proposer = _right_proposer; + row.right_approver = _right_approver; + row.right_voter = _right_voter; + row.approval_type = issue_approval_type; + row.pass_rule = issue_pass_rule; + row.vote_duration = issue_vote_duration; + }); + } + + code_actions.clear(); + code_actions.push_back("configbadge"_n); + + // save new code to the table + auto config_badge_code = _codes.emplace(community_account, [&](auto &row) { + row.code_id = _codes.available_primary_key(); + row.code_name = BA_Config; + row.contract_name = get_self(); + row.code_actions = code_actions; + row.amendment_exec_type = ba_create_code->code_exec_type; + row.code_type = {CodeTypeEnum::BADGE, badge_id}; + }); + + if (ba_create_code->code_exec_type != ExecutionType::COLLECTIVE_DECISION) { + auto ba_create_code_sole_decision = _code_execution_rule.find(ba_create_code->code_id); + if(ba_create_code_sole_decision != _code_execution_rule.end()) { + _amend_execution_rule.emplace(community_account, [&](auto &row) { + row.code_id = config_badge_code->code_id; + row.right_executor = ba_create_code_sole_decision->right_executor; + }); + + _code_execution_rule.emplace(community_account, [&](auto &row) { + row.code_id = config_badge_code->code_id; + row.right_executor = ba_create_code_sole_decision->right_executor; + }); + } + } + + if (ba_create_code->code_exec_type != ExecutionType::SOLE_DECISION) { + auto ba_create_code_collective_decision = _code_vote_rule.find(ba_create_code->code_id); + if (ba_create_code_collective_decision != _code_vote_rule.end()) { + _amend_vote_rule.emplace(community_account, [&](auto &row) { + row.code_id = config_badge_code->code_id; + row.right_proposer = ba_create_code_collective_decision->right_proposer; + row.right_approver = ba_create_code_collective_decision->right_approver; + row.right_voter = ba_create_code_collective_decision->right_voter; + row.approval_type = ba_create_code_collective_decision->approval_type; + row.pass_rule = ba_create_code_collective_decision->pass_rule; + row.vote_duration = ba_create_code_collective_decision->vote_duration; + }); + + _code_vote_rule.emplace(community_account, [&](auto &row) { + row.code_id = config_badge_code->code_id; + row.right_proposer = ba_create_code_collective_decision->right_proposer; + row.right_approver = ba_create_code_collective_decision->right_approver; + row.right_voter = ba_create_code_collective_decision->right_voter; + row.approval_type = ba_create_code_collective_decision->approval_type; + row.pass_rule = ba_create_code_collective_decision->pass_rule; + row.vote_duration = ba_create_code_collective_decision->vote_duration; + }); + } + } +} + +ACTION community::configbadge( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + name update_badge_proposal_name, + uint8_t issue_exec_type, + vector issue_sole_right_accounts, + vector issue_sole_right_pos_ids, + vector issue_proposer_right_accounts, + vector issue_proposer_right_pos_ids, + uint8_t issue_approval_type, + vector issue_approver_right_accounts, + vector issue_approver_right_pos_ids, + vector issue_voter_right_accounts, + vector issue_voter_right_pos_ids, + double issue_pass_rule, + uint64_t issue_vote_duration +) { + if (update_badge_proposal_name != name("")) { + // Todo: Verify badge param: + action( + permission_level{community_account, "active"_n}, + "eosio.msig"_n, + "approve"_n, + std::make_tuple(cryptobadge_contract, update_badge_proposal_name, permission_level{community_account, "active"_n})) + .send(); + + action( + permission_level{community_account, "active"_n}, + "eosio.msig"_n, + "exec"_n, + std::make_tuple(cryptobadge_contract, update_badge_proposal_name, community_account)) + .send(); + } + + code_table _codes(_self, community_account.value); + + code_sole_decision_table _code_execution_rule(_self, community_account.value); + amend_sole_decision_table _amend_execution_rule(_self, community_account.value); + + code_collective_decision_table _code_vote_rule(_self, community_account.value); + ammend_collective_decision_table _amend_vote_rule(_self, community_account.value); + + position_table _positions(_self, community_account.value); + + auto getByCodeName = _codes.get_index<"by.code.name"_n>(); + auto ba_create_code = getByCodeName.find(BA_Create.value); + + name issue_badge_code_name; + if (issue_type == BadgeIssueType::WITHOUT_CLAIM) { + issue_badge_code_name = BA_Issue; + } else if (issue_type == BadgeIssueType::CLAIM_APPROVE_BY_ISSUER){ + issue_badge_code_name = BA_Claim; + } else { + check(false, "ERR::BADGE_ISSUE_TYPE_INVALID::Badge issue type is invalid"); + } + + auto getByCodeReferId = _codes.get_index<"by.refer.id"_n>(); + auto issue_badge_code_itr = getByCodeReferId.find(badge_id); + + while (issue_badge_code_itr != getByCodeReferId.end()) { + if (issue_badge_code_itr->code_type.type == CodeTypeEnum::BADGE && + ( issue_badge_code_itr->code_name == BA_Issue || issue_badge_code_itr->code_name == BA_Claim)) { + break; + } + issue_badge_code_itr++; + } + + // save new code to the table + if (issue_badge_code_itr == getByCodeReferId.end()) { + vector code_actions; + code_actions.push_back("issuebadge"_n); + _codes.emplace(community_account, [&](auto &row) { + row.code_id = _codes.available_primary_key(); + row.code_name = issue_badge_code_name; + row.contract_name = get_self(); + row.code_actions = code_actions; + row.amendment_exec_type = issue_exec_type; + row.code_type = {CodeTypeEnum::BADGE, badge_id}; + }); + } else { + getByCodeReferId.modify(issue_badge_code_itr, community_account, [&](auto &row) { + row.code_name = issue_badge_code_name; + row.code_exec_type = issue_exec_type; + row.code_type = {CodeTypeEnum::BADGE, badge_id}; + }); + } + + if (issue_exec_type != ExecutionType::COLLECTIVE_DECISION) { + RightHolder _right_holder; + _right_holder.accounts = issue_sole_right_accounts; + _right_holder.required_positions = issue_sole_right_pos_ids; + auto code_exec_type_itr = _code_execution_rule.find(issue_badge_code_itr->code_id); + if (code_exec_type_itr == _code_execution_rule.end()) { + _code_execution_rule.emplace(community_account, [&](auto &row) { + row.code_id = issue_badge_code_itr->code_id; + row.right_executor = _right_holder; + }); + } else { + _code_execution_rule.modify(code_exec_type_itr, community_account, [&](auto &row) { + row.right_executor = _right_holder; + }); + } + } + + if (issue_exec_type != ExecutionType::SOLE_DECISION) { + RightHolder _right_proposer; + _right_proposer.accounts = issue_proposer_right_accounts; + _right_proposer.required_positions = issue_proposer_right_pos_ids; + RightHolder _right_approver; + _right_approver.accounts = issue_approver_right_accounts; + _right_approver.required_positions = issue_approver_right_pos_ids; + RightHolder _right_voter; + _right_voter.accounts = issue_voter_right_accounts; + _right_voter.required_positions = issue_voter_right_pos_ids; + auto code_vote_rule_itr = _code_vote_rule.find(issue_badge_code_itr->code_id); + if (code_vote_rule_itr == _code_vote_rule.end()) { + _code_vote_rule.emplace(community_account, [&](auto &row) { + row.code_id = issue_badge_code_itr->code_id; + row.right_proposer = _right_proposer; + row.right_approver = _right_approver; + row.right_voter = _right_voter; + row.approval_type = issue_approval_type; + row.pass_rule = issue_pass_rule; + row.vote_duration = issue_vote_duration; + }); + } else { + _code_vote_rule.modify(code_vote_rule_itr, community_account, [&](auto &row) { + row.right_proposer = _right_proposer; + row.right_approver = _right_approver; + row.right_voter = _right_voter; + row.approval_type = issue_approval_type; + row.pass_rule = issue_pass_rule; + row.vote_duration = issue_vote_duration; + }); + } + } } ACTION community::issuebadge(name community_account, name badge_propose_name) @@ -1759,4 +2040,34 @@ bool community::is_amend_action(name calling_action) { } \ } -EOSIO_ABI_CUSTOM(community, (setapprotype)(setvoter)(setapprover)(transfer)(verifyamend)(createacc)(create)(initcode)(initadminpos)(execcode)(createcode)(createpos)(configpos)(nominatepos)(approvepos)(voteforcode)(voteforpos)(dismisspos)(setexectype)(appointpos)(proposecode)(execproposal)(verifyholder)(createbadge)(issuebadge)(setproposer)(setvoterule)) +EOSIO_ABI_CUSTOM(community, +(setapprotype) +(setvoter) +(setapprover) +(transfer) +(verifyamend) +(createacc) +(create) +(initcode) +(initadminpos) +(execcode) +(createcode) +(createpos) +(configpos) +(nominatepos) +(approvepos) +(voteforcode) +(voteforpos) +(dismisspos) +(setexectype) +(appointpos) +(proposecode) +(execproposal) +(verifyholder) +(createbadge) +(issuebadge) +(configbadge) +(setsoleexec) +(setproposer) +(setvoterule) +)