@etherisc/gif-next 0.0.2-edf4742-498 → 0.0.2-ee7cb16-393

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 (200) hide show
  1. package/README.md +63 -1
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +126 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +136 -10
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +88 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +28 -2
  11. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  12. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  13. package/artifacts/contracts/components/Pool.sol/Pool.json +168 -11
  14. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  15. package/artifacts/contracts/components/Product.sol/Product.json +144 -64
  16. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  36. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
  37. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
  38. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
  39. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +788 -0
  40. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
  41. package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +86 -2
  42. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  44. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +963 -18
  45. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  46. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +448 -0
  47. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  48. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +6 -1
  49. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  50. package/artifacts/contracts/instance/Instance.sol/Instance.json +143 -139
  51. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  52. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +55 -32
  53. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  54. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +763 -0
  55. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  56. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +74 -40
  57. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  58. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +145 -64
  59. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  60. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +52 -32
  61. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
  62. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +285 -0
  63. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  64. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  65. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  66. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  67. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  68. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  72. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  73. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  74. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  76. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  77. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +16 -16
  78. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +2 -2
  80. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +17 -21
  82. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  83. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  84. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +167 -0
  86. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +40 -31
  88. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  89. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +238 -28
  90. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  91. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +33 -21
  92. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  93. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +1147 -0
  94. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  95. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +488 -0
  96. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  97. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  98. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +19 -0
  99. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  100. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +94 -0
  101. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  102. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  103. package/artifacts/contracts/registry/Registry.sol/Registry.json +45 -18
  104. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  105. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +76 -20
  106. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  107. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +29 -25
  108. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  109. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +12 -12
  110. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  111. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  112. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  113. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  114. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  115. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  116. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  117. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  118. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  119. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  120. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  121. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +2 -2
  122. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  123. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  124. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  125. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  126. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  127. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  128. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  129. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  130. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  131. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  132. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  133. package/artifacts/contracts/test/TestService.sol/TestService.json +9 -9
  134. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  135. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  136. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  137. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  138. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  139. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  140. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  141. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  142. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  143. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  144. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  146. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +26 -3
  147. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  148. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  149. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  150. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  151. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  152. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  153. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  154. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  155. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  156. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  157. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  158. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  159. package/contracts/components/BaseComponent.sol +49 -8
  160. package/contracts/components/Distribution.sol +6 -3
  161. package/contracts/components/IBaseComponent.sol +6 -0
  162. package/contracts/components/IPoolComponent.sol +5 -1
  163. package/contracts/components/Pool.sol +33 -9
  164. package/contracts/components/Product.sol +33 -41
  165. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +23 -0
  166. package/contracts/instance/BundleManager.sol +129 -0
  167. package/contracts/instance/Cloneable.sol +46 -0
  168. package/contracts/instance/IInstance.sol +21 -4
  169. package/contracts/instance/IInstanceBase.sol +26 -0
  170. package/contracts/instance/IInstanceService.sol +5 -3
  171. package/contracts/instance/Instance.sol +30 -18
  172. package/contracts/instance/InstanceAccessManager.sol +6 -6
  173. package/contracts/instance/InstanceBase.sol +41 -0
  174. package/contracts/instance/InstanceReader.sol +9 -0
  175. package/contracts/instance/InstanceService.sol +95 -32
  176. package/contracts/instance/InstanceServiceManager.sol +6 -5
  177. package/contracts/instance/ObjectManager.sol +101 -0
  178. package/contracts/instance/base/ComponentServiceBase.sol +12 -2
  179. package/contracts/instance/module/ISetup.sol +3 -1
  180. package/contracts/instance/service/DistributionService.sol +3 -2
  181. package/contracts/instance/service/DistributionServiceManager.sol +6 -5
  182. package/contracts/instance/service/IPoolService.sol +16 -2
  183. package/contracts/instance/service/IProductService.sol +6 -3
  184. package/contracts/instance/service/PoolService.sol +111 -17
  185. package/contracts/instance/service/PoolServiceManager.sol +6 -5
  186. package/contracts/instance/service/ProductService.sol +570 -0
  187. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  188. package/contracts/registry/IRegistry.sol +2 -0
  189. package/contracts/registry/IRegistryService.sol +28 -11
  190. package/contracts/registry/Registry.sol +4 -0
  191. package/contracts/registry/RegistryService.sol +30 -71
  192. package/contracts/shared/NftOwnable.sol +2 -4
  193. package/contracts/types/NftIdSet.sol +26 -24
  194. package/contracts/types/RoleId.sol +1 -0
  195. package/package.json +1 -1
  196. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +0 -4
  197. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +0 -4
  198. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +0 -1132
  199. package/contracts/instance/AccessManagedSimple.sol +0 -115
  200. package/contracts/instance/AccessManagerSimple.sol +0 -692
