@etherisc/gif-next 0.0.2-f1e0c66-773 → 0.0.2-f1e6957-384
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 +137 -333
- package/artifacts/contracts/accounting/AccountingService.sol/AccountingService.dbg.json +4 -0
- package/artifacts/contracts/accounting/AccountingService.sol/AccountingService.json +1075 -0
- package/artifacts/contracts/accounting/AccountingServiceManager.sol/AccountingServiceManager.dbg.json +4 -0
- package/artifacts/contracts/accounting/AccountingServiceManager.sol/AccountingServiceManager.json +810 -0
- package/artifacts/contracts/accounting/IAccountingService.sol/IAccountingService.dbg.json +4 -0
- package/artifacts/contracts/accounting/IAccountingService.sol/IAccountingService.json +843 -0
- package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.dbg.json +1 -1
- package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.json +760 -278
- package/artifacts/contracts/authorization/AccessAdminLib.sol/AccessAdminLib.dbg.json +4 -0
- package/artifacts/contracts/authorization/AccessAdminLib.sol/AccessAdminLib.json +2008 -0
- package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.dbg.json +1 -1
- package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.json +202 -5
- package/artifacts/contracts/authorization/Authorization.sol/Authorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/Authorization.sol/Authorization.json +485 -26
- 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 +588 -220
- package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.json +227 -20
- package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.json +275 -16
- package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.json +479 -17
- package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.dbg.json +1 -1
- package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.json +183 -497
- package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.dbg.json +1 -1
- package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.json +475 -41
- package/artifacts/contracts/distribution/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/distribution/Distribution.sol/Distribution.json +102 -397
- package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.json +644 -392
- package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +227 -131
- package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.json +96 -201
- package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.json +476 -137
- 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 +1474 -0
- package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.json +844 -0
- package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.json +2043 -0
- package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.json +844 -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 +1429 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.json +844 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.json +1161 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.json +1637 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.json +844 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.json +2575 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.json +844 -0
- package/artifacts/contracts/instance/BaseStore.sol/BaseStore.dbg.json +4 -0
- package/artifacts/contracts/{shared/IKeyValueStore.sol/IKeyValueStore.json → instance/BaseStore.sol/BaseStore.json} +55 -197
- package/artifacts/contracts/instance/BundleSet.sol/BundleSet.dbg.json +1 -1
- package/artifacts/contracts/instance/BundleSet.sol/BundleSet.json +193 -45
- package/artifacts/contracts/instance/IBaseStore.sol/IBaseStore.dbg.json +4 -0
- package/artifacts/contracts/{shared/KeyValueStore.sol/KeyValueStore.json → instance/IBaseStore.sol/IBaseStore.json} +34 -227
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +587 -64
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +405 -60
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +625 -182
- package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +1154 -380
- package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +363 -92
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1645 -849
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +419 -231
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +160 -102
- package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +1300 -1842
- package/artifacts/contracts/instance/ProductStore.sol/ProductStore.dbg.json +4 -0
- package/artifacts/contracts/instance/ProductStore.sol/ProductStore.json +3427 -0
- package/artifacts/contracts/instance/RiskSet.sol/RiskSet.dbg.json +4 -0
- package/artifacts/contracts/instance/RiskSet.sol/RiskSet.json +866 -0
- package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.json +8 -8
- 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 +46 -5
- package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.json +16 -5
- package/artifacts/contracts/instance/base/ObjectSetHelperLib.sol/ObjectSetHelperLib.dbg.json +4 -0
- package/artifacts/contracts/instance/base/ObjectSetHelperLib.sol/ObjectSetHelperLib.json +168 -0
- 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 +127 -365
- package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.dbg.json +1 -1
- package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.json +473 -42
- 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 +103 -143
- package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +1 -1
- package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.json +98 -11
- package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +1 -1
- package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +103 -333
- package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +1 -1
- package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +198 -190
- package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +195 -95
- package/artifacts/contracts/pool/BasicPool.sol/BasicPool.dbg.json +1 -1
- package/artifacts/contracts/pool/BasicPool.sol/BasicPool.json +160 -448
- package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.dbg.json +1 -1
- package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.json +474 -40
- package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
- package/artifacts/contracts/pool/BundleService.sol/BundleService.json +502 -364
- package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +212 -112
- package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
- package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +340 -112
- package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +139 -246
- package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +711 -340
- package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/pool/Pool.sol/Pool.json +129 -426
- package/artifacts/contracts/pool/PoolLib.sol/PoolLib.dbg.json +4 -0
- package/artifacts/contracts/pool/PoolLib.sol/PoolLib.json +522 -0
- package/artifacts/contracts/pool/PoolService.sol/PoolService.dbg.json +1 -1
- package/artifacts/contracts/pool/PoolService.sol/PoolService.json +925 -545
- package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
- package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +246 -102
- package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
- package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +353 -180
- package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +177 -97
- package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.dbg.json +1 -1
- package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.json +266 -435
- package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.dbg.json +1 -1
- package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.json +474 -40
- package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
- package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +466 -245
- package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +204 -120
- package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
- package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +301 -9
- package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
- package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +350 -18
- package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
- package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +405 -102
- package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
- package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +183 -80
- package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +257 -236
- package/artifacts/contracts/product/IRiskService.sol/IRiskService.dbg.json +4 -0
- package/artifacts/contracts/{shared/ComponentVerifyingService.sol/ComponentVerifyingService.json → product/IRiskService.sol/IRiskService.json} +283 -157
- package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
- package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +511 -303
- package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.dbg.json +4 -0
- package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.json +783 -0
- package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.json +213 -105
- package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
- package/artifacts/contracts/product/PricingService.sol/PricingService.json +247 -332
- package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +177 -129
- package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/product/Product.sol/Product.json +258 -427
- package/artifacts/contracts/product/RiskService.sol/RiskService.dbg.json +4 -0
- package/artifacts/contracts/product/RiskService.sol/RiskService.json +873 -0
- package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.dbg.json +4 -0
- package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.json +794 -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 +359 -48
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +169 -37
- package/artifacts/contracts/registry/IRelease.sol/IRelease.dbg.json +4 -0
- package/artifacts/contracts/registry/IRelease.sol/IRelease.json +24 -0
- package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
- package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +5 -18
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +565 -109
- package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +913 -404
- package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.dbg.json +4 -0
- package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.json +1137 -0
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +136 -290
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +159 -87
- package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.dbg.json +4 -0
- package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.json +2271 -0
- package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.json +47 -6
- package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.json +495 -253
- package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +1 -1
- package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +511 -20
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +120 -60
- package/artifacts/contracts/shared/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/shared/Component.sol/Component.json +86 -287
- package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +493 -638
- package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +198 -128
- package/artifacts/contracts/shared/ContractLib.sol/ContractLib.dbg.json +4 -0
- package/artifacts/contracts/shared/ContractLib.sol/ContractLib.json +632 -0
- package/artifacts/contracts/shared/ContractLib.sol/IInstanceAdminHelper.dbg.json +4 -0
- package/artifacts/contracts/shared/ContractLib.sol/IInstanceAdminHelper.json +24 -0
- package/artifacts/contracts/shared/ContractLib.sol/ITargetHelper.dbg.json +4 -0
- package/artifacts/contracts/shared/ContractLib.sol/ITargetHelper.json +30 -0
- package/artifacts/contracts/shared/ContractLib.sol/ITokenRegistryHelper.dbg.json +4 -0
- package/artifacts/contracts/shared/ContractLib.sol/ITokenRegistryHelper.json +40 -0
- package/artifacts/contracts/shared/IComponent.sol/IComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/IComponent.sol/IComponent.json +92 -103
- package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
- package/artifacts/contracts/shared/IComponentService.sol/IComponentService.json +432 -290
- package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +103 -143
- 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/INftOwnable.sol/INftOwnable.json +35 -0
- 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/IRegisterable.sol/IRegisterable.json +167 -0
- package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
- package/artifacts/contracts/shared/IService.sol/IService.json +84 -2
- 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 +102 -332
- package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.json +42 -1
- 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 +41 -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 +141 -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 +86 -111
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +585 -12
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandlerBase.dbg.json +4 -0
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandlerBase.json +484 -0
- package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.dbg.json +4 -0
- package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.json +172 -0
- package/artifacts/contracts/staking/IStaking.sol/IStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/IStaking.sol/IStaking.json +1513 -204
- package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
- package/artifacts/contracts/staking/IStakingService.sol/IStakingService.json +235 -123
- package/artifacts/contracts/staking/ITargetLimitHandler.sol/ITargetLimitHandler.dbg.json +4 -0
- package/artifacts/contracts/staking/ITargetLimitHandler.sol/ITargetLimitHandler.json +50 -0
- package/artifacts/contracts/staking/Staking.sol/Staking.dbg.json +1 -1
- package/artifacts/contracts/staking/Staking.sol/Staking.json +1635 -465
- package/artifacts/contracts/staking/StakingLib.sol/StakingLib.dbg.json +4 -0
- package/artifacts/contracts/staking/StakingLib.sol/StakingLib.json +470 -0
- package/artifacts/contracts/staking/StakingManager.sol/StakingManager.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingManager.sol/StakingManager.json +211 -105
- package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +295 -183
- package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingService.sol/StakingService.json +282 -281
- package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +162 -94
- package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +1645 -790
- package/artifacts/contracts/staking/TargetHandler.sol/TargetHandler.dbg.json +4 -0
- package/artifacts/contracts/staking/TargetHandler.sol/TargetHandler.json +309 -0
- package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.dbg.json +1 -1
- package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.json +180 -77
- 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 +35 -11
- package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.json +64 -19
- package/artifacts/contracts/type/ChainId.sol/ChainIdLib.dbg.json +4 -0
- package/artifacts/contracts/type/ChainId.sol/ChainIdLib.json +193 -0
- 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 +94 -38
- 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/Key32Set.sol/LibKey32Set.dbg.json +4 -0
- package/artifacts/contracts/type/Key32Set.sol/LibKey32Set.json +33 -0
- package/artifacts/contracts/type/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/NftId.sol/NftIdLib.json +23 -4
- 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 +33 -31
- 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 +125 -7
- package/artifacts/contracts/type/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/RoleId.sol/RoleIdLib.json +42 -157
- package/artifacts/contracts/type/Seconds.sol/SecondsLib.dbg.json +1 -1
- package/artifacts/contracts/type/Seconds.sol/SecondsLib.json +93 -2
- package/artifacts/contracts/type/Selector.sol/SelectorLib.dbg.json +1 -1
- package/artifacts/contracts/type/Selector.sol/SelectorLib.json +21 -2
- package/artifacts/contracts/type/Selector.sol/SelectorSetLib.dbg.json +1 -1
- package/artifacts/contracts/type/Selector.sol/SelectorSetLib.json +2 -2
- 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/String.sol/StrLib.json +50 -2
- package/artifacts/contracts/type/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/type/Timestamp.sol/TimestampLib.json +24 -5
- package/artifacts/contracts/type/UFixed.sol/UFixedLib.dbg.json +1 -1
- package/artifacts/contracts/type/UFixed.sol/UFixedLib.json +73 -36
- package/artifacts/contracts/type/Version.sol/VersionLib.dbg.json +1 -1
- package/artifacts/contracts/type/Version.sol/VersionLib.json +2 -21
- package/artifacts/contracts/type/Version.sol/VersionPartLib.dbg.json +1 -1
- package/artifacts/contracts/type/Version.sol/VersionPartLib.json +101 -2
- package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.json +10 -0
- package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.json +134 -79
- package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +15 -2
- package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.json +10 -0
- package/contracts/accounting/AccountingService.sol +274 -0
- package/contracts/accounting/AccountingServiceManager.sol +38 -0
- package/contracts/accounting/IAccountingService.sol +47 -0
- package/contracts/authorization/AccessAdmin.sol +401 -313
- package/contracts/authorization/AccessAdminLib.sol +678 -0
- package/contracts/authorization/AccessManagerCloneable.sol +128 -4
- package/contracts/authorization/Authorization.sol +179 -207
- package/contracts/authorization/IAccess.sol +29 -11
- package/contracts/authorization/IAccessAdmin.sol +89 -83
- package/contracts/authorization/IAuthorization.sol +9 -37
- package/contracts/authorization/IServiceAuthorization.sol +57 -17
- package/contracts/authorization/ServiceAuthorization.sol +235 -25
- package/contracts/distribution/BasicDistribution.sol +21 -19
- package/contracts/distribution/BasicDistributionAuthorization.sol +30 -10
- package/contracts/distribution/Distribution.sol +46 -96
- package/contracts/distribution/DistributionService.sol +243 -132
- package/contracts/distribution/DistributionServiceManager.sol +6 -6
- package/contracts/distribution/IDistributionComponent.sol +4 -11
- package/contracts/distribution/IDistributionService.sol +47 -29
- package/contracts/examples/fire/DamageLevel.sol +59 -0
- package/contracts/examples/fire/FirePool.sol +86 -0
- package/contracts/examples/fire/FirePoolAuthorization.sol +35 -0
- package/contracts/examples/fire/FireProduct.sol +433 -0
- package/contracts/examples/fire/FireProductAuthorization.sol +45 -0
- package/contracts/examples/fire/FireUSD.sol +26 -0
- package/contracts/examples/unpermissioned/SimpleDistribution.sol +81 -0
- package/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol +28 -0
- package/contracts/examples/unpermissioned/SimpleOracle.sol +133 -0
- package/contracts/examples/unpermissioned/SimplePool.sol +102 -0
- package/contracts/examples/unpermissioned/SimplePoolAuthorization.sol +28 -0
- package/contracts/examples/unpermissioned/SimpleProduct.sol +437 -0
- package/contracts/examples/unpermissioned/SimpleProductAuthorization.sol +28 -0
- package/contracts/instance/BaseStore.sol +93 -0
- package/contracts/instance/BundleSet.sol +42 -38
- package/contracts/instance/IBaseStore.sol +37 -0
- package/contracts/instance/IInstance.sol +113 -43
- package/contracts/instance/IInstanceService.sol +61 -34
- package/contracts/instance/Instance.sol +201 -104
- package/contracts/instance/InstanceAdmin.sol +218 -177
- package/contracts/instance/InstanceAuthorizationV3.sol +154 -83
- package/contracts/instance/InstanceReader.sol +456 -255
- package/contracts/instance/InstanceService.sol +333 -262
- package/contracts/instance/InstanceServiceManager.sol +6 -7
- package/contracts/instance/InstanceStore.sol +153 -107
- package/contracts/instance/ProductStore.sol +290 -0
- package/contracts/instance/RiskSet.sol +126 -0
- package/contracts/instance/TargetNames.sol +10 -0
- package/contracts/instance/base/BalanceStore.sol +4 -6
- package/contracts/instance/base/ObjectCounter.sol +1 -2
- package/contracts/instance/base/ObjectLifecycle.sol +13 -10
- package/contracts/instance/base/ObjectSet.sol +31 -33
- package/contracts/instance/base/ObjectSetHelperLib.sol +30 -0
- package/contracts/instance/module/IBundle.sol +6 -5
- package/contracts/instance/module/IComponents.sol +29 -20
- package/contracts/instance/module/IDistribution.sol +21 -8
- package/contracts/instance/module/IPolicy.sol +50 -29
- package/contracts/instance/module/IRisk.sol +5 -0
- package/contracts/mock/Dip.sol +1 -1
- package/contracts/oracle/BasicOracle.sol +3 -7
- package/contracts/oracle/BasicOracleAuthorization.sol +15 -8
- package/contracts/oracle/IOracle.sol +9 -4
- package/contracts/oracle/IOracleService.sol +2 -1
- package/contracts/oracle/Oracle.sol +11 -25
- package/contracts/oracle/OracleService.sol +119 -87
- package/contracts/oracle/OracleServiceManager.sol +6 -6
- package/contracts/pool/BasicPool.sol +40 -43
- package/contracts/pool/BasicPoolAuthorization.sol +39 -13
- package/contracts/pool/BundleService.sol +200 -155
- package/contracts/pool/BundleServiceManager.sol +6 -6
- package/contracts/pool/IBundleService.sol +42 -46
- package/contracts/pool/IPoolComponent.sol +19 -15
- package/contracts/pool/IPoolService.sol +97 -77
- package/contracts/pool/Pool.sol +145 -142
- package/contracts/pool/PoolLib.sol +341 -0
- package/contracts/pool/PoolService.sol +413 -233
- package/contracts/pool/PoolServiceManager.sol +4 -4
- package/contracts/product/ApplicationService.sol +144 -47
- package/contracts/product/ApplicationServiceManager.sol +4 -4
- package/contracts/product/BasicProduct.sol +11 -15
- package/contracts/product/BasicProductAuthorization.sol +32 -12
- package/contracts/product/ClaimService.sol +394 -185
- package/contracts/product/ClaimServiceManager.sol +4 -4
- package/contracts/product/IApplicationService.sol +29 -3
- package/contracts/product/IClaimService.sol +48 -11
- package/contracts/product/IPolicyService.sol +61 -39
- package/contracts/product/IPricingService.sol +11 -10
- package/contracts/product/IProductComponent.sol +27 -5
- package/contracts/product/IRiskService.sol +48 -0
- package/contracts/product/PolicyService.sol +434 -288
- package/contracts/product/PolicyServiceLib.sol +139 -0
- package/contracts/product/PolicyServiceManager.sol +4 -4
- package/contracts/product/PricingService.sol +90 -84
- package/contracts/product/PricingServiceManager.sol +4 -4
- package/contracts/product/Product.sol +198 -108
- package/contracts/product/RiskService.sol +189 -0
- package/contracts/product/RiskServiceManager.sol +39 -0
- package/contracts/registry/ChainNft.sol +72 -40
- package/contracts/registry/IRegistry.sol +70 -32
- package/contracts/registry/IRegistryService.sol +5 -12
- package/contracts/registry/IRelease.sol +29 -0
- package/contracts/registry/ITransferInterceptor.sol +1 -2
- package/contracts/registry/Registry.sol +367 -207
- package/contracts/registry/RegistryAdmin.sol +99 -291
- package/contracts/registry/RegistryAuthorization.sol +337 -0
- package/contracts/registry/RegistryService.sol +38 -49
- package/contracts/registry/RegistryServiceManager.sol +3 -3
- package/contracts/registry/ReleaseAdmin.sol +199 -0
- package/contracts/registry/ReleaseLifecycle.sol +8 -3
- package/contracts/registry/ReleaseRegistry.sol +279 -239
- package/contracts/registry/ServiceAuthorizationV3.sol +205 -63
- package/contracts/registry/TokenRegistry.sol +61 -59
- package/contracts/shared/Component.sol +72 -142
- package/contracts/shared/ComponentService.sol +428 -388
- package/contracts/shared/ComponentServiceManager.sol +8 -5
- package/contracts/shared/ContractLib.sol +312 -0
- package/contracts/shared/IComponent.sol +6 -18
- package/contracts/shared/IComponentService.sol +43 -40
- package/contracts/shared/IInstanceLinkedComponent.sol +6 -32
- package/contracts/shared/ILifecycle.sol +3 -1
- package/contracts/shared/INftOwnable.sol +4 -0
- package/contracts/shared/IPolicyHolder.sol +12 -22
- package/contracts/shared/IRegisterable.sol +22 -1
- package/contracts/shared/IService.sol +3 -5
- package/contracts/shared/InitializableERC165.sol +10 -2
- package/contracts/shared/InstanceLinkedComponent.sol +74 -54
- package/contracts/shared/Lifecycle.sol +15 -4
- package/contracts/shared/NftOwnable.sol +31 -9
- package/contracts/shared/PolicyHolder.sol +18 -54
- package/contracts/shared/Registerable.sol +52 -21
- package/contracts/shared/RegistryLinked.sol +9 -14
- package/contracts/shared/Service.sol +20 -35
- package/contracts/shared/TokenHandler.sol +310 -26
- package/contracts/shared/TokenHandlerDeployerLib.sol +20 -0
- package/contracts/staking/IStaking.sol +270 -71
- package/contracts/staking/IStakingService.sol +45 -78
- package/contracts/staking/ITargetLimitHandler.sol +17 -0
- package/contracts/staking/Staking.sol +526 -245
- package/contracts/staking/StakingLib.sol +195 -0
- package/contracts/staking/StakingManager.sol +12 -9
- package/contracts/staking/StakingReader.sol +70 -82
- package/contracts/staking/StakingService.sol +62 -152
- package/contracts/staking/StakingServiceManager.sol +7 -5
- package/contracts/staking/StakingStore.sol +1093 -330
- package/contracts/staking/TargetHandler.sol +132 -0
- package/contracts/staking/TargetManagerLib.sol +73 -46
- package/contracts/type/Amount.sol +19 -0
- package/contracts/type/Blocknumber.sol +24 -23
- package/contracts/type/ChainId.sol +101 -0
- package/contracts/type/ClaimId.sol +6 -1
- package/contracts/type/Fee.sol +8 -8
- package/contracts/type/Key32.sol +2 -2
- package/contracts/type/Key32Set.sol +62 -0
- package/contracts/type/NftId.sol +7 -0
- package/contracts/type/ObjectType.sol +73 -37
- package/contracts/type/PayoutId.sol +10 -10
- package/contracts/type/RiskId.sol +38 -6
- package/contracts/type/RoleId.sol +61 -55
- package/contracts/type/Seconds.sol +40 -1
- package/contracts/type/Selector.sol +5 -0
- package/contracts/type/StateId.sol +15 -1
- package/contracts/type/String.sol +12 -0
- package/contracts/type/Timestamp.sol +14 -7
- package/contracts/type/UFixed.sol +38 -126
- package/contracts/type/Version.sol +54 -5
- package/contracts/upgradeability/IVersionable.sol +3 -0
- package/contracts/upgradeability/ProxyManager.sol +94 -46
- package/contracts/upgradeability/UpgradableProxyWithAdmin.sol +12 -2
- package/contracts/upgradeability/Versionable.sol +8 -5
- package/package.json +5 -4
- package/artifacts/contracts/authorization/IModuleAuthorization.sol/IModuleAuthorization.dbg.json +0 -4
- package/artifacts/contracts/authorization/IModuleAuthorization.sol/IModuleAuthorization.json +0 -290
- package/artifacts/contracts/authorization/ModuleAuthorization.sol/ModuleAuthorization.dbg.json +0 -4
- package/artifacts/contracts/authorization/ModuleAuthorization.sol/ModuleAuthorization.json +0 -390
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +0 -4
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +0 -129
- package/artifacts/contracts/product/IProductService.sol/IProductService.dbg.json +0 -4
- package/artifacts/contracts/product/IProductService.sol/IProductService.json +0 -400
- 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/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +0 -4
- package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +0 -4
- package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.dbg.json +0 -4
- package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.json +0 -39
- package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +0 -4
- package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +0 -4
- package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +0 -470
- package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.dbg.json +0 -4
- package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.json +0 -164
- package/artifacts/contracts/type/UFixed.sol/MathLib.dbg.json +0 -4
- package/artifacts/contracts/type/UFixed.sol/MathLib.json +0 -16
- package/contracts/authorization/IModuleAuthorization.sol +0 -21
- package/contracts/authorization/ModuleAuthorization.sol +0 -78
- package/contracts/instance/module/IAccess.sol +0 -46
- package/contracts/product/IProductService.sol +0 -33
- package/contracts/product/ProductService.sol +0 -99
- package/contracts/product/ProductServiceManager.sol +0 -39
- package/contracts/shared/ComponentVerifyingService.sol +0 -117
- package/contracts/shared/IKeyValueStore.sol +0 -54
- package/contracts/shared/InitializableCustom.sol +0 -177
- package/contracts/shared/KeyValueStore.sol +0 -131
- package/contracts/staking/StakeManagerLib.sol +0 -231
- package/contracts/staking/StakingLifecycle.sol +0 -23
| @@ -2,139 +2,479 @@ | |
| 2 2 | 
             
            pragma solidity ^0.8.20;
         | 
