GitHubOracle.sol
1 /** 2 * GitHubOracle.sol 3 * Contract that oracle github API 4 * GitHubOracle register users and create GitHubToken contracts 5 * Registration requires user create a gist with only their account address 6 * GitHubOracle will create one GitHubToken contract per repository 7 * GitHubToken mint tokens by commit only for registered users in GitHubOracle 8 * GitHubToken is a LockableCoin, that accept donatations and can be withdrawn by Token Holders 9 * The lookups are done by Oraclize that charge a small fee 10 * The contract itself will never charge any fee 11 * 12 * By Ricardo Guilherme Schmidt 13 * Released under GPLv3 License 14 */ 15 16 import "oraclizeAPI_0.4.sol"; 17 import "Owned.sol"; 18 import "./GitHubUserReg.sol"; 19 import "./GitHubRepositoryReg.sol"; 20 import "./GitHubPoints.sol"; 21 22 pragma solidity ^0.4.11; 23 24 contract GitHubOracle is Owned, DGitI { 25 26 GitHubUserReg public userReg; 27 GitHubRepositoryReg public repositoryReg; 28 GitHubPoints public gitHubPoints; 29 30 mapping (uint256 => Repository) repositories; 31 mapping (uint256 => mapping (uint256 => uint256)) pending; 32 33 modifier oraclized { 34 if(msg.sender != address(gitHubPoints)) throw; 35 _; 36 } 37 38 struct Repository { 39 string head; 40 string tail; 41 mapping (string => string) pending; 42 } 43 44 function initialize() only_owner { 45 if(address(userReg) == 0x0){ 46 userReg = GHUserReg.create(); 47 }else if(address(repositoryReg) == 0x0){ 48 repositoryReg = GHRepoReg.create(); 49 }else if(address(gitHubPoints) == 0x0){ 50 gitHubPoints = GHPoints.create(); 51 }else throw; 52 } 53 54 function update(string _repository, string _token) payable { 55 uint256 repoId = repositoryReg.getId(_repository); 56 if(repoId == 0) throw; 57 gitHubPoints.update.value(msg.value)(_repository, "master", repositories[repoId].head,_token); 58 } 59 60 function issue(string _repository, string _issue, string _token) payable { 61 gitHubPoints.issue.value(msg.value)(_repository,_issue,_token); 62 } 63 64 function __pendingScan(uint256 _projectId, string _lastCommit, string _pendingTail) oraclized { 65 repositories[_projectId].pending[_pendingTail] = _lastCommit; 66 } 67 68 function __setHead(uint256 _projectId, string _head) oraclized { 69 repositories[_projectId].head = _head; 70 } 71 72 function __setTail(uint256 _projectId, string _tail) oraclized { 73 repositories[_projectId].tail = _tail; 74 } 75 76 function __setIssue(uint256 _projectId, uint256 _issueId, bool _state, uint256 _closedAt) oraclized { 77 GitRepositoryI repo = GitRepositoryI(repositoryReg.getAddr(_projectId)); 78 repo.setBounty(_issueId, _state, _closedAt); 79 } 80 81 function __setIssuePoints(uint256 _projectId, uint256 _issueId, uint256 _userId, uint256 _points) oraclized { 82 GitRepositoryI repo = GitRepositoryI(repositoryReg.getAddr(_projectId)); 83 repo.setBountyPoints(_issueId, userReg.getAddr(_userId), _points); 84 } 85 86 event NewPoints(uint repoId, uint userId, uint total, bool claimed); 87 88 function __newPoints(uint _repoId, uint _userId, uint _points) 89 only_owner { 90 GitRepositoryI repoaddr = GitRepositoryI(repositoryReg.getAddr(_repoId)); 91 bool claimed = repoaddr.claim(userReg.getAddr(_userId), _points); 92 if(!claimed){ //try to claim points 93 pending[_userId][_repoId] += _points; //set as a pending points 94 } 95 NewPoints(_repoId, _userId, _points, claimed); 96 } 97 98 //claims pending points 99 function claimPending(uint _repoId, uint _userId){ 100 GitRepositoryI repoaddr = GitRepositoryI(repositoryReg.getAddr(_repoId)); 101 uint total = pending[_userId][_repoId]; 102 delete pending[_userId][_repoId]; 103 if(repoaddr.claim(userReg.getAddr(_userId), total)) { 104 NewPoints(_repoId,_userId,total,true); 105 } else throw; 106 } 107 108 }