@etherisc/gif-next 0.0.2-ed4dd55 → 0.0.2-f824182-503

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 (171) hide show
  1. package/README.md +25 -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/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  94. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
  95. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  96. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +1 -1
  97. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +1 -1
  98. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +8 -8
  99. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  100. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +20 -111
  101. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +1 -1
  102. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +1 -1
  103. package/artifacts/contracts/registry/Registry.sol/Registerable.json +9 -9
  104. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  105. package/artifacts/contracts/registry/Registry.sol/Registry.json +66 -115
  106. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +1 -1
  107. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +2 -2
  108. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +4 -0
  109. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +174 -0
  110. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  111. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  112. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  113. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +85 -3
  114. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  115. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  116. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  117. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  118. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +4 -0
  119. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +174 -0
  120. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +4 -0
  121. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +453 -0
  122. package/contracts/components/Component.sol +39 -24
  123. package/contracts/components/IPool.sol +9 -3
  124. package/contracts/components/IProduct.sol +11 -6
  125. package/contracts/components/Pool.sol +37 -14
  126. package/contracts/components/Product.sol +48 -24
  127. package/contracts/experiment/errors/Require.sol +38 -0
  128. package/contracts/experiment/errors/Revert.sol +44 -0
  129. package/contracts/experiment/inheritance/A.sol +8 -11
  130. package/contracts/experiment/inheritance/B.sol +10 -5
  131. package/contracts/experiment/inheritance/C.sol +11 -5
  132. package/contracts/experiment/inheritance/IA.sol +2 -7
  133. package/contracts/experiment/inheritance/IB.sol +3 -2
  134. package/contracts/experiment/inheritance/IC.sol +4 -3
  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/experiment/types/TypeA.sol +14 -9
  141. package/contracts/experiment/types/TypeB.sol +14 -9
  142. package/contracts/instance/IInstance.sol +8 -3
  143. package/contracts/instance/Instance.sol +24 -15
  144. package/contracts/instance/access/Access.sol +63 -116
  145. package/contracts/instance/access/IAccess.sol +28 -48
  146. package/contracts/instance/component/ComponentModule.sol +162 -147
  147. package/contracts/instance/component/IComponent.sol +41 -61
  148. package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
  149. package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
  150. package/contracts/instance/policy/IPolicy.sol +19 -35
  151. package/contracts/instance/policy/PolicyModule.sol +52 -44
  152. package/contracts/instance/pool/IPoolModule.sol +9 -26
  153. package/contracts/instance/pool/PoolModule.sol +43 -45
  154. package/contracts/instance/product/IProductService.sol +10 -19
  155. package/contracts/instance/product/ProductService.sol +86 -55
  156. package/contracts/instance/treasury/ITreasury.sol +91 -0
  157. package/contracts/instance/treasury/TokenHandler.sol +24 -0
  158. package/contracts/instance/treasury/TreasuryModule.sol +168 -0
  159. package/contracts/registry/ChainNft.sol +23 -61
  160. package/contracts/registry/IChainNft.sol +10 -7
  161. package/contracts/registry/IRegistry.sol +40 -41
  162. package/contracts/registry/Registry.sol +73 -67
  163. package/contracts/types/Blocknumber.sol +118 -0
  164. package/contracts/types/ChainId.sol +24 -10
  165. package/contracts/types/Fee.sol +32 -0
  166. package/contracts/types/NftId.sol +36 -10
  167. package/contracts/types/ObjectType.sol +107 -0
  168. package/contracts/types/StateId.sol +91 -0
  169. package/contracts/types/Timestamp.sol +102 -0
  170. package/contracts/types/UFixed.sol +206 -0
  171. package/package.json +10 -4
