@etherisc/gif-next 0.0.2-83d1db6-607 → 0.0.2-83e248c-054
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.
- package/README.md +6 -83
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/components/Component.sol/Component.json +10 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +26 -0
- package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IComponent.sol/IComponent.json +100 -0
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +100 -0
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +110 -0
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +100 -0
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +20 -0
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +10 -0
- package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +1 -1
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +1 -1
- package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +2 -2
- package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +380 -116
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +80 -14
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +310 -303
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +76 -57
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +171 -47
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +208 -101
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +62 -22
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +1 -1
- package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +2 -2
- package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.json +85 -30
- package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +8 -8
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +6 -6
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +6 -6
- package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.json +175 -83
- package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +29 -13
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +333 -160
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +78 -14
- package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +372 -86
- package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +55 -7
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +183 -141
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +45 -57
- package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.json +111 -40
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +169 -113
- package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.json +251 -58
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +101 -24
- package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +438 -41
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +430 -14
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +80 -14
- package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +575 -85
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +71 -19
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +468 -55
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +18 -14
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +114 -51
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +16 -12
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -24
- package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +2 -2
- package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +2 -2
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +17 -36
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +7 -7
- package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +23 -11
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +2 -2
- package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
- package/artifacts/contracts/shared/IService.sol/IService.json +80 -14
- package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
- package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
- package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +2 -2
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +2 -2
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -2
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
- package/artifacts/contracts/shared/Service.sol/Service.json +86 -15
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
- package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
- package/artifacts/contracts/test/TestFee.sol/TestFee.json +2 -2
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +2 -2
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
- package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
- package/artifacts/contracts/test/TestService.sol/TestService.json +101 -26
- package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
- package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
- package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
- package/artifacts/contracts/types/Amount.sol/AmountLib.dbg.json +4 -0
- package/artifacts/contracts/types/Amount.sol/AmountLib.json +185 -0
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.json +83 -4
- package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +2 -2
- package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Fee.sol/FeeLib.json +40 -9
- package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
- package/artifacts/contracts/types/Key32.sol/Key32Lib.json +2 -2
- package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
- package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
- package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.json +116 -7
- package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
- package/artifacts/contracts/types/Referral.sol/ReferralLib.json +2 -2
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
- package/artifacts/contracts/types/Seconds.sol/SecondsLib.dbg.json +1 -1
- package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +17 -4
- package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
- package/contracts/components/Component.sol +4 -2
- package/contracts/components/Distribution.sol +6 -2
- package/contracts/components/IComponent.sol +3 -1
- package/contracts/components/IPoolComponent.sol +1 -1
- package/contracts/components/Pool.sol +11 -8
- package/contracts/components/Product.sol +137 -59
- package/contracts/instance/BundleManager.sol +3 -4
- package/contracts/instance/IInstance.sol +25 -21
- package/contracts/instance/IInstanceService.sol +0 -4
- package/contracts/instance/Instance.sol +85 -102
- package/contracts/instance/InstanceAccessManager.sol +16 -11
- package/contracts/instance/InstanceReader.sol +31 -4
- package/contracts/instance/InstanceService.sol +29 -46
- package/contracts/instance/base/ComponentService.sol +17 -30
- package/contracts/instance/base/KeyValueStore.sol +8 -3
- package/contracts/instance/base/Lifecycle.sol +12 -4
- package/contracts/instance/module/IAccess.sol +2 -2
- package/contracts/instance/module/IBundle.sol +6 -4
- package/contracts/instance/module/IComponents.sol +6 -0
- package/contracts/instance/module/IPolicy.sol +11 -6
- package/contracts/instance/service/ApplicationService.sol +19 -14
- package/contracts/instance/service/BundleService.sol +163 -63
- package/contracts/instance/service/ClaimService.sol +114 -26
- package/contracts/instance/service/DistributionService.sol +38 -74
- package/contracts/instance/service/IApplicationService.sol +3 -7
- package/contracts/instance/service/IBundleService.sol +56 -22
- package/contracts/instance/service/IClaimService.sol +46 -15
- package/contracts/instance/service/IDistributionService.sol +1 -0
- package/contracts/instance/service/IPolicyService.sol +70 -5
- package/contracts/instance/service/IPoolService.sol +65 -1
- package/contracts/instance/service/PolicyService.sol +254 -116
- package/contracts/instance/service/PoolService.sol +132 -49
- package/contracts/instance/service/ProductService.sol +21 -52
- package/contracts/registry/IRegistryService.sol +4 -3
- package/contracts/registry/RegistryService.sol +10 -11
- package/contracts/registry/ReleaseManager.sol +20 -18
- package/contracts/shared/IService.sol +4 -6
- package/contracts/shared/Service.sol +21 -7
- package/contracts/test/TestService.sol +1 -1
- package/contracts/types/Amount.sol +65 -0
- package/contracts/types/ClaimId.sol +25 -2
- package/contracts/types/Fee.sol +12 -5
- package/contracts/types/ObjectType.sol +5 -5
- package/contracts/types/PayoutId.sol +33 -5
- package/contracts/types/StateId.sol +6 -2
- package/contracts/types/Timestamp.sol +5 -0
- package/package.json +1 -1
@@ -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
|
}
|
@@ -14,16 +14,21 @@ import {ISetup} from "../module/ISetup.sol";
|
|
14
14
|
|
15
15
|
import {TokenHandler} from "../../shared/TokenHandler.sol";
|
16
16
|
|
17
|
+
import {Amount, AmountLib} from "../../types/Amount.sol";
|
18
|
+
import {ClaimId, ClaimIdLib} from "../../types/ClaimId.sol";
|
17
19
|
import {Timestamp, TimestampLib, zeroTimestamp} from "../../types/Timestamp.sol";
|
18
20
|
import {UFixed, UFixedLib} from "../../types/UFixed.sol";
|
19
|
-
import {ObjectType, APPLICATION, DISTRIBUTION, PRODUCT, POOL, POLICY, BUNDLE} from "../../types/ObjectType.sol";
|
20
|
-
import {APPLIED,
|
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";
|
21
23
|
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
24
|
+
import {PayoutId, PayoutIdLib} from "../../types/PayoutId.sol";
|
22
25
|
import {StateId} from "../../types/StateId.sol";
|
26
|
+
import {VersionPart} from "../../types/Version.sol";
|
23
27
|
|
24
28
|
import {ComponentService} from "../base/ComponentService.sol";
|
25
29
|
import {IApplicationService} from "./IApplicationService.sol";
|
26
30
|
import {IBundleService} from "./IBundleService.sol";
|
31
|
+
import {IClaimService} from "./IClaimService.sol";
|
27
32
|
import {IDistributionService} from "./IDistributionService.sol";
|
28
33
|
import {InstanceReader} from "../InstanceReader.sol";
|
29
34
|
import {IPolicyService} from "./IPolicyService.sol";
|
@@ -39,10 +44,11 @@ contract PolicyService is
|
|
39
44
|
using NftIdLib for NftId;
|
40
45
|
using TimestampLib for Timestamp;
|
41
46
|
|
42
|
-
IPoolService internal _poolService;
|
43
|
-
IBundleService internal _bundleService;
|
44
47
|
IApplicationService internal _applicationService;
|
48
|
+
IBundleService internal _bundleService;
|
49
|
+
IClaimService internal _claimService;
|
45
50
|
IDistributionService internal _distributionService;
|
51
|
+
IPoolService internal _poolService;
|
46
52
|
|
47
53
|
event LogProductServiceSender(address sender);
|
48
54
|
|
@@ -58,59 +64,30 @@ contract PolicyService is
|
|
58
64
|
address initialOwner;
|
59
65
|
(registryAddress, initialOwner) = abi.decode(data, (address, address));
|
60
66
|
|
61
|
-
initializeService(registryAddress, owner);
|
67
|
+
initializeService(registryAddress, address(0), owner);
|
62
68
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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));
|
67
75
|
|
68
76
|
registerInterface(type(IPolicyService).interfaceId);
|
69
77
|
}
|
70
78
|
|
71
79
|
|
72
|
-
function getDomain() public pure override
|
80
|
+
function getDomain() public pure override returns(ObjectType) {
|
73
81
|
return POLICY();
|
74
82
|
}
|
75
83
|
|
76
84
|
|
77
85
|
function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
|
78
86
|
IRegistry.ObjectInfo memory productInfo;
|
79
|
-
(productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
|
87
|
+
(, productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
|
80
88
|
product = Product(productInfo.objectAddress);
|
81
89
|
}
|
82
90
|
|
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
|
-
}
|
113
|
-
|
114
91
|
|
115
92
|
function decline(
|
116
93
|
NftId policyNftId
|
@@ -123,7 +100,7 @@ contract PolicyService is
|
|
123
100
|
|
124
101
|
|
125
102
|
/// @dev underwites application which includes the locking of the required collateral from the pool.
|
126
|
-
function
|
103
|
+
function collateralize(
|
127
104
|
NftId applicationNftId, // = policyNftId
|
128
105
|
bool requirePremiumPayment,
|
129
106
|
Timestamp activateAt
|
@@ -132,42 +109,23 @@ contract PolicyService is
|
|
132
109
|
virtual override
|
133
110
|
{
|
134
111
|
// 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
|
-
}
|
112
|
+
(NftId productNftId,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
|
113
|
+
InstanceReader instanceReader = instance.getInstanceReader();
|
144
114
|
|
145
115
|
// check policy matches with calling product
|
146
|
-
IPolicy.PolicyInfo memory
|
147
|
-
require(
|
116
|
+
IPolicy.PolicyInfo memory applicationInfo = instanceReader.getPolicyInfo(applicationNftId);
|
117
|
+
require(applicationInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
|
148
118
|
|
149
119
|
// check policy is in state applied
|
150
120
|
require(instanceReader.getPolicyState(applicationNftId) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
|
151
121
|
|
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
|
-
StateId newPolicyState = UNDERWRITTEN();
|
122
|
+
StateId newPolicyState = COLLATERALIZED();
|
165
123
|
|
166
124
|
// optional activation of policy
|
167
125
|
if(activateAt > zeroTimestamp()) {
|
168
126
|
newPolicyState = ACTIVE();
|
169
|
-
|
170
|
-
|
127
|
+
applicationInfo.activatedAt = activateAt;
|
128
|
+
applicationInfo.expiredAt = activateAt.addSeconds(applicationInfo.lifetime);
|
171
129
|
}
|
172
130
|
|
173
131
|
// lock bundle collateral
|
@@ -178,48 +136,25 @@ contract PolicyService is
|
|
178
136
|
netPremiumAmount = _processPremiumByTreasury(
|
179
137
|
instance,
|
180
138
|
applicationNftId,
|
181
|
-
|
139
|
+
applicationInfo.premiumAmount);
|
182
140
|
|
183
|
-
|
141
|
+
applicationInfo.premiumPaidAmount += applicationInfo.premiumAmount;
|
184
142
|
}
|
185
143
|
|
186
|
-
//
|
187
|
-
|
188
|
-
|
189
|
-
//
|
190
|
-
//
|
191
|
-
// 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
|
192
149
|
// eg retention level 30%, payouts up to 30% of the sum insured will be made from the product's pool directly
|
193
150
|
// for the remaining 70% the pool owns a policy that will cover claims that exceed the 30% of the sum insured
|
194
|
-
//
|
195
|
-
|
196
|
-
// - when to buy such policies and for which amount? manual trigger or link to bundle creation and/or funding?
|
197
|
-
bundleInfo = _bundleService.lockCollateral(
|
151
|
+
// might also call pool component (for isVerifyingApplications pools)
|
152
|
+
_poolService.lockCollateral(
|
198
153
|
instance,
|
154
|
+
productNftId,
|
199
155
|
applicationNftId,
|
200
|
-
|
201
|
-
|
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
|
-
}
|
156
|
+
applicationInfo,
|
157
|
+
netPremiumAmount); // for pool book keeping (fee + additional capital)
|
223
158
|
|
224
159
|
// TODO: add logging
|
225
160
|
}
|
@@ -233,7 +168,7 @@ contract PolicyService is
|
|
233
168
|
|
234
169
|
function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
|
235
170
|
// check caller is registered product
|
236
|
-
(
|
171
|
+
(NftId productNftId,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
|
237
172
|
InstanceReader instanceReader = instance.getInstanceReader();
|
238
173
|
IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
|
239
174
|
|
@@ -262,7 +197,7 @@ contract PolicyService is
|
|
262
197
|
|
263
198
|
function activate(NftId policyNftId, Timestamp activateAt) public override {
|
264
199
|
// check caller is registered product
|
265
|
-
(
|
200
|
+
(,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
|
266
201
|
InstanceReader instanceReader = instance.getInstanceReader();
|
267
202
|
|
268
203
|
IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
|
@@ -296,7 +231,7 @@ contract PolicyService is
|
|
296
231
|
external
|
297
232
|
override
|
298
233
|
{
|
299
|
-
(
|
234
|
+
(,, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
|
300
235
|
InstanceReader instanceReader = instance.getInstanceReader();
|
301
236
|
|
302
237
|
IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
|
@@ -314,6 +249,7 @@ contract PolicyService is
|
|
314
249
|
revert ErrorIPolicyServicePolicyAlreadyClosed(policyNftId);
|
315
250
|
}
|
316
251
|
|
252
|
+
// TODO consider to allow for underpaid premiums (with the effects of reducing max payouts accordingly)
|
317
253
|
if (policyInfo.premiumAmount != policyInfo.premiumPaidAmount) {
|
318
254
|
revert ErrorIPolicyServicePremiumNotFullyPaid(policyNftId, policyInfo.premiumAmount, policyInfo.premiumPaidAmount);
|
319
255
|
}
|
@@ -322,16 +258,215 @@ contract PolicyService is
|
|
322
258
|
revert ErrorIPolicyServiceOpenClaims(policyNftId, policyInfo.openClaimsCount);
|
323
259
|
}
|
324
260
|
|
325
|
-
if (TimestampLib.blockTimestamp().lte(policyInfo.expiredAt) && (policyInfo.payoutAmount < policyInfo.sumInsuredAmount)) {
|
326
|
-
revert ErrorIPolicyServicePolicyHasNotExpired(policyNftId, policyInfo.expiredAt);
|
327
|
-
}
|
328
|
-
|
329
261
|
policyInfo.closedAt = TimestampLib.blockTimestamp();
|
330
262
|
|
331
|
-
|
263
|
+
_poolService.releaseCollateral(
|
264
|
+
instance,
|
265
|
+
policyNftId,
|
266
|
+
policyInfo);
|
267
|
+
|
332
268
|
instance.updatePolicy(policyNftId, policyInfo, CLOSED());
|
333
269
|
}
|
334
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
|
+
|
335
470
|
function _getPoolNftId(
|
336
471
|
IInstance instance,
|
337
472
|
NftId productNftId
|
@@ -349,13 +484,13 @@ contract PolicyService is
|
|
349
484
|
function _processPremiumByTreasury(
|
350
485
|
IInstance instance,
|
351
486
|
NftId policyNftId,
|
352
|
-
uint256
|
487
|
+
uint256 premiumExpectedAmount
|
353
488
|
)
|
354
489
|
internal
|
355
490
|
returns (uint256 netPremiumAmount)
|
356
491
|
{
|
357
492
|
// process token transfer(s)
|
358
|
-
if(
|
493
|
+
if(premiumExpectedAmount > 0) {
|
359
494
|
NftId productNftId = getRegistry().getObjectInfo(policyNftId).parentNftId;
|
360
495
|
ISetup.ProductSetupInfo memory productSetupInfo = instance.getInstanceReader().getProductSetupInfo(productNftId);
|
361
496
|
IPolicy.PolicyInfo memory policyInfo = instance.getInstanceReader().getPolicyInfo(policyNftId);
|
@@ -372,8 +507,11 @@ contract PolicyService is
|
|
372
507
|
policyInfo.referralId
|
373
508
|
);
|
374
509
|
|
375
|
-
if (premium.premiumAmount !=
|
376
|
-
revert ErrorIPolicyServicePremiumMismatch(
|
510
|
+
if (premium.premiumAmount != premiumExpectedAmount) {
|
511
|
+
revert ErrorIPolicyServicePremiumMismatch(
|
512
|
+
policyNftId,
|
513
|
+
premiumExpectedAmount,
|
514
|
+
premium.premiumAmount);
|
377
515
|
}
|
378
516
|
|
379
517
|
// move product fee to product wallet
|