@etherisc/gif-next 0.0.2-e922e07-736 → 0.0.2-e94f4c7-084

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