@etherisc/gif-next 0.0.2-ebbe63d → 0.0.2-f9905e1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. package/README.md +95 -1
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
  3. package/artifacts/contracts/components/Component.sol/Component.json +179 -0
  4. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +4 -0
  5. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +35 -0
  6. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +4 -0
  7. package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +179 -0
  8. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +192 -0
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +4 -0
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +195 -0
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +4 -0
  13. package/artifacts/contracts/components/Product.sol/Product.json +213 -0
  14. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +4 -0
  15. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +128 -0
  16. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +4 -0
  17. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +42 -0
  18. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +4 -0
  19. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +76 -0
  20. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +4 -0
  21. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +89 -0
  22. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +4 -0
  23. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +128 -0
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +4 -0
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +37 -0
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +4 -0
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +50 -0
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +63 -0
  30. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +4 -0
  31. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +10 -0
  32. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +10 -0
  34. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
  35. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
  36. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  37. package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
  38. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
  39. package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
  40. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
  41. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
  42. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
  43. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
  44. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
  45. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
  46. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  47. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
  48. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  49. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
  50. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
  51. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
  52. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
  53. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
  54. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
  55. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
  56. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  57. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
  58. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
  59. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
  60. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
  61. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
  62. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  63. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
  64. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  65. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
  66. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  67. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
  68. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  69. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
  70. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
  72. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  73. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
  74. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
  75. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
  76. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
  77. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
  78. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
  79. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
  80. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
  81. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
  82. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
  83. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
  84. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
  85. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
  86. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  87. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +271 -0
  88. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
  89. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
  90. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
  91. package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
  92. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  93. package/artifacts/contracts/registry/Registry.sol/Registry.json +289 -0
  94. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
  95. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
  96. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +4 -0
  97. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +10 -0
  98. package/contracts/components/Component.sol +62 -0
  99. package/contracts/components/IPool.sol +9 -0
  100. package/contracts/components/IProduct.sol +11 -0
  101. package/contracts/components/Pool.sol +29 -0
  102. package/contracts/components/Product.sol +65 -0
  103. package/contracts/experiment/inheritance/A.sol +56 -0
  104. package/contracts/experiment/inheritance/B.sol +23 -0
  105. package/contracts/experiment/inheritance/C.sol +28 -0
  106. package/contracts/experiment/inheritance/IA.sol +18 -0
  107. package/contracts/experiment/inheritance/IB.sol +9 -0
  108. package/contracts/experiment/inheritance/IC.sol +11 -0
  109. package/contracts/experiment/types/TypeA.sol +42 -0
  110. package/contracts/experiment/types/TypeB.sol +24 -0
  111. package/contracts/instance/IInstance.sol +20 -0
  112. package/contracts/instance/Instance.sol +63 -0
  113. package/contracts/instance/access/Access.sol +218 -0
  114. package/contracts/instance/access/IAccess.sol +83 -0
  115. package/contracts/instance/component/ComponentModule.sol +259 -0
  116. package/contracts/instance/component/IComponent.sol +94 -0
  117. package/contracts/instance/policy/IPolicy.sol +66 -0
  118. package/contracts/instance/policy/PolicyModule.sol +106 -0
  119. package/contracts/instance/pool/IPoolModule.sol +40 -0
  120. package/contracts/instance/pool/PoolModule.sol +83 -0
  121. package/contracts/instance/product/IProductService.sol +45 -0
  122. package/contracts/instance/product/ProductService.sol +105 -0
  123. package/contracts/registry/IRegistry.sol +66 -0
  124. package/contracts/registry/Registry.sol +197 -0
  125. package/contracts/types/ChainId.sol +24 -0
  126. package/package.json +7 -6
  127. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  128. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  129. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  130. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  131. package/contracts/Dip.sol +0 -26
  132. package/contracts/Lock.sol +0 -34
