-
Notifications
You must be signed in to change notification settings - Fork 30
/
DAppStore.sol
162 lines (120 loc) · 4.88 KB
/
DAppStore.sol
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
pragma solidity 0.4.23;
import './token/MiniMeTokenInterface.sol';
contract DAppStore {
uint256 constant percentage_num = 1;
uint256 constant percentage_den = 100000;
// if num = 1, and den = 100000, num/den = 0.000001
MiniMeTokenInterface SNT;
constructor (MiniMeTokenInterface _SNT) public {
SNT = _SNT;
}
struct Vote {
uint256 NumberMinted;
bool positive;
}
struct Dapp {
address developer;
bytes category;
bytes name;
bytes32 id;
uint256 SNTBalance;
uint256 effectiveBalance;
Vote[] votes;
}
Dapp[] public dapps;
mapping(bytes32 => uint) public id2index;
event DAppCreated(bytes32 id, uint256 amount);
event IncreasedDAppStake(bytes32 id, uint256 amount);
// -- TEST
function createDApp(bytes _category, bytes _name, bytes32 _id, uint256 _amountToStake) public {
require(_amountToStake != 0);
require(SNT.allowance(msg.sender, address(this)) >= _amountToStake);
require(SNT.transferFrom(msg.sender, address(this), _amountToStake));
uint dappIdx = dapps.length;
dapps.length++;
Dapp storage d = dapps[dappIdx];
d.developer = msg.sender;
d.category = _category;
d.name = _name;
d.id = _id;
d.SNTBalance = _amountToStake;
id2index[_id] = dappIdx;
emit DAppCreated(_id, _amountToStake);
}
// -- TEST
function numVotesToMint(Dapp storage d, uint256 _SNTBalance) internal view returns(uint256) {
uint TOTAL_SNT = d.SNTBalance;
uint SNT_PROPORTION = TOTAL_SNT * percentage_num;
assert(SNT_PROPORTION / TOTAL_SNT == percentage_num);
SNT_PROPORTION /= percentage_den;
uint num_votes_to_mint_at_1 = percentage_den / percentage_num;
if (_SNTBalance <= SNT_PROPORTION) {
return num_votes_to_mint_at_1;
}
if (_SNTBalance > SNT_PROPORTION) {
uint current_interval_index = _SNTBalance / SNT_PROPORTION;
return num_votes_to_mint_at_1 + ((current_interval_index * (((_SNTBalance/100) - 1) / d.effectiveBalance)) * num_votes_to_mint_at_1);
}
}
// -- TEST
function costOfMinting(bytes32 _id, uint256 _SNT) public view returns(uint256) {
uint dappIdx = id2index[_id];
Dapp storage d = dapps[dappIdx];
require(d.id == _id);
return numVotesToMint(d, _SNT);
}
// -- TEST
function stake(bytes32 _id, uint256 _amountToStake) public {
uint dappIdx = id2index[_id];
Dapp storage d = dapps[dappIdx];
require(d.id == _id);
require(_amountToStake != 0);
require(SNT.allowance(msg.sender, address(this)) >= _amountToStake);
require(SNT.transferFrom(msg.sender, address(this), _amountToStake));
d.SNTBalance += _amountToStake;
emit IncreasedDAppStake(_id, _amountToStake);
}
// -- TEST
function upvote(bytes32 _id, uint256 _amount) public {
uint dappIdx = id2index[_id];
Dapp storage d = dapps[dappIdx];
require(d.id == _id);
require(_amount != 0);
uint256 dappvotes = numVotesToMint(d, _amount);
mint(d, dappvotes, true);
require(SNT.allowance(msg.sender, d.developer) >= _amount);
require(SNT.transferFrom(msg.sender, d.developer, _amount));
}
// -- TEST
function downVote(bytes32 _id, uint256 _amount) public {
uint dappIdx = id2index[_id];
Dapp storage d = dapps[dappIdx];
require(d.id == _id);
require(_amount != 0);
uint dappvotes = numVotesToMint(d, _amount);
mint(d, dappvotes, false);
uint negative_votes_before = d.effectiveBalance;
uint negative_votes_now = d.effectiveBalance + dappvotes;
uint negative_percent = ((negative_votes_now - negative_votes_before) * 100 / negative_votes_now );
d.effectiveBalance -= d.effectiveBalance * negative_percent / 100;
assert(d.effectiveBalance < negative_votes_before);
// TODO: what happens if effectiveValance reaches 0;
require(SNT.allowance(msg.sender, d.developer) >= _amount);
require(SNT.transferFrom(msg.sender, d.developer, _amount));
}
// -- TEST
function withdrawStake(bytes32 _id, uint256 _amount) public {
uint dappIdx = id2index[_id];
Dapp storage d = dapps[dappIdx];
require(d.id == _id);
require(_amount != 0);
require(d.SNTBalance >= _amount);
require(d.developer == msg.sender);
d.SNTBalance -= _amount; // TODO: what happens if balance is 0? Dapp is deleted?
require(SNT.transferFrom(address(this), msg.sender, _amount));
}
// -- TEST
function mint(Dapp storage d, uint256 _amount, bool _positive) internal {
d.votes.push(Vote(_amount, _positive));
}
}