all files / contracts/ ProxyFactory.sol

100% Statements 19/19
87.5% Branches 7/8
100% Functions 6/6
100% Lines 21/21
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                                                                                                                44×                             27×                        
pragma solidity ^0.4.23;
 
import "./Assessment.sol";
import "./Concept.sol";
import "./AssessmentProxy.sol";
import "./ConceptProxy.sol";
 
 
contract ProxyFactory {
    address public masterConceptCopy;
    address public masterAssessmentCopy;
 
    address public owner;
    uint public timelimit = 7 days;
 
    address public proposedMasterAssessment;
    address public proposedOwner;
    uint public proposedTimelimit;
    uint proposalDate;
 
    event ProposedChange (
        address proposedMasterAssessment,
        address proposedOwner,
        uint proposedTimelimit
    );
 
    event ChangeImplemented (
        address proposedMasterAssessment,
        address proposedOwner,
        uint proposedTimelimit
    );
 
    constructor(address _masterConcept, address _masterAssessment) public {
        owner = msg.sender;
        masterConceptCopy = _masterConcept;
        masterAssessmentCopy = _masterAssessment;
    }
 
    function proposeChange(address _proposedMasterAssessment, address _proposedOwner, uint _proposedTimelimit) public {
      require(msg.sender == owner, 'Owner access only');
      require(isContract(_proposedMasterAssessment), 'New assessment-address must be a contract');
 
      proposedMasterAssessment = _proposedMasterAssessment;
      proposedOwner = _proposedOwner;
      proposedTimelimit = _proposedTimelimit;
      proposalDate = now;
 
      emit ProposedChange(_proposedMasterAssessment, _proposedOwner, _proposedTimelimit);
    }
 
    function implementChange() public {
      Erequire(msg.sender == owner, 'Owner access only');
      require(now - proposalDate > timelimit, 'TimeLimit must pass before change can be implemented');
 
      masterAssessmentCopy = proposedMasterAssessment;
      owner = proposedOwner;
      timelimit = proposedTimelimit;
 
      // REFACTOR could cleanup the proposed* storage variables
 
      emit ChangeImplemented(proposedMasterAssessment, proposedOwner, proposedTimelimit);
    }
 
    function isContract(address _addr) view private returns (bool){
      uint32 size;
      assembly {
      size := extcodesize(_addr)
          }
      return (size > 0);
    }
 
    function createAssessment(address assessee, uint cost, uint size, uint _waitTime, uint _timeLimit)
        public
        returns (Assessment)
    {
        return Assessment(new AssessmentProxy(
            masterAssessmentCopy,
            msg.sender,
            assessee,
            cost,
            size,
            _waitTime,
            _timeLimit
        ));
    }
 
    function createConcept(address[] _parents, uint[] _propagationRates, uint _lifetime, bytes _data, address _owner, address _cloneOf)
        public
        returns (Concept)
    {
        return Concept(new ConceptProxy(
            masterConceptCopy,
            msg.sender,
            _parents,
            _propagationRates,
            _lifetime,
            _data,
            _owner,
            _cloneOf
        ));
    }
}