@etherisc/gif-next 0.0.2-f30e0eb-805 → 0.0.2-f4f2d93-430
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 +10 -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 +34 -14
- 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 +90 -70
- 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 +21 -11
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +208 -62
- 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 +2 -2
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- 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 +124 -53
- package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +21 -13
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +298 -160
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +74 -14
- package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +104 -41
- package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +11 -7
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +189 -123
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +48 -48
- package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.json +80 -14
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +142 -113
- package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.json +80 -14
- 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 +90 -24
- 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 +136 -65
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +27 -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/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/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
- 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/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- 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 +161 -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/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
- 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/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
- 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/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
- 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/Timestamp.sol/TimestampLib.dbg.json +1 -1
- 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/IComponent.sol +3 -1
- package/contracts/components/Pool.sol +8 -4
- package/contracts/instance/Instance.sol +1 -0
- package/contracts/instance/InstanceAccessManager.sol +16 -11
- package/contracts/instance/InstanceReader.sol +1 -0
- package/contracts/instance/InstanceService.sol +19 -19
- package/contracts/instance/base/ComponentService.sol +17 -30
- package/contracts/instance/base/KeyValueStore.sol +8 -3
- 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/service/ApplicationService.sol +9 -9
- package/contracts/instance/service/BundleService.sol +155 -60
- package/contracts/instance/service/ClaimService.sol +3 -3
- package/contracts/instance/service/DistributionService.sol +24 -56
- package/contracts/instance/service/IBundleService.sol +53 -22
- package/contracts/instance/service/IDistributionService.sol +1 -0
- package/contracts/instance/service/IPoolService.sol +65 -1
- package/contracts/instance/service/PolicyService.sol +60 -101
- package/contracts/instance/service/PoolService.sol +132 -49
- package/contracts/instance/service/ProductService.sol +20 -51
- 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 +60 -0
- package/contracts/types/Fee.sol +12 -5
- 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 | 
            -
                     | 
| 24 | 
            -
                     | 
| 25 | 
            -
                     | 
| 26 | 
            -
                     | 
| 27 | 
            -
                     | 
| 28 | 
            -
             | 
| 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  | 
| 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 | 
            -
                 | 
| 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 | 
            -
                     | 
| 64 | 
            -
                     | 
| 65 | 
            -
                     | 
| 66 | 
            -
                     | 
| 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 | 
| 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 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
                )
         | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
                {
         | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 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  | 
| 147 | 
            -
                    require( | 
| 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 | 
            -
                         | 
| 170 | 
            -
                         | 
| 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 | 
            -
                             | 
| 159 | 
            +
                            applicationInfo.premiumAmount);
         | 
| 182 160 |  | 
| 183 | 
            -
                         | 
| 161 | 
            +
                        applicationInfo.premiumPaidAmount += applicationInfo.premiumAmount;
         | 
| 184 162 | 
             
                    }
         | 
| 185 163 |  | 
| 186 | 
            -
                    //  | 
| 187 | 
            -
                     | 
| 188 | 
            -
             | 
| 189 | 
            -
                    //  | 
| 190 | 
            -
                    //  | 
| 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 | 
            -
                    //  | 
| 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(
         | 
| 171 | 
            +
                    // might also call pool component (for isVerifyingApplications pools)
         | 
| 172 | 
            +
                    _poolService.lockCollateral(
         | 
| 198 173 | 
             
                        instance,
         | 
| 174 | 
            +
                        productNftId,
         | 
| 199 175 | 
             
                        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 | 
            -
                    }
         | 
| 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 | 
            -
                    ( | 
| 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 | 
            -
                    ( | 
| 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 | 
            -
                    ( | 
| 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 | 
            -
                     | 
| 286 | 
            +
                    _poolService.releaseCollateral(
         | 
| 287 | 
            +
                        instance, 
         | 
| 288 | 
            +
                        policyNftId, 
         | 
| 289 | 
            +
                        policyInfo);
         | 
| 290 | 
            +
             | 
| 332 291 | 
             
                    instance.updatePolicy(policyNftId, policyInfo, CLOSED());
         | 
| 333 292 | 
             
                }
         | 
| 334 293 |  |