@etherisc/gif-next 0.0.2-ed4dd55 → 0.0.2-f619be3-760

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 (183) hide show
  1. package/README.md +49 -0
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
  3. package/artifacts/contracts/components/Component.sol/Component.json +35 -9
  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 +84 -8
  8. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +34 -152
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +146 -13
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  13. package/artifacts/contracts/components/Product.sol/Product.json +148 -15
  14. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +4 -0
  15. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +105 -0
  16. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +4 -0
  17. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +105 -0
  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 +714 -127
  44. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  45. package/artifacts/contracts/instance/Instance.sol/Instance.json +845 -129
  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 +31 -59
  53. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +1 -1
  54. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +103 -6
  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 +34 -8
  58. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +31 -59
  60. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +1 -1
  61. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +50 -3
  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 +44 -21
  72. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  73. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +44 -21
  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 +23 -43
  77. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  78. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +28 -35
  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 +21 -8
  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 +85 -14
  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 +8 -8
  107. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  108. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +20 -111
  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 +9 -9
  112. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  113. package/artifacts/contracts/registry/Registry.sol/Registry.json +66 -115
  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 +4 -0
  117. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +174 -0
  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 +85 -3
  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 +4 -0
  127. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +174 -0
  128. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +4 -0
  129. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +479 -0
  130. package/contracts/components/Component.sol +39 -24
  131. package/contracts/components/IPool.sol +9 -3
  132. package/contracts/components/IProduct.sol +11 -6
  133. package/contracts/components/Pool.sol +37 -14
  134. package/contracts/components/Product.sol +48 -24
  135. package/contracts/experiment/errors/Require.sol +38 -0
  136. package/contracts/experiment/errors/Revert.sol +44 -0
  137. package/contracts/experiment/inheritance/A.sol +8 -11
  138. package/contracts/experiment/inheritance/B.sol +10 -5
  139. package/contracts/experiment/inheritance/C.sol +11 -5
  140. package/contracts/experiment/inheritance/IA.sol +2 -7
  141. package/contracts/experiment/inheritance/IB.sol +3 -2
  142. package/contracts/experiment/inheritance/IC.sol +4 -3
  143. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  144. package/contracts/experiment/statemachine/ISM.sol +25 -0
  145. package/contracts/experiment/statemachine/README.md +112 -0
  146. package/contracts/experiment/statemachine/SM.sol +57 -0
  147. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  148. package/contracts/experiment/types/TypeA.sol +14 -9
  149. package/contracts/experiment/types/TypeB.sol +14 -9
  150. package/contracts/instance/IInstance.sol +8 -3
  151. package/contracts/instance/Instance.sol +24 -15
  152. package/contracts/instance/access/Access.sol +63 -116
  153. package/contracts/instance/access/IAccess.sol +28 -48
  154. package/contracts/instance/component/ComponentModule.sol +162 -147
  155. package/contracts/instance/component/IComponent.sol +41 -61
  156. package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
  157. package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
  158. package/contracts/instance/policy/IPolicy.sol +19 -35
  159. package/contracts/instance/policy/PolicyModule.sol +52 -44
  160. package/contracts/instance/pool/IPoolModule.sol +9 -26
  161. package/contracts/instance/pool/PoolModule.sol +43 -45
  162. package/contracts/instance/product/IProductService.sol +10 -19
  163. package/contracts/instance/product/ProductService.sol +86 -55
  164. package/contracts/instance/treasury/ITreasury.sol +91 -0
  165. package/contracts/instance/treasury/TokenHandler.sol +24 -0
  166. package/contracts/instance/treasury/TreasuryModule.sol +168 -0
  167. package/contracts/mock/Dip.sol +26 -0
  168. package/contracts/mock/TestPool.sol +16 -0
  169. package/contracts/mock/TestProduct.sol +39 -0
  170. package/contracts/mock/Usdc.sol +26 -0
  171. package/contracts/registry/ChainNft.sol +23 -61
  172. package/contracts/registry/IChainNft.sol +10 -7
  173. package/contracts/registry/IRegistry.sol +40 -41
  174. package/contracts/registry/Registry.sol +73 -67
  175. package/contracts/types/Blocknumber.sol +118 -0
  176. package/contracts/types/ChainId.sol +24 -10
  177. package/contracts/types/Fee.sol +32 -0
  178. package/contracts/types/NftId.sol +36 -10
  179. package/contracts/types/ObjectType.sol +107 -0
  180. package/contracts/types/StateId.sol +91 -0
  181. package/contracts/types/Timestamp.sol +102 -0
  182. package/contracts/types/UFixed.sol +210 -0
  183. package/package.json +14 -5
