@etherisc/gif-next 0.0.2-f29e479-370 → 0.0.2-f2df3e2-873

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 (269) hide show
  1. package/README.md +6 -83
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
  3. package/artifacts/contracts/components/Component.sol/Component.json +78 -89
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +139 -140
  6. package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IComponent.sol/IComponent.json +156 -64
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +181 -112
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +353 -176
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +162 -138
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +299 -245
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +83 -162
  18. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
  19. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
  20. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +1 -1
  21. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +64 -50
  22. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +1 -1
  23. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.json +5 -0
  24. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  25. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +527 -400
  26. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  27. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +175 -51
  28. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  29. package/artifacts/contracts/instance/Instance.sol/Instance.json +500 -612
  30. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  31. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +472 -126
  32. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  33. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +253 -236
  34. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  35. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +305 -211
  36. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  37. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +71 -23
  38. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +1 -1
  39. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +8 -13
  40. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.json +86 -31
  42. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  43. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  44. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  45. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +40 -10
  46. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  47. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +36 -11
  48. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  49. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +56 -73
  50. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  51. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +4 -0
  52. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.json +10 -0
  53. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  54. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  55. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  56. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  58. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.dbg.json +1 -1
  59. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.json +291 -100
  60. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
  61. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +46 -22
  62. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +1 -1
  63. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +422 -252
  64. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  65. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +78 -14
  66. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +1 -1
  67. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +373 -87
  68. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
  69. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +55 -7
  70. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  71. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +579 -123
  72. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  73. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +71 -47
  74. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +1 -1
  75. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.json +200 -46
  76. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +1 -1
  77. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +241 -188
  78. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.json +251 -58
  80. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +444 -25
  82. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  83. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +430 -76
  84. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +511 -14
  86. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +80 -14
  88. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +1 -1
  89. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +544 -153
  90. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
  91. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +51 -27
  92. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  93. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +562 -52
  94. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  95. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +24 -12
  96. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  97. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +115 -52
  98. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +1 -1
  99. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +16 -12
  100. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  101. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +15 -2
  102. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  103. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +19 -0
  104. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  105. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -24
  106. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  107. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +18 -0
  108. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  109. package/artifacts/contracts/registry/Registry.sol/Registry.json +31 -12
  110. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +1 -1
  111. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +2 -2
  112. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  113. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +18 -37
  114. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  115. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +7 -7
  116. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +1 -1
  117. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +23 -11
  118. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  119. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +2 -2
  120. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  121. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  122. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  123. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
  124. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  125. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  126. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  127. package/artifacts/contracts/shared/IService.sol/IService.json +80 -14
  128. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  129. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  130. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  131. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
  132. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +2 -2
  133. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  134. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  135. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  136. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +3 -3
  137. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
  138. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -2
  139. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  140. package/artifacts/contracts/shared/Service.sol/Service.json +87 -16
  141. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  142. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +2 -2
  143. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  144. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  145. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  146. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  147. package/artifacts/contracts/test/TestFee.sol/TestFee.json +2 -2
  148. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  149. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +3 -3
  150. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +6 -6
  152. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  153. package/artifacts/contracts/test/TestService.sol/TestService.json +102 -27
  154. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  155. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  156. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  157. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  158. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  159. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  160. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  161. package/artifacts/contracts/types/Amount.sol/AmountLib.dbg.json +4 -0
  162. package/artifacts/contracts/types/Amount.sol/AmountLib.json +185 -0
  163. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  164. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  165. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
  167. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.json +83 -4
  168. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  169. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +2 -2
  170. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  171. package/artifacts/contracts/types/Fee.sol/FeeLib.json +40 -9
  172. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  173. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +2 -2
  174. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  175. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +17 -4
  176. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  177. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  178. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  179. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  180. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  181. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
  182. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.json +116 -7
  183. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  184. package/artifacts/contracts/types/Referral.sol/ReferralLib.json +23 -4
  185. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
  187. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  188. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  189. package/artifacts/contracts/types/Seconds.sol/SecondsLib.dbg.json +4 -0
  190. package/artifacts/contracts/types/Seconds.sol/SecondsLib.json +124 -0
  191. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  192. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  193. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  194. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +38 -7
  195. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  196. package/artifacts/contracts/types/UFixed.sol/MathLib.json +2 -2
  197. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  198. package/artifacts/contracts/types/UFixed.sol/UFixedLib.json +2 -2
  199. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  200. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  201. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  202. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +2 -2
  203. package/contracts/components/Component.sol +99 -87
  204. package/contracts/components/Distribution.sol +18 -21
  205. package/contracts/components/IComponent.sol +40 -18
  206. package/contracts/components/IDistributionComponent.sol +1 -22
  207. package/contracts/components/IPoolComponent.sol +73 -47
  208. package/contracts/components/IProductComponent.sol +3 -2
  209. package/contracts/components/Pool.sol +178 -130
  210. package/contracts/components/Product.sol +157 -71
  211. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +13 -0
  212. package/contracts/instance/BundleManager.sol +10 -9
  213. package/contracts/instance/Cloneable.sol +7 -2
  214. package/contracts/instance/IInstance.sol +37 -27
  215. package/contracts/instance/IInstanceService.sol +18 -9
  216. package/contracts/instance/Instance.sol +117 -98
  217. package/contracts/instance/InstanceAccessManager.sol +388 -158
  218. package/contracts/instance/InstanceReader.sol +36 -12
  219. package/contracts/instance/InstanceService.sol +193 -191
  220. package/contracts/instance/ObjectManager.sol +6 -8
  221. package/contracts/instance/base/ComponentService.sol +17 -30
  222. package/contracts/instance/base/KeyValueStore.sol +13 -5
  223. package/contracts/instance/base/Lifecycle.sol +23 -6
  224. package/contracts/instance/module/IAccess.sol +21 -14
  225. package/contracts/instance/module/IBundle.sol +8 -5
  226. package/contracts/instance/module/IComponents.sol +41 -0
  227. package/contracts/instance/module/IDistribution.sol +2 -1
  228. package/contracts/instance/module/IPolicy.sol +37 -7
  229. package/contracts/instance/module/ISetup.sol +7 -22
  230. package/contracts/instance/service/ApplicationService.sol +137 -50
  231. package/contracts/instance/service/BundleService.sol +221 -83
  232. package/contracts/instance/service/ClaimService.sol +114 -26
  233. package/contracts/instance/service/DistributionService.sol +174 -118
  234. package/contracts/instance/service/IApplicationService.sol +9 -13
  235. package/contracts/instance/service/IBundleService.sol +68 -26
  236. package/contracts/instance/service/IClaimService.sol +46 -15
  237. package/contracts/instance/service/IDistributionService.sol +20 -4
  238. package/contracts/instance/service/IPolicyService.sol +69 -21
  239. package/contracts/instance/service/IPoolService.sol +82 -3
  240. package/contracts/instance/service/PolicyService.sol +297 -232
  241. package/contracts/instance/service/PoolService.sol +214 -20
  242. package/contracts/instance/service/ProductService.sol +31 -54
  243. package/contracts/registry/ChainNft.sol +8 -0
  244. package/contracts/registry/IRegistry.sol +2 -0
  245. package/contracts/registry/IRegistryService.sol +4 -3
  246. package/contracts/registry/ITransferInterceptor.sol +1 -0
  247. package/contracts/registry/Registry.sol +23 -20
  248. package/contracts/registry/RegistryService.sol +15 -16
  249. package/contracts/registry/ReleaseManager.sol +20 -18
  250. package/contracts/shared/IService.sol +4 -6
  251. package/contracts/shared/Registerable.sol +2 -2
  252. package/contracts/shared/Service.sol +21 -7
  253. package/contracts/shared/TokenHandler.sol +11 -5
  254. package/contracts/test/TestService.sol +1 -1
  255. package/contracts/types/Amount.sol +65 -0
  256. package/contracts/types/Blocknumber.sol +1 -0
  257. package/contracts/types/ClaimId.sol +25 -2
  258. package/contracts/types/Fee.sol +13 -5
  259. package/contracts/types/NftId.sol +8 -0
  260. package/contracts/types/ObjectType.sol +6 -5
  261. package/contracts/types/PayoutId.sol +33 -5
  262. package/contracts/types/Referral.sol +4 -0
  263. package/contracts/types/RoleId.sol +13 -6
  264. package/contracts/types/Seconds.sol +54 -0
  265. package/contracts/types/StateId.sol +7 -2
  266. package/contracts/types/Timestamp.sol +18 -13
  267. package/contracts/types/UFixed.sol +1 -0
  268. package/contracts/types/Version.sol +1 -0
  269. package/package.json +1 -1
