@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.
- package/README.md +95 -1
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
- package/artifacts/contracts/components/Component.sol/Component.json +179 -0
- package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +4 -0
- package/artifacts/contracts/components/Component.sol/InstanceLinked.json +35 -0
- package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +4 -0
- package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +179 -0
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +4 -0
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +192 -0
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +4 -0
- package/artifacts/contracts/components/Pool.sol/Pool.json +195 -0
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +4 -0
- package/artifacts/contracts/components/Product.sol/Product.json +213 -0
- package/artifacts/contracts/experiment/A.sol/A.dbg.json +4 -0
- package/artifacts/contracts/experiment/A.sol/A.json +128 -0
- package/artifacts/contracts/experiment/A.sol/AShared.dbg.json +4 -0
- package/artifacts/contracts/experiment/A.sol/AShared.json +42 -0
- package/artifacts/contracts/experiment/B.sol/B.dbg.json +4 -0
- package/artifacts/contracts/experiment/B.sol/B.json +76 -0
- package/artifacts/contracts/experiment/C.sol/C.dbg.json +4 -0
- package/artifacts/contracts/experiment/C.sol/C.json +89 -0
- package/artifacts/contracts/experiment/IA.sol/IA.dbg.json +4 -0
- package/artifacts/contracts/experiment/IA.sol/IA.json +128 -0
- package/artifacts/contracts/experiment/IA.sol/ISharedA.dbg.json +4 -0
- package/artifacts/contracts/experiment/IA.sol/ISharedA.json +37 -0
- package/artifacts/contracts/experiment/IB.sol/IB.dbg.json +4 -0
- package/artifacts/contracts/experiment/IB.sol/IB.json +50 -0
- package/artifacts/contracts/experiment/IC.sol/IC.dbg.json +4 -0
- package/artifacts/contracts/experiment/IC.sol/IC.json +63 -0
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +892 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.json +1009 -0
- package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +4 -0
- package/artifacts/contracts/instance/access/Access.sol/AccessModule.json +400 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccess.json +10 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.json +35 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.json +50 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +4 -0
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.json +336 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +327 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +4 -0
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +105 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponent.json +10 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +179 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +245 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +94 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +4 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.json +24 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.json +10 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +231 -0
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +231 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +4 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.json +10 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +149 -0
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +162 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +4 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.json +75 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +114 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +4 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.json +75 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +4 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +125 -0
- package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IOwnable.json +24 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +166 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +271 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +4 -0
- package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.json +49 -0
- package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +4 -0
- package/artifacts/contracts/registry/Registry.sol/Registerable.json +166 -0
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
- package/artifacts/contracts/registry/Registry.sol/Registry.json +289 -0
- package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +4 -0
- package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +60 -0
- package/contracts/components/Component.sol +62 -0
- package/contracts/components/IPool.sol +9 -0
- package/contracts/components/IProduct.sol +11 -0
- package/contracts/components/Pool.sol +29 -0
- package/contracts/components/Product.sol +65 -0
- package/contracts/experiment/A.sol +56 -0
- package/contracts/experiment/B.sol +23 -0
- package/contracts/experiment/C.sol +28 -0
- package/contracts/experiment/IA.sol +18 -0
- package/contracts/experiment/IB.sol +9 -0
- package/contracts/experiment/IC.sol +11 -0
- package/contracts/instance/IInstance.sol +20 -0
- package/contracts/instance/Instance.sol +63 -0
- package/contracts/instance/access/Access.sol +218 -0
- package/contracts/instance/access/IAccess.sol +83 -0
- package/contracts/instance/component/ComponentModule.sol +259 -0
- package/contracts/instance/component/IComponent.sol +94 -0
- package/contracts/instance/policy/IPolicy.sol +66 -0
- package/contracts/instance/policy/PolicyModule.sol +106 -0
- package/contracts/instance/pool/IPoolModule.sol +40 -0
- package/contracts/instance/pool/PoolModule.sol +83 -0
- package/contracts/instance/product/IProductService.sol +45 -0
- package/contracts/instance/product/ProductService.sol +105 -0
- package/contracts/registry/IRegistry.sol +66 -0
- package/contracts/registry/Registry.sol +197 -0
- package/package.json +7 -6
- package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
- package/artifacts/contracts/Dip.sol/DIP.json +0 -338
- package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
- package/artifacts/contracts/Lock.sol/Lock.json +0 -74
- package/contracts/Dip.sol +0 -26
- 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
|
+
}
|