/ contracts / src / GitHubOracle.sol
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  }