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