-
Notifications
You must be signed in to change notification settings - Fork 9
/
FarmShare.sol
198 lines (162 loc) · 6.48 KB
/
FarmShare.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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import "ContractManager.sol";
contract FarmShareInterface {
function transfer(address _payee, uint _payment) {}
function getParameters() constant returns (address getTreasury, address getCommunity, uint getIniMemberTokens, uint getIniMemberReputation, string get_tokenName, string get_communityName) {}
function newParameters (int _newCommunityTax, uint _newRewardRate, uint _newIniTokens, uint _newIniR) {}
function newCommunity (address _newCommunity) {}
function newTreasury (address _newTreasury) {}
function acceptMember (address _newMember, string _newName) {}
function kickOutMember (address _oldMember) {}
function getMemberInfo(address addr) constant returns(string name, address account, bool status, uint balance, uint reputation, uint tasks) {}
function newProduct(string _name, string _description, uint256 _price, uint _quantity) public returns (uint32 prodId) {}
function getProductInfo(uint id) constant returns(string name, string seller, string description, uint price, uint quantity) {}
function purchaseProduct(uint id, uint quant) {}
event Transfer(uint _amount, address indexed _from, address indexed _to, uint _timeStampT);
event NewMember(address indexed _member, string _alias);
event OldMember(address indexed _exMember, string _exAlias);
event NewProduct(uint id, string name, string description, uint price, uint quantity);
}
contract FarmShare is FarmShareInterface {
//token parameters
uint _baseUnits;
string _tokenName;
string _symbol;
string _communityName;
//community parameters
address _treasury;
address _community;
uint _communityTax;
uint _iniMemberTokens;
uint _iniMemberRep;
uint _totalMinted;
address[] memberArray;
//market stuff
uint32 public totalProducts;
uint32[] productArray;
address[] sellerArray;
address[] buyerArray;
//constructor
function FarmShare () {
_treasury = msg.sender;
_community = msg.sender;
_totalMinted = 0;
_iniMemberTokens = 100;
_iniMemberRep = 100;
_baseUnits = 100;
_tokenName = "shares";
_symbol = "FS";
_communityName = "FarmShare";
}
struct Member {
string name;
uint reputation;
uint balance;
bool isMember;
address account;
uint tasksCompleted;
uint32[] taskIds;
}
struct Product {
string name;
string description;
uint price;
uint quantity;
Member seller;
Member buyer;
}
mapping (address => Member) public members;
mapping (uint => Product) products;
event Transfer(uint _amount, address indexed _from, address indexed _to, uint _timeStampT);
event NewMember(address indexed _member, string _alias);
event OldMember(address indexed _exMember, string _exAlias);
event NewProduct(uint id, string name, string description, uint price, uint quantity);
function transfer (address _payee, uint _payment) {
uint _available = members[msg.sender].balance;
uint _amountTokens = uint(_payment);
if (_available > _amountTokens) {
members[msg.sender].balance -= _amountTokens;
members[_payee].balance += _amountTokens;
// @notice apply community tax and send it to the Community account
members[_payee].balance -= _amountTokens * _communityTax/100;
members[_community].balance += _amountTokens * _communityTax/100;
Transfer(_payment, msg.sender, _payee, now);
}
}
function getParameters() constant returns (address getTreasury, address getCommunity, uint getIniMemberTokens, uint getIniMemberReputation, string get_tokenName, string get_communityName) {
getTreasury = _treasury;
getCommunity = _community;
getIniMemberTokens = _iniMemberTokens;
getIniMemberReputation = _iniMemberRep;
get_tokenName = _tokenName;
get_communityName = _communityName;
}
function newParameters (int _newCommunityTax, uint _newRewardRate, uint _newIniTokens, uint _newIniR) {
if (msg.sender != _treasury) return;
_iniMemberTokens = _newIniTokens;
}
function newCommunity (address _newCommunity) {
if (msg.sender != _treasury) return;
_community = _newCommunity;
}
function newTreasury (address _newTreasury) {
if (msg.sender != _community) return;
_treasury = _newTreasury;
}
//membership
function acceptMember (address _newMember, string _newName) {
if (msg.sender != _community) return;
members[_newMember].account = _newMember;
members[_newMember].isMember = true;
members[_newMember].balance = _iniMemberTokens;
members[_newMember].name = _newName;
memberArray.push(_newMember);
_totalMinted += _iniMemberTokens;
NewMember(_newMember, _newName);
}
function kickOutMember (address _oldMember) {
if (msg.sender != _community) return;
members[_oldMember].isMember = false;
string _oldName = members[_oldMember].name;
OldMember(_oldMember, _oldName);
}
function getMemberInfo(address addr) constant returns(string name, address account, bool status, uint balance, uint reputation, uint tasks) {
Member member = members[addr];
string memberName = member.name;
address memberAcct = member.account;
bool memberStatus = member.isMember;
uint memberBal = member.balance;
uint memberRep = member.reputation;
uint memberTasks = member.tasksCompleted;
return(memberName, memberAcct, memberStatus, memberBal, memberRep, memberTasks);
}
//market
function newProduct(string _name, string _description, uint256 _price, uint _quantity) public returns (uint32 prodId) {
Product newProduct = products[totalProducts];
newProduct.seller = members[msg.sender];
newProduct.name = _name;
newProduct.description = _description;
newProduct.price = _price;
newProduct.quantity = _quantity;
totalProducts++;
// productArray.push(totalProducts);
NewProduct(totalProducts, _name, _description, _price, _quantity);
return(totalProducts);
}
function getProductInfo(uint id) constant returns(string name, string seller, string description, uint price, uint quantity) {
Product prod = products[id];
name = prod.name;
seller = prod.seller.name;
description = prod.description;
price = prod.price;
quantity = prod.quantity;
return (name, seller, description, price, quantity);
}
function purchaseProduct(uint id, uint quant) {
Product product = products[id];
if (msg.sender != product.seller.account && members[msg.sender].balance >= product.price*quant && product.quantity > quant) {
members[msg.sender].balance -= product.price*quant;
members[product.seller.account].balance += product.price*quant;
product.quantity -= quant;
}
}
}