@etherisc/gif-next 0.0.2-f1f3b2c-994 → 0.0.2-f2273b3-211
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 +27 -6
- package/artifacts/contracts/accounting/AccountingService.sol/AccountingService.dbg.json +4 -0
- package/artifacts/contracts/accounting/AccountingService.sol/AccountingService.json +1007 -0
- package/artifacts/contracts/accounting/AccountingServiceManager.sol/AccountingServiceManager.dbg.json +4 -0
- package/artifacts/contracts/accounting/AccountingServiceManager.sol/AccountingServiceManager.json +744 -0
- package/artifacts/contracts/accounting/IAccountingService.sol/IAccountingService.dbg.json +4 -0
- package/artifacts/contracts/accounting/IAccountingService.sol/IAccountingService.json +791 -0
- package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.dbg.json +1 -1
- package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.json +163 -55
- package/artifacts/contracts/authorization/AccessAdmin.sol/IAccessManagedChecker.dbg.json +4 -0
- package/artifacts/contracts/authorization/AccessAdmin.sol/IAccessManagedChecker.json +24 -0
- package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.dbg.json +1 -1
- package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.json +233 -5
- package/artifacts/contracts/authorization/Authorization.sol/Authorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/Authorization.sol/Authorization.json +200 -16
- 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 +94 -14
- package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.json +107 -15
- package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.json +2 -2
- package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +1 -1
- package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.json +8 -8
- package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.dbg.json +1 -1
- package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.json +175 -216
- package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.dbg.json +1 -1
- package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.json +206 -27
- package/artifacts/contracts/distribution/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/distribution/Distribution.sol/Distribution.json +113 -130
- package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.dbg.json +1 -1
- package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.json +275 -171
- package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
- package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +111 -65
- package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.json +100 -112
- package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.json +148 -72
- package/artifacts/contracts/examples/fire/DamageLevel.sol/DamageLevelLib.dbg.json +1 -1
- package/artifacts/contracts/examples/fire/FirePool.sol/FirePool.dbg.json +1 -1
- package/artifacts/contracts/examples/fire/FirePool.sol/FirePool.json +158 -195
- package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.dbg.json +1 -1
- package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.json +206 -27
- package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.dbg.json +1 -1
- package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.json +336 -295
- package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.dbg.json +1 -1
- package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.json +203 -28
- package/artifacts/contracts/examples/fire/FireUSD.sol/FireUSD.dbg.json +1 -1
- package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.dbg.json +1 -1
- package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.json +215 -168
- package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.json +589 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.dbg.json +1 -1
- package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.json +156 -153
- package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.dbg.json +1 -1
- package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.json +282 -193
- package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.json +589 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.dbg.json +1 -1
- package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.json +717 -292
- package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.dbg.json +4 -0
- package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.json +589 -0
- 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/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +158 -57
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +105 -103
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +211 -82
- package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +386 -117
- package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +150 -90
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +590 -204
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +129 -157
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +75 -45
- package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +445 -375
- package/artifacts/contracts/instance/RiskSet.sol/RiskSet.dbg.json +4 -0
- package/artifacts/contracts/instance/RiskSet.sol/RiskSet.json +853 -0
- package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.json +2 -2
- package/artifacts/contracts/instance/base/Cloneable.sol/Cloneable.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.json +2 -2
- package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.json +3 -3
- 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/oracle/BasicOracle.sol/BasicOracle.dbg.json +1 -1
- package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.json +132 -173
- package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.dbg.json +1 -1
- package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.json +180 -29
- 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 +94 -106
- package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +1 -1
- package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.json +69 -11
- package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +1 -1
- package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +108 -125
- package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +1 -1
- package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +151 -81
- package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +95 -41
- package/artifacts/contracts/pool/BasicPool.sol/BasicPool.dbg.json +1 -1
- package/artifacts/contracts/pool/BasicPool.sol/BasicPool.json +107 -152
- package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.dbg.json +1 -1
- package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.json +206 -27
- package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
- package/artifacts/contracts/pool/BundleService.sol/BundleService.json +156 -326
- package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
- package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +79 -101
- package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
- package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +84 -135
- package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +94 -145
- package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +192 -229
- package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/pool/Pool.sol/Pool.json +107 -163
- package/artifacts/contracts/pool/PoolLib.sol/PoolLib.dbg.json +4 -0
- package/artifacts/contracts/pool/PoolLib.sol/PoolLib.json +456 -0
- package/artifacts/contracts/pool/PoolService.sol/PoolService.dbg.json +1 -1
- package/artifacts/contracts/pool/PoolService.sol/PoolService.json +330 -368
- package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
- package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +119 -69
- package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
- package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +130 -54
- package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +71 -41
- package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.dbg.json +1 -1
- package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.json +228 -186
- package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.dbg.json +1 -1
- package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.json +206 -27
- package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
- package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +272 -173
- package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +100 -78
- package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
- package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +89 -9
- package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
- package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +170 -19
- package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
- package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +139 -54
- package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
- package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +105 -52
- package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +211 -164
- package/artifacts/contracts/product/IRiskService.sol/IRiskService.dbg.json +1 -1
- package/artifacts/contracts/product/IRiskService.sol/IRiskService.json +55 -2
- package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
- package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +235 -170
- package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.dbg.json +4 -0
- package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.json +293 -0
- package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.json +102 -64
- package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
- package/artifacts/contracts/product/PricingService.sol/PricingService.json +181 -116
- package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +89 -51
- package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/product/Product.sol/Product.json +224 -182
- package/artifacts/contracts/product/RiskService.sol/RiskService.dbg.json +1 -1
- package/artifacts/contracts/product/RiskService.sol/RiskService.json +112 -63
- package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.dbg.json +1 -1
- package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.json +80 -38
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +98 -2
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +144 -41
- 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 +142 -38
- package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +277 -213
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +181 -74
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +67 -33
- package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.dbg.json +4 -0
- package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.json +1849 -0
- package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.json +3 -3
- package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.json +337 -65
- package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +1 -1
- package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +12 -12
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +4 -4
- package/artifacts/contracts/shared/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/shared/Component.sol/Component.json +105 -104
- package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +483 -485
- package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +99 -73
- package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +1 -1
- package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.json +55 -2
- package/artifacts/contracts/shared/ContractLib.sol/ContractLib.dbg.json +1 -1
- package/artifacts/contracts/shared/ContractLib.sol/ContractLib.json +454 -5
- 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 -86
- package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
- package/artifacts/contracts/shared/IComponentService.sol/IComponentService.json +446 -276
- package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +94 -106
- package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.dbg.json +1 -1
- package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +16 -0
- package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +148 -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 +55 -2
- package/artifacts/contracts/shared/InitializableERC165.sol/InitializableERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.dbg.json +1 -1
- package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.json +107 -124
- package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.json +1 -1
- package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.json +1 -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 +18 -2
- package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
- package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +2 -2
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +152 -38
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -2
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
- package/artifacts/contracts/shared/Service.sol/Service.json +55 -2
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +327 -73
- 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 +1 -1
- package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.json +88 -24
- package/artifacts/contracts/staking/IStaking.sol/IStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/IStaking.sol/IStaking.json +113 -136
- package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
- package/artifacts/contracts/staking/IStakingService.sol/IStakingService.json +130 -16
- package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +1 -1
- package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +49 -49
- package/artifacts/contracts/staking/Staking.sol/Staking.dbg.json +1 -1
- package/artifacts/contracts/staking/Staking.sol/Staking.json +203 -206
- package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingLifecycle.sol/StakingLifecycle.json +3 -3
- package/artifacts/contracts/staking/StakingManager.sol/StakingManager.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingManager.sol/StakingManager.json +93 -51
- package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +6 -57
- package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingService.sol/StakingService.json +181 -55
- package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +77 -39
- package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
- package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +130 -130
- package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.dbg.json +1 -1
- package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.json +23 -23
- package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.dbg.json +1 -1
- package/artifacts/contracts/type/Amount.sol/AmountLib.dbg.json +1 -1
- package/artifacts/contracts/type/Amount.sol/AmountLib.json +3 -3
- package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.json +2 -2
- 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 +3 -3
- 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 +2 -2
- package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.json +2 -2
- 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 +62 -5
- package/artifacts/contracts/type/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/type/RoleId.sol/RoleIdLib.json +79 -15
- package/artifacts/contracts/type/Seconds.sol/SecondsLib.dbg.json +1 -1
- 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/String.sol/StrLib.dbg.json +1 -1
- package/artifacts/contracts/type/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/type/Timestamp.sol/TimestampLib.json +2 -2
- package/artifacts/contracts/type/UFixed.sol/UFixedLib.dbg.json +1 -1
- package/artifacts/contracts/type/UFixed.sol/UFixedLib.json +3 -3
- 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 +47 -2
- package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.json +44 -12
- package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.dbg.json +1 -1
- package/contracts/accounting/AccountingService.sol +262 -0
- package/contracts/accounting/AccountingServiceManager.sol +38 -0
- package/contracts/accounting/IAccountingService.sol +45 -0
- package/contracts/authorization/AccessAdmin.sol +216 -125
- package/contracts/authorization/AccessManagerCloneable.sol +136 -3
- package/contracts/authorization/Authorization.sol +321 -205
- package/contracts/authorization/IAccess.sol +1 -0
- package/contracts/authorization/IAccessAdmin.sol +14 -8
- package/contracts/authorization/IAuthorization.sol +27 -7
- package/contracts/authorization/IServiceAuthorization.sol +1 -1
- package/contracts/authorization/ServiceAuthorization.sol +4 -4
- package/contracts/distribution/BasicDistribution.sol +15 -12
- package/contracts/distribution/BasicDistributionAuthorization.sol +22 -9
- package/contracts/distribution/Distribution.sol +41 -47
- package/contracts/distribution/DistributionService.sol +100 -78
- package/contracts/distribution/DistributionServiceManager.sol +1 -1
- package/contracts/distribution/IDistributionComponent.sol +1 -1
- package/contracts/distribution/IDistributionService.sol +19 -19
- package/contracts/examples/fire/FirePool.sol +25 -10
- package/contracts/examples/fire/FirePoolAuthorization.sol +2 -1
- package/contracts/examples/fire/FireProduct.sol +40 -13
- package/contracts/examples/fire/FireProductAuthorization.sol +3 -3
- package/contracts/examples/unpermissioned/SimpleDistribution.sol +11 -4
- package/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol +28 -0
- package/contracts/examples/unpermissioned/SimpleOracle.sol +4 -4
- package/contracts/examples/unpermissioned/SimplePool.sol +37 -7
- package/contracts/examples/unpermissioned/SimplePoolAuthorization.sol +28 -0
- package/contracts/examples/unpermissioned/SimpleProduct.sol +49 -23
- package/contracts/examples/unpermissioned/SimpleProductAuthorization.sol +28 -0
- package/contracts/instance/BundleSet.sol +42 -38
- package/contracts/instance/IInstance.sol +17 -10
- package/contracts/instance/IInstanceService.sol +9 -29
- package/contracts/instance/Instance.sol +52 -34
- package/contracts/instance/InstanceAdmin.sol +249 -100
- package/contracts/instance/InstanceAuthorizationV3.sol +54 -45
- package/contracts/instance/InstanceReader.sol +174 -32
- package/contracts/instance/InstanceService.sol +85 -146
- package/contracts/instance/InstanceServiceManager.sol +1 -1
- package/contracts/instance/InstanceStore.sol +13 -2
- package/contracts/instance/RiskSet.sol +118 -0
- package/contracts/instance/base/ObjectCounter.sol +1 -2
- package/contracts/instance/base/ObjectLifecycle.sol +4 -2
- package/contracts/instance/base/ObjectSet.sol +31 -33
- package/contracts/instance/base/ObjectSetHelperLib.sol +30 -0
- package/contracts/instance/module/IComponents.sol +10 -7
- package/contracts/instance/module/IDistribution.sol +2 -1
- package/contracts/instance/module/IPolicy.sol +2 -1
- package/contracts/instance/module/IRisk.sol +3 -0
- package/contracts/oracle/BasicOracle.sol +0 -1
- package/contracts/oracle/BasicOracleAuthorization.sol +3 -12
- package/contracts/oracle/IOracleService.sol +2 -1
- package/contracts/oracle/Oracle.sol +5 -16
- package/contracts/oracle/OracleService.sol +107 -78
- package/contracts/oracle/OracleServiceManager.sol +1 -1
- package/contracts/pool/BasicPool.sol +33 -24
- package/contracts/pool/BasicPoolAuthorization.sol +27 -9
- package/contracts/pool/BundleService.sol +88 -154
- package/contracts/pool/BundleServiceManager.sol +1 -1
- package/contracts/pool/IBundleService.sol +15 -43
- package/contracts/pool/IPoolComponent.sol +1 -7
- package/contracts/pool/IPoolService.sol +58 -64
- package/contracts/pool/Pool.sol +112 -120
- package/contracts/pool/PoolLib.sol +216 -0
- package/contracts/pool/PoolService.sol +436 -242
- package/contracts/pool/PoolServiceManager.sol +1 -1
- package/contracts/product/ApplicationService.sol +24 -16
- package/contracts/product/ApplicationServiceManager.sol +1 -1
- package/contracts/product/BasicProduct.sol +10 -12
- package/contracts/product/BasicProductAuthorization.sol +24 -11
- package/contracts/product/ClaimService.sol +202 -151
- package/contracts/product/ClaimServiceManager.sol +1 -1
- package/contracts/product/IApplicationService.sol +5 -2
- package/contracts/product/IClaimService.sol +14 -2
- package/contracts/product/IPolicyService.sol +26 -11
- package/contracts/product/IPricingService.sol +9 -9
- package/contracts/product/IProductComponent.sol +10 -1
- package/contracts/product/PolicyService.sol +248 -252
- package/contracts/product/PolicyServiceLib.sol +65 -0
- package/contracts/product/PolicyServiceManager.sol +1 -1
- package/contracts/product/PricingService.sol +30 -26
- package/contracts/product/PricingServiceManager.sol +3 -3
- package/contracts/product/Product.sol +106 -60
- package/contracts/product/RiskService.sol +74 -25
- package/contracts/product/RiskServiceManager.sol +1 -1
- package/contracts/registry/ChainNft.sol +10 -11
- package/contracts/registry/IRegistry.sol +14 -15
- package/contracts/registry/IRegistryService.sol +6 -4
- package/contracts/registry/IRelease.sol +26 -0
- package/contracts/registry/ITransferInterceptor.sol +1 -2
- package/contracts/registry/Registry.sol +29 -6
- package/contracts/registry/RegistryAdmin.sol +132 -226
- package/contracts/registry/RegistryService.sol +40 -58
- package/contracts/registry/RegistryServiceManager.sol +1 -1
- package/contracts/registry/ReleaseAdmin.sol +245 -0
- package/contracts/registry/ReleaseLifecycle.sol +2 -0
- package/contracts/registry/ReleaseRegistry.sol +139 -124
- package/contracts/registry/ServiceAuthorizationV3.sol +97 -48
- package/contracts/registry/TokenRegistry.sol +6 -8
- package/contracts/shared/Component.sol +69 -118
- package/contracts/shared/ComponentService.sol +422 -371
- package/contracts/shared/ComponentServiceManager.sol +1 -1
- package/contracts/shared/ComponentVerifyingService.sol +27 -15
- package/contracts/shared/ContractLib.sol +224 -9
- package/contracts/shared/IComponent.sol +8 -20
- package/contracts/shared/IComponentService.sol +41 -37
- package/contracts/shared/IInstanceLinkedComponent.sol +3 -22
- package/contracts/shared/INftOwnable.sol +2 -0
- package/contracts/shared/IRegisterable.sol +23 -1
- package/contracts/shared/IService.sol +3 -5
- package/contracts/shared/InstanceLinkedComponent.sol +68 -42
- package/contracts/shared/Lifecycle.sol +7 -7
- package/contracts/shared/NftOwnable.sol +26 -6
- package/contracts/shared/PolicyHolder.sol +1 -1
- package/contracts/shared/Registerable.sol +53 -19
- package/contracts/shared/RegistryLinked.sol +7 -13
- package/contracts/shared/Service.sol +9 -31
- package/contracts/shared/TokenHandler.sol +274 -72
- package/contracts/shared/TokenHandlerDeployerLib.sol +10 -2
- package/contracts/staking/IStaking.sol +6 -10
- package/contracts/staking/IStakingService.sol +12 -4
- package/contracts/staking/StakeManagerLib.sol +69 -20
- package/contracts/staking/Staking.sol +73 -41
- package/contracts/staking/StakingReader.sol +1 -16
- package/contracts/staking/StakingService.sol +70 -24
- package/contracts/staking/StakingServiceManager.sol +5 -4
- package/contracts/type/Key32.sol +2 -2
- package/contracts/type/Key32Set.sol +62 -0
- package/contracts/type/NftId.sol +6 -0
- package/contracts/type/ObjectType.sol +48 -21
- package/contracts/type/RiskId.sol +23 -6
- package/contracts/type/RoleId.sol +23 -15
- package/contracts/type/Selector.sol +5 -0
- package/contracts/type/Timestamp.sol +0 -5
- package/contracts/type/UFixed.sol +9 -119
- package/contracts/type/Version.sol +15 -5
- package/contracts/upgradeability/ProxyManager.sol +2 -1
- package/package.json +3 -3
- 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/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
| @@ -5,91 +5,191 @@ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManage | |
| 5 5 | 
             
            import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
         | 
