diff --git a/CPSTreasury/build.gradle b/CPSTreasury/build.gradle index 6ac8f668..fec63b41 100644 --- a/CPSTreasury/build.gradle +++ b/CPSTreasury/build.gradle @@ -1,4 +1,4 @@ -version = '1.3.3' +version = '1.3.5' dependencies { compileOnly 'foundation.icon:javaee-api:0.9.2' diff --git a/CPSTreasury/src/main/java/community/icon/cps/score/cpstreasury/CPSTreasury.java b/CPSTreasury/src/main/java/community/icon/cps/score/cpstreasury/CPSTreasury.java index dd9d8357..5df88454 100644 --- a/CPSTreasury/src/main/java/community/icon/cps/score/cpstreasury/CPSTreasury.java +++ b/CPSTreasury/src/main/java/community/icon/cps/score/cpstreasury/CPSTreasury.java @@ -334,7 +334,6 @@ public void updateProposalFund(String ipfsKey, BigInteger addedBudget, BigIntege public void sendInstallmentToContributor(String ipfsKey, BigInteger milestoneBudget) { validateCpsScore(); Context.require(proposalExists(ipfsKey), TAG + ": Invalid IPFS Hash."); - BigInteger installmentAmount; String prefix = proposalPrefix(ipfsKey); Map proposalData = getDataFromProposalDB(prefix); @@ -343,20 +342,17 @@ public void sendInstallmentToContributor(String ipfsKey, BigInteger milestoneBud 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 = milestoneBudget; - - - setRemainingAmount(prefix, remainingAmount.subtract(installmentAmount)); - setWithdrawAmount(prefix, withdrawAmount.add(installmentAmount)); + if (milestoneBudget.compareTo(remainingAmount) >= 0){ + milestoneBudget = remainingAmount; + } + setRemainingAmount(prefix, remainingAmount.subtract(milestoneBudget)); + setWithdrawAmount(prefix, withdrawAmount.add(milestoneBudget)); DictDB installmentFund = this.installmentFundRecord.at(contributorAddress.toString()); BigInteger installmentFundAmount = installmentFund.getOrDefault(flag, BigInteger.ZERO); - installmentFund.set(flag, installmentFundAmount.add(installmentAmount)); - ProposalFundSent(contributorAddress, "new installment " + installmentAmount + " " + flag + " sent to contributors address."); + installmentFund.set(flag, installmentFundAmount.add(milestoneBudget)); + ProposalFundSent(contributorAddress, "new installment " + milestoneBudget + " " + flag + " sent to contributors address."); - if (remainingAmount.subtract(installmentAmount).equals(BigInteger.ZERO)) { + if (remainingAmount.subtract(milestoneBudget).equals(BigInteger.ZERO)) { setStatus(prefix, COMPLETED); } } diff --git a/CPSTreasury/src/test/java/community/icon/cps/score/cpstreasury/CPSTreasuryTest.java b/CPSTreasury/src/test/java/community/icon/cps/score/cpstreasury/CPSTreasuryTest.java index be080b46..140467b3 100644 --- a/CPSTreasury/src/test/java/community/icon/cps/score/cpstreasury/CPSTreasuryTest.java +++ b/CPSTreasury/src/test/java/community/icon/cps/score/cpstreasury/CPSTreasuryTest.java @@ -455,6 +455,41 @@ void sendInstallmentToContributor_Completed(){ } + @Test + void lastReportWithIncorrectMilestone(){ + /* total Milestone = 4, remaining milestone = 2 + * each milestone = 22.5 , for 2 milestone = 45 */ + sendInstallmentToContributor_SecondInstallment(); + + Map proposalDataDetails = (Map) tokenScore.call("getContributorProjectedFund", testing_account2.getAddress()); + System.out.println("proposal details "+ proposalDataDetails); + assertEquals(proposalDataDetails.get("withdraw_amount_bnUSD"), BigInteger.valueOf(55).multiply(ICX)); + + List> proposalDetailsData = (List>) proposalDataDetails.get("data"); + assertEquals(proposalDetailsData.get(0).get("total_budget"), BigInteger.valueOf(100).multiply(ICX)); + + BigInteger remainingAmount = BigInteger.valueOf(100).multiply(ICX).subtract(BigInteger.valueOf(55).multiply(ICX)); + assertEquals(remainingAmount,BigInteger.valueOf(45).multiply(ICX)); + + // requesting more than 45ICX + tokenScore.invoke(owner, "sendInstallmentToContributor", "Proposal 1", BigInteger.valueOf(50).multiply(ICX)); + tokenScore.invoke(owner, "sendRewardToSponsor", "Proposal 1", 2); + @SuppressWarnings("unchecked") + Map proposalDataDetails_after = (Map) tokenScore.call("getContributorProjectedFund", testing_account2.getAddress()); + assertEquals(proposalDataDetails_after.get("withdraw_amount_bnUSD"), BigInteger.valueOf(100).multiply(ICX)); + + + proposalDetailsData = (List>) proposalDataDetails_after.get("data"); + assertEquals(proposalDetailsData.size(),0); + + assertEquals(proposalDataDetails_after.get(PROJECT_COUNT),0); + // at the completion of proposal the withdrawn amount is still 100ICX + assertEquals(proposalDataDetails_after.get(WITHDRAWN_BNUSD),BigInteger.valueOf(100).multiply(ICX)); + + Map totalAmount = Map.of(consts.bnUSD,BigInteger.ZERO); + assertEquals(proposalDataDetails_after.get(TOTAL_AMOUNT),totalAmount); + } + @Test void sendRewardToSponsor() { setOnsetPayment();