@@ -0,0 +1,570 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IRegistry} from "../../registry/IRegistry.sol";
5
+ import {IProductComponent} from "../../components/IProductComponent.sol";
6
+ import {Product} from "../../components/Product.sol";
7
+ import {IPoolComponent} from "../../components/IPoolComponent.sol";
8
+ import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
9
+ import {IInstance} from "../IInstance.sol";
10
+ import {IPolicy} from "../module/IPolicy.sol";
11
+ import {IRisk} from "../module/IRisk.sol";
12
+ import {IBundle} from "../module/IBundle.sol";
13
+ import {IProductService} from "./IProductService.sol";
14
+ import {ITreasury} from "../module/ITreasury.sol";
15
+ import {ISetup} from "../module/ISetup.sol";
16
+
17
+ import {TokenHandler} from "../../shared/TokenHandler.sol";
18
+
19
+ import {IVersionable} from "../../shared/IVersionable.sol";
20
+ import {Versionable} from "../../shared/Versionable.sol";
21
+
22
+ import {Timestamp, zeroTimestamp} from "../../types/Timestamp.sol";
23
+ import {UFixed, UFixedLib} from "../../types/UFixed.sol";
24
+ import {Blocknumber, blockNumber} from "../../types/Blocknumber.sol";
25
+ import {ObjectType, INSTANCE, PRODUCT, POLICY} from "../../types/ObjectType.sol";
26
+ import {APPLIED, UNDERWRITTEN, ACTIVE, KEEP_STATE} from "../../types/StateId.sol";
27
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
28
+ import {Fee, FeeLib} from "../../types/Fee.sol";
29
+ import {ReferralId} from "../../types/Referral.sol";
30
+ import {RiskId} from "../../types/RiskId.sol";
31
+ import {StateId} from "../../types/StateId.sol";
32
+ import {Version, VersionLib} from "../../types/Version.sol";
33
+
34
+ import {IService} from "../../shared/IService.sol";
35
+ import {Service} from "../../shared/Service.sol";
36
+ import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
37
+ import {IProductService} from "./IProductService.sol";
38
+ import {InstanceReader} from "../InstanceReader.sol";
39
+ import {IPoolService} from "./PoolService.sol";
40
+ import {POOL_SERVICE_NAME} from "./PoolService.sol";
41
+
42
+ string constant PRODUCT_SERVICE_NAME = "ProductService";
43
+
44
+ // TODO or name this ProtectionService to have Product be something more generic (loan, savings account, ...)
45
+ contract ProductService is ComponentServiceBase, IProductService {
46
+ using NftIdLib for NftId;
47
+
48
+ string public constant NAME = "ProductService";
49
+
50
+ address internal _registryAddress;
51
+ IPoolService internal _poolService;
52
+
53
+ event LogProductServiceSender(address sender);
54
+
55
+ function _initialize(
56
+ address owner,
57
+ bytes memory data
58
+ )
59
+ internal
60
+ initializer
61
+ virtual override
62
+ {
63
+ address initialOwner = address(0);
64
+ (_registryAddress, initialOwner) = abi.decode(data, (address, address));
65
+
66
+ _initializeService(_registryAddress, owner);
67
+
68
+ _poolService = IPoolService(_registry.getServiceAddress(POOL_SERVICE_NAME, getMajorVersion()));
69
+
70
+ _registerInterface(type(IService).interfaceId);
71
+ _registerInterface(type(IProductService).interfaceId);
72
+ }
73
+
74
+
75
+ function getName() public pure override(IService, Service) returns(string memory name) {
76
+ return NAME;
77
+ }
78
+
79
+ function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
80
+ ISetup.ProductSetupInfo memory initialSetup = abi.decode(
81
+ initialObjData,
82
+ (ISetup.ProductSetupInfo)
83
+ );
84
+ instance.createProductSetup(componentNftId, initialSetup);
85
+ }
86
+
87
+ function setFees(
88
+ Fee memory productFee,
89
+ Fee memory processingFee
90
+ )
91
+ external
92
+ override
93
+ {
94
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
95
+ InstanceReader instanceReader = instance.getInstanceReader();
96
+ NftId productNftId = productInfo.nftId;
97
+
98
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
99
+ productSetupInfo.productFee = productFee;
100
+ productSetupInfo.processingFee = processingFee;
101
+
102
+ instance.updateProductSetup(productNftId, productSetupInfo, KEEP_STATE());
103
+ }
104
+
105
+ function createRisk(
106
+ RiskId riskId,
107
+ bytes memory data
108
+ ) external override {
109
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
110
+ NftId productNftId = productInfo.nftId;
111
+ IRisk.RiskInfo memory riskInfo = IRisk.RiskInfo(productNftId, data);
112
+ instance.createRisk(
113
+ riskId,
114
+ riskInfo
115
+ );
116
+ }
117
+
118
+ function updateRisk(
119
+ RiskId riskId,
120
+ bytes memory data
121
+ ) external {
122
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
123
+ InstanceReader instanceReader = instance.getInstanceReader();
124
+ IRisk.RiskInfo memory riskInfo = instanceReader.getRiskInfo(riskId);
125
+ riskInfo.data = data;
126
+ instance.updateRisk(riskId, riskInfo, KEEP_STATE());
127
+ }
128
+
129
+ function updateRiskState(
130
+ RiskId riskId,
131
+ StateId state
132
+ ) external {
133
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
134
+ instance.updateRiskState(riskId, state);
135
+ }
136
+
137
+ function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
138
+ IRegistry.ObjectInfo memory productInfo;
139
+ (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
140
+ product = Product(productInfo.objectAddress);
141
+ }
142
+
143
+ function calculatePremium(
144
+ RiskId riskId,
145
+ uint256 sumInsuredAmount,
146
+ uint256 lifetime,
147
+ bytes memory applicationData,
148
+ NftId bundleNftId,
149
+ ReferralId referralId
150
+ )
151
+ public
152
+ view
153
+ override
154
+ returns (
155
+ uint256 premiumAmount,
156
+ uint256 productFeeAmount,
157
+ uint256 poolFeeAmount,
158
+ uint256 bundleFeeAmount,
159
+ uint256 distributionFeeAmount
160
+ )
161
+ {
162
+ Product product = _getAndVerifyInstanceAndProduct();
163
+ uint256 netPremiumAmount = product.calculateNetPremium(
164
+ sumInsuredAmount,
165
+ riskId,
166
+ lifetime,
167
+ applicationData
168
+ );
169
+
170
+ (
171
+ productFeeAmount,
172
+ poolFeeAmount,
173
+ bundleFeeAmount,
174
+ distributionFeeAmount
175
+ ) = _calculateFeeAmounts(
176
+ netPremiumAmount,
177
+ product,
178
+ bundleNftId,
179
+ referralId
180
+ );
181
+
182
+ premiumAmount = netPremiumAmount + productFeeAmount;
183
+ premiumAmount += poolFeeAmount + bundleFeeAmount;
184
+ premiumAmount += distributionFeeAmount;
185
+ }
186
+
187
+ function _calculateFeeAmounts(
188
+ uint256 netPremiumAmount,
189
+ Product product,
190
+ NftId bundleNftId,
191
+ ReferralId referralId
192
+ )
193
+ internal
194
+ view
195
+ returns (
196
+ uint256 productFeeAmount,
197
+ uint256 poolFeeAmount,
198
+ uint256 bundleFeeAmount,
199
+ uint256 distributionFeeAmount
200
+ )
201
+ {
202
+ InstanceReader instanceReader;
203
+ {
204
+ IInstance instance = product.getInstance();
205
+ instanceReader = instance.getInstanceReader();
206
+ }
207
+
208
+ NftId poolNftId = product.getPoolNftId();
209
+ IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
210
+ require(bundleInfo.poolNftId == poolNftId,"ERROR:PRS-035:BUNDLE_POOL_MISMATCH");
211
+
212
+ {
213
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(product.getProductNftId());
214
+ (productFeeAmount,) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
215
+ }
216
+ {
217
+ ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
218
+ (poolFeeAmount,) = FeeLib.calculateFee(poolSetupInfo.poolFee, netPremiumAmount);
219
+ }
220
+ {
221
+ NftId distributionNftId = product.getDistributionNftId();
222
+ ISetup.DistributionSetupInfo memory distributionSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
223
+ (distributionFeeAmount,) = FeeLib.calculateFee(distributionSetupInfo.distributionFee, netPremiumAmount);
224
+ }
225
+
226
+ (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
227
+ }
228
+
229
+
230
+ function createApplication(
231
+ address applicationOwner,
232
+ RiskId riskId,
233
+ uint256 sumInsuredAmount,
234
+ uint256 lifetime,
235
+ bytes memory applicationData,
236
+ NftId bundleNftId,
237
+ ReferralId referralId
238
+ ) external override returns (NftId policyNftId) {
239
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
240
+ // TODO add validations (see create bundle in pool service)
241
+
242
+ policyNftId = getRegistryService().registerPolicy(
243
+ IRegistry.ObjectInfo(
244
+ zeroNftId(),
245
+ productInfo.nftId,
246
+ POLICY(),
247
+ false, // intercepting property for policies is defined on product
248
+ address(0),
249
+ applicationOwner,
250
+ ""
251
+ )
252
+ );
253
+
254
+ (uint256 premiumAmount,,,,) = calculatePremium(
255
+ riskId,
256
+ sumInsuredAmount,
257
+ lifetime,
258
+ applicationData,
259
+ bundleNftId,
260
+ referralId
261
+ );
262
+
263
+ IPolicy.PolicyInfo memory policyInfo = IPolicy.PolicyInfo(
264
+ productInfo.nftId,
265
+ bundleNftId,
266
+ referralId,
267
+ riskId,
268
+ sumInsuredAmount,
269
+ premiumAmount,
270
+ 0,
271
+ lifetime,
272
+ applicationData,
273
+ "",
274
+ 0,
275
+ 0,
276
+ 0,
277
+ zeroTimestamp(),
278
+ zeroTimestamp(),
279
+ zeroTimestamp()
280
+ );
281
+
282
+ instance.createPolicy(policyNftId, policyInfo);
283
+ instance.updatePolicyState(policyNftId, APPLIED());
284
+
285
+ // TODO add logging
286
+ }
287
+
288
+ function _getAndVerifyUnderwritingSetup(
289
+ IInstance instance,
290
+ InstanceReader instanceReader,
291
+ IPolicy.PolicyInfo memory policyInfo,
292
+ ISetup.ProductSetupInfo memory productSetupInfo
293
+ )
294
+ internal
295
+ view
296
+ returns (
297
+ NftId bundleNftId,
298
+ IBundle.BundleInfo memory bundleInfo,
299
+ uint256 collateralAmount
300
+ )
301
+ {
302
+ // check match between policy and bundle (via pool)
303
+ bundleNftId = policyInfo.bundleNftId;
304
+ bundleInfo = instanceReader.getBundleInfo(bundleNftId);
305
+ require(bundleInfo.poolNftId == productSetupInfo.poolNftId, "POLICY_BUNDLE_MISMATCH");
306
+
307
+ // calculate required collateral
308
+ NftId poolNftId = productSetupInfo.poolNftId;
309
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
310
+
311
+ // obtain remaining return values
312
+ collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
313
+ }
314
+
315
+ function _lockCollateralInBundle(
316
+ IInstance instance,
317
+ NftId bundleNftId,
318
+ IBundle.BundleInfo memory bundleInfo,
319
+ NftId policyNftId,
320
+ uint256 collateralAmount
321
+ )
322
+ internal
323
+ returns (IBundle.BundleInfo memory)
324
+ {
325
+ bundleInfo.lockedAmount += collateralAmount;
326
+ // TODO: track policy associated to bundle in bundlemanager (tbd) and how much is locked for it
327
+ return bundleInfo;
328
+ }
329
+
330
+ function _underwriteByPool(
331
+ NftId poolNftId,
332
+ NftId policyNftId,
333
+ IPolicy.PolicyInfo memory policyInfo,
334
+ bytes memory bundleFilter,
335
+ uint256 collateralAmount
336
+ )
337
+ internal
338
+ {
339
+ address poolAddress = getRegistry().getObjectInfo(poolNftId).objectAddress;
340
+ IPoolComponent pool = IPoolComponent(poolAddress);
341
+ pool.underwrite(
342
+ policyNftId,
343
+ policyInfo.applicationData,
344
+ bundleFilter,
345
+ collateralAmount);
346
+ }
347
+
348
+
349
+ function revoke(
350
+ NftId policyNftId
351
+ )
352
+ external
353
+ override
354
+ {
355
+ require(false, "ERROR:PRS-234:NOT_YET_IMPLEMENTED");
356
+ }
357
+
358
+
359
+ function underwrite(
360
+ NftId policyNftId,
361
+ bool requirePremiumPayment,
362
+ Timestamp activateAt
363
+ )
364
+ external
365
+ override
366
+ {
367
+ // check caller is registered product
368
+ (
369
+ IRegistry.ObjectInfo memory productInfo,
370
+ IInstance instance
371
+ ) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
372
+ InstanceReader instanceReader = instance.getInstanceReader();
373
+
374
+ // check match between policy and calling product
375
+ NftId productNftId = productInfo.nftId;
376
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
377
+ require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
378
+ require(instanceReader.getPolicyState(policyNftId) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
379
+
380
+ NftId bundleNftId;
381
+ IBundle.BundleInfo memory bundleInfo;
382
+ uint256 collateralAmount;
383
+ uint256 netPremiumAmount = 0; // > 0 if immediate premium payment
384
+ {
385
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
386
+ IBundle.BundleInfo memory bundleInfo;
387
+
388
+ (
389
+ bundleNftId,
390
+ bundleInfo,
391
+ collateralAmount
392
+ ) = _getAndVerifyUnderwritingSetup(
393
+ instance,
394
+ instanceReader,
395
+ policyInfo,
396
+ productSetupInfo
397
+ );
398
+ }
399
+
400
+
401
+ // lock bundle collateral
402
+ bundleInfo = _lockCollateralInBundle(
403
+ instance,
404
+ bundleNftId,
405
+ bundleInfo,
406
+ policyNftId,
407
+ collateralAmount);
408
+
409
+ // lock bundle collateral
410
+ bundleInfo = _lockCollateralInBundle(
411
+ instance,
412
+ bundleNftId,
413
+ bundleInfo,
414
+ policyNftId,
415
+ collateralAmount);
416
+ StateId newPolicyState = UNDERWRITTEN();
417
+
418
+ // optional activation of policy
419
+ if(activateAt > zeroTimestamp()) {
420
+ newPolicyState = ACTIVE();
421
+ policyInfo.activatedAt = activateAt;
422
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
423
+ }
424
+
425
+ // optional collection of premium
426
+ if(requirePremiumPayment) {
427
+ netPremiumAmount = _processPremiumByTreasury(
428
+ instance,
429
+ productInfo.nftId,
430
+ policyNftId,
431
+ policyInfo.premiumAmount);
432
+
433
+ policyInfo.premiumPaidAmount += policyInfo.premiumAmount;
434
+ }
435
+
436
+ _poolService.underwritePolicy(instance, policyNftId, bundleNftId, collateralAmount, netPremiumAmount);
437
+ instance.updatePolicy(policyNftId, policyInfo, newPolicyState);
438
+
439
+ // involve pool if necessary
440
+ {
441
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(bundleInfo.poolNftId);
442
+
443
+ if(poolInfo.isConfirmingApplication) {
444
+ _underwriteByPool(
445
+ bundleInfo.poolNftId,
446
+ policyNftId,
447
+ policyInfo,
448
+ bundleInfo.filter,
449
+ collateralAmount
450
+ );
451
+ }
452
+ }
453
+
454
+ // TODO add logging
455
+ }
456
+
457
+ function calculateRequiredCollateral(UFixed collateralizationLevel, uint256 sumInsuredAmount) public pure override returns(uint256 collateralAmount) {
458
+ UFixed sumInsuredUFixed = UFixedLib.toUFixed(sumInsuredAmount);
459
+ UFixed collateralUFixed = collateralizationLevel * sumInsuredUFixed;
460
+ return collateralUFixed.toInt();
461
+ }
462
+
463
+ function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
464
+ // check caller is registered product
465
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
466
+ InstanceReader instanceReader = instance.getInstanceReader();
467
+
468
+ // TODO: check if not paid
469
+ // TODO: transfer premium
470
+ // TODO: optionally activate
471
+
472
+ // // perform actual token transfers (this code is probably not complete)
473
+ // IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
474
+
475
+ // uint256 premiumAmount = policyInfo.premiumAmount;
476
+ // _processPremiumByTreasury(instance, productInfo.nftId, policyNftId, premiumAmount);
477
+
478
+ // // policy level book keeping for premium paid
479
+ // policyInfo.premiumPaidAmount += premiumAmount;
480
+
481
+ // instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
482
+
483
+ // // optional activation of policy
484
+ // if(activateAt > zeroTimestamp()) {
485
+ // activate(policyNftId, activateAt);
486
+ // }
487
+
488
+ // TODO add logging
489
+ }
490
+
491
+ function activate(NftId policyNftId, Timestamp activateAt) public override {
492
+ // check caller is registered product
493
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
494
+ InstanceReader instanceReader = instance.getInstanceReader();
495
+
496
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
497
+
498
+ require(
499
+ policyInfo.activatedAt.eqz(),
500
+ "ERROR:PRS-020:ALREADY_ACTIVATED");
501
+
502
+ policyInfo.activatedAt = activateAt;
503
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
504
+
505
+ instance.updatePolicy(policyNftId, policyInfo, ACTIVE());
506
+
507
+ // TODO add logging
508
+ }
509
+
510
+ function close(
511
+ NftId policyNftId
512
+ ) external override // solhint-disable-next-line no-empty-blocks
513
+ {
514
+
515
+ }
516
+
517
+ function _getPoolNftId(
518
+ IInstance instance,
519
+ NftId productNftId
520
+ )
521
+ internal
522
+ view
523
+ returns (NftId poolNftid)
524
+ {
525
+ InstanceReader instanceReader = instance.getInstanceReader();
526
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
527
+ return productSetupInfo.poolNftId;
528
+ }
529
+
530
+
531
+ function _processPremiumByTreasury(
532
+ IInstance instance,
533
+ NftId productNftId,
534
+ NftId policyNftId,
535
+ uint256 premiumAmount
536
+ )
537
+ internal
538
+ returns (uint256 netPremiumAmount)
539
+ {
540
+ // process token transfer(s)
541
+ if(premiumAmount > 0) {
542
+ ISetup.ProductSetupInfo memory productSetupInfo = instance.getInstanceReader().getProductSetupInfo(productNftId);
543
+ TokenHandler tokenHandler = productSetupInfo.tokenHandler;
544
+ address policyOwner = getRegistry().ownerOf(policyNftId);
545
+ ISetup.PoolSetupInfo memory poolSetupInfo = instance.getInstanceReader().getPoolSetupInfo(productSetupInfo.poolNftId);
546
+ address poolWallet = poolSetupInfo.wallet;
547
+ netPremiumAmount = premiumAmount;
548
+ Fee memory productFee = productSetupInfo.productFee;
549
+
550
+ if (FeeLib.feeIsZero(productFee)) {
551
+ tokenHandler.transfer(
552
+ policyOwner,
553
+ poolWallet,
554
+ premiumAmount
555
+ );
556
+ } else {
557
+ (uint256 productFeeAmount, uint256 netAmount) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
558
+ address productWallet = productSetupInfo.wallet;
559
+ if (tokenHandler.getToken().allowance(policyOwner, address(tokenHandler)) < premiumAmount) {
560
+ revert ErrorIProductServiceInsufficientAllowance(policyOwner, address(tokenHandler), premiumAmount);
561
+ }
562
+ tokenHandler.transfer(policyOwner, productWallet, productFeeAmount);
563
+ tokenHandler.transfer(policyOwner, poolWallet, netAmount);
564
+ netPremiumAmount = netAmount;
565
+ }
566
+ }
567
+
568
+ // TODO add logging
569
+ }
570
+ }
@@ -0,0 +1,54 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {IVersionable} from "../../shared/IVersionable.sol";
5
+ import {ProxyManager} from "../../shared/ProxyManager.sol";
6
+ import {ProductService} from "./ProductService.sol";
7
+ import {Registry} from "../../registry/Registry.sol";
8
+ import {RegistryService} from "../../registry/RegistryService.sol";
9
+ import {VersionLib} from "../../types/Version.sol";
10
+
11
+ contract ProductServiceManager is ProxyManager {
12
+
13
+ ProductService private _productService;
14
+
15
+ /// @dev initializes proxy manager with product service implementation
16
+ constructor(
17
+ address registryAddress
18
+ )
19
+ ProxyManager()
20
+ {
21
+ ProductService svc = new ProductService();
22
+ bytes memory data = abi.encode(registryAddress, address(this));
23
+ IVersionable versionable = deploy(
24
+ address(svc),
25
+ data);
26
+
27
+ _productService = ProductService(address(versionable));
28
+
29
+ // Registry registry = Registry(registryAddress);
30
+ // address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
31
+ // RegistryService registryService = RegistryService(registryServiceAddress);
32
+ // TODO this must have a role or own nft to register service
33
+ //registryService.registerService(_productService);
34
+
35
+ // TODO no nft to link yet
36
+ // link ownership of instance service manager ot nft owner of instance service
37
+ //_linkToNftOwnable(
38
+ // address(registryAddress),
39
+ // address(_productService));
40
+
41
+ // implies that after this constructor call only upgrade functionality is available
42
+ _isDeployed = true;
43
+ }
44
+
45
+ //--- view functions ----------------------------------------------------//
46
+ function getProductService()
47
+ external
48
+ view
49
+ returns (ProductService productService)
50
+ {
51
+ return _productService;
52
+ }
53
+
54
+ }
@@ -66,6 +66,8 @@ interface IRegistry is IERC165 {
66
66
 
67
67
  function isRegistered(address contractAddress) external view returns (bool);
68
68
 
69
+ function isRegisteredService(address contractAddress) external view returns (bool);
70
+
69
71
  function getServiceName(NftId nftId) external view returns (string memory name);
70
72
 
71
73
  function getServiceAddress(
@@ -12,22 +12,39 @@ import {IBaseComponent} from "../components/IBaseComponent.sol";
12
12
 
13
13
  interface IRegistryService is IService {
14
14
 
15
- function registerService(IService service) external returns(IRegistry.ObjectInfo memory info, bytes memory data);
15
+ error SelfRegistration();
16
+ error NotRegistryOwner();
16
17
 
17
- function registerInstance(IRegisterable instance)
18
- external returns(IRegistry.ObjectInfo memory info, bytes memory data);
18
+ error NotService();
19
+ error NotInstance();
20
+ error NotProduct();
21
+ error NotPool();
22
+ error NotDistribution();
19
23
 
20
- function registerProduct(IBaseComponent product, address owner)
21
- external returns(IRegistry.ObjectInfo memory info, bytes memory data);
24
+ error UnexpectedRegisterableType(ObjectType expected, ObjectType found);
25
+ error NotRegisterableOwner(address expectedOwner);
26
+ error RegisterableOwnerIsZero();
27
+ error RegisterableOwnerIsRegistered();
28
+ error InvalidInitialOwner(address initialOwner);
29
+ error InvalidAddress(address registerableAddress);
22
30
 
23
- function registerPool(IBaseComponent pool, address owner)
24
- external returns(IRegistry.ObjectInfo memory info, bytes memory data);
25
31
 
26
- function registerDistribution(IBaseComponent distribution, address owner)
27
- external returns(IRegistry.ObjectInfo memory info, bytes memory data);
32
+ function registerService(IService service) external returns(IRegistry.ObjectInfo memory info, bytes memory data);
28
33
 
29
- function registerPolicy(IRegistry.ObjectInfo memory info) external returns(NftId nftId); // -> easy to upgrade
34
+ function registerInstance(IRegisterable instance)
35
+ external returns(IRegistry.ObjectInfo memory info, bytes memory data);
30
36
 
31
- function registerBundle(IRegistry.ObjectInfo memory info) external returns(NftId nftId);
37
+ function registerProduct(IBaseComponent product, address owner)
38
+ external returns(IRegistry.ObjectInfo memory info, bytes memory data);
39
+
40
+ function registerPool(IBaseComponent pool, address owner)
41
+ external returns(IRegistry.ObjectInfo memory info, bytes memory data);
42
+
43
+ function registerDistribution(IBaseComponent distribution, address owner)
44
+ external returns(IRegistry.ObjectInfo memory info, bytes memory data);
45
+
46
+ function registerPolicy(IRegistry.ObjectInfo memory info) external returns(NftId nftId); // -> easy to upgrade
47
+
48
+ function registerBundle(IRegistry.ObjectInfo memory info) external returns(NftId nftId);
32
49
  }
33
50
 
@@ -232,6 +232,10 @@ contract Registry is
232
232
  return _nftIdByAddress[object].gtz();
233
233
  }
234
234
 
235
+ function isRegisteredService(address object) external view override returns (bool) {
236
+ return _nftIdByAddress[object].gtz() && _info[_nftIdByAddress[object]].objectType == SERVICE();
237
+ }
238
+
235
239
  function getServiceName(NftId nftId) external view returns (string memory) {
236
240
  return _string[nftId];
237
241
  }