| 6 6 | 
             
            import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
         | 
| 7 7 |  | 
| 8 | 
            -
            import {Amount} from "../type/Amount.sol";
         | 
| 8 | 
            +
            import {Amount, AmountLib} from "../type/Amount.sol";
         | 
| 9 | 
            +
            import {ContractLib} from "../shared/ContractLib.sol";
         | 
| 10 | 
            +
            import {IRegistry} from "../registry/IRegistry.sol";
         | 
| 11 | 
            +
            import {NftId} from "../type/NftId.sol";
         | 
| 12 | 
            +
            import {SERVICE} from "../type/ObjectType.sol";
         | 
| 9 13 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
            ///  | 
| 12 | 
            -
            ///  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 14 | 
            +
             | 
| 15 | 
            +
            /// @dev Token specific transfer helper base contract.
         | 
| 16 | 
            +
            /// A default token contract is provided via contract constructor.
         | 
| 17 | 
            +
            /// Relies internally on OpenZeppelin SafeERC20.safeTransferFrom.
         | 
| 18 | 
            +
            /// This base contract simplifies writing tests.
         | 
| 19 | 
            +
            contract TokenHandlerBase {
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                // _setWallet
         | 
| 22 | 
            +
                event LogTokenHandlerWalletAddressChanged(NftId componentNftId, address oldWallet, address newWallet);
         | 
| 23 | 
            +
                event LogTokenHandlerWalletTokensTransferred(NftId componentNftId, address oldWallet, address newWallet, Amount amount);
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                // _approveTokenHandler
         | 
| 26 | 
            +
                event LogTokenHandlerTokenApproved(NftId nftId, address tokenHandler, address token, Amount amount, bool isMaxAmount);
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                // _transfer
         | 
| 29 | 
            +
                event LogTokenHandlerTokenTransfer(address token, address from, address to, Amount amount);
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                // constructor
         | 
| 32 | 
            +
                error ErrorTokenHandlerNotRegistry(address registry);
         | 
| 33 | 
            +
                error ErrorTokenHandlerComponentNotRegistered(address component);
         | 
| 34 | 
            +
                error ErrorTokenHandlerTokenAddressZero();
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                // _setWallet
         | 
| 37 | 
            +
                error ErrorTokenHandlerNewWalletAddressZero();
         | 
| 38 | 
            +
                error ErrorTokenHandlerAddressIsSameAsCurrent();
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                // _approveTokenHandler
         | 
| 41 | 
            +
                error ErrorTokenHandlerNotWallet(NftId nftId, address tokenHandler, address wallet);
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                // _checkPreconditions
         | 
| 15 44 | 
             
                error ErrorTokenHandlerBalanceTooLow(address token, address from, uint256 balance, uint256 expectedBalance);
         | 
| 16 45 | 
             
                error ErrorTokenHandlerAllowanceTooSmall(address token, address from, address spender, uint256 allowance, uint256 expectedAllowance);
         | 
| 17 | 
            -
                error  | 
| 18 | 
            -
                
         | 
| 19 | 
            -
                event LogTokenHandlerTokenTransfer(address token, address from, address to, uint256 amountTransferred);
         | 
| 46 | 
            +
                error ErrorTokenHandlerAmountIsZero();
         | 
| 20 47 |  | 
| 21 | 
            -
                 | 
| 48 | 
            +
                IRegistry public immutable REGISTRY;
         | 
| 49 | 
            +
                IERC20Metadata public immutable TOKEN;
         | 
| 50 | 
            +
                address public immutable COMPONENT;
         | 
| 51 | 
            +
                NftId public immutable NFT_ID;
         | 
| 22 52 |  | 
| 23 | 
            -
                 | 
| 24 | 
            -
                    _token = IERC20Metadata(token);
         | 
| 25 | 
            -
                }
         | 
