@etherisc/gif-next 0.0.2-f1e0c66-773 → 0.0.2-f1f3b2c-994
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 +7 -2
- package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.dbg.json +1 -1
- package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.json +81 -63
- package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.dbg.json +1 -1
- package/artifacts/contracts/authorization/Authorization.sol/Authorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/Authorization.sol/Authorization.json +2 -2
- package/artifacts/contracts/authorization/IAccess.sol/IAccess.dbg.json +1 -1
- package/artifacts/contracts/authorization/IAccessAdmin.sol/IAccessAdmin.dbg.json +1 -1
- package/artifacts/contracts/authorization/IAccessAdmin.sol/IAccessAdmin.json +48 -30
- package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IModuleAuthorization.sol/IModuleAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.json +21 -2
- package/artifacts/contracts/authorization/ModuleAuthorization.sol/ModuleAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/ModuleAuthorization.sol/ModuleAuthorization.json +2 -2
- package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.json +72 -9
- package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.dbg.json +1 -1
- package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.json +63 -248
- package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.dbg.json +1 -1
- package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.json +16 -16
- package/artifacts/contracts/distribution/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/distribution/Distribution.sol/Distribution.json +21 -222
- package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.json +134 -286
- package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +84 -120
- package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.json +21 -37
- package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.json +49 -62
- package/artifacts/contracts/examples/fire/DamageLevel.sol/DamageLevelLib.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/DamageLevel.sol/DamageLevelLib.json +22 -0
- package/artifacts/contracts/examples/fire/FirePool.sol/FirePool.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FirePool.sol/FirePool.json +1512 -0
- package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.json +410 -0
- package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.json +1999 -0
- package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.json +414 -0
- package/artifacts/contracts/examples/fire/FireUSD.sol/FireUSD.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FireUSD.sol/FireUSD.json +376 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.json +1432 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.json +1192 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.json +1566 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.json +2001 -0
- package/artifacts/contracts/instance/BundleSet.sol/BundleSet.dbg.json +1 -1
- package/artifacts/contracts/instance/BundleSet.sol/BundleSet.json +2 -2
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +10 -99
- package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +145 -111
- package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +14 -14
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +437 -124
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +39 -146
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +61 -81
- package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +285 -218
- package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.json +2 -2
- package/artifacts/contracts/instance/base/Cloneable.sol/Cloneable.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.json +2 -2
- package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.json +45 -4
- package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.json +2 -2
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
- 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/mock/Dip.sol/Dip.dbg.json +1 -1
- package/artifacts/contracts/mock/Dip.sol/Dip.json +2 -2
- package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.dbg.json +1 -1
- package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.json +47 -232
- package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.dbg.json +1 -1
- package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.json +18 -18
- package/artifacts/contracts/oracle/IOracle.sol/IOracle.dbg.json +1 -1
- package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.dbg.json +1 -1
- package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.json +15 -31
- package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +1 -1
- package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +1 -1
- package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +15 -216
- package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +1 -1
- package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +37 -144
- package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +60 -80
- package/artifacts/contracts/pool/BasicPool.sol/BasicPool.dbg.json +1 -1
- package/artifacts/contracts/pool/BasicPool.sol/BasicPool.json +51 -274
- package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.dbg.json +1 -1
- package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.json +16 -16
- package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
- package/artifacts/contracts/pool/BundleService.sol/BundleService.json +319 -188
- package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +130 -94
- package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
- package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +149 -23
- package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +44 -88
- package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +360 -171
- package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/pool/Pool.sol/Pool.json +41 -270
- package/artifacts/contracts/pool/PoolService.sol/PoolService.dbg.json +1 -1
- package/artifacts/contracts/pool/PoolService.sol/PoolService.json +492 -333
- package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
- package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +98 -82
- package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
- package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +36 -162
- package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +57 -89
- package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.dbg.json +1 -1
- package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.json +43 -242
- package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.dbg.json +1 -1
- package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.json +16 -16
- package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
- package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +263 -181
- package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +104 -100
- package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
- package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +5 -0
- package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
- package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +147 -6
- package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
- package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +282 -119
- package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
- package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +43 -43
- package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +43 -57
- package/artifacts/contracts/product/IRiskService.sol/IRiskService.dbg.json +4 -0
- package/artifacts/contracts/product/{IProductService.sol/IProductService.json → IRiskService.sol/IRiskService.json} +2 -2
- package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
- package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +399 -327
- package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.json +104 -100
- package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
- package/artifacts/contracts/product/PricingService.sol/PricingService.json +115 -267
- package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +80 -120
- package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/product/Product.sol/Product.json +43 -242
- package/artifacts/contracts/product/RiskService.sol/RiskService.dbg.json +4 -0
- package/artifacts/contracts/product/RiskService.sol/RiskService.json +588 -0
- package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.dbg.json +4 -0
- package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.json +682 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +59 -16
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +238 -34
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- 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 +436 -95
- package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +261 -143
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +23 -313
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +52 -72
- package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.json +46 -5
- package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.json +117 -215
- package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +1 -1
- package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +70 -12
- 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/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/shared/Component.sol/Component.json +15 -205
- package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +89 -212
- package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +96 -114
- package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.json +5 -112
- package/artifacts/contracts/shared/ContractLib.sol/ContractLib.dbg.json +4 -0
- package/artifacts/contracts/shared/ContractLib.sol/ContractLib.json +92 -0
- package/artifacts/contracts/shared/IComponent.sol/IComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/IComponent.sol/IComponent.json +15 -20
- package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
- package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +15 -31
- package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.json +36 -0
- package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.dbg.json +1 -1
- package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.json +36 -0
- 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/IPolicyHolder.sol/IPolicyHolder.json +15 -47
- 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/InitializableERC165.sol/InitializableERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/InitializableERC165.sol/InitializableERC165.json +2 -22
- package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.json +15 -216
- package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.json +41 -0
- package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.json +41 -0
- package/artifacts/contracts/shared/NftIdSet.sol/NftIdSet.dbg.json +1 -1
- package/artifacts/contracts/shared/NftIdSet.sol/NftIdSet.json +2 -2
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +6 -57
- package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
- package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +19 -141
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +8 -97
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -15
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
- package/artifacts/contracts/shared/Service.sol/Service.json +5 -112
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +330 -11
- package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.dbg.json +4 -0
- package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.json +108 -0
- package/artifacts/contracts/staking/IStaking.sol/IStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/IStaking.sol/IStaking.json +42 -21
- package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
- package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +1 -1
- package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +63 -93
- package/artifacts/contracts/staking/Staking.sol/Staking.dbg.json +1 -1
- package/artifacts/contracts/staking/Staking.sol/Staking.json +100 -256
- package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.json +45 -4
- package/artifacts/contracts/staking/StakingManager.sol/StakingManager.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingManager.sol/StakingManager.json +77 -88
- package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +6 -11
- package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingService.sol/StakingService.json +31 -138
- package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +56 -76
- package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +168 -127
- package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.dbg.json +1 -1
- package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.json +54 -23
- package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.dbg.json +1 -1
- package/artifacts/contracts/type/Amount.sol/AmountLib.dbg.json +1 -1
- package/artifacts/contracts/type/Amount.sol/AmountLib.json +32 -8
- package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.json +2 -2
- package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.json +28 -4
- package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
- package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.json +2 -2
- package/artifacts/contracts/type/Fee.sol/FeeLib.dbg.json +1 -1
- package/artifacts/contracts/type/Fee.sol/FeeLib.json +2 -2
- package/artifacts/contracts/type/Key32.sol/Key32Lib.dbg.json +1 -1
- package/artifacts/contracts/type/Key32.sol/Key32Lib.json +2 -2
- package/artifacts/contracts/type/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/NftId.sol/NftIdLib.json +2 -2
- package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
- package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.json +2 -2
- package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.json +2 -2
- package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.json +19 -19
- package/artifacts/contracts/type/Referral.sol/ReferralLib.dbg.json +1 -1
- package/artifacts/contracts/type/Referral.sol/ReferralLib.json +2 -2
- package/artifacts/contracts/type/RequestId.sol/RequestIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/RequestId.sol/RequestIdLib.json +2 -2
- package/artifacts/contracts/type/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/RiskId.sol/RiskIdLib.json +60 -4
- package/artifacts/contracts/type/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/RoleId.sol/RoleIdLib.json +2 -2
- package/artifacts/contracts/type/Seconds.sol/SecondsLib.dbg.json +1 -1
- package/artifacts/contracts/type/Seconds.sol/SecondsLib.json +50 -2
- package/artifacts/contracts/type/Selector.sol/SelectorLib.dbg.json +1 -1
- package/artifacts/contracts/type/Selector.sol/SelectorSetLib.dbg.json +1 -1
- package/artifacts/contracts/type/StateId.sol/StateIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/StateId.sol/StateIdLib.json +15 -2
- package/artifacts/contracts/type/String.sol/StrLib.dbg.json +1 -1
- package/artifacts/contracts/type/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/type/Timestamp.sol/TimestampLib.json +23 -4
- package/artifacts/contracts/type/UFixed.sol/MathLib.dbg.json +1 -1
- package/artifacts/contracts/type/UFixed.sol/MathLib.json +2 -2
- package/artifacts/contracts/type/UFixed.sol/UFixedLib.dbg.json +1 -1
- package/artifacts/contracts/type/UFixed.sol/UFixedLib.json +15 -2
- package/artifacts/contracts/type/Version.sol/VersionLib.dbg.json +1 -1
- package/artifacts/contracts/type/Version.sol/VersionPartLib.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.json +39 -70
- package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.dbg.json +1 -1
- package/contracts/authorization/AccessAdmin.sol +31 -24
- package/contracts/authorization/Authorization.sol +5 -2
- package/contracts/authorization/IAccessAdmin.sol +3 -2
- package/contracts/authorization/IServiceAuthorization.sol +4 -2
- package/contracts/authorization/ServiceAuthorization.sol +27 -11
- package/contracts/distribution/Distribution.sol +1 -1
- package/contracts/distribution/DistributionService.sol +32 -33
- package/contracts/distribution/DistributionServiceManager.sol +6 -6
- package/contracts/distribution/IDistributionService.sol +9 -5
- package/contracts/examples/fire/DamageLevel.sol +59 -0
- package/contracts/examples/fire/FirePool.sol +75 -0
- package/contracts/examples/fire/FirePoolAuthorization.sol +34 -0
- package/contracts/examples/fire/FireProduct.sol +411 -0
- package/contracts/examples/fire/FireProductAuthorization.sol +45 -0
- package/contracts/examples/fire/FireUSD.sol +26 -0
- package/contracts/examples/unpermissioned/SimpleDistribution.sol +50 -0
- package/contracts/examples/unpermissioned/SimpleOracle.sol +137 -0
- package/contracts/examples/unpermissioned/SimplePool.sol +76 -0
- package/contracts/examples/unpermissioned/SimpleProduct.sol +351 -0
- package/contracts/instance/IInstance.sol +7 -30
- package/contracts/instance/Instance.sol +10 -35
- package/contracts/instance/InstanceAdmin.sol +29 -7
- package/contracts/instance/InstanceAuthorizationV3.sol +3 -3
- package/contracts/instance/InstanceReader.sol +115 -25
- package/contracts/instance/InstanceService.sol +63 -41
- package/contracts/instance/InstanceServiceManager.sol +6 -7
- package/contracts/instance/InstanceStore.sol +11 -1
- package/contracts/instance/base/ObjectLifecycle.sol +9 -4
- package/contracts/instance/module/IBundle.sol +1 -1
- package/contracts/instance/module/IComponents.sol +4 -7
- package/contracts/instance/module/IPolicy.sol +24 -24
- package/contracts/mock/Dip.sol +1 -1
- package/contracts/oracle/Oracle.sol +2 -1
- package/contracts/oracle/OracleService.sol +11 -8
- package/contracts/oracle/OracleServiceManager.sol +6 -6
- package/contracts/pool/BasicPool.sol +7 -5
- package/contracts/pool/BasicPoolAuthorization.sol +5 -2
- package/contracts/pool/BundleService.sol +166 -46
- package/contracts/pool/BundleServiceManager.sol +6 -6
- package/contracts/pool/IBundleService.sol +31 -8
- package/contracts/pool/IPoolComponent.sol +18 -8
- package/contracts/pool/IPoolService.sol +57 -36
- package/contracts/pool/Pool.sol +59 -34
- package/contracts/pool/PoolService.sol +231 -102
- package/contracts/pool/PoolServiceManager.sol +4 -4
- package/contracts/product/ApplicationService.sol +50 -29
- package/contracts/product/ApplicationServiceManager.sol +4 -4
- package/contracts/product/BasicProduct.sol +1 -0
- package/contracts/product/ClaimService.sol +251 -87
- package/contracts/product/ClaimServiceManager.sol +4 -4
- package/contracts/product/IApplicationService.sol +1 -0
- package/contracts/product/IClaimService.sol +31 -7
- package/contracts/product/IPolicyService.sol +34 -34
- package/contracts/product/IPricingService.sol +7 -7
- package/contracts/product/IProductComponent.sol +17 -4
- package/contracts/product/{IProductService.sol → IRiskService.sol} +1 -1
- package/contracts/product/PolicyService.sol +379 -192
- package/contracts/product/PolicyServiceManager.sol +4 -4
- package/contracts/product/PricingService.sol +46 -46
- package/contracts/product/PricingServiceManager.sol +3 -3
- package/contracts/product/Product.sol +81 -50
- package/contracts/product/{ProductService.sol → RiskService.sol} +7 -10
- package/contracts/product/RiskServiceManager.sol +39 -0
- package/contracts/registry/ChainNft.sol +65 -32
- package/contracts/registry/IRegistry.sol +51 -18
- package/contracts/registry/IRegistryService.sol +0 -9
- package/contracts/registry/Registry.sol +328 -197
- package/contracts/registry/RegistryAdmin.sol +134 -51
- package/contracts/registry/RegistryService.sol +55 -48
- package/contracts/registry/RegistryServiceManager.sol +2 -2
- package/contracts/registry/ReleaseLifecycle.sol +6 -3
- package/contracts/registry/ReleaseRegistry.sol +194 -183
- package/contracts/registry/ServiceAuthorizationV3.sol +8 -10
- package/contracts/shared/Component.sol +25 -29
- package/contracts/shared/ComponentService.sol +20 -30
- package/contracts/shared/ComponentServiceManager.sol +8 -5
- package/contracts/shared/ComponentVerifyingService.sol +2 -3
- package/contracts/shared/ContractLib.sol +38 -0
- package/contracts/shared/IComponent.sol +7 -4
- package/contracts/shared/IInstanceLinkedComponent.sol +8 -15
- package/contracts/shared/ILifecycle.sol +3 -1
- package/contracts/shared/IPolicyHolder.sol +12 -22
- package/contracts/shared/InitializableERC165.sol +2 -2
- package/contracts/shared/InstanceLinkedComponent.sol +5 -6
- package/contracts/shared/KeyValueStore.sol +1 -1
- package/contracts/shared/Lifecycle.sol +13 -2
- package/contracts/shared/NftOwnable.sol +5 -5
- package/contracts/shared/PolicyHolder.sol +15 -52
- package/contracts/shared/Registerable.sol +4 -4
- package/contracts/shared/RegistryLinked.sol +3 -2
- package/contracts/shared/Service.sol +16 -11
- package/contracts/shared/TokenHandler.sol +100 -19
- package/contracts/shared/TokenHandlerDeployerLib.sol +12 -0
- package/contracts/staking/IStaking.sol +2 -1
- package/contracts/staking/StakeManagerLib.sol +18 -25
- package/contracts/staking/Staking.sol +11 -29
- package/contracts/staking/StakingManager.sol +8 -6
- package/contracts/staking/StakingReader.sol +12 -5
- package/contracts/staking/StakingService.sol +10 -14
- package/contracts/staking/StakingServiceManager.sol +2 -2
- package/contracts/staking/TargetManagerLib.sol +7 -3
- package/contracts/type/Amount.sol +15 -0
- package/contracts/type/Blocknumber.sol +7 -1
- package/contracts/type/ClaimId.sol +6 -1
- package/contracts/type/NftId.sol +1 -0
- package/contracts/type/ObjectType.sol +16 -11
- package/contracts/type/PayoutId.sol +10 -10
- package/contracts/type/RiskId.sol +15 -1
- package/contracts/type/Seconds.sol +21 -1
- package/contracts/type/StateId.sol +15 -1
- package/contracts/type/Timestamp.sol +11 -1
- package/contracts/type/UFixed.sol +4 -0
- package/contracts/upgradeability/ProxyManager.sol +67 -34
- package/contracts/upgradeability/Versionable.sol +2 -2
- package/package.json +2 -1
- package/artifacts/contracts/product/IProductService.sol/IProductService.dbg.json +0 -4
- package/artifacts/contracts/product/ProductService.sol/ProductService.dbg.json +0 -4
- package/artifacts/contracts/product/ProductService.sol/ProductService.json +0 -708
- package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.dbg.json +0 -4
- package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.json +0 -702
- package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.dbg.json +0 -4
- package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.json +0 -39
- package/contracts/product/ProductServiceManager.sol +0 -39
- package/contracts/shared/InitializableCustom.sol +0 -177
| @@ -1,31 +1,27 @@ | |
| 1 1 | 
             
            // SPDX-License-Identifier: Apache-2.0
         | 
