@etherisc/gif-next 0.0.2-f30e0eb-805 → 0.0.2-f4f2d93-430

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) 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 +10 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +10 -0
  6. package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IComponent.sol/IComponent.json +100 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +100 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +110 -0
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +100 -0
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +20 -0
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +10 -0
  18. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +1 -1
  19. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +1 -1
  20. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +2 -2
  21. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +1 -1
  22. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  23. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +34 -14
  24. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  25. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +80 -14
  26. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  27. package/artifacts/contracts/instance/Instance.sol/Instance.json +90 -70
  28. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  29. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +76 -57
  30. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  31. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +21 -11
  32. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  33. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +208 -62
  34. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  35. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +62 -22
  36. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +1 -1
  37. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +2 -2
  38. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +1 -1
  39. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.json +85 -30
  40. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  42. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  43. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  44. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  45. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  46. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +6 -6
  47. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  48. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +1 -1
  49. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  50. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  51. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  52. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  53. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  54. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.dbg.json +1 -1
  55. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.json +124 -53
  56. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
  57. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +21 -13
  58. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +1 -1
  59. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +298 -160
  60. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  61. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +74 -14
  62. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +1 -1
  63. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +104 -41
  64. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
  65. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +11 -7
  66. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  67. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +189 -123
  68. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  69. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +48 -48
  70. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +1 -1
  71. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.json +80 -14
  72. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +1 -1
  73. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +142 -113
  74. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +1 -1
  75. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.json +80 -14
  76. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  77. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +101 -24
  78. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  79. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +90 -24
  80. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +430 -14
  82. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  83. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +80 -14
  84. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +136 -65
  86. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +27 -19
  88. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  89. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +468 -55
  90. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  91. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +18 -14
  92. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  93. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +114 -51
  94. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +1 -1
  95. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +16 -12
  96. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  97. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  98. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  99. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -24
  100. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  101. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  102. package/artifacts/contracts/registry/Registry.sol/Registry.json +2 -2
  103. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +1 -1
  104. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +2 -2
  105. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  106. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +17 -36
  107. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  108. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +7 -7
  109. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +1 -1
  110. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +23 -11
  111. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  112. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  113. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  114. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  115. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
  116. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  117. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  118. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  119. package/artifacts/contracts/shared/IService.sol/IService.json +80 -14
  120. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  121. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  122. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
  123. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  124. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  125. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
  126. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  127. package/artifacts/contracts/shared/Service.sol/Service.json +86 -15
  128. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  129. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  130. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  131. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  132. package/artifacts/contracts/test/TestFee.sol/TestFee.json +2 -2
  133. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  134. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  135. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  136. package/artifacts/contracts/test/TestService.sol/TestService.json +101 -26
  137. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  138. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  139. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  140. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  141. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  142. package/artifacts/contracts/types/Amount.sol/AmountLib.dbg.json +4 -0
  143. package/artifacts/contracts/types/Amount.sol/AmountLib.json +161 -0
  144. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  145. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  146. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
  147. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  148. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  149. package/artifacts/contracts/types/Fee.sol/FeeLib.json +40 -9
  150. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  151. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  152. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  153. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  154. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  155. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
  156. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  157. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  158. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  159. package/artifacts/contracts/types/Seconds.sol/SecondsLib.dbg.json +1 -1
  160. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  161. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  162. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  163. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  164. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  165. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  166. package/contracts/components/Component.sol +4 -2
  167. package/contracts/components/IComponent.sol +3 -1
  168. package/contracts/components/Pool.sol +8 -4
  169. package/contracts/instance/Instance.sol +1 -0
  170. package/contracts/instance/InstanceAccessManager.sol +16 -11
  171. package/contracts/instance/InstanceReader.sol +1 -0
  172. package/contracts/instance/InstanceService.sol +19 -19
  173. package/contracts/instance/base/ComponentService.sol +17 -30
  174. package/contracts/instance/base/KeyValueStore.sol +8 -3
  175. package/contracts/instance/module/IAccess.sol +2 -2
  176. package/contracts/instance/module/IBundle.sol +6 -4
  177. package/contracts/instance/module/IComponents.sol +6 -0
  178. package/contracts/instance/service/ApplicationService.sol +9 -9
  179. package/contracts/instance/service/BundleService.sol +155 -60
  180. package/contracts/instance/service/ClaimService.sol +3 -3
  181. package/contracts/instance/service/DistributionService.sol +24 -56
  182. package/contracts/instance/service/IBundleService.sol +53 -22
  183. package/contracts/instance/service/IDistributionService.sol +1 -0
  184. package/contracts/instance/service/IPoolService.sol +65 -1
  185. package/contracts/instance/service/PolicyService.sol +60 -101
  186. package/contracts/instance/service/PoolService.sol +132 -49
  187. package/contracts/instance/service/ProductService.sol +20 -51
  188. package/contracts/registry/IRegistryService.sol +4 -3
  189. package/contracts/registry/RegistryService.sol +10 -11
  190. package/contracts/registry/ReleaseManager.sol +20 -18
  191. package/contracts/shared/IService.sol +4 -6
  192. package/contracts/shared/Service.sol +21 -7
  193. package/contracts/test/TestService.sol +1 -1
  194. package/contracts/types/Amount.sol +60 -0
  195. package/contracts/types/Fee.sol +12 -5
  196. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.19;