| 53 | 
            +
                address internal _wallet;
         | 
| 26 54 |  | 
| 27 | 
            -
                 | 
| 28 | 
            -
             | 
| 29 | 
            -
                     | 
| 30 | 
            -
                     | 
| 31 | 
            -
                    returns (IERC20Metadata)
         | 
| 32 | 
            -
                {
         | 
| 33 | 
            -
                    return _token;
         | 
| 34 | 
            -
                }
         | 
| 35 | 
            -
                
         | 
| 36 | 
            -
                /// @dev collect tokens from outside of the gif and transfer them to one wallet within the scope of gif.
         | 
| 37 | 
            -
                /// This method also checks balance and allowance and makes sure the amount is greater than zero.
         | 
| 38 | 
            -
                function collectTokens(
         | 
| 39 | 
            -
                    address from,
         | 
| 40 | 
            -
                    address to,
         | 
| 41 | 
            -
                    Amount amount
         | 
| 55 | 
            +
                constructor(
         | 
| 56 | 
            +
                    address registry,
         | 
| 57 | 
            +
                    address component,
         | 
| 58 | 
            +
                    address token
         | 
| 42 59 | 
             
                )
         | 
| 43 | 
            -
                    external
         | 
| 44 | 
            -
                    restricted()
         | 
| 45 60 | 
             
                {
         | 
| 46 | 
            -
                     | 
| 61 | 
            +
                    if (!ContractLib.isRegistry(registry)) {
         | 
| 62 | 
            +
                        revert ErrorTokenHandlerNotRegistry(registry);
         | 
| 63 | 
            +
                    }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    if (token == address(0)) {
         | 
| 66 | 
            +
                        revert ErrorTokenHandlerTokenAddressZero();
         | 
| 67 | 
            +
                    }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    REGISTRY = IRegistry(registry);
         | 
| 70 | 
            +
                    COMPONENT = component;
         | 
| 71 | 
            +
                    NFT_ID = REGISTRY.getNftIdForAddress(component);
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    if (NFT_ID.eqz()) {
         | 
| 74 | 
            +
                        revert ErrorTokenHandlerComponentNotRegistered(component);
         | 
| 75 | 
            +
                    }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                    TOKEN = IERC20Metadata(token);
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    // self approval of token handler to max amount
         | 
| 80 | 
            +
                    _approve(TOKEN, AmountLib.max());
         | 
| 47 81 | 
             
                }
         | 
| 48 82 |  | 
| 49 | 
            -
             | 
| 50 | 
            -
                ///  | 
| 51 | 
            -
                 | 
| 83 | 
            +
             | 
| 84 | 
            +
                /// @dev Checks the balance and allowance for the from address and amount.
         | 
| 85 | 
            +
                /// When requiring amount > 0 set checkAmount to true.
         | 
| 86 | 
            +
                function checkBalanceAndAllowance(
         | 
| 52 87 | 
             
                    address from,
         | 
| 53 | 
            -
                    address to,
         | 
| 54 88 | 
             
                    Amount amount,
         | 
| 55 | 
            -
                     | 
| 56 | 
            -
                    Amount amount2,
         | 
| 57 | 
            -
                    address to3,
         | 
| 58 | 
            -
                    Amount amount3
         | 
| 89 | 
            +
                    bool checkAmount
         | 
| 59 90 | 
             
                )
         | 
| 60 91 | 
             
                    external
         | 
| 61 | 
            -
                     | 
| 92 | 
            +
                    view
         | 
| 62 93 | 
             
                {
         | 
| 63 | 
            -
                     | 
| 64 | 
            -
             | 
| 94 | 
            +
                    _checkBalanceAndAllowance(from, amount, checkAmount);
         | 
| 95 | 
            +
                }
         | 
| 96 | 
            +
             | 
| 97 | 
            +
             | 
| 98 | 
            +
                /// @dev Returns the wallet linked to this TokenHandler.
         | 
| 99 | 
            +
                function getWallet()
         | 
| 100 | 
            +
                    public
         | 
| 101 | 
            +
                    view 
         | 
| 102 | 
            +
                    returns (address wallet)
         | 
| 103 | 
            +
                {
         | 
| 104 | 
            +
                    if (_wallet == address(0)) {
         | 
| 105 | 
            +
                        return address(this);
         | 
| 65 106 | 
             
                    }
         | 
| 66 107 |  | 
| 67 | 
            -
                     | 
| 108 | 
            +
                    return _wallet;
         | 
| 109 | 
            +
                }
         | 
| 110 | 
            +
             | 
| 68 111 |  | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 112 | 
            +
                /// @dev Approves token handler to spend up to the specified amount of tokens.
         | 
| 113 | 
            +
                /// Sets spending limit to type(uint256).max for AmountLib.max().
         | 
| 114 | 
            +
                /// Reverts if wallet is not token handler itself.
         | 
| 115 | 
            +
                /// Sets approvel using SareERC20.forceApprove internally.
         | 
| 116 | 
            +
                function _approve(
         | 
| 117 | 
            +
                    IERC20Metadata token, 
         | 
| 118 | 
            +
                    Amount amount
         | 
| 119 | 
            +
                )
         | 
| 120 | 
            +
                    internal
         | 
| 121 | 
            +
                {
         | 
| 122 | 
            +
                    // check that wallet is token handler contract itself
         | 
| 123 | 
            +
                    if(_wallet != address(0)) {
         | 
| 124 | 
            +
                        revert ErrorTokenHandlerNotWallet(NFT_ID, address(this), _wallet);
         | 
| 71 125 | 
             
                    }
         | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 126 | 
            +
             | 
| 127 | 
            +
                    // update spending limit for AmountLib.max() to type(uint256).max
         | 
| 128 | 
            +
                    uint256 amountInt = amount.toInt();
         | 
| 129 | 
            +
                    bool isMaxAmount = false;
         | 
| 130 | 
            +
                    if (amount == AmountLib.max()) {
         | 
| 131 | 
            +
                        amountInt = type(uint256).max;
         | 
| 132 | 
            +
                        isMaxAmount = true;
         | 
| 74 133 | 
             
                    }
         | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 134 | 
            +
             | 
| 135 | 
            +
                    emit LogTokenHandlerTokenApproved(NFT_ID, address(this), address(token), amount, isMaxAmount);
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                    // execute approval
         | 
| 138 | 
            +
                    SafeERC20.forceApprove(
         | 
| 139 | 
            +
                        token, 
         | 
| 140 | 
            +
                        address(this), 
         | 
| 141 | 
            +
                        amountInt);
         | 
| 142 | 
            +
                }
         | 
| 143 | 
            +
             | 
| 144 | 
            +
             | 
| 145 | 
            +
                function _setWallet(address newWallet)
         | 
| 146 | 
            +
                    internal
         | 
| 147 | 
            +
                {
         | 
| 148 | 
            +
                    address oldWallet = _wallet;
         | 
| 149 | 
            +
                    if (newWallet == oldWallet) {
         | 
| 150 | 
            +
                        revert ErrorTokenHandlerAddressIsSameAsCurrent();
         | 
| 151 | 
            +
                    }
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                    // effects
         | 
| 154 | 
            +
                    address oldWalletForBalance = getWallet();
         | 
| 155 | 
            +
                    _wallet = newWallet;
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                    emit LogTokenHandlerWalletAddressChanged(NFT_ID, oldWallet, newWallet);
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    // interactions
         | 
| 160 | 
            +
                    Amount balanceAmount = AmountLib.toAmount(
         | 
| 161 | 
            +
                        TOKEN.balanceOf(oldWalletForBalance));
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                    if (balanceAmount.gtz()) {
         | 
| 164 | 
            +
                        // move tokens from old to new wallet 
         | 
| 165 | 
            +
                        emit LogTokenHandlerWalletTokensTransferred(NFT_ID, oldWallet, newWallet, balanceAmount);
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                        if (oldWallet == address(0)) {
         | 
| 168 | 
            +
                            // transfer from the component requires an allowance
         | 
| 169 | 
            +
                            _transfer(address(this), newWallet, balanceAmount, true);
         | 
| 170 | 
            +
                        } else if (newWallet == address(0)) {
         | 
| 171 | 
            +
                            _transfer(oldWallet, address(this), balanceAmount, true);
         | 
| 172 | 
            +
                        } else {
         | 
| 173 | 
            +
                            _transfer(oldWallet, newWallet, balanceAmount, true);
         | 
| 174 | 
            +
                        }
         | 
| 77 175 | 
             
                    }
         | 
| 78 176 | 
             
                }
         | 
| 79 177 |  | 
| 80 | 
            -
             | 
| 81 | 
            -
                 | 
| 82 | 
            -
             | 
| 83 | 
            -
                    address from,
         | 
| 84 | 
            -
                    address to,
         | 
| 85 | 
            -
                    Amount amount
         | 
| 86 | 
            -
                )
         | 
