ethereum 0.4.45 → 0.4.50

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,503 @@
1
+ contract ParticipantRegistry {
2
+
3
+ enum ParticipantTypes { Admin, Vendor, Custodian, Auditor }
4
+ struct ParticipantDatabase {
5
+ mapping (address => bool) auditors;
6
+ mapping (address => bool) vendors;
7
+ mapping (address => bool) custodians;
8
+ mapping (address => bool) registrars;
9
+ }
10
+
11
+ address owner;
12
+ ParticipantDatabase participantdb;
13
+
14
+ event AddParticipant(address indexed participant, uint indexed participanttype);
15
+ event RemoveParticipant(address indexed participant, uint indexed participanttype);
16
+
17
+ modifier ifowner { if (msg.sender == owner) _ }
18
+ modifier ifregistrar { if ((participantdb.registrars[tx.origin]) || (tx.origin == owner)) _ }
19
+ modifier onlyvendor { if (isVendor(tx.origin) == true) _ }
20
+ modifier onlycustodian { if (isCustodian(tx.origin) == true) _ }
21
+ modifier onlyauditor { if (isAuditor(tx.origin) == true) _ }
22
+
23
+ function ParticipantRegistry() {
24
+ owner = msg.sender;
25
+ }
26
+
27
+ function getOwner() returns (address oa) {
28
+ oa = owner;
29
+ }
30
+
31
+ function setOwner(address nown) ifowner {
32
+ owner = nown;
33
+ }
34
+
35
+ function registerAdmin(address regraddr) ifowner {
36
+ participantdb.registrars[regraddr] = true;
37
+ AddParticipant(regraddr, uint(ParticipantTypes.Admin));
38
+ }
39
+
40
+ function unregisterAdmin(address regraddr) ifowner {
41
+ participantdb.registrars[regraddr] = false;
42
+ RemoveParticipant(regraddr, uint(ParticipantTypes.Admin));
43
+ }
44
+
45
+ function registerVendor(address vendoraddress) ifregistrar {
46
+ participantdb.vendors[vendoraddress] = true;
47
+ AddParticipant(vendoraddress, uint(ParticipantTypes.Vendor));
48
+ }
49
+
50
+ function unregisterVendor(address vendoraddress) ifregistrar {
51
+ participantdb.vendors[vendoraddress] = false;
52
+ RemoveParticipant(vendoraddress, uint(ParticipantTypes.Vendor));
53
+ }
54
+
55
+ function registerCustodian(address custodianaddress) ifregistrar {
56
+ participantdb.custodians[custodianaddress] = true;
57
+ AddParticipant(custodianaddress, uint(ParticipantTypes.Custodian));
58
+ }
59
+
60
+ function unregisterCustodian(address custodianaddress) ifregistrar {
61
+ participantdb.custodians[custodianaddress] = false;
62
+ RemoveParticipant(custodianaddress, uint(ParticipantTypes.Custodian));
63
+ }
64
+
65
+ function registerAuditor(address auditoraddress) ifregistrar {
66
+ participantdb.auditors[auditoraddress] = true;
67
+ AddParticipant(auditoraddress, uint(ParticipantTypes.Auditor));
68
+ }
69
+
70
+ function unregisterAuditor(address auditoraddress) ifregistrar {
71
+ participantdb.auditors[auditoraddress] = false;
72
+ RemoveParticipant(auditoraddress, uint(ParticipantTypes.Auditor));
73
+ }
74
+
75
+ function isVendor(address vendoraddress) returns (bool) {
76
+ return participantdb.vendors[vendoraddress];
77
+ }
78
+
79
+ function isCustodian(address custodianaddress) returns (bool) {
80
+ return participantdb.custodians[custodianaddress];
81
+ }
82
+
83
+ function isAuditor(address auditoraddress) returns (bool) {
84
+ return participantdb.auditors[auditoraddress];
85
+ }
86
+
87
+ function isRegistrar(address regraddr) returns (bool) {
88
+ return participantdb.registrars[regraddr];
89
+ }
90
+ }
91
+
92
+ contract Gold {
93
+
94
+ struct GoldData {
95
+ bool initialized;
96
+ bool minted;
97
+ uint weight;
98
+ bytes32 serial;
99
+ bytes32 sku;
100
+ bytes32 documentation;
101
+ }
102
+
103
+ struct RegistryData {
104
+ bool initialized;
105
+ bool registered;
106
+ address registry;
107
+ address vendor;
108
+ address custodian;
109
+ address minter;
110
+ }
111
+
112
+ address owner;
113
+ GoldData golddata;
114
+ RegistryData registrydata;
115
+
116
+ event SendGoldEvent(address indexed gold, address indexed recipient);
117
+
118
+ modifier ifowner { if (msg.sender == owner) _ }
119
+
120
+ function Gold() {
121
+ owner = msg.sender;
122
+ golddata.minted = false;
123
+ golddata.initialized = false;
124
+ registrydata.initialized = false;
125
+ }
126
+
127
+ function getOwner() returns (address oaddr) {
128
+ oaddr = owner;
129
+ }
130
+
131
+ function initGoldData(uint wt, bytes32 sn, bytes32 sk, bytes32 doc) ifowner {
132
+ if (golddata.initialized == true) return;
133
+ golddata = GoldData({initialized: true, minted: false, weight: wt, serial: sn, sku: sk, documentation: doc});
134
+ }
135
+
136
+ function initRegistryData(address raddr, address vaddr, address caddr) ifowner {
137
+ if (registrydata.initialized == true) return;
138
+ registrydata = RegistryData({initialized: true, registered: false, registry: raddr, vendor: vaddr, custodian: caddr, minter: address(this)});
139
+ GoldRegistry goldregistry = GoldRegistry(raddr);
140
+ }
141
+
142
+ function sendRegistration() {
143
+ if ((registrydata.initialized == true) && (golddata.initialized == true)) {
144
+ GoldRegistry gr = goldRegistry();
145
+ gr.registerGold();
146
+ registrydata.registered = true;
147
+ }
148
+ }
149
+
150
+ function registryRequestCustodian() public returns (address caddr) {
151
+ caddr = registrydata.custodian;
152
+ }
153
+
154
+ function registryRequestVendor() public returns (address vaddr) {
155
+ vaddr = registrydata.vendor;
156
+ }
157
+
158
+ function registryRequestWeight() public returns (uint wt) {
159
+ wt = golddata.weight;
160
+ }
161
+
162
+ function registryRequestSerialNumber() public returns (bytes32 sn) {
163
+ sn = golddata.serial;
164
+ }
165
+
166
+ function registryRequestSku() public returns (bytes32 sk) {
167
+ sk = golddata.sku;
168
+ }
169
+
170
+ function registryRequestDocumentation() public returns (bytes32 doc) {
171
+ doc = golddata.documentation;
172
+ }
173
+
174
+ function getGoldDataInitialized() returns (bool gdis) {
175
+ gdis = golddata.initialized;
176
+ }
177
+
178
+ function getGoldDataMinted() returns (bool gdms) {
179
+ gdms = golddata.minted;
180
+ }
181
+
182
+ function getGoldDataWeight() returns (uint gdwt) {
183
+ gdwt = golddata.weight;
184
+ }
185
+
186
+ function getGoldDataSerial() returns (bytes32 gdsn) {
187
+ gdsn = golddata.serial;
188
+ }
189
+
190
+ function getGoldDataSku() returns (bytes32 gdsk) {
191
+ gdsk = golddata.sku;
192
+ }
193
+
194
+ function getGoldDataDocumentation() returns (bytes32 gddc) {
195
+ gddc = golddata.documentation;
196
+ }
197
+
198
+ function getRegistryDataInitialized() returns (bool rdis) {
199
+ rdis = registrydata.initialized;
200
+ }
201
+
202
+ function getRegistryDataRegistered() returns (bool rdrs) {
203
+ rdrs = registrydata.registered;
204
+ }
205
+
206
+ function getRegistryDataRegistry() returns (address rdrg) {
207
+ rdrg = registrydata.registry;
208
+ }
209
+
210
+ function getRegistryDataVendor() returns (address rdva) {
211
+ rdva = registrydata.vendor;
212
+ }
213
+
214
+ function getRegistryDataCustodian() returns (address rdca) {
215
+ rdca = registrydata.custodian;
216
+ }
217
+
218
+ function getRegistryDataMinter() returns (address rdma) {
219
+ rdma = registrydata.minter;
220
+ }
221
+
222
+ function sendToMinter(uint minttype) ifowner {
223
+ owner = registrydata.minter;
224
+ golddata.minted = true;
225
+ // Notifiy minter contract
226
+ }
227
+
228
+ function goldRegistry() returns (GoldRegistry gr) {
229
+ gr = GoldRegistry(registrydata.registry);
230
+ }
231
+
232
+
233
+ }
234
+
235
+
236
+ contract GoldRegistry {
237
+
238
+ address owner;
239
+ address participantregistry;
240
+
241
+ enum GoldStatusCodes { PendingVerification, Active, RedemptionQueue, Redeemed, Minted }
242
+
243
+ struct Audit {
244
+ uint id;
245
+ uint time;
246
+ bool pass;
247
+ address auditor;
248
+ bytes32 extradata;
249
+ bytes32 documentation;
250
+ }
251
+
252
+ struct GoldStatus {
253
+ uint code;
254
+ bool vendorverify;
255
+ bool custodianverify;
256
+ bool minted;
257
+ uint auditcount;
258
+ bool registered;
259
+ uint lastauditid;
260
+ Audit lastaudit;
261
+ mapping (uint => Audit) audits;
262
+ }
263
+
264
+ struct GoldInfo {
265
+ address vendor;
266
+ address custodian;
267
+ uint weight;
268
+ bytes32 serial;
269
+ bytes32 sku;
270
+ bytes32 documentation;
271
+ }
272
+
273
+ struct GoldData {
274
+ bool initialized;
275
+ bool minted;
276
+ uint weight;
277
+ bytes32 serial;
278
+ bytes32 sku;
279
+ bytes32 documentation;
280
+ }
281
+
282
+ struct RegistryData {
283
+ bool initialized;
284
+ bool registered;
285
+ address registry;
286
+ address vendor;
287
+ address custodian;
288
+ address minter;
289
+ }
290
+
291
+ mapping (address => GoldStatus) goldstatusdb;
292
+ mapping (address => GoldInfo) goldinfodb;
293
+
294
+ modifier ifowner { if (msg.sender == owner) _ }
295
+
296
+ event GoldPurchase(address indexed gold, address indexed buyer, uint weight);
297
+ event GoldRedemption(address indexed gold);
298
+ event VendorVerification(address indexed gold, address indexed vendor, uint indexed time);
299
+ event CustodianVerification(address indexed gold, address indexed custodian, uint indexed time);
300
+ event CustodianTransfer(address indexed gold, address indexed oldcustodian, address indexed newcustodian);
301
+ event AuditEvent(address indexed gold, address indexed auditor, uint indexed lastauditid);
302
+
303
+ function GoldRegistry() {
304
+ owner = msg.sender;
305
+ }
306
+
307
+ function setConfiguration(address pr) ifowner {
308
+ participantregistry = pr;
309
+ }
310
+
311
+ function getOwner() returns (address o) {
312
+ o = owner;
313
+ }
314
+
315
+ function setOwner(address nown) ifowner {
316
+ owner = nown;
317
+ }
318
+
319
+ function getParticipantRegistry() returns (address pr) {
320
+ pr = participantregistry;
321
+ }
322
+
323
+ function checkCustodian() returns (bool ccheck) {
324
+ ParticipantRegistry prg = ParticipantRegistry(participantregistry);
325
+ ccheck = prg.isCustodian(tx.origin);
326
+ }
327
+
328
+ function checkVendor() returns (bool vcheck) {
329
+ ParticipantRegistry prg = ParticipantRegistry(participantregistry);
330
+ vcheck = prg.isVendor(tx.origin);
331
+ }
332
+
333
+ function checkAuditor() returns (bool acheck) {
334
+ ParticipantRegistry prg = ParticipantRegistry(participantregistry);
335
+ acheck = prg.isAuditor(tx.origin);
336
+ }
337
+
338
+ function checkRegistrar() returns (bool rcheck) {
339
+ ParticipantRegistry prg = ParticipantRegistry(participantregistry);
340
+ rcheck = prg.isRegistrar(tx.origin);
341
+ }
342
+
343
+ modifier ifregistrar { if (checkRegistrar() == true) _ }
344
+ modifier ifvendor { if (checkVendor() == true) _ }
345
+ modifier ifcustodian { if (checkCustodian() == true) _ }
346
+ modifier ifauditor { if (checkAuditor() == true) _ }
347
+
348
+ function registerGold() ifregistrar {
349
+ GoldInfo gidb = goldinfodb[msg.sender];
350
+ GoldStatus gsdb = goldstatusdb[msg.sender];
351
+ Gold gld = Gold(msg.sender);
352
+ if (gsdb.registered == true) return;
353
+ gidb.vendor = gld.registryRequestVendor();
354
+ gidb.custodian = gld.registryRequestCustodian();
355
+ gidb.weight = gld.registryRequestWeight();
356
+ gidb.serial = gld.registryRequestSerialNumber();
357
+ gidb.sku = gld.registryRequestSku();
358
+ gidb.documentation = gld.registryRequestDocumentation();
359
+ gsdb.vendorverify = false;
360
+ gsdb.custodianverify = false;
361
+ gsdb.minted = false;
362
+ gsdb.registered = true;
363
+ }
364
+
365
+ function getGoldStatusCode(address gaddr) returns (uint gsc) {
366
+ GoldStatus gsdb = goldstatusdb[gaddr];
367
+ gsc = gsdb.code;
368
+ }
369
+
370
+ function getGoldStatusVendorverify(address gaddr) returns (bool gsvv) {
371
+ GoldStatus gsdb = goldstatusdb[gaddr];
372
+ gsvv = gsdb.vendorverify;
373
+ }
374
+
375
+ function getGoldStatusCustodianverify(address gaddr) returns (bool gscv) {
376
+ GoldStatus gsdb = goldstatusdb[gaddr];
377
+ gscv = gsdb.custodianverify;
378
+ }
379
+
380
+ function getGoldStatusMinted(address gaddr) returns (bool gsms) {
381
+ GoldStatus gsdb = goldstatusdb[gaddr];
382
+ gsms = gsdb.minted;
383
+ }
384
+
385
+ function getGoldStatusAuditcount(address gaddr) returns (uint gsac) {
386
+ GoldStatus gsdb = goldstatusdb[gaddr];
387
+ gsac = gsdb.auditcount;
388
+ }
389
+
390
+ function getGoldStatusRegistered(address gaddr) returns (bool gsrs) {
391
+ GoldStatus gsdb = goldstatusdb[gaddr];
392
+ gsrs = gsdb.registered;
393
+ }
394
+
395
+ function getGoldStatusLastauditid(address gaddr) returns (uint gsla) {
396
+ GoldStatus gsdb = goldstatusdb[gaddr];
397
+ gsla = gsdb.lastauditid;
398
+ }
399
+
400
+ function getGoldInfoVendor(address gaddr) returns (address giva) {
401
+ GoldInfo gidb = goldinfodb[gaddr];
402
+ giva = gidb.vendor;
403
+ }
404
+
405
+ function getGoldInfoCustodian(address gaddr) returns (address gica) {
406
+ GoldInfo gidb = goldinfodb[gaddr];
407
+ gica = gidb.custodian;
408
+ }
409
+
410
+ function getGoldInfoWeight(address gaddr) returns (uint giwt) {
411
+ GoldInfo gidb = goldinfodb[gaddr];
412
+ giwt = gidb.weight;
413
+ }
414
+
415
+ function getGoldInfoSerial(address gaddr) returns (bytes32 gisn) {
416
+ GoldInfo gidb = goldinfodb[gaddr];
417
+ gisn = gidb.serial;
418
+ }
419
+
420
+ function getGoldInfoSku(address gaddr) returns (bytes32 gisk) {
421
+ GoldInfo gidb = goldinfodb[gaddr];
422
+ gisk = gidb.sku;
423
+ }
424
+
425
+ function getGoldInfoDocumentation(address gaddr) returns (bytes32 gidc) {
426
+ GoldInfo gidb = goldinfodb[gaddr];
427
+ gidc = gidb.documentation;
428
+ }
429
+
430
+ function getLastAuditId(address gaddr) returns (uint ai) {
431
+ GoldStatus gsdb = goldstatusdb[gaddr];
432
+ Audit laud = gsdb.lastaudit;
433
+ ai = laud.id;
434
+ }
435
+
436
+ function getLastAuditTime(address gaddr) returns (uint at) {
437
+ GoldStatus gsdb = goldstatusdb[gaddr];
438
+ Audit laud = gsdb.lastaudit;
439
+ at = laud.time;
440
+ }
441
+
442
+ function getLastAuditPass(address gaddr) returns (bool ap) {
443
+ GoldStatus gsdb = goldstatusdb[gaddr];
444
+ Audit laud = gsdb.lastaudit;
445
+ ap = laud.pass;
446
+ }
447
+
448
+ function getLastAuditAuditor(address gaddr) returns (address aa) {
449
+ GoldStatus gsdb = goldstatusdb[gaddr];
450
+ Audit laud = gsdb.lastaudit;
451
+ aa = laud.auditor;
452
+ }
453
+
454
+ function getLastAuditExtradata(address gaddr) returns (bytes32 ae) {
455
+ GoldStatus gsdb = goldstatusdb[gaddr];
456
+ Audit laud = gsdb.lastaudit;
457
+ ae = laud.extradata;
458
+ }
459
+
460
+ function getLastAuditDocumentation(address gaddr) returns (bytes32 ad) {
461
+ GoldStatus gsdb = goldstatusdb[gaddr];
462
+ Audit laud = gsdb.lastaudit;
463
+ ad = laud.documentation;
464
+ }
465
+
466
+ function custodianVerify(address gaddr) ifcustodian {
467
+ GoldStatus gsdb = goldstatusdb[gaddr];
468
+ gsdb.custodianverify = true;
469
+ CustodianVerification(gaddr, tx.origin, block.timestamp);
470
+ }
471
+
472
+ function vendorVerify(address gaddr) ifvendor {
473
+ GoldStatus gsdb = goldstatusdb[gaddr];
474
+ gsdb.vendorverify = true;
475
+ VendorVerification(gaddr, tx.origin, block.timestamp);
476
+ }
477
+
478
+ function custodianTransfer(address gaddr, address ncaddr) ifcustodian {
479
+ GoldInfo gidb = goldinfodb[gaddr];
480
+ GoldStatus gsdb = goldstatusdb[gaddr];
481
+ gidb.custodian = ncaddr;
482
+ gsdb.custodianverify = false;
483
+ CustodianTransfer(gaddr, tx.origin, ncaddr);
484
+ }
485
+
486
+ function auditReport(address gaddr, bool ares, bytes32 ed, bytes32 doc) ifauditor {
487
+ GoldInfo gidb = goldinfodb[gaddr];
488
+ GoldStatus gsdb = goldstatusdb[gaddr];
489
+ gsdb.auditcount++;
490
+ uint auditcount = gsdb.auditcount;
491
+ Audit adt = gsdb.audits[auditcount];
492
+ gsdb.lastaudit = Audit({id: auditcount, time: block.timestamp, pass: ares, auditor: tx.origin, extradata: ed, documentation: doc});
493
+ adt = gsdb.lastaudit;
494
+ AuditEvent(gaddr, tx.origin, auditcount);
495
+ }
496
+
497
+ }
498
+
499
+
500
+
501
+ //#include [ParticipantRegistry]
502
+ //#include [Gold]
503
+ //#include [GoldRegistry]