| 3 3 |  | 
| 4 4 | 
             
            import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";
         | 
| 5 | 
            +
            import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; 
         | 
| 5 6 |  | 
| 6 7 | 
             
            import {IRegistry} from "../registry/IRegistry.sol";
         | 
| 7 8 | 
             
            import {IStaking} from "./IStaking.sol";
         | 
| 9 | 
            +
            import {ITargetLimitHandler} from "./ITargetLimitHandler.sol";
         | 
| 8 10 |  | 
| 9 11 | 
             
            import {Amount, AmountLib} from "../type/Amount.sol";
         | 
| 12 | 
            +
            import {ChainId, ChainIdLib} from "../type/ChainId.sol";
         | 
| 10 13 | 
             
            import {Blocknumber, BlocknumberLib} from "../type/Blocknumber.sol";
         | 
| 11 | 
            -
            import {KeyValueStore} from "../shared/KeyValueStore.sol";
         | 
| 12 | 
            -
            import {KEEP_STATE} from "../type/StateId.sol";
         | 
| 13 14 | 
             
            import {NftId, NftIdLib} from "../type/NftId.sol";
         | 
| 14 15 | 
             
            import {NftIdSet} from "../shared/NftIdSet.sol";
         | 
| 15 | 
            -
            import { | 
| 16 | 
            +
            import {ObjectType} from "../type/ObjectType.sol";
         | 
| 17 | 
            +
            import {PROTOCOL, INSTANCE} from "../type/ObjectType.sol";
         | 
| 18 | 
            +
            import {Seconds, SecondsLib} from "../type/Seconds.sol";
         | 
| 19 | 
            +
            import {StakingLib} from "./StakingLib.sol";
         | 
| 16 20 | 
             
            import {StakingReader} from "./StakingReader.sol";
         | 
| 17 21 | 
             
            import {TargetManagerLib} from "./TargetManagerLib.sol";
         | 
| 18 22 | 
             
            import {Timestamp, TimestampLib} from "../type/Timestamp.sol";
         | 
| 19 | 
            -
            import { | 
| 20 | 
            -
            import {UFixed} from "../type/UFixed.sol";
         | 
| 23 | 
            +
            import {UFixed, UFixedLib} from "../type/UFixed.sol";
         | 
| 21 24 |  | 
| 22 25 |  | 
| 23 26 | 
             
            contract StakingStore is 
         | 
| 24 | 
            -
                 | 
| 25 | 
            -
                 | 
| 26 | 
            -
                StakingLifecycle
         | 
| 27 | 
            +
                Initializable,
         | 
| 28 | 
            +
                AccessManaged
         | 
| 27 29 | 
             
            {
         | 
| 28 30 |  | 
| 29 | 
            -
                 | 
| 30 | 
            -
                 | 
| 31 | 
            +
                // token
         | 
| 32 | 
            +
                error ErrorStakingStoreTokenNotRegistered(ChainId chainId, address token);
         | 
| 33 | 
            +
                error ErrorStakingStoreTokenAlreadyAdded(ChainId chainId, address token);
         | 
| 34 | 
            +
                error ErrorStakingStoreTokenUnknown(ChainId chainId, address token);
         | 
| 31 35 |  | 
| 32 | 
            -
                 | 
| 33 | 
            -
                 | 
| 34 | 
            -
             | 
| 35 | 
            -
                event LogStakingStoreStakesIncreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
         | 
| 36 | 
            -
                event LogStakingStoreStakesDecreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                event LogStakingStoreRewardsIncreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
         | 
| 39 | 
            -
                event LogStakingStoreRewardsDecreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                event LogStakingStoreRewardsRestaked(NftId nftId, Amount amount, Amount rewardAmount, Amount rewardIncrementAmount, Amount newBalance, Blocknumber lastUpdatedIn);
         | 
| 36 | 
            +
                // target
         | 
| 37 | 
            +
                error ErrorStakingStoreTargetNotInitialized(NftId targetNftId);
         | 
| 38 | 
            +
                error ErrorStakingStoreLimitNotInitialized(NftId targetNftId);
         | 
| 42 39 |  | 
| 43 40 | 
             
                // in/decreasing reward reserves
         | 
| 44 41 | 
             
                error ErrorStakingStoreNotTarget(NftId targetNftId);
         | 
| 45 | 
            -
                error ErrorStakingStoreRewardReservesInsufficient(NftId targetNftId, Amount  | 
| 42 | 
            +
                error ErrorStakingStoreRewardReservesInsufficient(NftId targetNftId, Amount reserveAmount, Amount claimedAmount);
         | 
| 46 43 |  | 
| 47 | 
            -
                //  | 
| 48 | 
            -
                error  | 
| 49 | 
            -
                error  | 
| 44 | 
            +
                // stakes
         | 
| 45 | 
            +
                error ErrorStakingStoreStakesExceedingTargetMaxAmount(NftId targetNftId, Amount stakeLimitAmount, Amount newIStaking);
         | 
| 46 | 
            +
                error ErrorStakingStoreStakeNotInitialized(NftId nftId);
         | 
| 50 47 |  | 
| 51 | 
            -
                //  | 
| 52 | 
            -
                error  | 
| 48 | 
            +
                // creating and updating of staking balance
         | 
| 49 | 
            +
                error ErrorStakingStoreStakeBalanceAlreadyInitialized(NftId nftId);
         | 
| 50 | 
            +
                error ErrorStakingStoreStakeBalanceNotInitialized(NftId nftI);
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                // creating and updating of tvl balance
         | 
| 53 | 
            +
                error ErrorStakingStoreTvlBalanceAlreadyInitialized(NftId nftId, address token);
         | 
| 54 | 
            +
                error ErrorStakingStoreTvlBalanceNotInitialized(NftId nftId, address token);
         | 
| 53 55 |  | 
| 54 56 | 
             
                IRegistry private _registry;
         | 
| 55 | 
            -
                 | 
| 57 | 
            +
                ITargetLimitHandler private _targetLimitHandler;
         | 
| 56 58 | 
             
                StakingReader private _reader;
         | 
| 59 | 
            +
                NftIdSet private _targetNftIdSet;
         | 
| 57 60 |  | 
| 58 | 
            -
                //  | 
| 59 | 
            -
                mapping( | 
| 61 | 
            +
                // target support
         | 
| 62 | 
            +
                mapping(ObjectType targetType => IStaking.SupportInfo) private _supportInfo;
         | 
| 60 63 |  | 
| 61 | 
            -
                //  | 
| 62 | 
            -
                mapping(NftId  | 
| 63 | 
            -
                mapping(NftId  | 
| 64 | 
            -
                mapping(NftId  | 
| 64 | 
            +
                // targets
         | 
| 65 | 
            +
                mapping(NftId targetNftId => IStaking.TargetInfo) private _targetInfo;
         | 
| 66 | 
            +
                mapping(NftId targetNftId => IStaking.LimitInfo) private _limitInfo;
         | 
| 67 | 
            +
                mapping(NftId targetNftId => mapping(address token => IStaking.TvlInfo)) private _tvlInfo;
         | 
| 68 | 
            +
                mapping(NftId targetNftId => address [] token) private _targetToken;
         | 
| 65 69 |  | 
| 66 | 
            -
                 | 
| 67 | 
            -
                mapping( | 
| 70 | 
            +
                // staking rate
         | 
| 71 | 
            +
                mapping(ChainId chainId => mapping(address token => IStaking.TokenInfo)) private _tokenInfo;
         | 
| 68 72 |  | 
| 69 | 
            -
                //  | 
| 70 | 
            -
                mapping(NftId  | 
| 71 | 
            -
                mapping(NftId nftId => mapping(address token => Amount tvlInDip)) private _tvlInDip;
         | 
| 72 | 
            -
                mapping(NftId nftId => Amount tvlRequiredDip) private _tvlRequiredDip;
         | 
| 73 | 
            -
                mapping(NftId nftId => Blocknumber lastUpdatedIn) private _tvlLastUpdatedIn;
         | 
| 73 | 
            +
                // stakes
         | 
| 74 | 
            +
                mapping(NftId stakeNftId => IStaking.StakeInfo) private _stakeInfo;
         | 
| 74 75 |  | 
| 75 76 |  | 
| 76 | 
            -
                constructor( | 
| 77 | 
            +
                constructor(
         | 
| 78 | 
            +
                    IRegistry registry, 
         | 
| 79 | 
            +
                    StakingReader reader
         | 
| 80 | 
            +
                )
         | 
| 77 81 | 
             
                    AccessManaged(msg.sender)
         | 
| 78 82 | 
             
                {
         | 
| 79 83 | 
             
                    // set final authority
         | 
| 80 84 | 
             
                    setAuthority(registry.getAuthority());
         | 
| 81 85 |  | 
| 82 86 | 
             
                    // set internal variables
         | 
| 83 | 
            -
                    _registry = registry; | 
| 87 | 
            +
                    _registry = registry;
         | 
| 84 88 | 
             
                    _reader = reader;
         | 
| 85 89 | 
             
                    _targetNftIdSet = new NftIdSet();
         | 
| 86 90 |  | 
| 91 | 
            +
                    _createInitialSetup();
         | 
| 87 92 | 
             
                    // register protocol target
         | 
| 93 | 
            +
                }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
             | 
| 96 | 
            +
                function _createInitialSetup()
         | 
| 97 | 
            +
                    internal
         | 
| 98 | 
            +
                {
         | 
| 99 | 
            +
                    // define support parameters for protocol target
         | 
| 100 | 
            +
                    _setSupportInfo(
         | 
| 101 | 
            +
                        PROTOCOL(), 
         | 
| 102 | 
            +
                        true, // isSupported
         | 
| 103 | 
            +
                        false, // allowNewTargets,
         | 
| 104 | 
            +
                        true, // crossChainIsSupported
         | 
| 105 | 
            +
                        AmountLib.zero(), // minStakingAmount
         | 
| 106 | 
            +
                        AmountLib.max(), // maxStakingAmount, 
         | 
| 107 | 
            +
                        SecondsLib.oneDay(), // minLockingPeriod, 
         | 
| 108 | 
            +
                        SecondsLib.oneYear(), // maxLockingPeriod, 
         | 
| 109 | 
            +
                        UFixedLib.zero(), // minRewardRate, 
         | 
| 110 | 
            +
                        UFixedLib.toUFixed(15, -2)); // maxRewardRate
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                    // create protocol target
         | 
| 88 113 | 
             
                    _createTarget(
         | 
| 89 114 | 
             
                        NftIdLib.toNftId(1101), 
         | 
| 90 | 
            -
                         | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 115 | 
            +
                        PROTOCOL(),
         | 
| 116 | 
            +
                        TargetManagerLib.getDefaultLockingPeriod(),
         | 
| 117 | 
            +
                        TargetManagerLib.getDefaultRewardRate(),
         | 
| 118 | 
            +
                        false); // no parameter check
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    // define support parameters for instance targets
         | 
| 121 | 
            +
                    _setSupportInfo(
         | 
| 122 | 
            +
                        INSTANCE(), 
         | 
| 123 | 
            +
                        true, // isSupported
         | 
| 124 | 
            +
                        true, // allowNewTargets,
         | 
| 125 | 
            +
                        true, // allowCrossChain
         | 
| 126 | 
            +
                        AmountLib.toAmount(100000 * 10 ** 18), // minStakingAmount 100'000 DIP
         | 
| 127 | 
            +
                        AmountLib.max(), // maxStakingAmount, 
         | 
| 128 | 
            +
                        SecondsLib.oneDay(), // minLockingPeriod, 
         | 
| 129 | 
            +
                        SecondsLib.oneYear(), // maxLockingPeriod, 
         | 
| 130 | 
            +
                        UFixedLib.zero(), // minRewardRate, 
         | 
| 131 | 
            +
                        UFixedLib.toUFixed(3, -1)); // maxRewardRate 30%
         | 
| 132 | 
            +
                }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
             | 
| 135 | 
            +
                function initialize(
         | 
| 136 | 
            +
                    address targetLimitHandler
         | 
| 137 | 
            +
                )
         | 
| 138 | 
            +
                    external
         | 
| 139 | 
            +
                    initializer()
         | 
| 140 | 
            +
                {
         | 
| 141 | 
            +
                    _targetLimitHandler = ITargetLimitHandler(targetLimitHandler);
         | 
| 142 | 
            +
                }
         | 
| 143 | 
            +
             | 
| 144 | 
            +
             | 
| 145 | 
            +
                //--- dependency management ---------------------------------------------//
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                function setStakingReader(address reader)
         | 
| 148 | 
            +
                    external
         | 
| 149 | 
            +
                    restricted()
         | 
| 150 | 
            +
                {
         | 
| 151 | 
            +
                    address oldReader = address(_reader);
         | 
| 152 | 
            +
                    _reader = StakingReader(reader);
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                    emit IStaking.LogStakingStakingReaderSet(reader, oldReader);
         | 
| 155 | 
            +
                }
         | 
| 156 | 
            +
             | 
| 157 | 
            +
             | 
| 158 | 
            +
                function setTargetLimitHandler(address targetLimitHandler )
         | 
| 159 | 
            +
                    external
         | 
| 160 | 
            +
                    restricted()
         | 
| 161 | 
            +
                {
         | 
| 162 | 
            +
                    address oldTargetHandler = address(_targetLimitHandler);
         | 
| 163 | 
            +
                    _targetLimitHandler = ITargetLimitHandler(targetLimitHandler );
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                    emit IStaking.LogStakingTargetHandlerSet(targetLimitHandler , oldTargetHandler);
         | 
| 166 | 
            +
                }
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                //--- target support management -----------------------------------------//
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                /// @dev Generic setter for support info.
         | 
| 171 | 
            +
                /// Any change in any of the parameters requires to set all parameters.
         | 
| 172 | 
            +
                function setSupportInfo(
         | 
| 173 | 
            +
                    ObjectType targetType,
         | 
| 174 | 
            +
                    bool isSupported,
         | 
| 175 | 
            +
                    bool allowNewTargets,
         | 
| 176 | 
            +
                    bool allowCrossChain,
         | 
| 177 | 
            +
                    Amount minStakingAmount,
         | 
| 178 | 
            +
                    Amount maxStakingAmount,
         | 
| 179 | 
            +
                    Seconds minLockingPeriod,
         | 
| 180 | 
            +
                    Seconds maxLockingPeriod,
         | 
| 181 | 
            +
                    UFixed minRewardRate,
         | 
| 182 | 
            +
                    UFixed maxRewardRate
         | 
| 183 | 
            +
                )
         | 
| 184 | 
            +
                    external
         | 
| 185 | 
            +
                    restricted()
         | 
| 186 | 
            +
                {
         | 
| 187 | 
            +
                    _setSupportInfo(
         | 
| 188 | 
            +
                        targetType,
         | 
| 189 | 
            +
                        isSupported,
         | 
| 190 | 
            +
                        allowNewTargets,
         | 
| 191 | 
            +
                        allowCrossChain,
         | 
| 192 | 
            +
                        minStakingAmount,
         | 
| 193 | 
            +
                        maxStakingAmount,
         | 
| 194 | 
            +
                        minLockingPeriod,
         | 
| 195 | 
            +
                        maxLockingPeriod,
         | 
| 196 | 
            +
                        minRewardRate,
         | 
| 197 | 
            +
                        maxRewardRate);
         | 
| 198 | 
            +
                }
         | 
| 199 | 
            +
             | 
| 200 | 
            +
             | 
| 201 | 
            +
                function _setSupportInfo(
         | 
| 202 | 
            +
                    ObjectType targetType,
         | 
| 203 | 
            +
                    bool isSupported,
         | 
| 204 | 
            +
                    bool allowNewTargets,
         | 
| 205 | 
            +
                    bool allowCrossChain,
         | 
| 206 | 
            +
                    Amount minStakingAmount,
         | 
| 207 | 
            +
                    Amount maxStakingAmount,
         | 
| 208 | 
            +
                    Seconds minLockingPeriod,
         | 
| 209 | 
            +
                    Seconds maxLockingPeriod,
         | 
| 210 | 
            +
                    UFixed minRewardRate,
         | 
| 211 | 
            +
                    UFixed maxRewardRate
         | 
| 212 | 
            +
                )
         | 
| 213 | 
            +
                    private
         | 
| 214 | 
            +
                {
         | 
| 215 | 
            +
                    // checks
         | 
| 216 | 
            +
                    if (targetType.eqz()) {
         | 
| 217 | 
            +
                        revert IStaking.ErrorStakingSupportTypeInvalid(targetType);
         | 
| 218 | 
            +
                    }
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                    // check staking amount limits
         | 
| 221 | 
            +
                    if (minStakingAmount > maxStakingAmount) {
         | 
| 222 | 
            +
                        revert IStaking.ErrorStakingStakingAmountsInvalid(minStakingAmount, maxStakingAmount);
         | 
| 223 | 
            +
                    }
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                    // check locking period limits
         | 
| 226 | 
            +
                    if (minLockingPeriod > maxLockingPeriod) {
         | 
| 227 | 
            +
                        revert IStaking.ErrorStakingLockingPeriodsInvalid(minLockingPeriod, maxLockingPeriod);
         | 
| 228 | 
            +
                    }
         | 
| 229 | 
            +
             | 
| 230 | 
            +
                    // check reward rate limits
         | 
| 231 | 
            +
                    if (minRewardRate > maxRewardRate) {
         | 
| 232 | 
            +
                        revert IStaking.ErrorStakingRewardRatesInvalid(minRewardRate, maxRewardRate);
         | 
| 233 | 
            +
                    }
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                    // effects
         | 
| 236 | 
            +
                    // remember previous last update
         | 
| 237 | 
            +
                    Blocknumber lastUpdateIn = _supportInfo[targetType].lastUpdateIn;
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                    // set parameters to new values
         | 
| 240 | 
            +
                    _supportInfo[targetType].isSupported = isSupported;
         | 
| 241 | 
            +
                    _supportInfo[targetType].allowNewTargets = allowNewTargets;
         | 
| 242 | 
            +
                    _supportInfo[targetType].allowCrossChain = allowCrossChain;
         | 
| 243 | 
            +
                    _supportInfo[targetType].minStakingAmount = minStakingAmount;
         | 
| 244 | 
            +
                    _supportInfo[targetType].maxStakingAmount = maxStakingAmount;
         | 
| 245 | 
            +
                    _supportInfo[targetType].minLockingPeriod = minLockingPeriod;
         | 
| 246 | 
            +
                    _supportInfo[targetType].maxLockingPeriod = maxLockingPeriod;
         | 
| 247 | 
            +
                    _supportInfo[targetType].minRewardRate = minRewardRate;
         | 
| 248 | 
            +
                    _supportInfo[targetType].maxRewardRate = maxRewardRate;
         | 
| 249 | 
            +
                    // update last update
         | 
| 250 | 
            +
                    _supportInfo[targetType].lastUpdateIn = BlocknumberLib.current();
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                    // logging
         | 
| 253 | 
            +
                    emit IStaking.LogStakingSupportInfoSet(
         | 
| 254 | 
            +
                        targetType,
         | 
| 255 | 
            +
                        isSupported,
         | 
| 256 | 
            +
                        allowNewTargets,
         | 
| 257 | 
            +
                        allowCrossChain,
         | 
| 258 | 
            +
                        minStakingAmount,
         | 
| 259 | 
            +
                        maxStakingAmount,
         | 
| 260 | 
            +
                        minLockingPeriod,
         | 
| 261 | 
            +
                        maxLockingPeriod,
         | 
| 262 | 
            +
                        minRewardRate,
         | 
| 263 | 
            +
                        maxRewardRate,
         | 
| 264 | 
            +
                        lastUpdateIn);
         | 
| 95 265 | 
             
                }
         | 
| 96 266 |  | 
| 267 | 
            +
                /// @dev Returns the support info for the specified target type.
         | 
| 268 | 
            +
                function getSupportInfo(ObjectType targetType)
         | 
| 269 | 
            +
                    external
         | 
| 270 | 
            +
                    view
         | 
| 271 | 
            +
                    returns (IStaking.SupportInfo memory supportInfo)
         | 
| 272 | 
            +
                {
         | 
| 273 | 
            +
                    return _supportInfo[targetType];
         | 
| 274 | 
            +
                }
         | 
| 275 | 
            +
             | 
| 276 | 
            +
                //--- token management --------------------------------------------------//
         | 
| 277 | 
            +
             | 
| 278 | 
            +
                /// @dev Registers a token for tvl management.
         | 
| 279 | 
            +
                function addToken(
         | 
| 280 | 
            +
                    ChainId chainId, 
         | 
| 281 | 
            +
                    address token
         | 
| 282 | 
            +
                )
         | 
| 283 | 
            +
                    external
         | 
| 284 | 
            +
                    restricted() // token registry via staking
         | 
| 285 | 
            +
                {
         | 
| 286 | 
            +
                    // checks
         | 
| 287 | 
            +
                    IStaking.TokenInfo storage info = _tokenInfo[chainId][token];
         | 
| 288 | 
            +
             | 
| 289 | 
            +
                    // check token is not yet registered
         | 
| 290 | 
            +
                    if (info.lastUpdateIn.gtz()) {
         | 
| 291 | 
            +
                        revert ErrorStakingStoreTokenAlreadyAdded(chainId, token);
         | 
| 292 | 
            +
                    }
         | 
| 293 | 
            +
             | 
| 294 | 
            +
                    info.stakingRate = UFixedLib.zero();
         | 
| 295 | 
            +
                    info.lastUpdateIn = BlocknumberLib.current();
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                    // logging
         | 
| 298 | 
            +
                    emit IStaking.LogStakingTokenAdded(chainId, token);
         | 
| 299 | 
            +
                }
         | 
| 97 300 |  | 
| 98 | 
            -
                //--- staking rate specific functions -----------------------------------//
         | 
| 99 301 |  | 
| 302 | 
            +
                /// @dev Sets the staking rate for the token.
         | 
| 100 303 | 
             
                function setStakingRate(
         | 
| 101 | 
            -
                     | 
| 304 | 
            +
                    ChainId chainId, 
         | 
| 102 305 | 
             
                    address token, 
         | 
| 103 306 | 
             
                    UFixed stakingRate
         | 
| 104 307 | 
             
                )
         | 
| 105 308 | 
             
                    external
         | 
| 106 | 
            -
                    restricted()
         | 
| 309 | 
            +
                    restricted() // staking
         | 
| 310 | 
            +
                    returns (
         | 
| 311 | 
            +
                        UFixed oldStakingRate,
         | 
| 312 | 
            +
                        Blocknumber lastUpdatedIn
         | 
| 313 | 
            +
                    )
         | 
| 107 314 | 
             
                {
         | 
| 108 | 
            -
                     | 
| 315 | 
            +
                    IStaking.TokenInfo storage info = _tokenInfo[chainId][token];
         | 
| 316 | 
            +
                    if (info.lastUpdateIn.eqz()) {
         | 
| 317 | 
            +
                        revert ErrorStakingStoreTokenUnknown(chainId, token);
         | 
| 318 | 
            +
                    }
         | 
| 319 | 
            +
             | 
| 320 | 
            +
                    // get previous values
         | 
| 321 | 
            +
                    oldStakingRate = info.stakingRate;
         | 
| 322 | 
            +
                    lastUpdatedIn = info.lastUpdateIn;
         | 
| 323 | 
            +
             | 
| 324 | 
            +
                    // update values
         | 
| 325 | 
            +
                    info.stakingRate = stakingRate;
         | 
| 326 | 
            +
                    info.lastUpdateIn = BlocknumberLib.current();
         | 
| 109 327 | 
             
                }
         | 
| 110 328 |  | 
| 111 | 
            -
                //--- target  | 
| 329 | 
            +
                //--- target management -------------------------------------------------//
         | 
| 112 330 |  | 
| 113 331 | 
             
                function createTarget(
         | 
| 114 332 | 
             
                    NftId targetNftId,
         | 
| 115 | 
            -
                     | 
| 333 | 
            +
                    ObjectType objectType,
         | 
| 334 | 
            +
                    Seconds lockingPeriod,
         | 
| 335 | 
            +
                    UFixed rewardRate
         | 
| 116 336 | 
             
                )
         | 
| 117 337 | 
             
                    external
         | 
| 118 | 
            -
                    restricted()
         | 
| 338 | 
            +
                    restricted() // staking
         | 
| 119 339 | 
             
                {
         | 
| 120 | 
            -
                    _createTarget(targetNftId,  | 
| 340 | 
            +
                    _createTarget(targetNftId, objectType, lockingPeriod, rewardRate, true);
         | 
| 121 341 | 
             
                }
         | 
| 122 342 |  | 
| 123 343 |  | 
| 124 | 
            -
                function  | 
| 344 | 
            +
                function setLockingPeriod(
         | 
| 345 | 
            +
                    NftId targetNftId,
         | 
| 346 | 
            +
                    Seconds lockingPeriod
         | 
| 347 | 
            +
                )
         | 
| 348 | 
            +
                    external
         | 
| 349 | 
            +
                    restricted() // staking
         | 
| 350 | 
            +
                {
         | 
| 351 | 
            +
                    // checks
         | 
| 352 | 
            +
                    (
         | 
| 353 | 
            +
                        IStaking.TargetInfo storage targetInfo, 
         | 
| 354 | 
            +
                        Blocknumber lastUpdateIn
         | 
| 355 | 
            +
                    ) = _verifyAndUpdateTarget(targetNftId);
         | 
| 356 | 
            +
             | 
| 357 | 
            +
                    TargetManagerLib.checkLockingPeriod(_reader, targetNftId, targetInfo.objectType, lockingPeriod);
         | 
| 358 | 
            +
             | 
| 359 | 
            +
                    // effects
         | 
| 360 | 
            +
                    Seconds oldLockingPeriod = targetInfo.lockingPeriod;
         | 
| 361 | 
            +
                    targetInfo.lockingPeriod = lockingPeriod;
         | 
| 362 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 363 | 
            +
             | 
| 364 | 
            +
                    // logging
         | 
| 365 | 
            +
                    emit IStaking.LogStakingTargetLockingPeriodSet(targetNftId, lockingPeriod, oldLockingPeriod, lastUpdateIn);
         | 
| 366 | 
            +
                }
         | 
| 367 | 
            +
             | 
| 368 | 
            +
             | 
| 369 | 
            +
                function setRewardRate(
         | 
| 370 | 
            +
                    NftId targetNftId,
         | 
| 371 | 
            +
                    UFixed rewardRate
         | 
| 372 | 
            +
                )
         | 
| 373 | 
            +
                    external
         | 
| 374 | 
            +
                    restricted() // staking
         | 
| 375 | 
            +
                {
         | 
| 376 | 
            +
                    // checks
         | 
| 377 | 
            +
                    (
         | 
| 378 | 
            +
                        IStaking.TargetInfo storage targetInfo, 
         | 
| 379 | 
            +
                        Blocknumber lastUpdateIn
         | 
| 380 | 
            +
                    ) = _verifyAndUpdateTarget(targetNftId);
         | 
| 381 | 
            +
             | 
| 382 | 
            +
                    TargetManagerLib.checkRewardRate(_reader, targetNftId, targetInfo.objectType, rewardRate);
         | 
| 383 | 
            +
             | 
| 384 | 
            +
                    // effects
         | 
| 385 | 
            +
                    UFixed oldRewardRate = targetInfo.rewardRate;
         | 
| 386 | 
            +
                    targetInfo.rewardRate = rewardRate;
         | 
| 387 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 388 | 
            +
             | 
| 389 | 
            +
                    // logging
         | 
| 390 | 
            +
                    emit IStaking.LogStakingTargetRewardRateSet(targetNftId, rewardRate, oldRewardRate, lastUpdateIn);
         | 
| 391 | 
            +
                }
         | 
| 392 | 
            +
             | 
| 393 | 
            +
             | 
| 394 | 
            +
                // TODO refactor to set limits functionality
         | 
| 395 | 
            +
                function setMaxStakedAmount(
         | 
| 396 | 
            +
                    NftId targetNftId,
         | 
| 397 | 
            +
                    Amount stakeLimitAmount
         | 
| 398 | 
            +
                )
         | 
| 399 | 
            +
                    external
         | 
| 400 | 
            +
                    restricted() // staking
         | 
| 401 | 
            +
                    returns (
         | 
| 402 | 
            +
                        Amount oldLimitAmount,
         | 
| 403 | 
            +
                        Blocknumber lastUpdatedIn
         | 
| 404 | 
            +
                    )
         | 
| 405 | 
            +
                {
         | 
| 406 | 
            +
                    IStaking.TargetInfo storage targetInfo;
         | 
| 407 | 
            +
                    (targetInfo, lastUpdatedIn) = _verifyAndUpdateTarget(targetNftId);
         | 
| 408 | 
            +
             | 
| 409 | 
            +
                    oldLimitAmount = targetInfo.limitAmount;
         | 
| 410 | 
            +
                    targetInfo.limitAmount = stakeLimitAmount;
         | 
| 411 | 
            +
             | 
| 412 | 
            +
                    emit IStaking.LogStakingTargetMaxStakedAmountSet(targetNftId, stakeLimitAmount, lastUpdatedIn);
         | 
| 413 | 
            +
             | 
| 414 | 
            +
                }
         | 
| 415 | 
            +
             | 
| 416 | 
            +
             | 
| 417 | 
            +
                function setTargetLimits(
         | 
| 125 418 | 
             
                    NftId targetNftId, 
         | 
| 126 | 
            -
                     | 
| 419 | 
            +
                    Amount marginAmount, 
         | 
| 420 | 
            +
                    Amount hardLimitAmount
         | 
| 421 | 
            +
                )
         | 
| 422 | 
            +
                    external
         | 
| 423 | 
            +
                    virtual
         | 
| 424 | 
            +
                    restricted()
         | 
| 425 | 
            +
                {
         | 
| 426 | 
            +
                    // checks
         | 
| 427 | 
            +
                    IStaking.LimitInfo storage limitInfo = _getAndVerifyLimit(targetNftId);
         | 
| 428 | 
            +
                    Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
         | 
| 429 | 
            +
             | 
| 430 | 
            +
                    // effects
         | 
| 431 | 
            +
                    limitInfo.marginAmount = marginAmount;
         | 
| 432 | 
            +
                    limitInfo.hardLimitAmount = hardLimitAmount;
         | 
| 433 | 
            +
                    limitInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 434 | 
            +
             | 
| 435 | 
            +
                    // logging
         | 
| 436 | 
            +
                    emit IStaking.LogStakingTargetLimitsUpdated(
         | 
| 437 | 
            +
                        targetNftId,
         | 
| 438 | 
            +
                        marginAmount,
         | 
| 439 | 
            +
                        hardLimitAmount,
         | 
| 440 | 
            +
                        lastUpdateIn);
         | 
| 441 | 
            +
                }
         | 
| 442 | 
            +
             | 
| 443 | 
            +
             | 
| 444 | 
            +
                function addTargetToken(
         | 
| 445 | 
            +
                    NftId targetNftId,
         | 
| 446 | 
            +
                    address token
         | 
| 127 447 | 
             
                )
         | 
| 128 448 | 
             
                    external
         | 
| 129 449 | 
             
                    restricted()
         | 
| 130 450 | 
             
                {
         | 
| 131 | 
            -
                     | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 451 | 
            +
                    // checks
         | 
| 452 | 
            +
             | 
| 453 | 
            +
                    // skip registering if tvl balance has already been initialized
         | 
| 454 | 
            +
                    IStaking.TvlInfo storage tvlInfo = _tvlInfo[targetNftId][token];
         | 
| 455 | 
            +
                    if (tvlInfo.lastUpdateIn.gtz()) {
         | 
| 456 | 
            +
                        return;
         | 
| 457 | 
            +
                    }
         | 
| 458 | 
            +
             | 
| 459 | 
            +
                    // check target exists
         | 
| 460 | 
            +
                    _getAndVerifyTarget(targetNftId);
         | 
| 461 | 
            +
             | 
| 462 | 
            +
                    // check token is known for chain id of target
         | 
| 463 | 
            +
                    ChainId chainId = ChainIdLib.fromNftId(targetNftId);
         | 
| 464 | 
            +
                    if (_tokenInfo[chainId][token].lastUpdateIn.eqz()) {
         | 
| 465 | 
            +
                        revert ErrorStakingStoreTokenUnknown(chainId, token);
         | 
| 466 | 
            +
                    }
         | 
| 467 | 
            +
             | 
| 468 | 
            +
                    // effects
         | 
| 469 | 
            +
                    tvlInfo.tvlAmount = AmountLib.zero();
         | 
| 470 | 
            +
                    tvlInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 471 | 
            +
             | 
| 472 | 
            +
                    // add token to list of know tokens for target
         | 
| 473 | 
            +
                    _targetToken[targetNftId].push(token);
         | 
| 134 474 | 
             
                }
         | 
| 135 475 |  | 
| 136 476 |  | 
| 137 | 
            -
                function  | 
| 477 | 
            +
                function refillRewardReserves(
         | 
| 138 478 | 
             
                    NftId targetNftId, 
         | 
| 139 479 | 
             
                    Amount dipAmount
         | 
| 140 480 | 
             
                )
         | 
| @@ -142,14 +482,26 @@ contract StakingStore is | |
| 142 482 | 
             
                    restricted()
         | 
| 143 483 | 
             
                    returns (Amount newReserveBalance)
         | 
| 144 484 | 
             
                {
         | 
| 145 | 
            -
                     | 
| 146 | 
            -
                     | 
| 485 | 
            +
                    // checks
         | 
| 486 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
         | 
| 487 | 
            +
                    Blocknumber lastUpdateIn = targetInfo.lastUpdateIn;
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                    // effects
         | 
| 490 | 
            +
                    targetInfo.reserveAmount = targetInfo.reserveAmount + dipAmount;
         | 
| 491 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 147 492 |  | 
| 148 | 
            -
                     | 
| 493 | 
            +
                    // logging
         | 
| 494 | 
            +
                    newReserveBalance = targetInfo.reserveAmount;
         | 
| 495 | 
            +
                    emit IStaking.LogStakingRewardReservesRefilled(
         | 
| 496 | 
            +
                        targetNftId,
         | 
| 497 | 
            +
                        dipAmount,
         | 
| 498 | 
            +
                        _registry.ownerOf(targetNftId),
         | 
| 499 | 
            +
                        newReserveBalance,
         | 
| 500 | 
            +
                        lastUpdateIn);
         | 
| 149 501 | 
             
                }
         | 
| 150 502 |  | 
| 151 503 |  | 
| 152 | 
            -
                function  | 
| 504 | 
            +
                function withdrawRewardReserves(
         | 
| 153 505 | 
             
                    NftId targetNftId, 
         | 
| 154 506 | 
             
                    Amount dipAmount
         | 
| 155 507 | 
             
                )
         | 
| @@ -157,18 +509,20 @@ contract StakingStore is | |
| 157 509 | 
             
                    restricted()
         | 
| 158 510 | 
             
                    returns (Amount newReserveBalance)
         | 
| 159 511 | 
             
                {
         | 
| 160 | 
            -
                     | 
| 161 | 
            -
                     | 
| 162 | 
            -
                        revert ErrorStakingStoreRewardReservesInsufficient(
         | 
| 163 | 
            -
                            targetNftId,
         | 
| 164 | 
            -
                            dipAmount,
         | 
| 165 | 
            -
                            reserveAmount);
         | 
| 166 | 
            -
                    }
         | 
| 512 | 
            +
                    // checks
         | 
| 513 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
         | 
| 167 514 |  | 
| 168 | 
            -
                     | 
| 169 | 
            -
                    Blocknumber  | 
| 515 | 
            +
                    // effects
         | 
| 516 | 
            +
                    Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
         | 
| 170 517 |  | 
| 171 | 
            -
                     | 
| 518 | 
            +
                    // logging
         | 
| 519 | 
            +
                    newReserveBalance = targetInfo.reserveAmount;
         | 
| 520 | 
            +
                    emit IStaking.LogStakingRewardReservesWithdrawn(
         | 
| 521 | 
            +
                        targetNftId,
         | 
| 522 | 
            +
                        dipAmount,
         | 
| 523 | 
            +
                        _registry.ownerOf(targetNftId),
         | 
| 524 | 
            +
                        newReserveBalance,
         | 
| 525 | 
            +
                        lastUpdateIn);
         | 
| 172 526 | 
             
                }
         | 
| 173 527 |  | 
| 174 528 |  | 
| @@ -176,7 +530,6 @@ contract StakingStore is | |
| 176 530 |  | 
| 177 531 | 
             
                function increaseTotalValueLocked(
         | 
| 178 532 | 
             
                    NftId targetNftId,
         | 
| 179 | 
            -
                    UFixed stakingRate,
         | 
| 180 533 | 
             
                    address token,
         | 
| 181 534 | 
             
                    Amount amount
         | 
| 182 535 | 
             
                )
         | 
| @@ -184,32 +537,24 @@ contract StakingStore is | |
| 184 537 | 
             
                    restricted()
         | 
| 185 538 | 
             
                    returns (Amount newBalance)
         | 
| 186 539 | 
             
                {
         | 
| 187 | 
            -
                     | 
| 188 | 
            -
             | 
| 189 | 
            -
             | 
| 190 | 
            -
             | 
| 191 | 
            -
                     | 
| 192 | 
            -
             | 
| 193 | 
            -
                     | 
| 194 | 
            -
                     | 
| 195 | 
            -
             | 
| 196 | 
            -
                     | 
| 197 | 
            -
             | 
| 198 | 
            -
                     | 
| 199 | 
            -
             | 
| 200 | 
            -
                    // update new amount of required dip
         | 
| 201 | 
            -
                    _tvlRequiredDip[targetNftId] = _tvlRequiredDip[targetNftId] - oldDipBalance + newDipBalance;
         | 
| 202 | 
            -
             | 
| 203 | 
            -
                    // update last updated in
         | 
| 204 | 
            -
                    _tvlLastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
         | 
| 205 | 
            -
             | 
| 206 | 
            -
                    emit LogStakingStoreTotalValueLockedIncreased(targetNftId, token, amount, newBalance, tvlLastUpdatedIn);
         | 
| 540 | 
            +
                    // checks
         | 
| 541 | 
            +
                    IStaking.TvlInfo storage tvlInfo = _getAndVerifyTvl(targetNftId, token);
         | 
| 542 | 
            +
                    Blocknumber lastUpdateIn = tvlInfo.lastUpdateIn;
         | 
| 543 | 
            +
             | 
| 544 | 
            +
                    // effects
         | 
| 545 | 
            +
                    // update tvl balance and adapts required stakes if necessary
         | 
| 546 | 
            +
                    tvlInfo.tvlAmount = tvlInfo.tvlAmount + amount;
         | 
| 547 | 
            +
                    _checkAndUpdateTargetLimit(targetNftId, token, tvlInfo);
         | 
| 548 | 
            +
                    tvlInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 549 | 
            +
                    newBalance = tvlInfo.tvlAmount;
         | 
| 550 | 
            +
             | 
| 551 | 
            +
                    // logging
         | 
| 552 | 
            +
                    emit IStaking.LogStakingTvlIncreased(targetNftId, token, amount, newBalance, lastUpdateIn);
         | 
| 207 553 | 
             
                }
         | 
| 208 554 |  | 
| 209 555 |  | 
| 210 556 | 
             
                function decreaseTotalValueLocked(
         | 
| 211 557 | 
             
                    NftId targetNftId,
         | 
| 212 | 
            -
                    UFixed stakingRate,
         | 
| 213 558 | 
             
                    address token,
         | 
| 214 559 | 
             
                    Amount amount
         | 
| 215 560 | 
             
                )
         | 
| @@ -217,389 +562,807 @@ contract StakingStore is | |
| 217 562 | 
             
                    restricted()
         | 
| 218 563 | 
             
                    returns (Amount newBalance)
         | 
| 219 564 | 
             
                {
         | 
| 220 | 
            -
                     | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
                     | 
| 565 | 
            +
                    // checks
         | 
| 566 | 
            +
                    IStaking.TvlInfo storage tvlInfo = _getAndVerifyTvl(targetNftId, token);
         | 
| 567 | 
            +
                    Blocknumber lastUpdateIn = tvlInfo.lastUpdateIn;
         | 
| 568 | 
            +
             | 
| 569 | 
            +
                    // effects
         | 
| 570 | 
            +
                    // update tvl balance and adapts required stakes if necessary
         | 
| 571 | 
            +
                    tvlInfo.tvlAmount = tvlInfo.tvlAmount - amount;
         | 
| 572 | 
            +
                    _checkAndUpdateTargetLimit(targetNftId, token, tvlInfo);
         | 
| 573 | 
            +
                    tvlInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 574 | 
            +
                    newBalance = tvlInfo.tvlAmount;
         | 
| 575 | 
            +
             | 
| 576 | 
            +
                    // logging
         | 
| 577 | 
            +
                    emit IStaking.LogStakingTvlDecreased(targetNftId, token, amount, newBalance, lastUpdateIn);
         | 
| 578 | 
            +
                }
         | 
| 225 579 |  | 
| 226 | 
            -
                    newBalance = oldBalance - amount;
         | 
| 227 | 
            -
                    Amount newDipBalance = AmountLib.toAmount((
         | 
| 228 | 
            -
                        stakingRate * newBalance.toUFixed()).toInt());
         | 
| 229 580 |  | 
| 230 | 
            -
             | 
| 231 | 
            -
                     | 
| 232 | 
            -
                     | 
| 581 | 
            +
                function updateTargetLimit(NftId targetNftId)
         | 
| 582 | 
            +
                    external
         | 
| 583 | 
            +
                    restricted()
         | 
| 584 | 
            +
                    returns (Amount stakeLimitAmount)
         | 
| 585 | 
            +
                {
         | 
| 586 | 
            +
                    return _updateTargetLimit(targetNftId);
         | 
| 587 | 
            +
                }
         | 
| 233 588 |  | 
| 234 | 
            -
                    // update new amount of required dip
         | 
| 235 | 
            -
                    _tvlRequiredDip[targetNftId] = _tvlRequiredDip[targetNftId] - oldDipBalance + newDipBalance;
         | 
| 236 589 |  | 
| 237 | 
            -
             | 
| 238 | 
            -
                     | 
| 590 | 
            +
                function _checkAndUpdateTargetLimit(
         | 
| 591 | 
            +
                    NftId targetNftId, 
         | 
| 592 | 
            +
                    address token,
         | 
| 593 | 
            +
                    IStaking.TvlInfo storage tvlInfo
         | 
| 594 | 
            +
                )
         | 
| 595 | 
            +
                    internal
         | 
| 596 | 
            +
                {
         | 
| 597 | 
            +
                    // update counter
         | 
| 598 | 
            +
                    tvlInfo.updatesCounter++;
         | 
| 599 | 
            +
             | 
| 600 | 
            +
                    // check if upgrade is necessary
         | 
| 601 | 
            +
                    bool updateRequired = _targetLimitHandler.isLimitUpdateRequired(
         | 
| 602 | 
            +
                        targetNftId, 
         | 
| 603 | 
            +
                        token, 
         | 
| 604 | 
            +
                        tvlInfo.updatesCounter,
         | 
| 605 | 
            +
                        tvlInfo.tvlBaselineAmount, 
         | 
| 606 | 
            +
                        tvlInfo.tvlAmount);
         | 
| 607 | 
            +
             | 
| 608 | 
            +
                    if (updateRequired) {
         | 
| 609 | 
            +
                        // reset baseline and counter
         | 
| 610 | 
            +
                        tvlInfo.tvlBaselineAmount = tvlInfo.tvlAmount;
         | 
| 611 | 
            +
                        tvlInfo.updatesCounter = 0;
         | 
| 612 | 
            +
             | 
| 613 | 
            +
                        // update limit
         | 
| 614 | 
            +
                        _updateTargetLimit(targetNftId);
         | 
| 615 | 
            +
                    }
         | 
| 616 | 
            +
                }
         | 
| 617 | 
            +
             | 
| 239 618 |  | 
| 240 | 
            -
             | 
| 619 | 
            +
                function _updateTargetLimit(NftId targetNftId)
         | 
| 620 | 
            +
                    internal
         | 
| 621 | 
            +
                    returns (Amount limitAmount)
         | 
| 622 | 
            +
                {
         | 
| 623 | 
            +
                    // checks
         | 
| 624 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
         | 
| 625 | 
            +
                    IStaking.LimitInfo storage limitInfo = _getAndVerifyLimit(targetNftId);
         | 
| 626 | 
            +
                    Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
         | 
| 627 | 
            +
             | 
| 628 | 
            +
                    // calculate max stake amount
         | 
| 629 | 
            +
                    Amount requiredStakeAmount = getRequiredStakeBalance(targetNftId, false);
         | 
| 630 | 
            +
                    // limitAmount = AmountLib.min(
         | 
| 631 | 
            +
                    //     targetInfo.limitAmount, 
         | 
| 632 | 
            +
                    //     requiredStakeAmount + limitInfo.marginAmount);
         | 
| 633 | 
            +
                    
         | 
| 634 | 
            +
                    // add margin to required stakes
         | 
| 635 | 
            +
                    limitAmount = requiredStakeAmount + limitInfo.marginAmount;
         | 
| 636 | 
            +
                    // cap at hard limit
         | 
| 637 | 
            +
                    limitAmount = AmountLib.min(limitAmount, limitInfo.hardLimitAmount);
         | 
| 638 | 
            +
             | 
| 639 | 
            +
                    // effects
         | 
| 640 | 
            +
                    targetInfo.limitAmount = limitAmount;
         | 
| 641 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 642 | 
            +
             | 
| 643 | 
            +
                    // logging
         | 
| 644 | 
            +
                    emit IStaking.LogStakingTargetLimitUpdated(
         | 
| 645 | 
            +
                        targetNftId,
         | 
| 646 | 
            +
                        targetInfo.limitAmount,
         | 
| 647 | 
            +
                        limitInfo.hardLimitAmount,
         | 
| 648 | 
            +
                        requiredStakeAmount,
         | 
| 649 | 
            +
                        targetInfo.stakedAmount,
         | 
| 650 | 
            +
                        lastUpdateIn);
         | 
| 241 651 | 
             
                }
         | 
| 242 652 |  | 
| 243 653 | 
             
                //--- stake specific functions -------------------------------------//
         | 
| 244 654 |  | 
| 245 | 
            -
                function  | 
| 655 | 
            +
                function createStake(
         | 
| 246 656 | 
             
                    NftId stakeNftId, 
         | 
| 247 | 
            -
                     | 
| 657 | 
            +
                    NftId targetNftId,
         | 
| 658 | 
            +
                    address stakeOwner,
         | 
| 659 | 
            +
                    Amount stakeAmount
         | 
| 248 660 | 
             
                )
         | 
| 249 661 | 
             
                    external
         | 
| 250 662 | 
             
                    restricted()
         | 
| 663 | 
            +
                    returns (Timestamp lockedUntil)
         | 
| 251 664 | 
             
                {
         | 
| 252 | 
            -
                     | 
| 253 | 
            -
             | 
| 254 | 
            -
             | 
| 665 | 
            +
                    // checks
         | 
| 666 | 
            +
                    IStaking.StakeInfo storage stakeInfo = _stakeInfo[stakeNftId];
         | 
| 667 | 
            +
                    if (stakeInfo.lastUpdateIn.gtz()) {
         | 
| 668 | 
            +
                        revert ErrorStakingStoreStakeBalanceAlreadyInitialized(stakeNftId);
         | 
| 669 | 
            +
                    }
         | 
| 670 | 
            +
             | 
| 671 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
         | 
| 672 | 
            +
                    _checkMaxStakedAmount(targetNftId, targetInfo, stakeAmount);
         | 
| 255 673 |  | 
| 256 | 
            -
                     | 
| 674 | 
            +
                    // effects
         | 
| 675 | 
            +
                    stakeInfo.targetNftId = targetNftId;
         | 
| 676 | 
            +
                    stakeInfo.stakedAmount = AmountLib.zero();
         | 
| 677 | 
            +
                    stakeInfo.rewardAmount = AmountLib.zero();
         | 
| 678 | 
            +
                    stakeInfo.lockedUntil = TimestampLib.current();
         | 
| 679 | 
            +
                    _setStakeLastUpdatesToCurrent(stakeInfo);
         | 
| 680 | 
            +
             | 
| 681 | 
            +
                    // logging for creation of empty stake
         | 
| 682 | 
            +
                    emit IStaking.LogStakingStakeCreated(stakeNftId, stakeInfo.targetNftId, stakeInfo.stakedAmount, stakeInfo.lockedUntil, stakeOwner);
         | 
| 683 | 
            +
             | 
| 684 | 
            +
                    // process stake amount
         | 
| 685 | 
            +
                    _stake(stakeNftId, stakeInfo, targetInfo, targetInfo.lockingPeriod, stakeAmount);
         | 
| 686 | 
            +
             | 
| 687 | 
            +
                    return stakeInfo.lockedUntil;
         | 
| 257 688 | 
             
                }
         | 
| 258 689 |  | 
| 259 | 
            -
             | 
| 260 | 
            -
             | 
| 261 | 
            -
                     | 
| 690 | 
            +
             | 
| 691 | 
            +
                function stake(
         | 
| 692 | 
            +
                    NftId stakeNftId,
         | 
| 693 | 
            +
                    bool updateRewards,
         | 
| 694 | 
            +
                    bool restakeRewards,
         | 
| 695 | 
            +
                    Seconds additionalLockingPeriod,
         | 
| 696 | 
            +
                    Amount stakeAmount
         | 
| 262 697 | 
             
                )
         | 
| 263 698 | 
             
                    external
         | 
| 264 699 | 
             
                    restricted()
         | 
| 265 700 | 
             
                {
         | 
| 266 | 
            -
                     | 
| 267 | 
            -
             | 
| 268 | 
            -
             | 
| 269 | 
            -
                        KEEP_STATE());
         | 
| 270 | 
            -
                }
         | 
| 701 | 
            +
                    // checks
         | 
| 702 | 
            +
                    IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
         | 
| 703 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
         | 
| 271 704 |  | 
| 272 | 
            -
             | 
| 705 | 
            +
                    if (updateRewards) {
         | 
| 706 | 
            +
                        _updateRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 707 | 
            +
                    }
         | 
| 273 708 |  | 
| 709 | 
            +
                    if (restakeRewards) {
         | 
| 710 | 
            +
                        _restakeRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 711 | 
            +
                    }
         | 
| 274 712 |  | 
| 275 | 
            -
             | 
| 276 | 
            -
             | 
| 277 | 
            -
             | 
| 278 | 
            -
             | 
| 713 | 
            +
                    _stake(stakeNftId, stakeInfo, targetInfo, additionalLockingPeriod, stakeAmount);
         | 
| 714 | 
            +
                }
         | 
| 715 | 
            +
             | 
| 716 | 
            +
             | 
| 717 | 
            +
                function unstake(
         | 
| 718 | 
            +
                    NftId stakeNftId,
         | 
| 719 | 
            +
                    bool updateRewards,
         | 
| 720 | 
            +
                    bool restakeRewards,
         | 
| 721 | 
            +
                    Amount maxUnstakeAmount
         | 
| 279 722 | 
             
                )
         | 
| 280 723 | 
             
                    external
         | 
| 281 724 | 
             
                    restricted()
         | 
| 725 | 
            +
                    returns (Amount unstakedAmount)
         | 
| 282 726 | 
             
                {
         | 
| 283 | 
            -
                     | 
| 727 | 
            +
                    // checks
         | 
| 728 | 
            +
                    IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
         | 
| 729 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
         | 
| 284 730 |  | 
| 285 | 
            -
                     | 
| 286 | 
            -
                         | 
| 287 | 
            -
             | 
| 288 | 
            -
                        _rewardBalance[nftId]); // unchanged reward balance
         | 
| 731 | 
            +
                    if (updateRewards) {
         | 
| 732 | 
            +
                        _updateRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 733 | 
            +
                    }
         | 
| 289 734 |  | 
| 290 | 
            -
                     | 
| 291 | 
            -
                         | 
| 292 | 
            -
             | 
| 293 | 
            -
                        _rewardBalance[targetNftId]);
         | 
| 735 | 
            +
                    if (restakeRewards) {
         | 
| 736 | 
            +
                        _restakeRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 737 | 
            +
                    }
         | 
| 294 738 |  | 
| 295 | 
            -
                     | 
| 739 | 
            +
                    return _unstake(stakeNftId, stakeInfo, targetInfo, maxUnstakeAmount);
         | 
| 296 740 | 
             
                }
         | 
| 297 741 |  | 
| 298 742 |  | 
| 299 | 
            -
                function  | 
| 300 | 
            -
                    NftId nftId, 
         | 
| 301 | 
            -
                    NftId targetNftId,
         | 
| 302 | 
            -
                    Amount rewardIncrementAmount
         | 
| 303 | 
            -
                )
         | 
| 743 | 
            +
                function updateRewards(NftId stakeNftId)
         | 
| 304 744 | 
             
                    external
         | 
| 305 745 | 
             
                    restricted()
         | 
| 306 746 | 
             
                {
         | 
| 307 | 
            -
                     | 
| 308 | 
            -
                     | 
| 309 | 
            -
                     | 
| 310 | 
            -
             | 
| 311 | 
            -
                    // move all rewards to stake balance
         | 
| 312 | 
            -
                    _updateStakeBalance(
         | 
| 313 | 
            -
                        nftId, 
         | 
| 314 | 
            -
                        stakeAmount + rewardAmount + rewardIncrementAmount, // new stake balance
         | 
| 315 | 
            -
                        AmountLib.zero()); // new reward balance
         | 
| 316 | 
            -
             | 
| 317 | 
            -
                    _updateTargetBalance(
         | 
| 318 | 
            -
                        targetNftId,
         | 
| 319 | 
            -
                        _stakeBalance[targetNftId] + rewardAmount + rewardIncrementAmount,
         | 
| 320 | 
            -
                        _rewardBalance[targetNftId] - rewardAmount);
         | 
| 321 | 
            -
             | 
| 322 | 
            -
                    emit LogStakingStoreRewardsRestaked(nftId, stakeAmount, rewardAmount, rewardIncrementAmount, _stakeBalance[nftId], lastUpdatedIn);
         | 
| 747 | 
            +
                    // checks
         | 
| 748 | 
            +
                    IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
         | 
| 749 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
         | 
| 750 | 
            +
                    _updateRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 323 751 | 
             
                }
         | 
| 324 752 |  | 
| 325 753 |  | 
| 326 | 
            -
                function  | 
| 327 | 
            -
                    NftId  | 
| 328 | 
            -
                     | 
| 329 | 
            -
                    Amount rewardIncrementAmount
         | 
| 754 | 
            +
                function restakeRewards(
         | 
| 755 | 
            +
                    NftId stakeNftId,
         | 
| 756 | 
            +
                    bool updateRewards
         | 
| 330 757 | 
             
                )
         | 
| 331 758 | 
             
                    external
         | 
| 332 759 | 
             
                    restricted()
         | 
| 333 760 | 
             
                {
         | 
| 334 | 
            -
                     | 
| 761 | 
            +
                    // checks
         | 
| 762 | 
            +
                    IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
         | 
| 763 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
         | 
| 335 764 |  | 
| 336 | 
            -
                     | 
| 337 | 
            -
             | 
| 338 | 
            -
             | 
| 339 | 
            -
                        _stakeBalance[nftId], // unchanged stake balance
         | 
| 340 | 
            -
                        _rewardBalance[nftId] + rewardIncrementAmount); // new reward balance
         | 
| 341 | 
            -
             | 
| 342 | 
            -
                    _updateTargetBalance(
         | 
| 343 | 
            -
                        targetNftId,
         | 
| 344 | 
            -
                        _stakeBalance[targetNftId],
         | 
| 345 | 
            -
                        _rewardBalance[targetNftId] + rewardIncrementAmount);
         | 
| 765 | 
            +
                    if (updateRewards) {
         | 
| 766 | 
            +
                        _updateRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 767 | 
            +
                    }
         | 
| 346 768 |  | 
| 347 | 
            -
                     | 
| 769 | 
            +
                    _restakeRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 348 770 | 
             
                }
         | 
| 349 771 |  | 
| 350 772 |  | 
| 351 | 
            -
                function  | 
| 352 | 
            -
                    NftId  | 
| 353 | 
            -
                     | 
| 773 | 
            +
                function claimRewards(
         | 
| 774 | 
            +
                    NftId stakeNftId,
         | 
| 775 | 
            +
                    bool updateRewards,
         | 
| 354 776 | 
             
                    Amount maxClaimAmount
         | 
| 355 777 | 
             
                )
         | 
| 356 778 | 
             
                    external
         | 
| 357 779 | 
             
                    restricted()
         | 
| 358 780 | 
             
                    returns (Amount claimedAmount)
         | 
| 359 781 | 
             
                {
         | 
| 360 | 
            -
                     | 
| 782 | 
            +
                    // checks
         | 
| 783 | 
            +
                    IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
         | 
| 784 | 
            +
                    IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
         | 
| 361 785 |  | 
| 362 | 
            -
                     | 
| 363 | 
            -
             | 
| 786 | 
            +
                    if (updateRewards) {
         | 
| 787 | 
            +
                        _updateRewards(stakeNftId, stakeInfo, targetInfo);
         | 
| 788 | 
            +
                    }
         | 
| 364 789 |  | 
| 365 | 
            -
                     | 
| 366 | 
            -
             | 
| 367 | 
            -
                        nftId, 
         | 
| 368 | 
            -
                        _stakeBalance[nftId], // unchanged stake balance
         | 
| 369 | 
            -
                        _rewardBalance[nftId] - claimedAmount); // new reward balance
         | 
| 790 | 
            +
                    claimedAmount = _claimRewards(stakeNftId, stakeInfo, targetInfo, maxClaimAmount);
         | 
| 791 | 
            +
                }
         | 
| 370 792 |  | 
| 371 | 
            -
             | 
| 372 | 
            -
                        targetNftId,
         | 
| 373 | 
            -
                        _stakeBalance[targetNftId],
         | 
| 374 | 
            -
                        _rewardBalance[targetNftId] - claimedAmount);
         | 
| 793 | 
            +
                //--- view functions -----------------------------------------------//
         | 
| 375 794 |  | 
| 376 | 
            -
             | 
| 795 | 
            +
                function getStakingReader() external view returns (StakingReader stakingReader){
         | 
| 796 | 
            +
                    return _reader;
         | 
| 377 797 | 
             
                }
         | 
| 378 798 |  | 
| 799 | 
            +
                function getTargetManager() external view returns (ITargetLimitHandler targetLimitHandler ){
         | 
| 800 | 
            +
                    return _targetLimitHandler;
         | 
| 801 | 
            +
                }
         | 
| 379 802 |  | 
| 380 | 
            -
             | 
| 381 | 
            -
             | 
| 382 | 
            -
                     | 
| 383 | 
            -
             | 
| 384 | 
            -
             | 
| 803 | 
            +
             | 
| 804 | 
            +
                function exists(NftId stakeNftId) external view returns (bool) { 
         | 
| 805 | 
            +
                    return _stakeInfo[stakeNftId].lastUpdateIn.gtz();
         | 
| 806 | 
            +
                }
         | 
| 807 | 
            +
             | 
| 808 | 
            +
             | 
| 809 | 
            +
                function getRequiredStakeBalance(
         | 
| 810 | 
            +
                    NftId targetNftId,
         | 
| 811 | 
            +
                    bool includeTargetTypeRequirements
         | 
| 385 812 | 
             
                )
         | 
| 386 | 
            -
                     | 
| 387 | 
            -
                     | 
| 388 | 
            -
                    returns (
         | 
| 389 | 
            -
                        Amount unstakedAmount,
         | 
| 390 | 
            -
                        Amount claimedAmount
         | 
| 391 | 
            -
                    )
         | 
| 813 | 
            +
                    public
         | 
| 814 | 
            +
                    view
         | 
| 815 | 
            +
                    returns (Amount requiredStakeAmount)
         | 
| 392 816 | 
             
                {
         | 
| 393 | 
            -
                     | 
| 817 | 
            +
                    address [] memory tokens = _targetToken[targetNftId];
         | 
| 818 | 
            +
                    if (tokens.length == 0) {
         | 
| 819 | 
            +
                        return AmountLib.zero();
         | 
| 820 | 
            +
                    }
         | 
| 394 821 |  | 
| 395 | 
            -
                    //  | 
| 396 | 
            -
                     | 
| 397 | 
            -
                     | 
| 822 | 
            +
                    // calculate tvl based required stake amount
         | 
| 823 | 
            +
                    requiredStakeAmount = AmountLib.zero();
         | 
| 824 | 
            +
                    ChainId targetChainId = _targetInfo[targetNftId].chainId;
         | 
| 825 | 
            +
                    address token;
         | 
| 826 | 
            +
                    Amount tvlAmount;
         | 
| 827 | 
            +
                    UFixed stakingRate;
         | 
| 398 828 |  | 
| 399 | 
            -
                     | 
| 400 | 
            -
             | 
| 401 | 
            -
                         | 
| 402 | 
            -
                         | 
| 403 | 
            -
                        _rewardBalance[nftId] - claimedAmount); // new reward balance
         | 
| 829 | 
            +
                    for (uint256 i = 0; i < tokens.length; i++) {
         | 
| 830 | 
            +
                        token = tokens[i];
         | 
| 831 | 
            +
                        tvlAmount = _tvlInfo[targetNftId][token].tvlAmount;
         | 
| 832 | 
            +
                        if (tvlAmount.eqz()) { continue; }
         | 
| 404 833 |  | 
| 405 | 
            -
             | 
| 406 | 
            -
                         | 
| 407 | 
            -
             | 
| 408 | 
            -
                         | 
| 834 | 
            +
                        stakingRate = _tokenInfo[targetChainId][token].stakingRate;
         | 
| 835 | 
            +
                        if (stakingRate.eqz()) { continue; }
         | 
| 836 | 
            +
             | 
| 837 | 
            +
                        requiredStakeAmount = requiredStakeAmount + tvlAmount.multiplyWith(stakingRate);
         | 
| 838 | 
            +
                    }
         | 
| 839 | 
            +
             | 
| 840 | 
            +
                    // update required amount based on target type
         | 
| 841 | 
            +
                    if (includeTargetTypeRequirements) {
         | 
| 842 | 
            +
                        ObjectType targetType = _targetInfo[targetNftId].objectType;
         | 
| 843 | 
            +
                        IStaking.SupportInfo storage supportInfo = _supportInfo[targetType];
         | 
| 409 844 |  | 
| 410 | 
            -
             | 
| 411 | 
            -
             | 
| 845 | 
            +
                        if (requiredStakeAmount < supportInfo.minStakingAmount) {
         | 
| 846 | 
            +
                            requiredStakeAmount = supportInfo.minStakingAmount;
         | 
| 847 | 
            +
                        } else if (requiredStakeAmount > supportInfo.maxStakingAmount) {
         | 
| 848 | 
            +
                            requiredStakeAmount = supportInfo.maxStakingAmount;
         | 
| 849 | 
            +
                        }
         | 
| 850 | 
            +
                    }
         | 
| 412 851 | 
             
                }
         | 
| 413 852 |  | 
| 414 | 
            -
                //--- view functions -----------------------------------------------//
         | 
| 415 853 |  | 
| 416 | 
            -
                 | 
| 417 | 
            -
             | 
| 854 | 
            +
                /// @dev Returns true iff current stake amount is still locked
         | 
| 855 | 
            +
                function isStakeLocked(NftId stakeNftId) public view returns (bool) { 
         | 
| 856 | 
            +
                    return _stakeInfo[stakeNftId].lockedUntil > TimestampLib.current(); 
         | 
| 418 857 | 
             
                }
         | 
| 419 858 |  | 
| 420 | 
            -
             | 
| 421 | 
            -
                 | 
| 422 | 
            -
             | 
| 859 | 
            +
             | 
| 860 | 
            +
                /// @dev Returns the stake infos for the specified stake.
         | 
| 861 | 
            +
                function getStakeInfo(NftId stakeNftId) external view returns (IStaking.StakeInfo memory stakeInfo) { 
         | 
| 862 | 
            +
                    return _stakeInfo[stakeNftId]; 
         | 
| 423 863 | 
             
                }
         | 
| 424 864 |  | 
| 425 | 
            -
                function getStakingRate(uint256 chainId, address token) external view returns (UFixed stakingRate) { return _stakingRate[chainId][token]; }
         | 
| 426 865 |  | 
| 427 | 
            -
                 | 
| 866 | 
            +
                /// @dev Returns the stake infos for the specified stake.
         | 
| 867 | 
            +
                function getStakeTarget(NftId stakeNftId) external view returns (NftId targetNftId) { 
         | 
| 868 | 
            +
                    return _stakeInfo[stakeNftId].targetNftId; 
         | 
| 869 | 
            +
                }
         | 
| 428 870 |  | 
| 429 | 
            -
                function getTotalValueLocked(NftId nftId, address token) external view returns (Amount tvlBalanceAmount) { return _tvlBalance[nftId][token]; }
         | 
| 430 | 
            -
                function getRequiredStakeBalance(NftId nftId) external view returns (Amount requiredAmount) { return _tvlRequiredDip[nftId]; }
         | 
| 431 871 |  | 
| 432 | 
            -
                 | 
| 433 | 
            -
                function  | 
| 434 | 
            -
             | 
| 435 | 
            -
                 | 
| 436 | 
            -
                function getBalanceUpdatedIn(NftId nftId) external view returns (Blocknumber blocknumber) { return _lastUpdatedIn[nftId]; }
         | 
| 872 | 
            +
                /// @dev Returns the target infos for the specified target.
         | 
| 873 | 
            +
                function getTargetInfo(NftId targetNftId) external view returns (IStaking.TargetInfo memory targetInfo) { 
         | 
| 874 | 
            +
                    return _targetInfo[targetNftId]; 
         | 
| 875 | 
            +
                }
         | 
| 437 876 |  | 
| 438 877 |  | 
| 439 | 
            -
                 | 
| 440 | 
            -
             | 
| 441 | 
            -
                     | 
| 442 | 
            -
                    returns (
         | 
| 443 | 
            -
                        Amount stakeBalance,
         | 
| 444 | 
            -
                        Amount rewardBalance,
         | 
| 445 | 
            -
                        Amount reserveBalance,
         | 
| 446 | 
            -
                        Blocknumber lastUpdatedIn
         | 
| 447 | 
            -
                    )
         | 
| 448 | 
            -
                {
         | 
| 449 | 
            -
                    stakeBalance = _stakeBalance[nftId];
         | 
| 450 | 
            -
                    rewardBalance = _rewardBalance[nftId];
         | 
| 451 | 
            -
                    reserveBalance = _reserveBalance[nftId];
         | 
| 452 | 
            -
                    lastUpdatedIn = _lastUpdatedIn[nftId];
         | 
| 878 | 
            +
                /// @dev Returns the target limit infos for the specified target.
         | 
| 879 | 
            +
                function getLimitInfo(NftId targetNftId) external view returns (IStaking.LimitInfo memory limitInfo) { 
         | 
| 880 | 
            +
                    return _limitInfo[targetNftId]; 
         | 
| 453 881 | 
             
                }
         | 
| 454 882 |  | 
| 455 883 |  | 
| 456 | 
            -
                 | 
| 457 | 
            -
             | 
| 458 | 
            -
                     | 
| 884 | 
            +
                /// @dev Returns the tvl infos for the specified target.
         | 
| 885 | 
            +
                function getTvlInfo(NftId targetNftId, address token) external view returns (IStaking.TvlInfo memory tvlInfo) {
         | 
| 886 | 
            +
                    return _tvlInfo[targetNftId][token];
         | 
| 887 | 
            +
                }
         | 
| 888 | 
            +
             | 
| 889 | 
            +
             | 
| 890 | 
            +
                /// @dev Returns the tvl infos for the specified target.
         | 
| 891 | 
            +
                function getTokenInfo(ChainId chainId, address token) external view returns (IStaking.TokenInfo memory tokenInfo) {
         | 
| 892 | 
            +
                    return _tokenInfo[chainId][token];
         | 
| 893 | 
            +
                }
         | 
| 894 | 
            +
             | 
| 895 | 
            +
                function hasTokenInfo(ChainId chainId, address token) external view returns (bool) {
         | 
| 896 | 
            +
                    return _tokenInfo[chainId][token].lastUpdateIn.gtz();
         | 
| 897 | 
            +
                }
         | 
| 898 | 
            +
             | 
| 899 | 
            +
             | 
| 900 | 
            +
                function getTargetSet() external view returns (NftIdSet targetNftIdSet) { 
         | 
| 901 | 
            +
                    return _targetNftIdSet;
         | 
| 902 | 
            +
                }
         | 
| 903 | 
            +
             | 
| 904 | 
            +
                //--- internal functions -----------------------------------------------//
         | 
| 905 | 
            +
             | 
| 906 | 
            +
                function _verifyAndUpdateTarget(NftId targetNftId)
         | 
| 907 | 
            +
                    private
         | 
| 459 908 | 
             
                    returns (
         | 
| 460 | 
            -
                         | 
| 461 | 
            -
                         | 
| 462 | 
            -
                        Timestamp lastUpdatedAt
         | 
| 909 | 
            +
                        IStaking.TargetInfo storage targetInfo,
         | 
| 910 | 
            +
                        Blocknumber lastUpdatedIn
         | 
| 463 911 | 
             
                    )
         | 
| 464 912 | 
             
                {
         | 
| 465 | 
            -
                     | 
| 466 | 
            -
                     | 
| 467 | 
            -
                     | 
| 913 | 
            +
                    // checks
         | 
| 914 | 
            +
                    targetInfo = _getAndVerifyTarget(targetNftId);
         | 
| 915 | 
            +
                    lastUpdatedIn = targetInfo.lastUpdateIn;
         | 
| 916 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 468 917 | 
             
                }
         | 
| 469 918 |  | 
| 470 | 
            -
                //--- private functions -------------------------------------------//
         | 
| 471 919 |  | 
| 472 920 | 
             
                function _createTarget(
         | 
| 473 921 | 
             
                    NftId targetNftId,
         | 
| 474 | 
            -
                     | 
| 922 | 
            +
                    ObjectType objectType,
         | 
| 923 | 
            +
                    Seconds lockingPeriod,
         | 
| 924 | 
            +
                    UFixed rewardRate,
         | 
| 925 | 
            +
                    bool checkParameters
         | 
| 475 926 | 
             
                )
         | 
| 476 927 | 
             
                    private
         | 
| 477 928 | 
             
                {
         | 
| 478 | 
            -
                     | 
| 479 | 
            -
             | 
| 480 | 
            -
                         | 
| 481 | 
            -
             | 
| 482 | 
            -
             | 
| 483 | 
            -
             | 
| 484 | 
            -
             | 
| 929 | 
            +
                    // checks
         | 
| 930 | 
            +
                    if (checkParameters) {
         | 
| 931 | 
            +
                        TargetManagerLib.checkTargetParameters(
         | 
| 932 | 
            +
                            _registry, 
         | 
| 933 | 
            +
                            _reader, 
         | 
| 934 | 
            +
                            targetNftId, 
         | 
| 935 | 
            +
                            objectType, 
         | 
| 936 | 
            +
                            lockingPeriod, 
         | 
| 937 | 
            +
                            rewardRate);
         | 
| 938 | 
            +
                    }
         | 
| 485 939 |  | 
| 940 | 
            +
                    // effects
         | 
| 941 | 
            +
             | 
| 942 | 
            +
                    // target info
         | 
| 943 | 
            +
                    IStaking.TargetInfo storage targetInfo = _targetInfo[targetNftId];
         | 
| 944 | 
            +
                    targetInfo.stakedAmount = AmountLib.zero();
         | 
| 945 | 
            +
                    targetInfo.rewardAmount = AmountLib.zero();
         | 
| 946 | 
            +
                    targetInfo.reserveAmount = AmountLib.zero();
         | 
| 947 | 
            +
                    targetInfo.limitAmount = AmountLib.max();
         | 
| 948 | 
            +
             | 
| 949 | 
            +
                    targetInfo.objectType = objectType;
         | 
| 950 | 
            +
                    targetInfo.lockingPeriod = lockingPeriod;
         | 
| 951 | 
            +
                    targetInfo.rewardRate = rewardRate;
         | 
| 952 | 
            +
                    targetInfo.chainId = ChainIdLib.fromNftId(targetNftId);
         | 
| 953 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 954 | 
            +
             | 
| 955 | 
            +
                    // create limit info
         | 
| 956 | 
            +
                    _setLimits(
         | 
| 957 | 
            +
                        _limitInfo[targetNftId],
         | 
| 958 | 
            +
                        targetNftId, 
         | 
| 959 | 
            +
                        AmountLib.toAmount(AmountLib.max().toInt() / 2), // margin limit
         | 
| 960 | 
            +
                        AmountLib.max()); // hard limit
         | 
| 961 | 
            +
             | 
| 962 | 
            +
                    // add new target to target set
         | 
| 486 963 | 
             
                    _targetNftIdSet.add(targetNftId);
         | 
| 964 | 
            +
             | 
| 965 | 
            +
                    // logging
         | 
| 966 | 
            +
                    emit IStaking.LogStakingTargetCreated(targetNftId, objectType, lockingPeriod, rewardRate);
         | 
| 487 967 | 
             
                }
         | 
| 488 968 |  | 
| 489 | 
            -
             | 
| 490 | 
            -
             | 
| 491 | 
            -
                     | 
| 969 | 
            +
             | 
| 970 | 
            +
                function _setLimits(
         | 
| 971 | 
            +
                    IStaking.LimitInfo storage limitInfo,
         | 
| 972 | 
            +
                    NftId targetNftId,
         | 
| 973 | 
            +
                    Amount marginAmount,
         | 
| 974 | 
            +
                    Amount hardLimitAmount
         | 
| 492 975 | 
             
                )
         | 
| 493 976 | 
             
                    private
         | 
| 494 | 
            -
                    returns (Blocknumber lastUpdatedIn)
         | 
| 495 977 | 
             
                {
         | 
| 496 | 
            -
                     | 
| 497 | 
            -
             | 
| 498 | 
            -
                     | 
| 978 | 
            +
                    // effects
         | 
| 979 | 
            +
                    Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
         | 
| 980 | 
            +
                    limitInfo.marginAmount = marginAmount;
         | 
| 981 | 
            +
                    limitInfo.hardLimitAmount = hardLimitAmount;
         | 
| 982 | 
            +
                    limitInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 983 | 
            +
             | 
| 984 | 
            +
                    // logging
         | 
| 985 | 
            +
                    emit IStaking.LogStakingLimitsSet(targetNftId, limitInfo.marginAmount , limitInfo.hardLimitAmount, lastUpdateIn);
         | 
| 986 | 
            +
                }
         | 
| 987 | 
            +
             | 
| 499 988 |  | 
| 500 | 
            -
             | 
| 989 | 
            +
                function _spendRewardReserves(
         | 
| 990 | 
            +
                    NftId targetNftId, 
         | 
| 991 | 
            +
                    IStaking.TargetInfo storage targetInfo,
         | 
| 992 | 
            +
                    Amount dipAmount
         | 
| 993 | 
            +
                )
         | 
| 994 | 
            +
                    private
         | 
| 995 | 
            +
                {
         | 
| 996 | 
            +
                    Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
         | 
| 501 997 |  | 
| 502 | 
            -
                     | 
| 503 | 
            -
                     | 
| 998 | 
            +
                    // logging
         | 
| 999 | 
            +
                    emit IStaking.LogStakingRewardReservesSpent(
         | 
| 1000 | 
            +
                        targetNftId,
         | 
| 1001 | 
            +
                        dipAmount,
         | 
| 1002 | 
            +
                        targetInfo.reserveAmount,
         | 
| 1003 | 
            +
                        lastUpdateIn);
         | 
| 504 1004 | 
             
                }
         | 
| 505 1005 |  | 
| 506 1006 |  | 
| 507 | 
            -
                function  | 
| 1007 | 
            +
                function _decreaseReserves(
         | 
| 1008 | 
            +
                    NftId targetNftId,
         | 
| 1009 | 
            +
                    IStaking.TargetInfo storage targetInfo, 
         | 
| 1010 | 
            +
                    Amount dipAmount
         | 
| 1011 | 
            +
                )
         | 
| 508 1012 | 
             
                    private
         | 
| 1013 | 
            +
                    returns ( Blocknumber lastUpdateIn)
         | 
| 509 1014 | 
             
                {
         | 
| 510 | 
            -
                     | 
| 511 | 
            -
             | 
| 1015 | 
            +
                    lastUpdateIn = targetInfo.lastUpdateIn;
         | 
| 1016 | 
            +
             | 
| 1017 | 
            +
                    // check if reserves are sufficient
         | 
| 1018 | 
            +
                    if (dipAmount > targetInfo.reserveAmount) {
         | 
| 1019 | 
            +
                        revert ErrorStakingStoreRewardReservesInsufficient(
         | 
| 1020 | 
            +
                            targetNftId,
         | 
| 1021 | 
            +
                            targetInfo.reserveAmount,
         | 
| 1022 | 
            +
                            dipAmount);
         | 
| 512 1023 | 
             
                    }
         | 
| 513 1024 |  | 
| 514 | 
            -
                    //  | 
| 515 | 
            -
                     | 
| 516 | 
            -
                     | 
| 517 | 
            -
             | 
| 1025 | 
            +
                    // effects
         | 
| 1026 | 
            +
                    targetInfo.reserveAmount = targetInfo.reserveAmount - dipAmount;
         | 
| 1027 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 1028 | 
            +
                }
         | 
| 518 1029 |  | 
| 519 | 
            -
             | 
| 520 | 
            -
             | 
| 521 | 
            -
                     | 
| 1030 | 
            +
             | 
| 1031 | 
            +
                function _updateRewards(
         | 
| 1032 | 
            +
                    NftId stakeNftId,
         | 
| 1033 | 
            +
                    IStaking.StakeInfo storage stakeInfo,
         | 
| 1034 | 
            +
                    IStaking.TargetInfo storage targetInfo
         | 
| 1035 | 
            +
                )
         | 
| 1036 | 
            +
                    internal
         | 
| 1037 | 
            +
                    returns (Amount rewardIncreaseAmount)
         | 
| 1038 | 
            +
                {
         | 
| 1039 | 
            +
                    // return if reward rate is zero
         | 
| 1040 | 
            +
                    if (targetInfo.rewardRate.eqz()) {
         | 
| 1041 | 
            +
                        return rewardIncreaseAmount;
         | 
| 1042 | 
            +
                    }
         | 
| 1043 | 
            +
             | 
| 1044 | 
            +
                    // get seconds since last update on stake
         | 
| 1045 | 
            +
                    Seconds duration = SecondsLib.toSeconds(
         | 
| 1046 | 
            +
                        block.timestamp - stakeInfo.lastUpdateAt.toInt());
         | 
| 1047 | 
            +
             | 
| 1048 | 
            +
                    // return if duration is zero
         | 
| 1049 | 
            +
                    if (duration.eqz()) {
         | 
| 1050 | 
            +
                        return AmountLib.zero();
         | 
| 1051 | 
            +
                    }
         | 
| 1052 | 
            +
                    
         | 
| 1053 | 
            +
                    // calculate reward increase since
         | 
| 1054 | 
            +
                    rewardIncreaseAmount = StakingLib.calculateRewardAmount(
         | 
| 1055 | 
            +
                        targetInfo.rewardRate,
         | 
| 1056 | 
            +
                        duration,
         | 
| 1057 | 
            +
                        stakeInfo.stakedAmount);
         | 
| 1058 | 
            +
             | 
| 1059 | 
            +
                    // update target + stake
         | 
| 1060 | 
            +
                    targetInfo.rewardAmount = targetInfo.rewardAmount + rewardIncreaseAmount;
         | 
| 1061 | 
            +
                    stakeInfo.rewardAmount = stakeInfo.rewardAmount + rewardIncreaseAmount;
         | 
| 1062 | 
            +
                    Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
         | 
| 1063 | 
            +
             | 
| 1064 | 
            +
                    // logging
         | 
| 1065 | 
            +
                    emit IStaking.LogStakingStakeRewardsUpdated(
         | 
| 1066 | 
            +
                        stakeNftId, 
         | 
| 1067 | 
            +
                        rewardIncreaseAmount, 
         | 
| 1068 | 
            +
                        stakeInfo.stakedAmount, 
         | 
| 1069 | 
            +
                        stakeInfo.rewardAmount, 
         | 
| 1070 | 
            +
                        stakeInfo.lockedUntil,
         | 
| 1071 | 
            +
                        lastUpdateIn);
         | 
| 522 1072 | 
             
                }
         | 
| 523 1073 |  | 
| 524 1074 |  | 
| 525 | 
            -
                function  | 
| 526 | 
            -
                     | 
| 1075 | 
            +
                function _restakeRewards(
         | 
| 1076 | 
            +
                    NftId stakeNftId,
         | 
| 1077 | 
            +
                    IStaking.StakeInfo storage stakeInfo,
         | 
| 1078 | 
            +
                    IStaking.TargetInfo storage targetInfo
         | 
| 1079 | 
            +
                )
         | 
| 1080 | 
            +
                    internal
         | 
| 1081 | 
            +
                    returns (Amount restakeAmount)
         | 
| 527 1082 | 
             
                {
         | 
| 528 | 
            -
                     | 
| 529 | 
            -
             | 
| 1083 | 
            +
                    restakeAmount = stakeInfo.rewardAmount;
         | 
| 1084 | 
            +
             | 
| 1085 | 
            +
                    // return if reward amount is zero
         | 
| 1086 | 
            +
                    if (restakeAmount.eqz()) {
         | 
| 1087 | 
            +
                        return restakeAmount;
         | 
| 530 1088 | 
             
                    }
         | 
| 531 1089 |  | 
| 532 | 
            -
                    //  | 
| 533 | 
            -
                     | 
| 534 | 
            -
             | 
| 1090 | 
            +
                    // check restaking amount does not exceed target max staked amount
         | 
| 1091 | 
            +
                    _checkMaxStakedAmount(stakeInfo.targetNftId, targetInfo, restakeAmount);
         | 
| 1092 | 
            +
             | 
| 1093 | 
            +
                    // use up reserves for newly staked dips
         | 
| 1094 | 
            +
                    _spendRewardReserves(stakeInfo.targetNftId, targetInfo, restakeAmount);
         | 
| 1095 | 
            +
             | 
| 1096 | 
            +
                    // update target + stake
         | 
| 1097 | 
            +
                    targetInfo.stakedAmount = targetInfo.stakedAmount + restakeAmount;
         | 
| 1098 | 
            +
                    targetInfo.rewardAmount = targetInfo.rewardAmount - restakeAmount;
         | 
| 1099 | 
            +
                    stakeInfo.stakedAmount = stakeInfo.stakedAmount + restakeAmount;
         | 
| 1100 | 
            +
                    stakeInfo.rewardAmount = AmountLib.zero();
         | 
| 1101 | 
            +
                    Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
         | 
| 1102 | 
            +
             | 
| 1103 | 
            +
                    // logging
         | 
| 1104 | 
            +
                    emit IStaking.LogStakingRewardsRestaked(
         | 
| 1105 | 
            +
                        stakeNftId,
         | 
| 1106 | 
            +
                        restakeAmount, 
         | 
| 1107 | 
            +
                        stakeInfo.stakedAmount, 
         | 
| 1108 | 
            +
                        AmountLib.zero(), 
         | 
| 1109 | 
            +
                        stakeInfo.lockedUntil,
         | 
| 1110 | 
            +
                        lastUpdateIn);
         | 
| 1111 | 
            +
                }
         | 
| 1112 | 
            +
             | 
| 535 1113 |  | 
| 536 | 
            -
             | 
| 537 | 
            -
                     | 
| 538 | 
            -
                     | 
| 1114 | 
            +
                function _stake(
         | 
| 1115 | 
            +
                    NftId stakeNftId,
         | 
| 1116 | 
            +
                    IStaking.StakeInfo storage stakeInfo,
         | 
| 1117 | 
            +
                    IStaking.TargetInfo storage targetInfo,
         | 
| 1118 | 
            +
                    Seconds maxAdditionalLockingPeriod,
         | 
| 1119 | 
            +
                    Amount stakeAmount
         | 
| 1120 | 
            +
                )
         | 
| 1121 | 
            +
                    internal
         | 
| 1122 | 
            +
                {
         | 
| 1123 | 
            +
                    // return if reward amount is zero
         | 
| 1124 | 
            +
                    if (stakeAmount.eqz()) {
         | 
| 1125 | 
            +
                        return;
         | 
| 1126 | 
            +
                    }
         | 
| 1127 | 
            +
             | 
| 1128 | 
            +
                    // check restaking amount does not exceed target max staked amount
         | 
| 1129 | 
            +
                    _checkMaxStakedAmount(stakeInfo.targetNftId, targetInfo, stakeAmount);
         | 
| 1130 | 
            +
             | 
| 1131 | 
            +
                    // update target + stake
         | 
| 1132 | 
            +
                    targetInfo.stakedAmount = targetInfo.stakedAmount + stakeAmount;
         | 
| 1133 | 
            +
                    stakeInfo.stakedAmount = stakeInfo.stakedAmount + stakeAmount;
         | 
| 1134 | 
            +
             | 
| 1135 | 
            +
                    // increase locked until if applicable
         | 
| 1136 | 
            +
                    Seconds additionalLockingPeriod = SecondsLib.min(maxAdditionalLockingPeriod, targetInfo.lockingPeriod);
         | 
| 1137 | 
            +
                    if (stakeAmount.gtz() && additionalLockingPeriod.gtz()) {
         | 
| 1138 | 
            +
                        stakeInfo.lockedUntil = stakeInfo.lockedUntil.addSeconds(additionalLockingPeriod);
         | 
| 1139 | 
            +
                    }
         | 
| 1140 | 
            +
             | 
| 1141 | 
            +
                    Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
         | 
| 1142 | 
            +
             | 
| 1143 | 
            +
                    // logging
         | 
| 1144 | 
            +
                    emit IStaking.LogStakingStaked(
         | 
| 1145 | 
            +
                        stakeNftId,
         | 
| 1146 | 
            +
                        stakeAmount, 
         | 
| 1147 | 
            +
                        stakeInfo.stakedAmount, 
         | 
| 1148 | 
            +
                        stakeInfo.rewardAmount, 
         | 
| 1149 | 
            +
                        stakeInfo.lockedUntil,
         | 
| 1150 | 
            +
                        lastUpdateIn);
         | 
| 539 1151 | 
             
                }
         | 
| 540 1152 |  | 
| 541 1153 |  | 
| 542 | 
            -
                function  | 
| 1154 | 
            +
                function _claimRewards(
         | 
| 543 1155 | 
             
                    NftId stakeNftId,
         | 
| 544 | 
            -
                     | 
| 545 | 
            -
                     | 
| 1156 | 
            +
                    IStaking.StakeInfo storage stakeInfo,
         | 
| 1157 | 
            +
                    IStaking.TargetInfo storage targetInfo,
         | 
| 1158 | 
            +
                    Amount maxClaimAmount
         | 
| 546 1159 | 
             
                )
         | 
| 547 | 
            -
                     | 
| 1160 | 
            +
                    internal
         | 
| 1161 | 
            +
                    returns (Amount claimAmount)
         | 
| 1162 | 
            +
                {
         | 
| 1163 | 
            +
                    claimAmount = AmountLib.min(maxClaimAmount, stakeInfo.rewardAmount);
         | 
| 1164 | 
            +
             | 
| 1165 | 
            +
                    // return if no rewards to claim
         | 
| 1166 | 
            +
                    if (claimAmount.eqz()) {
         | 
| 1167 | 
            +
                        return claimAmount;
         | 
| 1168 | 
            +
                    }
         | 
| 1169 | 
            +
             | 
| 1170 | 
            +
                    // effects
         | 
| 1171 | 
            +
                    // use up reserves for claimed rewards
         | 
| 1172 | 
            +
                    _spendRewardReserves(stakeInfo.targetNftId, targetInfo, claimAmount);
         | 
| 1173 | 
            +
             | 
| 1174 | 
            +
                    // update target + stake
         | 
| 1175 | 
            +
                    targetInfo.rewardAmount = targetInfo.rewardAmount - claimAmount;
         | 
| 1176 | 
            +
                    stakeInfo.rewardAmount = stakeInfo.rewardAmount - claimAmount;
         | 
| 1177 | 
            +
                    Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
         | 
| 1178 | 
            +
             | 
| 1179 | 
            +
                    // logging
         | 
| 1180 | 
            +
                    emit IStaking.LogStakingRewardsClaimed(
         | 
| 1181 | 
            +
                        stakeNftId,
         | 
| 1182 | 
            +
                        claimAmount, 
         | 
| 1183 | 
            +
                        stakeInfo.stakedAmount, 
         | 
| 1184 | 
            +
                        stakeInfo.rewardAmount, 
         | 
| 1185 | 
            +
                        stakeInfo.lockedUntil,
         | 
| 1186 | 
            +
                        lastUpdateIn);
         | 
| 1187 | 
            +
                }
         | 
| 1188 | 
            +
             | 
| 1189 | 
            +
             | 
| 1190 | 
            +
                function _unstake(
         | 
| 1191 | 
            +
                    NftId stakeNftId,
         | 
| 1192 | 
            +
                    IStaking.StakeInfo storage stakeInfo,
         | 
| 1193 | 
            +
                    IStaking.TargetInfo storage targetInfo,
         | 
| 1194 | 
            +
                    Amount maxUnstakeAmount
         | 
| 1195 | 
            +
                )
         | 
| 1196 | 
            +
                    internal
         | 
| 1197 | 
            +
                    returns (Amount unstakedAmount)
         | 
| 548 1198 | 
             
                {
         | 
| 549 | 
            -
                     | 
| 550 | 
            -
             | 
| 1199 | 
            +
                    unstakedAmount = AmountLib.min(maxUnstakeAmount, stakeInfo.stakedAmount);
         | 
| 1200 | 
            +
             | 
| 1201 | 
            +
                    // return if no stakes to claim
         | 
| 1202 | 
            +
                    if (unstakedAmount.eqz()) {
         | 
| 1203 | 
            +
                        return unstakedAmount;
         | 
| 1204 | 
            +
                    }
         | 
| 551 1205 |  | 
| 552 | 
            -
                     | 
| 553 | 
            -
                     | 
| 1206 | 
            +
                    // check if stake is still locked
         | 
| 1207 | 
            +
                    if (isStakeLocked(stakeNftId)) {
         | 
| 1208 | 
            +
                        revert IStaking.ErrorStakingStakeLocked(stakeNftId, stakeInfo.lockedUntil);
         | 
| 1209 | 
            +
                    }
         | 
| 1210 | 
            +
             | 
| 1211 | 
            +
                    // update target + stake
         | 
| 1212 | 
            +
                    targetInfo.stakedAmount = targetInfo.stakedAmount - unstakedAmount;
         | 
| 1213 | 
            +
                    stakeInfo.stakedAmount = stakeInfo.stakedAmount - unstakedAmount;
         | 
| 1214 | 
            +
                    Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
         | 
| 1215 | 
            +
             | 
| 1216 | 
            +
                    // logging
         | 
| 1217 | 
            +
                    emit IStaking.LogStakingUnstaked(
         | 
| 1218 | 
            +
                        stakeNftId,
         | 
| 1219 | 
            +
                        unstakedAmount, 
         | 
| 1220 | 
            +
                        stakeInfo.stakedAmount, 
         | 
| 1221 | 
            +
                        stakeInfo.rewardAmount, 
         | 
| 1222 | 
            +
                        stakeInfo.lockedUntil,
         | 
| 1223 | 
            +
                        lastUpdateIn);
         | 
| 554 1224 | 
             
                }
         | 
| 555 1225 |  | 
| 556 1226 |  | 
| 557 | 
            -
                function  | 
| 558 | 
            -
                     | 
| 559 | 
            -
                     | 
| 560 | 
            -
             | 
| 1227 | 
            +
                function _setLastUpdatesToCurrent(
         | 
| 1228 | 
            +
                    IStaking.StakeInfo storage stakeInfo,
         | 
| 1229 | 
            +
                    IStaking.TargetInfo storage targetInfo
         | 
| 1230 | 
            +
                )
         | 
| 1231 | 
            +
                    internal
         | 
| 1232 | 
            +
                    returns (Blocknumber lastUpdateIn)
         | 
| 1233 | 
            +
                {
         | 
| 1234 | 
            +
                    targetInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 1235 | 
            +
                    lastUpdateIn = _setStakeLastUpdatesToCurrent(stakeInfo);
         | 
| 1236 | 
            +
                }
         | 
| 1237 | 
            +
             | 
| 1238 | 
            +
             | 
| 1239 | 
            +
                function _setStakeLastUpdatesToCurrent(
         | 
| 1240 | 
            +
                    IStaking.StakeInfo storage stakeInfo
         | 
| 1241 | 
            +
                )
         | 
| 1242 | 
            +
                    internal
         | 
| 1243 | 
            +
                    returns (Blocknumber lastUpdateIn)
         | 
| 1244 | 
            +
                {
         | 
| 1245 | 
            +
                    lastUpdateIn = stakeInfo.lastUpdateIn;
         | 
| 1246 | 
            +
                    stakeInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 1247 | 
            +
                    stakeInfo.lastUpdateAt = TimestampLib.current();
         | 
| 1248 | 
            +
                }
         | 
| 1249 | 
            +
             | 
| 1250 | 
            +
                //--- private stake and target functions --------------------------------//
         | 
| 1251 | 
            +
             | 
| 1252 | 
            +
             | 
| 1253 | 
            +
                function _getAndVerifyStake(
         | 
| 1254 | 
            +
                    NftId stakeNftId
         | 
| 561 1255 | 
             
                )
         | 
| 562 1256 | 
             
                    private
         | 
| 1257 | 
            +
                    view
         | 
| 1258 | 
            +
                    returns (
         | 
| 1259 | 
            +
                        IStaking.StakeInfo storage stakeInfo
         | 
| 1260 | 
            +
                    )
         | 
| 563 1261 | 
             
                {
         | 
| 564 | 
            -
                     | 
| 565 | 
            -
                     | 
| 1262 | 
            +
                    stakeInfo = _stakeInfo[stakeNftId];
         | 
| 1263 | 
            +
                    if (stakeInfo.lastUpdateIn.eqz()) {
         | 
| 1264 | 
            +
                        revert ErrorStakingStoreStakeNotInitialized(stakeNftId);
         | 
| 1265 | 
            +
                    }
         | 
| 1266 | 
            +
                }
         | 
| 1267 | 
            +
             | 
| 566 1268 |  | 
| 567 | 
            -
             | 
| 568 | 
            -
                     | 
| 1269 | 
            +
                function _checkMaxStakedAmount(
         | 
| 1270 | 
            +
                    NftId targetNftId, 
         | 
| 1271 | 
            +
                    IStaking.TargetInfo storage targetInfo, 
         | 
| 1272 | 
            +
                    Amount additionalstakedAmount
         | 
| 1273 | 
            +
                )
         | 
| 1274 | 
            +
                    private
         | 
| 1275 | 
            +
                {
         | 
| 1276 | 
            +
                    if (targetInfo.stakedAmount + additionalstakedAmount > targetInfo.limitAmount) {
         | 
| 1277 | 
            +
                        revert IStaking.ErrorStakingTargetMaxStakedAmountExceeded(
         | 
| 1278 | 
            +
                            targetNftId,
         | 
| 1279 | 
            +
                            targetInfo.limitAmount,
         | 
| 1280 | 
            +
                            targetInfo.stakedAmount + additionalstakedAmount);
         | 
| 1281 | 
            +
                    }
         | 
| 1282 | 
            +
             | 
| 1283 | 
            +
                    // TODO add check for tvl dependent maximum, see #628
         | 
| 569 1284 | 
             
                }
         | 
| 570 1285 |  | 
| 571 | 
            -
             | 
| 1286 | 
            +
             | 
| 1287 | 
            +
                function _getAndVerifyTarget(
         | 
| 1288 | 
            +
                    NftId targetNftId
         | 
| 1289 | 
            +
                )
         | 
| 572 1290 | 
             
                    private
         | 
| 573 1291 | 
             
                    view
         | 
| 574 | 
            -
                    returns ( | 
| 1292 | 
            +
                    returns (
         | 
| 1293 | 
            +
                        IStaking.TargetInfo storage targetInfo
         | 
| 1294 | 
            +
                    )
         | 
| 575 1295 | 
             
                {
         | 
| 576 | 
            -
                     | 
| 1296 | 
            +
                    targetInfo = _targetInfo[targetNftId];
         | 
| 577 1297 |  | 
| 578 | 
            -
                    if ( | 
| 579 | 
            -
                        revert  | 
| 1298 | 
            +
                    if (targetInfo.lastUpdateIn.eqz()) {
         | 
| 1299 | 
            +
                        revert ErrorStakingStoreTargetNotInitialized(targetNftId);
         | 
| 580 1300 | 
             
                    }
         | 
| 581 1301 | 
             
                }
         | 
| 582 1302 |  | 
| 583 1303 |  | 
| 584 | 
            -
                function  | 
| 585 | 
            -
                    NftId targetNftId | 
| 586 | 
            -
                    address token
         | 
| 1304 | 
            +
                function _getAndVerifyLimit(
         | 
| 1305 | 
            +
                    NftId targetNftId
         | 
| 587 1306 | 
             
                )
         | 
| 588 1307 | 
             
                    private
         | 
| 589 1308 | 
             
                    view
         | 
| 590 1309 | 
             
                    returns (
         | 
| 591 | 
            -
                         | 
| 592 | 
            -
                        Amount oldBalance,
         | 
| 593 | 
            -
                        Amount oldDipBalance
         | 
| 1310 | 
            +
                        IStaking.LimitInfo storage limitInfo
         | 
| 594 1311 | 
             
                    )
         | 
| 595 1312 | 
             
                {
         | 
| 596 | 
            -
                     | 
| 1313 | 
            +
                    limitInfo = _limitInfo[targetNftId];
         | 
| 597 1314 |  | 
| 598 | 
            -
                    if ( | 
| 599 | 
            -
                        revert  | 
| 1315 | 
            +
                    if (limitInfo.lastUpdateIn.eqz()) {
         | 
| 1316 | 
            +
                        revert ErrorStakingStoreLimitNotInitialized(targetNftId);
         | 
| 600 1317 | 
             
                    }
         | 
| 1318 | 
            +
                }
         | 
| 1319 | 
            +
             | 
| 1320 | 
            +
                //--- private tvl functions ------------------------------------------------//
         | 
| 601 1321 |  | 
| 602 | 
            -
             | 
| 603 | 
            -
             | 
| 1322 | 
            +
                /// @dev Initializes token balance handling for the specified target.
         | 
| 1323 | 
            +
                function _createTvlBalance(NftId targetNftId, address token)
         | 
| 1324 | 
            +
                    private
         | 
| 1325 | 
            +
                {
         | 
| 1326 | 
            +
                    IStaking.TvlInfo storage info = _tvlInfo[targetNftId][token];
         | 
| 1327 | 
            +
             | 
| 1328 | 
            +
                    if (info.lastUpdateIn.gtz()) {
         | 
| 1329 | 
            +
                        revert ErrorStakingStoreTvlBalanceAlreadyInitialized(targetNftId, token);
         | 
| 1330 | 
            +
                    }
         | 
| 1331 | 
            +
             | 
| 1332 | 
            +
                    // set tvl balances to 0 and update last updated in
         | 
| 1333 | 
            +
                    info.tvlAmount = AmountLib.zero();
         | 
| 1334 | 
            +
                    info.lastUpdateIn = BlocknumberLib.current();
         | 
| 1335 | 
            +
                }
         | 
| 1336 | 
            +
             | 
| 1337 | 
            +
             | 
| 1338 | 
            +
                function _updateTvlBalance(
         | 
| 1339 | 
            +
                    NftId targetNftId,
         | 
| 1340 | 
            +
                    address token,
         | 
| 1341 | 
            +
                    Amount newTvlAmount
         | 
| 1342 | 
            +
                )
         | 
| 1343 | 
            +
                    private
         | 
| 1344 | 
            +
                    returns (
         | 
| 1345 | 
            +
                        Amount oldTvlAmount,
         | 
| 1346 | 
            +
                        Blocknumber lastUpdatedIn
         | 
| 1347 | 
            +
                    )
         | 
| 1348 | 
            +
                {
         | 
| 1349 | 
            +
                    IStaking.TvlInfo storage tvlInfo = _getAndVerifyTvl(targetNftId, token);
         | 
| 1350 | 
            +
                    oldTvlAmount = tvlInfo.tvlAmount;
         | 
| 1351 | 
            +
                    lastUpdatedIn = tvlInfo.lastUpdateIn;
         | 
| 1352 | 
            +
             | 
| 1353 | 
            +
                    tvlInfo.tvlAmount = newTvlAmount;
         | 
| 1354 | 
            +
                    tvlInfo.lastUpdateIn = BlocknumberLib.current();
         | 
| 1355 | 
            +
                }
         | 
| 1356 | 
            +
             | 
| 1357 | 
            +
             | 
| 1358 | 
            +
                function _getAndVerifyTvl(NftId targetNftId, address token)
         | 
| 1359 | 
            +
                    private
         | 
| 1360 | 
            +
                    view
         | 
| 1361 | 
            +
                    returns (IStaking.TvlInfo storage tvlInfo)
         | 
| 1362 | 
            +
                {
         | 
| 1363 | 
            +
                    tvlInfo = _tvlInfo[targetNftId][token];
         | 
| 1364 | 
            +
                    if (tvlInfo.lastUpdateIn.eqz()) {
         | 
| 1365 | 
            +
                        revert ErrorStakingStoreTvlBalanceNotInitialized(targetNftId, token);
         | 
| 1366 | 
            +
                    }
         | 
| 604 1367 | 
             
                }
         | 
| 605 1368 | 
             
            }
         |