@etherisc/gif-next 0.0.2-b060f43-287 → 0.0.2-b1059a4-617

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 (344) hide show
  1. package/README.md +73 -1
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +4 -0
  3. package/artifacts/contracts/components/Component.sol/Component.json +853 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +887 -242
  6. package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +4 -0
  7. package/artifacts/contracts/components/{BaseComponent.sol/BaseComponent.json → IComponent.sol/IComponent.json} +160 -100
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +791 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +655 -43
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +654 -5
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +600 -217
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +543 -152
  18. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +1 -1
  19. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +38 -62
  20. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +1 -1
  21. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  22. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +896 -110
  23. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  24. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +178 -165
  25. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  26. package/artifacts/contracts/instance/Instance.sol/Instance.json +805 -960
  27. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  28. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +188 -144
  29. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  30. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +61 -97
  31. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  32. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +418 -342
  33. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  34. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +297 -116
  35. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +1 -1
  36. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +8 -32
  37. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +4 -0
  38. package/artifacts/contracts/instance/base/{ComponentServiceBase.sol/ComponentServiceBase.json → ComponentService.sol/ComponentService.json} +180 -179
  39. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  40. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  42. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  43. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  44. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  45. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  46. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +59 -16
  47. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  48. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  49. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  50. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  51. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  52. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  53. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.dbg.json +4 -0
  54. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.json +858 -0
  55. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +4 -0
  56. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +657 -0
  57. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +4 -0
  58. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +1085 -0
  59. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +4 -0
  60. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +661 -0
  61. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +4 -0
  62. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +743 -0
  63. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +4 -0
  64. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +637 -0
  65. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  66. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +433 -214
  67. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  68. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +316 -83
  69. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +4 -0
  70. package/artifacts/contracts/instance/service/{IComponentOwnerService.sol/IComponentOwnerService.json → IApplicationService.sol/IApplicationService.json} +200 -204
  71. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +4 -0
  72. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +622 -0
  73. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +4 -0
  74. package/artifacts/contracts/{components/IBaseComponent.sol/IBaseComponent.json → instance/service/IClaimService.sol/IClaimService.json} +154 -124
  75. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  76. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +197 -163
  77. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +4 -0
  78. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +572 -0
  79. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  80. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +24 -416
  81. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  82. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +30 -417
  83. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +4 -0
  84. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +1109 -0
  85. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +4 -0
  86. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +717 -0
  87. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  88. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +177 -510
  89. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  90. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +293 -108
  91. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  92. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +189 -570
  93. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +1 -1
  94. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +286 -125
  95. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  96. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
  97. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  98. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +225 -133
  99. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  100. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +149 -217
  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 +238 -235
  104. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +4 -0
  105. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +285 -0
  106. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  107. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +195 -322
  108. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  109. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +298 -145
  110. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +4 -0
  111. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +547 -0
  112. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  113. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +141 -53
  114. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  115. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  116. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +41 -3
  117. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  118. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +40 -29
  119. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +4 -0
  120. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.json +129 -0
  121. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  122. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +21 -34
  123. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +4 -0
  124. package/artifacts/contracts/{experiment/inheritance/IB.sol/IB.json → shared/IRegistryLinked.sol/IRegistryLinked.json} +18 -20
  125. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  126. package/artifacts/contracts/shared/IService.sol/IService.json +23 -186
  127. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  128. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +2 -152
  129. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  130. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +120 -27
  131. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +4 -0
  132. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +248 -0
  133. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  134. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +294 -61
  135. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  136. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +129 -51
  137. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +4 -0
  138. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +84 -0
  139. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  140. package/artifacts/contracts/shared/Service.sol/Service.json +119 -173
  141. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  142. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  143. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  144. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  145. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +2 -152
  146. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  147. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  148. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +129 -51
  149. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  150. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  151. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  152. package/artifacts/contracts/test/TestService.sol/TestService.json +140 -230
  153. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  154. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  155. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  156. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +8 -190
  157. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  158. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  159. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  160. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  161. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.dbg.json +4 -0
  162. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.json +100 -0
  163. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  164. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +2 -2
  165. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  167. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +2 -2
  168. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  169. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
  170. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  171. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  172. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  173. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  174. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  175. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.dbg.json +4 -0
  176. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.json +100 -0
  177. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  178. package/artifacts/contracts/types/Referral.sol/ReferralLib.json +2 -2
  179. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  180. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
  181. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  182. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  183. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  184. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  185. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  187. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  188. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  189. package/contracts/components/Component.sol +241 -0
  190. package/contracts/components/Distribution.sol +209 -64
  191. package/contracts/components/IComponent.sol +54 -0
  192. package/contracts/components/IDistributionComponent.sol +59 -3
  193. package/contracts/components/IPoolComponent.sol +50 -29
  194. package/contracts/components/IProductComponent.sol +7 -3
  195. package/contracts/components/Pool.sol +136 -149
  196. package/contracts/components/Product.sol +115 -119
  197. package/contracts/instance/BundleManager.sol +7 -11
  198. package/contracts/instance/IInstance.sol +46 -10
  199. package/contracts/instance/IInstanceService.sol +30 -3
  200. package/contracts/instance/Instance.sol +95 -259
  201. package/contracts/instance/InstanceAccessManager.sol +87 -78
  202. package/contracts/instance/InstanceReader.sol +3 -25
  203. package/contracts/instance/InstanceService.sol +369 -127
  204. package/contracts/instance/InstanceServiceManager.sol +6 -9
  205. package/contracts/instance/ObjectManager.sol +7 -24
  206. package/contracts/instance/base/ComponentService.sol +134 -0
  207. package/contracts/instance/module/IAccess.sol +27 -18
  208. package/contracts/instance/module/IPolicy.sol +4 -2
  209. package/contracts/instance/module/ISetup.sol +5 -4
  210. package/contracts/instance/service/ApplicationService.sol +268 -0
  211. package/contracts/instance/service/ApplicationServiceManager.sol +35 -0
  212. package/contracts/instance/service/BundleService.sol +298 -0
  213. package/contracts/instance/service/BundleServiceManager.sol +51 -0
  214. package/contracts/instance/service/ClaimService.sol +151 -0
  215. package/contracts/instance/service/ClaimServiceManager.sol +35 -0
  216. package/contracts/instance/service/DistributionService.sol +216 -27
  217. package/contracts/instance/service/DistributionServiceManager.sol +7 -10
  218. package/contracts/instance/service/IApplicationService.sol +82 -0
  219. package/contracts/instance/service/IBundleService.sol +54 -0
  220. package/contracts/instance/service/IClaimService.sol +61 -0
  221. package/contracts/instance/service/IDistributionService.sol +53 -0
  222. package/contracts/instance/service/IPolicyService.sol +89 -0
  223. package/contracts/instance/service/IPoolService.sol +2 -33
  224. package/contracts/instance/service/IProductService.sol +2 -72
  225. package/contracts/instance/service/PolicyService.sol +474 -0
  226. package/contracts/instance/service/PolicyServiceManager.sol +54 -0
  227. package/contracts/instance/service/PoolService.sol +34 -212
  228. package/contracts/instance/service/PoolServiceManager.sol +6 -9
  229. package/contracts/instance/service/ProductService.sol +123 -460
  230. package/contracts/instance/service/ProductServiceManager.sol +2 -2
  231. package/contracts/registry/ChainNft.sol +1 -1
  232. package/contracts/registry/IRegistry.sol +37 -19
  233. package/contracts/registry/IRegistryService.sol +30 -13
  234. package/contracts/registry/Registry.sol +233 -217
  235. package/contracts/registry/RegistryAccessManager.sol +216 -0
  236. package/contracts/registry/RegistryService.sol +96 -171
  237. package/contracts/registry/RegistryServiceManager.sol +21 -39
  238. package/contracts/registry/ReleaseManager.sol +322 -0
  239. package/contracts/registry/TokenRegistry.sol +22 -17
  240. package/contracts/shared/ERC165.sol +14 -12
  241. package/contracts/shared/INftOwnable.sol +11 -10
  242. package/contracts/shared/IPolicyHolder.sol +26 -0
  243. package/contracts/shared/IRegisterable.sol +4 -6
  244. package/contracts/shared/IRegistryLinked.sol +12 -0
  245. package/contracts/shared/IService.sol +2 -1
  246. package/contracts/shared/IVersionable.sol +4 -47
  247. package/contracts/shared/NftOwnable.sol +66 -80
  248. package/contracts/shared/PolicyHolder.sol +81 -0
  249. package/contracts/shared/ProxyManager.sol +100 -25
  250. package/contracts/shared/Registerable.sol +14 -30
  251. package/contracts/shared/RegistryLinked.sol +48 -0
  252. package/contracts/shared/Service.sol +25 -22
  253. package/contracts/shared/Versionable.sol +4 -92
  254. package/contracts/test/TestRegisterable.sol +1 -1
  255. package/contracts/test/TestService.sol +4 -3
  256. package/contracts/types/ClaimId.sol +52 -0
  257. package/contracts/types/DistributorType.sol +2 -2
  258. package/contracts/types/ObjectType.sol +9 -5
  259. package/contracts/types/PayoutId.sol +54 -0
  260. package/contracts/types/RoleId.sol +12 -12
  261. package/package.json +3 -3
  262. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +0 -4
  263. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +0 -4
  264. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +0 -4
  265. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.json +0 -66
  266. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +0 -4
  267. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.json +0 -24
  268. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +0 -4
  269. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.json +0 -42
  270. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +0 -4
  271. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +0 -105
  272. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +0 -4
  273. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +0 -105
  274. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +0 -4
  275. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +0 -128
  276. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +0 -4
  277. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +0 -42
  278. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +0 -4
  279. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +0 -76
  280. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +0 -4
  281. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +0 -89
  282. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +0 -4
  283. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +0 -128
  284. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +0 -4
  285. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +0 -37
  286. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +0 -4
  287. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +0 -4
  288. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +0 -63
  289. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +0 -4
  290. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +0 -59
  291. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +0 -4
  292. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +0 -124
  293. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +0 -4
  294. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +0 -74
  295. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +0 -4
  296. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +0 -124
  297. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +0 -4
  298. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +0 -207
  299. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +0 -4
  300. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +0 -10
  301. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +0 -4
  302. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +0 -10
  303. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +0 -4
  304. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +0 -1206
  305. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +0 -4
  306. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.json +0 -1082
  307. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +0 -4
  308. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +0 -448
  309. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +0 -4
  310. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +0 -763
  311. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +0 -4
  312. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +0 -4
  313. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +0 -113
  314. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +0 -4
  315. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +0 -827
  316. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +0 -4
  317. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +0 -4
  318. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.json +0 -442
  319. package/contracts/components/BaseComponent.sol +0 -132
  320. package/contracts/components/IBaseComponent.sol +0 -31
  321. package/contracts/experiment/cloning/Cloner.sol +0 -47
  322. package/contracts/experiment/errors/Require.sol +0 -38
  323. package/contracts/experiment/errors/Revert.sol +0 -44
  324. package/contracts/experiment/inheritance/A.sol +0 -53
  325. package/contracts/experiment/inheritance/B.sol +0 -28
  326. package/contracts/experiment/inheritance/C.sol +0 -34
  327. package/contracts/experiment/inheritance/IA.sol +0 -13
  328. package/contracts/experiment/inheritance/IB.sol +0 -10
  329. package/contracts/experiment/inheritance/IC.sol +0 -12
  330. package/contracts/experiment/statemachine/Dummy.sol +0 -27
  331. package/contracts/experiment/statemachine/ISM.sol +0 -25
  332. package/contracts/experiment/statemachine/SM.sol +0 -57
  333. package/contracts/experiment/statemachine/SimpleStateMachine.sol +0 -31
  334. package/contracts/experiment/types/TypeA.sol +0 -47
  335. package/contracts/experiment/types/TypeB.sol +0 -29
  336. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +0 -23
  337. package/contracts/instance/IAccessManagerSimple.sol +0 -391
  338. package/contracts/instance/IInstanceBase.sol +0 -26
  339. package/contracts/instance/InstanceBase.sol +0 -41
  340. package/contracts/instance/base/ComponentServiceBase.sol +0 -134
  341. package/contracts/instance/base/IInstanceBase.sol +0 -23
  342. package/contracts/instance/service/ComponentOwnerService.sol +0 -317
  343. package/contracts/instance/service/IComponentOwnerService.sol +0 -20
  344. package/contracts/shared/RegisterableUpgradable.sol +0 -16
