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 |
2×
2×
2×
5×
3×
1×
1×
1×
1×
1×
3×
3×
1×
1×
1×
1×
3×
3×
3×
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
));
}
}
|