From 42a7aaa051dd852fb6f4d37cee5f880e4d2c278c Mon Sep 17 00:00:00 2001 From: sdp_ibriz Date: Mon, 16 Oct 2023 10:26:29 +0545 Subject: [PATCH] submit proposal with new milestonedb update migration for old proposal with new hash add new arrayDb library to replace the item in the arrayDB --- .../icon/cps/score/cpscore/CPSCore.java | 199 ++++++++++++++++-- .../cps/score/cpscore/utils/ArrayDBUtils.java | 11 + 2 files changed, 190 insertions(+), 20 deletions(-) diff --git a/CPSCore/src/main/java/community/icon/cps/score/cpscore/CPSCore.java b/CPSCore/src/main/java/community/icon/cps/score/cpscore/CPSCore.java index b4bf98fe..4dda41c8 100644 --- a/CPSCore/src/main/java/community/icon/cps/score/cpscore/CPSCore.java +++ b/CPSCore/src/main/java/community/icon/cps/score/cpscore/CPSCore.java @@ -7,12 +7,7 @@ import community.icon.cps.score.cpscore.db.ProposalDataDb; import community.icon.cps.score.cpscore.utils.ArrayDBUtils; import community.icon.cps.score.lib.interfaces.CPSCoreInterface; -import score.Address; -import score.ArrayDB; -import score.BranchDB; -import score.Context; -import score.DictDB; -import score.VarDB; +import score.*; import score.annotation.EventLog; import score.annotation.External; import score.annotation.Optional; @@ -2614,27 +2609,191 @@ public void proposalChanges(String ipfsHash){ // THE PROJECTS WHO HAVE PROGRESS REPORTS @External - public void milestoneChanges(String ipfsHash, String reportHash){ - onlyOwner(); - String ipfsHashPrefix = proposalPrefix(ipfsHash); + public void submitProposalMock(ProposalAttributes newProposal, String oldHash, int[] milestones) { + String newHash = newProposal.ipfs_hash; + Context.require(proposalKeyExists(oldHash), TAG + ": Proposal key should exist on proposal db."); + Context.require(!proposalKeyExists(newHash), TAG + ": Proposal key already exists."); + Address caller = Context.getCaller(); + Context.require(!caller.isContract(), TAG + ": Contract Address not supported."); + String newIpfsHashPrefix = proposalPrefix(newHash); + String oldIpfsHashPrefix = proposalPrefix(oldHash); - String reportHashPrefix = progressReportPrefix(reportHash); + Address contributorAddr = contributorAddress.at(oldIpfsHashPrefix).get(); + Context.require(contributorAddr.equals(caller), "Caller should be same as old proposal"); + Address sponsorAddr = sponsorAddress.at(oldIpfsHashPrefix).get(); + Context.require(sponsorAddr.equals(newProposal.sponsor_address), "Sponsor should be same as old proposal"); - int projectDuration = ProposalDataDb.projectDuration.at(ipfsHashPrefix).get(); - milestoneCount.at(ipfsHashPrefix).set(projectDuration); + int project_duration = projectDuration.at(oldIpfsHashPrefix).getOrDefault(0); + Context.require(newProposal.project_duration == project_duration, + TAG + ": Project Duration should be same as old proposal"); + + BigInteger projectBudget = newProposal.total_budget.multiply(EXA); + BigInteger budget = totalBudget.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + Context.require(budget.equals(projectBudget), + TAG + ": Project Budget should be same as old proposal"); + + String tokenFlag = token.at(oldIpfsHashPrefix).getOrDefault("ICX"); + Context.require(newProposal.token.equals(tokenFlag), + TAG + ": Token should be same as old proposal"); + + addDataToProposalDB(newProposal, newIpfsHashPrefix); + + BigInteger timestamp = ProposalDataDb.timestamp.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + ProposalDataDb.timestamp.at(newIpfsHashPrefix).set(timestamp); + + int perCompleted = percentageCompleted.at(oldIpfsHashPrefix).getOrDefault(0); + percentageCompleted.at(newIpfsHashPrefix).set(perCompleted); + + BigInteger totalVotes = ProposalDataDb.totalVotes.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + int totalVoters = ProposalDataDb.totalVoters.at(oldIpfsHashPrefix).getOrDefault(0); + BigInteger approvedVotes = ProposalDataDb.approvedVotes.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + BigInteger rejectedVotes = ProposalDataDb.rejectedVotes.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + BigInteger abstainedVotes = ProposalDataDb.abstainedVotes.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + int approvedReports = ProposalDataDb.approvedReports.at(oldIpfsHashPrefix).getOrDefault(0); + + ProposalDataDb.totalVotes.at(newIpfsHashPrefix).set(totalVotes); + ProposalDataDb.totalVoters.at(newIpfsHashPrefix).set(totalVoters); + ProposalDataDb.approvedVotes.at(newIpfsHashPrefix).set(approvedVotes); + ProposalDataDb.rejectedVotes.at(newIpfsHashPrefix).set(rejectedVotes); + ProposalDataDb.abstainedVotes.at(newIpfsHashPrefix).set(abstainedVotes); + ProposalDataDb.approvedReports.at(newIpfsHashPrefix).set(approvedReports); + + + ArrayDB
votersList = ProposalDataDb.votersList.at(oldIpfsHashPrefix); + List
voterList = ArrayDBUtils.arrayDBtoList(votersList); + for (Address voter : voterList) { + ProposalDataDb.votersList.at(newIpfsHashPrefix).add(voter); + } + + ArrayDB
approveVoters = ProposalDataDb.approveVoters.at(oldIpfsHashPrefix); + List
appVoters = ArrayDBUtils.arrayDBtoList(approveVoters); + for (Address voters : appVoters) { + ProposalDataDb.approveVoters.at(newIpfsHashPrefix).add(voters); + } + + ArrayDB
rejectVoters = ProposalDataDb.rejectVoters.at(oldIpfsHashPrefix); + List
rejVoters = ArrayDBUtils.arrayDBtoList(rejectVoters); + for (Address voters : rejVoters) { + ProposalDataDb.rejectVoters.at(newIpfsHashPrefix).add(voters); + } + + ArrayDB
abstainVoters = ProposalDataDb.abstainVoters.at(oldIpfsHashPrefix); + List
absVoters = ArrayDBUtils.arrayDBtoList(abstainVoters); + for (Address voters : absVoters) { + ProposalDataDb.abstainVoters.at(newIpfsHashPrefix).add(voters); + } - // progressReport -> only one progress report is completed - int submiitedProgressReport = progressReports.at(ipfsHashPrefix).size(); - milestoneSubmitted.at(reportHashPrefix).add(1); + ArrayDB votersReasons = ProposalDataDb.votersReasons.at(oldIpfsHashPrefix); + List reasons = ArrayDBUtils.arrayDBtoList(votersReasons); + for (String reason : reasons) { + ProposalDataDb.votersReasons.at(newIpfsHashPrefix).add(reason); + } + + Boolean progressSubmitted = ProposalDataDb.submitProgressReport.at(oldIpfsHashPrefix).get(); + submitProgressReport.at(newIpfsHashPrefix).set(progressSubmitted); + + ArrayDB progReports = ProposalDataDb.progressReports.at(oldIpfsHashPrefix); + List progressReportsList = ArrayDBUtils.arrayDBtoList(progReports); + for (int i = 0; i < progressReportsList.size() - 1; i++) { + String report = progressReportsList.get(i); + String progressHashPrefix = progressReportPrefix(report); + ProgressReportDataDb.ipfsHash.at(progressHashPrefix).set(newHash); + + // add to milestone db + String milestonePrefix = mileStonePrefix(newHash,milestones[i]); + MilestoneDb.id.at(milestonePrefix).set(i); + MilestoneDb.status.at(milestonePrefix).set(MILESTONE_REPORT_COMPLETED); + MilestoneDb.progressReportHash.at(milestonePrefix).set(report); + + approvedVotes = ProgressReportDataDb.approvedVotes.at(progressHashPrefix).getOrDefault(BigInteger.ZERO); + MilestoneDb.approvedVotes.at(milestonePrefix).set(approvedVotes); + rejectedVotes = ProgressReportDataDb.rejectedVotes.at(progressHashPrefix).getOrDefault(BigInteger.ZERO); + MilestoneDb.rejectedVotes.at(milestonePrefix).set(rejectedVotes); + + approveVoters = ProgressReportDataDb.approveVoters.at(progressHashPrefix); + appVoters = ArrayDBUtils.arrayDBtoList(approveVoters); + for (Address voters : appVoters) { + MilestoneDb.approveVoters.at(milestonePrefix).add(voters); + } + + rejectVoters = ProgressReportDataDb.rejectVoters.at(progressHashPrefix); + rejVoters = ArrayDBUtils.arrayDBtoList(rejectVoters); + for (Address voters : rejVoters) { + MilestoneDb.rejectVoters.at(milestonePrefix).add(voters); + } + votersList = ProgressReportDataDb.votersList.at(progressHashPrefix); + voterList = ArrayDBUtils.arrayDBtoList(votersList); + for (Address voter : voterList) { + MilestoneDb.votersList.at(milestonePrefix).add(voter); + } + + BranchDB> votersListIndex = ProgressReportDataDb.votersListIndices.at(oldIpfsHashPrefix); + List
preps = arrayDBtoList(votersList); + for (Address prep : preps) { + DictDB votersVote = votersListIndex.at(prep); + int voteData = votersVote.get(VOTE); + int indexData = votersVote.get(INDEX); + int changeVoteData = votersVote.get(CHANGE_VOTE); + + MilestoneDb.votersListIndices.at(milestonePrefix).at(prep).set(VOTE, voteData); + MilestoneDb.votersListIndices.at(milestonePrefix).at(prep).set(INDEX, indexData); + MilestoneDb.votersListIndices.at(milestonePrefix).at(prep).set(CHANGE_VOTE, changeVoteData); + } - // add to milestone db - String milestonePrefix = mileStonePrefix(ipfsHash,1); - MilestoneDb.id.at(milestonePrefix).set(1); - MilestoneDb.status.at(milestonePrefix).set(MILESTONE_REPORT_COMPLETED); - MilestoneDb.progressReportHash.at(milestonePrefix).set(reportHash); + ProposalDataDb.progressReports.at(newIpfsHashPrefix).add(report); + } + + BigInteger sponsorDepositAmount = ProposalDataDb.sponsorDepositAmount.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + BigInteger sponsoredTimestamp = ProposalDataDb.sponsoredTimestamp.at(oldIpfsHashPrefix).getOrDefault(BigInteger.ZERO); + String sponsorDepositStatus = ProposalDataDb.sponsorDepositStatus.at(oldIpfsHashPrefix).getOrDefault(""); + String sponsorVoteReason = ProposalDataDb.sponsorVoteReason.at(oldIpfsHashPrefix).getOrDefault(""); + + ProposalDataDb.sponsorDepositAmount.at(newIpfsHashPrefix).set(sponsorDepositAmount); + ProposalDataDb.sponsoredTimestamp.at(newIpfsHashPrefix).set(sponsoredTimestamp); + ProposalDataDb.sponsorDepositStatus.at(newIpfsHashPrefix).set(sponsorDepositStatus); + ProposalDataDb.sponsorVoteReason.at(newIpfsHashPrefix).set(sponsorVoteReason); + + ArrayDBUtils.replaceArrayItem(proposalsKeyList, oldHash, newHash); + int getIndex = proposalsKeyListIndex.get(oldHash); + proposalsKeyListIndex.set(oldHash, null); + proposalsKeyListIndex.set(newHash, getIndex); + + String oldStatus = ProposalDataDb.status.at(oldIpfsHashPrefix).getOrDefault(SPONSOR_PENDING); + Status statusOb = new Status(); + ArrayDBUtils.replaceArrayItem(statusOb.proposalStatus.get(oldStatus), oldHash, newHash); + ProposalDataDb.status.at(newIpfsHashPrefix).set(oldStatus); + + ArrayDB contributedProjects = contributorProjects.at(caller); + ArrayDBUtils.replaceArrayItem(contributedProjects, oldHash, newHash); + + ArrayDB sponsoredProjects = sponsorProjects.at(sponsorAddr); + ArrayDBUtils.replaceArrayItem(sponsoredProjects, oldHash, newHash); + + ProposalSubmitted(caller, "Successfully submitted a Proposal."); + } + + public void updateProposalKeyIndex(String oldHash, String newHash) { + validateAdmins(); + String oldIpfsHashPrefix = proposalPrefix(oldHash); + String newIpfsHashPrefix = proposalPrefix(newHash); + BranchDB> votersListIndex = ProposalDataDb.votersListIndex.at(oldIpfsHashPrefix); + List
preps = arrayDBtoList(ProposalDataDb.votersList.at(oldIpfsHashPrefix)); + for (Address prep : preps) { + DictDB votersVote = votersListIndex.at(prep); + int voteData = votersVote.get(VOTE); + int indexData = votersVote.get(INDEX); + int changeVoteData = votersVote.get(CHANGE_VOTE); + + ProposalDataDb.votersListIndex.at(newIpfsHashPrefix).at(prep).set(VOTE, voteData); + ProposalDataDb.votersListIndex.at(newIpfsHashPrefix).at(prep).set(INDEX, indexData); + ProposalDataDb.votersListIndex.at(newIpfsHashPrefix).at(prep).set(CHANGE_VOTE, changeVoteData); + } + + callScore(getCpfTreasuryScore(), "migrateOldHashToNewHash", oldHash,newHash); + callScore(getCpsTreasuryScore(), "updateNewProjects", oldHash, newHash); } diff --git a/CPSCore/src/main/java/community/icon/cps/score/cpscore/utils/ArrayDBUtils.java b/CPSCore/src/main/java/community/icon/cps/score/cpscore/utils/ArrayDBUtils.java index af556c7c..6d6a4b58 100644 --- a/CPSCore/src/main/java/community/icon/cps/score/cpscore/utils/ArrayDBUtils.java +++ b/CPSCore/src/main/java/community/icon/cps/score/cpscore/utils/ArrayDBUtils.java @@ -98,6 +98,17 @@ public static List arrayToList(T[] array){ return list; } + public static void replaceArrayItem(ArrayDB array_db, Object target, Object newTarget) { + int size = array_db.size(); + + for (int i = 0; i < size - 1; i++) { + if (array_db.get(i).equals(target)) { + array_db.set(i, (T) newTarget); + return; + } + } + } + public static void mergeSort(String[] array, int left, int right, Map priorityVoteResult) { if (left < right) {