@@ -0,0 +1,89 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IRisk} from "../module/IRisk.sol";
5
+ import {IService} from "../../shared/IService.sol";
6
+
7
+ import {NftId} from "../../types/NftId.sol";
8
+ import {ReferralId} from "../../types/Referral.sol";
9
+ import {RiskId} from "../../types/RiskId.sol";
10
+ import {StateId} from "../../types/StateId.sol";
11
+ import {Timestamp} from "../../types/Timestamp.sol";
12
+ import {UFixed} from "../../types/UFixed.sol";
13
+ import {Fee} from "../../types/Fee.sol";
14
+
15
+ interface IPolicyService is IService {
16
+
17
+ error ErrorIPolicyServiceInsufficientAllowance(address customer, address tokenHandlerAddress, uint256 amount);
18
+ error ErrorIPolicyServicePremiumAlreadyPaid(NftId policyNftId, uint256 premiumPaidAmount);
19
+ error ErrorIPolicyServicePolicyNotActivated(NftId policyNftId);
20
+ error ErrorIPolicyServicePolicyAlreadyClosed(NftId policyNftId);
21
+ error ErrorIPolicyServicePolicyNotActive(NftId policyNftId, StateId state);
22
+ error ErrorIPolicyServicePremiumNotFullyPaid(NftId policyNftId, uint256 premiumAmount, uint256 premiumPaidAmount);
23
+ error ErrorIPolicyServiceOpenClaims(NftId policyNftId, uint16 openClaimsCount);
24
+ error ErrorIPolicyServicePolicyHasNotExpired(NftId policyNftId, Timestamp expiredAt);
25
+
26
+ /// @dev declines an application represented by {policyNftId}
27
+ /// an application can only be declined in applied state
28
+ /// only the related product may decline an application
29
+ function decline(NftId policyNftId) external;
30
+
31
+ /// @dev underwrites the policy represented by {policyNftId}
32
+ /// sets the policy state to underwritten
33
+ /// may set the policy state to activated and set the activation date
34
+ /// optionally collects premiums and activates the policy.
35
+ /// - premium payment is only attempted if requirePremiumPayment is set to true
36
+ /// - activation is only done if activateAt is a non-zero timestamp
37
+ /// an application can only be underwritten in applied state
38
+ /// only the related product may underwrite an application
39
+ function underwrite(
40
+ NftId policyNftId,
41
+ bool requirePremiumPayment,
42
+ Timestamp activateAt
43
+ ) external;
44
+
45
+ /// @dev collects the premium token for the specified policy
46
+ function collectPremium(NftId policyNftId, Timestamp activateAt) external;
47
+
48
+ /// @dev activates the specified policy and sets the activation date in the policy metadata
49
+ /// to activate a policy it needs to be in underwritten state
50
+ function activate(NftId policyNftId, Timestamp activateAt) external;
51
+
52
+ /// @dev expires the specified policy and sets the expiry date in the policy metadata
53
+ /// to expire a policy it must be in active state, policies may be expired even when the predefined expiry date is still in the future
54
+ /// a policy can only be closed when it has been expired. in addition, it must not have any open claims
55
+ /// this function can only be called by a product. the policy needs to match with the calling product
56
+ function expire(NftId policyNftId) external;
57
+
58
+ /// @dev closes the specified policy and sets the closed data in the policy metadata
59
+ /// a policy can only be closed when it has been expired. in addition, it must not have any open claims
60
+ /// this function can only be called by a product. the policy needs to match with the calling product
61
+ function close(NftId policyNftId) external;
62
+
63
+ /// @dev calculates the total premium amount for the specified attributes
64
+ /// also returns the various fees included in the total premium amount
65
+ function calculatePremium(
66
+ RiskId riskId,
67
+ uint256 sumInsuredAmount,
68
+ uint256 lifetime,
69
+ bytes memory applicationData,
70
+ NftId bundleNftId,
71
+ ReferralId referralId
72
+ )
73
+ external
74
+ view
75
+ returns (
76
+ uint256 premiumAmount,
77
+ uint256 productFeeAmount,
78
+ uint256 poolFeeAmount,
79
+ uint256 bundleFeeAmount,
80
+ uint256 distributionFeeAmount
81
+ );
82
+
83
+ // TODO move function to pool service
84
+ function calculateRequiredCollateral(
85
+ UFixed collateralizationLevel,
86
+ uint256 sumInsuredAmount
87
+ ) external pure returns(uint256 collateralAmount);
88
+
89
+ }
@@ -9,43 +9,12 @@ import {IBundle} from "../module/IBundle.sol";
9
9
  import {IInstance} from "../../instance/IInstance.sol";
