@etherisc/gif-next 0.0.2-c4efd5e → 0.0.2-c630f3f-038

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 (165) hide show
  1. package/README.md +10 -2
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
  3. package/artifacts/contracts/components/Component.sol/Component.json +28 -2
  4. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +1 -1
  5. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +2 -2
  6. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +78 -2
  8. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +32 -150
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +121 -6
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  13. package/artifacts/contracts/components/Product.sol/Product.json +121 -6
  14. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  15. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +2 -2
  16. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +2 -2
  18. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +2 -2
  20. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +2 -2
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +59 -0
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +4 -0
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +124 -0
  32. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +74 -0
  34. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +4 -0
  35. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +124 -0
  36. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +4 -0
  37. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +207 -0
  38. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  39. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
  40. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  41. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
  42. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +686 -99
  44. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  45. package/artifacts/contracts/instance/Instance.sol/Instance.json +757 -99
  46. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +1 -1
  47. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +1 -1
  48. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +1 -1
  49. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +1 -1
  50. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  51. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  52. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +14 -42
  53. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +1 -1
  54. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +65 -10
  55. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +1 -1
  56. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +1 -1
  57. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +28 -2
  58. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +12 -40
  60. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +1 -1
  61. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +47 -0
  62. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +1 -1
  63. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  64. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.json +134 -0
  65. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +4 -0
  66. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.json +182 -0
  67. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +4 -0
  68. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.json +221 -0
  69. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  70. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  71. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +26 -3
  72. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  73. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +26 -3
  74. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  75. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  76. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +15 -35
  77. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  78. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +22 -29
  79. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +1 -1
  80. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +13 -0
  82. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +1 -1
  83. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +1 -1
  84. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +41 -12
  85. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  86. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.json +10 -0
  87. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  88. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.json +490 -0
  89. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  90. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.json +45 -0
  91. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  92. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.json +490 -0
  93. package/artifacts/contracts/mock/Dip.sol/DIP.dbg.json +4 -0
  94. package/artifacts/contracts/mock/Dip.sol/DIP.json +338 -0
  95. package/artifacts/contracts/mock/TestPool.sol/TestPool.dbg.json +4 -0
  96. package/artifacts/contracts/mock/TestPool.sol/TestPool.json +294 -0
  97. package/artifacts/contracts/mock/TestProduct.sol/TestProduct.dbg.json +4 -0
  98. package/artifacts/contracts/mock/TestProduct.sol/TestProduct.json +384 -0
  99. package/artifacts/contracts/mock/Usdc.sol/USDC.dbg.json +4 -0
  100. package/artifacts/contracts/mock/Usdc.sol/USDC.json +338 -0
  101. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  102. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
  103. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  104. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +1 -1
  105. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +1 -1
  106. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +2 -2
  107. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  108. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +4 -95
  109. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +1 -1
  110. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +1 -1
  111. package/artifacts/contracts/registry/Registry.sol/Registerable.json +2 -2
  112. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  113. package/artifacts/contracts/registry/Registry.sol/Registry.json +14 -105
  114. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +1 -1
  115. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +2 -2
  116. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  117. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  118. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  119. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  120. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  121. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
  122. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  123. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  124. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  125. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  126. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  127. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +2 -2
  128. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  129. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +37 -11
  130. package/contracts/components/Component.sol +24 -7
  131. package/contracts/components/IPool.sol +6 -0
  132. package/contracts/components/IProduct.sol +9 -2
  133. package/contracts/components/Pool.sol +34 -4
  134. package/contracts/components/Product.sol +38 -4
  135. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  136. package/contracts/experiment/statemachine/ISM.sol +25 -0
  137. package/contracts/experiment/statemachine/README.md +112 -0
  138. package/contracts/experiment/statemachine/SM.sol +57 -0
  139. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  140. package/contracts/instance/IInstance.sol +9 -2
  141. package/contracts/instance/Instance.sol +13 -5
  142. package/contracts/instance/component/ComponentModule.sol +99 -38
  143. package/contracts/instance/component/IComponent.sol +18 -17
  144. package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
  145. package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
  146. package/contracts/instance/policy/IPolicy.sol +8 -9
  147. package/contracts/instance/policy/PolicyModule.sol +32 -9
  148. package/contracts/instance/pool/IPoolModule.sol +2 -8
  149. package/contracts/instance/pool/PoolModule.sol +24 -16
  150. package/contracts/instance/product/IProductService.sol +1 -1
  151. package/contracts/instance/product/ProductService.sol +54 -30
  152. package/contracts/instance/treasury/ITreasury.sol +91 -0
  153. package/contracts/instance/treasury/TokenHandler.sol +24 -0
  154. package/contracts/instance/treasury/TreasuryModule.sol +168 -0
  155. package/contracts/mock/Dip.sol +26 -0
  156. package/contracts/mock/TestPool.sol +16 -0
  157. package/contracts/mock/TestProduct.sol +39 -0
  158. package/contracts/mock/Usdc.sol +26 -0
  159. package/contracts/registry/IRegistry.sol +4 -17
  160. package/contracts/registry/Registry.sol +4 -31
  161. package/contracts/types/Fee.sol +32 -0
  162. package/contracts/types/ObjectType.sol +107 -0
  163. package/contracts/types/StateId.sol +91 -0
  164. package/contracts/types/UFixed.sol +19 -14
  165. package/package.json +10 -6