| 87 | 
            -
                    external
         | 
| 88 | 
            -
                    restricted()
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                function _pullToken(address from, Amount amount)
         | 
| 180 | 
            +
                    internal
         | 
| 89 181 | 
             
                {
         | 
| 90 | 
            -
                    _transfer(from,  | 
| 182 | 
            +
                    _transfer(from, getWallet(), amount, true);
         | 
| 91 183 | 
             
                }
         | 
| 92 184 |  | 
| 185 | 
            +
             | 
| 186 | 
            +
                function _pushToken(address to, Amount amount)
         | 
| 187 | 
            +
                    internal
         | 
| 188 | 
            +
                {
         | 
| 189 | 
            +
                    _transfer(getWallet(), to, amount, true);
         | 
| 190 | 
            +
                }
         | 
| 191 | 
            +
             | 
| 192 | 
            +
             | 
| 93 193 | 
             
                function _transfer(
         | 
| 94 194 | 
             
                    address from,
         | 
| 95 195 | 
             
                    address to,
         | 
| @@ -99,41 +199,143 @@ contract TokenHandler is AccessManaged { | |
| 99 199 | 
             
                    internal
         | 
| 100 200 | 
             
                {
         | 
| 101 201 | 
             
                    if (checkPreconditions) {
         | 
| 102 | 
            -
                         | 
| 103 | 
            -
                         | 
| 202 | 
            +
                        bool checkAmount = true;
         | 
| 203 | 
            +
                        _checkBalanceAndAllowance(from, amount, checkAmount);
         | 
| 104 204 | 
             
                    }
         | 
| 105 205 |  | 
| 106 206 | 
             
                    // transfer the tokens
         | 
| 107 | 
            -
                    emit LogTokenHandlerTokenTransfer(address( | 
| 207 | 
            +
                    emit LogTokenHandlerTokenTransfer(address(TOKEN), from, to, amount);
         | 
| 208 | 
            +
             | 
| 108 209 | 
             
                    SafeERC20.safeTransferFrom(
         | 
| 109 | 
            -
                         | 
| 210 | 
            +
                        TOKEN, 
         | 
| 110 211 | 
             
                        from, 
         | 
| 111 212 | 
             
                        to, 
         | 
| 112 213 | 
             
                        amount.toInt());
         | 
| 113 214 | 
             
                }
         | 
| 114 215 |  | 
| 115 | 
            -
             | 
| 216 | 
            +
             | 
| 217 | 
            +
                function _checkBalanceAndAllowance(
         | 
| 116 218 | 
             
                    address from,
         | 
| 117 | 
            -
                    Amount amount
         | 
| 219 | 
            +
                    Amount amount,
         | 
| 220 | 
            +
                    bool checkAmount
         | 
| 118 221 | 
             
                ) 
         | 
| 119 222 | 
             
                    internal
         | 
| 120 223 | 
             
                    view
         | 
| 121 224 | 
             
                {
         | 
| 122 225 | 
             
                    // amount must be greater than zero
         | 
| 123 | 
            -
                    if (amount.eqz()) {
         | 
| 226 | 
            +
                    if (checkAmount && amount.eqz()) {
         | 
| 124 227 | 
             
                        revert ErrorTokenHandlerAmountIsZero();
         | 
| 125 228 | 
             
                    }
         | 
| 126 229 |  | 
| 230 | 
            +
                    // allowance must be >= amount
         | 
| 231 | 
            +
                    uint256 allowance = TOKEN.allowance(from, address(this));
         | 
| 232 | 
            +
                    if (allowance < amount.toInt()) {
         | 
| 233 | 
            +
                        revert ErrorTokenHandlerAllowanceTooSmall(address(TOKEN), from, address(this), allowance, amount.toInt());
         | 
| 234 | 
            +
                    }
         | 
| 235 | 
            +
             | 
| 127 236 | 
             
                    // balance must be >= amount
         | 
| 128 | 
            -
                    uint256 balance =  | 
| 237 | 
            +
                    uint256 balance = TOKEN.balanceOf(from);
         | 
| 129 238 | 
             
                    if (balance < amount.toInt()) {
         | 
| 130 | 
            -
                        revert ErrorTokenHandlerBalanceTooLow(address( | 
| 239 | 
            +
                        revert ErrorTokenHandlerBalanceTooLow(address(TOKEN), from, balance, amount.toInt());
         | 
| 131 240 | 
             
                    }
         | 
| 241 | 
            +
                }
         | 
| 242 | 
            +
            }
         | 
| 132 243 |  | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 244 | 
            +
             | 
| 245 | 
            +
            /// @dev Token specific transfer helper.
         | 
| 246 | 
            +
            /// Contract is derived from TokenHandlerBase and adds 
         | 
| 247 | 
            +
            /// authorization based on OpenZeppelin AccessManaged.
         | 
| 248 | 
            +
            contract TokenHandler is
         | 
| 249 | 
            +
                AccessManaged,
         | 
| 250 | 
            +
                TokenHandlerBase
         | 
| 251 | 
            +
            {
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                // onlyService
         | 
| 254 | 
            +
                error ErrorTokenHandlerNotService(address service);
         | 
| 255 | 
            +
             | 
| 256 | 
            +
                modifier onlyService() {
         | 
| 257 | 
            +
                    if (!REGISTRY.isObjectType(msg.sender, SERVICE())) {
         | 
| 258 | 
            +
                        revert ErrorTokenHandlerNotService(msg.sender);
         | 
| 137 259 | 
             
                    }
         | 
| 260 | 
            +
                    _;
         | 
| 261 | 
            +
                }
         | 
| 262 | 
            +
             | 
| 263 | 
            +
                constructor(
         | 
| 264 | 
            +
                    address registry,
         | 
| 265 | 
            +
                    address component,
         | 
| 266 | 
            +
                    address token, 
         | 
| 267 | 
            +
                    address authority
         | 
| 268 | 
            +
                )
         | 
| 269 | 
            +
                    TokenHandlerBase(registry, component, token)
         | 
| 270 | 
            +
                    AccessManaged(authority)
         | 
| 271 | 
            +
                { }
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                /// @dev sets the wallet address for the component.
         | 
| 274 | 
            +
                /// if the current wallet has tokens, these will be transferred.
         | 
| 275 | 
            +
                /// if the new wallet address is externally owned, an approval from the 
         | 
| 276 | 
            +
                /// owner of the external wallet to the tokenhandler of the component that 
         | 
| 277 | 
            +
                /// covers the current component balance must exist
         | 
| 278 | 
            +
                function setWallet(address newWallet)
         | 
| 279 | 
            +
                    external
         | 
| 280 | 
            +
                    restricted()
         | 
| 281 | 
            +
                    onlyService()
         | 
| 282 | 
            +
                {
         | 
| 283 | 
            +
                    _setWallet(newWallet);
         | 
| 284 | 
            +
                }
         | 
| 285 | 
            +
             | 
| 286 | 
            +
             | 
| 287 | 
            +
                /// @dev Approves token handler to spend up to the specified amount of tokens.
         | 
| 288 | 
            +
                /// Sets spending limit to type(uint256).max for AmountLib.max().
         | 
| 289 | 
            +
                /// Reverts if component wallet is not component itself.
         | 
| 290 | 
            +
                /// Sets approvel using SareERC20.forceApprove internally.
         | 
| 291 | 
            +
                function approve(
         | 
| 292 | 
            +
                    IERC20Metadata token, 
         | 
| 293 | 
            +
                    Amount amount
         | 
| 294 | 
            +
                )
         | 
| 295 | 
            +
                    external
         | 
| 296 | 
            +
                    restricted()
         | 
| 297 | 
            +
                    onlyService()
         | 
| 298 | 
            +
                {
         | 
| 299 | 
            +
                    _approve(token, amount);
         | 
| 300 | 
            +
                }
         | 
| 301 | 
            +
             | 
| 302 | 
            +
                /// @dev Collect tokens from outside of GIF and transfer them to the wallet.
         | 
| 303 | 
            +
                /// This method also checks balance and allowance and makes sure the amount is greater than zero.
         | 
| 304 | 
            +
                function pullToken(
         | 
| 305 | 
            +
                    address from,
         | 
| 306 | 
            +
                    Amount amount
         | 
| 307 | 
            +
                )
         | 
| 308 | 
            +
                    external
         | 
| 309 | 
            +
                    restricted()
         | 
| 310 | 
            +
                    onlyService()
         | 
| 311 | 
            +
                {
         | 
| 312 | 
            +
                    _pullToken(from, amount);
         | 
| 313 | 
            +
                }
         | 
| 314 | 
            +
             | 
| 315 | 
            +
             | 
| 316 | 
            +
                /// @dev Distribute tokens from a wallet within the scope of gif to some address.
         | 
| 317 | 
            +
                function pushToken(
         | 
| 318 | 
            +
                    address to,
         | 
| 319 | 
            +
                    Amount amount
         | 
| 320 | 
            +
                )
         | 
| 321 | 
            +
                    external
         | 
| 322 | 
            +
                    restricted()
         | 
| 323 | 
            +
                    onlyService()
         | 
| 324 | 
            +
                {
         | 
| 325 | 
            +
                    _pushToken(to, amount);
         | 
| 326 | 
            +
                }
         | 
| 327 | 
            +
             | 
| 328 | 
            +
             | 
| 329 | 
            +
                /// @dev Distribute fee tokens from a wallet within the scope of gif to some address.
         | 
| 330 | 
            +
                /// Separate push function for component service.
         | 
| 331 | 
            +
                function pushFeeToken(
         | 
| 332 | 
            +
                    address to,
         | 
| 333 | 
            +
                    Amount amount
         | 
| 334 | 
            +
                )
         | 
| 335 | 
            +
                    external
         | 
| 336 | 
            +
                    restricted()
         | 
| 337 | 
            +
                    onlyService()
         | 
| 338 | 
            +
                {
         | 
| 339 | 
            +
                    _pushToken(to, amount);
         | 
| 138 340 | 
             
                }
         | 
| 139 341 | 
             
            }
         | 
| @@ -5,8 +5,16 @@ import {TokenHandler} from "./TokenHandler.sol"; | |
| 5 5 |  | 
| 6 6 | 
             
            library TokenHandlerDeployerLib {
         | 
| 7 7 |  | 
| 8 | 
            -
                function deployTokenHandler( | 
| 9 | 
            -
                     | 
| 8 | 
            +
                function deployTokenHandler(
         | 
| 9 | 
            +
                    address registry,
         | 
| 10 | 
            +
                    address component,
         | 
| 11 | 
            +
                    address token, 
         | 
| 12 | 
            +
                    address authority
         | 
| 13 | 
            +
                )
         | 
| 14 | 
            +
                    public 
         | 
| 15 | 
            +
                    returns (TokenHandler)
         | 
| 16 | 
            +
                {
         | 
| 17 | 
            +
                    return new TokenHandler(registry, component, token, authority);
         | 
| 10 18 | 
             
                }
         | 
| 11 19 |  | 
| 12 20 | 
             
            }
         | 
| @@ -30,6 +30,9 @@ interface IStaking is | |
| 30 30 | 
             
                error ErrorStakingNotStakingOwner();
         | 
| 31 31 | 
             
                error ErrorStakingNotNftOwner(NftId nftId);
         | 
| 32 32 |  | 
| 33 | 
            +
                // initializeTokenHandler
         | 
| 34 | 
            +
                error ErrorStakingNotRegistry(address registry);
         | 
| 35 | 
            +
             | 
| 33 36 | 
             
                // staking rate
         | 
| 34 37 | 
             
                error ErrorStakingTokenNotRegistered(uint256 chainId, address token);
         | 
| 35 38 |  | 
| @@ -49,7 +52,6 @@ interface IStaking is | |
| 49 52 | 
             
                error ErrorStakingTargetNotFound(NftId targetNftId);
         | 
| 50 53 | 
             
                error ErrorStakingTargetTokenNotFound(NftId targetNftId, uint256 chainId, address token);
         | 
| 51 54 |  | 
| 52 | 
            -
                error ErrorStakingTargetNotActive(NftId targetNftId);
         | 
| 53 55 | 
             
                error ErrorStakingStakeAmountZero(NftId targetNftId);
         | 
| 54 56 |  | 
| 55 57 | 
             
                // info for individual stake
         | 
| @@ -64,6 +66,8 @@ interface IStaking is | |
| 64 66 | 
             
                    UFixed rewardRate;
         | 
| 65 67 | 
             
                }
         | 
| 66 68 |  | 
| 69 | 
            +
                function initializeTokenHandler() external;
         | 
| 70 | 
            +
             | 
| 67 71 | 
             
                // staking rate management 
         | 
| 68 72 |  | 
| 69 73 | 
             
                /// @dev sets the rate that converts 1 token of total value locked into the
         | 
| @@ -127,7 +131,7 @@ interface IStaking is | |
| 127 131 | 
             
                /// @dev restakes the dips to a new target.
         | 
| 128 132 | 
             
                /// the sum of the staked dips and the accumulated rewards will be restaked.
         | 
| 129 133 | 
             
                /// permissioned: only staking service may call this function.
         | 
| 130 | 
            -
                function restake(NftId stakeNftId, NftId  | 
| 134 | 
            +
                function restake(NftId stakeNftId, NftId newStakeNftId) external returns (Amount newStakeBalance);
         | 
| 131 135 |  | 
| 132 136 | 
             
                /// @dev retuns the specified amount of dips to the holder of the specified stake nft.
         | 
| 133 137 | 
             
                /// if dipAmount is set to Amount.max() all staked dips and all rewards are transferred to 
         | 
| @@ -153,14 +157,6 @@ interface IStaking is | |
| 153 157 | 
             
                        Amount rewardsClaimedAmount
         | 
| 154 158 | 
             
                    );
         | 
| 155 159 |  | 
| 156 | 
            -
                //--- helper functions --------------------------------------------------//
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                /// @dev transfers the specified amount of dips from the from address to the staking wallet.
         | 
| 159 | 
            -
                function collectDipAmount(address from, Amount dipAmount) external;
         | 
| 160 | 
            -
             | 
| 161 | 
            -
                /// @dev transfers the specified amount of dips from the staking wallet to the to addess.
         | 
| 162 | 
            -
                function transferDipAmount(address to, Amount dipAmount) external;
         | 
| 163 | 
            -
             | 
| 164 160 | 
             
                //--- view and pure functions -------------------------------------------//
         | 
| 165 161 |  | 
| 166 162 | 
             
                function getStakingStore() external view returns (StakingStore stakingStore);
         | 
| @@ -7,9 +7,7 @@ import {Amount} from "../type/Amount.sol"; | |
| 7 7 | 
             
            import {IService} from "../shared/IService.sol";
         | 
| 8 8 | 
             
            import {IStaking} from "./IStaking.sol";
         | 
| 9 9 | 
             
            import {NftId} from "../type/NftId.sol";
         | 
| 10 | 
            -
            import {ObjectType} from "../type/ObjectType.sol";
         | 
| 11 10 | 
             
            import {Seconds} from "../type/Seconds.sol";
         | 
| 12 | 
            -
            import {Timestamp} from "../type/Timestamp.sol";
         | 
| 13 11 | 
             
            import {TokenHandler} from "../shared/TokenHandler.sol";
         | 
| 14 12 | 
             
            import {UFixed} from "../type/UFixed.sol";
         | 
| 15 13 |  | 
| @@ -28,16 +26,18 @@ interface IStakingService is IService | |
| 28 26 | 
             
                event LogStakingServiceStakeCreated(NftId stakeNftId, NftId targetNftId, address owner, Amount stakedAmount);
         | 
| 29 27 | 
             
                event LogStakingServiceStakeIncreased(NftId stakeNftId, address owner, Amount stakedAmount, Amount stakeBalance);
         | 
| 30 28 | 
             
                event LogStakingServiceUnstaked(NftId stakeNftId, address stakeOwner, Amount totalAmount);
         | 
| 29 | 
            +
                event LogStakingServiceStakeRestaked(address stakeOwner, NftId indexed stakeNftId, NftId newStakeNftId, NftId indexed newTargetNftId, Amount indexed newStakeBalance);
         | 
| 31 30 |  | 
| 32 31 | 
             
                event LogStakingServiceRewardsUpdated(NftId stakeNftId);
         | 
| 33 32 | 
             
                event LogStakingServiceRewardsClaimed(NftId stakeNftId, address stakeOwner, Amount rewardsClaimedAmount);
         | 
| 34 33 |  | 
| 35 34 | 
             
                // modifiers
         | 
| 36 | 
            -
                error  | 
| 35 | 
            +
                error ErrorStakingServiceNotStakingOwner(address account);
         | 
| 37 36 | 
             
                error ErrorStakingServiceNotStaking(address stakingAddress);
         | 
| 38 37 | 
             
                error ErrorStakingServiceNotSupportingIStaking(address stakingAddress);
         | 
| 39 38 |  | 
| 40 39 | 
             
                // create
         | 
| 40 | 
            +
                error ErrorStakingServiceTargetUnknown(NftId targetNftId);
         | 
| 41 41 | 
             
                error ErrorStakingServiceZeroTargetNftId();
         | 
| 42 42 | 
             
                error ErrorStakingServiceNotTargetNftId(NftId targetNftId);
         | 
| 43 43 | 
             
                error ErrorStakingServiceNotActiveTargetNftId(NftId targetNftId);
         | 
| @@ -51,6 +51,13 @@ interface IStakingService is IService | |
| 51 51 | 
             
                // function setProtocolLockingPeriod(Seconds lockingPeriod) external;
         | 
| 52 52 | 
             
                // TODO also make sure that protocol rewards can be refilled and withdrawn
         | 
| 53 53 |  | 
| 54 | 
            +
                /// @dev Approves the staking token handler.
         | 
| 55 | 
            +
                /// Reverts if the staking token handler wallet is not the token handler itself.
         | 
| 56 | 
            +
                function approveTokenHandler(
         | 
| 57 | 
            +
                    IERC20Metadata token,
         | 
| 58 | 
            +
                    Amount amount
         | 
| 59 | 
            +
                ) external;
         | 
| 60 | 
            +
             | 
| 54 61 | 
             
                /// @dev creates/registers an on-chain instance staking target.
         | 
| 55 62 | 
             
                /// function granted to instance service
         | 
| 56 63 | 
             
                function createInstanceTarget(
         | 
| @@ -111,7 +118,8 @@ interface IStakingService is IService | |
| 111 118 | 
             
                )
         | 
| 112 119 | 
             
                    external
         | 
| 113 120 | 
             
                    returns (
         | 
| 114 | 
            -
                        NftId newStakeNftId
         | 
| 121 | 
            +
                        NftId newStakeNftId,
         | 
| 122 | 
            +
                        Amount newStakeBalance
         | 
| 115 123 | 
             
                    );
         | 
| 116 124 |  | 
| 117 125 |  | 
| @@ -1,16 +1,10 @@ | |
| 1 1 | 
             
            // SPDX-License-Identifier: Apache-2.0
         | 
| 2 2 | 
             
            pragma solidity ^0.8.20;
         | 
| 3 3 |  | 
| 4 | 
            -
            import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
         | 
| 5 | 
            -
             | 
| 6 4 | 
             
            import {Amount, AmountLib} from "../type/Amount.sol";
         | 
| 7 | 
            -
            import {Component} from "../shared/Component.sol";
         | 
| 8 5 | 
             
            import {IRegistry} from "../registry/IRegistry.sol";
         | 
| 9 | 
            -
            import {IRegistryService} from "../registry/IRegistryService.sol";
         | 
| 10 6 | 
             
            import {IStaking} from "./IStaking.sol";
         | 
| 11 | 
            -
            import {Key32} from "../type/Key32.sol";
         | 
| 12 7 | 
             
            import {NftId} from "../type/NftId.sol";
         | 
| 13 | 
            -
            import {ObjectType, INSTANCE, PROTOCOL, TARGET} from "../type/ObjectType.sol";
         | 
| 14 8 | 
             
            import {Seconds, SecondsLib} from "../type/Seconds.sol";
         | 
| 15 9 | 
             
            import {StakingReader} from "./StakingReader.sol";
         | 
| 16 10 | 
             
            import {StakingStore} from "./StakingStore.sol";
         | 
| @@ -51,7 +45,7 @@ library StakeManagerLib { | |
| 51 45 |  | 
| 52 46 | 
             
                    // TODO check that additional dip, rewards and rewards increment 
         | 
| 53 47 | 
             
                    // are still ok with max target staking amount
         | 
| 54 | 
            -
                    NftId targetNftId = registry. | 
| 48 | 
            +
                    NftId targetNftId = registry.getParentNftId(stakeNftId);
         | 
| 55 49 |  | 
| 56 50 | 
             
                    stakingStore.restakeRewards(
         | 
| 57 51 | 
             
                        stakeNftId, 
         | 
| @@ -72,6 +66,55 @@ library StakeManagerLib { | |
| 72 66 |  | 
| 73 67 | 
             
                }
         | 
| 74 68 |  | 
| 69 | 
            +
                function restake(
         | 
| 70 | 
            +
                    StakingReader stakingReader,
         | 
| 71 | 
            +
                    StakingStore stakingStore,
         | 
| 72 | 
            +
                    NftId oldStakeNftId,
         | 
| 73 | 
            +
                    NftId newStakeNftId
         | 
| 74 | 
            +
                )
         | 
| 75 | 
            +
                    external
         | 
| 76 | 
            +
                    returns (Amount newStakeBalance)
         | 
| 77 | 
            +
                {
         | 
| 78 | 
            +
                    checkUnstakeParameters(stakingReader, oldStakeNftId);
         | 
| 79 | 
            +
                    (NftId oldTargetNftId, UFixed oldRewardRate) = stakingReader.getTargetRewardRate(oldStakeNftId);
         | 
| 80 | 
            +
                    
         | 
| 81 | 
            +
                    // calculate new rewards update and unstake full amount
         | 
| 82 | 
            +
                    (
         | 
| 83 | 
            +
                        Amount rewardIncrementAmount,
         | 
| 84 | 
            +
                    ) = calculateRewardIncrease(
         | 
| 85 | 
            +
                        stakingReader, 
         | 
| 86 | 
            +
                        oldStakeNftId,
         | 
| 87 | 
            +
                        oldRewardRate);
         | 
| 88 | 
            +
                    stakingStore.updateRewards(
         | 
| 89 | 
            +
                        oldStakeNftId, 
         | 
| 90 | 
            +
                        oldTargetNftId, 
         | 
| 91 | 
            +
                        rewardIncrementAmount);
         | 
| 92 | 
            +
                    (
         | 
| 93 | 
            +
                        Amount unstakedAmount, 
         | 
| 94 | 
            +
                        Amount rewardsAmount
         | 
| 95 | 
            +
                    ) = stakingStore.unstakeUpTo(
         | 
| 96 | 
            +
                        oldStakeNftId,
         | 
| 97 | 
            +
                        oldTargetNftId,
         | 
| 98 | 
            +
                        AmountLib.max(), // unstake all stakes
         | 
| 99 | 
            +
                        AmountLib.max()); // claim all rewards
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                    // calculate full restake amount
         | 
| 102 | 
            +
                    newStakeBalance = unstakedAmount + rewardsAmount;
         | 
| 103 | 
            +
                    NftId newTargetNftId = stakingReader.getTargetNftId(newStakeNftId);
         | 
| 104 | 
            +
                    
         | 
| 105 | 
            +
                    // create new staking target and increase stake
         | 
| 106 | 
            +
                    Timestamp newLockedUntil = _checkCreateParameters(stakingReader, newTargetNftId, newStakeBalance);
         | 
| 107 | 
            +
                    stakingStore.create(
         | 
| 108 | 
            +
                        newStakeNftId, 
         | 
| 109 | 
            +
                        IStaking.StakeInfo({
         | 
| 110 | 
            +
                                lockedUntil: newLockedUntil
         | 
| 111 | 
            +
                            }));
         | 
| 112 | 
            +
                    stakingStore.increaseStake(
         | 
| 113 | 
            +
                        newStakeNftId, 
         | 
| 114 | 
            +
                        newTargetNftId, 
         | 
| 115 | 
            +
                        newStakeBalance);
         | 
| 116 | 
            +
                }
         | 
| 117 | 
            +
             | 
| 75 118 | 
             
                function checkCreateParameters(
         | 
| 76 119 | 
             
                    StakingReader stakingReader,
         | 
| 77 120 | 
             
                    NftId targetNftId, 
         | 
| @@ -82,6 +125,19 @@ library StakeManagerLib { | |
| 82 125 | 
             
                    returns (
         | 
| 83 126 | 
             
                        Timestamp lockedUntil
         | 
| 84 127 | 
             
                    )
         | 
| 128 | 
            +
                {
         | 
| 129 | 
            +
                    return _checkCreateParameters(stakingReader, targetNftId, dipAmount);
         | 
| 130 | 
            +
                }
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                function _checkCreateParameters(
         | 
| 133 | 
            +
                    StakingReader stakingReader,
         | 
| 134 | 
            +
                    NftId targetNftId, 
         | 
| 135 | 
            +
                    Amount dipAmount
         | 
| 136 | 
            +
                )
         | 
| 137 | 
            +
                    internal view
         | 
| 138 | 
            +
                    returns (
         | 
| 139 | 
            +
                        Timestamp lockedUntil
         | 
| 140 | 
            +
                    )
         | 
| 85 141 | 
             
                {
         | 
| 86 142 | 
             
                    Seconds lockingPeriod = checkTarget(stakingReader, targetNftId);
         | 
| 87 143 | 
             
                    checkDipAmount(stakingReader, targetNftId, dipAmount);
         | 
| @@ -104,11 +160,11 @@ library StakeManagerLib { | |
| 104 160 | 
             
                {
         | 
| 105 161 | 
             
                    NftId targetNftId = stakingReader.getTargetNftId(stakeNftId);
         | 
| 106 162 |  | 
| 107 | 
            -
                    //  | 
| 108 | 
            -
                    if (!stakingReader. | 
| 109 | 
            -
                        revert IStaking. | 
| 163 | 
            +
                    // target nft id must be registered
         | 
| 164 | 
            +
                    if (!stakingReader.isTarget(targetNftId)) {
         | 
| 165 | 
            +
                        revert IStaking.ErrorStakingNotTarget(targetNftId);
         | 
| 110 166 | 
             
                    }
         | 
| 111 | 
            -
             | 
| 167 | 
            +
                    
         | 
| 112 168 | 
             
                    IStaking.TargetInfo memory info = stakingReader.getTargetInfo(targetNftId);
         | 
| 113 169 | 
             
                    rewardRate = info.rewardRate;
         | 
| 114 170 | 
             
                    lockingPeriod = info.lockingPeriod;
         | 
| @@ -121,12 +177,11 @@ library StakeManagerLib { | |
| 121 177 | 
             
                    public
         | 
| 122 178 | 
             
                    view
         | 
| 123 179 | 
             
                    returns (
         | 
| 124 | 
            -
                        UFixed rewardRate,
         | 
| 125 180 | 
             
                        Seconds lockingPeriod
         | 
| 126 181 | 
             
                    )
         | 
| 127 182 | 
             
                {
         | 
| 128 183 | 
             
                    IStaking.StakeInfo memory stakeInfo = stakingReader.getStakeInfo(stakeNftId);
         | 
| 129 | 
            -
             | 
| 184 | 
            +
                    
         | 
| 130 185 | 
             
                    if (stakeInfo.lockedUntil > TimestampLib.blockTimestamp()) {
         | 
| 131 186 | 
             
                        revert IStaking.ErrorStakingStakeLocked(stakeNftId, stakeInfo.lockedUntil);
         | 
| 132 187 | 
             
                    }
         | 
| @@ -146,11 +201,6 @@ library StakeManagerLib { | |
| 146 201 | 
             
                        revert IStaking.ErrorStakingNotTarget(targetNftId);
         | 
| 147 202 | 
             
                    }
         | 
| 148 203 |  | 
| 149 | 
            -
                    // only accept stakes for active targets
         | 
| 150 | 
            -
                    if (!stakingReader.isActive(targetNftId)) {
         | 
| 151 | 
            -
                        revert IStaking.ErrorStakingTargetNotActive(targetNftId);
         | 
| 152 | 
            -
                    }
         | 
| 153 | 
            -
             | 
| 154 204 | 
             
                    lockingPeriod = stakingReader.getTargetInfo(targetNftId).lockingPeriod;
         | 
| 155 205 | 
             
                }
         | 
| 156 206 |  | 
| @@ -196,11 +246,10 @@ library StakeManagerLib { | |
| 196 246 | 
             
                        rewardRate,
         | 
| 197 247 | 
             
                        duration,
         | 
| 198 248 | 
             
                        stakeAmount);
         | 
| 199 | 
            -
             | 
| 249 | 
            +
                    
         | 
| 200 250 | 
             
                    totalDipAmount = stakeAmount + rewardAmount + rewardIncreaseAmount;
         | 
| 201 251 | 
             
                }
         | 
| 202 252 |  | 
| 203 | 
            -
             | 
| 204 253 | 
             
                function calculateRewardAmount(
         | 
| 205 254 | 
             
                    UFixed rewardRate,
         | 
| 206 255 | 
             
                    Seconds duration, 
         |