3
3
 
4
+ import {Amount} from "../../types/Amount.sol";
4
5
  import {NftId} from "../../types/NftId.sol";
5
6
  import {Fee} from "../../types/Fee.sol";
6
7
  import {IService} from "../../shared/IService.sol";
@@ -8,55 +9,85 @@ import {IBundle} from "../module/IBundle.sol";
8
9
  import {IInstance} from "../../instance/IInstance.sol";
9
10
  import {Seconds} from "../../types/Seconds.sol";
10
11
  import {StateId} from "../../types/StateId.sol";
12
+ import {Timestamp} from "../../types/Timestamp.sol";
11
13
 
12
14
  interface IBundleService is IService {
13
15
 
14
16
  event LogBundleServiceBundleActivated(NftId bundleNftId);
15
17
  event LogBundleServiceBundleLocked(NftId bundleNftId);
16
- event LogBundleServiceBundleClosed(NftId bundleNftId);
17
18
 
18
19
  error ErrorBundleServiceInsufficientAllowance(address bundleOwner, address tokenHandlerAddress, uint256 amount);
19
- error ErrorBundleServiceBundleNotOpen(NftId bundleNftId, StateId state);
20
+ error ErrorBundleServiceBundleNotOpen(NftId bundleNftId, StateId state, Timestamp expiredAt);
21
+ error ErrorBundleServiceCapacityInsufficient(NftId bundleNftId, uint capacityAmount, uint collateralAmount);
20
22
  error ErrorBundleServiceBundleWithOpenPolicies(NftId bundleNftId, uint256 openPoliciesCount);
21
23
 
24
+ /// @dev create a new bundle for the specified attributes
25
+ /// may only be called by pool service
22
26
  function create(
23
- address owner,
24
- Fee memory fee,
25
- uint256 amount,
26
- Seconds lifetime,
27
- bytes calldata filter
28
- ) external returns(NftId bundleNftId);
27
+ IInstance instance, // instance relevant for bundle
28
+ NftId poolNftId, // the pool the bundle will be linked to
29
+ address owner, // initial bundle owner
30
+ Fee memory fee, // fees deducted from premium that go to bundle owner
31
+ Amount stakingAmount, // staking amount - staking fees result in initial bundle capital
32
+ Seconds lifetime, // initial duration for which new policies are covered
33
+ bytes calldata filter // optional use case specific criteria that define if a policy may be covered by this bundle
34
+ )
35
+ external
36
+ returns(NftId bundleNftId); // the nft id of the newly created bundle
37
+
38
+ /// @dev locks the specified bundle, locked bundles are not available to collateralize new policies
39
+ /// only active bundles may be locked
40
+ /// may only be called by registered and unlocked pool components
41
+ function lock(NftId bundleNftId) external;
42
+
43
+ /// @dev activates the specified bundle
44
+ /// only locked bundles may be unlocked
45
+ /// may only be called by registered and unlocked pool components
46
+ function unlock(NftId bundleNftId) external;
29
47
 
48
+ /// @dev closes the specified bundle
49
+ /// only open bundles (active or locked) may be closed
50
+ /// to close a bundle it may not have any non-closed polices attached to it
51
+ /// may only be called by registered and unlocked pool components
52
+ function close(
53
+ IInstance instance,
54
+ NftId bundleNftId
55
+ ) external;
30
56
 
57
+ /// @dev set bundle fee to provided value
58
+ /// may only be called by registered and unlocked pool components
31
59
  function setFee(
32
60
  NftId bundleNftId,
33
61
  Fee memory fee
34
62
  ) external;
35
63
 
36
64
 