10
10
 
11
11
  interface IPoolService is IService {
12
- error ErrorIPoolServiceInsufficientAllowance(address bundleOwner, address tokenHandlerAddress, uint256 amount);
12
+
13
+ function register(address poolAddress) external returns(NftId);
13
14
 
14
15
  function setFees(
15
16
  Fee memory poolFee,
16
17
  Fee memory stakingFee,
17
18
  Fee memory performanceFee
18
19
  ) external;
19
-
20
- function createBundle(
21
- address owner,
22
- Fee memory fee,
23
- uint256 amount,
24
- uint256 lifetime,
25
- bytes calldata filter
26
- ) external returns(NftId bundleNftId);
27
-
28
- function setBundleFee(
29
- NftId bundleNftId,
30
- Fee memory fee
31
- ) external;
32
-
33
- function updateBundle(NftId instanceNftId, NftId bundleNftId, IBundle.BundleInfo memory bundleInfo, StateId state) external;
34
-
35
- function underwritePolicy(IInstance instanceNftId,
36
- NftId policyNftId,
37
- NftId bundleNftId,
38
- uint256 collateralAmount,
39
- uint256 netPremium
40
- ) external;
41
-
42
- // function fundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
43
-
44
- // function defundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
45
-
46
- function lockBundle(NftId bundleNftId) external;
47
-
48
- function unlockBundle(NftId bundleNftId) external;
49
-
50
- // function closeBundle(NftId bundleNftId) external;
51
20
  }
