@@ -9,18 +9,17 @@ import "./CommonInterface.sol";
9
9
/**
10
10
* @title A scheme for join in a dao.
11
11
* - A member can be proposed to join in by sending a min amount of fee.
12
- * - A member can ask to quite (RageQuit) a dao on any time.
13
12
* - A member can donate to a dao.
14
13
*/
15
- contract JoinAndQuit is
14
+ contract Join is
16
15
VotingMachineCallbacks ,
17
16
ProposalExecuteInterface ,
18
17
CommonInterface {
19
18
using SafeMath for uint ;
20
19
using SafeERC20 for IERC20 ;
21
20
using StringUtil for string ;
22
21
23
- enum MemeberState { None, Candidate, Accepted, Rejected, ReputationRedeemed }
22
+ enum MemberState { None, Candidate, Accepted, Rejected, ReputationRedeemed }
24
23
25
24
event JoinInProposal (
26
25
address indexed _avatar ,
@@ -34,18 +33,6 @@ contract JoinAndQuit is
34
33
address indexed _avatar
35
34
);
36
35
37
- event RageQuit (
38
- address indexed _avatar ,
39
- address indexed _rageQuitter ,
40
- uint256 indexed _refund
41
- );
42
-
43
- event Refund (
44
- address indexed _avatar ,
45
- address indexed _beneficiary ,
46
- uint256 indexed _refund
47
- );
48
-
49
36
event RedeemReputation (
50
37
address indexed _avatar ,
51
38
bytes32 indexed _proposalId ,
@@ -59,22 +46,15 @@ contract JoinAndQuit is
59
46
uint256 funding;
60
47
}
61
48
62
- struct MemberFund {
63
- MemeberState state;
64
- bool rageQuit;
65
- uint256 funding;
66
- }
67
-
68
49
mapping (bytes32 => Proposal) public proposals;
69
- mapping (address => MemberFund ) public fundings ;
50
+ mapping (address => MemberState ) public membersState ;
70
51
71
52
IERC20 public fundingToken;
72
53
uint256 public minFeeToJoin;
73
54
uint256 public memberReputation;
74
55
uint256 public fundingGoal;
75
56
uint256 public fundingGoalDeadline;
76
57
uint256 public totalDonation;
77
- bool public rageQuitEnable;
78
58
79
59
/**
80
60
* @dev initialize
@@ -89,7 +69,6 @@ contract JoinAndQuit is
89
69
if this param is zero so the repution will be allocated proportional to the fee paid
90
70
* @param _fundingGoal the funding goal
91
71
* @param _fundingGoalDeadline the funding goal deadline
92
- * @param _rageQuitEnable rageQuit enabling flag
93
72
*/
94
73
function initialize (
95
74
Avatar _avatar ,
@@ -101,8 +80,7 @@ contract JoinAndQuit is
101
80
uint256 _minFeeToJoin ,
102
81
uint256 _memberReputation ,
103
82
uint256 _fundingGoal ,
104
- uint256 _fundingGoalDeadline ,
105
- bool _rageQuitEnable
83
+ uint256 _fundingGoalDeadline
106
84
)
107
85
external
108
86
{
@@ -112,7 +90,6 @@ contract JoinAndQuit is
112
90
memberReputation = _memberReputation;
113
91
fundingGoal = _fundingGoal;
114
92
fundingGoalDeadline = _fundingGoalDeadline;
115
- rageQuitEnable = _rageQuitEnable;
116
93
}
117
94
118
95
/**
@@ -127,13 +104,12 @@ contract JoinAndQuit is
127
104
returns (bool ) {
128
105
Proposal memory proposal = proposals[_proposalId];
129
106
require (proposal.proposedMember != address (0 ), "not a valid proposal " );
130
- require (fundings [proposal.proposedMember].state == MemeberState .Candidate, "proposal already been executed " );
107
+ require (membersState [proposal.proposedMember] == MemberState .Candidate, "member is not a cadidate " );
131
108
132
109
bool success;
133
110
// Check if vote was successful:
134
111
if ((_decision == 1 ) && (avatar.nativeReputation ().balanceOf (proposal.proposedMember) == 0 )) {
135
- fundings[proposal.proposedMember].state = MemeberState.Accepted;
136
- fundings[proposal.proposedMember].funding = proposal.funding;
112
+ membersState[proposal.proposedMember] = MemberState.Accepted;
137
113
totalDonation = totalDonation.add (proposal.funding);
138
114
if (fundingToken == IERC20 (0 )) {
139
115
// solhint-disable-next-line
@@ -145,7 +121,7 @@ contract JoinAndQuit is
145
121
//this should be called/check after the transfer to the avatar.
146
122
setFundingGoalReachedFlag ();
147
123
} else {
148
- fundings [proposal.proposedMember].state = MemeberState .Rejected;
124
+ membersState [proposal.proposedMember] = MemberState .Rejected;
149
125
if (fundingToken == IERC20 (0 )) {
150
126
// solhint-disable-next-line
151
127
(success, ) = proposal.proposedMember.call {value:proposal.funding}("" );
@@ -174,11 +150,11 @@ contract JoinAndQuit is
174
150
returns (bytes32 )
175
151
{
176
152
address proposer = msg .sender ;
177
- require (fundings [proposer].state != MemeberState .Candidate, "already a candidate " );
178
- require (fundings [proposer].state != MemeberState .Accepted, "accepted and not redeemed yet " );
179
- require (avatar.nativeReputation ().balanceOf (proposer) == 0 , "already a member " );
180
- require (_feeAmount >= minFeeToJoin, "_feeAmount should be >= then the minFeeToJoin " );
181
- fundings [proposer].state = MemeberState .Candidate;
153
+ require (membersState [proposer] != MemberState .Candidate, "proposer is already a candidate " );
154
+ require (membersState [proposer] != MemberState .Accepted, "proposer is accepted and not redeemed yet " );
155
+ require (avatar.nativeReputation ().balanceOf (proposer) == 0 , "proposer is already a member " );
156
+ require (_feeAmount >= minFeeToJoin, "_feeAmount should be >= than the minFeeToJoin " );
157
+ membersState [proposer] = MemberState .Candidate;
182
158
if (fundingToken == IERC20 (0 )) {
183
159
require (_feeAmount == msg .value , "ETH received should match the _feeAmount " );
184
160
} else {
@@ -212,11 +188,11 @@ contract JoinAndQuit is
212
188
function redeemReputation (bytes32 _proposalId ) public returns (uint256 reputation ) {
213
189
Proposal memory proposal = proposals[_proposalId];
214
190
require (proposal.proposedMember != address (0 ), "no member to redeem " );
215
- require (! fundings[proposal.proposedMember].rageQuit, "member already rageQuit " );
216
- require (fundings[proposal.proposedMember].state == MemeberState.Accepted, "member not accepeted " );
191
+ require (membersState[proposal.proposedMember] == MemberState.Accepted, "member not accepted " );
217
192
//set proposal proposedMember to zero to prevent reentrancy attack.
218
193
proposals[_proposalId].proposedMember = address (0 );
219
- fundings[proposal.proposedMember].state = MemeberState.ReputationRedeemed;
194
+ proposals[_proposalId].proposedMember = address (0 );
195
+ membersState[proposal.proposedMember] = MemberState.ReputationRedeemed;
220
196
if (memberReputation == 0 ) {
221
197
reputation = proposal.funding;
222
198
} else {
@@ -228,49 +204,6 @@ contract JoinAndQuit is
228
204
emit RedeemReputation (address (avatar), _proposalId, proposal.proposedMember, reputation);
229
205
}
230
206
231
- /**
232
- * @dev refund refund donator if the the funding goal did not reached till the funding goal deadline.
233
- * @return refundAmount the refund amount
234
- */
235
- function refund () public returns (uint256 refundAmount ) {
236
- // solhint-disable-next-line not-rely-on-time
237
- require (now > fundingGoalDeadline, "can refund only after fundingGoalDeadline " );
238
- require (
239
- (avatar.db (FUNDED_BEFORE_DEADLINE_KEY).hashCompareWithLengthCheck (FUNDED_BEFORE_DEADLINE_VALUE) == false ),
240
- "can refund only if funding goal not reached " );
241
- require (fundings[msg .sender ].funding > 0 , "no funds to refund " );
242
- refundAmount = fundings[msg .sender ].funding;
243
- fundings[msg .sender ].funding = 0 ;
244
- sendToBeneficiary (refundAmount, msg .sender );
245
- emit Refund (address (avatar), msg .sender , refundAmount);
246
- }
247
-
248
- /**
249
- * @dev rageQuit quit from the dao.
250
- * can be done on any time
251
- * REFUND = USER_DONATION * CURRENT_DAO_BALANCE / TOTAL_DONATIONS
252
- * @return refundAmount the refund amount
253
- */
254
- function rageQuit () public returns (uint256 refundAmount ) {
255
- require (rageQuitEnable, "RageQuit disabled " );
256
- require (fundings[msg .sender ].funding > 0 , "no fund to RageQuit " );
257
- uint256 userDonation = fundings[msg .sender ].funding;
258
- fundings[msg .sender ].funding = 0 ;
259
- fundings[msg .sender ].rageQuit = true ;
260
- if (fundingToken == IERC20 (0 )) {
261
- refundAmount = userDonation.mul (address (avatar.vault ()).balance).div (totalDonation);
262
- } else {
263
- refundAmount = userDonation.mul (fundingToken.balanceOf (address (avatar))).div (totalDonation);
264
- }
265
- totalDonation = totalDonation.sub (userDonation);
266
- uint256 msgSenderReputation = avatar.nativeReputation ().balanceOf (msg .sender );
267
- require (
268
- Controller (
269
- avatar.owner ()).burnReputation (msgSenderReputation, msg .sender ));
270
- sendToBeneficiary (refundAmount, msg .sender );
271
- emit RageQuit (address (avatar), msg .sender , refundAmount);
272
- }
273
-
274
207
/**
275
208
* @dev setFundingGoalReachedFlag check if funding goal reached.
276
209
*/
@@ -294,21 +227,4 @@ contract JoinAndQuit is
294
227
}
295
228
}
296
229
297
- /**
298
- * @dev sendToBeneficiary send amount of eth or token to beneficiary
299
- * @param _amount the amount to send
300
- * @param _beneficiary the beneficiary
301
- */
302
- function sendToBeneficiary (uint256 _amount , address payable _beneficiary ) private {
303
- if (fundingToken == IERC20 (0 )) {
304
- require (
305
- Controller (
306
- avatar.owner ()).sendEther (_amount, _beneficiary), "send ether failed " );
307
- } else {
308
- require (
309
- Controller (
310
- avatar.owner ()).externalTokenTransfer (fundingToken, _beneficiary, _amount), "send token failed " );
311
- }
312
- }
313
-
314
230
}
0 commit comments