@@ -2,43 +2,39 @@
2
2
  pragma solidity ^0.8.19;
3
3
 
4
4
  import {IRegistry} from "../../registry/IRegistry.sol";
5
- import {IProductComponent} from "../../components/IProductComponent.sol";
6
5
  import {Product} from "../../components/Product.sol";
7
- import {IPoolComponent} from "../../components/IPoolComponent.sol";
6
+ import {IComponents} from "../module/IComponents.sol";
8
7
  import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
9
8
  import {IInstance} from "../IInstance.sol";
10
9
  import {IPolicy} from "../module/IPolicy.sol";
10
+ import {IPoolComponent} from "../../components/IPoolComponent.sol";
11
11
  import {IRisk} from "../module/IRisk.sol";
12
12
  import {IBundle} from "../module/IBundle.sol";
13
- import {IProductService} from "./IProductService.sol";
14
- import {ITreasury} from "../module/ITreasury.sol";
15
13
  import {ISetup} from "../module/ISetup.sol";
16
14
 
17
15
  import {TokenHandler} from "../../shared/TokenHandler.sol";
18
16
 
19
- import {IVersionable} from "../../shared/IVersionable.sol";
20
- import {Versionable} from "../../shared/Versionable.sol";
21
-
17
+ import {Amount, AmountLib} from "../../types/Amount.sol";
18
+ import {ClaimId, ClaimIdLib} from "../../types/ClaimId.sol";
22
19
  import {Timestamp, TimestampLib, zeroTimestamp} from "../../types/Timestamp.sol";