@@ -0,0 +1,218 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ // role admin handling of oz doesn't fit nft ownability
5
+ // import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
6
+ import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
7
+
8
+ import {IAccessModule} from "./IAccess.sol";
9
+
10
+
11
+ abstract contract AccessModule is
12
+ IAccessModule
13
+ {
14
+ string constant public PRODUCT_OWNER = "ProductOwner";
15
+ string constant public ORACLE_OWNER = "OracleOwner";
16
+ string constant public POOL_OWNER = "PoolOwner";
17
+
18
+ using EnumerableSet for EnumerableSet.AddressSet;
19
+
20
+ event LogAccessRoleGranted(bytes32 role, address member, bool isMember);
21
+
22
+ mapping(bytes32 role => RoleInfo info) private _info;
23
+ bytes32 [] private _roles;
24
+
25
+ bytes32 private immutable _productOwnerRole;
26
+ bytes32 private immutable _oracleOwnerRole;
27
+ bytes32 private immutable _poolOwnerRole;
28
+
29
+ mapping(bytes32 role => mapping(address member => bool isMember)) private _isRoleMember;
30
+ mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers;
31
+
32
+ modifier onlyOwner() {
33
+ require(msg.sender == this.getOwner(), "ERROR:ACM-001:NOT_OWNER");
34
+ _;
35
+ }
36
+
37
+ constructor() {
38
+ _productOwnerRole = _createRole(PRODUCT_OWNER);
39
+ _oracleOwnerRole = _createRole(ORACLE_OWNER);
40
+ _poolOwnerRole = _createRole(POOL_OWNER);
41
+ }
42
+
43
+ function PRODUCT_OWNER_ROLE() public view override returns(bytes32 role) { return _productOwnerRole; }
44
+ function ORACLE_OWNER_ROLE() public view override returns(bytes32 role) { return _oracleOwnerRole; }
45
+ function POOL_OWNER_ROLE() public view override returns(bytes32 role) { return _poolOwnerRole; }
46
+
47
+
48
+ function createRole(string memory roleName)
49
+ external
50
+ override
51
+ onlyOwner
52
+ returns(bytes32 role)
53
+ {
54
+ return _createRole(roleName);
55
+ }
56
+
57
+ function _createRole(string memory roleName)
58
+ internal
59
+ returns(bytes32 role)
60
+ {
61
+ RoleInfo memory info = RoleInfo(
62
+ 0,
63
+ roleName,
64
+ true
65
+ );
66
+
67
+ role = _setRoleInfo(info);
68
+
69
+
70
+ }
71
+
72
+ // TODO move to module
73
+ function disableRole(bytes32 role)
74
+ external
75
+ override
76
+ onlyOwner
77
+ {
78
+ RoleInfo memory info = _info[role];
79
+ require(info.id == role, "ERROR:AOS-001:ROLE_DOES_NOT_EXIST");
80
+
81
+ info.isActive = false;
82
+ _setRoleInfo(info);
83
+
84
+
85
+ }
86
+
87
+ // TODO move to module
88
+ function enableRole(bytes32 role)
89
+ external
90
+ override
91
+ onlyOwner
92
+ {
93
+ RoleInfo memory info = _info[role];
94
+ require(info.id == role, "ERROR:AOS-002:ROLE_DOES_NOT_EXIST");
95
+
96
+ info.isActive = true;
97
+ _setRoleInfo(info);
98
+
99
+
100
+ }
101
+
102
+ function grantRole(bytes32 role, address member)
103
+ external
104
+ override
105
+ onlyOwner
106
+ {
107
+ require(_info[role].id == role, "ERROR:ACM-010:ROLE_NOT_EXISTING");
108
+ require(_info[role].isActive, "ERROR:ACM-011:ROLE_NOT_ACTIVE");
109
+
110
+ _isRoleMember[role][member] = true;
111
+ _roleMembers[role].add(member);
112
+
113
+ emit LogAccessRoleGranted(role, member, _isRoleMember[role][member]);
114
+ }
115
+
116
+
117
+ function revokeRole(bytes32 role, address member)
118
+ external
119
+ override
120
+ onlyOwner
121
+ {
122
+ require(_info[role].id == role, "ERROR:ACM-020:ROLE_NOT_EXISTING");
123
+
124
+ _isRoleMember[role][member] = false;
125
+ _roleMembers[role].remove(member);
126
+
127
+
128
+ }
129
+
130
+
131
+ function hasRole(bytes32 role, address member)
132
+ external
133
+ view
134
+ override
135
+ returns(bool)
136
+ {
137
+ return _isRoleMember[role][member];
138
+ }
139
+
140
+
141
+ function getRoleInfo(bytes32 role)
142
+ external
143
+ override
144
+ view
145
+ returns(RoleInfo memory info)
146
+ {
147
+ return _info[role];
148
+ }
149
+
150
+
151
+ function getRole(uint256 idx)
152
+ external
153
+ override
154
+ view
155
+ returns(bytes32 role)
156
+ {
157
+ return _roles[idx];
158
+ }
159
+
160
+
161
+ function getRoleCount()
162
+ external
163
+ override
164
+ view
165
+ returns(uint256 roles)
166
+ {
167
+ return _roles.length;
168
+ }
169
+
170
+ function getRoleMemberCount(bytes32 role)
171
+ public
172
+ override
173
+ view
174
+ returns(uint256 roleMembers)
175
+ {
176
+ return _roleMembers[role].length();
177
+ }
178
+
179
+ function getRoleMember(bytes32 role, uint256 idx)
180
+ public
181
+ override
182
+ view
183
+ returns(address roleMembers)
184
+ {
185
+ return _roleMembers[role].at(idx);
186
+ }
187
+
188
+ function getRoleForName(string memory roleName)
189
+ public
190
+ override
191
+ pure
192
+ returns(bytes32 role)
193
+ {
194
+ return keccak256(abi.encode(roleName));
195
+ }
196
+
197
+
198
+ function _setRoleInfo(RoleInfo memory info)
199
+ internal
200
+ returns(bytes32 role)
201
+ {
202
+ role = info.id;
203
+
204
+ if(role == bytes32(0)) {
205
+ role = getRoleForName(info.name);
206
+ // TODO check that this is a new role id
207
+
208
+ info.id = role;
209
+ _roles.push(role);
210
+
211
+
212
+ }
213
+
214
+ _info[role] = info;
215
+
216
+
217
+ }
218
+ }
@@ -0,0 +1,83 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IOwnable, IRegistryLinked} from "../../registry/IRegistry.sol";
5
+
6
+ interface IAccess {
7
+
8
+ struct RoleInfo {
9
+ bytes32 id;
10
+ string name;
11
+ bool isActive;
12
+ }
13
+ }
14
+
15
+ interface IAccessCheckRole {
16
+
17
+ function hasRole(bytes32 role, address member)
18
+ external
19
+ view
20
+ returns(bool);
21
+ }
22
+
23
+ interface IAccessComponentTypeRoles {
24
+ function PRODUCT_OWNER_ROLE() external view returns(bytes32 role);
25
+ function ORACLE_OWNER_ROLE() external view returns(bytes32 role);
26
+ function POOL_OWNER_ROLE() external view returns(bytes32 role);
27
+ }
28
+
29
+
30
+ interface IAccessModule is
31
+ IOwnable,
32
+ IRegistryLinked,
33
+ IAccess,
34
+ IAccessComponentTypeRoles,
35
+ IAccessCheckRole
36
+ {
37
+
38
+ function createRole(string memory roleName)
39
+ external
40
+ returns(bytes32 role);
41
+
42
+ function enableRole(bytes32 role)
43
+ external;
44
+
45
+ function disableRole(bytes32 role)
46
+ external;
47
+
48
+ function grantRole(bytes32 role, address member)
49
+ external;
50
+
51
+ function revokeRole(bytes32 role, address member)
52
+ external;
53
+
54
+ function getRole(uint256 idx)
55
+ external
56
+ view
57
+ returns(bytes32 role);
58
+
59
+ function getRoleInfo(bytes32 role)
60
+ external
61
+ view
62
+ returns(RoleInfo memory info);
63
+
64
+ function getRoleForName(string memory roleName)
65
+ external
66
+ pure
67
+ returns(bytes32 role);
68
+
69
+ function getRoleCount()
70
+ external
71
+ view
72
+ returns(uint256 roles);
73
+
74
+ function getRoleMemberCount(bytes32 role)
75
+ external
76
+ view
77
+ returns(uint256 roleMembers);
78
+
79
+ function getRoleMember(bytes32 role, uint256 idx)
80
+ external
81
+ view
82
+ returns(address roleMembers);
83
+ }
@@ -0,0 +1,259 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {RegistryLinked} from "../../registry/Registry.sol";
5
+ import {IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
6
+ import {IAccessComponentTypeRoles, IAccessCheckRole} from "../access/IAccess.sol";
7
+ import {IInstance} from "../IInstance.sol";
8
+
9
+ import {IComponent, IComponentContract, IComponentModule, IComponentOwnerService} from "./IComponent.sol";
10
+ import {IProductComponent} from "../../components/IProduct.sol";
11
+ import {IPoolModule} from "../pool/IPoolModule.sol";
12
+
13
+
14
+ abstract contract ComponentModule is
15
+ IRegistryLinked,
16
+ IAccessComponentTypeRoles,
17
+ IAccessCheckRole,
18
+ IComponentModule
19
+ {
20
+
21
+ mapping(uint256 nftId => ComponentInfo info) private _componentInfo;
22
+ mapping(uint256 nftId => uint256 poolNftId) private _poolNftIdForProduct;
23
+ mapping(address cAddress => uint256 id) private _idByAddress;
24
+ uint256 [] private _ids;
25
+
26
+ mapping(uint256 cType => bytes32 role) private _componentOwnerRole;
27
+
28
+ IComponentOwnerService private _componentOwnerService;
29
+
30
+ modifier onlyComponentOwnerService() {
31
+ require(address(_componentOwnerService) == msg.sender, "ERROR:CMP-001:NOT_OWNER_SERVICE");
32
+ _;
33
+ }
34
+
35
+ constructor(address componentOwnerService) {
36
+ _componentOwnerService = ComponentOwnerService(componentOwnerService);
37
+ }
38
+
39
+ function registerComponent(IComponentContract component)
40
+ external
41
+ override
42
+ onlyComponentOwnerService
43
+ returns(uint256 nftId)
44
+ {
45
+ bytes32 typeRole = getRoleForType(component.getType());
46
+ require(
47
+ this.hasRole(typeRole, component.getInitialOwner()),
48
+ "ERROR:CMP-004:TYPE_ROLE_MISSING");
49
+
50
+ nftId = this.getRegistry().register(address(component));
51
+
52
+ _componentInfo[nftId] = ComponentInfo(
53
+ nftId,
54
+ CState.Active);
55
+
56
+ // special case product -> persist product - pool assignment
57
+ if(component.getType() == this.getRegistry().PRODUCT()) {
58
+ IProductComponent product = IProductComponent(address(component));
59
+ uint256 poolNftId = product.getPoolNftId();
60
+ require(poolNftId > 0, "ERROR:CMP-005:POOL_UNKNOWN");
61
+ // add more validation (type, token, ...)
62
+
63
+ _poolNftIdForProduct[nftId] = poolNftId;
64
+
65
+ // add creation of productInfo
66
+ }
67
+ else if(component.getType() == this.getRegistry().POOL()) {
68
+ IPoolModule poolModule = IPoolModule(address(this));
69
+ poolModule.createPoolInfo(
70
+ nftId,
71
+ address(component), // set pool as its wallet
72
+ address(0) // don't deal with token yet
73
+ );
74
+ }
75
+
76
+ _idByAddress[address(component)] = nftId;
77
+ _ids.push(nftId);
78
+
79
+ // add logging
80
+ }
81
+
82
+ function getPoolNftId(uint256 productNftId)
83
+ external
84
+ view
85
+ override
86
+ returns(uint256 poolNftId)
87
+ {
88
+ poolNftId = _poolNftIdForProduct[productNftId];
89
+ }
90
+
91
+
92
+ function getComponentOwnerService()
93
+ external
94
+ override
95
+ view
96
+ returns(IComponentOwnerService)
97
+ {
98
+ return _componentOwnerService;
99
+ }
100
+
101
+ function setComponentInfo(ComponentInfo memory info)
102
+ external
103
+ onlyComponentOwnerService
104
+ returns(uint256 nftId)
105
+ {
106
+ uint256 id = info.nftId;
107
+ require(
108
+ id > 0 && _componentInfo[id].nftId == id,
109
+ "ERROR:CMP-005:COMPONENT_UNKNOWN");
110
+
111
+ _componentInfo[id] = info;
112
+
113
+ // add logging
114
+ }
115
+
116
+ function getComponentInfo(uint256 id)
117
+ external
118
+ override
119
+ view
120
+ returns(ComponentInfo memory)
121
+ {
122
+ return _componentInfo[id];
123
+ }
124
+
125
+ function getComponentOwner(uint256 id)
126
+ external
127
+ view
128
+ returns(address owner)
129
+ {
130
+
131
+ }
132
+
133
+ function getComponentId(address componentAddress)
134
+ external
135
+ view
136
+ returns(uint256 id)
137
+ {
138
+ return _idByAddress[componentAddress];
139
+ }
140
+
141
+
142
+ function getComponentId(uint256 idx)
143
+ external
144
+ override
145
+ view
146
+ returns(uint256 id)
147
+ {
148
+ return _ids[idx];
149
+ }
150
+
151
+
152
+ function components()
153
+ external
154
+ override
155
+ view
156
+ returns(uint256 numberOfCompnents)
157
+ {
158
+ return _ids.length;
159
+ }
160
+
161
+ function getRoleForType(uint256 cType)
162
+ public
163
+ view
164
+ returns(bytes32 role)
165
+ {
166
+ if(cType == this.getRegistry().PRODUCT()) {
167
+ return this.PRODUCT_OWNER_ROLE();
168
+ }
169
+ if(cType == this.getRegistry().POOL()) {
170
+ return this.POOL_OWNER_ROLE();
171
+ }
172
+ if(cType == this.getRegistry().ORACLE()) {
173
+ return this.ORACLE_OWNER_ROLE();
174
+ }
175
+
176
+ }
177
+ }
178
+
179
+
180
+ // this is actually the component owner service
181
+ contract ComponentOwnerService is
182
+ RegistryLinked,
183
+ IComponent,
184
+ IComponentOwnerService
185
+ {
186
+
187
+ modifier onlyComponentOwner(IComponentContract component) {
188
+ uint256 nftId = _registry.getNftId(address(component));
189
+ require(
190
+ nftId > 0,
191
+ "ERROR:COS-001:COMPONENT_UNKNOWN");
192
+ require(
193
+ msg.sender == _registry.getOwner(nftId),
194
+ "ERROR:COS-002:NOT_OWNER"
195
+ );
196
+ _;
197
+ }
198
+
199
+ constructor(address registry)
200
+ RegistryLinked(registry)
201
+ { }
202
+
203
+
204
+ // modifier onlyComponentOwnerRole(IComponentContract component) {
205
+ // IInstance instance = component.getInstance();
206
+ // // TODO add set/getComponentOwnerRole to IComonentModule
207
+ // bytes32 typeRole = instance.getComponentTypeRole(component.getType());
208
+ // require(
209
+ // instance.hasRole(typeRole, msg.sender),
210
+ // "ERROR:COS-003:COMPONENT_ROLE_MISSING"
211
+ // );
212
+ // _;
213
+ // }
214
+
215
+
216
+ function register(IComponentContract component)
217
+ external
218
+ override
219
+ returns(uint256 nftId)
220
+ {
221
+ require(
222
+ msg.sender == component.getInitialOwner(),
223
+ "ERROR:COS-003:NOT_OWNER");
224
+
225
+ IInstance instance = component.getInstance();
226
+ nftId = instance.registerComponent(component);
227
+ }
228
+
229
+
230
+ function lock(IComponentContract component)
231
+ external
232
+ override
233
+ onlyComponentOwner(component)
234
+ {
235
+ IInstance instance = component.getInstance();
236
+ ComponentInfo memory info = instance.getComponentInfo(component.getNftId());
237
+ require(info.nftId > 0, "ERROR_COMPONENT_UNKNOWN");
238
+ // TODO add state change validation
239
+
240
+ info.state = CState.Locked;
241
+ instance.setComponentInfo(info);
242
+ }
243
+
244
+
245
+ function unlock(IComponentContract component)
246
+ external
247
+ override
248
+ onlyComponentOwner(component)
249
+ {
250
+ IInstance instance = component.getInstance();
251
+ ComponentInfo memory info = instance.getComponentInfo(component.getNftId());
252
+ require(info.nftId > 0, "ERROR_COMPONENT_UNKNOWN");
253
+ // TODO state change validation
254
+
255
+ info.state = CState.Active;
256
+ instance.setComponentInfo(info);
257
+ }
258
+
259
+ }
@@ -0,0 +1,94 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+
5
+ import {IOwnable, IRegistryLinked, IRegisterable} from "../../registry/IRegistry.sol";
6
+ import {IInstance} from "../IInstance.sol";
7
+
8
+ interface IComponent {
9
+
10
+ // TODO decide if enum or uints with constants (as in IRegistry.PRODUCT())
11
+ enum CState {
12
+ Undefined,
13
+ Active,
14
+ Locked
15
+ }
16
+
17
+ // component dynamic info (static info kept in registry)
18
+ struct ComponentInfo {
19
+ uint256 nftId;
20
+ CState state;
21
+ }
22
+ }
23
+
24
+
25
+ interface IInstanceLinked {
26
+ // function setInstance(address instance) external;
27
+ function getInstance() external view returns(IInstance instance);
28
+ }
29
+
30
+
31
+ interface IComponentContract is
32
+ IRegisterable,
33
+ IInstanceLinked,
34
+ IComponent
35
+ { }
36
+
37
+
38
+ interface IComponentOwnerService is IRegistryLinked{
39
+
40
+ function register(IComponentContract component) external returns(uint256 id);
41
+ function lock(IComponentContract component) external;
42
+ function unlock(IComponentContract component) external;
43
+ }
44
+
45
+
46
+ interface IComponentModule is
47
+ IOwnable,
48
+ IRegistryLinked,
49
+ IComponent
50
+ {
51
+
52
+ function registerComponent(IComponentContract component)
53
+ external
54
+ returns(uint256 nftInfo);
55
+
56
+ function setComponentInfo(ComponentInfo memory info)
57
+ external
58
+ returns(uint256 componentId);
59
+
60
+ function getComponentInfo(uint256 id)
61
+ external
62
+ view
63
+ returns(ComponentInfo memory info);
64
+
65
+ function getComponentOwner(uint256 id)
66
+ external
67
+ view
68
+ returns(address owner);
69
+
70
+ function getComponentId(address componentAddress)
71
+ external
72
+ view
73
+ returns(uint256 id);
74
+
75
+ function getComponentId(uint256 idx)
76
+ external
77
+ view
78
+ returns(uint256 id);
79
+
80
+ function getPoolNftId(uint256 productNftId)
81
+ external
82
+ view
83
+ returns(uint256 poolNftId);
84
+
85
+ function components()
86
+ external
87
+ view
88
+ returns(uint256 numberOfCompnents);
89
+
90
+ function getComponentOwnerService()
91
+ external
92
+ view
93
+ returns(IComponentOwnerService);
94
+ }
@@ -0,0 +1,66 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+
5
+ import {IOwnable, IRegistryLinked, IRegisterable, IRegistry} from "../../registry/IRegistry.sol";
6
+ import {IInstance} from "../IInstance.sol";
7
+
8
+ import {IProductService} from "../product/IProductService.sol";
9
+
10
+ // TODO check if there is value to introuce IContract and let IPolicy derive from IContract
11
+ interface IPolicy {
12
+
13
+ enum PolicyState {
14
+ Undefined,
15
+ Applied,
16
+ Rejected,
17
+ Active,
18
+ Closed
19
+ }
20
+
21
+ struct PolicyInfo {
22
+ uint256 nftId;
23
+ PolicyState state; // applied, withdrawn, rejected, active, closed
24
+
25
+ uint256 sumInsuredAmount;
26
+ uint256 premiumAmount;
27
+ uint256 lifetime; // activatedAt + lifetime >= expiredAt
28
+
29
+ uint256 createdAt;
30
+ uint256 activatedAt; // time of underwriting
31
+ uint256 expiredAt; // no new claims
32
+ uint256 closedAt; // no locked capital
33
+ }
34
+ }
35
+
36
+ interface IPolicyModule is
37
+ IOwnable,
38
+ IRegistryLinked,
39
+ IPolicy
40
+ {
41
+
42
+ function createApplication(
43
+ IRegistry.RegistryInfo memory productInfo,
44
+ address applicationOwner,
45
+ uint256 sumInsuredAmount,
46
+ uint256 premiumAmount,
47
+ uint256 lifetime,
48
+ uint256 bundleNftId
49
+ )
50
+ external
51
+ returns(uint256 nftId);
52
+
53
+ function activate(uint256 nftId)
54
+ external;
55
+
56
+ function getBundleNftForPolicy(uint256 nftId)
57
+ external
58
+ view
59
+ returns(uint256 bundleNft);
60
+
61
+ function getPolicyInfo(uint256 nftId)
62
+ external
63
+ view
64
+ returns(PolicyInfo memory info);
65
+
66
+ }