File size: 3,492 Bytes
160aacb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract PureIUUY {
    
    // --- 1. IDENTITY & REPUTATION ---
    struct Researcher {
        bool isRegistered;
        uint256 reputationScore;
        string role; // "Admin", "Native_Speaker", "Contributor"
    }
    
    mapping(address => Researcher) public researchers;
    address public labAdmin;

    // --- 2. REGISTRY & LICENSING ---
    struct DialectEntry {
        uint256 id;
        string phrase;      // e.g., "How far?"
        string dialect;     // e.g., "Nigerian Pidgin"
        string ipfsCid;     // Link to audio/metadata
        address contributor;
        string licenseType; // e.g., "CC-BY-4.0", "Research-Only"
        uint256 verificationCount;
        bool isVerified;
    }

    uint256 public entryCounter;
    mapping(uint256 => DialectEntry) public entries;

    // --- EVENTS (For your Python Script to listen to) ---
    event EntryProposed(uint256 indexed id, string phrase, address indexed proposer);
    event EntryVerified(uint256 indexed id, address indexed verifier);
    event ReputationMinted(address indexed researcher, uint256 amount);

    constructor() {
        labAdmin = msg.sender;
        researchers[msg.sender] = Researcher(true, 100, "Admin"); // Initial Admin
    }

    // --- MODIFIERS (Governance Guardrails) ---
    modifier onlyAdmin() {
        require(msg.sender == labAdmin, "Only Lab Admin can do this");
        _;
    }

    modifier onlyRegistered() {
        require(researchers[msg.sender].isRegistered, "Must be registered researcher");
        _;
    }

    // --- FUNCTIONS ---

    // Identity Management (Onboarding)
    function registerResearcher(address _user, string memory _role) public onlyAdmin {
        researchers[_user] = Researcher(true, 10, _role); // Start with 10 Rep
    }

    // Level 1: The Registry (Logic Layer)
    function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license) public onlyRegistered {
        entryCounter++;
        entries[entryCounter] = DialectEntry(
            entryCounter,
            _phrase,
            _dialect,
            _ipfsCid,
            msg.sender,
            _license,
            0,
            false
        );
        emit EntryProposed(entryCounter, _phrase, msg.sender);
    }

    // Level 3: Consensus & Governance (Voting)
    function verifyEntry(uint256 _id) public onlyRegistered {
        require(entries[_id].contributor != msg.sender, "Cannot verify own entry");
        require(!entries[_id].isVerified, "Already verified");

        entries[_id].verificationCount++;

        // Simple Consensus: If 2 peers verify, it becomes "Official"
        if (entries[_id].verificationCount >= 2) {
            entries[_id].isVerified = true;
            _mintReputation(entries[_id].contributor, 50); // Reward the creator
            emit EntryVerified(_id, msg.sender);
        }
        
        // Reward the verifier slightly for doing the work
        _mintReputation(msg.sender, 10); 
    }

    // Level 3: Incentive Mechanism (Reputation)
    function _mintReputation(address _user, uint256 _amount) internal {
        researchers[_user].reputationScore += _amount;
        emit ReputationMinted(_user, _amount);
    }

    // Level 4: Transparent Usage
    function getLicenseInfo(uint256 _id) public view returns (string memory, address) {
        return (entries[_id].licenseType, entries[_id].contributor);
    }
}