Skip to content

Commit 9fbba73

Browse files
committed
feat: add PermissionedAssessment voting mechanics --WIP-- [skip-ci]
1 parent 8b2a0ea commit 9fbba73

File tree

2 files changed

+466
-0
lines changed

2 files changed

+466
-0
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
pragma solidity ^0.8.28;
4+
5+
import {EnumerableSet} from "@openzeppelin/contracts-v4/utils/structs/EnumerableSet.sol";
6+
7+
interface IPermissionedAssessment {
8+
9+
/* ========== DATA STRUCTURES ========== */
10+
11+
struct AssessmentData {
12+
uint32 assessingGroupId;
13+
uint32 cooldownPeriod;
14+
}
15+
16+
struct AssessmentGroupView {
17+
uint id;
18+
string ipfsMetadata;
19+
address[] assessors;
20+
}
21+
22+
struct Ballot {
23+
Vote vote;
24+
bytes32 ipfsHash;
25+
uint32 timestamp;
26+
}
27+
28+
struct Assessment {
29+
uint32 start;
30+
uint32 end;
31+
uint32 assessorGroupId;
32+
mapping(uint256 assessorMemberId => Ballot) ballot; // only stores latest choice
33+
}
34+
35+
enum Vote {
36+
NONE, // 0 - default
37+
ACCEPT, // 1
38+
DENY // 2
39+
}
40+
41+
/* ========== VIEWS ========== */
42+
43+
// Groups management
44+
45+
// function getGroupsCount() external view returns (uint groupCount);
46+
47+
// function getGroupAssessorCount(uint groupId) external view returns (uint assessorCount);
48+
49+
// function getGroupAssessors(uint groupId) external view returns (address[] memory assessors);
50+
51+
// function isAssessorInGroup(address assessor, uint groupId) external view returns (bool);
52+
53+
// function getGroupsForAssessor(address assessor) external view returns (uint[] memory groupIds);
54+
55+
// function getGroupsData(uint[] calldata groupIds) external view returns (AssessmentGroupView[] memory groups);
56+
57+
// Voting
58+
59+
function minVotingPeriod() external pure returns (uint256);
60+
61+
function silentEndingPeriod() external pure returns (uint256);
62+
63+
function payoutCooldown(uint256 productTypeId) external view returns (uint256);
64+
65+
function assessorGroupOf(bytes32 claimId) external view returns (uint32);
66+
67+
function getAssessmentInfo(bytes32 claimId) external view returns (uint32 start, uint32 end, uint256 accepts, uint256 denies);
68+
69+
function isAssessmentDecided(bytes32 claimId) external view returns (bool);
70+
71+
function getVoteTally(bytes32 claimId) external view returns (uint256 acceptCount, uint256 denyCount);
72+
73+
function ballotOf(bytes32 claimId, address assessor) external view returns (Ballot memory);
74+
75+
function hasVoted(bytes32 claimId, address assessor) external view returns (bool);
76+
77+
function claimsOpenForVoting(address assessor) external view returns (bytes32[] memory);
78+
79+
function getOutcome(bytes32 claimId) external view returns (bool accepted);
80+
81+
/* === MUTATIVE FUNCTIONS ==== */
82+
83+
// Groups management
84+
85+
// function makeNewGroup(address[] calldata assessors, string calldata ipfsMetadata) external returns (uint groupId);
86+
87+
// function addAssessorsToGroup(address[] calldata assessors, uint groupId) external;
88+
89+
// function setGroupMetadata(uint groupId, string calldata ipfsMetadata) external;
90+
91+
// function removeAssessorsFromGroup(address[] calldata assessors, uint groupId) external;
92+
93+
// function removeAssessorsFromAllGroups(address[] calldata assessors) external;
94+
95+
// Voting
96+
97+
function castVote(bytes32 claimId, Vote vote, bytes32 ipfsHash) external;
98+
99+
function startAssessment(bytes32 claimId, uint16 productTypeId) external;
100+
101+
/* ========= EVENTS ========== */
102+
103+
event SetAssessmentDataForProductTypesa(uint[] productTypeIds, uint cooldownPeriod, uint groupId);
104+
event AddAssessorsToGroup(uint indexed groupId, address[] assessors);
105+
event RemoveAssessorsFromGroup(uint indexed groupId, address[] assessors);
106+
event RemoveAssessorsFromAllGroups(address[] assessors);
107+
108+
event AssessmentStarted(
109+
bytes32 indexed claimId,
110+
uint32 assessorGroupId,
111+
uint32 start,
112+
uint32 end
113+
);
114+
115+
event VoteCast(
116+
bytes32 indexed claimId,
117+
uint256 indexed assessorMemberId,
118+
Vote vote,
119+
bytes32 ipfsHash
120+
);
121+
122+
event AssessmentClosedEarly(bytes32 claimId);
123+
event AssessmentExtended(bytes32 claimId, uint32 newEnd);
124+
125+
126+
/* ========== ERRORS ========== */
127+
128+
error AssessmentAlreadyExists();
129+
error ClaimIdsEmpty();
130+
error ClaimAssessmentAlreadyClosed();
131+
error ClaimIdsVotesLengthMismatch();
132+
error ClaimIdsCidsLengthMismatch();
133+
error ClaimAssessmentNotFinished();
134+
error EmptyAssessorGroup();
135+
error InvalidVote();
136+
error InvalidAssessor();
137+
}

0 commit comments

Comments
 (0)