@@ -13,9 +13,9 @@ import {UFixed} from "../../types/UFixed.sol";
13
13
  import {Fee} from "../../types/Fee.sol";
14
14
 
15
15
  interface IProductService is IService {
16
-
17
- error ErrorIProductServiceInsufficientAllowance(address customer, address tokenHandlerAddress, uint256 amount);
18
16
 
17
+ function register(address productAddress) external returns(NftId);
18
+
19
19
  function setFees(
20
20
  Fee memory productFee,
21
21
  Fee memory processingFee
@@ -37,74 +37,4 @@ interface IProductService is IService {
37
37
  RiskId riskId,
38
38
  StateId newState
39
39
  ) external;
40
-
41
-
42
- function calculatePremium(
43
- RiskId riskId,
44
- uint256 sumInsuredAmount,
45
- uint256 lifetime,
46
- bytes memory applicationData,
47
- NftId bundleNftId,
48
- ReferralId referralId
49
- )
50
- external
51
- view
52
- returns (
53
- uint256 premiumAmount,
54
- uint256 productFeeAmount,
55
- uint256 poolFeeAmount,
56
- uint256 bundleFeeAmount,
57
- uint256 distributionFeeAmount
58
- );
59
-
60
-
61
- function createApplication(
62
- address applicationOwner,
63
- RiskId riskId,
64
- uint256 sumInsuredAmount,
65
- uint256 lifetime,
66
- bytes memory applicationData,
67
- NftId bundleNftId,
68
- ReferralId referralId
69
- ) external returns (NftId nftId);
70
-
71
- /**
72
- * @dev revokes the application represented by {policyNftId}.
73
- * an application can only be revoked in applied state.
74
- * only the application holder may revoke an application.
75
- */
76
- function revoke(NftId policyNftId) external;
77
-
78
- /**
79
- * @dev underwrites the policy represented by {policyNftId}.
80
- * optionally collects premiums and activates the policy.
81
- * - premium payment is only attempted if requirePremiumPayment is set to true
82
- * - activation is only done if activateAt is a non-zero timestamp
83
- */
84
- function underwrite(
85
- NftId policyNftId,
86
- bool requirePremiumPayment,
87
- Timestamp activateAt
88
- ) external;
89
-
90
- // function decline(uint256 nftId) external;
91
- // function expire(uint256 nftId) external;
92
-
93
- function collectPremium(NftId policyNftId, Timestamp activateAt) external;
94
-
95
- function activate(NftId policyNftId, Timestamp activateAt) external;
96
-
97
-
98
- function close(NftId nftId) external;
99
-
100
- // function createClaim(uint256 nftId, uint256 claimAmount) external;
101
- // function confirmClaim(uint256 nftId, uint256 claimId, uint256 claimAmount) external;
102
- // function declineClaim(uint256 nftId, uint256 claimId) external;
103
- // function closeClaim(uint256 nftId, uint256 claimId) external;
104
-
105
- function calculateRequiredCollateral(
106
- UFixed collateralizationLevel,
107
- uint256 sumInsuredAmount
108
- ) external pure returns(uint256 collateralAmount);
109
-
110
40
  }
@@ -0,0 +1,474 @@
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, TimestampLib, 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, POOL, POLICY, BUNDLE} from "../../types/ObjectType.sol";
26
+ import {APPLIED, UNDERWRITTEN, ACTIVE, KEEP_STATE, CLOSED} 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
+ //import {RoleId, PRODUCT_OWNER_ROLE} from "../../types/RoleId.sol";
34
+
35
+ import {IService} from "../../shared/IService.sol";
36
+ import {Service} from "../../shared/Service.sol";
37
+ import {ComponentService} from "../base/ComponentService.sol";
38
+ import {IPolicyService} from "./IPolicyService.sol";
39
+ import {InstanceReader} from "../InstanceReader.sol";
40
+ import {IPoolService} from "./IPoolService.sol";
41
+ import {IBundleService} from "./IBundleService.sol";
42
+
43
+
44
+ contract PolicyService is
45
+ ComponentService,
46
+ IPolicyService
47
+ {
48
+ using NftIdLib for NftId;
49
+ using TimestampLib for Timestamp;
50
+
51
+ IPoolService internal _poolService;
52
+ IBundleService internal _bundleService;
53
+
54
+ event LogProductServiceSender(address sender);
55
+
56
+ function _initialize(
57
+ address owner,
58
+ bytes memory data
59
+ )
60
+ internal
61
+ virtual override
62
+ initializer
63
+ {
64
+ address registryAddress;
65
+ address initialOwner;
66
+ (registryAddress, initialOwner) = abi.decode(data, (address, address));
67
+
68
+ initializeService(registryAddress, owner);
69
+
70
+ _poolService = IPoolService(getRegistry().getServiceAddress(POOL(), getMajorVersion()));
71
+ _bundleService = IBundleService(getRegistry().getServiceAddress(BUNDLE(), getMajorVersion()));
72
+
73
+ registerInterface(type(IPolicyService).interfaceId);
74
+ }
75
+
76
+
77
+ function getDomain() public pure override(IService, Service) returns(ObjectType) {
78
+ return POLICY();
79
+ }
80
+
81
+
82
+ function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
83
+ IRegistry.ObjectInfo memory productInfo;
84
+ (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
85
+ product = Product(productInfo.objectAddress);
86
+ }
87
+
88
+ // TODO: no access restrictions
89
+ function calculatePremium(
90
+ RiskId riskId,
91
+ uint256 sumInsuredAmount,
92
+ uint256 lifetime,
93
+ bytes memory applicationData,
94
+ NftId bundleNftId,
95
+ ReferralId referralId
96
+ )
97
+ public
98
+ view
99
+ virtual override
100
+ returns (
101
+ uint256 premiumAmount,
102
+ uint256 productFeeAmount,
103
+ uint256 poolFeeAmount,
104
+ uint256 bundleFeeAmount,
105
+ uint256 distributionFeeAmount
106
+ )
107
+ {
108
+ Product product = _getAndVerifyInstanceAndProduct();
109
+ uint256 netPremiumAmount = product.calculateNetPremium(
110
+ sumInsuredAmount,
111
+ riskId,
112
+ lifetime,
113
+ applicationData
114
+ );
115
+
116
+ (
117
+ productFeeAmount,
118
+ poolFeeAmount,
119
+ bundleFeeAmount,
120
+ distributionFeeAmount
121
+ ) = _calculateFeeAmounts(
122
+ netPremiumAmount,
123
+ product,
124
+ bundleNftId,
125
+ referralId
126
+ );
127
+
128
+ premiumAmount = netPremiumAmount + productFeeAmount;
129
+ premiumAmount += poolFeeAmount + bundleFeeAmount;
130
+ premiumAmount += distributionFeeAmount;
131
+ }
132
+
133
+ function _calculateFeeAmounts(
134
+ uint256 netPremiumAmount,
135
+ Product product,
136
+ NftId bundleNftId,
137
+ ReferralId referralId
138
+ )
139
+ internal
140
+ view
141
+ returns (
142
+ uint256 productFeeAmount,
143
+ uint256 poolFeeAmount,
144
+ uint256 bundleFeeAmount,
145
+ uint256 distributionFeeAmount
146
+ )
147
+ {
148
+ InstanceReader instanceReader;
149
+ {
150
+ IInstance instance = product.getInstance();
151
+ instanceReader = instance.getInstanceReader();
152
+ }
153
+
154
+ NftId poolNftId = product.getPoolNftId();
155
+ IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
156
+ require(bundleInfo.poolNftId == poolNftId,"ERROR:PRS-035:BUNDLE_POOL_MISMATCH");
157
+
158
+ {
159
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(product.getProductNftId());
160
+ (productFeeAmount,) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
161
+ }
162
+ {
163
+ ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
164
+ (poolFeeAmount,) = FeeLib.calculateFee(poolSetupInfo.poolFee, netPremiumAmount);
165
+ }
166
+ {
167
+ NftId distributionNftId = product.getDistributionNftId();
168
+ ISetup.DistributionSetupInfo memory distributionSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
169
+ (distributionFeeAmount,) = FeeLib.calculateFee(distributionSetupInfo.distributionFee, netPremiumAmount);
170
+ }
171
+
172
+ (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
173
+ }
174
+
175
+ function _getAndVerifyUnderwritingSetup(
176
+ IInstance instance,
177
+ InstanceReader instanceReader,
178
+ IPolicy.PolicyInfo memory policyInfo,
179
+ ISetup.ProductSetupInfo memory productSetupInfo
180
+ )
181
+ internal
182
+ view
183
+ returns (
184
+ NftId poolNftId,
185
+ NftId bundleNftId,
186
+ IBundle.BundleInfo memory bundleInfo,
187
+ uint256 collateralAmount
188
+ )
189
+ {
190
+ // check match between policy and bundle (via pool)
191
+ poolNftId = productSetupInfo.poolNftId;
192
+ bundleNftId = policyInfo.bundleNftId;
193
+ bundleInfo = instanceReader.getBundleInfo(bundleNftId);
194
+ require(bundleInfo.poolNftId == poolNftId, "POLICY_BUNDLE_MISMATCH");
195
+
196
+ // calculate required collateral
197
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
198
+
199
+ // obtain remaining return values
200
+ // TODO required collateral amount should be calculated by pool service, not policy service
201
+ collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
202
+ }
203
+
204
+
205
+ function decline(
206
+ NftId policyNftId
207
+ )
208
+ external
209
+ override
210
+ {
211
+ require(false, "ERROR:PRS-235:NOT_YET_IMPLEMENTED");
212
+ }
213
+
214
+
215
+ /// @dev underwites application which includes the locking of the required collateral from the pool.
216
+ function underwrite(
217
+ NftId applicationNftId, // = policyNftId
218
+ bool requirePremiumPayment,
219
+ Timestamp activateAt
220
+ )
221
+ external
222
+ virtual override
223
+ {
224
+ // check caller is registered product
225
+ IInstance instance;
226
+ InstanceReader instanceReader;
227
+ NftId productNftId;
228
+ {
229
+ IRegistry.ObjectInfo memory productInfo;
230
+ (productInfo, instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
231
+ instanceReader = instance.getInstanceReader();
232
+ productNftId = productInfo.nftId;
233
+ }
234
+
235
+ // check policy matches with calling product
236
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(applicationNftId);
237
+ require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
238
+
239
+ // check policy is in state applied
240
+ require(instanceReader.getPolicyState(applicationNftId) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
241
+
242
+ (
243
+ NftId poolNftId,
244
+ NftId bundleNftId,
245
+ IBundle.BundleInfo memory bundleInfo,
246
+ uint256 collateralAmount
247
+ ) = _getAndVerifyUnderwritingSetup(
248
+ instance,
249
+ instanceReader,
250
+ policyInfo,
251
+ instanceReader.getProductSetupInfo(productNftId)
252
+ );
253
+
254
+ StateId newPolicyState = UNDERWRITTEN();
255
+
256
+ // optional activation of policy
257
+ if(activateAt > zeroTimestamp()) {
258
+ newPolicyState = ACTIVE();
259
+ policyInfo.activatedAt = activateAt;
260
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
261
+ }
262
+
263
+ // lock bundle collateral
264
+ uint256 netPremiumAmount = 0; // > 0 if immediate premium payment
265
+
266
+ // optional collection of premium
267
+ if(requirePremiumPayment) {
268
+ netPremiumAmount = _processPremiumByTreasury(
269
+ instance,
270
+ productNftId,
271
+ applicationNftId,
272
+ policyInfo.premiumAmount);
273
+
274
+ policyInfo.premiumPaidAmount += policyInfo.premiumAmount;
275
+ }
276
+
277
+ // lock collateral and update bundle book keeping
278
+ // TODO introduct indirection via pool service?
279
+ // well pool would only need to be involved when a part of the collateral
280
+ // is provided by a "re insurance policy" of the pool
281
+ // but then again the policiy would likely best be attached to the bundle. really? why?
282
+ // retention level: fraction of sum insured that product will cover from pool funds directly
283
+ // eg retention level 30%, payouts up to 30% of the sum insured will be made from the product's pool directly
284
+ // for the remaining 70% the pool owns a policy that will cover claims that exceed the 30% of the sum insured
285
+ // open points:
286
+ // - do we need a link of a bundle to this policy or is it enough to know that the pool has an active policy?
287
+ // - when to buy such policies and for which amount? manual trigger or link to bundle creation and/or funding?
288
+ bundleInfo = _bundleService.lockCollateral(
289
+ instance,
290
+ applicationNftId,
291
+ bundleNftId,
292
+ collateralAmount,
293
+ netPremiumAmount);
294
+
295
+ instance.updatePolicy(applicationNftId, policyInfo, newPolicyState);
296
+
297
+ // also verify/confirm application by pool if necessary
298
+ if(instanceReader.getPoolSetupInfo(poolNftId).isVerifyingApplications) {
299
+ IPoolComponent pool = IPoolComponent(
300
+ getRegistry().getObjectInfo(poolNftId).objectAddress);
301
+
302
+ pool.verifyApplication(
303
+ applicationNftId,
304
+ policyInfo.applicationData,
305
+ bundleInfo.filter,
306
+ collateralAmount);
307
+ }
308
+
309
+ // TODO: add logging
310
+ }
311
+
312
+
313
+ function calculateRequiredCollateral(UFixed collateralizationLevel, uint256 sumInsuredAmount) public pure override returns(uint256 collateralAmount) {
314
+ UFixed sumInsuredUFixed = UFixedLib.toUFixed(sumInsuredAmount);
315
+ UFixed collateralUFixed = collateralizationLevel * sumInsuredUFixed;
316
+ return collateralUFixed.toInt();
317
+ }
318
+
319
+ function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
320
+ // check caller is registered product
321
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
322
+ InstanceReader instanceReader = instance.getInstanceReader();
323
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
324
+
325
+ if (policyInfo.premiumPaidAmount == policyInfo.premiumAmount) {
326
+ revert ErrorIPolicyServicePremiumAlreadyPaid(policyNftId, policyInfo.premiumPaidAmount);
327
+ }
328
+
329
+ uint256 unpaidPremiumAmount = policyInfo.premiumAmount - policyInfo.premiumPaidAmount;
330
+
331
+ uint256 netPremiumAmount = _processPremiumByTreasury(
332
+ instance,
333
+ productInfo.nftId,
334
+ policyNftId,
335
+ unpaidPremiumAmount);
336
+
337
+ policyInfo.premiumPaidAmount += unpaidPremiumAmount;
338
+
339
+ _bundleService.increaseBalance(instance, policyInfo.bundleNftId, netPremiumAmount);
340
+ instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
341
+
342
+ if(activateAt.gtz() && policyInfo.activatedAt.eqz()) {
343
+ activate(policyNftId, activateAt);
344
+ }
345
+
346
+ // TODO: add logging
347
+ }
348
+
349
+ function activate(NftId policyNftId, Timestamp activateAt) public override {
350
+ // check caller is registered product
351
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
352
+ InstanceReader instanceReader = instance.getInstanceReader();
353
+
354
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
355
+
356
+ require(
357
+ policyInfo.activatedAt.eqz(),
358
+ "ERROR:PRS-020:ALREADY_ACTIVATED");
359
+
360
+ policyInfo.activatedAt = activateAt;
361
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
362
+
363
+ instance.updatePolicy(policyNftId, policyInfo, ACTIVE());
364
+
365
+ // TODO: add logging
366
+ }
367
+
368
+
369
+ function expire(
370
+ NftId policyNftId
371
+ )
372
+ external
373
+ override
374
+ // solhint-disable-next-line no-empty-blocks
375
+ {
376
+
377
+ }
378
+
379
+ function close(
380
+ NftId policyNftId
381
+ )
382
+ external
383
+ override
384
+ {
385
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
386
+ InstanceReader instanceReader = instance.getInstanceReader();
387
+
388
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
389
+
390
+ if (policyInfo.activatedAt.eqz()) {
391
+ revert ErrorIPolicyServicePolicyNotActivated(policyNftId);
392
+ }
393
+
394
+ StateId state = instanceReader.getPolicyState(policyNftId);
395
+ if (state != ACTIVE()) {
396
+ revert ErrorIPolicyServicePolicyNotActive(policyNftId, state);
397
+ }
398
+
399
+ if (policyInfo.closedAt.gtz()) {
400
+ revert ErrorIPolicyServicePolicyAlreadyClosed(policyNftId);
401
+ }
402
+
403
+ if (policyInfo.premiumAmount != policyInfo.premiumPaidAmount) {
404
+ revert ErrorIPolicyServicePremiumNotFullyPaid(policyNftId, policyInfo.premiumAmount, policyInfo.premiumPaidAmount);
405
+ }
406
+
407
+ if (policyInfo.openClaimsCount > 0) {
408
+ revert ErrorIPolicyServiceOpenClaims(policyNftId, policyInfo.openClaimsCount);
409
+ }
410
+
411
+ if (TimestampLib.blockTimestamp().lte(policyInfo.expiredAt) && (policyInfo.payoutAmount < policyInfo.sumInsuredAmount)) {
412
+ revert ErrorIPolicyServicePolicyHasNotExpired(policyNftId, policyInfo.expiredAt);
413
+ }
414
+
415
+ policyInfo.closedAt = TimestampLib.blockTimestamp();
416
+
417
+ _bundleService.closePolicy(instance, policyNftId, policyInfo.bundleNftId, policyInfo.sumInsuredAmount);
418
+ instance.updatePolicy(policyNftId, policyInfo, CLOSED());
419
+ }
420
+
421
+ function _getPoolNftId(
422
+ IInstance instance,
423
+ NftId productNftId
424
+ )
425
+ internal
426
+ view
427
+ returns (NftId poolNftid)
428
+ {
429
+ InstanceReader instanceReader = instance.getInstanceReader();
430
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
431
+ return productSetupInfo.poolNftId;
432
+ }
433
+
434
+
435
+ function _processPremiumByTreasury(
436
+ IInstance instance,
437
+ NftId productNftId,
438
+ NftId policyNftId,
439
+ uint256 premiumAmount
440
+ )
441
+ internal
442
+ returns (uint256 netPremiumAmount)
443
+ {
444
+ // process token transfer(s)
445
+ if(premiumAmount > 0) {
446
+ ISetup.ProductSetupInfo memory productSetupInfo = instance.getInstanceReader().getProductSetupInfo(productNftId);
447
+ TokenHandler tokenHandler = productSetupInfo.tokenHandler;
448
+ address policyOwner = getRegistry().ownerOf(policyNftId);
449
+ ISetup.PoolSetupInfo memory poolSetupInfo = instance.getInstanceReader().getPoolSetupInfo(productSetupInfo.poolNftId);
450
+ address poolWallet = poolSetupInfo.wallet;
451
+ netPremiumAmount = premiumAmount;
452
+ Fee memory productFee = productSetupInfo.productFee;
453
+
454
+ if (FeeLib.feeIsZero(productFee)) {
455
+ tokenHandler.transfer(
456
+ policyOwner,
457
+ poolWallet,
458
+ premiumAmount
459
+ );
460
+ } else {
461
+ (uint256 productFeeAmount, uint256 netAmount) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
462
+ address productWallet = productSetupInfo.wallet;
463
+ if (tokenHandler.getToken().allowance(policyOwner, address(tokenHandler)) < premiumAmount) {
464
+ revert ErrorIPolicyServiceInsufficientAllowance(policyOwner, address(tokenHandler), premiumAmount);
465
+ }
466
+ tokenHandler.transfer(policyOwner, productWallet, productFeeAmount);
467
+ tokenHandler.transfer(policyOwner, poolWallet, netAmount);
468
+ netPremiumAmount = netAmount;
469
+ }
470
+ }
471
+
472
+ // TODO: add logging
473
+ }
474
+ }