Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
27 changes: 25 additions & 2 deletions graphql.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@ const ethJsUtil = require('ethereumjs-util');
const { withFilter, AuthenticationError } = require('apollo-server');
const { ApolloServer, gql } = require('apollo-server-express');

const { proposalToType } = require('./helpers/utils');
const { actionableStatus } = require('./helpers/constants');
const { proposalToType, getCurrentActionableStatus } = require('./helpers/utils');

const { getAddressDetails } = require('./dbWrapper/addresses');
const { getDaoInfo } = require('./dbWrapper/dao');

const { pubsub } = require('./pubsub');

const { getProposal, getSpecialProposal } = require('./dbWrapper/proposals');
const {
getProposal,
getSpecialProposal,
getSpecialProposals,
getProposals,
} = require('./dbWrapper/proposals');

const { proposalStages } = require('./helpers/constants');

const { typeDef: scalarType, resolvers: scalarResolvers } = require('./types/scalar.js');
const { typeDef: userType, resolvers: userResolvers } = require('./types/user.js');
Expand All @@ -26,6 +34,9 @@ const queryType = gql`

# Get the current user's information.
fetchDao: Dao!

# Find proposals in specific stage
fetchProposals(stage: String!, onlyActionable: Boolean): [Proposal]
}
`;

Expand Down Expand Up @@ -77,6 +88,18 @@ const resolvers = {
fetchDao: (_obj, _args, _context, _info) => {
return getDaoInfo();
},
fetchProposals: async (_obj, args, context, _info) => {
const { stage, onlyActionable } = args;
const filter = (stage === 'all') ? {} : { stage: stage.toUpperCase() };
const proposals = await getProposals(filter);
const specialProposals = (stage.toUpperCase() === proposalStages.PROPOSAL || stage === 'all') ? await getSpecialProposals() : [];

const allProposals = specialProposals.concat(proposals).map(proposal => ({
...proposal,
actionableStatus: getCurrentActionableStatus(proposal, context.currentUser),
}));
return onlyActionable ? allProposals.filter(proposal => proposal.actionableStatus !== actionableStatus.NONE) : allProposals;
},
},
Mutation: {},
Subscription: {
Expand Down
39 changes: 26 additions & 13 deletions helpers/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,25 +115,37 @@ const readProposalVersionIndices = {
};

const readProposalPRLActions = {
1: true,
2: true,
3: false,
1: 'STOPPED',
2: 'PAUSED',
3: 'ACTIVE',
NEW: 'ACTIVE',
PAUSED: 'PAUSED',
};

const proposalStages = {
IDEA: 'idea',
DRAFT: 'draft',
PROPOSAL: 'proposal',
ONGOING: 'ongoing',
REVIEW: 'review',
ARCHIVED: 'archived',
IDEA: 'IDEA',
DRAFT: 'DRAFT',
PROPOSAL: 'PROPOSAL',
ONGOING: 'ONGOING',
REVIEW: 'REVIEW',
ARCHIVED: 'ARCHIVED',
};

const proposalVotingStages = {
DRAFT: 'draftVoting',
COMMIT: 'commit',
REVEAL: 'reveal',
NONE: 'none',
DRAFT: 'DRAFT',
COMMIT: 'COMMIT',
REVEAL: 'REVEAL',
NONE: 'NONE',
};

const actionableStatus = {
NONE: 'NONE',
AWAITING_ENDORSEMENT: 'AWAITING_ENDORSEMENT',
MODERATOR_VOTING: 'MODERATOR_VOTING',
COMMIT_PHASE: 'COMMIT_PHASE',
REVEAL_PHASE: 'REVEAL_PHASE',
CLAIM_FUNDING: 'CLAIM_FUNDING',
CLAIM_VOTING: 'CLAIM_VOTING',
};

const collections = {
Expand Down Expand Up @@ -342,4 +354,5 @@ module.exports = {
daoServerEndpoints,
daoServerEventTypes,
gasLimits,
actionableStatus,
};
3 changes: 2 additions & 1 deletion helpers/contracts.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const ContractResolver = require('@digix/dao-contracts/build/contracts/ContractResolver.json');
const Dao = require('@digix/dao-contracts/build/contracts/Dao.json');
const DaoCalculatorService = require('@digix/dao-contracts/build/contracts/DaoCalculatorService.json');
const DaoConfigsStorage = require('@digix/dao-contracts/build/contracts/DaoConfigsStorage.json');
const DaoFundingManager = require('@digix/dao-contracts/build/contracts/DaoFundingManager.json');
const DaoIdentity = require('@digix/dao-contracts/build/contracts/DaoIdentity.json');
const DaoIdentityStorage = require('@digix/dao-contracts/build/contracts/DaoIdentityStorage.json');
Expand All @@ -17,7 +16,9 @@ const DaoStakeStorage = require('@digix/dao-contracts/build/contracts/DaoStakeSt
const DaoStorage = require('@digix/dao-contracts/build/contracts/DaoStorage.json');

// Replace with DaoUpgradeStorage in mainnet deployment
// Replace with DaoConfigsStorage in mainnet deployment
const DaoUpgradeStorage = require('@digix/dao-contracts/build/contracts/MockDaoUpgradeStorage.json');
const DaoConfigsStorage = require('@digix/dao-contracts/build/contracts/MockDaoConfigsStorage.json');

const DaoVoting = require('@digix/dao-contracts/build/contracts/DaoVoting.json');
const DaoVotingClaims = require('@digix/dao-contracts/build/contracts/DaoVotingClaims.json');
Expand Down
84 changes: 84 additions & 0 deletions helpers/utils.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
const BigNumber = require('bignumber.js');
const crypto = require('crypto');

const {
getCurrentTimestamp,
} = require('@digix/helpers/lib/helpers');

const {
denominators,
dijixDefaultFields,
gasLimits,
actionableStatus,
proposalStages,
proposalVotingStages,
} = require('./constants');

const getServerSignatures = function (req) {
Expand Down Expand Up @@ -359,6 +366,82 @@ const getTxConfigs = function () {
};
};

const getCurrentActionableStatus = function (proposal, user) {
if (!proposal || !user) return actionableStatus.NONE;

const currentTime = getCurrentTimestamp();
if (
proposal.stage === proposalStages.IDEA
&& user.isModerator
) {
return actionableStatus.AWAITING_ENDORSEMENT;
}
if (
proposal.votingStage === proposalVotingStages.DRAFT
&& currentTime > proposal.draftVoting.startTime
&& currentTime < proposal.draftVoting.votingDeadline
&& user.isModerator
) {
return actionableStatus.MODERATOR_VOTING;
}
if (
proposal.votingStage === proposalVotingStages.DRAFT
&& currentTime > proposal.draftVoting.votingDeadline
&& user.address === proposal.proposer
) {
return actionableStatus.CLAIM_VOTING;
}
if (
proposal.votingStage === proposalVotingStages.COMMIT
&& currentTime > proposal.votingRounds[proposal.currentVotingRound].startTime
&& currentTime < proposal.votingRounds[proposal.currentVotingRound].commitDeadline
&& (user.isModerator || user.isParticipant)
) {
return actionableStatus.COMMIT_PHASE;
}
if (
proposal.votingStage === proposalVotingStages.COMMIT
&& currentTime > proposal.votingRounds[proposal.currentVotingRound].commitDeadline
&& currentTime < proposal.votingRounds[proposal.currentVotingRound].revealDeadline
&& (user.isModerator || user.isParticipant)
) {
return actionableStatus.REVEAL_PHASE;
}
if (
proposal.votingStage === proposalVotingStages.COMMIT
&& currentTime > proposal.votingRounds[proposal.currentVotingRound].revealDeadline
&& user.address === proposal.proposer
) {
return actionableStatus.CLAIM_VOTING;
}
if (
proposal.stage === proposalStages.ONGOING
&& proposal.claimableFunding !== null
&& proposal.claimableFunding !== undefined
&& proposal.claimableFunding !== '0'
&& user.address === proposal.proposer
) {
return actionableStatus.CLAIM_FUNDING;
}
if (
proposal.isActive
&& currentTime > proposal.votingRounds[0].startTime
&& currentTime < proposal.votingRounds[0].commitDeadline
&& (user.isModerator || user.isParticipant)
) {
return actionableStatus.COMMIT_PHASE;
}
if (
proposal.isActive
&& currentTime > proposal.votingRounds[0].commitDeadline
&& currentTime < proposal.votingRounds[0].revealDeadline
&& (user.isModerator || user.isParticipant)
) {
return actionableStatus.REVEAL_PHASE;
}
return actionableStatus.NONE;
};

module.exports = {
sumArray,
sumArrayBN,
Expand Down Expand Up @@ -386,4 +469,5 @@ module.exports = {
getDefaultDijixFields,
getAdditionalDocs,
getTxConfigs,
getCurrentActionableStatus,
};
6 changes: 3 additions & 3 deletions routes/proposals.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ router.get('/count', async (req, res) => {
if (!result[proposal.stage]) result[proposal.stage] = 0;
result[proposal.stage] += 1;
}
result[proposalStages.PROPOSAL] += specialProposalsCount;
result[proposalStages.PROPOSAL] = result[proposalStages.PROPOSAL] ? result[proposalStages.PROPOSAL] + specialProposalsCount : specialProposalsCount;
return res.json({ result });
});

Expand All @@ -45,11 +45,11 @@ router.get('/details/:id', async (req, res) => {
});

router.get('/:stage', async (req, res) => {
const filter = (req.params.stage === 'all') ? {} : { stage: req.params.stage };
const filter = (req.params.stage === 'all') ? {} : { stage: req.params.stage.toUpperCase() };
const proposals = await getProposals(filter);
let specialProposals = [];
if (
req.params.stage === proposalStages.PROPOSAL
req.params.stage.toUpperCase() === proposalStages.PROPOSAL
|| req.params.stage === 'all'
) {
specialProposals = await getSpecialProposals();
Expand Down
5 changes: 3 additions & 2 deletions scripts/proposals.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const refreshProposalNew = async (res) => {
proposal.stage = proposalStages.IDEA;
proposal.timeCreated = proposalDetails[readProposalIndices.timeCreated].toNumber();
proposal.finalVersionIpfsDoc = proposalDetails[readProposalIndices.finalVersionIpfsDoc];
proposal.prl = proposalDetails[readProposalIndices.prl];
proposal.prl = readProposalPRLActions.NEW;
proposal.isDigix = proposalDetails[readProposalIndices.isDigix];
proposal.claimableFunding = 0;
proposal.currentMilestone = -1;
Expand Down Expand Up @@ -159,7 +159,7 @@ const refreshProposalDetails = async (res) => {
proposal.endorser = proposalDetails[readProposalIndices.endorser];
proposal.timeCreated = proposalDetails[readProposalIndices.timeCreated].toNumber();
proposal.finalVersionIpfsDoc = proposalDetails[readProposalIndices.finalVersionIpfsDoc];
proposal.prl = proposalDetails[readProposalIndices.prl];
proposal.prl = proposalDetails[readProposalIndices.prl] ? readProposalPRLActions.PAUSED : readProposalPRLActions.NEW;
proposal.isDigix = proposalDetails[readProposalIndices.isDigix];

const nVersions = proposalDetails[readProposalIndices.nVersions];
Expand Down Expand Up @@ -733,6 +733,7 @@ const refreshProposalSpecialNew = async (res) => {
proposal.timeCreated = readProposal[readSpecialProposalIndices.timeCreated].toNumber();
proposal.isActive = false;
proposal.isSpecial = true;
proposal.prl = readProposalPRLActions.NEW;
proposal.stage = proposalStages.PROPOSAL;
proposal.uintConfigs = {};
proposal.addressConfigs = {};
Expand Down
Loading