ethereum 0.4.75 → 0.4.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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