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

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.
Files changed (123) 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/A.sol/A.dbg.json +4 -0
  15. package/artifacts/contracts/experiment/A.sol/A.json +128 -0
  16. package/artifacts/contracts/experiment/A.sol/AShared.dbg.json +4 -0
  17. package/artifacts/contracts/experiment/A.sol/AShared.json +42 -0
  18. package/artifacts/contracts/experiment/B.sol/B.dbg.json +4 -0
  19. package/artifacts/contracts/experiment/B.sol/B.json +76 -0
  20. package/artifacts/contracts/experiment/C.sol/C.dbg.json +4 -0
  21. package/artifacts/contracts/experiment/C.sol/C.json +89 -0
  22. package/artifacts/contracts/experiment/IA.sol/IA.dbg.json +4 -0
  23. package/artifacts/contracts/experiment/IA.sol/IA.json +128 -0
  24. package/artifacts/contracts/experiment/IA.sol/ISharedA.dbg.json +4 -0
  25. package/artifacts/contracts/experiment/IA.sol/ISharedA.json +37 -0
  26. package/artifacts/contracts/experiment/IB.sol/IB.dbg.json +4 -0
  27. package/artifacts/contracts/experiment/IB.sol/IB.json +50 -0
  28. package/artifacts/contracts/experiment/IC.sol/IC.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/IC.sol/IC.json +63 -0
  30. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
  31. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
  32. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  33. package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
  34. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
  35. package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
  36. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
  37. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
  38. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
  39. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
  40. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
  41. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
  42. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  43. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
  44. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  45. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
  46. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
  47. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
  48. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
  49. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
  50. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
  51. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
  52. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  53. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
  54. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
  55. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
  56. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
  57. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
  58. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  59. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
  60. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  61. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
  62. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  63. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
  64. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  65. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
  66. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  67. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
  68. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  69. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
  70. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
  71. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
  72. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
  73. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
  74. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
  75. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
  76. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
  77. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
  78. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
  79. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
  80. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
  81. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
  82. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  83. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +271 -0
  84. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
  85. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
  86. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
  87. package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
  88. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  89. package/artifacts/contracts/registry/Registry.sol/Registry.json +289 -0
  90. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
  91. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
  92. package/contracts/components/Component.sol +62 -0
  93. package/contracts/components/IPool.sol +9 -0
  94. package/contracts/components/IProduct.sol +11 -0
  95. package/contracts/components/Pool.sol +29 -0
  96. package/contracts/components/Product.sol +65 -0
  97. package/contracts/experiment/A.sol +56 -0
  98. package/contracts/experiment/B.sol +23 -0
  99. package/contracts/experiment/C.sol +28 -0
  100. package/contracts/experiment/IA.sol +18 -0
  101. package/contracts/experiment/IB.sol +9 -0
  102. package/contracts/experiment/IC.sol +11 -0
  103. package/contracts/instance/IInstance.sol +20 -0
  104. package/contracts/instance/Instance.sol +63 -0
  105. package/contracts/instance/access/Access.sol +218 -0
  106. package/contracts/instance/access/IAccess.sol +83 -0
  107. package/contracts/instance/component/ComponentModule.sol +259 -0
  108. package/contracts/instance/component/IComponent.sol +94 -0
  109. package/contracts/instance/policy/IPolicy.sol +66 -0
  110. package/contracts/instance/policy/PolicyModule.sol +106 -0
  111. package/contracts/instance/pool/IPoolModule.sol +40 -0
  112. package/contracts/instance/pool/PoolModule.sol +83 -0
  113. package/contracts/instance/product/IProductService.sol +45 -0
  114. package/contracts/instance/product/ProductService.sol +105 -0
  115. package/contracts/registry/IRegistry.sol +66 -0
  116. package/contracts/registry/Registry.sol +197 -0
  117. package/package.json +7 -6
  118. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  119. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  120. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  121. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  122. package/contracts/Dip.sol +0 -26
  123. package/contracts/Lock.sol +0 -34