23
20
  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";
21
+ import {ObjectType, APPLICATION, DISTRIBUTION, PRODUCT, POOL, POLICY, BUNDLE, CLAIM} from "../../types/ObjectType.sol";
22
+ import {APPLIED, COLLATERALIZED, ACTIVE, KEEP_STATE, CLOSED, DECLINED, CONFIRMED} from "../../types/StateId.sol";
23
+ import {NftId, NftIdLib} from "../../types/NftId.sol";
24
+ import {PayoutId, PayoutIdLib} from "../../types/PayoutId.sol";
31
25
  import {StateId} from "../../types/StateId.sol";
32
- import {Version, VersionLib} from "../../types/Version.sol";
33
- //import {RoleId, PRODUCT_OWNER_ROLE} from "../../types/RoleId.sol";
26
+ import {VersionPart} from "../../types/Version.sol";
34
27
 
35
- import {IService} from "../../shared/IService.sol";
36
- import {Service} from "../../shared/Service.sol";
37
28
  import {ComponentService} from "../base/ComponentService.sol";
38
- import {IPolicyService} from "./IPolicyService.sol";
29
+ import {IApplicationService} from "./IApplicationService.sol";
30
+ import {IBundleService} from "./IBundleService.sol";
31
+ import {IClaimService} from "./IClaimService.sol";
32
+ import {IDistributionService} from "./IDistributionService.sol";
39
33
  import {InstanceReader} from "../InstanceReader.sol";
34
+ import {IPolicyService} from "./IPolicyService.sol";
40
35
  import {IPoolService} from "./IPoolService.sol";
41
- import {IBundleService} from "./IBundleService.sol";
36
+ import {IService} from "../../shared/IService.sol";
37
+ import {Service} from "../../shared/Service.sol";
42
38
 
43
39
 
44
40
  contract PolicyService is
@@ -48,8 +44,11 @@ contract PolicyService is
48
44
  using NftIdLib for NftId;
49
45
  using TimestampLib for Timestamp;
50
46
 
51
- IPoolService internal _poolService;
47
+ IApplicationService internal _applicationService;
52
48
  IBundleService internal _bundleService;
49
+ IClaimService internal _claimService;
50
+ IDistributionService internal _distributionService;
51
+ IPoolService internal _poolService;
53
52
 
54
53
  event LogProductServiceSender(address sender);
55
54
 
@@ -65,143 +64,30 @@ contract PolicyService is
65
64
  address initialOwner;
66
65
  (registryAddress, initialOwner) = abi.decode(data, (address, address));
67
66
 
68
- initializeService(registryAddress, owner);
67
+ initializeService(registryAddress, address(0), owner);
69
68
 