@@ -1,7 +1,6 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.19;
3
3
 
4
-
5
4
  // import {IProduct} from "../../components/IProduct.sol";
6
5
  // import {IOwnable, IRegistryLinked, IRegisterable, IRegistry} from "../../registry/IRegistry.sol";
7
6
  // import {IInstance} from "../IInstance.sol";
@@ -9,39 +8,42 @@ import {IRegistry} from "../../registry/IRegistry.sol";
9
8
  import {IPolicyModule} from "../policy/IPolicy.sol";
10
9
  import {RegistryLinked} from "../../registry/Registry.sol";
11
10
  import {IProductService, IProductModule} from "./IProductService.sol";
12
- import {IComponentModule} from "../../instance/component/IComponent.sol";
11
+ import {ITreasuryModule} from "../../instance/treasury/ITreasury.sol";
13
12
  import {IPoolModule} from "../../instance/pool/IPoolModule.sol";
13
+ import {ObjectType, INSTANCE, PRODUCT} from "../../types/ObjectType.sol";
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
- contract ProductService is
17
- RegistryLinked,
18
- IProductService
19
- {
20
- constructor(address registry)
21
- RegistryLinked(registry)
22
- { }
17
+ contract ProductService is RegistryLinked, IProductService {
18
+ using NftIdLib for NftId;
23
19
 
20
+ constructor(
21
+ address registry
22
+ ) RegistryLinked(registry) // solhint-disable-next-line no-empty-blocks
23
+ {
24
+
25
+ }
24
26
 
25
27
  function createApplication(
26
28
  address applicationOwner,
27
29
  uint256 sumInsuredAmount,
28
30
  uint256 premiumAmount,
29
31
  uint256 lifetime,
30
- uint256 bundleNftId
31
- )
32
- external
33
- override
34
- returns(uint256 nftId)
35
- {
32
+ NftId bundleNftId
33
+ ) external override returns (NftId nftId) {
36
34
  // same as only registered product
37
- uint256 productNftId = _registry.getNftId(msg.sender);
38
- require(productNftId > 0, "ERROR_PRODUCT_UNKNOWN");
39
- IRegistry.RegistryInfo memory productInfo = _registry.getInfo(productNftId);
40
- require(productInfo.objectType == _registry.PRODUCT(), "ERROR_NOT_PRODUCT");
41
-
42
- IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(productInfo.parentNftId);
43
- require(instanceInfo.nftId > 0, "ERROR_INSTANCE_UNKNOWN");
44
- require(instanceInfo.objectType == _registry.INSTANCE(), "ERROR_NOT_INSTANCE");
35
+ NftId productNftId = _registry.getNftId(msg.sender);
36
+ require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
37
+ IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
38
+ productNftId
39
+ );
40
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
41
+
42
+ IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
43
+ productInfo.parentNftId
44
+ );
45
+ require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
46
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
45
47
 
46
48
  IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
47
49
  nftId = policyModule.createApplication(
@@ -50,56 +52,85 @@ contract ProductService is
50
52
  sumInsuredAmount,
51
53
  premiumAmount,
52
54
  lifetime,
53
- bundleNftId);
55
+ bundleNftId
56
+ );
54
57
 
55
58
  // add logging
56
59
  }
57
60
 