@@ -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
+ }
@@ -0,0 +1,106 @@
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 {IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
7
+
8
+ import {IProductService} from "../product/IProductService.sol";
9
+ import {IPolicy, IPolicyModule} from "./IPolicy.sol";
10
+
11
+
12
+ abstract contract PolicyModule is
13
+ IRegistryLinked,
14
+ IPolicyModule
15
+ {
16
+
17
+ mapping(uint256 nftId => PolicyInfo info) private _policyInfo;
18
+ mapping(uint256 nftId => uint256 bundleNftId) private _bundleForPolicy;
19
+
20
+ IProductService private _productService;
21
+
22
+ // TODO find a better place to avoid dupliation
23
+ modifier onlyProductService2() {
24
+ require(address(_productService) == msg.sender, "ERROR:POL-001:NOT_PRODUCT_SERVICE");
25
+ _;
26
+ }
27
+
28
+ constructor(address productService) {
29
+ _productService = IProductService(productService);
30
+ }
31
+
32
+
33
+ function createApplication(
34
+ IRegistry.RegistryInfo memory productInfo,
35
+ address applicationOwner,
36
+ uint256 sumInsuredAmount,
37
+ uint256 premiumAmount,
38
+ uint256 lifetime,
39
+ uint256 bundleNftId
40
+ )
41
+ external
42
+ override
43
+ onlyProductService2
44
+ returns(uint256 nftId)
45
+ {
46
+ // TODO add parameter validation
47
+ if(bundleNftId > 0) {
48
+ IRegistry.RegistryInfo memory bundleInfo = this.getRegistry().getInfo(bundleNftId);
49
+ IRegistry.RegistryInfo memory poolInfo = this.getRegistry().getInfo(bundleInfo.parentNftId);
50
+ }
51
+
52
+ nftId = this.getRegistry().registerObjectForInstance(
53
+ productInfo.nftId,
54
+ this.getRegistry().POLICY(),
55
+ applicationOwner);
56
+
57
+ _policyInfo[nftId] = PolicyInfo(
58
+ nftId,
59
+ PolicyState.Applied,
60
+ sumInsuredAmount,
61
+ premiumAmount,
62
+ lifetime,
63
+ block.timestamp,
64
+ 0, // activatedAt
65
+ 0, // expiredAt
66
+ 0 // closedAt
67
+ );
68
+
69
+ _bundleForPolicy[nftId] = bundleNftId;
70
+
71
+ // add logging
72
+ }
73
+
74
+
75
+ function activate(uint256 nftId)
76
+ external
77
+ override
78
+ onlyProductService2
79
+ {
80
+ PolicyInfo storage info = _policyInfo[nftId];
81
+ info.activatedAt = block.timestamp;
82
+ info.expiredAt = block.timestamp + info.lifetime;
83
+ info.state = PolicyState.Active;
84
+
85
+ // add logging
86
+ }
87
+
88
+
89
+
90
+ function getBundleNftForPolicy(uint256 nftId)
91
+ external
92
+ view
93
+ returns(uint256 bundleNft)
94
+ {
95
+ return _bundleForPolicy[nftId];
96
+ }
97
+
98
+
99
+ function getPolicyInfo(uint256 nftId)
100
+ external
101
+ view
102
+ returns(PolicyInfo memory info)
103
+ {
104
+ return _policyInfo[nftId];
105
+ }
106
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IOwnable, IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
5
+
6
+ interface IPool {
7
+
8
+ struct PoolInfo {
9
+ uint256 nftId;
10
+ address wallet;
11
+ address token;
12
+ uint256 capital;
13
+ uint256 lockedCapital;
14
+ }
15
+ }
16
+
17
+ interface IPoolModule is
18
+ IOwnable,
19
+ IRegistryLinked,
20
+ IPool
21
+ {
22
+
23
+ function underwrite(
24
+ uint256 poolNftId,
25
+ uint256 policyNftId
26
+ )
27
+ external;
28
+
29
+ function createPoolInfo(
30
+ uint256 nftId,
31
+ address wallet,
32
+ address token
33
+ )
34
+ external;
35
+
36
+ function getPoolInfo(uint256 nftId)
37
+ external
38
+ view
39
+ returns(PoolInfo memory info);
40
+ }
@@ -0,0 +1,83 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IOwnable, IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
5
+ import {IProductService} from "../product/IProductService.sol";
6
+ import {IPolicy, IPolicyModule} from "../policy/IPolicy.sol";
7
+ import {IPoolModule} from "./IPoolModule.sol";
8
+
9
+ abstract contract PoolModule is
10
+ IPoolModule
11
+ {
12
+ uint256 public constant INITIAL_CAPITAL = 10000*10**6;
13
+
14
+ mapping(uint256 nftId => PoolInfo info) private _poolInfo;
15
+
16
+ IProductService private _productService;
17
+
18
+ modifier onlyProductService() {
19
+ require(address(_productService) == msg.sender, "ERROR:POL-001:NOT_PRODUCT_SERVICE");
20
+ _;
21
+ }
22
+
23
+ constructor(address productService) {
24
+ _productService = IProductService(productService);
25
+ }
26
+
27
+ function createPoolInfo(
28
+ uint256 nftId,
29
+ address wallet,
30
+ address token
31
+ )
32
+ public
33
+ override
34
+ {
35
+ require(
36
+ _poolInfo[nftId].nftId == 0,
37
+ "ERROR:PL-001:ALREADY_CREATED");
38
+
39
+ _poolInfo[nftId] = PoolInfo(
40
+ nftId,
41
+ wallet,
42
+ token,
43
+ INITIAL_CAPITAL,
44
+ 0 // locked capital
45
+ );
46
+
47
+ }
48
+
49
+
50
+ function underwrite(
51
+ uint256 poolNftId,
52
+ uint256 policyNftId
53
+ )
54
+ external
55
+ override
56
+ onlyProductService
57
+ {
58
+ PoolInfo storage poolInfo = _poolInfo[poolNftId];
59
+ require(
60
+ poolInfo.nftId == poolNftId,
61
+ "ERROR:PL-002:POOL_UNKNOWN");
62
+
63
+ IPolicyModule policyModule = IPolicyModule(address(this));
64
+ IPolicy.PolicyInfo memory policyInfo = policyModule.getPolicyInfo(policyNftId);
65
+
66
+ require(
67
+ poolInfo.capital - poolInfo.lockedCapital >= policyInfo.sumInsuredAmount,
68
+ "ERROR:PL-003:CAPACITY_TOO_LOW");
69
+
70
+ poolInfo.lockedCapital += policyInfo.sumInsuredAmount;
71
+ }
72
+
73
+
74
+ function getPoolInfo(uint256 nftId)
75
+ external
76
+ view
77
+ override
78
+ returns(PoolInfo memory info)
79
+ {
80
+ info = _poolInfo[nftId];
81
+ }
82
+
83
+ }
@@ -0,0 +1,45 @@
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
+
9
+ // TODO or name this IProtectionService to have Product be something more generic (loan, savings account, ...)
10
+ interface IProductService is
11
+ IRegistryLinked
12
+ {
13
+
14
+ function createApplication(
15
+ address applicationOwner,
16
+ uint256 sumInsuredAmount,
17
+ uint256 premiumAmount,
18
+ uint256 lifetime,
19
+ uint256 bundleNftId
20
+ )
21
+ external
22
+ returns(uint256 nftId);
23
+
24
+ // function revoke(unit256 nftId) external;
25
+
26
+ function underwrite(uint256 nftId) external;
27
+ // function decline(uint256 nftId) external;
28
+ // function expire(uint256 nftId) external;
29
+ function close(uint256 nftId) external;
30
+
31
+ // function collectPremium(uint256 nftId, uint256 premiumAmount) external;
32
+
33
+ // function createClaim(uint256 nftId, uint256 claimAmount) external;
34
+ // function confirmClaim(uint256 nftId, uint256 claimId, uint256 claimAmount) external;
35
+ // function declineClaim(uint256 nftId, uint256 claimId) external;
36
+ // function closeClaim(uint256 nftId, uint256 claimId) external;
37
+ }
38
+
39
+
40
+ interface IProductModule is
41
+ IOwnable,
42
+ IRegistryLinked
43
+ {
44
+ function getProductService() external view returns(IProductService);
45
+ }