| 2 2 | 
             
            pragma solidity ^0.8.20;
         | 
| 3 3 |  | 
| 4 | 
            +
            import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
            import {IRegistry} from "../registry/IRegistry.sol";
         | 
| 5 7 | 
             
            import {Product} from "./Product.sol";
         | 
| 6 8 | 
             
            import {IComponents} from "../instance/module/IComponents.sol";
         | 
| 7 | 
            -
            import {IDistributionComponent} from "../distribution/IDistributionComponent.sol";
         | 
| 8 9 | 
             
            import {IInstance} from "../instance/IInstance.sol";
         | 
| 9 10 | 
             
            import {IPolicy} from "../instance/module/IPolicy.sol";
         | 
| 10 | 
            -
            import {IPoolComponent} from "../pool/IPoolComponent.sol";
         | 
| 11 | 
            -
            import {IRisk} from "../instance/module/IRisk.sol";
         | 
| 12 | 
            -
            import {IBundle} from "../instance/module/IBundle.sol";
         | 
| 13 11 |  | 
| 14 12 | 
             
            import {TokenHandler} from "../shared/TokenHandler.sol";
         | 
| 15 13 |  | 
| 16 14 | 
             
            import {Amount, AmountLib} from "../type/Amount.sol";
         | 
| 17 | 
            -
            import {ClaimId, ClaimIdLib} from "../type/ClaimId.sol";
         | 