65
+ /// @dev locks the specified collateral in the bundle
66
+ /// the locked collateral is added to the bundle locked capital
67
+ /// the bundles' fees are updated with the fees for this premium
68
+ /// the premium (minus bundle fee) is added to the bundle capital
69
+ /// may only be called by pool service
37
70
  function lockCollateral(
38
71
  IInstance instanceNftId,
39
72
  NftId policyNftId,
40
73
  NftId bundleNftId,
41
74
  uint256 collateralAmount,
42
- uint256 netPremium
43
- )
44
- external
45
- returns (
46
- IBundle.BundleInfo memory bundleInfo
47
- );
75
+ uint256 premium // premium amount after pool fee
76
+ ) external;
48
77
 
49
- function increaseBalance(IInstance instance, NftId bundleNftId, uint256 amount) external;
50
78
 
51
- function closePolicy(IInstance instance, NftId policyNftId, NftId bundleNftId, uint256 collateralAmount) external;
79
+ /// @dev releases the specified collateral in the bundle
80
+ /// may only be called by pool service
81
+ function releaseCollateral(
82
+ IInstance instance,
83
+ NftId policyNftId,
84
+ NftId bundleNftId,
85
+ uint256 collateralAmount
86
+ ) external;
87
+
88
+ function increaseBalance(IInstance instance, NftId bundleNftId, uint256 amount) external;
52
89
 
53
90
  // function stake(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
54
91
 
55
92
  // function unstake(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
56
-
57
- function lock(NftId bundleNftId) external;
58
-
59
- function unlock(NftId bundleNftId) external;
60
-
61
- function close(NftId bundleNftId) external;
62
93
  }
@@ -12,6 +12,7 @@ import {Timestamp} from "../../types/Timestamp.sol";
12
12
 
13
13
 
