@etherisc/gif-next 0.0.2-ac5f18b → 0.0.2-b9b3e89

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. package/README.md +70 -0
  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/instance/IInstance.sol/IInstance.dbg.json +4 -0
  15. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
  16. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  17. package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
  18. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
  19. package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
  20. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
  21. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
  22. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
  23. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
  24. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
  25. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
  26. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
  27. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
  28. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  29. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
  30. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
  31. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
  32. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
  33. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
  34. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
  35. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
  36. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  37. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
  38. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
  39. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
  40. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
  41. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
  42. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  43. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
  44. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  45. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
  46. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  47. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
  48. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  49. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
  50. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  51. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
  52. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  53. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
  54. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
  55. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
  56. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
  57. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
  58. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
  59. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
  60. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
  61. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
  62. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
  63. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
  64. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
  65. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
  66. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  67. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +271 -0
  68. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
  69. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
  70. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
  71. package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
  72. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  73. package/artifacts/contracts/registry/Registry.sol/Registry.json +289 -0
  74. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
  75. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
  76. package/contracts/components/Component.sol +62 -0
  77. package/contracts/components/IPool.sol +9 -0
  78. package/contracts/components/IProduct.sol +11 -0
  79. package/contracts/components/Pool.sol +29 -0
  80. package/contracts/components/Product.sol +65 -0
  81. package/contracts/instance/IInstance.sol +20 -0
  82. package/contracts/instance/Instance.sol +63 -0
  83. package/contracts/instance/access/Access.sol +218 -0
  84. package/contracts/instance/access/IAccess.sol +83 -0
  85. package/contracts/instance/component/ComponentModule.sol +259 -0
  86. package/contracts/instance/component/IComponent.sol +94 -0
  87. package/contracts/instance/policy/IPolicy.sol +66 -0
  88. package/contracts/instance/policy/PolicyModule.sol +106 -0
  89. package/contracts/instance/pool/IPoolModule.sol +40 -0
  90. package/contracts/instance/pool/PoolModule.sol +83 -0
  91. package/contracts/instance/product/IProductService.sol +45 -0
  92. package/contracts/instance/product/ProductService.sol +105 -0
  93. package/contracts/registry/IRegistry.sol +66 -0
  94. package/contracts/registry/Registry.sol +197 -0
  95. package/package.json +6 -6
  96. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  97. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  98. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  99. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  100. package/contracts/Dip.sol +0 -26
  101. 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
+ }