Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/compromised wallet with no milestone progressreport #24

Merged
merged 50 commits into from
Jan 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
4e9a7bb
chore: checked milestone status for getting milestone deadline
naneey Jan 7, 2024
75024a1
test: last progress report test case added
naneey Jan 7, 2024
5c5489b
added method to update contributor's address
0xGojo Jan 14, 2024
bea983c
removed comment.
0xGojo Jan 15, 2024
e316452
new contributor must not contract addr.
0xGojo Jan 15, 2024
62a35c4
changes for getRemainingProject
naneey Jan 23, 2024
a7fd91d
getter fixed for sponsor's bond and initial payment
naneey Jan 23, 2024
29d7fc0
linter removed
naneey Jan 23, 2024
0279a58
fix:
sdpisreddevil Jan 23, 2024
9b1b979
Merge branch 'fix/update-contributor-address-for-compromised-wallets'…
naneey Jan 23, 2024
b837bc6
Merge pull request #19 from 0xGojo/main
naneey Jan 23, 2024
327692e
fix for contributor and sponsor address
naneey Jan 23, 2024
f507b6d
fix:
sdpisreddevil Jan 23, 2024
2f7e6fb
fix:
sdpisreddevil Jan 23, 2024
9dacf52
test: unit test for getters fixed
naneey Jan 24, 2024
9859573
chore: getter for remaining milestones
naneey Jan 25, 2024
b6bf2e5
fix:
sdpisreddevil Jan 25, 2024
f0847ca
fix:
sdpisreddevil Jan 25, 2024
d5b1540
fix:
sdpisreddevil Jan 25, 2024
68c568e
fix: update periodCount of proposal only after the proposal approval
sdpisreddevil Jan 25, 2024
3770752
chore: milestone installment amount show in cps treasury
naneey Jan 25, 2024
d3c2d70
chore: milestone installment amount show in cps treasury
naneey Jan 25, 2024
9dd738c
test: installment amount test fixed
naneey Jan 25, 2024
7dbbfaa
chore: milestone whose reports are aprroved is not added to the deadl…
naneey Jan 25, 2024
77f985a
Merge pull request #23 from icon-community/fix/last-PR-milestone-dead…
sdpisreddevil Jan 25, 2024
2867aa3
Merge branch 'fix/compromised-wallet-with-no-milestone-progressreport…
naneey Jan 25, 2024
5674745
Merge pull request #22 from icon-community/fix/contributor-project-ge…
sdpisreddevil Jan 25, 2024
eaa9872
Merge pull request #21 from icon-community/fix/remaining_projects
sdpisreddevil Jan 25, 2024
cb5443f
Merge branch 'fix/compromised-wallet-with-no-milestone-progressreport…
naneey Jan 25, 2024
160d0fb
Merge branch 'fix/compromised-wallet-with-no-milestone-progressreport…
sdpisreddevil Jan 25, 2024
dabdd35
Merge pull request #27 from icon-community/fix/update-contributor-add…
sdpisreddevil Jan 25, 2024
6b3d2b2
Merge branch 'fix/compromised-wallet-with-no-milestone-progressreport…
sdpisreddevil Jan 25, 2024
cec00c8
Merge pull request #26 from icon-community/featue/add-block-address-m…
sdpisreddevil Jan 25, 2024
494cf3e
Merge pull request #25 from icon-community/fix/progress-report-voting…
sdpisreddevil Jan 25, 2024
d86697a
chore: logic changed while checking for milestone deadline in submiss…
naneey Jan 25, 2024
456b68e
fix: closing bracket added
naneey Jan 25, 2024
d736784
fix:
sdpisreddevil Jan 25, 2024
a4535b1
fix: correct spelling for variable and method name
sdpisreddevil Jan 25, 2024
37ea68f
chore: contributor and sponsor set in proposal db
naneey Jan 25, 2024
174a93a
test: unit test added for updating address
naneey Jan 25, 2024
aa562c4
fix:
sdpisreddevil Jan 25, 2024
b485f1c
fix:
sdpisreddevil Jan 25, 2024
524d63e
fix:
sdpisreddevil Jan 25, 2024
162e9d3
remove:
sdpisreddevil Jan 25, 2024
55f86ba
fix: readonly method for blockAddress
sdpisreddevil Jan 25, 2024
fcf7eff
fix: eventlog outside the loop
sdpisreddevil Jan 25, 2024
a29af90
fix: remove from validPreps after the address is blocked
sdpisreddevil Jan 25, 2024
4432556
fix:
sdpisreddevil Jan 25, 2024
dc07f10
update: build version for both contract
sdpisreddevil Jan 25, 2024
39727b2
update: fix CPSCore tests
sdpisreddevil Jan 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CPSCore/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = '1.3.3'
version = '1.3.8'

