-
Notifications
You must be signed in to change notification settings - Fork 5
/
UbexExchange.sol
461 lines (401 loc) · 19.5 KB
/
UbexExchange.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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
pragma solidity ^0.4.23;
// common zeppelin includes
import 'zeppelin-solidity/contracts/math/SafeMath.sol';
// ubex-related includes
import './SystemOwner.sol';
import './UbexStorage.sol';
import './AdamCoefficients.sol';
/**
* @title UbexExchange
* @dev UBEX exchange main system contract
*/
contract UbexExchange {
using SafeMath for uint256;
// stores a list of system addresses who have access to crucial functionality
SystemOwner public systemOwner;
// separate contract for system data storage
UbexStorage public store;
// neural network coefficients related to particular entity
AdamCoefficients public coeff;
event PublisherCreated(bytes16 indexed id, address indexed owner);
event AdvertiserCreated(bytes16 indexed id, address indexed owner);
event AdSpaceCreated(bytes16 indexed id, bytes16 indexed owner);
event OfferCreated(bytes16 indexed id, bytes16 indexed owner);
event HitCreated(bytes16 indexed id, bytes16 indexed offer, uint256 amount);
event HitTransacted(bytes16 indexed id, uint256 amount);
// check that sender actually has access to crucial functionality
modifier onlyOwner() {
require(systemOwner.isOwner(msg.sender));
_;
}
/**
* @param storageAddress ethereum address of the storage smart-contract
* @param coeffAddress ethereum address of the neural network coefficients smart-contract
* @param systemOwnerAddress ethereum address of the access control smart-contract
*/
function UbexExchange(
address storageAddress,
address coeffAddress,
address systemOwnerAddress
) public {
store = UbexStorage(storageAddress);
coeff = AdamCoefficients(coeffAddress);
systemOwner = SystemOwner(systemOwnerAddress);
}
/**
* Set new ethereum address of the access control smart-contract
*
* @param systemOwnerAddress ethereum address of the access control smart-contract
*/
function setSystemOwner(address systemOwnerAddress) public onlyOwner {
systemOwner = SystemOwner(systemOwnerAddress);
}
/**
* Set new ethereum address of the storage smart-contract
*
* @param storageAddress ethereum address of the storage smart-contract
*/
function setStorageAddress(address storageAddress) public onlyOwner {
store = UbexStorage(storageAddress);
}
/**
* Set new ethereum address of the neural network coefficients smart-contract
*
* @param coeffAddress ethereum address of the neural network coefficients smart-contract
*/
function setCoeffAddress(address coeffAddress) public onlyOwner {
coeff = AdamCoefficients(coeffAddress);
}
/**
* Create new publisher account and store its data to the system storage smart-contract
*
* @param id UUID of the publisher, should be unique withing a system
* @param owner ethereum address of the publisher (actually receiver of the UBEX tokens)
* @param name name of the publisher for visual identification by the system participants
* @param details details of the publisher, ideally an URL with the full data available
* @param rank initial system rank of the publisher
* @param state initial status of the publisher (should be New in most cases)
*/
function createPublisher(bytes16 id, address owner, string name, string details, UbexStorage.Rank rank, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state == UbexStorage.State.Unknown);
store.setUser(id, owner, UbexStorage.Role.Publisher, name, details, rank, state);
emit PublisherCreated(id, owner);
}
/**
* Update existing publisher data and store it to the system storage smart-contract
* if any param comes with a default data value it will not be updated
*
* @param id UUID of the publisher
* @param owner ethereum address of the publisher (actually receiver of the UBEX tokens)
* @param name name of the publisher for visual identification by the system participants
* @param details details of the publisher, ideally an URL with the full data available
* @param rank system rank of the publisher
* @param state status of the publisher (should be New in most cases)
*/
function updatePublisher(bytes16 id, address owner, string name, string details, UbexStorage.Rank rank, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state != UbexStorage.State.Unknown);
store.setUser(id, owner, UbexStorage.Role.Publisher, name, details, rank, state);
}
/**
* Set the existing publisher's coefficients used to tune neural network models
*
* @param id UUID of the publisher
* @param coeffs a list of coefficients of int64 type (denormalise to int64 max value)
*/
function setPublisherCoeffs(bytes16 id, int64[] coeffs) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state != UbexStorage.State.Unknown);
coeff.setCoefficients(id, coeffs);
}
/**
* Get the existing publisher's coefficient used to tune neural network models
*
* @param id UUID of the publisher
* @param index coefficient index
* @return int64 value (use tanh function for normalization)
*/
function getPublisherCoeff(bytes16 id, uint16 index) public constant returns (int64) {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state != UbexStorage.State.Unknown);
return coeff.coefficients(id, index);
}
/**
* Create new advertiser account and store its data to the system storage smart-contract
*
* @param id UUID of the advertiser, should be unique withing a system
* @param owner ethereum address of the advertiser (actually receiver of the UBEX tokens)
* @param name name of the advertiser for visual identification by the system participants
* @param details details of the advertiser, ideally an URL with the full data available
* @param rank initial system rank of the advertiser
* @param state initial status of the advertiser (should be New in most cases)
*/
function createAdvertiser(bytes16 id, address owner, string name, string details, UbexStorage.Rank rank, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state == UbexStorage.State.Unknown);
store.setUser(id, owner, UbexStorage.Role.Advertiser, name, details, rank, state);
emit AdvertiserCreated(id, owner);
}
/**
* Update existing advertiser data and store it to the system storage smart-contract
* if any param comes with a default data value it will not be updated
*
* @param id UUID of the advertiser
* @param owner ethereum address of the advertiser (actually receiver of the UBEX tokens)
* @param name name of the advertiser for visual identification by the system participants
* @param details details of the advertiser, ideally an URL with the full data available
* @param rank system rank of the advertiser
* @param state status of the advertiser (should be New in most cases)
*/
function updateAdvertiser(bytes16 id, address owner, string name, string details, UbexStorage.Rank rank, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state != UbexStorage.State.Unknown);
store.setUser(id, owner, UbexStorage.Role.Advertiser, name, details, rank, state);
}
/**
* Set the existing advertiser's coefficients used to tune neural network models
*
* @param id UUID of the advertiser
* @param coeffs a list of coefficients of int64 type (denormalise to int64 max value)
*/
function setAdvertiserCoeffs(bytes16 id, int64[] coeffs) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state != UbexStorage.State.Unknown);
coeff.setCoefficients(id, coeffs);
}
/**
* Get the existing advertiser's coefficient used to tune neural network models
*
* @param id UUID of the advertiser
* @param index coefficient index
* @return int64 value (use tanh function for normalization)
*/
function getAdvertiserCoeff(bytes16 id, uint16 index) public constant returns (int64) {
UbexStorage.State _state;
(, _state) = store.users(id);
require(_state != UbexStorage.State.Unknown);
return coeff.coefficients(id, index);
}
/**
* Create new publishing space and store its data to the system storage smart-contract
*
* @param id UUID of the publishing space, should be unique withing a system
* @param owner UUID of the user who owns this space
* @param name visual representation of the space
* @param url URL of the website providing publishing space
* @param details full details of the space
* @param categories a list of advertising category ids the space can accept for publishing
* @param state status of the advertising space
*/
function createAdSpace(bytes16 id, bytes16 owner, string name, string url, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.adSpaces(id);
require(_state == UbexStorage.State.Unknown);
store.setAdSpace(id, owner, name, url, details, categories, state);
emit AdSpaceCreated(id, owner);
}
/**
* Update existing publishing space data and store it to the system storage smart-contract
* if any param comes with a default data value it will not be updated
*
* @param id UUID of the publishing space
* @param owner UUID of the user who owns this space
* @param name visual representation of the space
* @param url URL of the website providing publishing space
* @param details full details of the space
* @param categories a list of advertising category ids the space can accept for publishing
* @param state status of the advertising space
*/
function updateAdSpace(bytes16 id, bytes16 owner, string name, string url, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.adSpaces(id);
require(_state != UbexStorage.State.Unknown);
store.setAdSpace(id, owner, name, url, details, categories, state);
}
/**
* Set the existing publishing space coefficients used to tune neural network models
*
* @param id UUID of the publishing space
* @param coeffs a list of coefficients of int64 type (denormalise to int64 max value)
*/
function setAdSpaceCoeffs(bytes16 id, int64[] coeffs) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.adSpaces(id);
require(_state != UbexStorage.State.Unknown);
coeff.setCoefficients(id, coeffs);
}
/**
* Get the existing publishing space coefficient used to tune neural network models
*
* @param id UUID of the publishing space
* @param index coefficient index
* @return int64 value (use tanh function for normalization)
*/
function getAdSpaceCoeff(bytes16 id, uint16 index) public constant returns (int64) {
UbexStorage.State _state;
(, _state) = store.adSpaces(id);
require(_state != UbexStorage.State.Unknown);
return coeff.coefficients(id, index);
}
/**
* Create new offer and store its data to the system storage smart-contract
*
* @param id UUID of the advertiser offer
* @param owner UUID of the user who owns this offer
* @param name visual representation of the offer
* @param hitPrice the base unit price of the display of promoted ad
* @param actionPrice the base unit price of actions undertaking by promoted ad
* @param details full details of the offer
* @param categories a list of advertising category ids the offer can be associated with
* @param state status of the advertiser offer
*/
function createOffer(bytes16 id, bytes16 owner, string name, uint256 hitPrice, uint256 actionPrice, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.offers(id);
require(_state == UbexStorage.State.Unknown);
store.setOffer(id, owner, name, hitPrice, actionPrice, details, categories, state);
emit OfferCreated(id, owner);
}
/**
* Update existing offer data and store it to the system storage smart-contract
* if any param comes with a default data value it will not be updated
*
* @param id UUID of the advertiser offer
* @param owner UUID of the user who owns this offer
* @param name visual representation of the offer
* @param hitPrice the base unit price of the display of promoted ad
* @param actionPrice the base unit price of actions undertaking by promoted ad
* @param details full details of the offer
* @param categories a list of advertising category ids the offer can be associated with
* @param state status of the advertiser offer
*/
function updateOffer(bytes16 id, bytes16 owner, string name, uint256 hitPrice, uint256 actionPrice, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.offers(id);
require(_state != UbexStorage.State.Unknown);
store.setOffer(id, owner, name, hitPrice, actionPrice, details, categories, state);
}
/**
* Set the existing offer's coefficients used to tune neural network models
*
* @param id UUID of the offer
* @param coeffs a list of coefficients of int64 type (denormalise to int64 max value)
*/
function setOfferCoeffs(bytes16 id, int64[] coeffs) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.offers(id);
require(_state != UbexStorage.State.Unknown);
coeff.setCoefficients(id, coeffs);
}
/**
* Get the existing offer's coefficient used to tune neural network models
*
* @param id UUID of the offer
* @param index coefficient index
* @return int64 value (use tanh function for normalization)
*/
function getOfferCoeff(bytes16 id, uint16 index) public constant returns (int64) {
UbexStorage.State _state;
(, _state) = store.offers(id);
require(_state != UbexStorage.State.Unknown);
return coeff.coefficients(id, index);
}
/**
* Create new display hit and store its data to the system storage smart-contract
*
* @param id UUID of the hit
* @param session the UUID of the session the hit was performed by
* @param space the UUID of the advertising space the hit was displayed on
* @param offer the UUID of the offer the hit was displayed for
* @param amount the UBEX token amount advertiser pays for this hit
* @param details the full details of the hit
* @param categories a list of advertising category ids the space can accept for publishing
* @param state status of the hit
*/
function createDisplayHit(bytes16 id, bytes16 session, bytes16 space, bytes16 offer, uint256 amount, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.hits(id);
require(_state == UbexStorage.State.Unknown);
store.setHit(id, UbexStorage.HitType.Display, session, space, offer, amount, details, categories, state);
emit HitCreated(id, offer, amount);
}
/**
* Update existing display hit data and store it to the system storage smart-contract
* if any param comes with a default data value it will not be updated
*
* @param id UUID of the hit
* @param session the UUID of the session the hit was performed by
* @param space the UUID of the advertising space the hit was displayed on
* @param offer the UUID of the offer the hit was displayed for
* @param amount the UBEX token amount advertiser pays for this hit
* @param details the full details of the hit
* @param categories a list of advertising category ids the space can accept for publishing
* @param state status of the hit
*/
function updateDisplayHit(bytes16 id, bytes16 session, bytes16 space, bytes16 offer, uint256 amount, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.hits(id);
require(_state != UbexStorage.State.Unknown);
store.setHit(id, UbexStorage.HitType.Display, session, space, offer, amount, details, categories, state);
}
/**
* Create new action hit and store its data to the system storage smart-contract
*
* @param id UUID of the hit
* @param session the UUID of the session the hit was performed by
* @param space the UUID of the advertising space the hit was actioned on
* @param offer the UUID of the offer the hit was actioned for
* @param amount the UBEX token amount advertiser pays for this hit
* @param details the full details of the hit
* @param categories a list of advertising category ids the space can accept for publishing
* @param state status of the hit
*/
function createActionHit(bytes16 id, bytes16 session, bytes16 space, bytes16 offer, uint256 amount, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.hits(id);
require(_state == UbexStorage.State.Unknown);
store.setHit(id, UbexStorage.HitType.Action, session, space, offer, amount, details, categories, state);
emit HitCreated(id, offer, amount);
}
/**
* Update existing action hit data and store it to the system storage smart-contract
* if any param comes with a default data value it will not be updated
*
* @param id UUID of the hit
* @param session the UUID of the session the hit was performed by
* @param space the UUID of the advertising space the hit was actioned on
* @param offer the UUID of the offer the hit was actioned for
* @param amount the UBEX token amount advertiser pays for this hit
* @param details the full details of the hit
* @param categories a list of advertising category ids the space can accept for publishing
* @param state status of the hit
*/
function updateActionHit(bytes16 id, bytes16 session, bytes16 space, bytes16 offer, uint256 amount, string details, uint16[] categories, UbexStorage.State state) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.hits(id);
require(_state != UbexStorage.State.Unknown);
store.setHit(id, UbexStorage.HitType.Action, session, space, offer, amount, details, categories, state);
}
/**
* Transact existing hit and send UBEX tokens from advertiser to publisher
*
* @param id UUID of the hit
* @param amount the UBEX token amount advertiser pays for this hit
*/
function transactHit(bytes16 id, uint256 amount) public onlyOwner {
UbexStorage.State _state;
(, _state) = store.hits(id);
require(_state != UbexStorage.State.Unknown && _state != UbexStorage.State.Rejected && _state != UbexStorage.State.Finished);
store.setHit(id, UbexStorage.HitType.Undefined, 0, 0, 0, amount, "", new uint16[](0), UbexStorage.State.Finished);
// TODO: transact UBEX tokens after token smart-contract implementation
emit HitTransacted(id, amount);
}
}