From eafe9b4edfd635b9054b568176b29e2f4f04e681 Mon Sep 17 00:00:00 2001 From: enkogu Date: Mon, 11 Feb 2019 16:22:02 +0700 Subject: [PATCH] PR style fixes --- contracts/Daico/Daico.sol | 430 ++++++++++++++++++++----------------- contracts/Daico/IDaico.sol | 20 +- 2 files changed, 245 insertions(+), 205 deletions(-) diff --git a/contracts/Daico/Daico.sol b/contracts/Daico/Daico.sol index 06284d3..e435dc5 100644 --- a/contracts/Daico/Daico.sol +++ b/contracts/Daico/Daico.sol @@ -10,17 +10,6 @@ contract Daico is IDaico { event InvestEvent(uint _amount, address _sender, uint _total, uint _tapSum, uint _startedAt); event Vote(uint _amount, address _sender, bool _vote); - enum TapStage { - Preparing, - Investing, - Voting, - VotingDQ, - RoadmapPreparing, - RoadmapVoting, - RoadmapVotingDQ, - Success, - Terminated - } // Voting result enum VR { @@ -112,16 +101,9 @@ contract Daico is IDaico { roadmapsCount += 1; } - /** - * @dev this function will replace current roadmap to the proposed one if it was accepted - this function will be called at the first investment operation for a new roadmap - */ - function _replaceRoadmapToProposedOne() internal { - (uint curTapNum, TapStage[] memory tapStages, uint v) = getTapsInfo(); - for(uint tapNum = 0; tapNum < roadmaps[roadmapsCount - 1].tapsCount; tapNum++) { - if(tapNum > curTapNum) tapToRId[tapNum] = roadmapsCount - 1; - } - } + /* + Interfaces + */ /** * @dev interface for the STOContract to add an investor @@ -134,12 +116,15 @@ contract Daico is IDaico { require(tapStages[curTapNum] == TapStage.Investing); require(_amount > 0); - if(newRoadmapProposed) _replaceRoadmapToProposedOne(); curTapNum += 1; + if(newRoadmapProposed) { + _replaceRoadmapToProposedOne(); + curTapNum += 1; + } uint rmNum = tapToRId[curTapNum]; uint invId = _getInvestorId(_investorAddress); - require(amountOfAllInvestments(curTapNum) + _amount <= tapAmountsSum(curTapNum)); + require((_amountOfAllInvestments(curTapNum) + _amount) <= _tapAmountsSum(curTapNum)); daiToken.transferFrom(STOContractAddress, address(this), _amount); bool notInvestor = (invId == roadmaps[rmNum].investorsCount); @@ -151,54 +136,19 @@ contract Daico is IDaico { roadmaps[rmNum].investors[invId].invested += _amount; } - - if(areAllFundsCollected(curTapNum) && (startedAt==0)) { + if(_areAllFundsCollected(curTapNum) && (startedAt==0)) { startedAt = now; newRoadmapProposed = false; } - emit InvestEvent(_amount, _investorAddress, amountOfAllInvestments(curTapNum), tapAmountsSum(curTapNum), startedAt); - } - - /** - * @param _tapNum – number of a tap - * @return are all funds for a this _tapNum collected or not - */ - function areAllFundsCollected(uint _tapNum) internal view returns(bool) { - return amountOfAllInvestments(_tapNum) >= tapAmountsSum(_tapNum); - } - - /** - * @dev sum can vary for a different _tapNum in cases when roadmap have been changed - * @param _tapNum – number of a tap - * @return sum – sum of all gotten investments for a specific tap - */ - function amountOfAllInvestments(uint _tapNum) public view returns(uint sum) { - uint rmNum = tapToRId[_tapNum]; - uint invCount = roadmaps[rmNum].investorsCount; - for(uint invNum = 0; invNum < invCount; invNum++) { - sum += roadmaps[rmNum].investors[invNum].invested; - } - } - - /** - * @dev sum of all tap amounts; output can vary for a different _tapNum in cases when roadmap have been changed - * @param _tapNum – number of the tap (to get an appropriate roadmap) - * @return sum – sum of tap amounts - */ - function tapAmountsSum(uint _tapNum) public view returns(uint sum) { - uint rmNum = tapToRId[_tapNum]; - uint tapsCount = roadmaps[rmNum].tapsCount; - for(uint tapNum = 0; tapNum < tapsCount; tapNum++) { - sum += roadmaps[rmNum].taps[tapNum].funds; - } + emit InvestEvent(_amount, _investorAddress, _amountOfAllInvestments(curTapNum), _tapAmountsSum(curTapNum), startedAt); } /** * @dev withdrawal interface for the investors; works in a cases when project fails - * @dev returns all tokens to the investors that was not spent yet + * returns all tokens to the investors that was not spent yet */ - function returnTokens() external { + function returnTokens() public { (uint curTapNum, TapStage[] memory tapStages, uint votNum) = getTapsInfo(); uint rmNum = tapToRId[curTapNum]; require(tapStages[curTapNum] == TapStage.Terminated); @@ -209,7 +159,7 @@ contract Daico is IDaico { for(uint invNum = 0; invNum maximalTapsAmount) { + maximalTapsAmount = roadmaps[rmNum].tapsCount; + } + } + + TapStage[] memory tapStages = new TapStage[](maximalTapsAmount); + uint start = 0; + uint tapD; + uint votNum = 0; + + for(uint tapNum = 0; tapNum < maximalTapsAmount; tapNum++) { + tapD = _getTap(tapNum).duration; + (votNum, tapStages[tapNum], start) = _getTapStage(tapNum, tapD, start); + if((tapStages[tapNum]!=TapStage.Success)) { + return (tapNum, tapStages, votNum); + } + } + + return (tapNum, tapStages, votNum); + } + + /** + * @dev project owner can propose new roadmap in the case case if consensus wasn't reached + * @param _tapFunds – array of amounts to invest for an each tap + * @return _tapDurations – array of durations for an each tap + */ + function proposeNewRoadmap(uint[] _tapFunds, uint[] _tapDurations) public { + (uint curTapNum, TapStage[] memory tapStages, uint votNum) = getTapsInfo(); + uint rmNum; + require(tapStages[curTapNum] == TapStage.RoadmapPreparing); + require(_tapFunds.length == _tapDurations.length); + require(msg.sender == owner); + require(_tapFunds.length >= roadmaps[roadmapsCount - 1].tapsCount); + require(!newRoadmapProposed); + + roadmaps[roadmapsCount].tapsCount = _tapFunds.length; + roadmaps[roadmapsCount].investorsCount = roadmaps[roadmapsCount - 1].investorsCount; + + for(uint tapFundsNum = 0; tapFundsNum < _tapFunds.length; tapFundsNum++) { + rmNum = tapToRId[tapFundsNum]; + require(_tapDurations[tapFundsNum] > 7); + if(tapFundsNum <= curTapNum) { + require(_tapDurations[tapFundsNum]*(1 days) == roadmaps[rmNum].taps[tapFundsNum].duration); + require(_tapFunds[tapFundsNum] == roadmaps[rmNum].taps[tapFundsNum].funds); + } else if(tapFundsNum > curTapNum) { + tapToRId[tapFundsNum] = roadmapsCount; // just for clearness; + } + + Tap memory tap; + tap.funds = _tapFunds[tapFundsNum]; + tap.duration = _tapDurations[tapFundsNum]*(1 days); + tap.isWithdrawed = false; + roadmaps[roadmapsCount].taps[tapFundsNum] = tap; + } + + uint invNum; + for(invNum = 0; invNum < roadmaps[roadmapsCount - 1].investorsCount; invNum++) { + roadmaps[roadmapsCount].investors[invNum] = roadmaps[roadmapsCount - 1].investors[invNum]; + } + + roadmapsCount += 1; + newRoadmapProposed = true; + } + + /* + Internal functions + */ + + /** + * @dev this function will replace current roadmap to the proposed one if it was accepted + * this function will be called at the first investment operation for a new roadmap + */ + function _replaceRoadmapToProposedOne() internal { + (uint curTapNum, TapStage[] memory tapStages, uint v) = getTapsInfo(); + for(uint tapNum = 0; tapNum < roadmaps[roadmapsCount - 1].tapsCount; tapNum++) { + if(tapNum > curTapNum) { + tapToRId[tapNum] = roadmapsCount - 1; + } + } + } + + /** + * @param _tapNum – number of a tap + * @return are all funds for a this _tapNum collected or not + */ + function _areAllFundsCollected(uint _tapNum) internal view returns(bool) { + return _amountOfAllInvestments(_tapNum) >= _tapAmountsSum(_tapNum); + } + + /** + * @dev sum can vary for a different _tapNum in cases when roadmap have been changed + * @param _tapNum – number of a tap + * @return sum – sum of all gotten investments for a specific tap + */ + function _amountOfAllInvestments(uint _tapNum) internal view returns(uint sum) { + uint rmNum = tapToRId[_tapNum]; + uint invCount = roadmaps[rmNum].investorsCount; + for(uint invNum = 0; invNum < invCount; invNum++) { + sum += roadmaps[rmNum].investors[invNum].invested; + } + } + + /** + * @dev sum of all tap amounts; output can vary for a different _tapNum in cases when roadmap have been changed + * @param _tapNum – number of the tap (to get an appropriate roadmap) + * @return sum – sum of tap amounts + */ + function _tapAmountsSum(uint _tapNum) internal view returns(uint sum) { + uint rmNum = tapToRId[_tapNum]; + uint tapsCount = roadmaps[rmNum].tapsCount; + for(uint tapNum = 0; tapNum < tapsCount; tapNum++) { + sum += roadmaps[rmNum].taps[tapNum].funds; + } + } + /** * @param _targetAddress – address of the investor (presumably) * @return investor id @@ -263,7 +339,9 @@ contract Daico is IDaico { (uint curTapNum, TapStage[] memory tapStages, uint v) = getTapsInfo(); uint rmNum = tapToRId[curTapNum]; for(uint invNum = 0; invNum < roadmaps[rmNum].investorsCount; invNum++) { - if(roadmaps[rmNum].investors[invNum].addr == _targetAddress) return invNum; + if(roadmaps[rmNum].investors[invNum].addr == _targetAddress) { + return invNum; + } } return roadmaps[rmNum].investorsCount; } @@ -275,12 +353,14 @@ contract Daico is IDaico { * @param _voterAddress – address of the voter (presumably) * @return is voted or not */ - function isVoted(uint _tapNum, uint _votNum, address _voterAddress) public view returns(bool isVoted) { + function _isVoted(uint _tapNum, uint _votNum, address _voterAddress) internal view returns(bool isVoted) { uint rmNum = tapToRId[_tapNum]; Voting memory voting = roadmaps[rmNum].taps[_tapNum].votings[_votNum]; for(uint voterNum = 0; voterNum < voting.voted.length; voterNum++) { - if(voting.voted[voterNum] == _voterAddress) isVoted = true; + if(voting.voted[voterNum] == _voterAddress) { + isVoted = true; + } } } @@ -294,33 +374,6 @@ contract Daico is IDaico { return roadmaps[rmNum].taps[_tapNum]; } - /** - * @return current_tap – number of the current tap - * @return tapStages array – array of a states for all tap stages - * @return current voting num – number of the current voting - */ - function getTapsInfo() public view returns(uint, TapStage[], uint) { // curren_tap, tapstages, current_voting - uint maximalTapsAmount = 0; - for(uint rmNum = 0; rmNum < roadmapsCount; rmNum++) { - if(roadmaps[rmNum].tapsCount > maximalTapsAmount) { - maximalTapsAmount = roadmaps[rmNum].tapsCount; - } - } - - TapStage[] memory tapStages = new TapStage[](maximalTapsAmount); - uint start = 0; - uint tapD; - uint votNum = 0; - - for(uint tapNum = 0; tapNum < maximalTapsAmount; tapNum++) { - tapD = _getTap(tapNum).duration; - (votNum, tapStages[tapNum], start) = getTapStage(tapNum, tapD, start); - if((tapStages[tapNum]!=TapStage.Success)) return (tapNum, tapStages, votNum); - } - - return (tapNum, tapStages, votNum); - } - /** * @param _tapNum – number of the tap * @param _tapD – tap duration @@ -328,60 +381,60 @@ contract Daico is IDaico { * @return current voting num – number of the current voting * @return tapStage – state of the current tap * @return NewstartTime – start time of the next tap - */ - function getTapStage(uint _tapNum, uint _tapD, uint _start) public view returns(uint, TapStage, uint) { - bool invC = areAllFundsCollected(_tapNum); + */ + function _getTapStage(uint _tapNum, uint _tapD, uint _start) internal view returns(uint, TapStage, uint) { + bool invC = _areAllFundsCollected(_tapNum); uint RmV = _start + _tapD + roadmapD + votesD; uint addVRmV = _start + _tapD + addVotesD + roadmapD + votesD; - if((startedAt == 0) && (now < createdAt + investD)) return (0, TapStage.Investing, 0); - if((startedAt == 0) && (now >= createdAt + investD)) return (0, TapStage.Terminated, 0); - if((_tapNum==0)) return (0, TapStage.Success, 0); + if((startedAt == 0) && (now < createdAt + investD)) return (0, TapStage.Investing, 0); + if((startedAt == 0) && (now >= createdAt + investD)) return (0, TapStage.Terminated, 0); + if((_tapNum==0)) return (0, TapStage.Success, 0); - // _tapNum _start time duration voting1 voting2 voting3 voting4 - //---------------------------------------------------------------------------------------------------------- - if(at(_start, _tapD-votesD) &&thisCase(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Preparing, 0); - if(at(_start+_tapD-votesD, votesD) && thisCase(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Voting, 0); - if(at(investD, infinity) && thisCase(_tapNum, VR.Decline, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(investD, infinity) && thisCase(_tapNum, VR.Success, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Success, _start + _tapD); - if(at(_start+_tapD, addVotesD)&& thisCase(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (1, TapStage.VotingDQ, 0); - if(at(_start+_tapD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(_start+_tapD, infinity) && thisCase(_tapNum, VR.NoResult, VR.Decline, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(_start+_tapD, infinity) && thisCase(_tapNum, VR.NoResult, VR.Success, VR.NoResult, VR.NoResult)) return (0, TapStage.Success, _start + _tapD + addVotesD); - if(at(_start+_tapD+addVotesD, roadmapD) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult)) return (0, TapStage.RoadmapPreparing, 0); - if(at(addVRmV-votesD, votesD) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult)) return (2, TapStage.RoadmapVoting, 0); - if(at(addVRmV, investD) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.Success, VR.NoResult)) return (0, TapStage.Investing, 0); - if(at(addVRmV, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.Success, VR.NoResult) && invC) return (0, TapStage.Success, addVRmV + investD); - if(at(addVRmV, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.Success, VR.NoResult) && !invC) return (0, TapStage.Terminated, 0); - if(at(_start+_tapD+addVotesD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoCons, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(_start+_tapD+addVotesD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.Decline, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(addVRmV, addVotesD)&& thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult)) return (3, TapStage.RoadmapVotingDQ, 0); - if(at(addVRmV+addVotesD, investD) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Success )) return (0, TapStage.Investing, 0); - if(at(addVRmV+investD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult )) return (0, TapStage.Terminated, 0); - if(at(addVRmV+investD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoCons )) return (0, TapStage.Terminated, 0); - if(at(addVRmV+investD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Decline )) return (0, TapStage.Terminated, 0); - if(at(addVRmV+addVotesD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Success ) && invC) return (0, TapStage.Success, addVRmV + addVotesD + investD); - if(at(addVRmV+addVotesD, infinity) && thisCase(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Success ) && !invC) return (0, TapStage.Terminated, 0); - if(at(_start+_tapD, roadmapD) && thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.RoadmapPreparing, 0); - if(at(_start+_tapD+roadmapD, votesD) && thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (1, TapStage.RoadmapVoting, 0); - if(at(addVRmV+addVotesD+investD, infinity) && thisCase(_tapNum, VR.NoCons, VR.Decline, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(addVRmV+addVotesD+investD, infinity) && thisCase(_tapNum, VR.NoCons, VR.NoCons, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(RmV, investD) && thisCase(_tapNum, VR.NoCons, VR.Success, VR.NoResult, VR.NoResult)) return (0, TapStage.Investing, 0); - if(at(RmV, infinity) && thisCase(_tapNum, VR.NoCons, VR.Success, VR.NoResult, VR.NoResult) && invC) return (0, TapStage.Success, RmV + investD); - if(at(RmV, infinity) && thisCase(_tapNum, VR.NoCons, VR.Success, VR.NoResult, VR.NoResult) && !invC) return (0, TapStage.Terminated, 0); - if(at(RmV, addVotesD)&& thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (2, TapStage.RoadmapVotingDQ, 0); - if(at(RmV+addVotesD, investD) && thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.Success, VR.NoResult)) return (0, TapStage.Investing, 0); - if(at(RmV+investD, infinity) && thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(RmV+investD, infinity) && thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.Decline, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(RmV+investD, infinity) && thisCase(_tapNum, VR.NoCons, VR.NoResult, VR.NoCons, VR.NoResult)) return (0, TapStage.Terminated, 0); - if(at(RmV+addVotesD, infinity) && thisCase(_tapNum, VR.NoCons, VR.NoCons, VR.Success, VR.NoResult) && invC) return (0, TapStage.Success, addVRmV + addVotesD + investD); - if(at(RmV+addVotesD, infinity) && thisCase(_tapNum, VR.NoCons, VR.NoCons, VR.Success, VR.NoResult) && !invC) return (0, TapStage.Terminated, 0); - //---------------------------------------------------------------------------------------------------------- + // _tapNum _start time voting1 voting2 voting3 voting4 + //-------------------------------------------------------------------------------------------------------------------------------- + if(_isInThisTimePeriod(_start, _tapD-votesD) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Preparing, 0); + if(_isInThisTimePeriod(_start+_tapD-votesD, votesD) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Voting, 0); + if(_isInThisTimePeriod(investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.Decline, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.Success, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Success, _start + _tapD); + if(_isInThisTimePeriod(_start+_tapD, addVotesD)&& _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (1, TapStage.VotingDQ, 0); + if(_isInThisTimePeriod(_start+_tapD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(_start+_tapD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.Decline, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(_start+_tapD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.Success, VR.NoResult, VR.NoResult)) return (0, TapStage.Success, _start + _tapD + addVotesD); + if(_isInThisTimePeriod(_start+_tapD+addVotesD, roadmapD) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult)) return (0, TapStage.RoadmapPreparing, 0); + if(_isInThisTimePeriod(addVRmV-votesD, votesD) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult)) return (2, TapStage.RoadmapVoting, 0); + if(_isInThisTimePeriod(addVRmV, investD) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.Success, VR.NoResult)) return (0, TapStage.Investing, 0); + if(_isInThisTimePeriod(addVRmV, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.Success, VR.NoResult) && invC) return (0, TapStage.Success, addVRmV + investD); + if(_isInThisTimePeriod(addVRmV, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.Success, VR.NoResult) && !invC) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(_start+_tapD+addVotesD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoCons, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(_start+_tapD+addVotesD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.Decline, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(addVRmV, addVotesD)&& _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult)) return (3, TapStage.RoadmapVotingDQ, 0); + if(_isInThisTimePeriod(addVRmV+addVotesD, investD) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Success )) return (0, TapStage.Investing, 0); + if(_isInThisTimePeriod(addVRmV+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoResult )) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(addVRmV+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.NoCons )) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(addVRmV+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Decline )) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(addVRmV+addVotesD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Success ) && invC) return (0, TapStage.Success, addVRmV + addVotesD + investD); + if(_isInThisTimePeriod(addVRmV+addVotesD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoResult, VR.NoCons, VR.NoResult, VR.Success ) && !invC) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(_start+_tapD, roadmapD) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.RoadmapPreparing, 0); + if(_isInThisTimePeriod(_start+_tapD+roadmapD, votesD) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (1, TapStage.RoadmapVoting, 0); + if(_isInThisTimePeriod(addVRmV+addVotesD+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.Decline, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(addVRmV+addVotesD+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoCons, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(RmV, investD) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.Success, VR.NoResult, VR.NoResult)) return (0, TapStage.Investing, 0); + if(_isInThisTimePeriod(RmV, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.Success, VR.NoResult, VR.NoResult) && invC) return (0, TapStage.Success, RmV + investD); + if(_isInThisTimePeriod(RmV, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.Success, VR.NoResult, VR.NoResult) && !invC) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(RmV, addVotesD)&& _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (2, TapStage.RoadmapVotingDQ, 0); + if(_isInThisTimePeriod(RmV+addVotesD, investD) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.Success, VR.NoResult)) return (0, TapStage.Investing, 0); + if(_isInThisTimePeriod(RmV+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.NoResult, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(RmV+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.Decline, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(RmV+investD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoResult, VR.NoCons, VR.NoResult)) return (0, TapStage.Terminated, 0); + if(_isInThisTimePeriod(RmV+addVotesD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoCons, VR.Success, VR.NoResult) && invC) return (0, TapStage.Success, addVRmV + addVotesD + investD); + if(_isInThisTimePeriod(RmV+addVotesD, infinity) && _isThisTapHaveThisVRs(_tapNum, VR.NoCons, VR.NoCons, VR.Success, VR.NoResult) && !invC) return (0, TapStage.Terminated, 0); + //-------------------------------------------------------------------------------------------------------------------------------- return (0, TapStage.Preparing, 0); } /** - * @dev check that all voting results are the same + * @dev check all voting results in this tap * @param _tapNum – number of the tap * @param _votingRes1 – voting result for a 1 voting in the current tap * @param _votingRes2 – voting result for a 2 voting in the current tap @@ -389,68 +442,33 @@ contract Daico is IDaico { * @param _votingRes4 – voting result for a 4 voting in the current tap * @return are all voting results the same */ - function thisCase(uint _tapNum, + function _isThisTapHaveThisVRs(uint _tapNum, VR _votingRes1, VR _votingRes2, VR _votingRes3, - VR _votingRes4) public view returns(bool) + VR _votingRes4) internal view returns(bool) { bool withLessQuorum = false; - if(_votingRes1 != votingState(_tapNum, 0, withLessQuorum)) return false; + if(_votingRes1 != _getVotingState(_tapNum, 0, withLessQuorum)) { + return false; + } withLessQuorum = (_votingRes1 == VR.NoResult); - if(_votingRes2 != votingState(_tapNum, 1, withLessQuorum)) return false; + if(_votingRes2 != _getVotingState(_tapNum, 1, withLessQuorum)) { + return false; + } withLessQuorum = (_votingRes2 == VR.NoResult); - if(_votingRes3 != votingState(_tapNum, 2, withLessQuorum)) return false; - withLessQuorum = (_votingRes3 == VR.NoResult); - - if(_votingRes4 != votingState(_tapNum, 3, withLessQuorum)) return false; - - return true; - } - - /** - * @dev project owner can propose new roadmap in the case case if consensus wasn't reached - * @param _tapFunds – array of amounts to invest for an each tap - * @return _tapDurations – array of durations for an each tap - */ - function proposeNewRoadmap(uint[] _tapFunds, uint[] _tapDurations) external { - (uint curTapNum, TapStage[] memory tapStages, uint votNum) = getTapsInfo(); - uint rmNum; - require(tapStages[curTapNum] == TapStage.RoadmapPreparing); - require(_tapFunds.length == _tapDurations.length); - require(msg.sender == owner); - require(_tapFunds.length >= roadmaps[roadmapsCount - 1].tapsCount); - require(!newRoadmapProposed); - - roadmaps[roadmapsCount].tapsCount = _tapFunds.length; - roadmaps[roadmapsCount].investorsCount = roadmaps[roadmapsCount - 1].investorsCount; - - for(uint tapFundsNum = 0; tapFundsNum < _tapFunds.length; tapFundsNum++) { - rmNum = tapToRId[tapFundsNum]; - require(_tapDurations[tapFundsNum] > 7); - if(tapFundsNum <= curTapNum) { - require(_tapDurations[tapFundsNum]*(1 days) == roadmaps[rmNum].taps[tapFundsNum].duration); - require(_tapFunds[tapFundsNum] == roadmaps[rmNum].taps[tapFundsNum].funds); - } else if(tapFundsNum > curTapNum) { - tapToRId[tapFundsNum] = roadmapsCount; // just for clearness; - } - - Tap memory tap; - tap.funds = _tapFunds[tapFundsNum]; - tap.duration = _tapDurations[tapFundsNum]*(1 days); - tap.isWithdrawed = false; - roadmaps[roadmapsCount].taps[tapFundsNum] = tap; + if(_votingRes3 != _getVotingState(_tapNum, 2, withLessQuorum)) { + return false; } + withLessQuorum = (_votingRes3 == VR.NoResult); - uint invNum; - for(invNum = 0; invNum < roadmaps[roadmapsCount - 1].investorsCount; invNum++) { - roadmaps[roadmapsCount].investors[invNum] = roadmaps[roadmapsCount - 1].investors[invNum]; + if(_votingRes4 != _getVotingState(_tapNum, 3, withLessQuorum)) { + return false; } - roadmapsCount += 1; - newRoadmapProposed = true; + return true; } /** @@ -458,7 +476,7 @@ contract Daico is IDaico { * @param _long – duration of this time interval * @return is current moment in this time interval */ - function at(uint _from, uint _long) public view returns(bool) { + function _isInThisTimePeriod(uint _from, uint _long) internal view returns(bool) { return ((now >= _from + startedAt) && (now < startedAt + _from + _long)); } @@ -469,7 +487,7 @@ contract Daico is IDaico { * @return is quorum reached for a given voting with given quorum percent */ function _isQuorumReached(uint _tapNum, Voting memory _voting, uint _quorumPercent) internal view returns(bool) { - return (_voting.pro.add(_voting.versus).mul(100) >= tapAmountsSum(_tapNum).mul(_quorumPercent)); + return (_voting.pro.add(_voting.versus).mul(100) >= _tapAmountsSum(_tapNum).mul(_quorumPercent)); } /** @@ -491,22 +509,28 @@ contract Daico is IDaico { } /** - * @dev * @param _tapNum – number of the tap * @param _votNum – number of the voting * @param _isQuorumDecreased – is quorum decreased or not * @return voting result vor this voting */ - function votingState(uint _tapNum, uint _votNum, bool _isQuorumDecreased) public view returns(VR) { + function _getVotingState(uint _tapNum, uint _votNum, bool _isQuorumDecreased) internal view returns(VR) { uint _quorumPercent = quorumPercent; - if(_isQuorumDecreased) _quorumPercent = quorumPercent - 20; + if(_isQuorumDecreased) { + _quorumPercent = quorumPercent - 20; + } uint rmNum = tapToRId[_tapNum]; Voting memory voting = roadmaps[rmNum].taps[_tapNum].votings[_votNum]; - if(!_isQuorumReached(_tapNum, voting, _quorumPercent)) return VR.NoResult; - if(_isConsensusReached(voting, consensusPercent)) return VR.Success; - if(_isDeclined(voting, declinePercent)) return VR.Decline; - return VR.NoCons; + if(!_isQuorumReached(_tapNum, voting, _quorumPercent)) { + return VR.NoResult; + } else if(_isConsensusReached(voting, consensusPercent)) { + return VR.Success; + } else if(_isDeclined(voting, declinePercent)) { + return VR.Decline; + } else { + return VR.NoCons; + } } } \ No newline at end of file diff --git a/contracts/Daico/IDaico.sol b/contracts/Daico/IDaico.sol index c7717cd..15407a3 100644 --- a/contracts/Daico/IDaico.sol +++ b/contracts/Daico/IDaico.sol @@ -2,7 +2,23 @@ pragma solidity ^0.4.24; contract IDaico { + enum TapStage { + Preparing, + Investing, + Voting, + VotingDQ, + RoadmapPreparing, + RoadmapVoting, + RoadmapVotingDQ, + Success, + Terminated + } + function addInvestor(uint _amount, address _investorAddress) public; - function vote(bool _vote) external; - function proposeNewRoadmap(uint[] _tapFunds, uint[] _tapDurations) external; + function returnTokens() public; + function withdrawFundsFromTap(uint _tapNum) public; + function vote(bool _vote) public; + function proposeNewRoadmap(uint[] _tapFunds, uint[] _tapDurations) public; + + function getTapsInfo() public view returns(uint, TapStage[], uint); }