dependencies {
compileOnly 'foundation.icon:javaee-api:0.9.2'
Expand Down
229 changes: 179 additions & 50 deletions CPSCore/src/main/java/community/icon/cps/score/cpscore/CPSCore.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ public class Constants {

public static final String PROPOSAL_RANK = "proposal_rank";
public static final String PRIORITY_VOTED_PREPS = "priority_voted_preps";
public static final String BLOCKED_ADDRESSES = "blocked_addresses";
public static final String SPONSOR_PROJECTS = "sponsor_projects";
public static final String CONTRIBUTOR_PROJECTS = "contributor_projects";
public static final String SPONSOR_BOND_PERCENTAGE = "sponsor_bond_percentage";
Expand Down
1,051 changes: 778 additions & 273 deletions CPSCore/src/test/java/community/icon/cps/score/cpscore/CPSScoreTest.java

Large diffs are not rendered by default.

This file was deleted.

2 changes: 1 addition & 1 deletion CPSTreasury/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = '1.3.2'
version = '1.3.3'

dependencies {
compileOnly 'foundation.icon:javaee-api:0.9.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@
import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonObject;
import community.icon.cps.score.cpstreasury.db.ProposalData;
import community.icon.cps.score.cpstreasury.utils.ArrayDBUtils;
import community.icon.cps.score.cpstreasury.utils.consts;
import community.icon.cps.score.lib.interfaces.CPSTreasuryInterface;
import score.*;
import score.annotation.EventLog;
import score.annotation.External;
import score.annotation.Optional;
import score.annotation.Payable;
import scorex.util.ArrayList;

import java.math.BigInteger;
import java.util.List;
import java.util.Map;

import static community.icon.cps.score.cpstreasury.utils.ArrayDBUtils.replaceArrayItem;

public class CPSTreasury extends ProposalData implements CPSTreasuryInterface {
private static final String TAG = "CPS_TREASURY";
private static final String PROPOSAL_DB_PREFIX = "proposal";
Expand Down Expand Up @@ -187,19 +187,21 @@ public BigInteger getOnsetPayment() {
BigInteger totalBudget = (BigInteger) proposal_details.get(consts.TOTAL_BUDGET);
BigInteger totalPaidAmount = (BigInteger) proposal_details.get(consts.WITHDRAW_AMOUNT);

BigInteger remainingAmount = totalBudget.subtract(totalPaidAmount);

BigInteger installmentAmount = getInstallmentAmount(_ipfs_key);

Map<String, ?> project_details = Map.of(
consts.IPFS_HASH, _ipfs_key,
consts.TOKEN, flag,
consts.TOTAL_BUDGET, totalBudget,
consts.TOTAL_INSTALLMENT_PAID, totalPaidAmount,
consts.TOTAL_INSTALLMENT_COUNT, totalInstallment,
consts.TOTAL_TIMES_INSTALLMENT_PAID, totalPaidCount,
consts.INSTALLMENT_AMOUNT, remainingAmount.divide(BigInteger.valueOf(totalInstallment - totalPaidCount)));

projectDetails.add(project_details);
consts.INSTALLMENT_AMOUNT, installmentAmount);

totalAmountToBePaidbnUSD = totalAmountToBePaidbnUSD.add(totalBudget.divide(BigInteger.valueOf(totalInstallment)));
projectDetails.add(project_details);
totalAmountToBePaidbnUSD = totalAmountToBePaidbnUSD.add(installmentAmount);

}

Expand All @@ -217,8 +219,9 @@ public BigInteger getOnsetPayment() {
@External(readonly = true)
public List<String> getContributorProjects(Address address) {
List<String> contributorProjects = new ArrayList<>();
for (int i = 0; i < this.contributorProjects.at(address.toString()).size(); i++) {
contributorProjects.add(this.contributorProjects.at(address.toString()).get(i));
ArrayDB<String> contributorProjectsArray = this.contributorProjects.at(address.toString());
for (int i = 0; i < contributorProjectsArray.size(); i++) {
contributorProjects.add(contributorProjectsArray.get(i));
}
return contributorProjects;
}
Expand All @@ -227,8 +230,9 @@ public List<String> getContributorProjects(Address address) {
@External(readonly = true)
public List<String> getSponsorProjects(Address address) {
List<String> sponsorProjects = new ArrayList<>();
for (int i = 0; i < this.sponsorProjects.at(address.toString()).size(); i++) {
sponsorProjects.add(this.sponsorProjects.at(address.toString()).get(i));
ArrayDB<String> sponsorProjectsArray = this.sponsorProjects.at(address.toString());
for (int i = 0; i < sponsorProjectsArray.size(); i++) {
sponsorProjects.add(sponsorProjectsArray.get(i));
}
return sponsorProjects;
}
Expand All @@ -242,6 +246,7 @@ public List<String> getSponsorProjects(Address address) {
List<Map<String, ?>> projectDetails = new ArrayList<>();
ArrayDB<String> proposalKeysArray = sponsorProjects.at(walletAddress.toString());
int proposalKeysSize = proposalKeysArray.size();
BigInteger bondPercentage = callScore(BigInteger.class, getCpsScore(), "getSponsorBondPercentage");
for (int i = 0; i < proposalKeysSize; i++) {
String _ipfs_key = proposalKeysArray.get(i);
String proposalPrefix = proposalPrefix(_ipfs_key);
Expand All @@ -254,8 +259,9 @@ public List<String> getSponsorProjects(Address address) {
String flag = (String) proposal_details.get(consts.TOKEN);
BigInteger totalBudget = (BigInteger) proposal_details.get(consts.SPONSOR_REWARD);
BigInteger totalPaidAmount = (BigInteger) proposal_details.get(consts.SPONSOR_WITHDRAW_AMOUNT);
BigInteger depositedSponsorBond = ((BigInteger) proposal_details.get(consts.TOTAL_BUDGET)).divide(BigInteger.TEN);
BigInteger depositedSponsorBond = ((BigInteger) proposal_details.get(consts.TOTAL_BUDGET)).multiply(bondPercentage).divide(BigInteger.valueOf(100));
BigInteger remainingAmount = totalBudget.subtract(totalPaidAmount);
int remainingCount = totalInstallment - totalPaidCount;

Map<String, ?> project_details = Map.of(
consts.IPFS_HASH, _ipfs_key,
Expand All @@ -264,13 +270,12 @@ public List<String> getSponsorProjects(Address address) {
consts.TOTAL_INSTALLMENT_PAID, totalPaidAmount,
consts.TOTAL_INSTALLMENT_COUNT, totalInstallment,
consts.TOTAL_TIMES_INSTALLMENT_PAID, totalPaidCount,
consts.INSTALLMENT_AMOUNT, remainingAmount.divide(BigInteger.valueOf(totalInstallment - totalPaidCount)),
consts.INSTALLMENT_AMOUNT, remainingAmount.divide(BigInteger.valueOf(remainingCount)),
consts.SPONSOR_BOND_AMOUNT, depositedSponsorBond);

projectDetails.add(project_details);


totalAmountToBePaidbnUSD = totalAmountToBePaidbnUSD.add(totalBudget.divide(BigInteger.valueOf(totalInstallment)));
totalAmountToBePaidbnUSD = totalAmountToBePaidbnUSD.add(remainingAmount.divide(BigInteger.valueOf(remainingCount)));
totalSponsorBondbnUSD = totalSponsorBondbnUSD.add(depositedSponsorBond);

}
Expand Down Expand Up @@ -333,26 +338,17 @@ public void sendInstallmentToContributor(String ipfsKey, BigInteger milestoneBud
String prefix = proposalPrefix(ipfsKey);
Map<String, ?> proposalData = getDataFromProposalDB(prefix);

int _installmentCount = (int) proposalData.get(consts.INSTALLMENT_COUNT);
BigInteger withdrawAmount = (BigInteger) proposalData.get(consts.WITHDRAW_AMOUNT);
BigInteger remainingAmount = (BigInteger) proposalData.get(consts.REMAINING_AMOUNT);
Address contributorAddress = (Address) proposalData.get(consts.CONTRIBUTOR_ADDRESS);
String flag = (String) proposalData.get(consts.TOKEN);

Context.require(milestoneBudget.compareTo(remainingAmount)<= 0,TAG+"Requested budget is greater than remaining amount.");
// installmentAmount = remainingAmount.subtract(milestoneBudget);

Context.require(milestoneBudget.compareTo(remainingAmount) <= 0, TAG + "Requested budget is greater than remaining amount.");

installmentAmount = milestoneBudget;
Context.println("yhe installment is "+ installmentAmount);

// if (_installmentCount == 1) {
// installmentAmount = remainingAmount;
// } else {
// installmentAmount = remainingAmount.subtract(milestoneBudget);
// }
// int newInstallmentCount = _installmentCount - milestoneApproved;

// setInstallmentCount(prefix, newInstallmentCount);
setRemainingAmount(prefix, remainingAmount.subtract(installmentAmount));
setWithdrawAmount(prefix, withdrawAmount.add(installmentAmount));
DictDB<String, BigInteger> installmentFund = this.installmentFundRecord.at(contributorAddress.toString());
Expand Down Expand Up @@ -412,6 +408,8 @@ public void sendRewardToSponsor(String ipfsKey, int installmentCount) {
int newSponsorRewardCount = sponsorRewardCount - installmentCount;

setSponsorRewardCount(prefix, newSponsorRewardCount);
// the contributor installment count is set here
setInstallmentCount(prefix, newSponsorRewardCount);
setSponsorWithdrawAmount(prefix, sponsorWithdrawAmount.add(installmentAmount));
setSponsorRemainingAmount(prefix, sponsorRemainingAmount.subtract(installmentAmount));
DictDB<String, BigInteger> installmentFunds = installmentFundRecord.at(sponsorAddress.toString());
Expand Down Expand Up @@ -484,7 +482,11 @@ public void disqualifyProject(String ipfsKey) {
@Override
@External
public void claimReward() {
boolean checkMaintenance = callScore(Boolean.class, getCpsScore(), "getMaintenanceMode");
Context.require(!checkMaintenance, TAG + ": CPS is in maintenance mode");
Address caller = Context.getCaller();
List<Address> blockAddresses = callScore(List.class, getCpsScore(), "getBlockedAddresses");
Context.require(!blockAddresses.contains(caller), TAG + ": Address is blocked");
DictDB<String, BigInteger> installmentFundRecord = this.installmentFundRecord.at(caller.toString());
BigInteger availableAmountICX = installmentFundRecord.getOrDefault(consts.ICX, BigInteger.ZERO);
BigInteger availableAmountbnUSD = installmentFundRecord.getOrDefault(consts.bnUSD, BigInteger.ZERO);
Expand Down Expand Up @@ -544,62 +546,39 @@ public void tokenFallback(Address _from, BigInteger _value, byte[] _data) {
}
}

@Override
@External
public void updateNewProjects(String oldHash, String newHash, int milestoneCount) {
public void updateContributorSponsorAddress(String _ipfs_key, Address _new_contributor_address,
@Optional Address _new_sponsor_address) {
validateCpsScore();
Context.require(proposalExists(_ipfs_key), TAG + ": This project not exists");

String newIpfsHashPrefix = proposalPrefix(newHash);
String oldProposalPrefix = proposalPrefix(oldHash);

Address _contributorAddress = getContributorAddress(oldProposalPrefix);
Address _sponsorAddress = getSponsorAddress(oldProposalPrefix);

ArrayDB<String> contributedProjects = contributorProjects.at(_contributorAddress.toString());
replaceArrayItem(contributedProjects, oldHash, newHash);

ArrayDB<String> sponsoredProjects = sponsorProjects.at(_sponsorAddress.toString());
replaceArrayItem(sponsoredProjects, oldHash, newHash);

replaceArrayItem(proposalsKeys, oldHash, newHash);
int getIndex = proposalsKeyListIndex.get(oldHash);
proposalsKeyListIndex.set(oldHash, null);
proposalsKeyListIndex.set(newHash, getIndex);

ipfsHash.at(newIpfsHashPrefix).set(newHash);
projectDuration.at(newIpfsHashPrefix).set(milestoneCount);
sponsorAddress.at(newIpfsHashPrefix).set(_sponsorAddress);
contributorAddress.at(newIpfsHashPrefix).set(_contributorAddress);
installmentCount.at(newIpfsHashPrefix).set(milestoneCount);

BigInteger _totalBudget = totalBudget.at(oldProposalPrefix).get();
totalBudget.at(newIpfsHashPrefix).set(_totalBudget);

BigInteger _sponsorReward = sponsorReward.at(oldProposalPrefix).get();
sponsorReward.at(newIpfsHashPrefix).set(_sponsorReward);

String _token = token.at(oldProposalPrefix).get();
token.at(newIpfsHashPrefix).set(_token);

BigInteger _withdrawAmount = withdrawAmount.at(oldProposalPrefix).get();
withdrawAmount.at(newIpfsHashPrefix).set(_withdrawAmount);

BigInteger _sponsorWithdrawAmount = sponsorWithdrawAmount.at(oldProposalPrefix).get();
sponsorWithdrawAmount.at(newIpfsHashPrefix).set(_sponsorWithdrawAmount);

String _status = status.at(oldProposalPrefix).get();
status.at(newIpfsHashPrefix).set(_status);
String prefix = proposalPrefix(_ipfs_key);
Map<String, ?> proposalData = getDataFromProposalDB(prefix);
Address contributorAddress = (Address) proposalData.get(consts.CONTRIBUTOR_ADDRESS);

BigInteger _remainingAmount = remainingAmount.at(oldProposalPrefix).get();
remainingAmount.at(newIpfsHashPrefix).set(_remainingAmount);
// remove
ArrayDBUtils.remove_array_item_string(contributorProjects.at(contributorAddress.toString()), _ipfs_key);
contributorProjects.at(_new_contributor_address.toString()).add(_ipfs_key);

BigInteger _sponsorRemainingAmount = sponsorRemainingAmount.at(oldProposalPrefix).get();
sponsorRemainingAmount.at(newIpfsHashPrefix).set(_sponsorRemainingAmount);
// update contributor address
setContributorAddress(prefix, _new_contributor_address);

int _sponsorRewardCount = sponsorRewardCount.at(oldProposalPrefix).get();
sponsorRewardCount.at(newIpfsHashPrefix).set(_sponsorRewardCount);
// remove
if (_new_sponsor_address != null) {
Address sponsorAddress = (Address) proposalData.get(consts.SPONSOR_ADDRESS);
ArrayDBUtils.remove_array_item_string(sponsorProjects.at(sponsorAddress.toString()),_ipfs_key);
sponsorProjects.at(_new_sponsor_address.toString()).add(_ipfs_key);

// update sponsor address
setSponsorAddress(prefix, _new_sponsor_address);
}
}

private BigInteger getInstallmentAmount(String ipfsHash){
List<Map<String,?>> remainingMilestones = callScore(List.class,getCpsScore(),"getRemainingMilestones",ipfsHash);
return (BigInteger) remainingMilestones.get(0).get(consts.BUDGET);
}

public <T> T callScore(Class<T> t, Address address, String method, Object... params) {
return Context.call(t, address, method, params);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package community.icon.cps.score.cpstreasury.db;

import score.*;
import community.icon.cps.score.cpstreasury.utils.consts;
import score.Address;
import score.BranchDB;
import score.Context;
import score.VarDB;

import java.math.BigInteger;
import java.util.Map;
Expand Down Expand Up @@ -146,4 +149,11 @@ public void setStatus(String prefix, String status){
public String getToken(String prefix){
return token.at(prefix).get();
}

public void setContributorAddress(String prefix, Address newContributorAddress){
this.contributorAddress.at(prefix).set(newContributorAddress);
}
public void setSponsorAddress(String prefix, Address newSponsorAddress){
this.sponsorAddress.at(prefix).set(newSponsorAddress);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public consts() {
public static final String INSTALLMENT_AMOUNT = "installment_amount";
public static final String TOTAL_INSTALLMENT_COUNT = "total_installment_count";
public static final String SPONSOR_BOND_AMOUNT = "sponsor_bond_amount";
public static final String BUDGET = "budget";


}
Loading