DevStation / LaunchKit / Templates / Reputation Registry

Reputation Registry

An onchain reputation score with delegated attesters. Points are awarded and slashed by approved addresses, never by the subject.

Deploy This Template
ReputationRegistry.sol
solidity
1// SPDX-License-Identifier: MIT
2pragma solidity ^0.8.20;
3 
4contract ReputationRegistry {
5 address public owner;
6 mapping(address => uint256) public scoreOf;
7 mapping(address => bool) public isAttester;
8 
9 event ScoreChanged(address indexed subject, uint256 newScore, address indexed attester);
10 event AttesterSet(address indexed attester, bool allowed);
11 event OwnerChanged(address indexed newOwner);
12 
13 constructor(address initialOwner_) {
14 require(initialOwner_ != address(0), "ZERO_OWNER");
15 owner = initialOwner_;
16 isAttester[initialOwner_] = true;
17 emit AttesterSet(initialOwner_, true);
18 }
19 
20 modifier onlyOwner() {
21 require(msg.sender == owner, "NOT_OWNER");
22 _;
23 }
24 
25 modifier onlyAttester() {
26 require(isAttester[msg.sender], "NOT_ATTESTER");
27 _;
28 }
29 
30 function setAttester(address attester, bool allowed) external onlyOwner {
31 require(attester != address(0), "ZERO_ATTESTER");
32 isAttester[attester] = allowed;
33 emit AttesterSet(attester, allowed);
34 }
35 
36 function award(address subject, uint256 points) external onlyAttester {
37 require(subject != address(0), "ZERO_SUBJECT");
38 require(points > 0, "ZERO_POINTS");
39 uint256 next = scoreOf[subject] + points;
40 scoreOf[subject] = next;
41 emit ScoreChanged(subject, next, msg.sender);
42 }
43 
44 function slash(address subject, uint256 points) external onlyAttester {
45 uint256 current = scoreOf[subject];
46 uint256 next = points >= current ? 0 : current - points;
47 scoreOf[subject] = next;
48 emit ScoreChanged(subject, next, msg.sender);
49 }
50 
51 function transferOwnership(address newOwner) external onlyOwner {
52 require(newOwner != address(0), "ZERO_OWNER");
53 owner = newOwner;
54 emit OwnerChanged(newOwner);
55 }
56}
57 
DevStation
Loading console…