@@ -0,0 +1,88 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {NftId} from "../../types/NftId.sol";
5
+ import {ObjectType, PRODUCT, ORACLE, POOL, BUNDLE, POLICY} from "../../types/ObjectType.sol";
6
+ import {StateId, ACTIVE, PAUSED, ARCHIVED, CLOSED, APPLIED, REVOKED, DECLINED} from "../../types/StateId.sol";
7
+ import {ILifecycleModule} from "./ILifecycle.sol";
8
+
9
+ contract LifecycleModule is ILifecycleModule {
10
+ mapping(ObjectType objectType => StateId initialState)
11
+ private _initialState;
12
+
13
+ mapping(ObjectType objectType => mapping(StateId stateFrom => mapping(StateId stateTo => bool isValid)))
14
+ private _isValidTransition;
15
+
16
+ constructor() {
17
+ _setupComponentLifecycle(PRODUCT());
18
+ _setupComponentLifecycle(ORACLE());
19
+ _setupComponentLifecycle(POOL());
20
+
21
+ _setupBundleLifecycle();
22
+ _setupPolicyLifecycle();
23
+ }
24
+
25
+ function checkAndLogTransition(
26
+ NftId nftId,
27
+ ObjectType objectType,
28
+ StateId fromId,
29
+ StateId toId
30
+ ) public returns (StateId) // add only currentcontract? would that work?
31
+ {
32
+ if (!_isValidTransition[objectType][fromId][toId]) {
33
+ revert ErrorInvalidStateTransition(nftId, objectType, fromId, toId);
34
+ }
35
+
36
+ if (objectType == POLICY()) {
37
+ emit LogPolicyStateChanged(nftId, fromId, toId);
38
+ } else if (objectType == BUNDLE()) {
39
+ emit LogBundleStateChanged(nftId, fromId, toId);
40
+ } else if (
41
+ objectType == PRODUCT() ||
42
+ objectType == ORACLE() ||
43
+ objectType == POOL()
44
+ ) {
45
+ emit LogComponentStateChanged(nftId, objectType, fromId, toId);
46
+ } else {
47
+ revert ErrorNoLifecycle(nftId, objectType);
48
+ }
49
+
50
+ return toId;
51
+ }
52
+
53
+ function getInitialState(
54
+ ObjectType objectType
55
+ ) public view returns (StateId) {
56
+ return _initialState[objectType];
57
+ }
58
+
59
+ function isValidTransition(
60
+ ObjectType objectType,
61
+ StateId fromId,
62
+ StateId toId
63
+ ) public view returns (bool) {
64
+ return _isValidTransition[objectType][fromId][toId];
65
+ }
66
+
67
+ function _setupComponentLifecycle(ObjectType objectType) internal {
68
+ _initialState[objectType] = ACTIVE();
69
+ _isValidTransition[objectType][ACTIVE()][PAUSED()] = true;
70
+ _isValidTransition[objectType][PAUSED()][ACTIVE()] = true;
71
+ _isValidTransition[objectType][PAUSED()][ARCHIVED()] = true;
72
+ }
73
+
74
+ function _setupBundleLifecycle() internal {
75
+ _initialState[BUNDLE()] = ACTIVE();
76
+ _isValidTransition[BUNDLE()][ACTIVE()][PAUSED()] = true;
77
+ _isValidTransition[BUNDLE()][PAUSED()][ACTIVE()] = true;
78
+ _isValidTransition[BUNDLE()][PAUSED()][CLOSED()] = true;
79
+ }
80
+
81
+ function _setupPolicyLifecycle() internal {
82
+ _initialState[POLICY()] = APPLIED();
83
+ _isValidTransition[POLICY()][APPLIED()][REVOKED()] = true;
84
+ _isValidTransition[POLICY()][APPLIED()][DECLINED()] = true;
85
+ _isValidTransition[POLICY()][APPLIED()][ACTIVE()] = true;
86
+ _isValidTransition[POLICY()][ACTIVE()][CLOSED()] = true;
87
+ }
88
+ }
@@ -5,24 +5,20 @@ import {IOwnable, IRegistryLinked, IRegisterable, IRegistry} from "../../registr
5
5
  import {IInstance} from "../IInstance.sol";
