ethereum 0.4.75 → 0.4.80

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6bb10ccfec4471254525b2538450d6492044de6
4
- data.tar.gz: b6fef10e3dc5e5d9c17cf26159564fe958c573fd
3
+ metadata.gz: befea2e8d4a0984de8d00db21e1d3e8069ae444b
4
+ data.tar.gz: 224ac503b98fe2c838538648b7034d7cd78b69eb
5
5
  SHA512:
6
- metadata.gz: ae2359b73d4d98165c24a8fedf46ada020fea6d052163359963f3b778ae6508401ee6314a308ebdbee6b33274a7a609ee6fd8fe2e7e5970f9153b2e4be56593a
7
- data.tar.gz: 1a80d14ae38d9d835c9d77aa5669bc25d8aa4767570c1fbf3e23a0cc9f1f680e53190fc7c844cd5c3487aa36eb788d6a1d5b5b30e812ac45afd4fd1e55ada99e
6
+ metadata.gz: 213fec4859c390068a7d6e0f9dd0cb262f6e05f23bb61cc02d0236e1475f3fabc01c28c6976731ee83440ed4e86761d9378ecb8a4ff4080279e7f9233f66eda5
7
+ data.tar.gz: 689c5d782fca556d657d24a49d4e06edad39c2cca80e12889517cf9543ccd0bd05bb440482fbeb13aefff9044b22716f698fbc61cc89d5479cc0114106b01d18
@@ -1,7 +1,7 @@
1
1
  contract AuditorRegistry {
2
2
 
3
3
  address config;
4
- Directory.Data auditors;
4
+ Directory.AddressBoolMap auditors;
5
5
 
6
6
  function CustodianRegistry(address _conf) {
7
7
  config = _conf;
@@ -1,4 +1,6 @@
1
1
  import "contracts/Interface.sol";
2
+ import "contracts/Gold.sol";
3
+ import "contracts/GoldRegistry.sol";
2
4
 
3
5
  contract CustodianInterface is Interface {
4
6
 
@@ -6,11 +8,14 @@ contract CustodianInterface is Interface {
6
8
  owner = msg.sender;
7
9
  config = _config;
8
10
  }
9
-
10
- function publishReceipt(address _gold, bytes32 _file) ifemployee {
11
-
11
+
12
+ function receiveFromVendor(address _gold, bytes32 _doc) ifemployee {
13
+ GoldRegistry(goldRegistry()).receiveFromVendor(_gold, _doc);
12
14
  }
13
15
 
16
+ function transferCustodian(address _gold, address _cstdn) ifemployee {
17
+ }
18
+
14
19
  function isRedeemable(address _gold) public returns (bool) {
15
20
  return true;
16
21
  }
@@ -1,11 +1,37 @@
1
- contract CustodianRegistry {
1
+ import "contracts/Directory.sol";
2
+ import "contracts/GenericRegistry.sol";
2
3
 
3
- address config;
4
- Directory.Data custodians;
4
+ contract CustodianRegistry is GenericRegistry {
5
+
6
+ Directory.AddressBoolMap custodians;
7
+
8
+ struct Custodian {
9
+ bytes32 name;
10
+ }
11
+
12
+ mapping (address => Custodian) custodianNames;
5
13
 
6
14
  function CustodianRegistry(address _conf) {
7
15
  config = _conf;
8
16
  }
17
+
18
+ function register(address _acct) ifadmin {
19
+ if (!Directory.insert(custodians, _acct))
20
+ throw;
21
+ }
22
+
23
+ function unregister(address _acct) ifadmin {
24
+ if (!Directory.remove(custodians, _acct))
25
+ throw;
26
+ }
27
+
28
+ function setCustodianName(address _cstdn, bytes32 _name) ifadmin {
29
+ custodianNames[_cstdn].name = _name;
30
+ }
31
+
32
+ function getCustodianName(address _cstdn) public returns (bytes32) {
33
+ return custodianNames[_cstdn].name;
34
+ }
9
35
 
10
36
  function isCustodian(address _cust) public returns (bool) {
11
37
  return Directory.contains(custodians, _cust);
@@ -1,12 +1,14 @@
1
1
  contract DigixConfiguration {
2
2
 
3
3
  address owner;
4
- Directory.Data admins;
4
+ Directory.AddressBoolMap admins;
5
5
 
6
- mapping (bytes32 => address) configurations;
6
+ mapping (bytes32 => address) configaddr;
7
+ mapping (bytes32 => uint256) configint;
7
8
 
8
9
  event SetOwner(address indexed owner, address indexed by);
9
- event AddConfigEntry(bytes32 indexed key, address indexed val, address indexed by);
10
+ event AddConfigEntryA(bytes32 indexed key, address indexed val, address indexed by);
11
+ event AddConfigEntryI(bytes32 indexed key, uint256 indexed val, address indexed by);
10
12
  event RegisterAdmin(address indexed account, address indexed by);
11
13
  event UnregisterAdmin(address indexed account, address indexed by);
12
14
 
@@ -27,14 +29,24 @@ contract DigixConfiguration {
27
29
  SetOwner(_newowner, msg.sender);
28
30
  }
29
31
 
30
- function addConfigEntry(bytes32 _key, address _val) ifowner {
31
- address _oldaddress = configurations[_key];
32
- configurations[_key] = _val;
33
- AddConfigEntry(_key, _val, msg.sender);
32
+ function addConfigEntryAddr(bytes32 _key, address _val) ifowner {
33
+ address _oldaddress = configaddr[_key];
34
+ configaddr[_key] = _val;
35
+ AddConfigEntryA(_key, _val, msg.sender);
34
36
  }
35
37
 
36
- function getConfigEntry(bytes32 _key) public constant returns (address) {
37
- return configurations[_key];
38
+ function getConfigEntryAddr(bytes32 _key) public constant returns (address) {
39
+ return configaddr[_key];
40
+ }
41
+
42
+ function addConfigEntryInt(bytes32 _key, uint256 _val) ifowner {
43
+ uint256 _oldaddress = configint[_key];
44
+ configint[_key] = _val;
45
+ AddConfigEntryI(_key, _val, msg.sender);
46
+ }
47
+
48
+ function getConfigEntryInt(bytes32 _key) public constant returns (uint256) {
49
+ return configint[_key];
38
50
  }
39
51
 
40
52
  function registerAdmin(address _acct) ifowner {
@@ -1,23 +1,65 @@
1
1
  library Directory {
2
2
 
3
- struct Data { mapping(address => bool) entries; }
3
+ struct AddressBytesMap { mapping(address => bytes32) bytesentries; }
4
4
 
5
- function insert(Data storage self, address acct) returns (bool) {
6
- if (self.entries[acct])
7
- return false;
8
- self.entries[acct] = true;
5
+ struct AddressAddressMap { mapping(address => address) addrentries; }
6
+
7
+ struct AddressBoolMap { mapping(address => bool) boolentries; }
8
+
9
+ function insert(AddressBytesMap storage self, address key, bytes32 val) returns (bool) {
10
+ if (self.bytesentries[key] == val) return false;
11
+ self.bytesentries[key] = val;
12
+ return true;
13
+ }
14
+
15
+ function insert(AddressBoolMap storage self, address key) returns (bool) {
16
+ if (self.boolentries[key]) return false;
17
+ self.boolentries[key] = true;
18
+ return true;
19
+ }
20
+
21
+ function insert(AddressAddressMap storage self, address key, address val) returns (bool) {
22
+ if (self.addrentries[key] == val) return false;
23
+ self.addrentries[key] = val;
24
+ return true;
25
+ }
26
+
27
+ function remove(AddressBytesMap storage self, address key) returns (bool) {
28
+ if (self.bytesentries[key] == 0x0) return false;
29
+ self.bytesentries[key] = 0x0;
9
30
  return true;
10
31
  }
11
32
 
12
- function remove(Data storage self, address acct) returns (bool) {
13
- if (!self.entries[acct])
14
- return false;
15
- self.entries[acct] = false;
33
+ function remove(AddressBoolMap storage self, address key) returns (bool) {
34
+ if (!self.boolentries[key]) return false;
35
+ self.boolentries[key] = false;
16
36
  return true;
17
37
  }
18
38
 
19
- function contains(Data storage self, address acct) returns (bool) {
20
- return self.entries[acct];
39
+ function remove(AddressAddressMap storage self, address key) returns (bool) {
40
+ if (self.addrentries[key] == 0x0000000000000000000000000000000000000000) return false;
41
+ self.addrentries[key] = 0x0000000000000000000000000000000000000000;
42
+ return true;
43
+ }
44
+
45
+ function contains(AddressBytesMap storage self, address key) returns (bool) {
46
+ if (self.bytesentries[key] != 0x0) return true;
47
+ }
48
+
49
+ function contains(AddressBoolMap storage self, address key) returns (bool) {
50
+ return self.boolentries[key];
51
+ }
52
+
53
+ function contains(AddressAddressMap storage self, address key) returns (bool) {
54
+ if (self.addrentries[key] != 0x0000000000000000000000000000000000000000) return true;
55
+ }
56
+
57
+ function containsAndMatches(AddressBytesMap storage self, address key, bytes32 val) returns (bool) {
58
+ return (self.bytesentries[key] == val);
59
+ }
60
+
61
+ function containsAndMatches(AddressAddressMap storage self, address key, address val) returns (bool) {
62
+ return (self.addrentries[key] == val);
21
63
  }
22
64
 
23
65
  }
@@ -0,0 +1,54 @@
1
+ library DoublyLinked {
2
+
3
+ struct List {
4
+ uint80 first;
5
+ uint80 last;
6
+ uint80 count;
7
+ Item[] items;
8
+ }
9
+
10
+ uint80 constant None = uint80(-1);
11
+
12
+ struct Item {
13
+ uint80 prev;
14
+ uint80 next;
15
+ bytes32 data;
16
+ }
17
+
18
+ function append(List storage self, bytes32 _data) {
19
+ var index = self.items.push(Item({prev: self.last, next: None, data: _data}));
20
+ if (self.last == None)
21
+ {
22
+ if (self.first != None || self.count != 0) throw;
23
+ self.first = self.last = uint80(index - 1);
24
+ self.count = 1;
25
+ }
26
+ else
27
+ {
28
+ self.items[self.last].next = uint80(index - 1);
29
+ self.last = uint80(index - 1);
30
+ self.count ++;
31
+ }
32
+ }
33
+
34
+ function remove(List storage self, uint80 _index) {
35
+ Item item = self.items[_index];
36
+ if (item.prev == None)
37
+ self.first = item.next;
38
+ if (item.next == None)
39
+ self.last = item.prev;
40
+ if (item.prev != None)
41
+ self.items[item.prev].next = item.next;
42
+ if (item.next != None)
43
+ self.items[item.next].prev = item.prev;
44
+ delete self.items[_index];
45
+ self.count++;
46
+ }
47
+
48
+ // Iterator interface
49
+ function iterate_start(List storage self) returns (uint80) { return self.first; }
50
+ function iterate_valid(List storage self, uint80 _index) returns (bool) { return _index < self.items.length; }
51
+ function iterate_prev(List storage self, uint80 _index) returns (uint80) { return self.items[_index].prev; }
52
+ function iterate_next(List storage self, uint80 _index) returns (uint80) { return self.items[_index].next; }
53
+ function iterate_get(List storage self, uint80 _index) returns (bytes32) { return self.items[_index].data; }
54
+ }
@@ -0,0 +1,56 @@
1
+ import "contracts/Directory.sol";
2
+ import "contracts/DoublyLinked.sol";
3
+ import "contracts/DigixConfiguration.sol";
4
+ import "contracts/VendorRegistry.sol";
5
+ import "contracts/CustodianRegistry.sol";
6
+ import "contracts/AuditorRegistry.sol";
7
+
8
+ contract GenericInterface {
9
+
10
+ address config;
11
+ address owner;
12
+
13
+ function getConfigAddress() public returns (address) {
14
+ return config;
15
+ }
16
+
17
+ function goldRegistry() public returns (address) {
18
+ return DigixConfiguration(config).getConfigEntryAddr("registry/gold");
19
+ }
20
+
21
+ function vendorRegistry() public returns (address) {
22
+ return DigixConfiguration(config).getConfigEntryAddr("registry/vendor");
23
+ }
24
+
25
+ function custodianRegistry() public returns (address) {
26
+ return DigixConfiguration(config).getConfigEntryAddr("registry/custodian");
27
+ }
28
+
29
+ function auditorRegistry() public returns (address) {
30
+ return DigixConfiguration(config).getConfigEntryAddr("registry/auditor");
31
+ }
32
+
33
+ function isGoldRegistry(address _greg) public returns (bool) {
34
+ return (goldRegistry() == _greg);
35
+ }
36
+
37
+ function isCustodian(address _cust) public returns (bool) {
38
+ return CustodianRegistry(custodianRegistry()).isCustodian(_cust);
39
+ }
40
+
41
+ function isAuditor(address _adtr) public returns (bool) {
42
+ return AuditorRegistry(auditorRegistry()).isAuditor(_adtr);
43
+ }
44
+
45
+ function isVendor(address _vndr) public returns (bool) {
46
+ return VendorRegistry(vendorRegistry()).isVendor(_vndr);
47
+ }
48
+
49
+
50
+ modifier ifvendor { if(isVendor(msg.sender)) _ }
51
+ modifier ifowner { if(msg.sender == owner) _ }
52
+ modifier ifcustodian { if(isCustodian(msg.sender)) _ }
53
+ modifier ifauditor { if(isAuditor(msg.sender)) _ }
54
+ modifier ifgoldregistry { if(isGoldRegistry(msg.sender)) _ }
55
+
56
+ }
@@ -0,0 +1,15 @@
1
+ contract GenericRegistry {
2
+
3
+ address config;
4
+
5
+ function isAdmin(address _acct) public returns (bool) {
6
+ return DigixConfiguration(config).isAdmin(_acct);
7
+ }
8
+
9
+ function getConfigAddress() public returns (address) {
10
+ return config;
11
+ }
12
+
13
+ modifier ifadmin { if(isAdmin(msg.sender)) _ }
14
+
15
+ }
@@ -1,67 +1,105 @@
1
- contract Gold {
1
+ import "contracts/GenericInterface.sol";
2
+ import "contracts/GoldRegistry.sol";
2
3
 
3
- address config;
4
- address owner;
5
- uint lastfeecalc;
6
- bool locked;
4
+ contract Gold is GenericInterface {
7
5
 
8
- struct Detail {
9
- address vendor;
10
- address custodian;
11
- uint status;
12
- uint auditCount;
6
+ uint256 weight;
7
+ uint256 serial;
8
+ uint256 lastStoragePayment;
9
+ uint256 base;
10
+ uint256 auditCount;
11
+ bool registered;
12
+ bool active;
13
+
14
+ modifier ifowner { if(owner == msg.sender) _ }
15
+ modifier ifcansend { if(canSend()) _ }
16
+ modifier ifunregistered { if(registered == false) _ }
17
+
18
+ event GoldAuditReport(bool indexed passed, address indexed document, address indexed auditor);
19
+
20
+ function Gold(address _conf, uint256 _wt) {
21
+ base = 1000000000;
22
+ owner = msg.sender;
23
+ config = _conf;
24
+ auditCount = 0;
25
+ weight = base * _wt;
26
+ registered = false;
27
+ active = false;
28
+ lastStoragePayment = block.timestamp;
13
29
  }
14
30
 
15
- struct Info {
16
- uint weight;
17
- bytes32 serialNumber;
18
- bytes32 vendorReceipt;
19
- bytes32 custodianReceipt;
31
+ function register(address _owner) ifgoldregistry {
32
+ owner = _owner;
20
33
  }
21
34
 
22
- struct StorageFee {
23
- uint due;
24
- uint lastPayment;
35
+ function activate() ifgoldregistry {
36
+ active = true;
25
37
  }
26
38
 
27
- Detail detail;
28
- Info info;
29
- StorageFee storagefee;
39
+ function getCalculatedFees() public returns (uint256) {
40
+ uint256 _totalfee = 0;
41
+ uint256 _dayseconds = 60; // 86400 seconds buy for testing we set to one minute
42
+ uint256 _lp = lastStoragePayment;
43
+ uint256 _wt = weight;
44
+ uint256 _dailyRatePpb = getStorageRate();
45
+ uint256 _startRun = block.timestamp;
46
+ while ((_startRun - _lp) > _dayseconds) {
47
+ uint256 _calculatedFee = ((_wt * _dailyRatePpb) / base);
48
+ _wt -= _calculatedFee;
49
+ _totalfee += _calculatedFee;
50
+ _lp += _dayseconds;
51
+ }
52
+ return _totalfee;
53
+ }
30
54
 
31
- modifier ifowner { if(owner == msg.sender) _ }
55
+ function mint() ifowner ifcansend {
56
+
57
+ }
32
58
 
33
- event GoldAuditReport(bool indexed passed, address indexed document, address indexed auditor);
59
+ function transferOwner(address _recipient) ifowner ifcansend {
60
+ owner = _recipient;
61
+ }
34
62
 
35
- function Gold(uint _wt) {
36
- owner = msg.sender;
37
- detail.auditCount = 0;
38
- detail.vendor = msg.sender;
39
- info.weight = _wt;
40
- storagefee.lastPayment = block.timestamp;
63
+ function getOwner() public returns (address) {
64
+ return owner;
65
+ }
66
+
67
+ function getLastStoragePayDate() public returns (uint256) {
68
+ return lastStoragePayment;
41
69
  }
42
70
 
43
- function lastCalculation() public returns (uint) {
44
- return storagefee.lastPayment;
71
+ function getStorageRate() public returns (uint256) {
72
+ return DigixConfiguration(config).getConfigEntryInt("rates/storage");
45
73
  }
46
74
 
47
- function timeSinceLastCalc() public returns (uint) {
48
- return (block.timestamp - storagefee.lastPayment);
75
+ function getWeightMinusFees() public returns (uint256) {
76
+ return (weight - getCalculatedFees());
49
77
  }
50
78
 
51
- function mathTestDiv(uint _a, uint _b) public returns (uint) {
52
- return (_a / _b);
79
+ function hasFees() public returns (bool) {
80
+ return (getCalculatedFees() > 0);
53
81
  }
54
82
 
55
- function calculateFee(uint _days) public returns (uint) {
56
- uint base = 1000000000000;
57
- uint dailyRate = 10277777777;
58
- var rate = dailyRate * _days;
59
- var fee = (rate * info.weight);
60
- return ((info.weight * base) - fee);
83
+ function isActive() public returns (bool) {
84
+ return active;
61
85
  }
62
86
 
63
- function mathTestMul(uint _a, uint _b) public returns (uint) {
64
- return (_a * _b);
87
+ function isYellow() public returns (bool) {
88
+ uint256 daylength = 60;
89
+ return ((block.timestamp - lastStoragePayment) > (daylength * 30));
90
+ }
91
+
92
+ function isRed() public returns (bool) {
93
+ uint256 daylength = 60;
94
+ return ((block.timestamp - lastStoragePayment) > (daylength * 90));
95
+ }
96
+
97
+ function canSend() public returns (bool) {
98
+ return (!isRed());
99
+ }
100
+
101
+ function getWeight() public returns (uint256) {
102
+ return weight;
65
103
  }
66
104
 
67
105
  }
@@ -1,48 +1,81 @@
1
1
  import "contracts/DigixConfiguration.sol";
2
- import "contracts/Directory.sol";
3
- import "contracts/VendorRegistry.sol";
4
- import "contracts/CustodianRegistry.sol";
5
- import "contracts/AuditorRegistry.sol";
2
+ import "contracts/GenericInterface.sol";
3
+ import "contracts/Gold.sol";
6
4
 
7
- contract GoldRegistry {
5
+ contract GoldRegistry is GenericInterface {
8
6
 
9
7
  address config;
10
8
 
11
- Directory.Data active;
9
+ Directory.AddressBoolMap entries;
10
+ Directory.AddressAddressMap custodianPending;
11
+
12
+ struct Asset {
13
+ address vendor;
14
+ address custodian;
15
+ bytes32 vendorDoc;
16
+ bytes32 custodianDoc;
17
+ }
18
+
19
+ mapping (address => Directory.AddressBoolMap) vendorAssets;
20
+ mapping (address => Directory.AddressBoolMap) custodianAssets;
21
+ mapping (address => Asset) registeredAssets;
12
22
 
13
23
  function GoldRegistry(address _conf) {
14
24
  config = _conf;
15
25
  }
16
26
 
17
- modifier ifvendor { if(isVendor(msg.sender)) _ }
18
- modifier ifcustodian { if(isCustodian(msg.sender)) _ }
19
- modifier ifauditor { if(isAuditor(msg.sender)) _ }
27
+ event AddGold(address indexed gold, address indexed vendor);
28
+ event CustodianAssignment(address indexed gold, address indexed custodian, address indexed vendor);
29
+ event RemoveGold(address indexed gold, address indexed custodian);
30
+
31
+ function registerGold(address _gold, address _owner, bytes32 _doc) ifvendor {
32
+ if (!Directory.insert(entries, _gold)) throw;
33
+ if (!Directory.insert(vendorAssets[msg.sender], _gold)) throw;
34
+ Asset _asset = registeredAssets[_gold];
35
+ _asset.vendor = msg.sender;
36
+ _asset.vendorDoc = _doc;
37
+ Gold(_gold).register(_owner);
38
+ }
39
+
40
+ function isRegistered(address _gold) public returns (bool) {
41
+ return Directory.contains(entries, _gold);
42
+ }
20
43
 
21
- function vendorRegistry() public returns (address) {
22
- return DigixConfiguration(config).getConfigEntry("registry/vendor");
44
+ function isVendorOf(address _gold, address _vndr) public returns (bool) {
45
+ return Directory.contains(vendorAssets[_vndr], _gold);
23
46
  }
24
47
 
25
- function custodianRegistry() public returns (address) {
26
- return DigixConfiguration(config).getConfigEntry("registry/custodian");
48
+ function isCustodianOf(address _gold, address _cstdn) public returns (bool) {
49
+ return Directory.contains(custodianAssets[_cstdn], _gold);
27
50
  }
28
-
29
- function auditorRegistry() public returns (address) {
30
- return DigixConfiguration(config).getConfigEntry("registry/auditor");
51
+
52
+ function delegateCustodian(address _gold, address _cstdn) ifvendor {
53
+ if (isVendorOf(_gold, msg.sender)) {
54
+ if (!Directory.insert(custodianPending, _gold, _cstdn)) throw;
55
+ CustodianAssignment(_gold, _cstdn, msg.sender);
56
+ }
31
57
  }
32
58
 
33
- function isVendor(address _vend) public returns (bool) {
34
- return VendorRegistry(vendorRegistry()).isVendor(_vend);
59
+ function receiveFromVendor(address _gold, bytes32 _doc) ifcustodian {
60
+ if (Directory.containsAndMatches(custodianPending, _gold, msg.sender)) {
61
+ if (!Directory.remove(custodianPending, _gold)) throw;
62
+ if (!Directory.insert(custodianAssets[msg.sender], _gold)) throw;
63
+ Asset _asset = registeredAssets[_gold];
64
+ _asset.custodian = msg.sender;
65
+ _asset.custodianDoc = _doc;
66
+ Gold(_gold).activate();
67
+ }
35
68
  }
36
-
37
- function isCustodian(address _cust) public returns (bool) {
38
- return CustodianRegistry(custodianRegistry()).isCustodian(_cust);
69
+
70
+ function submitAudit(address _gold, bytes32 _doc, bool _passed) ifauditor {
71
+
39
72
  }
40
-
41
- function isAuditor(address _audt) public returns (bool) {
42
- return AuditorRegistry(custodianRegistry()).isAuditor(_audt);
73
+
74
+ function requestRedemption(address _gold) ifowner {
75
+
43
76
  }
44
77
 
45
- function registerGold(address _gold) {
78
+ function markRedeemed(address _gold) ifcustodian {
46
79
 
47
80
  }
48
81
 
@@ -1,16 +1,14 @@
1
- import "contracts/VendorRegistry.sol";
2
- import "contracts/CustodianRegistry.sol";
3
- import "contracts/AuditorRegistry.sol";
1
+ import "contracts/GenericInterface.sol";
4
2
 
5
- contract Interface {
3
+ contract Interface is GenericInterface {
6
4
 
7
5
  address owner;
8
- address config;
9
6
 
10
- Directory.Data employees;
7
+ Directory.AddressBoolMap employees;
11
8
 
12
9
  modifier ifowner { if(owner == msg.sender) _ }
13
10
  modifier ifemployee { if(isEmployee(msg.sender)) _ }
11
+ modifier ifemployeeorigin { if(isEmployee(tx.origin)) _ }
14
12
 
15
13
  function registerEmployee(address _acct) ifowner {
16
14
  if (!Directory.insert(employees, _acct))
@@ -26,32 +24,4 @@ contract Interface {
26
24
  return Directory.contains(employees, _acct);
27
25
  }
28
26
 
29
- function goldRegistry() public returns (address) {
30
- return DigixConfiguration(config).getConfigEntry("registry/gold");
31
- }
32
-
33
- function vendorRegistry() public returns (address) {
34
- return DigixConfiguration(config).getConfigEntry("registry/vendor");
35
- }
36
-
37
- function custodianRegistry() public returns (address) {
38
- return DigixConfiguration(config).getConfigEntry("registry/custodian");
39
- }
40
-
41
- function auditorRegistry() public returns (address) {
42
- return DigixConfiguration(config).getConfigEntry("registry/auditor");
43
- }
44
-
45
- function isCustodian(address _cust) public returns (bool) {
46
- return CustodianRegistry(custodianRegistry()).isCustodian(_cust);
47
- }
48
-
49
- function isAuditor(address _adtr) public returns (bool) {
50
- return AuditorRegistry(auditorRegistry()).isAuditor(_adtr);
51
- }
52
-
53
- function isVendor(address _vndr) public returns (bool) {
54
- return VendorRegistry(vendorRegistry()).isVendor(_vndr);
55
- }
56
-
57
27
  }
@@ -1,23 +1,80 @@
1
1
  import "contracts/Interface.sol";
2
2
  import "contracts/Gold.sol";
3
+ import "contracts/GoldRegistry.sol";
4
+ import "contracts/DoublyLinked.sol";
3
5
 
4
6
  contract VendorInterface is Interface {
5
7
 
8
+ DoublyLinked.List openOrders;
9
+
10
+ enum OrderStatus { Open, Cancelled, Completed }
11
+
12
+ struct Order {
13
+ bytes32 sku;
14
+ address buyer;
15
+ uint status;
16
+ }
17
+
18
+ mapping (bytes32 => Order) orders;
19
+
6
20
  function VendorInterface(address _config) {
7
21
  owner = msg.sender;
8
22
  config = _config;
9
23
  }
10
24
 
11
- function registerGold(address _asset) ifemployee {
12
- var b = _asset;
25
+ function registerGold(address _asset, address _owner, bytes32 _doc) ifemployee {
26
+ GoldRegistry(goldRegistry()).registerGold(_asset, _owner, _doc);
27
+ }
28
+
29
+ function delegateCustodian(address _asset, address _cstdn) ifemployee {
30
+ GoldRegistry(goldRegistry()).delegateCustodian(_asset, _cstdn);
31
+ }
32
+
33
+ function append(bytes32 _data) {
34
+ DoublyLinked.append(openOrders, _data);
35
+ }
36
+
37
+ function createOrder(bytes32 _orderId, bytes32 _sku, address _buyer) {
38
+ Order _order = orders[_orderId];
39
+ _order.sku = _sku;
40
+ _order.buyer = _buyer;
41
+ _order.status = uint(OrderStatus.Open);
42
+ DoublyLinked.append(openOrders, _orderId);
43
+ }
44
+
45
+ function start() returns (uint80) {
46
+ return DoublyLinked.iterate_start(openOrders);
13
47
  }
14
48
 
15
- function uploadReceipt(address _asset, bytes32 _ipfsHash) ifemployee {
49
+ function getOrder(uint80 _idx) returns (bytes32 _orderId, bytes32 _sku, address _buyer) {
50
+ _orderId = DoublyLinked.iterate_get(openOrders, _idx);
51
+ _sku = orders[_orderId].sku;
52
+ _buyer = orders[_orderId].buyer;
53
+ }
16
54
 
55
+ function next(uint80 _idx) returns(uint80) {
56
+ return DoublyLinked.iterate_next(openOrders, _idx);
57
+ }
58
+
59
+ function valid(uint80 _idx) returns(bool) {
60
+ return DoublyLinked.iterate_valid(openOrders, _idx);
17
61
  }
18
62
 
19
- function assignCustodian(address _asset, address _custodian) ifemployee {
63
+ function prev(uint80 _idx) returns(uint80) {
64
+ return DoublyLinked.iterate_prev(openOrders, _idx);
65
+ }
20
66
 
67
+ function processOrder(bytes32 _orderId) returns (bool success) {
68
+ var it = DoublyLinked.iterate_start(openOrders);
69
+ while (DoublyLinked.iterate_valid(openOrders, it)) {
70
+ if (DoublyLinked.iterate_get(openOrders, it) == _orderId) {
71
+ DoublyLinked.remove(openOrders, it);
72
+ orders[_orderId].status = uint(OrderStatus.Completed);
73
+ return true;
74
+ }
75
+ it = DoublyLinked.iterate_next(openOrders, it);
76
+ }
77
+ return false;
21
78
  }
22
79
 
23
80
  }
@@ -1,10 +1,8 @@
1
- import "contracts/DigixConfiguration.sol";
2
- import "contracts/Directory.sol";
1
+ import "contracts/GenericRegistry.sol";
3
2
 
4
- contract VendorRegistry {
3
+ contract VendorRegistry is GenericRegistry {
5
4
 
6
- address config;
7
- Directory.Data vendors;
5
+ Directory.AddressBoolMap vendors;
8
6
 
9
7
  struct Vendor {
10
8
  bytes32 name;
@@ -12,20 +10,10 @@ contract VendorRegistry {
12
10
 
13
11
  mapping (address => Vendor) vendorNames;
14
12
 
15
- modifier ifadmin { if(isAdmin(msg.sender)) _ }
16
-
17
13
  function VendorRegistry(address _conf) {
18
14
  config = _conf;
19
15
  }
20
16
 
21
- function isAdmin(address _acct) public returns (bool) {
22
- return DigixConfiguration(config).isAdmin(_acct);
23
- }
24
-
25
- function getConfigAddress() public returns (address) {
26
- return config;
27
- }
28
-
29
17
  function register(address _acct) ifadmin {
30
18
  if (!Directory.insert(vendors, _acct))
31
19
  throw;
@@ -9,10 +9,10 @@ module Ethereum
9
9
  @binary = contract["bin"] unless contract.nil?
10
10
  @name = contract_name
11
11
  @project_initializer = project_initializer
12
- matchdata = /_+[a-zA-Z]+_+/.match(@binary)
12
+ matchdata = @binary.scan(/_+[a-zA-Z]+_+/).uniq
13
13
  @needs_linking = matchdata.present?
14
14
  if @needs_linking
15
- @libraries = matchdata.to_a.collect do |libname|
15
+ @libraries = matchdata.collect do |libname|
16
16
  {name: libname.gsub(/_+/,''), sigil: libname}
17
17
  end
18
18
  end
@@ -1,3 +1,3 @@
1
1
  module Ethereum
2
- VERSION = "0.4.75"
2
+ VERSION = "0.4.80"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ethereum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.75
4
+ version: 0.4.80
5
5
  platform: ruby
6
6
  authors:
7
7
  - DigixGlobal Pte Ltd (https://dgx.io)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-27 00:00:00.000000000 Z
11
+ date: 2015-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -121,6 +121,9 @@ files:
121
121
  - contracts/CustodianRegistry.sol
122
122
  - contracts/DigixConfiguration.sol
123
123
  - contracts/Directory.sol
124
+ - contracts/DoublyLinked.sol
125
+ - contracts/GenericInterface.sol
126
+ - contracts/GenericRegistry.sol
124
127
  - contracts/Gold.sol
125
128
  - contracts/GoldRegistry.sol
126
129
  - contracts/GoldTokenLedger.sol