From 9aa8c5d69fe63a91eb01268e6afc9ba051550a10 Mon Sep 17 00:00:00 2001 From: Dallas Johnson Date: Thu, 1 Dec 2022 11:23:24 +1100 Subject: [PATCH 01/10] Add change to collect votes to repair broken timestamp. --- .../daccustodian_shared.hpp | 5 +++-- contracts/daccustodian/debug.cpp | 21 ++++++++++++++----- .../external_observable_actions.cpp | 3 ++- contracts/daccustodian/privatehelpers.cpp | 6 +++--- contracts/daccustodian/registering.cpp | 8 +++---- contracts/daccustodian/voting.cpp | 6 +++--- 6 files changed, 31 insertions(+), 18 deletions(-) diff --git a/contract-shared-headers/daccustodian_shared.hpp b/contract-shared-headers/daccustodian_shared.hpp index ca73a577..f97fddc7 100644 --- a/contract-shared-headers/daccustodian_shared.hpp +++ b/contract-shared-headers/daccustodian_shared.hpp @@ -542,6 +542,7 @@ namespace eosdac { #ifdef DEBUG ACTION migratestate(const name &dac_id); ACTION resetvotes(const name &voter, const name &dac_id); + ACTION collectvotes(const name &dac_id); ACTION resetcands(const name &dac_id); ACTION resetstate(const name &dac_id); ACTION clearcands(const name &dac_id); @@ -589,8 +590,8 @@ namespace eosdac { name internal_dac_id, bool from_voting); std::pair get_vote_weight(name voter, name dac_id); void modifyVoteWeights(const account_weight_delta &awd, const vector &oldVotes, - const std::optional &oldVoteTimestamp, const vector &newVotes, const name dac_id, - const bool from_voting); + const std::optional &oldVoteTimestamp, const vector &newVotes, + time_point_sec new_time_stamp, const name dac_id, const bool from_voting); void modifyProxiesWeight(int64_t vote_weight, name oldProxy, name newProxy, name dac_id, bool from_voting); void assertPeriodTime(const dacglobals &globals); void distributeMeanPay(name internal_dac_id); diff --git a/contracts/daccustodian/debug.cpp b/contracts/daccustodian/debug.cpp index abb9adfd..a0971cb1 100644 --- a/contracts/daccustodian/debug.cpp +++ b/contracts/daccustodian/debug.cpp @@ -6,8 +6,20 @@ void daccustodian::resetvotes(const name &voter, const name &dac_id) { auto existingVote = votes_cast_by_members.find(voter.value); check(existingVote != votes_cast_by_members.end(), "No votes"); +} + +void daccustodian::collectvotes(const name &dac_id) { + require_auth(get_self()); - votes_cast_by_members.erase(existingVote); + votes_table votes_cast_by_members(_self, dac_id.value); + auto vote_ittr = votes_cast_by_members.begin(); + + while (vote_ittr != votes_cast_by_members.end()) { + update_number_of_votes({}, vote_ittr->candidates, dac_id); + const auto [vote_weight, vote_weight_quorum] = get_vote_weight(vote_ittr->voter, dac_id); + modifyVoteWeights({vote_ittr->voter, vote_weight, vote_weight_quorum}, {}, {}, vote_ittr->candidates, + vote_ittr->vote_time_stamp, dac_id, true); + } } void daccustodian::resetstate(const name &dac_id) { @@ -18,7 +30,6 @@ void daccustodian::resetstate(const name &dac_id) { currentState.set_total_votes_on_candidates(0); currentState.set_number_active_candidates(0); currentState.set_met_initial_votes_threshold(false); - currentState.save(get_self(), dac_id); } void daccustodian::resetcands(const name &dac_id) { @@ -29,9 +40,9 @@ void daccustodian::resetcands(const name &dac_id) { while (cand != candidates.end()) { candidates.modify(cand, same_payer, [&](candidate &c) { - c.total_vote_power = 0; - c.number_voters = 0; - c.is_active = 0; + c.total_vote_power = 0; + c.number_voters = 0; + // c.is_active = 0; c.avg_vote_time_stamp = eosio::time_point_sec(); c.update_index(); }); diff --git a/contracts/daccustodian/external_observable_actions.cpp b/contracts/daccustodian/external_observable_actions.cpp index 6630e29e..45aeee09 100644 --- a/contracts/daccustodian/external_observable_actions.cpp +++ b/contracts/daccustodian/external_observable_actions.cpp @@ -33,7 +33,8 @@ ACTION daccustodian::weightobsv(const vector &account_weig if (existingVote->proxy.value != 0) { modifyProxiesWeight(awd.weight_delta, name{}, existingVote->proxy, dac_id, false); } else { - modifyVoteWeights(awd, {}, existingVote->vote_time_stamp, existingVote->candidates, dac_id, false); + modifyVoteWeights(awd, {}, existingVote->vote_time_stamp, existingVote->candidates, + existingVote->vote_time_stamp, dac_id, false); } } } diff --git a/contracts/daccustodian/privatehelpers.cpp b/contracts/daccustodian/privatehelpers.cpp index 75ed84d1..3a7c9a12 100644 --- a/contracts/daccustodian/privatehelpers.cpp +++ b/contracts/daccustodian/privatehelpers.cpp @@ -86,8 +86,8 @@ std::pair daccustodian::get_vote_weight(name voter, name dac_i } void daccustodian::modifyVoteWeights(const account_weight_delta &awd, const vector &oldVotes, - const std::optional &oldVoteTimestamp, const vector &newVotes, const name dac_id, - const bool from_voting) { + const std::optional &oldVoteTimestamp, const vector &newVotes, time_point_sec new_time_stamp, + const name dac_id, const bool from_voting) { auto err = Err{"daccustodian::modifyVoteWeights"}; // This could be optimised with set diffing to avoid remove then add for unchanged votes. - later @@ -120,7 +120,7 @@ void daccustodian::modifyVoteWeights(const account_weight_delta &awd, const vect if (oldVoteTimestamp.has_value()) { updateVoteWeights(oldVotes, *oldVoteTimestamp, -awd.weight_delta, dac_id, from_voting); } - updateVoteWeights(newVotes, now(), awd.weight_delta, dac_id, from_voting); + updateVoteWeights(newVotes, new_time_stamp, awd.weight_delta, dac_id, from_voting); } permission_level daccustodian::getCandidatePermission(name account, name dac_id) { diff --git a/contracts/daccustodian/registering.cpp b/contracts/daccustodian/registering.cpp index 210d5640..527ca9fe 100644 --- a/contracts/daccustodian/registering.cpp +++ b/contracts/daccustodian/registering.cpp @@ -48,7 +48,7 @@ ACTION daccustodian::withdrawcane(const name &cand, const name &dac_id) { require_auth(cand); auto registered_candidates = candidates_table{_self, dac_id.value}; const auto ®_candidate = registered_candidates.get( - cand.value, "ERR::REMOVECANDIDATE_NOT_CURRENT_CANDIDATE::Candidate is not already registered."); + cand.value, "ERR::REMOVECANDIDATE_NOT_CURRENT_CANDIDATE::Candidate is not already registered."); check(reg_candidate.is_active, "ERR::REMOVECANDIDATE_CANDIDATE_NOT_ACTIVE::Candidate is not active."); disableCandidate(cand, dac_id); } @@ -188,7 +188,7 @@ void daccustodian::removeCustodian(name cust, name dac_id) { void daccustodian::disableCandidate(name cand, name dac_id) { auto registered_candidates = candidates_table{_self, dac_id.value}; const auto ®_candidate = registered_candidates.get( - cand.value, "ERR::REMOVECANDIDATE_NOT_CURRENT_CANDIDATE::Candidate is not already registered."); + cand.value, "ERR::REMOVECANDIDATE_NOT_CURRENT_CANDIDATE::Candidate is not already registered."); if (!reg_candidate.is_active) { return; @@ -210,7 +210,7 @@ void daccustodian::disableCandidate(name cand, name dac_id) { void daccustodian::removeCandidate(name cand, name dac_id) { auto registered_candidates = candidates_table{_self, dac_id.value}; const auto ®_candidate = registered_candidates.get( - cand.value, "ERR::REMOVECANDIDATE_NOT_CURRENT_CANDIDATE::Candidate is not already registered."); + cand.value, "ERR::REMOVECANDIDATE_NOT_CURRENT_CANDIDATE::Candidate is not already registered."); check(!reg_candidate.is_active, "ERR::REMOVECANDIDATE_CANDIDATE_IS_ACTIVE::Candidate is still active."); // remove entry for candperms @@ -254,7 +254,7 @@ ACTION daccustodian::unregproxy(const name &proxy_member, const name &dac_id) { auto existingVote = votes_cast_by_members.find(proxy_member.value); if (existingVote != votes_cast_by_members.end()) { modifyVoteWeights({name{}, found_proxy->total_weight, found_proxy->total_weight}, existingVote->candidates, - existingVote->vote_time_stamp, {}, dac_id, false); + existingVote->vote_time_stamp, {}, now(), dac_id, false); } } diff --git a/contracts/daccustodian/voting.cpp b/contracts/daccustodian/voting.cpp index a1186b3e..976c5bee 100644 --- a/contracts/daccustodian/voting.cpp +++ b/contracts/daccustodian/voting.cpp @@ -31,7 +31,7 @@ ACTION daccustodian::votecust(const name &voter, const vector &newvotes, c update_number_of_votes(existingVote->candidates, newvotes, dac_id); modifyVoteWeights({voter, vote_weight, vote_weight_quorum}, existingVote->candidates, - existingVote->vote_time_stamp, newvotes, dac_id, true); + existingVote->vote_time_stamp, newvotes, now(), dac_id, true); if (newvotes.size() == 0) { // Remove the vote if the array of candidates is empty @@ -49,7 +49,7 @@ ACTION daccustodian::votecust(const name &voter, const vector &newvotes, c } else { update_number_of_votes({}, newvotes, dac_id); - modifyVoteWeights({voter, vote_weight, vote_weight_quorum}, {}, {}, newvotes, dac_id, true); + modifyVoteWeights({voter, vote_weight, vote_weight_quorum}, {}, {}, newvotes, now(), dac_id, true); votes_cast_by_members.emplace(voter, [&](vote &v) { v.voter = voter; @@ -124,7 +124,7 @@ void daccustodian::modifyProxiesWeight( update_number_of_votes(oldProxyVotes, newProxyVotes, dac_id); } modifyVoteWeights( - {name{}, vote_weight, vote_weight}, oldProxyVotes, oldVoteTimestamp, newProxyVotes, dac_id, from_voting); + {name{}, vote_weight, vote_weight}, oldProxyVotes, oldVoteTimestamp, newProxyVotes, now(), dac_id, from_voting); } ACTION daccustodian::voteproxy(const name &voter, const name &proxyName, const name &dac_id) { From 54c62500b2bdcfbf75d05307867cd242d3a17705 Mon Sep 17 00:00:00 2001 From: Dallas Johnson Date: Thu, 1 Dec 2022 15:22:29 +1100 Subject: [PATCH 02/10] =?UTF-8?q?Disable=20the=20resetting=20the=20number?= =?UTF-8?q?=20of=20candidates=20for=20the=20debug=20reset=20action.=20This?= =?UTF-8?q?=20will=20need=20be=20called=20as=20well=20as=20`resetcands`=20?= =?UTF-8?q?before=20`collectvotes`.=20Also=20forgot=20to=20increment=20`vo?= =?UTF-8?q?te=5Fitrr`=20in=20the=20loop=F0=9F=A4=A6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contracts/daccustodian/debug.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/daccustodian/debug.cpp b/contracts/daccustodian/debug.cpp index a0971cb1..454528b0 100644 --- a/contracts/daccustodian/debug.cpp +++ b/contracts/daccustodian/debug.cpp @@ -19,6 +19,7 @@ void daccustodian::collectvotes(const name &dac_id) { const auto [vote_weight, vote_weight_quorum] = get_vote_weight(vote_ittr->voter, dac_id); modifyVoteWeights({vote_ittr->voter, vote_weight, vote_weight_quorum}, {}, {}, vote_ittr->candidates, vote_ittr->vote_time_stamp, dac_id, true); + vote_ittr++; } } @@ -28,8 +29,8 @@ void daccustodian::resetstate(const name &dac_id) { currentState.set_total_weight_of_votes(0); currentState.set_total_votes_on_candidates(0); - currentState.set_number_active_candidates(0); - currentState.set_met_initial_votes_threshold(false); + // currentState.set_number_active_candidates(0); + // currentState.set_met_initial_votes_threshold(false); } void daccustodian::resetcands(const name &dac_id) { From 87be6f1349c5c17c318ecded6e49a5dc03bd2815 Mon Sep 17 00:00:00 2001 From: Dallas Johnson Date: Thu, 1 Dec 2022 21:10:37 +1100 Subject: [PATCH 03/10] Fixes a potential problem caused by `abs` of time delta. --- contracts/daccustodian/debug.cpp | 1 + contracts/daccustodian/privatehelpers.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/daccustodian/debug.cpp b/contracts/daccustodian/debug.cpp index 454528b0..a4410063 100644 --- a/contracts/daccustodian/debug.cpp +++ b/contracts/daccustodian/debug.cpp @@ -31,6 +31,7 @@ void daccustodian::resetstate(const name &dac_id) { currentState.set_total_votes_on_candidates(0); // currentState.set_number_active_candidates(0); // currentState.set_met_initial_votes_threshold(false); + currentState.save(get_self(), dac_id); } void daccustodian::resetcands(const name &dac_id) { diff --git a/contracts/daccustodian/privatehelpers.cpp b/contracts/daccustodian/privatehelpers.cpp index 3a7c9a12..c8f97238 100644 --- a/contracts/daccustodian/privatehelpers.cpp +++ b/contracts/daccustodian/privatehelpers.cpp @@ -46,7 +46,7 @@ time_point_sec daccustodian::calculate_avg_vote_time_stamp(const time_point_sec const auto initial = S{vote_time_before.sec_since_epoch()}.to(); const auto current = S{vote_time_stamp.sec_since_epoch()}.to(); - const auto time_delta = (current - initial).abs(); + const auto time_delta = (current - initial); const auto new_seconds = initial + time_delta * S{weight}.to() / S{total_votes}.to(); return time_point_sec{new_seconds.to()}; From 6fad38c1384d4d911bb397af27368eeb9cc876bc Mon Sep 17 00:00:00 2001 From: Dallas Johnson Date: Thu, 1 Dec 2022 22:13:56 +1100 Subject: [PATCH 04/10] Quick batch change for collectvotes --- contract-shared-headers/daccustodian_shared.hpp | 2 +- contracts/daccustodian/debug.cpp | 6 +++--- contracts/daccustodian/voting.cpp | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contract-shared-headers/daccustodian_shared.hpp b/contract-shared-headers/daccustodian_shared.hpp index f97fddc7..bea14ebf 100644 --- a/contract-shared-headers/daccustodian_shared.hpp +++ b/contract-shared-headers/daccustodian_shared.hpp @@ -542,7 +542,7 @@ namespace eosdac { #ifdef DEBUG ACTION migratestate(const name &dac_id); ACTION resetvotes(const name &voter, const name &dac_id); - ACTION collectvotes(const name &dac_id); + ACTION collectvotes(const name &dac_id, name from, name to); ACTION resetcands(const name &dac_id); ACTION resetstate(const name &dac_id); ACTION clearcands(const name &dac_id); diff --git a/contracts/daccustodian/debug.cpp b/contracts/daccustodian/debug.cpp index a4410063..ec99df5e 100644 --- a/contracts/daccustodian/debug.cpp +++ b/contracts/daccustodian/debug.cpp @@ -8,13 +8,13 @@ void daccustodian::resetvotes(const name &voter, const name &dac_id) { check(existingVote != votes_cast_by_members.end(), "No votes"); } -void daccustodian::collectvotes(const name &dac_id) { +void daccustodian::collectvotes(const name &dac_id, name from, name to) { require_auth(get_self()); votes_table votes_cast_by_members(_self, dac_id.value); - auto vote_ittr = votes_cast_by_members.begin(); + auto vote_ittr = votes_cast_by_members.lower_bound(from.value); - while (vote_ittr != votes_cast_by_members.end()) { + while (vote_ittr != votes_cast_by_members.end() && vote_ittr->voter != to) { update_number_of_votes({}, vote_ittr->candidates, dac_id); const auto [vote_weight, vote_weight_quorum] = get_vote_weight(vote_ittr->voter, dac_id); modifyVoteWeights({vote_ittr->voter, vote_weight, vote_weight_quorum}, {}, {}, vote_ittr->candidates, diff --git a/contracts/daccustodian/voting.cpp b/contracts/daccustodian/voting.cpp index 976c5bee..dd638480 100644 --- a/contracts/daccustodian/voting.cpp +++ b/contracts/daccustodian/voting.cpp @@ -4,6 +4,9 @@ ACTION daccustodian::votecust(const name &voter, const vector &newvotes, c #ifndef IS_DEV // check(dac_id == "testa"_n || dac_id == "testb"_n, "Voting is not yet enabled in the Planet DAOs."); #endif + + check(dac_id != "nerix"_n, "Sorry, voting is paused a few minutes maintainence."); + candidates_table registered_candidates(_self, dac_id.value); const auto globals = dacglobals::current(get_self(), dac_id); From 9730a2eb0a7e71accc58fdfa58169e78c24e83a6 Mon Sep 17 00:00:00 2001 From: Dallas Johnson Date: Fri, 2 Dec 2022 20:10:09 +1100 Subject: [PATCH 05/10] Migration fix --- contract-shared-headers/daccustodian_shared.hpp | 4 ++-- contracts/daccustodian/migration.cpp | 11 ++++++++--- contracts/daccustodian/voting.cpp | 2 -- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/contract-shared-headers/daccustodian_shared.hpp b/contract-shared-headers/daccustodian_shared.hpp index bea14ebf..45a8a135 100644 --- a/contract-shared-headers/daccustodian_shared.hpp +++ b/contract-shared-headers/daccustodian_shared.hpp @@ -94,7 +94,7 @@ namespace eosdac { #ifndef TRANSFER_DELAY #define TRANSFER_DELAY 60 * 60 #endif - struct [[eosio::table("custodians"), eosio::contract("daccustodian")]] custodian { + struct [[eosio::table("custodians1"), eosio::contract("daccustodian")]] custodian { eosio::name cust_name; eosio::asset requestedpay; uint64_t total_vote_power; @@ -123,7 +123,7 @@ namespace eosdac { } }; - using custodians_table = eosio::multi_index<"custodians"_n, custodian, + using custodians_table = eosio::multi_index<"custodians1"_n, custodian, eosio::indexed_by<"byvotesrank"_n, eosio::const_mem_fun>, #ifdef MIGRATION_STAGE_2 eosio::indexed_by<"bydecayed"_n, eosio::const_mem_fun>, diff --git a/contracts/daccustodian/migration.cpp b/contracts/daccustodian/migration.cpp index 7c60cfbb..de1595eb 100644 --- a/contracts/daccustodian/migration.cpp +++ b/contracts/daccustodian/migration.cpp @@ -15,9 +15,14 @@ ACTION daccustodian::migrate1(const name dac_id) { } #ifdef MIGRATION_STAGE_2 ACTION daccustodian::migrate2(const name dac_id) { - auto custodians = custodians_table{get_self(), dac_id.value}; - auto custodians2 = custodians2_table{get_self(), dac_id.value}; - auto itr = custodians2.begin(); + auto custodians = custodians_table{get_self(), dac_id.value}; + auto custodians2 = custodians2_table{get_self(), dac_id.value}; + auto itr = custodians2.begin(); + auto old_cust_itr = custodians.begin(); + while (old_cust_itr != custodians.end()) { + old_cust_itr = custodians.erase(old_cust_itr); + } + while (itr != custodians2.end()) { custodians.emplace(get_self(), [&](auto &c) { c.cust_name = itr->cust_name; diff --git a/contracts/daccustodian/voting.cpp b/contracts/daccustodian/voting.cpp index dd638480..5a7f5003 100644 --- a/contracts/daccustodian/voting.cpp +++ b/contracts/daccustodian/voting.cpp @@ -5,8 +5,6 @@ ACTION daccustodian::votecust(const name &voter, const vector &newvotes, c // check(dac_id == "testa"_n || dac_id == "testb"_n, "Voting is not yet enabled in the Planet DAOs."); #endif - check(dac_id != "nerix"_n, "Sorry, voting is paused a few minutes maintainence."); - candidates_table registered_candidates(_self, dac_id.value); const auto globals = dacglobals::current(get_self(), dac_id); From a0cf7d6efff39c7b5b87baca7020c83acd95cb43 Mon Sep 17 00:00:00 2001 From: Dallas Johnson Date: Fri, 2 Dec 2022 22:03:22 +1100 Subject: [PATCH 06/10] Update the reference to the custodians1 table instead of custodians. --- contract-shared-headers/daccustodian_shared.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contract-shared-headers/daccustodian_shared.hpp b/contract-shared-headers/daccustodian_shared.hpp index 6c93257f..e4301ef9 100644 --- a/contract-shared-headers/daccustodian_shared.hpp +++ b/contract-shared-headers/daccustodian_shared.hpp @@ -30,7 +30,7 @@ namespace eosdac { #ifndef TRANSFER_DELAY #define TRANSFER_DELAY 60 * 60 #endif - struct [[eosio::table("custodians"), eosio::contract("daccustodian")]] custodian { + struct [[eosio::table("custodians1"), eosio::contract("daccustodian")]] custodian { eosio::name cust_name; eosio::asset requestedpay; uint64_t total_vote_power; @@ -55,7 +55,7 @@ namespace eosdac { } }; - using custodians_table = eosio::multi_index<"custodians"_n, custodian, + using custodians_table = eosio::multi_index<"custodians1"_n, custodian, eosio::indexed_by<"byvotesrank"_n, eosio::const_mem_fun>, eosio::indexed_by<"bydecayed"_n, eosio::const_mem_fun>, eosio::indexed_by<"byreqpay"_n, eosio::const_mem_fun>>; From 9a2407ce2ab40d896927b3bbd67ab6feed26d274 Mon Sep 17 00:00:00 2001 From: Angelo Laub Date: Fri, 2 Dec 2022 13:34:01 +0100 Subject: [PATCH 07/10] add capability to test migration from old version of contract to a new one --- contracts/TestHelpers.ts | 51 +- contracts/daccustodian/daccustodian.test.ts | 10 +- daccustodian.old/daccustodian.abi | 1148 +++++++++++++++++++ daccustodian.old/daccustodian.wasm | Bin 0 -> 260277 bytes 4 files changed, 1206 insertions(+), 3 deletions(-) create mode 100644 daccustodian.old/daccustodian.abi create mode 100755 daccustodian.old/daccustodian.wasm diff --git a/contracts/TestHelpers.ts b/contracts/TestHelpers.ts index b49bf90d..7d3bc55e 100644 --- a/contracts/TestHelpers.ts +++ b/contracts/TestHelpers.ts @@ -25,6 +25,7 @@ import * as chai from 'chai'; import * as fs from 'fs'; import * as path from 'path'; +import { rename, stat } from 'node:fs/promises'; export var NUMBER_OF_CANDIDATES = 7; @@ -67,7 +68,45 @@ export class SharedTestObjects { return SharedTestObjects.instance; } + public async useOld() { + // assumes daccustodian is new contract + const is_old = await fileExists( + './artifacts/compiled_contracts/contracts/daccustodian.new' + ); + if (is_old) { + // old contract is already in place, nothing to do + return; + } + await rename( + './artifacts/compiled_contracts/contracts/daccustodian', + './artifacts/compiled_contracts/contracts/daccustodian.new' + ); + await rename( + './artifacts/compiled_contracts/contracts/daccustodian.old', + './artifacts/compiled_contracts/contracts/daccustodian' + ); + } + public async useNew() { + const is_new = await fileExists( + './artifacts/compiled_contracts/contracts/daccustodian.old' + ); + if (is_new) { + // new contract is already in place, nothing to do + return; + } + await rename( + './artifacts/compiled_contracts/contracts/daccustodian', + './artifacts/compiled_contracts/contracts/daccustodian.old' + ); + await rename( + './artifacts/compiled_contracts/contracts/daccustodian.new', + './artifacts/compiled_contracts/contracts/daccustodian' + ); + } + private async initAndGetSharedObjects() { + await this.useOld(); + console.log('Init eos blockchain'); await sleep(1000); this.tokenIssuer = await AccountManager.createAccount('federation'); @@ -925,7 +964,7 @@ export class SharedTestObjects { // Not used for now but could be useful later async function setup_external(name: string) { const compiled_dir = path.normalize( - `${__dirname}/../artifacts/compiled_contracts/${name}` + `${__dirname}/./compiled_contracts/${name}` ); if (!fs.existsSync(compiled_dir)) { @@ -975,3 +1014,13 @@ enum dac_state_type { dac_state_typeINACTIVE = 0, dac_state_typeACTIVE = 1, } + +// returns true if file exists, false otherwise +async function fileExists(path: string) { + try { + await stat(path); + return true; + } catch (err) { + return false; + } +} diff --git a/contracts/daccustodian/daccustodian.test.ts b/contracts/daccustodian/daccustodian.test.ts index 2474eebf..4fd6399c 100644 --- a/contracts/daccustodian/daccustodian.test.ts +++ b/contracts/daccustodian/daccustodian.test.ts @@ -12,6 +12,7 @@ import { TableRowsResult, assertBalanceEqual, Asset, + ContractDeployer, } from 'lamington'; const _ = require('lodash'); import { @@ -403,7 +404,6 @@ describe('Daccustodian', () => { }), [ { - serial: 1, data: [ { key: 'auth_threshold_high', @@ -636,7 +636,6 @@ describe('Daccustodian', () => { const result = await shared.daccustodian_contract.dacglobalsTable({ scope: dacId, }); - console.log('serial: ' + result.rows[0].serial); await shared.daccustodian_contract.nominatecane( newUser1.name, '25.0000 EOS', @@ -768,6 +767,13 @@ describe('Daccustodian', () => { let dacId = 'canddac'; let cands: Account[]; before(async () => { + await shared.useNew(); + shared.daccustodian_contract = await debugPromise( + ContractDeployer.deployWithName('daccustodian', 'daccustodian'), + 'created daccustodian' + ); + console.log('deployed new version of contract'); + await shared.initDac(dacId, '4,CANDAC', '1000000.0000 CANDAC'); await shared.updateconfig(dacId, '12.0000 CANDAC'); await shared.dac_token_contract.stakeconfig( diff --git a/daccustodian.old/daccustodian.abi b/daccustodian.old/daccustodian.abi new file mode 100644 index 00000000..030d5c13 --- /dev/null +++ b/daccustodian.old/daccustodian.abi @@ -0,0 +1,1148 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.2", + "types": [ + { + "new_type_name": "state_value_variant", + "type": "variant_uint32_uint64_int64_bool_int64[]_name_string_time_point_sec" + }, + { + "new_type_name": "state_value_variant2", + "type": "variant_int8_uint8_int32_uint32_int64_uint64_int128_uint128_bool_int64[]_name_string_time_point_sec_asset_extended_asset" + } + ], + "structs": [ + { + "name": "account_balance_delta", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "balance_delta", + "type": "asset" + } + ] + }, + { + "name": "account_stake_delta", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "stake_delta", + "type": "asset" + }, + { + "name": "unstake_delay", + "type": "uint32" + } + ] + }, + { + "name": "account_weight_delta", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "weight_delta", + "type": "int64" + }, + { + "name": "weight_delta_quorum", + "type": "int64" + } + ] + }, + { + "name": "appointcust", + "base": "", + "fields": [ + { + "name": "cust", + "type": "name[]" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "balanceobsv", + "base": "", + "fields": [ + { + "name": "account_balance_deltas", + "type": "account_balance_delta[]" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "candidate", + "base": "", + "fields": [ + { + "name": "candidate_name", + "type": "name" + }, + { + "name": "requestedpay", + "type": "asset" + }, + { + "name": "rank", + "type": "uint64" + }, + { + "name": "gap_filler", + "type": "uint64" + }, + { + "name": "total_vote_power", + "type": "uint64" + }, + { + "name": "is_active", + "type": "uint8" + }, + { + "name": "number_voters", + "type": "uint32" + }, + { + "name": "avg_vote_time_stamp", + "type": "time_point_sec" + } + ] + }, + { + "name": "candperm", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "permission", + "type": "name" + } + ] + }, + { + "name": "claimbudget", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "claimpay", + "base": "", + "fields": [ + { + "name": "payid", + "type": "uint64" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "clearrank", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "contr_config", + "base": "", + "fields": [ + { + "name": "lockupasset", + "type": "extended_asset" + }, + { + "name": "maxvotes", + "type": "uint8" + }, + { + "name": "numelected", + "type": "uint8" + }, + { + "name": "periodlength", + "type": "uint32" + }, + { + "name": "should_pay_via_service_provider", + "type": "bool" + }, + { + "name": "initial_vote_quorum_percent", + "type": "uint32" + }, + { + "name": "token_supply_theshold", + "type": "uint64" + }, + { + "name": "vote_quorum_percent", + "type": "uint32" + }, + { + "name": "auth_threshold_high", + "type": "uint8" + }, + { + "name": "auth_threshold_mid", + "type": "uint8" + }, + { + "name": "auth_threshold_low", + "type": "uint8" + }, + { + "name": "lockup_release_time_delay", + "type": "uint32" + }, + { + "name": "requested_pay_max", + "type": "extended_asset" + } + ] + }, + { + "name": "contr_state2", + "base": "", + "fields": [ + { + "name": "lastperiodtime", + "type": "time_point_sec" + }, + { + "name": "data", + "type": "pair_uint8_state_value_variant[]" + } + ] + }, + { + "name": "custodian", + "base": "", + "fields": [ + { + "name": "cust_name", + "type": "name" + }, + { + "name": "requestedpay", + "type": "asset" + }, + { + "name": "total_vote_power", + "type": "uint64" + }, + { + "name": "rank", + "type": "uint64" + }, + { + "name": "number_voters", + "type": "uint32" + }, + { + "name": "avg_vote_time_stamp", + "type": "time_point_sec" + } + ] + }, + { + "name": "custodian2", + "base": "", + "fields": [ + { + "name": "cust_name", + "type": "name" + }, + { + "name": "requestedpay", + "type": "asset" + }, + { + "name": "rank", + "type": "uint64" + }, + { + "name": "total_vote_power", + "type": "uint64" + }, + { + "name": "number_voters", + "type": "uint32" + }, + { + "name": "avg_vote_time_stamp", + "type": "time_point_sec" + } + ] + }, + { + "name": "dacglobals", + "base": "", + "fields": [ + { + "name": "data", + "type": "pair_string_state_value_variant2[]" + } + ] + }, + { + "name": "fillstate", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "firecand", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "lockupStake", + "type": "bool" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "firecust", + "base": "", + "fields": [ + { + "name": "cust", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "flagcandprof", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "reason", + "type": "string" + }, + { + "name": "reporter", + "type": "name" + }, + { + "name": "block", + "type": "bool" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "migrate1", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "migrate2", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "migraterank", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "newperiod", + "base": "", + "fields": [ + { + "name": "message", + "type": "string" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "nominate", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "nominatecane", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "requestedpay", + "type": "asset" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "pair_string_state_value_variant2", + "base": "", + "fields": [ + { + "name": "key", + "type": "string" + }, + { + "name": "value", + "type": "state_value_variant2" + } + ] + }, + { + "name": "pair_uint8_state_value_variant", + "base": "", + "fields": [ + { + "name": "key", + "type": "uint8" + }, + { + "name": "value", + "type": "state_value_variant" + } + ] + }, + { + "name": "pay", + "base": "", + "fields": [ + { + "name": "key", + "type": "uint64" + }, + { + "name": "receiver", + "type": "name" + }, + { + "name": "quantity", + "type": "extended_asset" + } + ] + }, + { + "name": "paycpu", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "proxy", + "base": "", + "fields": [ + { + "name": "proxy", + "type": "name" + }, + { + "name": "total_weight", + "type": "int64" + } + ] + }, + { + "name": "regproxy", + "base": "", + "fields": [ + { + "name": "proxy", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "rejectcuspay", + "base": "", + "fields": [ + { + "name": "payid", + "type": "uint64" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "removecand", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "removecstvte", + "base": "", + "fields": [ + { + "name": "voter", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "removecuspay", + "base": "", + "fields": [ + { + "name": "payid", + "type": "uint64" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "resigncust", + "base": "", + "fields": [ + { + "name": "cust", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "runnewperiod", + "base": "", + "fields": [ + { + "name": "message", + "type": "string" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "setbudget", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + }, + { + "name": "percentage", + "type": "uint16" + } + ] + }, + { + "name": "setperm", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "permission", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "stakeobsv", + "base": "", + "fields": [ + { + "name": "account_stake_deltas", + "type": "account_stake_delta[]" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "stprofile", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "profile", + "type": "string" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "tstaddcust", + "base": "", + "fields": [ + { + "name": "cust", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "unregproxy", + "base": "", + "fields": [ + { + "name": "proxy", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "unsetbudget", + "base": "", + "fields": [ + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "updatebio", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "bio", + "type": "string" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "updateconfige", + "base": "", + "fields": [ + { + "name": "new_config", + "type": "contr_config" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "updatereqpay", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "requestedpay", + "type": "asset" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "vote", + "base": "", + "fields": [ + { + "name": "voter", + "type": "name" + }, + { + "name": "proxy", + "type": "name" + }, + { + "name": "candidates", + "type": "name[]" + }, + { + "name": "vote_time_stamp", + "type": "time_point_sec" + }, + { + "name": "vote_count", + "type": "uint8" + } + ] + }, + { + "name": "votecust", + "base": "", + "fields": [ + { + "name": "voter", + "type": "name" + }, + { + "name": "newvotes", + "type": "name[]" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "voteproxy", + "base": "", + "fields": [ + { + "name": "voter", + "type": "name" + }, + { + "name": "proxy", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "weightobsv", + "base": "", + "fields": [ + { + "name": "account_weight_deltas", + "type": "account_weight_delta[]" + }, + { + "name": "dac_id", + "type": "name" + } + ] + }, + { + "name": "withdrawcane", + "base": "", + "fields": [ + { + "name": "cand", + "type": "name" + }, + { + "name": "dac_id", + "type": "name" + } + ] + } + ], + "actions": [ + { + "name": "appointcust", + "type": "appointcust", + "ricardian_contract": "" + }, + { + "name": "balanceobsv", + "type": "balanceobsv", + "ricardian_contract": "" + }, + { + "name": "claimbudget", + "type": "claimbudget", + "ricardian_contract": "" + }, + { + "name": "claimpay", + "type": "claimpay", + "ricardian_contract": "" + }, + { + "name": "clearrank", + "type": "clearrank", + "ricardian_contract": "" + }, + { + "name": "fillstate", + "type": "fillstate", + "ricardian_contract": "" + }, + { + "name": "firecand", + "type": "firecand", + "ricardian_contract": "" + }, + { + "name": "firecust", + "type": "firecust", + "ricardian_contract": "" + }, + { + "name": "flagcandprof", + "type": "flagcandprof", + "ricardian_contract": "" + }, + { + "name": "migrate1", + "type": "migrate1", + "ricardian_contract": "" + }, + { + "name": "migrate2", + "type": "migrate2", + "ricardian_contract": "" + }, + { + "name": "migraterank", + "type": "migraterank", + "ricardian_contract": "" + }, + { + "name": "newperiod", + "type": "newperiod", + "ricardian_contract": "" + }, + { + "name": "nominate", + "type": "nominate", + "ricardian_contract": "" + }, + { + "name": "nominatecane", + "type": "nominatecane", + "ricardian_contract": "" + }, + { + "name": "paycpu", + "type": "paycpu", + "ricardian_contract": "" + }, + { + "name": "regproxy", + "type": "regproxy", + "ricardian_contract": "" + }, + { + "name": "rejectcuspay", + "type": "rejectcuspay", + "ricardian_contract": "" + }, + { + "name": "removecand", + "type": "removecand", + "ricardian_contract": "" + }, + { + "name": "removecstvte", + "type": "removecstvte", + "ricardian_contract": "" + }, + { + "name": "removecuspay", + "type": "removecuspay", + "ricardian_contract": "" + }, + { + "name": "resigncust", + "type": "resigncust", + "ricardian_contract": "" + }, + { + "name": "runnewperiod", + "type": "runnewperiod", + "ricardian_contract": "" + }, + { + "name": "setbudget", + "type": "setbudget", + "ricardian_contract": "" + }, + { + "name": "setperm", + "type": "setperm", + "ricardian_contract": "" + }, + { + "name": "stakeobsv", + "type": "stakeobsv", + "ricardian_contract": "" + }, + { + "name": "stprofile", + "type": "stprofile", + "ricardian_contract": "" + }, + { + "name": "tstaddcust", + "type": "tstaddcust", + "ricardian_contract": "" + }, + { + "name": "unregproxy", + "type": "unregproxy", + "ricardian_contract": "" + }, + { + "name": "unsetbudget", + "type": "unsetbudget", + "ricardian_contract": "" + }, + { + "name": "updatebio", + "type": "updatebio", + "ricardian_contract": "" + }, + { + "name": "updateconfige", + "type": "updateconfige", + "ricardian_contract": "" + }, + { + "name": "updatereqpay", + "type": "updatereqpay", + "ricardian_contract": "" + }, + { + "name": "votecust", + "type": "votecust", + "ricardian_contract": "" + }, + { + "name": "voteproxy", + "type": "voteproxy", + "ricardian_contract": "" + }, + { + "name": "weightobsv", + "type": "weightobsv", + "ricardian_contract": "" + }, + { + "name": "withdrawcane", + "type": "withdrawcane", + "ricardian_contract": "" + } + ], + "tables": [ + { + "name": "candidates", + "type": "candidate", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "candperms", + "type": "candperm", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "config2", + "type": "contr_config", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "custodians", + "type": "custodian", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "custodians2", + "type": "custodian2", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "dacglobals", + "type": "dacglobals", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "pendingpay", + "type": "pay", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "proxies", + "type": "proxy", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "state2", + "type": "contr_state2", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "votes", + "type": "vote", + "index_type": "i64", + "key_names": [], + "key_types": [] + } + ], + "kv_tables": {}, + "ricardian_clauses": [], + "variants": [ + { + "name": "variant_int8_uint8_int32_uint32_int64_uint64_int128_uint128_bool_int64[]_name_string_time_point_sec_asset_extended_asset", + "types": ["int8","uint8","int32","uint32","int64","uint64","int128","uint128","bool","int64[]","name","string","time_point_sec","asset","extended_asset"] + }, + { + "name": "variant_uint32_uint64_int64_bool_int64[]_name_string_time_point_sec", + "types": ["uint32","uint64","int64","bool","int64[]","name","string","time_point_sec"] + } + ], + "action_results": [] +} \ No newline at end of file diff --git a/daccustodian.old/daccustodian.wasm b/daccustodian.old/daccustodian.wasm new file mode 100755 index 0000000000000000000000000000000000000000..500f6556c0b094ec99c6496ead838c1972b0ff68 GIT binary patch literal 260277 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 literal 0 HcmV?d00001 From bde1d48b43f0afc9c76adb28f5d1f4d6c84750e0 Mon Sep 17 00:00:00 2001 From: Angelo Laub Date: Fri, 2 Dec 2022 13:34:09 +0100 Subject: [PATCH 08/10] update safemath submodule --- contract-shared-headers/safemath | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract-shared-headers/safemath b/contract-shared-headers/safemath index 41b53d80..d08be8fb 160000 --- a/contract-shared-headers/safemath +++ b/contract-shared-headers/safemath @@ -1 +1 @@ -Subproject commit 41b53d80b38350cba0150841617c7eb057306136 +Subproject commit d08be8fb7ad8c85d4e3b959e94f76ff969a47762 From abde61fbbec532b0d05c0eaae48d8559ee45a894 Mon Sep 17 00:00:00 2001 From: Angelo Laub Date: Mon, 5 Dec 2022 11:38:17 +0100 Subject: [PATCH 09/10] update avg_vote_time_stamp formula in unit tests --- contracts/daccustodian/daccustodian.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contracts/daccustodian/daccustodian.test.ts b/contracts/daccustodian/daccustodian.test.ts index 4fd6399c..8846c510 100644 --- a/contracts/daccustodian/daccustodian.test.ts +++ b/contracts/daccustodian/daccustodian.test.ts @@ -3599,9 +3599,7 @@ async function get_expected_avg_vote_time_stamp( avg_vote_time_stamp = new Date(0); } else { const delta_milliseconds = - (Math.abs( - ourvote.vote_time_stamp.getTime() - avg_vote_time_stamp.getTime() - ) * + ((ourvote.vote_time_stamp.getTime() - avg_vote_time_stamp.getTime()) * (-1 * vote_weight)) / total_vote_power; let new_milliseconds = Math.floor( @@ -3613,7 +3611,7 @@ async function get_expected_avg_vote_time_stamp( } total_vote_power += vote_weight; const delta_milliseconds = - (Math.abs(now.getTime() - avg_vote_time_stamp.getTime()) * vote_weight) / + ((now.getTime() - avg_vote_time_stamp.getTime()) * vote_weight) / total_vote_power; let new_milliseconds = Math.floor( avg_vote_time_stamp.getTime() + delta_milliseconds From 301c82610f73a291534ef7603f8f6987697b7a49 Mon Sep 17 00:00:00 2001 From: Angelo Laub Date: Mon, 5 Dec 2022 13:10:51 +0100 Subject: [PATCH 10/10] fix all tests --- contracts/TestHelpers.ts | 39 +-------------------- contracts/daccustodian/daccustodian.test.ts | 19 ++++------ contracts/dacproposals/dacproposals.cpp | 3 +- contracts/safemath/safemath.test.ts | 2 +- contracts/stakevote/stakevote.test.ts | 4 +-- 5 files changed, 12 insertions(+), 55 deletions(-) diff --git a/contracts/TestHelpers.ts b/contracts/TestHelpers.ts index 7d3bc55e..34023305 100644 --- a/contracts/TestHelpers.ts +++ b/contracts/TestHelpers.ts @@ -68,45 +68,7 @@ export class SharedTestObjects { return SharedTestObjects.instance; } - public async useOld() { - // assumes daccustodian is new contract - const is_old = await fileExists( - './artifacts/compiled_contracts/contracts/daccustodian.new' - ); - if (is_old) { - // old contract is already in place, nothing to do - return; - } - await rename( - './artifacts/compiled_contracts/contracts/daccustodian', - './artifacts/compiled_contracts/contracts/daccustodian.new' - ); - await rename( - './artifacts/compiled_contracts/contracts/daccustodian.old', - './artifacts/compiled_contracts/contracts/daccustodian' - ); - } - public async useNew() { - const is_new = await fileExists( - './artifacts/compiled_contracts/contracts/daccustodian.old' - ); - if (is_new) { - // new contract is already in place, nothing to do - return; - } - await rename( - './artifacts/compiled_contracts/contracts/daccustodian', - './artifacts/compiled_contracts/contracts/daccustodian.old' - ); - await rename( - './artifacts/compiled_contracts/contracts/daccustodian.new', - './artifacts/compiled_contracts/contracts/daccustodian' - ); - } - private async initAndGetSharedObjects() { - await this.useOld(); - console.log('Init eos blockchain'); await sleep(1000); this.tokenIssuer = await AccountManager.createAccount('federation'); @@ -128,6 +90,7 @@ export class SharedTestObjects { 'dacdirectory', 'index.worlds' ); + this.daccustodian_contract = await debugPromise( ContractDeployer.deployWithName('daccustodian', 'daccustodian'), 'created daccustodian' diff --git a/contracts/daccustodian/daccustodian.test.ts b/contracts/daccustodian/daccustodian.test.ts index 8846c510..71a598de 100644 --- a/contracts/daccustodian/daccustodian.test.ts +++ b/contracts/daccustodian/daccustodian.test.ts @@ -767,13 +767,6 @@ describe('Daccustodian', () => { let dacId = 'canddac'; let cands: Account[]; before(async () => { - await shared.useNew(); - shared.daccustodian_contract = await debugPromise( - ContractDeployer.deployWithName('daccustodian', 'daccustodian'), - 'created daccustodian' - ); - console.log('deployed new version of contract'); - await shared.initDac(dacId, '4,CANDAC', '1000000.0000 CANDAC'); await shared.updateconfig(dacId, '12.0000 CANDAC'); await shared.dac_token_contract.stakeconfig( @@ -1617,7 +1610,7 @@ describe('Daccustodian', () => { ); await assertRowCount( - shared.daccustodian_contract.custodiansTable({ + shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 20, }), @@ -1643,7 +1636,7 @@ describe('Daccustodian', () => { keyType: 'i64', }); - let res2 = await shared.daccustodian_contract.custodiansTable({ + let res2 = await shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 100, indexPosition: 2, // bydecayed index @@ -1689,7 +1682,7 @@ describe('Daccustodian', () => { ); const custodians = - await shared.daccustodian_contract.custodiansTable({ + await shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 20, }); @@ -1941,7 +1934,7 @@ describe('Daccustodian', () => { }); it('custodians should the mean pay from the valid requested pays. (Requested pay exceeding the max pay should be ignored from the mean.)', async () => { let custodianRows = - await shared.daccustodian_contract.custodiansTable({ + await shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 12, }); @@ -2694,7 +2687,7 @@ describe('Daccustodian', () => { }); }); it('should delete custodian table entry', async () => { - const res = await shared.daccustodian_contract.custodiansTable({ + const res = await shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 20, lowerBound: electedCandidateToFire.name, @@ -2848,7 +2841,7 @@ describe('Daccustodian', () => { chai.expect(candidates.rows[0].number_voters).to.equal(0); chai.expect(candidates.rows[0].is_active).to.equal(1); - let custodians = await shared.daccustodian_contract.custodiansTable({ + let custodians = await shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 20, }); diff --git a/contracts/dacproposals/dacproposals.cpp b/contracts/dacproposals/dacproposals.cpp index 17079392..2e1e38e4 100644 --- a/contracts/dacproposals/dacproposals.cpp +++ b/contracts/dacproposals/dacproposals.cpp @@ -581,7 +581,8 @@ namespace eosdac { config configs = current_configs(dac_id); check(approved_count >= configs.proposal_threshold, - "ERR::STARTWORK_INSUFFICIENT_VOTES::Insufficient votes on worker proposal."); + "ERR::STARTWORK_INSUFFICIENT_VOTES::Insufficient votes on worker proposal. Has %s but needs %s.", + approved_count, configs.proposal_threshold); } void dacproposals::arbitrator_rule_on_proposal(name arbitrator, name proposal_id, name dac_id) { diff --git a/contracts/safemath/safemath.test.ts b/contracts/safemath/safemath.test.ts index 247fbeeb..9696e24c 100644 --- a/contracts/safemath/safemath.test.ts +++ b/contracts/safemath/safemath.test.ts @@ -58,7 +58,7 @@ describe('Safemath', () => { it('uunderflow should throw invalid unsigned subtraction error', async () => { await assertEOSErrorIncludesMessage( contract.uunderflow(), - 'invalid unsigned subtraction: result would be negative' + 'invalid unsigned subtraction: uint64_t 1 - 2 result would be negative' ); }); it('usdivzero should throw invalid unsigned subtraction error', async () => { diff --git a/contracts/stakevote/stakevote.test.ts b/contracts/stakevote/stakevote.test.ts index 5393c51d..1e3bdfef 100644 --- a/contracts/stakevote/stakevote.test.ts +++ b/contracts/stakevote/stakevote.test.ts @@ -332,7 +332,7 @@ describe('Stakevote', () => { ); await assertRowCount( - shared.daccustodian_contract.custodiansTable({ + shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 20, }), @@ -341,7 +341,7 @@ describe('Stakevote', () => { }); it('Should have highest ranked votes in custodians', async () => { let rowsResult = - await shared.daccustodian_contract.custodiansTable({ + await shared.daccustodian_contract.custodians1Table({ scope: dacId, limit: 14, indexPosition: 2,