6
6
  import {IProductService} from "../product/IProductService.sol";
7
7
  import {NftId} from "../../types/NftId.sol";
8
+ import {StateId} from "../../types/StateId.sol";
8
9
 
9
10
  // TODO check if there is value to introuce IContract and let IPolicy derive from IContract
10
11
  interface IPolicy {
11
- enum PolicyState {
12
- Undefined,
13
- Applied,
14
- Rejected,
15
- Active,
16
- Closed
17
- }
18
-
19
12
  struct PolicyInfo {
20
13
  NftId nftId;
21
- PolicyState state; // applied, withdrawn, rejected, active, closed
14
+ StateId state; // applied, withdrawn, rejected, active, closed
15
+ // TODO add beneficiary address
22
16
  uint256 sumInsuredAmount;
23
17
  uint256 premiumAmount;
18
+ uint256 premiumPaidAmount;
24
19
  uint256 lifetime; // activatedAt + lifetime >= expiredAt
25
20
  uint256 createdAt;
21
+ uint256 updatedAt;
26
22
  uint256 activatedAt; // time of underwriting
27
23
  uint256 expiredAt; // no new claims
28
24
  uint256 closedAt; // no locked capital
@@ -39,6 +35,9 @@ interface IPolicyModule is IOwnable, IRegistryLinked, IPolicy {
39
35
  NftId bundleNftId
40
36
  ) external returns (NftId nftId);
41
37
 
38
+ // process full premium
39
+ function processPremium(NftId nftId) external;
40
+
42
41
  function activate(NftId nftId) external;
43
42
 
44
43
  function getBundleNftForPolicy(
@@ -4,16 +4,22 @@ pragma solidity ^0.8.19;
4
4
  // import {IOwnable, IRegistryLinked, IRegisterable} from "../../registry/IRegistry.sol";
5
5
  import {IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
6
6
 
7
+ import {LifecycleModule} from "../lifecycle/LifecycleModule.sol";
7
8
  import {IProductService} from "../product/IProductService.sol";
8
9
  import {IPolicy, IPolicyModule} from "./IPolicy.sol";
10
+ import {ObjectType, POLICY} from "../../types/ObjectType.sol";
11
+ import {ACTIVE} from "../../types/StateId.sol";
9
12
  import {NftId, NftIdLib} from "../../types/NftId.sol";
10
13
 
14
+ import {LifecycleModule} from "../lifecycle/LifecycleModule.sol";
15
+
11
16
  abstract contract PolicyModule is IRegistryLinked, IPolicyModule {
12
17
  using NftIdLib for NftId;
13
18
 
14
19
  mapping(NftId nftId => PolicyInfo info) private _policyInfo;
15
20
  mapping(NftId nftId => NftId bundleNftId) private _bundleForPolicy;
16
21
 
22
+ LifecycleModule private _lifecycleModule;
17
23
  IProductService private _productService;
18
24
 
19
25
  // TODO find a better place to avoid dupliation
@@ -26,6 +32,7 @@ abstract contract PolicyModule is IRegistryLinked, IPolicyModule {
26
32
  }
27
33
 
28
34
  constructor(address productService) {
35
+ _lifecycleModule = LifecycleModule(address(this));
29
36
  _productService = IProductService(productService);
30
37
  }
31
38
 
@@ -39,25 +46,29 @@ abstract contract PolicyModule is IRegistryLinked, IPolicyModule {
39
46
  ) external override onlyProductService2 returns (NftId nftId) {
40
47
  // TODO add parameter validation
41
48
  if (bundleNftId.gtz()) {
42
- IRegistry.RegistryInfo memory bundleInfo = this
43
- .getRegistry()
44
- .getInfo(bundleNftId);
49
+ // IRegistry.RegistryInfo memory bundleInfo = this
50
+ // .getRegistry()
51
+ // .getInfo(bundleNftId);
45
52
  // IRegistry.RegistryInfo memory poolInfo = this.getRegistry().getInfo(bundleInfo.parentNftId);
46
53
  }
47
54
 
48
55
  nftId = this.getRegistry().registerObjectForInstance(
49
56
  productInfo.nftId,
50
- this.getRegistry().POLICY(),
57
+ POLICY(),
51
58
  applicationOwner
52
59
  );
53
60
 
54
61
  _policyInfo[nftId] = PolicyInfo(
55
62
  nftId,
56
- PolicyState.Applied,
63
+ _lifecycleModule.getInitialState(POLICY()),
57
64
  sumInsuredAmount,
58
65
  premiumAmount,
66
+ 0, // premium paid amount
59
67
  lifetime,
60
- block.timestamp,
68
+ // solhint-disable-next-line not-rely-on-time
69
+ block.timestamp, // createdAt
70
+ // solhint-disable-next-line not-rely-on-time
71
+ block.timestamp, // updatedAt
61
72
  0, // activatedAt
62
73
  0, // expiredAt
63
74
  0 // closedAt
@@ -68,13 +79,25 @@ abstract contract PolicyModule is IRegistryLinked, IPolicyModule {
68
79
  // add logging
69
80
  }
70
81
 
82
+ function processPremium(NftId nftId) external override onlyProductService2 {
83
+ PolicyInfo storage info = _policyInfo[nftId];
84
+ info.premiumPaidAmount = info.premiumAmount;
85
+ // solhint-disable-next-line not-rely-on-time
86
+ info.updatedAt = block.timestamp;
87
+ }
88
+
71
89
  function activate(NftId nftId) external override onlyProductService2 {
72
90
  PolicyInfo storage info = _policyInfo[nftId];
91
+ // solhint-disable-next-line not-rely-on-time
73
92
  info.activatedAt = block.timestamp;
93
+ // solhint-disable-next-line not-rely-on-time
74
94
  info.expiredAt = block.timestamp + info.lifetime;
75
- info.state = PolicyState.Active;
76
-
77
- // add logging
95
+ info.state = _lifecycleModule.checkAndLogTransition(
96
+ nftId,
97
+ POLICY(),
98
+ info.state,
99
+ ACTIVE()
100
+ );
78
101
  }
79
102
 
80
103
  function getBundleNftForPolicy(
@@ -7,21 +7,15 @@ import {NftId} from "../../types/NftId.sol";
7
7
  interface IPool {
8
8
  struct PoolInfo {
9
9
  NftId nftId;
10
- address wallet;
11
- address token;
12
10
  uint256 capital;
13
11
  uint256 lockedCapital;
14
12
  }
15
13
  }
16
14
 
17
15
  interface IPoolModule is IOwnable, IRegistryLinked, IPool {
18
- function underwrite(NftId poolNftId, NftId policyNftId) external;
16
+ function underwrite(NftId policyNftId, NftId productNftId) external;
19
17
 
20
- function createPoolInfo(
21
- NftId nftId,
22
- address wallet,
23
- address token
24
- ) external;
18
+ function registerPool(NftId nftId) external;
25
19
 
26
20
  function getPoolInfo(
27
21
  NftId nftId
@@ -4,6 +4,7 @@ pragma solidity ^0.8.19;
4
4
  import {IOwnable, IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
5
5
  import {IProductService} from "../product/IProductService.sol";
6
6
  import {IPolicy, IPolicyModule} from "../policy/IPolicy.sol";
7
+ import {ITreasuryModule} from "../treasury/ITreasury.sol";
7
8
  import {IPoolModule} from "./IPoolModule.sol";
8
9
  import {NftId, NftIdLib} from "../../types/NftId.sol";
9
10
 
@@ -11,9 +12,12 @@ abstract contract PoolModule is IPoolModule {
11
12
  using NftIdLib for NftId;
12
13
 
13
14
  uint256 public constant INITIAL_CAPITAL = 10000 * 10 ** 6;
15
+ uint256 public constant INITIAL_LOCKED_CAPITAL = 0;
14
16
 
15
17
  mapping(NftId nftId => PoolInfo info) private _poolInfo;
16
18
 
19
+ IPolicyModule private _policyModule;
20
+ ITreasuryModule private _treasuryModule;
17
21
  IProductService private _productService;
18
22
 
19
23
  modifier onlyProductService() {
@@ -25,41 +29,45 @@ abstract contract PoolModule is IPoolModule {
25
29
  }
26
30
 
27
31
  constructor(address productService) {
32
+ _policyModule = IPolicyModule(address(this));
33
+ _treasuryModule = ITreasuryModule(address(this));
28
34
  _productService = IProductService(productService);
29
35
  }
30
36
 
31
- function createPoolInfo(
32
- NftId nftId,
33
- address wallet,
34
- address token
35
- ) public override {
37
+ function registerPool(NftId nftId) public override {
36
38
  require(_poolInfo[nftId].nftId.eqz(), "ERROR:PL-001:ALREADY_CREATED");
37
39
 
38
40
  _poolInfo[nftId] = PoolInfo(
39
41
  nftId,
40
- wallet,
41
- token,
42
42
  INITIAL_CAPITAL,
43
- 0 // locked capital
43
+ INITIAL_LOCKED_CAPITAL
44
44
  );
45
45
  }
46
46
 
47
47
  function underwrite(
48
- NftId poolNftId,
49
- NftId policyNftId
48
+ NftId policyNftId,
49
+ NftId productNftId
50
50
  ) external override onlyProductService {
51
- PoolInfo storage poolInfo = _poolInfo[poolNftId];
52
- require(poolInfo.nftId == poolNftId, "ERROR:PL-002:POOL_UNKNOWN");
53
-
54
- IPolicyModule policyModule = IPolicyModule(address(this));
55
- IPolicy.PolicyInfo memory policyInfo = policyModule.getPolicyInfo(
51
+ IPolicy.PolicyInfo memory policyInfo = _policyModule.getPolicyInfo(
56
52
  policyNftId
57
53
  );
54
+ require(policyInfo.nftId == policyNftId, "ERROR:PL-002:POLICY_UNKNOWN");
55
+
56
+ ITreasuryModule.ProductSetup memory product = _treasuryModule
57
+ .getProductSetup(productNftId);
58
+ require(
59
+ product.productNftId == productNftId,
60
+ "ERROR:PL-003:PRODUCT_SETUP_MISSING"
61
+ );
62
+
63
+ NftId poolNftId = product.poolNftId;
64
+ PoolInfo storage poolInfo = _poolInfo[poolNftId];
65
+ require(poolInfo.nftId == poolNftId, "ERROR:PL-004:POOL_UNKNOWN");
58
66
 
59
67
  require(
60
68
  poolInfo.capital - poolInfo.lockedCapital >=
61
69
  policyInfo.sumInsuredAmount,
62
- "ERROR:PL-003:CAPACITY_TOO_LOW"
70
+ "ERROR:PL-005:CAPACITY_TOO_LOW"
63
71
  );
64
72
 
65
73
  poolInfo.lockedCapital += policyInfo.sumInsuredAmount;
@@ -23,7 +23,7 @@ interface IProductService is IRegistryLinked {
23
23
  // function expire(uint256 nftId) external;
24
24
  function close(NftId nftId) external;
25
25
 
26
- // function collectPremium(uint256 nftId, uint256 premiumAmount) external;
26
+ function collectPremium(NftId nftId) external;
27
27
 
28
28
  // function createClaim(uint256 nftId, uint256 claimAmount) external;
29
29
  // function confirmClaim(uint256 nftId, uint256 claimId, uint256 claimAmount) external;
@@ -8,15 +8,21 @@ import {IRegistry} from "../../registry/IRegistry.sol";
8
8
  import {IPolicyModule} from "../policy/IPolicy.sol";
9
9
  import {RegistryLinked} from "../../registry/Registry.sol";
10
10
  import {IProductService, IProductModule} from "./IProductService.sol";
11
- import {IComponentModule} from "../../instance/component/IComponent.sol";
11
+ import {ITreasuryModule} from "../../instance/treasury/ITreasury.sol";
12
12
  import {IPoolModule} from "../../instance/pool/IPoolModule.sol";
13
+ import {ObjectType, INSTANCE, PRODUCT} from "../../types/ObjectType.sol";
13
14
  import {NftId, NftIdLib} from "../../types/NftId.sol";
14
15
 
15
16
  // TODO or name this ProtectionService to have Product be something more generic (loan, savings account, ...)
16
17
  contract ProductService is RegistryLinked, IProductService {
17
18
  using NftIdLib for NftId;
18
19
 
19
- constructor(address registry) RegistryLinked(registry) {}
20
+ constructor(
21
+ address registry
22
+ ) RegistryLinked(registry) // solhint-disable-next-line no-empty-blocks
23
+ {
24
+
25
+ }
20
26
 
21
27
  function createApplication(
22
28
  address applicationOwner,
@@ -31,19 +37,13 @@ contract ProductService is RegistryLinked, IProductService {
31
37
  IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
32
38
  productNftId
33
39
  );
34
- require(
35
- productInfo.objectType == _registry.PRODUCT(),
36
- "ERROR_NOT_PRODUCT"
37
- );
40
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
38
41
 
39
42
  IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
40
43
  productInfo.parentNftId
41
44
  );
42
45
  require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
43
- require(
44
- instanceInfo.objectType == _registry.INSTANCE(),
45
- "ERROR_NOT_INSTANCE"
46
- );
46
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
47
47
 
48
48
  IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
49
49
  nftId = policyModule.createApplication(
@@ -58,45 +58,69 @@ contract ProductService is RegistryLinked, IProductService {
58
58
  // add logging
59
59
  }
60
60
 
61
- function underwrite(NftId nftId) external override {
61
+ function underwrite(NftId policyNftId) external override {
62
+ // validation
62
63
  // same as only registered product
63
64
  NftId productNftId = _registry.getNftId(msg.sender);
64
65
  require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
65
66
  IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
66
67
  productNftId
67
68
  );
68
- require(
69
- productInfo.objectType == _registry.PRODUCT(),
70
- "ERROR_NOT_PRODUCT"
71
- );
69
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
72
70
 
73
71
  IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
74
72
  productInfo.parentNftId
75
73
  );
76
74
  require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
77
- require(
78
- instanceInfo.objectType == _registry.INSTANCE(),
79
- "ERROR_NOT_INSTANCE"
75
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
76
+
77
+ // underwrite policy
78
+ address instanceAddress = instanceInfo.objectAddress;
79
+ IPoolModule poolModule = IPoolModule(instanceAddress);
80
+ poolModule.underwrite(policyNftId, productNftId);
81
+
82
+ // activate policy
83
+ IPolicyModule policyModule = IPolicyModule(instanceAddress);
84
+ policyModule.activate(policyNftId);
85
+
86
+ // add logging
87
+ }
88
+
89
+ function collectPremium(NftId policyNftId) external override {
90
+ // validation same as other functions, eg underwrite
91
+ // TODO unify validation into modifier and/or other suitable approaches
92
+ // same as only registered product
93
+ NftId productNftId = _registry.getNftId(msg.sender);
94
+ require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
95
+ IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
96
+ productNftId
80
97
  );
98
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
81
99
 
82
- // get responsible pool
83
- IComponentModule componentModule = IComponentModule(
84
- instanceInfo.objectAddress
100
+ IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
101
+ productInfo.parentNftId
85
102
  );
86
- NftId poolNftId = componentModule.getPoolNftId(productNftId);
103
+ require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
104
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
87
105
 
88
- // lock capital (and update pool accounting)
89
- IPoolModule poolModule = IPoolModule(instanceInfo.objectAddress);
90
- poolModule.underwrite(poolNftId, nftId);
106
+ // process/collect premium: book keeping for policy
107
+ address instanceAddress = instanceInfo.objectAddress;
108
+ IPolicyModule policyModule = IPolicyModule(instanceAddress);
109
+ policyModule.processPremium(policyNftId);
91
110
 
92
- // activate policy
93
- IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
94
- policyModule.activate(nftId);
111
+ // process/collect premium: actual token transfer
112
+ ITreasuryModule treasuryModule = ITreasuryModule(instanceAddress);
113
+ treasuryModule.processPremium(policyNftId, productNftId);
95
114
 
96
- // add logging
115
+ // TODO add logging
97
116
  }
98
117
 
99
- function close(NftId nftId) external override {}
118
+ function close(
119
+ NftId policyNftId
120
+ ) external override // solhint-disable-next-line no-empty-blocks
121
+ {
122
+
123
+ }
100
124
  }
101
125
 
102
126
  abstract contract ProductModule is IProductModule {
@@ -0,0 +1,91 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5
+
6
+ import {IRegistryLinked} from "../../registry/IRegistry.sol";
7
+
8
+ import {NftId} from "../../types/NftId.sol";
9
+ import {UFixed} from "../../types/UFixed.sol";
10
+ import {Fee} from "../../types/Fee.sol";
11
+
12
+ import {TokenHandler} from "./TokenHandler.sol";
13
+
14
+ interface ITreasury {
15
+ // TODO add events
16
+ // TODO add errors
17
+ }
18
+
19
+ interface ITreasuryModule is IRegistryLinked, ITreasury {
20
+ struct ProductSetup {
21
+ NftId productNftId;
22
+ NftId distributorNftId;
23
+ NftId poolNftId;
24
+ IERC20 token;
25
+ TokenHandler tokenHandler;
26
+ address wallet;
27
+ Fee policyFee;
28
+ Fee processingFee;
29
+ }
30
+
31
+ struct DistributorSetup {
32
+ NftId distributorNftId;
33
+ address wallet;
34
+ Fee commissionFees;
35
+ }
36
+
37
+ struct PoolSetup {
38
+ NftId poolNftId;
39
+ address wallet;
40
+ Fee stakingFee;
41
+ Fee performanceFee;
42
+ }
43
+
44
+ function registerProduct(
45
+ NftId productNftId,
46
+ NftId distributorNftId,
47
+ NftId poolNftId,
48
+ IERC20 token,
49
+ address wallet,
50
+ Fee memory policyFee,
51
+ Fee memory processingFee
52
+ ) external;
53
+
54
+ function setProductFees(
55
+ NftId productNftId,
56
+ Fee memory policyFee,
57
+ Fee memory processingFee
58
+ ) external;
59
+
60
+ function registerPool(
61
+ NftId poolNftId,
62
+ address wallet,
63
+ Fee memory stakingFee,
64
+ Fee memory performanceFee
65
+ ) external;
66
+
67
+ function setPoolFees(
68
+ NftId poolNftId,
69
+ Fee memory stakingFee,
70
+ Fee memory performanceFee
71
+ ) external;
72
+
73
+ function processPremium(NftId policyNftId, NftId productNftId) external;
74
+
75
+ function getTokenHandler(
76
+ NftId productNftId
77
+ ) external view returns (TokenHandler tokenHandler);
78
+
79
+ function getProductSetup(
80
+ NftId productNftId
81
+ ) external view returns (ProductSetup memory setup);
82
+
83
+ function getPoolSetup(
84
+ NftId poolNftId
85
+ ) external view returns (PoolSetup memory setup);
86
+
87
+ function calculateFeeAmount(
88
+ uint256 amount,
89
+ Fee memory fee
90
+ ) external pure returns (uint256 feeAmount, uint256 netAmount);
91
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5
+
6
+ contract TokenHandler {
7
+ // TODO use oz safeTransferFrom
8
+
9
+ IERC20 _token;
10
+
11
+ constructor(address token) {
12
+ _token = IERC20(token);
13
+ }
14
+
15
+ // TODO add logging
16
+ function transfer(
17
+ address from,
18
+ address to,
19
+ uint256 amount
20
+ ) external // TODO add authz (only treasury)
21
+ {
22
+ _token.transferFrom(from, to, amount);
23
+ }
24
+ }