@@ -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
+ }
@@ -4,10 +4,7 @@ pragma solidity ^0.8.19;
4
4
  import {ERC721, ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
5
5
  import {IChainNft} from "./IChainNft.sol";
6
6
 
7
- contract ChainNft is
8
- ERC721Enumerable,
9
- IChainNft
10
- {
7
+ contract ChainNft is ERC721Enumerable, IChainNft {
11
8
  string public constant NAME = "Dezentralized Insurance Protocol Registry";
12
9
  string public constant SYMBOL = "DIPR";
13
10
 
@@ -18,22 +15,18 @@ contract ChainNft is
18
15
  address private _registry;
19
16
 
20
17
  // only used for _getNextTokenId
21
- uint256 internal _chainIdInt;
18
+ uint256 internal _chainIdInt;
22
19
  uint256 internal _chainIdDigits;
23
20
  uint256 internal _chainIdMultiplier;
24
21
  uint256 internal _idNext;
25
22
  uint256 internal _totalMinted;
26
23
 
27
-
28
24
  modifier onlyRegistry() {
29
25
  require(msg.sender == _registry, "ERROR:NFT-001:CALLER_NOT_REGISTRY");
30
26
  _;
31
27
  }
32
28
 
33
-
34
- constructor(address registry)
35
- ERC721(NAME, SYMBOL)
36
- {
29
+ constructor(address registry) ERC721(NAME, SYMBOL) {
37
30
  require(registry != address(0), "ERROR:NFT-010:REGISTRY_ZERO");
38
31
 
39
32
  _registry = registry;
@@ -43,88 +36,59 @@ contract ChainNft is
43
36
  _chainIdMultiplier = 10 ** _chainIdDigits;
44
37
 
45
38
  // on mainnet/goerli start /1 (reserved for protocol nft) on other chains with 2
46
- if(block.chainid == 1 || block.chainid == 5) {
39
+ if (block.chainid == 1 || block.chainid == 5) {
47
40
  _idNext = 1;
48
41
  } else {
49
42
  _idNext = 2;
50
43
  }
51
44
  }
52
45
 
53
-
54
46
  function mint(
55
47
  address to,
56
48
  string memory uri
57
- )
58
- external
59
- override
60
- onlyRegistry
61
- returns(uint256 tokenId)
62
- {
49
+ ) external override onlyRegistry returns (uint256 tokenId) {
63
50
  tokenId = _getNextTokenId();
64
51
  _totalMinted++;
65
52
 
66
53
  _safeMint(to, tokenId);
67
54
 
68
- if(bytes(uri).length > 0) {
55
+ if (bytes(uri).length > 0) {
69
56
  _uri[tokenId] = uri;
70
57
  }
71
58
  }
72
59
 
73
-
74
- function burn(uint256 tokenId)
75
- external
76
- override
77
- onlyRegistry
78
- {
60
+ function burn(uint256 tokenId) external override onlyRegistry {
79
61
  _requireMinted(tokenId);
80
62
  _burn(tokenId);
81
63
  delete _uri[tokenId];
82
64
  }
83
65
 
84
-
85
- function setURI(uint256 tokenId, string memory uri)
86
- external
87
- override
88
- onlyRegistry
89
- {
66
+ function setURI(
67
+ uint256 tokenId,
68
+ string memory uri
69
+ ) external override onlyRegistry {
90
70
  require(bytes(uri).length > 0, "ERROR:CRG-011:URI_EMPTY");
91
71
 
92
72
  _requireMinted(tokenId);
93
73
  _uri[tokenId] = uri;
94
74
  }
95
75
 
96
-
97
- function exists(uint256 tokenId)
98
- external
99
- view
100
- override
101
- returns(bool)
102
- {
76
+ function exists(uint256 tokenId) external view override returns (bool) {
103
77
  return _exists(tokenId);
104
78
  }
105
79
 
106
-
107
- function tokenURI(uint256 tokenId)
108
- public
109
- view
110
- override
111
- returns(string memory)
112
- {
80
+ function tokenURI(
81
+ uint256 tokenId
82
+ ) public view override returns (string memory) {
113
83
  _requireMinted(tokenId);
114
84
  return _uri[tokenId];
115
85
  }
116
86
 
117
-
118
- function getRegistryAddress()
119
- external
120
- view
121
- override
122
- returns(address)
123
- {
87
+ function getRegistryAddress() external view override returns (address) {
124
88
  return _registry;
125
89
  }
126
90
 
127
- function totalMinted() external override view returns(uint256) {
91
+ function totalMinted() external view override returns (uint256) {
128
92
  return _totalMinted;
129
93
  }
130
94
 
@@ -153,17 +117,15 @@ contract ChainNft is
153
117
  // (42 * 10 ** 10 + 9876543210) * 100 + 10
154
118
  // (index * 10 ** digits + chainid) * 100 + digits (1 < digits < 100)
155
119
 
156
- function _getNextTokenId() private returns(uint256 id) {
157
- id = (_idNext * _chainIdMultiplier + _chainIdInt) * 100 + _chainIdDigits;
120
+ function _getNextTokenId() private returns (uint256 id) {
121
+ id =
122
+ (_idNext * _chainIdMultiplier + _chainIdInt) *
123
+ 100 +
124
+ _chainIdDigits;
158
125
  _idNext++;
159
126
  }
160
127
 
161
-
162
- function _countDigits(uint256 num)
163
- private
164
- pure
165
- returns (uint256 count)
166
- {
128
+ function _countDigits(uint256 num) private pure returns (uint256 count) {
167
129
  count = 0;
168
130
  while (num != 0) {
169
131
  count++;
@@ -3,16 +3,19 @@ pragma solidity ^0.8.19;
3
3
 
4
4
  import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
5
5
 
6
- interface IChainNft is
7
- IERC721Enumerable
8
- {
6
+ interface IChainNft is IERC721Enumerable {
7
+ function mint(
8
+ address to,
9
+ string memory uri
10
+ ) external returns (uint256 tokenId);
9
11
 
10
- function mint(address to, string memory uri) external returns(uint256 tokenId);
11
12
  function burn(uint256 tokenId) external;
13
+
12
14
  function setURI(uint256 tokenId, string memory uri) external;
13
15
 
14
- function exists(uint256 tokenId) external view returns(bool);
15
- function totalMinted() external view returns(uint256);
16
+ function exists(uint256 tokenId) external view returns (bool);
17
+
18
+ function totalMinted() external view returns (uint256);
16
19
 
17
- function getRegistryAddress() external view returns(address registry);
20
+ function getRegistryAddress() external view returns (address registry);
18
21
  }