14
14
  interface IDistributionService is IService {
15
+ error ErrorDistributionServiceCallerNotRegistered(address caller);
15
16
  error ErrorIDistributionServiceParentNftIdNotInstance(NftId nftId, NftId parentNftId);
16
17
  error ErrorIDistributionServiceCallerNotDistributor(address caller);
17
18
  error ErrorIDistributionServiceInvalidReferralId(ReferralId referralId);
@@ -1,12 +1,15 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.19;
3
3
 
4
+ import {Amount} from "../../types/Amount.sol";
4
5
  import {Fee} from "../../types/Fee.sol";
5
6
  import {NftId} from "../../types/NftId.sol";
6
- import {IService} from "../../shared/IService.sol";
7
7
  import {IBundle} from "../module/IBundle.sol";
8
8
  import {IInstance} from "../../instance/IInstance.sol";
9
+ import {IPolicy} from "../module/IPolicy.sol";
10
+ import {IService} from "../../shared/IService.sol";
9
11
  import {RoleId} from "../../types/RoleId.sol";
12
+ import {Seconds} from "../../types/Seconds.sol";
10
13
  import {StateId} from "../../types/StateId.sol";
11
14
 
12
15
  interface IPoolService is IService {
@@ -14,7 +17,11 @@ interface IPoolService is IService {
14
17
  event LogPoolServiceMaxCapitalAmountUpdated(NftId poolNftId, uint256 previousMaxCapitalAmount, uint256 currentMaxCapitalAmount);
15
18
  event LogPoolServiceBundleOwnerRoleSet(NftId poolNftId, RoleId bundleOwnerRole);
16
19
 
20
+ event LogPoolServiceBundleCreated(NftId instanceNftId, NftId poolNftId, NftId bundleNftId);
21
+ event LogPoolServiceBundleClosed(NftId instanceNftId, NftId poolNftId, NftId bundleNftId);
22
+
17
23
  error ErrorPoolServiceBundleOwnerRoleAlreadySet(NftId poolNftId);
24
+ error ErrorPoolServiceBundlePoolMismatch(NftId bundlePoolNftId, NftId productPoolNftId);
18
25
 
19
26
  /// @dev registers a new pool with the registry service
20
27
  function register(address poolAddress) external returns(NftId);
@@ -32,4 +39,61 @@ interface IPoolService is IService {
32
39
  Fee memory stakingFee,
33
40
  Fee memory performanceFee
34
41
  ) external;
42
+
43
+
44
+ /// @dev locks required collateral to cover the specified application (and turn it into a policy)
45
+ /// - retention level == 1: the full collateral amount will be locked by the specified bundle
46
+ /// - retention level < 1: a part of the coverage is provided by the specified bundle, the rest by the pool component
47
+ /// in which case the pool component might hold a re-insurance policy
48
+ /// may only be called by the policy service for unlocked pool components
49
+ function lockCollateral(
50
+ IInstance instance,
51
+ NftId productNftId,
52
+ NftId applicationNftId,
53
+ IPolicy.PolicyInfo memory applicationInfo,
54
+ uint256 premiumAmount
55
+ ) external;
56
+
57
+
58
+ /// @dev releases the remaining collateral linked to the specified policy
59
+ /// may only be called by the policy service for unlocked pool components
60
+ function releaseCollateral(
61
+ IInstance instance,
62
+ NftId policyNftId,
63
+ IPolicy.PolicyInfo memory policyInfo
64
+ ) external;
65
+
66
+
67
+ /// @dev create a new bundle for the provided parameters
68
+ /// staking fees will be deducted by the pool service from the staking amount
69
+ /// may only be called by registered and unlocked pool components
70
+ function createBundle(
71
+ address owner, // initial bundle owner
72
+ Fee memory fee, // fees deducted from premium that go to bundle owner
73
+ Amount stakingAmount, // staking amount - staking fees result in initial bundle capital
74
+ Seconds lifetime, // initial duration for which new policies are covered
75
+ bytes calldata filter // optional use case specific criteria that define if a policy may be covered by this bundle
76
+ )
77
+ external
78
+ returns(NftId bundleNftId); // the nft id of the newly created bundle
79
+
80
+
81
+ /// @dev closes the specified bundle
82
+ /// only open bundles (active or locked) may be closed
83
+ /// to close a bundle it may not have any non-closed polices attached to it
84
+ /// bundle fees and remaining capital (after deduction of the performance fee) will be transferred to the bundle owner
85
+ /// may only be called by registered and unlocked pool components
86
+ function closeBundle(NftId bundleNftId) external;
87
+
88
+
89
+ /// @dev increase stakes for bundle
90
+ /// staking fees will be deducted by the pool service from the staking amount
91
+ /// may only be called by registered and unlocked pool components
92
+ // function stake(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
93
+
94
+
95
+ /// @dev decrease stakes for bundle
96
+ /// performance fees will be deducted by the pool service from the staking amount
97
+ /// may only be called by registered and unlocked pool components
98
+ // function unstake(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
35
99
  }
@@ -20,6 +20,7 @@ import {ObjectType, APPLICATION, DISTRIBUTION, PRODUCT, POOL, POLICY, BUNDLE} fr
20
20
  import {APPLIED, UNDERWRITTEN, ACTIVE, KEEP_STATE, CLOSED} from "../../types/StateId.sol";
21
21
  import {NftId, NftIdLib} from "../../types/NftId.sol";
22
22
  import {StateId} from "../../types/StateId.sol";
23
+ import {VersionPart} from "../../types/Version.sol";
23
24
 
24
25
  import {ComponentService} from "../base/ComponentService.sol";
25
26
  import {IApplicationService} from "./IApplicationService.sol";
@@ -58,58 +59,54 @@ contract PolicyService is
58
59
  address initialOwner;
59
60
  (registryAddress, initialOwner) = abi.decode(data, (address, address));
60
61
 
61
- initializeService(registryAddress, owner);
62
+ initializeService(registryAddress, address(0), owner);
62
63
 
63
- _poolService = IPoolService(getRegistry().getServiceAddress(POOL(), getMajorVersion()));
64
- _bundleService = IBundleService(getRegistry().getServiceAddress(BUNDLE(), getMajorVersion()));
65
- _applicationService = IApplicationService(getRegistry().getServiceAddress(APPLICATION(), getMajorVersion()));
66
- _distributionService = IDistributionService(getRegistry().getServiceAddress(DISTRIBUTION(), getMajorVersion()));
64
+ VersionPart majorVersion = getVersion().toMajorPart();
65
+ _poolService = IPoolService(getRegistry().getServiceAddress(POOL(), majorVersion));
66
+ _bundleService = IBundleService(getRegistry().getServiceAddress(BUNDLE(), majorVersion));
67
+ _applicationService = IApplicationService(getRegistry().getServiceAddress(APPLICATION(), majorVersion));
68
+ _distributionService = IDistributionService(getRegistry().getServiceAddress(DISTRIBUTION(), majorVersion));
67
69
 
68
70
  registerInterface(type(IPolicyService).interfaceId);
69
71
  }
70
72
 
71
73
 
72
- function getDomain() public pure override(IService, Service) returns(ObjectType) {
74
+ function getDomain() public pure override returns(ObjectType) {
73
75
  return POLICY();
74
76
  }
75
77
 
76
78
 
77
79
  function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
78
80
  IRegistry.ObjectInfo memory productInfo;
79
- (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
81
+ (, productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
80
82
  product = Product(productInfo.objectAddress);
81
83
  }
82
84
 
83
- function _getAndVerifyUnderwritingSetup(
84
- IInstance instance,
85
- InstanceReader instanceReader,
86
- IPolicy.PolicyInfo memory policyInfo,
87
- ISetup.ProductSetupInfo memory productSetupInfo
88
- )
89
- internal
90
- view
91
- returns (
92
- NftId poolNftId,
93
- NftId bundleNftId,
94
- IBundle.BundleInfo memory bundleInfo,
95
- uint256 collateralAmount
96
- )
97
- {
98
- // check match between policy and bundle (via pool)
99
- poolNftId = productSetupInfo.poolNftId;
100
- bundleNftId = policyInfo.bundleNftId;
101
- bundleInfo = instanceReader.getBundleInfo(bundleNftId);
102
- require(bundleInfo.poolNftId == poolNftId, "POLICY_BUNDLE_MISMATCH");
103
-
104
- // calculate required collateral
105
- IComponents.ComponentInfo memory componentInfo = instanceReader.getComponentInfo(poolNftId);
106
- IComponents.PoolInfo memory poolInfo = abi.decode(
107
- componentInfo.data, (IComponents.PoolInfo));
108
-
109
- // obtain remaining return values
110
- // TODO required collateral amount should be calculated by pool service, not policy service
111
- collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
112
- }
85
+ // function _getAndVerifyUnderwritingSetup(
86
+ // IInstance instance,
87
+ // InstanceReader instanceReader,
88
+ // IPolicy.PolicyInfo memory policyInfo,
89
+ // ISetup.ProductSetupInfo memory productSetupInfo
90
+ // )
91
+ // internal
92
+ // view
93
+ // returns (
94
+ // NftId poolNftId,
95
+ // IComponents.PoolInfo memory poolInfo,
96
+ // NftId bundleNftId,
97
+ // IBundle.BundleInfo memory bundleInfo
98
+ // )
99
+ // {
100
+ // // check match between policy and bundle (via pool)
101
+ // poolNftId = productSetupInfo.poolNftId;
102
+ // bundleNftId = policyInfo.bundleNftId;
103
+ // bundleInfo = instanceReader.getBundleInfo(bundleNftId);
104
+ // require(bundleInfo.poolNftId == poolNftId, "BUNDLE_POOL_MISMATCH");
105
+
106
+ // // calculate required collateral
107
+ // IComponents.ComponentInfo memory componentInfo = instanceReader.getComponentInfo(poolNftId);
108
+ // poolInfo = abi.decode(componentInfo.data, (IComponents.PoolInfo));
109
+ // }
113
110
 
114
111
 
115
112
  function decline(
@@ -132,42 +129,23 @@ contract PolicyService is
132
129
  virtual override
133
130
  {
134
131
  // check caller is registered product
135
- IInstance instance;
136
- InstanceReader instanceReader;
137
- NftId productNftId;
138
- {
139
- IRegistry.ObjectInfo memory productInfo;
140
- (productInfo, instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
141
- instanceReader = instance.getInstanceReader();
142
- productNftId = productInfo.nftId;
143
- }
132
+ (NftId productNftId,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
133
+ InstanceReader instanceReader = instance.getInstanceReader();
144
134
 
145
135
  // check policy matches with calling product
146
- IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(applicationNftId);
147
- require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
136
+ IPolicy.PolicyInfo memory applicationInfo = instanceReader.getPolicyInfo(applicationNftId);
137
+ require(applicationInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
148
138
 
149
139
  // check policy is in state applied
150
140
  require(instanceReader.getPolicyState(applicationNftId) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
151
141
 
152
- (
153
- NftId poolNftId,
154
- NftId bundleNftId,
155
- IBundle.BundleInfo memory bundleInfo,
156
- uint256 collateralAmount
157
- ) = _getAndVerifyUnderwritingSetup(
158
- instance,
159
- instanceReader,
160
- policyInfo,
161
- instanceReader.getProductSetupInfo(productNftId)
162
- );
163
-
164
142
  StateId newPolicyState = UNDERWRITTEN();
165
143
 
166
144
  // optional activation of policy
167
145
  if(activateAt > zeroTimestamp()) {
168
146
  newPolicyState = ACTIVE();
169
- policyInfo.activatedAt = activateAt;
170
- policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
147
+ applicationInfo.activatedAt = activateAt;
148
+ applicationInfo.expiredAt = activateAt.addSeconds(applicationInfo.lifetime);
171
149
  }
172
150
 
173
151
  // lock bundle collateral
@@ -178,48 +156,25 @@ contract PolicyService is
178
156
  netPremiumAmount = _processPremiumByTreasury(
179
157
  instance,
180
158
  applicationNftId,
181
- policyInfo.premiumAmount);
159
+ applicationInfo.premiumAmount);
182
160
 
183
- policyInfo.premiumPaidAmount += policyInfo.premiumAmount;
161
+ applicationInfo.premiumPaidAmount += applicationInfo.premiumAmount;
184
162
  }
185
163
 
186
- // lock collateral and update bundle book keeping
187
- // TODO introduct indirection via pool service?
188
- // well pool would only need to be involved when a part of the collateral
189
- // is provided by a "re insurance policy" of the pool
190
- // but then again the policiy would likely best be attached to the bundle. really? why?
191
- // retention level: fraction of sum insured that product will cover from pool funds directly
164
+ // store updated policy info
165
+ instance.updatePolicy(applicationNftId, applicationInfo, newPolicyState);
166
+
167
+ // lock collateral and update pool and bundle book keeping
168
+ // pool retention level: fraction of sum insured that product will cover from pool funds directly
192
169
  // eg retention level 30%, payouts up to 30% of the sum insured will be made from the product's pool directly
193
170
  // for the remaining 70% the pool owns a policy that will cover claims that exceed the 30% of the sum insured
194
- // open points:
195
- // - do we need a link of a bundle to this policy or is it enough to know that the pool has an active policy?
196
- // - when to buy such policies and for which amount? manual trigger or link to bundle creation and/or funding?
197
- bundleInfo = _bundleService.lockCollateral(
171
+ // might also call pool component (for isVerifyingApplications pools)
172
+ _poolService.lockCollateral(
198
173
  instance,
174
+ productNftId,
199
175
  applicationNftId,
200
- bundleNftId,
201
- collateralAmount,
202
- netPremiumAmount);
203
-
204
- instance.updatePolicy(applicationNftId, policyInfo, newPolicyState);
205
-
206
- // also verify/confirm application by pool if necessary
207
- if(abi.decode(
208
- instanceReader.getComponentInfo(poolNftId).data,
209
- (IComponents.PoolInfo)
210
- ).isVerifyingApplications
211
- )
212
- {
213
- IPoolComponent pool = IPoolComponent(
214
- getRegistry().getObjectInfo(poolNftId).objectAddress);
215
-
216
- pool.verifyApplication(
217
- applicationNftId,
218
- policyInfo.applicationData,
219
- bundleNftId,
220
- bundleInfo.filter,
221
- collateralAmount);
222
- }
176
+ applicationInfo,
177
+ netPremiumAmount); // for pool book keeping (fee + additional capital)
223
178
 
224
179
  // TODO: add logging
225
180
  }
@@ -233,7 +188,7 @@ contract PolicyService is
233
188
 
234
189
  function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
235
190
  // check caller is registered product
236
- (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
191
+ (NftId productNftId,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
237
192
  InstanceReader instanceReader = instance.getInstanceReader();
238
193
  IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
239
194
 
@@ -262,7 +217,7 @@ contract PolicyService is
262
217
 
263
218
  function activate(NftId policyNftId, Timestamp activateAt) public override {
264
219
  // check caller is registered product
265
- (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
220
+ (,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
266
221
  InstanceReader instanceReader = instance.getInstanceReader();
267
222
 
268
223
  IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
@@ -296,7 +251,7 @@ contract PolicyService is
296
251
  external
297
252
  override
298
253
  {
299
- (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
254
+ (,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
300
255
  InstanceReader instanceReader = instance.getInstanceReader();
301
256
 
302
257
  IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
@@ -328,7 +283,11 @@ contract PolicyService is
328
283
 
329
284
  policyInfo.closedAt = TimestampLib.blockTimestamp();
330
285
 
331
- _bundleService.closePolicy(instance, policyNftId, policyInfo.bundleNftId, policyInfo.sumInsuredAmount);
286
+ _poolService.releaseCollateral(
287
+ instance,
288
+ policyNftId,
289
+ policyInfo);
290
+
332
291
  instance.updatePolicy(policyNftId, policyInfo, CLOSED());
333
292
  }
334
293