58
- function underwrite(uint256 nftId)
59
- external
60
- override
61
- {
61
+ function underwrite(NftId policyNftId) external override {
62
+ // validation
62
63
  // same as only registered product
63
- uint256 productNftId = _registry.getNftId(msg.sender);
64
- require(productNftId > 0, "ERROR_PRODUCT_UNKNOWN");
65
- IRegistry.RegistryInfo memory productInfo = _registry.getInfo(productNftId);
66
- require(productInfo.objectType == _registry.PRODUCT(), "ERROR_NOT_PRODUCT");
67
-
68
- IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(productInfo.parentNftId);
69
- require(instanceInfo.nftId > 0, "ERROR_INSTANCE_UNKNOWN");
70
- require(instanceInfo.objectType == _registry.INSTANCE(), "ERROR_NOT_INSTANCE");
71
-
72
- // get responsible pool
73
- IComponentModule componentModule = IComponentModule(instanceInfo.objectAddress);
74
- uint256 poolNftId = componentModule.getPoolNftId(productNftId);
75
-
76
- // lock capital (and update pool accounting)
77
- IPoolModule poolModule = IPoolModule(instanceInfo.objectAddress);
78
- poolModule.underwrite(
79
- poolNftId,
80
- nftId);
64
+ NftId productNftId = _registry.getNftId(msg.sender);
65
+ require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
66
+ IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
67
+ productNftId
68
+ );
69
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
70
+
71
+ IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
72
+ productInfo.parentNftId
73
+ );
74
+ require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
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
81
 
82
82
  // activate policy
83
- IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
84
- policyModule.activate(nftId);
83
+ IPolicyModule policyModule = IPolicyModule(instanceAddress);
84
+ policyModule.activate(policyNftId);
85
85
 
86
86
  // add logging
87
87
  }
88
88
 
89
- function close(uint256 nftId) external override {}
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
97
+ );
98
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
99
+
100
+ IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
101
+ productInfo.parentNftId
102
+ );
103
+ require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
104
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
105
+
106
+ // process/collect premium: book keeping for policy
107
+ address instanceAddress = instanceInfo.objectAddress;
108
+ IPolicyModule policyModule = IPolicyModule(instanceAddress);
109
+ policyModule.processPremium(policyNftId);
110
+
111
+ // process/collect premium: actual token transfer
112
+ ITreasuryModule treasuryModule = ITreasuryModule(instanceAddress);
113
+ treasuryModule.processPremium(policyNftId, productNftId);
114
+
115
+ // TODO add logging
116
+ }
117
+
118
+ function close(
119
+ NftId policyNftId
120
+ ) external override // solhint-disable-next-line no-empty-blocks
121
+ {
122
+
123
+ }
90
124
  }
91
125
 