70
- _poolService = IPoolService(getRegistry().getServiceAddress(POOL(), getMajorVersion()));
71
- _bundleService = IBundleService(getRegistry().getServiceAddress(BUNDLE(), getMajorVersion()));
69
+ VersionPart majorVersion = getVersion().toMajorPart();
70
+ _poolService = IPoolService(getRegistry().getServiceAddress(POOL(), majorVersion));
71
+ _bundleService = IBundleService(getRegistry().getServiceAddress(BUNDLE(), majorVersion));
72
+ _claimService = IClaimService(getRegistry().getServiceAddress(CLAIM(), majorVersion));
73
+ _applicationService = IApplicationService(getRegistry().getServiceAddress(APPLICATION(), majorVersion));
74
+ _distributionService = IDistributionService(getRegistry().getServiceAddress(DISTRIBUTION(), majorVersion));
72
75
 
73
76
  registerInterface(type(IPolicyService).interfaceId);
74
77
  }
75
78
 
76
79
 
77
- function getDomain() public pure override(IService, Service) returns(ObjectType) {
80
+ function getDomain() public pure override returns(ObjectType) {
78
81
  return POLICY();
79
82
  }
80
83
 
81
84
 
82
85
  function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
83
86
  IRegistry.ObjectInfo memory productInfo;
84
- (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
87
+ (, productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
85
88
  product = Product(productInfo.objectAddress);
86
89
  }
87
90
 
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
- // FIXME: call distributionService.calculateFeeAmount
170
- (distributionFeeAmount,) = FeeLib.calculateFee(distributionSetupInfo.distributionFee, netPremiumAmount);
171
- }
172
-
173
- (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
174
- }
175
-
176
- function _getAndVerifyUnderwritingSetup(
177
- IInstance instance,
178
- InstanceReader instanceReader,
179
- IPolicy.PolicyInfo memory policyInfo,
180
- ISetup.ProductSetupInfo memory productSetupInfo
181
- )
182
- internal
183
- view
184
- returns (
185
- NftId poolNftId,
186
- NftId bundleNftId,
187
- IBundle.BundleInfo memory bundleInfo,
188
- uint256 collateralAmount
189
- )
190
- {
191
- // check match between policy and bundle (via pool)
192
- poolNftId = productSetupInfo.poolNftId;
193
- bundleNftId = policyInfo.bundleNftId;
194
- bundleInfo = instanceReader.getBundleInfo(bundleNftId);
195
- require(bundleInfo.poolNftId == poolNftId, "POLICY_BUNDLE_MISMATCH");
196
-
197
- // calculate required collateral
198
- ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
199
-
200
- // obtain remaining return values
201
- // TODO required collateral amount should be calculated by pool service, not policy service
202
- collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
203
- }
204
-
205
91
 
206
92
  function decline(
207
93
  NftId policyNftId
@@ -214,7 +100,7 @@ contract PolicyService is
214
100
 
215
101
 
216
102
  /// @dev underwites application which includes the locking of the required collateral from the pool.
217
- function underwrite(
103
+ function collateralize(
218
104
  NftId applicationNftId, // = policyNftId
219
105
  bool requirePremiumPayment,
220
106
  Timestamp activateAt
@@ -223,42 +109,23 @@ contract PolicyService is
223
109
  virtual override
224
110
  {
225
111
  // check caller is registered product
226
- IInstance instance;
227
- InstanceReader instanceReader;
228
- NftId productNftId;
229
- {
230
- IRegistry.ObjectInfo memory productInfo;
231
- (productInfo, instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
232
- instanceReader = instance.getInstanceReader();
233
- productNftId = productInfo.nftId;
234
- }
112
+ (NftId productNftId,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
113
+ InstanceReader instanceReader = instance.getInstanceReader();
235
114
 
236
115
  // check policy matches with calling product
237
- IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(applicationNftId);
238
- require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
116
+ IPolicy.PolicyInfo memory applicationInfo = instanceReader.getPolicyInfo(applicationNftId);
117
+ require(applicationInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
239
118
 
240
119
  // check policy is in state applied
241
120
  require(instanceReader.getPolicyState(applicationNftId) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
242
121
 
243
- (
244
- NftId poolNftId,
245
- NftId bundleNftId,
246
- IBundle.BundleInfo memory bundleInfo,
247
- uint256 collateralAmount
248
- ) = _getAndVerifyUnderwritingSetup(
249
- instance,
250
- instanceReader,
251
- policyInfo,
252
- instanceReader.getProductSetupInfo(productNftId)
253
- );
254
-
255
- StateId newPolicyState = UNDERWRITTEN();
122
+ StateId newPolicyState = COLLATERALIZED();
256
123
 
257
124
  // optional activation of policy
258
125
  if(activateAt > zeroTimestamp()) {
259
126
  newPolicyState = ACTIVE();
260
- policyInfo.activatedAt = activateAt;
261
- policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
127
+ applicationInfo.activatedAt = activateAt;
128
+ applicationInfo.expiredAt = activateAt.addSeconds(applicationInfo.lifetime);
262
129
  }
263
130
 
264
131
  // lock bundle collateral
@@ -268,44 +135,26 @@ contract PolicyService is
268
135
  if(requirePremiumPayment) {
269
136
  netPremiumAmount = _processPremiumByTreasury(
270
137
  instance,
271
- productNftId,
272
138
  applicationNftId,
273
- policyInfo.premiumAmount);
139
+ applicationInfo.premiumAmount);
274
140
 
275
- policyInfo.premiumPaidAmount += policyInfo.premiumAmount;
141
+ applicationInfo.premiumPaidAmount += applicationInfo.premiumAmount;
276
142
  }
277
143
 
278
- // lock collateral and update bundle book keeping
279
- // TODO introduct indirection via pool service?
280
- // well pool would only need to be involved when a part of the collateral
281
- // is provided by a "re insurance policy" of the pool
282
- // but then again the policiy would likely best be attached to the bundle. really? why?
283
- // retention level: fraction of sum insured that product will cover from pool funds directly
144
+ // store updated policy info
145
+ instance.updatePolicy(applicationNftId, applicationInfo, newPolicyState);
146
+
147
+ // lock collateral and update pool and bundle book keeping
148
+ // pool retention level: fraction of sum insured that product will cover from pool funds directly
284
149
  // eg retention level 30%, payouts up to 30% of the sum insured will be made from the product's pool directly
285
150
  // for the remaining 70% the pool owns a policy that will cover claims that exceed the 30% of the sum insured
286
- // open points:
287
- // - do we need a link of a bundle to this policy or is it enough to know that the pool has an active policy?
288
- // - when to buy such policies and for which amount? manual trigger or link to bundle creation and/or funding?
289
- bundleInfo = _bundleService.lockCollateral(
151
+ // might also call pool component (for isVerifyingApplications pools)
152
+ _poolService.lockCollateral(
290
153
  instance,
154
+ productNftId,
291
155
  applicationNftId,
292
- bundleNftId,
293
- collateralAmount,
294
- netPremiumAmount);
295
-
296
- instance.updatePolicy(applicationNftId, policyInfo, newPolicyState);
297
-
298
- // also verify/confirm application by pool if necessary
299
- if(instanceReader.getPoolSetupInfo(poolNftId).isVerifyingApplications) {
300
- IPoolComponent pool = IPoolComponent(
301
- getRegistry().getObjectInfo(poolNftId).objectAddress);
302
-
303
- pool.verifyApplication(
304
- applicationNftId,
305
- policyInfo.applicationData,
306
- bundleInfo.filter,
307
- collateralAmount);
308
- }
156
+ applicationInfo,
157
+ netPremiumAmount); // for pool book keeping (fee + additional capital)
309
158
 
310
159
  // TODO: add logging
311
160
  }
@@ -319,7 +168,7 @@ contract PolicyService is
319
168
 
320
169
  function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
321
170
  // check caller is registered product
322
- (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
171
+ (NftId productNftId,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
323
172
  InstanceReader instanceReader = instance.getInstanceReader();
324
173
  IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
325
174
 
@@ -331,7 +180,6 @@ contract PolicyService is
331
180
 
332
181
  uint256 netPremiumAmount = _processPremiumByTreasury(
333
182
  instance,
334
- productInfo.nftId,
335
183
  policyNftId,
336
184
  unpaidPremiumAmount);
337
185
 
@@ -349,7 +197,7 @@ contract PolicyService is
349
197
 
350
198
  function activate(NftId policyNftId, Timestamp activateAt) public override {
351
199
  // check caller is registered product
352
- (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
200
+ (,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
353
201
  InstanceReader instanceReader = instance.getInstanceReader();
354
202
 
355
203
  IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
@@ -383,7 +231,7 @@ contract PolicyService is
383
231
  external
384
232
  override
385
233
  {
386
- (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
234
+ (,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
387
235
  InstanceReader instanceReader = instance.getInstanceReader();
388
236
 
389
237
  IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
@@ -401,6 +249,7 @@ contract PolicyService is
401
249
  revert ErrorIPolicyServicePolicyAlreadyClosed(policyNftId);
402
250
  }
403
251
 
252
+ // TODO consider to allow for underpaid premiums (with the effects of reducing max payouts accordingly)
404
253
  if (policyInfo.premiumAmount != policyInfo.premiumPaidAmount) {
405
254
  revert ErrorIPolicyServicePremiumNotFullyPaid(policyNftId, policyInfo.premiumAmount, policyInfo.premiumPaidAmount);
406
255
  }
@@ -409,16 +258,215 @@ contract PolicyService is
409
258
  revert ErrorIPolicyServiceOpenClaims(policyNftId, policyInfo.openClaimsCount);
410
259
  }
411
260
 
412
- if (TimestampLib.blockTimestamp().lte(policyInfo.expiredAt) && (policyInfo.payoutAmount < policyInfo.sumInsuredAmount)) {
413
- revert ErrorIPolicyServicePolicyHasNotExpired(policyNftId, policyInfo.expiredAt);
414
- }
415
-
416
261
  policyInfo.closedAt = TimestampLib.blockTimestamp();
417
262
 
418
- _bundleService.closePolicy(instance, policyNftId, policyInfo.bundleNftId, policyInfo.sumInsuredAmount);
263
+ _poolService.releaseCollateral(
264
+ instance,
265
+ policyNftId,
266
+ policyInfo);
267
+
419
268
  instance.updatePolicy(policyNftId, policyInfo, CLOSED());
420
269
  }
421
270
 
271
+ function submitClaim(
272
+ NftId policyNftId,
273
+ Amount claimAmount,
274
+ bytes memory claimData
275
+ )
276
+ external
277
+ virtual
278
+ returns (ClaimId claimId)
279
+ {
280
+ (
281
+ IInstance instance,
282
+ InstanceReader instanceReader,
283
+ IPolicy.PolicyInfo memory policyInfo
284
+ ) = _verifyCallerWithPolicy(policyNftId);
285
+
286
+ // check policy is in its active period
287
+ if(policyInfo.activatedAt.eqz() || TimestampLib.blockTimestamp() >= policyInfo.expiredAt) {
288
+ revert ErrorPolicyServicePolicyNotOpen(policyNftId);
289
+ }
290
+
291
+ // check policy including this claim is still within sum insured
292
+ if(policyInfo.payoutAmount.toInt() + claimAmount.toInt() > policyInfo.sumInsuredAmount) {
293
+ revert ErrorPolicyServiceClaimExceedsSumInsured(
294
+ policyNftId,
295
+ AmountLib.toAmount(policyInfo.sumInsuredAmount),
296
+ AmountLib.toAmount(policyInfo.payoutAmount.toInt() + claimAmount.toInt()));
297
+ }
298
+
299
+ // create new claim
300
+ claimId = ClaimIdLib.toClaimId(policyInfo.claimsCount + 1);
301
+ _claimService.submit(instance, policyNftId, claimId, claimAmount, claimData);
302
+
303
+ // update and save policy info with instance
304
+ policyInfo.claimsCount += 1;
305
+ policyInfo.openClaimsCount += 1;
306
+ instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
307
+
308
+ emit LogPolicyServiceClaimSubmitted(policyNftId, claimId, claimAmount);
309
+ }
310
+
311
+ function confirmClaim(
312
+ NftId policyNftId,
313
+ ClaimId claimId,
314
+ Amount confirmedAmount
315
+ )
316
+ external
317
+ {
318
+ (
319
+ IInstance instance,
320
+ InstanceReader instanceReader,
321
+ IPolicy.PolicyInfo memory policyInfo
322
+ ) = _verifyCallerWithPolicy(policyNftId);
323
+
324
+ // check/update claim info
325
+ _claimService.confirm(instance, instanceReader, policyNftId, claimId, confirmedAmount);
326
+
327
+ // update and save policy info with instance
328
+ instance.updatePolicy(policyNftId, policyInfo, CONFIRMED());
329
+
330
+ emit LogPolicyServiceClaimConfirmed(policyNftId, claimId, confirmedAmount);
331
+ }
332
+
333
+ function declineClaim(
334
+ NftId policyNftId,
335
+ ClaimId claimId
336
+ )
337
+ external
338
+ {
339
+ (
340
+ IInstance instance,
341
+ InstanceReader instanceReader,
342
+ IPolicy.PolicyInfo memory policyInfo
343
+ ) = _verifyCallerWithPolicy(policyNftId);
344
+
345
+ // check/update claim info
346
+ _claimService.decline(instance, instanceReader, policyNftId, claimId);
347
+
348
+ // update and save policy info with instance
349
+ policyInfo.openClaimsCount -= 1;
350
+ instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
351
+
352
+ emit LogPolicyServiceClaimDeclined(policyNftId, claimId);
353
+ }
354
+
355
+ function closeClaim(
356
+ NftId policyNftId,
357
+ ClaimId claimId
358
+ )
359
+ external
360
+ {
361
+ (
362
+ IInstance instance,
363
+ InstanceReader instanceReader,
364
+ IPolicy.PolicyInfo memory policyInfo
365
+ ) = _verifyCallerWithPolicy(policyNftId);
366
+
367
+ // check/update claim info
368
+ _claimService.close(instance, instanceReader, policyNftId, claimId);
369
+
370
+ // update and save policy info with instance
371
+ policyInfo.openClaimsCount -= 1;
372
+ instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
373
+
374
+ emit LogPolicyServiceClaimClosed(policyNftId, claimId);
375
+ }
376
+
377
+ function createPayout(
378
+ NftId policyNftId,
379
+ ClaimId claimId,
380
+ Amount amount,
381
+ bytes memory data
382
+ )
383
+ external
384
+ returns (PayoutId payoutId)
385
+ {
386
+ (
387
+ IInstance instance,
388
+ InstanceReader instanceReader,
389
+ IPolicy.PolicyInfo memory policyInfo
390
+ ) = _verifyCallerWithPolicy(policyNftId);
391
+
392
+ IPolicy.ClaimInfo memory claimInfo = instanceReader.getClaimInfo(policyNftId, claimId);
393
+ StateId claimState = instanceReader.getClaimState(policyNftId, claimId);
394
+
395
+ // TODO add checks
396
+ // claim needs to be open
397
+ // claim.paidAmount + amount <= claim.claimAmount
398
+
399
+ // check/update claim info
400
+ uint8 claimNo = claimInfo.payoutsCount + 1;
401
+ payoutId = PayoutIdLib.toPayoutId(claimId, claimNo);
402
+ _claimService.createPayout(
403
+ instance,
404
+ policyNftId,
405
+ payoutId,
406
+ amount,
407
+ data);
408
+
409
+ // update and save policy info with instance
410
+ policyInfo.payoutAmount.add(amount);
411
+ instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
412
+
413
+ emit LogPolicyServicePayoutCreated(policyNftId, payoutId, amount);
414
+ }
415
+
416
+ function processPayout(
417
+ NftId policyNftId,
418
+ PayoutId payoutId
419
+ )
420
+ external
421
+ {
422
+ (
423
+ IInstance instance,
424
+ InstanceReader instanceReader,
425
+ IPolicy.PolicyInfo memory policyInfo
426
+ ) = _verifyCallerWithPolicy(policyNftId);
427
+
428
+ // check/update claim info
429
+ (
430
+ Amount amount,
431
+ bool payoutIsClosingClaim
432
+ ) = _claimService.processPayout(
433
+ instance,
434
+ instanceReader,
435
+ policyNftId,
436
+ payoutId);
437
+
438
+ // update policy info if affected by processed payout
439
+ if(payoutIsClosingClaim) {
440
+ policyInfo.openClaimsCount -= 1;
441
+ instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
442
+ }
443
+
444
+ emit LogPolicyServicePayoutProcessed(policyNftId, payoutId, amount);
445
+ }
446
+
447
+ function _verifyCallerWithPolicy(
448
+ NftId policyNftId
449
+ )
450
+ internal
451
+ returns (
452
+ IInstance instance,
453
+ InstanceReader instanceReader,
454
+ IPolicy.PolicyInfo memory policyInfo
455
+ )
456
+ {
457
+ NftId productNftId;
458
+ (productNftId,, instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
459
+ instanceReader = instance.getInstanceReader();
460
+
461
+ // check caller(product) policy match
462
+ policyInfo = instanceReader.getPolicyInfo(policyNftId);
463
+ if(policyInfo.productNftId != productNftId) {
464
+ revert ErrorPolicyServicePolicyProductMismatch(policyNftId,
465
+ policyInfo.productNftId,
466
+ productNftId);
467
+ }
468
+ }
469
+
422
470
  function _getPoolNftId(
423
471
  IInstance instance,
424
472
  NftId productNftId
@@ -435,40 +483,57 @@ contract PolicyService is
435
483
 
436
484
  function _processPremiumByTreasury(
437
485
  IInstance instance,
438
- NftId productNftId,
439
486
  NftId policyNftId,
440
- uint256 premiumAmount
487
+ uint256 premiumExpectedAmount
441
488
  )
442
489
  internal
443
490
  returns (uint256 netPremiumAmount)
444
491
  {
445
492
  // process token transfer(s)
446
- if(premiumAmount > 0) {
493
+ if(premiumExpectedAmount > 0) {
494
+ NftId productNftId = getRegistry().getObjectInfo(policyNftId).parentNftId;
447
495
  ISetup.ProductSetupInfo memory productSetupInfo = instance.getInstanceReader().getProductSetupInfo(productNftId);
496
+ IPolicy.PolicyInfo memory policyInfo = instance.getInstanceReader().getPolicyInfo(policyNftId);
448
497
  TokenHandler tokenHandler = productSetupInfo.tokenHandler;
449
498
  address policyOwner = getRegistry().ownerOf(policyNftId);
450
- ISetup.PoolSetupInfo memory poolSetupInfo = instance.getInstanceReader().getPoolSetupInfo(productSetupInfo.poolNftId);
451
- address poolWallet = poolSetupInfo.wallet;
452
- netPremiumAmount = premiumAmount;
453
- Fee memory productFee = productSetupInfo.productFee;
454
-
455
- if (FeeLib.feeIsZero(productFee)) {
456
- tokenHandler.transfer(
457
- policyOwner,
458
- poolWallet,
459
- premiumAmount
499
+ address poolWallet = instance.getInstanceReader().getComponentInfo(productSetupInfo.poolNftId).wallet;
500
+ IPolicy.Premium memory premium = _applicationService.calculatePremium(
501
+ productNftId,
502
+ policyInfo.riskId,
503
+ policyInfo.sumInsuredAmount,
504
+ policyInfo.lifetime,
505
+ policyInfo.applicationData,
506
+ policyInfo.bundleNftId,
507
+ policyInfo.referralId
460
508
  );
461
- } else {
462
- (uint256 productFeeAmount, uint256 netAmount) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
463
- address productWallet = productSetupInfo.wallet;
464
- if (tokenHandler.getToken().allowance(policyOwner, address(tokenHandler)) < premiumAmount) {
465
- revert ErrorIPolicyServiceInsufficientAllowance(policyOwner, address(tokenHandler), premiumAmount);
466
- }
467
- tokenHandler.transfer(policyOwner, productWallet, productFeeAmount);
468
- tokenHandler.transfer(policyOwner, poolWallet, netAmount);
469
- netPremiumAmount = netAmount;
470
- // TODO: also move distribution tokens to distribution wallet and call `Distribution.processSale` to update distribution balances
509
+
510
+ if (premium.premiumAmount != premiumExpectedAmount) {
511
+ revert ErrorIPolicyServicePremiumMismatch(
512
+ policyNftId,
513
+ premiumExpectedAmount,
514
+ premium.premiumAmount);
515
+ }
516
+
517
+ // move product fee to product wallet
518
+ address productWallet = productSetupInfo.wallet;
519
+ if (tokenHandler.getToken().allowance(policyOwner, address(tokenHandler)) < premium.premiumAmount) {
520
+ revert ErrorIPolicyServiceInsufficientAllowance(policyOwner, address(tokenHandler), premium.premiumAmount);
471
521
  }
522
+ tokenHandler.transfer(policyOwner, productWallet, premium.productFeeFixAmount + premium.productFeeVarAmount);
523
+
524
+ // move distribution fee to distribution wallet
525
+ ISetup.DistributionSetupInfo memory distributionSetupInfo = instance.getInstanceReader().getDistributionSetupInfo(productSetupInfo.distributionNftId);
526
+ address distributionWallet = distributionSetupInfo.wallet;
527
+ uint256 distributionFeeAmountToTransfer = premium.distributionFeeFixAmount + premium.distributionFeeVarAmount - premium.discountAmount;
528
+ tokenHandler.transfer(policyOwner, distributionWallet, distributionFeeAmountToTransfer);
529
+ _distributionService.processSale(productSetupInfo.distributionNftId, policyInfo.referralId, premium, distributionFeeAmountToTransfer);
530
+
531
+ // move netpremium to pool wallet
532
+ tokenHandler.transfer(policyOwner, poolWallet, premium.netPremiumAmount);
533
+
534
+ // TODO: move pool related tokens too
535
+ // TODO: move bundle related tokens too
536
+ netPremiumAmount = premium.netPremiumAmount;
472
537
  }
473
538
 
474
539
  // TODO: add logging