| 18 15 | 
             
            import {Timestamp, TimestampLib, zeroTimestamp} from "../type/Timestamp.sol";
         | 
| 19 | 
            -
            import {UFixed, UFixedLib} from "../type/UFixed.sol";
         | 
| 20 16 | 
             
            import {ObjectType, APPLICATION, COMPONENT, DISTRIBUTION, PRODUCT, POOL, POLICY, BUNDLE, CLAIM, PRICE} from "../type/ObjectType.sol";
         | 
| 21 | 
            -
            import {APPLIED, COLLATERALIZED,  | 
| 17 | 
            +
            import {APPLIED, COLLATERALIZED, KEEP_STATE, CLOSED, DECLINED, PAID} from "../type/StateId.sol";
         | 
| 22 18 | 
             
            import {NftId, NftIdLib} from "../type/NftId.sol";
         | 
| 23 | 
            -
            import {PayoutId, PayoutIdLib} from "../type/PayoutId.sol";
         | 
| 24 19 | 
             
            import {ReferralId} from "../type/Referral.sol";
         | 
| 25 20 | 
             
            import {StateId} from "../type/StateId.sol";
         | 
| 26 21 | 
             
            import {VersionPart} from "../type/Version.sol";
         | 
| 27 22 |  | 
| 28 23 | 
             
            import {ComponentVerifyingService} from "../shared/ComponentVerifyingService.sol";
         | 
| 24 | 
            +
            import {ContractLib} from "../shared/ContractLib.sol";
         | 
| 29 25 | 
             
            import {IApplicationService} from "./IApplicationService.sol";
         | 
| 30 26 | 
             
            import {IBundleService} from "../pool/IBundleService.sol";
         | 
| 31 27 | 
             
            import {IClaimService} from "./IClaimService.sol";
         | 
| @@ -33,11 +29,10 @@ import {IComponentService} from "../shared/IComponentService.sol"; | |
| 33 29 | 
             
            import {IDistributionService} from "../distribution/IDistributionService.sol";
         | 
| 34 30 | 
             
            import {InstanceReader} from "../instance/InstanceReader.sol";
         | 
| 35 31 | 
             
            import {InstanceStore} from "../instance/InstanceStore.sol";
         | 
| 32 | 
            +
            import {IPolicyHolder} from "../shared/IPolicyHolder.sol";
         | 
| 36 33 | 
             
            import {IPolicyService} from "./IPolicyService.sol";
         | 
| 37 34 | 
             
            import {IPoolService} from "../pool/IPoolService.sol";
         | 
| 38 35 | 
             
            import {IPricingService} from "./IPricingService.sol";
         | 
| 39 | 
            -
            import {IService} from "../shared/IService.sol";
         | 
| 40 | 
            -
            import {Service} from "../shared/Service.sol";
         | 
| 41 36 |  | 
| 42 37 | 
             
            contract PolicyService is
         | 
| 43 38 | 
             
                ComponentVerifyingService, 
         | 
| @@ -54,8 +49,6 @@ contract PolicyService is | |
| 54 49 | 
             
                IPoolService internal _poolService;
         | 
| 55 50 | 
             
                IPricingService internal _pricingService;
         | 
| 56 51 |  | 
| 57 | 
            -
                event LogProductServiceSender(address sender);
         | 
| 58 | 
            -
             | 
| 59 52 | 
             
                function _initialize(
         | 
| 60 53 | 
             
                    address owner, 
         | 
| 61 54 | 
             
                    bytes memory data
         | 
| @@ -65,12 +58,11 @@ contract PolicyService is | |
| 65 58 | 
             
                    initializer
         | 
| 66 59 | 
             
                {
         | 
| 67 60 | 
             
                    (
         | 
| 68 | 
            -
                        address registryAddress | 
| 69 | 
            -
                        //address managerAddress
         | 
| 61 | 
            +
                        address registryAddress,
         | 
| 70 62 | 
             
                        address authority
         | 
| 71 | 
            -
                    ) = abi.decode(data, (address, address | 
| 63 | 
            +
                    ) = abi.decode(data, (address, address));
         | 
| 72 64 |  | 
| 73 | 
            -
                     | 
| 65 | 
            +
                    _initializeService(registryAddress, authority, owner);
         | 
| 74 66 |  | 
| 75 67 | 
             
                    VersionPart majorVersion = getVersion().toMajorPart();
         | 
| 76 68 | 
             
                    _applicationService = IApplicationService(getRegistry().getServiceAddress(APPLICATION(), majorVersion));
         | 
| @@ -81,22 +73,16 @@ contract PolicyService is | |
| 81 73 | 
             
                    _distributionService = IDistributionService(getRegistry().getServiceAddress(DISTRIBUTION(), majorVersion));
         | 
| 82 74 | 
             
                    _pricingService = IPricingService(getRegistry().getServiceAddress(PRICE(), majorVersion));
         | 
| 83 75 |  | 
| 84 | 
            -
                     | 
| 76 | 
            +
                    _registerInterface(type(IPolicyService).interfaceId);
         | 
| 85 77 | 
             
                }
         | 
| 86 78 |  | 
| 87 79 |  | 
| 88 | 
            -
                function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
         | 
| 89 | 
            -
                    IRegistry.ObjectInfo memory productInfo;
         | 
| 90 | 
            -
                    (, productInfo,) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| 91 | 
            -
                    product = Product(productInfo.objectAddress);
         | 
| 92 | 
            -
                }
         | 
| 93 | 
            -
                
         | 
| 94 | 
            -
             | 
| 95 80 | 
             
                function decline(
         | 
| 96 81 | 
             
                    NftId applicationNftId // = policyNftId
         | 
| 97 82 | 
             
                )
         | 
| 98 83 | 
             
                    external
         | 
| 99 | 
            -
                    virtual | 
| 84 | 
            +
                    virtual
         | 
| 85 | 
            +
                    nonReentrant()
         | 
| 100 86 | 
             
                {
         | 
| 101 87 | 
             
                    (NftId productNftId,, IInstance instance) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| 102 88 | 
             
                    InstanceReader instanceReader = instance.getInstanceReader();
         | 
| @@ -124,16 +110,15 @@ contract PolicyService is | |
| 124 110 | 
             
                    emit LogPolicyServicePolicyDeclined(applicationNftId);
         | 
| 125 111 | 
             
                }
         | 
| 126 112 |  | 
| 127 | 
            -
                event LogDebug(uint idx, string message);
         | 
| 128 113 |  | 
| 129 | 
            -
                /// @ | 
| 130 | 
            -
                function  | 
| 114 | 
            +
                /// @inheritdoc IPolicyService
         | 
| 115 | 
            +
                function createPolicy(
         | 
| 131 116 | 
             
                    NftId applicationNftId, // = policyNftId
         | 
| 132 | 
            -
                    bool requirePremiumPayment,
         | 
| 133 117 | 
             
                    Timestamp activateAt
         | 
| 134 118 | 
             
                )
         | 
| 135 119 | 
             
                    external 
         | 
| 136 | 
            -
                    virtual | 
| 120 | 
            +
                    virtual
         | 
| 121 | 
            +
                    nonReentrant()
         | 
| 137 122 | 
             
                {
         | 
| 138 123 | 
             
                    // check caller is registered product
         | 
| 139 124 | 
             
                    (NftId productNftId,, IInstance instance) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| @@ -153,13 +138,8 @@ contract PolicyService is | |
| 153 138 | 
             
                            productNftId);
         | 
| 154 139 | 
             
                    }
         | 
| 155 140 |  | 
| 156 | 
            -
                    StateId newPolicyState = COLLATERALIZED();
         | 
| 157 | 
            -
             | 
| 158 141 | 
             
                    // actual collateralizaion
         | 
| 159 | 
            -
                    (
         | 
| 160 | 
            -
                        Amount localCollateralAmount,
         | 
| 161 | 
            -
                        Amount totalCollateralAmount
         | 
| 162 | 
            -
                    ) = _poolService.lockCollateral(
         | 
| 142 | 
            +
                    _poolService.lockCollateral(
         | 
| 163 143 | 
             
                        instance,
         | 
| 164 144 | 
             
                        address(instanceReader.getComponentInfo(productNftId).token),
         | 
| 165 145 | 
             
                        productNftId,
         | 
| @@ -169,39 +149,61 @@ contract PolicyService is | |
| 169 149 |  | 
| 170 150 | 
             
                    // optional activation of policy
         | 
| 171 151 | 
             
                    if(activateAt > zeroTimestamp()) {
         | 
| 172 | 
            -
                         | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
                    // optional collection of premium
         | 
| 178 | 
            -
                    if(requirePremiumPayment) {
         | 
| 179 | 
            -
                        Amount premiumPaidAmount = _calculateAndCollectPremium(
         | 
| 180 | 
            -
                            instance,
         | 
| 181 | 
            -
                            applicationNftId,
         | 
| 182 | 
            -
                            applicationInfo);
         | 
| 183 | 
            -
             | 
| 184 | 
            -
                        applicationInfo.premiumPaidAmount = premiumPaidAmount;
         | 
| 152 | 
            +
                        applicationInfo = _activate(
         | 
| 153 | 
            +
                            applicationNftId, 
         | 
| 154 | 
            +
                            applicationInfo, 
         | 
| 155 | 
            +
                            activateAt);
         | 
| 185 156 | 
             
                    }
         | 
| 186 157 |  | 
| 187 | 
            -
                    //  | 
| 158 | 
            +
                    // update policy and set state to collateralized
         | 
| 188 159 | 
             
                    instance.getInstanceStore().updatePolicy(
         | 
| 189 160 | 
             
                        applicationNftId, 
         | 
| 190 161 | 
             
                        applicationInfo, 
         | 
| 191 | 
            -
                         | 
| 162 | 
            +
                        COLLATERALIZED());
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                    // calculate and store premium
         | 
| 165 | 
            +
                    IPolicy.PremiumInfo memory premium = _pricingService.calculatePremium(
         | 
| 166 | 
            +
                        productNftId,
         | 
| 167 | 
            +
                        applicationInfo.riskId,
         | 
| 168 | 
            +
                        applicationInfo.sumInsuredAmount,
         | 
| 169 | 
            +
                        applicationInfo.lifetime,
         | 
| 170 | 
            +
                        applicationInfo.applicationData,
         | 
| 171 | 
            +
                        applicationInfo.bundleNftId,
         | 
| 172 | 
            +
                        applicationInfo.referralId);
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                    instance.getInstanceStore().createPremium(
         | 
| 175 | 
            +
                        applicationNftId,
         | 
| 176 | 
            +
                        premium);
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    // update referral counter 
         | 
| 179 | 
            +
                    {
         | 
| 180 | 
            +
                        IComponents.ProductInfo memory productInfo = instanceReader.getProductInfo(productNftId);
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                        if (! productInfo.distributionNftId.eqz()) { // only call distribution service if a distribution component is connected to the product    
         | 
| 183 | 
            +
                            _distributionService.processReferral(
         | 
| 184 | 
            +
                                productInfo.distributionNftId, 
         | 
| 185 | 
            +
                                applicationInfo.referralId);
         | 
| 186 | 
            +
                        }
         | 
| 187 | 
            +
                    }
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                    // log policy creation before interactions with token and policy holder
         | 
| 190 | 
            +
                    emit LogPolicyServicePolicyCreated(applicationNftId, premium.premiumAmount, activateAt);
         | 
| 192 191 |  | 
| 193 192 | 
             
                    // TODO add calling pool contract if it needs to validate application
         | 
| 194 193 |  | 
| 195 | 
            -
                    //  | 
| 194 | 
            +
                    // callback to policy holder if applicable
         | 
| 195 | 
            +
                    _policyHolderPolicyActivated(applicationNftId, activateAt);
         | 
| 196 196 | 
             
                }
         | 
| 197 197 |  | 
| 198 198 |  | 
| 199 | 
            +
                /// @inheritdoc IPolicyService
         | 
| 199 200 | 
             
                function collectPremium(
         | 
| 200 201 | 
             
                    NftId policyNftId, 
         | 
| 201 202 | 
             
                    Timestamp activateAt
         | 
| 202 203 | 
             
                )
         | 
| 203 204 | 
             
                    external 
         | 
| 204 205 | 
             
                    virtual
         | 
| 206 | 
            +
                    nonReentrant()
         | 
| 205 207 | 
             
                {
         | 
| 206 208 | 
             
                    // check caller is registered product
         | 
| 207 209 | 
             
                    (,, IInstance instance) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| @@ -209,227 +211,276 @@ contract PolicyService is | |
| 209 211 | 
             
                    StateId stateId = instanceReader.getPolicyState(policyNftId);
         | 
| 210 212 |  | 
| 211 213 | 
             
                    // check policy is in state collateralized or active
         | 
| 212 | 
            -
                    if (!(stateId == COLLATERALIZED() | 
| 213 | 
            -
                        revert  | 
| 214 | 
            +
                    if (!(stateId == COLLATERALIZED())) {
         | 
| 215 | 
            +
                        revert ErrorPolicyServicePolicyStateNotCollateralized(policyNftId);
         | 
| 214 216 | 
             
                    }
         | 
| 215 217 |  | 
| 216 | 
            -
                    IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
         | 
| 217 | 
            -
             | 
| 218 218 | 
             
                    // check if premium is already collected
         | 
| 219 | 
            -
                    if ( | 
| 220 | 
            -
                        revert ErrorPolicyServicePremiumAlreadyPaid(policyNftId | 
| 219 | 
            +
                    if (instanceReader.getPremiumInfoState(policyNftId) == PAID()) {
         | 
| 220 | 
            +
                        revert ErrorPolicyServicePremiumAlreadyPaid(policyNftId);
         | 
| 221 221 | 
             
                    }
         | 
| 222 222 |  | 
| 223 | 
            -
                     | 
| 224 | 
            -
             | 
| 225 | 
            -
             | 
| 226 | 
            -
             | 
| 223 | 
            +
                    IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
         | 
| 224 | 
            +
                    IPolicy.PremiumInfo memory premium = instanceReader.getPremiumInfo(policyNftId); 
         | 
| 225 | 
            +
                    
         | 
| 226 | 
            +
                    _processPremium(
         | 
| 227 | 
            +
                        instance,
         | 
| 228 | 
            +
                        policyNftId,
         | 
| 229 | 
            +
                        policyInfo,
         | 
| 230 | 
            +
                        premium);
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                    // optionally activate policy
         | 
| 233 | 
            +
                    if(activateAt.gtz()) {
         | 
| 234 | 
            +
                        policyInfo = _activate(policyNftId, policyInfo, activateAt);
         | 
| 235 | 
            +
                    }
         | 
| 227 236 |  | 
| 228 237 | 
             
                    instance.getInstanceStore().updatePolicy(policyNftId, policyInfo, KEEP_STATE());
         | 
| 238 | 
            +
                    instance.getInstanceStore().updatePremiumState(policyNftId, PAID());
         | 
| 229 239 |  | 
| 230 | 
            -
                     | 
| 231 | 
            -
             | 
| 232 | 
            -
                    }
         | 
| 240 | 
            +
                    // log premium collection before interactions with token
         | 
| 241 | 
            +
                    emit LogPolicyServicePolicyPremiumCollected(policyNftId, premium.premiumAmount);
         | 
| 233 242 |  | 
| 234 | 
            -
                     | 
| 243 | 
            +
                    _transferFunds(instanceReader, policyNftId, policyInfo.productNftId, premium);
         | 
| 235 244 | 
             
                }
         | 
| 236 245 |  | 
| 237 | 
            -
                 | 
| 246 | 
            +
                /// @inheritdoc IPolicyService
         | 
| 247 | 
            +
                function activate(NftId policyNftId, Timestamp activateAt)
         | 
| 248 | 
            +
                    external
         | 
| 249 | 
            +
                    virtual
         | 
| 250 | 
            +
                    nonReentrant()
         | 
| 251 | 
            +
                {
         | 
| 238 252 | 
             
                    // check caller is registered product
         | 
| 239 253 | 
             
                    (,, IInstance instance) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| 240 254 | 
             
                    InstanceReader instanceReader = instance.getInstanceReader();
         | 
| 241 255 |  | 
| 242 256 | 
             
                    IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
         | 
| 257 | 
            +
                    policyInfo = _activate(policyNftId, policyInfo, activateAt);
         | 
| 243 258 |  | 
| 244 | 
            -
                     | 
| 245 | 
            -
                        policyInfo.activatedAt.eqz(),
         | 
| 246 | 
            -
                        "ERROR:PRS-020:ALREADY_ACTIVATED");
         | 
| 247 | 
            -
             | 
| 248 | 
            -
                    policyInfo.activatedAt = activateAt;
         | 
| 249 | 
            -
                    policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
         | 
| 259 | 
            +
                    instance.getInstanceStore().updatePolicy(policyNftId, policyInfo, KEEP_STATE());
         | 
| 250 260 |  | 
| 251 | 
            -
                     | 
| 261 | 
            +
                    // log policy activation before interactions with policy holder
         | 
| 262 | 
            +
                    emit LogPolicyServicePolicyActivated(policyNftId, activateAt);
         | 
| 252 263 |  | 
| 253 | 
            -
                    //  | 
| 264 | 
            +
                    // callback to policy holder if applicable
         | 
| 265 | 
            +
                    _policyHolderPolicyActivated(policyNftId, activateAt);
         | 
| 254 266 | 
             
                }
         | 
| 255 267 |  | 
| 256 268 |  | 
| 269 | 
            +
                /// @inheritdoc IPolicyService
         | 
| 257 270 | 
             
                function expire(
         | 
| 258 | 
            -
                    NftId policyNftId
         | 
| 271 | 
            +
                    NftId policyNftId,
         | 
| 272 | 
            +
                    Timestamp expireAt
         | 
| 273 | 
            +
                )
         | 
| 274 | 
            +
                    external
         | 
| 275 | 
            +
                    virtual
         | 
| 276 | 
            +
                    nonReentrant()
         | 
| 277 | 
            +
                    returns (Timestamp expiredAt)
         | 
| 278 | 
            +
                {
         | 
| 279 | 
            +
                    (NftId productNftId,, IInstance instance) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| 280 | 
            +
                    
         | 
| 281 | 
            +
                    // check policy matches with calling product
         | 
| 282 | 
            +
                    IPolicy.PolicyInfo memory policyInfo = instance.getInstanceReader().getPolicyInfo(policyNftId);
         | 
| 283 | 
            +
                    if(policyInfo.productNftId != productNftId) {
         | 
| 284 | 
            +
                        revert ErrorPolicyServicePolicyProductMismatch(
         | 
| 285 | 
            +
                            policyNftId, 
         | 
| 286 | 
            +
                            policyInfo.productNftId, 
         | 
| 287 | 
            +
                            productNftId);
         | 
| 288 | 
            +
                    }
         | 
| 289 | 
            +
             | 
| 290 | 
            +
                    return _expire(
         | 
| 291 | 
            +
                        instance,
         | 
| 292 | 
            +
                        policyNftId,
         | 
| 293 | 
            +
                        expireAt
         | 
| 294 | 
            +
                    );
         | 
| 295 | 
            +
                }
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                /// @inheritdoc IPolicyService
         | 
| 298 | 
            +
                function expirePolicy(
         | 
| 299 | 
            +
                    IInstance instance,
         | 
| 300 | 
            +
                    NftId policyNftId,
         | 
| 301 | 
            +
                    Timestamp expireAt
         | 
| 259 302 | 
             
                )
         | 
| 260 303 | 
             
                    external
         | 
| 261 | 
            -
                     | 
| 262 | 
            -
                     | 
| 304 | 
            +
                    virtual
         | 
| 305 | 
            +
                    nonReentrant()
         | 
| 306 | 
            +
                    returns (Timestamp expiredAt)
         | 
| 307 | 
            +
                {
         | 
| 308 | 
            +
                    return _expire(
         | 
| 309 | 
            +
                        instance,
         | 
| 310 | 
            +
                        policyNftId,
         | 
| 311 | 
            +
                        expireAt
         | 
| 312 | 
            +
                    );
         | 
| 313 | 
            +
                }
         | 
| 314 | 
            +
             | 
| 315 | 
            +
                function _expire(
         | 
| 316 | 
            +
                    IInstance instance,
         | 
| 317 | 
            +
                    NftId policyNftId,
         | 
| 318 | 
            +
                    Timestamp expireAt
         | 
| 319 | 
            +
                )
         | 
| 320 | 
            +
                    internal
         | 
| 321 | 
            +
                    returns (Timestamp expiredAt)
         | 
| 263 322 | 
             
                {
         | 
| 323 | 
            +
                    InstanceReader instanceReader = instance.getInstanceReader();
         | 
| 264 324 |  | 
| 325 | 
            +
                    // check policy is active
         | 
| 326 | 
            +
                    StateId policyState = instanceReader.getPolicyState(policyNftId);
         | 
| 327 | 
            +
                    IPolicy.PolicyInfo memory policyInfo = instance.getInstanceReader().getPolicyInfo(policyNftId);
         | 
| 328 | 
            +
                    if (!_policyHasBeenActivated(policyState, policyInfo)) {
         | 
| 329 | 
            +
                        revert ErrorPolicyServicePolicyNotActive(policyNftId, policyState);
         | 
| 330 | 
            +
                    }
         | 
| 331 | 
            +
             | 
| 332 | 
            +
                    // set return value to provided timestamp
         | 
| 333 | 
            +
                    expiredAt = expireAt;
         | 
| 334 | 
            +
             | 
| 335 | 
            +
                    // update expiredAt to current block timestamp if not set
         | 
| 336 | 
            +
                    if (expiredAt.eqz()) {
         | 
| 337 | 
            +
                        expiredAt = TimestampLib.blockTimestamp();
         | 
| 338 | 
            +
                    }
         | 
| 339 | 
            +
             | 
| 340 | 
            +
                    // check expiredAt represents a valid expiry time
         | 
| 341 | 
            +
                    if (expiredAt >= policyInfo.expiredAt) {
         | 
| 342 | 
            +
                        revert ErrorPolicyServicePolicyExpirationTooLate(policyNftId, policyInfo.expiredAt, expireAt);
         | 
| 343 | 
            +
                    }
         | 
| 344 | 
            +
                    if (expiredAt < TimestampLib.blockTimestamp()) {
         | 
| 345 | 
            +
                        revert ErrorPolicyServicePolicyExpirationTooEarly(policyNftId, TimestampLib.blockTimestamp(), expireAt);
         | 
| 346 | 
            +
                    }
         | 
| 347 | 
            +
             | 
| 348 | 
            +
                    // update policyInfo with new expiredAt timestamp
         | 
| 349 | 
            +
                    Timestamp originalExpiredAt = policyInfo.expiredAt;
         | 
| 350 | 
            +
                    policyInfo.expiredAt = expiredAt;
         | 
| 351 | 
            +
                    instance.getInstanceStore().updatePolicy(policyNftId, policyInfo, KEEP_STATE());
         | 
| 352 | 
            +
             | 
| 353 | 
            +
                    emit LogPolicyServicePolicyExpirationUpdated(policyNftId, originalExpiredAt, expiredAt);
         | 
| 354 | 
            +
             | 
| 355 | 
            +
                    // callback to policy holder if applicable
         | 
| 356 | 
            +
                    _policyHolderPolicyExpired(policyNftId, expiredAt);
         | 
| 265 357 | 
             
                }
         | 
| 266 358 |  | 
| 359 | 
            +
             | 
| 267 360 | 
             
                function close(
         | 
| 268 361 | 
             
                    NftId policyNftId
         | 
| 269 362 | 
             
                )
         | 
| 270 363 | 
             
                    external 
         | 
| 271 | 
            -
                     | 
| 364 | 
            +
                    virtual
         | 
| 365 | 
            +
                    nonReentrant()
         | 
| 272 366 | 
             
                {
         | 
| 273 367 | 
             
                    (,, IInstance instance) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| 274 368 | 
             
                    InstanceReader instanceReader = instance.getInstanceReader();
         | 
| 275 369 |  | 
| 370 | 
            +
                    // check that policy has been activated
         | 
| 276 371 | 
             
                    IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
         | 
| 277 | 
            -
             | 
| 278 | 
            -
                    if (policyInfo | 
| 279 | 
            -
                        revert  | 
| 280 | 
            -
                    }
         | 
| 281 | 
            -
             | 
| 282 | 
            -
                    StateId state = instanceReader.getPolicyState(policyNftId);
         | 
| 283 | 
            -
                    if (state != ACTIVE()) {
         | 
| 284 | 
            -
                        revert ErrorIPolicyServicePolicyNotActive(policyNftId, state);
         | 
| 372 | 
            +
                    StateId policyState = instanceReader.getPolicyState(policyNftId);
         | 
| 373 | 
            +
                    if (!_policyHasBeenActivated(policyState, policyInfo)) {
         | 
| 374 | 
            +
                        revert ErrorPolicyServicePolicyNotActive(policyNftId, policyState);
         | 
| 285 375 | 
             
                    }
         | 
| 286 376 |  | 
| 377 | 
            +
                    // check that policy has not already been closed
         | 
| 287 378 | 
             
                    if (policyInfo.closedAt.gtz()) {
         | 
| 288 | 
            -
                        revert  | 
| 289 | 
            -
                    }
         | 
| 290 | 
            -
             | 
| 291 | 
            -
                    // TODO consider to allow for underpaid premiums (with the effects of reducing max payouts accordingly)
         | 
| 292 | 
            -
                    if (!(policyInfo.premiumAmount == policyInfo.premiumPaidAmount)) {
         | 
| 293 | 
            -
                        revert ErrorPolicyServicePremiumNotFullyPaid(policyNftId, policyInfo.premiumAmount, policyInfo.premiumPaidAmount);
         | 
| 379 | 
            +
                        revert ErrorPolicyServicePolicyAlreadyClosed(policyNftId);
         | 
| 294 380 | 
             
                    }
         | 
| 295 381 |  | 
| 382 | 
            +
                    // check that policy does not have any open claims
         | 
| 296 383 | 
             
                    if (policyInfo.openClaimsCount > 0) {
         | 
| 297 | 
            -
                        revert  | 
| 384 | 
            +
                        revert ErrorPolicyServiceOpenClaims(policyNftId, policyInfo.openClaimsCount);
         | 
| 298 385 | 
             
                    }
         | 
| 299 386 |  | 
| 300 | 
            -
                     | 
| 387 | 
            +
                    // TODO consider to allow for underpaid premiums (with the effects of reducing max payouts accordingly)
         | 
| 388 | 
            +
                    // TODO consider to remove requirement for fully paid premiums altogether
         | 
| 389 | 
            +
                    if (! instanceReader.getPremiumInfoState(policyNftId).eq(PAID())) {
         | 
| 390 | 
            +
                        revert ErrorPolicyServicePremiumNotPaid(policyNftId, policyInfo.premiumAmount);
         | 
| 391 | 
            +
                    }
         | 
| 301 392 |  | 
| 393 | 
            +
                    // release (remaining) collateral that was blocked by policy
         | 
| 302 394 | 
             
                    _poolService.releaseCollateral(
         | 
| 303 395 | 
             
                        instance, 
         | 
| 304 396 | 
             
                        address(instanceReader.getComponentInfo(policyInfo.productNftId).token),
         | 
| 305 397 | 
             
                        policyNftId, 
         | 
| 306 398 | 
             
                        policyInfo);
         | 
| 307 399 |  | 
| 400 | 
            +
                    // TODO consider to also set expiredAt to current block timestamp if that timestamp is still in the futue
         | 
| 401 | 
            +
             | 
| 402 | 
            +
                    // update policy state to closed
         | 
| 403 | 
            +
                    policyInfo.closedAt = TimestampLib.blockTimestamp();
         | 
| 308 404 | 
             
                    instance.getInstanceStore().updatePolicy(policyNftId, policyInfo, CLOSED());
         | 
| 405 | 
            +
             | 
| 406 | 
            +
                    emit LogPolicyServicePolicyClosed(policyNftId);
         | 
| 309 407 | 
             
                }
         | 
| 310 408 |  | 
| 311 409 |  | 
| 312 | 
            -
                 | 
| 410 | 
            +
                /// @dev calculates the premium and updates all counters in the other services
         | 
| 411 | 
            +
                function _processPremium(
         | 
| 313 412 | 
             
                    IInstance instance,
         | 
| 314 413 | 
             
                    NftId applicationNftId,
         | 
| 315 | 
            -
                    IPolicy.PolicyInfo memory applicationInfo
         | 
| 414 | 
            +
                    IPolicy.PolicyInfo memory applicationInfo,
         | 
| 415 | 
            +
                    IPolicy.PremiumInfo memory premium
         | 
| 316 416 | 
             
                )
         | 
| 317 417 | 
             
                    internal
         | 
| 318 418 | 
             
                    virtual
         | 
| 319 | 
            -
                    returns (
         | 
| 320 | 
            -
                        Amount premiumPaidAmount
         | 
| 321 | 
            -
                    )
         | 
| 322 419 | 
             
                {
         | 
| 323 420 | 
             
                    NftId productNftId = applicationInfo.productNftId;
         | 
| 324 | 
            -
             | 
| 325 | 
            -
                    // calculate premium details
         | 
| 326 | 
            -
                    IPolicy.Premium memory premium = _pricingService.calculatePremium(
         | 
| 327 | 
            -
                        productNftId,
         | 
| 328 | 
            -
                        applicationInfo.riskId,
         | 
| 329 | 
            -
                        applicationInfo.sumInsuredAmount,
         | 
| 330 | 
            -
                        applicationInfo.lifetime,
         | 
| 331 | 
            -
                        applicationInfo.applicationData,
         | 
| 332 | 
            -
                        applicationInfo.bundleNftId,
         | 
| 333 | 
            -
                        applicationInfo.referralId);
         | 
| 334 | 
            -
             | 
| 335 | 
            -
             | 
| 336 | 
            -
                    // update financials and transfer premium tokens
         | 
| 337 | 
            -
                    premiumPaidAmount = _processAndCollect(
         | 
| 338 | 
            -
                        instance, 
         | 
| 339 | 
            -
                        productNftId,
         | 
| 340 | 
            -
                        applicationNftId, 
         | 
| 341 | 
            -
                        applicationInfo.premiumAmount,
         | 
| 342 | 
            -
                        applicationInfo.bundleNftId,
         | 
| 343 | 
            -
                        applicationInfo.referralId,
         | 
| 344 | 
            -
                        premium);
         | 
| 345 | 
            -
                }
         | 
| 346 | 
            -
             | 
| 347 | 
            -
             | 
| 348 | 
            -
                function _processAndCollect(
         | 
| 349 | 
            -
                    IInstance instance,
         | 
| 350 | 
            -
                    NftId productNftId,
         | 
| 351 | 
            -
                    NftId policyNftId,
         | 
| 352 | 
            -
                    Amount premiumExpectedAmount,
         | 
| 353 | 
            -
                    NftId bundleNftId,
         | 
| 354 | 
            -
                    ReferralId referralId,
         | 
| 355 | 
            -
                    IPolicy.Premium memory premium
         | 
| 356 | 
            -
                )
         | 
| 357 | 
            -
                    internal
         | 
| 358 | 
            -
                    virtual
         | 
| 359 | 
            -
                    returns (Amount premiumPaidAmount)
         | 
| 360 | 
            -
                {
         | 
| 361 421 | 
             
                    InstanceReader instanceReader = instance.getInstanceReader();
         | 
| 362 | 
            -
                    TokenHandler tokenHandler = instanceReader.getComponentInfo(productNftId).tokenHandler;
         | 
| 363 | 
            -
                    address policyHolder = getRegistry().ownerOf(policyNftId);
         | 
| 364 | 
            -
                    premiumPaidAmount = AmountLib.toAmount(premium.premiumAmount);
         | 
| 365 422 |  | 
| 366 | 
            -
                     | 
| 367 | 
            -
             | 
| 368 | 
            -
                         | 
| 369 | 
            -
                         | 
| 370 | 
            -
             | 
| 423 | 
            +
                    // check if premium balance and allowance of policy holder is sufficient
         | 
| 424 | 
            +
                    {
         | 
| 425 | 
            +
                        TokenHandler tokenHandler = _getTokenHandler(instanceReader, productNftId);
         | 
| 426 | 
            +
                        address policyHolder = getRegistry().ownerOf(applicationNftId);
         | 
| 427 | 
            +
                    
         | 
| 428 | 
            +
                        _checkPremiumBalanceAndAllowance(
         | 
| 429 | 
            +
                            tokenHandler.getToken(), 
         | 
| 430 | 
            +
                            address(tokenHandler),
         | 
| 431 | 
            +
                            policyHolder, 
         | 
| 432 | 
            +
                            premium.premiumAmount);
         | 
| 433 | 
            +
                    }
         | 
| 371 434 |  | 
| 372 | 
            -
                     | 
| 435 | 
            +
                    // update the counters
         | 
| 436 | 
            +
                    _processSale(
         | 
| 373 437 | 
             
                        instanceReader, 
         | 
| 374 438 | 
             
                        instance.getInstanceStore(), 
         | 
| 375 | 
            -
                        tokenHandler, 
         | 
| 376 | 
            -
                        policyHolder, 
         | 
| 377 439 | 
             
                        productNftId, 
         | 
| 378 | 
            -
                        bundleNftId, 
         | 
| 379 | 
            -
                        referralId, 
         | 
| 440 | 
            +
                        applicationInfo.bundleNftId, 
         | 
| 441 | 
            +
                        applicationInfo.referralId, 
         | 
| 380 442 | 
             
                        premium);
         | 
| 381 443 | 
             
                }
         | 
| 382 444 |  | 
| 383 | 
            -
             | 
| 384 | 
            -
             | 
| 385 | 
            -
                     | 
| 386 | 
            -
                     | 
| 387 | 
            -
                    Amount premiumExpectedAmount,
         | 
| 388 | 
            -
                    Amount premiumPaidAmount
         | 
| 445 | 
            +
                function _activate(
         | 
| 446 | 
            +
                    NftId policyNftId, 
         | 
| 447 | 
            +
                    IPolicy.PolicyInfo memory policyInfo,
         | 
| 448 | 
            +
                    Timestamp activateAt
         | 
| 389 449 | 
             
                )
         | 
| 390 450 | 
             
                    internal
         | 
| 391 451 | 
             
                    virtual
         | 
| 392 | 
            -
                    view
         | 
| 452 | 
            +
                    view 
         | 
| 453 | 
            +
                    returns (IPolicy.PolicyInfo memory)
         | 
| 393 454 | 
             
                {
         | 
| 394 | 
            -
                    //  | 
| 395 | 
            -
                     | 
| 396 | 
            -
             | 
| 397 | 
            -
                        revert ErrorPolicyServicePremiumHigherThanExpected(premiumExpectedAmount, premiumPaidAmount);
         | 
| 455 | 
            +
                    // fail if policy has already been activated and activateAt is different
         | 
| 456 | 
            +
                    if(! policyInfo.activatedAt.eqz() && activateAt != policyInfo.activatedAt) {
         | 
| 457 | 
            +
                        revert ErrorPolicyServicePolicyAlreadyActivated(policyNftId);
         | 
| 398 458 | 
             
                    }
         | 
| 399 459 |  | 
| 400 | 
            -
                     | 
| 401 | 
            -
                     | 
| 402 | 
            -
             | 
| 403 | 
            -
                
         | 
| 404 | 
            -
                    if (balance < premiumAmount) {
         | 
| 405 | 
            -
                        revert ErrorPolicyServiceBalanceInsufficient(policyHolder, premiumAmount, balance);
         | 
| 460 | 
            +
                    // ignore if policy has already been activated and activateAt is the same
         | 
| 461 | 
            +
                    if (policyInfo.activatedAt == activateAt) {
         | 
| 462 | 
            +
                        return policyInfo;
         | 
| 406 463 | 
             
                    }
         | 
| 407 464 |  | 
| 408 | 
            -
                     | 
| 409 | 
            -
             | 
| 410 | 
            -
                    }
         | 
| 411 | 
            -
                }
         | 
| 465 | 
            +
                    policyInfo.activatedAt = activateAt;
         | 
| 466 | 
            +
                    policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
         | 
| 412 467 |  | 
| 468 | 
            +
                    return policyInfo;
         | 
| 469 | 
            +
                }
         | 
| 413 470 |  | 
| 414 | 
            -
                 | 
| 471 | 
            +
                /// @dev update counters by calling the involved services
         | 
| 472 | 
            +
                function _processSale(
         | 
| 415 473 | 
             
                    InstanceReader instanceReader,
         | 
| 416 474 | 
             
                    InstanceStore instanceStore,
         | 
| 417 | 
            -
                    TokenHandler tokenHandler,
         | 
| 418 | 
            -
                    address policyHolder,
         | 
| 419 475 | 
             
                    NftId productNftId,
         | 
| 420 476 | 
             
                    NftId bundleNftId,
         | 
| 421 477 | 
             
                    ReferralId referralId,
         | 
| 422 | 
            -
                    IPolicy. | 
| 478 | 
            +
                    IPolicy.PremiumInfo memory premium
         | 
| 423 479 | 
             
                )
         | 
| 424 480 | 
             
                    internal
         | 
| 425 481 | 
             
                    virtual
         | 
| 426 482 | 
             
                {
         | 
| 427 | 
            -
                    (
         | 
| 428 | 
            -
                        NftId distributionNftId,
         | 
| 429 | 
            -
                        address distributionWallet,
         | 
| 430 | 
            -
                        address poolWallet,
         | 
| 431 | 
            -
                        address productWallet
         | 
| 432 | 
            -
                    ) = _getDistributionNftAndWallets(
         | 
| 483 | 
            +
                    (NftId distributionNftId, , , ) = _getDistributionNftAndWallets(
         | 
| 433 484 | 
             
                        instanceReader, 
         | 
| 434 485 | 
             
                        productNftId);
         | 
| 435 486 |  | 
| @@ -437,28 +488,156 @@ contract PolicyService is | |
| 437 488 | 
             
                    _componentService.increaseProductFees(
         | 
| 438 489 | 
             
                        instanceStore, 
         | 
| 439 490 | 
             
                        productNftId, 
         | 
| 440 | 
            -
                         | 
| 491 | 
            +
                        premium.productFeeVarAmount + premium.productFeeFixAmount);
         | 
| 441 492 |  | 
| 442 493 | 
             
                    // update distribution fees and distributor commission and pool fees 
         | 
| 443 | 
            -
                     | 
| 444 | 
            -
                         | 
| 445 | 
            -
             | 
| 446 | 
            -
             | 
| 494 | 
            +
                    if (!distributionNftId.eqz()) { // only call distribution service if a distribution component is connected to the product
         | 
| 495 | 
            +
                        _distributionService.processSale(
         | 
| 496 | 
            +
                            distributionNftId, 
         | 
| 497 | 
            +
                            referralId, 
         | 
| 498 | 
            +
                            premium);
         | 
| 499 | 
            +
                    }
         | 
| 447 500 |  | 
| 448 501 | 
             
                    // update pool and bundle fees 
         | 
| 449 502 | 
             
                    _poolService.processSale(
         | 
| 450 503 | 
             
                        bundleNftId, 
         | 
| 451 504 | 
             
                        premium);
         | 
| 505 | 
            +
                }
         | 
| 506 | 
            +
             | 
| 507 | 
            +
             | 
| 508 | 
            +
                /// @dev transfer the premium to the wallets the premium is distributed to
         | 
| 509 | 
            +
                function _transferFunds(
         | 
| 510 | 
            +
                    InstanceReader instanceReader,
         | 
| 511 | 
            +
                    NftId policyNftId,
         | 
| 512 | 
            +
                    NftId productNftId,
         | 
| 513 | 
            +
                    IPolicy.PremiumInfo memory premium
         | 
| 514 | 
            +
                )
         | 
| 515 | 
            +
                    internal
         | 
| 516 | 
            +
                    virtual
         | 
| 517 | 
            +
                {
         | 
| 518 | 
            +
                    TokenHandler tokenHandler = _getTokenHandler(instanceReader, productNftId);
         | 
| 519 | 
            +
                    address policyHolder = getRegistry().ownerOf(policyNftId);
         | 
| 452 520 |  | 
| 453 | 
            -
                     | 
| 454 | 
            -
             | 
| 455 | 
            -
             | 
| 456 | 
            -
             | 
| 457 | 
            -
             | 
| 521 | 
            +
                    (
         | 
| 522 | 
            +
                        ,
         | 
| 523 | 
            +
                        address distributionWallet,
         | 
| 524 | 
            +
                        address poolWallet,
         | 
| 525 | 
            +
                        address productWallet
         | 
| 526 | 
            +
                    ) = _getDistributionNftAndWallets(
         | 
| 527 | 
            +
                        instanceReader, 
         | 
| 528 | 
            +
                        productNftId);
         | 
| 529 | 
            +
             | 
| 530 | 
            +
                    tokenHandler.collectTokensToThreeRecipients(
         | 
| 531 | 
            +
                        policyHolder,
         | 
| 532 | 
            +
                        productWallet,
         | 
| 533 | 
            +
                        premium.productFeeAmount,
         | 
| 534 | 
            +
                        distributionWallet,
         | 
| 535 | 
            +
                        premium.distributionFeeAndCommissionAmount,
         | 
| 536 | 
            +
                        poolWallet,
         | 
| 537 | 
            +
                        premium.poolPremiumAndFeeAmount);
         | 
| 458 538 | 
             
                }
         | 
| 459 539 |  | 
| 460 540 |  | 
| 461 | 
            -
                 | 
| 541 | 
            +
                /// @dev checks that policy has been collateralized and has been activated.
         | 
| 542 | 
            +
                /// does not check if policy has been expired or closed.
         | 
| 543 | 
            +
                function _policyHasBeenActivated(
         | 
| 544 | 
            +
                    StateId policyState,
         | 
| 545 | 
            +
                    IPolicy.PolicyInfo memory policyInfo
         | 
| 546 | 
            +
                )
         | 
| 547 | 
            +
                    internal
         | 
| 548 | 
            +
                    view
         | 
| 549 | 
            +
                    returns (bool)
         | 
| 550 | 
            +
                {
         | 
| 551 | 
            +
                    if (policyState != COLLATERALIZED()) { return false; } 
         | 
| 552 | 
            +
                    if (TimestampLib.blockTimestamp() < policyInfo.activatedAt) { return false; } 
         | 
| 553 | 
            +
                    return true;
         | 
| 554 | 
            +
                }
         | 
| 555 | 
            +
             | 
| 556 | 
            +
             | 
| 557 | 
            +
                /// @dev checks the balance and allowance of the policy holder
         | 
| 558 | 
            +
                function _checkPremiumBalanceAndAllowance(
         | 
| 559 | 
            +
                    IERC20Metadata token,
         | 
| 560 | 
            +
                    address tokenHandlerAddress, 
         | 
| 561 | 
            +
                    address policyHolder, 
         | 
| 562 | 
            +
                    Amount premiumAmount
         | 
| 563 | 
            +
                )
         | 
| 564 | 
            +
                    internal
         | 
| 565 | 
            +
                    virtual
         | 
| 566 | 
            +
                    view
         | 
| 567 | 
            +
                {
         | 
| 568 | 
            +
                    uint256 premium = premiumAmount.toInt();
         | 
| 569 | 
            +
                    uint256 balance = token.balanceOf(policyHolder);
         | 
| 570 | 
            +
                    uint256 allowance = token.allowance(policyHolder, tokenHandlerAddress);
         | 
| 571 | 
            +
                
         | 
| 572 | 
            +
                    if (balance < premium) {
         | 
| 573 | 
            +
                        revert ErrorPolicyServiceBalanceInsufficient(policyHolder, premium, balance);
         | 
| 574 | 
            +
                    }
         | 
| 575 | 
            +
             | 
| 576 | 
            +
                    if (allowance < premium) {
         | 
| 577 | 
            +
                        revert ErrorPolicyServiceAllowanceInsufficient(policyHolder, tokenHandlerAddress, premium, allowance);
         | 
| 578 | 
            +
                    }
         | 
| 579 | 
            +
                }
         | 
| 580 | 
            +
             | 
| 581 | 
            +
             | 
| 582 | 
            +
                function _policyHolderPolicyActivated(
         | 
| 583 | 
            +
                    NftId policyNftId,
         | 
| 584 | 
            +
                    Timestamp activateAt
         | 
| 585 | 
            +
                )
         | 
| 586 | 
            +
                    internal
         | 
| 587 | 
            +
                    virtual
         | 
| 588 | 
            +
                {
         | 
| 589 | 
            +
                    // immediately return if policy is not activated
         | 
| 590 | 
            +
                    if (activateAt.eqz()) {
         | 
| 591 | 
            +
                        return;
         | 
| 592 | 
            +
                    }
         | 
| 593 | 
            +
             | 
| 594 | 
            +
                    // get policy holder address
         | 
| 595 | 
            +
                    IPolicyHolder policyHolder = _getPolicyHolder(policyNftId);
         | 
| 596 | 
            +
             | 
| 597 | 
            +
                    // execute callback if policy holder implements IPolicyHolder
         | 
| 598 | 
            +
                    if (address(policyHolder) != address(0)) {
         | 
| 599 | 
            +
                        policyHolder.policyActivated(policyNftId, activateAt);
         | 
| 600 | 
            +
                    }
         | 
| 601 | 
            +
                }
         | 
| 602 | 
            +
             | 
| 603 | 
            +
             | 
| 604 | 
            +
                function _policyHolderPolicyExpired(
         | 
| 605 | 
            +
                    NftId policyNftId,
         | 
| 606 | 
            +
                    Timestamp expiredAt
         | 
| 607 | 
            +
                )
         | 
| 608 | 
            +
                    internal
         | 
| 609 | 
            +
                    virtual
         | 
| 610 | 
            +
                {
         | 
| 611 | 
            +
                    // immediately return if policy is not activated
         | 
| 612 | 
            +
                    if (expiredAt.eqz()) {
         | 
| 613 | 
            +
                        return;
         | 
| 614 | 
            +
                    }
         | 
| 615 | 
            +
             | 
| 616 | 
            +
                    // get policy holder address
         | 
| 617 | 
            +
                    IPolicyHolder policyHolder = _getPolicyHolder(policyNftId);
         | 
| 618 | 
            +
             | 
| 619 | 
            +
                    // execute callback if policy holder implements IPolicyHolder
         | 
| 620 | 
            +
                    if (address(policyHolder) != address(0)) {
         | 
| 621 | 
            +
                        policyHolder.policyExpired(policyNftId, expiredAt);
         | 
| 622 | 
            +
                    }
         | 
| 623 | 
            +
                }
         | 
| 624 | 
            +
             | 
| 625 | 
            +
             | 
| 626 | 
            +
                function _getPolicyHolder(NftId policyNftId)
         | 
| 627 | 
            +
                    internal 
         | 
| 628 | 
            +
                    view 
         | 
| 629 | 
            +
                    returns (IPolicyHolder policyHolder)
         | 
| 630 | 
            +
                {
         | 
| 631 | 
            +
                    address policyHolderAddress = getRegistry().ownerOf(policyNftId);
         | 
| 632 | 
            +
                    policyHolder = IPolicyHolder(policyHolderAddress);
         | 
| 633 | 
            +
             | 
| 634 | 
            +
                    if (!ContractLib.isPolicyHolder(policyHolderAddress)) {
         | 
| 635 | 
            +
                        policyHolder = IPolicyHolder(address(0));
         | 
| 636 | 
            +
                    }
         | 
| 637 | 
            +
                }
         | 
| 638 | 
            +
             | 
| 639 | 
            +
             | 
| 640 | 
            +
                function _getTokenHandler(
         | 
| 462 641 | 
             
                    InstanceReader instanceReader,
         | 
| 463 642 | 
             
                    NftId productNftId
         | 
| 464 643 | 
             
                )
         | 
| @@ -472,6 +651,7 @@ contract PolicyService is | |
| 472 651 | 
             
                    tokenHandler = instanceReader.getComponentInfo(productNftId).tokenHandler;
         | 
| 473 652 | 
             
                }
         | 
| 474 653 |  | 
| 654 | 
            +
             | 
| 475 655 | 
             
                function _getDistributionNftAndWallets(
         | 
| 476 656 | 
             
                    InstanceReader instanceReader,
         | 
| 477 657 | 
             
                    NftId productNftId
         | 
| @@ -493,6 +673,13 @@ contract PolicyService is | |
| 493 673 | 
             
                }
         | 
| 494 674 |  | 
| 495 675 |  | 
| 676 | 
            +
                function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
         | 
| 677 | 
            +
                    IRegistry.ObjectInfo memory productInfo;
         | 
| 678 | 
            +
                    (, productInfo,) = _getAndVerifyActiveComponent(PRODUCT());
         | 
| 679 | 
            +
                    product = Product(productInfo.objectAddress);
         | 
| 680 | 
            +
                }
         | 
| 681 | 
            +
             | 
| 682 | 
            +
             | 
| 496 683 | 
             
                function _getDomain() internal pure override returns(ObjectType) {
         | 
| 497 684 | 
             
                    return POLICY();
         | 
| 498 685 | 
             
                }
         |