92
- abstract contract ProductModule is
93
- IProductModule
94
- {
126
+ abstract contract ProductModule is IProductModule {
95
127
  IProductService private _productService;
96
128
 
97
129
  constructor(address productService) {
98
130
  _productService = IProductService(productService);
99
131
  }
100
132
 
101
- function getProductService() external view returns(IProductService) {
133
+ function getProductService() external view returns (IProductService) {
102
134
  return _productService;
103
135
  }
104
-
105
- }
136
+ }
@@ -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
+ }
@@ -0,0 +1,168 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5
+
6
+ import {NftId} from "../../types/NftId.sol";
7
+ import {Fee, feeIsZero} from "../../types/Fee.sol";
8
+ import {UFixed, UFixedMathLib} from "../../types/UFixed.sol";
9
+ import {IProductComponent} from "../../components/IProduct.sol";
10
+ import {IPolicy, IPolicyModule} from "../policy/IPolicy.sol";
11
+ import {TokenHandler} from "./TokenHandler.sol";
12
+ import {ITreasuryModule} from "./ITreasury.sol";
13
+ import {TokenHandler} from "./TokenHandler.sol";
14
+
15
+ abstract contract TreasuryModule is ITreasuryModule {
16
+ mapping(NftId productNftId => ProductSetup setup) private _productSetup;
17
+ mapping(NftId distributorNftId => DistributorSetup setup)
18
+ private _distributorSetup;
19
+ mapping(NftId poolNftId => PoolSetup setup) private _poolSetup;
20
+
21
+ IPolicyModule private _policyModule;
22
+
23
+ constructor() {
24
+ _policyModule = IPolicyModule(address(this));
25
+ }
26
+
27
+ function registerProduct(
28
+ NftId productNftId,
29
+ NftId distributorNftId,
30
+ NftId poolNftId,
31
+ IERC20 token,
32
+ address wallet,
33
+ Fee memory policyFee,
34
+ Fee memory processingFee
35
+ ) external override // TODO add authz (only component module)
36
+ {
37
+ // TODO add validation
38
+
39
+ // deploy product specific handler contract
40
+ TokenHandler tokenHandler = new TokenHandler(address(token));
41
+
42
+ _productSetup[productNftId] = ProductSetup(
43
+ productNftId,
44
+ distributorNftId,
45
+ poolNftId,
46
+ token,
47
+ tokenHandler,
48
+ wallet,
49
+ policyFee,
50
+ processingFee
51
+ );
52
+
53
+ // TODO add logging
54
+ }
55
+
56
+ function setProductFees(
57
+ NftId productNftId,
58
+ Fee memory policyFee,
59
+ Fee memory processingFee
60
+ ) external override // TODO add authz (only component owner service)
61
+ {
62
+ // TODO add validation
63
+
64
+ ProductSetup storage setup = _productSetup[productNftId];
65
+ setup.policyFee = policyFee;
66
+ setup.processingFee = processingFee;
67
+
68
+ // TODO add logging
69
+ }
70
+
71
+ function registerPool(
72
+ NftId poolNftId,
73
+ address wallet,
74
+ Fee memory stakingFee,
75
+ Fee memory performanceFee
76
+ ) external override // TODO add authz (only component module)
77
+ {
78
+ // TODO add validation
79
+
80
+ _poolSetup[poolNftId] = PoolSetup(
81
+ poolNftId,
82
+ wallet,
83
+ stakingFee,
84
+ performanceFee
85
+ );
86
+
87
+ // TODO add logging
88
+ }
89
+
90
+ function setPoolFees(
91
+ NftId poolNftId,
92
+ Fee memory stakingFee,
93
+ Fee memory performanceFee
94
+ ) external override // TODO add authz (only component owner service)
95
+ {
96
+ // TODO add validation
97
+
98
+ PoolSetup storage setup = _poolSetup[poolNftId];
99
+ setup.stakingFee = stakingFee;
100
+ setup.performanceFee = performanceFee;
101
+
102
+ // TODO add logging
103
+ }
104
+
105
+ function getTokenHandler(
106
+ NftId productNftId
107
+ ) external view override returns (TokenHandler tokenHandler) {
108
+ return _productSetup[productNftId].tokenHandler;
109
+ }
110
+
111
+ function getProductSetup(
112
+ NftId productNftId
113
+ ) external view override returns (ProductSetup memory setup) {
114
+ return _productSetup[productNftId];
115
+ }
116
+
117
+ function getPoolSetup(
118
+ NftId poolNftId
119
+ ) external view override returns (PoolSetup memory setup) {
120
+ return _poolSetup[poolNftId];
121
+ }
122
+
123
+ function processPremium(
124
+ NftId policyNftId,
125
+ NftId productNftId
126
+ ) external override // TODO add authz (only product service)
127
+ {
128
+ IPolicy.PolicyInfo memory policyInfo = _policyModule.getPolicyInfo(
129
+ policyNftId
130
+ );
131
+ require(
132
+ policyInfo.nftId == policyNftId,
133
+ "ERROR:TRS-020:POLICY_UNKNOWN"
134
+ );
135
+
136
+ ProductSetup memory product = _productSetup[productNftId];
137
+ TokenHandler tokenHandler = product.tokenHandler;
138
+ address policyOwner = this.getRegistry().getOwner(policyNftId);
139
+ address poolWallet = _poolSetup[product.poolNftId].wallet;
140
+ // TODO add validation
141
+
142
+ if (feeIsZero(product.policyFee)) {
143
+ tokenHandler.transfer(
144
+ policyOwner,
145
+ poolWallet,
146
+ policyInfo.premiumAmount
147
+ );
148
+ } else {
149
+ (uint256 feeAmount, uint256 netAmount) = calculateFeeAmount(
150
+ policyInfo.premiumAmount,
151
+ product.policyFee
152
+ );
153
+
154
+ tokenHandler.transfer(policyOwner, product.wallet, feeAmount);
155
+ tokenHandler.transfer(policyOwner, poolWallet, netAmount);
156
+ }
157
+ }
158
+
159
+ function calculateFeeAmount(
160
+ uint256 amount,
161
+ Fee memory fee
162
+ ) public pure override returns (uint256 feeAmount, uint256 netAmount) {
163
+ UFixed fractionalAmount = UFixedMathLib.itof(amount) *
164
+ fee.fractionalFee;
165
+ feeAmount = UFixedMathLib.ftoi(fractionalAmount) + fee.fixedFee;
166
+ netAmount = amount - feeAmount;
167
+ }
168
+ }
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5
+
6
+ contract DIP is ERC20 {
7
+
8
+ // https://etherscan.io/token/0xc719d010b63e5bbf2c0551872cd5316ed26acd83#readContract
9
+ string public constant NAME = "Decentralized Insurance Protocol - DUMMY";
10
+ string public constant SYMBOL = "DIP";
11
+ uint8 public constant DECIMALS = 18;
12
+ uint256 public constant INITIAL_SUPPLY = 10**9 * 10**DECIMALS; // 1 Billion 1'000'000'000
13
+ // decimals == 18 (openzeppelin erc20 default)
14
+ constructor()
15
+ ERC20(NAME, SYMBOL)
16
+ {
17
+ _mint(
18
+ _msgSender(),
19
+ INITIAL_SUPPLY
20
+ );
21
+ }
22
+
23
+ function decimals() public pure override returns(uint8) {
24
+ return DECIMALS;
25
+ }
26
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {Fee, zeroFee} from "../../contracts/types/Fee.sol";
5
+ import {Pool} from "../../contracts/components/Pool.sol";
6
+
7
+
8
+ contract TestPool is Pool {
9
+
10
+ constructor(address registry, address instance, address token)
11
+ // feeless pool (no staking fee, no performance fee)
12
+ Pool(registry, instance, token, zeroFee(), zeroFee())
13
+ // solhint-disable-next-line no-empty-blocks
14
+ {}
15
+
16
+ }
@@ -0,0 +1,39 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {Product} from "../../contracts/components/Product.sol";
5
+ import {NftId, toNftId} from "../../contracts/types/NftId.sol";
6
+ import {Fee, zeroFee} from "../../contracts/types/Fee.sol";
7
+
8
+ contract TestProduct is Product {
9
+
10
+ constructor(address registry, address instance, address token, address pool, Fee memory policyFee)
11
+ Product(registry, instance, token, pool, policyFee, zeroFee())
12
+ // solhint-disable-next-line no-empty-blocks
13
+ {}
14
+
15
+ function applyForPolicy(
16
+ uint256 sumInsuredAmount,
17
+ uint256 premiumAmount,
18
+ uint256 lifetime
19
+ )
20
+ external
21
+ returns(NftId nftId)
22
+ {
23
+ nftId = _createApplication(
24
+ msg.sender, // policy holder
25
+ sumInsuredAmount,
26
+ premiumAmount,
27
+ lifetime,
28
+ toNftId(0) // requested bundle nft id
29
+ );
30
+ }
31
+
32
+ function underwrite(NftId nftId) external {
33
+ _underwrite(nftId);
34
+ }
35
+
36
+ function collectPremium(NftId nftId) external {
37
+ _collectPremium(nftId);
38
+ }
39
+ }
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5
+
6
+ contract USDC is ERC20 {
7
+
8
+ // https://etherscan.io/token/0xc719d010b63e5bbf2c0551872cd5316ed26acd83#readContract
9
+ string public constant NAME = "USDC - DUMMY";
10
+ string public constant SYMBOL = "USDC";
11
+ uint8 public constant DECIMALS = 6;
12
+ uint256 public constant INITIAL_SUPPLY = 10**9 * 10**DECIMALS; // 1 Billion 1'000'000'000
13
+ // decimals == 18 (openzeppelin erc20 default)
14
+ constructor()
15
+ ERC20(NAME, SYMBOL)
16
+ {
17
+ _mint(
18
+ _msgSender(),
19
+ INITIAL_SUPPLY
20
+ );
21
+ }
22
+
23
+ function decimals() public pure override returns(uint8) {
24
+ return DECIMALS;
25
+ }
26
+ }